Modbus en PLC CP1L de Omron

Actualmente estoy trabajando con un PLC de la marca Omron, concretamente con un CP1L. Este PLC posee conectividad mediante ethernet y quería configurar un servidor ModBus para poder realizar un intercambio de datos entre este PLC y otro dispositivo de red.

ModBus es el protocolo industrial más utilizado en la actualidad y pensaría que este tema lo Omron lo tendría solucionado sin muchas complicaciones. Y es cierto, Omron posee unas librerías para poder usar servidores y clientes de ModBus pero no vienen por defecto con su suite de programación (CX-ONE) sino que hay que bajarselo de la siguiente direccion: https://www.myomron.com/index.php?action=kb&article=1245

Si descargamos el servidor nos viene con unos archivos que debemos almacenar en alguna parte de nuestro disco duro (yo los almaceno en: C:\Program Files (x86)\OMRON\CX-One\Lib\FBL\omronlib). Lo más curioso es que viene un PDF explicándonos las características de la librería y podemos observar que no están implementadas todas las funciones de ModBus y que además encontramos un mensaje en rojo que nos dice: Omron could not be held responsible in case of malfunction.

Después de acabar este proceso abro CX-Programmer para implementar funciones de ModBus en mi programa y para ello pulso segundo botón sobre Bloques de función (en el panel izquierdo) y selecciono Insertar bloque de función > desde archivo. Selecciono el archivo que me he descomprimido anteriormente y ya tendré la librería de ModBus lista para usar.

Para usar la librería me creo una nueva sección del programa y coloco la librería allí

Librería ModBus

Para probar que está funcionando hago un escaneo de red mediante nmap y veo que cuando acaba el escaneo, efectivamente el PLC tiene activo el puerto 502 (que es el puerto de modbus por defecto) pero veo que el PLC deja estar a la escucha. Lo más preocupante es que aunque resetease las entradas no era capaz de volverse a poner a la escucha.

ModBus

Después de hacer un poco de ingeniería inversa a la libreria de ModBus me di cuenta de que en la dirección de memoria D32404 almacena el error actual

ModBus

Y además me fijo que el error en el que se queda después del escaneo de nmap es 0x0E88 así que en la misma sección donde tengo la librería ModBus incorporó una pequeña lógica para resetar a 0 el valor de esa dirección de memoria cuando el valor de dicha dirección es 0x0E88

ModBus

Y con esto ya es capaz de recuperarse del error que se genera cuando hago un escaneo con nmap y ya puedo conectar mediante un pequeño cliente que he programado en python (Aunque posteriormente probé a ejecutar el cliente sin necesidad de la lógica de reseteo de la dirección de memoria y funcionaba correctamente. Parece que solamente se produce con nmap el fallo)

modbus5Por cierto, este es el PLC sobre el que estoy trabajando

WhatsApp Image 2019-03-15 at 18.40.43 WhatsApp Image 2019-03-15 at 18.41.07

Bandit wargame - I

Este verano, a pesar de haber tenido poco tiempo libre, he dedicado tiempo a hacer algunos wargames que me parecian realmente interesantes pero que nunca había tenido tiempo para realizar. El termino wargame es usado de forma generalizada en el mundo hacking para denotar un reto (por lo general en el ámbito de la cibersguridad). Su funcionamiento es bastante parecido a los cracksme's de las comunidades de crackers. Se propone un reto y se debe superar.

Este verano he realizado varios wargames de la página http://overthewire.org/. En este artículo concretamente voy a comentar y solucionar el wargame llamado bandit que posee un nivel de dificultad bajo, pero que es ideal para aquellos que quieren coger experiencia con los sistemas unix y los comandos de shell. Desde mi punto de vista se trata de un wargame bastante sencillo pero con algún que otro nivel que si no se tiene la idea puede resultar un poco más complicado.

Para empezar con este wargame debemos acceder por ssh a la dirección que nos proporcionan ellos por el puerto 2220. Para acceder al priner nivel basta con ejecutar el siguiente comando desde tu terminal, usando bandit0 como contraseña.

  • angelluis@sunny:~$ ssh bandit0@bandit.labs.overthewire.org -p 2220
angelluis@sunny:~$ ssh bandit0@bandit.labs.overthewire.org -p 2220

