21 окт. 2015 г.

VirtualBox 4.3 VERR_SYMBOL_NOT_FOUND

После одного из обновлений старенького Virtualbox на стареньком же ноуте еще с windows xp словилась при запуске виртуальной машины проблема вида: 
VERR_SYMBOL_NOT_FOUND
Из других сообщений было понятно, что не нравится виртуалбоксу USB2.0 контроллер в виртуалке. Обновления ExtensionPack, отключения контроллера в свойствах виртуалки проблему не решали.
Также не помогла переустановка самого VBox и отключение антивируса. Решение пришло внезапно в виде такой мантры (да-да, вторая мантра за день!):
netsh int ip reset reset.log
Вдохновение описано в последнем комментарии тут. Какая связь между сбросом ip стека винды и странным поведением VBox, неясно, однако указанное действие поставило точку в полудневных попытках реанимировать систему.

Windows svchost.exe list of services

tasklist /svc /fi "imagename eq svchost.exe"
Вот эту мантру нужно ввести, чтобы понять, что стоит за каждым из svchost.exe.

14 окт. 2015 г.

Adobe Reader filename too long.

У многих сотрудников довольно развесистая структура папок и длинные называния документов. В итоге это приводит к ограничению в 255 символов на длину пути. Однако если для ранних версий ОС это было фатальным ограничением, то та же windows 7 способно без особого вреда для себя и для файла это исключение корректно обрабатывать. Однако ряд приложений, например, Adobe Reader, при попытке открыть файл по такому длинному пути, по умолчанию выдает ошибку отказа в доступе (что частенько путает пользователя и администратора).
Лечится это довольно просто, в настройках приложения следует отключить "защищенный режим": 
Редактирование – Установки – Категории: Защита (повышенный уровень) – Включить защищенный режим при запуске (снять галку).
После перезапуска самого приложения проблема устраняется. 

7 окт. 2015 г.

retrieve printer list: NT_STATUS_UNSUCCESSFUL

Избавляемся от надоедливых сообщений в логе самбы:
smbd[5895]: STATUS=daemon 'smbd' finished starting up and ready to serve connectionsUnable to connect to CUPS server localhost:631 - Неправильный дескриптор файла
smbd[5895]: STATUS=daemon 'smbd' finished starting up and ready to serve connectionsfailed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
В секции [global] файла smb.conf нужно добавить:
##noprinters
        load printers = no
        printing = bsd
        printcap name = /dev/null
        disable spoolss = yes
И перезапустить samba4.

samba4 secrets.keytab regeneration (fix KVNO mismatch error)

Запишу, чтобы не затерялось.
Внезапно перестали вводиться компьютеры в домен. Подозреваю, все остальное, завязанное на контроллере домена и кейтабах, тоже бы отпало, если бы работало. Логи samba4 показали ошибку:
GSS server Update(krb5)(1) Update failed:  Miscellaneous failure (see text): Failed to find DC0$@EXAMPLE.ORG(kvno 7) in keytab FILE:/var/lib/samba/private/secrets.keytab (arcfour-hmac-md5)
Содержимое "родного" кейтаба, создаваемого при развертывании домена:
root@dc0:/var/lib/samba/private# klist -ke secrets.keytab
Keytab name: FILE:/var/lib/samba/private/secrets.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   1 HOST/dc0@EXAMPLE.ORG (des-cbc-crc)
   1 HOST/dc0.example.org@EXAMPLE.ORG (des-cbc-crc)
   1 DC0$@EXAMPLE.ORG (des-cbc-crc)
   1 HOST/dc0@EXAMPLE.ORG (des-cbc-md5)
   1 HOST/dc0.example.org@EXAMPLE.ORG (des-cbc-md5)
   1 DC0$@EXAMPLE.ORG (des-cbc-md5)
   1 HOST/dc0@EXAMPLE.ORG (arcfour-hmac)
   1 HOST/dc0.example.org@EXAMPLE.ORG (arcfour-hmac)
   1 DC0$@EXAMPLE.ORG (arcfour-hmac)
   1 HOST/dc0@EXAMPLE.ORG (aes128-cts-hmac-sha1-96)
   1 HOST/dc0.example.org@EXAMPLE.ORG (aes128-cts-hmac-sha1-96)
   1 DC0$@EXAMPLE.ORG (aes128-cts-hmac-sha1-96)
   1 HOST/dc0@EXAMPLE.ORG (aes256-cts-hmac-sha1-96)
   1 HOST/dc0.example.org@EXAMPLE.ORG (aes256-cts-hmac-sha1-96)
   1 DC0$@EXAMPLE.ORG (aes256-cts-hmac-sha1-96)
