diff options
author | Yorhel <git@yorhel.nl> | 2009-11-08 15:00:27 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-11-08 15:00:27 +0100 |
commit | edfd4d26db8e8157538fe166def8409fe0ef2345 (patch) | |
tree | ee28eac9645e03688050355de0fde6f29e419386 /lib/Multi/IRC.pm | |
parent | 66a00f986ef00c375187d61e34a7f145410f8f32 (diff) |
Multi::API/IRC: Added runtime API admin/monitoring interface
+ some runtime statistics
+ IP ban list (which is likely unnecessary, but you never know...)
Diffstat (limited to 'lib/Multi/IRC.pm')
-rw-r--r-- | lib/Multi/IRC.pm | 61 |
1 files changed, 48 insertions, 13 deletions
diff --git a/lib/Multi/IRC.pm b/lib/Multi/IRC.pm index 359e8e4b..9f792d54 100644 --- a/lib/Multi/IRC.pm +++ b/lib/Multi/IRC.pm @@ -51,7 +51,7 @@ sub spawn { _start shutdown throttle_gc irc_001 irc_public irc_ctcp_action irc_msg command idlequote reply notify_init notify notify_result cmd_info cmd_list cmd_uptime cmd_vn cmd_vn_results cmd_p cmd_p_results cmd_quote cmd_quote_result - cmd_say cmd_me cmd_notifications cmd_eval cmd_die cmd_post vndbid formatid + cmd_say cmd_me cmd_notifications cmd_eval cmd_die cmd_post cmd_api vndbid formatid |], ], heap => { @@ -77,6 +77,7 @@ sub spawn { eval => 2|8, die => 2|8, post => 2|8, + api => 2|8, }, } ); @@ -107,6 +108,17 @@ sub throttle { return 0; } +sub age { + return '-' if !$_[0]; + my $d = int $_[0] / 86400; + $_[0] %= 86400; + my $h = int $_[0] / 3600; + $_[0] %= 3600; + my $m = int $_[0] / 60; + $_[0] %= 60; + return sprintf '%s%02d:%02d:%02d', $d ? $d.' day'.($d>1?'s':'').', ' : '', $h, $m, int $_[0]; +} + sub _start { $_[KERNEL]->alias_set('irc'); @@ -323,23 +335,12 @@ sub cmd_list { sub cmd_uptime { - my $age = sub { - return '...down!?' if !$_[0]; - my $d = int $_[0] / 86400; - $_[0] %= 86400; - my $h = int $_[0] / 3600; - $_[0] %= 3600; - my $m = int $_[0] / 60; - $_[0] %= 60; - return sprintf '%s%02d:%02d:%02d', $d ? $d.' day'.($d>1?'s':'').', ' : '', $h, $m, int $_[0]; - }; - open my $R, '<', '/proc/uptime'; my $server = <$R> =~ /^\s*([0-9]+)/ ? $1 : 0; close $R; my $multi = time - $^T; - $_[KERNEL]->yield(reply => $_[DEST], sprintf 'Server uptime: %s -- mine: %s', $age->($server), $age->($multi)); + $_[KERNEL]->yield(reply => $_[DEST], sprintf 'Server uptime: %s -- mine: %s', age($server), age($multi)); } @@ -457,6 +458,40 @@ sub cmd_post { } +sub cmd_api { + my($cmd, @arg) = split /\s+/, $_[ARG]||''; + return $_[KERNEL]->yield(reply => $_[DEST], 'API module not enabled.') + if !defined $_[KERNEL]->alias_resolve('api'); + + if(!$cmd) { + my $stats = $_[KERNEL]->call(api => admin => 'stats'); + return $_[KERNEL]->yield(reply => $_[DEST], sprintf + 'API up %s, %d connects (%d online), %d commands (%d errors).', + age(time - $^T), $stats->{conn}, $stats->{online}, $stats->{cmds}, $stats->{cmd_err}); + } + if($cmd eq 'list') { + my $lst = $_[KERNEL]->call(api => admin => 'list'); + return $_[KERNEL]->yield(reply => $_[DEST], 'Nobody connected.') if !@$lst; + $_[KERNEL]->yield(reply => $_[DEST], sprintf '%3d %15s %s%s', $_->{id}, $_->{ip}, age(time-$_->{connected}), + !$_->{username} ? '' : sprintf ' - %s (%s %s) C/E: %d/%d T: %.2f/%.2f', $_->{username}, + $_->{client}, $_->{clientver}, $_->{cmds}, $_->{cmd_err}, $_->{t_cmd}, $_->{t_sql}) + for (sort { $a->{ip} cmp $b->{ip} } @$lst); + } + if($cmd eq 'bans') { + my $lst = $_[KERNEL]->call(api => admin => 'bans'); + return $_[KERNEL]->yield(reply => $_[DEST], !@$lst ? 'Ban list empty.' : join ' ', sort @$lst); + } + if($cmd eq 'ban') { + $_[KERNEL]->call(api => admin => ban => $arg[0]); + return $_[KERNEL]->yield(reply => $_[DEST], 'IP banned'); + } + if($cmd eq 'unban') { + $_[KERNEL]->call(api => admin => unban => $arg[0]); + return $_[KERNEL]->yield(reply => $_[DEST], 'IP unbanned'); + } +} + + # |