#!/usr/bin/perl

# Este script configura Linux tras pasar el programa ImageCast

require '/imagecast/dirip.pm';

# Lo primero es preguntar por la Sala

while ( ($sala !~ /^(\d{1,2})$/) || ($sala < 1 ) || ($sala > 10 ) )
{
  $sala = &salas;
}

# Lo segundo es preguntar por la IP

while ($dir_ip = &prompt)
{
  if ( ($dir_ip =~ /^(\d{1,3})$/) && ($dir_ip > 0 ) && ($dir_ip < 100 ) )
  {
    # Ahora miro si está en la lista de mis IPs
    if ( defined $ipes{$dir_ip} )
    {
      system "$borra_pan";
      print "\n\n\n Configurando $ipes{$dir_ip}.sala$sala.cc (192.168.$sala.$dir_ip)";
      &hostname($ipes{$dir_ip},$sala);
      &ifcfg_eth0($sala,$dir_ip);
      &yp($sala);
      &network($ipes{$dir_ip},$sala);
      &hosts($ipes{$dir_ip},$dir_ip,$sala);
      &fstab($sala);
      &printcap($sala);
      &sshd($dir_ip,$sala);
      &xntpd($sala);
      &lilo($sala);
      &resolv($sala);
      print "\n Generando claves para SSH \n";
      system "/bin/hostname $ipes{$dir_ip}.sala$sala.cc";
      system "/bin/rm -f /etc/ssh/ssh_host_key";
      system "/usr/bin/ssh-keygen -b 1024 -f /etc/ssh/ssh_host_key -N ''";
      &msdos($dir_ip);
      exit 0;
    }
    else
    {
      system "$borra_pan";
      print "\n\n\n La direccion IP 192.168.$sala.$dir_ip no corresponde a las Salas existentes. \n"; 
      print "\n\n Pulsa Retorno \n\n";
      $respuesta = ;
      system "$borra_pan";
    }
  }
  else
  {
    system "$borra_pan";
    print STDOUT "\n\n\n ¡Lo siento, debe introducir un numero entre 1 y 99! \n\n";
  }
}

# Pantalla para introducir la sala
sub salas
{
  local($respuesta) = "";
  while ($respuesta eq "")
  {
    system "$borra_pan";
    print "\n\n Programa para configurar Linux tras ImageCast \n";
    print "\n Dime la sala donde estás [1-10]: ";
    chop($respuesta = );
  }
    return($respuesta);
}

# Pantalla para introducir la IP
sub prompt
{
  local($respuesta) = "";
  while ($respuesta eq "")
  {
    print "\n Dime el último número de la IP [1-99]: ";
    chop($respuesta = );
  }
    return($respuesta);
}