Строчка с DC0$@EXAMPLE.ORG в кейтабе есть, однако KVNO отличается, отсюда и ошибка. Почему такое не случалось раньше (или случалось, но не приводило к проблеме) и как этого избежать, неведомо. В интернетах нашлись кивания на то, что такое поведение Active Directory в принципе нормально, есть даже RFC 4120, где я, правда, нужной информации не почерпнул. 
Вообще, вроде как, изменение kvno вызывать проблем с авторизацией не должно, тем более что Active Directory его значение игнорирует (исключая случай работы с RODC, но это мимо кассы). Но вот так получилось. 
Как это можно симптоматически порешать? Регенерацией кейтабов, где имеет место быть разночтение KVNO.

В примерах команды идут в одну строчку:
samba-tool domain exportkeytab  /root/1.keytab --principal=HOST/dc0.example.org@EXAMPLE.ORG
samba-tool domain exportkeytab  /root/1.keytab --principal=HOST/dc0@EXAMPLE.ORG
samba-tool domain exportkeytab  /root/1.keytab --principal='DC0$@EXAMPLE.ORG'
samba-tool domain exportkeytab  /root/2.keytab --principal=DNS/dc0.example.org@EXAMPLE.ORG
samba-tool domain exportkeytab  /root/2.keytab --principal=DNS/dc0@EXAMPLE.ORG
samba-tool domain exportkeytab  /root/2.keytab --principal=dns-dc0@EXAMPLE.ORG
Дальше проверим правильность сгенерерированных файлов и заменим старые кейтабы новыми:
cd /var/lib/samba/private/
klist -ke /root/1.keytab
klist -ke secrets.keytab
mv secrets.keytab secrets.keytab.bak
cp /root/1.keytab secrets.keytab
systemctl restart samba-ad-dc.service
klist -ke /root/2.keytab
klist -ke dns.keytab
mv dns.keytab dns.keytab.bak
cp /root/2.keytab dns.keytab
chown bind:bind dns.keytab
systemctl restart bind9.service
Аналогично следует поступить и с другими службами, если они оказались затронуты проблемой.

28 сент. 2015 г.

postgres db size

Как известно, PosgreSQL хранит файлы баз данных в каталогах, названных по OID. Сопоставить выдачу имен баз из интерфейса psql (\l) с и реальным их расположением можно через: 
select oid from pg_database;
UPD: подсказали, что есть утилитка  oid2name (идет в postgresql-contrib, если не ошибаюсь), которая делает то же самое, но проще и удобнее.

4 сент. 2015 г.

Offtop: онлайн аудио-редактор

А вот захотелось новый хитовый рингтон запулить в телефон, а устанавливать аудиоредактор, даже простенький (тот же audacity) - лениво? Выход есть: http://www.mp3cut.ru/ . Быстро и вкусно. Автопроигрывание немного раздражает, но в остальном все очень хорошо. 
З. Ы.: денех не заносили, нашел гуглом сам.

31 авг. 2015 г.

Ubuntu 14.04 and mkpasswd

Вот почему полезная утилитка mkpasswd находится в пакете whois? Спасибо, товарищ, надоумил.

VMWare ESXI Web Client

Товарищи из VMWare таки разродились на реализацию веб-клиента для отдельно-стоящих гипервизоров ESXi. Взять можно тут. Пока оно жутко бажное и у меня работать отказалась, но, возможно, кому-то повезет больше.
Ставить так:
esxcli software vib install -v /tmp/esxui.vib

28 авг. 2015 г.

Windows ISO download

Периодически нужно скачать iso-образ какой-то из Windows, а место, откуда это можно сделать, постоянно забывается.
Так вот, официальная страничка от Microsoft:

Неофициальное зеркало DigitalRiver: http://mirror.corenoc.de/digitalrivercontent.net/

22 июл. 2015 г.

haspd: aksusbd: not found

При установке x64 Haspd (от Etersoft) в x64 же Debian имеем ошибку при запуске: 
/etc/init.d/haspd: aksusbd: not found
Дело в том, что несмотря на "собранность" под 64-битную платформу, по сути своей haspd остался 32-битным, поэтому для корректной работы ему нужны некоторые i386-библиотеки. 
Для решения заданной проблемы следует установить пакет libc6-i386.

20 июл. 2015 г.

id: administrator: no such user

Еще одна проблема (вдогонку к этой) в работе Samba4 AD DC
Суть: Linux-компьютер (в моем случае Debian 8 и Ubuntu 14.04 LTS) успешно вводится в домен, какое-то время все работает. Затем происходит странное: winbind продолжает видеть группы и пользователей домена, однако линуксовые средства (getent, id) их видеть перестают, и, как следствие, авторизация доменных пользователей ломается. То есть, к примеру, wbinfo -u, wbinfo -g, wbinfo -t ведут себя ожидаемо и правильно, а id username или getent passwd успешно отрабатывают только для локальных пользователей. 
Зацепиться удалось лишь за ошибку в выводе wbinfo -i username
~# wbinfo -i administratorfailed to call wbcGetpwnam: WBC_ERR_DOMAIN_NOT_FOUNDCould not get info for user administrator
Поиски вывели вот сюда, сюда и сюда. Корень зла - бэкенд ad для idmap, через который и происходит взаимодействие winbind-а и утилит ОС. Таблетка - изменить этот бэкенд на rid.
idmap config * : backend = rid

