X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXUser.pm;h=ce26c291c7919a1b0874c709b09f1f53ddc918f2;hb=79f4593964c44fb39faf9d070a418125e90e1333;hp=2bd140348cf1994163ace77be621310475c0c0fd;hpb=6c38bca91e6b75002e15cce29c45a894f675e22e;p=spider.git diff --git a/perl/DXUser.pm b/perl/DXUser.pm index 2bd14034..ce26c291 100644 --- a/perl/DXUser.pm +++ b/perl/DXUser.pm @@ -8,9 +8,6 @@ package DXUser; -require Exporter; -@ISA = qw(Exporter); - use DXLog; use DB_File; use Data::Dumper; @@ -19,11 +16,13 @@ use IO::File; use DXDebug; use strict; -use vars qw(%u $dbm $filename %valid); +use vars qw(%u $dbm $filename %valid $lastoperinterval $lasttime); %u = (); $dbm = undef; $filename = undef; +$lastoperinterval = 30*24*60*60; +$lasttime = 0; # hash of valid elements and a simple prompt %valid = ( @@ -102,8 +101,28 @@ sub init $filename = $fn; } +sub del_file +{ + my ($pkg, $fn) = @_; + + confess "need a filename in User" if !$fn; + $fn .= ".v2"; + unlink $fn; +} + use strict; +# +# periodic processing +# +sub process +{ + if ($main::systime > $lasttime + 15) { + $dbm->sync; + $lasttime = $main::systime; + } +} + # # close the system # @@ -142,18 +161,11 @@ sub get { my $pkg = shift; my $call = uc shift; - # $call =~ s/-\d+$//o; # strip ssid - my $s = $u{$call}; - return $s ? decode($s) : undef; -} - -# -# get all callsigns in the database -# - -sub get_all_calls -{ - return (sort keys %u); + my $data; + unless ($dbm->get($call, $data)) { + return decode($data); + } + return undef; } # @@ -168,11 +180,23 @@ sub get_current { my $pkg = shift; my $call = uc shift; - # $call =~ s/-\d+$//o; # strip ssid my $dxchan = DXChannel->get($call); return $dxchan->user if $dxchan; - return get($pkg, $call); + my $data; + unless ($dbm->get($call, $data)) { + return decode($data); + } + return undef; +} + +# +# get all callsigns in the database +# + +sub get_all_calls +{ + return (sort keys %u); } # @@ -190,8 +214,7 @@ sub put } delete $self->{annok} if $self->{annok}; delete $self->{dxok} if $self->{dxok}; - $u{$call} = $self->encode(); - $dbm->sync; + $dbm->put($call, $self->encode); } # @@ -214,10 +237,12 @@ sub decode { my $s = shift; my $ref; - $s = '$ref = ' . $s; - eval $s; - Log('DXUser', $@) if $@; - $ref = undef if $@; + eval '$ref = ' . $s; + if ($@) { + dbg('err', $@) if $@; + Log('err', $@) if $@; + $ref = undef; + } return $ref; } @@ -233,7 +258,6 @@ sub del for ($dbm->get_dup($call)) { $dbm->del_dup($call, $_); } - $dbm->sync; } # @@ -247,6 +271,15 @@ sub close $self->put(); } +# +# sync the database +# + +sub sync +{ + $dbm->sync; +} + # # return a list of valid elements # @@ -275,11 +308,11 @@ sub export my $count = 0; my $fh = new IO::File ">$fn" or return "cannot open $fn ($!)"; if ($fh) { - my $ref; - my $key; + my $ref = 0; + my $key = 0; my $action; my $t = scalar localtime; - print $fh "#!/usr/bin/perl + print $fh q{#!/usr/bin/perl # # The exported userfile for a DXSpider System # @@ -287,19 +320,56 @@ sub export # Time: $t # +package main; + +# search local then perl directories +BEGIN { + umask 002; + + # root of directory tree for this system + $root = "/spider"; + $root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'}; + + unshift @INC, "$root/perl"; # this IS the right way round! + unshift @INC, "$root/local"; + + # try to detect a lockfile (this isn't atomic but + # should do for now + $lockfn = "$root/perl/cluster.lock"; # lock file name + if (-e $lockfn) { + open(CLLOCK, "$lockfn") or die "Can't open Lockfile ($lockfn) $!"; + my $pid = ; + chomp $pid; + die "Lockfile ($lockfn) and process $pid exists - cluster must be stopped first\n" if kill 0, $pid; + close CLLOCK; + } +} + package DXUser; +use DXVars; +use DXUser; + +if (@ARGV) { + $main::userfn = shift @ARGV; + print "user filename now $userfn\n"; +} + +DXUser->del_file($main::userfn); +DXUser->init($main::userfn, 1); + %u = ( -"; - - for ($action = R_FIRST; !$dbm->seq($key, $ref, $action); $action = R_NEXT) { - print $fh "'$key' => $ref,\n"; - ++$count; - } - print $fh ");\n#\n# there were $count records\n#\n"; - $fh->close; - } - return $count; + }; + +for ($action = R_FIRST; !$dbm->seq($key, $ref, $action); $action = R_NEXT) { + print $fh "'$key' => q{$ref},\n"; + ++$count; +} +print $fh ");\n#\nprint \"there were $count records\\n\";\n#\n"; +print $fh "DXUser->sync; DXUser->finish;\n#\n"; +$fh->close; +} + return $count; } #