вторник, 10 сентября 2019 г.

Как выставлять hostname на основе mac адреса при загрузке Linux по PXE

У меня есть pxe сервер, который раздаёт Arch Linux по сети. Я его гружу на разных машинах и дальше захожу в них по ssh. Чтобы проще было различать хосты, мне захотелось, чтобы их хостнеймы задавались автоматически из их mac адреса.
Для этого я пересобрал archiso (инструкция), добавив следующие изменения:

Создаём файл archlive/airootfs/etc/systemd/scripts/bootif-hostname:
#!/bin/bash
# example of kernel parameter: BOOTIF=00-01-02-03-04-05-06
eval $(cat /proc/cmdline | grep -o '\bBOOTIF=[^ ]*')
new_hostname="arch-`echo "${BOOTIF: -8}" | tr -d '-'`"
hostnamectl set-hostname "$new_hostname"
и делаем его исполняемым: chmod +x archlive/airootfs/etc/systemd/scripts/bootif-hostname
Создаём файл archlive/airootfs/etc/systemd/system/bootif-hostname.service:
[Unit]
Description=Start with a hostname based on last three octets of mac address of nic, which was used for pxe booting
Wants=network-pre.target
Before=network-pre.target

[Service]
ExecStart=/etc/systemd/scripts/bootif-hostname
Type=oneshot

[Install]
WantedBy=multi-user.target

В archlive/airootfs/root/customize_airootfs.sh вносим:
...
systemctl enable ... sshd.service bootif-hostname.service

На pxe сервере используется pxelinux. Он автоматически добавляет параметрам ядра BOOTIF=00-01-02-03-04-05-06. Я правда не пойму, откуда берётся самый первый октет.

P.S. чтобы зайти на хосты по ssh, надо либо создать пароль для рута и разрешить руту логиниться по ssh, либо создать отдельного пользователя. Я не стал загромождать статью этими изменениями.

Вот и всё. Теперь, когда мы загружаем ArchLinux по сети, в качестве имени хоста мы видим вот такую строку: arch-040506, которая формируется из трёх последних октетов mac адреса сетевой карты, которая была использована при загрузке машины.

суббота, 7 сентября 2019 г.

sendEmail - отправка копии письма нескольким адресатам - workaround

Расскажу о небольшой проблеме при использовании sendemail (в Arch Linux - sendEmail).
Мне нужно было отправить письмо, кроме основного, ещё и нескольким другим адресатам. Для этого я использовал опцию -cc.
Почему-то man страницы sendemail в системе нет. Но зато есть обычный help. Он показывается если вызвать sendEmail без параметров. Так вот, там есть такое описание:
    -cc ADDRESS [ADDR ...]
Т.е. вроде бы как можно указывать адресатов через пробел. Но у меня так не получилось. Письмо уходило только первому из перечисленных адресов.
Я пробовал и заключать адреса в треугольные скобки, и прописывать их через запятую, и в кавычках - никак не работало: программа жаловалась что адреса некорректные.

В конце концов нашёл рабочее решение - можно использовать опцию -cc несколько раз. То есть например так:

$ sendEmail \
    -f "$NAME_SURNAME <username@domain.com>" \
    -u "$SUBJECT" \
    -t "$MAIN_RECIEVERS" -cc "$CC_RECIEVER1" -cc "$CC_RECIEVER2" \
    -s "$SERVER_AND_PORT" \
    -o tls=yes \
    -o message-charset=utf-8 \
    -xu "username@domain.com" \
    -xp "******" \
    -o message-content-type=html \

    -m "$MAILBODY"

Я нигде не нашёл инструкции что так можно делать. Просто случайно добился рабочего результата. Поэтому решил зафиксировать это в данной заметке - вдруг кому-то ещё пригодится.
Версия sendEmail - sendEmail-1.56 (тоже со страницы help).