Skip to content

Una cajón desastre para mis scripts en bash, python, elisp...

License

Notifications You must be signed in to change notification settings

sherlockes/SherloScripts

Repository files navigation

SherloScripts

Un cajón desastre para todos mis scripts en bash, python, elisp…

Este archivo en formato org-mode voy escribiendo lo que día a día aprendo y utilizo en cualquiera de las plataformas que empleo. Un cuaderno de bitácora que consultar cuando no me acuerdo de como en su día hice algo

  • emacs
  • Hugo
  • Org-Mode
  • Debian y Linux
  • Bash
  • Markdown
  • Python
  • Y lo que vaya utilizando…

Todas las horas, la raspberry comprueba el estado de los distintos dispositivos de mis casas mediante un ping a cada uno de ellos, este script tiene que:

  • Obtener la IP local mediante “ip route”
  • Leer un archivo de texto por líneas mediante “read”
  • Asignar cada línea como un valor de una matriz
  • Extraer los distintos campos de cada línea mediante “cut”
  • Comprobar el horario respecto a la hora actual mediante “date” e “if”
  • Comprobar el acceso a un host mediante “ping”
  • Aplicar colores al texto de resultado en consola
  • Enviar el resultado por telegram

hugo.sh (bash)

Dentro de las “faenas” diarias que tiene mi raspberry está incluida la actualización de Hugo en caso de que haya una nueva versión. Esto se realiza mediante este script que:

  • Busca si Hugo esta instalado en el sistema
  • Compara la versión instalada con la ultima disponible
  • Actualiza a la última versión o realiza una instalación nueva.

Pare todo esto hago uso de:

  • Uso de condicionales `if`
  • Comando `getconf LONG_BIT` para determinar la arquitectura del sistema
  • Uso de funciones
  • Asignación de comandos a variables
  • Comando `curl` para “scrapear” el contenido de una web
  • Comando `grep` para buscar coincidencias en un texto
  • Comando `cut`para extraer partes de una cadena de texto
  • Comando `tr`para eliminar caracteres de una cadena de texto
  • Uso de Regex en Bash mediante BASH_REMATCH para extraer una parte de una cadena
  • Comprobar la existencia de un omando mediante `which`
  • Uso del comando `perl` para extraer de una cadena mediante Regex
  • Comprobar la existencia de un archivo
  • Eliminar un archivo mediante `rm`
  • Desinstalar un paquete mediante `dpgk`
  • Crear directorios mediante `mkdir`
  • Descargar archivos de la web con `wget`
  • Buscar archivos en un directorio con `find`
  • Extraer archivos comprimidos con `tar`
  • Comprobar y modificar rutas en el PATH

durante la hora de la siesta se ejecuta este script para descargar los nuevos vídeos de un canal de Twitch y convertirlos a audio en formato Podcast privado siguiendo los siguiente pasos:

  • Busca los últimos vídeos publicados por un canal
  • Descarta los de menos de 10 minutos
  • Comprueba los que no se han descargado anteriormente
  • Convierte los vídeos a mp3 eliminando los silencios
  • Crea un Feed Rss y lo actualiza con todos los archivos descargados
  • Sube el fedd y los mp3 a una nube pública de donde se nutre un servidor webdav

Para todo esto hago uso de:

  • Comprobación de dependencias mediante “command” e “if”
  • Creación de un array con los últimos vídeos de un canal mediante “mapfile” y “yt-dlp”
  • Uso de “for” para recorrer lo elementos de un array
  • Uso de “cut” para extraer información de parte de una cadena
  • Comprobar la existencia de una cadena en un archivo externo
  • Descargar el audio de un vídeo de Youtube con “yt-dlp”
  • Mover archivos mediante el comando “mv”
  • Comprobar la existencia de un tipo de archivos en un determinado directorio
  • Extraer el título de un vídeo de Youtube mediante “yt-dlp”
  • Añadir tags a un audio con la utilidad “id3v2”
  • Extraer info de los tags de un audio con la utilidad “ffprobe”
  • Crear fechas a partir de cadenas con el comando “date”
  • Concatenar archivos mediante el comando “cat”
  • Subir archivos a un servidor remoto mediante “rclone”
  • Calcular la duración de la ejecución del script

