]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/commitdiff
Merge branch 'master' into fifteen
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 9 Jan 2014 12:31:25 +0000 (13:31 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 9 Jan 2014 12:31:25 +0000 (13:31 +0100)
Conflicts:
config/backup/backup.pl

1  2 
config/backup/backup.pl
config/rootfiles/common/stage2
html/cgi-bin/ovpnmain.cgi

diff --combined config/backup/backup.pl
index a56a69856fcd0663bc035a6067299ab54b0552a3,fd626725ea903019ca983898fca74a0bd13c6624..3172d6dc6bb36804986fb371b52eaa20a3eb402b
@@@ -22,7 -22,7 +22,7 @@@
  require '/var/ipfire/general-functions.pl';
  require "${General::swroot}/lang.pl";
  require "${General::swroot}/header.pl";
 -
 +use File::Path;
  my $debug = 1;
  my @include = "";
  my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
@@@ -64,67 -64,10 +64,71 @@@ elsif ($ARGV[0] eq 'restore') 
    system("cd / && tar -xvz -p -f /tmp/restore.ipf");
    #Here some converter scripts to correct old Backups (before core 65)
    system("/usr/sbin/ovpn-ccd-convert");
 +  #OUTGOINGFW CONVERTER
 +  if( -d "${General::swroot}/outgoing"){
 +        if( -f "${General::swroot}/firewall/config" ){
 +                unlink("${General::swroot}/firewall/config");
 +                system("touch ${General::swroot}/firewall/config");
 +                chown 99,99,"${General::swroot}/firewall/config";
 +        }
 +        if( -f "${General::swroot}/firewall/outgoing" ){
 +                unlink("${General::swroot}/firewall/outgoing");
 +                system("touch ${General::swroot}/firewall/outgoing");
 +                chown 99,99,"${General::swroot}/firewall/outgoing";
 +        }
 +        unlink("${General::swroot}/fwhosts/customgroups");
 +        unlink("${General::swroot}/fwhosts/customhosts");
 +        unlink("${General::swroot}/fwhosts/customgroups");
 +        unlink("${General::swroot}/fwhosts/customnetworks");
 +        unlink("${General::swroot}/fwhosts/customservicegrp");
 +        unlink("${General::swroot}/fwhosts/customnetworks");
 +        system("touch ${General::swroot}/fwhosts/customgroups");
 +        system("touch ${General::swroot}/fwhosts/customhosts");
 +        system("touch ${General::swroot}/fwhosts/customnetworks");
 +        system("touch ${General::swroot}/fwhosts/customservicegrp");
 +        #START CONVERTER "OUTGOINGFW"
 +        system("/usr/sbin/convert-outgoingfw");
 +        chown 99,99,"${General::swroot}/fwhosts/customgroups";
 +        chown 99,99,"${General::swroot}/fwhosts/customhosts";
 +        chown 99,99,"${General::swroot}/fwhosts/customnetworks";
 +        chown 99,99,"${General::swroot}/fwhosts/customservicegrp";
 +        #START CONVERTER "OUTGOINGFW"
 +        rmtree("${General::swroot}/outgoing");
 +  }
 +  #XTACCESS CONVERTER
 +  if( -d "${General::swroot}/xtaccess"){
 +        if( -f "${General::swroot}/firewall/input" ){
 +                unlink("${General::swroot}/firewall/input");
 +                system("touch ${General::swroot}/firewall/input");
 +        }
 +        #START CONVERTER "XTACCESS"
 +        system("/usr/sbin/convert-xtaccess");
 +        chown 99,99,"${General::swroot}/firewall/input";
 +        rmtree("${General::swroot}/xtaccess");
 +  }
 +  #DMZ-HOLES CONVERTER
 +  if( -d "${General::swroot}/dmzholes" || -d "${General::swroot}/portfw"){
 +        if( -f "${General::swroot}/firewall/config" ){
 +                unlink("${General::swroot}/firewall/config");
 +                system("touch ${General::swroot}/firewall/config");
 +        }
 +        #START CONVERTER "DMZ-HOLES"
 +        system("/usr/sbin/convert-dmz");
 +        chown 99,99,"${General::swroot}/firewall/config";
 +        rmtree("${General::swroot}/dmzholes");
 +  }
 +  #PORTFORWARD CONVERTER
 +  if( -d "${General::swroot}/portfw"){
 +      #START CONVERTER "PORTFW"
 +      system("/usr/sbin/convert-portfw");
 +      rmtree("${General::swroot}/portfw");
 +  }
 +  system("/usr/local/bin/firewallctrl");
 + }
