Se añaden scripts de Korn Shell

This commit is contained in:
Tuxliban Torvalds 2023-05-05 18:57:30 -06:00
parent 379798d954
commit 1962204fd7
17 changed files with 1049 additions and 0 deletions

137
varios/ksh/dmenurecord.ksh Executable file
View File

@ -0,0 +1,137 @@
#!/bin/ksh
# Usage:
# `$0`: Ask for recording type via dmenu
# `$0 screencast`: Record both audio and screen
# `$0 video`: Record only screen
# `$0 audio`: Record only audio
# `$0 kill`: Kill existing recording
#
# If there is already a running instance, user will be prompted to end it.
read -r RES < /sys/class/graphics/fb0/virtual_size
updateicon() { \
print "$1" > /tmp/recordingicon
pkill -RTMIN+9 "${STATUSBAR:?}"
}
killrecording() {
recpid="$(cat /tmp/recordingpid)"
# kill with SIGTERM, allowing finishing touches.
kill -15 "$recpid"
rm -f /tmp/recordingpid
updateicon ""
pkill -RTMIN+9 "${STATUSBAR:?}"
# even after SIGTERM, ffmpeg may still run, so SIGKILL it.
sleep 3
kill -9 "$recpid"
exit
}
screencast() { \
ffmpeg -y \
-f x11grab \
-framerate 24 \
-s "${RES/,/x}" \
-i "$DISPLAY" \
-f alsa -i default \
# -f sndio -i snd/0 \
-r 24 -async 1 -vsync -1 \
-c:v libx264rgb -crf 0 -preset ultrafast -c:a aac \
-preset ultrafast -c:a libvorbis \
"$HOME/screencast-$(date '+%y%m%d-%H%M%S').mkv" &
print $! > /tmp/recordingpid
updateicon "⏺️🎙️"
}
screencastmobile() { \
ffmpeg -y \
-f x11grab \
-framerate 60 \
-s "${RES/,/x}" \
-i "$DISPLAY" \
-f alsa -i default \
-r 30 \
-c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -loglevel panic -c:a aac \
"$HOME/screencast-$(date '+%y%m%d-%H%M%S').mp4" &
print $! > /tmp/recordingpid
updateicon "⏺️🎙️"
}
video() { ffmpeg \
-f x11grab \
-s "${RES/,/x}" \
-i "$DISPLAY" \
-c:v libx264 -qp 0 -r 30 \
"$HOME/video-$(date '+%y%m%d-%H%M%S').mkv" &
print $! > /tmp/recordingpid
updateicon "⏺️"
}
videomobile() { \
ffmpeg -y \
-f x11grab \
-framerate 60 \
-s "${RES/,/x}" \
-i "$DISPLAY" \
-r 30 \
-c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -loglevel panic\
"$HOME/video-$(date '+%y%m%d-%H%M%S').mp4" &
print $! > /tmp/recordingpid
updateicon "⏺️🎙️"
}
webcamhidef() { ffmpeg \
-f v4l2 \
-i /dev/video0 \
-video_size 1920x1080 \
"$HOME/webcam-$(date '+%y%m%d-%H%M%S').mp4" &
print $! > /tmp/recordingpid
updateicon "🎥"
}
webcam() { ffmpeg \
-f v4l2 \
-i /dev/video0 \
-video_size 640x480 \
"$HOME/webcam-$(date '+%y%m%d-%H%M%S').mp4" &
print $! > /tmp/recordingpid
updateicon "🎥"
}
audio() { \
ffmpeg \
-f alsa -i default \
-c:a flac \
"$HOME/audio-$(date '+%y%m%d-%H%M%S').mp4" &
print $! > /tmp/recordingpid
updateicon "🎙️"
}
askrecording() { \
choice=$(printf "screencast\\nwebcam\\nscreencastmobile\\nvideomobile" | dmenu -i -sb "#4D4270" \
-p "Seleccione el modo de grabación:")
case "$choice" in
screencast) screencast;;
audio) audio;;
video) video;;
webcam) webcam;;
screencastmobile) screencastmobile;;
videomobile) videomobile;;
esac
}
asktoend() { \
response=$(printf "No\\nSí" | dmenu -i -sb "#4D4270" -p "Grabación activa.¿Desea finalizar?") &&
[ "$response" = "Sí" ] && killrecording
}
case "$1" in
screencast) screencast;;
audio) audio;;
video) video;;
kill) killrecording;;
*) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
esac

36
varios/ksh/hosts.ksh Executable file
View File