Todas las mañanas se ejecuta este script para descargar los nuevos vídeos de un canal de Twitch y convertirlos a audio en formato Podcast privado siguiendo los siguiente pasos:

  • Busca los últimos vídeos publicados por un canal
  • Descarta los de menos de 10 minutos
  • Comprueba los que no se han descargado anteriormente
  • Convierte los vídeos a mp3 eliminando los silencios
  • Crea un Feed Rss y lo actualiza con todos los archivos descargados
  • Sube el fedd y los mp3 a una nube pública de donde se nutre un servidor webdav

Para todo esto hago uso de:

  • Uso de funciones con definición de argumentos obligatorios
  • Uso de variables locales
  • Uso de “jq” para extraer información de json
  • Uso de grep, awk, cut y rev para extraer información de texto
  • Uso de lazos “for” y condicionales “if”
  • Uso de “find” para buscar archivos y “do” para realizar acciones sobre ellos
  • Extraer audio de un vídeo y eliminar silencios mediante “ffmpeg”
  • Mover y eliminar archivos
  • Concatenar cadenas y archivos mediante “cat”
  • Extraer metadatos de mp3 mediante “ffprobe”
  • Insertar variables en plantillas
  • Subir contenido a una nube mediante “Rclone”

Todas las noches se ejecuta este script que realiza las siguentes funciones:

  • Actualiza Hugo
  • Sincroniza la carpeta SherloScripts
  • Actualiza los repos de GitHubsincroniza nubes
  • Comprueba el estado de varias nubes públicas
  • Sincroniza las nubes de Sherloflix

Para todo esto se hace uso de:

  • Ejecución de un script externo
  • Ejecución de una función de un script externo
  • Sincronización de carpetas con Rclone
  • Uso de filtros de exclusión en Rclone
  • Uso de “for” para recorrer listas en bash
  • Actualización de repositorios mediante git
  • Chequeo de disponibilidad de nube con Rclone
  • Sincronización de nubes con Rclone

webdav.sh (bash)

Gracias a Rclone con este script de dos líneas al que hace una llamada en el arranque el crontab (Aunque directamente se podría haber insertado en el mismo) la Raspberry monta un servidor webdav con l contenido eu tengo cifrado en una de mis nubes públicas de acuerdo a los siguientes parámetros:

  • Nombre de la nube: Sherlockes78_UN_en
  • Ip y puerto del servidor: –addr 192.168.10.202:5005
  • Modo de sólo lectura: –read-only

SEncillo y práctico con un consumo de recursos realmente bajo.

Con este script que se ejecuta diariamente en mi NAS muevo de forma automática películas y series ya visualizadas desde el propio NAS a una unidad remota mediante Rclone. Escrito en Bash hago uso de:

  • Bucle for para recorrer directorios
  • Discriminación entre carpetas y archivos
  • Movimiento de archivos y carpetas mediante Rclone

Uso este script para crear los enlaces simbólicos a los archivos sincronizados en una nube pública. Toda la info en este artículo de mi blog.

ahora.py (upython)

Para la gestión de la hora en el ESP32 programándolo con micropython me he encontrado con el problema de la hora en España ya que no he sido capaz de que la clase “utime” devuelva el valor de la hora local. Me devuelve la hora UTC pero necesito la hora UTC +1 en el horario de invierno y +2 en el horario de verano. Esta sencilla clase me devuelve el tiempo actual en segundos para la hora peninsular en España corrigiendo con el horario de invierno o verano, para ello…

  • Define los segundos para UTC +1 (Horario de invierno)
  • Busca las 2:00 AM del último domingo de marzo como iniio del horario de verano.
  • Busca las 3:00 AM del último domingo de octubre como fin del horario de verano.
  • Compara la hora actual con la ventana del horario de verano
  • Devuelve el valor en segundos

