El blog de Javier Aranda

aprendiendo a ser ingeniero informático

Archivo para la categoría ‘PHP’

dllight – script que muestra el contenido de un directorio y permite la descarga de los archivos

0 comentarios ¡escriba uno!

¿Qué es dllight?

dllight es un pequeño script escrito en php que permite explorar mediante una interfaz web el contenido de una carpeta situada en el servidor y descargar sus archivos, aunque esta carpeta no se encuentre visible en la ruta pública del servidor. Además permite proteger archivos por contraseña, de tal forma que para poder descargarlos hay que introducir la palabra de paso correcta. Y por último, permite insertar publicidad de Google AdSense en las páginas e insertar el código de seguimiento de Google Analytics.

Capturas del script en acción:

dllight listado del contenido del directorio

dllight listado del contenido del directorio


dllight descarga de un archivo protegida por contraseña

dllight descarga de un archivo protegida por contraseña

Descargar dllight

Para descargar este script pulse sobre el siguiente enlace: dllight-1.0.0

Instalación y configuración del script

  1. Descomprimir el zip descargado y copiar los archivos que se encuentran dentro de la carpeta dllight en la raíz del servidor o en la carpeta desde donde se quiera que sea accesible el script.
  2. Renombrar el archivo example.htaccess a .htaccess para que funcione la reescritura de la URL. Esto requiere obligatoriamente tener activado el mod_rewrite.
  3. Editar el archivo index.php para establecer una serie de variables de configuración que a continuación se detallan.
  • $description: texto que aparece bajo la URL de la página.
  • $footer: texto que aparece en la parte inferior de la página.
  • $basepath: ruta al directorio el cual queremos mostrar su contenido. Puede estar oculto al servidor web.
  • $passfile: archivo donde se especifican las contraseñas. El script buscará en cada directorio si existe este archivo y lo procesa.
  • $cookiename: nombre de la cookie usada para conocer si se ha visitado la página previamente a la descarga del archivo. Si no se ha hecho, no se puede descargar.
  • $offset: diferencia en segundos de la hora del servidor con la hora que se quiere mostrar en las páginas.
  • $google_analytics: código de la cuenta de Google Analytics para controlar las visitas.

El archivo de contraseñas permite establecer una contraseña a cada archivo del directorio en el cual se encuentre ese archivo. Su estructura es:

nombre-del-archivo.extension = mi_contraseña-123
proyecto.zip = 123abc

Como puede observarse, a la izquierda del igual va el nombre del archivo tal cual se encuentra en el sistema de archivos, y a la derecha la contraseña que queremos ponerle.

Miscelánea

Si tienes cualquier duda sobre dllight, tienes los comentarios de esta entrada a tu disposición.

Si te ha gustado mucho, te es muy útil o le obtienes algún beneficio económico, tal vez quieras agradecérmelo con una donación. Si este es tu caso, por favor visita la sección de Donaciones, gracias ;)

Escrito por javierav

17 Octubre 2009 a las 11:25 pm

Categoría: PHP

Etiquetado con , , ,

Instalando mongoDB + driver PHP en Ubuntu 9.04

1 comentario

logo mongoDB

¿Qué es mongoDB?

Es una base de datos orientada a documentos de código abierto escrita en C++. A diferencia de otros sistemas de gestión de bases de datos, mongoDB no sigue el modelo relacional. La base de datos gestiona colecciones de documentos en objetos JSON. Está orientada a la web 2.0, la nube y las configuraciones de varios servidores de bases de datos. En la entrada Más allá de las bases de datos relacionales hablamos de la utilidad de este tipo de bases de datos.

Más información:

Descargando e instalando mongoDB

Existen dos formas de realizar este proceso: podemos descargar el código fuente y compilarlo o bajar directamente los binarios. En este artículo optaremos por lo segundo por la facilidad y comodidad.

En la sección de descargas de la web de mongodb tenemos varias opciones, aunque las que nos interesa es la correspondiente a la versión 1.0.0 para Linux 32 bits (el que use 64 bits deberá escoger su opción). Tras la descarga, tendremos un archivo tar.gz que descomprimiremos con los comandos habituales:

cd Escritorio
tar -zxvf mongodb-linux-i686-1.0.0.tgz
cd mongodb-linux-i686-1.0.0

Si observamos el contenido del directorio vemos que se organiza en los subdirectorios bin, include y lib. En principio ya podríamos ejecutar mongodb desde ese directorio, pero por cuestiones de orden y claridad, copiaremos el contenido de esas subcarpetas en los directorios de igual nombre bajo /usr/local, operación para la que necesitamos adquirir permisos de root.