A partir de ahora deberemos seguir las instrucciones que aparecen en http://overthewire.org/wargames/bandit/bandit0.html, para progesar en el wargame. Cuando finalicemos un nivel podemos pasar al siguiente nivel con el menu lateral izquierdo que aparece en la página web.

Como se ha señalado anteriormente la mayoría de niveles son realmente sencillos así que únicamente escribiré la solución sin explicar como se ha llegado a ella. Solamente en aquellos que sean más complejos se explicará la solución. Por último y para no hacer las entradas largas y tediosas este wargame se va a dividir en tres entradas distintas en el blog. Dicho esto empezamos con los primeros niveles.
Nivel0 -> Nivel 1

  • bandit0@bandit:~$ cat readme
  • boJ9jbbUNNfktd78OOpsqOltutMc3MY1
bandit0@bandit:~$ cat readme 
boJ9jbbUNNfktd78OOpsqOltutMc3MY1

Nivel1 -> Nivel 2

  • bandit1@bandit:~$ cat ./-
  • CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
bandit1@bandit:~$ cat ./-
CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

Nivel 2 -> Nivel 3

  • bandit2@bandit:~$ cat spaces\ in\ this\ filename
  • UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
bandit2@bandit:~$ cat spaces\ in\ this\ filename
UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

Nivel 3 -> Nivel 4

  • bandit3@bandit:~$ ls -a inhere/
  • . .. .hidden
  • bandit3@bandit:~$ cat inhere/.hidden
  • pIwrPrtPN36QITSp3EQaw936yaFoFgAB
bandit3@bandit:~$ ls -a inhere/
.  ..  .hidden
bandit3@bandit:~$ cat inhere/.hidden 
pIwrPrtPN36QITSp3EQaw936yaFoFgAB

Nivel 4 -> Nivel 5

  • bandit4@bandit:~$ file inhere/-file0*
  • inhere/-file00: data
  • inhere/-file01: data
  • inhere/-file02: data
  • inhere/-file03: data
  • inhere/-file04: data
  • inhere/-file05: data
  • inhere/-file06: data
  • inhere/-file07: ASCII text
  • inhere/-file08: data
  • inhere/-file09: data
  • bandit4@bandit:~$ cat inhere/-file07
  • koReBOKuIDDepwhWk7jZC0RTdopnAYKh
bandit4@bandit:~$ file inhere/-file0*
inhere/-file00: data
inhere/-file01: data
inhere/-file02: data
inhere/-file03: data
inhere/-file04: data
inhere/-file05: data
inhere/-file06: data
inhere/-file07: ASCII text
inhere/-file08: data
inhere/-file09: data
bandit4@bandit:~$ cat inhere/-file07
koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Nivel 5 -> Nivel 6

  • bandit5@bandit:~$ find inhere/ -size 1033c
  • inhere/maybehere07/.file2
  • bandit5@bandit:~$ cat inhere/maybehere07/.file2
  • DXjZPULLxYr17uwoI01bNLQbtFemEgo7
bandit5@bandit:~$ find inhere/ -size 1033c
inhere/maybehere07/.file2
bandit5@bandit:~$ cat inhere/maybehere07/.file2 
DXjZPULLxYr17uwoI01bNLQbtFemEgo7

