X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXCluster.pm;h=09001b2070c10a613aa5c68886457b9def4c6a86;hb=fa57f72c26032aae4c1a20358e829ba9afbf460c;hp=2b412cd3844ff64cd5b06b80f3e68b59ef08b2ca;hpb=b2e4d1c7378cfd98bd8cdf9304c2bd6e5d4b802c;p=spider.git diff --git a/perl/DXCluster.pm b/perl/DXCluster.pm index 2b412cd3..09001b20 100644 --- a/perl/DXCluster.pm +++ b/perl/DXCluster.pm @@ -16,28 +16,78 @@ package DXCluster; use Exporter; @ISA = qw(Exporter); +use DXDebug; +use Carp; + +use strict; +use vars qw(%cluster %valid); %cluster = (); # this is where we store the dxcluster database +%valid = ( + mynode => '0,Parent Node,showcall', + call => '0,Callsign', + confmode => '0,Conference Mode,yesno', + here => '0,Here?,yesno', + dxchan => '5,Channel ref', + pcversion => '5,Node Version', + list => '5,User List,dolist', + users => '0,No of Users', +); + sub alloc { - my ($pkg, $call, $confmode, $here, $dxprot) = @_; + my ($pkg, $dxchan, $call, $confmode, $here) = @_; die "$call is already alloced" if $cluster{$call}; my $self = {}; $self->{call} = $call; $self->{confmode} = $confmode; $self->{here} = $here; - $self->{dxprot} = $dxprot; + $self->{dxchan} = $dxchan; $cluster{$call} = bless $self, $pkg; return $self; } +# get an entry exactly as it is +sub get_exact +{ + my ($pkg, $call) = @_; + + # belt and braces + $call = uc $call; + + # search for 'as is' only + return $cluster{$call}; +} + +# # search for a call in the cluster +# taking into account SSIDs +# sub get { my ($pkg, $call) = @_; - return $cluster{$call}; + + # belt and braces + $call = uc $call; + + # search for 'as is' + my $ref = $cluster{$call}; + return $ref if $ref; + + # search for the unSSIDed one + $call =~ s/-\d+$//o; + $ref = $cluster{$call}; + return $ref if $ref; + + # search for the SSIDed one + my $i; + for ($i = 1; $i < 17; $i++) { + $ref = $cluster{"$call-$i"}; + return $ref if $ref; + } + return undef; } # get all @@ -46,21 +96,53 @@ sub get_all return values(%cluster); } -sub delcluster; +# return a prompt for a field +sub field_prompt +{ + my ($self, $ele) = @_; + return $valid{$ele}; +} + +# this expects a reference to a list in a node NOT a ref to a node +sub dolist { my $self = shift; - delete $cluster{$self->{call}}; + my $out; + my $ref; + + foreach $ref (@{$self}) { + my $s = $ref->{call}; + $s = "($s)" if !$ref->{here}; + $out .= "$s "; + } + chop $out; + return $out; } -%valid = ( - mynode => 'Parent Node', - call => 'Callsign', - confmode => 'Conference Mode', - here => 'Here?', - dxprot => 'Channel ref', - version => 'Node Version', -); +# this expects a reference to a node +sub showcall +{ + my $self = shift; + return $self->{call}; +} + +# the answer required by show/cluster +sub cluster +{ + my $users = DXCommandmode::get_all(); + my $uptime = main::uptime(); + my $tot = $DXNode::users + 1; + + return " $DXNode::nodes nodes, $users local / $tot total users Max users $DXNode::maxusers Uptime $uptime"; +} +sub DESTROY +{ + my $self = shift; + dbg('cluster', "destroying $self->{call}\n"); +} + +no strict; sub AUTOLOAD { my $self = shift; @@ -69,7 +151,7 @@ sub AUTOLOAD return if $name =~ /::DESTROY$/; $name =~ s/.*:://o; - die "Non-existant field '$AUTOLOAD'" if !$valid{$name}; + confess "Non-existant field '$AUTOLOAD'" if !$valid{$name}; @_ ? $self->{$name} = shift : $self->{$name} ; } @@ -77,34 +159,47 @@ sub AUTOLOAD # USER special routines # -package DXUser; +package DXNodeuser; @ISA = qw(DXCluster); -%users = (); +use DXDebug; + +use strict; sub new { - my ($pkg, $mynode, $call, $confmode, $here, $dxprot) = @_; - my $self = $pkg->alloc($call, $confmode, $here, $dxprot); - $self->{mynode} = $mynode; + my ($pkg, $dxchan, $node, $call, $confmode, $here) = @_; - $users{$call} = $self; + die "tried to add $call when it already exists" if DXCluster->get_exact($call); + + my $self = $pkg->alloc($dxchan, $call, $confmode, $here); + $self->{mynode} = $node; + $node->{list}->{$call} = $self; # add this user to the list on this node + dbg('cluster', "allocating user $call to $node->{call} in cluster\n"); + $node->update_users; return $self; } -sub delete +sub del { my $self = shift; - $self->delcluster(); # out of the whole cluster table - delete $users{$self->{call}}; # out of the users table + my $call = $self->{call}; + my $node = $self->{mynode}; + + delete $node->{list}->{$call}; + delete $DXCluster::cluster{$call}; # remove me from the cluster table + dbg('cluster', "deleting user $call from $node->{call} in cluster\n"); + $node->update_users; } sub count { - return %users + 1; # + 1 for ME (naf eh!) + return $DXNode::users; # + 1 for ME (naf eh!) } +no strict; + # # NODE special routines # @@ -113,47 +208,75 @@ package DXNode; @ISA = qw(DXCluster); -%nodes = (); +use DXDebug; + +use strict; +use vars qw($nodes $users $maxusers); + +$nodes = 0; +$users = 0; +$maxusers = 0; + sub new { - my ($pkg, $call, $confmode, $here, $version, $dxprot) = @_; - my $self = $pkg->alloc($call, $confmode, $here, $dxprot); - $self->{version} = $version; - $nodes{$call} = $self; + my ($pkg, $dxchan, $call, $confmode, $here, $pcversion) = @_; + my $self = $pkg->alloc($dxchan, $call, $confmode, $here); + $self->{pcversion} = $pcversion; + $self->{list} = { } ; + $nodes++; + dbg('cluster', "allocating node $call to cluster\n"); return $self; } -# get a node -sub get -{ - my ($pkg, $call) = @_; - return $nodes{$call}; -} - # get all the nodes sub get_all { my $list; my @out; - foreach $list (values(%nodes)) { - push @out, $list if $list->{version}; + foreach $list (values(%DXCluster::cluster)) { + push @out, $list if $list->{pcversion}; } return @out; } -sub delete +sub del { my $self = shift; - my $call = $self->call; - - DXUser->delete($call); # delete all the users one this node - delete $nodes{$call}; + my $call = $self->{call}; + my $ref; + + # delete all the listed calls + foreach $ref (values %{$self->{list}}) { + $ref->del(); # this also takes them out of this list + } + delete $DXCluster::cluster{$call}; # remove me from the cluster table + dbg('cluster', "deleting node $call from cluster\n"); + $nodes-- if $nodes > 0; +} + +sub update_users +{ + my $self = shift; + my $count = shift; + $users -= $self->{users}; + if ((keys %{$self->{list}})) { + $self->{users} = (keys %{$self->{list}}); + } else { + $self->{users} = $count; + } + $users += $self->{users}; + $maxusers = $users+$nodes if $users+$nodes > $maxusers; } sub count { - return %nodes + 1; # + 1 for ME! + return $nodes; # + 1 for ME! +} + +sub dolist +{ + } 1; __END__