Seguridad Wireless - Wifi

Equipos y materiales => Puntos de acceso, routers, switchs y bridges => Openwrt & LEDE => Mensaje iniciado por: seny en 03-01-2015, 16:30 (Sábado)

Título: Base práctica de desarrollo
Publicado por: seny en 03-01-2015, 16:30 (Sábado)
Hola, creo que en este foro pueden haber bastantes de nosotros con ideas para aplicar y ciertos conocimientos de programación en C, pero es complicado encontrar la forma de desarrollarlos dentro de OpenWrt.

Propongo crear una base práctica de desarrollo de aplicaciones para OpenWrt Barrier Breaker, algo muy simple como incluir un "Hello World" creado en "C" dentro de una nueva pestaña de Luci llamada por ejemplo "Aprendizaje".

Yo de momento no sabría hacerlo, hago esta propuesta para comprobar que aceptación podría tener algo así y si habría alguien dispuesto a realizarlo.

Simplemente clickarias en la nueva pestaña y mostraria el mensaje "Hello World" en una nueva pantalla en blanco.  ;D

Dispondriamos dentro de la carpeta que usamos actualmente para compilar firmwares para nuestro router, de una nueva carpeta donde encontrariamos lo mínimo para que ese HelloWorld.c funcione y podamos desarrollar lo que queramos, compilandose dentro de nuestro firmware.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 03-01-2015, 17:55 (Sábado)
No sé si te refieres a que helloworld.c se compile y ejecute cuando pulsas la pestaña de luci o a que cuando compilemos, ese programa se incluya en nuestro firmware y se ejecute al pulsar la pestaña.

Para lo primero:
No existe ningún toolchain para desarrollar openwrt dentro de openwrt. La mayor parte de las herramientas de compilación simplemente no están adaptadas para funcionar en openwrt. Es por eso por lo que hemos de compilar en un PC para producir código ejecutable en mips.
He intentado de muchas formas buscar un toolchain adecuado para poder desarrollar en openwrt en C, pero al final lo tuve que dejar porque no he encontrado nada medianamente decente sobre lo que poder empezar.
Alguna gente ha conseguido, en una máquina virtual mips bajo QEMU, con debian mips, compilar programas como MLDonkey, pero hacerlo desde el propio openwrt es por ahora una odisea (si es que se puede hacer).
Si alguien tiene alguna idea o alguna aportación, desde luego que estaría más que agradecido de que la compartiera por aquí.

Para lo segundo, ya hay documentación de cómo hacer pequeñas aplicaciones que generen paquetes instalables: https://forum.openwrt.org/viewtopic.php?id=44846
Título: Re: Base práctica de desarrollo
Publicado por: seny en 03-01-2015, 18:47 (Sábado)
Ya conocia las limitaciones que hay para compilar desde el router y mi propuesta era crear una aplicación práctica de lo que comentan en ese link, añadiendo que funcione desde Luci y ya incluida en Barrier Breaker.

Añadir la carpeta con el helloword.c y todo lo necesario para crear la pestaña "Aprendizaje" en el Luci, incluida en el source que bajamos, poderlo modificar y que forma parte de las opciones del menuconfig que lo incluya o no en la compilación que hagamos desde el PC.

Quizás si para empezar se incluyese eso en el siguiente branch sobre la versión oficial que se realize, es una idea que lanzo a ver que tal y creo que con eso algunos podriamos empezar a investigar.
saludos
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 03-01-2015, 21:42 (Sábado)
Ya conocia las limitaciones que hay para compilar desde el router y mi propuesta era crear una aplicación práctica de lo que comentan en ese link, añadiendo que funcione desde Luci y ya incluida en Barrier Breaker.

Añadir la carpeta con el helloword.c y todo lo necesario para crear la pestaña "Aprendizaje" en el Luci, incluida en el source que bajamos, poderlo modificar y que forma parte de las opciones del menuconfig que lo incluya o no en la compilación que hagamos desde el PC.

Quizás si para empezar se incluyese eso en el siguiente branch sobre la versión oficial que se realize, es una idea que lanzo a ver que tal y creo que con eso algunos podriamos empezar a investigar.
saludos

Yo crearía un paquete para tenerlo disponible cuando quisiera de la forma antes mencionada, ya que no creo que vayamos a flashear el router entero cada vez que queramos compilar el paquete. Si lo compilamos como paquete lo podemos instalar y desinstalar las veces que queramos sin perder espacio en la flash (cosa que sí sucederá si lo metemos en la imagen y después volvemos a cargar el paquete).
Para ejecutarlo no hay más que instalar el luci-app-commands y darle a ejecutar desde ahí. Vamos, que la parte de luci ya está hecha...  ^-^
Título: Re: Base práctica de desarrollo
Publicado por: seny en 05-01-2015, 14:07 (Lunes)
Menudo lio  :D y es dificil de exponer, lo mejor seria que alguien más lo probase..

Da error al compilar y solo he encontrado una forma que lo intenta ya que siguiendo los pasos del link anterior, situando helloworld dentro de openwrt/feeds/packages/utils el feeds install no lo instala, explico como lo hago desde la carpeta inicial vacia:

git clone git://github.com/openwrt-es/openwrt.git -b bb-14.07-rc3
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
make prereq

coloco la carpeta helloworld dentro de openwrt/package/utils, solo contiene este Makefile:
Código: [Seleccionar]
include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_VERSION:=1.0.0
PKG_RELEASE:=1

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)   
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=$(PKG_NAME)
    MAINTAINER:=Mazilo <myEmail.add>
endef

define Package/$(PKG_NAME)/description
    This is a hello world package that contains a program to only print "hello world".
endef

CONFIGURE_VARS+= \
    CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)"

define Package/$(PKG_NAME)/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(CP) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin
endef

$(eval $(call BuildPackage,$(PKG_NAME)))
creo el helloworld-1.0.0.tar.xz con este Makefile y helloworld.c
Makefile:
Código: [Seleccionar]
helloworld: helloworld.o
        $(CC) $(LDFLAGS) helloworld.o -o helloworld

helloworld.o: helloworld.c
        $(CC) $(CFLAGS) -c helloworld.c

clean:
        rm *.o helloworld
helloworld.c
Código: [Seleccionar]
#include <stdio.h>
int main(void)
{
        printf("Hello World\n");
        return 0;
}
Lo sutuo dentro de la carpeta que he definido como download folder en advanced configuration del menuconfig.

ejecuto: ./scripts/feeds install helloworld

entro en make menuconfig y aparece helloworld en utilidades, lo selecciono y salgo guardando.

ejecuto: make package/utils/helloworld/compile V=s

Citar
manel-5m@manel5m-Inspiron-500m:~/wrtar/openwrt$ make package/utils/helloworld/compile V=s
make[1]: Entering directory `/home/manel-5m/wrtar/openwrt'
make[2]: Entering directory `/home/manel-5m/wrtar/openwrt/package/libs/toolchain'
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libc" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libgcc" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
WARNING: skipping libssp -- package not selected
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libstdcpp" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libpthread" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libthread-db" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "librt" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
WARNING: skipping libgfortran -- package not selected
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "ldd" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "ldconfig" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
make[2]: Leaving directory `/home/manel-5m/wrtar/openwrt/package/libs/toolchain'
make[2]: Entering directory `/home/manel-5m/wrtar/openwrt/package/utils/helloworld'
Makefile:31: *** missing separator.  Stop.
make[2]: Leaving directory `/home/manel-5m/wrtar/openwrt/package/utils/helloworld'
make[1]: *** [package/utils/helloworld/compile] Error 2
make[1]: Leaving directory `/home/manel-5m/wrtar/openwrt'
make: *** [package/utils/helloworld/compile] Error 2
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 06-01-2015, 17:36 (Martes)
El makefile del ejemplo no sé para qué versión de openwrt era. Supongo que habrá que adaptar algo.
De todas formas el error está muy localizado. Es la última línea de makefile. ¿Por qué no miras otro archivo makefile y ves si la llamada eval ha cambiado de forma y lo adaptas?
Título: Re: Base práctica de desarrollo
Publicado por: seny en 07-01-2015, 00:37 (Miércoles)
Pues si, me ha sido mucho más facil a partir de un existente, concretamente he usado la base de uno sencillo, el usbreset y he podido crear un helloworld que se compila, agradecido por los apuntes.
saludos
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 11-01-2015, 12:23 (Domingo)
Propongo crear una base práctica de desarrollo de aplicaciones para OpenWrt Barrier Breaker, algo muy simple como incluir un "Hello World" creado en "C" dentro de una nueva pestaña de Luci llamada por ejemplo "Aprendizaje"...

