ebook-cli - gerencia livros digitais entre PC e leitores ebooks

Publicado por Pedro Fernandes (última atualização em 19/04/2021)

[ Hits: 1.288 ]

Homepage: https://github.com/PedroF37

Download ebook-cli

Download 1616803194.ebook-cli (versão 2)




Gerencia livros digitais entre PC e leitores ebooks.

Funções que desempenha:

- Cria pasta chamada Biblioteca no PC e no dispositivo ebook-reader
- Copia e remove livros das pastas Biblioteca no PC e ebook-reader
- Lista conteúdo das Bibliotecas do PC e ebook-reader
- Cria pequeno arquivo de configuração na primeira vez que é rodado,
  onde armazena o ponto de montagem do dispositivo (conta com que não mude),
  e o local das pastas Biblioteca.
  Exemplo:
  /home/pedro/Biblioteca --> Pasta no PC
/run/media/pedro/Lev/Biblioteca --> Pasta no dispositivo ebook-reader

  



Versões atualizadas deste script

Versão 2 - Enviado por Pedro Fernandes em 26/03/2021

Changelog: Versão 0.2:

-Adicionado o tamanho dos livros, na função ListContent com: ls -sh

- Adicionada função FindPager para achar automaticamente o pager e registrar em arquivo de configuração:
(usuário não tem que entrar mais dentro do script e configurar variável PAGER)
POR FAVOR apagar arquivo $CONFIG (.ebook-cli.conf) e rodar o script para registrar $_PAGER no arquivo.

- Variável PAGER foi removida e substituida por _PAGER (para não dar problemas com PAGER do sistema)

-Quando mostra os dispositivos para escolher o ebbok-reader, não mostra mais os extras como,
ext4 (rw,nosuid,nodev,relatime..etc), mostra só /dev/sdc on /media/pedro/Lev

-Adicionado teste na função CreateFolder, pois na versão anterior, se usuário apagar o arquivo de configuração,
depois quando rodar o script de novo vai dar erro pois já tem as pastas Biblioteca criadas.
Agora função testa se tem as pastas e se tiver não faz nada e simplesmente prossegue, se não tiver então cria.

Download 1616803194.ebook-cli


Esconder código-fonte

#!/bin/bash
#
#
# -------------------------------------------------------- #
#
# ebook-cli:
#
# Gerência livros digitais entre pc e
# leitores ebooks.
#
# -------------------------------------------------------- #
#
# Funções do script:
#
# -Cria pasta para biblioteca de livros
#  no pc e no ebook-reader. Nome: Biblioteca
# -Lista conteúdo da biblioteca de livros
#  no pc e no ebook-reader
# -Copia e remove livros das bibliotecas
# -Cria pequeno arquivo de configuração
#  a primeira vez que é rodado, com registro
#  de ponto de montagem do ebook-reader e
#  local da biblioteca no pc e no ebook-reader.
#  Só volta a criar arquivo de configuração
#  se o usuário deletar o arquivo.
#
# -------------------------------------------------------- #
#
# NOTAS:
#
#
# Limitações do script nesta primeira versão:
#
#
# -Usuário tem que especificar qual paginador (less/most/more)
#  quer usar na variável PAGER na secção de Variáveis Globais
#
# -Script copia e remove livros apenas entre as pastas Biblioteca
#  do pc e do ebook-reader (Usuário tem que copiar manualmente
#  livros para a pasta Biblioteca do pc para depois puder gerênciar
#  os livros entre a pasta no pc e a pasta no ebook-reader)
#
# -O script só aceita UM dispositivo ebook-reader.
#  Para usar outro dispositivo, usuário tem que deletar
#  arquivo de configuração e chamar o script para criar outro.
#
# -Script conta com que dispositivo aparece na saída do
#  comando mount como algo assim: (/dev/sdc on /run/media/pedro/Lev)
#  (Digo isso pois não uso muitas distribuições, não sei se aparece
#  assim em todas...!!)
#
# -------------------------------------------------------- #
#
# Versão:
#
# 0.1 -Inicio do script 25/11/2020
#
#
# Autor: pedro fernandes
# Email: pedrobfernandes37@gmail.com
#
#
# -------------------------------------------------------- #


### Variáveis Globais ###


### Configurado por usuário ###


# Coloque o paginador que usa aqui ex: (most|less|more)
# Coloque caminho completo ex: /usr/bin/most
PAGER=""


