четверг, 19 декабря 2019 г.

Конвертация .key файла ключа в gpg-формат для проверки подписи apt-get

Рассмотрим на примере nginx.org.
Разработчик собирает пакеты под дистрибутивы Debian/Ububntu и подписывает их своим ключом. Далее нам предлагают импортировать этот ключ в default apt keyring и пользоваться:
sudo apt-key add nginx_signing.key
Ключ будет добавлен в /etc/apt/trusted.gpg, им можно управлять с помощью apt-key.

Есть альтернативный вариант - создать отдельный keyring для конкретного или нескольких ключей, и распространять его обычным копированием в /etc/apt/trusted.gpg.d/ на требуемом количестве окружений.

Делается это путём нехитрого набора действий (на данном примере):
wget http://nginx.org/keys/nginx_signing.key
gpg --no-default-keyring --keyring ./tmp.gpg --import nginx_signing.key
gpg --no-default-keyring --keyring ./tmp.gpg --export > /etc/apt/trusted.gpg.d/nginx.gpg
Созданный таким образом ключ теперь можно распространять с помощью этих ваших шефов/анзиблов/etc.

Updated on 2019-12-19

вторник, 20 ноября 2018 г.

понедельник, 18 декабря 2017 г.

Конвертируем время в лог-фале из формата TAI64N в человеко-читаемый вил