+   # Convert old OpenVPN CCD files (CN change, core 75).
+   system("/usr/local/bin/convert-ovpn");
+ }
  elsif ($ARGV[0] eq 'restoreaddon') {
    if ( -e "/tmp/$ARGV[1]" ){system("mv /tmp/$ARGV[1] /var/ipfire/backup/addons/backup/$ARGV[1]");}
    system("cd / && tar -xvz -p -f /var/ipfire/backup/addons/backup/$ARGV[1]");
index a53ecafc3389377dbc2d74b6e8cd90dc03c7b9bc,8bb65c384502126bd652576404bce7d30db18171..114592a8e4d0d201a6202bc7231cfa15e8b40f30
@@@ -20,8 -20,8 +20,8 @@@ etc/ld.so.con
  etc/logrotate.conf
  etc/mime.types
  etc/modprobe.d
 -etc/modprobe.d/cfg80211
 -etc/modprobe.d/pcspeaker
 +etc/modprobe.d/cfg80211.conf
 +etc/modprobe.d/pcspeaker.conf
  etc/modules.conf
  etc/mtab
  etc/nsswitch.conf
@@@ -41,7 -41,6 +41,7 @@@ etc/resolv.con
  etc/securetty
  etc/sysctl.conf
  etc/syslog.conf
 +etc/system-release
  #home
  home/nobody
  #lib
@@@ -51,10 -50,6 +51,10 @@@ media/flopp
  media/usbkey
  mnt
  #opt
 +#opt/pakfire
 +#opt/pakfire/db
 +#opt/pakfire/db/core
 +opt/pakfire/db/core/mine
  #root
  root/.bash_logout
  root/.bash_profile
@@@ -77,6 -72,7 +77,7 @@@ usr/lib/libstdc++.so.
  usr/local/bin/backupiso
  usr/local/bin/connscheduler
  usr/local/bin/consort.sh
+ usr/local/bin/convert-ovpn
  usr/local/bin/dialctrl.pl
  usr/local/bin/hddshutdown
  usr/local/bin/httpscert
@@@ -132,7 -128,6 +133,7 @@@ usr/share/doc/licenses/GPLv
  #usr/share/misc
  #usr/share/terminfo
  #usr/share/zoneinfo
 +run
  #var
  #var/cache
  var/empty
index 6516c4579631deaefd638961fe3774ef7c11a6c3,a7973a5ee47872b842e3a5570efb50768b22cd56..5dd943f19610fdfe585c0be631b4c43b08866c05
@@@ -30,7 -30,6 +30,7 @@@ use File::Copy
  use File::Temp qw/ tempfile tempdir /;
  use strict;
  use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
 +use Sort::Naturally;
  require '/var/ipfire/general-functions.pl';
  require "${General::swroot}/lang.pl";
  require "${General::swroot}/header.pl";
@@@ -69,7 -68,6 +69,7 @@@ my $confighost="${General::swroot}/fwho
  my $configgrp="${General::swroot}/fwhosts/customgroups";
  my $customnet="${General::swroot}/fwhosts/customnetworks";
  my $name;
 +my $col="";
  &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
  $cgiparams{'ENABLED'} = 'off';
  $cgiparams{'ENABLED_BLUE'} = 'off';
@@@ -167,29 -165,49 +167,29 @@@ sub deletebackupcer
                unlink ("${General::swroot}/ovpn/certs/$hexvalue.pem");
        }
  }
 -
  sub checkportfw {
 -    my $KEY2 = $_[0]; # key2
 -    my $SRC_PORT = $_[1]; # src_port
 -    my $PROTOCOL = $_[2]; # protocol
 -    my $SRC_IP = $_[3]; # sourceip
 -
 -    my $pfwfilename = "${General::swroot}/portfw/config";
 -    open(FILE, $pfwfilename) or die 'Unable to open config file.';
 -    my @pfwcurrent = <FILE>;
 -    close(FILE);
 -    my $pfwkey1 = 0; # used for finding last sequence number used 
 -    foreach my $pfwline (@pfwcurrent)
 -    {
 -      my @pfwtemp = split(/\,/,$pfwline);
 -
 -      chomp ($pfwtemp[8]);
 -      if ($KEY2 eq "0"){ # if key2 is 0 then it is a portfw addition
 -              if ( $SRC_PORT eq $pfwtemp[3] &&
 -                      $PROTOCOL eq $pfwtemp[2] &&
 -                      $SRC_IP eq $pfwtemp[7])
 -              {
 -                       $errormessage = "$Lang::tr{'source port in use'} $SRC_PORT";
 -              }
 -              # Check if key2 = 0, if it is then it is a port forward entry and we want the sequence number
 -              if ( $pfwtemp[1] eq "0") {
 -                      $pfwkey1=$pfwtemp[0];
 -              }
 -              # Darren Critchley - Duplicate or overlapping Port range check
 -              if ($pfwtemp[1] eq "0" && 
 -                      $PROTOCOL eq $pfwtemp[2] &&
 -                      $SRC_IP eq $pfwtemp[7] &&
 -                      $errormessage eq '') 
 -              {
 -                      &portchecks($SRC_PORT, $pfwtemp[5]);            
 -#                     &portchecks($pfwtemp[3], $pfwtemp[5]);
 -#                     &portchecks($pfwtemp[3], $SRC_IP);
 +      my $DPORT = shift;
 +      my $DPROT = shift;
 +      my %natconfig =();
 +      my $confignat = "${General::swroot}/firewall/config";
 +      $DPROT= uc ($DPROT);
 +      &General::readhasharray($confignat, \%natconfig);
 +      foreach my $key (sort keys %natconfig){
 +              my @portarray = split (/\|/,$natconfig{$key}[30]);
 +              foreach my $value (@portarray){
 +                      if ($value =~ /:/i){
 +                              my ($a,$b) = split (":",$value);
 +                              if ($DPROT eq $natconfig{$key}[12] && $DPORT gt $a && $DPORT lt $b){
 +                                      $errormessage= "$Lang::tr{'source port in use'} $DPORT";
 +                              }
 +                      }else{
 +                              if ($DPROT eq $natconfig{$key}[12] && $DPORT eq $value){
 +                                      $errormessage= "$Lang::tr{'source port in use'} $DPORT";
 +                              }
 +                      }
                }
        }
 -    }
 -#    $errormessage="$KEY2 $SRC_PORT $PROTOCOL $SRC_IP";
 -
 -    return;
 +      return;
  }
  
  sub checkportoverlap
@@@ -221,6 -239,32 +221,6 @@@ sub checkportin
                return 0; 
        }
  }
 -# Darren Critchley - Duplicate or overlapping Port range check
 -sub portchecks
 -{
 -      my $p1 = $_[0]; # New port range
 -      my $p2 = $_[1]; # existing port range
 -#     $_ = $_[0];
 -      our ($prtrange1, $prtrange2);
 -      $prtrange1 = 0;
 -#     if (m/:/ && $prtrange1 == 1) { # comparing two port ranges
 -#             unless (&checkportoverlap($p1,$p2)) {
 -#                     $errormessage = "$Lang::tr{'source port overlaps'} $p1";
 -#             }
 -#     }
 -      if (m/:/ && $prtrange1 == 0 && $errormessage eq '') { # compare one port to a range
 -              unless (&checkportinc($p2,$p1)) {
 -                      $errormessage = "$Lang::tr{'srcprt within existing'} $p1";
 -              }
 -      }
 -      $prtrange1 = 1;
 -      if (! m/:/ && $prtrange1 == 1 && $errormessage eq '') { # compare one port to a range
 -              unless (&checkportinc($p1,$p2)) {
 -                      $errormessage = "$Lang::tr{'srcprt range overlaps'} $p2";
 -              }
 -      }
 -      return;
 -}
  
  # Darren Critchley - certain ports are reserved for IPFire 
  # TCP 67,68,81,222,445