### Fim de configuração do usuário ###


### Daqui em diante NÃO mexa!! ###


CONFIG="${HOME}/.ebook-cli.conf"              # Arquivo de configuração
PCLIBRARY="${PCLIBRARY:-${HOME}/Biblioteca}"  # Pasta dos livros no pc
DEVICELIBRARY=""                              # Pasta dos livros no ebook-reader
DEVICE=""                                     # Dispositivo ebook-reader



# -------------------------------------------------------- #


### Funções ###


# Chamada por trap, remove
# arquivos temporários
function RemoveTemp {


rm -f "$registry" "$listremove" \
"$listcopy" &> /dev/null
return


}


# Para apagar arquivo de configuração
# caso algo tenha dado errado
function RemoveConfig {


rm -f "$CONFIG"
return


}


function GameOver {


echo "$@" >&2
exit 1


}


function ExitSigInt {


clear
echo "Script interrompido por usuário."
echo "Terminando..."
RemoveTemp


exit 0


}


function Banner {


clear
echo -e "\t\t\t\t\t\t**************************************************"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                 ebook-cli                      *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*            Gerenciador de Livros CLI           *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t**************************************************"


return


}


# Aqui as pastas gravadas na função abaixo
# são realmente criadas. Primeiro lê do arquivo
# de configuração. Depois ignora a linha que
# começa com DEVICE, e então tenta criar as pastas.
# Se der errado quer dizer deve ter algum erro
# nas permissões.
# Nesse caso sai do script e deleta arquivo $CONFIG
function CreateFolder {


echo "Aguarde enquanto criamos as pastas"
echo "para guardar seus livros..."


if mkdir "$PCLIBRARY" &> /dev/null && \
   mkdir "$DEVICELIBRARY" &> /dev/null
then
  clear
  echo "Pastas criadas com sucesso no seu pc e ebook-reader!!"
  echo "Pastas chamam-se: Biblioteca. Pode agora passar livros"
  echo "para a pasta Biblioteca do seu pc e chamar o script"
  echo "para gerenciar os livros no pc e no seu ebook-reader."
  echo "Para usar outro dispositivo ebook-reader, basta deletar"
  echo "o arquivo $CONFIG e rodar de novo o script"
  exit 0
else
  clear
  RemoveConfig
  RemoveTemp
  GameOver "Erro ao criar pastas. Revise suas permissões"
fi


}


# Aqui grava em $CONFIG as pastas onde vão ficar os livros
# Grava duas pastas: $PCLIBRARY tem a pasta no pc
# $DEVICELIBRARY tem a pasta que fica no ebook-reader
function RecordConfig {


while read line
do


  if [ "${line%% *}" = "DEVICE" ]
  then
    DEVICE="${line##* }"
    DEVICELIBRARY="${DEVICE}/Biblioteca"
    #
    echo "PCLIBRARY = ${PCLIBRARY}" >> "$CONFIG"
    echo "DEVICELIBRARY = ${DEVICELIBRARY}" >> "$CONFIG"
    CreateFolder
  else
    clear
    RemoveConfig
    RemoveTemp
    GameOver "Erro!! Saindo do script."
  fi


done < "$CONFIG"


}


# O fato de ter digitado número não quer
# dizer que digitou correto. Inclusive pode
# ter pressionado enter apenas e foi aceite.
function ValidChoice {


# Validamos o número escolhido
case "$number" in


  "")
    # Se tiver dado ENTER no case da função abaixo
    # vai corresponder com todos os números.
    # Não pode. Aqui pega esse caso.
    clear
    RemoveTemp
    GameOver "Não digitou nada!! Saindo do script..."
    ;;
  *)
    # Se digitou número certo, então
    # guarda em arquivo de configuração.
    if grep -q "^$number" "$registry"
    then
      sed -n "s/^$number/DEVICE =/p" "$registry" | \
      cut -d ' ' -f 1,2,5 >> "$CONFIG"
      RecordConfig
    else
      # Não deu apenas enter (foi número)
      # mas mesmo assim número não está
      # certo? Sai!!
      clear
      RemoveTemp
      GameOver "Erro!! Número digitado é incorreto. Saindo..."
    fi
    ;;


esac


}


