FreeBSD 10 & Midnight Commander 4.8. Сохранение экрана при переключении в subshell (Ctrl+o).

Поломали демоны сохранение экрана. Старый рецепт в виде патча не работает.
--- lib/tty/tty-ncurses.c.orig<>2016-05-07 15:42:52 UTC
+++ lib/tty/tty-ncurses.c
@@ -233,7 +233,7 @@ tty_shutdown (void)
 void
 tty_enter_ca_mode (void)
 {
- if (mc_global.tty.xterm_flag && smcup != NULL)
+ if (mc_global.tty.xterm_flag)
 {
 fprintf (stdout, /* ESC_STR ")0" */ ESC_STR "7" ESC_STR "[?47h");
 fflush (stdout);
@@ -245,7 +245,7 @@ tty_enter_ca_mode (void)
 void
 tty_exit_ca_mode (void)
 {
- if (mc_global.tty.xterm_flag && rmcup != NULL)
+ if (mc_global.tty.xterm_flag)
 {
 fprintf (stdout, ESC_STR "[?47l" ESC_STR "8" ESC_STR "[m");
 fflush (stdout);
Вариант 1
Самое простое лечение для админа /etc/termcap:
 3010 # This is the only entry which you should have to customize, since "xterm"
 3011 # is widely used for a variety of incompatible terminal emulations including
 3012 # color_xterm and rxvt.
 3013 xterm|X11 terminal emulator:\
 3014 <------>:te=\E[?1049l:ti=\E[?1049h:\
 3015 <------>:tc=xterm-new:
 3016 #<----->:tc=xterm-r6:
Добавляем строчку 3014 и перестраиваем базу.
root# cap_mkdb -f /usr/share/misc/termcap /etc/termcap
Вариант 2
Меняем в клиенте тип терминала, на примере putty: putty на:
xterm-clear
Для исправление проблем с клавиатурой, в настройках Midnight Commander /usr/local/share/mc/mc.lib добавляем:
...
[terminal:xterm-clear]
copy=xterm

Free ssl certificate 90 days Let’s Encrypt with auto update ACME client

Воспользуемся бесплатным сертификатом центра сертификации Let’s Encrypt, есть ограничение, сертификат выдается на 90 дней, но центр сертификации поддерживает ACME протокол, что дает возможность обновлять сертификат автоматически. Воспользуемся клиентом Letencrypt.sh is a pure BASH implementation of the ACME protocol used by Lets Encrypt
root@www:/usr/ports # cd /usr/ports/security/letsencrypt.sh
root@www:/usr/ports/security/letsencrypt.sh # make install
====> Compressing man pages (compress-man)
===>  Installing for letsencrypt.sh-0.2.0
===>  Checking if letsencrypt.sh already installed
===>   Registering installation for letsencrypt.sh-0.2.0
Installing letsencrypt.sh-0.2.0...
To use this script you should copy the examples in
/usr/local/etc/letsencrypt.sh/ and at least add a
domain and a contact mail address.

You should also copy the openssl.cnf.sample file in
/usr/local/openssl so you won't get warnings about
it missing.

In order to run the script regularly to update
the certificates add this line to /etc/periodic.conf

weekly_letsencrypt_enable="YES"

Additionally the following parameters can be added to
/etc/periodic.conf

To run the certification renenewal as a different user
weekly_letsencrypt_user="_letsencrypt"
To run a script after the renewal (as root)
weekly_letsencrypt_deployscript="/usr/local/etc/letsencrypt.sh/deploy.sh"
я добавил только одну строчку weekly_letsencrypt_enable=»YES», пусть рутом работает

в domains.txt добавим имена доменов и поддоменов
root@www:/usr/local/etc/letsencrypt.sh # cat domains.txt
mneti.ru www.mneti.ru
в config.sh подправим, это обязательно, папка используется для обмена в процессе аутентификации домена
# Output directory for challenge-tokens to be served by webserver or deployed in HOOK (default: $BASEDIR/.acme-challenges)
#WELLKNOWN="${BASEDIR}/.acme-challenges"
WELLKNOWN="/usr/local/www/nginx-mneti/.well-known/acme-challenge"
Иначе получим ошибку
root@www:/usr/local/etc/letsencrypt.sh # /usr/local/bin/letsencrypt.sh -c
# INFO: Using main config file /usr/local/etc/letsencrypt.sh/config.sh
Processing mneti.ru with alternative names: www.mneti.ru
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for mneti.ru...
 + Requesting challenge for www.mneti.ru...
 + Responding to challenge for mneti.ru...
ERROR: Challenge is invalid! (returned: invalid) (result: {
  "type": "http-01",
  "status": "invalid",
  "error": {
    "type": "urn:acme:error:unauthorized", 
root@www:/usr/local/etc/letsencrypt.sh # /usr/local/bin/letsencrypt.sh -c
# INFO: Using main config file /usr/local/etc/letsencrypt.sh/config.sh
Processing mneti.ru with alternative names: www.mneti.ru
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for mneti.ru...
 + Requesting challenge for www.mneti.ru...
 + Responding to challenge for mneti.ru...
 + Challenge is valid!
 + Responding to challenge for www.mneti.ru...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
В конфиге виртуального хоста включим ssl, пропишем пути к сертификату и ключу и редирект на https если пришли на http
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    server {
<------>listen 80;
        listen 443 ssl;

<------>ssl_certificate      /usr/local/etc/letsencrypt.sh/certs/mneti.ru/cert.pem;
<------>ssl_certificate_key  /usr/local/etc/letsencrypt.sh/certs/mneti.ru/privkey.pem;

        server_name  mneti.ru  *.mneti.ru;
<------>access_log /var/log/nginx/mneti.access_log;
        error_log /var/log/nginx/mneti.error_log info;
....
<------>if ($ssl_protocol = "") {
<------>    return 301 https://$server_name$request_uri;
<------>}

        root   /usr/local/www/nginx-mneti;
        index  index.html index.htm index.php;

        location / {
    <-->    try_files $uri $uri/ /index.php;
<------>}

        location ~ \.php$ {
<------>    fastcgi_pass   127.0.0.1:9000;
<------>    fastcgi_index  index.php;
<------>    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
<------>    fastcgi_param  PHP_ADMIN_VALUE "open_basedir=$document_root:/tmp:/var/tmp";
<------>    include        fastcgi_params;
<------>}

    }
Обнаружилась проблемка, часть мобильных браузеров сертификат не признавали, все потому что им нужны промежуточные сертификаты вплоть до корневого, полная цепочка, клиент Letencrypt.sh и об этом позаботился, просто заменим в конфиге нгинкса
# ssl_certificate      /usr/local/etc/letsencrypt.sh/certs/mneti.ru/cert.pem;
ssl_certificate      /usr/local/etc/letsencrypt.sh/certs/mneti.ru/fullchain.pem;

Asterisk на FreeBSD, обрывы и тишина при обзвоне

При обзвоне случайным образом переставал проигрываться звуковой файл. В консоль выдавалось предупреждение о том, что невозможно подобрать нужный кодек. В ходе отладки выяснилось, что структура в стеке не была инициализирована в коде. Лечится просто, нужно отключить оптимизацию кода.
--- build_tools/cflags.xml.orign 2014-04-11 05:33:03.000000000 +0400
+++ build_tools/cflags.xml 2015-08-05 13:50:56.000000000 +0300
@@ -1,5 +1,6 @@
 <category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" remove_on_change=".lastclean">
  <member name="DONT_OPTIMIZE" displayname="Disable Optimizations by the Compiler">
+  <defaultenabled>no</defaultenabled>
   <support_level>core</support_level>
  </member> <member name="DEBUG_THREADS" displayname="Enable Thread Debugging">

Asterisk на FreeBSD, пропадание звука

Случайным образом на Asteriskе пропадает звук. Симптомы простые, отправляется только один, первый rtp пакет, а дальше тишина. Лечится перезапуском приложения. Причину удалось локализовать случайно, переставал работать DAHDI таймер. Проверяется командой:
timing test
Пришлось отказаться от его использования.

mc и настройки терминала

Как-то очень давно разбирался с mc который почему-то после обновления перестал выводить на консоль результат выполнения скриптов после Ctrl+o. Дело оказалось в escape последовательности управления терминала, в mc изменили команды сохранения и восстановления данных. Через пару месяцев пропатчили порты и все забылось. Прошло два года и всплыли те-же грабли, кто знает, когда мы опять на них наступим.

tcpdump на unix socket

Ну не умеет tcpdump снифить файловые сокеты. Можно воспользоватся утилитой «socat», ставится из портов. На примере ngnx и php-fpm.
Меняем конфигурацию ngnx:
fastcgi_pass unix:/tmp/php-fpm.sock.socat;
И перезапускаем:
/usr/local/etc/ngnx restart

Запускаем снифер и смотрим вывод:
socat -t100 -x -v UNIX-LISTEN:/tmp/php-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/tmp/php-fpm.sock
>2015/11/27 15:09:38.548061 length=752 from=0 to=751
01 01 00 01 00 08 00 00 00 01 00 00 00 00 00 00 ................
01 04 00 01 02 c3 05 00 0f 34 53 43 52 49 50 54 .........4SCRIPT
5f 46 49 4c 45 4e 41 4d 45 2f 75 73 72 2f 6c 6f _FILENAME/usr/lo
...

В поисках кота или наблюдение за черным ящиком

Не редко, запуская долгую рутинную операцию, нам хотелось бы знать, на каком этапе она находится. Если приложение делает обработку файлов на диски, за ним можно подсмотреть.
Посмотреть открытые файлы можно командой:
fstat -f /var/db/mysql

USER CMD PID FD MOUNT INUM MODE SZ|DV R/W
root bsdtar 1609 4 /var 27127719 drwx------ 20992 r
root bsdtar 1609 5 /var 27127719 drwx------ 20992 r

Найти имя файла можно командой:
find /var -inum 27127719 -ls

27127719 48 drwx------ 2 88 88 20992 Sep 25 09:38 /var/db/mysql/sc55db

ln: ‘link’: hard link not allowed for directory

При необходимости предоставить общий доступ к папке с изменяемым набором файлов, через ограничения open_basedir или chroot, jail. Воспользуемся возможностями псевдо-файловой системы nullfs: mkdir mondata mount_nullfs /var/db/collectd/csv/localhost /www/nginx-host1/mondata в линуксе mount —bind olddir newdir

Nginx open_basedir

Начиная с php 5.3.3 задаем в конфиге nginx, есть нюанс, если задали для одно виртуального хоста, то нужно проставить и для всех остальных, иначе мешанина. location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_ADMIN_VALUE «open_basedir=$document_root»; include fastcgi_params;

}