Я хочу, чтобы мой сервер уведомлял меня об ожидающих обновлениях безопасности. Но я не хочу получать уведомления обо всех доступных обновлениях. Как я могу это сделать?
Чтобы ответить на свой вопрос: я написал небольшой сценарий ruby, который сканирует текстовый файл, который отображается при входе в систему и содержит информацию об обновлении безопасности: 5 обновлений - это обновления безопасности
Он даже может входить на другие машины через ssh и проверять эту машину на наличие обновлений безопасности. Однако требуется ключ ssh без кодовой фразы. Было бы неплохо максимально ограничить права этого пользователя.
Он написан максимально просто, поэтому даже без знания рубина должен быть понятен.
#!/usr/bin/env ruby
# (c) 2013, Johannes Barre, igel@igels.net
# License: MIT
update_file = '/var/lib/update-notifier/updates-available'
conf = {
mail_to: 'obama@whitehouse.gov',
servers: {
name: :localhost, # name -> Server name for the mail
other_server: 'updatecheck@other-server.com', # log in to other-server.com using user updatecheck
third_server: 'updatecheck@third-server.com'
}
}
def get_security_updates(str)
str[/([0-9]+) updates are security updates/, 1].to_i
end
out = {}
conf[:servers].each do |name, host|
if host == :localhost
out[name] = get_security_updates(File.read(update_file))
else
out[name] = get_security_updates(`ssh #{host} 'cat #{update_file}'`)
end
end
out.delete_if { |_, v| v == 0 }
unless out.empty?
IO.popen(%|mail #{conf[:mail_to]} -s "Security updates pending"|, 'r+') { |io| io.print out.map { |host, updates| "#{host} has #{updates} security updates pending" }.join("\n") + "\n" }
end
Настройте задание cron для выполнения один раз в день. Я запускаю этот сценарий уже несколько месяцев, и он работает нормально. Если Debian показывает такое же сообщение для входа в систему, это должно работать и для систем Debian.
Это не написано для Ruby 1.9. Я рекомендую выполнить обновление, так как для 1.8 больше нет обновлений безопасности, но он должен работать, если вы вернете синтаксис Hash к старому стилю (:key => 'value'
вместо того key: 'value'
)
Решение, аналогичное сценарию sh
#!/bin/sh
FLAG=/tmp/updates_available.flag
UPDATEFILE=/var/lib/update-notifier/updates-available
if [ ! -f ${FLAG} ]
then
touch ${FLAG}
fi
diff ${FLAG} ${UPDATEFILE} > /dev/null
if [ $? -eq 1 ]; then
COUNT=`grep -c "0 updates are security updates" ${UPDATEFILE}`
if [ ${COUNT} -eq 0 ]; then
sendmessage "`hostname`: `cat ${UPDATEFILE}`" # choose how to send message
fi
cp ${UPDATEFILE} ${FLAG}
fi