Hasta ayer, yo tampoco había nunca compilado nada en C para OpenWrt, pero gracias a este documento http://www.componentality.com/res/Step-By-Step-Instruction-To-Run-Apps-On-FlexRoad-HW.en.pdf pude por fin compilar un "Hello World". El documento tiene cinco páginas, está en inglés y tiene un error fácilmente subsanable que chafa la compilación. Todo el proceso se lleva a cabo en cuatro fases. Las tres primeras tienen lugar en el PC, que es donde propiamente se compila. La última fase consiste en la instalación del módulo ejecutable en el router, que es donde va a correr el programa. Compilar en una máquina (PC) para otra de distinta arquitectura (router) recibe el nombre de compilación cruzada. Veamos los detalles.
(Las notas en violeta no figuran en el documento original)


PRIMERA FASE: Instalación de programas en el PC Ubuntu

1.1 Instalación del software de control de versiones (llamado SVN o sub-versión).

En una terminal teclear
Código: [Seleccionar]
sudo apt-get update
sudo apt-get install subversion build-essential

1.2 Crear el subdirectorio openwrt dentro de la carpeta home y abrirlo.
Código: [Seleccionar]
mkdir ~/openwrt
cd ~/openwrt

1.3 Descargar OpenWRT Barrier Breaker.
Código: [Seleccionar]
svn co svn://svn.openwrt.org/openwrt/branches/barrier_breaker
1.4 La descarga de Barrier Breaker crea una nueva carpeta. La abrimos.
Código: [Seleccionar]
cd barrier_breaker
1.5 Descargar e instalar todos los feeds disponibles.
Código: [Seleccionar]
./scripts/feeds update -a
./scripts/feeds install -a

1.6 Obtener una lista de los paquetes que faltan.
Código: [Seleccionar]
make menuconfig
1.7 Si todo va bien, aparecerá un menú de configuración que perfilamos para nuestro router.
Nota. (Ejemplo para el hg556a).
Citar
Target System (Broadcom BCM63xx)  --->
Subtarget (generic)  --->
Target Profile (Huawei HG556a)  --->

1.8 Guardar la configuración y salir.

1.9 Generar el entorno de compilación. Desde una terminal, nos posicionamos en el direcorio barrier_breaker.
Código: [Seleccionar]
makeEste proceso es lento. En los PC más antiguos puede tardar varias horas.
NOTA. Aprovecha la potencia de tu PC para acelerar el proceso. Utiliza el parámetro -j seguido del número de procesadores + 1. Ejemplo para una máquina de 4 núcleos:
Citar
make -j 5


SEGUNDA FASE: Ensamblado.

2.1 Crear una subcarpeta en para el código fuente dentro de la carpeta openwrt y abrirla.
Código: [Seleccionar]
mkdir ~/openwrt/hello
cd ~/openwrt/hello

2.2 Crear los ficheros hello.c y Makefile (la M en mayúscula).
Nota. Este Makefile es para generar un ejecutable para la máquina en la que se compila (el PC).
Código: [Seleccionar]
touch hello.c
touch Makefile

Editar el fichero hello.c con el código fuente del programa.
Citar
#include <stdio.h>
void main()
{
printf("Hello, World!\n");
}
NOTA. El código fuente del documento original da un Warning al compilar. No es grave, pero puedes evitarlo utilizando este otro que, además, es más castizo.
Citar
#include <stdio.h>
int main()
{
printf("Ola k ase\n");
return 0;
}

Editar el fichero Makefile (la M en mayúscula) con las instrucciones de compilación.
Código: [Seleccionar]
.SUFFIXES: .tar.gz .c

override CFLAGS += -Wall -O0 -g
hello:hello.c

all: hello hello.tar.gz

%.tar.gz: DIR=$(subst .tar.gz,,$@)
%.tar.gz: %.c
@mkdir -p ./$(DIR)-0.1
@cp $^ Makefile ./$(DIR)-0.1
tar -cz -f $@ ./$(DIR)-0.1

2.3 Compilar el programa y probar que funciona en el PC. Más adelante compilaremos para el router.
Seguimos en la carpeta  ~/openwrt/hello. Compilamos y lanzamos.
Código: [Seleccionar]
make all
./hello
NOTA. Esta compilación no tarda nada en realizarse, pero también es posible acelerarla. Para una máquina con cuatro núcleos usa el parámetro -j 5.
Citar
make -j 5 all
NOTA. Al ejecutar el programa en el PC (./hello) se visualiza el texto "Hello, World!" Esto indica que el programa compila y se ejecuta bien en el entorno PC. Ahora toca compilar para el router.

2.4 Crear la carpeta "hello" en ~/openwrt/barrier_breaker/feeds/packages/utils y abrirla.
Código: [Seleccionar]
mkdir ~/openwrt/barrier_breaker/feeds/packages/utils/hello
cd ~/openwrt/barrier_breaker/feeds/packages/utils/hello

2.5 Crear un fichero Makefile.
NOTA. La M en mayúscula. En el documento original en inglés está en minúscula y da errores al compilar.
Nota. Este Makefile es distinto al del punto 2.2. Contiene las instrucciones para que el compilador genere un ejecutable específico para la máquina objetivo (el router).
Código: [Seleccionar]
touch Makefile
Edita el fichero Makefile con las instrucciones para la compilación cruzada.
Código: [Seleccionar]
include $(TOPDIR)/rules.mk

PKG_NAME:=hello
PKG_VERSION:=0
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(PKG_NAME)-$(PKG_VERSION).$(PKG_RELEASE)
PKG_SOURCE:=hello.tar.gz
PKG_SOURCE_URL:=file:///home/usuario/openwrt/hello/

include $(INCLUDE_DIR)/package.mk

define Package/hello
SECTION:=utils
CATEGORY:=Utilities
TITLE:=HW
endef

define Package/hello/description
Hello World
endef

define Package/hello/Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) hello
endef

define Package/hello/install
$(INSTALL_DIR) $(1)/bin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/bin/hello
endef

$(eval $(call BuildPackage,hello))
¡ATENCIÓN! En la línea PKG_SOURCE_URL:=file:///home/usuario/openwrt/hello/ asegurarse de cambiar el nombre del usuario por el que realmente tenemos en Linux.
NOTA. No hace falta explicitar el nombre del usuario si se cambia la línea original por esta otra.
Citar
PKG_SOURCE_URL:=file:///~/openwrt/hello/


TERCERA FASE. COMPILACIÓN.

3.1 Abrir la carpeta ~/openwrt/barrier_breaker, actualizar e instalar feeds.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello

3.2 Abrir el menú de configuración.
Código: [Seleccionar]
make menuconfig
3.2 Buscar el paquete "hello" y marcarlo con una [M].
Citar
Utilities ----> hello
(pulsar la barra de espacios para marcarlo con una M)

3.3 Salir y guardar los cambios.
(Exit, Exit y Yes)

3.4 ¡Compilar para nuestro router OpenWRT!
Código: [Seleccionar]
make package/hello/compileNOTA. Esta compilación es rápida, pero también se puede acelerar. Para una máquina con cuatro núcleos usa el parámetro -j 5.
Citar
make -j 5 package/hello/compile

Si la compilación termina con éxito, se habrá creado un paquete hello_0-1_brcm63xx.ipk con el ejecutable en la carpeta ~/openwrt/barrier breaker/bin/nuestro_router/packages/packages


CUARTA FASE. Traslado del paquete al router, instalación y prueba.

4.1 Copiar el fichero hello_0-1_brcm63xx.ipk en la carpeta /tmp del router.
NOTA. Desde Windows es cómodo copiarlo con WinSCP. Desde Linux se puede utilizar SCP.

4.2 Abrir una sesión ssh en el router e instalar el paquete.
Código: [Seleccionar]
cd /tmp
opkg install hello_0-1_brcm63xx.ipk
NOTA. En Windows es cómodo instalar desde PuTTY. Desde Linux se puede instalar abriendo una sesión ssh.
Citar
ssh root@192.168.1.1

4.3 Desde PuTTY o ssh, ejecutar el programa.
Código: [Seleccionar]
hello
Si todo está bien, aparecerá el mensaje "Hello, World!" ("Ola k ase" en la versión corregida y aumentada).

