Emular terminal desde PHP en Servidores Virtuales Gestionados (caso de Comvive)

Desde que trabajo en Pórtico Legal quería empezar a usar el sistema de control de versiones (yo siempre lo uso y aquí no tenían nada, una locura) y poder usarlo para los despliegues en preproducción y producción como solución intermedia hasta que tengamos algo más avanzado. Hasta la fecha se estaban haciendo mediante ftp con todos los problemas que eso supone, entre ellos los siguientes y sus posibles soluciones:

  • Mientras se ha subido un archivo y se está subiendo otro que depende de este la web se puede romper, lo más probable es que ocurra. Esto no se solventa completamente usando git sobre un único servidor pero se minimiza muchísimo.
  • Nunca se sabe que versión está en producción. En algunos momento se habían subido archivos por diferentes personas y una no sabía lo que había subido la otra.
  • Si se toca algo en el servidor un simple «git status» te lo va a chivar, y un simple «git checkout …» te va a solucionar la papeleta.
  • Se va a poder desplegar nuevas versiones simplemente etiquetando y haciendo un «git checkout tag«

 

Aquí el problema venía por parte del hosting de comvive que al ser un VPS gestionado no te dan cuenta de shell. Para solucionarlo al final utilicé un pequeño script php que ejecutaba la orden que le pasas como parámetro:

<?php

$command = $_GET[«command»];

$res = execute($command, __DIR__ . ‘/..’);
echo «<pre>»;
echo «\nCódigo de salida: » . $res[‘code’];
echo «\n» . $res[‘out’];
echo «\nSalida de error:\n» . $res[‘err’];
echo «</pre>»;

function execute($cmd, $workdir = null) {
if (is_null($workdir)) {
$workdir = __DIR__;
}

$descriptorspec = array(
0 => array(«pipe», «r»), // stdin
1 => array(«pipe», «w»), // stdout
2 => array(«pipe», «w»), // stderr
);

$process = proc_open($cmd, $descriptorspec, $pipes, $workdir, null);

$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);

$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);

return [
‘code’ => proc_close($process),
‘out’ => trim($stdout),
‘err’ => trim($stderr),
];
}

 

La etiqueta pre la utilizo para que la salida se vea bien si la llamamos desde un navegador. Pues bien, una vez subido podemos ejecutar cualquier orden como:

https://dominio/path/script.php?command=orden

Pero como estarás pensando esto no es seguro. Lo que hice yo es meterlo en un directorio y en este meter un .htaccess para que sólo yo tuviera acceso.

Al final lo único que quería era poder usar git, así que me creé un shell script con wget para llamar a esta url. El script es tal que así:

#!/bin/bash

domain=»»

command=»wget -qO – \»http://$domain/commands/command.php?command=git $*\» | sed ‘1d’ | sed ‘\$d'»
echo «Dominio: $domain»
echo «Parámetros: $*»
eval $command

 

Ahora sólo hay que darle permisos de escritura y en mi caso lo he llamado rgit y lo he puesto en el path por comodidad. Esta sería una salida de la orden «rgit status -s«, en este caso un status limpio:

Dominio: www.dominio.com
Parámetros: status -s
Código de salida: 0
Salida de error:

Lo suyo es que el directorio .git con todo el ínidice esté fuera del htdocs del servidor, para ello se puede usar el parámetro –work-tree de git. Si por algún motivo no puede estar fuera podéis utilizar de nuevo un .htaccess para que nadie pueda entrar:

 

deny from all

 

Y con esto he conseguido un rodeo para poder usar una «shell» remota a través de un script PHP. Espero que os sea de ayuda.

 

 

 

Mi cuenta en Quitter

Yo soy de los que no les mola mucho lo de las redes sociales, la verdad es que tengo pocas cuentas en este tipo de redes porque generalmente no les encuentro mucha utilidad práctica o porque prefiero preservar en lo posible mi privacidad. Pero estos días estaba leyendo sobre Quitter, la implementación de Gnu Social, la red social descentralizada y libre del proyecto GNU.

 

Las ventajas frente a otras redes sociales son:

 

  • Es software libre por lo que puedes montar tu propio servidor. Este servidor lo puedes conectar al resto de la red pública o puedes mantenerlo de forma privada, por ejemplo en tu red social corporativa. Está hecho sobre PHP y Mysql por lo que montar un nuevo servidor es muy sencillo.
  • Es descentralizado, lo que significa que puede haber tantos servidores como se quiera. Funciona de forma parecida a otros sistemas descentralizados como el correo-e, las ventajas son claras, si cae un servidor siempre puedes seguir publicando en otro.
  • El límite de caracteres para cada mensaje en quitter.es es de 1000.
  • Hay tres líneas temporales. La pública en la que vemos todos los mensajes de nuestro servidor así que en este sentido se parece mucho a un chat general. Una segunda línea temporal en la que están todos los mensajes de los que sigues. Y una última línea temporal  llamada «toda la red conocida», en la que están todos los mensajes de nuestro servidor más la de los usuarios de otros servidores a los que ha alcanzado nuestro servidor.
  • Podemos seguir etiquetas (hashtags) o frases de búsqueda. Es una forma sencilla de estar al tanto de lo que se escribe filtrando el contenido mediante estas dos técnicas.
  • Podemos suscribirnos a grupos. Aquí entra en juego las temáticas que son de interés para cada uno.

 

Yo he creado mi cuenta en quitter.es, mi cuenta por tanto es @cheli@quitter.es. De momento sólo he escrito un queet con mi última compra de zapatos jejejeje, vamos a ver si me engancha esto de Quitter.

Kopparberg Shop

Si ayer os hablaba del regalo que me hizo uno de mis compañeros de Universidad, las fundas para mi Motorola Moto G 2014, hoy os hablo de un nuevo regalo de otro compi. Esta vez se trata de una muestra de Sidras Kopparberg, mi compi ha montado un Comercio-e para vender estas sidras y ha tenido la gentileza de enviarme un pack con 5 sabores diferentes para que las pruebe. De momento ya me ha llegado el paquete, ahora toca ir probándolas y ya os iré contando que tal me parecen jejejeje.

 

kopparsbergshop

Kopparberg

Muchas gracias compi.