aemet.py (python)

Esta clase ha sido creada para el proyecto de termostato inteligente en la Raspberry usando python. Su finalidad únicamente es la de obtener la Tª exterior cada determinado tiempo a través de la web de la AEMET y de la capacidad que ofrece (por ahora de forma gratuita) de descargar un archivo con los datos del último día.

A la clase se le pasa como parámetros la estación de la que queremos extraer la Tª y el tiempo cada el que queremos obtenerla de forma que si se hacen llamadas a la clase con más frecuencia que la que el tiempo ha establecido se devolverá el último valor guardado. Existen dos métodos, “t_actual()” que devuelve la última temperatura que ha sido obtenida por la estación y “t_media()” que devuelve la temperatura media de las ultimas 24 horas.

Los temas que aparecen repajados en esta clase son los siguentes:

  • Creación de clases y métodos en python
  • Uso de la clase “logging” para informar de eventos y errores
  • Uso de la clase “json” para leer y guardar datos en archivos externos
  • Manejo de errores mediante el método “try…except”
  • Uso de la clase “request” para hacer peticiones a un servidor web
  • Manejo de fechas mediante la clase “datetime”
  • Calculos con fechas
  • Extracción de información de archivos csv con el método “split

Tras un tiempo realizando la sincronización de mi galería de Google Photos a mi NAS de forma manual a través de un script que corría en el ordenador de sobremesa ahora he conseguido que el paquete ghotos-sync funcione en la raspberry de forma que una vez a la semana hace una sincronización del mes anterior y lo copia en la carpeta del NAS de donde coge las fotos “Synology Photos”. Los temas que toco en esta script son:

  • Comprobación de la instalación de paquetes
  • Comprobación de conexión a unidades remotas
  • Montaje de unidades remotas mediante sshfs
  • Determinacion del primer y último día del mes anterior
  • Concatenación de variables
  • Ejecución de gphotos-sync
  • Ajusta de valores exif en imágenes mediante exiftool (Script externo)
  • Creación de directorios de forma recursiva
  • Sincronización de carpetas mediante rsync
  • Desmontaje de unidades
  • Eliminación de directorios

Para que el script funcione de forma autónoma es necesaria tener configurada el acceso ssh de un equipo a otro mediente llave público-privada (ssh-key-gen)

limpieza_gmail.gs (google scripts)

Eliminar correos de publicidad e irrelevantes es una tarea que lleva su tiempo. Con este pequeño script que se ejecute cada hora consigo tener la bandeja de entrada mucho más limpia sin esfuerzo. Se tocan los siguientes aspectos:

  • Busqueda en Gmail por etiqueta, categoría y tiempo
  • Uso de bucle for con contador incremental
  • Eliminación de mensajes

Toda la info sobre la creación y funcionamiento del script la puedes encontrar en este articulo de mi blog.

renamer.py (python)

Fruto de una necesidad de un renombrado rápido de unos cuantos cientos de fotografías. Nada pretencioso ni complicado simplemente rápido y efectivo que toca los siguientes aspectos:

  • Chequeo de ruta y nombre de directorio actual
  • Sustitución de caracteres en cadenas con “replace”
  • Listar archivos de un directorio con “os.listdir”
  • Manejo de bucles for y while
  • Uso del condicional “if” para la comprobación de archivo
  • Uso del paquete “exif” para extracción de info de las fotos
  • Manejo del metodo “datetime”
  • Creación de rutas a aprtir de cadenas con “os.path.join”
  • Renombrado de archivos con “os.rename”

tiempo.py (python)

