Заметки в категории Linux

Видеонаблюдение дома

Много разных статей встречается в сети на тему домашнего видеонаблюдения. Я решил изобрести свой велосипед, с преферансом и куртизанками.

Для начала я порылся в закромах и нашел Noname Chinese IP Camera, которая умеет слать поток куда-то в Китай, а значит его можно попробовать поймать.

Подключаем камеру и пытаемся посмотреть, какие открытые порты она имеет:

$ sudo nmap -A 192.168.1.156

Ответ впечатляет разнообразностью:
Читать далее...

Мультитач в Ubuntu

Давно хотел нормальные жесты в Ubuntu и все никак не получалось найти способ, чтоб это заработало. Удобно же сделаны рабочие места в той же MacOS.

И вот сегодня нашел проект, который позволяет это все сделать абсолютно безболезненно.

Заводится с полпинка.

У товарища не захотело переключать рабочие столы с ходу. Решилось заменой в конфиге на xdotool. Примеры есть в самом конфиге. Пользуйтесь на здоровье. ;)

30+ Linux команд, которые необходимо знать

30+ простых команд, которые помогут работать в консоли:

  • ls - list, выводит список файлов в каталоге
  • mkdir - make dir, создать каталог
  • pwd - print working dir, показать текущий каталог
  • cd - change dir, сменить каталог
  • rmdir - remove dir, удалить каталог
  • rm - remove, удалить файл/каталог
  • cp - copy, копирование файлов/каталогов
  • mv - move, переместить файл/каталог
  • cat - concatenate/print, объеденить или вывести содержимое файла
  • tail - вывести конец файла
  • less - вывести содержимое файла
  • grep - фильтровать содержимое файла
  • find - поиск файлов
  • tar, gzip, unzip - архивирование/разархивирование файлов/каталогов
  • help - краткая справка
  • whatis - однострочное описание команды
  • man - manual, подробная справка о команде
  • exit - закрытие текущей сессии терминала
  • ping - проверка доступности удаленного хоста
  • who - кто использует текущий компьютер
  • su - switch user, переключить пользователя
  • uname - информация о текущем компьтере
  • free - показать объем свободной памяти
  • df, du - показать статистику использования диска
  • ps - processes, показать выполняемые процессы
  • top - статистика выполняемых процессов
  • shutdown, halt - выключить/перезагрузить компьютер

Настройка DKIM подписи в Amavisd

Если вы пришли сюда, то вероятно уже знаете, что такое DKIM и зачем оно нужно. Если же нет, то вам сюда.

Amavisd умеет сам подписывать письма без сторонней помощи и настривается он весьма просто:

Создаем ключ для домена:

mkdir /etc/amavis/keys/
amavisd-new genrsa /etc/amavis/keys/example.com.key;

Конфигурируем Amavisd:

Создадим файл /etc/amavis/conf.d/55-dkim с содержимым:

$enable_dkim_signing = 1;
dkim_key('example.com', 'mail', '/etc/amavis/keys/example.com.key');

