Thunerbird 52.3.0 & self signed certificate

Раньше оно как было?

При попытке подключиться к почтовому серверу с самоподписанным сертификатом Thunderbird ругался, предупреждал и давал возможность добавить сертификат в исключения.
Это можно было сделать как при подключении, так и при помощи менеджера сертификатов.

Сертификат можно было импортировать из локального файла (кнопка Импортировать) или подгрузить с сервера (кнопка Добавить исключение).

Но это было раньше. Вышло обновление 52.3.0 и пришел пушной зверек.

При попытке добавить исключение при подключении к серверу:

В соответствующем окне пропала кнопка Добавить исключение. И оно тупо информирует нас о том, что сертификат левый и все!

В менеджере сертификатов пропала возможность импортировать сертификат из файла. Ну просто тупо её выпилили.

А Добавить исключение показывает предыдущее окно, в котором таки нет кнопки Добавить исключение.

Таким образом, возникло ощущение, что Thunderbird решил бороться с самоподписанными сертификатами. Просто и незатейливо выпилив функционал добавления исключений в списки сертификатов.

Де%%$ы бл%#ь.

Приходиться удалять Thunderbird, ставить предыдущую версию и в ней добавлять исключения.

pjsip и Билайн

Конфиг транка для модуля pjsip и билайна.
В некоторых местах вместо sip.beeline.ru написан IP этого сервера — 195.239.174.100
Это бжжжж не спроста. Если там писать имя сервера, дальше регистрации дело не идет. Подробнее об этом в предыдущем посту.

[Bi]
type=aor
qualify_frequency=60
contact=sip:195.239.174.100:5060

[Bi]
type=auth
auth_type=userpass
password=bigpassword
username=74955555555@sip.beeline.ru

[Bi]
type=endpoint
transport=0.0.0.0-udp
context=from-pstn
disallow=all
allow=g729,ulaw,alaw,gsm,g726,g723
aors=Bi
language=ru
outbound_auth=Bi
from_domain=sip.beeline.ru
from_user=74955555555
t38_udptl=no
t38_udptl_ec=none
fax_detect=no
t38_udptl_nat=no
dtmf_mode=auto

[Bi]
type=identify
endpoint=Bi
match=195.239.174.100

[Bi]
type=registration
transport=0.0.0.0-udp
outbound_auth=Bi
retry_interval=120
max_retries=10
expiration=3600
auth_rejection_permanent=no
contact_user=74955555555
server_uri=sip:195.239.174.100:5060
client_uri=sip:74955555555@sip.beeline.ru:5060

