#!/usr/bin/perl # # IPCop CGIs # # This code is distributed under the terms of the GPL # # (c) 2006 marco.s # use strict; # enable only the following on debugging purpose #use warnings; #use CGI::Carp 'fatalsToBrowser'; use IO::Socket; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; my %color = (); my %checked=(); my %selected=(); my %netsettings=(); my %mainsettings=(); my %proxysettings=(); my %xlratorsettings=(); my $id=0; my $updatefile=''; my $shortname=''; my $vendor=''; my $time=''; my $filesize=0; my $filedate=''; my $lastaccess=''; my $lastcheck=''; my $repository = "/srv/web/ipfire/html/updatecache"; my $hintcolour = '#FFFFCC'; my $sfNoSource='0'; my $sfOk='1'; my $sfOutdated='2'; my $not_accessed_last=''; my $errormessage=''; my @repositorylist=(); my @repositoryfiles=(); my @metadata=(); my $chk_cron_dly = "${General::swroot}/updatexlrator/autocheck/cron.daily"; my $chk_cron_wly = "${General::swroot}/updatexlrator/autocheck/cron.weekly"; my $chk_cron_mly = "${General::swroot}/updatexlrator/autocheck/cron.monthly"; &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); $xlratorsettings{'ACTION'} = ''; $xlratorsettings{'ENABLE_LOG'} = 'off'; $xlratorsettings{'CHILDREN'} = '5'; $xlratorsettings{'PASSIVE_MODE'} = 'off'; $xlratorsettings{'MAX_DISK_USAGE'} = '75'; $xlratorsettings{'LOW_DOWNLOAD_PRIORITY'} = 'off'; $xlratorsettings{'ENABLE_AUTOCHECK'} = 'off'; $xlratorsettings{'FULL_AUTOSYNC'} = 'off'; $xlratorsettings{'NOT_ACCESSED_LAST'} = 'month1'; &Header::getcgihash(\%xlratorsettings); if ($xlratorsettings{'ACTION'} eq $Lang::tr{'updxlrtr purge'}) { if (($xlratorsettings{'REMOVE_OBSOLETE'} eq 'on') || ($xlratorsettings{'REMOVE_NOSOURCE'} eq 'on') || ($xlratorsettings{'REMOVE_OUTDATED'} eq 'on')) { @repositorylist = <$repository/*>; foreach (@repositorylist) { if (!-d $_) { $updatefile = substr($_,rindex($_,"/")+1); if (-e "$repository/metadata/$updatefile") { open (FILE,"$repository/metadata/$updatefile"); @metadata = ; close FILE; chomp(@metadata); if (($xlratorsettings{'REMOVE_NOSOURCE'} eq 'on') && ($metadata[2] == $sfNoSource)) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } if (($xlratorsettings{'REMOVE_OUTDATED'} eq 'on') && ($metadata[2] == $sfOutdated)) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } if ($xlratorsettings{'REMOVE_OBSOLETE'} eq 'on') { if (($xlratorsettings{'NOT_ACCESSED_LAST'} eq 'week') && ($metadata[-1] < (time - 604800))) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } if (($xlratorsettings{'NOT_ACCESSED_LAST'} eq 'month1') && ($metadata[-1] < (time - 2505600))) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } if (($xlratorsettings{'NOT_ACCESSED_LAST'} eq 'month3') && ($metadata[-1] < (time - 7516800))) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } if (($xlratorsettings{'NOT_ACCESSED_LAST'} eq 'month6') && ($metadata[-1] < (time - 15033600))) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } if (($xlratorsettings{'NOT_ACCESSED_LAST'} eq 'year') && ($metadata[-1] < (time - 31536000))) { unlink("$repository/$updatefile"); unlink("$repository/metadata/$updatefile"); } } } } } } } if ($xlratorsettings{'ACTION'} eq $Lang::tr{'save'}) { if (!($xlratorsettings{'CHILDREN'} =~ /^\d+$/) || ($xlratorsettings{'CHILDREN'} < 1)) { $errormessage = $Lang::tr{'updxlrtr invalid num of children'}; goto ERROR; } if (!($xlratorsettings{'MAX_DISK_USAGE'} =~ /^\d+$/) || ($xlratorsettings{'MAX_DISK_USAGE'} < 1) || ($xlratorsettings{'MAX_DISK_USAGE'} > 100)) { $errormessage = $Lang::tr{'updxlrtr invalid disk usage'}; goto ERROR; } &savesettings; } if ($xlratorsettings{'ACTION'} eq $Lang::tr{'updxlrtr save and restart'}) { if (!($xlratorsettings{'CHILDREN'} =~ /^\d+$/) || ($xlratorsettings{'CHILDREN'} < 1)) { $errormessage = $Lang::tr{'updxlrtr invalid num of children'}; goto ERROR; } if (!($xlratorsettings{'MAX_DISK_USAGE'} =~ /^\d+$/) || ($xlratorsettings{'MAX_DISK_USAGE'} < 1) || ($xlratorsettings{'MAX_DISK_USAGE'} > 100)) { $errormessage = $Lang::tr{'updxlrtr invalid disk usage'}; goto ERROR; } if (!(-e "${General::swroot}/proxy/enable")) { $errormessage = $Lang::tr{'updxlrtr web proxy service required'}; goto ERROR; } if (!($proxysettings{'ENABLE_UPDXLRATOR'} eq 'on')) { $errormessage = $Lang::tr{'updxlrtr not enabled'}; goto ERROR; } &savesettings; system('/usr/local/bin/squidctrl restart >/dev/null 2>&1'); } if ($xlratorsettings{'ACTION'} eq $Lang::tr{'updxlrtr remove file'}) { $updatefile = $xlratorsettings{'ID'}; if (-e "$repository/$updatefile") { unlink("$repository/$updatefile"); } $updatefile =~ s/^download\///i; if (-e "$repository/metadata/$updatefile") { unlink("$repository/metadata/$updatefile"); } } ERROR: $not_accessed_last = $xlratorsettings{'NOT_ACCESSED_LAST'}; undef($xlratorsettings{'NOT_ACCESSED_LAST'}); if (-e "${General::swroot}/updatexlrator/settings") { &General::readhash("${General::swroot}/updatexlrator/settings", \%xlratorsettings); } if ($xlratorsettings{'NOT_ACCESSED_LAST'} eq '') { $xlratorsettings{'NOT_ACCESSED_LAST'} = $not_accessed_last; } ; $checked{'ENABLE_LOG'}{'off'} = ''; $checked{'ENABLE_LOG'}{'on'} = ''; $checked{'ENABLE_LOG'}{$xlratorsettings{'ENABLE_LOG'}} = "checked='checked'"; $checked{'PASSIVE_MODE'}{'off'} = ''; $checked{'PASSIVE_MODE'}{'on'} = ''; $checked{'PASSIVE_MODE'}{$xlratorsettings{'PASSIVE_MODE'}} = "checked='checked'"; $checked{'LOW_DOWNLOAD_PRIORITY'}{'off'} = ''; $checked{'LOW_DOWNLOAD_PRIORITY'}{'on'} = ''; $checked{'LOW_DOWNLOAD_PRIORITY'}{$xlratorsettings{'LOW_DOWNLOAD_PRIORITY'}} = "checked='checked'"; $checked{'ENABLE_AUTOCHECK'}{'off'} = ''; $checked{'ENABLE_AUTOCHECK'}{'on'} = ''; $checked{'ENABLE_AUTOCHECK'}{$xlratorsettings{'ENABLE_AUTOCHECK'}} = "checked='checked'"; $checked{'FULL_AUTOSYNC'}{'off'} = ''; $checked{'FULL_AUTOSYNC'}{'on'} = ''; $checked{'FULL_AUTOSYNC'}{$xlratorsettings{'FULL_AUTOSYNC'}} = "checked='checked'"; $selected{'AUTOCHECK_SCHEDULE'}{$xlratorsettings{'AUTOCHECK_SCHEDULE'}} = "selected='selected'"; $selected{'NOT_ACCESSED_LAST'}{$xlratorsettings{'NOT_ACCESSED_LAST'}} = "selected='selected'"; # ---------------------------------------------------- # Settings dialog # ---------------------------------------------------- &Header::showhttpheaders(); &Header::openpage($Lang::tr{'updxlrtr configuration'}, 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage \n"; &Header::closebox(); } print "
\n"; &Header::openbox('100%', 'left', "$Lang::tr{'updxlrtr update accelerator'}"); print < $Lang::tr{'updxlrtr common settings'} $Lang::tr{'updxlrtr enable log'}: $Lang::tr{'updxlrtr children'}: $Lang::tr{'updxlrtr passive mode'}: $Lang::tr{'updxlrtr max disk usage'}: % $Lang::tr{'updxlrtr low download priority'}:    
$Lang::tr{'updxlrtr source checkup'}
$Lang::tr{'updxlrtr enable autocheck'}: $Lang::tr{'updxlrtr source checkup schedule'}:
$Lang::tr{'updxlrtr full autosync'}:    

