#! /usr/bin/perl
#
# us_adm - User Administration
#
# Last Change: Fri Nov 20 11:13:44 GMT 1998

$debug = 0;

require "getopts.pl";

$db_name = "clx_db";
$tab="us_data";
$psql ="psql -d $db_name -qtc";
$prog = (split(/\//,$0))[-1];

$us_perm = "";
$perm = "";
$msg_stp = "";
$us_name = "";
$us_qth = "";
$us_page = "";

$change = 0;
$newuser = 0;
$verbose = 0;

%attrib = ( 1,"login_denied",
            2,"priority_login",
            4,"login_ignored",
            8,"admin",
            16,"superuser" );

$rc = system("$psql \"\\q\" > /dev/null 2>&1");
if ($rc != 0) {
	die "$prog: The postmaster is not running (rc=$rc).\n";
} else {
	print "Postmaster is running (rc=$rc)\n" if $debug;
}

&Getopts('c:d:e:l:L:n:p:q:s:x:v');

if (length($opt_p) > 0) {
    $s_perm = $opt_p;
    $change = 1;
}

if (length($opt_d) > 0) {
    $us_perm = $opt_d;
    $change = 1;
}

if (length($opt_n) > 0) {
    $us_name = $opt_n;
    $change = 1;
}

if (length($opt_q) > 0) {
    $us_qth = $opt_q;
    $change = 1;
}

if (length($opt_L) > 0) {
    $us_loc = $opt_L;
    $change = 1;
}

if (length($opt_x) > 0) {
    $msg_stp = $opt_x;
    $change = 1;
}

if (length($opt_l) > 0) {
    $us_page = $opt_l;
    $change = 1;
}

if (length($opt_c) > 0) {
    $us_cset = $opt_c;
    $change = 1;
}

if (length($opt_s) > 0) {
    $us_lang = $opt_s;
    $change = 1;
}

if (length($opt_v) > 0) {
    $verbose = 1;
}

if (length($opt_e) > 0) {
    $call = $opt_e;
    $change = 0;
    &erase_user($call);
    &lookup($call);
    exit 0;
}

if ($debug == 1) {
    print "msg_stp: $msg_stp\n";
    print "s_perm: $s_perm\n";
    print "us_perm: $us_perm\n";
    print "us_qth: $us_qth\n";
    print "us_loc: $us_loc\n";
    print "msg_stp: $msg_stp\n";
    print "us_page: $us_page\n";

    print "ARGV: $#ARGV\n";
}

if ($#ARGV == -1) {
print <<NNNN;
Usage: us_adm -Options <call-SSID>

Option   Parameter                             DB field
-----------------------------------------------------------
-p       Permissions                           ssid_p[]
-d       Default Permission Flag               us_perm
-x       exit string                           msg_stp
-q       QTH                                   us_qth
-L       Location (deg min N/S deg min E/W)    uc_loc
-n       Name                                  us_name
-l       Page Length                           us_page
-c       Character Set                         us_cset
-s       Language                              us_lang
-e       erase entry                           <all>

NNNN
print "Permission Flags\n";
foreach $i (keys %attrib) {
    printf("%2s : %s\n",$i,$attrib{$i});
}
print "\n";
exit(1);
}

foreach $arg (@ARGV) {
    if (split('-',$arg) == 2) {$ssid = "@_[1]"} else {$ssid = "0"};
    die "SSID must be between 0..16" if ($ssid > 16);
    $call = @_[0];

    &lookup($call);
    if ( $change == 0 && $newuser == 0 ) {
        &print_info();
    }
    else {
        if ( $newuser == 1 ) { &create_newuser($call); &lookup($call); }
        @lookup_perm[$ssid] = $s_perm if ("$s_perm");
        $ssid_p = join(" ",@lookup_perm);
        $us_name = $lookup_us_name if (length($us_name)==0);
        $us_qth = $lookup_us_qth if (length($us_qth)==0);
        $us_loc = $lookup_us_loc if (length($us_loc)==0);
        $msg_stp = $lookup_msg_stp if (length($msg_stp)==0);
        $us_perm = $lookup_us_perm if (length($us_perm)==0);
        $us_page = $lookup_us_page if (length($us_page)==0);
        $us_lang = $lookup_us_lang if (length($us_lang)==0);
        $us_cset = $lookup_us_cset if (length($us_cset)==0);
        $db_cmd = sprintf("set
			us_name='%s',
			us_qth='%s', 
			us_loc='%s', 
			msg_stp='%s',
			us_perm='%s',
			us_page='%s',
			us_lang='%s',
			us_cset='%s',
			ssid_p='%s'",
			$us_name,$us_qth,$us_loc,$msg_stp,$us_perm,$us_page,$us_lang,$us_cset,$ssid_p);
        $cmd="update us_data $db_cmd where us_call='$call'\;";

        if ($debug == 1) { 
            print "$cmd\n";
        }

        system "$psql  \"$cmd\"";
	
        &lookup($call);
        &print_info() if ($verbose != 0);
    }
}





sub lookup {
local($call) = @_;


$cmd = "select * from $tab where us_call='$call'\;";

if ($debug == 1) { 
    print "$cmd\n";
    system "$psql \"$cmd\" | sed -n \"1p\" "; 
}

open(IN,"$psql \"$cmd\" | sed -n \"1p\" |");
while (<IN>) {

    ($lookup_us_call, 
     $lookup_us_name, 
     $lookup_us_loc, 
     $lookup_us_qth, 
     $lookup_us_page, 
     $lookup_us_flag, 
     $lookup_us_perm, 
     $lookup_ssid_p,
     $lookup_us_addr,
     $lookup_f_login,
     $lookup_l_login,
     $lookup_msg_stp, 
     $lookup_l_dir, 
     $lookup_us_lang, 
     $lookup_us_cset,
     $lookup_dx_filt) = split('\|'); 

     #
     # remove the \n of the last field, currently $lookup_dx_filt
     #
     chop($lookup_dx_filt);

}
close IN; 

$lookup_us_call =~ s/^ *| *$//g;
$lookup_us_name =~ s/^ *| *$//g;
$lookup_us_loc =~ s/^ *| *$//g;
$lookup_us_qth =~ s/^ *| *$//g;
$lookup_us_perm =~ s/^ *| *$//g;
$lookup_msg_stp =~ s/^ *| *$//g;
$lookup_us_page =~ s/^ *| *$//g;
$lookup_us_lang =~ s/^ *| *$//g;
$lookup_us_cset =~ s/^ *| *$//g;
$lookup_dx_filt =~ s/^ *| *$//g;

if ($debug == 1) {
    print "lookup_us_call=|$lookup_us_call|\n";
    print "lookup_us_qth=|$lookup_us_qth|\n";
    print "lookup_us_loc=|$lookup_us_loc|\n";
    print "lookup_dx_filt=|$lookup_dx_filt|\n";
    print "call=|$call|\n";
}

if ( $lookup_us_call eq $call ) {
     @lookup_perm = split(' ',$lookup_ssid_p);

     if ( @lookup_perm[$ssid] == -1 ) {
         $perm=$lookup_us_perm 
     }
     else {
         $perm=@lookup_perm[$ssid]
     }

     $rights="";
     if ($perm == 0) {$rights="[default]"}
     else { 
         for $i (1,2,4,8,16) {
             $res = $perm & $i;
             if ($res != "0") {$rights = "$rights$attrib{$i} "}

             if ($debug == 1) {
                          print "$perm & $i = $res : $attrib{$i}\n";
             }
         }
         $rights =~ s/ $//;
     }
}
else {
    $newuser = 1;
    print "*** $call not in database.\n";
}
}

sub print_info {

($print_us_name,$print_us_loc,$print_us_qth,$print_f_login,
 $print_l_login,$print_us_page,$print_us_lang,$print_us_cset,
 $print_msg_stp,$print_us_addr,$print_dx_filt) =
($lookup_us_name,$lookup_us_loc,$lookup_us_qth,$lookup_f_login,
 $lookup_l_login,$lookup_us_page,$lookup_us_lang,$lookup_us_cset,
 $lookup_msg_stp,$lookup_us_addr,$lookup_dx_filt);

if ($lookup_us_name eq "") {$print_us_name="[not set]"}
if ($lookup_us_page eq "") {$print_us_page="[default]"}
if ($lookup_us_qth eq "") {$print_us_qth="[not set]"}
if ($lookup_us_loc eq "") {$print_us_loc="[not set]"}
if ($lookup_msg_stp eq "") {$print_msg_stp="[default]"}
if ($lookup_us_addr eq "") {$print_us_addr="[not set]"}
if ($lookup_us_lang eq "") {$print_us_lang="[default]"}
if ($lookup_us_cset eq "") {$print_us_cset="[default]"}

print <<NNNN;

User Information for Station $call
        
               Name: $print_us_name                
           Location: $print_us_loc
                QTH: $print_us_qth
        First login: $print_f_login              
         Last login: $print_l_login

         Pagelength: $print_us_page
           Language: $print_us_lang
      Character Set: $print_us_cset
        Exit string: $print_msg_stp
            Address: $print_us_addr
          DX-Filter: $print_dx_filt

SSID-Permission Flags
---------------------------------------------------------------
       SSID:  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
Permissions: $lookup_ssid_p
---------------------------------------------------------------

Default Permission: $lookup_us_perm    Flag for $call-$ssid: @lookup_perm[$ssid] $rights

NNNN
}

sub create_newuser {
local($call) = @_;

$db_cmd = sprintf("(us_call, us_name, f_login, l_login, ssid_p, us_perm, dx_filt) 
		values ('%s','om','now','now','-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1','0','0')",$call);
$cmd="insert into $tab $db_cmd\;";

if ($debug == 1) { 
        print "$cmd\n";
}

system "$psql \"$cmd\"";
print "*** $call added to database.\n";
}

sub erase_user {
local($call) = @_;

$cmd=sprintf("delete from $tab where (us_call='%s')\;",$call);

if ($debug == 1) { 
        print "$cmd\n";
}

system "$psql \"$cmd\"";
print "*** $call deleted from database.\n";
}
