Apr 21

dues versions de python en un host

Reading time: < 1 minute

A vegades cal fer algún invent extrany amb el python, com per exemple, el haver de tenir dues versions instal·lades. Sovint la nostre distribució ja portarà una versió del mateix i a més moltes eines de les distribucions acostumen a anar lligades a aquesta versió que millor no malmetre.

Cookbook d'ordres per instal·lar un python 2.6.5 a més del 2.4.3 que ja portava el host:

cd /var/tmp
wget http://python.org/ftp/python/2.6.5/Python-2.6.5.tar.bz2
tar xvfj Python-2.6.5.tar.bz2
cd Python-2.6.5
./configure –prefix=/usr
make
make altinstall

si ara fem:

# python -V
Python 2.4.3
# python2.4 -V
Python 2.4.3
# python2.6 -V
Python 2.6.5

Apr 16

long polling amb jquery+jsonp+couchdb (cross domain suportat)

Reading time: 6 – 9 minutes

Porto mesos somiant amb fer la prova de concepte que explico en aquest article, intentaré descriure en que consisteix però ja aviso que la cosa és un pèl complicadilla.

Funcionalitats requerides:

  • long polling: l’objectiu és rebre els canvis d’una base de dades de couchdb en temps real sense haver d’anar preguntant si hi ha canvis, sinó que aquest s’envien cada vegada que es donen de forma automàtica.
  • A través de jQuery el que vull és actualitzar una pàgina web de forma asíncrona, de forma que els nous resultats que vagin entrant a la BBDD es vagin mostrant en temps real a la pantalla.
  • JSONP, és una tècnica que ens permet rebre la sortida JSON de CouchDB i després cridar una funció de callback de JavaScript. El problema és que la funció jQuery.getJSON() original de jQuery té algunes mancances que gràcies a el plugin jQuery-JSONP podem solucionar, aquestes són: (copy/paste de la web del plugin)
    • error recovery in case of network failure or ill-formed JSON responses,
    • precise control over callback naming and how it is transmitted in the URL,
    • multiple requests with the same callback name running concurrently,
    • two caching mechanisms (browser-based and page based),
    • the possibility to manually abort the request just like any other AJAX request,
    • a timeout mechanism.
  • CouchDB és una base de dades NoSQL basada en documents que és capaç d’emetre una senyal (trigger) cada vegada que el contingut d’una base de dades canvia. Per més informació sobre el tema es pot consultar a: CouchDB: The Definitive Guide al capítol Change Notifications.
  • Cross-domain: quan es llença una petició XmlHttpRequest (la base del AJAX) amb JavaScript tenim la limitació de només poder-ho fer sobre el domini que serveix la pàgina web, cap altre port ni subdomini. Obviament tampoc un altre host. Per saltar-se aquesta restricción és quan cal recorrer a JSONP.

La prova de concepte ha estat crear una base de dades anomenada: notifcations on es guarden documents que són notificacions a mostrar a la pàgina web.

Després he programat la següent web:

<html>
<head>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="jquery.jsonp-1.1.4.js"></script>
<script type="text/javascript">
function longpoll(since) {
    var url = "http://IP_COUCHDB_SERVER:5984/notifications/_changes?include_docs=true&feed=longpoll&since="+since+"&callback=?";
    console.log("since="+since);
    $.jsonp({
        "url":url,
        "success":function(data) {
            //console.log(data);
            since=data.last_seq;
            try {
                console.log(data.results[0].doc.msg);
            } catch(err) {
                console.log("error:"+err);
            };
            longpoll(since);
        },
        "error":function(msg) {
            //console.log(msg);
            console.log('capturat error');
        }
    });
};

var url = "http://IP_COUCHDB_SERVER:5984/notifications?callback=?";
$.jsonp({
    "url":url,
    "success":function(data) {
        //console.log(data);
        longpoll(data.update_seq);
    },
    "error":function(msg) {
        console.log(msg);
    }
});
</script>
</head>
<body>
cos
</body>
</html>

El codi és força simple de seguir, primer de tot es carreguen les llibreries: jQuery 1.4.2 i jquery-jsonp 1.1.4, ambdues necessaries per cridar el métode $.jsonp que és el que realment farà la feina.