@ -0,0 +1,36 @@
#!/bin/ksh
# V0.4
# Script para descargar una lista personalizada con direcciones para bloquearlas
# a través del fichero hosts. Para automatizar este proceso se recomienda crear
# una tarea (crontab) y ajustarla a las necesidades del usuario (diario, semanal
# mensual, etc)
#
# Dependencias: dzen2, wget
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
function msg {
dzen2 -p '10' -fn 'JetBrains Mono:size=8:style=bold' -ta '5' \
-w '260' -x '1100' -y '25'
}
# which_sudo es una función personalizada de ksh
SUDO=$(which_sudo)
# Realizar copia de seguridad del fichero hosts en caso de no existir
if [[ ! -f /etc/hosts.bak ]]; then
printf '%b' "\033[32;1mCreando copia de seguridad del fichero hosts...\033[0m\n"
$SUDO cp /etc/hosts /etc/hosts.bak
printf "\033[33;1mCopia finalizada\033[0m\n"
else
printf '%b' "\033[35;5mYa existe copia de seguridad del fichero hosts\033[0m\n"
fi
# Descargar actualización más reciente del fichero hosts
printf '%b' "\033[32;1mDescargando y copiando lista actualizada para fichero hosts...\033[0m\n"
$SUDO wget -O /etc/hosts http://sbc.io/hosts/alternates/fakenews-gambling-porn/hosts
"$HOME"/.local/bin/dunst_sound 2> /dev/null
# Notificacion de actualizacion del fichero
printf '%b' "\033[36;1mFichero hosts actualizado.\033[0m\n"
printf '%s\n' "Lista de fichero hosts actualizado" | msg &

