viernes, 24 de febrero de 2017

Manual de PHP

Manual de PHP




PHP es un acrónimo de PHP Hypertext Preprocessor.

Es un lenguaje de programación orientado principalmente para el desarrollo de sitios web en Internet.

También conocido como código spagetti ya que en el desarrollo de las páginas web, se 'mezcla'  código HTML con código PHP.

 
Como os comentaba en un post anterior este año cambié de módulos a impartir y en dos de ellos se imparte PHP:
  • C.S. Desarrollo de Aplicaciones WEB => Módulo: Desarrollo web en entorno servidor.
  • C.S. Administración de Sistemas Informáticos y en Red => Módulo: Implantación de Aplicaciones Web

 El manual está orientado más al módulo de 'Desarrollo web en entorno servidor', en el que los alumnos ya conocen la programación, por lo que los aspectos básicos de la misma (utilizar estructuras secuenciales, condicionales y repetitivas) son conocidos, por eso en el manual, estos aspectos no son tratados en profundidad.

Será necesario por tanto que aquellas personas interesadas en seguir el curso, tengan algún conocimiento básico de programación estructurada.




Requerimientos para aprovechar el curso:
  • Obligatorio conocer las etiquetas HTML.
  • Recomendado conocer las hojas de estilo en cascada (CSS)
  • Recomendado conocer como hacer que las páginas cumplan el estándar XHTML. 
  • Recomendado conocer javascript.

Quien no lo sepa, hay multitud de manuales en la red, como por ejemplo:


ENLACE: MANUAL DE PHP
(Recordar que el idioma es el gallego :) )

jueves, 6 de octubre de 2016

DRUPAL

Buenas a todos.

Este año toca renovarse (forzosamente) y voy a impartir dos módulos nuevos.

En uno de ellos vamos a impartir DRUPAL.





Drupal, para quien no lo sepa, es un CMS ((Content Management System) o lo que es lo mismo, un Sistemas de Gestión de Contenidos.

 Y traducido que es eso...pues básicamente un programa que nos va a permitir publicar contenido en Internet sin necesidad de tener idea de programación.

De una forma sencilla podemos crear un sitio web de cualquier temática (blog, tienda,...) con una apariencia escogida por nosotros entre una cantidad inmensa de posibilidades.

Drupal es un CMS de propósito general. Este quiere decir que podemos adaptar el sitio para ser un blog, una tienda, un sitio web de información general,...
Esto lleva consigo que la configuración sea un poco más compleja que en el caso de escoger un CMS específico como WordPress que se utiliza para hacer blog´s (también se pueden hacer otro tipo de webs con él)


Como todavía estoy empezando el curso los apuntes no están acabados, pero a medida que vaya acabando secciones lo haré público en mi twitter. Por ahora está completo la unidad de la instalación.


Actualizado a Diciembre del 2016:

Aunque aún que quedan un par de secciones por ampliar, el curso está prácticamente acabado, por lo que aquellos que lo hagan tendrán una idea de qué cosas se pueden hacer en Drupal. En mi opinión es un curso de nivel inicial-medio.

ENLACE A LOS APUNTES DE DRUPAL
(Recordar que el idioma es el gallego :) )

Un saludo a todos.

domingo, 3 de enero de 2016

Desarrollo de videojuegos con LIBGDX

Para quien no lo sepa, LIBGDX es un framework para el desarrollo de juegos multiplataforma.




No es un motor de juegos (que tiene muchas más facilidades para el desarrollo de juegos), por lo que las personas interesadas en aprender a utilizarlo deberían ser programadores en algún lenguaje de programación (recomendado Java).


Gracias a Libgdx, podemos desarrollar un juego y que este corra en las siguientes plataformas:

  • Windows
  • Linux
  • Mac OS X
  • Android (+2.2)
  • BlackBerry
  • iOS
  • Java Applet (require a máquina virual java instalada)
  • JavaScript/WebGL (Google Chrome, Safari, Opera, Mozilla Firefox, IE via Google Chrome Frame)


He desarrollado un manual para mis alumnos del módulo  Programación multimedia y dispositivos móviles del Ciclo Superior de Desarrollo de Aplicaciones Multiplataformas.

Podéis seguir el manual en la WIKI del centro CIFP Rodolfo Ucha Piñeiro. Indicar que el idioma del manual es el gallego.

Un saludo.

martes, 24 de noviembre de 2015

Plan de Comunicación en Grupo


Siguiendo con las actividades del curso Educación conectada en tiempos de redes impartido por el INTEF, vamos a especificar un Plan de comunicación en grupo, en base a los planes desarrollados por cada uno de nosotros

El grupo está formado por los siguientes alumnos (el plan de comunicación desarrollado por cada uno se encuentra en el enlace):



       BartrinaComalat, Eduard
       FuentesGarcía, Verónica
       ZapataFernández, María





PLAN DE COMUNICACIÓN




 

Dirigido:

 

Un Centro de Educación Público en el que se imparten los niveles de Primaria y Secundaria.


Objetivos del Plan:

  • Dar a conocer el trabajo que se lleva en el centro a toda la comunidad educativa utilizando las RRSS.
  • Fomentar la responsabilidad/corresponsabilidad del alumnado.
  • Coordinación entre el claustro y el A.M.P.A del centro.
  • Mejora de la comunicación entre familia escuela.
  • Implicación de la familia en las actividades escolares.
  • Una comunicación hacia el profesorado informando de las novedades a nivel de Centro que les afecten (como claustros, auditorías, festivos, reuniones, cursos,...)
  • Una comunicación entre el Profesorado informando de los recursos que pueden ser utilizados en Internet para el desarrollo de las clases.  

 Canales


  • Web
  • Blog´s
  • Facebook
  • Listas de correo
  • Teléfono
  • Twitter

 Contenidos - tono - línea editorial





  • Web: Información sobre el centro y oferta educativa. Tono formal.
  • Blogs: Información sobre el centro, oferta educativa y muestrario de trabajos realizados en el centro. Tono motivador.
  • Facebook: Información sobre el centro, relación con toda la comunidad educativa y contacto con otras comunidades de aprendizaje. Tono motivador.
  • Teléfono: charlas personalizadas entre miembros de la comunidad educativa. Tono formal.
  • Twitter: mensajes cortos y directos relacionados con cualquier aspecto relevante para la comunidad educativa. Tono informal.
  • Listas de correo:correos privados y correos a una lista de contactos (padres/profesores/alumnos), para informar de cualquier aspecto importante. En el caso de los profesores cursos, trabajos cooperativos, información relevante del centro. En el caso de los padres; asistencias a reuniones, festividades e información relativa al centro. En el caso de los alumnos; cronograma del curso, actividades colaborativas etc.

 Acciones 

  • Web: Información sobre el Centro, localización, contacto, oferta educativa.
  • Blogs:
    • Blog del centro: Información sobre actividades (excursiones, charlas,....), inicio y fin de curso, vacaciones...
    • Blog de la asignatura: dependiendo de la asignatura: actividades, apuntes, ejercicios, etc.
  • Facebook: Recursos educativos para alumnos, padres y resto de comunidad educativa propuestos por los diferentes miembros de la comunidad educativa (desde webs de revistas para padres y madres a actividades para diferentes alumnos, webs de actividades para hacer con niños y niñas y adolescentes, etc.).
  • Teléfono:
    • Cualquier información de comunicación directa y confidencial entre escuela-instituto y familias.
  • Twitter:
    • Twittear fechas importantes a nivel organizativo de centro
    • Dar información sobre actividades que se realizan en el centro
    • Recordar la celebración de efemérides
    • Fomentar la participación de las familias en las actividades del centro.
  • Listas de correo: Fomentar la implicación en el centro de padres/alumnos y profesores. Informar a toda la comunidad educativa (cursos, concursos, salidas, actividades extraescolares…)

 Cronograma  

  • Web:
  • Blogs:
  • Facebook:
  • Teléfono:
  • Twitter:a lo largo de todo el curso, prestando especial atención en fechas señalas a nivel administrativo o de celebración de efemérides en el centro.
  • Lista de correo:Siempre que se considere oportuno a lo largo del curso, sin excederse en la cantidad de correos y en la cantidad de información.