(http://i.imgur.com/e9v6cQA.png)

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: seny en 11-01-2015, 18:35 (Domingo)
Gracias raphik, ha quedado mucho más claro el procedimiento.
saludos
Título: Re: Base práctica de desarrollo
Publicado por: jar229 en 12-01-2015, 09:07 (Lunes)
Añadido al [Índice] Hilos relevantes de OpenWrt (https://foro.seguridadwireless.net/openwrt/(indice)-hilos-relevantes-de-openwrt/)
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 12-01-2015, 15:05 (Lunes)
Le he hecho algunas correcciones a la guía porque daba errores en una máquina x64 con Ubuntu 14.04 LTS.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 13-01-2015, 12:23 (Martes)
No lo entiendo, ayer iba todo bien y hoy no. He hecho cambios en el fichero hello.c.

Lo compilo para el PC y lo lanzo para asegurarme de que funciona.
Código: [Seleccionar]
usuario@PC:~/openwrt/hello$ make all
usuario@PC:~/openwrt/hello ./hello

Cambio de carpeta, actualizo los feeds, selecciono el paquete y lo vuelvo a compilar para el router.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
make menuconfig
make package/hello/compile

Traslado el fichero hello_0-1_brcm63xx.ipk a la carpeta /tmp del router, lo instalo y lo ejecuto.
Código: [Seleccionar]
opkg install hello_0-1_brcm63xx.ipk
hello

Y el resultado que me aparece en pantalla es el del primer Hello World que compilé, que no tiene nada que ver con el nuevo código.... Es como si hubiese compilado otra vez el fichero fuente de ayer, lo cual es imposible porque no existe.

¿Alguna pista de lo que está pasando?

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 13-01-2015, 13:49 (Martes)
No lo entiendo, ayer iba todo bien y hoy no. He hecho cambios en el fichero hello.c.

Lo compilo para el PC y lo lanzo para asegurarme de que funciona.
Código: [Seleccionar]
usuario@PC:~/openwrt/hello$ [b]make all[/b]
usuario@PC:~/openwrt/hello [b]./hello[/b]

Cambio de carpeta, actualizo los feeds, selecciono el paquete y lo vuelvo a compilar para el router.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
make menuconfig
make package/hello/compile

Traslado el fichero hello_0-1_brcm63xx.ipk a la carpeta /tmp del router, lo instalo y lo ejecuto.
Código: [Seleccionar]
opkg install hello_0-1_brcm63xx.ipk
hello

Y el resultado que me aparece en pantalla es el del primer Hello World que compilé, que no tiene nada que ver con el nuevo código.... Es como si hubiese compilado otra vez el fichero fuente de ayer, lo cual es imposible porque no existe.

¿Alguna pista de lo que está pasando?

Saludos.


Puede ser una tontería, pero ¿has comprobado que en el router no haya más de un "hello" ejecutable? Puede que el que estés ejecutando sea el anterior porque el router lo encuentre antes en el path de ejecución. Pon el path absoluto para ejecutarlo /usr/bin/hello (o donde quiera que lo hayas metido)
Comprueba también que el paquete ipk contiene la versión última que acabas de compilar (se puede abrir con WinRAR).
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 14-01-2015, 14:54 (Miércoles)
Puede ser una tontería, pero ¿has comprobado que en el router no haya más de un "hello" ejecutable? Puede que el que estés ejecutando sea el anterior porque el router lo encuentre antes en el path de ejecución. Pon el path absoluto para ejecutarlo /usr/bin/hello (o donde quiera que lo hayas metido)
Comprueba también que el paquete ipk contiene la versión última que acabas de compilar (se puede abrir con WinRAR).

Sí, lo ha comprobado. Desinstalo "hello" desde LuCI (System - Software - Pestaña Installed Packages) y borro el paquete hello_0-1_brcm63xx.ipk de la carpeta /tmp. Compruebo que no se ejecuta desde la línea de comados. Incluso lo busco con find. Segurísimo de que no está.
Código: [Seleccionar]
find / -name "hello*"
Borro el paquete ipk del router, hago cambios en hello.c, lo compilo, subo el paquete al router, lo instalo y ¡ZAS! aparece la primera versión de "hello".

Ya reportaré algo si averiguo qué está pasando.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 14-01-2015, 17:24 (Miércoles)
Puede ser una tontería, pero ¿has comprobado que en el router no haya más de un "hello" ejecutable? Puede que el que estés ejecutando sea el anterior porque el router lo encuentre antes en el path de ejecución. Pon el path absoluto para ejecutarlo /usr/bin/hello (o donde quiera que lo hayas metido)
Comprueba también que el paquete ipk contiene la versión última que acabas de compilar (se puede abrir con WinRAR).

Sí, lo ha comprobado. Desinstalo "hello" desde LuCI (System - Software - Pestaña Installed Packages) y borro el paquete hello_0-1_brcm63xx.ipk de la carpeta /tmp. Compruebo que no se ejecuta desde la línea de comados. Incluso lo busco con find. Segurísimo de que no está.
Código: [Seleccionar]
find / -name "hello*"
Borro el paquete ipk del router, hago cambios en hello.c, lo compilo, subo el paquete al router, lo instalo y ¡ZAS! aparece la primera versión de "hello".

Ya reportaré algo si averiguo qué está pasando.

Saludos.

Comprueba también el paquete ipk que se genera, a ver si contiene la versión nueva o la vieja.
Intenta borrar el directorio de compilación de hello antes de compilar, por si están quedando residuos de una compilación a otra. Creo que está en build_dir.
Intenta también "make package/hello/clean"
Título: Re: Base práctica de desarrollo
Publicado por: seny en 16-01-2015, 18:41 (Viernes)
No lo entiendo, ayer iba todo bien y hoy no. He hecho cambios en el fichero hello.c.

Lo compilo para el PC y lo lanzo para asegurarme de que funciona.
Código: [Seleccionar]
usuario@PC:~/openwrt/hello$ make all
usuario@PC:~/openwrt/hello ./hello

Cambio de carpeta, actualizo los feeds, selecciono el paquete y lo vuelvo a compilar para el router.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
make menuconfig
make package/hello/compile

Traslado el fichero hello_0-1_brcm63xx.ipk a la carpeta /tmp del router, lo instalo y lo ejecuto.
Código: [Seleccionar]
opkg install hello_0-1_brcm63xx.ipk
hello

Y el resultado que me aparece en pantalla es el del primer Hello World que compilé, que no tiene nada que ver con el nuevo código.... Es como si hubiese compilado otra vez el fichero fuente de ayer, lo cual es imposible porque no existe.

¿Alguna pista de lo que está pasando?

Saludos.

Compila con V=s para ver si te da error al compilar, porque a mi en la carpeta feeds no me compila nada.
Una cosa me ha quedado clara con mis pruebas es que compilar source que ya exista o añado nuevo en feeds/packages/ da error.
Lo que compilo sea existente o nuevo en la carpeta package/ no da problema.
saludos
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 30-01-2015, 14:13 (Viernes)
Hola, creo que en este foro pueden haber bastantes de nosotros con ideas para aplicar y ciertos conocimientos de programación en C, pero es complicado encontrar la forma de desarrollarlos dentro de OpenWrt.

Está claro que el C es mucho más potente que cualquier script, pero hay situaciones en las que un simple script puede bastar.

Un script tipo "Hello World!" sería algo así:
Fichero /root/hello.sh
Código: [Seleccionar]
#!/bin/sh
echo "Hello, World!"
exit

La línea #!/bin/sh es imprescindible para que hello.sh funcione como un comando. También es necesario asignarle permiso de ejecución:
Código: [Seleccionar]
chmod +x /root/hello.sh
Para ejecutarlo:
Citar
/root/./hello.sh

Es posible pasarle parámetros al script. Unas variables especiales recogen el valor de los parámetros. $1 almacena el primer parámetro, $2 el segundo... y así sucesivamente. $0 guarda el nombre del propio script.
Código: [Seleccionar]
#!/bin/sh
case $1 in
ES) echo "¡Hola, Mundo!" ;;
FR) echo "Bonjour le Monde !" ;;
DE) echo "Hallo Welt!" ;;
PT) echo "Olá Mundo!" ;;
IT) echo "Ciao Mondo!" ;;
*) echo "Hello, World!" ;;
esac
exit

Al invocarlo desde la línea de comandos producirá una salida distinta según el parámetro que se le pase:
Citar
/root/./hello.sh ES => ¡Hola, Mundo!
/root/./hello.sh PT => Bonjour le Monde
/root/./hello.sh DE => Hallo Welt!
...

También es posible hacer que el script devuelva un valor numérico entre 0 a 255 utilizando la sentencia exit n ( 0 ≤ n ≤ 255 ).

Por lo general un comado devuelve 0 si acaba con éxito y cualquier otro valor en caso contrario.

Linux almacena el valor devuelto en una variable especial llamada $? Veamos un ejemplo. El comando ls <fichero> devuelve 0 si <fichero> existe. Si no existe, devuelve 1.
Código: [Seleccionar]
ls seguroqueesteficheronoexiste
echo $?
echo $?