Nivel 6 -> Nivel 7

  • bandit6@bandit:~$ find / -user bandit7 -group bandit6 -size 33c
  • find: ‘/tmp’: Permission denied
  • find: ‘/var/log’: Permission denied
  • find: ‘/var/tmp’: Permission denied
  • find: ‘/var/spool/bandit24’: Permission denied
  • find: ‘/var/spool/rsyslog’: Permission denied
  • find: ‘/var/spool/cron/crontabs’: Permission denied
  • find: ‘/var/lib/sudo’: Permission denied
  • find: ‘/var/lib/apt/lists/partial’: Permission denied
  • /var/lib/dpkg/info/bandit7.password
  • find: ‘/var/cache/apt/archives/partial’: Permission denied
  • find: ‘/var/cache/ldconfig’: Permission denied
  • find: ‘/home/bandit5/inhere’: Permission denied
  • find: ‘/home/bandit27-git’: Permission denied
  • find: ‘/home/bandit30-git’: Permission denied
  • find: ‘/home/bandit29-git’: Permission denied
  • find: ‘/home/bandit28-git’: Permission denied
  • find: ‘/home/bandit31-git’: Permission denied
  • find: ‘/root’: Permission denied
  • find: ‘/proc/tty/driver’: Permission denied
  • find: ‘/proc/14737/task/14737/fd/6’: No such file or directory
  • find: ‘/proc/14737/task/14737/fdinfo/6’: No such file or directory
  • find: ‘/proc/14737/fd/5’: No such file or directory
  • find: ‘/proc/14737/fdinfo/5’: No such file or directory
  • find: ‘/run/user/11017’: Permission denied
  • find: ‘/run/user/11014’: Permission denied
  • find: ‘/run/user/11031’: Permission denied
  • find: ‘/run/user/11009’: Permission denied
  • find: ‘/run/user/11032’: Permission denied
  • find: ‘/run/user/11029’: Permission denied
  • find: ‘/run/user/11003’: Permission denied
  • find: ‘/run/user/11008’: Permission denied
  • find: ‘/run/user/11001’: Permission denied
  • find: ‘/run/user/11011’: Permission denied
  • find: ‘/run/user/11007’: Permission denied
  • find: ‘/run/user/11020’: Permission denied
  • find: ‘/run/user/11010’: Permission denied
  • find: ‘/run/user/11016’: Permission denied
  • find: ‘/run/user/11028’: Permission denied
  • find: ‘/run/user/11013’: Permission denied
  • find: ‘/run/user/11025’: Permission denied
  • find: ‘/run/user/11026’: Permission denied
  • find: ‘/run/user/11019’: Permission denied
  • find: ‘/run/user/11012’: Permission denied
  • find: ‘/run/user/11024’: Permission denied
  • find: ‘/run/user/11004’: Permission denied
  • find: ‘/run/user/11005’: Permission denied
  • find: ‘/run/user/11000’: Permission denied
  • find: ‘/run/user/0’: Permission denied
  • find: ‘/run/screen/S-bandit20’: Permission denied
  • find: ‘/run/log/journal/3e1a10a965094e0f89fe44562a3d88f2’: Permission denied
  • find: ‘/run/lvm’: Permission denied
  • find: ‘/run/systemd/ask-password-block’: Permission denied
  • find: ‘/run/systemd/inaccessible’: Permission denied
  • find: ‘/run/lock/lvm’: Permission denied
  • find: ‘/lost+found’: Permission denied
  • find: ‘/etc/lvm/archive’: Permission denied
  • find: ‘/etc/lvm/backup’: Permission denied
  • find: ‘/etc/ssl/private’: Permission denied
  • find: ‘/sys/kernel/debug’: Permission denied
  • find: ‘/boot/lost+found’: Permission denied
  • bandit6@bandit:~$ cat /var/lib/dpkg/info/bandit7.password
  • HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
bandit6@bandit:~$ find / -user bandit7 -group bandit6 -size 33c
find: ‘/tmp’: Permission denied
find: ‘/var/log’: Permission denied
find: ‘/var/tmp’: Permission denied
find: ‘/var/spool/bandit24’: Permission denied
find: ‘/var/spool/rsyslog’: Permission denied
find: ‘/var/spool/cron/crontabs’: Permission denied
find: ‘/var/lib/sudo’: Permission denied
find: ‘/var/lib/apt/lists/partial’: Permission denied
/var/lib/dpkg/info/bandit7.password
find: ‘/var/cache/apt/archives/partial’: Permission denied
find: ‘/var/cache/ldconfig’: Permission denied
find: ‘/home/bandit5/inhere’: Permission denied
find: ‘/home/bandit27-git’: Permission denied
find: ‘/home/bandit30-git’: Permission denied
find: ‘/home/bandit29-git’: Permission denied
find: ‘/home/bandit28-git’: Permission denied
find: ‘/home/bandit31-git’: Permission denied
find: ‘/root’: Permission denied
find: ‘/proc/tty/driver’: Permission denied
find: ‘/proc/14737/task/14737/fd/6’: No such file or directory
find: ‘/proc/14737/task/14737/fdinfo/6’: No such file or directory
find: ‘/proc/14737/fd/5’: No such file or directory
find: ‘/proc/14737/fdinfo/5’: No such file or directory
find: ‘/run/user/11017’: Permission denied
find: ‘/run/user/11014’: Permission denied
find: ‘/run/user/11031’: Permission denied
find: ‘/run/user/11009’: Permission denied
find: ‘/run/user/11032’: Permission denied
find: ‘/run/user/11029’: Permission denied
find: ‘/run/user/11003’: Permission denied
find: ‘/run/user/11008’: Permission denied
find: ‘/run/user/11001’: Permission denied
find: ‘/run/user/11011’: Permission denied
find: ‘/run/user/11007’: Permission denied
find: ‘/run/user/11020’: Permission denied
find: ‘/run/user/11010’: Permission denied
find: ‘/run/user/11016’: Permission denied
find: ‘/run/user/11028’: Permission denied
find: ‘/run/user/11013’: Permission denied
find: ‘/run/user/11025’: Permission denied
find: ‘/run/user/11026’: Permission denied
find: ‘/run/user/11019’: Permission denied
find: ‘/run/user/11012’: Permission denied
find: ‘/run/user/11024’: Permission denied
find: ‘/run/user/11004’: Permission denied
find: ‘/run/user/11005’: Permission denied
find: ‘/run/user/11000’: Permission denied
find: ‘/run/user/0’: Permission denied
find: ‘/run/screen/S-bandit20’: Permission denied
find: ‘/run/log/journal/3e1a10a965094e0f89fe44562a3d88f2’: Permission denied
find: ‘/run/lvm’: Permission denied
find: ‘/run/systemd/ask-password-block’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied
find: ‘/run/lock/lvm’: Permission denied
find: ‘/lost+found’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
find: ‘/sys/kernel/debug’: Permission denied
find: ‘/boot/lost+found’: Permission denied
bandit6@bandit:~$ cat /var/lib/dpkg/info/bandit7.password
HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs

Nivel 7 -> Nivel 8

  • bandit7@bandit:~$ grep "millionth" data.txt
  • millionth cvX2JJa4CFALtqS87jk27qwqGhBM9plV
bandit7@bandit:~$ grep "millionth" data.txt
millionth    cvX2JJa4CFALtqS87jk27qwqGhBM9plV

Nivel 8 -> Nivel 9

  • bandit8@bandit:~$ cat data.txt | sort | uniq -u
  • UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
bandit8@bandit:~$ cat data.txt | sort | uniq -u
UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR

Nivel 9 -> Nivel 10

  • bandit9@bandit:~$ strings data.txt | grep =
  • x========== the
  • XG*=!
  • =l]r?jm
  • |4\=
  • n=~e
  • ========== password
  • =$!?$
  • %YFK=
  • ========== is
  • =?/xE
  • =Wz^
  • DXL=-
  • ,O=s
  • as?=G%_
  • Pajx=;a
  • 1#==
  • ========== truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
  • uc=7
  • K=93
bandit9@bandit:~$ strings data.txt | grep =
x========== the
XG*=!
=l]r?jm
|4\=
n=~e
========== password
=$!?$
 %YFK=
========== is
=?/xE
=Wz^
DXL=-
,O=s
as?=G%_
Pajx=;a
1#==
========== truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
uc=7
K=93

Nivel 10 -> Nivel 11

  • bandit10@bandit:~$ cat data.txt | base64 -d
  • The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
bandit10@bandit:~$ cat data.txt | base64 -d
The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR

Nivel 11 -> Nivel 12

En las instrucciones de este nivel indican que la contraseña para el siguiente nivel está cifrada con un desplazamiento de 13. Es decir donde hay una a debe haber una a+13 = n. Este cifrado es conocido como ROT13 y es una técnica de cifrado por sustitución siendo un caso específico del cifrado cesar (en este ultimo cifrado la posición a usar para realizar la sustitución puede ser distinta de 13, siendo por lo general n <longitud del alfabeto).

Este nivel se puede abordar de varias maneras, una de ellas sería creando un pequeño programa que realice la sustitución caracter a caracter, pero linux nos ofrece un comando que es capaz de "traducir" desde un conjunto de entrada a un conjunto de salida. En esta solución se ha optado por el comando tr donde el conjunto de entrada es el alfabeto desde la a hasta la z en minuscula y desde la A hasta la Z en mayuscula y el conjunto de salida es el alfabeto rotado 13 positición.

  • bandit11@bandit:~$ cat data.txt
  • Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh
  • bandit11@bandit:~$ tr [a-zA-Z] [n-za-mN-ZA-M] < data.txt
  • The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
bandit11@bandit:~$ cat data.txt 
Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh
bandit11@bandit:~$ tr [a-zA-Z] [n-za-mN-ZA-M] < data.txt
The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu

Actualizado mi equipo a Ubuntu 17.04

