Domótica OpenSource = OpenDomo

Desde hace unos meses estamos trabajando en un proyecto totalmente OpenSource cuyo objetivo es el de proporcionar una solución libre de domótica. Desde aquí os quiero animar a que lo probéis y, si tenéis algo de tiempo, colaborar en lo que sea. El sistema se basa en una distro completamente hecha desde 0 la cuál está pensada para correr en sistemas muy pequeños. El software está escrito en C y shell script. Si queréis más información podéis visitar la página del proyecto: www.opendomo.org y en Google Code: http://code.google.com/p/opendomo

Os paso la introducción del proyecto para que os hagáis una idea:

El proyecto OpenDomo se inició en 2006 con el objetivo de crear un sistema de control domótico libre que cubriese las necesidades de un hogar del futuro. Actualmente el proyecto OpenDomo se encuentra todavía en una fase inicial de desarrollo, aunque sus funcionalidades y su estabilidad aumentan cada día.



¿Qué es OpenDomo?

OpenDomo es un sistema de control domótico y seguridad pensado para ofrecer una alternativa libre al hogar del futuro. La licencia bajo la que se está desarrollando el proyecto es la Licencia Pública General (GPL.) . Ésta, garantiza la libertad en el uso del software, uno de los principales valores de la sociedad tecnológica actual. En términos generales, esto implica que OpenDomo puede ser usado, copiado, modificado y distribuido libremente.



Objetivos del proyecto

OpenDomo surge ante la necesidad de disponer de un software avanzado de domótica, que permita un control total del hogar, integrando hardware de fabricantes diferentes. Por lo que el objetivo principal consiste en disponer de un sistema que permita manipular desde un punto central cualquier elemento susceptible de ser controlado electrónicamente. Por ejemplo, todo tipo de sensores, el sistema de alarma, el circuito cerrado de TV, el sistema multimedia (audio, vídeo, TV, ...), las luces, las persianas, el horno, etc.

Una de las formas más extendidas de aplicar la domótica consiste en el uso de hardware especializado. Algunos fabricantes han desarrollado hardware que usa protocolos propios y cerrados, lo que impide la ampliación o mejora de estos productos por terceras partes. Otros, han desarrollado hardware que usa protocolos abiertos ampliamente usados, como KNX/EIB o X10, pero muy limitados.

OpenDomo intenta salir del esquema basado en hardware y protocolos desfasados que no permiten cumplir con las necesidades del hogar actual. De esta manera, se implementa una red domótica basada en TCP/IP y en hardware estándard. TCP/IP es un conjunto de protocolos de amplio uso que forman Internet y que permiten el uso de todo tipo de tecnologías de actualidad, como streaming de audio/video, telefonía IP, compartición de archivos o televisión p2p, etc.
Posted on 2:04 AM by skarvin and filed under , | 2 Comments »

MySql :: Tips de Optimización

Hola,

Estas son unas recomendaciones básicas para mejorar el rendimiento de MySQL y que se hacen vitales cuando tratamos con grandes cantidades de información:

1) Evitar utilizar el tipo de dato BIGINT y utilizar en su lugar INT. Para conocer el tipo de dato recomendado por MySql podemos utilizar la siguiente consulta:

SELECT id_comercio FROM bbdd.comercios PROCEDURE ANALYSE()\G

La cual nos devuelve el tipo de dato óptimo en el campo "Optimal_fieldtype".

2) Es importante evitar que los tipos de dato numéricos se traten como "Strings" en las sentencias.
Por ejemplo:

- Incorrecto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido='10';

- Correcto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido = 10;

- Incorrecto: INSERT INTO tabla_x VALUES ('94','1','99');

- Correcto: INSERT INTO tabla_x VALUES (94, 1, 99);

Puede parecer bastante insignificante pero cuando hablamos de millares de consultas o más, estamos obligando al servidor MySql a hacer un CAST de String a Entero por consulta lo cual, nos lo podemos ahorrar.

3) NO crear índices si el valor que vamos a guardar tiene menos de 20 posibles variantes.
Ejemplos:

- NO crear índices en campos del tipo 0/1 o boleanos.
- NO crear índices en campos cuyo calor sea un rango de números del 1 al 10.

4) Es muy aconsejable utilizar la sentencia EXPLAIN en todas las consultas para saber si estamos utilizando correctamente los índices o en caso contrario, el servidor está haciendo un "table scan". Es importante saber que aunque especifiquemos índices en la cláusula WHERE, MySql no tiene por qué utilizarlos si no lo ve conveniente.

5) No utilizar funciones de tipo NOW o CURDATE ya que las consultas que las utilizan NO las guardan en CACHE.

6) Si se realizan cargas de datos en tablas, es mejor utilizar Inserts múltiples: INSERT INTO bbdd.tabla (campo1,campo2) VALUES (1,2),(3,2),(3,6).

Ejemplo en PHP:

...
$sQuery = "SELECT campo1, campo2 FROM tabla";
$iIdQuery = mysql_query($sQuery, $iIdConn);

foreach(mysql_fetch_row($iIdQuery) as $aValue)
{
$aValues[] = "(".$aValue['campo1'].",".$aValue['campo2'].")";
}
$sQueryInsert = "INSERT INTO tabla2 (campo1, campo2) VALUES ". implode(",",$aValues);

mysql_query($sQueryInsert,$iIdConn);
...

Espero que os sean de utilidad. En cuanto recopile otra lista volveré a postearlos.
Posted on 12:58 AM by skarvin and filed under , , | 0 Comments »

Python :: Subir Ficheros a FTP

Hola,

Después de tantos meses, publico un pequeño script que me es muy útil: Sube automáticamente los ficheros modificados al FTP que le especifiquéis. Que conste que soy un novato en Python! Ahí va:

