#!/usr/local/bin/perl
# fast setup script for Internet/NeXusNET connection
# 	use with NeXus-Kansai.Kit & CF-3.4Wbeta6
#				<hyodo@youkoso.wincnet.or.jp>
#				<yo@eyestar.nexus>
#
# 	1996.01.10   rev 0.00	Rei		tagɽ
# 	     01.18   rev 0.001	Shin pre1	evalɽ
#	     01.21   rev 0.002	Shin pre2	nexus-big 
#	     01.22   rev 0.003	Shin pre3	
#	     02.10   rev 0.01   9602-Shin	nexus-local
#	     03.04   rev 0.02	9602-Asuka	nexus-local


# define
$FAST = "< nexus/fast-data";

# user check
$myhost = `hostname`, chop($myhost);
$me = `whoami`, chop($me);
if( $me eq 'root' ){
	&warn(" in root permission!!");
	sleep(1);
	&warn(" reprogrammed $myhost.....");
	sleep(1);
	exit 1;
}

# read setting data file
@item = split( /\n/, <<ITEM
nexus
nexus_domain
nexus_mother
nexus_mygw
internet
internet_domain
internet_mother
internet_mygw
other_domain_accept
ITEM
);
open( FAST ) || die "Can't open NeXus setting file: $FAST\n";
while(<FAST>){
	next	if /^#/;
	next	if /^\s*$/;
	&err("UnD"),next	unless( /^(\w+)\s*=\s*(.*)\s*$/ );
	$vname = $1 , $vvalue = $2;
	&err("UnV"),next	unless grep( ($_ eq $vname), @item );
	$item{$vname} = $vvalue;
}
close(FAST);

# check subroutines
sub name{
	local($_) = $_[0];
	return 0		if /^[0-9a-zA-Z\-]+$/;
	&err("ICn"),return 1;
}
sub dom{
	local($_) = $_[0];
	&err("IDd"),return 1	if /^\./ || /\.$/;
	return 0		if /^([0-9a-zA-Z\-]+\.)+[0-9a-zA-Z\-]+$/;
	&err("ICd"),return 1;
}
sub domjp{
	local($_, $c )=$_[0];
	$c = &dom($_);
	&warn(" more.than.3.domain.names.required")	if( (s/\./\./g) < 2 );
	&warn(" (or|co|ac|go|ad).jp required")	unless /(or|co|ac|go|ad)\.jp$/;
	$c;
}
sub un{
	for( @_ ){
		&err("UnV : $item{$_}")	if( $item{$_} ne "");
	};
}
sub def{
	local($c);
	for( @_ ){
		$c |= &err(" Undefined $_")	if( $item{$_} eq "");
		$c |= &name($item{$_});
	}
	$c;
}