30
varios/ksh/kbasename.ksh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/ksh
#
# Versión Korn Shell de basename
#
# Comprobar argumentos
if (($# == 0 || $# > 2 )); then
printf %s "\
Uso: ${0##*/} string [sufijo]
Ejemplos:
${0##*/} /path/foo.xyz
foo.xyz\n
${0##*/} /path/foo .xyz
foo
"
exit 1
fi
# Obtener el nombre base
BASE=${1##*/}
# Ver si se ha dado el argumento sufijo
if (($# > 1 )); then
# Mostrar nombre base sin sufijo
print ${BASE%$2}
else
# Mostrar nombre base
print $BASE
fi

33
varios/ksh/kbattery.ksh Executable file
View File

@ -0,0 +1,33 @@
#!/bin/ksh
#
# Códigos de salida
# 0 Éxito (batería baja)
# 3 Suficiente bateria
#
# Dependencias: dzen2
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
read -r capacity < /sys/class/power_supply/BAT0/capacity
read -r status < /sys/class/power_supply/BAT0/status
function dep {
if ! command -v dzen2 >/dev/null; then
printf '%b\n' "Dependencia no satisfecha:\n\tInstale dzen2\n"
exit 1
fi
}
function msg {
dzen2 -p -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
-w 260 -x 1100 -y 25
}
if [[ "$status" == "Discharging" ]]; then
if (( capacity <= 25 )); then
"$HOME"/Dropbox/Gitea/scripts/varios/dunst_sound 2> /dev/null
printf '%s\n' "Batería baja: $capacity%, conectar el cargador" | msg &
exit 0
fi
fi
exit 3

28
varios/ksh/kcat.ksh Executable file
View File

@ -0,0 +1,28 @@
#!/bin/ksh
#
# Version Korn Shell de cat
#
# Comprobar uso
if (($# < 1)); then
print "Uso: ${0##*/} <archivo> ..."
exit 1
fi
# Procesar cada fichero
while (($# > 0)); do
# Asegurarse de que el archivo exista
if [[ ! -f $1 ]]; then
print "$1: Inexistente o no accesible"
else
# Abrir archivo de entrada
exec 0<$1
while read LINE; do
# Visualización de salida
print $LINE
done
fi
# Obtener el argumento del siguiente archivo
shift
done

12
varios/ksh/kdirname.ksh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/ksh
#
# Versión Korn Shell de dirname
#
# Comprobar argumentos
if (($# ==0 || $# > 1)); then
print "Uso: ${0##*/} string"
exit 1
fi
# Obtener el nombre del directorio
print ${1%/*}

94
varios/ksh/kdocx2.ksh Executable file
View File

@ -0,0 +1,94 @@
#!/bin/ksh
# Script para convertir documentos de word a PDF o a texto plano usando pandoc
#
# NOTA: Este script hace uso de la sustitución de parámetros para obtener el nombre del archivo (basename)
# y de su respectivo path (dirname). Se aprovecha esta funcionalidad del shell para evitar hacer uso de
# comandos externos.
# Este script utiliza en su mayoría el parámetro $2 el cual puede ser el archivo que se desea convertir o
# también puede ser el directorio donde se encuentran los archivos que se convertirán a formato pdf.
#
# Equivalencias sustituyendo al parámetro $2:
# 1. extensión: ${2##*.}
# 2. dirname: ${2%/*}
# 3. basename: ${2##*/}
# 4. pathfile sin extensión: ${file%.*}
#
# Dependencias lualatex, pandoc
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
# Nombre del script usando la sustitución de parámetros
script="${0##*/}"
# Revisar que las dependencias estén instaladas
if ! command -v lualatex > /dev/null; then
print "Dependencia lualatex no encontrada en el sistema, instalándola..."
doas xbps-install -Sy texlive-LuaTeX
elif ! command -v pandoc > /dev/null; then
print "Dependencia pandoc no encontrada en el sistema, instalándola..."
doas xbps-install -Sy pandoc
fi
function ayuda {
printf %s "\
Nombre: $script
Propósito: Convertir documentos docx a formato PDF o texto plano (txt)
Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
Versión: 1.0 (27/04/2023)
Uso: $script <arg> <directorio o archivo>
--pdf | -p Convierte archivo(s) a formato PDF
--txt | -t Convierte archivo(s) a texto plano
--help | -h Mustra este mensaje de ayuda
EJEMPLOS: $script --pdf /path/foo.docx Convierte archivo especificado
$script -t /path/ Convierte archivos compatibles del directorio especificado a texto plano
"
}
case $1 in
--pdf|-p)
# Si el segundo argumento existe y tiene terminación docx, realizar la conversión del documento
# a archivo tipo PDF
if [[ -f $2 && ${2##*.} == "docx" ]]; then
printf '%s\n' "Convirtiendo $FILENAME a formato PDF..."
pandoc "$2" -V geometry:"top=2cm, bottom=1.5cm, left=2.4cm, right=2.4cm" \
--pdf-engine=lualatex -o ${2%.*}.pdf
exit 0
# Comprobar que el segundo argumento exista y que se trate de un directorio.
elif [[ -d $2 ]]; then
# Si en el directorio hay archivos con extensión tipo .docx, convertirlos a archivo tipo PDF
for file in "$2"*.docx; do
[[ -f $file ]] || continue
printf '%s\n' "Convirtiendo ${file##*/} a formato PDF..."
pandoc "$file" -V geometry:"top=2cm, bottom=1.5cm, left=2.4cm, right=2.4cm" \
--pdf-engine=lualatex -o "${file%.*}".pdf
done
exit 0
else
printf '%s' "\nERROR: el fichero o directorio no existe\n"
exit 1
fi
;;
--txt|-t)
if [[ -f $2 && ${2##*.} == "docx" ]]; then
printf '%s\n' "Convirtiendo $FILENAME a texto plano..."
pandoc -s "$2" -t plain -o "${2%.*}".txt --wrap=none
exit 0
elif [[ -d $2 ]]; then
for file in "$2"*.docx; do
[[ -f $file ]] || continue
printf '%s\n' "Convirtiendo ${file##*/} a formato texto plano..."
pandoc "$file" -t plain -o "${file%.*}".txt --wrap=none
done
exit 0
else
printf '%s' "\nERROR: el fichero o directorio no existe\n"
exit 1
fi
;;
--help|-h|*)
ayuda
esac

35
varios/ksh/keyboard.ksh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/ksh
# Dependencias: xinput
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
script="${0##*/}"
function ayuda {
printf %s "\
Script para desactivar teclado interno en portátiles mientras se está en el servidor gráfico.
Uso: $script [arg]
Ejemplo:
$script on Activa teclado interno
$script off Desactiva teclado interno
$script --help, -h Muestra este mensaje de ayuda
"
}
# Salir si existe un error
set -e
ID=$(xinput --list | awk '/Translated/ {print $7}' | cut -d '=' -f 2)
case "$1" in
on)
xinput set-int-prop "$ID" "Device Enabled" 8 1
;;
off)
xinput set-int-prop "$ID" "Device Enabled" 8 0
;;
--help|-h|*)
ayuda
esac

77
varios/ksh/kimage_ss.ksh Executable file
View File

@ -0,0 +1,77 @@
#!/bin/ksh
# v0.2
# Dependencias:ImageMagick, xclip, dzen2, xdotool
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
script="${0##*/}"
DIR="$HOME"/Datos/Capturas
DATE="$(date +%Y%m%d-%H%M%S)"
SUDO=$(which_sudo)
if ! command -v import > /dev/null; then
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando ImageMagick...\033[0m\n"
"$SUDO" xbps-install -y ImageMagick
elif ! command -v xclip > /dev/null; then
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando xclip...\033[0m\n"
"$SUDO" xbps-install -y xclip
elif ! command -v dzen2 > /dev/null; then
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando dzen2...\033[0m\n"
"$SUDO" xbps-install -y dzen2
elif ! command -v xdotool > /dev/null; then
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando xdotool...\033[0m\n"
"$SUDO" xbps-install -y xdotool
fi
function ayuda {
printf %s "\
Script para realizar capturas de pantalla utilizando ImageMagick.
Modo de uso:
$script [-PsfgSFh]
-P Guardar captura de pantalla completa en el portapapeles
-s Guardar área seleccionada en el portapapeles
-f Guardar captura de pantalla de ventana activa en el portapapeles
-g Guardar captura de pantalla completa en el disco duro
-S Guardar área seleccionada en el disco duro
-F Guardar captura de pantalla de ventana activa en el disco duro
--help | -h Mostrar este mensaje de ayuda
"
}
function msg {
dzen2 -p 8 -e 'onstart=uncollapse' -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
-sa c -w 260 -x 1100 -y 25 -l 1
}
case "$1" in
-p)
import -window root png:- | xclip -t 'image/png' -selection 'clipboard' -i
;;
-s)
sleep 1 && import png:- | xclip -t 'image/png' -selection 'clipboard' -i
;;
-f)
import -window "$(xdotool getwindowfocus)" png:- | xclip -t 'image/png' -selection 'clipboard' -i
;;
-g)
[[ ! -d $DIR ]] || mkdir "$DIR"
import -format png -window root "$DIR/$DATE.png"
"$HOME"/.local/bin/dunst_sound
printf '%s\n' "CAPTURA DE PANTALLA" "Guardando en: ~/Datos/Capturas" | msg &
;;
-S)
[[ ! -d $DIR/Select ]] || mkdir -p "$DIR"/Select
sleep 1 && import -format png "$DIR/Select/select-$DATE.png"
"$HOME"/.local/bin/dunst_sound
printf '%s\n' "ÁREA SELECCIONADA" "Guardando en: ~/Datos/Capturas/select" | msg &
;;
-F)
[[ ! -d $DIR/Select ]] || mkdir -p "$DIR"/Select
import -window "$(xdotool getwindowfocus)" -format png "$DIR/Select/window-$DATE.png"
;;
--help|-h|*)
ayuda
esac

54
varios/ksh/krwallpaper.ksh Executable file
View File

@ -0,0 +1,54 @@
#!/bin/ksh
## Script que aleatoriza wallpaper
## Dependencias: ImageMagick
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
#
# Lista de códigos de salida
# 0 - éxito
# 10 - Dependencia no satisfecha
# 11 - Wallpaper no se modificó
function deps {
if ! command -v magick >/dev/null; then
printf '%s\n' "ImageMagick no disponible, instálelo"
return 10
else
return 0
fi
}
# Obtener resolución de pantalla
read -r RES < /sys/class/graphics/fb0/virtual_size
# Path wallpapers
DIR_WALL="$HOME/Datos/Imágenes/Wallpapers"
# Obtener una lista de los archivos de imagen en el directorio de wallpapers
WALL=("$DIR_WALL"/*.{jpg,jpeg,png})
# Obtener un número aleatorio entre 0 y la cantidad de archivos de imagen en la lista
((RAND_INDEX=RANDOM % ${#WALL[@]}))
# Obtener el nombre del archivo de imagen seleccionado
RAND_IMG="${WALL[$RAND_INDEX]}"
if deps; then
# Comprobar que el archivo seleccionado exista
if [[ -f $RAND_IMG ]]; then
# Si el archivo existe, configurarlo como wallpaper
display -resize "!${RES/,/x}" -window root "$RAND_IMG"
exit 0
else
print "El archivo $RAND_IMG no existe."
if [[ ! -f $RAND_IMG ]]; then
((RAND_INDEX=RANDOM % ${#WALL[@]}))
RAND_IMG="${WALL[$RAND_INDEX]}"
display -resize "!${RES/,/x}" -window root "$RAND_IMG"
fi
exit 11
fi
else
exit 10
fi

138
varios/ksh/ksync_cloud.ksh Executable file
View File

@ -0,0 +1,138 @@
#!/bin/ksh
# v1.3
# Script para sincronizar nube remota de dropbpox
# Dependencias: rclone, rclonesync, dzen2
#
# Lista de códigos de salida
# 0 - éxito
# 9 - operación exitosa, pero no se transfirieron archivos
# 10 - error temporal de sincronización
# 11 - error por falta de conexión
# 12 - error de dependencia
# 13 - error no categorizado de otra manera
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
set -u # salir si una variable no ha sido declarada
########## Verificar que las dependencias estén instaladas ##########
function deps {
if ! command -v rclone >/dev/null; then
printf '%b' "\033[31;5m[ERROR] Instale el paquete 'rclone'\033[0m\n"
return 12
elif ! command -v dzen2 >/dev/null; then
printf '%b' "\033[31;5m[ERROR] Instale el paquete 'dzen2'\033[0m\n"
return 12
# El cliente rclone de forma nativa ya soporta le sincronización bidirecional, por esa razón
# las siguiente líneas de código han sido comentadas.
# elif ! command -v rclonesync >/dev/null; then
# printf '%b' "\033[31;5m[ERROR] No está disponible 'rclonesync' en el sistema. Clonado \
# repositorio para instalar el ejecutable...\033[0m\n"
# git -C /tmp clone https://github.com/cjnaz/rclonesync-V2.git --depth 1
# [ -d "$HOME"/.local/bin ] || mkdir -p "$HOME/.local/bin"
# cp /tmp/rclonesync-V2/rclonesync "$HOME"/.local/bin
# export PATH="$HOME/.local/bin:$PATH"
# return 12
fi
}
########## Directorio para base de datos ##########
WORKDIR="$HOME"/.config/rclone
TMPFILE=$(mktemp /tmp/dropbox.XXXXXXXXXX)
if [[ ! -f $WORKDIR/dropbox.txt ]]; then
find "$HOME/Dropbox" -type f -exec md5sum {} \; > "$WORKDIR"/dropbox.txt
fi
########## Eliminar algún archivo residual que pudiera haber quedado ##########
for FILE in /tmp/dropbox*; do
[[ -f $FILE ]] || continue
rm "$FILE"
done
########## Sincronizar nube remota ##########
function check_diff {
find "$HOME/Datos/Dropbox" -type f -exec md5sum {} \; > "$TMPFILE"
DIFF=$(diff -q "$WORKDIR/dropbox.txt" "$TMPFILE")
if [[ -z $DIFF ]]; then
return 9
fi
}
# Rclone ya integra de forma nativa la sincronizacion bidireccional
#function sync {
# rclonesync "$HOME"/Dropbox MiDropbox: --check-access --check-filename=RCLONE_TEST \
# --filters-file "$HOME"/.config/rclone/Filtro.txt --rclone-args --copy-links \
# --multi-thread-streams=14 --transfers=14 >> "$HOME"/.config/rclone/log 2>&1
#}
#function first_sync {
# rclonesync "$HOME"/Dropbox MiDropbox: --first-sync --check-access --check-filename=RCLONE_TEST \
# --filters-file "$HOME"/.config/rclone/Filtro.txt --rclone-args --copy-links \
# --multi-thread-streams=14 --transfers=14 >> "$HOME"/.config/rclone/log 2>&1
#}
function first_sync {
/usr/bin/rclone bisync "$HOME"/Dropbox MiDropbox: --resync --check-access --check-filename=RCLONE_TEST \
--filters-file "$HOME"/.config/rclone/Filtro.txt --remove-empty-dirs --color AUTO --copy-links \
--multi-thread-streams=4 --transfers=8 --log-file "$HOME"/.config/rclone/dropbox.log 2>&1
}
function sync {
/usr/bin/rclone bisync "$HOME"/Dropbox MiDropbox: --check-access --check-filename=RCLONE_TEST \
--filters-file "$HOME"/.config/rclone/Filtro.txt --remove-empty-dirs --color AUTO --copy-links \
--multi-thread-streams=4 --transfers=8 --log-file "$HOME"/.config/rclone/dropbox.log 2>&1
}
function msg {
dzen2 -p 8 -e 'onstart=uncollapse' -fn 'JetBrains Mono:size=8:style=bold' -ta c \
-sa c -w 260 -x 1100 -y 25 -l 1
}
if deps; then
if check_diff; then
if ping -A -c 3 1.1.1.1 >/dev/null; then
if sync; then
print "Dropbox sincronizado" | msg &
print "Dropbox sincronizado"
mv "$TMPFILE" "$WORKDIR/dropbox.txt"
exit 0
else
first_sync
print "Dropbox sincronizado" | msg &
print "Dropbox sincronizado"
exit 10
fi
elif [[ $(ping -A -c 3 1.1.1.1 >/dev/null) == 1 ]]; then
printf '%s\n' "No se pudo sincronizar Dropbox" "Sin conexión a internet" | msg &
print "No se pudo sincronizar Dropbox. Sin conexión a internet\\n"
rm "$TMPFILE"
exit 11
else
rm "$TMPFILE"
printf '%s\n' "Ocurrieron errores" "Revisar el log" | msg &
print "Ocurrieron errores. Revisar el log\\n"
exit 13
fi
else
rm "$TMPFILE"
print "Operación exitosa, pero no se transfirieron archivos\\n"
exit 9
fi
fi
print "ERROR: Dependencias no satisfechas. Este script requiere tener instalado:"
#print "\\trclone\\n" "\\trclonesync\\n" "\\tdzen2\\n"
print "\\trclone\\n" "\\tdzen2\\n"
exit 12

49
varios/ksh/kupdates-void.ksh Executable file
View File

@ -0,0 +1,49 @@
#!/bin/ksh
# Script que revisa si existen actualizaciones disponibles para el sistema
# Dependencas: dzen2
#
# Lista de códigos de salida
# 0 - Operación exitosa
# 1 - Dependencia no cumplida
# 3 - Paquetes rotos
# 4 - Operación exitosa, pero no hubo cambios
#
# NOTA: count_lines es una función personalizada de ksh
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org> 2022 - 2023
TMP_UPDATES=$(mktemp -d /tmp/updates_void.XXXX)
xbps-install -nuM 1>${TMP_UPDATES}/updates 2>${TMP_UPDATES}/error
UPDATES="$(count_lines ${TMP_UPDATES}/updates)"
BROKEN="$(< ${TMP_UPDATES}/error)"
PKGS="$(awk '{printf "%-25s %s\n", $1, $2}' ${TMP_UPDATES}/updates)"
function deps {
if ! command -v dzen2 >/dev/null; then
printf '%b\n' "Dependencia no satisfecha:\n\tInstale dzen2\n"
exit 1
fi
}
function msg {
dzen2 -p -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
-w 260 -x 1100 -y 25 -l 10
}
if deps; then
if [[ -z $BROKEN && -n $UPDATES ]]; then
"$HOME"/Dropbox/Gitea/scripts/varios/dunst_sound 2> /dev/null
printf '%s\n' "ACTUALIZACIONES DISPONIBLES: $UPDATES" "$PKGS" | msg &
rm -r ${TMP_UPDATES}
exit 0
elif [[ -n $BROKEN ]]; then
printf '%s\n' "HAY PAQUETES ROTOS" "$(awk '{printf "%-30s %s\n", $1, $5}' \
${TMP_UPDATES}/error)" | msg &
rm -r ${TMP_UPDATES}
exit 3
else
[[ -z $UPDATES ]] || rm -r ${TMP_UPDATES}
exit 4
fi
fi

71
varios/ksh/kusb.ksh Executable file
View File

@ -0,0 +1,71 @@
#!/bin/ksh
#usb v2.1
# Dependencias: udevil, dzen2
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
script="${0##*/}"
function ayuda {
printf %s "\
Script para montar y desmontar dispositivos a través de devmon
Modo de uso:
$script [-muUh]
Opciones:
-m Montar dispositivo extraible
-u Desmontar dispositivo extraible
-U Desmontar último pendrive insertado
-h Mostrar ayuda
"
}
SUDO=$(which_sudo)
function do_install {
if [ "$SUDO" == su ]; then
su root -c 'xbps-install "$@"' -- sh "$@"
else
$SUDO xbps-install "$@"
fi
}
if ! command -v udevil >/dev/null; then
printf '%b' "\033[31;5m[ERROR] No se encontró instalado el paquete 'udevil'\033[0m\n"
printf '%b' "\033[31;1mPreparándose para instalar el paquete 'udevil'...\033[0m\n"
do_install -Sy udevil
elif ! command -v dzen2 >/dev/null; then
printf '%b' "\033[31;5m[ERROR] No se encontró instalado el paquete 'udevil'\033[0m\n"
printf '%b' "\033[31;1mPreparándose para instalar el paquete 'udevil'...\033[0m\n"
do_install -Sy dzen2
fi
function msg {
dzen2 -p 8 -e 'onstart=uncollapse' -fn 'JetBrains Mono:size=8:style=bold' -ta c \
-sa c -w 260 -x 1100 -y 25 -l 1
}
case $1 in
-m)
# Montar dispositivo extraible
devmon --sync --exec-on-device %f "printf '%s\n' 'Dispositivo USB' 'Listo para usarse'" | msg &
break
;;
-u)
# Desmontar dispositivo
devmon --unmount /media/"$USER"/* && pkill -9 udevil
sleep 2; printf '%s\n' "DISPOSITIVO USB" "Puede retirarlo con seguridad" | msg &
break
;;
-U)
# Desmontar último pendrive insertado
devmon --unmount-recent && sleep 2; printf '%s\n' "DISPOSITIVO USB" "Puede retirarlo con seguridad" | msg &
break
;;
-h|--help|*)
ayuda
esac
exit 0

14
varios/ksh/kvolume.ksh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/ksh
# Script que muestra el porcentaje activo del volumen del sistema
# Dependencias: alsa-utils
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
STATUS=$(amixer get Master | awk -F'[][]' 'END{ print $6 }')
LEVEL=$(amixer get Master | awk -F'[][]' 'END{ print $2 }')
if [[ $STATUS == on ]]; then
print "VOL $LEVEL"
else
print "VOL mute"
fi

67
varios/ksh/kxpkglocal.ksh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/ksh
# Script para consultar el sitio de origen del paquete (upstream) en busca de nuevas versiones.
# Se recomienda añadir este script en una tarea de crontab
# Dependencias: xbps-src, xtools, dzen2
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
set -u
TMP_DIR=$(mktemp -d /tmp/xpkglocal.XXXXX)
SUDO=$(which_sudo)
function do_install {
if [[ $SUDO == su ]]; then
su root -c 'xbps-install "$@"' -- sh "$@"
else
"$SUDO" xbps-install "$@"
fi
}
function msg {
dzen2 -p -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
-w 260 -x 1100 -y 25 -l 20
}
# Verificar que las dependencias estén instaladas
if ! command -v xpkg >/dev/null; then
printf '%s\n' "Instalando paquete xtools"
do_install -Sy xtools
elif ! command -v dzen2 > /dev/null; then
printf '%s\n' "Instalando paquete dzen2"
do_install -Sy dzen2
fi
if [ ! -f "$HOME"/void-packages/xbps-src ]; then
printf '%s\n' "No se encontró repositorio git de Void Linux. Clonadolo..."
git -C "$HOME" clone --depth=1 https://github.com/void-linux/void-packages.git
cd "$HOME"/void-packages || exit
./xbps-src binary-bootstrap
print XBPS_ALLOW_RESTRICTED=yes >> etc/conf
fi
# Crear lista de actualizaciones disponibles
:> "${TMP_DIR}"/releases
cd "$HOME"/void-packages || exit
for package in $(xpkg -m); do
./xbps-src update-check "$package" | tail -n 1 | tee -a "${TMP_DIR}"/releases > /dev/null
done
uniq "${TMP_DIR}"/releases > "${TMP_DIR}"/upstream_releases
UPDATES="$(count_lines ${TMP_DIR}/upstream_releases)"
RELEASES="$(awk '{printf "%-25s %s\n", $1, $3}' ${TMP_DIR}/upstream_releases)"
if [[ -n $UPDATES ]]; then
print "$RELEASES"
printf '%s\n' "ACTUALIZACIONES EN UPSTREAM: $UPDATES" "$RELEASES" | msg &
rm -r ${TMP_DIR}
exit 0
else
rm -r ${TMP_DIR}
fi

68
varios/ksh/merge-video.ksh Executable file
View File

@ -0,0 +1,68 @@
#!/bin/ksh
#
# NOTA: este script aún está en fase de pruebas
# Convertir audio ogg a aac
# ffmpeg -i input.ogg -strict experimental -acodec aac output.aac
#
# Añadir audio a video
# ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a copy videoconaudio.mp4
#
# Cortar video
# Con -ss estoy indicando que tome el video a partir del minuto 00:05:10 y luego
# con -to 00:15:30 indico que relice un corte de video con duración de 10 minutos
# y 20 segundos
# ffmpeg -i input.mp4 -ss 00:05:10 -to 00:15:30 -c:v copy -c:a copy output2.mp4
#
# Para quitar audio a un video hacerlo del siguiente modo:
# ffmpeg -i $input_file -c copy -an $output_file
#
# Para unir videos primero crear un archivo de texto con el nombre de los videos a unir:
# vim lista.txt
# file 1.mp4
# file 2.mp4
#
# Unir los videos:
# ffmpeg -f concat -i lista.txt -c copy output.mp4
#
# Dependencias: ffmpeg, find
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
script="${0##*/}"
function ayuda {
printf %s "\
Modo de uso: $script [OPCIÓN] [FICHERO, /path]
Ejemplos:
$script -c /path/file START END
$script --merge /path
Selección e interpretación de opciones:
-c, --cut Crea un clip cuya duaración estará basada en el punto de inicio y el punto final que
se indique del video de origen.
-m, --merge Fusiona audio y video
-h, --help Muestra esta ayuda y sale.
NOTA: Los argumentos START y END espeficarlos en formato de tiempo, ejemplo: 00:10:15 (horas, minutos y segundos)
"
}
case "$1" in
--cut|-c)
ffmpeg -i "$2" -ss "$3" -to "$4" -c:v copy -c:a copy "$(date '+%y%m%d_%H%M%S').mp4"
;;
--merge|-m)
if [[ -n $(count $2/*.oga) && -n $(count $2/*.mp4) ]]; then
cd $2 || exit
mv ./*.oga input.oga && mv video*.mp4 input.mp4
ffmpeg -i input.oga -strict experimental -acodec aac audio.aac
ffmpeg -i input.mp4 -i audio.aac -c:v copy -c:a copy "$(date '+%y%m%d_%H%M%S').mp4"
mv input.* audio.aac "$HOME"/.local/share/Trash/files
fi
;;
--help|-h|*)
ayuda
esac

106
varios/ksh/purge_pkgs.ksh Executable file
View File

@ -0,0 +1,106 @@
#!/bin/ksh
#
# Script que elimina paquetes de la caché que ya no están instalados en el sistema
#
# NOTA: En caso de usar doas, es necesario que en el archivo de configuración se
# tenga configurada la persistencia, de lo contrario por cada archivo por eliminar
# será necesario confirmar introduciendo lo contraseña.
#
# Lista de códigos de salida
# 0 - éxito
# 9 - operación exitosa, pero no se encontraron archivos para eliminar
# 10 - operación exitosa, pero no se eliminaron los archivos encontrados
# 11 - respuesta seleccionada inválida
# 12 - mensaje de ayuda mostrado
#
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
script="${0##*/}"
function ayuda {
printf %s "\
$script ayuda a eliminar definitivamente aquellos paquetes que quedan guardados en la caché del sistema.
Modo de uso:
$script <argumento>
--list | -l Muestra una lista de los paquetes que la no están en uso
--help | -h Muestra este mensaje de ayuda
"
}
# Identificar cómo escalar permisos de administrador
function admin {
if command -v sudo >/dev/null && sudo -l | grep -q -e ' ALL$' -e xbps-install; then
print sudo
elif command -v doas >/dev/null && [ -f /etc/doas.conf ]; then
print doas
elif [[ $(id -u) != 0 ]]; then
print su
fi
}
cache_dir=/var/cache/xbps
_arch=$(xbps-uhelper arch) # Obtener arquitectura
function lista {
# Obtener lista de paquetes instalados en el sistema
xbps-query -l | awk '{print $2}' > /tmp/installed.txt
# Obtener lista de paquetes en la caché del sistema
for package in /var/cache/xbps/*.xbps; do
base=${package##*/}
print "${base%."$_arch".xbps}"
done > /tmp/cache.txt
_diff=$(diff /tmp/cache.txt /tmp/installed.txt | awk '/</ {print $2}')
if [[ -n $_diff ]]; then
# Mostrar lista de paquetes que no están en la caché y que no se encuentran instalados
printf '%s\n\n' "Los siguiente paquetes ya no se encuentran instalados en el sistema:"
printf '%s\n' $_diff | column
else
printf '%s\n\n' "No hay paquetes por eliminar"
exit 9
fi
}
case $1 in
-l|--list)
lista
printf '\n%s\n' "¿Deseas eliminar los paquetes? s/n"
read -r respuesta
case "$respuesta" in
[sS])
diff /tmp/cache.txt /tmp/installed.txt | awk '/</ {print $2}' > /tmp/delete.txt
print "Ingrese la contraseña de administrador:"
print "Eliminando los paquetes..."
while read -r pkg; do
cmd=$(admin)
if [ "$cmd" = "sudo" ]; then
sudo rm -fv "${cache_dir}/${pkg}.${_arch}.xbps"
elif [ "$cmd" = "doas" ]; then
doas rm -fv "${cache_dir}/${pkg}.${_arch}.xbps"
elif [ "$cmd" = "su" ]; then
su -c "rm -fv ${cache_dir}/${pkg}.${_arch}.xbps"
fi
done < /tmp/delete.txt
rm -f /tmp/*.txt
exit 0
;;
[nN])
rm -f /tmp/*.txt
exit 10
;;
*)
print "Respuesta inválida."
rm -f /tmp/*.txt
exit 11
esac
;;
-h|--help|*)
ayuda
exit 12
esac