ropebox 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. #!/usr/bin/env bash
  2. # ENCONDING UTF-8
  3. #================HEADER======================================================|
  4. #Autor
  5. # Jefferson Rocha <root@slackjeff.com.br>
  6. #
  7. #PROGRAMA
  8. # ROPEBOX - Simples agendador de Tarefas
  9. #
  10. #DESCRIÇÃO
  11. # Agende suas tarefas de uma maneira fácil e simples.
  12. #
  13. #SITE
  14. # http://slackjeff.com.br/programas/ropebox.html
  15. #
  16. #CHANGELOG
  17. # https://notabug.org/jeffersonrocha/ropebox/raw/master/changelog.txt
  18. #============================================================================|
  19. #================VARIAVEIS
  20. NAME="RopeBox"
  21. VERSION="1.D"
  22. directory_task="${HOME}/ropebox"
  23. DATE=$(date +%d/%m/%Y)
  24. LINK="https://notabug.org/jeffersonrocha/ropebox"
  25. #========Cores
  26. red='\033[31;1m'
  27. green='\033[32;1m'
  28. cyan='\033[36;1m'
  29. end='\033[m'
  30. #================BIBLIOTECAS
  31. source "${directory_task}/ropebox.conf"
  32. #================VERIFICACOES INICIAIS
  33. [ "$UID" = "0" ] && { echo "Root não é permitido."; exit 1 ;}
  34. # Bash existe?
  35. type bash &>/dev/null || \
  36. { echo -e "${red}Você necessita do Shell Bash para continuar.${end}";exit 1;}
  37. # Diretorio ropebox existe?
  38. [ ! -d "$directory_task" ] && \
  39. { echo -e "${red}O diretório ropebox, não foi encontrado em seu Home. Abortando.${end}";exit 1;}
  40. #================FUNCOES
  41. _HELP()
  42. {
  43. cat <<EOF | less
  44. ${NAME} ${VERSION} - Simples Gerenciador de Tarefas.
  45. COMANDOS:
  46. +
  47. Adiciona nova Tarefa
  48. -
  49. Remove uma Tarefa
  50. @
  51. Edita uma Tarefa
  52. -a
  53. Remove Todas Tarefas existentes, com a sua confirmação!
  54. !s
  55. Procura uma determinada String/Texto nas tarefas
  56. !a
  57. Listagem de todas as Tarefas disponíveis
  58. !al
  59. Listagem de todas as tarefas disponíveis em modo coluna.
  60. Ótimo para uma visualização rápida.
  61. update
  62. Atualiza o ropebox através da internet direto do fonte.
  63. ?, help
  64. Exibe esta opção de ajuda
  65. q, exit
  66. Sair do ${NAME}
  67. +-------------------+
  68. | NOTAS IMPORTANTES |
  69. +-------------------+
  70. **Para manter a simplicidade o ${NAME} não auto procura o editor padrão que você utiliza.
  71. Isso devido ao fato que você usuário deve adicionar qual editor você mais gosta.
  72. Você deve alterar a variável 'my_editor' e adicionar o seu editor de texto favorito!
  73. Por PADRÃO o editor vem apontado como 'nano' que é um editor simples e fácil presente
  74. por padrão em quase todos distribuições GNU/Linux.
  75. +-----+
  76. | BUG |
  77. +-----+
  78. Caso encontre algum bug ou tem alguma sugestão envie um email para
  79. root@slackjeff.com.br
  80. +---------+
  81. | LICENÇA |
  82. +---------+
  83. Este Software está protegido com a licença GNU GPL VERSÃO 3.
  84. EOF
  85. }
  86. _BAR() # Barra de inicio
  87. {
  88. echo -e "${cyan}${NAME}${end} Versão ${cyan}${VERSION}${end}"
  89. echo "Para informações digite ?, help | exit, CTRL+C para sair"
  90. printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -
  91. echo
  92. }
  93. _VIEWER() # Leitor de arquivos de textos/tarefas.
  94. {
  95. while read line; do
  96. echo "$line"
  97. done < "$archive"
  98. }
  99. _TEMPLATE() # Template para criação de nova tarefa
  100. {
  101. cat > "${directory_task}/task/${doc_name}.txt" <<END
  102. #####################################################################
  103. Nome da Tarefa = ${input2}
  104. Chamada Rápida = ${fast_num}
  105. Data de Criação = ${DATE}
  106. Criado por = ${USER}
  107. +-------------------------------------------------------------------+
  108. END
  109. }
  110. _ENTRY() # Entrar no diretorio de task/tarefas
  111. {
  112. cd "${directory_task}/task/"
  113. }
  114. _ADD_TASK() # Adiciona nova tarefa
  115. {
  116. ( # Subshell
  117. # Criando o número de chamada rápida
  118. # de acordo com a quantidade de arquivos no diretório.
  119. _ENTRY
  120. shopt -s nullglob dotglob # Mudando propriedades do shell.
  121. files=(*) # Recolhendo quantidade de arquivos no diretório.
  122. total=$(echo ${#files[@]})
  123. fast_num="$(( $total + 1 ))"
  124. _TEMPLATE # Chamando função para criar template
  125. "$my_editor" "${directory_task}/task/${doc_name}.txt" # Abrindo editor
  126. )
  127. }
  128. _REMOVE_TASK() # Remover uma tarefa
  129. {
  130. ( # Subshell
  131. _ENTRY
  132. # Procurando por task nos diretorios on e off
  133. for archive in *; do
  134. [ "$archive" = '*' ] && { echo -e "${red}{ALERTA}${end} Nenhuma Tarefa foi Encontrada!"; return 1 ;}
  135. fast_call=$(grep "^Cha.*R.*=" "${archive}") # Pegando o número de chamada Rápida.
  136. if [ "$fast_call" = "Chamada Rápida = $doc_name" ]; then
  137. task_name=$(grep "^Nom.*Tare.*=" "${archive}" | awk '{print $5}') # Nome da Tarefa/task
  138. rm "$archive"
  139. echo -e "${green}{OK}${end} Tarefa ${task_name} foi removido com sucesso."
  140. return 0
  141. elif [ "$archive" = "${doc_name}.txt" ]; then
  142. rm "$archive"
  143. echo -e "${green}{OK}${end} Tarefa ${input2} foi removido com sucesso."
  144. return 0
  145. fi
  146. done
  147. { echo -e "${red}{ALERTA}${end} Nenhuma Tarefa foi Encontrado!"; return 1 ;}
  148. )
  149. }
  150. _EDIT_TASK() # Editar uma tarefa
  151. {
  152. ( # Subshell
  153. _ENTRY
  154. for open in *; do
  155. [ "$open" = '*' ] && { echo -e "${red}{ALERTA}${end} Nenhuma Tarefa foi Encontrada!"; exit 1 ;}
  156. fast_call=$(grep "Cha.*R.*=" "${open}") # Pegando o número de chamada Rápida.
  157. if [ "$fast_call" = "Chamada Rápida = $doc_name" ]; then
  158. $my_editor "${open}" # Abrindo Editor
  159. return 0
  160. elif [ "$open" = "${doc_name}.txt" ]; then
  161. $my_editor "${open}" # Abrindo Editor
  162. return 0
  163. fi
  164. done
  165. echo -e "${red}{ALERTA}${end} Tarefa '$input2' não foi encontrada!"; return 1
  166. )
  167. }
  168. _LIST_ON() # Listar todas as tarefas
  169. {
  170. ( # Subshell
  171. _ENTRY
  172. for archive in *; do
  173. if [ "$archive" = '*' ] || [ -z "$archive" ]; then
  174. echo -e "${red}{ALERTA}${end} Nenhuma Tarefa ativa!"
  175. return 1
  176. fi
  177. _VIEWER # Chamando função de visualização de arquivo de texto.
  178. # Pulando duas linhas.
  179. echo
  180. echo
  181. done
  182. )
  183. }
  184. _LIST_SIMPLE() # Exibir a lista simples de tarefas em colunas
  185. {
  186. ( # Subshell
  187. _ENTRY
  188. tmp="/tmp/templist"
  189. echo -e "${cyan}Nº CRIAÇÃO AUTOR TAREFA${end}" >> "$tmp"
  190. for archive in *; do
  191. # Verificando se existe tarefas
  192. if [ "$archive" = '*' ] || [ -z "$archive" ]; then
  193. echo -e "${red}{ALERTA}${end} Nenhuma Tarefa ativa!"
  194. return 1
  195. fi
  196. # Pegando os campos necessários para imprimir na coluna
  197. #=============
  198. # OTIMIZAR!!!!
  199. #=============
  200. # Este pedaço está muito lento, precisa melhorar a velocidade
  201. my_author=$(grep "^Criado.*=" "$archive" | awk '{print $4}')
  202. my_task=$(grep "^Nome.*=" "$archive" | sed "s/.*= //; s/ /|/g")
  203. my_fast_call=$(grep "^Chamada.*=" "$archive" | awk '{print $4}')
  204. my_date=$(grep "^Data.*=" "$archive" | awk '{print $5}')
  205. echo -e "${my_fast_call} ${my_date} ${my_author} ${my_task}" >> "$tmp"
  206. done
  207. sort -n "$tmp" | column -t | sed 's/|/ /g' # Exibir a coluna já tabulada
  208. rm "$tmp" # Remover o arquivo temporario
  209. )
  210. }
  211. _SEARCH() # Procurar por uma determinada string nas tarefas
  212. {
  213. ( # Subshell
  214. _ENTRY
  215. count='0' # Inicializando variável contadora
  216. for archive in *; do # Pegando todos os arquivos no diretorio
  217. if grep -iq "${input2}" "$archive" &>/dev/null; then # procurando o padrão
  218. _VIEWER # Chamando função de visualização de arquivo de texto.
  219. echo
  220. echo
  221. exit 0
  222. else
  223. count=$((count+1)) # Incremento
  224. fi
  225. done
  226. # Se não achou nada retorna msg.
  227. [ "$total" -gt '0' ] && { echo "Nenhuma ocorrência encontrada para: '${input2}'"; exit 1 ;}
  228. )
  229. }
  230. _CLEAR_ALL()
  231. {
  232. ( # Subshell
  233. _ENTRY
  234. if rm -v * &>/dev/null; then
  235. echo "Todas Tarefas foram Removidas com Sucesso!"
  236. return 0
  237. else
  238. echo -e "${red}{ALERTA}${end} Nenhuma Tarefa ativa!"
  239. return 1
  240. fi
  241. )
  242. }
  243. _UPDATE()
  244. {
  245. # Declaração de variáveis
  246. local NAME=${NAME,,} # Pegando nome e convertendo para lower
  247. local ARCHIVE='master.tar.gz' # Nome do pacote do servidor
  248. local LINK="https://notabug.org/jeffersonrocha/${NAME}/archive/${ARCHIVE}"
  249. echo "Verificando Conexão com Internet..."
  250. wget -q --spider www.google.com || { echo "${red}{AVISO}${end} Sem Internet.";exit 1;}
  251. ( # Subshell
  252. cd "${HOME}" # Entrando no home do usuario
  253. if ! wget -q --show-progress "$LINK"; then
  254. echo -e "${red}{Alerta}${end} Erro, não foi permitido fazer update."
  255. echo "Você não possui acesso com a internet."
  256. exit 1
  257. fi
  258. # Desempacotando e retirando alguns archs na extração.
  259. tar xf "${ARCHIVE}" \
  260. --exclude='LICENSE' \
  261. --exclude='README.md' \
  262. --exclude='install.sh'
  263. chmod +x "${directory_task}/${NAME}" # Permissão de execução no script.
  264. rm "${ARCHIVE}"
  265. return 0
  266. )
  267. }
  268. #=======================PRINCIPAL
  269. clear
  270. _BAR
  271. while :; do # Loop principal
  272. read -ep "> " input input2 # Entradas principais do usuário
  273. # Tudo em Lower
  274. input2="${input2,,}" # Tudo em minusculo
  275. # Variável utilizada para criar arquivos de texto,
  276. # removendo os caracteres de espaço e substituindo por _
  277. doc_name="${input2// /_}"
  278. # Verficando Entrada
  279. case ${input} in
  280. \+)
  281. [ "$input2" ] || \
  282. { echo -e "${red}{ALERTA}${end} Para adicionar uma Tarefa use: + Nome da Tarefa";continue;}
  283. [ "$input2" = '.' ] && \
  284. { echo -e "${red}{ALERTA}${end} Não permitido nome como ' . '";continue;}
  285. ( # Subshell
  286. _ENTRY
  287. # Verificando se tarefa já existe...
  288. for exist in *; do
  289. [ "$exist" = "${doc_name}.txt" ] && { conf='yes'; break ;} || conf='no'
  290. done
  291. if [ "$conf" = 'yes' ]; then
  292. echo -e "${red}{ALERTA}${end} Nome desta tarefa já existe!"
  293. continue
  294. elif [ "$conf" = 'no' ]; then
  295. echo "Tarefa criada..."; sleep 0.2s
  296. _ADD_TASK
  297. fi
  298. )
  299. ;;
  300. -)
  301. [ "$input2" ] || { echo "Digite o nome da Tarefa que deseja remover."; continue ;}
  302. _REMOVE_TASK
  303. ;;
  304. \@)
  305. [ "$input2" ] || { echo "Digite o nome da Tarefa que deseja editar."; continue ;}
  306. _EDIT_TASK
  307. ;;
  308. !a)
  309. _LIST_ON
  310. ;;
  311. !al)
  312. _LIST_SIMPLE
  313. ;;
  314. !s)
  315. [ "$input2" ] || { echo "Digite a String que deseja pesquisar."; continue ;}
  316. _SEARCH
  317. ;;
  318. -a)
  319. read -p "{ALERTA} VOCÊ VAI APAGAR TODAS AS SUAS TAREFAS, DESEJA CONTINUAR? 's/N': " clear_all
  320. clear_all=${clear_all,,} # Tudo em minusculo
  321. clear_all=${clear_all:=n} # Enter pressionado retorna n.
  322. [ "$clear_all" = 's' ] && _CLEAR_ALL || continue
  323. ;;
  324. update) _UPDATE ;;
  325. clear) clear; _BAR ;;
  326. \?|help) _HELP ;;
  327. q|exit) exit 0 ;;
  328. *) echo "Comando não encontrado! Para ajuda digite ? ou Help." ;;
  329. esac
  330. done # Loop Principal