spider/perl/convert_users.pl

156 lines
2.2 KiB
Perl
Raw Normal View History

#!/usr/bin/perl
#
# Export the user file in a form that can be directly imported
# back with a do statement
#
require 5.004;
# 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";
}
use DXVars;
use DB_File;
use Fcntl;
use Carp;
$userfn = $ARGV[0] if @ARGV;
unless ($userfn) {
croak "need a filename";
}
DXUser->init($userfn);
unlink "$userfn.asc";
open OUT, ">$userfn.asc" or die;
%newu = ();
$t = scalar localtime;
print OUT "#!/usr/bin/perl
#
# The exported userfile for a DXSpider System
#
# Input file: $userfn
# Time: $t
#
package DXUser;
%u = (
";
@all = DXUser::get_all_calls();
for $a (@all) {
my $ref = DXUser->get($a);
my $s = $ref->encode() if $ref;
print OUT "'$a' => q{$s},\n" if $a;
$count++;
}
DXUser->finish();
print OUT ");
#
# there were $count records
#\n";
close(OUT);
exit(0);
package DXUser;
use MLDBM qw(DB_File);
use Fcntl;
use Carp;
#
# initialise the system
#
sub init
{
my ($pkg, $fn, $mode) = @_;
confess "need a filename in User" if !$fn;
if ($mode) {
$dbm = tie (%u, MLDBM, $fn, O_CREAT|O_RDWR, 0666) or confess "can't open user file: $fn ($!)";
} else {
$dbm = tie (%u, MLDBM, $fn, O_RDONLY) or confess "can't open user file: $fn ($!)";
}
$filename = $fn;
}
#
# close the system
#
sub finish
{
untie %u;
}
#
# get - get an existing user - this seems to return a different reference everytime it is
# called - see below
#
sub get
{
my $pkg = shift;
my $call = uc shift;
# $call =~ s/-\d+$//o; # strip ssid
return $u{$call};
}
#
# get all callsigns in the database
#
sub get_all_calls
{
return (sort keys %u);
}
#
# create a string from a user reference
#
sub encode
{
my $self = shift;
my $out;
my $f;
$out = "bless( { ";
for $f (sort keys %$self) {
my $val = $$self{$f};
if (ref $val) { # it's an array (we think)
$out .= "'$f'=>[ ";
foreach (@$val) {
my $s = $_;
$out .= "'$s',";
}
$out .= " ],";
} else {
$val =~ s/'/\\'/og;
$val =~ s/\@/\\@/og;
$out .= "'$f'=>'$val',";
}
}
$out .= " }, 'DXUser')";
return $out;
}