#!/usr/bin/perl -w

use File::Copy;

require "/etc/squid/redirector/dbl/dbl.conf";

# Write log function
 sub wlog
 {
  my ($sec, $min, $hour, $mday, $mon, $year) = localtime ;
  open (LOG,">>$logdir/update.log") or die "Can't open $logdir/update.log log: $!\n";
  printf LOG "%4d-%02d-%02d %2d:%02d:%02d %s\n", $year + 1900,$mon+1, $mday, $hour, $min, $sec,$_[0];
  close (LOG);
 }
 
 wlog("======= Start update ========");
 # Get local dbl version
 if (-e "$dir/VERSION")
   {
    open(VER,"<$dir/VERSION") or die "Can't open $dir/VERSION: $!\n";
    $version=<VER>;
    close (VER);
   }
 else 
   {$version="1";}

 # Download new file's
 wlog("Download new files (curent local version is $version)");
 $ret=system("$WGET -t 1 -o $logdir/wget.log \"http://rejik.ru/cgi-bin/download2.cgi?Login=$login\&Pass=$pass\&Version=$version\" -O $dir/new.tmp");

 if ($ret!=0)
 {
  wlog("Can't download. See $logdir/wget.log for error\n");
  exit;
 }

 #Check to html
 open (FD,"<$dir/new.tmp") or die "Can't open $dir/new.tmp: $!\n";
 $line=<FD>;
 if ($line =~/\<\!DOCTYPE HTML PUBLIC/)
 {
  wlog("Download html file. See $dir/new.html\n");
  close(FD);
  move("$dir/new.tmp","$dir/new.html");
  exit;
 }

 # Untar new file's
  wlog("Untar new files to $dir/NEW"); 
  system("rm -f $dir/NEW/*; rmdir $dir/NEW");
  system("mkdir $dir/NEW");
  $ret=system("tar xf $dir/new.tmp -C $dir/NEW >$logdir/tar.log 2>$logdir/tar.log");
  if ($ret!=0)
  {
   wlog("Can't untar. Command \"tar xzf $dir/new.tmp -C $dir/NEW >$logdir/tar.log 2>$logdir/tar.log\" return error. See $logdir/tar.log for error\n");
   exit;
  }

 # Get new file's list
 opendir(DIR,"$dir/NEW") or die "Can't opendir $dir/NEW: $!\n";
 while (defined($file=readdir(DIR)))
 {
  next if $file =~/^\.\.?$/;
  push (@files,$file);
 }
 
 # Check for one x.gz file
 if ($files[0]=~/^(\d+)\.gz/)
 {
  copy("$dir/NEW/$1.gz", "$dir/list.dbl");
  
  open(VER,">$dir/VERSION") or die "Can't open $dir/VERSION: $!\n";
  print VER "$1";
  close (VER);

  unlink("$dir/new.tmp","$logdir/tar.log","$logdir/wget.log");
  wlog("Copy new file to $dir/list.dbl\n");
  exit;
 }

 # Check for NONE file
 if ($files[0] eq "NONE")
 {
  unlink("$dir/new.tmp","$logdir/tar.log","$logdir/wget.log");
  wlog("New data not found. You have last version.\n");
  exit;
 }

 # Check for SCORE file
 if ($files[0] eq "SCORE")
 {
  unlink("$dir/new.tmp","$logdir/tar.log","$logdir/wget.log");
  wlog("You dont have score to download dbl list.\n");
  exit;
 }

 ## Unpack list.dbl to list.tmp
 wlog("Unpack list.dbl to list.tmp");
 $ret=system("cat $dir/list.dbl | gzip -d >$dir/list.tmp");
  if ($ret!=0)
  {
   wlog("Can\'t ungzip. Command \"cat $dir/list.dbl | gzip -d >$dir/list.tmp\" return error.\n");
   exit;
  }

 $continue_flag=1;
 while ($continue_flag)
 {
  $continue_flag=0;  
  foreach $file (@files)
  {
   if ($file =~/${version}_(\d+)\.gz/)
   {
   #ungzip patch
   wlog("ungzip $dir/NEW/${version}_$1\.gz to $dir/NEW/${version}_$1");
   $ret=system("cat $dir/NEW/${version}_$1\.gz | gzip -d >$dir/NEW/${version}_$1");
    if ($ret!=0)
     {
      wlog("Can't ungzip. Command \"cat $dir/NEW/${version}_$1\.gz | gzip -d >$dir/NEW/${version}_$1\" return error.\n");
      exit;
     }

    wlog("patch $dir/list.tmp by ${version}_$1");
    $ret=system("patch -s $dir/list.tmp -i $dir/NEW/${version}_$1");
    if ($ret!=0)
     {
      wlog("Can't patch. Command \"patch -s $dir/list.tmp -i $dir/NEW/${version}_$1\" return error.\n");
      exit;
     }

    $version=$1;
    $continue_flag=1;
   }
  }
 }

 ## Pack list.dbl to list.tmp
 wlog("Pack list.tmp to list.dbl\n");
 $ret=system("cat $dir/list.tmp | gzip -c >$dir/list.dbl");
  if ($ret!=0)
  {
   wlog("Can\'t ungzip. Command \"cat $dir/list.tmp | gzip -c >$dir/list.dbl\" return error.\n");
   exit;
  }
  
  # Set new verion
  open(VER,">$dir/VERSION") or die "Can't open $dir/VERSION: $!\n";
  print VER $version;
  close (VER);


 # Delete temp files
 unlink("$dir/new.tmp","$logdir/tar.log","$logdir/wget.log","$dir/list.tmp");

