У чарговы раз падумалі з Аленай над пытаннем скрыпта для аўтаматызацыі абнаўлення сістэмы. У гэты раз пісалі на Ruby. Апроч гэтага для паведамлення карыстальніку што ідзе абнаўленне, а не проста сама сабою хуткасць інтэрнэта падае, выкарысталі dzen2. Гэта мацёрая штука для вываду паведамленняў у графічным асяроддзі з якіх-заўгодна скрыптоў ці каманадаў. Выглядае гэта як акенца, якое узнікае паверх іншых вокнаў і на якім выводзіцца тэкст, які ты задаеш. Апроч таго можна адпаведным чынам ствараць меню, мяняць колер тэксту і шрыфт тэксту, колер фону і, нават, выводзіць невялічкія лінейныя індыкатыра прагрэсу. Ніжэй малюнак, на якім паказана паведамленне аб памылцы на першым этапе абнаўлення.
Скрыпцік прызначаны для запуска з дапамогай Cron'у, альбо Anacron'у ад рута. Пасля запуску праводзіць абнаўленне ўстяляваных у сістэме пакетаў з запісам журналу працэсу у тэчку /var/log/Update/ і вывадам паведамленняў пра тое што ён усё яшчэ працуе у невялічкім чорным вакенцы ў верхнім правым куту экрана.
Для працы патрабуюцца Ruby і dzen2. Скрыпт разлічаны на выкарыстанне aptitude і apt-get, але змяніць тры каманды нецяжка, пасля чаго ён можа працаваць з іншымі мэнэджэрамі пакетаў. Такім чынам, вось ён скрыпт, як ёсць:
#!/usr/bin/ruby
#определяем текущую дату для формирования имени файла
time = Time.now
filename = time.strftime("%Y-%m-%d")
#Запускаем Дзэн і ствараем іменаваны канал да яго
begin
dzen = IO.popen("dzen2 -p 5 -ta c -x 25 -w 400\n","r+")
rescue
puts "Ошибка dzen2"
exit(137)
end
#Працэдура вываду выніку выканання бягучага этапа
def res_out(num, result, dzen)
error = "^fg(#ff0000)"
case num
when 1
error += "Ошибка обновления базы пакетов"
message = "База пакетов обновлена"
when 2
error += "Ошибка обновления"
message = "Успешно обновились"
when 3
error += "Ошибка удаления старых версий"
message = "Файлы старых версий удалены"
end
if result.include? "Result:0" then
dzen.puts message
else
dzen.puts error
exit(num)
end
end
#создаем новый файл для чтения\записи или если он существует - переходим в конец файла
logfile = File.new("#{filename}.log","a+")
#выполнить команду update && upgrade и записать результат выполения в файл
#Абнаўляем базу дадзеных аб пакетах
dzen.puts "Обновляем базу данных пакетов"
result_update = `aptitude update 2>&1\; echo Result:$?`
#Пішам вынік ў файл і выводзім паведамленне
logfile.print result_update
res_out(1, result_update, dzen)
#Пампуем абнаўленні і абнаўляемся
dzen.puts "Начинаем скачивание файлов и обновление"
result_upgrade = `aptitude upgrade -y 2>&1\; echo Result:$?`
#Пішам вынік ў файл і выводзім паведамленне
logfile.print result_upgrade
res_out(2, result_upgrade, dzen)
#Выдаляем старыя версіі файлаў устаноўкі пакетаў
dzen.puts "Удаляем старые файлы установки"
result_clean = `apt-get autoclean 2>&1\; echo Result:$?`
#Пішам вынік ў файл і выводзім паведамленне
logfile.print result_clean
res_out(3, result_clean, dzen)
logfile.close
dzen.close_write