Aunque parece obvio, es preciso tener en cuenta que $? contendrá el valor retornado por el último comando invocado. En el ejemplo, si el fichero no existe, el primer echo $? devolverá 1 y el segundo un 0, ya que el comando anterior (echo, que no ls) terminó con éxito.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 02-02-2015, 11:22 (Lunes)
Para ilustrar lo que se puede hacer con un script, cuelgo uno que resuelve sudokus. Cualquier sudoku.

Para instalaro:
Código: [Seleccionar]
wget -qO - http://galeon.com/raphik/sudoku.tar | tar -xvf - -C /
Para resolver un sudoku como éste:
    ----- ----- -----
   | 6 3 |  1  | 7 4 |
   |  2  | 6 7 |  3  |
   | 5 4 |  2  |   1 |
    ----- ----- -----
   |  6  | 8   | 2   |
   | 3 1 |  9  |  8  |
   |  9  |   1 |   6 |
    ----- ----- -----
   | 9 6 |  8  | 1 2 |
   |  1  | 7 2 |  9  |
   | 2 7 |  6  |   8 |
    ----- ----- -----

teclear en la línea de comandos:
Código: [Seleccionar]
/root/sudoku.sh 603010704020607030504020001060800200301090080090001006906080102010702090207060008
Tras unos segundos se visualizará:
Citar
Sudoku resuelto en 7 segundos.
 ----- ----- -----
| 683 | 915 | 724 |
| 129 | 647 | 835 |
| 574 | 328 | 961 |
 ----- ----- -----
| 765 | 834 | 219 |
| 341 | 296 | 587 |
| 892 | 571 | 346 |
 ----- ----- -----
| 956 | 483 | 172 |
| 418 | 752 | 693 |
| 237 | 169 | 458 |
 ----- ----- -----

Saludos.
Título: El servidor web de OpenWrt
Publicado por: raphik en 03-02-2015, 10:21 (Martes)
Nuestro router OpenWrt permite alojar páginas web que pueden ser visualizadas desde la red. Los ficheros .html hay que situarlos en la carpeta /www del router.

Un ejemplo sencillo.
/www/hello.html
Código: [Seleccionar]
<html><body>
Hello, World!
</body></html>

Puedes descargar e instalarlo tecleando
Código: [Seleccionar]
wget -qO - http://galeon.com/raphik/hello_web.tar | tar -xvf - -C /
Para visualizarlo, escribe en el navegador de Internet (si fuera necesario, sustituye la IP por la de tu router)
Citar
192.168.1.1/hello.html

O click aquí http://192.168.1.1/hello.html

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: danitool en 07-02-2015, 23:56 (Sábado)
Interesante hilo. Trataré de exponer un método si cabe más sencillo. Como el helloworld aburre pondré algo más picante. Nuestra aplicación se llamará tp0set

La cual consiste únicamente en este código
Citar
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <mtd/mtd-user.h>
#include <string.h>

#define DATA_OFFSET 20      //the offset of the MTD partition where we will write
#define RAWBYTES_LEN 4

int main()
{
    mtd_info_t mtd_info;           // the MTD structure
    erase_info_t ei;               // the erase block structure
    int i;
    unsigned int rawBytes; //the bytes we want to write
    
    rawBytes = 0x00000000;

    unsigned char read_buf[0x20000] = {0x00};    // empty array for reading

    int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and
                                        // writing. Note you want mtd0 not mtdblock0
                                        // also you probably need to open permissions
                                        // to the dev (sudo chmod 777 /dev/mtd0)

    ioctl(fd, MEMGETINFO, &mtd_info);   // get the device info

    // dump it for a sanity check, should match what's in /proc/mtd
    printf("MTD Type: %x\nMTD total size: %x bytes\nMTD erase size: %x bytes\n",
         mtd_info.type, mtd_info.size, mtd_info.erasesize);

    lseek(fd, 0, SEEK_SET);               // go to the first block
    read(fd, read_buf, sizeof(read_buf)); // read and store CFE in read_buf
    memcpy(read_buf + DATA_OFFSET, (unsigned char*)&rawBytes, RAWBYTES_LEN); //write some bytes to CFE
    
    ei.length = mtd_info.erasesize;   //set the erase block size
    for(ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length)
    {
        ioctl(fd, MEMUNLOCK, &ei);
         printf("Eraseing Block %#x\n", ei.start); // show the blocks erasing
                                                  // warning, this might print a lot!
        ioctl(fd, MEMERASE, &ei);
    }

    lseek(fd, 0, SEEK_SET);        // go back to first block's start
    write(fd, read_buf,  sizeof(read_buf)); // write our modified CFE

    close(fd);

    printf("Done!!\n");
    
    return 0;
}

código que estará alojado en un fichero que nombraremos como main.c

y su archivo Makefile (el encargado de compilarlo)
Citar
PROGS     = tp0set

INSTDIR   = $(prefix)/usr/bin
INSTMODE  = 0755
INSTOWNER = root
INSTGROUP = root

OBJS = main.o

all: $(PROGS)
$(PROGS): $(OBJS)
   $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
   $(STRIP) $@

%.o: %.c
   $(CC) -c $(CFLAGS) $^ -o $@

install: $(PROGS)
   $(INSTALL) -d $(INSTDIR)
   $(INSTALL) -m $(INSTMODE) -o $(INSTOWNER) -g $(INSTGROUP) $(PROGS) $(INSTDIR)

clean:
   rm -f $(PROGS) *.o core

Creamos un directorio, donde sea, llamado src y metemos ahí esos dos ficheros.

Creamos otro directorio llamado tp0set, y allí metemos el directorio src creado anteriormente. Ahora en el directorio tp0set creamos otro Makefile (el encargado de crear el paquete)

Citar
#
# Copyright (C) 2015 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=tp0set
PKG_RELEASE:=1
PKG_VERSION:=1.0

include $(INCLUDE_DIR)/package.mk

define Package/tp0set
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE:=Tool for switching main core
endef

define Package/tp0set/description
   Tool for switching main core, it writes some bytes to CFE
endef

define Build/Prepare
   mkdir -p $(PKG_BUILD_DIR)
   $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Build/Compile
   $(MAKE) -C $(PKG_BUILD_DIR) \
      $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
endef

define Package/tp0set/install
   $(INSTALL_DIR) $(1)/usr/bin
   $(INSTALL_BIN) $(PKG_BUILD_DIR)/tp0set $(1)/usr/bin/
endef

$(eval $(call BuildPackage,tp0set))

este es el makefile que crea el paquete.

Copiamos el directorio tp0set al directorio packages/ de openwrt, quedando algo tal que así:
(http://s16.postimg.org/nsytusfwl/captura5.png)


hacemos make menuconfig y seleccionamos el paquete tp0set. Salimos guardamos
y compilamos el paquete

Código: [Seleccionar]
make package/tp0set/compile V=s
Como se ve los pasos son sencillos, lo complicado viene si queremos crear paquetes más complejos.

Por otra parte para verificar que la cosa compila correctamente en nuestro pc, antes de meternos a crear makefiles, puede bastarnos en este caso el comando:
Código: [Seleccionar]
gcc -o tp0set main.c
PD: Ni se os ocurra ejecutar este programa en vuestro router  >:D.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 09-02-2015, 11:59 (Lunes)
Aburre doblemente. Por lo soso y porque no hay forma de compilarlo.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: seny en 09-02-2015, 13:27 (Lunes)
Os sigo atentamente, creo que el mundo ya se puede dar por enterado que lo saludamos desde openwrt   ;)
Y si ademas de saludarlo le podemos hacer cosquillas para que se ria como en esto último de danitool, jeje mejor que mejor
saludos
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 28-05-2016, 15:26 (Sábado)
Propongo crear una base práctica de desarrollo de aplicaciones para OpenWrt Barrier Breaker, algo muy simple como incluir un "Hello World" creado en "C" dentro de una nueva pestaña de Luci llamada por ejemplo "Aprendizaje".
Simplemente clickarias en la nueva pestaña y mostraria el mensaje "Hello World" en una nueva pantalla en blanco.  ;D

Este tema cayó en el olvido. Igual ya no interesa. Aún así, expondré algunos avances.

1) Crear una carpeta donde colocar los archivos de nuestras aplicaciones.
Código: [Seleccionar]
mkdir /usr/lib/lua/luci/controller/myapp
2) Agregar opciones al munú de LuCI desde las que lanzar nuestras aplicaciones. Editar /usr/lib/lua/luci/controller/myapp/new_tab.lua y dejarlo tal que así:
Código: [Seleccionar]
module("luci.controller.myapp.new_tab", package.seeall)  --notice that new_tab is the name of the file new_tab.lua
 function index()
     entry({"admin", "new_tab"}, firstchild(), "Aprendizaje", 30).dependent=false  -- Opción principal
     entry({"admin", "new_tab", "tab_from_cbi"}, cbi("myapp-mymodule/cbi_tab"), "Hello, World!", 1)  -- sub-opción 1
     entry({"admin", "new_tab", "tab_from_view"}, template("myapp-mymodule/view_tab"), "¡Hola, Mundo!", 2)  -- sub-opción 2
 end