sudo -s
mv bin/* /usr/local/bin
mv include/* /usr/local/include
mv lib/* /usr/local/lib

De aquí en adelante asumiremos que estamos logueados en la terminal como root. Como ya tenemos los archivos donde nos interesan, podemos eliminar la carpeta descomprimida y el archivo descargado:

cd ../
rm -fr mongodb-linux-i686-1.0.0 mongodb-linux-i686-1.0.0.tgz

Configuración inicial

Antes de iniciar el demonio de mongodb es necesario crear una serie de directorios de trabajo, ya que al no instalarse, estos directorios no se crean. El más fundamental será el directorio donde el gestor almacenará las estructuras necesarias para almacenar en el disco duro los datos. Por defecto la carpeta es /data/db pero en este tutorial guardaremos los datos bajo /var/lib/mongodb (mysql por ejemplo también guarda los datos bajo /var/lib). Para ello creamos el directorio:

mkdir /var/lib/mongodb

Este directorio es propiedad de root. En este tutorial el demonio mongod se ejecutará bajo el usuario root. Podríamos ejecutarlo bajo otro usuario existente o crear uno específico para ello, tras lo que podríamos cambiar la propiedad del directorio de los datos por la del usuario usado por mongod.

El demonio puede configurarse mediante una serie de parámetros (ejecutar mongod –help para una lista) pasados al ejecutable del demonio, pero esta forma es un poco sucia y puede exponer ciertas configuraciones a la vista de cualquier usuario del sistema que explore la lista de procesos. Por ello, mongodb permite ser llamado especificándole la ruta a un archivo de configuración (de tipo conf). Ya que existe esa posibilidad, nosotros la vamos a hacer de esa forma. Para ello creamos un directorio bajo /etc llamado mongodb:

mkdir /etc/mongodb

Y con cualquier editor creamos el archivo mongodb.conf y le asignamos el contenido:

nano /etc/mongodb/mongodb.conf
# Config file for MongoDB

dbpath = /var/lib/mongodb

Como puede observarse, la directiva de configuración dbpath (que podía fijarse como parámetro del demonio) se usa de forma análoga en el archivo de configuración, especificándole a la aplicación dónde se encuentra el directorio con los datos. Existen directivas que no reciben argumentos, por ejemplo –auth no requiere nada a continuación. En estos casos, en el archivo de configuración deberemos igualarlo a true. Continuando con el ejemplo, –auth quedaría como auth = true. Por el momento no usaremos más directivas. En la web oficial existe un apartado dedicado a cada parámetro que podemos usar para configurar mongodb.

Iniciando el demonio

Para ejecutar el demonio escribiremos (le indicamos la ruta al archivo de configuración con -f):

mongod -f /etc/mongodb/mongodb.conf

Y si todo va bien, obtendremos algo como esto:

Tue Oct 13 21:47:02 Mongo DB : starting : pid = 16139 port = 27017 dbpath = /var/lib/mongodb master = 0 slave = 0  32-bit 

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
**       see http://blog.mongodb.org/post/137788967/32-bit-limitations for more

Tue Oct 13 21:47:02 db version v1.0.0, pdfile version 4.4
Tue Oct 13 21:47:02 git version: afe21e02c11f9a923ab1c95edf6fdd95b9a4a51e
Tue Oct 13 21:47:02 sys info: Linux domU-12-31-39-01-70-B4 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686
Tue Oct 13 21:47:02 waiting for connections on port 27017
Tue Oct 13 21:47:02 web admin interface listening on port 28017

Tras esta operación ya tenemos al demonio listo para atender nuestras peticiones.

Instalar el driver para PHP

Para poder instalar el driver de mongodb para php debemos tener instalado el paquete PEAR y la versión de desarrollo de php. Si no lo tenemos instalado, sólo tenemos que ejecutar:

apt-get install php-pear php5-dev

Y para instalar el driver:

pecl install mongo

Configurar PHP

El siguiente paso y último de la instalación y configuración consiste en indicarle a php que debe cargar la nueva extensión que contiene el driver en sí. Para ello creamos el siguiente archivo:

nano /etc/php5/conf.d/mongodb.ini

Y le asignamos la carga del módulo y sus directivas de configuración:

extension=mongo.so

[mongo]
; If the driver should reconnect to mongo
mongo.auto_reconnect = true

; Whether to allow persistent connections
mongo.allow_persistent = On

; Maximum number of persistent connections (-1 means unlimited)
mongo.max_persistent = -1

; Maximum number of links (persistent and non-persistent, -1 means unlimited)
mongo.max_connections = -1

; Default host for mongo connection
mongo.default_host = www.example.com

; Default port for mongo database
mongo.default_port = 42

; When saving files to the database, size of chunks to split them into
mongo.chunk_size = 1024

; Specify an alternate character to $ to use for special db functions ($set, $push, $exists, etc.)
mongo.cmd = "$"

Tras esta operación debemos reiniciar Apache para que PHP cargue de nuevo la configuración y los módulos (sólo si trabajamos con mod_php).

/etc/init.d/apache2 restart
Si ejecutamos un phpinfo() observamos que la extensión se ha cargado perfectamente.

Si ejecutamos un phpinfo() observamos que la extensión se ha cargado perfectamente.

Escrito por javierav

13 Octubre 2009 a las 10:42 pm

Categoría: Linux, PHP

Etiquetado con , , ,

Recompilar PHP5 con soporte para la libreria GD de PHP (GD BUNDLED) en Ubuntu

2 comentarios

Si queremos manipular imágenes desde nuestro script php podemos usar varias librerías gráficas para ello (GD, ImageMagick, Netpbm…) aunque sin lugar a dudas la más utilizada en la primera de ellas, librería desarrollada por la gente de boutell.com y que actualmente va por la versión 2, la cual incluye muchas mejoras respecto a la 1. Pero, a pesar de esas mejoras, todavía posee algunas carencias que nos harían la vida más fácil. En este contexto, los desarrolladores de PHP deciden realizar un fork (clon) de la librería original de Boutell y comienzan a incorporarle numerosas funciones nuevas: es lo que se conoce como la librería GD Bundled (empaquetada, que va con php).

Esto no tendría nada de malo si no fuera porque algunas distribuciones de Linux (en concreto Debian y sus derivadas como Ubuntu) consideran que esta nueva librería puede ser inestable y contener errores y deciden no incluirla en los binarios disponibles en el sistema de paquetes de la distribución. De esta forma, cuando instalamos el paquete php5-gd estamos instalando la librería original de Boutell, y por tanto, no dispondremos de las nuevas funciones que incorpora la versión de la gente de php.

¿Y cuál es la solución? Pues recompilar el binario de la librería GD.

El primer paso es instalar todos los paquetes necesarios y el código fuente de php:

apt-get install build-essential debhelper fakeroot

# el codigo fuente debe residir en /usr/src
cd /usr/src

# descargar el código fuente de php
apt-get source php5

# instalar todos los paquetes necesarios para compilar php5
apt-get build-dep php5

# acceder al directorio del código (puede variar según la versión disponible)
cd php5-5.2.6.dfsg.1

La forma de la cual debe compilarse un paquete se establece dentro de archivos bajo el directorio debian de un paquete. Las reglas que configuran el proceso de compilación se encuentran en debian/rules. Dentro de este archivo, en una línea, se puede leer –with-gd=shared,/usr –enable-gd-native-ttf \. Esta línea le dice al compilador que debe linkear con la librería LibGD distribuida con Ubuntu como librería compartida. Lo único que deberemos hacer es reemplazar esa linea por –with-gd=shared –enable-gd-native-ttf \. Esto hace que el proceso de compilación use la versión GD de php y cree una librería compartida con ella.

Una vez que el paquete ha sido reconfigurado, podemos proceder a su compilación y posterior instalación:

#debemos situarnos dentro del directorio del código fuente de php o la compilación no funcionará
cd /usr/src/php5-5.2.6.dfsg.1

# crear los paquetes php5-*
dpkg-buildpackage -rfakeroot

# instalar el nuevo paquete php5-gd
cd ..
dpkg -i php5-gd_5.2.6.dfsg.1-3ubuntu4.1_i386.deb

La compilación durará varios minutos (alrededor de 20 con un Core2Quad). Una vez realizado esto ya sólo tenemos que reiniciar Apache y ya podemos usar las nuevas funciones de la librería GD Bundled. Existe un único problema: si actualizamos Ubuntu reinstalaremos el paquete oficial y dejaremos de tener disponible la nueva librería. Para los que lo usen en una Ubuntu normal con interfaz gráfica, cada vez que encendamos el ordenador nos avisará de que hay actualizaciones disponibles. Hay que estar pendientes y desmarcar la casilla del paquete php5-gd. Otra posible solución a este problema pasa por instalar la librería desde los repositorios de dotdeb.org.

Vía CuMu.Li

Escrito por javierav

23 Agosto 2009 a las 9:38 pm

Categoría: Linux, PHP

Etiquetado con

Forzar la descarga de un archivo en php

0 comentarios ¡escriba uno!

Recupero una entrada que publiqué en mi antiguo blog para forzar la descarga de un archivo en php.

/**
 * Forzar la descarga de un archivo en PHP
 *
 * @author Javier Aranda 
 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero GPL 3
 */

$archivo = '/home/usuario/mi_archivo.pdf';

//Cabeceras HTTP para forzar la descarga (varia según el navegador)
if(isset($_SERVER['HTTP_USER_AGENT']) AND strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
{
   header('Content-Type: application/force-download');
}
else
{
   header('Content-Type: application/octet-stream');
}

//Calculamos el tamaño del archivo
$tamano = filesize($archivo);

//Envío cabecera con el tamaño del archivo
header('Content-Length: '.$tamano);

//Envío cabecera con el nombre del archivo
header('Content-disposition: attachment; filename=' . basename($archivo));

header('Pragma: no-cache'); //Cabecera anti-cache
header('Expires: 0'); //Cabecera que define la duración

//Esta función lee un archivo y lo vuelca a la salida (ver manual PHP)
readfile($archivo);

Nota: por fallos en el resaltador de sintaxis aparece un cierre de la etiqueta http inexistente. Reportaré el fallo.

Escrito por javierav

8 Agosto 2009 a las 2:11 pm

Categoría: PHP

Etiquetado con , , ,