sábado, 14 de junio de 2014

Iniciar y detener servicios desde la WEB en Linux - BASH CGI

Necesidades:

Manejar el inicio / detención de servicios mediante una interfaz WEB con un botón.


Descripción del entorno:

· Servidor: apache2 en una raspberry-pi con raspbian
· Directorio CGI: /usr/lib/cgi-bin
· Archivo de sudoers: /etc/sudoers
· Binario utilizado: /usr/sbin/service

Vamos a crear un CGI simple en Bash:

#!/bin/bash

cat << _EOF
Content-type: text/html

<html>
$(echo "Hola Mundo!")
</html>

_EOF



   Copiamos el contenido del ejemplo anterior para luego pegarlo en un archivo que ubicaremos en '/usb/lib/cgi-bin' (o en el directorio que hayamos definido en la configuración de apache para nuestros cgi's) y lo guardamos como prueba.cgi.

   Cambiamos el propietario y el grupo de prueba.cgi a www-data, de la siguiente forma:

chown www-data:www-data prueba.cgi


   Cambiamos los permisos a una máscara 744 con el siguiente comando:

chmod 744 prueba.cgi


   Ahora accedemos a nuestro cgi para comprobar que funciona, mediante la url:

http://127.0.0.1/cgi-bin/prueba.cgi


  Y nos debería mostrar algo similar a lo de la foto:


  Breve explicación:

- La primera línea define el shell que va a utilizar el script
- Entre las líneas 'cat << _EOF y _EOF' irá todo nuestro contenido en html y el procesado con instrucciones de la shell.
- Bajo el renglón: Content-type: text/html ha de ir una línea en blanco, sino nos dará un error al cargar la página.
- Para ejecutar instrucciones de la shell, y que lo mostrado en la WEB sea el resultado de esa instrucción, utilizamos la siguiente sintaxis: $(instrucción a realizar)

  Para ejecutar un 'echo' por pantalla no necesitamos de ningún permiso especial, pero para utilizar el comando 'service' necesitaremos permisos de Superusuario, por lo que tendremos que modificar el archivo '/etc/sudoers' para dar permisos a www-data, que es el "usuario web" de apache, para ejecutar el comando service.  Para editar este archivo, escribiremos en consola:

sudo visudo

   Visudo nos abrirá el archivo directamente con el editor que tengamos configurado por defecto y entonces copiaremos dentro:

www-data ALL = NOPASSWD:/usr/sbin/service


   Quedando conformado mi sudoers como muestra la siguiente imagen:



   Ahora vamos a crear el CGI llamado service.cgi para iniciar o detener, en nuestro caso, el servicio de OpenVPN, pero con cambiar el nombre del servicio dentro del siguiente código se podría extrapolar a cualquier otro, como ssh, rsync o myql.

#!/bin/bash

read POST_DATA
POST_DATA=`echo "$POST_DATA" | awk -F= '{ print $2 }'`

cat << _EOF
Content-type: text/html

<html>
 <head>
  <center>
   <div id="superior" style="width:500px;border:5px solid #559CE2;border-radius:10px">

    <font face='helvetica'>
     <h1>MANAGE OpenVPN SERVICE </h1>
      <br>
       $(sudo service openvpn $POST_DATA > /dev/null)
      <br>
       $(echo -e "Status: ")
      <font color='$(if [ "`sudo service openvpn status | awk '/VPN/ { print $4 }'`" == "not" ]; then echo "#FF5353"; else e$
       <strong>
        $(sudo service openvpn status | awk '/VPN/ { print $2, $3, $4, $5 }')
       </strong>
      </font>

      <table border="0">
       <tr>
        <td>
         <form name="input" action="http://192.168.1.100/cgi-bin/service.cgi" method="post">
         <input type="text" value='start' name="Service start" size="10" style="display:none"></input>
         <input type="submit" value="START OpenVPN"></input>
         </form>
        </td>
        <td>
         <form name="input" action="http://192.168.1.100/cgi-bin/service.cgi" method="post">
         <input type="text" value='stop' name="Service stop" size="10" style="display:none"></input>
         <input type="submit" value="STOP OpenVPN"></input>
         </form>
        </td>
       </tr>
      </table>

    </font>
   </div>
  </center>
 </head>
</html>


Y el resultado que nos mostrará al entrar en nuestro CGI vía Web es:


O en caso de estar desactivado al cargar el CGI:


El estado actual del servicio se actualiza instantáneamente al presionar el botón elegido.

   En caso de querer interactuar con otro servicio que no sea OpenVPN, tendríamos que modificar la línea 18 del script para poner "sudo service ElServicioQueQuieras" o "sudo service ElServicioQueQuieras"



No hay comentarios:

Publicar un comentario