$Lang::tr{'updxlrtr maintenance'}
 $Lang::tr{'updxlrtr all files'}  $Lang::tr{'updxlrtr not accessed'}
 $Lang::tr{'updxlrtr marked as'} $Lang::tr{ [$Lang::tr{'updxlrtr condition nosource'}]  $Lang::tr{'updxlrtr marked as'} $Lang::tr{ [$Lang::tr{'updxlrtr condition outdated'}]

   
 
END ; &Header::closebox(); print "\n"; # ---------------------------------------------------- # File list dialog # ---------------------------------------------------- &Header::openbox('100%', 'left', "$Lang::tr{'updxlrtr current files'}:"); @repositorylist = <$repository/download/*>; undef @repositoryfiles; foreach (@repositorylist) { if (!-d) { $updatefile = substr($_,rindex($_,"/")+1); $updatefile = "download/$updatefile"; push(@repositoryfiles,$updatefile); } } @repositorylist = <$repository/*>; foreach (@repositorylist) { if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } } if (@repositoryfiles) { print <     $Lang::tr{'updxlrtr filename'} $Lang::tr{'updxlrtr filesize'} $Lang::tr{'date'} $Lang::tr{ $Lang::tr{   END ; $id = 0; foreach $updatefile (@repositoryfiles) { $id++; if ($id % 2) { print "\n"; } else { print "\n"; } $filesize = (-s "$repository/$updatefile"); 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/; my ($SECdt,$MINdt,$HOURdt,$DAYdt,$MONTHdt,$YEARdt) = localtime(&getmtime("$repository/$updatefile")); $DAYdt = sprintf ("%.02d",$DAYdt); $MONTHdt = sprintf ("%.02d",$MONTHdt+1); $YEARdt = sprintf ("%.04d",$YEARdt+1900); $filedate = $YEARdt."-".$MONTHdt."-".$DAYdt; $lastaccess = "n/a"; $lastcheck = "n/a"; undef @metadata; $shortname = $updatefile; $shortname =~ s/^download\///i; if (-e "$repository/metadata/$shortname") { open (FILE,"$repository/metadata/$shortname"); @metadata = ; close(FILE); chomp @metadata; ($SECdt,$MINdt,$HOURdt,$DAYdt,$MONTHdt,$YEARdt) = localtime($metadata[-1]); $DAYdt = sprintf ("%.02d",$DAYdt); $MONTHdt = sprintf ("%.02d",$MONTHdt+1); $YEARdt = sprintf ("%.04d",$YEARdt+1900); if (($metadata[-1] =~ /^\d+/) && ($metadata[-1] >= 1)) { $lastaccess = $YEARdt."-".$MONTHdt."-".$DAYdt; } ($SECdt,$MINdt,$HOURdt,$DAYdt,$MONTHdt,$YEARdt) = localtime($metadata[3]); $DAYdt = sprintf ("%.02d",$DAYdt); $MONTHdt = sprintf ("%.02d",$MONTHdt+1); $YEARdt = sprintf ("%.04d",$YEARdt+1900); if (($metadata[3] =~ /^\d+/) && ($metadata[3] >= 1)) { $lastcheck = $YEARdt."-".$MONTHdt."-".$DAYdt; } } print "\t\t "; if ($metadata[2] eq $sfNoSource) { print "$Lang::tr{ \n"; } if ($metadata[2] eq $sfOk) { print "$Lang::tr{ \n"; } if (($metadata[2] eq $sfOutdated) && (!($updatefile =~ /^download\//i))) { print "$Lang::tr{ \n"; } if (($metadata[2] eq $sfOutdated) && ($updatefile =~ /^download\//i)) { print "$Lang::tr{ \n"; } if ($metadata[2] eq '') { print "$Lang::tr{ \n"; } print "\t\t "; if ($metadata[1] eq 'Adobe') { print "Adobe \n"; } elsif ($metadata[1] eq 'Microsoft') { print "Microsoft \n"; } elsif ($metadata[1] eq 'Symantec') { print "Symantec \n"; } elsif ($metadata[1] eq 'Avira') { print "Avira \n"; } elsif ($metadata[1] eq 'Avast') { print "Avast \n"; } elsif ($metadata[1] eq 'IPFire') { print "IPFire \n"; } elsif ($metadata[1] eq 'Appel') { print "Apple \n"; } elsif ($metadata[1] eq 'Linux') { print "Linux \n"; } else { print "$Lang::tr{ \n"; } $shortname = $updatefile; $shortname =~ s/(.*)_[\da-f]*(\.(exe|cab|psf)$)/\1_*\2/i; $shortname =~ s/^download\///i; print <$shortname  $filesize   $filedate   $lastaccess   $lastcheck 
END ; } print <
  $Lang::tr{'legend'}:   $Lang::tr{ $Lang::tr{'updxlrtr last access'}   $Lang::tr{ $Lang::tr{'updxlrtr last checkup'}   $Lang::tr{ $Lang::tr{'updxlrtr remove file'}      
  $Lang::tr{'status'}:   $Lang::tr{ $Lang::tr{'updxlrtr condition ok'}   $Lang::tr{ $Lang::tr{'updxlrtr condition nosource'}   $Lang::tr{ $Lang::tr{'updxlrtr condition outdated'}   $Lang::tr{ $Lang::tr{'updxlrtr condition download'}
  $Lang::tr{'updxlrtr source'}:   Adobe Adobe   Microsoft Microsoft   Symantec Symantec   Avira Avira   Apple Apple  
  IPFire IPFire   Linux Linux   Avast Avast   $Lang::tr{ $Lang::tr{'updxlrtr unknown'}    
END ; } else { print "$Lang::tr{'updxlrtr empty repository'}\n"; } print <
$Lang::tr{'updxlrtr disk usage'}:
END ; open(DF,"/bin/df -h $repository|"); while() { if ($_ =~ m/^Filesystem/ ) { print < END ; } else { my ($device,$size,$used,$free,$percent,$mount) = split; print < END ; } } close DF; print "
$Lang::tr{'updxlrtr cache dir'} $Lang::tr{'size'} $Lang::tr{'used'} $Lang::tr{'free'} $Lang::tr{'percentage'}
[$repository] $size $used $free END ; &percentbar($percent); print < $percent
\n"; &Header::closebox(); &Header::closebigbox(); &Header::closepage(); # ------------------------------------------------------------------- sub savesettings { if (-e $chk_cron_dly) { unlink($chk_cron_dly); } if (-e $chk_cron_wly) { unlink($chk_cron_wly); } if (-e $chk_cron_mly) { unlink($chk_cron_mly); } if (($xlratorsettings{'ENABLE_AUTOCHECK'} eq 'on') && ($xlratorsettings{'AUTOCHECK_SCHEDULE'} eq 'daily')) { symlink("../bin/checkup",$chk_cron_dly) } else { symlink("/bin/false",$chk_cron_dly) } if (($xlratorsettings{'ENABLE_AUTOCHECK'} eq 'on') && ($xlratorsettings{'AUTOCHECK_SCHEDULE'} eq 'weekly')) { symlink("../bin/checkup",$chk_cron_wly) } else { symlink("/bin/false",$chk_cron_wly) } if (($xlratorsettings{'ENABLE_AUTOCHECK'} eq 'on') && ($xlratorsettings{'AUTOCHECK_SCHEDULE'} eq 'monthly')) { symlink("../bin/checkup",$chk_cron_mly) } else { symlink("/bin/false",$chk_cron_mly) } delete($xlratorsettings{'REMOVE_OBSOLETE'}); delete($xlratorsettings{'REMOVE_NOSOURCE'}); delete($xlratorsettings{'REMOVE_OUTDATED'}); &General::writehash("${General::swroot}/updatexlrator/settings", \%xlratorsettings); } # ------------------------------------------------------------------- sub percentbar { my $percent = $_[0]; my $fg = '#a0a0a0'; my $bg = '#e2e2e2'; if ($percent =~ m/^(\d+)%$/ ) { print < END ; if ($percent eq "100%") { print "" } elsif ($percent eq "0%") { print "" } else { print "" } print < END ; } } # ------------------------------------------------------------------- sub getmtime { my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($_[0]); return $mtime; } # -------------------------------------------------------------------