diff options
Diffstat (limited to 'lib/ASM')
| -rw-r--r-- | lib/ASM/Commander.pm | 40 | ||||
| -rw-r--r-- | lib/ASM/Config.pm | 110 | ||||
| -rw-r--r-- | lib/ASM/Event.pm | 2 | ||||
| -rw-r--r-- | lib/ASM/XML.pm | 70 |
4 files changed, 131 insertions, 91 deletions
diff --git a/lib/ASM/Commander.pm b/lib/ASM/Commander.pm index 1fd92d1..7037755 100644 --- a/lib/ASM/Commander.pm +++ b/lib/ASM/Commander.pm @@ -377,7 +377,7 @@ sub cmd_monitor2 { my $chan = lc $+{chan}; my $switch = lc $+{switch}; $::channels->{channel}->{$chan}->{monitor} = $switch; - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); $conn->privmsg($event->replyto, "Monitor flag for $chan set to $switch"); } @@ -397,10 +397,10 @@ sub cmd_suppress { $conn->schedule($duration, sub { if (($::channels->{channel}{$chan}{suppress} // 0) - 10 <= time) { # we needn't actually delete this here, but doing so - # avoids cluttering the XML + # avoids cluttering the config delete $::channels->{channel}{$chan}{suppress}; $conn->privmsg($event->replyto, "Unsuppressed $chan"); - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); } }); $conn->privmsg($event->replyto, "Suppressing alerts from $chan for $minutes minutes."); @@ -433,7 +433,7 @@ sub cmd_silence2 { my $chan = lc $+{chan}; my $switch = lc $+{switch}; $::channels->{channel}->{$chan}->{silence} = $switch; - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); $conn->privmsg($event->replyto, "Silence flag for $chan set to $switch"); } @@ -592,7 +592,7 @@ sub cmd_user_add { return; } $::users->{person}->{$nick} = { 'flags' => $flags }; - ASM::XML->writeUsers(); + ASM::Config->writeUsers(); $conn->privmsg($event->replyto, "Flags for NickServ account $nick set to $flags"); } @@ -651,7 +651,7 @@ sub cmd_user_flags2 { $o_Htgroup->save(); } $::users->{person}->{$nick}->{flags} = $flags; - ASM::XML->writeUsers(); + ASM::Config->writeUsers(); $conn->privmsg($event->replyto, "Flags for $nick set to $flags"); } @@ -665,7 +665,7 @@ sub cmd_user_del { return $conn->privmsg($event->replyto, "Users with the 'd' flag are untouchable. Edit the config file manually."); } delete($::users->{person}->{$nick}); - ASM::XML->writeUsers(); + ASM::Config->writeUsers(); use Apache::Htpasswd; use Apache::Htgroup; my $o_Htpasswd = new Apache::Htpasswd({passwdFile => $::settings->{web}->{userfile}, UseMD5 => 1}); my $o_Htgroup = new Apache::Htgroup($::settings->{web}->{groupfile}); @@ -697,7 +697,7 @@ sub cmd_target { my @tmphl = @{$::channels->{channel}->{$chan}->{msgs}->{$level}}; push(@tmphl, $nick); $::channels->{channel}->{$chan}->{msgs}->{$level} = \@tmphl; - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); $conn->privmsg($event->replyto, "$nick added to $level risk messages for $chan"); } @@ -717,7 +717,7 @@ sub cmd_detarget { @ppl = grep { lc $_ ne $nick } @ppl; $::channels->{channel}->{$chan}->{msgs}->{$risk} = \@ppl; } - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); $conn->privmsg($event->replyto, "$nick removed from targets for $chan"); } @@ -778,7 +778,7 @@ sub cmd_hilight { push(@tmphl, $nick); } $::channels->{channel}->{$chan}->{hilights}->{$level} = \@tmphl; - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); $conn->privmsg($event->replyto, ASM::Util->commaAndify(@nicks) . " added to $level risk hilights for $chan"); } @@ -798,7 +798,7 @@ sub cmd_dehilight { @ppl = grep { !(lc $_ ~~ @nicks) } @ppl; $::channels->{channel}->{$chan}->{hilights}->{$risk} = \@ppl; } - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); $conn->privmsg($event->replyto, "Removing hilights for " . ASM::Util->commaAndify(@nicks) . " in $chan"); } @@ -808,14 +808,14 @@ sub cmd_join { my $chan = lc $+{chan}; unless (defined($::channels->{channel}->{$chan})) { $::channels->{channel}->{$chan} = { monitor => "yes", silence => "no" }; - ASM::XML->writeChannels(); + ASM::Config->writeChannels(); } $conn->join($chan); my @autojoins = @{$::settings->{autojoins}}; if (!grep { $chan eq lc $_ } @autojoins) { @autojoins = (@autojoins, $chan); $::settings->{autojoins} = \@autojoins; - ASM::XML->writeSettings(); + ASM::Config->writeSettings(); } } @@ -827,7 +827,7 @@ sub cmd_part { my @autojoins = @{$::settings->{autojoins}}; @autojoins = grep { lc $_ ne $chan } @autojoins; $::settings->{autojoins} = \@autojoins; - ASM::XML->writeSettings(); + ASM::Config->writeSettings(); } sub cmd_sl { @@ -852,7 +852,7 @@ sub cmd_ev { sub cmd_rehash { my ($conn, $event) = @_; - ASM::XML->readXML(); + ASM::Config->readConfig(); $conn->privmsg($event->replyto, 'config files were re-read'); } @@ -871,7 +871,7 @@ sub cmd_restrict { $::restrictions->{$+{type} . 's'}->{$+{type}}->{$who}->{$+{restriction}} = $+{restriction}; $conn->privmsg($event->replyto, "Added $+{restriction} restriction for $+{type} $who"); } - ASM::XML->writeRestrictions(); + ASM::Config->writeRestrictions(); } sub cmd_ops { @@ -950,7 +950,7 @@ sub cmd_blacklist { use String::CRC32; my $id = sprintf("%08x", crc32($string)); $::blacklist->{string}->{$id} = { "content" => $string, "type" => "string", "setby" => $event->nick, "settime" => strftime('%F', gmtime) }; - ASM::XML->writeBlacklist(); + ASM::Config->writeBlacklist(); $conn->privmsg($event->replyto, "$string blacklisted with id $id, please use ;blreason $id reasonGoesHere to set a reason"); } @@ -960,7 +960,7 @@ sub cmd_blacklistpcre { use String::CRC32; my $id = sprintf("%08x", crc32($+{string})); $::blacklist->{string}->{$id} = { "content" => $+{string}, "type" => "pcre", "setby" => $event->nick, "settime" => strftime('%F', gmtime) }; - ASM::XML->writeBlacklist(); + ASM::Config->writeBlacklist(); $conn->privmsg($event->replyto, "$+{string} blacklisted with id $id, please use ;blreason $id reasonGoesHere to set a reason"); } @@ -970,7 +970,7 @@ sub cmd_unblacklist { if (defined($::blacklist->{string}->{$+{id}})) { delete $::blacklist->{string}->{$+{id}}; $conn->privmsg($event->replyto, "blacklist id $+{id} removed"); - ASM::XML->writeBlacklist(); + ASM::Config->writeBlacklist(); } else { $conn->privmsg($event->replyto, "invalid id"); } @@ -1014,7 +1014,7 @@ sub cmd_blreason { if (defined($::blacklist->{string}->{$+{id}})) { $::blacklist->{string}->{$+{id}}->{reason} = $+{reason}; $conn->privmsg($event->replyto, "Reason set"); - ASM::XML->writeBlacklist(); + ASM::Config->writeBlacklist(); } else { $conn->privmsg($event->replyto, "ID is invalid"); } diff --git a/lib/ASM/Config.pm b/lib/ASM/Config.pm new file mode 100644 index 0000000..de0bb21 --- /dev/null +++ b/lib/ASM/Config.pm @@ -0,0 +1,110 @@ +package ASM::Config; +no autovivification; +use warnings; +use strict; +use feature 'state'; + +use XML::Simple qw(:strict); +use JSON; +use IO::All; +no if $] >= 5.017011, warnings => 'experimental::smartmatch'; + +our $json = JSON->new->utf8->pretty->canonical; + +sub serialize { + return $json->encode(@_); +} +sub deserialize { + return $json->decode(@_); +} + +sub readXML { + my ( $p ) = $::cset; + my @fchan = ( 'event', keys %::RISKS ); + my $xs1 = XML::Simple->new( KeyAttr => ['id'], Cache => [ qw/memcopy/ ]); + $::settings = $xs1->XMLin( "$p/settings.xml", ForceArray => ['host'], + 'GroupTags' => { altnicks => 'altnick', server => 'host', + autojoins => 'autojoin' }); + $::channels = $xs1->XMLin( "$p/channels.xml", ForceArray => \@fchan ); + $::users = $xs1->XMLin( "$p/users.xml", ForceArray => 'person'); + $::mysql = $xs1->XMLin( "$p/mysql.xml", ForceArray => ['ident', 'geco'], + 'GroupTags' => { ignoredidents => 'ident', ignoredgecos => 'geco' }); + $::dnsbl = $xs1->XMLin( "$p/dnsbl.xml", ForceArray => []); + $::rules = $xs1->XMLin( "$p/rules.xml", ForceArray => []); + $::restrictions = $xs1->XMLin( "$p/restrictions.xml", ForceArray => ['host', 'nick', 'account']); + $::blacklist = $xs1->XMLin( "$p/blacklist.xml", ForceArray => 'string'); +} + +sub readConfig { + if (!-e "$::cset/settings.json") { + state $in_readconfig = 0; + die "Unexpected readConfig recursion" if $in_readconfig++; + readXML(); + writeConfig(); + readConfig(); + } + else { + $::settings = deserialize(io->file("$::cset/settings.json")->all); + $::channels = deserialize(io->file("$::cset/channels.json")->all); + $::users = deserialize(io->file("$::cset/users.json")->all); + $::mysql = deserialize(io->file("$::cset/mysql.json")->all); + $::dnsbl = deserialize(io->file("$::cset/dnsbl.json")->all); + $::rules = deserialize(io->file("$::cset/rules.json")->all); + $::restrictions = deserialize(io->file("$::cset/restrictions.json")->all); + $::blacklist = deserialize(io->file("$::cset/blacklist.json")->all); + } +} + +sub writeConfig { + writeMysql(); + writeChannels(); + writeUsers(); + writeSettings(); + writeRestrictions(); + writeBlacklist(); + writeDnsbl(); + writeRules(); +} + +sub writeMysql { + $::settingschanged=1; + serialize($::mysql) > io->file("$::cset/mysql.json"); +} + +sub writeRules { + $::settingschanged=1; + serialize($::rules) > io->file("$::cset/rules.json"); +} + +sub writeDnsbl { + $::settingschanged=1; + serialize($::dnsbl) > io->file("$::cset/dnsbl.json"); +} + +sub writeChannels { + $::settingschanged=1; + serialize($::channels) > io("$::cset/channels.json"); +} + +sub writeUsers { + $::settingschanged=1; + serialize($::users) > io("$::cset/users.json"); +} + +sub writeSettings { + $::settingschanged=1; + serialize($::settings) > io("$::cset/settings.json"); +} + +sub writeRestrictions { + $::settingschanged=1; + serialize($::restrictions) > io("$::cset/restrictions.json"); +} + +sub writeBlacklist { + $::settingschanged=1; + serialize($::blacklist) > io("$::cset/blacklist.json"); +} + +return 1; +# vim: ts=2:sts=2:sw=2:expandtab diff --git a/lib/ASM/Event.pm b/lib/ASM/Event.pm index 005a9d3..1b2a4a2 100644 --- a/lib/ASM/Event.pm +++ b/lib/ASM/Event.pm @@ -87,7 +87,7 @@ sub on_pong $::settingschanged = 0; } else { $conn->privmsg($::settings->{masterchan}, "Config files changed, auto rehash triggered. Check console for possible errors."); - ASM::XML->readXML(); + ASM::Config->readConfig(); } } if ($lag > 1) { diff --git a/lib/ASM/XML.pm b/lib/ASM/XML.pm deleted file mode 100644 index 7588699..0000000 --- a/lib/ASM/XML.pm +++ /dev/null @@ -1,70 +0,0 @@ -package ASM::XML; -no autovivification; -use warnings; -use strict; - -use XML::Simple qw(:strict); -use IO::All; -no if $] >= 5.017011, warnings => 'experimental::smartmatch'; - -$::xs1 = XML::Simple->new( KeyAttr => ['id'], Cache => [ qw/memcopy/ ]); - -sub readXML { - my ( $p ) = $::cset; - my @fchan = ( 'event', keys %::RISKS ); - $::settings = $::xs1->XMLin( "$p/settings.xml", ForceArray => ['host'], - 'GroupTags' => { altnicks => 'altnick', server => 'host', - autojoins => 'autojoin' }); - $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => \@fchan ); - $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person'); - $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => ['ident', 'geco'], - 'GroupTags' => { ignoredidents => 'ident', ignoredgecos => 'geco' }); - $::dnsbl = $::xs1->XMLin( "$p/dnsbl.xml", ForceArray => []); - $::rules = $::xs1->XMLin( "$p/rules.xml", ForceArray => []); - $::restrictions = $::xs1->XMLin( "$p/restrictions.xml", ForceArray => ['host', 'nick', 'account']); - $::blacklist = $::xs1->XMLin( "$p/blacklist.xml", ForceArray => 'string'); -} - -sub writeXML { - writeSettings(); - writeChannels(); - writeUsers(); - writeRestrictions(); - writeBlacklist(); - writeMysql(); -} - -sub writeMysql { - $::settingschanged=1; - $::xs1->XMLout($::mysql, RootName => 'mysql', KeyAttr => ['id']) > io("$::cset/mysql.xml"); -} - -sub writeChannels { - $::settingschanged=1; - $::xs1->XMLout($::channels, RootName => 'channels', KeyAttr => ['id'], NumericEscape => 2) > io("$::cset/channels.xml"); -} - -sub writeUsers { - $::settingschanged=1; - $::xs1->XMLout($::users, RootName => 'people', KeyAttr => ['id']) > io("$::cset/users.xml"); -} - -sub writeSettings { - $::settingschanged=1; - $::xs1->XMLout($::settings, RootName => 'settings', - GroupTags => { altnicks => 'altnick', server => 'host', autojoins => 'autojoin' }, NoAttr => 1) > io("$::cset/settings.xml"); -} - -sub writeRestrictions { - $::settingschanged=1; - $::xs1->XMLout($::restrictions, RootName => 'restrictions', KeyAttr => ['id'], - GroupTags => { hosts => "host", nicks => "nick", accounts => "account"}) > io("$::cset/restrictions.xml"); -} - -sub writeBlacklist { - $::settingschanged=1; - $::xs1->XMLout($::blacklist, RootName => 'blacklist', KeyAttr => ['id'], NumericEscape => 2) > io("$::cset/blacklist.xml"); -} - -return 1; -# vim: ts=2:sts=2:sw=2:expandtab |