Cronograma en tabla:


Varias veces al día
Una vez al día
Dos veces por semana
Semanalmente
Otros
Web




X
Blogs



X

Facebook


X


Teléfono
X




Twitter
X




Lista de correo




X

 

 Responsables / Recursos 

  • Web:
    • Responsable de coordinación informática del centro de acuerdo con toda la información aportada por el equipo directivo o el claustro de profesorado.
    • En el caso de webs concretas de materias, responsable de la materia.
  • Blogs:
    • Responsable de coordinación informática del centro de acuerdo con toda la información aportada por el equipo directivo o el claustro de profesorado.
    • En el caso de blog´s concretos de materias, responsable de la materia.
  • Facebook:
    • Equipo directivo
    • Responsable de coordinación informática
  • Teléfono:
    • Claustro de profesorado (todo el equipo educativo)
  • Twitter:
    • Responsable del departamento de actividades extraescolares.
    • Responsable de cada uno de los niveles educativos o departamentos, responsable de cada área con todo el apoyo del claustro de profesorado.
    • Equipo Directivo.
  • Listas de correo:
    • Equipo directivo y cualquier miembro del claustro que lo considere oportuno.

 

viernes, 13 de noviembre de 2015

Política de uso de las redes sociales e Internet en las aulas


Siguiendo con las actividades del curso Educación conectada en tiempos de redes impartido por el INTEF, vamos a especificar las políticas que deberían seguirse en el Centro en el uso de las redes sociales e Internet en las aulas aplicando el Plan de Comunicación del Centro desarrollado en un post anterior.



POLÍTICAS DE USO

En cuanto a la tecnología empleada:


  • El uso del teléfono móvil / tablet dentro de las clases estará prohibido, a no ser que el profesor permita utilizarlo en alguna actividad, aunque el uso de este dispositivo no es necesario, ya que todos los ordenadores del Centro se encuentran conectados a Internet.
  • El uso del teléfono móvil / tablet en los pasillos durante el tiempo de recreo está permitido, con las restricciones indicadas a continuación sobre los contenidos.
  • Al estar todo el Centro cableado, no es necesario el uso de WIFI.
  • Los alumnos, dentro de cada clase, y siempre que el profesor lo permita, se podrían conectar a Internet utilizando los ordenadores mediante conexión cableada.
  • Se debe concienciar a los alumnos en la necesidad de aplicar el principio de precaución, debido a las posibles consecuencias negativas del uso de dicha tecnología para la salud. Así, algunos consejos a seguir que nos van a permitir seguir haciendo uso de esta tecnología, pero de una forma más segura serían: 
  • Apagar el WIFI de noche.               
  • Utilizar el manos libres o el altavoz.                 
  • Separar la tablet / teléfono del cuerpo.
  • No acercar el teléfono al oído hasta que se inicie la comunicación.
  • Se darán pautas sobre cuanto tiempo de utilización de los dispositivos móviles, tablet y ordenador es el adecuado.
  • Indicar que en nuestro Centro los alumnos son en su mayor parte, mayores de edad. En niños pequeños (los niños y niñas y adolescentes menores de 16 años no deberían disponer de dispositivos móviles)



En cuanto a los contenidos:

  • Se informará a los alumnos sobre la prohibición de grabación de imágenes y fotos dentro del recinto escolar utilizando dispositivos móviles.
  • Los alumnos podrían conectarse a Internet, accediendo a herramientas como Moodle, ClassRoom y, en el caso de desarrollo de proyectos, podrían incorporar nuevos recursos encontrados utilizando Pinterest. así como para buscar la información indicada por el profesor.
  • Se velará para que los contenidos a los que accedan los alumnos sean los adecuados (prohibiendo el acceso a contenido violento, sexista, pornográfico,... y cualquier otro que no tenga que ver con el desarrollo de las clases). Para hacerlo, se registrarán todos los accesos a Internet por parte del alumnado y el profesor podrá consultar dichos accesos. 
  • El lenguaje y expresiones de los alumnos en el uso de las redes sociales, foros,... deberá ser respetuoso con sus compañeros y expresado de forma correcta.
  • Se seguirán políticas de información sobre qué contenidos son los adecuados y cuales no deberían publicarse en las redes sociales.
  • Se fomentará el uso de Blog´s personales por parte del alumnado.

 


jueves, 12 de noviembre de 2015

Memorias de un administrador. El acceso a Internet.


Recomiendo leer un post anterior en el que describo como está estructurada la red en el Centro.





El Profesor:



El profesor se conecta vía web a una intranet alojada en el equipo virtualizado VWEBINTERNA en cual tiene Internet Information Server como servidor web y ASP.NET habilitado (versión 4.0).

Me gusta utilizar el IIS ya que permite la seguridad integrada de NT, de tal forma que puedo indicar en el IIS no sólo que se pueda conectar desde una IP determinada, sino que puedo cambiar los permisos de las carpetas donde se encuentra las páginas, para que sólo tengan acceso los usuarios de NT que pertenezcan al grupo de profesores del centro. De esta forma el profesor con su usuario de entrada NT ya está validado y no necesitamos crear protocolos de acceso Login-Password.


Cuando un profesor inicia sesión cargará la siguiente página ASP.NET:


En ella el profesor puede escoger:
  • Dejar pasar a todos los equipos o solo a algunos (aparece una lista en la que el profesor añade a los equipos).
  • Dejar navegar (puerto 80) junto acceso a google; Dejar navegación segura (puertos 80 y 443); Acceso a puertos específicos (aparece una lista en la que el profesor añade los puertos); Dejar pasar todo el tráfico.
  • Indicar hasta que hora se deja Internet abierto. Al llegar a esa hora el tráfico se cierra automaticamente sin que el profesor tenga que  hacer nada.



En la página web, las horas que se cargan en el combo ATA (hasta en gallego) vienen de una base de datos SQL Server.

Esta entrada no pretende ser un manual de IP Tables, para eso tenéis múltiples entradas en Internet. Simplemente comentar que todas las opciones que aparecen en esta página van a tener una traducción en una entrada IPtables del ordenador VProxy.

Cuando el Profesor determina a qué equipos y puertos va a permitir acceder y hasta que hora estará habilitado Internet para esa aula, pulsará el botón 'Aplicar Reglas'.

Al hacerlo realizamos dos procesos:

  • Creamos un archivo en el Servidor NT(VWebInterna) donde está alojado la página ASP.NET con las órdenes IPTables necesarias para dar acceso a Internet.
  • Transferimos dicho archivo por SSH al equipo VProxy y procedemos a su ejecución. Entre las órdenes de dicho archivo se encuentran unas que crean un fichero en /etc/cron.d/AULAXX con lo necesario para eliminar las reglas que dan acceso a la hora indicada por el profesor.


Servidor Virtualizado: VPROXY

 


Recomiendo leer el post anterior en el que describo el equipo VProxy que es el que va a permitir salir el tráfico hacia Internet.