24 июн. 2015 г.

Samba 4 AD rfc2307 + login shell

Есть проблема: при вводе в samba4-домен linux-машины winbind подгружает список пользователей с шеллом /bin/false. Это вызывает ожидаемые проблемы при логине в систему.
administrator:*:2000:2000:Administrator:/home/EXAMPLE/administrator:/bin/false
И вроде бы такое должно случаться только в случае контроллеров домена и только с winbind. Однако у меня случилось и на обычном "членском" сервере. Проблема в том, что winbind не считывает атрибут (который должен по rfc2307,  см. соответствующую опцию в smb.conf) LoginShell из свойств пользователя в Active Directory. Текущее обходное решение - добавить в smb.conf глобальный параметр:
[global]
   template shell = /bin/bash

9 июн. 2015 г.

Squid + Samba4 AD Kerberos Authorization

В продолжение предыдущей заметки пара слов об авторизации доменных пользователей в Squid посредством того же Kerberos. Вообще все должно быть легко, ибо все уже украдено до нас есть готовый хелпер в комплекте /usr/lib/squid3/ext_kerberos_ldap_group_acl (по крайней мере, в Debian), который умеет ходить в AD, авторизовываться текущим keytab-ом, получать необходимые тикеты и понимать, находится ли поданная ему на вход учетная запись пользователя в заданной группе. Для тестовых целей, как и ранее, запускаем прямо из консоли:
/usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g FastInet@EXAMPLE.COM
Для дебага можно добавить опции -i или -d. Опция -h покажет встроенный хелп. 
Нормальная работа хелпера выглядит так:
root@gw0:~# /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g FastInet@EXAMPLE.COM
inettest01@example.com
OK
inettest02@example.com
ERR 
Соответственно, пользователь inettest01 является членом группы FastInet в домене EXAMPLE.COM, а пользователь inettest02 - нет.
Если ERR имеем всегда, а -d показывает ошибки вида:
kerberos_ldap_group: DEBUG: Bind to ldap server with SASL/GSSAPI
kerberos_ldap_group: ERROR: ldap_sasl_interactive_bind_s error: Unknown authentication method
то, возможно, не хватает модулей gssapi к библиотеке libsasl2, через которую реализуется подключение хелпера к домену по LDAP: libsasl2-modules-gssapi-mit. После установки этого пакета у меня такая ошибка более не появлялась:
kerberos_ldap_group: DEBUG: Bind to ldap server with SASL/GSSAPI
kerberos_ldap_group: DEBUG: Successfully initialised connection to ldap server dc0.example.com:389
В самом Squid конструкция описывается следующим образом:
external_acl_type fastgroup_krb children=10 cache=10 grace=15 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g FastInet@EXAMPLE.COM
acl fastinet external fastgroup_krb
http_access allow fastinet
Запись external_acl_type должна быть записана в одну строку. Переменная %LOGIN передает учетную запись пользователя от negotiate хелпера (см. предыдущую заметку). Конечно, групп может быть несколько, и количество определений external_acl_type не ограничивается.
Вроде бы все просто, однако на работе хелпера я сидел не один день. Судя по дебагу вида:
support_ldap.cc(856): pid=1593 :2015/06/09 15:50:55| kerberos_ldap_group: DEBUG: Bind to ldap server with SASL/GSSAPI
support_sasl.cc(268): pid=1593 :2015/06/09 15:50:55| kerberos_ldap_group: ERROR: ldap_sasl_interactive_bind_s error: Local error
support_ldap.cc(860): pid=1593 :2015/06/09 15:50:55| kerberos_ldap_group: ERROR: Error while binding to ldap server with SASL/GSSAPI: Local error
хелпер не мог соединиться с контроллером домена по ldap и запросить требуемые данные. Причем keytab-файл заведомо использовался, имена разрешались и вообще до момента означенной ошибки все логи были хорошими.
В разборках сильно помогла заметка пользователя Timp, который указал отсутствующие на PTR-записи контроллеров домена в своей очень похожей ситуации. Беда в том, что nslookup на gw0 корректно разрешался в обе стороны для dc0.
По прошествии времени я снова вернулся к этой заметке и решил последовать примеру товарища - вооружиться tcpdump-ом. И каково же было моё удивление, когда я обнаружил ответа dc0 с содержимым NXDOMAIN! И да, появлялись они в моменты работы хелпера. И дважды да, предваряли эти сообщения запросы PTR для адреса контроллера домена!!!
Точки над i расставил dig (вывод я порезал):
root@gw0:~# dig -x 192.168.0.241
;; QUESTION SECTION:
;241.0.168.192.in-addr.arpa.   IN      PTR
Секции ANSWER нет! То есть, действительно, обратной записи для контроллера домена в DNS нет. Идем в соответствующую оснастку (или samba-tool в консоли dc0, что ближе) и добавляем недостающий пойнтер. Смотрим:
root@gw0:~# dig -x 192.168.0.241
;; QUESTION SECTION:
;241.0.168.192.in-addr.arpa.   IN      PTR
;; ANSWER SECTION:
241.0.168.192.in-addr.arpa. 3600 IN    PTR     dc0.example.com.
После этих действий хелпер начал работать.

