Archivo de etiquetas cubieboard

PorLeón Ramos

Wrapper: Ejecutar un script desde un servidor web en una cubieboard

¡Hola!

En esta ocasión vamos a realizar un wrapper o un script para realizar algunas acciones desde una página web en nuestra cubieboard A10.

IMPORTANTE: Cabe resaltar que esta práctica es altamente insegura y deberán de colocarse controles adicionales como contraseñas o manejo de usuarios para evitar problemas futuros.

Instalar dependencias

  • Lo primero que hay que realizar es asegurarse de que tenemos el servidor web apache instalado:
sudo apt-get install apache2 php

¿Funciona apache?

  • Ahora probaremos que está funcionando, conéctate a la misma red de tu cubieboard y revisa cuál es su dirección ip.
ip a
  • Abre un navegador y deberás ver una página de inicio como la siguiente

 

El script bash

  • Crearemos un script sencillo para probar la ejecución en la carpeta /var/www/html/scripts
sudo mkdir -p /var/www/html/scripts

cd /var/www/html/scripts/

nano script1.sh

El contenido del script será el siguiente:

#!/bin/bash

usuario=$(whoami)
echo "Este es un script BASH!!!! ejecutado por $usuario"

Recuerda darle premisos de ejecución:

sudo chmod 755 script1.sh

La página html

  • Ahora generaremos una página web con un botón en el archivo boton.html
cd /var/www/html

nano boton.html

El contenido del archivo es este:

<!DOCTYPE html>
<html lang="es">
  <head>
  <meta charset="UTF-8">
    <title>Botón para invocar un script Bash</title>
    <script>
      function ejecutarScript() {
        // Realiza una solicitud HTTP POST a un script PHP que ejecutará el script Bash
        console.log("Invocando PHP de fondo");
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "ejecutar_script.php", true);
        xhr.send();
      }
    </script>
  </head>
  <body>
    <h1>Botón para invocar un script Bash</h1>
    <form action="ejecutar_script.php" method="post">
      <input type="submit" value="Ejecutar script redirigiendo"/>
    </form>
    <form action="ejecutar_script_sudo.php" method="post">
      <input type="submit" value="Ejecutar script redirigiendo y sudo"/> 
    </form>
    <button onclick="ejecutarScript()">Ejecutar Script SIN redirigir</button>
  </body>
</html>

El script php

  • Ahora crearemos un script ejecutar_script.php para que lance el script bash
nano ejecutar_script.php

el contenido del archivo es el siguiente:

<?php
// Ruta al script Bash
$scriptPath = "/var/www/html/scripts/script1.sh";

// Ejecuta el script Bash
$output = shell_exec("bash $scriptPath");

// Si deseas imprimir la salida del script Bash, puedes hacerlo aquí
echo "<pre>$output</pre>";
?>

El gemelo malvado

También haremos otro script muy parecido  ejecutar_script_sudo.php pero este lo usaremos para ejecutar el script con permisos de superusuario

nano ejecutar_script_sudo.php

el contenido del archivo es el siguiente:

<?php
// Ruta al script Bash
$scriptPath = "/var/www/html/scripts/script1.sh";

// Ejecuta el script Bash
$output = shell_exec("sudo bash $scriptPath");

// Si deseas imprimir la salida del script Bash, puedes hacerlo aquí
echo "<pre>$output</pre>";
?>

Primera prueba

  • Hasta el momento si abrimos el navegador y escribimos la dirección http://<ip_cubieboard>/boton.html vamos a  ver lo siguiente:

Si damos clic en el primer botón todo funcionará correctamente y nos aparecerá la siguiente leyenda:

Sin embargo, si usamos el segundo botón, que intenta ejecutar el script con permisos de superusuario, nos generará un error, es necesario agregar algo más para que los permisos de superusuario funcionen.

Si damos clic een el tercer botón, se lanzará el script pero de fondo y no sabemos si se ejecutó o no. Para esto abre la consola de desarrollador de tu navegador y al presionar le botón deberás ver una salida como esta:

Donde nos indica que el código javascript efectivamente lanzó la ejecución del script bash pero no vemos la salida en la pantalla.

Permisos de root

  • Para agregar los permisos de super usuario será necesario que escribamos realicemos el siguiente procedimiento:

Abrir la tabla de sudoers con el comando que valida la sintaxis:

sudo visudo

Agregar al final del archivo la siguiente línea:

www-data ALL=(ALL) NOPASSWD: /bin/bash /var/www/html/scripts/script1.sh

Guardar y salir del archivo. Si todo ha salido bien, ahora el segundo botón funcionará y el script bash se habrá ejecutado como root o superusuario.

