Поддерживать систему в актуальном состоянии крайне необходимо. Поэтому вопрос обновления дерева портов необходимо автоматизировать.
Для обновления 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