From bcf8b1af8e8a49fd88a4152ac1a352c8e6fc362a Mon Sep 17 00:00:00 2001 From: Akkadius Date: Wed, 11 Mar 2015 21:01:43 -0500 Subject: [PATCH] [eqemu_update.pl] Add Option 7) Plugins - Download latest Perl plugins [eqemu_update.pl] Add Option 8) Quests - Download latest PEQ quests and stage updates [eqemu_update.pl] Set version 5 of script [skip ci] --- changelog.txt | 5 + common/database_conversions.cpp | 2 +- utils/scripts/eqemu_update.pl | 302 +++++++++++++++++++++++++++----- 3 files changed, 268 insertions(+), 41 deletions(-) diff --git a/changelog.txt b/changelog.txt index f3a7c7f9e..ad6b6f5d5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,10 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 03/11/2015 == +Akkadius: [eqemu_update.pl] Add Option 7) Plugins - Download latest Perl plugins +Akkadius: [eqemu_update.pl] Add Option 8) Quests - Download latest PEQ quests and stage updates +Akkadius: [eqemu_update.pl] Set version 5 of script + == 03/10/2015 == Akkadius: [eqemu_update.pl] Add Option 6) Download Latest map and water files diff --git a/common/database_conversions.cpp b/common/database_conversions.cpp index 443763961..bda4e7f9b 100644 --- a/common/database_conversions.cpp +++ b/common/database_conversions.cpp @@ -494,7 +494,7 @@ bool Database::CheckDatabaseConversions() { /* Check for a new version of this script, the arg passed would have to be higher than the copy they have downloaded locally and they will re fetch */ - system("perl eqemu_update.pl V 3"); + system("perl eqemu_update.pl V 5"); /* Run Automatic Database Upgrade Script */ system("perl eqemu_update.pl ran_from_world"); diff --git a/utils/scripts/eqemu_update.pl b/utils/scripts/eqemu_update.pl index 2c41306fb..73e1423eb 100644 --- a/utils/scripts/eqemu_update.pl +++ b/utils/scripts/eqemu_update.pl @@ -9,12 +9,22 @@ $menu_displayed = 0; use Config; +use File::Copy qw(copy); +use POSIX qw(strftime); +use File::Path; +use File::Find; +use URI::Escape; + +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); + +$time_stamp = strftime('%m-%d-%Y', gmtime()); + $console_output .= " Operating System is: $Config{osname}\n"; if($Config{osname}=~/linux/i){ $OS = "Linux"; } if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; } #::: If current version is less than what world is reporting, then download a new one... -$current_version = 2; +$current_version = 5; if($ARGV[0] eq "V"){ if($ARGV[1] > $current_version){ @@ -36,6 +46,8 @@ print "Perl Version is " . $perl_version . "\n"; if($perl_version > 5.12){ no warnings 'uninitialized'; } no warnings; +($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); + my $confile = "eqemu_config.xml"; #default open(F, "<$confile") or die "Unable to open config: $confile\n"; my $indb = 0; @@ -161,6 +173,8 @@ sub ShowMenuPrompt { 4 => \&AA_Fetch, 5 => \&OpCodes_Fetch, 6 => \&MapFiles_Fetch, + 7 => \&Plugins_Fetch, + 8 => \&QuestFiles_Fetch, 0 => \&Exit, ); @@ -203,20 +217,19 @@ sub MenuOptions { $option[3] = "Run pending REQUIRED updates... (" . scalar (@total_updates) . ")"; } else{ - $option[3] = "Check for pending REQUIRED Database updates - Stages updates for automatic upgrade..."; + $option[3] = "Check and stage pending REQUIRED Database updates"; } return <new; - $ua->timeout(10); - $ua->env_proxy; - my $response = $ua->get($URL); - - if ($response->is_success){ - open (FILE, '> ' . $Dest_File . ''); - print FILE $response->decoded_content; - close (FILE); - print " URL: " . $URL . "\n"; - print " Saved: " . $Dest_File . " \n"; + #::: For non-text type requests... + if($content_type == 1){ + use LWP::Simple qw(getstore); + if(!getstore($URL, $Dest_File)){ + print "Error, no connection or failed request...\n\n"; + } + else{ + print " o URL: (" . $URL . ")\n"; + print " o Saved: (" . $Dest_File . ") \n"; + } } - else { - print "Error, no connection to the internet...\n\n"; - die $response->status_line; + else{ + require LWP::UserAgent; + my $ua = LWP::UserAgent->new; + $ua->timeout(10); + $ua->env_proxy; + my $response = $ua->get($URL); + + if ($response->is_success){ + open (FILE, '> ' . $Dest_File . ''); + print FILE $response->decoded_content; + close (FILE); + print " o URL: (" . $URL . ")\n"; + print " o Saved: (" . $Dest_File . ") \n"; + } + else { + print "Error, no connection or failed request...\n\n"; + } } } if($OS eq "Linux"){ #::: wget -O db_update/db_update_manifest.txt https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt $wget = `wget --no-check-certificate --quiet -O $Dest_File $URL`; - print " URL: " . $URL . "\n"; - print " Saved: " . $Dest_File . " \n"; + print " o URL: (" . $URL . ")\n"; + print " o Saved: (" . $Dest_File . ") \n"; if($wget=~/unable to resolve/i){ - print "Error, no connection to the internet...\n\n"; - die; + print "Error, no connection or failed request...\n\n"; + #die; } } } @@ -343,32 +389,208 @@ sub OpCodes_Fetch{ print "\nDownloading (" . $opcodes{$loop}[0] . ") File: '" . $file_name . "'...\n\n"; GetRemoteFile($opcodes{$loop}[1], $file_name); - $loop++; + $loop++; } print "\nDone...\n\n"; } +sub CopyFile{ + $l_source_file = $_[0]; + $l_dest_file = $_[1]; + if($l_dest_file=~/\//i){ + my @dir_path = split('/', $l_dest_file); + $build_path = ""; + $di = 0; + while($dir_path[$di]){ + $build_path .= $dir_path[$di] . "/"; + #::: If path does not exist, create the directory... + if (!-d $build_path) { + mkdir($build_path); + } + if(!$dir_path[$di + 2] && $dir_path[$di + 1]){ + # print $actual_path . "\n"; + $actual_path = $build_path; + last; + } + $di++; + } + } + copy $l_source_file, $l_dest_file; +} + sub MapFiles_Fetch{ print "\n --- Fetching Latest Maps --- \n"; - GetRemoteFile("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/!eqemu_maps_manifest.txt", "db_update/eqemu_maps_manifest.txt"); + + GetRemoteFile("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/!eqemu_maps_manifest.txt", "updates_staged/eqemu_maps_manifest.txt"); + #::: Get Data from manifest - open (FILE, "db_update/eqemu_maps_manifest.txt"); + open (FILE, "updates_staged/eqemu_maps_manifest.txt"); $i = 0; - while () { + while (){ chomp; $o = $_; - $maps_manifest[$i] = $o; - $i++; - } - #::: Download - for($m = 0; $m <= $i; $m++){ - print "'" . $maps_manifest[$m] . "'\n"; - if($maps_manifest[$m] ne ""){ - GetRemoteFile("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/" . $maps_manifest[$m], "maps/" . $maps_manifest[$m]); + @manifest_map_data = split(',', $o); + if($manifest_map_data[0] ne ""){ + $maps_manifest[$i] = [$manifest_map_data[0], $manifest_map_data[1]]; + $i++; } } - print "\n --- Done Fetching Latest Maps --- \n"; + #::: Download + $fc = 0; + for($m = 0; $m <= $i; $m++){ + my $file_existing = $maps_manifest[$m][0]; + my $file_existing_size = (stat $file_existing)[7]; + if($file_existing_size != $maps_manifest[$m][1]){ + print "Updating: '" . $maps_manifest[$m][0] . "'\n"; + GetRemoteFile("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/" . $maps_manifest[$m][0], $maps_manifest[$m][0], 1); + $fc++; + } + } + + if($fc == 0){ + print "\nNo Map Updates found... \n\n"; + } +} + +sub QuestFiles_Fetch{ + print "\n --- Fetching Latest Quests --- \n"; + + GetRemoteFile("https://github.com/EQEmu/Quests-Plugins/archive/master.zip", "updates_staged/Quests-Plugins-master.zip", 1); + + print "\nFetched latest quests...\n"; + my $zip = Archive::Zip->new(); + unless ( $zip->read( 'updates_staged\Quests-Plugins-master.zip' ) == AZ_OK ) { + die 'read error'; + } + print "Extracting...\n"; + $zip->extractTree('', 'updates_staged/'); + + $fc = 0; + use File::Find; + use File::Compare; + use Text::Diff; + my @files; + my $start_dir = "updates_staged/Quests-Plugins-master/quests/"; + find( + sub { push @files, $File::Find::name unless -d; }, + $start_dir + ); + for my $file (@files) { + if($file=~/\.pl|\.lua|\.ext/i){ + $staged_file = $file; + $dest_file = $file; + $dest_file =~s/updates_staged\/Quests-Plugins-master\///g; + + if (!-e $dest_file) { + CopyFile($staged_file, $dest_file); + print "Installing :: '" . $dest_file . "'\n"; + } + else{ + $diff = diff($dest_file, $staged_file, { STYLE => "Unified" }); + if($diff ne ""){ + $backup_dest = "updates_backups/" . $time_stamp . "/" . $dest_file; + + print $diff . "\n"; + print "\nFile Different :: '" . $dest_file . "'\n"; + print "\nDo you wish to update this Quest? '" . $dest_file . "' [Yes (Enter) - No (N)] - A backup will be found in '" . $backup_dest . "'\n"; + my $input = ; + if($input=~/N/i){} + else{ + #::: Make a backup + CopyFile($dest_file, $backup_dest); + #::: Copy staged to running + copy($staged_file, $dest_file); + print "Installing :: '" . $dest_file . "'\n\n"; + } + $fc++; + } + } + } + } + + #::: Cleanup staged folder... + rmtree("updates_staged/"); + + if($fc == 0){ + print "\nNo Quest Updates found... \n\n"; + } +} + +sub Plugins_Fetch{ + print "\n --- Fetching Latest Plugins --- \n"; + + GetRemoteFile("https://github.com/EQEmu/Quests-Plugins/archive/master.zip", "updates_staged/Quests-Plugins-master.zip", 1); + + print "\nFetched latest plugins...\n"; + my $zip = Archive::Zip->new(); + unless ( $zip->read( 'updates_staged\Quests-Plugins-master.zip' ) == AZ_OK ) { + die 'read error'; + } + print "Extracting...\n"; + $zip->extractTree('', 'updates_staged/'); + + $fc = 0; + use File::Find; + use File::Compare; + use Text::Diff; + my @files; + my $start_dir = "updates_staged/Quests-Plugins-master/plugins/"; + find( + sub { push @files, $File::Find::name unless -d; }, + $start_dir + ); + for my $file (@files) { + if($file=~/\.pl|\.lua|\.ext/i){ + $staged_file = $file; + $dest_file = $file; + $dest_file =~s/updates_staged\/Quests-Plugins-master\///g; + + if (!-e $dest_file) { + CopyFile($staged_file, $dest_file); + print "Installing :: '" . $dest_file . "'\n"; + } + else{ + $diff = diff($dest_file, $staged_file, { STYLE => "Unified" }); + if($diff ne ""){ + $backup_dest = "updates_backups/" . $time_stamp . "/" . $dest_file; + + print $diff . "\n"; + print "\nFile Different :: '" . $dest_file . "'\n"; + print "\nDo you wish to update this Plugin? '" . $dest_file . "' [Yes (Enter) - No (N)] - A backup will be found in '" . $backup_dest . "'\n"; + my $input = ; + if($input=~/N/i){} + else{ + #::: Make a backup + CopyFile($dest_file, $backup_dest); + #::: Copy staged to running + copy($staged_file, $dest_file); + print "Installing :: '" . $dest_file . "'\n\n"; + } + $fc++; + } + } + } + } + + #::: Cleanup staged folder... + rmtree("updates_staged/"); + + if($fc == 0){ + print "\nNo Plugin Updates found... \n\n"; + } +} + +sub AreFileSizesDifferent{ + $file_1 = $_[0]; + $file_2 = $_[1]; + my $file_1 = (stat $file_1)[7]; + my $file_2 = (stat $file_2)[7]; + # print $file_1 . " :: " . $file_2 . "\n"; + if($file_1 != $file_2){ + return 1; + } + return; } #::: Responsible for Database Upgrade Routines