Happy coding!

PorLeón Ramos

SOS: Enciende un LED con la GPIO de tu Cubieboard A10

Hola:

Acá les voy a compartir la receta de cocina para poder controlar un led desde uno de los pines de la GPIO. Tengo una Cubieboard A10 con Armbian 23.11.1 bookworm. Vamos a necesitar:

  1. Una resistencia de 220 (rojo, rojo, café) o 330 (naranja, naranja, café) ohms.
  2. Un diodo led de preferencia de bajo consumo (no ultrabrillante).
  3. Una protoboard
  4. Algunos cables dupont para conectar de header macho a protoboard (Dupont macho-hembra).

 

Para empezar, seleccionamos un pin de la GPIO. Para eso buscamos el diagrama pinout de la placa.

Diagrama pinout Cubieboard A10 GPIO

 

 

En nuestro caso vamos a seleccionar el pin 11 del puerto del lado derecho del diagrama. Es el pin margado como CSI1-D0. Y para aterrizar el circuito usaremos el pin 19 o 20  marcados como GND o Ground del mismo puerto. El circuito nos quedaría de la siguiente forma:

Diagrama de conexiones

Actualizar sistema

sudo apt update
sudo apt upgrade

Instalar dependencias de python

sudo apt install python3-libgpiod

Revisar pines disponibles

dtc -I dtb -O dts -o sun4i-a10-cubieboard.dts /boot/dtb/sun4i-a10-cubieboard.dtb

Script python

Acá estaría el script que debes de copiar y pegar en un archivo. Yo le puse de nombre sos.py.

#!/usr/bin/python

import gpiod
import time

def morse_code_signal(line, symbol):
    if symbol == ".":
        line.set_value(1)
        time.sleep(0.2)  # Duración del punto
        line.set_value(0)
        time.sleep(0.2)  # Espacio entre partes de la misma letra
    elif symbol == "-":
        line.set_value(1)
        time.sleep(0.6)  # Duración de la raya
        line.set_value(0)
        time.sleep(0.2)  # Espacio entre partes de la misma letra

def morse_code_sos(line):
    # Representación de SOS en Morse: ... --- ...
    for symbol in "... --- ...":
        morse_code_signal(line, symbol)
        if symbol == " ":
            time.sleep(0.6)  # Espacio entre letras

chip = gpiod.Chip('gpiochip0')
line_number = 196
led = chip.get_line(line_number)
led.request(consumer='gpio_led_morse', type=gpiod.LINE_REQ_DIR_OUT)

try:
    while True:
        morse_code_sos(led)
        time.sleep(5)  # Espera 5 segundos antes de repetir
finally:
    led.release()

 

Ahora podemos darle permisos de escritura

chmod 755 sos.py

Ejecutamos como superusuario

sudo ./sos.py

¡Y listo! ¡Ya podemos controlar un LED con un script python en linux!

Happy coding!

Porcreadores

Mediaserver en un Cubieboard A10

Objetivo

En mi caso estoy buscando compartir algunos videos, música y libros digitales utilizando un servidor web y dlna. Además usaré este tipo de instalación como base para el desarrollo de nuestra plataforma para IoT (Internet of Things).

Lista de materiales

  • Cubieboard A10
  • Disco duro SATA de espacio a elegir (yo estoy usando 1TB)
  • Cable SATA + 5V breakout
  • Adaptador o fuente de alimentación de 5V a 2A
  • Wifi DWA-131E1 marca D-Link

sata-cable-5v-2a-dc-power-adapter

Instalando la plataforma

Descarga la imagen

Primero hay que descargar la imagen. La que estoy utilizando y me funcionó muy bien es la Cubian-nano-x1-a10-hdmi.img. Aquí el torrent para descargarlo.

Si no tienes 7z, lo puedes descargar en ubuntu así:

sudo apt-get install p7zip

Una vez descargado, puedes descomprimir el archivo así:

7zr x Cubian-nano-x1-a10-hdmi.img.7z

Copia la imagen a la memoria uSD

Coloca tu memoria sd en el lector y copia la imagen a la misma. Yo estoy usando micro sd’s de 8GB y me han funcionando muy bien.

micro_sd_8gb

sudo dd if=Cubian-nano-x1-a10-hdmi.img of=/dev/mmcblk0

Nota que en mi caso la memoria sd se detecta como /dev/mmcblk0 y así como aparece lo uso. NUNCA uses la partición /dev/mmcblk0p1.

Configurando el sistema

Inicia el sistema

Arranca tu sistema conectando un monitor y un teclado. Sigue el wizard para realizar la configuración inicial y reinicia el sistema.