Enruta los paquetes desde la red interna (192.168.0.0/255.255.0.0 y 172.30.0.0/255.255.0.0) a la red conectada a Internet. Partimos de la base de que ya está configurado para enrutar el tráfico.

Dispone de dos tarjetas de red con las siguientes IP´s:
  • eth1: 69.57.157.200 (red externa)
  • eht0: 172.30.128.1  (red interna)
VProxy tiene instalado el servidor SQUID como proxy-caché. Por lo tanto las peticiones que le lleguen al puerto 80 serán redirigidas al puerto 3128 (puerto del SQUID).

El resto de direcciones harán FORWARD.


Por defecto, se permite pasar todo el tráfico menos el que provenga de las aulas y no sea un profesor (dirección 192.168.aula.100).

Se producirá un enmascaramiento de la dirección para que las peticiones salgan con la IP externa de VProxy


El script que ejecuta el equipo es el siguiente:

IFACEIN=eth0
IFACEOUT=eth1

modprobe ip_nat_ftp

#// Activar el enrutamiento en un sistema Linux
echo "1" > /proc/sys/net/ipv4/ip_forward


# Limpiar reglas

iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -F -t nat
iptables -F -t mangle

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT




iptables -A FORWARD -i ${IFACEIN} -o ${IFACEOUT} -j ACCEPT
iptables -t nat -A PREROUTING -i ${IFACEIN} -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -o ${IFACEOUT} -j MASQUERADE
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i ${IFACEIN} -j ACCEPT
iptables -A INPUT -i ${IFACEOUT} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP


#Dejamos pasar los servidores
iptables -I INPUT 1 -s 192.168.130.0/24 -m comment --comment "SERVIDORES" -j ACCEPT
 

# AULA E PROFESORES
iptables -I INPUT 1 -s 192.168.0.100/255.255.0.255 -m comment --comment "REGRAFIXA_PROFESORES" -j ACCEPT
iptables -I INPUT 3 -s 192.168.0.0/16 -m comment --comment "REGRAFIJA_ALUMNOS" -j DROP




iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o ${IFACEIN} -j ACCEPT
iptables -A OUTPUT -o ${IFACEOUT} -j ACCEPT
iptables -A OUTPUT -j DROP


# SERVIDORES

iptables -I FORWARD 1 -s 192.168.130.0/24 -m comment --comment "SERVIDORES" -j ACCEPT

# PROFESORES
iptables -I FORWARD 2 -s 192.168.0.100/255.255.0.255 -m comment --comment "REGRAFIJA_PROFESORES" -j ACCEPT
# ALUMNOS

iptables -I FORWARD 3 -s 192.168.0.0/16 -m comment --comment "REGRA_FIXA" -j DROP

En negrilla están las reglas que impiden que las aulas puedan tener acceso a Internet. Fijarse que se
INSERTAN en las primeras posiciones por lo que van primero que las que creé inicialmente que dejaban pasar todo el tráfico....

 

MODIFICANDO IPTABLES: ACCESO A INTERNET


Ahora llega el momento de enseñar como hago para que desde una página web desarrollada en un servidor Windows con ASP.Net le lleguen las órdenes al Proxy Linux.

Objetivo:

La idea es crear un fichero con las órdenes para dejar pasar el tráfico a un aula determinada.
Esas órdenes se aplicarán sobre el iptables. Al mismo tiempo se creará un archivo en /etc/cron.d/ donde se indicará la hora a la que el acceso a Internet debe desactivarse (es decir, borrar la entrada del iptables que afecta a esa aula).

El archivo con las órdenes se creará en el servidor windows VWebInterna y se pasará por ssh al equipo Linux VProxy.

La idea inicial era utilizar la herramienta plink . Para quien no lo sepa es un comando que permite iniciar una sesión ssh y ejecutar un archivo o comandos.
Pero resulta que plink, cuando se conecta por primera vez a un servidor, espera recibir un texto (la tecla y de yes) para guardar en caché el host-key del servidor al que se conecta.

Resulta que en versiones anteriores de plink se podía indicar que se guardara sin pedir confirmación, pero ahora ya no.

Buscando por internet encuentras esta solución:
echo y | plink -ssh root@REMOTE_IP_HERE "exit"
 
Pero desde ASP.Net ejecutar este comando no está permitido, ya que la cuenta desde la que se ejecuta (servicio de red) no tiene permiso para ejecutar una orden consola.

También intenté por medio de un Process enviar al flujo de entrada el caracter 'y' pero no funcionó, o más bien, algunas veces parece que funcionaba, pero al cabo del tiempo, y de forma aleatoria, en el servidor quedaban ejecutándose procesos plink, supongo que esperando pulsar la tecla 'y'.

Al final buscando por Internet encontré unas librerías que permiten abrir sesiones ssh en ASP.NET: https://sshnet.codeplex.com/

Una vez incorporada a nuestro proyecto ASP.NET ya tenemos las clases necesarias para abrir una consola ssh y mandar ejecutar los comandos en el equipo con el Squid instalado (VProxy).

En este apartado tenemos que diferenciar la parte en que la página web ASP.NET va a generar los comandos y la parte de enviar dichos comandos al servidor por SSH.


NOTA: Vuelvo a comentar que mi sistema es un poco 'complicado' ya que se podría desarrollar una página web php en el propio servidor VProxy y ejecutar las órdenes directamente sin necesidad de utilizar ssh, pero de esta forma me parece más seguro y aprovechando la seguridad integrada de NT en el IIS como mencioné anteriormente....

GENERANDO LOS COMANDOS:

La idea es muy simple: Debemos de añadir una orden iptables en la que dejemos pasar el tráfico de la red del aula en que nos encontremos.

Primero: Identificamos el aula (en base a la IP del equipo del profesor). Así si el profesor tiene la ip 192.168.1.100 sabemos que el aula es la Aula 1 (red 192.168.1.X)


Segundo: Guardamos en un archivo de nombre firewall_aula (en el ejemplo sería firewall_1) las órdenes de iptables para habilitar o quitar el acceso a internet.

Así, cuando añadimos una regla de dejar paso hacia a Internet a el aula, añadimos a esa regla una etiqueta con el valor _AULAXX_

Cuando queremos quitar el acceso al aula, eliminamos del iptables todas las líneas con dicha etiqueta.


Operación CORTAR EL TRAFICO (sería pulsar el botón 'Pechar Internet' de la página ASP.NET'):

        cadea = String.Format("iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'", obterAula())
        operacionArquivo(obterNomeArquivo(), cadea, True)

        ' Borramos o arquivo de crontab
        cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula())
        operacionArquivo(obterNomeArquivo(), cadea, False)

Estas dos órdenes son las que se guardarían en el archivo. La segunda elimina el fichero a ejecutar por el CRON para cortar el acceso a Internet a una hora determinada.
  • obterAula() es una función que en base a la ip obtiene el número de aula (en el ejemplo sería 1)
  • obterNomeArquivo() es una función que devuelve el nombre del archivo donde se guardan estas sentencias (en el ejemplo sería firewall_1)


