dotfiles

Repositório dotfiles
git clone git://git.sivaldodavi.com/dotfiles.git
Log | Files | Refs | README

kindle (4760B)


      1 #!/bin/sh
      2 
      3 set -eu
      4 
      5 # --- CONFIGURAÇÕES DE SUB-REDE ---
      6 KINDLE_NET_1="10.0.0"
      7 KINDLE_NET_2="192.168.18" 
      8 # ---------------------------------
      9 
     10 KINDLE_PORT="2222"
     11 KINDLE_USER="root"
     12 KINDLE_REMOTE_PATH="/"
     13 MOUNT_POINT="${HOME}/.local/share/koreader"
     14 SSH_KEY="${HOME}/.ssh/kindle_rsa"
     15 LOGFILE="/tmp/kindle-mount.log"
     16 
     17 if [ -t 1 ]; then
     18     R='\033[0;31m' G='\033[0;32m' Y='\033[0;33m' B='\033[0;34m' N='\033[0m'
     19 else
     20     R='' G='' Y='' B='' N=''
     21 fi
     22 
     23 log()  { printf "${B}[*]${N} %s\n" "$*" | tee -a "$LOGFILE"; }
     24 ok()   { printf "${G}[✔]${N} %s\n" "$*" | tee -a "$LOGFILE"; }
     25 warn() { printf "${Y}[!]${N} %s\n" "$*" | tee -a "$LOGFILE"; }
     26 die()  { printf "${R}[✘]${N} %s\n" "$*" | tee -a "$LOGFILE"; exit 1; }
     27 
     28 MY_UID=$(id -u)
     29 MY_GID=$(id -g)
     30 
     31 check_deps() {
     32     MISSING=""
     33     command -v sshfs >/dev/null 2>&1 || MISSING="$MISSING sshfs"
     34     apk info -e fuse >/dev/null 2>&1 || MISSING="$MISSING fuse"
     35     
     36     if [ -n "$MISSING" ]; then
     37         log "Instalando dependências:$MISSING"
     38         doas apk add $MISSING >/dev/null 2>&1 || die "Falha ao instalar pacotes."
     39     fi
     40 
     41     for cmd in sshfs fusermount3 doas; do
     42         command -v "$cmd" >/dev/null 2>&1 || die "Dependência ausente: '$cmd'"
     43     done
     44 }
     45 
     46 is_mounted() {
     47     grep -qs " ${MOUNT_POINT} fuse.sshfs " /proc/mounts
     48 }
     49 
     50 setup_fuse() {
     51     if ! grep -q "^user_allow_other" /etc/fuse.conf 2>/dev/null; then
     52         log "Habilitando 'user_allow_other' em /etc/fuse.conf..."
     53         doas sh -c "echo 'user_allow_other' >> /etc/fuse.conf" \
     54             || die "Falha ao editar /etc/fuse.conf."
     55     fi
     56     if ! lsmod | grep -q "^fuse "; then
     57         log "Carregando módulo FUSE..."
     58         doas modprobe fuse || die "Falha ao carregar o módulo FUSE."
     59     fi
     60 }
     61 
     62 do_umount() {
     63     if is_mounted; then
     64         log "Desmontando ${MOUNT_POINT}..."
     65         fusermount3 -u "$MOUNT_POINT" \
     66             || doas umount -l "$MOUNT_POINT" \
     67             || die "Não foi possível desmontar."
     68         ok "Kindle desmontado com sucesso."
     69     else
     70         warn "Kindle não está montado."
     71     fi
     72 }
     73 
     74 discover_ip() {
     75     printf "[*] Últimos dígitos do IP do Kindle (ex: 108): "
     76     read -r LAST
     77     
     78     if [ -z "$LAST" ]; then
     79         die "Os dígitos do IP não podem ser vazios."
     80     fi
     81 
     82     # Monta os dois IPs possíveis baseados no que você digitou
     83     TRY_IP_1="${KINDLE_NET_1}.${LAST}"
     84     TRY_IP_2="${KINDLE_NET_2}.${LAST}"
     85 
     86     # 1. Testa a primeira sub-rede
     87     log "Verificando conectividade com Opção 1 (${TRY_IP_1}:${KINDLE_PORT})..."
     88     if nc -z -w 2 "$TRY_IP_1" "$KINDLE_PORT" >/dev/null 2>&1; then
     89         KINDLE_IP="$TRY_IP_1"
     90         return 0
     91     fi
     92 
     93     # 2. Testa a segunda sub-rede
     94     log "Opção 1 offline. Verificando Opção 2 (${TRY_IP_2}:${KINDLE_PORT})..."
     95     if nc -z -w 2 "$TRY_IP_2" "$KINDLE_PORT" >/dev/null 2>&1; then
     96         KINDLE_IP="$TRY_IP_2"
     97         return 0
     98     fi
     99 
    100     # 3. Se nenhum responder, avisa mas tenta o primeiro mesmo assim (estilo o script original)
    101     warn "Nenhuma das sub-redes respondeu na porta ${KINDLE_PORT}."
    102     warn "Tentando forçar a montagem na Opção 1: ${TRY_IP_1}..."
    103     KINDLE_IP="$TRY_IP_1"
    104 }
    105 
    106 do_mount() {
    107     setup_fuse
    108     mkdir -p "$MOUNT_POINT"
    109 
    110     if is_mounted; then
    111         warn "Kindle já está montado. Use 'umount' para desmontar."
    112         exit 0
    113     fi
    114 
    115     KINDLE_IP=""
    116     discover_ip
    117 
    118     SSH_OPTS=""
    119     if [ -f "$SSH_KEY" ]; then
    120         SSH_OPTS="-o IdentityFile=${SSH_KEY}"
    121         log "Usando chave SSH: ${SSH_KEY}"
    122     else
    123         warn "Chave SSH não encontrada — será solicitada senha."
    124     fi
    125 
    126     log "Montando Kindle (${KINDLE_IP}) em ${MOUNT_POINT}..."
    127 
    128     # shellcheck disable=SC2086
    129     sshfs "${KINDLE_USER}@${KINDLE_IP}:${KINDLE_REMOTE_PATH}" "$MOUNT_POINT" \
    130         -p "$KINDLE_PORT" \
    131         -o allow_other \
    132         -o uid="$MY_UID" \
    133         -o gid="$MY_GID" \
    134         -o reconnect \
    135         -o ServerAliveInterval=15 \
    136         -o ServerAliveCountMax=3 \
    137         -o follow_symlinks \
    138         -o StrictHostKeyChecking=accept-new \
    139         -o compression=yes \
    140         -o cache=yes \
    141         -o kernel_cache \
    142         $SSH_OPTS \
    143         || die "Falha na montagem. Consulte: ${LOGFILE}"
    144 
    145     ok "Kindle montado em: ${MOUNT_POINT}"
    146 }
    147 
    148 do_status() {
    149     printf "${B}[i]${N} Mount point : %s\n" "$MOUNT_POINT"
    150     if is_mounted; then
    151         ok "Status       : MONTADO"
    152         df -h "$MOUNT_POINT" 2>/dev/null | tail -1 | awk '{printf "    Uso: %s de %s (%s livre)\n", $3, $2, $4}'
    153     else
    154         warn "Status       : NÃO montado"
    155     fi
    156 }
    157 
    158 check_deps
    159 
    160 ACTION="${1:-mount}"
    161 
    162 case "$ACTION" in
    163     mount)   do_mount  ;;
    164     umount)  do_umount ;;
    165     status)  do_status ;;
    166     toggle)  is_mounted && do_umount || do_mount ;;
    167     *)       die "Uso: $0 [mount|umount|status|toggle]" ;;
    168 esac