#!/bin/bash
UPGRADEVERSION="1.4.7"
PREVIOUSVERSION="1.4.6"
echo "This is the $UPGRADEVERSION update patch for IPCop $PREVIOUSVERSION installing."
CURRENTVERSION=`perl -e "require '/var/ipcop/general-functions.pl';print \\$General::version;"`
if [ "$CURRENTVERSION" != "$PREVIOUSVERSION" ]; then
echo "You are not running IPCop v$PREVIOUSVERSION for this patch to install."
echo "Aborting installation."
exit -1
fi
KVER=`uname -r`
#we could have supported removing the 'not running' kernel but it will be much harder with each new kernel
#so be simple and update only from the last one
if [ "$KVER" = "2.4.27" -o "$KVER" = "2.4.27-smp" ]; then
echo "Kernel-2.4.29 is required to install this update"
echo "Old kernel 2.4.27 need to be removed to make place for kernel 2.4.31"
exit 1
fi
#cleanup /boot/grub of unused files (necessary for flash with only 5Mb on /boot)
rm -f /boot/grub/{fat,ffs,iso9660,jfs,vstafs,minix,reiserfs,ufs2,xfs}_stage1_5 \
/boot/grub/stage2_eltorito \
/boot/grub/{scsigrub.conf,grubbatch}
#suppress the kernel not in use to make place for a new kernel
rm -rf /lib/modules/2.4.27{,-smp} \
/boot/vmlinuz-2.4.27{,-smp} \
/boot/System.map-2.4.27{,-smp} \
/boot/ipcoprd-2.4.27.img \
/boot/ipcoprd-smp-2.4.27.img
#save active crontab
mv /var/spool/cron/root.orig /tmp/root.orig
# install udpated files
/bin/tar -zxpf patch.tar.gz -C /
# general-functions might not be overwrited by patch
/bin/sed -i -e "s+= '1.4.*$+= '$UPGRADEVERSION';+" /var/ipcop/general-functions.pl
# unneeded,updated, unified (old eci driver)
/bin/rm -f /lib{libbz2.so.1.0.2,libz.so.1.2.2,libproc.so.3.2.1} /usr/bin/eciadsl-{firmware,synch,pppoeci}
# update linker cache
/sbin/ldconfig
# Adjust limits in traffic RRDs to support 100Mbit uplinks
for i in /var/log/rrd/{RED,GREEN,ORANGE,BLUE}.rrd; do
if [ -e $i ]; then
/usr/bin/perl -e "use RRDs;RRDs::tune('$i','--maximum','incoming:12500000');"
/usr/bin/perl -e "use RRDs;RRDs::tune('$i','--maximum','outgoing:12500000');"
fi
done
# optionsfw (ping disable, logging limitation
mkdir -p /var/ipcop/optionsfw
chmod 550 /var/ipcop/optionsfw
touch /var/ipcop/optionsfw/settings
chown nobody:nobody /var/ipcop/optionsfw
chown nobody:nobody /var/ipcop/optionsfw/settings
chmod 644 /var/ipcop/optionsfw/settings
#Add a directory for language files installed by addons
mkdir -p /var/ipcop/addon-lang
chmod 550 /var/ipcop/addon-lang
chown nobody:nobody /var/ipcop/addon-lang
# Strip colon from end of 'section' string in all language files.
for file in /var/ipcop/langs/*.pl
do
sed -i -e '/section/s/://' $file
done
# Start of patch update to header.pl
#
# Use patch -N switch to apply patches only once
#
# First, upgrade to match v1.4.6 iso, if required
patch -N /var/ipcop/header.pl <<\END
105c105,107
< [ $Lang::tr{'blue access'} , '/cgi-bin/wireless.cgi', "IPCop $Lang::tr{'blue access'}" ]]
---
> [ $Lang::tr{'blue access'} , '/cgi-bin/wireless.cgi', "IPCop $Lang::tr{'blue access'}" ]
> # ,[ $Lang::tr{'options fw'} , '/cgi-bin/optionsfw.cgi', "IPCop $Lang::tr{'options fw'}" ]
> ]
END
# Uncomment firewall options menu item
patch -N /var/ipcop/header.pl <<\END
106c106
< # ,[ $Lang::tr{'options fw'} , '/cgi-bin/optionsfw.cgi', "IPCop $Lang::tr{'options fw'}" ]
---
> ,[ $Lang::tr{'options fw'} , '/cgi-bin/optionsfw.cgi', "IPCop $Lang::tr{'options fw'}" ]
END
# Apply 'ends never' patch to PrintActualLeases subroutine
patch -N /var/ipcop/header.pl <<\END
752,754c752,754
< }
<
< if ($line =~ /^\s*ends/) {
---
> } elsif ($line =~ /^\s*ends never;/) {
> $endtime = 'never';
> } elsif ($line =~ /^\s*ends/) {
757,759c757
< }
<
< if ($line =~ /^\s*hardware ethernet/) {
---
> } elsif ($line =~ /^\s*hardware ethernet/) {
762,766c760,762
< }
<
< if ($line =~ /^\s*client-hostname/) {
< shift (@temp);
< $hostname = join (' ',@temp);
---
> } elsif ($line =~ /^\s*client-hostname/) {
> shift (@temp);
> $hostname = join (' ',@temp);
769,771c765
< }
<
< if ($line eq "}") {
---
> } elsif ($line eq "}") {
776c770
< }
---
> } #unknown format line...
803,808c797,798
< my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst);
< ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst) = localtime ($entries{$key}->{ENDTIME});
< my $enddate = sprintf ("%02d/%02d/%d %02d:%02d:%02d",$mday,$mon+1,$year+1900,$hour,$min,$sec);
<
< if ($entries{$key}->{ENDTIME} < time() ){
< print "$enddate";
---
> if ($entries{$key}->{ENDTIME} eq 'never') {
> print "$Lang::tr{'no time limit'}";
810c800,808
< print "$enddate";
---
> my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst);
> ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst) = localtime ($entries{$key}->{ENDTIME});
> my $enddate = sprintf ("%02d/%02d/%d %02d:%02d:%02d",$mday,$mon+1,$year+1900,$hour,$min,$sec);
>
> if ($entries{$key}->{ENDTIME} < time() ){
> print "$enddate";
> } else {
> print "$enddate";
> }
END
# Clean up any rejects
rm -f /var/ipcop/header.pl.rej
# End of update to header.pl
# removing optionsfw.cgi from the menu because it is not ready
/bin/sed -i -e 'optionsfw.cgi/ ,[ /# ,[ /' /var/ipcop/header.pl
#
# new crontab (supporting minimize ddns updates)
#
sum=`md5sum /tmp/root.orig | awk '{print $1}' `
# if version 1.9.2.1 or 1.9.2.2 is untouched, just replace it else add the new entry only
if [ "$sum" == "918ec891f5436c0e34ce4ba213a9fbe1" ] ||
[ "$sum" == "b18e7567915e576655815fb409145f1a" ] ; then
echo "Upgrade original crontab"
#file come from the update
else
cat<>/var/spool/cron/root.orig
# ipcop update 1.4.7 addition to not original crontab
# force update (even if name match IP) once a month if minimize option selected
3 2 1 * * [ -f "/var/ipcop/red/active" ] && /usr/local/bin/setddns.pl -f -m
END
fi
/usr/bin/fcrontab -z
/bin/rm -f /tmp/root.orig
#change in service name to conform to real name
sed -i -e 's/freedns-afraid/freedns.afraid/' /var/ipcop/ddns/config
chown nobody:nobody /var/ipcop/ddns/config
#build cachelang file use this call after all "lang/*.pl" updates !
perl -e "require '/var/ipcop/lang.pl'; &Lang::BuildCacheLang"
cd /bin
ln -s gzip zcat #logwatch.pl may use it
ln -s bzip2 bzcat
#fix init update : no more / is busy during shutdown
/sbin/telinit u
# adjust vpn config for new options DPD_ACTION & PFS
# if config is 'host' set dpd_action=clear else set hold. Add always yes for PFS
cp /var/ipcop/vpn/config /var/ipcop/vpn/config.old
perl -e "while (<>) { chomp; \$V=(/,host,/?'clear':'hold'); print \"\$_,\$V,yes\n\"; }" /var/ipcop/vpn/config.old > /var/ipcop/vpn/config
chown nobody:nobody /var/ipcop/vpn/config
echo "IPCop v$UPGRADEVERSION - The Bad Packets Stop Here">/etc/issue
killall mingetty #redisplay correct version
echo "end of $UPGRADEVERSION update"
exit 0