#!/usr/bin/perl
# Allow users of group "arb" to add pt_server entries
# Andreas Tille <tille@debian.org>
# License: GPL

use warnings;
use strict;
use POSIX;

my $group2seek = "arb" ;
my $seekgroup = getgrnam($group2seek) ;
my @PTServerLines = () ;
my %PTEntry;
my $PTServerDir = "/var/lib/arb/pts" ;
my @ptservers;
my $user = getpwuid($<) ;

if ( ! $seekgroup ) {
    print STDERR "Group $group2seek does not exist.\n" ;
    exit -1 ;
}
$_ = $( ;

if ( ! /\b$seekgroup\b/ ) {
    print STDERR "User $user is not member of group $group2seek.\n" ;
    exit(-1) ;
}

my $cfgfile = "/etc/arb/arb_tcp.dat" ;
# my $cfgfile = "/etc/arb/arb_pt_server.dat" ;
my $tmpfile = tmpnam();
open ( CFG, $cfgfile ) ||  die ( "Unable to open Arb config file $cfgfile." ) ;
open ( TMP, ">$tmpfile" ) ||  die ( "Unable to open temporary file $tmpfile for writing." ) ;

my ( $i, $port, $path, $i_max, $port_max ) ;
$i_max = $port_max = 0;

while ( <CFG> ) {
    if ( ! /^[^#]*\bARB_PT_SERVER/ ) {
	print TMP ;
	next ;
    }
    chomp ;
    s/\s*#.*// ;
    if ( /ARB_PT_SERVER([0-9]+)\s+localhost:([0-9]{4})\s+arb_pt_server\s+-D(.+)$/ ) {
	$i    = $1;
	$port = $2;
	$path = $3;
	print "$i: $port, $path\n" ;
	if ( $i    > $i_max    ) { $i_max    = $i ; }
	if ( $port > $port_max ) { $port_max = $port ; }
    } else {
	print "Canot parse PT_SERVER entry: $_\n" ;
    }
    @PTServerLines = (@PTServerLines, $_) ;
}

my $pts ;
foreach $pts ( @PTServerLines ) {
    print TMP "$pts\n" ;
}

print STDERR "Verify existing Servers in $PTServerDir.\n" ;
if ( ! opendir(DIR, $PTServerDir) ) { 
    print STDERR "PT-Server directory $PTServerDir does not exist.\n" ;
    exit -1 ;
} 
@ptservers = grep { /^$user[0-9]+\.arb$/ } readdir(DIR);
closedir DIR;

my $pts_usermax = 0;
foreach $pts ( @ptservers ) {
    if ( $pts =~ /$user([0-9]+)\.arb/ ) {
	if ( $1 > $pts_usermax    ) { $pts_usermax = $1 ; }
    }
}
$pts_usermax += 1 ;
system ("touch $PTServerDir/$user$pts_usermax.arb");
      
close TMP ;

print "$i_max, $port_max\n" ;
system ("mv $tmpfile tempfile.dat");