@@@ -1100,7 -1144,7 +1100,7 @@@ if ($cgiparams{'ACTION'} eq $Lang::tr{'
      
      
      if ($cgiparams{'ENABLED'} eq 'on'){
 -      &checkportfw(0,$cgiparams{'DDEST_PORT'},$cgiparams{'DPROTOCOL'},'0.0.0.0');
 +      &checkportfw($cgiparams{'DDEST_PORT'},$cgiparams{'DPROTOCOL'});
      }
        
      if ($errormessage) { goto SETTINGS_ERROR; }
@@@ -2572,7 -2616,7 +2572,7 @@@ EN
        }
        
        print <<END
 -    <table width='100%' border='0'  cellpadding='0' cellspacing='1'>
 +    <table width='100%' cellpadding='0' cellspacing='1'>
      <tr>
        <td class='boldbase' align='center' nowrap='nowrap' width='20%'><b>$Lang::tr{'ccd name'}</td><td class='boldbase' align='center' width='8%'><b>$Lang::tr{'network'}</td><td class='boldbase' width='8%' align='center' nowrap='nowrap'><b>$Lang::tr{'ccd used'}</td><td width='1%' align='center'></td><td width='1%' align='center'></td></tr>
  END
  #     <td><b>$Lang::tr{'protocol'}</b></td>
  # protocol temp removed 
      print <<END
 -    <table width='100%' border='0' cellpadding='2' cellspacing='0'>
 +    <table width='100%' cellpadding='2' cellspacing='0' class='tbl'>
      <tr>
 -      <td><b>$Lang::tr{'common name'}</b></td>
 -      <td><b>$Lang::tr{'real address'}</b></td>
 -      <td><b>$Lang::tr{'virtual address'}</b></td>
 -      <td><b>$Lang::tr{'loged in at'}</b></td>
 -      <td><b>$Lang::tr{'bytes sent'}</b></td>
 -      <td><b>$Lang::tr{'bytes received'}</b></td>
 -      <td><b>$Lang::tr{'last activity'}</b></td>
 +      <th><b>$Lang::tr{'common name'}</b></th>
 +      <th><b>$Lang::tr{'real address'}</b></th>
 +      <th><b>$Lang::tr{'virtual address'}</b></th>
 +      <th><b>$Lang::tr{'loged in at'}</b></th>
 +      <th><b>$Lang::tr{'bytes sent'}</b></th>
 +      <th><b>$Lang::tr{'bytes received'}</b></th>
 +      <th><b>$Lang::tr{'last activity'}</b></th>
      </tr>
  END
  ;
        }
        my $user2 = @users;
        if ($user2 >= 1){
 -          for (my $idx = 1; $idx <= $user2; $idx++){
 +              for (my $idx = 1; $idx <= $user2; $idx++){
                                                if ($idx % 2) {
 -                                      print "<tr bgcolor='$color{'color20'}'>\n";
 -                              } else {
 -                                      print "<tr bgcolor='$color{'color22'}'>\n";
 +                                                      print "<tr>";
 +                                                      $col="bgcolor='$color{'color22'}'";
 +                                              } else {
 +                                                      print "<tr>";
 +                                                      $col="bgcolor='$color{'color20'}'";
                                                }
 -                                              print "<td align='left'>$users[$idx-1]{'CommonName'}</td>";
 -                                              print "<td align='left'>$users[$idx-1]{'RealAddress'}</td>";
 -                                              print "<td align='left'>$users[$idx-1]{'VirtualAddress'}</td>";
 -                                              print "<td align='left'>$users[$idx-1]{'Since'}</td>";
 -                                              print "<td align='left'>$users[$idx-1]{'BytesSent'}</td>";
 -                                              print "<td align='left'>$users[$idx-1]{'BytesReceived'}</td>";
 -                                              print "<td align='left'>$users[$idx-1]{'LastRef'}</td>";
 -#                     print "<td align='left'>$users[$idx-1]{'Proto'}</td>";
 -          }
 -      }        
 +                                              print "<td align='left' $col>$users[$idx-1]{'CommonName'}</td>";
 +                                              print "<td align='left' $col>$users[$idx-1]{'RealAddress'}</td>";
 +                                              print "<td align='left' $col>$users[$idx-1]{'VirtualAddress'}</td>";
 +                                              print "<td align='left' $col>$users[$idx-1]{'Since'}</td>";
 +                                              print "<td align='left' $col>$users[$idx-1]{'BytesSent'}</td>";
 +                                              print "<td align='left' $col>$users[$idx-1]{'BytesReceived'}</td>";
 +                                              print "<td align='left' $col>$users[$idx-1]{'LastRef'}</td>";
 +                      }
 +      }
        
        print "</table>";
        print <<END
