nwhitehorn 3d4e888988 Update dialog to version 20100428. This changes the license under which
dialog is distributed from GPLv2 to LGPLv2 and introduces a number of new
features and a new and better libdialog API. The existing libdialog will
be kept temporarily as libodialog for compatibility purposes until sade,
sysinstall and tzsetup have been either updated or replaced.

__FreeBSD_version is now 900030.

Discussed on:	-current
Approved by:	core
Obtained from:	http://invisible-island.net/dialog
2011-01-12 14:55:02 +00:00

138 lines
2.9 KiB
Plaintext
Executable File

if ( getpwuid($<) ne $ifowner ) { print "You must be owner of ifmail\n"; exit 1; }
if ( (@ARGV < 3) || $ARGV[0] eq "-?" || $ARGV[0] eq "-h" ) {
&usage;
}
$ARGV[0] =~ tr/A-Z/a-z/;
$ARGV[3] =~ tr/A-Z/a-z/;
&parsecfg;
if ( $logfile ne "" ) {
open(LOG, ">>".$logfile) || die "Can't open logfile";
}
if (substr($ARGV[1], 0, 1) ne "/") {
$cwd=`pwd`;
chop $cwd;
$ARGV[1] = $cwd."/".$ARGV[1];
}
if ($ARGV[3] eq "" || $ARGV[3] eq "normal") {
$flavour = 'f';
} elsif ($ARGV[3] eq "crash") {
$flavour = 'c';
} elsif ($ARGV[3] eq "hold") {
$flavour = 'h';
} else {
print "Unknown flavour, assuming normal\n";
$flavour = 'f';
}
if ($ARGV[0] eq "send") {
&attach($ARGV[1], $ARGV[2]);
} elsif ($ARGV[0] eq "get") {
&request($ARGV[1], $ARGV[2]);
} else {
print "Unknown command, try ifman -h\n";
exit 1;
}
close(LOG);
exit 0;
#######################################################################
sub attach {
local($fspec, $address) = @_;
$floname = &resolve($address);
open(FLO, ">>".$outbound."/".$floname) || die "Can't open flo-file $outbound/$floname";
open(FIND, "find $fspec -print |") || die "Can't generate list of files";
if ( eof(FIND) ) {
print "No matching files, nothing to send\n";
exit 1;
}
while (<FIND>) {
chop;
$datestamp = `date \"+%D %T\"`;
chop $datestamp;
printf LOG "%s %s %s\n", $datestamp, $$, "ifman: sending $_ to $address";
printf FLO "%s\n", $_;
}
close(FLO);
close(FIND);
}
sub request {
local($fspec, $address) = @_;
$reqname = &resolve($address);
$reqname =~ s/\.[fch]lo/\.req/;
open(REQ, ">>".$outbound."/".$reqname) || die "Can't open req-file";
$datestamp = `date \"+%D %T\"`;
chop $datestamp;
printf LOG "%s %s %s\n", $datestamp, $$, "ifman: requesting $fspec from $address";
printf REQ "%s\n", $fspec;
close(REQ);
}
sub resolve {
local($addr) = @_;
if ( index($addr, ":") >=0 ) {
print "I cannot resolve addresses with zones!\n";
exit 1;
} elsif ( index($addr, "/") == -1 ) {
print "Not a valid address!\n";
exit 1;
}
($net, $node, $point) = split(/\/|\./, $addr);
if ( defined $point ) {
$pointdir = sprintf("%04x%04x.pnt", $net, $node);
if ( ! -e $outbound."/".$pointdir ) {
mkdir ($outbound."/".$pointdir, 0755) || die "Can't create point directory";
}
$flo = sprintf("0000%04x.%01slo", $point, $flavour);
return $pointdir."/".$flo;
} else {
$flo = sprintf("%04x%04x.%01slo", $net, $node, $flavour);
return $flo;
}
}
sub usage {
print "ifmail manager script\n";
print "usage: ifman <cmd> <filespec> <address> [flavour]\n";
print " commands: send, get\n";
print " flavours: normal, crash, hold. Default is normal.\n";
print "Only 2d addresses with points are supported - no zones!\n";
exit 1;
}
sub parsecfg {
open(CFG, $cfgfile) || die "Can't open ifmail config file";
while (<CFG>) {
chop;
if (/^#/) { next; }
if (/^outbound\s+(\S+)/) { $outbound = $1; }
if (/^logfile\s+(\S+)/) { $logfile = $1; }
}
close(CFG);
}