В логах qmail время пишется в формате TAI64N, что иногда доставляет неудобств.
Решается перенаправлением лога через pipe в исправляющий это через pipe в perl-код.
Выглядит как-то так:
tail -F /var/log/qmail/*/current | perl -MPOSIX=strftime -npe 's{\@4 (\w{15}) (\w{8}) }{strftime( "%Y-%m-%d %H:%M:%S.".sprintf("%09s",hex($2)),localtime hex($1) )}ex' 

понедельник, 13 ноября 2017 г.

Несколько VLAN в Windows 10

После недавнего обновления (KB4041994) Windows 10 решила сделать мне хорошо и удалила более не поддерживаемую утилиту "Realtek Ethernet Diagnostic Utility".
Незадача в том, что утилита позволяла, пусть и коряво, сделать несколько VLAN на встроенной сетевой карте с чипом RTL8168. Итого образовалась ситуация: чип аппаратно умеет VLAN, а программно как-бы уже не умеет без вышеупомянутой утилиты.

Получилось решить обходным путём через подсистему Hyper-V (должно работать на Windows 10 Pro/Enterprise) путём выполнения следующих действий.

1. Установить компоненты Hyper-V, выполнив в PowerShell из-под администратора
Enable-WindowsOptionalFeature -Online -FeatureName:Microsoft-Hyper-V -All
После этого следует убедиться что выбран пункт "Hyper-V" и все его подпункты в разделе "Панель управления\Все элементы панели управления\Программы и компоненты - Включение и отключение компонентов Windows".

2. Перезагрузить ЭВМ.

3. Запустить "Пуск - Средства администрирования Windows - Диспетчер Hyper-V".
В диспетчере слева в списке выбрать свой компьютер по его имени, справа "Диспетчер виртуальных коммутаторов", посмотреть в нём список "Виртуальные коммутаторы". В списке должен быть "Коммутатор по умолчанию". Тут пришлось создать ещё один виртуальный коммутатор с именем VSwitch0 (имя не принципиально), так как на "Коммутатор по умолчанию" не взлетело. Получилось как на картинке.

4. Далее, следуя инструкциям этой замечательной ссылки, выполнить следующие команды в PowerShell из-под администратора для каждого требуемого VLAN
Add-VMNetworkAdapter -ManagementOS -Name <VLAN_NAME> -StaticMacAddress <MAC> -SwitchName <VIRTUAL_SWITCH_NAME>
Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName <VLAN_NAME> -Access -VlanId <VLAN_ID>
где
<VLAN_NAME> - предпочитаемое имя VLAN в системе, например "eth0.1234" или "backup internet";
<VLAN_ID> - идентификатор VLAN;
<MAC> - желаемый MAC-адрес виртуального адаптера вида "DE-AD-11-11-DE-AD";
<VIRTUAL_SWITCH_NAME> - имя виртуального коммутатора из шага 3, в моём случае "VSwitch0".


понедельник, 10 октября 2016 г.

svchost.exe (netsvc) high CPU/memory usage

Скрипт, лечащий залипание Windows Update на Windows 7, когда svchost.exe (netsvc) потребляет много ресурсов CPU и памяти.

Следует использовать если проблема осталась после установки обновления Windows Update от июня 2015

@echo off

REM Script to Reset Windows Updates agent
REM Stop Services

net stop bits
net stop wuauserv
net stop appidsvc
net stop cryptsvc

REM Delete the qmgr*.dat files
Del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr*.dat"

REM Rename folders
Ren %systemroot%\SoftwareDistribution SoftwareDistribution.bak
Ren %systemroot%\system32\catroot2 catroot2.bak

REM Reset services permissions
sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)
sc.exe sdsetwuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)

REM ReRegister services
cd /d %windir%\system32
regsvr32.exe /U /s vbscript.dll
regsvr32.exe /U /s mshtml.dll
regsvr32.exe /U /s msjava.dll
regsvr32.exe /U /s msxml.dll
regsvr32.exe /U /s actxprxy.dll
regsvr32.exe /U /s shdocvw.dll
regsvr32.exe /U /s Mssip32.dll
regsvr32.exe /U /s wintrust.dll
regsvr32.exe /U /s initpki.dll
regsvr32.exe /U /s dssenh.dll
regsvr32.exe /U /s rsaenh.dll
regsvr32.exe /U /s gpkcsp.dll
regsvr32.exe /U /s sccbase.dll
regsvr32.exe /U /s slbcsp.dll
regsvr32.exe /U /s cryptdlg.dll
regsvr32.exe /U /s Urlmon.dll
regsvr32.exe /U /s Oleaut32.dll
regsvr32.exe /U /s msxml2.dll
regsvr32.exe /U /s Browseui.dll
regsvr32.exe /U /s shell32.dll
regsvr32.exe /U /s atl.dll
regsvr32.exe /U /s jscript.dll
regsvr32.exe /U /s msxml3.dll
regsvr32.exe /U /s softpub.dll
regsvr32.exe /U /s wuapi.dll
regsvr32.exe /U /s wuaueng.dll
regsvr32.exe /U /s wuaueng1.dll
regsvr32.exe /U /s wucltui.dll
regsvr32.exe /U /s wups.dll
regsvr32.exe /U /s wups2.dll
regsvr32.exe /U /s wuweb.dll
regsvr32.exe /U /s scrrun.dll
regsvr32.exe /U /s msxml6.dll
regsvr32.exe /U /s ole32.dll
regsvr32.exe /U /s qmgr.dll
regsvr32.exe /U /s qmgrprxy.dll
regsvr32.exe /U /s wucltux.dll
regsvr32.exe /U /s muweb.dll
regsvr32.exe /U /s wuwebv.dll
regsvr32.exe /s vbscript.dll
regsvr32.exe /s mshtml.dll
regsvr32.exe /s msjava.dll
regsvr32.exe /s msxml.dll
regsvr32.exe /s actxprxy.dll
regsvr32.exe /s shdocvw.dll
regsvr32.exe /s Mssip32.dll
regsvr32.exe /s wintrust.dll
regsvr32.exe /s initpki.dll
regsvr32.exe /s dssenh.dll
regsvr32.exe /s rsaenh.dll
regsvr32.exe /s gpkcsp.dll
regsvr32.exe /s sccbase.dll
regsvr32.exe /s slbcsp.dll
regsvr32.exe /s cryptdlg.dll
regsvr32.exe /s Urlmon.dll
regsvr32.exe /s Oleaut32.dll
regsvr32.exe /s msxml2.dll
regsvr32.exe /s Browseui.dll
regsvr32.exe /s shell32.dll
regsvr32.exe /s Mssip32.dll
regsvr32.exe /s atl.dll
regsvr32.exe /s jscript.dll
regsvr32.exe /s msxml3.dll
regsvr32.exe /s softpub.dll
regsvr32.exe /s wuapi.dll
regsvr32.exe /s wuaueng.dll
regsvr32.exe /s wuaueng1.dll
regsvr32.exe /s wucltui.dll
regsvr32.exe /s wups.dll
regsvr32.exe /s wups2.dll
regsvr32.exe /s wuweb.dll
regsvr32.exe /s scrrun.dll
regsvr32.exe /s msxml6.dll
regsvr32.exe /s ole32.dll
regsvr32.exe /s qmgr.dll
regsvr32.exe /s qmgrprxy.dll
regsvr32.exe /s wucltux.dll
regsvr32.exe /s muweb.dll
regsvr32.exe /s wuwebv.dll

REM reset winsock
netsh winsock reset

REM reset proxy
netsh winhttp reset proxy

REM restart services
net start bits
net start wuauserv
net start appidsvc
net start cryptsvc

REM Install the latest Windows Update Agent.
start http://support.microsoft.com/kb/949104

вторник, 1 сентября 2015 г.

tail -f on rapidly truncated file

При частой перезаписи файла (например, при ротации лог-файла) tail -f останавливается на первом таком событии. Для автоматического подключения к новому файлу следует использовать команду:
tail -f --follow=name --retry <filename>
В случае отсутствия функционала у бинарного tail (например, на busybox) можно использовать следующий bash-скрипт:
#!/bin/bash 

PID=`mktemp`
while true;
do
  [ -e "$1" ] && IO=`stat -c %i "$1"`
  [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; }

  # as long as the file exists and the inode number did not change
  while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]]
  do
     sleep 0.5
  done
  [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID
  sleep 0.5
done 2> /dev/null
rm -rf $PID

вторник, 7 июля 2015 г.

Перенос процесса в screen

Иногда возникает необходимость перенести важный долго работающий процесс из консоли без screen в screen для последующего закрытия консоли. Этого можно достичь с помощью утилиты reptyr (GitHub).
Установка в Debian/Ubuntu:
sudo apt-get install reptyr
Использование (в новой консоли):
screen -S <screen name>
reptyr <PID of running process to attach>

среда, 20 мая 2015 г.

Чем заняты inode в /

Сканирование всех директорий в / (без прохода по другим файловым системам) и вывод сортированного списка директорий от наименьшего количества занятых inode к наибольшему:
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

пятница, 13 марта 2015 г.

Правильная демонизация в perl

sub daemonize {
  logger('Entering Daemon mode');
  chdir '/' or die "Can't chdir to /: $!";
  umask 0;

  open STDIN,  '<', '/dev/null' or die "Can't read /dev/null: $!";
  open STDOUT, '>', '/dev/null' or die "Can't write to /dev/null: $!";
  open STDERR, '>', '/dev/null' or die "Can't write to /dev/null: $!";

  my $pid = fork;
  exit if $pid;
  if (!defined $pid) { die "Couldn't fork: $!" }
# Here you may want to detach script output from console
# logger_del('console'); #(*)
  setsid() or die "Can't start a new session: $!";

# logger('Now in Daemon mode'); #(*)
  say 'Now in Daemon mode';

  return
}

* 'logger()' is my own tool for convinient data output, you can simply replace it with 'say' or 'print'

четверг, 12 марта 2015 г.

среда, 11 марта 2015 г.

понедельник, 16 февраля 2015 г.

Windows 7 x64 + 1С выгрузка из MySQL

Для правильной работы надо установить ставить MySQL Connector/ODBC x86:
http://dev.mysql.com/downloads/connector/odbc/

При добавлении нового DSN через "Панель управления" - "Администрирование" - "Источники данных (ODBC)" 1С не может произвести выгрузку , т.к. "Источники данных (ODBC)" запускает x64 версию конфигуратора ODBC, а 1С - 32-битное приложение. Решить проблему можно в x86 версии конфигуратора ODBC, запустив:
%SystemRoot%\SysWOW64\odbcad32.exe

Детальнее можно почитать в FAQ:
http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-errors.html

среда, 21 января 2015 г.

Инкрементация в bash

(( x++ )) или (( x += 1 )) или let x++

Создание раздела на большом диске

# parted /dev/<диск>
mklabel gpt
unit TB
mkpart primary 0 <кол-во терабайт диска>
print
quit

Горячая замена жестких дисков

При горячей замене жесткого диска, его следует сначала отмонтировать:
umount /dev/sdX

Затем записать все буферы из памяти на физические накопители:
sync

И удалить жесткий диск из списка устройств:
echo 1 >/sys/block/sdX/device/delete


Жесткий диск можно отключать.

После подключения нового диска, следует выполнить поиск новых устройств:
for i in $(ls /sys/class/scsi_host/); do echo "- - -" > /sys/class/scsi_host/$i/scan; done

SSH-тоннель

ssh -g -f -ND <IP сервера>:<порт SOCKS> <SSH логин>@<IP сервера> -p<порт SSHd>

Запуск tcpdump не из под root

groupadd tcpdump
addgroup <username> tcpdump
chown root.tcpdump /usr/sbin/tcpdump
chmod g+rx /usr/sbin/tcpdump
setcap "CAP_NET_RAW+eip" /usr/sbin/tcpdump