Rearrancamos el router para poder ver las flamantes nuevas opciones.
(http://i.imgur.com/58XfdQU.jpg)

Por ahora, las opciones están vacías de contenido. Hay dos maneras de agregar contenido: CBI y VIEW-TAB.

3) Agregar código CBI. Son necesarios dos archivos: uno para el código y otro para los datos. Para el primero, hay que crear la carpetar /usr/lib/lua/luci/model/cbi/myapp-mymodule/ y editar un archivo nuevo nombrado /usr/lib/lua/luci/model/cbi/myapp-mymodule/cbi_tab.lua
Código: [Seleccionar]
m = Map("cbi_file", "Hello, World!", "(Más vale tarde que nunca)")
d = m:section(TypedSection, "info", "Un formulario sencillo:")
a = d:option(Value, "name", "Campo 1"); a.optional=false; a.rmempty = false;
return m

Ahora, el archivo de datos /etc/config/cbi_file.
Código: [Seleccionar]
config 'info' 'A'
option 'name' 'OpenWRT'

(http://i.imgur.com/XBHBsFr.jpg)

4) Agregar código view-tab. Sólo se necesita un archivo en la carpeta /usr/lib/lua/luci/view/myapp-mymodule, nombrado /usr/lib/lua/luci/view/myapp-mymodule/view_tab.htm
Citar
<%+header%>                                              
<h2><a id="content" name="content">..Hola, Mundo![/url]</h2>  
<div class="cbi-map-descr">(M..s vale tarde que nunca)</div>
<legend>Listado simple de dos elementos</legend>
<ul><li>&nbsp;Elemento 1<%=eating%></li>    
    <li>&nbsp;Elemento 2<%=eating%></li></ul>
<%+footer%>