A continuació es declara la funció longpoll que té com a paràmetre el númeral que indica quin ha estat el últim canvi a la base de dades. Aquest s’utiliza per construir la petició que es fa a CouchDB:

var url = "http://IP_COUCHDB_SERVER:5984/notifications/_changes?include_docs=true&feed=longpoll&since="+since+"&callback=?";

La URL el que fa és demanar el següent:

  • els canvis (_changes)
  • incloent els documents que han canviat (include_docs=true)
  • tracta la petició com a long polling (feed=longpoll)
  • mostra els canvis des de la versió X (since=X)
  • quan enviis els canvis fes una crida a la funció de callback definida aquí (callback=?)
    • ‘?’ és substituit per jquery-jsonp per la funció anomenada ‘C’, aquest nom es pot canviar usant paràmetres en la declaració de $.jsonp() que ve a continuació

Els missatges de l’estil ‘console.log()‘ són per tenir un seguiment del que va passant a la consola de javascript del navegador.

$.jsonp() té força paràmetres possibles definits a la API, però en aquesta prova de concepte només uso ‘url’, ‘success’ i ‘error’. El primer esta clar que és, els altres dos són les funcions a cridar quan l’acció va bé o malament respectivament. Dins de la funció posem el codi referent a les accions que volem fer, per exemple, actualitzar la pàgina actual. Com que això només és una prova de concepte el que faig és mostrar missatges per consola i llestos. La part més important és fixar-se que quan la cosa ha anat bé es fa una crida a ella mateix de forma que la cosa no acabi mai. De fet quan hi ha un error es podria també fer una crida a si mateix perquè no pares de provar de llençar la petició un i altre cop, però el que he fet per provar eś que es notifiqui a la consola de javascript i prou.

Fora de la funció longpoll el que es fa és una petició JSONP per saber quina és l’últim número de seqüència de la base de dades, paràmetre necessari per entrar per primera vegada a la funció recursiva de longpoll.

Conclusions

Pot semblar tot una mica enravassat però diria que he simplificat el problema moltíssim, ja que fins ara havia estat teoritzant moltíssim sobre el tema. Fins que ahir i abans d’ahir vaig haver de posar-me a provar-ho a la pràctica per saber exactament com es podia implementar. Sota el meu punt de vista ha quedat tot força net i entenedor.

Pels que sou programadors de webs habitualment haureu tingut necessitats semblants així doncs espero que ús pugui ser tan útil com a mi, de fet, fa unes setmanes que estic treballant amb Tiny Core Linux montant un Quiet PC sobre una DOM de 512MB per usar-la de sistema de monitorització de les meves xarxes i les d’alguns clients, espero que d’aquí uns mesos pugui donar-vos més informació del projecte.

Mar 19

UDPTunnel – enviar els paquets UDP per sobre d’enllaços TCP

Reading time: < 1 minute

Una altre d'aquelles eines que malgrat ser petitones i rares poden servir per fer mil i una coses. Per exemple, connectar a un servidor DNS a través d'un port TCP en una xarxa on el tràfic UDP estigui tancat.

UDPTunnel és una eina molt simple d’usar i la seva sintaxis és molt autoexplicativa:

 udptunnel -s TCP-port [-r] [-v] UDP-addr/UDP-port[/ttl]
 udptunnel -c TCP-addr[/TCP-port] [-r] [-v] UDP-addr/UDP-port[/ttl]

és interessant fixar-se que el mateix executable pot ser usat com a servidor o com a client, així doncs ideal per construir els dos costats de l’enllaç de forma simple.
A més si ho combinem amb httptunnel podem passar per sobre de proxies de forma senzilla.

Mar 12

Podcast 2×04: SSH avançat

Reading time: 3 – 5 minutes

El podcast



Notes sobre el podcast

  • -L: connecta per SSH a un HOST Un cop allà obre una connexió TCP a un altre HOST:PORT i obre un port TCP local que al connectar-hi ens envia al HOST:PORT anteriors, o sigui, portforwarding.
    • -L [bind_address:]port:host:hostport]
  • -W: connecta per SSH a un HOST un cop allà obre una connexió TCP a un altre HOST:PORT i ens retorna a la stdin/stdout el contingut d’aquest darrer enllaç TCP
    • -W host:hostport
  • -R publicar un port: connecta per SSH a un host i un cop allà publica un port TCP, quan un client es connecta a aquest port TCP accedeix per SSH a la màquina que ha llença l’enllaç SSH i obre un altre enllaç TCP a una altre IP:PORT.
    • -R[bind_address:]port:host:hostport
  • -D socks5: connecta per SSH a un HOST i després publica un port SOCKS5/TCP, és a dir, que podem connectar a aquest port local i sortir a internet a través de la IP del HOST on hem connectat per SSH
    • -D [bind_address:]port
  • -w tunel: connecta per SSH a un HOST i el socket que s’ha usat per fer l’enllaç SSH es connecta a dues interficies de tipus TUN, una a cada extrem del socket. Així doncs, si configurem les corresponents IPs a les interficies TUN tenim un tunel/VPN montada entre els extrems.
    • -w local_tun[:remote_tun]

HPN-SSH

La web de: HPN-SSH -> especialment interessant: Dynamic Windows and None Cipher

  • treballa amb mida de finestra dinàmica
  • treballa sense xifrat quan un enllaç no té terminal associat, sovint usat per pas de fitxers

Les proves:

  • Openssh 5.3p1 + hpn-13 (només el patch: Dynamic Windows and None Cipher)
  • després d’aplicar el patch: openssh5.3-dynwindow_noneswitch.diff.gz
  • modifiquem el fitxer: sshconnect2.c
    linia: 366
    - 		if (!tty_flag) /* no null on tty sessions */
    + 		if (1) /* no null on tty sessions */
  • així podem fer SSH sense xifrar només després d’haver fet el login.

exemple ampla de banada d’un SSH amb xifrat aes128-ctr, usant finestra dinàmica:

scp -v -oNoneEnabled=no -oNoneSwitch=yes fitxer root@127.0.0.1:/tmp/ssh
o
ssh -v -oNoneEnabled=no -oNoneSwitch=yes root@127.0.0.1 "dd if=/dev/zero"|pv > /dev/null

velocitat de transferència:  13.7MB/s
  • debug ciphers, una única negociació de ciphers:
    debug1: AUTH STATE IS 0
    debug1: REQUESTED ENC.NAME is 'aes128-ctr'
    debug1: kex: server->client aes128-ctr hmac-md5 none
    debug1: REQUESTED ENC.NAME is 'aes128-ctr'
    debug1: kex: client->server aes128-ctr hmac-md5 none
    

exemple sense xifrat, usant finestra dinàmica:

scp -v -oNoneEnabled=yes -oNoneSwitch=yes fitxer root@127.0.0.1:/tmp/ssh
o
ssh -v -oNoneEnabled=yes -oNoneSwitch=yes root@127.0.0.1 "dd if=/dev/zero"|pv > /dev/null

velocitat de transferència:  37.4MB/s
  • abans del pass de login:
  • debug1: AUTH STATE IS 0
    debug1: REQUESTED ENC.NAME is 'aes128-ctr'
    debug1: kex: server->client aes128-ctr hmac-md5 none
    debug1: REQUESTED ENC.NAME is 'aes128-ctr'
    debug1: kex: client->server aes128-ctr hmac-md5 none
    
  • després d’autenticar-se:
  • debug1: AUTH STATE IS 1
    debug1: REQUESTED ENC.NAME is 'none'
    debug1: Requesting NONE. Authflag is 1
    debug1: None requested post authentication.
    debug1: kex: server->client none hmac-md5 none
    debug1: REQUESTED ENC.NAME is 'none'
    debug1: Requesting NONE. Authflag is 1
    debug1: None requested post authentication.
    debug1: kex: client->server none hmac-md5 none
    

Mar 08

reDuh: TCP sobre HTTP

Reading time: 1 – 2 minutes

La idea es força simple es tracta de transportar un fluxe TCP sobre d’una connexió HTTP convencional, fiexeu-vos que en aquest cas no estem parlant de proxies ni similars. Sinó de paquets TCP+HTTP que en la part de dades del HTTP tornen a implementar TCP, si fessim un petit esquema seria algo així:

+----+----+------+------+-----+------+
|... | IP | TCP | HTTP | TCP | DATA |
+----+----+------+------+-----+------+

Si realment teniu aquest interés montar reDuh és realment senzill, de fet, suporta servidors amb JSP, PHP i ASP. En escència l’únic que fa és usar aquests protocols per re-obrir una connexió TCP. Així doncs, al servidor on montem aquesta eina hem de tenir certs privilegis per poder obrir sockets des d’un script.
L’eina no és massa recomanable si pensem tenir fluxes de dades molt intensos, per exemple, senssions VNC. Però funciona prou bé si el que volem és transportar una sessió SSH o similar.

Mar 05

Terminals via Web (CLI via Web)

Reading time: 2 – 2 minutes

En l’article sobre Turnkey Linux vaig parlar sobre shellinabox, doncs bé per coses de l’atzar he descobert que no és l’únic sistema que preten donar accés a una sessió de shell a través d’una pàgina web.

De fet, les tres eines que he trobat són realment bones, així doncs si algú en sap alguna cosa més sobre elles que m’ho digui perquè no sé amb quina quedar-me:

  • shellinabox: emula un terminal VT100 i es llença com un dimoni que dona accés al host local a través del port que escollim, pot treballar amb o sense SSL.
  • ANYTerm: també suporta SSL però treballa a través d’Apache recolzant-se amb mod_proxy.
  • AJAXTerm: inspirat en ANYTerm però molt més simple d’instal·lar, ja que només depèn de python, o sigui, que treballa com a dimoni en el sistema on volem tenir la shell.

Mar 01

Les últimes setmanes en fotografies

Reading time: 8 – 12 minutes

Com sembla que és una tònica en la meva vida tot corre molt, tot va molt ràpid i sempre hem passen mil i una coses. Qualsevol diria que normalment treballo des de casa, potser és gràcies a internet que hem permet mourem molt i aprofitar al màxim les sortides. Així doncs, per posar-me al dia he decidit re-editar un post que vaig fer l’any 2007: Fotografies dels últims dos dies. En aquest cas potser parlem de més de dues setmanes però la idea és la mateixa: buidar la targeta del mòbil i anotar coses curioses o no tan curioses al blog.

Des del 24 de gener continuo sense el meu portàtil, o sigui, que ja porto més d’un mes de patiments i esperes. De fet, gràcies a uns companys de LanA2 vaig poder-lo disfrutar garibé una setmana només netejant-lo ben net, però finalment va tornar a morir amb el mateix problema que el primer dia:

Malgrat alguna gent ha tingut la sort de que Dell li ha reparat el problema gratuitament, a d’altres com ara jo no hem tingut tanta sort. Així doncs, per eBay he demanat una placa base nova i encara estic a l’espera de rebre-la. Així podré recuperar el Dell m1330 que tan bon rendiment m’ha donat aquests quasi 3 anys.

Per altre banda, he demanat un Dell Studio 13 que fa més d’1mes que espero que Dell es digni a entregar-me, de fet, avui havia de rebre’l però segons l’estat de la comanda això no serà fins la setmana que ve, cosa que ja hem costa de creure quan han incomplert més de 3 vegades la data d’entrega.

Dell Studio XPS13

A nivell tècnic podriem dir que és l’evolució del m1330. Amb 8GB de RAM, 500GB d’HD i algunes millores en el lector de targetes flash a més d’una gràfica més potent, etc. Però el que realment m’ha fet comprar-ne un de nou no és tan el hardware sinó una garantia de 3 anys del dia després perquè no torni a estar com ara.
Canviant de tema, fa unes setmanes vaig ser al Mobile World Congress (MWC’10) de Barcelona, on vaig aprofitar per retrobar-me amb molts amics, no només durant la fira sinó durant tot el dia. Fins hi tot vaig retrobar-me amb el Fernando que després d’uns anys a Dublin a decidit establir-se a Barcelona. Pel que fa a la fira si no hi heu pogut anar, més enllà de mirar-vos mil fotografies i videos dels mòbils i d’altres cosetes que hi van presentar ús recomano llegir: 20 key trends at Mobile World Congress 2010 (1-10, 11-20).

Aquest any l’entrada va ser gentilesa de Google i més concretament de l’Ernest, que no només ens va aconseguir aquest passe als amiguetes sinó també una entrada a la conferència de desenvolupadors d’Android que es feia a la fira. La sorpresa que ens tenien preparats l’Ernest i la gent de Google és el regal d’un Nexus One al final de la xerrada.

Google Nexus One

Sobre el telèfon comentar que és un Android i com a tal tampoc es diferència tan del HTC Hero que ja tenia, això si quan sortim del sistema operatiu per mirar-nos el telèfon és impressionant el ràpid que arriba a funcionar la CPU d’1GHz i els més de 500MB de RAM. Tot el que feia amb la Hero ara mateix vola amb el Nexus One i quan dic vola vull dir que vola, estic impressionat. Per cert, el meu més gran descobriment dels últims dies a nivell d’aplicacions és una aplicació que es diu WebSharing i que permet compartir tot el mèdia que tinc al meu telèfon via Wi-Fi a través d’una interficie web senzillíssima d’usar i molt potent.

Aquesta setmana passada també ha estat molt especial perquè movilpoint ha venut la seva primera unitat de la nova gama de productes. Després de molts mesos de feina s’ha reorientat totalment la companyia i de forma oficiosa ja puc informar que els nous productes de l’empresa seran totalment hardware, o sigui, que ja no farem software. Són productes totalment ecològics, molt econòmics i fets a mida de cada client a través d’una configuració via web. La gama de producte esta totalment orientada a fires i events, espero poder-vos presentar la nova web ben aviat.

Mentretant podeu veure com estem treballant amb els nous punts d’informació:

i també donar un cop d’ull a la primera unitat instalada a casa d’un client:

Finalment aquest cap de setmana he estat a la DrupalCamp 2010 que es feia al Citilab de Cornellà; després de fer campana al phpWorkShop d’aquest any he passat a coneixer una mica més a fons a la gent i la tecnologia de Drupal. En general he sortit amb molt bon gust de boca de tot plegat, unes xerrades amb un bon nivell tècnic, una organització molt ben portada i una col·lecció de geeks més gran i fidel del que m’imaginava, això si, molt de Mac suelto ;)

Parlant de temes tècnics potser el que més m’ha agradat és SCRUM, que com cap metodologia de projectes és perfecte però si que aporta certs elements d’XP (eXtreme Programming) que sempre he trobat molt interessants. Potser la decepció més gran Open Atrium, no sé perquè m’esperava alguna cosa molt més potent. Per cert, alguna gent com en @quimet i en @linobertrand m’han preguntat què montava jo encomptes d’Open Atrium i això ho vaig respondre a un podcast que vaig fer el maig del 2008: Podcast 1×07: gestió de projectes. Per altre banda, des de llavors també he treballat amb Redmine i el recomano moltíssim, ja que esta molt ben integrat i malgrat esta fet amb RubyOnRails del que no en sé res de res, he de reconeixer que és una solució molt ben pensada i ben feta.

Abans d’acabar algunes fotos de la DrupalCamp 2010:

Feb 27

Asterisk, enrutadors de trucades i altres similars

Reading time: 3 – 5 minutes

En Benja hem va preguntar si coneixia algún producte que per un cost raonable (estem parlant de menys de 300€) permetés enrutar les trucades de veu de casa seva a través d’una línia RTB convecional o d’una línia GSM. A nivell lògic la cosa és ben simple, es tracte de enviar totes les trucades a través de la línia RTB excepte les que comencen per 6 i 7 amb un número de 9 xifres. Doncs per aquesta finalitat vaig trobar navegant per internet un producte de l’empresa Portech que escencialment fa això, concretament és el model MT-350 disponible via la web de l’empresa per uns 140€.

Portech MT350

Per altre banda, si el que cal és tenir un dial-plan una mica més elavorat sempre podem tirar de solucions basades en Asterisk, de fet fa uns mesos vaig arribar a trobar versions d’Asterisk preparades per ser instal·lades en un Linksys WRT54GL, impressionant. Però si cal quelcom més professional en aquest sentit sempre hi ha les solucions de ATCOM, per exemple, amb models com el ATCOM IP01 des de 295$. De fet, jo no coneixo aquest producte de primera mà però en Byteman el va usar per una ONG a l’Àfrica, té pinta de tenir un acabat molt professional.

Askozia PBXPer altre banda, he de reconeixer que jo sobre el problema que hem plantejava en Benja el primer que vaig pensar va ser aprofitar 20 unitats de PIII a 500MHz amb 256Mb RAM i 40GB d’HD (ordinadors industrials) que tinc arraconants i en els que havia pensat instal·lar Askozia PBX.

Askozia PBX és una distribució de Linux d’uns 30MB amb un Asterisk incrustat i amb més funcions de les que ens podem imaginar per la mida de la que estem parlant:

  • An Embedded System
    • less than a 15MB download, less than 30MB installed
    • only 200Mhz and 64MB RAM needed to run
    • low resource requirements means low energy requirements
    • scales up to match the hardware it is running on
  • Telephony Services
    • conference rooms with optional access pins
    • voicemail to e-mail
    • call groups
    • multilingual audio prompts
  • Automated Configuration
    • automatic network configuration with DHCP client support
    • automatic detection and configuration of telephony ports
    • auto-provisioning of SIP telephones
    • automatic configuration of remote gateways
  • Connectivity
    • support for SIP, IAX, Skinny, Analog and ISDN accounts
    • calls freely routable between different technologies
    • integrate external phones (mobile telephones) into your local dialplan
    • outgoing provider fail-over routing
  • Installation, Administration and Configuration Management
    • distributed as a firmware image, individual software component compatibility thoroughly tested
    • entire system configuration is stored in a single XML file simplifying backups, restores and provisioning
    • administration is carried out through our multilingual WebGUI, going beyond the configuration of Asterisk, it also configures the system’s network, dyndns, ntp, and smtp settings
    • manual file appends and overrides supported

La gent d’Askozia també tenen productes integrats amb hardware i d’un acabat també molt professional si ús interessa comprar quelcom fet doneu-hi un cop d’ull que té bona pinta. Podeu anar directament a la botiga online i contrastar els preus.

Com sempre passa, la manca de temps per coordinar l’acció segur que acaba fent que no faci la integració que dubto que fos massa més d’1 setmaneta de feina per deixar-ho tot ben profesional. Però si algú si volgués apuntar ja ho sabeu.

Feb 26

gnoMint: X.509 CA management tool

Reading time: 2 – 3 minutes

Quan administres alguns sistemes i comences a montar serveis SSL arriba un moment que acabes familiaritzan-te amb la sintaxis d’openSSL per la generació de certificats i fins hi tot entitats certificadores autosignades. El problema és quan has de mantenir diverses entitats i diversos certificats arriba un moment que ja no recordes a quina màquina tens els fitxers guardas i l’administració de tot plegat es fa força pesat.

Així doncs, m’he decidit a provar gnoMint que eś una eina programada amb GTK i que fa de GUI a les típiques funcioalitats que demanem sovint al openSSL. Així doncs, és molt senzill de crear diverses entitats certificadores amb diversos certificats associats a cada una d’elles. Però el més important és senzillissim de mantenir, ja que en un cop d’ull saps quins certificats tens creats i quins et caldran per un nou projecte. A més de poder exportar les claus publiques i privades de forma ben senzilla.

Un petit resum de funcionalitats de l’eina seria el que trobem a la seva web:

  • Creating all the infrastructure to keep and run a Certification Authority, saved in only one file.
  • Create Certification Signing Requests, allowing to export them to PKCS#8 files, so they can be send to other CAs.
  • Create X.509 certificates, with a usual set of subject-parameters.
  • Export certificates and private keys to PEM files, so they can be used by external applications.
  • For each CA, establish a set of policies for certificate generation.
  • Import CSRs made by other applications
  • Export PKCS#12 structures, so the certificates can be imported easily by web and mail clients.
  • Revoke certificates, and generate the corresponding CRLs
  • Allow the possibility of keeping the CA private key, or other private keys, in external files or devices (as USB drives)
  • Allow the management of a whole hierarchy of CAs, with their respectives certificates.
  • Import pre-existing Certification Authorities, with all their data.
  • Allow an easy CA operation from command-line tools, for batch certificate creation, or integration with other utilities.