package ninac ; use strict ; use vars qw($ninaccmd) ; use File::Basename ; use File::stat ; use Carp ; # Utility functions to manipulate ninaccmd input/output $ninac::ninaccmd = "/usr/bin/ninaccmd" ; sub ninac_setvar { my $name = shift ; my $value = shift ; my $timestamp = int(shift) || '' ; my $cmd = "$ninaccmd setvar '$name' '$value' $timestamp" ; system($cmd) and croak("Error running $cmd: $?") ; } sub ninac_unsetvar { my $name = shift ; my $cmd = "$ninaccmd unsetvar '$name'" ; system($cmd) and croak("Error running $cmd: $?") ; } sub ninac_setstate { my $name = shift ; my $value = shift ; my $timestamp = int(shift) || '' ; return ninac_setvar("state.$name", 1, $timestamp) ; } sub ninac_unsetstate { my $name = shift ; my $value = shift ; return ninac_unsetvar("state.$name") ; } sub ninac_getvar { my $name = shift ; my $cmd = "$ninaccmd getvar '$name'" ; my $out = `$cmd` ; croak("Error running $cmd: $?") if $? ; chomp($out) ; return $out ; } sub ninac_getvars { my $name_filter = shift ; my $cmd = "$ninaccmd dumpvars" ; open(NINACCMD, "$cmd |") or croak("Error running $cmd: $?") ; my %ret = () ; while (){ my $line = $_ ; chomp($line) ; $line =~ s/^\s+// ; $line =~ s/\s+$// ; if ($line =~ /^([\w-.]+)=\"(.*?)\"\s+(\d+)$/){ my $name = $1 ; my $value = $2 ; my $timestamp = $3 ; next if ((defined($name_filter))&&($name !~ $name_filter)) ; $ret{$name} = {value => $value, timestamp => $timestamp} ; } else { carp("Can't parse ninaccmd dumpvars output line '$line' !?") ; } } close(NINACCMD) ; return \%ret ; } sub ninac_gettasks { my $task_filter = shift ; my $target_filter = shift ; my $cmd = "$ninaccmd listtask" ; open(NINACCMD, "$cmd |") or croak("Error running $cmd: $?") ; my %ret = () ; while (){ my $line = $_ ; chomp($line) ; $line =~ s/^\s+// ; $line =~ s/\s+$// ; my ($task, $target, @conds) = split(/\s+/, $line) ; # Remove quotes around conditions. @conds = map { $_ =~ s/^["']// ; $_ =~ s/["']$// ; $_ } @conds ; next if ((defined($task_filter))&&($task !~ $task_filter)) ; next if ((defined($target_filter))&&($target !~ $target_filter)) ; $ret{$task}->{$target} = \@conds ; } close(NINACCMD) ; return \%ret ; } sub ninac_solver { my $cmd = "$ninaccmd solver" ; system($cmd) and croak("Error running $cmd: $?") ; } 1 ;