# Aqui escolhe o dispositivo correspondente
# que mostra na listagem da função abaixo.
function ChooseDevice {


# Dá 2 tentativas de digitar número
for try in {1..3}
do


  clear
  echo -e "\n\nPor favor digite o número do dispositivo"
  echo -n "que corresponde ao seu ebook-reader: "
  read number


  case "$number" in


    # Só aceita número, o resto não passa
    # Mas aceita ENTER!!
    *[!0-9]*)
      if [ "$try" -eq 2 ]
      then
        clear
        RemoveTemp
        GameOver "Tentativas esgotadas!!"
        break
      fi
      echo "Erro. Tente de novo"
      ;;
    *)
      # Se estamos aqui, certo ou errado
      # digitou número; (ou enter!!).
      break
      ;;


  esac


done


ValidChoice


}


# Se não tiver arquivo de configuração criado
# função é chamada. Se tiver, não é chamada.
function FindDevice {


echo -e "\n\t\t\t\t\t\tNão foi encontrado arquivo de configuração"
echo -e "\t\t\t\t\t\tIremos criar um para você agora."
echo -e "\t\t\t\t\t\tEste passo é necessário apenas uma vez"
echo -ne "\n\n\t\t\t\t\t\tAperte <ENTER> para continuar: "
read enter


# Acha os dispositivos montados. Númera com o sed
# para usuário digitar o número do dispositivo.
# Podia usar o nl, cat etc... ,
# mas fica mais bonitinho de se ver na tela com o sed!!
local device="$(mount | grep -v '^[^/]' | sed '=' | \
sed 'N; s/\n/ /')"


# Cria arquivo temporário para armazenar saída
# da substituíção acima, para comparar depois
# com escolha do usuário.
local registry="$(mktemp $HOME/tempXXXXXX)"
echo "$device" >> "$registry"


clear
echo -e "Estes são os dispositivos no sistema:\n\n"
sleep 2
$PAGER "$registry"


ChooseDevice


}


function ListContent {


clear
echo "Deseja listar conteúdo de qual biblioteca?"
read -n 1 -p "1. Pc, 2. ebook-reader: " choice


case "$choice" in


  1)
    clear
    ls "$PCLIBRARY" | $PAGER
    ;;
  2)
    clear
    ls "$DEVICELIBRARY" | $PAGER
    ;;
  *)
    clear
    echo "Erro!! Opção inválida."
    RemoveTemp
    sleep 2
    ;;


esac


return


}


function CopyContent {


clear
echo "Os livros que se encontram na Biblioteca:"
sleep 2
clear


local listcopy="$(mktemp $HOME/listcopyXXXXXX)"
ls "$source" | sed '=' | sed 'N; s/\n/: /' > $listcopy


$PAGER  $listcopy


echo -e "\n\nPor favor digite o(s) número(s) que corresponde"
echo "ao(s) livro(s) que quer copiar, um atrás do outro"
echo -n "separados por espaço: "
read books


for item in $(echo $books)
do


  if grep -q "^${item}: " "$listcopy"
  then
    local listcopy2=$(grep "^${item}: " "$listcopy" | \
                      cut -d ' ' -f 2-)
    #
    #
    echo "Copiando item ${item}..."
    echo "cp ${source}/$listcopy2 $target"
    cp -u "${source}/$listcopy2" "$target"
  else
    echo "Erro. Item ${item} não existe na lista"
    echo "Logo não iremos copiar."
    echo "Continuando..."
  fi


done


RemoveTemp
sleep 2


return


}


function RemoveContent {


clear
echo "Os livros que se encontram na Biblioteca:"
sleep 2
clear


local listremove="$(mktemp $HOME/listremoveXXXXXX)"
ls "$target" | sed '=' | sed 'N; s/\n/: /' > $listremove


$PAGER $listremove


echo -e "\n\nPor favor digite o(s) número(s) que corresponde"
echo "ao(s) livro(s) que quer remover, um atrás do outro"
echo -n "separados por espaço: "
read books


for item in $(echo $books)
do


  if grep -q "${item}: " "$listremove"
  then
    local listremove2=$(grep "${item}: " "$listremove" | \
                        cut -d ' ' -f 2-)
    #
    #
    echo "Removendo item ${item}..."
    echo "rm -f ${target}/$listremove2"
    rm -f "${target}/$listremove2"
  else
    echo "Item $item não existe na lista."
    echo "Logo não iremos remover."
    echo "Continuando..."
  fi


done


RemoveTemp
sleep 2


return


}


