0

Обновление портов в FreeBSD

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

Для обновления FreeBSD я использую portsnap, который начиная с FreeBSD 6.0 входит в стандартный набор программ.

Как обычно сначала:
# man portsnap
Итак, первым делом получаю сжатое дерево портов. Кстати, эта же комманда обновляет существующий слепок портов:
# portsnap fetch
Затем распакую полученное дерево портов. Эта комманда перепишет все изменения в развернутом слепке портов, соответственно, в следующий раз эту комманду выполнять нет необходимости. Однако, следует учесть, что при внесении изменений в код какого либо порта, эти изменения будут потерты.
# portsnap extract
Теперь обновляю существующее дерево портов:
# portsnap update
Чтобы не выполнять процедуру обновления дерева портов в ручную, отдам эту задачу cron:
# crontab -e
00 23 * * * /usr/sbin/portsnap cron

Где ключ cron говорит о том, что выполнение команды portsnap fetch
произойдет в через случайный промежуток времени от 1 до 3600 секунд, таким образом авторы предполагают избавить сервера сервиса от пиковых нагрузок.

В руководстве portsnap прочитал, что выполнять
# portsnap update
по расписанию не рекомендуется, так как может возникнуть неприятная ситуация.
Например, я буду устанавливать или обновлять порт в то время, как будет запущена «portsnap update». Конечно, такое может произойти, однако я установлю выполнение, к примеру в 5 утра. С очень малой вероятностью мне придет в голову мысль производить какие-либо ручные манипуляции с портами в это время. =)

# crontab -e
00 05 * * * /usr/sbin/portsnap update

Для полного феншуя вместо простого выполнения portsnap update в cron нужен скрипт, который по завершении обновления будет выполнять проверку требующих обновления портов и отправлять эту информацию мне на почту.

Например, в самом простом случае можно использовать что-то типа такого скрипта:

#!/bin/sh
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# portsnap update
/usr/sbin/portsnap update
# settings
HEADER="New updates available on `uname -n`"
TMPFILE="/tmp/portupgrade.tpl"
PORTUPGRADERESULT=`pkg_version -v | grep "needs" | awk -F\< '{print $1 $2}'`
if [ "$PORTUPGRADERESULT" != "" ];then
	echo "To: " > $TMPFILE
	echo "From: " >> $TMPFILE
	echo "Subject: $HEADER" >> $TMPFILE
	echo "Content-Type: text/plain; charset=utf-8" >> $TMPFILE
	echo "\n" >> $TMPFILE
	echo "Need Updates:" >> $TMPFILE
	echo " " >> $TMPFILE
	echo "$PORTUPGRADERESULT" >> $TMPFILE
    /bin/cat "$TMPFILE" | /usr/sbin/sendmail 
fi

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.