Mi primer Script en Python. Este realiza un pequeño resumen de las condiciones meteorológicas diarias extrayendo la información de la web de AEMET, no a través de su API sino que a través de su ”.csv” y ”.xml” públicos. Toca unos cuantos palos entre los que podemos encontar:

  • Manejo de listas (Creación, lectura, añadir elementos, trasposición, reemplazar valores…)
  • Manejo de fechas y horas
  • Elementos matemáticos. Conversión a entero y flotante, redondeo, máximos, minimos, medio
  • Uso de condicionales “IF” y bucles “FOR” y “WHILE”
  • Extracción de datos de un archivo “*.csv” externo
  • Extracción de información de un archivo “*.xml” ubicado en la red
  • Manejo de cadenas (Definir, añadir, reemplazar…)
  • Almacenamiento de variables en un archivo de configuración externo
  • Envío de mensajes de Telegram a través de un bot

post.sh (bash)

Con este script doy de más funcionalidad a publish.sh para que los Post en Hugo sean automáticamente formateados con la correspondiente cabecera haciendo uso de varias funciones de Bash. Está obsoleto por haber introducido las funciones dentro del archivo “Publish.sh”

  • Cálculo de líneas con `wc`
  • Extracción de la 1ª linea con `head`
  • Extracción de la segunda línea con `sed`
  • Extracción de las últimas líneas con `tail`
  • Separación de líneas en compos con `cut`
  • Cálculo del tiemo desde la última modificación con `date`
  • Buscar arcivos sin cabecera con `grep`

lista_vertice.html (hugo shortcodes)

Gracias a este shortcode que utilizo en mi blog desarrollado en Hugo consigo de una forma sencilla incluir una lista con todos los enlaces a las distintas páginas de una determinada categoría. En mi aso lo utilizo para listar todos los Vértices geodésicos que estan inluidos en la categoría “vertices”. Su uso es tan sencillo como copiarlo dentro de la carpeta “layouts/shortcodes/” y llamarlo desde donde queramos incluri la lista con “{{< lista_vertices >}}”. Hace uso de:

  • Filtrado de páginas por el contenido de una “section” (Carpeta)
  • Uso de la función “Range”
  • Acceso a parámetros de las páginas
  • Determinación de la existencia de un parámetro.

mapa_vertice (hugo shortcodes)

Con este shortcode que utilizo en mi blog desarrollado en Hugo introducto en cada página de la sección “vertices” toda la información relativa al mismo estrayendola de los parámetros de la propia página:

  • Cálculo del total de vértices
  • Introducir la información del vértice
  • Introducir la foto del vértice
  • Creación del mapa con Openlayers
  • Inclusión de la vista panorámica
  • Inclusión de la ruta para gps

Este sencillo script recorre todos los archivos de la web de la carpeta donde ubico los vértices geodésicos para extraer de ellos los parámetros suficientes para generar una archivo *.gpx con el que poder representarlos en un mapa.

rclone.sh (bash)

Por el método de instalación que tiene, Rclone no se actualiza automáticamente. Este script comenzó siendo una pequeña utilidad para actualizarlo automáticamente pero poco a poco ha ido ganando funcionalidades:

  • Comprueba la arquitectura del procesador
  • Comprueba la instalación de Rclone
  • Comprueba la actualización de Rclone
  • Lista las nubes disponibles en .config
  • Monta y desmonta cualquiera de las nubes

mover_archivos.gs (google scripts)

En mi lucha por descargar los archivos de Telegram al NAS he necesitado un pequeño script que corre dentro de la nube de google y cuya finalidad es mover los archivos que hay en la raiz de la unidad y meterlos dentro de una carpeta compartida que sincronizo con ni Synology. Todos los días esta utilidad vacía la carpeta y borra la papelera para poder mover más archivos.

Entre otras cosas, lo que he utilizado para su desarrollo es:

  • Listar los archivos de un directorio - Método “getFiles()
  • Seleccionar un directorio por “Id” - Método “getFolderById(id)”
  • Añadir un nuevo archivo - Método “addFile(file)”
  • Eliminar un archivo - Método “removeFile(file)”
  • Seleccionar archivos por fecha de modificación - Método “getLastUpdated()”
  • Vaciar la papelera de reciclaje