[0.0.0.0-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=83.10.10.10
external_signaling_address=83.10.10.10
allow_reload=yes
local_net=192.168.1.0/24

MTT vs Beeline

Не знаю, что я делаю не так, но не могу настроить sip от Beeline. Коннект проходит, но при разговоре голос слышно только с одной стороны. Да, я знаю про особенности sip и nat 🙂 но… у конкурентов билайна все работает 🙂

Сначала пробовал на железяке: не работает.
Для проверки своей криворукости взял аккаунт у МТТ. У них все работает.
Тупо меняю в настройках sip.beeline.ru на voip.mtt.ru и… у билайна не работает, у  МТТ все летает.

Ладно, двойной NAT, все может быть. Настраиваю sip клиента на мобиле и вперед через LTE. У билайна не работает, у МТТ все пучком.

Объясняю ситуацию парням из билайна, в ответ рекомендации типа:
— отключите на роутере (микротик) модуль sip.
— вместо sip.beeline.ru пишите IP адрес.
Звиздец.

Ок, кручу астериск. У меня он на pjsip. Билайн же выпендривается, даёт логины типа 74955555555@sip.beeline.ru. Пока разобрался как в pjsip эти хитрые логины вбивать… Но вообщем зарегистрировался на сервере билайна. Регистрация проходит, а вот звонки вообще не того, не идут. Сразу после команды INVITE отваливаются, причем мой астериск им говорит, что они у нас не зарегистрированы. Единственное отличие INVITE от билайна и МТТ: у первого стоит мой внутренний IP (192.168.х.х), а у МТТ реальный IP роутера.

И что мне с этим делать?

P.S. Пока писал это пост, победил астериск. Добился соединения и звонка у билайна, но звук в одну сторону так и не ходит.
Как вы думает работает ли МТТ на астериске? Ага 🙂 без проблем, звоню, общаюсь. Бугагашеньки.

javafx RowFactory или как я красил строки таблицы.

Задача тривиальная: в зависимости от значения в наборе данных, надо красить строку зелёненким цветом.
Примеров решений задачи в инете, вагон и маленькая тележка.

Обычно рекомендуют что то типа такого:

tableView.setRowFactory((row) -> {
            return new TableRow(){
                @Override
                public void updateItem(MainTable item, boolean empty){
                    super.updateItem(item, empty);
                    if (item == null || empty) {
                        setStyle(«»);
                    } else {
                        Iterator it = tableZakaz.getItems().iterator();
                        while (it.hasNext()) {
                            Long zakazIndex = it.next().getProductIndex();
                            Long pIndex = item.getIndex();
                            if ( Objects.equals(zakazIndex, pIndex) )   {
                                setStyle(«-fx-background-color:lightgreen»);
                            } 
                        }
                    }
                }
            };
        });

И оно даже работает. Но, пока в таблице не включается скроллинг. Как только в таблице начинаешь листать страницы, с удивлением обнаруживаешь, что красятся произвольные строки, в произвольном порядке.

Решение, простое.

До вызова
super.updateItem(item, empty);
Сбросьте стили.

tableView.setRowFactory((TableView row) -> {
            return new TableRow(){
                @Override
                public void updateItem(MainTable item, boolean empty){
                    // Сначала обязательно сбрасываем стиль.
                    setStyle(«»);
                    // и только после этого вызываем метод super.updateItem
                    super.updateItem(item, empty);
                    if (item == null || empty) {
                        setStyle(«»);
                    } else {
                        Iterator it = tableZakaz.getItems().iterator();
                        while (it.hasNext()) {
                            Long zakazIndex = it.next().getProductIndex();
                            Long pIndex = item.getIndex();
                            if ( Objects.equals(zakazIndex, pIndex) )   {
                                setStyle(«-fx-background-color:lightgreen»);
                            } 
                        }
                    }
                }
            };
        });

LXC error cpio: cap_set_file

Ндя, «Всё глыбже и глыбже.» (с) не я

Собираю контейнер под FreePBX. И тут у меня вдруг не устанавливается апач из стандартных пакетов. Выдает ошибку: cpio: cap_set_file

Лечится явным прописыванием в конфиг файл контейнера параметров:
lxc.cap.drop = mac_admin mac_override
#lxc.cap.drop = setfcap
lxc.cap.drop = sys_module sys_nice sys_pacct
lxc.cap.drop = sys_rawio sys_time

Обратите внимание, что в глобальных параметрах, lxc.cap.drop = setfcap был определен. Если его не прописывать явно в конфиге, то все будет пучком.

Asterisk pjsip и Youmagic (MTT)

Взял тестовый номерок на YouMagiс. Решил через него астериск погонять. И тут выяснилось, что все примеры используют стандартный chan_sip или для FreePBX. А у меня pjsip стоит и рулю я ручками через конфиги:).
Вообщем в итоге получилось, вот так :

pjsip.conf
======================
[global]
type=global
; да, я даже freepbx заводил в виртуалке 🙂 но не понравилось
; оно мне, часть конфига спер оттуда.
user_agent=FPBX-13.0.190.19(13.14.0)
default_outbound_endpoint=dpma_endpoint
; debug не понравился. Лучше tcpdump для отладки еще 
; ничего не придумали 🙂
;debug=yes

[dpma_endpoint]
type=endpoint
context=dpma-invalid

