radicale y infcloud funcionando
This commit is contained in:
+193
-66
@@ -1,101 +1,228 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
USERS_FILE="config/users"
|
||||
USERS_FILE="${USERS_FILE:-config/users}"
|
||||
DEFAULT_COST="${BCRYPT_COST:-12}"
|
||||
SKIP_RESTART="${SKIP_RESTART:-0}"
|
||||
|
||||
# --- Funciones auxiliares ---
|
||||
# --- Utilidades -------------------------------------------------------------
|
||||
|
||||
function ensure_users_file() {
|
||||
if [ ! -f "$USERS_FILE" ]; then
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Gestor de usuarios Radicale
|
||||
|
||||
Uso:
|
||||
./radicale_users.sh list
|
||||
./radicale_users.sh add <usuario> [--password <pwd> | --random]
|
||||
./radicale_users.sh passwd <usuario> [--password <pwd> | --random]
|
||||
./radicale_users.sh delete <usuario> [--force]
|
||||
./radicale_users.sh --help
|
||||
|
||||
Variables:
|
||||
USERS_FILE Ruta del archivo htpasswd (por defecto config/users)
|
||||
SKIP_RESTART Si vale 1, no reinicia el contenedor automáticamente
|
||||
BCRYPT_COST Coste para htpasswd -B (por defecto 12)
|
||||
|
||||
Sin argumentos se abre el menú interactivo original.
|
||||
EOF
|
||||
}
|
||||
|
||||
ensure_users_file() {
|
||||
if [[ ! -f "$USERS_FILE" ]]; then
|
||||
echo "⚠️ No existe $USERS_FILE. Creándolo..."
|
||||
mkdir -p config
|
||||
mkdir -p "$(dirname "$USERS_FILE")"
|
||||
touch "$USERS_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
function restart_radicale() {
|
||||
echo ""
|
||||
echo "🔄 Reiniciando contenedor Radicale..."
|
||||
docker compose restart radicale >/dev/null 2>&1 || true
|
||||
echo "✅ Radicale reiniciado correctamente."
|
||||
echo ""
|
||||
require_command() {
|
||||
if ! command -v "$1" >/dev/null 2>&1; then
|
||||
echo "❌ Necesitas '$1' instalado en el sistema." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function list_users() {
|
||||
maybe_restart() {
|
||||
if [[ "$SKIP_RESTART" == "1" ]]; then
|
||||
echo "⚠️ SKIP_RESTART=1, no se reiniciará Radicale automáticamente."
|
||||
return
|
||||
fi
|
||||
echo "🔄 Reiniciando contenedor Radicale..."
|
||||
docker compose restart radicale >/dev/null 2>&1 || true
|
||||
echo "✅ Radicale reiniciado."
|
||||
}
|
||||
|
||||
generate_password() {
|
||||
if command -v openssl >/dev/null 2>&1; then
|
||||
openssl rand -base64 18
|
||||
else
|
||||
date +%s | sha256sum | head -c 16
|
||||
fi
|
||||
}
|
||||
|
||||
prompt_password() {
|
||||
local pwd confirm
|
||||
read -rs -p "Introduce contraseña: " pwd
|
||||
echo ""
|
||||
read -rs -p "Confirma contraseña: " confirm
|
||||
echo ""
|
||||
if [[ "$pwd" != "$confirm" ]]; then
|
||||
echo "❌ Las contraseñas no coinciden." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "$pwd"
|
||||
}
|
||||
|
||||
htpasswd_update() {
|
||||
local user="$1" password="$2"
|
||||
# shellcheck disable=SC2016
|
||||
printf '%s\n%s\n' "$password" "$password" | htpasswd -B -C "$DEFAULT_COST" "$USERS_FILE" "$user" >/dev/null
|
||||
}
|
||||
|
||||
list_users() {
|
||||
ensure_users_file
|
||||
echo "👥 Usuarios actuales:"
|
||||
if [ -s "$USERS_FILE" ]; then
|
||||
cut -d':' -f1 "$USERS_FILE"
|
||||
if [[ -s "$USERS_FILE" ]]; then
|
||||
cut -d':' -f1 "$USERS_FILE" | sort
|
||||
else
|
||||
echo "(ninguno)"
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
function add_user() {
|
||||
cmd_add() {
|
||||
ensure_users_file
|
||||
read -rp "Ingrese el nombre de usuario nuevo: " user
|
||||
local user="$1" password="" random=0
|
||||
shift || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--password|-p) password="$2"; shift 2 ;;
|
||||
--random|-r) random=1; shift ;;
|
||||
--no-restart) SKIP_RESTART=1; shift ;;
|
||||
*) echo "❗ Opción desconocida: $1" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
if [[ -z "$user" ]]; then
|
||||
echo "❌ Debes indicar un usuario." >&2
|
||||
exit 1
|
||||
fi
|
||||
if grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' ya existe."
|
||||
return
|
||||
echo "⚠️ El usuario '$user' ya existe." >&2
|
||||
exit 1
|
||||
fi
|
||||
htpasswd -B "$USERS_FILE" "$user"
|
||||
restart_radicale
|
||||
if [[ $random -eq 1 ]]; then
|
||||
password="$(generate_password)"
|
||||
echo "🔐 Contraseña generada para '$user': $password"
|
||||
elif [[ -z "$password" ]]; then
|
||||
password="$(prompt_password)"
|
||||
fi
|
||||
htpasswd_update "$user" "$password"
|
||||
maybe_restart
|
||||
}
|
||||
|
||||
function edit_user() {
|
||||
cmd_passwd() {
|
||||
ensure_users_file
|
||||
read -rp "Ingrese el usuario a modificar: " user
|
||||
if ! grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' no existe."
|
||||
return
|
||||
local user="$1" password="" random=0
|
||||
shift || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--password|-p) password="$2"; shift 2 ;;
|
||||
--random|-r) random=1; shift ;;
|
||||
--no-restart) SKIP_RESTART=1; shift ;;
|
||||
*) echo "❗ Opción desconocida: $1" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
if [[ ! -n "$user" ]]; then
|
||||
echo "❌ Debes indicar usuario." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "✏️ Cambiando contraseña para '$user'..."
|
||||
htpasswd -B "$USERS_FILE" "$user"
|
||||
restart_radicale
|
||||
if ! grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' no existe." >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ $random -eq 1 ]]; then
|
||||
password="$(generate_password)"
|
||||
echo "🔐 Nueva contraseña generada: $password"
|
||||
elif [[ -z "$password" ]]; then
|
||||
password="$(prompt_password)"
|
||||
fi
|
||||
htpasswd_update "$user" "$password"
|
||||
maybe_restart
|
||||
}
|
||||
|
||||
function delete_user() {
|
||||
cmd_delete() {
|
||||
ensure_users_file
|
||||
read -rp "Ingrese el usuario a eliminar: " user
|
||||
local user="$1" force=0
|
||||
shift || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--force|-f) force=1; shift ;;
|
||||
--no-restart) SKIP_RESTART=1; shift ;;
|
||||
*) echo "❗ Opción desconocida: $1" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
if [[ -z "$user" ]]; then
|
||||
echo "❌ Debes indicar usuario." >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' no existe."
|
||||
return
|
||||
echo "⚠️ El usuario '$user' no existe." >&2
|
||||
exit 1
|
||||
fi
|
||||
read -rp "¿Estás seguro de eliminar '$user'? (s/n): " confirm
|
||||
if [[ "$confirm" =~ ^[sS]$ ]]; then
|
||||
sed -i "/^$user:/d" "$USERS_FILE"
|
||||
restart_radicale
|
||||
echo "❌ Usuario '$user' eliminado."
|
||||
else
|
||||
echo "🚫 Operación cancelada."
|
||||
if [[ $force -eq 0 ]]; then
|
||||
read -rp "¿Eliminar '$user'? (s/N): " confirm
|
||||
[[ "$confirm" =~ ^[sS]$ ]] || { echo "🚫 Operación cancelada."; return; }
|
||||
fi
|
||||
echo ""
|
||||
sed -i.bak "/^$user:/d" "$USERS_FILE"
|
||||
rm -f "${USERS_FILE}.bak"
|
||||
echo "❌ Usuario '$user' eliminado."
|
||||
maybe_restart
|
||||
}
|
||||
|
||||
# --- Menú interactivo ---
|
||||
while true; do
|
||||
echo "========================================"
|
||||
echo "🔐 GESTOR DE USUARIOS RADICALE"
|
||||
echo "========================================"
|
||||
echo "1️⃣ Listar usuarios"
|
||||
echo "2️⃣ Crear nuevo usuario"
|
||||
echo "3️⃣ Editar contraseña de usuario"
|
||||
echo "4️⃣ Eliminar usuario"
|
||||
echo "5️⃣ Salir"
|
||||
echo "----------------------------------------"
|
||||
read -rp "Selecciona una opción [1-5]: " opt
|
||||
echo ""
|
||||
# --- Menú interactivo legado -----------------------------------------------
|
||||
interactive_menu() {
|
||||
while true; do
|
||||
echo "========================================"
|
||||
echo "🔐 GESTOR DE USUARIOS RADICALE"
|
||||
echo "========================================"
|
||||
echo "1️⃣ Listar usuarios"
|
||||
echo "2️⃣ Crear nuevo usuario"
|
||||
echo "3️⃣ Editar contraseña de usuario"
|
||||
echo "4️⃣ Eliminar usuario"
|
||||
echo "5️⃣ Salir"
|
||||
echo "----------------------------------------"
|
||||
read -rp "Selecciona una opción [1-5]: " opt
|
||||
echo ""
|
||||
case "$opt" in
|
||||
1) list_users ;;
|
||||
2) read -rp "Usuario nuevo: " user; cmd_add "$user" ;;
|
||||
3) read -rp "Usuario a modificar: " user; cmd_passwd "$user" ;;
|
||||
4) read -rp "Usuario a eliminar: " user; cmd_delete "$user" ;;
|
||||
5) echo "👋 Saliendo..."; exit 0 ;;
|
||||
*) echo "❗ Opción no válida." ;;
|
||||
esac
|
||||
echo ""
|
||||
read -rp "Presiona ENTER para continuar..." _
|
||||
clear
|
||||
done
|
||||
}
|
||||
|
||||
case "$opt" in
|
||||
1) list_users ;;
|
||||
2) add_user ;;
|
||||
3) edit_user ;;
|
||||
4) delete_user ;;
|
||||
5) echo "👋 Saliendo..."; exit 0 ;;
|
||||
*) echo "❗ Opción no válida." ;;
|
||||
# --- Punto de entrada -------------------------------------------------------
|
||||
main() {
|
||||
require_command htpasswd
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
interactive_menu
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
list) list_users ;;
|
||||
add) shift; cmd_add "${1:-}" "$@" ;;
|
||||
passwd) shift; cmd_passwd "${1:-}" "$@" ;;
|
||||
delete|remove) shift; cmd_delete "${1:-}" "$@" ;;
|
||||
--help|-h) usage ;;
|
||||
*) echo "❗ Comando desconocido: $1"; usage; exit 1 ;;
|
||||
esac
|
||||
echo ""
|
||||
read -rp "Presiona ENTER para continuar..." pause
|
||||
clear
|
||||
done
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user