Este script y el resto de utilidades necesarias para mover los archivos de Telegram al NAS lo puedes encontrar en Sherblog

Para la creación y mantenimiento de Sherblog utilizo Hugo sobre mi equipo local con linux mint o la Raspberry Pi 3B+. Este script, que tengo programado para ejecutarse a diario, se encarga de realizar una actualización de versión de Hugo en caso de que sea necesario.

Entre otras cosas, lo que he utilizado para su desarrollo es:

  • Uso del comando “getconf” para los bits de la máquina
  • Extracción de cadenas con Regex y Perl
  • Descarga de páginas web con “curl”
  • Extracción de cadenas con “grep”, “cut” y “tr”
  • Instalación de paquetes con “dpkg”

sherlomenu (bash)

Un pequeño lanzador para montar el local las distintas nubes que uso a diario tanto en Google Drive como en Mega gracias a Rclone. Tambien está incluido un apartado para realizar la copia de seguridad de Google Photos y el Push automático de este repositorio.

  • Uso básico de Rclone (mount)
  • Montaje mediante sshfs
  • Git commit y push básico
  • Montaje de Google photos mediante gphotos-sync
  • Condiionales en Bash (En una o varias líneas)
  • Uso de variables indirectas en Bash
  • Uso del comando “case”

radares.sh (bash)

Por que estar pendiente de cuando se actualiza la base de datos de radares de tráfico de www.laradiobbs.net, descomprimirla combinarla y renombrarla es un poco latoso he creado este pequeño script en Bash que lo hace de forma completamente desatendida. Inluido en el crontab de la Raspberry Pi, ella sola se encarga de “acondicionar” los ficheros y guardarlos en una nube de Google Drive (Mediante Rclone) para poder acceder con cualquier terminal.

  • Descarga de archivos con “curl”
  • Descomprimir archivos zip con “unzip”
  • Renombrado y borrado de archivos con “mv” y “rm”
  • Uso básico de expresiones regulares
  • Sincronización con una carpeta de Google Drime mediante Rclone
  • Fusión de archivos con el comando “cat”

publish.sh (bash)

Al usar un generador de páginas estáticas como es Hugo para la administración de www.sherblog.pro, guardar los archivos fuente en Google Drive y usar como alojamiento a Github la publicación de un nuevo artículo se vuelve en algo laborioso. Por esto he creado este script que realiza los siguientes pasos

  • Actualiza Hugo
  • Sincroniza Google Drive con las carpetas locales
  • Añade una cabecera a los archivos que no la tienen
  • Actualiza los archivos de la nube a los nuevos con cabecera
  • Genera la web estática
  • Sube la web a GitHub

Para ello he utilizado, entre otros, los siguientes conceptos

  • Uso de “rclone” para sincronizar carpetas
  • Uso de “fname” para extraer nombres de archivos
  • Uso de la propiedad “date” para calculos del tiempo de modificación
  • Uso de “cat” para añadir texto a archivos existentes
  • Uso de “git push”

sherblog_db_backup (google scripts)

Cuando la web estaba en WordPress, este es el script que utilizaba para realizar una copia de seguriadd versionada de la base de datos de forma manual. El script busca todos los archivos de una carpeta determinada y sólo guarda un número determinado en función de su antigüedad.

Toda la información la puedes encontrar en Sherblog

Entre otras cosas, los métodos que utilizo con los siguientes:

  • Creación de fechas con el método “Date()”
  • Creación de matrices con el método “Array()”
  • Listar los archivos de una carpeta con el método “getFiles()”
  • Comparación de antigüedad de los archivos mediante “getLastUpdated()”
  • Eliminación de elementos de una matriz mediante “splice()”

About

Una cajón desastre para mis scripts en bash, python, elisp...

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published