Compare commits
14 Commits
66fdcc5b8b
...
187d1eaeda
Author | SHA1 | Date |
---|---|---|
Tuxliban Torvalds | 187d1eaeda | |
Tuxliban Torvalds | b5c7edbc0d | |
Tuxliban Torvalds | a4fbd124da | |
Tuxliban Torvalds | 935ade622c | |
Tuxliban Torvalds | 2f1364820e | |
Tuxliban Torvalds | c16fcaab3e | |
Tuxliban Torvalds | 24c634b943 | |
Tuxliban Torvalds | beaf9f4530 | |
Tuxliban Torvalds | 96e50d8d5c | |
Tuxliban Torvalds | 4b70abf8e0 | |
Tuxliban Torvalds | bb91583e34 | |
Tuxliban Torvalds | 5f5d96ba11 | |
Tuxliban Torvalds | 296564c092 | |
Tuxliban Torvalds | 201872a69b |
|
@ -1,9 +1,8 @@
|
|||
# Añadir esta configuración en /root/.profile para personalizar el prompt para root
|
||||
|
||||
function admin_prompt
|
||||
{
|
||||
[[ $PWD == $HOME ]] && dir="~" || dir="${PWD#*/}"
|
||||
print "${YELLOW}[$dir] ${GREEN}#${RED} "
|
||||
function admin_prompt {
|
||||
[[ $PWD == $HOME ]] && dir="~" || dir="${PWD#*/}"
|
||||
print "${YELLOW}[$dir] ${GREEN}#${RED} "
|
||||
}
|
||||
|
||||
PS1="\$(admin_prompt) "
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
function calc {
|
||||
# Comprobar si el comando bc está instalado
|
||||
if ! command -v bc >/dev/null 2>&1; then
|
||||
print "Error: bc no está instalado." >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Comprobar si se proporcionó una expresión matemática
|
||||
if [[ $# -eq 0 ]]; then
|
||||
print "Uso: calc EXPRESIÓN" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
bc -l <<<"$*"
|
||||
}
|
|
@ -1,11 +1,12 @@
|
|||
# Contar archivos o directorios en el directorio
|
||||
# Esto funciona pasando la salida del glob a la función y luego contando el número de argumentos.
|
||||
|
||||
function count
|
||||
{
|
||||
# Uso:
|
||||
# count /path/to/dir/* -> Total (archivos y directorios)
|
||||
# count /path/to/dir/*/ -> Total de directorios
|
||||
|
||||
[[ -e $1 ]] && print "$#" || print 0
|
||||
function count {
|
||||
if [[ $# -eq 0 ]]; then
|
||||
print "count /path/to/dir/* -> Total (archivos y directorios)" >&2
|
||||
print "count /path/to/dir/*/ -> Total de directorios" >&2
|
||||
return 1
|
||||
elif
|
||||
[[ -e $1 ]] && print "$#" || print 0
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
# Obtener el número de líneas de un fichero
|
||||
|
||||
function count_lines
|
||||
{
|
||||
lines=0
|
||||
|
||||
while IFS= read -r line || [[ -n $line ]]; do
|
||||
# lines=$((lines+1)) is slower than ((lines=lines+1))
|
||||
((lines=lines+1))
|
||||
done < "$1"
|
||||
|
||||
printf '%s\n' "$lines"
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
# Obtener el número de líneas de un fichero
|
||||
|
||||
function countl
|
||||
{
|
||||
lines=0
|
||||
|
||||
while IFS= read -r line || [[ -n $line ]]; do
|
||||
((lines=lines+1))
|
||||
done < "$1"
|
||||
|
||||
printf '%s\n' "$lines"
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
# Extrar archivos comprimidos y/o empaquetados
|
||||
|
||||
function ex
|
||||
{
|
||||
if [ -f "$1" ]; then
|
||||
case $1 in
|
||||
*.tar.bz2)
|
||||
bsdtar -xvjf "$1"
|
||||
;;
|
||||
*.tar.gz)
|
||||
bsdtar -xvzf "$1"
|
||||
;;
|
||||
*.rar)
|
||||
bsdtar -xf "$1"
|
||||
;;
|
||||
*.tar.xz)
|
||||
bsdtar -xvjf "$1"
|
||||
;;
|
||||
*.zip)
|
||||
bsdtar -xf "$1"
|
||||
;;
|
||||
*.7z)
|
||||
bsdtar -xf "$1"
|
||||
;;
|
||||
*)
|
||||
print "El archivo $1 no puede ser extraído. Formato desconocido"
|
||||
esac || return 1
|
||||
fi
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
# Extrar archivos comprimidos y/o empaquetados
|
||||
|
||||
function ex
|
||||
{
|
||||
if [ -f "$1" ]; then
|
||||
case $1 in
|
||||
*.tar.bz2)
|
||||
bsdtar -xvjf "$1"
|
||||
;;
|
||||
*.tar.gz)
|
||||
bsdtar -xvzf "$1"
|
||||
;;
|
||||
*.rar)
|
||||
bsdtar -xf "$1"
|
||||
;;
|
||||
*.tar.xz)
|
||||
bsdtar -xvjf "$1"
|
||||
;;
|
||||
*.zip)
|
||||
bsdtar -xf "$1"
|
||||
;;
|
||||
*.7z)
|
||||
bsdtar -xf "$1"
|
||||
;;
|
||||
*)
|
||||
print "El archivo $1 no puede ser extraído. Formato desconocido"
|
||||
esac || return 1
|
||||
fi
|
||||
}
|
|
@ -1,11 +1,10 @@
|
|||
# Mostrar rama actual en directorios de git
|
||||
|
||||
function get_branch
|
||||
{
|
||||
BRANCH=$(git rev-parse --abbrev-ref HEAD 2> /dev/null)
|
||||
if [[ ! -z ${BRANCH} ]]; then
|
||||
print "${BRANCH}"
|
||||
fi
|
||||
function get_branch {
|
||||
BRANCH=$(git rev-parse --abbrev-ref HEAD 2> /dev/null)
|
||||
if [[ ! -z ${BRANCH} ]]; then
|
||||
print "${BRANCH}"
|
||||
fi
|
||||
|
||||
unset BRANCH
|
||||
unset BRANCH
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# Mostrar directorio de trabajo actual
|
||||
|
||||
function get_dir
|
||||
{
|
||||
printf '%s\n' ${PWD/$HOME/\~}
|
||||
function get_dir {
|
||||
printf '%s\n' ${PWD/$HOME/\~}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# Versión Korn Shell de basename
|
||||
|
||||
function kbasename {
|
||||
|
||||
# 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
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
# Versión Korn Shell de dirname
|
||||
|
||||
function kdirname {
|
||||
# Comprobar argumentos
|
||||
if (($# ==0 || $# > 1)); then
|
||||
print "Uso: ${0##*/} string"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtener el nombre del directorio
|
||||
print ${1%/*}
|
||||
}
|
|
@ -1,13 +1,12 @@
|
|||
# Mostrar los manuales de los programa con color
|
||||
|
||||
function man
|
||||
{
|
||||
LESS_TERMCAP_mb=$(printf %b "\033[1;31m") \
|
||||
LESS_TERMCAP_md=$(printf %b "\033[1;31m") \
|
||||
LESS_TERMCAP_me=$(printf %b "\033[0m") \
|
||||
LESS_TERMCAP_se=$(printf %b "\033[0m") \
|
||||
LESS_TERMCAP_so=$(printf %b "\033[1;44;33m") \
|
||||
LESS_TERMCAP_ue=$(printf %b "\033[0m") \
|
||||
LESS_TERMCAP_us=$(printf %b "\033[1;32m") \
|
||||
command man -a "$@"
|
||||
function man {
|
||||
LESS_TERMCAP_mb=$(printf %b "\033[1;31m") \
|
||||
LESS_TERMCAP_md=$(printf %b "\033[1;31m") \
|
||||
LESS_TERMCAP_me=$(printf %b "\033[0m") \
|
||||
LESS_TERMCAP_se=$(printf %b "\033[0m") \
|
||||
LESS_TERMCAP_so=$(printf %b "\033[1;44;33m") \
|
||||
LESS_TERMCAP_ue=$(printf %b "\033[0m") \
|
||||
LESS_TERMCAP_us=$(printf %b "\033[1;32m") \
|
||||
command man -a "$@"
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# Crear un directorio y cambiar a él
|
||||
|
||||
function mkcd
|
||||
{
|
||||
mkdir -p -- "$1" || return
|
||||
cd -P -- "$1"
|
||||
function mkcd {
|
||||
mkdir -p -- "$1" || return
|
||||
cd -P -- "$1"
|
||||
}
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
# Prompt para usuario normal
|
||||
|
||||
function prompt
|
||||
{
|
||||
print "${GREEN}${PWD/$HOME/\~} ${CYAN}$(get_branch)"
|
||||
print "${RED}-> ${YELLOW}$ ${NORM}"
|
||||
function prompt {
|
||||
print "${GREEN}${PWD/$HOME/\~} ${CYAN}$(get_branch)"
|
||||
print "${RED}-> ${YELLOW}$ ${NORM}"
|
||||
}
|
||||
|
||||
PS1="\$(prompt) "
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# Consultar manuales de programa remotos
|
||||
|
||||
rman() {
|
||||
if command -v lynx >/dev/null; then
|
||||
lynx https://man.voidlinux.org/x86_64/"$@"
|
||||
return 0
|
||||
else
|
||||
print "Instale el programa lynx"
|
||||
return 1
|
||||
fi
|
||||
if command -v lynx >/dev/null; then
|
||||
lynx https://man.voidlinux.org/x86_64/"$@"
|
||||
return 0
|
||||
else
|
||||
print "Instale el programa lynx"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Consultar qué versión de shell korn se tiene en el sistema
|
||||
|
||||
ver() {
|
||||
printf '%s\n' "Korn Shell: ${KSH_VERSION:-desconocida}"
|
||||
printf '%s\n' "Korn Shell: ${KSH_VERSION:-desconocida}"
|
||||
}
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
# Función que se encarga de determinar qué programa usar para escalar
|
||||
# permisos de administrador
|
||||
|
||||
function which_sudo
|
||||
{
|
||||
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
|
||||
function which_sudo {
|
||||
if [[ $(id -u) == 0 ]]; then
|
||||
return
|
||||
elif command -v sudo >/dev/null && id | grep -q wheel; then
|
||||
print sudo
|
||||
elif command -v doas >/dev/null && [ -f /etc/doas.conf ]; then
|
||||
print doas
|
||||
else
|
||||
print su
|
||||
fi
|
||||
}
|
||||
|
|
133
varios/docx2.sh
133
varios/docx2.sh
|
@ -1,7 +1,21 @@
|
|||
#!/bin/sh
|
||||
# Script para convertir documentos de word a PDF usando pandoc
|
||||
#
|
||||
# Dependencias xelatex, pandoc
|
||||
# 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: ${2%.*} y ${_file%.*}
|
||||
#
|
||||
# Dependencias lualatex, pandoc
|
||||
#
|
||||
# Shell: POSIX compliant
|
||||
# Autor: O. Sánchez <o-sanchez@linuxmail.org>
|
||||
|
@ -11,57 +25,80 @@
|
|||
script="${0##*/}"
|
||||
|
||||
# Revisar que las dependencias estén instaladas
|
||||
if ! command -v xelatex > /dev/null; then
|
||||
echo "Dependencia xelatex no encontrada en el sistema, instalándola..."
|
||||
doas xbps-install -Sy texlive-XeTeX
|
||||
elif ! command -v pandoc > /dev/null; then
|
||||
echo "Dependencia pandoc no encontrada en el sistema, instalándola..."
|
||||
doas xbps-install -Sy pandoc
|
||||
fi
|
||||
deps() {
|
||||
if ! command -v lualatex >/dev/null 2>&1; then
|
||||
echo "Error: 'texlive-LuaTeX' es requerido, instale el paquete"
|
||||
return 1
|
||||
elif ! command -v pandoc >/dev/null 2>&1; then
|
||||
echo "Error: 'pandoc' es requerido, instale el paquete"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
ayuda() {
|
||||
printf %s "\
|
||||
Convierte documentos docx a formato PDF.
|
||||
printf "%s" "\
|
||||
Nombre: $script
|
||||
Propósito: Convertir documentos docx a formato PDF o a texto plano (txt)
|
||||
|
||||
Uso: $script <arg> <directorio o archivo>
|
||||
Ejemplo:
|
||||
$script --conv /path/foo.docx Convierte archivo especificado
|
||||
$script -c /path/ Convierte archivos compatibles del directorio especificado
|
||||
Autor: O. Sánchez <o-sanchez@linuxmail.org> 2022 - 2023
|
||||
Versión: 1.0 (25/05/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
|
||||
--conv|-c)
|
||||
# Utilizar la sustitución de parámetros para obtener el nombre base del archivo
|
||||
FILENAME=${2##*/}
|
||||
|
||||
# Si el segundo argumento existe y es un archivo con extensión tipo 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=xelatex -o "${FILENAME%.*}.pdf"
|
||||
exit 0
|
||||
|
||||
# Comprobar que el segundo argumento exista y 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
|
||||
FILES=${file##*/}
|
||||
printf '%s' "Convirtiendo $FILES a formato PDF..."
|
||||
pandoc "$file" -V geometry:"top=2cm, bottom=1.5cm, left=2.4cm, right=2.4cm" \
|
||||
--pdf-engine=xelatex -o "${FILES%.*}.pdf"
|
||||
done
|
||||
exit 0
|
||||
else
|
||||
printf '%s' "\nERROR: el fichero o directorio no existe\n"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--help|-h|*)
|
||||
ayuda
|
||||
esac
|
||||
if deps; then
|
||||
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 ${2##*/} 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 ${2##*/} 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
|
||||
fi
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#!/bin/sh
|
||||
# V0.3.2
|
||||
# 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
|
||||
|
@ -7,6 +7,7 @@
|
|||
#
|
||||
# Dependencias: dzen2, wget
|
||||
#
|
||||
# Shell: POSIX compliant
|
||||
# Autor: O. Sánchez <o-sanchez@linuxmail.org>
|
||||
|
||||
msg() {
|
||||
|
@ -15,23 +16,23 @@ msg() {
|
|||
}
|
||||
|
||||
which_sudo() {
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
return
|
||||
elif command -v sudo >/dev/null && sudo -l | grep -q -e ' ALL$' -e xbps-install; then
|
||||
echo sudo
|
||||
elif command -v doas >/dev/null && [ -f /etc/doas.conf ]; then
|
||||
echo doas
|
||||
else
|
||||
echo su
|
||||
fi
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
return
|
||||
elif command -v sudo >/dev/null && id | grep -q wheel; then
|
||||
echo sudo
|
||||
elif command -v doas >/dev/null && [ -f /etc/doas.conf ]; then
|
||||
echo doas
|
||||
else
|
||||
echo su
|
||||
fi
|
||||
}
|
||||
|
||||
SUDO=$(which_sudo)
|
||||
admin=$(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
|
||||
$admin 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"
|
||||
|
@ -41,7 +42,7 @@ fi
|
|||
printf '%b' "\033[32;1mDescargando y copiando lista actualizada para fichero hosts...\033[0m\n"
|
||||
wget -O /tmp/hosts http://sbc.io/hosts/alternates/fakenews-gambling-porn/hosts
|
||||
"$HOME"/.local/bin/custom_sites
|
||||
$SUDO mv /tmp/hosts /etc/hosts
|
||||
$admin mv /tmp/hosts /etc/hosts
|
||||
"$HOME"/.local/bin/dunst_sound 2>/dev/null
|
||||
|
||||
# Notificacion de actualizacion del fichero
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
#!/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 &
|
|
@ -1,94 +0,0 @@
|
|||
#!/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
|
|
@ -1,35 +0,0 @@
|
|||
#!/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
|
|
@ -1,54 +1,67 @@
|
|||
#!/bin/ksh
|
||||
## Script que aleatoriza wallpaper
|
||||
## Dependencias: ImageMagick
|
||||
# v1.0 - 25/05/2023
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
# Script que aleatoriza wallpaper
|
||||
# Dependencias: ImageMagick
|
||||
#
|
||||
# Autor: O. Sánchez <o-sanchez@linuxmail.org>
|
||||
#
|
||||
# Lista de códigos de salida
|
||||
# 0 - éxito
|
||||
# 10 - Dependencia no satisfecha
|
||||
# 11 - Wallpaper no se modificó
|
||||
|
||||
# Función "deps" que se utiliza para verificar si ImageMagick está instalado
|
||||
function deps {
|
||||
# Si no se encuentra el comando "magick" (que es parte de ImageMagick) en el sistema,
|
||||
# mostrar un mensaje de error
|
||||
if ! command -v magick >/dev/null; then
|
||||
printf '%s\n' "ImageMagick no disponible, instálelo"
|
||||
return 10
|
||||
else
|
||||
# Si el comando "magick" está disponible, devolver un valor de 0 (éxito)
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Obtener resolución de pantalla
|
||||
read -r RES < /sys/class/graphics/fb0/virtual_size
|
||||
# Obtener la resolución de la pantalla
|
||||
read -r resolution < /sys/class/graphics/fb0/virtual_size
|
||||
|
||||
# Path wallpapers
|
||||
DIR_WALL="$HOME/Datos/Imágenes/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})
|
||||
# Arreglo que contiene los wallpapers en el directorio dir_wall con extensiones .jpg, .jpeg, .png y webp
|
||||
wall=("$dir_wall"/*.{jpg,jpeg,png,webp})
|
||||
|
||||
# Obtener un número aleatorio entre 0 y la cantidad de archivos de imagen en la lista
|
||||
((RAND_INDEX=RANDOM % ${#WALL[@]}))
|
||||
((rand_index=RANDOM % ${#wall[@]}))
|
||||
|
||||
# Obtener el nombre del archivo de imagen seleccionado
|
||||
RAND_IMG="${WALL[$RAND_INDEX]}"
|
||||
# Obtener la ruta completa del wallpaper seleccionado aleatoriamente
|
||||
rand_img="${wall[$rand_index]}"
|
||||
|
||||
# Verificar si ImageMagick está instalado
|
||||
if deps; then
|
||||
# Comprobar que el archivo seleccionado exista
|
||||
if [[ -f $RAND_IMG ]]; then
|
||||
if [[ -f $rand_img ]]; then
|
||||
|
||||
# Si el archivo existe, configurarlo como wallpaper
|
||||
display -resize "!${RES/,/x}" -window root "$RAND_IMG"
|
||||
display -resize "!${resolution/,/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"
|
||||
# Si el archivo no existe, mostrar un mensaje de error
|
||||
print "El archivo $rand_img no existe."
|
||||
|
||||
# Obtener un índice aleatorio nuevamente
|
||||
if [[ ! -f $rand_img ]]; then
|
||||
((rand_index=RANDOM % ${#wall[@]}))
|
||||
rand_img="${wall[$rand_index]}"
|
||||
display -resize "!${resolution/,/x}" -window root "$rand_img"
|
||||
fi
|
||||
|
||||
# Devolver un código de salida 11 (Wallpaper no se modificó)
|
||||
exit 11
|
||||
fi
|
||||
else
|
||||
|
||||
# Si ImageMagick no está instalado, devolver un código de salida 10 (Dependencia no satisfecha)
|
||||
exit 10
|
||||
fi
|
||||
|
|
|
@ -1,138 +0,0 @@
|
|||
#!/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
|
|
@ -1,4 +1,6 @@
|
|||
#!/bin/ksh
|
||||
# v1.0 - 25/05/2023
|
||||
#
|
||||
# Script que revisa si existen actualizaciones disponibles para el sistema
|
||||
# Dependencas: dzen2
|
||||
#
|
||||
|
@ -8,15 +10,15 @@
|
|||
# 3 - Paquetes rotos
|
||||
# 4 - Operación exitosa, pero no hubo cambios
|
||||
#
|
||||
# NOTA: count_lines es una función personalizada de ksh
|
||||
# NOTA: 'countl' es una función personalizada de ksh
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org> 2022 - 2023
|
||||
# Autor: O. Sánchez <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)"
|
||||
tmp_updates=$(mktemp -d /tmp/updates_void.XXXX)
|
||||
xbps-install -nuM 1>${tmp_updates}/updates 2>${tmp_updates}/error
|
||||
updates="$(countl ${tmp_updates}/updates)"
|
||||
broken="$(< ${tmp_updates}/error)"
|
||||
pkgs="$(awk '{printf "%-25s %s\n", $1, $2}' ${tmp_updates}/updates)"
|
||||
|
||||
|
||||
function deps {
|
||||
|
@ -32,18 +34,18 @@ function msg {
|
|||
}
|
||||
|
||||
if deps; then
|
||||
if [[ -z $BROKEN && -n $UPDATES ]]; 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}
|
||||
printf '%s\n' "ACTUALIZACIONES DISPONIBLES: $updates" "$pkgs" | msg &
|
||||
rm -rf ${tmp_updates}
|
||||
exit 0
|
||||
elif [[ -n $BROKEN ]]; then
|
||||
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}
|
||||
${tmp_updates}/error)" | msg &
|
||||
rm -rf ${tmp_updates}
|
||||
exit 3
|
||||
else
|
||||
[[ -z $UPDATES ]] || rm -r ${TMP_UPDATES}
|
||||
[[ -z $updates ]] || rm -rf ${tmp_updates}
|
||||
exit 4
|
||||
fi
|
||||
fi
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
#!/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
|
|
@ -4,18 +4,19 @@
|
|||
# Dependencias: xbps-src, xtools, dzen2
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
# v1.0
|
||||
|
||||
set -u
|
||||
|
||||
TMP_DIR=$(mktemp -d /tmp/xpkglocal.XXXXX)
|
||||
SUDO=$(which_sudo)
|
||||
tmp_dir=$(mktemp -d /tmp/xpkglocal.XXXXX)
|
||||
admin=$(which_sudo)
|
||||
|
||||
|
||||
function do_install {
|
||||
if [[ $SUDO == su ]]; then
|
||||
if [[ $admin == su ]]; then
|
||||
su root -c 'xbps-install "$@"' -- sh "$@"
|
||||
else
|
||||
"$SUDO" xbps-install "$@"
|
||||
$admin xbps-install "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -26,13 +27,12 @@ function msg {
|
|||
|
||||
|
||||
# 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
|
||||
for cmd in xpkg dzen2; do
|
||||
if ! command -v $cmd >/dev/null 2>&1; then
|
||||
printf '%b' "\033[31;5m[ERROR] '$cmd' es requerido, instalando el paquete...\033[0m\n"
|
||||
do_install $cmd
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -f "$HOME"/void-packages/xbps-src ]; then
|
||||
printf '%s\n' "No se encontró repositorio git de Void Linux. Clonadolo..."
|
||||
|
@ -43,25 +43,25 @@ if [ ! -f "$HOME"/void-packages/xbps-src ]; then
|
|||
fi
|
||||
|
||||
# Crear lista de actualizaciones disponibles
|
||||
:> "${TMP_DIR}"/releases
|
||||
:> "${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
|
||||
./xbps-src update-check "$package" | tail -n 1 | tee -a "${tmp_dir}"/releases > /dev/null 2>&1
|
||||
done
|
||||
|
||||
uniq "${TMP_DIR}"/releases > "${TMP_DIR}"/upstream_releases
|
||||
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)"
|
||||
updates="$(countl ${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}
|
||||
if [[ -n $updates ]]; then
|
||||
print "$releases"
|
||||
printf '%s\n' "ACTUALIZACIONES EN UPSTREAM: $updates" "$releases" | msg &
|
||||
rm -rf ${tmp_dir}
|
||||
exit 0
|
||||
else
|
||||
rm -r ${TMP_DIR}
|
||||
rm -rf ${tmp_dir}
|
||||
fi
|
||||
|
||||
|
|
|
@ -1,106 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
#!/bin/sh
|
||||
# v1.3
|
||||
#
|
||||
# v1.4
|
||||
# Script para sincronizar nube remota de dropbpox
|
||||
# Dependencias: rclone, rclonesync, dzen2
|
||||
# Dependencias: rclone, dzen2, rclonesync (opcional)
|
||||
#
|
||||
# Lista de códigos de salida
|
||||
# 0 - éxito
|
||||
|
@ -21,95 +22,154 @@ set -u # salir si una variable no ha sido declarada
|
|||
########## Verificar que las dependencias estén instaladas ##########
|
||||
|
||||
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
|
||||
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
|
||||
for cmd in rclone dzen2; do
|
||||
if ! command -v $cmd >/dev/null 2>&1; then
|
||||
printf '%b' "\033[31;5m[ERROR] '$cmd' es requerido, instale el paquete\033[0m\n"
|
||||
return 12
|
||||
fi
|
||||
done
|
||||
|
||||
# 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.
|
||||
|
||||
# if ! command -v rclonesync >/dev/null; then
|
||||
# echof '%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)
|
||||
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
|
||||
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"
|
||||
for _file in /tmp/dropbox*; do
|
||||
[ -f "$_file" ] || continue
|
||||
rm "$_file"
|
||||
done
|
||||
|
||||
|
||||
########## Sincronizar nube remota ##########
|
||||
|
||||
check_diff() {
|
||||
find "$HOME/Datos/Dropbox" -type f -exec md5sum {} \; > "$TMPFILE"
|
||||
DIFF=$(diff -q "$WORKDIR/dropbox.txt" "$TMPFILE")
|
||||
if [ -z "$DIFF" ]; then
|
||||
find "$HOME/Datos/Dropbox" -type f -exec md5sum {} \; > "$tmpfile"
|
||||
_diff=$(diff -q "$workdir/dropbox.txt" "$tmpfile")
|
||||
if [ -z "$_diff" ]; then
|
||||
return 9
|
||||
fi
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
# Rclone ya integra de forma nativa la sincronizacion bidireccional
|
||||
# sync() {
|
||||
# "$HOME"/.local/bin/rclonesync "$HOME"/Dropbox MiDropbox: \
|
||||
# --check-access \
|
||||
# --check-filename=RCLONE_TEST \
|
||||
# --filters-file "$HOME"/.config/rclone/Filtro.txt \
|
||||
# --max-deletes 75 \
|
||||
# --rclone-args \
|
||||
# --copy-links \
|
||||
# --multi-thread-streams=4 \
|
||||
# --transfers=8 >> "$HOME"/.config/rclone/rclonesync.log 2>&1
|
||||
# }
|
||||
|
||||
# first_sync() {
|
||||
# "$HOME"/.local/bin/rclonesync "$HOME"/Dropbox MiDropbox: \
|
||||
# --first-sync \
|
||||
# --check-access \
|
||||
# --check-filename=RCLONE_TEST \
|
||||
# --filters-file "$HOME"/.config/rclone/Filtro.txt \
|
||||
# --max-deletes 75 \
|
||||
# --rclone-args \
|
||||
# --copy-links \
|
||||
# --multi-thread-streams=4 \
|
||||
# --transfers=8 >> "$HOME"/.config/rclone/rclonesync.log 2>&1
|
||||
# }
|
||||
|
||||
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
|
||||
/usr/bin/rclone bisync "$HOME"/Dropbox MiDropbox: \
|
||||
--resync \
|
||||
--check-access \
|
||||
--check-filename=RCLONE_TEST \
|
||||
--filters-file "$HOME"/.config/rclone/Filtro.txt \
|
||||
--max-delete 75 \
|
||||
--remove-empty-dirs \
|
||||
--color AUTO \
|
||||
--copy-links \
|
||||
--multi-thread-streams=4 \
|
||||
--transfers=8 \
|
||||
--log-file "$HOME"/.config/rclone/rclone.log 2>&1
|
||||
}
|
||||
|
||||
sync() {
|
||||
/usr/bin/rclone bisync "$HOME"/Dropbox MiDropbox: \
|
||||
--check-access \
|
||||
--check-filename=RCLONE_TEST \
|
||||
--filters-file "$HOME"/.config/rclone/Filtro.txt \
|
||||
--max-delete 75 \
|
||||
--remove-empty-dirs \
|
||||
--color AUTO \
|
||||
--copy-links \
|
||||
--multi-thread-streams=4 \
|
||||
--transfers=8 \
|
||||
--log-file "$HOME"/.config/rclone/rclone.log 2>&1
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
-sa c -w 260 -x 1100 -y 25 -l 1
|
||||
}
|
||||
|
||||
|
||||
if deps; then
|
||||
if check_diff; then
|
||||
if doas ping -A -q -c 3 1.1.1.1; then
|
||||
if ping -A -q -c 3 1.1.1.1 >/dev/null; then
|
||||
if sync; then
|
||||
echo "Dropbox sincronizado" | msg &
|
||||
mv "$TMPFILE" "$WORKDIR/dropbox.txt"
|
||||
echo "Dropbox sincronizado"
|
||||
mv "$tmpfile" "$workdir/dropbox.txt"
|
||||
exit 0
|
||||
else
|
||||
first_sync
|
||||
echo "Dropbox sincronizado" | msg &
|
||||
echo "Dropbox sincronizado"
|
||||
mv "$tmpfile" "$workdir/dropbox.txt"
|
||||
exit 10
|
||||
fi
|
||||
elif [ "$(ping -A -q -c 3 1.1.1.1)" -eq 1 ]; then
|
||||
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 &
|
||||
rm "$TMPFILE"
|
||||
printf '%s\n' "No se pudo sincronizar Dropbox. Sin conexión a internet"
|
||||
rm -f "$tmpfile"
|
||||
exit 11
|
||||
else
|
||||
rm "$TMPFILE"
|
||||
rm -f "$tmpfile"
|
||||
printf '%s\n' "Ocurrieron errores" "Revisar el log" | msg &
|
||||
printf '%s\n' "Ocurrieron errores. Revisar el log"
|
||||
exit 13
|
||||
fi
|
||||
else
|
||||
rm "$TMPFILE"
|
||||
rm -f "$tmpfile"
|
||||
printf '%s\n' "Operación exitosa, pero no se transfirieron archivos"
|
||||
exit 9
|
||||
fi
|
||||
fi
|
||||
|
||||
printf %s "\
|
||||
ERROR: Dependencias no satisfechas. Este script requiere tener instalado:
|
||||
rclone
|
||||
dzen2
|
||||
"
|
||||
|
||||
exit 12
|
||||
|
|
|
@ -5,15 +5,14 @@
|
|||
#
|
||||
# Shell: POSIX compliant
|
||||
# Autor: O. Sánchez <o-sanchez@linuxmail.org>
|
||||
# v1.0
|
||||
|
||||
set -u
|
||||
unset POSIXLY_CORRECT
|
||||
|
||||
TMP_DIR=$(mktemp /tmp/xpkglocal.XXXXXXXXXX)
|
||||
mkdir "${TMP_DIR}"
|
||||
TMP_DIR=$(mktemp -d /tmp/xpkglocal.XXXXXXXXXX)
|
||||
|
||||
which_sudo() {
|
||||
if command -v sudo >/dev/null && sudo -l | grep -q -e ' ALL$' -e xbps-install; then
|
||||
if command -v sudo >/dev/null && id | grep -q wheel; then
|
||||
echo sudo
|
||||
elif command -v doas >/dev/null && [ -f /etc/doas.conf ]; then
|
||||
echo doas
|
||||
|
@ -22,11 +21,13 @@ which_sudo() {
|
|||
fi
|
||||
}
|
||||
|
||||
admin=$(which_sudo)
|
||||
|
||||
do_install() {
|
||||
if [ "$SUDO" = su ]; then
|
||||
if [ "$admin" = su ]; then
|
||||
su root -c 'xbps-install "$@"' -- sh "$@"
|
||||
else
|
||||
$SUDO xbps-install "$@"
|
||||
$admin xbps-install "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -36,15 +37,11 @@ msg(){
|
|||
}
|
||||
|
||||
# Verificar que las dependencias estén instaladas
|
||||
if ! command -v xpkg >/dev/null; then
|
||||
printf '%s\n' "Instalando paquete xtools"
|
||||
SUDO=$(which_sudo)
|
||||
do_install -Sy xtools
|
||||
elif ! command -v dzen2 > /dev/null; then
|
||||
printf '%s\n' "Instalando paquete dzen2"
|
||||
SUDO=$(which_sudo)
|
||||
do_install -Sy dzen2
|
||||
fi
|
||||
for cmd in xpkg dzen2; do
|
||||
if ! command -v $cmd >/dev/null 2>&1; then
|
||||
printf '%b' "\033[31;5m[ERROR] '$cmd' es requerido, instalando el paquete...\033[0m\n"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -f "$HOME/void-packages/xbps-src" ]; then
|
||||
printf '%s\n' "No se encontró repositorio git de Void Linux. Clonadolo..."
|
||||
|
@ -71,8 +68,8 @@ RELEASES="$(awk '{print $1"\t"$3}' "${TMP_DIR}"/upstream_releases | column -t)"
|
|||
if [ "$UPDATES" -gt 0 ]; then
|
||||
printf '%s\n' "$RELEASES"
|
||||
printf '%s\n' "ACTUALIZACIONES EN UPSTREAM: $UPDATES" "$RELEASES" | msg &
|
||||
rm -rf ${TMP_DIR}
|
||||
exit 0
|
||||
else
|
||||
rm -rf ${TMP_DIR}
|
||||
fi
|
||||
|
||||
rm -r "$TMP_DIR"
|
||||
|
||||
exit 0
|
||||
|
|
Loading…
Reference in New Issue