(http://i.imgur.com/9KBB8cE.jpg)

NOTAS.-
Por lo que parece, para integrar código CBI en LuCI hay que seguir unas normas muy estrictas.
Contrariamente, el códibo view-tab parece simple html al que se le añade las marcas especiales <%+header%> para agregar la barra horizontal de menú y <%+footer%> para el pie de página.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 28-05-2016, 19:26 (Sábado)
Este tema cayó en el olvido. Igual ya no interesa. [...]

El conocimiento va despacio. No por ello es menos interesante y entretenido adquirirlo.
Da gusto, cuando alguien se esfuerza en explicar las cosas, para el resto de los mortales...
Gracias por el aporte raphik.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 28-05-2016, 19:28 (Sábado)
Habría que hacer más pruebas, pero posiblemente LuCI admita todo lo que se quiera incluir dentro de un iframe.
Código: [Seleccionar]
<%+header%>
<h2><a id="content" name="content">..Hola, Mundo!</a></h2>
 <iframe src="https://openwrt.org/" width="100%" height="500px"></iframe>  
<%+footer%>

(http://i.imgur.com/BdigPgd.png)
Título: Re: Base práctica de desarrollo
Publicado por: Ficht en 28-05-2016, 20:20 (Sábado)
Habría que hacer más pruebas, pero posiblemente LuCI admita todo lo que se quiera incluir dentro de un iframe.
Código: [Seleccionar]
<%+header%>
<h2><a id="content" name="content">..Hola, Mundo!</a></h2>
 <iframe src="https://openwrt.org/" width="100%" height="500px"></iframe>  
<%+footer%>

(http://i.imgur.com/BdigPgd.png)

jejeje que bueno ha quedado esto  >:(
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 28-05-2016, 21:12 (Sábado)
Habría que hacer más pruebas, pero posiblemente LuCI admita todo lo que se quiera incluir dentro de un iframe.
Código: [Seleccionar]
<%+header%>
<h2><a id="content" name="content">..Hola, Mundo!</a></h2>
 <iframe src="https://openwrt.org/" width="100%" height="500px"></iframe>  
<%+footer%>

(http://i.imgur.com/BdigPgd.png)

Llegas tarde...  >:D
Ya había usado esa técnica para integrar phpFileManager con openwrt, o tu script wifi rotator >>> https://foro.seguridadwireless.net/openwrt/wifi-selector-rotator/msg319261/#msg319261 (https://foro.seguridadwireless.net/openwrt/wifi-selector-rotator/msg319261/#msg319261) <<<. ¡¡¡Jejeje!!!
Mira en wselector-luci-0.1-1.zip\usr\lib\lua\luci\view\cbi.

En definitiva, sí se puede hacer. El problema es que si se sabe directamente la URL del iframe, no estará protegido por la contraseña de luci.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 30-05-2016, 00:51 (Lunes)
Llegas tarde...  >:D
Ya había usado esa técnica para integrar phpFileManager con openwrt, o tu script wifi rotator >>> https://foro.seguridadwireless.net/openwrt/wifi-selector-rotator/msg319261/#msg319261 (https://foro.seguridadwireless.net/openwrt/wifi-selector-rotator/msg319261/#msg319261) <<<. ¡¡¡Jejeje!!!
Mira en wselector-luci-0.1-1.zip\usr\lib\lua\luci\view\cbi.

 :-[
Lo cierto es que en aquellas fechas estaba más por mejorar el funcionamiento de "wrotator" que en su integración en LuCI. De todas formas, más que la integración de aplicaciones en LuCI, lo que interesa en este post es averiguar cómo desarrollar aplicaciones para OpenWRT.
En C se hace complicado, más que nada por el tema de la compilación.
Por otra parte, tampoco es interesante hacer scripts (como wrotator) basados en la shell de BusyBox.
Hace poco supe que LuCI trabaja en lenguaje Lua, así que me puse a aprender Lua. Es un lenguaje interpretado, con una sintaxis muy facilita de aprender y, además, permite el uso de tablas. En fin, un chollo si se compara con la shell de BusyBox.

Éste es un ejemplo de script CGI escrito en Lua manejable desde LuCI. Se trata de una simple tabla de multiplicar. Hay que ponerlo en /www/cgi-bin.
Código: [Seleccionar]
#!/usr/bin/lua
-- Ejemplo de script CGI (Common Gateway Interface) programado en Lua.
io.write("Content-type: Text/html\n\n")
-- la variable local info recoge los valores del formulario POST
local info = io.read('*all')
local tabla = string.sub(info,13)

pagetop = [[
<html>
  <head>
    <title>
      Tabla de multiplicar Web desarrollada en Lua.
    </title>
  </head>
  <body>
    ¿Qué tabla quieres imprimir?<br />
    (La impresión es en pantalla)
    <form method="post">
      <select name="multiplicar">
      <option value="0" selected>(Selecciona un valor:)</option>
]]
io.write(pagetop)

for i = 1 , 10 do
  io.write('<option value=\"'..i..'\">'..i..'</option>')
end

pagemiddle = [[
      <input type=submit value="¡Tabla!">
    </form>
    <div>
]]
io.write(pagemiddle)

if #tabla > 0 then
  io.write("<h2>La tabla del "..tabla.."</h2>")
  for i = 1 , 10 do
    local cadena = string.format( "<tt>%2.0f x %2.0f = %3.0f</tt><br>", tabla, i, tabla * i)
    cadena = string.gsub(cadena, " ", "&nbsp;")
    io.write(cadena)
  end
end

pagebottom = [[
    </div>
    <br>
    Ejemplo escrito en lenguaje Lua y algo de HTML
    <br />
    2016 :p raphik
  </body>
</html>
]]

io.write(pagebottom)

Y éste es el aspecto que presenta.
(http://i.imgur.com/X1yoRbW.jpg)

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: danitool en 30-05-2016, 15:22 (Lunes)
Interesante. Gracias por la info, me dan ganas de probar a hacer alguna cosilla.

Siempre quise hacer un "shoutbox"  simple en un router. Para proveer un "portal" wifi abierto que redireccione al shoutbox para enviar comentarios de la gente que se conecte, como un microforo pero sin temas, solo "comments".

Con esto de lua podría hacer algo interesante. Lo del shoutbox por ejemplo lo habían implementado en los firmwares piratebox, pero hecho en python, el cual el firmware en sí requiere de bastante consumo de memoria y recursos, y una implementación difícil de modificar para otros propósitos.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 01-06-2016, 10:08 (Miércoles)
Siempre quise hacer un "shoutbox"... sin temas, solo "comments"... lo habían implementado en... python...

Si te apetece probar ésta...
(http://i.imgur.com/cTECKy7.png)

EDITO:
He subido una una versión más elaborada de la ShoutBox. Hay una pequeña explicación de su funcionamiento un poco más abajo. Para descargar y probar:
Código: [Seleccionar]
wget -qO - http://galeon.com/raphik/shout.tar | tar -xvf - -C /
Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: danitool en 01-06-2016, 15:25 (Miércoles)
Muy bueno raphik

Estuve un buen rato intentando hacerlo funcionar en AA, no me iba, tal vez tuviese algo mal en luci de otras pruebas. En BB a la primera!, muy inmediato y no parece consumir recursos al menos de CPU.

Solo tuve que meter el código en un script situado en /www/cgi-bin/shout, darle permisos de ejecución, entrar la dirección en el navegador

http://192.168.1.1/cgi-bin/shout

Y a funcionar!!!  >:(
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 01-06-2016, 22:26 (Miércoles)
He probado la ShoutBox en un Huawei EchoLife HG556a (version C) con la Chaos Calmer 15.05 Kernel Version 3.18.20. Supongo que debería funcionar en versiones anteriores, ya que Lua está integrado en OpenWRT desde hace mucho tiempo.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 01-06-2016, 22:54 (Miércoles)
Lo del nick y/o mensaje en blanco ya está controlado con la función validateForm(). Lo del refresco de mensajes es algo más complicado... también.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 02-06-2016, 22:11 (Jueves)
La actualización automática de mensajes en todos los clientes complica el código. La descarga / instalación es igual que antes, pero ahora el archivo comprimido contiene tres ficheros:

/www/cgi-bin/shout/shout.lua
/www/cgi-bin/shout/messages.lua
/www/cgi-bin/shout/timer.lua

Para verlo en marcha, desde un navegador de internet: http://192.168.1.1/cgi-bin/shout/shout.lua
Al cargarlo por primera vez, se generan los ficheros:
/root/mensajes.txt
/root/contador.txt

Funcionamiento:
El archivo shout.lua contiene un formulario y dos iframes. En uno de los iframes se carga el archivo messages.lua, encargado de mostrar los mensajes almacenados en el servidor y de actualizar una variable que contiene el ordinal del último mensaje mostrado. El otro iframe no muestra nada por pantalla, es invisible. Sirve para actualizar cada 10 segundos una variable que contiene el ordinal del último mensaje enviado al servidor. Si el último mensaje enviado es mayor que el último mensaje mostrado, se fuerza la recarga de messages.lua.

Saludos.
Título: Envío de variables POST desde la línea de comandos.
Publicado por: raphik en 03-06-2016, 14:26 (Viernes)
Como complemento interesante, añadir que se puede enviar mensajes a la ShoutBox con el comando wget del sistema operativo, sin necesidad de un navegador de Internet.

Desde el intérprete de comandos de un PC remoto:
Código: [Seleccionar]
wget --spider --post-data "nick=nombre de usuario&message=Mensaje para enviar." http://192.168.1.1/cgi-bin/shout/shout.luaEl parámetro spider evita la descarga innecesaria del archivo shout.lua.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: seny en 13-07-2016, 00:33 (Miércoles)
Muy interesante raphik, veo que has conseguido al 100% encontrar la solución al tema que propuse ;)

Lua (Luna en portugués) lo tenemos delante con el Luci y no le hacemos el merecido caso, me está tentando dedicarle tiempo a conocerlo, muy sencillo y liviano..

Saludos
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 15-11-2016, 15:48 (Martes)
Hola. Necesito implementar una funcionalidad en Python para Openwrt por mi trabajo de fin de grado y antes de nada quería hacer un programa  en Python que me devuelva por ejemplo la IP para comprobar que funciona y familiarizarme con Openwrt .

- ¿ Es compatible Python con Openwrt ?
- ¿ Cualquier aplicación que desarrolle habría que compilarla junto con Openwrt y volver a cargarlo en el router?.
- ¿ Conocéis de algo realizado en Python para Openwrt o  algún manual para cómo desarrollar aplicaciones y aplicárselas a Openwrt ?

Muchas gracias por vuestra ayuda
Título: Re: Base práctica de desarrollo
Publicado por: Ficht en 15-11-2016, 19:45 (Martes)
Hola. Necesito implementar una funcionalidad en Python para Openwrt por mi trabajo de fin de grado y antes de nada quería hacer un programa  en Python que me devuelva por ejemplo la IP para comprobar que funciona y familiarizarme con Openwrt .

- ¿ Es compatible Python con Openwrt ?
- ¿ Cualquier aplicación que desarrolle habría que compilarla junto con Openwrt y volver a cargarlo en el router?.
- ¿ Conocéis de algo realizado en Python para Openwrt o  algún manual para cómo desarrollar aplicaciones y aplicárselas a Openwrt ?

Muchas gracias por vuestra ayuda

Si es compatible, está compilado para openwrt... puedes ver algunos de los paquetes que hay en https://downloads.openwrt.org/latest/brcm63xx/generic/packages/packages/
¿no tienes un router con openwrt?
saludos.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 15-11-2016, 20:01 (Martes)
- ¿ Es compatible Python con Openwrt ?
  Sí, lo es.

- ¿ Cualquier aplicación que desarrolle habría que compilarla junto con Openwrt y volver a cargarlo en el router?.
  Las aplicaciones escritas en Python no se compilan: Python es un lenguaje interpretado.

- ¿ Conocéis de algo realizado en Python para Openwrt o  algún manual para cómo desarrollar aplicaciones y aplicárselas a Openwrt ?
 En este mismo foro puedes encontrar la aplicación pelisalacarta, que está escrita en Python. La tienes aquí: https://foro.seguridadwireless.net/openwrt/re-%28desarrollo%29-openwrt-en-comtrend-ar-5387un/
  Hay montones de manuales y cursos de Python en la red. Sólo hay que buscarlos (con Google). Éste, en castellano, podría valerte. El capítulo 1 (Preparación del entorno de desarrollo) no es aplicable en OpenWRT. http://www.iaa.es/python/curso-python-para-principiantes.pdf

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 28-11-2016, 20:39 (Lunes)
- ¿ Es compatible Python con Openwrt ?
  Sí, lo es.

- ¿ Cualquier aplicación que desarrolle habría que compilarla junto con Openwrt y volver a cargarlo en el router?.
  Las aplicaciones escritas en Python no se compilan: Python es un lenguaje interpretado.

- ¿ Conocéis de algo realizado en Python para Openwrt o  algún manual para cómo desarrollar aplicaciones y aplicárselas a Openwrt ?
 En este mismo foro puedes encontrar la aplicación pelisalacarta, que está escrita en Python. La tienes aquí: https://foro.seguridadwireless.net/openwrt/re-%28desarrollo%29-openwrt-en-comtrend-ar-5387un/
  Hay montones de manuales y cursos de Python en la red. Sólo hay que buscarlos (con Google). Éste, en castellano, podría valerte. El capítulo 1 (Preparación del entorno de desarrollo) no es aplicable en OpenWRT. http://www.iaa.es/python/curso-python-para-principiantes.pdf

Saludos.

Muchas gracias raphik. Creo que uno de los principales problemas es no saber cómo trabajar con Openwrt. Es decir, programar una aplicación y poder integrarla . Tampoco encuentro mucho manual de inicializacion en Openwrt.

Saludos
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 29-11-2016, 21:20 (Martes)
.. Creo que uno de los principales problemas es no saber cómo trabajar con Openwrt. Es decir, programar una aplicación y poder integrarla . Tampoco encuentro mucho manual de inicializacion en Openwrt...

Aquí todas y todos hemos pasado por eso.

OpenWrt es Linux. Una versión de Linux capaz de correr sobre determinados routers.
(http://i.imgur.com/Vr53aeN.jpg)

Lo primero que vas a necesitar es hacerte con uno de esos routers. La lista de máquinas compatibles con OpenWrt la tienes aquí: https://wiki.openwrt.org/toh/start
Lo más barato es rebuscar por los cajones de casa, que igual tienes alguno por ahí perdido... O adquirirlo en una tienda de artículos de segunda mano. También podrías comprárselo a alguien del foro que tenga alguno de sobra.

Una vez tengas el router, lo siguiente  es descargar la versión adecuada de OpenWrt e instalarla en la máquina. El procedimiento de instalación varía según qué router. Para mi gusto, los más sencillos de instalar son el HG553, HG556A y el Comtrend AR-5387un. Hay guías de cómo se instala en la página de hilos relevantes (https://foro.seguridadwireless.net/openwrt/(indice)-hilos-relevantes-de-openwrt/).

Luego toca acceder al router desde un PC. El router no tiene pantalla, ni teclado, ni ratón. Hay que manejarlo desde un PC con Linux o Windows (supongo que también se podrá con OS X). Básicamente, se trata de abrir en el PC una sesión remota que permitirá manejar el router.

Después hay que instalar en el router el intérprete de Python.

Ahora viene lo de programar en Python. Si has programado en Python para tu PC, también sabrás hacerlo para tu router OpenWrt. La única diferencia es que el fichero que contiene las instrucciones Python está ubicado en el router y no en el PC.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 03-12-2016, 07:56 (Sábado)
Muchas gracias Raphik. Con tus indicaciones me has despejado muchas dudas.
Respecto al router, tengo el Linksys 1900ACS que soporta openwrt. He encontrado el firm que le tocaría y procederé a instalarlo.

Una vez lo tenga, y como prueba, quiero crear un código básico en python que me diga por ejemplo que IP tengo asignada. Entiendo que en en un sistema operativo de escritorio ejecutaría ese fichero en python, pero en el router, ¿ se ejecutaría sólo?.

La intención de mi proyecto de fin de carrera es la de integrar Latch en openwrt para gestionar remotamente el router. Entonces, no se como podría cualquier programa que cree en python ejecutarlo en el router o si se puede añadir alguna funcionalidad a la interfaz del router, como por ejemplo, una pestaña, botón, etc.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 03-12-2016, 14:04 (Sábado)
... Una vez lo tenga, y como prueba, quiero crear un código básico en python que me diga por ejemplo que IP tengo asignada. Entiendo que en en un sistema operativo de escritorio ejecutaría ese fichero en python, pero en el router, ¿ se ejecutaría sólo? ...

Primero, un poco de teoría.

El usuario se comunica con el ordenador mediante el intérprete de comandos. Éste suele disponer de dos tipos de interfaces de usuario (shell): el de línea de texto (CLI, Command-Line Interface) y el gráfico (GUI, Graphical User Interface), también llamado escritorio.
En un router, capacidad de proceso y memoria son limitadas. OpenWrt no podría mover una interfaz gráfica tipo Gnome o KDE. No obstante, cuenta con una interfaz gráfica Web llamada LuCI (https://wiki.openwrt.org/doc/howto/luci.essentials). Por supuesto, también cuenta con una interfaz de línea Almquist Shell (ASH) proporcionada por BusyBox que implementa los comandos más usuales de UNIX.


Ahora, la práctica.

El script más sencillo es el típico Hola Mundo, que en Python será:

Contenido del fichero holamundo.py
Código: [Seleccionar]
print ("Hola Mundo!")
Para ejecutarlo  desde la línea de comandos:
Código: [Seleccionar]
phython holamundo.py
Si se quiere ejecutar invocándolo directamente, la primera línea del fichero tiene que informar de cómo tratar el resto del contenido:

Contenido del fichero holamundo.py
Código: [Seleccionar]
#! /usr/bin/env python
print ("Hola Mundo!")

Además, habrá que activarle el atributo de "ejecutable":
Código: [Seleccionar]
chmod 777 holamundo.py
Y, finalmente, ejecutarlo:
Código: [Seleccionar]
./holamundo.py
Para ejecutar un comando automáticamente al arrancar el router, se edita el fichero /etc/rc.local y se le añade una línea que invoque dicho comando.

La IP externa se puede averiguar desde la línea de comandos sin necesidad de Python:
Código: [Seleccionar]
wget -q -O- icanhazip.com
Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 04-12-2016, 11:56 (Domingo)
Muchas gracias Raphik por tu ayuda. Me has allanado mucho el camino. Voy a intentarlo.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 06-12-2016, 22:09 (Martes)
Disculpa Raphik te vuelva a molestar. Me he quedado atascado con la instalación.  Te comento los pasos que he realizado:

1.- Conecté el router (linksys 1900ACS) mediante el cable ethernet al puerto ethernet del macbook
2.- Accedí al router a través del navegador e instale la imagen de openwrt que correspondía.
3.- A través de consola en OS X he accedido al router mediante ssh y me aparece el menú de inicio de openwrt igual que el de la imagen que pusiste.

4.- Ahora debería instalar Luci, sin embargo, no tengo conexión a internet. Al estar el router conectado al puerto ethernet del macbook, el portátil queda lógicamente sin poder acceder a la web. Entiendo que debería configurar una ip para el router dentro del rango que corresponda para así desconectar el router del puerto ethernet del portátil y que tenga conexión vía wifi. 

No obstante, no se si se instaló correctamente openwrt pues no consigo mediante consola introduciendo comandos  que me diga por ejemplo la versión de Linux instalada.

También me gustaría saber como es posible volver al firm original de linksys para que quede todo como de fábrica por si tuviera algún problema.

Gracias por tu ayuda.
Título: Re: Base práctica de desarrollo
Publicado por: seny en 06-12-2016, 23:32 (Martes)
Hola, al igual que te recomendé este hilo para el tema programación, estas últimas dudas que planteas se escapan del objetivo de este hilo, deberias solucionarlas leyendo los manuales que hay en los hilos enchinchetados como por ejemplo "[FAQ] Preguntas más comunes sobre OpenWrt" o "[Índice] Hilos relevantes de OpenWrt".

También te recomiendo usar un router mas sencillo para empezar.. sobre dejarlo como de fábrica, seguro que en la web del fabricante encontrarás su último firmware.

Saludos
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 07-12-2016, 12:25 (Miércoles)
Hola Seny. En primer lugar, siento si he realizado preguntas ya tratadas pero créeme que he leído los hilos de preguntas frecuentes pero no encuentro lo que realmente estoy buscando.

Respecto al router,  no puedo devolverlo. Por lo menos debería restaurar a estado de compra. El firm del fabricante lo tengo pero no sé cómo ponerlo y de esto no he encontrado nada.

Gracias
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 07-12-2016, 23:02 (Miércoles)
Hola Seny. En primer lugar, siento si he realizado preguntas ya tratadas pero créeme que he leído los hilos de preguntas frecuentes pero no encuentro lo que realmente estoy buscando.

Respecto al router,  no puedo devolverlo. Por lo menos debería restaurar a estado de compra. El firm del fabricante lo tengo pero no sé cómo ponerlo y de esto no he encontrado nada.

Gracias

Los hilos relevantes sirven para algo:  [Índice] Hilos relevantes de OpenWrt  (https://foro.seguridadwireless.net/openwrt/%28indice%29-hilos-relevantes-de-openwrt/)
Léete la configuración del Hg553, que tienes un muy buen ejemplo de cómo hacerlo.

Con respecto a dejar un router con el firmware de fábrica, no siempre es posible, y otras veces hay que hacer pasos adicionales. Si tu intención era devolverlo, deberías haber buscado la posibilidad de volver a la configuración de fábrica, antes de toquetearlo.
De todas formas, google es tu amigo. Busca si alguien lo ha hecho ya, con ese modelo o alguno similar.

Edito: En la página oficial de openwrt, tienes un ejemplo para reflashear desde openwrt al firmware OEM: https://wiki.openwrt.org/toh/linksys/wrt_ac_series (https://wiki.openwrt.org/toh/linksys/wrt_ac_series)
Título: Re: Base práctica de desarrollo
Publicado por: daskoud en 08-12-2016, 00:13 (Jueves)
Perdonad por ser ignorante en el tema,

pero me gustaría saber porque es tan complicado utilizar C o compilar C utilizando un router de procesador basado en MIPS , si este ha sido capaz de trabajar con Openwrt que es 100% linux y Según me han contado linux esta basado en C, ahora no entiendo donde viene tanta dificultad o problemas, porque siguiendo la lógica tendría que ser fácil pero por curiosidad me gustaría saber el porque.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 08-12-2016, 16:43 (Jueves)
Perdonad por ser ignorante en el tema,

pero me gustaría saber porque es tan complicado utilizar C o compilar C utilizando un router de procesador basado en MIPS , si este ha sido capaz de trabajar con Openwrt que es 100% linux y Según me han contado linux esta basado en C, ahora no entiendo donde viene tanta dificultad o problemas, porque siguiendo la lógica tendría que ser fácil pero por curiosidad me gustaría saber el porque.

Intenta meter todo eso que tú dices en 8mb de disco duro y 32mb de ram, y luego comentas...  >:D
Aparte de eso, se compila en un PC, para ejecutar en otro tipo de procesadores (MIPS), porque compilar requiere muchísimos recursos (crosscompiling).
Título: Re: Base práctica de desarrollo
Publicado por: daskoud en 09-12-2016, 17:51 (Viernes)
Si lo que dices lo entiendo, pero por lo de memoria de disco se puede aumentar utilizando memoria externa con SD o memoria usb.

Por parte de ram es algo ya bastante difícil pero siempre hay la posibilidad de pensarse la forma de ir reutilizando variables ya que minimiza bastante el código y minimizar el programa.  ^-^

De hecho el crosscompiling se utiliza bastante en los micrcontroladores,  además la herramienta de crosscompiling la ofrece ya Openwrt.

Por eso no veía yo el problema.
Título: Re: Base práctica de desarrollo
Publicado por: raphik en 09-12-2016, 19:23 (Viernes)
Sí, en teoría todo debería funcionar. Lo malo llega a la hora de ponerlo en práctica.

Yo en su día intenté compilar un sencillo "helloworld.c" y aparentemente todo fué tan bien que incluso redacté una guía (https://foro.seguridadwireless.net/openwrt/base-practica-de-desarrollo/msg324765/#msg324765).

Dos días más tarde intenté compilarlo de nuevo siguiendo mi propia guía y no pude (https://foro.seguridadwireless.net/openwrt/base-practica-de-desarrollo/msg324914/#msg324914).

Pero lo mejor es que te pongas tú y comentes cómo te va, a ver si tienes mejor suerte.

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: panteraxavi en 09-12-2016, 20:37 (Viernes)
Hola Seny. En primer lugar, siento si he realizado preguntas ya tratadas pero créeme que he leído los hilos de preguntas frecuentes pero no encuentro lo que realmente estoy buscando.

Respecto al router,  no puedo devolverlo. Por lo menos debería restaurar a estado de compra. El firm del fabricante lo tengo pero no sé cómo ponerlo y de esto no he encontrado nada.

Gracias

Los hilos relevantes sirven para algo:  [Índice] Hilos relevantes de OpenWrt  (https://foro.seguridadwireless.net/openwrt/%28indice%29-hilos-relevantes-de-openwrt/)
Léete la configuración del Hg553, que tienes un muy buen ejemplo de cómo hacerlo.

Con respecto a dejar un router con el firmware de fábrica, no siempre es posible, y otras veces hay que hacer pasos adicionales. Si tu intención era devolverlo, deberías haber buscado la posibilidad de volver a la configuración de fábrica, antes de toquetearlo.
De todas formas, google es tu amigo. Busca si alguien lo ha hecho ya, con ese modelo o alguno similar.

Edito: En la página oficial de openwrt, tienes un ejemplo para reflashear desde openwrt al firmware OEM: https://wiki.openwrt.org/toh/linksys/wrt_ac_series (https://wiki.openwrt.org/toh/linksys/wrt_ac_series)


Ya he conseguido tener conexión a internet en el router con openwrt y poder descargar e instalar Luci. 
Dejo los pasos que he realizado por si alguien tiene alguna duda también:

1.- Conectar router con openwrt al puerto ethernet del portátil.
2.- Acceder mediante consola al router y configurar, gateway, una IP fija dentro del rango que ofrece el
     router principal de casa y su máscara correspondiente.
3.- Apagar el router con openwrt.
4.- conectar mediante cable ethernet desde el puerto wan del router con openwrt a un puerto ethernet
     del router principal y encenderlo.
5.- Acceder mediante consola de nuevo al router openwrt y descargar e instalar Luci.


Muchas gracias por la ayuda y vuestra paciencia

Saludos.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 10-12-2016, 07:13 (Sábado)
Si lo que dices lo entiendo, pero por lo de memoria de disco se puede aumentar utilizando memoria externa con SD o memoria usb.

Por parte de ram es algo ya bastante difícil pero siempre hay la posibilidad de pensarse la forma de ir reutilizando variables ya que minimiza bastante el código y minimizar el programa.  ^-^

De hecho el crosscompiling se utiliza bastante en los micrcontroladores,  además la herramienta de crosscompiling la ofrece ya Openwrt.

Por eso no veía yo el problema.

El problema, es que para que funcione Linux en una máquina de tan pocos recursos, no "cabe" una biblioteca de C completa, por lo que se le recortan funcionalidades y se dejan las básicas para funcionar. Ya sea musl o uclibc, son bibliotecas recortadas. El compilador necesita unas bibliotecas más amplias para poder compilar y producir un ejecutable estable. En el caso de que el compilador gcc, pudiera funcionar con esas bibliotecas, sería aplicando un parche para adaptar las llamadas de funciones de la bibliotea completa, a la biblioteca recortada. Este paso requiere que alguien con mucha experiencia en el tema haga los parches, y no es tan fácil como pudieras suponer.
Aunque ya hay parches para gcc, y se puede compilar un gcc para openwrt, no he probado a utilizarlo. Además debes tener en cuenta que si funcionara, el gcc de openwrt estaría linkado a la biblioteca recortada de que dispone el router, y tus programas en C, deberían de estar adaptados también a esas bibliotecas, o no compilarían. Y los headers y demás dependencias de lo que compiles, también debe estar adaptado a dichas bibliotecas.

No sé si ahora lo ves mejor..., o peor...  ;)
Título: Re: Base práctica de desarrollo
Publicado por: daskoud en 10-12-2016, 15:51 (Sábado)
Dicho así ya lo entiendo, es decir lo que tenemos dentro de un router es un linux con C pero adaptado a esta máquina, para tener una mínima funcionalidad y que con estas pocas herramientas (biblioteca de funciones) se debe de adaptar el programa mediante parches (Complicados de crear).

Gracias por la aclaración.
Como conclusión tengo que aprender mucho más de C para no darme por vencido  ;D.
Título: Re: Base práctica de desarrollo
Publicado por: Tki2000 en 10-12-2016, 16:21 (Sábado)
Dicho así ya lo entiendo, es decir lo que tenemos dentro de un router es un linux con C pero adaptado a esta máquina, para tener una mínima funcionalidad y que con estas pocas herramientas (biblioteca de funciones) se debe de adaptar el programa mediante parches (Complicados de crear).

Gracias por la aclaración.
Como conclusión tengo que aprender mucho más de C para no darme por vencido  ;D.

Ya veo que lo has pillado...  ;)
Esa es la razón, de por qué no se pueden compilar los mismos programas que para PC, y hay un repositorio de los compilados que sí están adaptados y funcionan.
Título: Re:Base práctica de desarrollo
Publicado por: raphik en 25-03-2019, 23:30 (Lunes)
Vuelta de tuerca al helloworld.

Compilar para OpenWrt es más fácil de lo que parecía.
FUENTE: http://dvblog.soabit.com/building-custom-openwrt-packages-an-hopefully-complete-guide/

Fichero fuente helloword.c
Código: [Seleccionar]
#include <stdio.h>
int main(void)
{
  printf("\nHello World!\n\n");
  return 0;
}

Compilación simple (se compila en el PC, se ejecuta en el PC).
Código: [Seleccionar]
gcc -o helloworld helloworld.c
Compilación cruzada (se compila en el PC, se ejecuta en el router).
Código: [Seleccionar]
mips-openwrt-linux-gcc -o hello hello.c
El quid de la cuestión está en encontrar el compilador adecuado y en definir un par de variables de entorno.

Lo vemos con un ejemplo: el compilador para máquinas brmc63xx con LEDE-17.0.4 (HG553, HG556a, AR5387un, etc.) lo tenemos en
https://downloads.openwrt.org/releases/17.01.4/targets/brcm63xx/generic/lede-sdk-17.01.4-brcm63xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64.tar.xz

Crear primeramente la carpeta ~/pruebas.
Código: [Seleccionar]
mkdir ~/pruebas
Y copiar la recién descargada carpeta lede-sdk-17.01.4-brcm63xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64 dentro de la carpeta ~/pruebas.
(https://i.imgur.com/wueEndC.png)

Definir un par  variables de entorno.
Código: [Seleccionar]
export STAGING_DIR=~/pruebas/lede-sdk-17.01.4-brcm63xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64/staging_dir
export PATH=~/pruebas/lede-sdk-17.01.4-brcm63xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64/staging_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.16/bin:$PATH

Copiar también helloword.c en la carpeta ~/pruebas y compilar para el router.
Código: [Seleccionar]
mips-openwrt-linux-gcc -o helloworld helloworld.c
Transferir el ejecutable al router.
Código: [Seleccionar]
scp helloworld root@192.168.1.11:
Iniciar sesión en el router y ejecutar el programa
Citar
root@LEDE:~# ./helloworld

Hello, world!

root@LEDE:~#

NOTA: Si se desea restaurar la variable PATH a su contenido original:
Código: [Seleccionar]
PATH=$(/usr/bin/getconf PATH)