8 июн. 2015 г.

Squid + Samba4 AD Kerberos Authentication

Краткая заметка о том, как задружить Squid 3 и Active Directory (на базе Samba 4) с помощью Kerberos. При правильной настройке пользователь будет авторизовываться на прокси-сервере прозрачно для себя с учетной записью пользователя домена (то бишь с той же учеткой, под которой он авторизовался в ОС).
Дано: 
 - домен EXAMPLE.ORG (samba4-ad-dc 4.1, level=2008_R2)
 - контроллер dc0.example.com
 - шлюз gw0.example.com (squid 3.4)
Также обязательно должен быть настроен DNS: имена контроллера, шлюза должы корректно разрешаться как прямо, так и обратно.

Чтобы не возиться с установкой и настройкой samba на шлюзе, используем keytab-файл. Для этого создаем пользователя в AD:
root@dc0:~#samba-tool user add proxy_auth
Отключаем срок действия пароля:
samba-tool user setexpiry proxy_auth --noexpiry
Создаем service principal для этого пользователя (создадим пару для fqdn и имени хоста)
samba-tool spn add HTTP/gw0 proxy_auth
samba-tool spn add HTTP/gw0.example.com proxy_auth
Экспортируем полученные значения в файл (также для полного и короткого имени хоста):
samba-tool domain exportkeytab gw0.keytab \
--principal=HTTP/gw0.example.com@EXAMPLE.COM
samba-tool domain exportkeytab gw0.keytab --principal=HTTP/gw0@EXAMPLE.COM
Проверяем работоспособность:
root@dc0:~# klist -ke ./gw0.keytab
Keytab name: FILE:./gw0.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   1 HTTP/gw0.example.com@EXAMPLE.COM (des-cbc-crc)
   1 HTTP/gw0.example.com@EXAMPLE.COM (des-cbc-md5)
   1 HTTP/gw0.example.com@EXAMPLE.COM (arcfour-hmac)
   1 HTTP/gw0@EXAMPLE.COM (des-cbc-crc)
   1 HTTP/gw0@EXAMPLE.COM (des-cbc-md5)
   1 HTTP/gw0@EXAMPLE.COM (arcfour-hmac) 