# Aqui escolhe de onde quer
# copiar livros
function ChooseCopyContent {


local source=""
local target=""


clear
echo "Deseja copiar de onde para onde?"
echo "1. pc para ebook"
echo "2. ebook para pc"
echo -en "Digite a opção: "
read -n 1 opcao


case "$opcao" in


  1)
    source="$PCLIBRARY"
    target="$DEVICELIBRARY"
    CopyContent
    ;;
  2)
    source="$DEVICELIBRARY"
    target="$PCLIBRARY"
    CopyContent
    ;;
  *)
    clear
    echo "Erro!! Opção inválida"
    sleep 2
    ;;


esac


return


}


# Aqui escolhe de onde quer
# remover livros
function ChooseRemoveContent {


local target=""


clear
echo "Deseja remover de onde."
echo "1. Biblioteca do pc"
echo "2. Biblioteca do Ebook-reader"
echo -en "Escolha a opção: "
read -n 1 opcao


case "$opcao" in


  1)
    target="$PCLIBRARY"
    RemoveContent
    ;;
  2)
    target="$DEVICELIBRARY"
    RemoveContent
    ;;
  *)
    clear
    echo "Erro!! Opção invávida"
    sleep 2
    ;;


esac


return


}


# Menu de apresentação e de escolha
function Menu {


while true
do

  clear
  Banner
  echo -e "\n\t\t\t\t\t\t\tBem Vindo(a) ao ebook-cli!!\n\n"
  echo -e "\t\t\t\t\t\t\tPor favor escolha o que quer fazer\n\n"
  echo -e "\t\t\t\t\t\t1. Listar conteúdo das Biblotecas de livros"
  echo -e "\t\t\t\t\t\t2. Copiar livros das Bibliotecas"
  echo -e "\t\t\t\t\t\t3. Remover livros das Bibliotecas"
  echo -e "\t\t\t\t\t\t0. Saír do script sem executar nenhuma ação\n\n\n"
  echo -en "\n\n\t\t\t\t\tPor favor digite sua opção: "
  read -n 1 opcao


  case "$opcao" in


    1)
      ListContent
      ;;
    2)
      ChooseCopyContent
      ;;
    3)
      ChooseRemoveContent
      ;;
    0)
      clear
      echo "Terminando script."
      echo "Obrigado por usar o ebook-cli!!"
      break
      ;;
    *)
      clear
      RemoveTemp
      GameOver "Erro!! Opção inválida. Saindo..."
      break
      ;;


  esac


done


}


# Aqui lê do arquivo de configuração
# Torna os dados do arquivo
# disponiveis para o script
function ReadConfig {


# Aqui faz backup do descritor 0 (STDIN)
exec 6<&0
exec 0< "$CONFIG"


while read line
do


  # Se removendo tudo da direita em $line,
  # depois do espaço sobrar:
  case "${line%% *}" in


    DEVICE)
      # $DEVICE= Tudo o que está
      # em $line menos DEVICE =
      DEVICE="${line##* }"
      ;;
    PCLIBRARY)
      PCLIBRARY="${line##* }"
      ;;
    DEVICELIBRARY)
      DEVICELIBRARY="${line##* }"
      ;;
    *)
      :
      ;;


  esac


done


# Restaura STDIN (0) para ser usado
# no script
exec 0<&6


Menu


}


# --------------------------------------------------------- #


# Começa aqui




# Limpando a sujeira
trap ExitSigInt SIGINT
trap RemoveTemp EXIT


# Testa se já tem arquivo de configuração
# Se tem chama função ReadConfig. Senão
# chama função FindDevice. Esta depois
# chama as outras.
if [ -e "$CONFIG" -a -s "$CONFIG" ]
then
  ReadConfig
else
  Banner
  FindDevice
fi


exit $?


# --------------------------------------------------------- #

Scripts recomendados

Desativando mapas que não possuem bots no CS

Script para pegar ip WAN para firewall com uma ou mais links de internet

Script para listar tentativas de acessos

Backup de algumas databases, Remotamente.

Script para copiar DVD


  

Comentários
[1] Comentário enviado por maurixnovatrento em 17/03/2021 - 21:53h


Bacana.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[2] Comentário enviado por sabe nada em 24/03/2021 - 19:34h


[1] Comentário enviado por mauricio123 em 17/03/2021 - 21:53h


Bacana.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Obrigado amigo. Feliz que tenha gostado!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts