How to use Yi Home Camera 2 (1080p) outside of China, revisited

Firstly, this post is about Yi Home Camera 2. Currently Xiaoyi has various similar models. In each one of its models they make a Chinese version and an international version (same version but more expensive). Xiaoyi is making big efforts to block using Chinese models outside of China, forcing you to buy a international version.

I wrote an article some time ago to get this camera working, but after that Xiaomi enhanced its blocking procedure and this article is not valid any more.

Now Xiaomi has introduced a new change, checking if your camera is connecting to their servers from a Chinese IP address or not.

Description of the problem

Yi Home Camera 2 is paired with Yi app with no problem, the camera works and save video on the SD card, even notify you when there is some event, but you can NOT get live video. When you open Yi app it stucks at Establishing secure channel… 50% for a while and finally it shows the error message Network connection failed, please check network settings and reconnect it (-20009). So neither you  can watch your camera on live or browse through your records from the Yi app. However you can get out the SD card and review your videos in a PC.

The solution

In brief the solution is using a Chinese proxy, so Xiaomi will think your camera is in China. Easy, isn’t it?

Fortunately there is a project (yi-hack-v2) where someone (niclet) has made a custom firmware to get telnet and FTP working for this camera and, the most important for us, with an option to setup a proxy. So all the credits go for him/her.

The procedure to get your camera working again is:

  1. Download the files of niclet project and copy the contents of sd folder to the root of your SD card. The card has to be FAT32 (vfat) formated.
  2. Edit the file yi-hack-v2.cfg (in test folder) and uncomment the last line (remove the starting ‘#’), and set one Chinese server (I use this list)
  3. Put your SD card. All is done. Now you can pair it with your Yi Chinise phone app an get Live video with no problems

Note 1: The text editor to edit file yi-hack-v2.cfg is important. Its a linux file, someway different to a Windows one. I firstly used notepad and the hack doesn’t work. I then used Notepad++ and it worked perfectly. Mind this if you are having any trouble.

Note 2: If you have some trouble formatting you SD card with Windows, you could use HP USB Disk Storage Format Tool

Note 3: You have to download the files of niclet project (yi-hack-2) from github, but if you have any problems they are here too.

Currently my last line of yi-hack-v2.cfg is:

YI_HACK_PROXY=socks4://123.59.100.246:1080

and with this proxy the camera is working for three months.

To get into account for the article:

Comarative version chart

Dominios Windows .local y problemas con Apple

Desde hace algún tiempo estoy problema con los dominios Windows de algunas empresas, dominios Active Directory, y los productos de Apple, especialmente con iPhone y iPad (aunque po lo que veo hay gente que también tiene problema con los Mac).

El problema surgió porque los productos de Apple no recibian email (mediante ActiveSync del servidor Exchange que tenemos en la empresa) cuando estaban conectados al WiFi de la empresa, pero sin embargo sí que recibian email cuando estaban fuera de la empresa.

El problema es que cuando están dentro de la empresa son incapaces de resolver el nombre del dominio, pues es un dominio interno del tipo midominio.local, mientras que cuando están fuera de la empresa utilizan midominio.com. Tras mucho estrujarme la cabeza doy con la información de que ahora (a saber desde cuándo, pues antes funcionaban perfectamente) Apple utiliza el sufijo .local para Bonjour (lo trata como host Rendezvous), por lo que al ver que es un dominio .local no resuelve mediante DNS, sino que resuelve mediante Bonjour, o lo que es lo mismo, no resuelve.

Hay muy poca información al respecto en internet sobre este tema, así que aquí dejo un par de links.

El artículo técnico de Apple. Ofrece solución para los Mac, pero no para los iPhone/iPad.
Uno de los problemas en los foros de Microsoft.
Otro problema en spiceworks.

¿Y que hay de las soluciones? ¿cambiar el sufijo de tu dominio Windows por algo del tipo midominio.loc? Venga, es muy divertido cambiar el nombre de un dominio!

Aquí las mejores prácticas que recomienda Microsoft para elegir un nombre de dominio Windows.

Probablemente por esto Microsoft ha dejado de recomendar utilizar .local para sus dominios Active Directory y ahora recomienda usar un subdominio del dominio público.

How to use Yi Home Camera 2 (1080p) outside of China

UPDATE (11/11/2017): This process is not valid anymore, but you can use a new one. All info here.

I’ve been using a Yi Homme Camera for a long (aka Xiaomi/Xiaoyi Small Ants Camera). It’s a magnific camera with good quality (720p) and night vision at a stunning price. In my opinion, then only flaw is the lack of an wired Ethernet port. However, Xiaomi, firmware update after firmware update has made it a bit worse. First they blocked telnet access, RTSP and HTTP. And finally the blocked their Chinese hardware to be used only in China Mainland (from Nov 2015). Yes, they sell two versions, Chinese and International. Luckily you always can solve this limitations running some scripts or downgrading the firmware. There is a lot of info on the Internet.

 

Recently Xiaomi (Yi) launched a major upgrade for this product. They presented Yi Home Camera 2, with even better quality, 1080p @25fps 1.5Mbits, gesture detection and more. Obviusly I immediately bought one. However I got the same issue all people is having. It’s impossible to get it working. You can not pair it with the phone app. The camera gets the QR code, connect to your WIFI network (light steady blue light) but the pairing proccess never ends succesfully. You get “time out” both the camera (voice message) and the phone. Every people has the same problem. Some of them have tried to update the firmware, but this is even worse. Now they get a voice message “This camera can only be used in China”.

After some weeks of research I finally get mine working, using a specific firmware.

To install it you have to:

    1. Download this firmware (version 2.1.1-20160429113900) and put it in the root of your SDCARD (it has to be FAT32 formated). The name of the file has to be home.bin, otherwise camera won’t install it
    2. Turn on the camera
    3. Reset the camera to default values pressing the reset white button in the back
    4. Turn the camera off
    5. Insert the SD card with home.bin and turn it on

You will see the green led blinking for about one minute. After that you will be able to pair your camera with the app. Bear in mind that the app has to be Chinese version too.

And, of course, remember NOT to update your camera firmware even if the phone app invite you.

Next step: Enable telnet to allow RTSP and FTP.

Date and Time in Xiaomi Xiaoyi Smart Camera

Sometimes you find out a small gem like this beautifull piece of hardware. Xiaoyi Smart Camera is almost the perfect home camera. It has a beutiful design, good video quality, bidirectional sound, good construction, SD card slot, WIFI, a decent mobile app, and a bargain price. However it has some drawbacks:

  • Latest firmwares have removed telet, FTP and RTSP access. WHY?
  • Time Zone is stuck to China, so your recordings are miss-dated, what does moving through recordings by the mobile application a nightmare.
  • Lack of wired networking.

I can accept the lack of wired networking but not the other two. The first was present in early firmwares. The Time Zone setting would be really easy to add. There are some alternatives on the Internet to fix the Time Zone issue but while helping they don`t solve the problem.

Solution 1

Disable ntpdate (from here):

I telnetted into the camera (username: root / password: 1234qwer)

Code:
cd /homemv ntpdate ntpdate.orig
touch ntpdate
chmod 755 ntpdate
date -s “2015-06-02 22:00″

The commands above disable to program that tries to set the date from the internet, and then you can set the date manually to the current date/time. Hope this helps.

Of course, to be able to apply this solution you have to flash one firmware with telnet support.
Drawbacks:

Solution 2

Firmware mod (from here)


If you are living in a different time zone (GMT+6 is Germany, Denmake, Austria, Italy…) you have to download the file “equip_test.sh” open and modify the row. The line “my_version =” should contain possible the latest version of the firmware.

Drawbacks:

  • While the timestamp on the video is fixed, the orange marks in mobile app timeline not, so moving through it doesn’t work very well.

Solution 3

Changing time zone in etc (from here)

Hello,
You can change the timezone.
Change the TZ file in /etc/
the command is :
echo “$my_gmt” > /etc/TZ
change $my_gmt by your timezone.
Note : GMT 0 => Beijing
for Paris = GMT+6
Have fun.

 

My solution

Work in progrress: I’ve create a bash scritp which changes the time of the mp4 files created by the camera to a previous date, 6 hours before. The script is executed every minute through cron.

 

Update: The best solution

Finally, the best solution it’s here and it does suppot moving through recordings perfectly.

Sincronización del reloj con la hora de Internet

Uno de los servidores de una empresa está teniendo problemas
con el reloj de Windows (Windows Server 2012). El reloj se atrasa de
forma aleatoria, llegando a marcar incluso un día menos de la fecha
actual. Siendo el servidor un controlador de dominio (relaciones de
confianza y sincronización de la hora con los equipos del dominio),
centralita teléfonica (no se puede llamar a determinadas horas) y
gestionar la facturación (fechas de facturas erróneas) esto se convierte
en un gran problema. Lo primero por supuesto fue pensar que la pila del CMOS se había gastado, y simplemente con sustituir la sería suficiente, pero no es así, pues la hora se retrasa sin ni siquiera tener que apagar o
reiniciar el equipo, sino mientras Windows está en funcionamiento,
cuando la pila no entra en juego.

Teniendo en cuenta que la placa basae de ese mismo servidor ya ha
dado algún problema de hardware, cabe suponer que debe ser algo de lo
mismo. Así, y en vista de que el cliente no quiere sustituir el
servidor, la solución a adoptar es conseguir que el relog se sincronice
con la hora de internet para evitar ese retraso. Como sabemos Windows ya
ofrece esa posibilidad, como una opción más del reloj, pero la
sincroniza cuando el quiere, lo que provoca que el reloj siga
atrasándose.

configurar-fecha-y-hora

 

Así pues había que buscar otra solución.

La orden de línea de comandos W32tm.exe /resync fuerza la
sincronización del reloj con la hora de internet (time.windows.com, o el
servidor NTP que esté configurado), dejando la fecha y la hora
perfectas.

Así, la solución fue crear una tarea programada que ejecutase esta
orden cada 15 minutos, para asegurarnos de que el reloj estuviese
siempre sincronizado. La tarea viene a ser esta:

tarea-sinc

Quizás la primera línea podría omitirse, pero está para asegurarnos
de que el servicio de sincronización de la hora está ejecutándose, no
vaya a ser que esté dormido.

Escogiendo un sistema de video vigilancia

Últimamente estoy evaluando la posibilidad de montarme un sistema de videovigilancia para mi cabaña de la sierra, más aún desde que me robaron el generador.

He instalado varios sistemas de videovigilancia de diferentes marcas, pero ahora que es para mí, las necesidades son otras, y me surge la duda.

Lo que está claro es que necesitaré que las cámaras tenga visión nocturna y necesitaré un servidor que controle las cámaras, almacene las grabaciones y me permita acceder a ellas en remoto, lo que se suele llamar un NVR o DVR.

El Hardware (cámaras)

Probablemente me decante por las cámaras UniFi de Ubiquiti, pero también me gustaría poder reciclar alguna cámara IP vieja que tengo sin uso o incluso alguna vieja webcam USB. La otra opción sería comprar alguna cámara china barata, por ejemplo la Xiaoyi Small Ants Smart Camera, que tiene unan relación calidad/precio impresionante (720p con visión noctura por 30€). Estas son las que tiene actualmente Ubiquiti:

unifi_cameras

De aquí me interesan principalmente las tipo bullet, pero la UVC-PRO se me va de presupuesto (+400€) así que tendré que ir a por la UVC (~110€) y quizas una UVC-Micro o Dome para el interior de la cabaña. Aún así todavía tengo que comprobar el alcance de los infrarrojos para visión nocturna, pues la idea es ponerlas en la esquina de la parcela (aunque también puedo programar el servidor para que encienda un foco cuando la cámara detecte movimiento, y ya de paso que suene una alarma).

El Hardware (NVR)

Mucho ha llovido desde que me monte mi sistema de seguridad casero instalándole linux (OpenWrt) a un router, conectándole una cámara IP y un par de webcams USB, e instalándole Motion para gestionarlas. Ahora busco algo más profesional.

Si no lo pensase mucho me iría a lo fácil, lo que suelo recomendar a mis clientes, Ubiquiti UniFi Video, debido a su impresionante relación calidad/precio.

Sin embargo el problema del NVR de UniFi es que sólo soporta cámaras de la misma cámara, y si luego quiero integrar alguna cámara que tenga por ahí, pues me dará rabia no poder hacerlo. Además, en vistas a tener que poner un servidor, me gustaría que integrase más cosas, no sólo el vídeo. Por ejemplo, que integrase algún software para el control de riego por goteo, que decida cuándo hay que regar, abra y cierre electroválvulas de riego, quién sabe… que abra un servo para alimentar a el perro… Es decir, no tener un servidor para el vídeo y otro para “otras cosas”.

Lo bueno del software NVR Unifi Video es que es descargable, y se puede instalar en cualquier servidor, por lo que no te ata a tener que comprar su hardware NVR, este:

nvr_with_stand[1]

Al fin y al cabo no es más que un servidor linux con un Intel D2550, 4GB de RAM y un disco de 500GB. La duda es, ¿podría usar ese mismo aparato como servidor para más cosas? Es decir, añadirle mi propio software para controlar el riego u otras cosas. Al fin y al cabo el NVR de Ubiquiti en realidad monta un Debian 7.0 x64. O por otro lado ¿sería mejor utilizar una Raspberry Pi e instalar en ella el software de UniFi Video y así tener un servidor para lo que yo quiera? Bueno, el software de UniFi necesita un procesador de 64 bits, por lo que no creo que sirva la Raspberry Pi.

Quizás la Raspberry, ya sea la 1 o la 2, se quedan un poco cortas para ejecutar el software de UniFi, pues en sus requisitos establece al menos 2GB de RAM, pero hay otras alternativas a la Raspberry.

En resumen:

Procesador Memoria Precio Otros
UniFi NVR Intel Atom D2550 (1M Cache, 1.86 GHz) 4GB 380€ Incluye disco de 500GB65 W, 19V, 3.42A
Raspberrry Pi B+ BCM2835ARM1176 Processor 700MHz 512MB 30€ 0.5-1W40 GPIO pinsNo SATA

USB Disk o microSD

Raspberrry Pi 2 B BCM2836 900MHz quad-core ARM Cortex-A7 CPU 1GB 40€ 40 GPIO pinsNo SATAUSB Disk o microSD

El Software

En caso de no usar el software de UniFi me decantaría por Zoneminder,
con el que podría controlar cámaras de cualquier marca (como la Xiaoyi
Ant por RTSP), que tiene una pinta estupenda (salvo por la interfaz
gráfica) y encima es OpenSource. Eso sí, el UniFi dispone de app para
Android e iOS que es muy cómodo. Zoneminder no, aunque siempre puedes
acceder desde un navegador web.

Xiaomi miniWifi drivers

Xiaomi mini WiFi

Ayer compré un pincho WIFI USB en powerplanetonline, concretamente un Xiaomi miniWifi, y cuál es mi sorpresa al ver que Windows 7 no instala por sí solo los drivers.
Pues nada, a conectar un cable y a la página del fabricante a
descargarlos, pero… sorpresa! está todo en chino y no hay ni siquiera
versión en inglés. Tras investigar un poco y con la ayuda del traductor
de Google finalmente consigo encontrar los drivers en miwifi.com/miwifi_download.html el primer icono de windows no (ese es para el router) el de más abajo.

miniwifi download

 

En cualquier caso eso descarga un ejecutable que no sólo instala los drivers,
sino que también instala una aplicación de Xiaomi (todo en chino) que
sirve para crear un Access Point, y para subir archivos a una nube de
Xiaomi de la que te regalan 1TB. Como digo todo en chino, difícil de
usar, incluso difícil de cambiar del modo master (Access Point) al modo
Client.

 

Así pues aquí os dejo un archivo rar con tan sólo los drivers, sin la
aplición, para poder usar el Xiaomi miniWifi como un pincho WIFI normal
y corriente, sin más preocupaciones. En el rar vienen drivers para
varios sistemas operativos

Drivers para estos sistemas operativos

Podéis descargar el paquete con sólo los drivers para el Xiaomi miniWifi aquí [8MB]

 

Aislar subred con iptables (excepto la puerta de enlace)

De todos es conocido la facilidad con la que hoy en día se
pueden romper las claves de muchas redes WIFI, ya sean WEP (todas) o WPA
(algunas). El caso es que ayer me encontré con un amigo que, como mucha
gente, se alimenta del internet del vecino. Es un entendido de la
informática sin llegar a ser informático. Le sacó la clave del wifi al
vecino y se ha puesto en su casa un router para que:

  • Conecte con la red del vecino
  • Cree su propia wifi independiente

Llamamos a mi a mi amigo… Jose Andrés, por ejemplo. El esquema sería algo así:

 

El tema es que Jose Andrés me comentaba la posibilidad de ser
descubierto por el vecino, aunque este no tuviese conocimientos
informáticos. ¿Cómo? El tema es que hoy hay varias tecnologías diseñadas
para facilitarnos la vida que podrían ir en nuestra contra. Por
ejemplo, DLNA y uPNP, así como los ya tradicionales NetBIOS o SAMBA.
Estas tecnologías podrían advertir al vecino de nuestra presencia
incluso sin que él lo solicitase.

Supongamos que el vecino está tranquilamente sentando frente a su
portátil leyendo el periódico. Entonces decide poner música, abre el
Reproductor de Windows Media y este le informa de que ha encontrado un
nuevo dispositvo con librería de reproducción llamado Samsung SmartTV
XXXX. El vecino se pregunta ¿qué es eso? Yo no tengo ninguna tele
Samsung. Simplemente el Reproductor de Windows Media ha encontrado la
tele de Jose Andrés, que es compatible con DLNA e informa de ello.
Situaciones como esta pueden pasar también con una Playstation o con un
móvil. Mucho más fácil es si simplemente el vecino está en el ordenador y
pincha en Mis sitios de red, le saldrá un listado de los ordenadores
que forman la red y lo que comparte cada uno, gracias a NetBIOS,
tecnología de la edad media en la que se basa Windows para buscar
equipos en la red (aunque también los puede encontrar por DNS).

¿Cómo puedo evitar esto? – pregunta Jose Andrés

La solución que él emplea es intentar configurar todos los
dispositivos de su casa desactivando estas funcionalidades (DLNA, uPnP,
SAMBA…) pero es un follón y normalmente siempre se te olvida algo.
Además, ve limitadas sus posibilidades. ¿Y si quiere reproducir un vídeo
de su móvil en su tele mediante DLNA? No podría por tener OFF estas
tecnologías.

¿Cuál es la solución buena? Montar un firewall. Susto.

No es para tanto. El router de Jose Andrés probablemente tenga un
firewall integrado que se puede configurar de una forma u otra. Tan sólo
hay que decirle al firewall que bloquee todos los paquetes desde su red a la red del vecino, salvo que los paquetes tengan como destino la puerta de enlace (la conexión a internet).

Cada router administra su firewall como quiere, pero existen routers
que lo que llevan en su interior es linux, y podemos acceder a la línea
de comandos de linux a través de telnet o de ssh. Es más, algunos
routers se pueden flashear con un nuevo firmware (DD-WRT, OpenWRT,
Tomato…) para que funcionen con linux.

El caso es que el router de Jose Andrés soporta linux así que es muy fácil. En linux el firewall se configura con el comando iptables. Tenemos que añadir tan sólo dos reglas a la tabla FILTER en la cadena FORWARD (encargada de enrutar paquetes).

  1. Si el paquete va a la puerta de enlace: Permitirlo
  2. Si el paquete va a la red del vecino: Bloquearlo

Así de fácil. En iptables las reglas se ejecutan en orden, de
forma que si un paquete encuentra una regla coincidente pasa por ella y
no por las siguientes. Así cuando un paquete tenga como destino la
puerta de enlace del vecino (192.168.1.1) encontrará la regla 1 y no
llegará a evaluar la regla 2. Sin embargo, un paquete destinado por
ejemplo al ordenador portátil del vecino (192.168.1.32) no encontrará
conincidencia con la regla 1, así que pasará a evaluar la regla 2, con
la que conincide y por tanto será desechado.

¿Como añadimos estas dos reglas con iptables?

Con estos dos comandos:

  • iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -j DROP
  • iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.1 -j ACCEPT

El parámetro -I indica que inserte la regla al principio de la cadena
FORWARD, que es la encargada de enrutar paquetes (en la tabla FILTER,
que es la tabla por defecto). El parámetro -s indica el origen del
paquete (source) y el parámetro -d el destino (destination). El
parámetro -j indica qué hacer con el paquete, DROP sería bloquearlo y
ACCEPT sería permitirlo. Tener en cuenta que al usar -I las reglas se
insertan al principio de la cadena, por lo que la última en insertarse
quedará la primera en la cadena. También podríamos haber usado el
parámetro -A que inserta al final de la cadena de reglas, pero no
sabemos qué reglas se aplicarían antes que las nuestras. Fácil ¿verdad?

Con esto Jose Andrés ya está protegido de la detección de su vecino, su red está aislada de la red de su vecino.

Nota: Recordar que estos dos comandos de iptables deben
ejecutarse cada vez que se inicie el router, por lo que tendremos que
ponerlos en un script de inicio. Cada router permite esto de un modo u
otro, por ejemplo en DD-WRT sería:

En el botón SAVE FIREWALL.

 

Autor: Tomás Crespo García

ASP Site Map multi-idioma, también el parámetro URL

En la red existen varios tutoriales sobre cómo localizar (ajustar al
idioma) un site map de asp.net. De hecho, incluso Microsoft tiene una página con una breve explicación de ello, pero haciendo hincapié en que se pueden localizar los parámetros title y description pero no el parámetro url. En esa misma página deja unas ligeras pistas de cómo localizar el parámetro url,
pero demasiado ligeras, pues no encuentro nadie que lo haya conseguido.
Existen varios intentos por la red, algunos dicen que funcionan, pero
eso no es lo que yo he comprobado. Por ejemplo en este link
hay una solución un poco rebuscada que sólo funciona la primera vez que
se ejecuta la aplicación, desde ese momento guarda la preferencia de
lenguaje y siempre muestra el sitemap para ese mensaje. Un buen intento
que se queda corto, y un poco complicado, pues hay que crear un
SiteMapProvider personalizado.

Mi solución

Mi solución es la siguente. Creamos un sitemap para cada idioma, por
ejemplo Web.es.sitemap y Web.en.sitemap. En cada uno definimos los nodos
con sus atributos title, description, url y cualquier otro que queramos en su idioma correspondiente.

Site Map en inglés

Site Map en español

Ahora debemos configurar nuestra aplicación para que disponga de dos
proveedores de site maps, ojo, dos proveedores. Así quedaría nuestro
Web.config:

A continuación, en nuetra página maestra que es la que se debería
encargar de crear el menú de navegación a partir del sitemap, debemos
definir un método que en tiempo de ejecución cambie de proveedor de sitemap al datasource que empleemos para generar el menú de navegación. Yo lo hago en el método Page_Load:

En mi caso utilizo un par de Repeaters para crear el menú de navegación a
partir del Datasource SiteMapDataSource1 (original, eh), mostrando
tanto los parámetros url, title y description como otros personalizados como Image, ulid o pseudoUrl. Así se crea mi menú de navegación a partir de un site map con el parámetro url localizado de acuerdo al idioma.

Espero que a alguien le sirva.

Instalar Alfresco Community en un Ubuntu Server 11.10 x86 (32 bit)

Mi jefe es un híbrido entre una fabrica de papel y un aspersor, y debido a circunstancias de la producción me va a tocar a mi archivarle los papeles. Visto lo visto y lo traumatizados que han salido todos los que han tenido este cometido he decidido hacerlo bien, con un gestor documental informatizado, es decir, escaneas todos los papeles y luego categorizas y añades meta-tags e
indexas por contenido. Asi cuando vayas a buscar algo es casi instantáneo.

Tras investigar y probar (demos online) bastante he llegado a la conclusión que todo el mundo conoce sin investigar, lo mejor es Alfresco y despues Nuxeo, aunque hay otras buenas alternativas como Plone o FengOffice.
Plone me pareción muy bueno, sencillo y manejable, aunque algo limitado a la hora de configurar. FengOffice me encantó principalmente por su interfaz, que es muy moderna, pero no veo cómo hacer para que tenga previsualización y edición de documentos online (con previsualización me conformaría), algo así como swftools o integración con el servicio LibreOffice. ¡Qué demonios!, usemos el mejor, Alfresco.

Como tengo por ahí un viejo servidor HP Server tc2110 (Pentium 4 2.0GHz 640MB RAM, 18.2 GB SCSI HDD) me dicidí a instalar Alfresco:

1. Elegir el sistema operativo.

Alfresco se puede ejecutar tanto en Linux como en Windows, en ambos casos en arquitercturas x86 o x64. Tratándose de un servidor tan viejo y con tan poca RAM habría que estar más loco para ponerle un Windows.
Así, le pondré Ubuntu 11.10 Server Edition x86 (porque el Pentium 4 no soporta x64).

El primer problema derivado de esta elección es que Alfresco tiene instaladores automatizados para Windows x86 y x64 y para Linux x64, pero
(maldita sea) no para x86. No problem! Siempre es mucho más divertido instalar a mano, y además, dejaremos la instalación totalmente personalizada. Por ejemplo, en lugar de poner como gestor de base de datos MySQL (que es lo que hace el instalardor automatizado) utilizaremos postgresql que es más liviano. De igual modo, en lugar de usar OpenOffice (que se cuelga bastante) usaremos LibreOffice.

Total, nos descargamos la ISO de Ubuntu Server 11.10, la grabamos en un CD y la instalamos en nuestro HP tc2110.

 


2. Instalamos los requisitos de Alfresco

Atención: Esta guía es para Ubuntu Server x86 (32 bits).
Si tu sistema es otro busca una guía más sencilla, que las hay. Esta guía es más complicada debido a que Alfresco ya no da soporte para versiones de Linux de 32 bits.

Alfresco se encarga de indexar todos los documentos que le damos, pero para hacerlo necesita algunas utilidades que debe tener el sistema. Por ejemplo necesita el servidor web TomCat para que desde otros puestos de la oficina podamos comunicarnos con él y use páginas web con extensión jsp. Necesita un sistema gestor de base de datos, MySQL, Postgresql, etc. Evidentemente también necesita Java y algunas cosillas menores como imagemagick, swftools, libreoffice que en algún caso son opcionales.
Así, empezemos por tener todos esto ok antes de instalar Alfresco.

Lo primero que suelo hacer cuando monto un servidor es instalar el servicio SSH, para poder conectarme a él remotamente y trabajar a gusto desde mi mesa. Así que, aunque esto no es necesario para Alfresco, empiezo por ahí.

# sudo apt-get install openssh-server

Ahora vamos a instalar algunas cosillas que necesita Alfresco.

# sudo apt-get install imagemagick swftools sun-java6-jre postgresql

El paquete imagemagick debe instalarse sin problemas, pero el swftools nos irá que no lo encuentra, así que nos toca instalarlo a mano.


# sudo apt-get update
# sudo apt-get install gcc g++ make
# sudo apt-get install libgif-dev xpdf  libfreetype6 libfreetype6-dev libjpeg62 libjpeg8 libjpeg8-dev
# sudo apt-get install git


# cd ~
# git clone git://git.swftools.org/swftools
# cd ~/swftools/lib/pdf
# sudo perl inject-xpdf.pl xpdf-3.02.tar.gz
# cd ~/swftools
# ./configure
# sudo make
# sudo make install
# which pdf2swf
# pdf2swf –version

Si todo ha ido bien ya tenemos swftools instalado. De este paquete Alfresco usará la utilidad pdf2swf para poder previsualizar los pdf convirtiéndolos a flash. En cualquier caso, deberíamos copiar el ejecutable a /user/bin para que Alfresco lo encuentre.

# sudo cp /usr/local/bin/pdf2swf /usr/bin

En caso de que por algún motivo no consiguiésemos instalar swftools tampoco tendríamos que preocuparnos demasiado, todo funcionaría salvo que no podríamos previsualizar los pdf, aunque podríamos corregirlo instalando mas tarde swftools.

Para continuar debemos editar el fichero /etc/apt/sources.list para descomentar (quitar la #) en la línea del repositorio partner. Esto habilita un repositorio que tiene algunos paquetes que nos harán falta.

Para editar hacemos

# sudo nano /etc/apt/sources.list

Descomentamos las líneas:

deb http://archive.canonical.com/ubuntu oneiric partner
deb-src http://archive.canonical.com/ubuntu oneiric partner

Salimos de nano guardando los cambios (Ctrl+X)

y actualizamos los paquetes disponibles con

# sudo apt-get update

Ahora vamos a instalar java. Al parecer los de Ubuntu están peleados con
el Java de Sun, y ahora en sus repositorios sólo ofrecen un Java Open
Source llamado OpenJava. A nosotros para Alfresco no nos interesa ese,
nos interesa el Java de Sun, así que necesitamos instalar un repositorio
extra para poder instalar Java. Allá vamos:

# apt-get install python-software-properties
# sudo add-apt-repository ppa:ferramroberto/java
# sudo apt-get update
# sudo apt-get install sun-java6-jre

Otra opción es instalar Java Sun a mano, descargando y compilando. Más información aquí.

Lo siguiente es instalar la base de datos que usará Alfresco. Lo normal es instalar MySQL, así que vamos a instalar PostgreSQL.

# sudo apt-get install postgresql

Ya está, este ha sido fácil.

Ahora vamos a instalar algo para poder previsualizar/editar documentos.
Lo normal es instalar OpenOffice, así que vamos a instalar LibreOffice,
que según he leido se cuelga bastante menos (el servicio). Primero
limpiamos cualquier rastro de OpenOffice, por si lo hubiera, y a
continuación instalamos LibreOffice (añadiendo su correspondiente
repositorio).

# sudo apt-get purge openoffice.org ure
# sudo add-apt-repository ppa:libreoffice/ppa
# sudo apt-get update
# sudo apt-get install libreoffice

Bien, ahora vamos a por TomCat y sus librerías nativas.

# sudo apt-get install tomcat6
# sudo apt-get install libtcnative-1

Más fácil imposible.

 

 3. Instalar Alfresco en nuestro Ubuntu 11.10 (Oneiric Ocelot).

Llegó el momento, vamos a instalar Alfresco. Para ello empezamos por descargar el WAR desde el sitio de Alfresco.

Vamos a la página de Alfresco y descargamos la última versión, en el momento de escribir este artículo la 4.0.

# wget http://dl.alfresco.com/release/community/build-3979/alfresco-community-4.0.c.zip

Descomprimimos creando la carpeta Alfresco en nuestro home

# sudo apt-get install unzip
# unzip alfresco-community-4.0.c.zip -d alfresco

Paramos el servicio de TomCat

# sudo service tomcat6 stop

Y ahora configuramos TomCat copiando algunos archivos de Alfresco:

# sudo cp -r ~/alfresco/web-server/shared /var/lib/tomcat6
# sudo cp -r ~/alfresco/web-server/webapps /var/lib/tomcat6
# sudo cp -r ~/alfresco/web-server/lib /var/lib/tomcat6/shared/lib
# sudo cp -r ~/alfresco/bin /var/lib/tomcat6/bin
# sudo cp -r ~/alfresco/licenses /var/lib/tomcat6/licenses
# sudo cp -r ~/alfresco/README.txt /var/lib/tomcat6/README.txt
# sudo rm /var/lib/tomcat6/shared/lib/mysql-connector-java-5.1.13-bin.jar

La última orden es sólo por si acaso; normalmente no tendremos ese fichero, pero si lo tenemos hay que eliminarlo.

Ahora necesitamos los drivers JDBC para poder utilizar PostgreSQL, así
que vamos a la web de PostgreSQL y los descargamos y se los pasamos a
TomCat.

# wget http://jdbc.postgresql.org/download/postgresql-9.1-901.jdbc3.jar
# sudo cp ~/postgresql-9.1-901.jdbc3.jar /var/lib/tomcat6/shared/lib/postgresql-9.0-801.jdbc3.jar

Ahora configuramos Alfresco a partir de los archivos de configuración de ejemplo

# sudo mv
/var/lib/tomcat6/shared/classes/alfresco-global.properties.sample
/var/lib/tomcat6/shared/classes/alfresco-global.properties
# sudo mv
/var/lib/tomcat6/shared/classes/alfresco/web-extension/share-config-custom.xml.sample

/var/lib/tomcat6/shared/classes/alfresco/web-extension/share-config-custom.xml
Y editamos el archivo catalina.properties de TomCat cambiando la línea que empieza por shared.loader=… que será algo como esta:

shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/*.jar,/var/lib/tomcat6/shared/classes,/var/lib/tomcat6/shared/*.jar

y dejándola así:

shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/*.jar,/var/lib/tomcat6/shared/classes,/var/lib/tomcat6/shared/lib/*.jar

Vamos, un cambio de nada, sólo hemos añadido el /lib/ al final.

Ahora nos toca configurar TomCat para que funcione con Java correctamente, editando el fichero /etc/default/tomcat6

# sudo nano /etc/default/tomcat6

Y añadimos:

JAVA_HOME=/usr/lib/jvm/java-6-sun
JAVA_OPTS=”${JAVA_OPTS} -XX:MaxPermSize=512m -Xms128m -Xmx768m -Dalfresco.home=/opt/alfresco -Dcom.sun.management.jmxremote”
JAVA_OPTS=”${JAVA_OPTS} -XX:+CMSIncrementalMode”

Si quieres saber más sobre cómo ajustar el rendimiento de la máquina
virtual de Java para que funcione ok con Alfresco puedes leerlo aquí, en el apartado Tunning the JVM.

 

Bien, ya casi estamos. Vamos a crear la base de datos alfresco en PostgreSQL junto con el usuario alfresco con contraseña alfresco, original ¿no?.

# sudo -i
# su – postgres
# psql
CREATE USER alfresco WITH PASSWORD ‘alfresco’;
CREATE DATABASE alfresco WITH OWNER=alfresco;
GRANT ALL PRIVILEGES ON DATABASE alfresco TO alfresco;
\l
\du
\q

Ahora creamos un directorio para nuestros datos y le damos permisos aTomCat para ese directorio.

# sudo mkdir -p /srv/www/alfresco/alf_data
# sudo chown -R tomcat6:tomcat6 /var/lib/tomcat6 /srv/www/alfresco

Editamos la configuración de Alfresco

# sudo nano /var/lib/tomcat6/shared/classes/alfresco-global.properties

Al principio del documento creamos la línea que indica a Alfresco dónde guardar los documentos.

dir.root=/srv/www/alfresco/alf_data

En la sección External locations añadimos lo siguiente:

ooo.exe=/usr/lib/libreoffice/program/soffice
ooo.enabled=true
jodconverter.officeHome=/usr/lib/libreoffice
jodconverter.portNumbers=8101
jodconverter.enabled=true
img.root=/usr/lib/ImageMagick-6.5.7
img.exe=/usr/bin/convert
swf.exe=/usr/bin/pdf2swf

En la sección PostgreSQL añadimos:

db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://localhost:5432/alfresco

Y en la sección URL Generation Parameters descomentamos:

alfresco.context=alfresco
alfresco.host=${localname}
alfresco.port=8080
alfresco.protocol=http


share.context=share
share.host=${localname}
share.port=8080
share.protocol=http

¡Listo! Lanzamos el Tomcat

# sudo service tomcat6 start

Y comprobamos si podemos acceder a Alfresco con un navegador web.

 


http://192.168.1.100:8080/share/

Ten en cuetna poner la ip de tu servidor, el puerto que hayas
configurado, y esperar porque la primera vez que accedes tarda un poco.

Ah! Por defecto el usuario es admin y la contraseña también admin.

Ahora a escanear se ha dicho.

 


4. Algunas cosillas más

Si queréis poder acceder al servidor por su nombre en lugar de por su ip, es decir, poder poner http://ubuntuserver:8080/share en lugar de http://192.168.1.100:8080/share tendréis que instalar samba:

# sudo apt-get install samba sbmfs

Además también lo necesitaréis para que la máquinas Windows del resto de
la red puedan acceder al servidor mediante su nombre (ubuntuserver) y
no solo por su ip. Es decir, una vez habilitado CIFS las máquinas
windows podrán hacer \\ubuntuservera\alfresco y acceder a las carpetas.

Problemillas con CIFS. Si quieres que funcione CIFS te toca pringarte.
El problema es el siguiente: En linux los puertos del 0 al 1024 son
puertos privilegiados, sólo los pueden utilizar aplicaciones lanzadas
con la cuenta root (por ejemplo). Alfresco escucha en los puertos 445,
139, 137 y 138 para hacer de servidor Samba y CIFS. Pero claro, Alfresco
se lanza con el usuario tomcat6, que no es un usuario privilegiado, por
eso no funciona CIFS recién instalado. Tenemos dos opciones:

1. Lanzar alfresco con el usuario root

2. Decierle a Alfresco que ejecute el servidor SAMBA/CIFS en puertos no
privilegiados (por encima del 1024) y redirigir los puertos
privilegiados a esos con iptables.

 

La primera opción nos pueded dar muchos problemas de seguridad, TomCat
no debe ejecutarse con tantos privilegios, si alguien se apodera de él
se apodera de todo el sistema.

Usamos la segunda opción, así que primero cambiamos los puertos CIFS en
el archivo
/var/lib/tomcat6/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default/file-servers.properties,
dejando las siguientes líneas así:

# cifs.tcpipSMB.port=1445
# cifs.netBIOSSMB.sessionPort=1139
# cifs.netBIOSSMB.namePort=1137
# cifs.netBIOSSMB.datagramPort=1138

Tan sólo hemos añadido un 1 delante de cada puerto para que ya no sean
puertos privilegiados. Ahora debemos decirle a iptables que rediriga los
antiguos puertos privilegiados, que es donde todo el mundo (windows)
espera encontrar al servidor SAMBA/CIFS, a los nuevos puertos.

# sudo su
# echo 1 > /proc/sys/net/ipv4/ip_forward
# modprobe iptable_nat
# iptables -F
# iptables -t nat -F
# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -t nat -A PREROUTING -p tcp –dport 445 -j REDIRECT –to-ports 1445
# iptables -t nat -A PREROUTING -p tcp –dport 139 -j REDIRECT –to-ports 1139
# iptables -t nat -A PREROUTING -p udp –dport 137 -j REDIRECT –to-ports 1137
# iptables -t nat -A PREROUTING -p udp –dport 138 -j REDIRECT –to-ports 1138

Reiniciamos tomcar y listo, ya debería funcionar CIFS.

Por supuesto las reglas de iptables se borrarán al reiniciar y CIFS
dejará de funcionar. Para que se queden debemos instalar el paquete
iptables-persistent (hay más formas, pero esta es más fácil).


# sudo apt-get install iptables-persistent

Y cada vez que queramos que las reglas que se estén ejecutando se guarden debemos hacer


# iptables-save > /etc/iptables/rules.v4

Listo, iptables guardado a prueba de reinicios

La guinda:

Si a Alfresco le ponemos un plugin llamado media-viewers ya se quda niquelao.Principalmente porque ese plugin incluye pdf.js,
que es un lector de pdfs online que nos permitirá deshacercnos del
asqueros previsualizador de pdfs Flash que viene por defecto en la
instalación de Alfresco.