@dkim_signature_options_bysender_maps = ({ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );

@mynetworks = qw(0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16);  # list your internal networks

1;

Читать далее...

Gnome3 и suspend при закрытии крышки ноутбука

В связи с новостями о прекращении разработки Unity8 решил посмотреть на альтернативные рабочие окружения. Раньше весьма не плох был Gnome, на него и решил посмотреть в первую очередь. Заодно и систему с нуля переставить, т.к. очень уж засорил я свой ноут.

Установка прошла как по маслу и все вроде бы шло не плохо, пока я не закрыл крышку ноута и не оказалось, что ноутбук не переходит в состояние сна. Просто продолжал работать как и раньше. Открываешь - вот оно все. Даже пароль не просит.

Это не дело и жить с этим нельзя. Копнул поглубже и вот вам решение проблемы, если вы столкнулись с таким же.

В файл /etc/acpi/events/lidbtn пишем эти строки:

# /etc/acpi/events/lidbtn

event=button[ /]lid
action=/etc/acpi/lid.sh

Теперь сам скрипт, который будет блокировать рабочий стол и отправлять машинку в suspend - /etc/acpi/lid.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

RUNTIME=`grep -l DISPLAY /run/systemd/users/* | xargs grep RUNTIME | awk -F= '{print $2}'`
USERNAME=`grep -l DISPLAY /run/systemd/users/* | xargs grep NAME | awk -F= '{print $2}'`
DISPLAY=`grep -l DISPLAY /run/systemd/users/* | xargs grep DISPLAY | awk -F= '{print $2}'`

export XAUTHORITY=${RUNTIME}/gdm/Xauthority
export DISPLAY=:${DISPLAY}
export `cat ${RUNTIME}/dbus-session`

grep -q closed /proc/acpi/button/lid/*/state

if [ $? == 0 ]; then
  su ${USERNAME} -c 'gnome-screensaver-command -l'
  /usr/sbin/pm-suspend >> /tmp/lid.log
fi

Не забудьте поставить пакет с утилитами:

apt install pm-utils

Перезагружаем acpid и проверяем:

/etc/init.d/acpid restart

Ошибка ttf-mscorefonts-installer

Последнее время достает ошибка ttf-mscorefonts-installer.

Решение проблемы:

sudo dpkg -P ttf-mscorefonts-installer  
wget http://ftp.de.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.6_all.deb
sudo dpkg -i ttf-mscorefonts-installer_3.6_all.deb
sudo fc-cache -fv
fc-cache ~/.fonts

ISC DHCP сервер и маршрут по умолчанию

она описана внутри этого скрипта:

# if we have $new_rfc3442_classless_static_routes then we have to
# ignore $new_routers entirely

Т.е. скрипт просто игнорирует значение опции:

option routers ....

Чтоб это исправить нужно добавить в classless маршрут по умолчанию:

option classless-routes code 121 = array of unsigned integer 8;
option classless-routes 0,               192,168,1,1, 
                        24, 192,168,100, 192,168,1,2,
                        24, 10,4,0,      192,168,1,2;
option classless-routes-win code 249 = array of unsigned integer 8;
option classless-routes-win 0,               192,168,1,1, 
                            24, 192,168,100, 192,168,1,2,
                            24, 10,4,0,      192,168,1,2;

Ищем причину зависания сервера

Игрался я тут как-то с Orange Pi Zero и стала она подвисать на ровном месте. Монитор я не подключал к нему, т.к. это такая себе была игровая площадка для всяких датчиков и т.п. В общем, надо было понять в чем дело и почему подвисает железка.

В Linux есть такая возможность ядра как Netconsole. Netconsole позволяет послать сообщения от ядра на удаленный компьютер. Вспомнил о ней и решил вот написать как ей пользоваться. Может кому-то еще пригодится.

Для настройки netconsole нужен другой (постоянно включенный) компьютер который примет сообщение по сети.

Настраиваем проблемный сервер

  1. В /etc/modules добавляем netconsole
  2. В /etc/modprobe.d/netconsole.conf пишем

    options netconsole netconsole=SRCPORT@SRCHOST/eth0,DSTPORT@DSTHOST/DSTMAC

Где SRCPORT и SRCHOST соответственно порт и IP адрес сервера который отлаживаем.
А DSTPORT и DSTHOST порт и IP адрес сервера который будет принимать сообщения.

DSTMAC — это MAC адрес сервера который будет принимать сообщения ЕСЛИ он в той же сети. Если он за роутером или где нибудь в интернете, то нужно указывать MAC адрес ближайшего роутера (Gateway).

Должно получится чтото типа:

options netconsole netconsole=6666@192.168.1.2/eth0,6666@192.168.1.3/e0:91:f5:7d:e6:38

Настраиваем сервер с логом

Нам нужно как-то запустить программу которая будет слушать UDP порт DSTPORT и куда-либо записывать сообшения.

Самый просто способ — запустить netcat который будет выдавать на экран все что приходит на порт. Для того чтобы после закрытия окна данная программа не прекратила работать, можно запустить ее в screen.

Запускаем screen

screen -U -D -RR

Запускаем в окне netcat

netcat -l -u DSTHOST DSTPORT

Как понять что все работает?

Можно подождать какого нибудь события, но как убедится что сообщения реально ходят?

kmsg

echo test > /dev/kmsg

После выполнения этой команды в лог прилетит отправленный текст

SysRq

Можно активировать SysRq механизм ядра.
echo 1 > /proc/sys/kernel/sysrq
echo h > /proc/sysrq-trigger

После этого на сервере который принимает сообщения в окне с netcat появится текст типа
[ 7849.700372] SysRq : HELP : loglevel(0-9)....

Создаем htpasswd для nginx (без Apache)

Если вы, как и я, любите nginx и давно не используете Apache, то устанавливать apache2-utils только ради утилиты htpasswd кажется глупым. И это верно. У вас на борту, скорее всего уже есть openssl. Используем его:

$ printf "${USER}:`openssl passwd -apr1`\n"

${USER} - можно поменять на любое имя пользователя. Если оставить так, то будет подставлено текущее имя пользователя.

Пароль команда запросит ввести дважды.

Полученную строку копируем в файл .htpasswd

Кластеризация Ejabberd

Небольшая заметка о моих изысканиях и попытках заставить ejabberd работать в режиме кластера. Возможно я что-то делаю не так, но другим способом заставить работать это поделие у меня не вышло. Предыстория

Пришлось поднимать кластер из ejabberd серверов. Скрипт подключения ноды в кластер постоянно ругался на то, что имя ноды уже кем-то используется и он не может подлючить эту ноду в кластер. Подключаем ноду в ручном режиме

Первая нода

Установить ejabberd можно несколькими способами:

apt

$ sudo apt install ejabberd

deb пакет

$ wget "https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/16.09/ejabberd_16.09-0_amd64.deb"
$ dpkg -i ejabberd*.deb

run скрипт

$ wget "https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/16.09/ejabberd-16.09-linux-x86_64-installer.run"
$ chmod 755 ejabberd*.run
$ sudo ./ejabberd-16.09-linux-x86_64-installer.run

После установки правим ejabberd.cfg, но главное — в INET_DIST_INTERFACE указываем ip адрес ноды.

Запускаем ноду:

$ ejabberdctl --node ejabberd@first.example.com start

Проверяем, что нода запустилась корректно:

$ ejabberdctl --node ejabberd@first.example.com status

Вторая нода

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

Проделываем действия по установке настройке и конфигурации INET_DIST_INTERFACE для второй ноды. Файл куки

Erlang использует специальный файл-куку для авторизации нод кластера. Т.е. этот файл должен быть одинаков для всех нод в кластере. Этот файл располагается в домашнем каталоге ejabberd (обычно это /opt/ejabberd/var/lib/, и файл обычно называется .erlang.cookie), но все зависит от способа установки. Скопируйте этот файл с первой ноды на вторую. Настройка репликации mnesia

Переключитесь в пользователя, от которого запускается ejabberd:

$ sudo su - ejabberd

Теперь собственно настройка репликации:

$ cd /opt/ejabberd/var/lib/ejabberd
$ export HOME=/opt/ejabber/var/lib/ejabberd
$ erl -name ejabberd@second.example.com -mnesia extra_db_nodes "['ejabberd@first.example.com']" -s mnesia

пример вывода

you are now in an erlang shell:

Erlang R14B02 (erts-5.8.3) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.3 (abort with ^G)
(ejabberd@second.example.com)1> mnesia:info().
schema : with 29 records occupying 3580 words of mem
opt_disc. Directory "/opt/ejabber/var/lib/ejabberd/Mnesia.ejabberd@second.example.com" is NOT used.
use fallback at restart = false
running db nodes = ['ejabberd@first.example.com','ejabberd@second.example.com']
stopped db nodes = []
master node tables = []
remote = [acl,caps_features,captcha,config,iq_response,
last_activity,local_config,mod_register_ip,motd,
motd_users,muc_online_room,muc_registered,muc_room,
offline_msg,passwd,privacy,private_storage,
reg_users_counter,roster,roster_version,route,s2s,
session,session_counter,sr_group,sr_user,vcard,
vcard_search]
ram_copies = [schema]
disc_copies = []
disc_only_copies = []
[] = [local_config,caps_features,mod_register_ip]
[{'ejabberd@second.example.com',ram_copies},
{'ejabberd@first.example.com',disc_copies}] = [schema]
[{'ejabberd@first.example.com',disc_copies}] = [config,privacy,passwd,roster,
last_activity,sr_user,
roster_version,motd,acl,sr_group,
vcard_search,motd_users,muc_room,
muc_registered]
[{'ejabberd@first.example.com',disc_only_copies}] = [offline_msg,vcard,
private_storage]
[{'ejabberd@first.example.com',ram_copies}] = [reg_users_counter,route,s2s,
captcha,session_counter,session,
iq_response,muc_online_room]
3 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok

Копируем данные. Эти команды надо вводить в erlang shell, который будет открыт после запуска предыдущей команды:

(ejabberd@second.example.com)4> mnesia:change_table_copy_type(schema, node(), disc_copies).
(ejabberd@second.example.com)5> mnesia:add_table_copy(roster, node(), disc_copies).
(ejabberd@second.example.com)6> mnesia:add_table_copy(passwd, node(), disc_copies).
(ejabberd@second.example.com)7> mnesia:change_table_copy_type(acl, node(), disc_copies).
(ejabberd@second.example.com)8> mnesia:change_table_copy_type(config, node(), disc_copies).
(ejabberd@second.example.com)9> mnesia:add_table_copy(offline_msg, node(), disc_only_copies).
(ejabberd@second.example.com)10> mnesia:add_table_copy(vcard, node(), disc_only_copies).
(ejabberd@second.example.com)11> mnesia:add_table_copy(private_storage, node(), disc_only_copies).
(ejabberd@second.example.com)12> q().

Теперь надо перенести данные Mnesia в правильное место:

$ mv Mnesia* ejabberd@second.example.com

Запускаем вторую ноду:

$ ejabberdctl --node ejabberd@second.example.com start

Проверяем, что нода запустилась:

$ ejabberdctl --node ejabberd@second.example.com status

Бонус

Если вам надо заменить какую-то ноду с тем же именем, то перед подключением в кластер нужно удалить эту ноду. Делается это в erlang shell на первой ноде:

mnesia:del_table_copy(schema, 'ejabberd@second.example.com').