[0.0.0.0-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; разумеется вместо 999 надо писать реальный IP роутера,
; за которым за натом стоит астериск
external_media_address=999.999.999.999
external_signaling_address=999.999.999.999
allow_reload=yes
local_net=192.168.0.0/24

; тут определены два внутренних телефона 100 и 101
; много текста не показано

;==== YouMagic =======================
; Предположим, что МТТ дали телефон, он же логин (хотя логин 
; при регистрации можно установить любой):
; 74990000000
; и пароль: хитрыйпароль

[reg_voip.mtt.ru]
type = registration
retry_interval = 20
max_retries = 10
contact_user = 74990000000
expiration = 120
transport = 0.0.0.0-udp
outbound_auth = auth_reg_voip.mtt.ru
client_uri = sip:74990000000@voip.mtt.ru
server_uri = sip:voip.mtt.ru:5060

[auth_reg_voip.mtt.ru]
type = auth
password = хитрыйпароль
username = 74990000000

[mytrunk]
type = aor
contact = sip:74990000000@voip.mtt.ru

[mytrunk]
type = identify
endpoint = mytrunk
; это IP MTT сервера
match = 80.75.132.66

[mytrunk]
type = auth
username = 74990000000
password = хитрыйпароль
;realm = voip.mtt.ru

[mytrunk]
type = endpoint
context = from-external
transport=0.0.0.0-udp
disallow = all
allow = ulaw
allow = alaw
rtp_symmetric = yes
rewrite_contact = yes
from_user = 74990000000
from_domain=voip.mtt.ru
; МТТ не может аутентифицироваться на нашем сервере
; поэтому не включаем аутентификацию при входящих с МТТ
;auth = mytrunk
outbound_auth = mytrunk
aors = mytrunk
=======================================================

extensions.conf
=====================================================
[others]

[from-internal]
exten => 100,1,Dial(PJSIP/100,20)
exten => 100,2,VoiceMail(100,u)

exten => 101,1,Dial(PJSIP/101,20)
exten => 101,2,VoiceMail(101,u)

exten => *98,1,VoiceMailMain(${CALLERID(num)},s)

exten => _810X.,1,Busy

exten => _8XXX.,1,NoOp(«8xxx»)
exten => _8XXX.,n,Dial(PJSIP/${EXTEN}@mytrunk)
exten => _8XXX.,n,Hangup

[from-external]
exten => 74990000000,1,Dial(PJSIP/100)
exten => 74990000000,n,Hangup
=======================================================

Разумеется, мой сервер за натом. И, разумеется, в фаерволе разрешены хождение пакетов и их проброс только с сервера МТТ.

Проблема выбора.

Выбираю софт для группы IP телефонных станций. Щупаю Asterisk и FreeSWITCH .

Решил таки предложить использовать первый. Уж очень он легко и прозрачно конфигурируется 🙂 Возможно FreeSWITCH надежнее и  быстрее, но блин, руками править XML — это жестоко. А мне ведь в будущем систему отдавать в обслуживание телефонистам старой закалки 🙂 Там точно XML не пройдет.
Ну и FastAGI в мыслях держу.
З.Ы. Заодно разобрался с докером. Все думал, зачем оно мне надо, а тут «очень даже в дырочку». Сложная в установке система, при помощи докера великолепно распространяется на много машин. Мне понравилось.
З.З.Ы. lua — стоит изучать для конфигурации Asterisk? Или ну его на фиг, стандартными средствами обойтись можно?

JavaFX и java.lang.nullpointerexception location is required

Написал тут программульку для копания в OpenLDAP. Локально из jar файла все работает великолепно. Решил раздавать ее коллегам правильно, через веб сервер. И тут началось:

java.lang.nullpointerexception location is required

Не грузит сволочь fxml файл.

Облазил все форумы, пробовал и через class.getClassLoader().getResource() и просто class.getResource(). Читаю документацию, указываю пути как надо, с учетом выбранного метода. Не работает хоть тресни.

А всего то, надо было подписать приложение… твою едрить через это самое…

Будни

На неделе пришлось импортировать базу из древнего Paradox приложения в MySQL. Оказывается этим однопользовательским чудом еще кто то активно пользуется.
Ну это, всякие бесплатные конверторы из парадокса в майскул (и не только в него) оказались полным отстоем. Платные я не пробовал, и не хотел пробовать. Разовый импорт данных должен быть бесплатным по определению :).
Попытка найти нормальный бесплатный драйвер Paradox для jdbc не увенчалась успехом. Покупать платный … ну вы поняли. Поэтому написать свою программульку на java не получилось.
В результате пришлось искать инсталяшку Парадокса, открывать таблицы в нем и экспортировать данные в csv. Далее путем небольшого шаманства, типа конвертации типов данных, все успешно переехало в мускуль.

Теперь вот копаю JavaFX2. Потому как swing пометили как не кошерный :). Надеюсь на этой недельке выдать на гора нормальное многпользовательское приложение, что бы наши админы забыли весь ужОс работы с древним софтом.