#! /usr/bin/perl
#
#
#

$home="/home/wcl/wcl_html/genesis";
$ndir="$home/nodes";
$html=1;
$source='http://www.wleiden.net/cgi-bin/g_list.pl';
$svn='/usr/local/bin/svn';
$toolfile='/home/wcl/wcl_html/genesis/tools/wleiden.pl';

$functions_only=1;do $toolfile || die;

$request=$ENV{'REQUEST_URI'};                                                  

if ($request=~/cgi-bin\/g_list.pl\/(.*)$/) 
{
   ($hostname,$file)=split(/\//,$1);
   $title="$hostname $file";
}
else {$title="listing";}

$browser=$ENV{'HTTP_USER_AGENT'};
if ($browser=~/curl|wget|fetch/i) 
{$HTML=0;
 print "Content-type: text/html\n\n";
# print "Doing: [$hostname][$file]\n";
} 
else 
{$HTML=1;
print <<EOH;
Content-type: text/html\n

<HTML>
<TITLE>Genesis $title</TITLE>
<BODY BGcolor=white>
<BASE HREF=http://www.wleiden.net/cgi-bin/>
EOH
}



#foreach $key (keys %ENV) {print "$key=$ENV{$key}<BR>\n";}

if ($hostname eq '') 
{
	if ($ENV{"QUERY_STRING"}=~/update/i)
	{
              select(STDERR); $| = 1;     # make unbuffered
             select(STDOUT); $| = 1;     # make unbuffered

	     print "<H2>Please wait while updating svn...</H2><P><PRE>\n";
     	     system("$svn update /home/wcl/wcl_html/genesis");
	     close(SVN);
	     print <<EOZ;
</PRE>
<H2>Done.<H2><P>
Click <A HREF=g_list.pl>here</A> if you're not forwarded automaticly in 5
seconds.<P>
<META HTTP-EQUIV=REFRESH CONTENT=5;URL=g_list.pl>\n
EOZ

	}
        else 
	{g_list();}
}
else
{
 $dir="$ndir/$hostname";
 if (! -d $dir ) 
 {
   if ($HTML) {print "<H1>Host $hostname not found: $dir</H1><P>\n";}
   else {print "Host $hostname not found: $dir\n";}
 } elsif ($file eq '')
   {
	 foreach $file ('txtconfig','config','dhcpd.conf','zebra.conf','ospfd.conf',
			'rc.local','rc.node.local','resolv.conf',
			'named.conf','snmpd.local.conf')
 	{
	  if ($HTML) {print "$file<BR>\n";}
	  else {print "$file\n";}
	}
   } 
 elsif ($file eq 'config') {g_print($hostname);}
 elsif ($file eq 'txtconfig') {$HTML=0;g_print($hostname);}
 elsif ($file=~/(dhcpd.conf|mrtg.cfg|zebra.conf|ospfd.conf|sh|linux.sh|rc.node.local|rc.local|resolv.conf|named.conf|snmpd.local.conf)/) 
	{g_generate($file,$hostname);}
}

if ($HTML)
{
print <<EOF;
</BODY>
</HTML>
EOF
}

sub g_list
{
  if ($HTML) 
  {
	$svn_version=svn_version("/home/wcl/wcl_html/genesis");
        if ($svn_version=~/Last Changed Rev: (\d+)/) {$revision=$1;}

	print "<H1>Genesis config (revision: $revision):</H1><P>\n<PRE>";
	print $svn_version;
	print "</PRE><TABLE BORDER=1>\n";
  }

  opendir(DIR, $ndir) || die "can't opendir $home: $!";
  @dirs = grep { /^[^\.]/ && -d "$ndir/$_" } readdir(DIR);
  closedir DIR; 
  foreach $dir (sort @dirs)
  {
	if ($dir=~/attic/) {next;}
        $hostname=$dir;
	if (! $HTML) {print "$hostname\n";}
	else
        {
         print "<TR><TD><A HREF=g_list.pl/$hostname/config>$hostname</A></TD>\n";
	 foreach $file ('linux.sh','dhcpd.conf','zebra.conf','ospfd.conf',
			'rc.node.local','rc.local','resolv.conf','named.conf',
			'snmpd.local.conf')
	 {
	   print "<TD><A HREF=g_list.pl/$hostname/$file>$file</A></TD>\n\n";  
	 }
	}
  }
  if ($HTML) { #print "</TABLE><P>\n";}
print <<EOX;
</TABLE><P>
<FORM METHOD=get ACTION=g_list.pl>
<INPUT TYPE="submit" NAME="Update" VALUE="Update">
</FORM>
EOX
}
}

sub svn_version
{
   local($file,$char)=@_;
   local($svn_version);
   $svn_version=`$svn info $file`;
   if ($char ne '') {$svn_version=~s/^([^$char].*)/$char $1/mgi;}
   return($svn_version);
}


sub g_print
{
  local($hostname)=@_;
  $config="$ndir/$hostname/wleiden.conf"; 

  if (! $HTML) 
  {
	print svn_version($config,'#');

#print "Ahum\n";
       open (CFG,$config) || die;
       while (<CFG>) {print $_;}
       close(CFG);
  } else
  {
  print "<H1>Genesis configuratie voor: $hostname</H1><P>\n";
  print "<PRE>" . svn_version($config) . "</PRE><P>\n";

  do($config) || die;
  parse_config();                                                                 


 print <<EOXY;
<TABLE BORDER=1><TR><TD COLSPAN=4><PRE>
master_ip=$master_ip
AGGREGATE=$AGGREGATE

gw_open=$gw_open
nodetype=$nodetype
nodename=$nodename

NS_forward=$NS_forward
NS_resolv=$NS_resolv

location=$location
DISK=$DISK

X=$X
Y=$Y


OS=$OS
</PRE></TD></TR>
EOXY

 foreach $if (sort keys %config)
 {
   if ($if=~/^(.*):\d+/) {$subs{$1}++;}
 } 

 foreach $if (sort keys %config)
 {
   if ($if=~/^([^:]+)/) {$mymain=$1;} else {$mymain='';}
   if ($if!~/:\d+/) {$main=1;$cc='66'} else {$main=0;$cc='cc';}
   if (! ($ip=$IP{$if})) {$ip='dhcp?';} 
   if ($TYPE{$if}=~/wireless/) {$color="#${cc}FFFF";}
   if ($TYPE{$if}=~/ethernet/) {$color="#FFFF${cc}";}
   
   $cfg=$config{$if};
   $cfg=~s/(.*KEY.*=).*/${1}***********/;
   $cfg=~s/(.*PWD.*=).*/${1}***********/;
   $cfg=~s/(.*CODE.*=).*/${1}***********/;
   $cfg=~s/(.*PASS.*=).*/${1}***********/;

   if ($main) {printf "<TR bgcolor=$color><TD ROWSPAN=%d VALIGN=TOP><B>$if</TD>\n",(1+$subs{$if})*3,$subs{$if};$c=4} 
   else {$c=3;print "<TR bgcolor=$color>";} 
   $cfg=~s/</&lt;/gi;
   $cfg=~s/>/&gt;/gi;

   print <<EOP;
<TD>$if</TD><TD><B>$ip</TD><TD>$DESC{$if}($SDESC{$if})</TD>
<TR><TD COLSPAN=$c><PRE>
$cfg
</PRE></TD>
<TR><TD COLSPAN=$c>&nbsp;</TD>

EOP
 }
 print "</TABLE>\n";
  }
}


sub g_generate
{
  ($file,$hostname)=@_;

#print "[$file][$hostname]\n";
  $config="$ndir/$hostname/wleiden.conf";


  if (! -r $config) 
  {
    if ($HTML) {print "<H1>File $file not found: $config</H1><P>\n";}
    else {print "File $file not found: $config\n";}

  } else
  {
 if ($file=~/(ospfd|zebra)/) {$char='!';} else {$char='#';}

  $svn_versiont=svn_version($toolfile,$char);
  $svn_versionc=svn_version($config,$char);

  if ($svn_versiont=~/Last Changed Rev: (\d+)/) {$tool_rev=$1;}
  if ($svn_versionc=~/Last Changed Rev: (\d+)/) {$config_rev=$1;}

#print "[$tool_rev $config_rev]<BR>\n";
  if ($tool_rev >= $config_rev) 
  {$svn_version=$svn_versiont . $svn_versionc;}
  else {$svn_version=$svn_versionc;}


  if ($HTML) {print "<H1>Genesis $file voor: $hostname</H1><P>\n";}

  do($config) || die;
  parse_config();                                                                 
  read_areas();
  do_it();

  if ($file=~/ospfd.conf/)   	{$pr=$ospfd;}
  if ($file=~/zebra.conf/)   	{$pr=$zebra;}
  if ($file=~/dhcpd.conf/)   	{$pr=$dhcp;}
  if ($file=~/snmpd.local.conf/){$pr=$snmpd;}
  if ($file=~/mrtg.cfg/)     	{$pr=$mrtg;}
  if ($file=~/linux.sh/)     	{$pr=$nwcfg;}
  if ($file=~/sh/)           	{$pr=$sh;}
  if ($file=~/rc.node.local/) 	{$pr=$rcconf;}
  if ($file=~/rc.local/)      	{$pr=$freebsd;}
  if ($file=~/resolv.conf/)   	{$pr=$resolv;}
  if ($file=~/named.conf/)    	{$pr=$named;}

  if ($HTML) 
  {
	$pr=~s/</&lt;/gi;$mrtg=~s/>/&gt;/gi;
	print "<PRE>$pr</PRE>\n";
  } else {print $pr;}
  }
}
