#! /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); } }