cubieboard

Actualiza el sistema

Actualiza los paquetes y el sistema para tener la última versión.

sudo su -
apt-get install aptitude
aptitude update
aptitude upgrade

Wifi

Instalando el módulo

Estoy usando una tarjeta DWA-131E1 de D-Link, su módulo no está incluido en la distribución, así que lo voy a compilar. Es relativamente fácil encontrar este hardware en México y también es económico, por eso lo incorporé al diseño.

dwa-131e1

aptitude install usbutils
aptitude install firmware-realtek firmware-linux

aptitude install build-essential git
aptitude install linux-headers
aptitude install linux-headers-3.4.79-sun4i

git clone https://github.com/romcyncynatus/rtl8192eu.git

Ya que tenemos todos los paquetes necesarios, ahora sí lo compilaremos.

cd rtl8192eu

Comenta la siguiente línea  en el archivo Makefile anteponiendo el numeral #

#EXTRA_CFLAGS += -Wno-error=date-time

Guarda el archivo y comienza la compilación,  posteriormente instala los binarios

make ARCH=arm KVER=3.4.79-sun4i
make ARCH=arm KVER=3.4.79-sun4i install

Agrega las opciones del módulo, no estoy muy claro si las debería de llevar o no, si alguien ha hecho más pruebas, me vendrían muy bien sus comentarios.

Crea el archivo /etc/modprobe.d/8192eu.conf

options 8192eu rtw_power_mgnt=0 rtw_enusbss=0

Edita el archivo que carga los módulos al arranque para que esté presente cuando inicies la cubieboard. /etc/modules

#wifi
8192eu

Reinicia y prueba que se cargue el módulo correctamente. Una forma sencilla es ejecutar el comando:

lsmod | grep 8192eu

Configurando el SSID

Ejecuta el siguiente comando, reemplazando Mi_SSID por el nombre de tu red.

wpa_passphrase Mi_SSID

La salida será parecida a esto:

network={
   ssid="Mi_SSID"
   #psk="my_very_secret_passphrase"
   psk=ee80f3ecd6496a956e76f7c0332960326951f8edee80f3ecd6496a956e76f7c0332960326951f8ed
}

Para que se configure al inicio del sistema tenemos que editar /etc/network/interfaces.

auto wlan0
iface wlan0 inet dhcp
   wpa-ssid Mi_SSID
   wpa-psk ee80f3ecd6496a956e76f7c0332960326951f8edee80f3ecd6496a956e76f7c0332960326951f8ed

Prueba que funcione levantando la interface y revisando que se haya configurado correctamente con ifconfig.

ifup wlan0 && ifconfig wlan0

Almacenamiento

disco_duro_2-5

Preparar el almacenamiento

Apaga el sistema y conecta el disco duro de 2.5″, seguramente el sistema le asignará el descriptor /dev/sda1, lo puedes checar con un dmesg.

Formatea con ext4

mkfs.ext4 -I 256 /dev/sda1

Móntalo permanentemente

Edita el archivo /etc/fstab, es el lugar en donde el sistema guarda la tabla para montar sistemas de archivos automáticamente. Agrega al final la siguiente línea.

/dev/sda1  /archivos  ext4  noatime,dealloc  0  0

Arregla los locales

Encontrarás errores sobre los locales si cambiaste el idioma de inglés a español. Aquí algunos tips de como arreglarlo:

locale-gen
dpgk-reconfigure locales

Instalando el miniDLNA

Ahora configuraremos el servidor miniDLNA que nos ayudará a compartir la música y los videos con smartTVs y consolas.

aptitude install minidlna

Edita el archivo /etc/minidlna.conf y cambia las siguientes líneas:

media_dir=/mi_ruta
presentation_url=http://mi_ip:8200

Cambia /mi_ruta por el directorio en donde están tus archivos a compartir, también cambia mi_ip por la IP que tu sistema usará. (también sería recomendable configurar tu interface wlan0 con una dirección estática para que nunca cambie).

Instalando el servidor web

Un servidor web muy ligero y rápido es nginx, en lo personal lo prefiero a apache para aplicaciones pequeñas. No viene preeinstalado en el sistema, así que hay que instalarlo y configurarlo.

aptitude install nginx

Edita el archivo /etc/nginx/sites-enable/default, encuentra la sección que comienza con «location /» y agrega esto entre las llaves:

autoindex on;

La línea anterior te permitirá ver todos los archivos y navegar entre ellos.

Aquí puedes agregar un sistema sencillo de autenticación como un htaccess o similar.

Happy sharing!!