X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FScript.pm;h=05f408eca6daa26e82289de97da5ac29233e7e6c;hb=b9dffeff7239952814342dad19db3a51def6fab7;hp=15f4d464082fa080766f46eabb05edc0b39a44c3;hpb=dbf7523a9b228dbdf1d03109afde351b8b194fab;p=spider.git diff --git a/perl/Script.pm b/perl/Script.pm index 15f4d464..05f408ec 100644 --- a/perl/Script.pm +++ b/perl/Script.pm @@ -17,23 +17,34 @@ use DXCommandmode; use DXVars; use IO::File; -use vars qw($VERSION $BRANCH); -$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); -$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); -$main::build += $VERSION; -$main::branch += $BRANCH; - my $base = "$main::root/scripts"; +sub clean +{ + my $s = shift; + $s =~ s/[^-\w\.]//g; + return $s; +} + sub new { my $pkg = shift; - my $script = shift; - my $fn = "$base/$script"; + my $script = clean(shift); + my $mybase = shift || $base; + my $fn = "$mybase/$script"; - my $fh = new IO::File $fn; - return undef unless $fh; - my $self = bless {call => $script}, $pkg; + my $self = {call => $script}; + my $fh = IO::File->new($fn); + if ($fh) { + $self->{fn} = $fn; + } else { + $fh = IO::File->new(lc $fn); + if ($fh) { + $self->{fn} = $fn; + } else { + return undef; + } + } my @lines; while (<$fh>) { chomp; @@ -41,21 +52,71 @@ sub new } $fh->close; $self->{lines} = \@lines; - return $self; + $self->{inscript} = 1; + return bless $self, $pkg; } sub run { my $self = shift; my $dxchan = shift; + my $return_output = shift; + my @out; + foreach my $l (@{$self->{lines}}) { unless ($l =~ /^\s*\#/ || $l =~ /^\s*$/) { - my @out = DXCommandmode::run_cmd($dxchan, $l); - if ($dxchan->can('send_ans')) { - $dxchan->send_ans(@out); - } else { - dbg($_) for @out; - } + $dxchan->inscript(1) if $self->{inscript}; + push @out, DXCommandmode::run_cmd($dxchan, $l); + $dxchan->inscript(0) if $self->{inscript}; + last if @out && $l =~ /^pri?v?/i; } } + if ($return_output) { + return @out; + } else { + if ($dxchan->can('send_ans')) { + $dxchan->send_ans(@out); + } else { + dbg($_) for @out; + } + } + return (); +} + +sub inscript +{ + my $self = shift; + $self->{inscript} = shift if @_; + return $self->{inscript}; +} + +sub store +{ + my $call = clean(lc shift); + my @out; + my $ref = ref $_[0] ? shift : \@_; + my $count; + my $fn = "$base/$call"; + + rename $fn, "$fn.o" if -e $fn; + my $f = IO::File->new(">$fn") || return undef; + for (@$ref) { + $f->print("$_\n"); + $count++; + } + $f->close; + unlink $fn unless $count; + return $count; +} + +sub lines +{ + my $self = shift; + return @{$self->{lines}}; +} + +sub erase +{ + my $self = shift; + unlink $self->{fn}; }