X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXUser.pm;h=f16494f91c9361c41813878ed9705d0aff533bbb;hb=579810d363939640538f88a9caa86e01fe9c7709;hp=eaf880392c26e880198220c5fd7437ec53d3ea47;hpb=3f1c5ab45aa13e99da6bea0bfcc6d4434beb5871;p=spider.git diff --git a/perl/DXUser.pm b/perl/DXUser.pm index eaf88039..f16494f9 100644 --- a/perl/DXUser.pm +++ b/perl/DXUser.pm @@ -16,6 +16,13 @@ use IO::File; use DXDebug; use strict; + +use vars qw($VERSION $BRANCH); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$main::build += $VERSION; +$main::branch += $BRANCH; + use vars qw(%u $dbm $filename %valid $lastoperinterval $lasttime); %u = (); @@ -36,7 +43,7 @@ $lasttime = 0; email => '0,E-mail Address', priv => '9,Privilege Level', lastin => '0,Last Time in,cldatetime', - passwd => '9,Password', + passwd => '9,Password,yesno', addr => '0,Full Address', 'sort' => '0,Type of User', # A - ak1a, U - User, S - spider cluster, B - BBS xpert => '0,Expert Status,yesno', @@ -46,7 +53,6 @@ $lasttime = 0; lockout => '9,Locked out?,yesno', # won't let them in at all dxok => '9,Accept DX Spots?,yesno', # accept his dx spots? annok => '9,Accept Announces?,yesno', # accept his announces? - reg => '0,Registered?,yesno', # is this user registered? lang => '0,Language', hmsgno => '0,Highest Msgno', group => '0,Access Group,parray', # used to create a group of users/nodes for some purpose or other @@ -63,8 +69,11 @@ $lasttime = 0; pingint => '9,Node Ping interval', nopings => '9,Ping Obs Count', wantlogininfo => '9,Login info req,yesno', - wantgrid => '0,DX Grid Info,yesno', + wantgrid => '0,DX Grid Info,yesno', + wantann_talk => '0,Talklike Anns,yesno', lastoper => '9,Last for/oper,cldatetime', + nothere => '0,Not Here Text', + registered => '9,Registered?,yesno', ); no strict; @@ -77,12 +86,17 @@ sub AUTOLOAD $name =~ s/.*:://o; confess "Non-existant field '$AUTOLOAD'" if !$valid{$name}; + # this clever line of code creates a subroutine which takes over from autoload + # from OO Perl - Conway + *{$AUTOLOAD} = sub {@_ > 1 ? $_[0]->{$name} = $_[1] : $_[0]->{$name}} ; if (@_) { $self->{$name} = shift; } return $self->{$name}; } +use strict; + # # initialise the system # @@ -103,15 +117,13 @@ sub init sub del_file { - my ($pkg, $fn, $mode) = @_; + my ($pkg, $fn) = @_; confess "need a filename in User" if !$fn; $fn .= ".v2"; unlink $fn; } -use strict; - # # periodic processing # @@ -209,9 +221,10 @@ sub put confess "Trying to put nothing!" unless $self && ref $self; my $call = $self->{call}; # delete all instances of this - for ($dbm->get_dup($call)) { - $dbm->del_dup($call, $_); - } +# for ($dbm->get_dup($call)) { +# $dbm->del_dup($call, $_); +# } + $dbm->del($call); delete $self->{annok} if $self->{annok}; delete $self->{dxok} if $self->{dxok}; $dbm->put($call, $self->encode); @@ -239,8 +252,8 @@ sub decode my $ref; eval '$ref = ' . $s; if ($@) { - dbg('err', $@) if $@; - Log('err', $@) if $@; + dbg($@); + Log('err', $@); $ref = undef; } return $ref; @@ -255,9 +268,10 @@ sub del my $self = shift; my $call = $self->{call}; # delete all instances of this - for ($dbm->get_dup($call)) { - $dbm->del_dup($call, $_); - } +# for ($dbm->get_dup($call)) { +# $dbm->del_dup($call, $_); +# } + $dbm->del($call); } # @@ -308,30 +322,67 @@ 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 # # Input file: $filename # 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.lck"; # 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"; + for ($action = R_FIRST; !$dbm->seq($key, $ref, $action); $action = R_NEXT) { + print $fh "'$key' => q{$ref},\n"; ++$count; } - print $fh ");\n#\n# there were $count records\n#\n"; - $fh->close; - } + print $fh ");\n#\nprint \"there were $count records\\n\";\n#\n"; + print $fh "DXUser->sync; DXUser->finish;\n#\n"; + $fh->close; + } return $count; } @@ -469,12 +520,17 @@ sub wantgrid return _want('grid', @_); } +sub wantann_talk +{ + return _want('ann_talk', @_); +} + sub wantlogininfo { my $self = shift; - my $n = shift; - $self->{wantlogininfo} = $n if $n; - return exists $self->{wantlogininfo} ? $self->{wantlogininfo} : 0; + my $val = shift; + $self->{wantlogininfo} = $val if defined $val; + return $self->{wantlogininfo}; } sub is_node