He de reconocer que en mi ordenador personal se me da mal eso de actualizar, antes siempre actualizaba a la última versión para probar las nuevas novedades que traía, eso siempre conllevaba un gran riesgo, como por ejemplo que librerias instaladas dejasen de funcionar por dependencias incumplidas.

Actualmente intento actualizar lo menos posible, solamente actualizaciones criticas y de seguidad. Llevaba con una versión Ubuntu Gnome 15.04 (porque a mi no me va eso de Unity, y creo que su muerte es buena para la comunidad gnome y que así todos podamos remar en la misma dirección) pues desde abril de 2015. Es decir, casi 3 años sin actualizar la distribución.

El lunes necesité instalar el framework ionic2 en mi máquina y me lleve una sorpresa al ver que no podia instalarlo porque necesitaba una versión reciente de node.js y no había ninguna compatible con mi sistema, así que el martes me armé de valor y me dediqué a actualizar el sistema.

Mi primera idea era actualizar a la 16.04 que es la última LTS. Primer problema, para actualizar a la 16.04 desde la 15.04 es necesario pasar por la 15.10 que ya no tiene soporte, por tanto al ejecutar el comando

sudo do-release-upgrade

Me decía que no se podía actualizar así que tenia que actualizar manualmente a 15.10 con los siguientes comandos

sed -i -e "s/trusty/wily/g" /etc/apt/sources.list
 pt-get update && apt-get dist-upgrade

Y después de unas cuantas horas bajando paquetes y actualizando conseguí actualizar a la versión 15.10. Después desde 15.10 ejecuté

sudo do-release-upgrade

Y esta vez si que funcionó, después de bajar aún más paquetes que antes, terminó la instalación con algunos cuelgues que me indicaba que la cosa no fue bien. Reinicio el ordenador y no arranca.

Total, me bajo esta vez la 17.04 y la grabo en un USB, la instalo en el punto de anclaje /, monto /home  /home/angelluis/data y la swap y después de una media hora ya tenía el sistema montado.

No perdí datos porque siempre particiono el disco duro para que los datos sean independientes de la instalación del sistema.

Ahora quedaba lo más dificil, dejarlo todo como estaba antes, o mejor. Llegados a este punto entré en shock. tengo que decir que los sistemas linux que manejo son Ubuntu 14.04, Ubuntu 16.04 y mi portatil personal que estaba en 15.04. Bueno, al estar en 17.04 y no funcionarme el Wifi, ejecuto el comando

ifconfig

Y me dice que no está instalado, que si quiero instalarlo ejecute el comando

sudo apt-get install net-tools

Mi primer pernsamiento fue que esto es un fallo, pero buscando veo que el comando ifconfig ha sido sustituido por ip (el mítico comando ifconfig!). Aquí no acaban mis sorpresas después de 3 años sin actualizar. Al ejecutar

ip a

o

ifconfig

Me doy cuenta que la interfaz eth0 ha sido renombrada a enp1s0f1 (WTF!) y después de arreglar el Wifi vi que wlan0 ha sido renombrada a wlp2s0b1. Básicamente esto se debe a lo que se denomina nombramiento previsible de interfaces de red y es debido al nuevo sistema systemd (https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/).

Imaginaros cual era mi situación, de vivir toda la vida con ifconfig y eth0/wlan0 de un día para otro me entero que eso ya no se lleva, que ahora se llevan otras cosas más modernas.

Dejando esto de lado internet, no me ofrece ninguna solución a mi problema con el Wifi así que mirando en dmesg me encuentro con un error bastante explicativo

[ 20.624301] b43-phy0 ERROR: Firmware file "b43/ucode29_mimo.fw" not found
 [ 20.624306] b43-phy0 ERROR: Firmware file "b43-open/ucode29_mimo.fw" not found
 [ 20.624308] b43-phy0 ERROR: You must go to http://wireless.kernel.org/en/users/...devicefirmware and download the correct firmware for this driver version. Please carefully read all instructions on this website.

Basicamente me dice que no puede cargar el firmware para mi chip de Wifi y que me dirija a una dirección. En Ubuntu el firmware se puede instalar ejecutando

sudo apt-get install firmware-b43-installer

Todo correcto y funcionado. Siguiente paso: comprobar que todo está en orden y sobre todo comprobar un proyecto en concreto del que al día siguiente tenía una presentación con el grupo de investigación de la Universidad de Murcia.

