I want to have control over debian updates, but I don’t want to make them manually. So I decided to do it “half-automatic”. This means that they run automatically until user-input is needed. The whole prozess is recorded in logfiles and after the updates are done this script sends out emails.
This is the parser for the summary-email. it works for english ang german environments:
#!/usr/bin/perl
use strict;
if ( $#ARGV ne 0)
{
die "usage: $0 \n";
}
my $logfile = $ARGV[0];
my $upgrades = undef;
open(LOG,"< $logfile") or die "can't open logfile: $logfile";
while()
{
my $line = $_;
if($line =~ /The following packages will be upgraded/g)
{
$line = ;
while($line !~ /\d+ upgraded, \d+ newly installed, \d+ to remove and \d+ not upgraded/)
{
$upgrades = $upgrades . " " . $line;
$line = ;
}
}
if($line =~ /Die folgenden Pakete werden aktualisiert/g)
{
$line = ;
while($line !~ /\d+ aktualisiert, \d+ neu installiert, \d+ zu entfernen und \d+ nicht aktualisiert./)
{
$upgrades = $upgrades . " " . $line;
$line = ;
}
}
}
close(LOG);
$upgrades =~ s/^\s+//g;
$upgrades =~ s/\r+//g;
$upgrades =~ s/\n+//g;
if($upgrades =~ /^\s+$/g or $upgrades =~ /^$/g or $upgrades =~ /^\n$/g)
{
exit 0;
}
my @arr = split(/\s+/,$upgrades);
print "$upgrades \n";
exit $#arr + 1;
And this is our update-script:
#!/bin/bash
LOGDIR=/opt/update-logs
PARSER=/opt/bin/aptlogparser.pl
eval `ssh-agent -s`
ssh-add
export TERM="rxvt"
function update_customer
{
for host in $HOSTS
do
DAT=`date +%F-%R`
echo "KUNDE: $KUNDE"
script -c "ssh -l root $host \"export TERM=rxvt; export DEBIAN_FRONTEND=readline; echo $TERM; hostname; apt-get update; apt-get upgrade\""
test -e typescript && mv typescript $LOGDIR/$host-$DAT.log
UPDATES=`$PARSER $LOGDIR/$host-$DAT.log`
if [$? -ne 0]
then
echo "$host: $UPDATES" >> ${KUNDE}_EMAIL.txt
echo "" >> ${KUNDE}_EMAIL.txt
fi
done
DAT=`date +%F`
if [-e ${KUNDE}_EMAIL.txt]
then
cat ${KUNDE}_EMAIL.txt | mutt -s "Linux-Updates vom $DAT" -- $EMAIL
rm ${KUNDE}_EMAIL.txt
fi
}
HOSTS="websrv mailsrv"
EMAIL="bob@example.com"
KUNDE="customer1"
update_customer
HOSTS="linuxsrv1 linuxsrv2"
EMAIL="alice@example.com"
KUNDE="customer2"
update_customer