--------------------------------------------------------
#!/usr/bin/env python
# coding: iso-8859-15

import os
import sys
import ftplib

# Configuración

project_path = "/path/to/project"
ftp_project_path = "/public_html"
ftpsite = "ftp.site.com"
ftpusr = "ftpuser"
ftppass = "ftppassword"
mnmin = 120
file_types = "[php|htm|html|js]"

# Funciones

def upload(conn, fname):
global ftp_project_path, project_path, path_len

dir_len = len(fname)
file2stor = fname[path_len:]
(dir, tail) = os.path.split(file2stor)
dir2stor = ftp_project_path+dir
command = "STOR " + tail

conn.cwd(dir2stor)
print "Almacenando en: "+dir2stor

fd = open(fname, 'rb')
temp = fd.read(2048)
fd.seek(0, 0)
if temp.find('\0') != -1:
conn.storbinary(command, fd)
else:
conn.storlines(command, fd)
fd.close()

def connect(site,usr,pwd):
conn = ftplib.FTP(site)
conn.login(user=usr, passwd=pwd)
return conn

# Inicio del script

conn = connect(ftpsite,ftpusr,ftppass)
path_len = len(project_path)

for file in os.popen("/usr/bin/find "+project_path+" -type f -regex '.*."+file_types+"' -mmin -"+str(mnmin)).readlines():
file = file.strip()
print "Subiendo online el fichero ["+file+"]"
upload(conn,file)

--------------------------------------------------------

Espero que os sea útil. Básicamente sube al directorio del FTP que le especifiquéis los ficheros modificados con la extensión file_types en las últimas 2 horas.

A10!

PD: Tener en cuenta que python utiliza la identación para englobar las funciones, bucles, condicionales, etc... y que el blogger este se come las tabulaciones!
Posted on 12:15 AM by skarvin and filed under , , , , | 1 Comments »

Anillo de confianza SSH

Si estáis hartos de introducir la contraseña cada vez que accedéis a un servidor mediante ssh,
podéis evitarlo siguiendo estos sencillos pasos para crear un anillo de confianza en ssh.

1 - Generar la clave pública, que identificará a nuestro equipo y usuario. Esto se hace mediante el siguiente comando:

skarvin@skarvin-desktop:~>ssh-keygen -t rsa

*No hace falta responder a las preguntas.

2 - Importar la clave en el equipo donde queramos conectarnos.

skarvin@skarvin-desktop:~>scp .ssh/id_rsa.pub skarvin@server:.

3 - Añadir la clave en el fichero authorized_keys
Si no existe, crearemos el fichero .ssh/authorized_keys en vuestra home mediante:

skarvin@server:~>touch .ssh/authorized_keys

y a continuación añadiremos al fichero nuestra clave pública creada anteriormente:

skarvin@server:~>cat id_rsa.pub > .ssh/authorized_keys

Eso es todo!
Posted on 3:57 PM by skarvin and filed under , , , , | 0 Comments »

Windows Vista & Samba

Para poder autenticar un cliente Windows Vista contra un servidor Samba necesitamos cambiar la configuración del cliente Vista que por defecto, no nos deja acceder a recursos compartidos por un servidor Unix/Samba. Los pasos son los siguientes:

Ir a:
Inicio -> Ejecutar -> secpol.msc

Nos aparecerá la siguiente pantalla:




A continuación seleccionaremos: Network Security: LAN Manager authentication level y cambiaremos el valor por defecto: Send NTLMv2 response only por Send LM & NTLM - use NTLMv2 session security if negotiated.




Samba no implementa NTLMv2 por lo tanto deberemos usarlo solo si se produce la negociación.
Posted on 8:42 PM by skarvin and filed under | 9 Comments »

Be a pointer my friend

Posted on 11:17 PM by skarvin and filed under | 3 Comments »

Linux :: Análisis de vulnerabilidades

Este script en perl, permite realizar un análisis de vulnerabilidades de nuestra subred y posteriormente envía un e-mail con el reporte de vulnerabilidades como adjunto. Es útil si queremos tener un sistema de Análisis de Vulnerabilidades programado para que se ejecute cada cierto tiempo. Tan solo hay que ajustar los parámetros de configuración y listo.

--------------------------------------------------------
#!/usr/bin/perl

use MIME::Lite;

# DATOS DE CONEXION
$NESSUS_SERVER = "127.0.0.1";
$NESSUS_PORT = 1241;
$USER = "skarvin";
$PASS = "password";

# RUTA NESSUS
$NESSUS = "/usr/local/bin/nessus";

# RUTA FICHERO DE HOSTS A ANALIZAR
$HOSTS = "targets.txt";

# Formatos del fichero de salida
# nbe, html, html_graph, text, xml, old-xml, tex, nsr
$FORMAT = "html";

# Ruta fichero de resultados
$RESULTS = "results.html";

system( "$NESSUS -q -T $FORMAT $NESSUS_SERVER $NESSUS_PORT" .
"-x $USER $PASS $HOSTS $RESULTS");

# Envio de correo con reporte de vulnerabilidades en formato HTML

$msg = MIME::Lite->new(
From =>'mantenimiento@empresa.es',
To =>'informatica@empresa.es',
Subject =>'Informe de vulnerabilidades',
Type =>'multipart/mixed'
);

$msg->attach(
Type =>'TEXT',
Data =>"Informe de vulnerabilidades de Empresa"
);

$msg->attach(
Type =>'text/html',
Path =>"$RESULTS",
Filename =>"$RESULTS",
Disposition => 'attachment'
);

$msg->send('smtp', 'mail.empresa.es');

open CMD, "rm -f $RESULTS";

--------------------------------------------------------
Posted on 9:10 AM by skarvin and filed under | 4 Comments »