Antes de nada vuelvo a instalar mi shell favorita zsh

sudo apt-get install zsh

Esto puede parecer una tontería sin importancia pero tengo configuración importante en ~/.zshrc (aunque podia perfectamente pasarla a bash). Después de instalar zsh puedo ejecutar anaconda que lo tengo en mi carpeta de datos y por tanto no tengo que reinstalar.

Así que nada

. activate super_secret_project

Me funciona sin ningún problema, ejecuto python y escribo

import cv2

Para importar OpenCV 3.2.0 y

ImportError: libpng12.so.0: cannot open shared object file: No such file or directory

A pesar de que

conda info opencv3

Me decia que dicho paquete tenía dependencia a libpng16 y no a libpng12. En fin no trato de comprender los comportamientos irracionales. Me dirijo a  https://packages.ubuntu.com/xenial/i386/libpng12-0/download la descargo desde algún mirror y la instalo y vuelvo a probar el import cv2 y me devuelve

ImportError:/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0: undefined symbol: hb_buffer_set_cluster_level

Esta vez parece un problema de pango así que ejecuto, así que ejecuto

conda install -c asmeurer pango

Dentro del entorno super_secret_project y esta vez ya puedo ejecutar opencv en python + anaconda sin ningún tipo de problema. Ya me he quitado un peso de encima.

Todavía me quedaban algunas cosas importantes como instalar cordova e Ionic2.

Empezamos con cordova, para instalar cordova (e Ionic) necesito nodejs y npm y los paquetes que vienen por defecto en ubuntu no son los más actualizados. Así que ejecuto

sudo  wget -qO- https://deb.nodesource.com/setup_6.x | bash -

El comando con curl me daba fallo así que por eso he usado wget. Después de esto y de seguir las instrucciones que aparecen en pantalla ya tengo instalado nodejs (con enlace simbolico a node) y npm. Para instalar cordova

sudo npm install -g cordova

Si todo sale bien se debería de haber instalado cordova. Ahora voy al directorio del proyecto cordova y ejecuto

cordova build

Error, falta el jdk de java. Así que

sudo apt-get install openjdk-8-jdk

Volvemos a hacer

cordova build

Error, me dice que no encuentra el SDK de android, así que

echo "export ANDROID_HOME=/home/angelluis/Escritorio/sdk" >> ~./zshrc
echo "export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH" >> ~./zshrc
source ~/.zshrc

Probamos de nuevo con

cordova build

Error, a pesar de tener Android Studio instalado no encuentra el gradle del sistema o de Android Studio así que

sudo apt-get install gradle

Ahora si pruebo a construir el proyecto de cordova funciona. He tenido suerte, porque una versión de gradle de modificaba la variable de entorno JAVA_HOME dandote error la construcción del proyecto, y la solución era modificar a mano gradle o instalar una versión distinta de gradle.

Ahora vamos con Ionic. Ionic es un framework que se basa en typescript, Angularjs y cordova. Instalar Ionic después de haber instalado cordova es relativamente sencillo

sudo npm install -g ionic

Ya tego las herramientas mas importantes instaladas. Faltan los IDE's, que uso Sublime Text y Atom

wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install sublime-text
sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom

Y por último creo que gnome tiene un serio problema con el diseño por tanto siempre le cambio el diseño (aunque solo cambio el tema de ventana y los iconos) y le pongo uno parecido a los sobremesa de Apple. El proyecto se llama MacBuntu: http://www.noobslab.com/2017/06/macbuntu-transformation-pack-ready-for.html También hay un set de iconos que me gusta bastante y se llama Faenza: https://tiheum.deviantart.com/art/Faenza-Icons-173323228 Y como colofón instalarle extensiones a gnome: https://extensions.gnome.org/ Yo personalmente siempre suelo instalar el dock y la extensión para auto-ocultar la barra superior.

Y así es mas o menos como me ha quedado todo (pulsar para agrandar)

Captura de pantalla de 2017-09-15 17-56-02

systemRealmente tengo una gráfica Nvidea GEFORCE 840M no se porque no la detecta

P.D Logicamente tenía otros paquetes de software mas pequeños o que no vienen al caso y que no he explicado aquí. Así mismo en un futuro, cuando toque otros proyectos seguramente me toque volver a instalar ciertas cosas que tenía antes. Por ejemplo, CAL3D es poisble que no compile por no tener las librerias de OpenGL, etc..