X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fmodules.pl;h=162279d65c6124a9c5e677edfeefe2dab5eb34f5;hb=4af71a5a1add30c9150be6bb49b7aafabf17e63a;hp=1cc58a1627922d488c159978a319c0aafbcdb873;hpb=3780524a411a9fb1618a26e49c40d36923b7afcc;p=infobot.git diff --git a/src/modules.pl b/src/modules.pl index 1cc58a1..162279d 100644 --- a/src/modules.pl +++ b/src/modules.pl @@ -6,6 +6,7 @@ # if (&IsParam("useStrict")) { use strict; } +use vars qw($AUTOLOAD); ### ### REQUIRED MODULES. @@ -21,7 +22,6 @@ if ($@) { ### MODULES. %myModules = ( "countdown" => "Countdown.pl", - "allowDNS" => "DNS.pl", "debian" => "Debian.pl", "debianExtra" => "DebianExtra.pl", "dict" => "Dict.pl", @@ -31,6 +31,7 @@ if ($@) { "kernel" => "Kernel.pl", "ircdcc" => "UserDCC.pl", "perlMath" => "Math.pl", + "news" => "News.pl", "quote" => "Quote.pl", "rootwarn" => "RootWarn.pl", "search" => "Search.pl", @@ -44,28 +45,42 @@ if ($@) { "wingate" => "Wingate.pl", "insult" => "insult.pl", "nickometer" => "nickometer.pl", + "babelfish" => "babel.pl", ); -@myModulesLoadNow = ('topic', 'uptime',); -@myModulesReloadNot = ('IRC/Irc.pl','IRC/Schedulers.pl'); +### THIS IS NOT LOADED ON RELOAD :( +BEGIN { + @myModulesLoadNow = ('topic', 'uptime', 'news'); + @myModulesReloadNot = ('IRC/Irc.pl','IRC/Schedulers.pl'); +} sub loadCoreModules { - if (!opendir(DIR, $infobot_src_dir)) { - &ERROR("can't open source directory $infobot_src_dir: $!"); + if (!opendir(DIR, $bot_src_dir)) { + &ERROR("can't open source directory $bot_src_dir: $!"); exit 1; } - &status("Loading CORE modules..."); - + my @mods; while (defined(my $file = readdir DIR)) { next unless $file =~ /\.pl$/; next unless $file =~ /^[A-Z]/; - my $mod = "$infobot_src_dir/$file"; - ### TODO: use eval and exit gracefully? - require $mod; - $moduleAge{$mod} = (stat $mod)[9]; - &showProc(" ($file)") if (&IsParam("DEBUG")); + push(@mods, $file); } closedir DIR; + &status("Loading ".scalar(@mods)." CORE modules..."); + + foreach (sort @mods) { + my $mod = "$bot_src_dir/$_"; + + eval "require \"$mod\""; + if ($@) { + &ERROR("lCM => $@"); + &shutdown(); + exit 1; + } + + $moduleAge{$mod} = (stat $mod)[9]; + &showProc(" ($_)") if (&IsParam("DEBUG")); + } } sub loadDBModules { @@ -80,7 +95,7 @@ sub loadDBModules { &showProc(" (DBI // mysql)"); &status(" using MySQL support."); - require "$infobot_src_dir/db_mysql.pl"; + require "$bot_src_dir/db_mysql.pl"; } elsif ($param{'DBType'} =~ /^pgsql$/i) { eval "use Pg"; @@ -91,11 +106,15 @@ sub loadDBModules { &showProc(" (Pg // postgreSQLl)"); &status(" using PostgreSQL support."); - require "$infobot_src_dir/db_pgsql.pl"; + require "$bot_src_dir/db_pgsql.pl"; } elsif ($param{'DBType'} =~ /^dbm$/i) { &status(" using Berkeley DBM 1.85/2.0 support."); - require "$infobot_src_dir/db_dbm.pl"; + &ERROR("dbm support is broken... you want it, you fix it!"); + &shutdown(); + exit 1; + +# require "$bot_src_dir/db_dbm.pl"; } else { &status("DB support DISABLED."); @@ -111,7 +130,7 @@ sub loadFactoidsModules { return; } - if (!opendir(DIR, "$infobot_src_dir/Factoids")) { + if (!opendir(DIR, "$bot_src_dir/Factoids")) { &ERROR("can't open source directory Factoids: $!"); exit 1; } @@ -119,9 +138,14 @@ sub loadFactoidsModules { while (defined(my $file = readdir DIR)) { next unless $file =~ /\.pl$/; next unless $file =~ /^[A-Z]/; - my $mod = "$infobot_src_dir/Factoids/$file"; + my $mod = "$bot_src_dir/Factoids/$file"; ### TODO: use eval and exit gracefully? - require $mod; + eval "require \"$mod\""; + if ($@) { + &WARN("lFM: $@"); + exit 1; + } + $moduleAge{$mod} = (stat $mod)[9]; &showProc(" ($file)") if (&IsParam("DEBUG")); } @@ -137,12 +161,13 @@ sub loadIRCModules { exit 1; } &showProc(" (Net::IRC)"); + } else { &status("IRC support DISABLED."); return; } - if (!opendir(DIR, "$infobot_src_dir/IRC")) { + if (!opendir(DIR, "$bot_src_dir/IRC")) { &ERROR("can't open source directory Factoids: $!"); exit 1; } @@ -150,7 +175,7 @@ sub loadIRCModules { while (defined(my $file = readdir DIR)) { next unless $file =~ /\.pl$/; next unless $file =~ /^[A-Z]/; - my $mod = "$infobot_src_dir/IRC/$file"; + my $mod = "$bot_src_dir/IRC/$file"; ### TODO: use eval and exit gracefully? require $mod; $moduleAge{$mod} = (stat $mod)[9]; @@ -166,61 +191,94 @@ sub loadMyModulesNow { &status("Loading MyModules..."); foreach (@myModulesLoadNow) { $total++; + if (!defined $_) { + &WARN("mMLN: null element."); + next; + } + + if (!&IsParam($_) and !&IsChanConf($_) and !&getChanConfList($_)) { + if (exists $myModules{$_}) { + &status("myModule: $myModules{$_} or $_ (1) not loaded."); + } else { + &DEBUG("myModule: $_ (2) not loaded."); + } - if (!exists $param{$_}) { - &DEBUG("myModule: $myModules{$_} not loaded."); next; } + &loadMyModule($myModules{$_}); $loaded++; } - &status("Modules: Loaded/Total [$loaded/$total]"); + &status("Module: Runtime: Loaded/Total [$loaded/$total]"); +} + +### rename to moduleReloadAll? +sub reloadAllModules { +### &status("Module: reloading all."); + foreach (map { substr($_,2) } keys %moduleAge) { + &reloadModule($_); + } +### &status("Module: reloading done."); } ### rename to modulesReload? -sub reloadModules { -## my @check = map { $myModules{$_} } keys %myModules; -## push(@check, map { substr($_,2) } keys %moduleAge); - my @check = map { substr($_,2) } keys %moduleAge; - - &DEBUG("rM: moduleAge must be in src/BLAH format?"); - foreach (keys %moduleAge) { - &DEBUG("rM: moduleAge{$_} => '...'."); +sub reloadModule { + my ($mod) = @_; + my $file = (grep /\/$mod/, keys %INC)[0]; + + # don't reload if it's not our module. + if ($mod =~ /::/ or $mod !~ /pl$/) { + &VERB("Not reloading $mod.",3); + return; + } + + if (!defined $file) { + &WARN("rM: Cannot reload $mod since it was not loaded anyway."); + return; } - foreach (@check) { - my $mod = $_; - my $file = (grep /\/$mod/, keys %INC)[0]; + if (! -f $file) { + &ERROR("rM: file '$file' does not exist?"); + return; + } - if (!defined $file) { - &DEBUG("rM: mod '$mod' was not found in \%INC."); - next; - } + if (grep /$mod/, @myModulesReloadNot) { + &DEBUG("rM: SHOULD NOT RELOAD $mod!!!"); + return; + } - if (! -f $file) { - &DEBUG("rM: file '$file' does not exist?"); - next; - } + my $age = (stat $file)[9]; - my $age = (stat $file)[9]; - next if ($age == $moduleAge{$file}); + if (!exists $moduleAge{$file}) { + &DEBUG("Looks like $file was not loaded; fixing."); + } else { + return if ($age == $moduleAge{$file}); - if (grep /$mod/, @myModulesReloadNot) { - &DEBUG("rM: SHOULD NOT RELOAD $mod!!!"); - next; + if ($age < $moduleAge{$file}) { + &WARN("rM: we're not gonna downgrade the file. use 'touch'."); + return; } - &DEBUG("rM: (loading) => '$mod' or ($_)."); - delete $INC{$file}; - eval "require \"$file\""; - if (@$) { - &DEBUG("rM: failure: @$"); - } else { - &DEBUG("rM: good! (reloaded)"); - } + my $dc = &Time2String($age - $moduleAge{$file}); + my $ago = &Time2String(time() - $moduleAge{$file}); + + &VERB("Module: delta change: $dc",2); + &VERB("Module: ago: $ago",2); + } + + &status("Module: Loading $mod..."); + + delete $INC{$file}; + eval "require \"$file\""; # require or use? + if (@$) { + &DEBUG("rM: failure: @$"); + } else { + my $basename = $file; + $basename =~ s/^.*\///; + &status("Module: reloaded $basename"); + $moduleAge{$file} = $age; } - &DEBUG("rM: Done."); } ### @@ -232,6 +290,7 @@ local %perlModulesMissing = (); sub loadPerlModule { return 0 if (exists $perlModulesMissing{$_[0]}); + &reloadModule($_[0]); return 1 if (exists $perlModulesLoaded{$_[0]}); eval "use $_[0]"; @@ -259,17 +318,26 @@ sub loadMyModule { ($modulename, $modulebase) = ($tmp, $myModules{$tmp}); } else { $modulebase = $tmp; + if ($tmp = grep /^$modulebase$/, keys %myModules) { + &DEBUG("lMM: lame hack, file => name => $tmp."); + $modulename = $tmp; + } } - my $modulefile = "$infobot_src_dir/Modules/$modulebase"; + my $modulefile = "$bot_src_dir/Modules/$modulebase"; - return 1 if (grep /$modulefile/, keys %INC); + # call reloadModule() which checks age of file and reload. + if (grep /\/$modulebase$/, keys %INC) { + &reloadModule($modulebase); + return 1; # depend on reloadModule? + } if (! -f $modulefile) { &ERROR("lMM: module ($modulebase) does not exist."); - if ($$ == $infobot_pid) { # parent. + if ($$ == $bot_pid) { # parent. &shutdown() if (defined $shm and defined $dbh); } else { # child. - &delForked($modulename); + &DEBUG("b4 delfork 1"); + &delForked($modulebase); } exit 1; @@ -278,16 +346,15 @@ sub loadMyModule { eval "require \"$modulefile\""; if ($@) { &ERROR("cannot load my module: $modulebase"); - if ($infobot_pid == $$) { # parent. - &shutdown() if (defined $shm and defined $dbh); - } else { # child. + if ($bot_pid != $$) { # child. + &DEBUG("b4 delfork 2"); &delForked($modulebase); + exit 1; } - exit 1; + return 0; } else { $moduleAge{$modulefile} = (stat $modulefile)[9]; - &DEBUG("lMM: setting moduleAge{$modulefile} = time();"); &status("myModule: Loaded $modulebase ..."); &showProc(" ($modulebase)"); @@ -295,14 +362,27 @@ sub loadMyModule { } } -### this chews 3megs on potato, 300 kB on slink. -$no_syscall = 0; -###eval "require 'sys/syscall.ph'"; -#if ($@) { -# &WARN("sys/syscall.ph has not been installed//generated. gettimeofday -#will use time() instead"); - $no_syscall = 1; -#} -#&showProc(" (syscall)"); +$no_timehires = 0; +eval "use Time::HiRes qw(gettimeofday tv_interval)"; +if ($@) { + &WARN("No Time::HiRes?"); + $no_timehires = 1; +} +&showProc(" (Time::HiRes)"); + +sub AUTOLOAD { + return if ($AUTOLOAD =~ /__/); # internal. + + my $str = join(', ', @_); + &ERROR("UNKNOWN FUNCTION CALLED: $AUTOLOAD ($str)"); + + $AUTOLOAD =~ s/^(\S+):://g; + + if (exists $myModules{lc $AUTOLOAD}) { + # hopefully this will work. + &DEBUG("Trying to load module $AUTOLOAD..."); + &loadMyModule(lc $AUTOLOAD); + } +} 1;