# logical check NeXusNET setting value
if( $item{'nexus'} eq "" ){
	&un( "nexus_domain", "nexus_mother", "nexus_mygw" );
} elsif( ! &dom($item{'nexus_domain'}) ){
	@nexus = split( /\./, $item{'nexus_domain'} );
	if( $item{'nexus'} eq "uucp" ){
		&warn(" .nexus required") if( $nexus[$#nexus] ne "nexus" );
		if( $#nexus == 1 ){
			unshift( @nexus, $nexus[0] );
		} elsif( $#nexus == 2 ){
			;
		} else {
			&warn(" Illegal domain setting in NeXusNET, Perhaps");
		}
		$machine = $nexus[0];
		$item{'nexus_domain'} = "$nexus[1].$nexus[2]";
		&def( "nexus_mother", "nexus_mygw" );
#	} elsif( $item{'nexus'} eq 'internet-mail' ){
#		&un( "nexus_mygw" );
#		&def( "nexus_mother" );
#		&warn(" yet supported" );
	} else {
		&err("UiN");
	}
}

# logical check internet setting value
if( $item{'internet'} eq "" ){
	&un( "internet_domain", "internet_mother", "internet_mygw" );
} elsif( ! &domjp( $item{'internet_domain'} )){
	if( $item{'internet'} eq "uucp" ){
#		$item{'internet_domain'} =~ /^([^\.]+)\.(.*)$/;
#		$machine = $1;
#		$item{'internet_domain'} = $2;
		$machine = $myhost;
		&domjp($item{'internet_domain'});
		&def( "internet_mother", "internet_mygw" );
	} elsif( $item{'internet'} eq 'ppp' ){
		$machine = $myhost;
		&domjp($item{'internet_domain'});
		&un( "internet_mother", "internet_mygw" );
	} elsif( $item{'internet'} eq 'ip' ){
		$machine = $myhost;
		&domjp($item{'internet_domain'});
		&un( "internet_mother", "internet_mygw" );
	} else {
		&err( "UiV" );
	}
}

if( $item{other_domain_accept} ne "" ){
	@accept = split(/\s,/, $item{other_domain_accept} );
	for( @accept ){
		&domjp($_);
	}
}

# & suggest gray name (ex. foo,bar,domain, or|ac|co|go.jp)
@aholist = split( /\n/, <<AHOU
foo
bar
localhost
somewhere
hogehoge
domain
mother-gw
my-gw
nsp-gw
my-gw-nsp
AHOU
);
for( keys(%item) ){
	local($i) = $item{$_};
	&warn(" AHOU-na name was found : $i in $_") if grep( /^$i$/i, @aholist );
}

# print summary --------------------------- no check this part 96/02/04
print <<CHKLIST
Check list -----
name/local	: $me / $myhost

your machine name in NeXusNET : $machine
your domain  name in NeXusNET : $item{'nexus_domain'}
your FQDN         in NeXusNET : $machine.$item{'nexus_domain'}
your mail address in NeXusNET : ${me}\@$item{'nexus_domain'}

Internet connection by $inter
your machine name in Internet : $machine
your domain  name in Internet : $item{'internet_domain'}
your FQDN         in Internet : $machine.$item{'internet_domain'}
your mail address in Internet : ${me}\@$item{'internet_domain'}
CHKLIST
;
for (@accept){
	print "your other mail address : ${me}\@$_\n";
}

# mapping

if( $item{'internet'} ){
	$m{MY_NAME}		= "'$machine.$item{'internet_domain'}'";
	$m{MY_DOMAIN}	= "'$item{'internet_domain'}'";
	if( $item{'nexus'} ){
		$m{ANOTHER_ADDRESS}	= "'$nexus[1].nexus'";
	}
} else {
	$m{MY_NAME}		= "'$machine.$item{'nexus_domain'}'";
	$m{MY_DOMAIN}	= "'$item{'nexus_domain'}'";
}

$_ = '';
$_ = "$nexus[1].nexus" if $item{'nexus_domain'};
$m{ACCEPT_ADDRS} = &john( $item{'internet_domain'}, $_, @accept);

if( $item{'nexus_mother'} || $item{'internet_mother'} ){
	$m{UUCP_GW}		= "yes";
	if( $item{'internet_mygw'} ){
		$m{UUCP_HOST_NAME}	= "'$item{'internet_mygw'}'";
	} else {
		$m{UUCP_HOST_NAME}	= "'$item{'nexus_mygw'}'";
	}
	$m{UUCP_NEIGHBORS}	= &john( $item{'nexus_mother'}, $item{'internet_mother'} );
	if( $item{'nexus_mother'} ){
		if( $item{'internet'} ){
			$m{UUCP2_MAILER_OPTS}	= "\"\$UUCP_MAILER_OPTS\"', M=10000000'";
		} else {
			$m{UUCP_MAILER_MAXSIZE}	= "10000000";
		}
	}
}

# genearate nexus.deliver

$deliver = "nexus/nexus.deliver";
$m{STATIC_ROUTE_FILE} = "'$deliver'";
`cp ${deliver}.in $deliver`;
open( DELIV, ">>$deliver" ) || die "Can't open nexus.deliver file: $deliver\n";
# $here = `pwd`;
# DOM	${here}/Samples/Delivers/ostopdomains.new


if( $_ = $item{'internet'} ){
	if( $item{'nexus'} eq 'uucp' ){
		$s = "
GW	uucp2: $item{'nexus_mother'}
DOM	nexus
";
	}
	if( $_ eq "uucp" ){
		$s .= "
NGW	uucp: $item{'internet_mother'}
DOM	nexus
";
	} elsif( $_ eq "ip") {
		$s .= "
NGW	smtp-mx
DOM	nexus
";
	} elsif( $_ eq "ppp") {
	$s .= "
NGW	smtp-mx
DOM	nexus
";
	}
} else {
	if( $item{'nexus'} eq 'uucp' ){
	$s = "
GW	uucp: $item{'nexus_mother'}
DOM	nexus
";
	}
}

print DELIV $s;
close(DELIV);

# output to .def--------------------------- no check this part 96/02/04
print "----------\n";
print "genarate -> nexus.def\n";

$inrtf = "nexus/nexus.in.rtf";
$IN    = "nexus/nexus.in";
&err(" File not exists : $inrtf\n")	if ! -f $inrtf;

`/usr/bin/rtf-ascii $inrtf > $IN`;
&err(" File not exists : $IN\n")	if ! -f $IN;

open( IN, "< $IN" ) || die "Can't open nexus.in file: $IN\n";
$OUT	= "> nexus.def";
open( OUT ) || die "Can't open nexus.def file: $OUT\n";
while(<IN>){
	if( /^#%(\w+)%/ ){
		$id = $1;
		if( defined $m{$id} ){
			s/^#%$id%/$id=$m{$id}/;
			$flag{$id} = 1;
		} else {
			&warn(" Self-diagnosis: No matching parameter for %$id% in file $IN\n > $_");
			next;
		}
	}
	print OUT;
}
close(IN);
close(OUT);
for( keys %m ){
   &warn(" Self-diagnosis: \$m{$_} was ignored in generate $OUT") if( !defined $flag{$_} );
}

# run 'make nexus.cf'

# `make nexus.cf`;


sub warn{
	print "WARNING: $_[0] : $_\n";
	$warning = 1;
}

@errorlist= split( /\n/, <<ERRORLIST
UbQ unbalanced '"'
UnV Unexpected valiable name
UnD Unexpected description
UiV Unexpected value must be uucp/ppp/ip
NoK No `(` or `)`
ICd Illegel character in domain.name
ICn Illegel character in name
IDd Illegel '.' such as .domain.name or domain.name.
ILr Illegal list in the right
ERRORLIST
);

sub err{
	$error = 1;
	local($j, $_ ) = ( " > $_\n", $_[0]."\n" );
	local($i, @i);
	print( "ERROR: $_$j"),return 1	if /^ /;
	$i = substr($_, 0, 3);
	@l = grep( /^$i /, @errorlist );
	$i = substr($_, 4);
	$i = " : $i"	if( $i ne "" );
	print( "ERROR: @l$i$j"),return 1	if($#l != 0);
	print "ERROR: self-diagnosis: $_$j";
	return 1;
};

sub john{
	local($s) = "'";
	for (@_){
		next if /^\s*$/;
		$s .= $_." ";
	}
	chop($s);
	$s .= "'";
}