@@@ -3947,7 -3990,6 +3947,6 @@@ if ($cgiparams{'TYPE'} eq 'net') 
                        if ( -e "${General::swroot}/ovpn/ccd/$confighash{$key}[2]"){
                                unlink "${General::swroot}/ovpn/ccd/$cgiparams{'CERT_NAME'}";
                        }
-                       $confighash{$key}[2] =~ s/ /_/gi;
                        open ( CCDRWCONF,'>',"${General::swroot}/ovpn/ccd/$confighash{$key}[2]") or die "Unable to create clientconfigfile $!";
                        print CCDRWCONF "# OpenVPN clientconfig from ccd extension by Copymaster#\n\n";
                        if($cgiparams{'CHECK1'} eq 'dynamic'){
@@@ -4536,7 -4578,7 +4535,7 @@@ EN
      
  #default setzen
      if ($cgiparams{'DCIPHER'} eq '') {
 -      $cgiparams{'DCIPHER'} =  'BF-CBC';     
 +      $cgiparams{'DCIPHER'} =  'AES-256-CBC';
      }
      if ($cgiparams{'DDEST_PORT'} eq '') {
        $cgiparams{'DDEST_PORT'} =  '1194';     
      $selected{'DCIPHER'}{'AES-128-CBC'} = '';
      $selected{'DCIPHER'}{'AES-192-CBC'} = '';
      $selected{'DCIPHER'}{'AES-256-CBC'} = '';
 +    $selected{'DCIPHER'}{'CAMELLIA-128-CBC'} = '';
 +    $selected{'DCIPHER'}{'CAMELLIA-192-CBC'} = '';
 +    $selected{'DCIPHER'}{'CAMELLIA-256-CBC'} = '';
      $selected{'DCIPHER'}{$cgiparams{'DCIPHER'}} = 'SELECTED';
      $checked{'DCOMPLZO'}{'off'} = '';
      $checked{'DCOMPLZO'}{'on'} = '';
      <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td>
          <td><input type='checkbox' name='DCOMPLZO' $checked{'DCOMPLZO'}{'on'} /></td>
          <td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td>
 -        <td><select name='DCIPHER'><option value='DES-CBC' $selected{'DCIPHER'}{'DES-CBC'}>DES-CBC</option>
 -                                 <option value='DES-EDE-CBC' $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC</option>
 -                                 <option value='DES-EDE3-CBC' $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC</option>
 -                                 <option value='DESX-CBC' $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC</option>
 -                                 <option value='RC2-CBC' $selected{'DCIPHER'}{'RC2-CBC'}>RC2-CBC</option>                                                                 
 -                                 <option value='RC2-40-CBC' $selected{'DCIPHER'}{'RC2-40-CBC'}>RC2-40-CBC</option>
 -                                 <option value='RC2-64-CBC' $selected{'DCIPHER'}{'RC2-64-CBC'}>RC2-64-CBC</option>
 -                                 <option value='BF-CBC' $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC</option>
 -                                 <option value='CAST5-CBC' $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC</option>
 -                                 <option value='AES-128-CBC' $selected{'DCIPHER'}{'AES-128-CBC'}>AES-128-CBC</option>
 -                                 <option value='AES-192-CBC' $selected{'DCIPHER'}{'AES-192-CBC'}>AES-192-CBC</option>
 -                                 <option value='AES-256-CBC' $selected{'DCIPHER'}{'AES-256-CBC'}>AES-256-CBC</option></select></td></tr>
 -                                 <tr><td colspan='4'><hr /></td></tr>
 +        <td><select name='DCIPHER'>
 +              <option value='CAMELLIA-256-CBC' $selected{'DCIPHER'}{'CAMELLIA-256-CBC'}>CAMELLIA-256-CBC</option>
 +              <option value='CAMELLIA-192-CBC' $selected{'DCIPHER'}{'CAMELLIA-192-CBC'}>CAMELLIA-192-CBC</option>
 +              <option value='CAMELLIA-128-CBC' $selected{'DCIPHER'}{'CAMELLIA-128-CBC'}>CAMELLIA-128-CBC</option>
 +              <option value='AES-256-CBC' $selected{'DCIPHER'}{'AES-256-CBC'}>AES-256-CBC</option>
 +              <option value='AES-192-CBC' $selected{'DCIPHER'}{'AES-192-CBC'}>AES-192-CBC</option>
 +              <option value='AES-128-CBC' $selected{'DCIPHER'}{'AES-128-CBC'}>AES-128-CBC</option>
 +              <option value='CAST5-CBC' $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC</option>
 +              <option value='RC2-64-CBC' $selected{'DCIPHER'}{'RC2-64-CBC'}>RC2-64-CBC</option>
 +              <option value='RC2-40-CBC' $selected{'DCIPHER'}{'RC2-40-CBC'}>RC2-40-CBC</option>
 +              <option value='RC2-CBC' $selected{'DCIPHER'}{'RC2-CBC'}>RC2-CBC</option>
 +              <option value='BF-CBC' $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC</option>
 +              <option value='DES-CBC' $selected{'DCIPHER'}{'DES-CBC'}>DES-CBC</option>
 +              <option value='DES-EDE-CBC' $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC</option>
 +              <option value='DES-EDE3-CBC' $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC</option>
 +              <option value='DESX-CBC' $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC</option>
 +      </select></td></tr>
 +    <tr><td colspan='4'><hr /></td></tr>
  END
  ;                                
      
      &Header::closebox();
      &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate authorities'}:");
      print <<EOF#'
 -    <table width='100%' border='0' cellspacing='1' cellpadding='0'>
 +    <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
      <tr>
 -      <td width='25%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></td>
 -      <td width='65%' class='boldbase' align='center'><b>$Lang::tr{'subject'}</b></td>
 -      <td width='10%' class='boldbase' colspan='3' align='center'><b>$Lang::tr{'action'}</b></td>
 +      <th width='25%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></th>
 +      <th width='65%' class='boldbase' align='center'><b>$Lang::tr{'subject'}</b></th>
 +      <th width='10%' class='boldbase' colspan='3' align='center'><b>$Lang::tr{'action'}</b></th>
      </tr>
  EOF
      ;
 +    my $col1="bgcolor='$color{'color22'}'";
 +      my $col2="bgcolor='$color{'color20'}'";
      if (-f "${General::swroot}/ovpn/ca/cacert.pem") {
        my $casubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/cacert.pem`;
        $casubject    =~ /Subject: (.*)[\n]/;
        $casubject    = $1;
        $casubject    =~ s+/Email+, E+;
        $casubject    =~ s/ ST=/ S=/;
 -
        print <<END
 -      <tr bgcolor='$color{'color22'}'>
 -      <td class='base'>$Lang::tr{'root certificate'}</td>
 -      <td class='base'>$casubject</td>
 -      <form method='post' name='frmrootcrta'><td width='3%' align='center'>
 +      <tr>
 +      <td class='base' $col1>$Lang::tr{'root certificate'}</td>
 +      <td class='base' $col1>$casubject</td>
 +      <form method='post' name='frmrootcrta'><td width='3%' align='center' $col1>
            <input type='hidden' name='ACTION' value='$Lang::tr{'show root certificate'}' />
            <input type='image' name='$Lang::tr{'edit'}' src='/images/info.gif' alt='$Lang::tr{'show root certificate'}' title='$Lang::tr{'show root certificate'}' width='20' height='20' border='0' />
        </td></form>
 -      <form method='post' name='frmrootcrtb'><td width='3%' align='center'>
 +      <form method='post' name='frmrootcrtb'><td width='3%' align='center' $col1>
            <input type='image' name='$Lang::tr{'download root certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download root certificate'}' title='$Lang::tr{'download root certificate'}' border='0' />
            <input type='hidden' name='ACTION' value='$Lang::tr{'download root certificate'}' />
        </td></form>
 -      <td width='4%'>&nbsp;</td></tr>
 +      <td width='4%' $col1>&nbsp;</td></tr>
  END
        ;
      } else {
        # display rootcert generation buttons
        print <<END
 -      <tr bgcolor='$color{'color22'}'>
 -      <td class='base'>$Lang::tr{'root certificate'}:</td>
 -      <td class='base'>$Lang::tr{'not present'}</td>
 -      <td colspan='3'>&nbsp;</td></tr>
 +      <tr>
 +      <td class='base' $col1>$Lang::tr{'root certificate'}:</td>
 +      <td class='base' $col1>$Lang::tr{'not present'}</td>
 +      <td colspan='3' $col1>&nbsp;</td></tr>
  END
        ;
      }
        $hostsubject    =~ s/ ST=/ S=/;
  
        print <<END
 -      <tr bgcolor='$color{'color20'}'>
 -      <td class='base'>$Lang::tr{'host certificate'}</td>
 -      <td class='base'>$hostsubject</td>
 -      <form method='post' name='frmhostcrta'><td width='3%' align='center'>
 +      <tr>
 +      <td class='base' $col2>$Lang::tr{'host certificate'}</td>
 +      <td class='base' $col2>$hostsubject</td>
 +      <form method='post' name='frmhostcrta'><td width='3%' align='center' $col2>
            <input type='hidden' name='ACTION' value='$Lang::tr{'show host certificate'}' />
            <input type='image' name='$Lang::tr{'show host certificate'}' src='/images/info.gif' alt='$Lang::tr{'show host certificate'}' title='$Lang::tr{'show host certificate'}' width='20' height='20' border='0' />
        </td></form>
 -      <form method='post' name='frmhostcrtb'><td width='3%' align='center'>
 -          <input type='image' name='$Lang::tr{'download host certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download host certificate'}' title='$Lang::tr{'download host certificate'}' border='0' />
 -          <input type='hidden' name='ACTION' value='$Lang::tr{'download host certificate'}' />
 +      <form method='post' name='frmhostcrtb'><td width='3%' align='center' $col2>
 +          <input type='image' name="$Lang::tr{'download host certificate'}" src='/images/media-floppy.png' alt="$Lang::tr{'download host certificate'}" title="$Lang::tr{'download host certificate'}" border='0' />
 +          <input type='hidden' name='ACTION' value="$Lang::tr{'download host certificate'}" />
        </td></form>
 -      <td width='4%'>&nbsp;</td></tr>
 +      <td width='4%' $col2>&nbsp;</td></tr>
  END
        ;
      } else {
        # Nothing
        print <<END
 -      <tr bgcolor='$color{'color20'}'>
 -      <td width='25%' class='base'>$Lang::tr{'host certificate'}:</td>
 -      <td class='base'>$Lang::tr{'not present'}</td>
 -      </td><td colspan='3'>&nbsp;</td></tr>
 +      <tr>
 +      <td width='25%' class='base' $col2>$Lang::tr{'host certificate'}:</td>
 +      <td class='base' $col2>$Lang::tr{'not present'}</td>
 +      </td><td colspan='3' $col2>&nbsp;</td></tr>
  END
        ;
      }
      print <<END
  
  
 -    <table width='100%' border='0' cellspacing='1' cellpadding='0'>
 +    <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
  <tr>
 -    <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></td>
 -    <td width='15%' class='boldbase' align='center'><b>$Lang::tr{'type'}</b></td>
 -    <td width='22%' class='boldbase' align='center'><b>$Lang::tr{'network'}</b></td>
 -    <td width='20%' class='boldbase' align='center'><b>$Lang::tr{'remark'}</b></td>
 -    <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'status'}</b></td>
 -    <td width='5%' class='boldbase' colspan='6' align='center'><b>$Lang::tr{'action'}</b></td>
 +    <th width='10%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></th>
 +    <th width='15%' class='boldbase' align='center'><b>$Lang::tr{'type'}</b></th>
 +    <th width='22%' class='boldbase' align='center'><b>$Lang::tr{'network'}</b></th>
 +    <th width='20%' class='boldbase' align='center'><b>$Lang::tr{'remark'}</b></th>
 +    <th width='10%' class='boldbase' align='center'><b>$Lang::tr{'status'}</b></th>
 +    <th width='5%' class='boldbase' colspan='6' align='center'><b>$Lang::tr{'action'}</b></th>
  </tr>
  END
        ;
 -        my $id = 0;
 -        my $gif;
 -       foreach my $key (sort { uc($confighash{$a}[1]) cmp uc($confighash{$b}[1]) } keys %confighash) {
 -      if ($confighash{$key}[0] eq 'on') { $gif = 'on.gif'; } else { $gif = 'off.gif'; }
 -
 +      my $id = 0;
 +      my $gif;
 +      foreach my $key (sort { ncmp ($confighash{$a}[1],$confighash{$b}[1]) } keys %confighash) {
 +      if ($confighash{$key}[0] eq 'on') { $gif = 'on.gif'; } else { $gif = 'off.gif'; }
        if ($id % 2) {
 -          print "<tr bgcolor='$color{'color20'}'>\n";
 +              print "<tr>";
 +              $col="bgcolor='$color{'color20'}'";
        } else {
 -          print "<tr bgcolor='$color{'color22'}'>\n";
 +              print "<tr>";
 +              $col="bgcolor='$color{'color22'}'";
        }
 -      print "<td align='center' nowrap='nowrap'>$confighash{$key}[1]</td>";
 -      print "<td align='center' nowrap='nowrap'>" . $Lang::tr{"$confighash{$key}[3]"} . " (" . $Lang::tr{"$confighash{$key}[4]"} . ")</td>";
 +      print "<td align='center' nowrap='nowrap' $col>$confighash{$key}[1]</td>";
 +      print "<td align='center' nowrap='nowrap' $col>" . $Lang::tr{"$confighash{$key}[3]"} . " (" . $Lang::tr{"$confighash{$key}[4]"} . ")</td>";
        #if ($confighash{$key}[4] eq 'cert') {
            #print "<td align='left' nowrap='nowrap'>$confighash{$key}[2]</td>";
        #} else {
        $cavalid    = $1;
        if ($confighash{$key}[32] eq "" && $confighash{$key}[3] eq 'net' ){$confighash{$key}[32]="net-2-net";}
        if ($confighash{$key}[32] eq "" && $confighash{$key}[3] eq 'host' ){$confighash{$key}[32]="dynamic";}
 -      print "<td align='center'>$confighash{$key}[32]</td>";
 -      print "<td align='center'>$confighash{$key}[25]</td>";
 +      print "<td align='center' $col>$confighash{$key}[32]</td>";
 +      print "<td align='center' $col>$confighash{$key}[25]</td>";
  
        my $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourred}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsclosed'}</font></b></td></tr></table>";
  
  
  
        print <<END
 -      <td align='center'>$active</td>
 +      <td align='center' $col>$active</td>
                
 -      <form method='post' name='frm${key}a'><td align='center'>
 +      <form method='post' name='frm${key}a'><td align='center' $col>
            <input type='image'  name='$Lang::tr{'dl client arch'}' src='/images/openvpn.png' alt='$Lang::tr{'dl client arch'}' title='$Lang::tr{'dl client arch'}' border='0' />
            <input type='hidden' name='ACTION' value='$Lang::tr{'dl client arch'}' />
            <input type='hidden' name='KEY' value='$key' />
@@@ -4961,7 -4993,7 +4960,7 @@@ EN
        ;
        if ($confighash{$key}[4] eq 'cert') {
            print <<END
 -          <form method='post' name='frm${key}b'><td align='center'>
 +          <form method='post' name='frm${key}b'><td align='center' $col>
                <input type='image' name='$Lang::tr{'show certificate'}' src='/images/info.gif' alt='$Lang::tr{'show certificate'}' title='$Lang::tr{'show certificate'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'show certificate'}' />
                <input type='hidden' name='KEY' value='$key' />
@@@ -4972,7 -5004,7 +4971,7 @@@ EN
        }
        if ($confighash{$key}[4] eq 'cert' && -f "${General::swroot}/ovpn/certs/$confighash{$key}[1].p12") { 
            print <<END
 -          <form method='post' name='frm${key}c'><td align='center'>
 +          <form method='post' name='frm${key}c'><td align='center' $col>
                <input type='image' name='$Lang::tr{'download pkcs12 file'}' src='/images/media-floppy.png' alt='$Lang::tr{'download pkcs12 file'}' title='$Lang::tr{'download pkcs12 file'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'download pkcs12 file'}' />
                <input type='hidden' name='KEY' value='$key' />
  END
        ; } elsif ($confighash{$key}[4] eq 'cert') {
            print <<END
 -          <form method='post' name='frm${key}c'><td align='center'>
 +          <form method='post' name='frm${key}c'><td align='center' $col>
                <input type='image' name='$Lang::tr{'download certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' title='$Lang::tr{'download certificate'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'download certificate'}' />
                <input type='hidden' name='KEY' value='$key' />
            print "<td>&nbsp;</td>";
        }
        print <<END
 -      <form method='post' name='frm${key}d'><td align='center'>
 +      <form method='post' name='frm${key}d'><td align='center' $col>
            <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$Lang::tr{'toggle enable disable'}' title='$Lang::tr{'toggle enable disable'}' border='0' />
            <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
            <input type='hidden' name='KEY' value='$key' />
        </td></form>
  
 -      <form method='post' name='frm${key}e'><td align='center'>
 +      <form method='post' name='frm${key}e'><td align='center' $col>
            <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
            <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' width='20' height='20' border='0'/>
            <input type='hidden' name='KEY' value='$key' />
        </td></form>
 -      <form method='post' name='frm${key}f'><td align='center'>
 +      <form method='post' name='frm${key}f'><td align='center' $col>
            <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
            <input type='image'  name='$Lang::tr{'remove'}' src='/images/delete.gif' alt='$Lang::tr{'remove'}' title='$Lang::tr{'remove'}' width='20' height='20' border='0' />
            <input type='hidden' name='KEY' value='$key' />