Cache::Memcached::Admin
Adminってもんでもないけど、
いちいちtelnetで話すのも面倒だしみたいな。
すげーてきとう。
package Cache::Memcached::Admin; use strict; use warnings; use base qw/Class::Accessor::Fast/; use Term::ReadLine; use File::HomeDir; use Path::Class; use List::MoreUtils qw/uniq/; use Cache::Memcached; sub run { my $self = shift; my $term = Term::ReadLine->new('Cache::Memcached::Admin'); my $HISTFILE = file( File::HomeDir->my_home, '/.memcached_admin_history'); my $HISTSIZE = 256; # this won't work with Term::ReadLine::Perl # If there is Term::ReadLine::Gnu, be sure to do : export "PERL_RL=Gnu o=0" eval { $term->stifle_history($HISTSIZE) }; if ($!) { warn 'You will need Term::ReadLine::Gnu'; } else { if ( -f $HISTFILE ) { $term->ReadHistory($HISTFILE) or warn "cannot read history file: $!"; } } while ( defined( my $line = $term->readline('memcached> ') ) ) { next if $line =~ /^\s*$/; my $ret = $self->run_hook($line); last if $ret eq 'exit'; } print "\n"; eval { $term->WriteHistory($HISTFILE) }; if (@!) { warn "perlsh: cannot write history file: $!"; } } sub run_hook { my ( $self, $cmd ) = @_; if ( $cmd =~ /^!set\s+(.+)$/ ) { $self->set_servers( $self->_ip_setting($1) ); } elsif ( $cmd =~ /^!get$/ ) { $self->get_servers; } elsif ( $cmd =~ /^!remove\s+(.+)$/ ) { $self->remove_servers( $self->_ip_setting($1) ); } elsif ( $cmd =~ /^!flush$/ ) { $self->flush_servers; } elsif ( $cmd =~ /^set\s+(.+)\s+(.+)$/ ) { $self->set_value($1,$2); } elsif ( $cmd =~ /^get\s+(.+)$/ ) { $self->get_value($1); } elsif ( $cmd =~ /^delete\s+(.+)$/ ) { $self->delete_value($1); } elsif ( $cmd =~ /^(quit|exit)$/ ) { print "see you... \n"; return 'exit'; } } sub delete_value { my ($self,$key) = @_; $self->memd->delete($key); } sub set_value { my ($self, $key, $value) = @_; $self->memd->set( $key,$value ); } sub get_value { my ($self, $key) = @_; my $value = $self->memd->get( $key ) || ''; print "$value\n"; } sub _ip_setting { my ($self, $ip) = @_; my $fullip = $ip =~ /.+:\d+$/ ? $ip : "$ip:11211"; return $fullip } sub flush_servers { my $self = shift; $self->memd->set_servers([]); } sub get_servers { my $self = shift; my $servers = $self->memd->{servers} || []; print "server settings----\n"; print "$_\n" for @{$servers}; } sub set_servers { my ($self, $server) = @_; my $servers = $self->memd->{servers} || []; push @{$servers},$server; my @new_servers = uniq @{$servers}; $self->memd->set_servers(\@new_servers); } sub remove_servers { my ($self, $server) = @_; my @new_servers = grep { $_ ne $server } @{$self->memd->{servers} || []}; $self->memd->set_servers(\@new_servers); } sub memd { my $self = shift; $self->{_memd} ||= Cache::Memcached->new; } 1;
本当はSwitch.pm使いたかったけど、正規表現の部分をごりっと抜き出せないからやめた。
ほんとできないのかな?