From f6ac46956f9b57f57edc111c9894fb7db004f9cf Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Mon, 20 Apr 2020 17:53:32 -0700 Subject: [PATCH] Rename Migration to Updater --- PBot/Migration.pm | 89 ------------------------------------ PBot/PBot.pm | 56 +++++++++++------------ PBot/Refresher.pm | 8 ++-- PBot/Updater.pm | 89 ++++++++++++++++++++++++++++++++++++ pbot | 8 ++-- {migration => updates}/.keep | 0 6 files changed, 125 insertions(+), 125 deletions(-) delete mode 100644 PBot/Migration.pm create mode 100644 PBot/Updater.pm rename {migration => updates}/.keep (100%) diff --git a/PBot/Migration.pm b/PBot/Migration.pm deleted file mode 100644 index 27ccd17e..00000000 --- a/PBot/Migration.pm +++ /dev/null @@ -1,89 +0,0 @@ -# File: Migration.pm -# Author: pragma_ -# -# Purpose: Migrates data/configration files to new locations/formats based -# on versioning information. Ensures data/configuration files are in the -# proper location and using the latest data structure. - -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -package PBot::Migration; -use parent 'PBot::Class'; - -use warnings; use strict; -use feature 'unicode_strings'; - -use File::Basename; - -sub initialize { - my ($self, %conf) = @_; - $self->{data_dir} = $conf{data_dir}; - $self->{migration_dir} = $conf{migration_dir}; -} - -sub migrate { - my ($self) = @_; - - $self->{pbot}->{logger}->log("Checking if migration needed...\n"); - - my $current_version = $self->get_current_version; - my $last_migration_version = $self->get_last_migration_version; - - $self->{pbot}->{logger}->log("Current version: $current_version; last migration version: $last_migration_version\n"); - - if ($last_migration_version >= $current_version) { - $self->{pbot}->{logger}->log("No migration necessary.\n"); - return 0; - } - - my @migrations = $self->get_available_migrations($last_migration_version); - - if (not @migrations ) { - $self->{pbot}->{logger}->log("No migrations available.\n"); - return 0; - } - - foreach my $migration (@migrations) { - $self->{pbot}->{logger}->log("Executing migration script: $migration\n"); - my $output = `$migration $self->{data_dir}`; - my $exit = $? >> 8; - $self->{pbot}->{logger}->log("Script completed. Exit $exit. Output: $output"); - return $exit if $exit != 0; - } - - return $self->put_last_migration_version($current_version); -} - -sub get_available_migrations { - my ($self, $last_migration_version) = @_; - my @migrations = sort glob "$self->{migration_dir}/*"; - return grep { my ($version) = split /_/, basename $_; $version > $last_migration_version ? 1 : 0 } @migrations; -} - -sub get_current_version { - return PBot::VERSION::BUILD_REVISION; -} - -sub get_last_migration_version { - my ($self) = @_; - open(my $fh, '<', "$self->{data_dir}/last_migration") or return 0; - chomp(my $last_migration = <$fh>); - close $fh; - return $last_migration; -} - -sub put_last_migration_version { - my ($self, $version) = @_; - if (open(my $fh, '>', "$self->{data_dir}/last_migration")) { - print $fh "$version\n"; - close $fh; - return 0; - } else { - $self->{pbot}->{logger}->log("Could not save last migration to $self->{data_dir}/last_migration: $!\n"); - return 1; - } -} - -1; diff --git a/PBot/PBot.pm b/PBot/PBot.pm index b6404bf0..c113ba80 100644 --- a/PBot/PBot.pm +++ b/PBot/PBot.pm @@ -50,7 +50,7 @@ use PBot::Plugins; use PBot::Functions; use PBot::Modules; use PBot::ProcessManager; -use PBot::Migration; +use PBot::Updater; sub new { my ($proto, %conf) = @_; @@ -64,26 +64,26 @@ sub initialize { my ($self, %conf) = @_; $self->{startup_timestamp} = time; - my $data_dir = $conf{data_dir}; - my $module_dir = $conf{module_dir}; - my $plugin_dir = $conf{plugin_dir}; - my $migration_dir = $conf{migration_dir}; + my $data_dir = $conf{data_dir}; + my $module_dir = $conf{module_dir}; + my $plugin_dir = $conf{plugin_dir}; + my $update_dir = $conf{update_dir}; # check command-line arguments for directory overrides foreach my $arg (@ARGV) { - if ($arg =~ m/^-?(?:general\.)?((?:data|module|plugin|migration)_dir)=(.*)$/) { - my $override = $1; - my $value = $2; - $data_dir = $value if $override eq 'data_dir'; - $module_dir = $value if $override eq 'module_dir'; - $plugin_dir = $value if $override eq 'plugin_dir'; - $migration_dir = $value if $override eq 'migration_dir'; + if ($arg =~ m/^-?(?:general\.)?((?:data|module|plugin|update)_dir)=(.*)$/) { + my $override = $1; + my $value = $2; + $data_dir = $value if $override eq 'data_dir'; + $module_dir = $value if $override eq 'module_dir'; + $plugin_dir = $value if $override eq 'plugin_dir'; + $update_dir = $value if $override eq 'update_dir'; } } # check command-line arguments for registry overrides foreach my $arg (@ARGV) { - next if $arg =~ m/^-?(?:general\.)?(?:config|data|module|plugin|migration)_dir=.*$/; # already processed + next if $arg =~ m/^-?(?:general\.)?(?:config|data|module|plugin|update)_dir=.*$/; # already processed my ($item, $value) = split /=/, $arg, 2; if (not defined $item or not defined $value) { @@ -125,16 +125,16 @@ sub initialize { exit; } - if (not -d $migration_dir) { - $self->{logger}->log("Migration directory ($migration_dir) does not exist; aborting...\n"); + if (not -d $update_dir) { + $self->{logger}->log("Updates directory ($update_dir) does not exist; aborting...\n"); exit; } - # migrate/update any data files to new locations/formats - $self->{migrator} = PBot::Migration->new(pbot => $self, data_dir => $data_dir, migration_dir => $migration_dir); + $self->{updater} = PBot::Updater->new(pbot => $self, data_dir => $data_dir, update_dir => $update_dir); - if ($self->{migrator}->migrate) { - $self->{logger}->log("Migration failed.\n"); + # update any data files to new locations/formats + if ($self->{updater}->update) { + $self->{logger}->log("Update failed.\n"); exit 0; } @@ -163,7 +163,7 @@ sub initialize { $self->{logger}->log("module_dir: $module_dir\n"); $self->{logger}->log("plugin_dir: $plugin_dir\n"); $self->{logger}->log("data_dir: $data_dir\n"); - $self->{logger}->log("migration_dir: $migration_dir\n"); + $self->{logger}->log("update_dir: $update_dir\n"); $self->{timer} = PBot::Timer->new(pbot => $self, timeout => 10, name => 'PBot Timer', %conf); @@ -174,10 +174,10 @@ sub initialize { # create registry and set some defaults $self->{registry} = PBot::Registry->new(pbot => $self, filename => "$data_dir/registry", %conf); - $self->{registry}->add_default('text', 'general', 'data_dir', $data_dir); - $self->{registry}->add_default('text', 'general', 'module_dir', $module_dir); - $self->{registry}->add_default('text', 'general', 'plugin_dir', $plugin_dir); - $self->{registry}->add_default('text', 'general', 'migration_dir', $migration_dir); + $self->{registry}->add_default('text', 'general', 'data_dir', $data_dir); + $self->{registry}->add_default('text', 'general', 'module_dir', $module_dir); + $self->{registry}->add_default('text', 'general', 'plugin_dir', $plugin_dir); + $self->{registry}->add_default('text', 'general', 'update_dir', $update_dir); $self->{registry}->add_default('text', 'general', 'trigger', $conf{trigger} // '!'); $self->{registry}->add_default('text', 'irc', 'debug', $conf{irc_debug} // 0); @@ -202,10 +202,10 @@ sub initialize { if (-e $self->{registry}->{registry}->{filename}) { $self->{registry}->load; } # update important paths - $self->{registry}->set('general', 'data_dir', 'value', $data_dir, 0, 1); - $self->{registry}->set('general', 'module_dir', 'value', $module_dir, 0, 1); - $self->{registry}->set('general', 'plugin_dir', 'value', $plugin_dir, 0, 1); - $self->{registry}->set('general', 'migration_dir', 'value', $migration_dir, 0, 1); + $self->{registry}->set('general', 'data_dir', 'value', $data_dir, 0, 1); + $self->{registry}->set('general', 'module_dir', 'value', $module_dir, 0, 1); + $self->{registry}->set('general', 'plugin_dir', 'value', $plugin_dir, 0, 1); + $self->{registry}->set('general', 'update_dir', 'value', $update_dir, 0, 1); # override registry entries with command-line arguments, if any foreach my $override (keys %{$self->{overrides}}) { diff --git a/PBot/Refresher.pm b/PBot/Refresher.pm index ceedeffc..83cb9170 100644 --- a/PBot/Refresher.pm +++ b/PBot/Refresher.pm @@ -27,11 +27,11 @@ sub initialize { sub refresh { my ($self, $from, $nick, $user, $host, $arguments) = @_; - my $last_migration = $self->{pbot}->{migrator}->get_last_migration_version; - my @migrations = $self->{pbot}->{migrator}->get_available_migrations($last_migration); + my $last_update = $self->{pbot}->{updater}->get_last_update_version; + my @updates = $self->{pbot}->{updater}->get_available_updates($last_update); - if (@migrations) { - return "Migration available; cannot refresh. Please restart PBot to begin migration of " . join(', ', map { basename $_ } @migrations); + if (@updates) { + return "Update available; cannot refresh. Please restart PBot to begin update of " . join(', ', map { basename $_ } @updates); } my $refresh_error; diff --git a/PBot/Updater.pm b/PBot/Updater.pm new file mode 100644 index 00000000..e0544cbb --- /dev/null +++ b/PBot/Updater.pm @@ -0,0 +1,89 @@ +# File: Updater.pm +# Author: pragma_ +# +# Purpose: Updates data/configration files to new locations/formats based +# on versioning information. Ensures data/configuration files are in the +# proper location and using the latest data structure. + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package PBot::Updater; +use parent 'PBot::Class'; + +use warnings; use strict; +use feature 'unicode_strings'; + +use File::Basename; + +sub initialize { + my ($self, %conf) = @_; + $self->{data_dir} = $conf{data_dir}; + $self->{update_dir} = $conf{update_dir}; +} + +sub update { + my ($self) = @_; + + $self->{pbot}->{logger}->log("Checking if update needed...\n"); + + my $current_version = $self->get_current_version; + my $last_update_version = $self->get_last_update_version; + + $self->{pbot}->{logger}->log("Current version: $current_version; last update version: $last_update_version\n"); + + if ($last_update_version >= $current_version) { + $self->{pbot}->{logger}->log("No update necessary.\n"); + return $self->put_last_update_version($current_version); + } + + my @updates = $self->get_available_updates($last_update_version); + + if (not @updates ) { + $self->{pbot}->{logger}->log("No updates available.\n"); + return $self->put_last_update_version($current_version); + } + + foreach my $update (@updates) { + $self->{pbot}->{logger}->log("Executing update script: $update\n"); + my $output = `$update $self->{data_dir}`; + my $exit = $? >> 8; + $self->{pbot}->{logger}->log("Script completed. Exit $exit. Output: $output"); + return $exit if $exit != 0; + } + + return $self->put_last_update_version($current_version); +} + +sub get_available_updates { + my ($self, $last_update_version) = @_; + my @updates = sort glob "$self->{update_dir}/*.pl"; + return grep { my ($version) = split /_/, basename $_; $version > $last_update_version } @updates; +} + +sub get_current_version { + return PBot::VERSION::BUILD_REVISION; +} + +sub get_last_update_version { + my ($self) = @_; + open(my $fh, '<', "$self->{data_dir}/last_update") or return 0; + chomp(my $last_update = <$fh>); + close $fh; + return $last_update; +} + +sub put_last_update_version { + my ($self, $version) = @_; + if (open(my $fh, '>', "$self->{data_dir}/last_update")) { + print $fh "$version\n"; + close $fh; + return 0; + } else { + $self->{pbot}->{logger}->log("Could not save last update version to $self->{data_dir}/last_update: $!\n"); + return 1; + } +} + +1; diff --git a/pbot b/pbot index 46f19bbe..a73a67b1 100755 --- a/pbot +++ b/pbot @@ -15,10 +15,10 @@ BEGIN { # configuration is overridden via command-line arguments, do not modify # see doc/QuickStart.md my %config = ( - data_dir => "$bothome/data", - module_dir => "$bothome/modules", - plugin_dir => "$bothome/Plugins", - migration_dir => "$bothome/migration", + data_dir => "$bothome/data", + module_dir => "$bothome/modules", + plugin_dir => "$bothome/Plugins", + update_dir => "$bothome/updates", ); use PBot::PBot; diff --git a/migration/.keep b/updates/.keep similarity index 100% rename from migration/.keep rename to updates/.keep