#!/bin/sh
# Author: Blake, Kuo-Lien Huang
# License: GPL
# Descrition:
#   help user to write mapping file for iptrans.pl
#   1. generate template mapping file
#   2. validate the mapping file before execute 

# iptrans.pl & validate.pl
tail +106 $0 > iptrans.pl
chmod 755 iptrans.pl
cat <<-EOF > validate.pl
#!/usr/bin/perl
\$lineno=0;
open(MAP,\$ARGV[0]);
while(<MAP>) {
  chomp;
  \$lineno++;
  if(/^#/ || /^$/) { next; }
  elsif(/([^\/]*)\/([^\t]*)\t([^\/]*)\/([^\t]*)/) { next; }
  elsif(/([^\t]*)\t([^\t]*)/) {
    if(\$1 =~ /^$/ || \$2 =~ /^$/ || \$1 =~ /([^\/]*)\/([^\t]*)/) { print "\$lineno\n"; last; }
    next;
  }
  else { 
    print "\$lineno\n";
    last;
  }
}
close(MAP);
EOF
chmod 755 validate.pl

##
TMP=`mktemp /tmp/mapping.XXXXXX`
#MAPPING="/tmp/mapping.$$"
MAPPING=`mktemp /tmp/mapping.XXXXXX`

while read line 
do

  # network/netmask
  if [ "$(echo "$line" | grep -e "subnet.*netmask.*")" != "" ]; then
    network=`echo $line | awk '{ print $2; }'`
    netmask=`echo $line | awk '{ print $4; }'`
    echo >> $MAPPING
    #echo -e "$network/$netmask\t" >> $MAPPING
    echo "$network/$netmask" >> $TMP
  fi

  # ip
  if [ "$(echo "$line" | grep -e "fixed-address")" != "" ]; then
    ip=`echo $line | cut -d\; -f1 | awk '{ print $2; }'`
    #echo -e "$ip\t" >> $MAPPING
    echo "$ip" >> $TMP
  fi
  if [ "$(echo "$line" | grep -e "option routers")" != "" ]; then
    ip=`echo $line | cut -d\; -f1 | awk '{ print $3; }'`
    #echo -e "$ip\t" >> $MAPPING
    echo "$ip" >> $TMP
  fi

done < /etc/dhcp3/dhcpd.conf

validate=0
while [ $validate -ne 1 ]
do
  # edit the mapping file
  #vi $MAPPING
  nano $TMP

  # validate the mapping file
  rm -f $MAPPING
  while read A B 
  do
    if [ "$A" = "" -a "$B" = "" ] ; then
      echo >> $MAPPING
    else
      echo -e "$A\t$B" >> $MAPPING
    fi
  done < $TMP
 
  lineno=`./validate.pl $MAPPING`
  if [ "$lineno" = "" ]; then 
    validate=1
  else
    echo -n "Line $lineno is not correct! Press any key to edit .."
    read pause
  fi
done

# execute
./iptrans.pl $MAPPING

rm -f $MAPPING $TMP
rm -f iptrans.pl validate.pl

# restart services
SERVICES="/etc/rcS.d/S40networking /etc/rcS.d/S41portmap /etc/rc2.d/S19nis /etc/rc2.d/S20inetd /etc/rc2.d/S20ssh /etc/rc2.d/S20xfs /etc/rc2.d/S20dhcp3-server /etc/rc2.d/S23ntp /etc/rc2.d/S25nfs-user-server /etc/rc2.d/S99drblmgrd"
for SERVICE in $SERVICES
do
  if [ -e $SERVICE ]; then $SERVICE restart; fi
done
if [ -e /etc/rc2.d/S99drblmgrd ]; then /etc/rc2.d/S99drblmgrd start; fi
exit 0
#!/usr/bin/perl
# 
# Author: Blake,Kuo-Lien Huang
# License: GPL
# Description:
#   A tools for translating private ip to public ip
#   the format of mapping file is 
#     subnet/netmask\tsubnet/netmask
#     private_ip\tpublic_ip
#     ...

#if(@ARGV<2) {
#  print "Usage: iptrans.pl router maping_file\n";
#  exit;
#}
if($#ARGV+1<1) {
  print "Usage: iptrans.pl maping_file [router]\n";
  exit 0;
}

#### main ####
$dhcpd_conf="/etc/dhcp3/dhcpd.conf";
$tftpboot="/tftpboot/";
$drblhost="/var/lib/diskless/default";

# option router
if($#ARGV+1==2) {
  $ROUTER=$ARGV[1];
  $ROUTER=~s/\./\\\./g;
  $RULE_OPTION_ROUTERS="s/option routers.*/option routers $ROUTER;/g";
  #$RULE_OPTION_ROUTERS=~system("/usr/bin/perl -p -i -e \"$RULE_OPTION_ROUTERS\" $dhcpd_conf");
  system("/usr/bin/perl -p -i -e \"$RULE_OPTION_ROUTERS\" $dhcpd_conf");
}

# subnet mapping file
open(MAP,$ARGV[0]);
while(<MAP>) {
  chomp;
  if(/^#/ || /^$/) { next; }

  # subnet mapping
  if(/([^\/]*)\/([^\t]*)\t([^\/]*)\/([^\t]*)/) {

    # Blake, 2003/08/11
    $NETWORK_OLD=$1; $NETWORK_NEW=$3;
    $NETMASK_OLD=$2; $NETMASK_NEW=$4;

    # replace rule
    $RULE_DHCPDCONF = "s/subnet $NETWORK_OLD netmask $NETMASK_OLD/subnet $NETWORK_NEW netmask $NETMASK_NEW/g";
    $RULE_NETWORKS = "s/$NETWORK_OLD/$NETWORK_NEW\\\/$NETMASK_NEW/g"; 
    $RULE_YPSECURENETS = "s/$NETMASK_OLD\t$NETWORK_OLD/$NETMASK_NEW\t$NETWORK_NEW/g";

    $RULE_DHCPDCONF =~ s/\./\\\./g;   
    $RULE_NETWORKS =~ s/\./\\\./g;
    $RULE_YPSECURENETS =~ s/\./\\\./g;

    # Blake, 2003/08/12
    $RULE_OPTION_NETMASK = "s/option subnet-mask $NETMASK_OLD/option subnet-mask $NETMASK_NEW/g";
    $RULE_OPTION_NETMASK =~ s/\./\\\./g;

    /([^\t]*)\t([^\t]*)/;
    $BROADCAST_ADDR_1 = `/usr/bin/netmask -r $1 | cut -d- -f2 | awk '{print \$1;}'`;
    $BROADCAST_ADDR_2 = `/usr/bin/netmask -r $2 | cut -d- -f2 | awk '{print \$1;}'`;
    chomp($BROADCAST_ADDR_1);
    chomp($BROADCAST_ADDR_2);
    $RULE_OPTION_BC = "s/$BROADCAST_ADDR_1/$BROADCAST_ADDR_2/g";
    $RULE_OPTION_BC =~ s/\./\\\./g;

    $script=`mktemp /tmp/drbl.XXXXXX`;
    chomp($script);
    open(SCRIPT,">$script");
    print SCRIPT <<EOF;
#!/bin/sh

for host in `ls $drblhost`
do
  if [ "\$host" = "." -o "\$host" = ".." -o "\$host" = "root" ]; then
    continue;
  fi
  /usr/bin/perl -p -i -e "$RULE_NETWORKS" $drblhost/\$host/etc/networks
done

/usr/bin/perl -p -i -e "$RULE_DHCPDCONF" $dhcpd_conf
/usr/bin/perl -p -i -e "$RULE_OPTION_BC" $dhcpd_conf
/usr/bin/perl -p -i -e "$RULE_OPTION_NETMASK" $dhcpd_conf
/usr/bin/perl -p -i -e "$RULE_YPSECURENETS" /etc/ypserv.securenets
EOF
     close(SCRIPT);  
     system("chmod 755 $script; $script");
     unlink($script);

     # Blake 2003/08/11
     # init script
     if(-d "$drblhost/root/sbin/$NETWORK_OLD" && -e "$drblhost/root/sbin/$NETWOR_OLD/init" ) {
       # init
       $TMPSTR1 = substr($NETWORK_OLD,0,rindex($NETWORK_OLD,"."));
       $TMPSTR2 = substr($NETWORK_NEW,0,rindex($NETWORK_NEW,"."));
       $RULE_INIT = "s/\\\"$TMPSTR1\\\"/\\\"$TMPSTR2\\\"/g";
       $RULE_INIT =~  s/\./\\\./g;
       system("/usr/bin/perl -p -i -e \"$RULE_INIT\" $drblhost/root/sbin/$NETWORK_OLD/init");
       # rename
       rename("$drblhost/root/sbin/$NETWORK_OLD","$drblhost/root/sbin/$NETWORK_NEW");
       # ln
       $script=`mktemp /tmp/drbl.XXXXXX`;
       chomp($script);
       open(SCRIPT,">$script");
       print SCRIPT <<EOF;
#!/bin/sh
nfsserver=`grep -e "^mount -n" $drblhost/root/sbin/$NETWORK_NEW/init | cut -d: -f1 | cut -d' ' -f3`
ln -s $drblhost/root/sbin/$NETWORK_NEW/init $drblhost/root/sbin/\$nfsserver
EOF
       close(SCRIPT);
       system("chmod 755 $script; $script");
       unlink($script);
     }
  }
  # ip mapping  
  else {
    /([^\t]*)\t([^\t]*)/;
    # Blake, 2003/08/11
    $IP_OLD=$1; $IP_NEW=$2;

    if(-e "$drblhost/$IP_OLD" && -d "$drblhost/$IP_OLD" && -e "$tftpboot/$IP_OLD") {
      # rename
      rename("$drblhost/$IP_OLD","$drblhost/$IP_NEW");
      rename("$tftpboot/$IP_OLD","$tftpboot/$IP_NEW");
    }
    # replace rule
    $RULE = "s/$IP_OLD(\[^\\\d\])/$IP_NEW\\1/g";
    $RULE =~ s/\./\\\./g;
    $script=`mktemp /tmp/drbl.XXXXXX`;
    chomp($script);
    open(SCRIPT,">$script");
    print SCRIPT <<EOF;
#!/bin/sh

for host in `ls $drblhost`
do
  if [ "\$host" = "." -o "\$host" = ".." -o "\$host" = "root" ]; then
    continue;
  fi

  /usr/bin/perl -p -i -e "$RULE" $drblhost/\$host/etc/fstab
  /usr/bin/perl -p -i -e "$RULE" $drblhost/\$host/etc/yp.conf
  /usr/bin/perl -p -i -e "$RULE" $drblhost/\$host/etc/hosts
  /usr/bin/perl -p -i -e "$RULE" $drblhost/\$host/etc/default/ntp-servers
  if [ -f $drblroot/\$host/etc/ocs/config ]; then
    /usr/bin/perl -p -i -e "$RULE" $drblhost/\$host/etc/ocs/config
  fi
done

/usr/bin/perl -p -i -e "$RULE" /etc/hosts
/usr/bin/perl -p -i -e "$RULE" /etc/exports
/usr/bin/perl -p -i -e "$RULE" $dhcpd_conf
/usr/bin/perl -p -i -e "$RULE" /etc/ypserv.securenets
/usr/bin/perl -p -i -e "$RULE" /etc/yp.conf

if [ -f $drblhost/root/sbin/$IP_OLD ]; then
  network_init=`ls -l $drblhost/root/sbin/$IP_OLD | awk '{print \$11;}'`
  /usr/bin/perl -p -i -e "$RULE" $drblhost/root/sbin/$IP_OLD
  cp $drblhost/root/sbin/$IP_OLD \$network_init
  rm -f $drblhost/root/sbin/$IP_OLD
fi
EOF
    close(SCRIPT);  
    system("chmod 755 $script; $script");
    unlink($script);
  }
}
close(MAP);
