#! /usr/bin/perl
#
# Multiserver frontend for slrn
# (c) 2003 Hugo Haas
# License: GPLv2
# Version for newer Curses::Widgets API:
# Widgets.pm,v 1.100 2001/12/10 10:56:20 corliss Exp
use strict;
use Curses;
use Curses::Widgets;
use Curses::Widgets::ListBox;
use Curses::Widgets::TextField;
my $slrnrc = "$ENV{HOME}/.slrnrc";
my @servers;
my %passwords;
my @temp;
# -------------------------------------------------------------------------
sub get_server_list() {
my $conf = $_[0];
open (CONF, $conf) || die "Couldn't open configuration file: $!";
while () {
if (m/^\s*server\s+(\S+)\s+/) {
push(@servers, $1);
} elsif (m/^\s*nnrpaccess\s+\"(\S+)\"\s+\".*\"\s+\"(.*)\"/) {
$passwords{$1} = $2;
}
}
close(CONF);
}
sub menu() {
my $pos = $_[0];
my $mwh = new Curses;
initscr();
noecho();
$mwh->keypad(1);
curs_set(0);
my $lb = Curses::Widgets::ListBox->new({
CAPTION => 'slrn server choice',
LENGTH => 50,
LINES => 10,
VALUE => 0,
BORDERCOL => 'red',
FOCUSSWITCH => "\n",
X => 2,
Y => 2,
LISTITEMS => [ @servers , 'EXIT' ],
CURSORPOS => $pos
});
$lb->draw($mwh, 1);
$lb->execute($mwh);
endwin();
if ($lb->getField('CURSORPOS') > $#servers) {
print "Exiting.\n";
exit(0);
}
return($lb->getField('CURSORPOS'));
}
sub ask_password() {
my $server = $_[0];
initscr();
my $mwh = new Curses;
noecho();
$mwh->keypad(1);
curs_set(0);
my $tf = Curses::Widgets::TextField->new({
CAPTION => "Enter password for $server",
LENGTH => 30,
BORDERCOL => 'green',
FOCUSSWITCH => "\n",
PASSWORD => 1,
X => 2,
Y => 2,
});
$tf->draw($mwh, 0);
$tf->execute($mwh);
$passwords{$server} = $tf->getField('VALUE');
endwin();
}
sub write_temp_conf() {
my ($in, $out, $s) = @_;
open (CONF, $in) || return;
umask(0077);
open (TEMP, ">$out");
while () {
if (m/^\s*(nnrpaccess\s+\"$s\"\s+\".*\")\s+\"(.*)\"/) {
print(TEMP "$1 \"$passwords{$s}\"\n");
} else {
print(TEMP $_);
}
}
close(TEMP);
close(CONF);
}
# -------------------------------------------------------------------------
&get_server_list($slrnrc);
print 'Multiserver front-end to slrn, $Id: mslrn,v 2.0 2003/05/09 07:44:59 hugo Exp $ ';
print "\n\n";
print "Servers found:\n";
my $s;
foreach $s (@servers) {
print "$s\n";
}
print "NNRP authentication for:\n";
foreach $s (keys(%passwords)) {
print "$s";
if ($passwords{$s} eq '') {
print " (password needs to be supplied)";
}
print "\n";
}
print "Starting front-end...\n";
END {
my $f;
foreach $f (@temp) {
unlink($f);
}
}
my $i = 0;
for(;;) {
$i = &menu($i);
$s = $servers[$i];
my @command = ('slrn', '-h', $s);
if (defined($passwords{$s})) {
if ($passwords{$s} eq '') {
&ask_password($s);
}
if ($passwords{$s} ne '') {
use Fcntl;
use POSIX qw(tmpnam);
my $f;
do {
$f = tmpnam();
} until sysopen(FH, $f, O_RDWR|O_CREAT|O_EXCL);
push(@temp, $f);
&write_temp_conf($slrnrc, $f, $s);
system(@command, '-i', $f);
unlink($f);
pop(@temp);
}
} else {
system(@command);
}
}