#!/usr/bin/perl -w use Net::FTP; # # Script to update freedb cd-database automatically. # # Finds actual date of local db by searching for database-source-files in # database directory, so if you deleted them, you'll have to create a file # (may be empty) with the filename of the last added db-file, like # freedb-complete-20021023.tar.bz2 or freedb-update-20020917-20021023.tar.bz2 # I didn't find any other possibility to find out the version of the locally # installed db. If you have got any idea, please tell me. # # You should change the ftp-server settings to a local mirror of yours and # check the settings for your database and the external programs. # # Version 0.70 by Spida (on www.perlmonks.org) # # ToDo: # - Error handling: server unreachable, wrong user/pass, no write access, # hd full, ... # - Stability in case of killed script. Add ./.freedb_update_status file # - resume downloads # my $freedb_ftp_mirror = "ftp.freedb.org"; my $freedb_ftp_user = "anonymous"; my $freedb_ftp_password = '-anonymous@'; my $remote_dir = "/ftp.freedb.org/pub/freedb/"; my $database_dir = '/data/raid/cddb'; my $database_user = 'cddb'; my $database_group = 'root'; my $command_database_stop = "/etc/init.d/cddbd stop"; my $command_database_start = "/etc/init.d/cddbd start"; my $command_database_reindex = "/usr/local/bin/cddbd/cddbd -fdv"; my $command_tar = "/bin/tar"; my $command_chown = "/bin/chown"; my $command_chmod = "/bin/chmod"; #connect to ftp print "Connecting to $freedb_ftp_mirror\n"; my $ftp=Net::FTP->new($freedb_ftp_mirror); print "Logging in\n"; $ftp->login($freedb_ftp_user, $freedb_ftp_password); $ftp->cwd($remote_dir); #get remote filellist @ftpfilelist = $ftp->ls(); @ftpfilelist = sort(@ftpfilelist); @ftpcompletefilelist = grep /freedb-complete-\d+.tar.bz2/, @ftpfilelist; @ftpupdatefilelist = grep /freedb-update-\d+-\d+.tar.bz2/, @ftpfilelist; if (@ftpcompletefilelist) { print "\n"; print "Server has complete files to use:\n"; foreach $file(@ftpcompletefilelist) { print "$file\n"; } @ftpcompletefilelist = reverse(@ftpcompletefilelist); $lastftpcompletefile = $ftpcompletefilelist[0]; } $laststartversionftpupdatefile=0; $lastendversionftpupdatefile=0; if (@ftpupdatefilelist) { print "\n"; print "Server has update files to use:\n"; foreach $file(@ftpupdatefilelist) { print "$file\n"; } @ftpupdatefilelist = reverse(@ftpupdatefilelist); } #get local filelist opendir(DIR, $database_dir); my @localfilelist = readdir(DIR); closedir(DIR); @localfilelist = sort(@localfilelist); @localcompletefilelist = grep /freedb-complete-\d+.tar.bz2/, @localfilelist; @localupdatefilelist = grep /freedb-update-\d+-\d+.tar.bz2/, @localfilelist; $lastversionlocalcompletefile=0; if (@localcompletefilelist) { print "\n"; print "Found local files which are supposed to be in database:\n"; foreach $file(@localcompletefilelist) { print "$file\n"; } @localcompletefilelist = reverse(@localcompletefilelist); $lastlocalcompletefile = $localcompletefilelist[0]; ($lastversionlocalcompletefile) = $lastlocalcompletefile =~ /freedb-complete-(\d+). tar.bz2/; } $laststartversionlocalupdatefile=0; $lastendversionlocalupdatefile=0; if (@localupdatefilelist) { print "\n"; print "Found local files which are supposed to be included in database:\n"; foreach $file(@localupdatefilelist) { print "$file\n"; } @localupdatefilelist = reverse(@localupdatefilelist); $lastlocalupdatefile = $localupdatefilelist[0]; ($laststartversionlocalupdatefile, $lastendversionlocalupdatefile) = $lastlocalupda tefile =~ /freedb-update-(\d+)-(\d+).tar.bz2/; } #find out which file to use print "\n"; if ($lastversionlocalcompletefile > $lastendversionlocalupdatefile) { print "Last local version seems to be a complete db from $lastversionlocalcompletef ile.\n"; $lastversionlocalfile=$lastversionlocalcompletefile; } else { if ($lastendversionlocalupdatefile != 0) { print "Last local version seems to be an update db from $lastendversionlocalupd atefile.\n"; $lastversionlocalfile=$lastendversionlocalupdatefile; } else { print "No local db found.\n"; $lastversionlocalfile=0; } } print "\n"; if ($lastversionlocalfile==0) { print "Starting fresh\n"; push(@dbfiles, $lastftpcompletefile); } else { print "Will get following files:\n"; foreach $file(@ftpupdatefilelist) { ($laststartversionftpupdatefile, $lastendversionftpupdatefile) = $file =~ /free db-update-(\d+)-(\d+).tar.bz2/; if ($lastversionlocalfile <= $laststartversionftpupdatefile) { push(@dbfiles, $file); print "$file\n"; } } } #download updates print "\n"; if (@dbfiles) { foreach $dbfile(@dbfiles) { print "downloading $dbfile\n"; $ftp->get("$dbfile", "$database_dir/$dbfile"); } } else { print "No need to update found.\n"; } $ftp->quit; #extract updates if (@dbfiles) { print "\n"; foreach $dbfile(@dbfiles) { print "extracting $dbfile\n"; system(`$command_tar xvjf $dbfile -C $database_dir`) } #regenerate index system(`$command_chown -R $database_user:$database_group $database_dir/*`); system(`$command_chmod -R 644 $database_dir/*`); system(`$command_chmod 755 * $database_dir/*`); #regenerate index system(`$command_database_stop`); system(`$command_database_reindex`); system(`$command_database_start`); } print "\n"; print "completed\n";