Operación HABILITAR EL TRAFICO (sería pulsar el botón 'Aplicar Reglas' de la página ASP.NET'):

Dependiendo de las opciones escogidas gráficamente, añadiremos más o menos reglas. Recordar que todo lo que vaya al puerto 80 es capturado por el SQUID y el resto pasa (FORWARD) a través del equipo VPROXY.

Por ejemplo, si queremos dar acceso a Internet a todos los equipos de un aula, escribiremos en el archivo:
    regras(1) = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
    operacionArquivo(obterNomeArquivo(), regras(1), False)
    regras(2) = String.Format("iptables -I FORWARD 1 -d www.google.es -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
    
    operacionArquivo(obterNomeArquivo(), regras(2), False)

Como vemos, en el caso de acceso a la web la regla es de tipo INPUT y a mayores, como queremos que puedan ir a google (ahora usa conexiones https) dejamos pasar el tráfico FORWARD a la dirección de www.google.es.
Fijarse como en el comentario pongo la etiqueta _AULA1_ que será utilizada después para eliminar todas las reglas que permiten el acceso al AULA1.

Ahora dependiendo de las opciones que marque el profesor en la página se van escribiendo en el archivo las órdenes IPTABLES.

Un ejemplo del archivo creado con la opción de abrir Internet con conexiones seguras sería:

iptables -S | sed '/_AULA4_/s/-A/iptables -D/e'
iptables -I INPUT 1 -s 192.168.4.0/24 -p tcp -m comment --comment '_AULA4_' -j ACCEPT
iptables -I FORWARD 1 -p tcp --dport 443 -s 192.168.4.0/24 -m comment --comment '_AULA4_' -j ACCEPT

Después añadimos al archivo las órdenes necesarias para crear en /etc/cron.d/ un archivo de cron con la hora a la que debe eliminar las reglas (de esta forma se cierra Internet automáticamente sin que el profesor haga nada).

La combo de la página ASP.NET donde está la hora que cierra Internet guarda los valores de la forma: hh:mm

        ' Borramos o arquivo de crontab
        cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("touch /etc/cron.d/AULA{0}", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("echo ""SHELL=/bin/sh"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("echo ""PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        ' HORA PARA PECHAR INTERNET
        Dim hora As String = ddlHorario.SelectedValue.Substring(0, ddlHorario.SelectedValue.IndexOf(":"))
        Dim min As String = ddlHorario.SelectedValue.Substring(ddlHorario.SelectedValue.IndexOf(":") + 1)
        Dim dia As String = Date.Now.Day.ToString
        Dim mes As String = Date.Now.Month.ToString

        cadea = String.Format("echo ""{1} {2} {3} {4} *   root  iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula, min.Trim, hora.Trim, dia.Trim, mes.Trim)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("chmod 744 /etc/cron.d/AULA{0}", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        'Recargamos o cron
        cadea = String.Format("service cron reload")
        operacionArquivo(obterNomeArquivo(), cadea, False)


La orden de cron sería:
String.Format("echo ""{1} {2} {3} {4} *   root  iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula, min.Trim, hora.Trim, dia.Trim, mes.Trim)

Esta orden borrará a la hora indicada las entradas de IPTABLES que tengan como etiqueta _AULAX_
 
Recordar que obterAula devuelve el número de aula y el método operacionArquivo añade al archivo la orden que le indiquemos.

Un ejemplo del archivo creado para el AULA4:

rm /etc/cron.d/AULA4
touch /etc/cron.d/AULA4
echo "SHELL=/bin/sh" | sudo tee -a /etc/cron.d/AULA4
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" | sudo tee -a /etc/cron.d/AULA4
echo "00 15 14 10 *   root  iptables -S | sed '/_AULA4_/s/-A/iptables -D/e'" | sudo tee -a /etc/cron.d/AULA4
chmod 744 /etc/cron.d/AULA4
service cron reload


PASANDO LOS COMANDOS POR SFTP A VPROXY:

Partimos de la base que el servidor VPROXY tiene instalado y configurado el servicio SSH.

Una vez tenemos el archivo creado en el Servidor VWEBINTERNA, debemos de pasar dicho archivo por SSH al servidor Linux VPROXY y ejecutarlo.

Para ello hacemos uso de las librerías comentadas anteriormente (https://sshnet.codeplex.com/).

Primero pasamos el archivo al servidor. El codigo es el siguinte:

    Private ReadOnly RUTA_SERVIDOR_WINDOWS As String = "C:\firewall\"
    Private ReadOnly RUTA_SERVIDOR_LINUX As String = "/firewall/"
 

    Sub chamarProcedemento(ByVal nomearquivo As String)
        Dim SERVIDOR_IP As String = "AA.BB.CC.DD"
        Dim PUERTO_SSH As Int16 = XXXX



        '//////////////////////////////////PASAMOS O ARQUIVO AO SERVIDOR////////////////////////////////////
        Dim cliente As SftpClient

        Try
            cliente = New SftpClient(SERVIDOR_IP, PUERTO_SSH,"USUARIO_SSH", "PASSWORD_SSH")
            cliente.Connect()

        Catch ex As Exception
            MsgBox(ex.Message)
            Return
        End Try

        cliente.ChangeDirectory(
RUTA_SERVIDOR_LINUX)
        Dim filestream As New FileStream(
RUTA_SERVIDOR_WINDOWS + nomearquivo, FileMode.Open, FileAccess.Read)
        cliente.BufferSize = 1024
        cliente.UploadFile(filestream, nomearquivo)
        filestream.Close()
        filestream.Dispose()

        cliente.Disconnect()
        cliente.Dispose()

Como vemos, el código lo tengo dentro de un procedimiento al que le paso el nombre del archivo (recordemos que el nombre es 'firewall_NUMAULA'). Lo que hago es pasar el archivo desde C:\FIREWALL de la máquina WINDOWS al directorio /firewall/ de la máquina LINUX.

Una vez pasado, el segundo paso es ejecutarlo con una consola SSH:

        '//////////////////////////////////EXECUTAMOS O SCRIPT ////////////////////////////////////


        Dim ssh = New SshClient(SERVIDOR_IP, PUERTO_SSH, "USER_SSH", "PASSWORD_SSH")
        ssh.Connect()

        Dim answer As StringBuilder
        Dim ss As ShellStream = ssh.CreateShellStream("COMANDO", 80, 24, 800, 600, 1024)
        Dim reader = New StreamReader(ss)
        Dim writer = New StreamWriter(ss)
        writer.AutoFlush = True

        While (ss.Length = 0)
            Thread.Sleep(500)
        End While
        reader.ReadToEnd()

        WriteStream("sudo su", writer, ss)
        reader.ReadToEnd()

        WriteStream("cd " + RUTA_SERVIDOR_LINUX, writer, ss)
        reader.ReadToEnd()

        WriteStream("dos2unix " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)      ' CONVERTIMOS A FORMAT UNIX. INSTALADO PREVIAMENTE NO SERVIDOR O executable dos2unix
        reader.ReadToEnd()

        WriteStream("chmod 755 " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)
        reader.ReadToEnd()

        WriteStream(RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)        answer = ReadStream(reader)

        ss.Dispose()
        ssh.Disconnect()
        ssh.Dispose()


La orden que ejecuta el archivo está marcada en negrilla.
Comentar que debido al formato de los archivos y a pesar que el archivo se crea como UTF-8, daba problemas y tuve que instalar en el equipo LINUX la utilidad dos2unix para pasar el formato del archivo a LINUX.


Os dejo a continuación el código completo de la página ASP.NET, pero recordando que está hecha para funcionar con mi BD en SQLServer, por lo que cada uno tendría que adaptarlo a su caso:


PAGINA ASP.NET

Comentar que guardo registro de las operaciones que realiza el profesor, por lo que en la parte inferior de la página aparece la última operación realizada y quien la hizo. 

firewall.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="firewall.aspx.vb" Inherits="firewall" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Internet nas AULAS</title>
    <link href="App_Themes/StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div id='superior'>
        <asp:Label ID="lblAula" runat="server" Style="text-align:center; margin:20px auto; display:block;width:60%; border-bottom:solid 1px Maroon; border-top:solid 1px Maroon;" Text="Label" Font-Bold="True" Font-Size="X-Large" ForeColor="Maroon"></asp:Label>
        <asp:Label ID="lblNome" runat="server"
            Style="text-align:center; margin:20px auto; display:block;width:60%;"
            Text="Label" Font-Bold="True" Font-Size="Large" ForeColor="#FF6600"></asp:Label>
        <br />
        <asp:SqlDataSource ID="SqlDataRexistroError" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
            InsertCommand="GLOBAL_RexistroError" InsertCommandType="StoredProcedure" SelectCommand="GLOBAL_RexistroError"
            SelectCommandType="StoredProcedure"
            ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>">
            <SelectParameters>
                <asp:Parameter Name="aplicacion" Type="String" />
                <asp:Parameter Name="evento" Type="String" />
                <asp:Parameter Name="mensaxe" Type="String" />
            </SelectParameters>
            <InsertParameters>
                <asp:Parameter Name="aplicacion" Type="String" />
                <asp:Parameter Name="evento" Type="String" />
                <asp:Parameter Name="mensaxe" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
        <asp:Panel ID="pnlIEquiposOpcions" runat="server" GroupingText="Lista de equipos" style="margin:0px auto"
            Width="70%">
            <asp:RadioButtonList ID="rblEquipos" runat="server" AutoPostBack="True"
                RepeatDirection="Horizontal" CellSpacing="10" ForeColor="#336699">
                <asp:ListItem Selected="True" Value="0">Todos os equipos</asp:ListItem>
                <asp:ListItem Value="1">Algúns equipos</asp:ListItem>
            </asp:RadioButtonList>
            <br />
            <asp:Panel ID="pnlEquiposLista" runat="server" ForeColor="#336699" style="margin-left:10px"
                HorizontalAlign="Left" Visible="False" Height="226px">
                <asp:Label ID="Label1" runat="server" ForeColor="#006699"
                    Text="Número de equipo:"></asp:Label>
                <asp:TextBox ID="txtNumEquipo" runat="server" MaxLength="3" Width="43px"></asp:TextBox>
                <asp:Button ID="btnEngadirEquipo" runat="server" Text="Engadir Equipo" />
                <asp:RangeValidator ID="RangeValidator1" runat="server"
                    ControlToValidate="txtNumEquipo"
                    ErrorMessage="Só son válidos números dende 1 a 199" MaximumValue="199"
                    MinimumValue="1" Type="Integer"></asp:RangeValidator>
                <br />
                <br />
                <asp:ListBox ID="lstEquipos" runat="server" Height="170px" Width="178px"
                    ToolTip="Nota: Premer dúas veces para eliminar o equipo da lista">
                </asp:ListBox>
                <p /><br />
            </asp:Panel>
        </asp:Panel>
        <asp:Panel ID="pnlProtocolos" runat="server"
            GroupingText="Lista de portos e tipo de tráfico" style="margin:0px auto"
            Width="70%">
            <asp:CheckBox ID="chkICMP" runat="server" Text="Permitir tráfico ICMP" style="float:left;margin:5px 0px 0px 5px"
                TextAlign="Left" ForeColor="#336699"/>
            <p /><br />
            <asp:RadioButtonList ID="rblProtocolosOpcions" runat="server" AutoPostBack="True"
                RepeatDirection="Horizontal" CellSpacing="10" ForeColor="#336699">
                <asp:ListItem Selected="True" Value="0">Acceso Internet (incluido google)</asp:ListItem>
                <asp:ListItem Value="1">Acceso Internet con conexións seguras (Dropbox,correo,...)</asp:ListItem>
                <asp:ListItem Value="2">Acceso Internet a portos específicos</asp:ListItem>
                <asp:ListItem Value="3">Acceso Internet todos os portos</asp:ListItem>
            </asp:RadioButtonList>
            <br />
            <asp:Panel ID="pnlProtocolosLista" runat="server" ForeColor="#336699" style="margin-left:10px"
                HorizontalAlign="Left" Visible="False">
                <asp:Label ID="Label2" runat="server" ForeColor="#006699"
                    Text="Número de porto:"></asp:Label>
                <asp:TextBox ID="txtNumPorto" runat="server" MaxLength="5" Width="43px"></asp:TextBox>
                <asp:Button ID="btnEngadirPorto" runat="server" Text="Engadir Porto" />
                <asp:RangeValidator ID="RangeValidator2" runat="server"
                    ControlToValidate="txtNumPorto"
                    ErrorMessage="Só son válidos números dende 1 a 65535" MaximumValue="65535"
                    MinimumValue="1" Type="Integer"></asp:RangeValidator>
                <br />
                <br />
                <asp:RadioButtonList ID="rbtlTipoProtocolo" runat="server"
                    RepeatDirection="Horizontal">
                    <asp:ListItem Selected="True" Value="tcp">TCP</asp:ListItem>
                    <asp:ListItem Value="udp">UDP</asp:ListItem>
                </asp:RadioButtonList>
                <br />
                <asp:ListBox ID="lstPortos" runat="server" Height="170px"
                    ToolTip="Nota: Premer dúas veces para eliminar o porto da lista" Width="168px">
                </asp:ListBox>
                <p /><br />
            </asp:Panel>
        </asp:Panel>
        <br />
        <asp:Panel ID="pnlHabilitar" runat="server" GroupingText="Habilitar Internet" style="margin:0px auto"
            Width="70%" Height="133px">
            <br />
            <asp:Label ID="Label3" runat="server" Text="ATA: " Font-Bold="True"
                Font-Size="Large"></asp:Label>
            <asp:DropDownList ID="ddlHorario" runat="server" DataSourceID="SqlDataHoras"
                DataTextField="desc_horas" DataValueField="horas">
            </asp:DropDownList>
            <br />
            <br />
            <u><b>Nota:</b></u> Internet pecharase automaticamente cando se chegue á hora seleccionada<br />
            <br />
            <asp:SqlDataSource ID="SqlDataHoras" runat="server"
                ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="DevolucionHoras" SelectCommandType="StoredProcedure">
                <SelectParameters>
                    <asp:Parameter Name="tarde" Type="Boolean" />
                </SelectParameters>
            </asp:SqlDataSource>
            <asp:Button ID="btnAbrirInternet" runat="server" Text="Aplicar Regras" />
            <asp:Button ID="btnPecharInternet" runat="server" Text="Pechar Internet" />
            <br />
            <br />
        </asp:Panel>
        <br />
        <br />
        <asp:Panel ID="pnlUltimoAcceso" runat="server"
            GroupingText="Información Ultimo Acceso" style="margin:0px auto"
            Width="70%" Height="180px">
            <br />
            <asp:DetailsView ID="dtvwDatosRexistro" runat="server" AutoGenerateRows="False"  style="margin:0px auto"
                CellPadding="4" DataSourceID="SqlDataRexistroActividade"
                EmptyDataText="Sen Datos" ForeColor="#333333" GridLines="None" Height="50px"
                HorizontalAlign="Center" Width="820px">
                <AlternatingRowStyle BackColor="White" />
                <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" HorizontalAlign="Left" />
                <EditRowStyle BackColor="#2461BF" />
                <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" HorizontalAlign="Left"
                    Width="30%" />
                <Fields>
                    <asp:BoundField DataField="nome_prof" HeaderText="Nome do Profesor:"
                        SortExpression="nome_prof" />
                    <asp:BoundField DataField="hora_permiso" HeaderText="Dia/Hora do permiso:"
                        SortExpression="hora_permiso" />
                    <asp:BoundField DataField="ata_hora" HeaderText="Ata a hora:"
                        SortExpression="ata_hora" />
                    <asp:TemplateField HeaderText="Tipo de permiso:" SortExpression="tipo_permiso">
                        <EditItemTemplate>
                            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("tipo_permiso") %>'></asp:TextBox>
                        </EditItemTemplate>
                        <InsertItemTemplate>
                            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("tipo_permiso") %>'></asp:TextBox>
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <br />
                            <asp:TextBox ID="TextBox2" runat="server" ReadOnly="True" Rows="4"
                                Text='<%# Bind("tipo_permiso", "{0}") %>' TextMode="MultiLine" Width="80%"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Fields>
                <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#EFF3FB" />
            </asp:DetailsView>
            <br />
            <br />
            <asp:SqlDataSource ID="SqlDataHoras0" runat="server"
                ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="DevolucionHoras"
                SelectCommandType="StoredProcedure">
                <SelectParameters>
                    <asp:Parameter Name="tarde" Type="Boolean" />
                </SelectParameters>
            </asp:SqlDataSource>
            <br />
        </asp:Panel>
        
        <asp:SqlDataSource ID="SqlDataRexistroActividade" runat="server"
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
            InsertCommand="AltaRexistro" InsertCommandType="StoredProcedure"
            SelectCommand="ConsultaRexistro" SelectCommandType="StoredProcedure">
            <InsertParameters>
                <asp:Parameter Name="aula" Type="String" />
                <asp:Parameter Name="ip" Type="String" />
                <asp:Parameter Name="ata_hora" Type="String" />
                <asp:Parameter Name="tipo_permiso" Type="String" />
            </InsertParameters>
            <SelectParameters>
                <asp:ControlParameter ControlID="ddlAulas" Name="aula"
                    PropertyName="SelectedItem.Text" Type="String" />
                <asp:Parameter DefaultValue="0" Name="tipo" />
            </SelectParameters>
        </asp:SqlDataSource>
        <br />
    </div>
        <asp:Label ID="lblErro" runat="server" Text="Label" EnableViewState="False" Visible="False" Font-Size="X-Large" ForeColor="#C04000"></asp:Label>
    <asp:SqlDataSource ID="SqlDataDatosProfesor" runat="server"
        ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
        ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>"
        SelectCommand="Devolucion_DatosProfesor"
        SelectCommandType="StoredProcedure"></asp:SqlDataSource>
    </form>
</body>
</html>




firewall.aspx.vb:

Imports System.IO
Imports System.Net
Imports System.Diagnostics
Imports System.Security
Imports System.Threading
Imports Renci.SshNet

Partial Class firewall
    Inherits System.Web.UI.Page

    Private ReadOnly RUTA_SERVIDOR_WINDOWS As String = "C:\firewall\"
    Private ReadOnly RUTA_SERVIDOR_LINUX As String = "/firewall/"
    Private ip_conectado As String


    Sub chamarProcedemento(ByVal nomearquivo As String)

        Dim SERVIDOR_IP As String = "AA.BB.CC.DD"
        Dim PUERTO_SSH As Int16 = PUERTO_SSH



        '//////////////////////////////////PASAMOS O ARQUIVO AO SERVIDOR////////////////////////////////////
        Dim cliente As SftpClient

        Try
            cliente = New SftpClient(SERVIDOR_IP, PUERTO_SSH, "USER_SSH", "PASSWORD_SSH")
            cliente.Connect()

        Catch ex As Exception
            MsgBox(ex.Message)
            Return
        End Try

        cliente.ChangeDirectory("/firewall")
        Dim filestream As New FileStream(
RUTA_SERVIDOR_WINDOWS + nomearquivo, FileMode.Open, FileAccess.Read)
        cliente.BufferSize = 1024
        cliente.UploadFile(filestream, nomearquivo)
        filestream.Close()
        filestream.Dispose()

        cliente.Disconnect()
        cliente.Dispose()


        '//////////////////////////////////EXECUTAMOS O SCRIPT ////////////////////////////////////


        Dim ssh = New SshClient(SERVIDOR_IP, PUERTO_SSH, "USER_SSH", "PASSWORD_SSH")
        ssh.Connect()

        Dim answer As StringBuilder
        Dim ss As ShellStream = ssh.CreateShellStream("COMANDO", 80, 24, 800, 600, 1024)
        Dim reader = New StreamReader(ss)
        Dim writer = New StreamWriter(ss)
        writer.AutoFlush = True

        While (ss.Length = 0)
            Thread.Sleep(500)
        End While
        reader.ReadToEnd()

        WriteStream("sudo su", writer, ss)
        reader.ReadToEnd()

        WriteStream("cd " + RUTA_SERVIDOR_LINUX, writer, ss)
        reader.ReadToEnd()

        WriteStream("dos2unix " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)      ' CONVERTIMOS A FORMAT UNIX. INSTALADO PREVIAMENTE NO SERVIDOR O executable dos2unix
        reader.ReadToEnd()

        WriteStream("chmod 755 " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)
        reader.ReadToEnd()

        WriteStream(RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)
        answer = ReadStream(reader)

        ss.Dispose()
        ssh.Disconnect()
        ssh.Dispose()


    End Sub
 

    Private Sub gardarErro(ByVal aplicacion As String, ByVal mensaxe As String, ByVal evento As String)

        Me.SqlDataRexistroError.InsertParameters("aplicacion").DefaultValue = aplicacion
        Me.SqlDataRexistroError.InsertParameters("evento").DefaultValue = evento
        Me.SqlDataRexistroError.InsertParameters("mensaxe").DefaultValue = mensaxe
        Me.SqlDataRexistroError.Insert()

    End Sub
    Private Sub amosarErro(ByVal mensaxe As String)
        lblErro.Text = mensaxe
        lblErro.Visible = True
    End Sub

    Private Function obterNomeArquivo() As String

        Return "firewall_" + obterAula() + ".txt"

    End Function
 

    Private Function obterAula() As String
        Try
            Dim ip As String

            If (ddlAulas.Visible = True) Then
                If ddlAulas.SelectedIndex <> -1 Then
                    ip = ddlAulas.SelectedValue
                Else
                    ip = ddlAulas.Items(0).Value
                End If
            Else
                ip = ip_conectado
            End If

            Dim tercerpunto As Integer = ip.LastIndexOf(".") - 1
            Dim segundopunto As Integer = ip.LastIndexOf(".", tercerpunto - 1)

            Dim aula As String = ip.Substring(segundopunto + 1, tercerpunto - segundopunto)
            'If aula.Length = 1 Then
            '    aula = "0" + aula
            'End If

            Return aula
        Catch ex As Exception
            Return Nothing
        End Try

    End Function
 

    Private Sub operacionArquivo(ByVal nomearquivo As String, ByVal cadea As String, ByVal borrar As Boolean)
        ' Xera o arquivo para abrir ou pechar Internet nunha aula

        Dim arquivoescritura As IO.StreamWriter
        Dim aberto As Boolean = False

        Try

            If (borrar) Then
                IO.File.Delete(RUTA_SERVIDOR_WINDOWS + nomearquivo)
            End If


            If Not IO.File.Exists((RUTA_SERVIDOR_WINDOWS + nomearquivo)) Then
                arquivoescritura = New StreamWriter((RUTA_SERVIDOR_WINDOWS + nomearquivo), False, Encoding.UTF8)
            Else
                arquivoescritura = New StreamWriter((RUTA_SERVIDOR_WINDOWS + nomearquivo), True, Encoding.UTF8)

            End If

            arquivoescritura.NewLine = ControlChars.Lf          ' PARA S.O. LINUX
            ' DE TODAS FORMAS DEIXA CARACTERES 'RAROS' POLO TIPO UTF8. => Convertimos no servidor a linux
            arquivoescritura.WriteLine(cadea)
            arquivoescritura.Close()


        Catch ex As Exception
            amosarErro("ERRO: " + ex.Message)
        End Try

    End Sub

    Private Function establecerEstado() As Boolean
        Dim primerpunto As Integer = ip_conectado.IndexOf(".") + 1
        Dim segundopunto As Integer = ip_conectado.IndexOf(".", primerpunto + 1) + 1
        Dim tercerpunto As Integer = ip_conectado.IndexOf(".", segundopunto + 1) + 1

        Dim resul As Data.DataView

        Try
            resul = Me.SqlDataDatosProfesor.Select(DataSourceSelectArguments.Empty)
            Me.lblNome.Text = "Profesor conectado: " + resul.Item(0).Row.Item("nombre")

             dtvwDatosRexistro.Visible = True
              lblAula.Text = "AULA " + obterAula()

            Return True
        Catch ex As Exception
            gardarErro("FIREWALL", ex.Message, "Metodo EstablecerEstado")
            amosarErro(ex.Message)
            Return False
        End Try

    End Function


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ip_conectado = Request.ServerVariables("REMOTE_ADDR")

        If (Not IsPostBack) Then
            establecerEstado()
        End If

        ' Xestionamos o double click das listas
        lstEquipos.Attributes.Add("ondblclick", ClientScript.GetPostBackEventReference(lstEquipos, "event_lstEquipos_doubleclicklista"))
        If (Request("__EVENTARGUMENT") IsNot vbNullString) And (Request("__EVENTARGUMENT") = "event_lstEquipos_doubleclicklista") Then
            lstEquipos.Items.RemoveAt(lstEquipos.SelectedIndex)
        End If

        lstPortos.Attributes.Add("ondblclick", ClientScript.GetPostBackEventReference(lstEquipos, "event_lstPortos_doubleclicklista"))
        If (Request("__EVENTARGUMENT") IsNot vbNullString) And (Request("__EVENTARGUMENT") = "event_lstPortos_doubleclicklista") Then
            lstPortos.Items.RemoveAt(lstPortos.SelectedIndex)
        End If


    End Sub


    Protected Sub rblEquipos_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rblEquipos.SelectedIndexChanged
        If rblEquipos.SelectedValue = 0 Then
            lstEquipos.Items.Clear()
            pnlEquiposLista.Visible = False
        Else
            pnlEquiposLista.Visible = True
        End If
    End Sub

    Protected Sub btnEngadirEquipo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEngadirEquipo.Click

        Dim elem As New ListItem("EQUIPO " + txtNumEquipo.Text, txtNumEquipo.Text)
        Dim elemLista As ListItem = lstEquipos.Items.FindByText("EQUIPO " + txtNumEquipo.Text)

        If (txtNumEquipo.Text <> "") Then
            If Not IsNothing(elemLista) Then
                enviarMensaxeCliente("O EQUIPO XA ESTÁ NA LISTA")
            Else
                lstEquipos.Items.Add(elem)
            End If
            txtNumEquipo.Text = ""

        End If
    End Sub


    Protected Sub btnEngadirPorto_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEngadirPorto.Click
        If txtNumPorto.Text <> "" Then

            Dim elemLista As ListItem = lstPortos.Items.FindByText("PORTO " + txtNumPorto.Text)
            If Not IsNothing(elemLista) Then
                enviarMensaxeCliente("O PORTO XA ESTÁ NA LISTA")
            Else
                lstPortos.Items.Add(New ListItem("PORTO " + txtNumPorto.Text + "(" + rbtlTipoProtocolo.Text + ")", txtNumPorto.Text + "-" + rbtlTipoProtocolo.Text))
            End If

            txtNumPorto.Text = ""
        End If
    End Sub

    Protected Sub rblProtocolosOpcions_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rblProtocolosOpcions.SelectedIndexChanged
        If rblProtocolosOpcions.SelectedValue = 2 Then
            pnlProtocolosLista.Visible = True
        Else
            lstPortos.Items.Clear()
            pnlProtocolosLista.Visible = False
        End If

    End Sub

    Protected Sub SqlDataHoras_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataHoras.Selecting
        ' Cargamos as horas de maña ou tarde
        If (DateTime.Now.Hour < 15) Then
            e.Command.Parameters.Item("@tarde").Value = 0
        Else
            e.Command.Parameters.Item("@tarde").Value = 1
        End If

    End Sub
 

    Private Sub WriteStream(ByVal cmd As String, ByVal writer As StreamWriter, ByVal stream As ShellStream)

        writer.WriteLine(cmd)
        While (stream.Length = 0)
            Thread.Sleep(500)
        End While
    End Sub

    Private Function ReadStream(ByVal reader As StreamReader) As StringBuilder
        Dim result As StringBuilder = New StringBuilder()

        Dim line As String = "EMPEZANDO"
        While (line IsNot Nothing)
            line = reader.ReadLine()
            result.AppendLine(line)
        End While
        Return result


    End Function

    Protected Sub btnPecharInternet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPecharInternet.Click


        Dim cadea As String

        ' Primeiro eliminamos as regras que teríamos postas no iptables e borramos o arquivo de cron.d desa aula
        cadea = String.Format("iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'", obterAula())
        operacionArquivo(obterNomeArquivo(), cadea, True)

        ' Borramos o arquivo de crontab
        cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula())
        operacionArquivo(obterNomeArquivo(), cadea, False)

        lstEquipos.Items.Clear()
        lstPortos.Items.Clear()

        rblEquipos.SelectedIndex = 0
        rblProtocolosOpcions.SelectedIndex = 0
        pnlProtocolosLista.Visible = False
        pnlEquiposLista.Visible = False

        chkICMP.Checked = False

        chamarProcedemento(obterNomeArquivo())
        enviarMensaxeCliente("OPERACION REALIZADA")

    End Sub
 

    Private Sub enviarMensaxeCliente(ByVal mensaxe As String)

        Dim codigo As String = String.Format("<script type=""text/javascript"">alert('{0}');</script>", mensaxe)
        Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "detallesocio", codigo)

    End Sub
 

    Protected Sub btnAbrirInternet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAbrirInternet.Click

        Dim numregra As Integer

        Dim regra As String
        Dim cadea As String

        Dim hora_fin_cadea As String = ddlHorario.SelectedValue

        Dim hora_actual As New DateTime
        Dim hora_fin As New DateTime(Date.Now.Year, Date.Now.Month, Date.Now.Day, Integer.Parse(hora_fin_cadea.Substring(0, hora_fin_cadea.IndexOf(":"))), Integer.Parse(hora_fin_cadea.Substring(hora_fin_cadea.IndexOf(":") + 1)), 0)


        ' LANZAMOS O SCRIPT AO SERVIDOR
        hora_actual = DateTime.Now

        If (hora_actual.CompareTo(hora_fin) > 0) Then
            enviarMensaxeCliente("A hora de fin de acceso a Internet non pode ser menor que a hora actual...")
            Return
        End If


        ' Primeiro eliminamos as regras que teríamos postas no iptables e borramos o arquivo de cron.d desa aula
        cadea = String.Format("iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, True)

        If rblEquipos.SelectedValue = 1 And lstEquipos.Items.Count > 0 Then     ' MARCAMOS ALGUN EQUIPO

            If rblProtocolosOpcions.SelectedValue = 0 Or rblProtocolosOpcions.SelectedValue = 1 Then

                ' ============================REGRAS DE ACCESO A INTERNET BASICO PARA ALGUNS EQUIPOS==================================
                For Each equipo As ListItem In lstEquipos.Items
                    If rblProtocolosOpcions.SelectedValue = 0 Then
                        ' EQUIPOS
                        regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                        operacionArquivo(obterNomeArquivo(), regra, False)
                        regra = String.Format("iptables -I FORWARD 1 -d www.google.es -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT ", obterAula, equipo.Value)
                        operacionArquivo(obterNomeArquivo(), regra, False)
                    End If
                Next
            End If
            If rblProtocolosOpcions.SelectedValue = 1 Then  ' ACCESO SEGURO PARA ALGUNS EQUIPOS

                For Each equipo As ListItem In lstEquipos.Items
                    regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                    regra = String.Format("iptables -I FORWARD 1 -p tcp --dport 443 -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                Next

            End If

            If rblProtocolosOpcions.SelectedValue = 2 Then  ' ACCESO A ALGUNS PORTOS
                ' ============================regras de acceso a portos especificos==================================
                If (lstPortos.Items.Count > 0) Then

                    For Each equipo As ListItem In lstEquipos.Items
                        For Each porto As ListItem In lstPortos.Items
                            Dim separacion = porto.Value.IndexOf("-")
                            Dim porto_ = porto.Value.Substring(0, separacion)
                            Dim proto_ = porto.Value.Substring(separacion + 1)

                            If (porto_ = 80) Then      ' Se é porto 80 vai por SQUID => INPUT
                                regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                            Else
                                regra = String.Format("iptables -I FORWARD 1 -p " + proto_ + " --dport {1} -s 192.168.{0}.{2}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, porto_, equipo.Value)
                            End If
                            operacionArquivo(obterNomeArquivo(), regra, False)
                        Next
                    Next

                End If
            End If
            If rblProtocolosOpcions.SelectedValue = 3 Then  ' ACCESO TOTAL A ALGUNS EQUIPOS
 

                For Each equipo As ListItem In lstEquipos.Items

                    regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                    regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p udp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                    regra = String.Format("iptables -I FORWARD 1 -p tcp -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                    regra = String.Format("iptables -I FORWARD 1 -p udp -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                Next


            End If


            If chkICMP.Checked Then ' TRAFICO ICMP
                For Each equipo As ListItem In lstEquipos.Items
                    regra = String.Format("iptables -I FORWARD 1 -s 192.168.{0}.{1}/24 -p icmp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
                    operacionArquivo(obterNomeArquivo(), regra, False)
                Next

            End If

        Else    ' TODOS OS EQUIPOS DA AULA
            ' ============================REGRAS DE ACCESO A INTERNET BASICO PARA TODOS OS EQUIPOS==================================
            If rblProtocolosOpcions.SelectedValue = 0 Then
                ' EQUIPOS
                regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)
                regra = String.Format("iptables -I FORWARD 1 -d www.google.es -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)

            End If

            '' ============================REGRAS DE ACCESO A INTERNET SEGURO==================================
            If (rblProtocolosOpcions.SelectedValue = 1) Then
                regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)
                regra = String.Format("iptables -I FORWARD 1 -p tcp --dport 443 -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)
            End If

            ' ============================regras de acceso a portos especificos==================================
            If (rblProtocolosOpcions.SelectedValue = 2) And (lstPortos.Items.Count > 0) Then

                For Each porto As ListItem In lstPortos.Items
                    Dim separacion As String = porto.Value.IndexOf("-")
                    Dim porto_ As String = porto.Value.Substring(0, separacion)
                    Dim proto_ As String = porto.Value.Substring(separacion + 1)

                    If (porto_ = "80") Then      ' Se é porto 80 vai por SQUID => INPUT
                        regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                    Else
                        regra = String.Format("iptables -I FORWARD 1 -p " + proto_ + " --dport {1} -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, porto_)

                    End If
                    operacionArquivo(obterNomeArquivo(), regra, False)
                Next
            End If

            If rblProtocolosOpcions.SelectedValue = 3 Then  ' ACCESO TOTAL A TODOS EQUIPOS
                regra = String.Format("iptables -I INPUT 1 -p tcp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)
                numregra += 1
                regra = String.Format("iptables -I INPUT 1 -p udp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)
                regra = String.Format("iptables -I FORWARD 1 -p tcp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)
                regra = String.Format("iptables -I FORWARD 1 -p udp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)

            End If

            If chkICMP.Checked Then
                regra = String.Format("iptables -I FORWARD 1 -s 192.168.{0}.0/24 -p icmp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
                operacionArquivo(obterNomeArquivo(), regra, False)

            End If
        End If



        '===============CRONTAB=====================

        ' Cambiamnos os permisos para que se poida borrar
        cadea = String.Format("chmod 777 /etc/cron.d/AULA{0}.sh", obterAula)

        ' Borramos o arquivo de crontab
        cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("touch /etc/cron.d/AULA{0}", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("echo ""SHELL=/bin/sh"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("echo ""PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        ' HORA PARA PECHAR INTERNET
        Dim hora As String = ddlHorario.SelectedValue.Substring(0, ddlHorario.SelectedValue.IndexOf(":"))
        Dim min As String = ddlHorario.SelectedValue.Substring(ddlHorario.SelectedValue.IndexOf(":") + 1)
        Dim dia As String = Date.Now.Day.ToString
        Dim mes As String = Date.Now.Month.ToString

        cadea = String.Format("echo ""{1} {2} {3} {4} *   root  iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula, min.Trim, hora.Trim, dia.Trim, mes.Trim)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        cadea = String.Format("chmod 744 /etc/cron.d/AULA{0}", obterAula)
        operacionArquivo(obterNomeArquivo(), cadea, False)

        'Recargamos o cron
        cadea = String.Format("service cron reload")
        operacionArquivo(obterNomeArquivo(), cadea, False)



        ' REXISTRAMOS A ENTRADA NA BD.
        SqlDataRexistroActividade.InsertParameters("aula").DefaultValue = lblAula.Text
        SqlDataRexistroActividade.InsertParameters("ip").DefaultValue = ip_conectado
        SqlDataRexistroActividade.InsertParameters("ata_hora").DefaultValue = ddlHorario.SelectedValue

        Dim mensaxe As String = "EQUIPOS:" + rblEquipos.SelectedItem.Text + vbNewLine
        If rblEquipos.SelectedValue = 1 Then    ' Indicamos os equipos
            For Each equipo As ListItem In lstEquipos.Items
                mensaxe += vbTab + "   ----> " + equipo.Text + vbNewLine
            Next
        End If
        mensaxe += "TIPO CONEXION:" + vbNewLine
        If chkICMP.Checked Then
            mensaxe += vbTab + chkICMP.Text + vbNewLine
        End If

        mensaxe += vbTab + rblProtocolosOpcions.SelectedItem.Text + vbNewLine
        If rblProtocolosOpcions.SelectedValue = 2 Then
            For Each porto As ListItem In lstPortos.Items
                mensaxe += vbTab + "   ----> " + porto.Text + vbNewLine
            Next
        End If

        SqlDataRexistroActividade.InsertParameters("tipo_permiso").DefaultValue = mensaxe

        SqlDataRexistroActividade.Insert()

        chamarProcedemento(obterNomeArquivo)

        enviarMensaxeCliente("OPERACION FEITA.")


    End Sub


    Protected Sub SqlDataRexistroActividade_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataRexistroActividade.Selecting
        If ddlAulas.Visible = False Then
            e.Command.Parameters("@aula").Value = lblAula.Text
        End If
    End Sub
End Class


Y eso es todo.

Un saludo y hasta la próxima entrada.