# Cambia el nombre en el fichero /etc/HOSTNAME
sub hostname
{
  local($maquina, $sala) = @_;
  open(FICHERO,"$dirfich/modelo/HOSTNAME") or die "No se pudo abrir $dirfich/modelo/HOSTNAME";
  open(ARCHIVO,">$fich_hostname") or die "No se pudo crear $fich_hostname";

  while ($linea = )
  {
    if ($linea =~ /modelo/ )
    {
      $linea =~ s/modelo/$maquina/g;
    }

    if ($linea =~ /x/ )
    {
      $linea =~ s/x/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_hostname"; 
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/HOSTNAME"; 
  print "\n Modificado fichero $fich_hostname ($maquina.sala$sala.cc)";
}

# Cambia la IP en el fichero /etc/sysconfig/network-scripts/ifcfg-eth0
sub ifcfg_eth0
{
  local($sala, $ip_dir) = @_;
  open(FICHERO,"$dirfich/modelo/ifcfg-eth0") or die "No se pudo abrir $dirfich/modelo/ifcfg-eth0";
  open(ARCHIVO,">$fich_ifcfg_eth0") or die "No se pudo crear $fich_ifcfg_eth0";

  while ($linea = )
  {
    if ($linea =~ /x/ )
    {
      $linea =~ s/x/$sala/g;
    }
    if ($linea =~ /50/ )
    {
      $linea =~ s/50/$ip_dir/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_ifcfg_eth0";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/ifcfg-eth0";
  print "\n Modificado fichero $fich_ifcfg_eth0";
}

# Cambia IP servidor NIS en el fichero /etc/yp.conf
sub yp
{
  local($sala) = @_;
  open(FICHERO,"$dirfich/modelo/yp.conf") or die "No se pudo abrir $dirfich/modelo/yp.conf";
  open(ARCHIVO,">$fich_yp") or die "No se pudo crear $fich_yp";

  while ($linea = )
  {
    if ($linea =~ /^ypserver/)
    {
      $linea =~ s/x/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_yp";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/yp.conf";
  print "\n Modificado fichero $fich_yp";
}

# Cambia dominio NIS y el nombre en el fichero /etc/sysconfig/network
sub network
{
  local($maquina, $sala) = @_;
  open(FICHERO,"$dirfich/modelo/network") or die "No se pudo abrir $dirfich/modelo/network";
  open(ARCHIVO,">$fich_network") or die "No se pudo crear $fich_network";

  while ($linea = )
  {
    if ($linea =~ /modelo/ )
    {
      $linea =~ s/modelo/$maquina/g;
    }
    if ($linea =~ /x/)
    {
      $linea =~ s/x/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_network";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/network";
  print "\n Modificado fichero $fich_network";
}

# Cambia nombre e IP en el fichero /etc/hosts
sub hosts
{
  local($maquina,$ip_dir,$sala) = @_;
  open(FICHERO,"$dirfich/modelo/hosts") or die "No se pudo abrir $dirfich/modelo/hosts";
  open(ARCHIVO,">$fich_hosts") or die "No se pudo crear $fich_hosts";

  while ($linea = )
  {
    if ($linea =~ /50/ )
    {
      $linea =~ s/50/$ip_dir/g;
    }
    if ($linea =~ /modelo/ )
    {
      $linea =~ s/modelo/$maquina/g;
    }
    if ($linea =~ /q/ )
    {
      $linea =~ s/q/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_hosts";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/hosts";
  print "\n Modificado fichero $fich_hosts";
}

# Cambia nombre servidor NFS en el fichero /etc/fstab
sub fstab
{
  local($sala) = @_;
  open(FICHERO,"$dirfich/modelo/fstab") or die "No se pudo abrir $dirfich/modelo/fstab";
  open(ARCHIVO,">$fich_fstab") or die "No se pudo crear $fich_fstab";

  while ($linea = )
  {
    if ($linea =~ /q/ )
    {
      $linea =~ s/q/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_fstab";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/fstab";
  print "\n Modificado fichero $fich_fstab";
}

# Cambia IP de la impresora en red en el fichero /etc/printcap
sub printcap
{
  local($sala) = @_;
  open(FICHERO,"$dirfich/modelo/printcap") or die "No se pudo abrir $dirfich/modelo/printcap";
  open(ARCHIVO,">$fich_printcap") or die "No se pudo crear $fich_printcap";

  while ($linea = )
  {
    if ($linea =~ /sala/)
    {
      $linea =~ s/sala/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_printcap";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/printcap";
  print "\n Modificado fichero $fich_printcap";
}

# Cambia la IP en el fichero /etc/ssh/sshd_config
sub sshd
{
  local($dir_ip, $sala) = @_;
  open(FICHERO,"$dirfich/modelo/sshd_config") or die "No se pudo abrir $dirfich/modelo/sshd_config";
  open(ARCHIVO,">$fich_sshd") or die "No se pudo crear $fich_sshd";

  while ($linea = )
  {
    if ($linea =~ /ListenAddress/ )
    {
      $linea =~ s/sala/$sala/g;
      $linea =~ s/modelo/$dir_ip/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_sshd";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/sshd_config";
  print "\n Modificado fichero $fich_sshd";
}

# Cambia el servidor de sincronización horaria
sub xntpd
{
  local($sala) = @_;
  open(FICHERO,"$dirfich/modelo/xntpd") or die "No se pudo abrir $dirfich/modelo/xntpd";
  open(ARCHIVO,">$fich_xntpd") or die "No se pudo crear $fich_xntpd";

  while ($linea = )
  {
    if ($linea =~ /ntpdate/)
    {
      $linea =~ s/sala/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_xntpd";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/xntpd";
  print "\n Modificado fichero $fich_xntpd";
}

# Cambia la clave en /etc/lilo.conf
sub lilo
{
  local($sala) = @_;
  open(FICHERO,"$dirfich/modelo/lilo.conf") or die "No se pudo abrir $dirfich/modelo/lilo.conf";
  open(ARCHIVO,">$fich_lilo") or die "No se pudo crear $fich_lilo";

  while ($linea = )
  {
    if ($linea =~ /sala/)
    {
      $linea =~ s/sala/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_lilo";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/lilo.conf";
  system "/bin/chmod 600 /etc/lilo.conf";
  system "cd /etc ; /sbin/lilo";
  print "\n Modificado fichero $fich_lilo";
}

# Cambia resolución en /etc/resolv.conf
sub resolv
{
  local($sala) = @_;
  open(FICHERO,"$dirfich/modelo/resolv.conf") or die "No se pudo abrir $dirfich/modelo/resolv.conf";
  open(ARCHIVO,">$fich_resolv") or die "No se pudo crear $fich_resolv";

  while ($linea = )
  {
    if ($linea =~ /x/)
    {
      $linea =~ s/x/$sala/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_resolv";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo/resolv.conf";
  print "\n Modificado fichero $fich_resolv";
}

# Parte DOS
sub msdos
{
  local($numero) = @_;

  system "/bin/mount -t msdos /dev/hda4 /mnt";

  open(FICHERO,"$dirfich/modelo.msdos/system.ini") or die "No se pudo abrir $dirfich/modelo.msdos/system.ini";
  open(ARCHIVO,">$fich_system") or die "No se pudo crear $fich_system";

  while ($linea = )
  {
    if ($linea =~ /ComputerName/)
    {
      $linea =~ s/50/$numero/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_system";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo.msdos/system.ini";
  print "\n Modificado fichero C:\\WINDOWS\\SYSTEM.INI";

  open(FICHERO,"$dirfich/modelo.msdos/protocol.ini") or die "No se pudo abrir $dirfich/modelo.msdos/protocol.ini";
  open(ARCHIVO,">$fich_protocol") or die "No se pudo crear $fich_protocol";

  while ($linea = )
  {
    if ($linea =~ /IPAddress0/)
    {
      $linea =~ s/50/$numero/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_protocol";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo.msdos/protocol.ini";
  print "\n Modificado fichero C:\\WINDOWS\\PROTOCOL.INI";

  open(FICHERO,"$dirfich/modelo.msdos/tcputils.ini") or die "No se pudo abrir $dirfich/modelo.msdos/tcputils.ini";
  open(ARCHIVO,">$fich_tcputils") or die "No se pudo crear $fich_tcputils";

  while ($linea = )
  {
    if ($linea =~ /hostname/)
    {
      $linea =~ s/50/$numero/g;
    }
    print ARCHIVO $linea;
  }
  close(ARCHIVO) or die "No se pudo cerrar $fich_tcputils";
  close(FICHERO) or die "No se pudo cerrar $dirfich/modelo.msdos/tcputils.ini";
  print "\n Modificado fichero C:\\WINDOWS\\TCPUTILS.INI \n";

  system "/bin/umount /mnt";

}