Далее переносим keytab-файл на шлюз и кладем в директорию squid-а с соответствующими правами:
root@gw0:~# ls -l /etc/squid3/gw0.keytab
-rw------- 1 proxy proxy 372 июн  8 09:45 /etc/squid3/gw0.keytab
Корректируем конфигурацию клиента kerberos на шлюзе (должен быть установлен пакет krb5-user):
root@gw0:~# cat /etc/krb5.conf
[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_kdc = no
    dns_lookup_realm = no
    ticket_lifetime = 24h
    default_keytab_name = /etc/squid3/gw0.keytab
; for Windows 2008 with AES
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
[realms]
    EXAMPLE.COM = {
        kdc = dc0.example.com
;        kdc = dc2.example.com
        admin_server = dc0.example.com
        default_domain = dc0.example.com
    }
[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM
Авторизуемся на контроллере домена через kerberos:
root@gw0:~# kinit administrator
Password for administrator@EXAMPLE.COM:
Warning: Your password will expire in 39 days on Пт 17 июл 2015 21:43:57
Проверяем наличие тикета:
root@gw0:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@EXAMPLE.COM
Valid starting       Expires              Service principal
08.06.2015 15:17:05  09.06.2015 01:17:05  krbtgt/EXAMPLE.COM@EXAMPLE.COM
        renew until 09.06.2015 15:17:02
Проверяем аутентификацию в домене с помощью keytab-файла по имени principal:
root@gw0:~# kinit -V -k -t /etc/squid3/gw0.keytab HTTP/gw0.example.com@EXAMPLE.COM
Using default cache: /tmp/krb5cc_0
Using principal: HTTP/gw0.example.com@EXAMPLE.COM
Using keytab: /etc/squid3/gw0.keytab
Authenticated to Kerberos v5
Была тут проблема, с которой долго бился: аутентификация не проходила с ошибкой:
kinit: Client not found in Kerberos database while getting initial credentials
Оказалось, что при создании spn samba-tool не обновляет в учетной записи пользователя, к которому этот spn привязывается, поле userPrincipalName. А именно по этому полю ищется совпадение. Решение (найдено тут) - вручную поправить соответствующее поле userPrincipalName на HTTP/gw0.example.com@EXAMPLE.COM.
Сделать это можно с виндовой рабочей станции (или сервера) с установленным пакетом RSAT. Нужное поле находится во вкладке Учетная запись и называется Имя входа пользователя. Так как @example.com автозаполняется, то в поле следует внести HTTP/gw0.example.com .

Отлично, теперь squid. Получаем тестовый токен для хелпера negotiate_kerberos_auth:
root@gw0:~# /usr/lib/squid3/negotiate_kerberos_auth_test gw0.example.com
Token: YIIFFwYGKwYBBQUCoIIFCzCCBQegJzAlBgkqhkiG9xIBAgIGBSsFAQUCBgkqhkiC9xIBAgIGBisGAQUCBaKCBNoEggTWYIIE0gYJKoZIhvcSAQICAQBuggTBMIIEvaADAgEFoQMCAQ6iBwMFAAAAAACjggPlYYID4TCCA92gAwIBBaEJGwdLRUxMLlJVoh4wHKADAgEDoRUwExsESFRUUBsLZ3cwLmtlbGwucnWjggOpMIIDpaADAgEXoQMCAQGiggOXBIIDk1VCfz8xbDhCazPRbG86+t0vQIAR69XdCcHCFBgakA2fFlcBvIiW3JUFiJdcJMPX17yHPpVzPzNeDe3nF61pqZ0nXQHGn+MHJuXy13IHY5B4/GNeHXwbOTOFFX0m1Q4zVUWGzqL6yxXEGHHSjNWbLxwBxBgNFSKCVkkFWBZg3j9qD9SdsatZ/MVSxAwjF2Q4VhX/gB6WI6Ah/UN3K5JtDYWHBv8rJjpjfuvk9nSVryZykSJc0fi4YWnrobCFs7jpnuZhpLjQhQBFeEmTq4DJEnGMAfx4K+UnAR9M74SPUNOF9W1Wiyqp/BYBwGgw/Q5txye5up0ELksclI1SvfxU0ojsqcdPPHuv9bz7O+KAWc+K8F9bHVHYTbax6DCpCsS+nss97ywZkP5gHuEYDAmSu2kOpD4AlF2BgBTe6OIo42z0GHq7UMyBlhGf615PR73WlkEoVt08qSVaJGzYGGXS4pvqEzZWJwau7wG43FXDiwA7nNTFcW8MkwjkrsWeoxa/CSVAl1Y2La3CJSrFBa/yFyLYCIyPHTN5stq03eKLBBGVqI83v7ey7gJrtKaQO0+a2IllOOYPbdsIYoEAhjv4oOpIvnqyLhFWvceSAbgjX/+wXa6B2hHvgzTsf2ZZlC+2FBWgRyPTfxNrZ+gb2Q2mKJXUH4rpR2KfSVwsjTZMP1C2/skWZjfiXHX4GuPE+NB2UeMTVW2BVgbk3lATJho2hHJTrNwQ0YkHL0ZMTxpfvGsVID6we9wchrgF9axYZY9e9oBG9Y5DH9sX9BNTK/lMnAnPoZ698dUudlOzXHsO2MUVpYXQzY6YIWihZrJzM6ivaqZMFHOFi3oHdjGfEyyqiEzqQvKnFKU1pQCVzP4WRzZQ4WFiZ87yTH+7Bwk5QjGTeVXcChRC2MvxlDQIoAg7I1Up6EKtmjKY1gp6HzV4A9xMoGiPjyjmcYfjgmxLha4yLmqBA+33vtYL2N6/1+er5I/2oTOIH00BeenFn7qBqX7qF/OqBUrfRWlErQvlUkqheMwrenYASfY72YjLBBFyvUSqlSU/s9DhJ9wLY+WoBcGe0ng0eB1yZu595ZeIXU9grltJZOnXT+R8FFU3LT8MeJdXY/ToUz6roqIsUWTuIPu5bKgbM9vcaxPHun5HMlzFEe9nG1fufjObx05+mBE/lvkt2AnVL5zApYNB9ClmhvlvBjQCtyaT1dHBCratzm2dUiEStaSBvjCBu6ADAgEXooGzBIGwr4Mz/FJAstS7OW4Ir3U1PMDDyS1qWXwb/QHJiEcnKNMAnCjoYuotnR9kHHTYicHOoex+DQADiRC718D0uXHPYzmHcBz7a15jSO1uYQxT2IQEZ+xXLBttpi2ZzItyEBBkkIjQy3kPgdxKEnFdpcxmjDKUUtEI2PtxS5w5syOZvfbyTI8CW3YM7pUsxPLkfB40xC8wn5S1tFpjVHBPBmZc3LL4kxto94F0/yGTsMrojuM=
Теперь запускаем проверку хелпера. Для этого в примере ниже следует написать YR и после пробела вставить всю последовательность после ":" в выводе negotiate_kerberos_auth_test:
root@gw0:~# /usr/lib/squid3/negotiate_kerberos_auth -d -s GSS_C_NO_NAME
negotiate_kerberos_auth.cc(212): pid=5609 :2015/06/08 14:20:25| negotiate_kerberos_auth: INFO: Starting version 3.0.4sq
YR <вставить токен>
AF oRQwEqADCgEAoQsGCSqGSIb3EgECAg== administrator@EXAMPLE.COM
Если в выводе получаем строчку, начинающуюся с AF, значит, хелпер работает корректно.
Ключ -d у хелпера дает нехилый такой дебаг, котороый попадает в cache.log, поэтому если все работает как нужно, лучше его убрать.
Уничтожаем все полученные тикеты:
kdestroy
Вот это место мне не нравится, но более изящного решения я не нашел. Передаем squid расположение keytab-файла через переменную окружения:
/etc/init.d/squid:
##for Kerberos Auth
KRB5_KTNAME=/etc/squid3/gw0.keytab
export KRB5_KTNAME
Это действие стоит держать в памяти, так как при обновлении приложения файл может затереться. К тому же после правки init-файла на него начинает ругаться systemd и требовать обновления:
systemctl daemon-reload
Кое-где встречал предложения создать файлик /etc/default/squid и прописать переменную там. Хоть такая передача параметров и соответствует философии Debian, конкретный squid3 при запуске этот файл не ищет, а значит, и параметры оттуда получать не будет.
Наконец, настраиваем сам squid:
squid.conf:
auth_param negotiate program /usr/lib/squid3/negotiate_kerberos_auth -s GSS_C_NO_NAME
auth_param negotiate children 20
auth_param negotiate keep_alive on
acl testauth proxy_auth REQUIRED
http_access allow testauth localnet
Таким образом, любой пользователь, пришедщий на прокси-сервер, попадает под proxy_auth REQUIRED, берет тикет для аутентификации у контроллера домена, передает его прокси-серверу и получает доступ в интернет через acl testauth. Вот тут в конце статьи довольно внятное описание процесса.


3 июн. 2015 г.

Postgresql issue during Debian Wheezy to Jessie upgrade

Проблема, собственно, в чем: при обычном dist-upgrade сабжевая СУБД нормально обновилась с 9.1 до 9.4 (минорные циферки опустим, неважно). Однако сам процесс обновления оказался забавным: инсталлятор снес 9.1 (оставив конфиги в /etc/ и базы в /var/lib), установил 9.4, создал дефолтный кластер, запустил всю эту балалайку - и доволен. 
Таким образом, в итоге имеем корректно функционирующий постгрес, но с умолчальным конфигом и без баз =).
Вообще, у postgresl имеется встроенный механизм обновления - pg_upgrade, который сам проверяет совместимость баз в старом и новом релизах и перебрасывает их из папки в папку (полагаю, что и вносит при этом необходимые изменения). Но дебиановские мейнтейнеры как-то этот момент похоже упустили. 
А делать надо следующее (актуализированные команды, чтобы не переписывать, взяты отсюда, а документация по этому вопросу - тут):
sudo -H -u postgres /usr/lib/postgresql/9.4/bin/pg_upgrade \
-b /usr/lib/postgresql/9.1/bin \
-B /usr/lib/postgresql/9.4/bin \
-d /var/lib/postgresql/9.1/main \
-D /var/lib/postgresql/9.4/main \
-o ' -c config_file=/etc/postgresql/9.1/main/postgresql.conf' \
-O ' -c config_file=/etc/postgresql/9.4/main/postgresql.conf'
Конечно, писать все можно и в одну строчку, забыв про "\". Строчные буквы относятся к файлам старой версии, прописные - к новой. 
В моем случае беда была в том, что при обновлении все бинарные файлы старого релиза оказались удалены, а в репозиториях jessie версии 9.1 уже нет. Поэтому пришлось искать старый .deb (благо кэш apt-а никто не чистил), и подсовывать файлики оттуда (установить deb-пакеты - плохая идея, ибо он начнет делать downgrade текущей инсталляции).
При первом запуске рекомендую добавить еще опцию --check,  чтобы без внесения каких-либо изменений провести проверку всего и вся. В случае ошибок инфомация записывается в лог-файл, создаваемый в текущей рабочей директории.

26 мая 2015 г.

Skype for Linux +Proxy

Потребовался на работе Skype. Скачал, поставил, запустил. Инет в конторе - за прокси, а окно запуска вот такое:
В общем, чтобы настроить прокси-сервер для подключения, следует нажать Ctrl+O, тогда откроется отдельное окно с настройками.

22 мая 2015 г.

Bash: Inet switcher

Для сохранности оставлю здесь скрипт автопереключалки инета для трех провайдеров с проверкой доступности ресурсов. Правда, в рабочем порядке он еще не испробован, поэтому применять с осторожностью.

#!/bin/bash

##
## /etc/iproute2/rt_tables:
## 101     fc
## 102     adsl
## 103     gsm
##

##

##Localnet
L1_IF="eth77"
L1_IP="192.168.77.250"
L1_NET="192.168.77.0/24"

##FC
P1_IF="eth77"
P1_GW="192.168.77.159"
P1_TBL="fc"

##ADSL
P2_IF="ppp200"
P2_GW="`ifconfig ppp200 |egrep -o 'addr:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk -F: '{ print $2}'`"
P2_TBL="adsl"

##Cellular 3G
P3_IF="eth77"
P3_GW="192.168.77.200"
P3_TBL="gsm"

## hosts to ping
TEST1="77.88.8.8"
TEST2="8.8.8.8"

##Default for fallback feature
DEF=${P1_GW}

## fullfill iproute2 tables
function fill_p1
        {
                /bin/ip r flush table ${P1_TBL}
                /bin/ip r a default via ${P1_GW} table ${P1_TBL}
                /bin/ip r a ${L1_NET} dev ${L1_IF} src ${L1_IP} scope link table ${P1_TBL}
                /bin/ip rule a fwmark 1 lookup ${P1_TBL}
        }

function fill_p2
        {
                /bin/ip r flush table ${P2_TBL}
                /bin/ip r a default dev ${P2_IF} table ${P2_TBL}
                /bin/ip r a ${L1_NET} dev ${L1_IF} src ${L1_IP} scope link table ${P2_TBL}
                /bin/ip rule a fwmark 2 lookup ${P2_TBL}
        }
function fill_p3
        {
                /bin/ip r flush table ${P3_TBL}
                /bin/ip r a default via ${P3_GW} table ${P3_TBL}
                /bin/ip r a ${L1_NET} dev ${L1_IF} src ${L1_IP} scope link table ${P3_TBL}
                /bin/ip rule a fwmark 3 lookup ${P3_TBL}
        }

## checking internet availability via different providers
function get_status
        {
                CUR_GW=`/bin/ip r sh | grep def | egrep -o [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`

                /bin/ping -W 1 -i 0.5 -c 2 -m 1 ${TEST1} > /dev/null
                P1_STAT="$?"

                /bin/ping -W 1 -i 0.5 -c 2 -m 2 ${TEST1} > /dev/null
                P2_STAT="$?"

                /bin/ping -W 1 -i 0.5 -c 2 -m 3 ${TEST1} > /dev/null
                P3_STAT="$?"

                if [ "$P1_STAT" -ne "0" ] && [ "$P2_STAT" -ne "0" ] && [ "$P3_STAT" -ne "0" ]
                        then
                               echo "${TEST1} failed, trying ${TEST2}"
                                /bin/ping -W 1 -i 0.5 -c 2 -m 1 ${TEST2} > /dev/null
                                P1_STAT="$?"

                                /bin/ping -W 1 -i 0.5 -c 2 -m 2 ${TEST2} > /dev/null
                                P2_STAT="$?"

                                /bin/ping -W 1 -i 0.5 -c 2 -m 3 ${TEST2} > /dev/null
                                P3_STAT="$?"
                fi

        }

##main

echo "filling rt_tables"
fill_p1
fill_p2
fill_p3

echo "cheking gateways"
get_status
echo "P1: $P1_STAT P2: $P2_STAT P3: $P3_STAT"

echo "action: "
if [ "$P1_STAT" -eq "0" ] && [ "$CUR_GW" = "$DEF" ]
        then
               echo "do nothing"
                exit 0
fi

if [ "$P1_STAT" -eq "0" ] && [ "$CUR_GW" != "${DEF}" ]
        then
               echo "restoring to $P1_TBL"
              /sbin/ip r ch default via ${P1_GW}
                exit 0
fi

if [ "$P2_STAT" -eq "0" ] && [ -n "$P2_GW" ]
        then
               echo "switching to $P2_TBL"
              /bin/ip r ch default via ${P2_GW}
                exit 0
fi
if [ "$P3_STAT" -eq "0" ]
        then
               echo "switching to $P3_TBL"
              /bin/ip r ch default via ${P3_GW}
                exit 0
        else
               echo "swag!"
fi


21 мая 2015 г.

PPPoE multiple AC

Вышло так, что с одного интерфейса сервера доступно сразу две провайдерских железки, через которые дОлжно поднимать pppoe-туннели. И pppd начал путаться, куда какой учеткой авторизовываться. Точнее, он тупо перебирает по порядку, а MAC-адресов доступно много-много, поэтому процесс переподключения затягивается.
Лечение оказалось элементарное: в каждом конфиге указываем имя концентратора заданного провайдера (посмотреть список можно по pppoe-discovery -I ethX):
rp_pppoe_ac NAME
Как правило, провайдеры отдают несколько концентраторов с общим именем, поэтому на надежность это не влияет. 
Вдохновение нашлось тут. Автору спасибо!

21 апр. 2015 г.

irssi CP1251/UTF8

Потребовалось вернуться к истокам: попасть в IRC, имея лишь удаленную консоль. Далее идут воспоминания, как подружить irssi с кодировкой irc-канала CP1251 при работе из консоли с кодировкой UTF-8 (команды вводятся уже "внутри" клиента):
/set recode_fallback cp1251
/set recode_out_default_charset cp1251
/set recode_transliterate off
/set recode_autodetect_utf8 on
/set term_charset utf-8
/quit

30 янв. 2015 г.

Postgresql-1C libicu46 mismatch

Не первый раз сталкиваюсь с косяком в разных дистрибутивах Debian при установке сборки Postgresql от 1С вида "для установки требуется libicu46 >= 4.6.1-1, а у вас версия отличается".
Рецепт лечения несложно найти на просторах Сети, но каждый раз ищется все дольше и дольше, поэтому скопирую для себя его тут (источник):

В общем нашел решение на просторах интернета, оно заключается в следующем:
  • копируем postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb в папку на сервере, входим в нее;
  • распаковываем пакет: dpkg -x postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb tmpdir 
  • После: dpkg -e postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb tmpdir/DEBIAN 
  • Далее: открываем в текстовом редакторе файл «control»: nano ./tmpdir/DEBIAN/control
  • Ищем строку libicu46 (>= 1.4.6) и меняем ее на libicu52 (>= 1.4.6)
  • Сохраняем изменения и собираем пакет обратно: dpkg -b tmpdir postgresql-contrib-9.2_9.2.4-1.1C_amd64_fix.deb

sslh + auth.log messages

Есть у отличной утилиты sslh вредная привычка - засирать auth.log сообщениями типа 
Jan 30 11:28:07 ct sslh-select[29994]: connection from localhost:39588 to localhost:https forwarded from localhost:39589 to localhost:https
Как понизить уровень логирования средствами самой утилиты, мне узнать не удалось. Решаем вопрос на уровне rsyslog:
root@ct:~# cat /etc/rsyslog.d/sslh.conf
:programname, isequal, "sslh-select"             ~
Требуется перезапуск rsyslog.

3 янв. 2015 г.

mkv: change default audio track

Новый год, отдых, смотрим сериалы, и вдруг засада: релизер при монтаже очередной серии не перевыставил флаг умолчания на русскоязычной дорожке в mkv-контейнере, а телевизор сменить аудиодорожку не умеет. 
Решение довольно просто: перевыставить флаги на аудио-дорожках в нужном порядке. Для этого нужны утилиты mkvpropedit и mkvinfo, доступные в пакете mkvtoolnix. Для linux пакет доступен в репозиториях соответствующего дистрибутива, для windows можно взять, к примеру, тут
Сначала нужно узнать, каким образом идентифицировать треки в контейнере (под рукой был ноут с windows 7, примеры оттуда):

c:\Program Files\MKVToolNix>mkvinfo.exe g:\video.mkv

Вывода там вагон, ищем информацию об аудиодорожках:
| + Дорожка
|  + Номер дорожки: 2 (ID дорожки для mkvmerge и mkvextract: 1)
|  + UID дорожки: 1095754913
|  + Тип дорожки: audio
|  + Флаг по умолчанию: 1
|  + ID кодека: A_AC3
|  + Продолжительность по умолчанию: 32.000ms (31.250 кадров/полей в секунду для
 видеодорожки)
|  + Audio track
|   + Частота дискретизации: 48000
|   + Каналы: 6
|  + Включено: 1
|  + Флаг 'принудительно': 0
|  + Флаг сшивания: 1
|  + Минимальный кэш: 0
|  + Максимальный BlockAddition ID: 0
|  + Codec decode all: 1
| + Дорожка
|  + Номер дорожки: 3 (ID дорожки для mkvmerge и mkvextract: 2)
|  + UID дорожки: 1628356481
|  + Тип дорожки: audio
|  + ID кодека: A_AC3
|  + Продолжительность по умолчанию: 32.000ms (31.250 кадров/полей в секунду для
 видеодорожки)
|  + Язык: rus
|  + Имя: Fox Life
|  + Audio track
|   + Частота дискретизации: 48000
|   + Каналы: 2
|  + Включено: 1
|  + Флаг по умолчанию: 0
|  + Флаг 'принудительно': 0
|  + Флаг сшивания: 1
|  + Минимальный кэш: 0
|  + Максимальный BlockAddition ID: 0
|  + Codec decode all: 1
Нас интересует две вещи: во-первых, где стоит атрибут "флаг по умолчанию: 1" (эту дорожку и видит наш телевизор); во-вторых, нужно знать UID или ID дорожки для изменения настроек.
Теперь мы знаем все необходимое:
c:\Program Files\MKVToolNix>mkvpropedit.exe -v --edit track:=1628356481 --set flag-default=1 --edit track:=1095754913 --set flag-default=0  g:\video.mkv
The file is being analyzed.
Обработано: [=========================] 100%
Изменение для '--set flag-default=1' выполнено. Записей установлено: 1
Изменение для '--set flag-default=0' выполнено. Записей установлено: 1
Изменения записаны в файл.
Элемент Tracks записан.
Готово.
Вместо UID можно обращаться по ID (как правило, первым треком - id 0 - идет видеодорожка, затем по порядку все аудиодорожки), результат будет тот же.