lib.sh 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. #!/bin/bash
  2. # Coding: utf-8
  3. # Editor: www.geany.org
  4. # Created 2017-02-13
  5. #_sudo_apt_install_ xdotool pgrep nc play zenity transmission-remote lftp
  6. #_sudo_dpkg_i_
  7. hour="$(date '+%-H')" # час (00..23)
  8. hour_I="$(date +%-I)" # час (01..12)
  9. mins="$(date '+%-M')" # минуты (00..59)
  10. secs_unix="$(date +%s)" # число секунд, истёкших с 1970-01-01 00:00:00 UTC
  11. date="$(date +%y-%m-%d)" # 21-11-27
  12. date_ymd_HMS="$(date +%y-%m-%d_%H-%M-%S)" # 21-11-27_14-06-27
  13. date_ymd="$(date +%y%m%d)" # 231211
  14. date_utc="$(TZ='Europe/London' date '+%y-%m-%d')"
  15. day_of_year_utc="$(TZ='Europe/London' date '+%-j')" # день в году 1...365
  16. uptime_in_sec="$(cat /proc/uptime | cut -d. -f1)" # аптайм в секундах
  17. uptime=$((${uptime_in_sec} / 60)) # аптайм в минутах
  18. read uptime_in_day < "$HOME/LOG/uptime_counter.sh/tmp1/${date_utc}" # аптайм за день
  19. dir_general="$HOME/LOG/general"
  20. dir_scr="$HOME/.SCR"
  21. fun_analize_command () # логирование
  22. {
  23. local error=$?
  24. local stadia="$(date +%H-%M-%S_%6N) line.${BASH_LINENO[0]} com $@"
  25. if [ "$error" -eq "0" ] # если кода возврата 0
  26. then
  27. fun_echo_color 15 0 "$stadia"
  28. else
  29. stadia_err="$stadia script: $0 error: $error"
  30. zenity --error --title="fun_analize_command" --text="$stadia_err" --no-wrap
  31. ,speech_en.sh "Error. Script terminated"
  32. fun_echo_color 9 0 "$stadia_err"
  33. sleep 3
  34. echo "$stadia_err" >> "$HOME/Desktop/Error.log"
  35. exit 1001
  36. fi
  37. }
  38. fun_analize_condition () # анализ выполнения условий
  39. {
  40. local error=$?
  41. local stadia="$(date +%H-%M-%S_%6N) line.${BASH_LINENO[0]} con lib.sh $@"
  42. if [ "$error" -eq "0" ] # если кода возврата 0
  43. then
  44. fun_echo_color 10 0 "$stadia"
  45. else
  46. fun_echo_color 9 0 "$stadia. Condition not met. Script terminated."
  47. exit 1002
  48. fi
  49. }
  50. fun_log_dir_create () # $1 full path script, $2 how old days files must delete, $3 how much temp folders need to create
  51. {
  52. dir_script="$HOME/LOG/$(basename $1)"
  53. fun_create_directory $dir_script $dir_general
  54. if [ -n "$3" ]
  55. then
  56. for ((x=1; x<=$3;x++))
  57. do
  58. fun_create_directory "$dir_script/tmp$x" # create folders
  59. eval tmp$x="$dir_script/tmp$x" # white to variable path to temp folder tmpX
  60. find "$dir_script/tmp$x" -type f -mtime +$2 -delete # delete old files
  61. done
  62. fi
  63. }
  64. con_test_exist_file () # проверка наличия файла
  65. {
  66. for x in "$@"
  67. do
  68. if [ -f "$x" ];
  69. then
  70. fun_analize_condition "File $x exist"
  71. else
  72. fun_analize_condition "File $x not exist"
  73. fi
  74. done
  75. }
  76. con_test_not_exist_file () # проверка отсутствия файла
  77. {
  78. for x in "$@"
  79. do
  80. if [ ! -f "$x" ];
  81. then
  82. fun_analize_condition "File $x not exist"
  83. else
  84. fun_analize_condition "File $x exist"
  85. fi
  86. done
  87. }
  88. con_test_not_exist_process () # проверка отсутствия процесса
  89. {
  90. set -- "$@" 'RHVoice-test' 'play' 'tar' 'gpg' 'split' 'wget' 'rsync' 'lftp' 'filezilla' 'php' 'transmission-remote' 'sleep' 'diff' 'mv' 'ping'
  91. for process in "$@"
  92. do
  93. if [ ! "`pidof -x $process`" ]
  94. then
  95. fun_analize_condition "$process is not running"
  96. else
  97. fun_analize_condition "$process is already running"
  98. fi
  99. done
  100. }
  101. fun_press_button ()
  102. # 1 - coordinate x, 2 - coordinate y, 3 - click mode, 4 - sleep time after press
  103. # click mode: 1 = left, 2 = middle, 3 = right, 4 = wheel up, 5 = wheel down
  104. {
  105. xdotool mousemove $1 $2 # go to coordinates
  106. sleep 1
  107. if [ -n "$3" ]
  108. then
  109. xdotool click $3
  110. sleep $4
  111. fi
  112. }
  113. fun_press_key () # 1 - key, 2 - sleep time after press
  114. {
  115. xdotool key $1
  116. sleep $2
  117. }
  118. fun_pars () # парсинг строк, $file_edited должна существовать
  119. {
  120. # fun_echo_lib_stadia 10 0 "[1] Поиск строки с $1\r\v"
  121. #grep "$1" $file_edited
  122. #echo -e "\r\v"
  123. # fun_echo_lib_stadia 10 0 "[2] Разделитель перед началом текста = $2\r\v"
  124. # fun_echo_lib_stadia 10 0 "[3] Номер выбираемого столбца = $3\r\v"
  125. #grep "$1" $file_edited | cut -f$3 -d"$2"
  126. #echo -e "\r\v"
  127. # fun_echo_lib_stadia 10 0 "[4] Разделитель после конца текста = $4\r\v"
  128. # fun_echo_lib_stadia 10 0 "[5] Номер выбираемого столбца = $5\r\v"
  129. #grep "$1" $file_edited | cut -f$3 -d"$2" | cut -f$5 -d"$4"
  130. #echo -e "\r\v"
  131. # fun_echo_lib_stadia 10 0 "[6] Строка которую нужно отображать если выводится несколько строк = $6"
  132. #echo -e "\r\v"
  133. grep "$1" $file_edited | cut -f$3 -d"$2" | cut -f$5 -d"$4" | sed ''$6'!D'
  134. }
  135. fun_echo_variable ()
  136. {
  137. for x in $@
  138. do
  139. if [ -n "${!x}" ] # не печатаем пустые переменные
  140. then
  141. fun_echo_lib_stadia 10 0 "$x = ${!x}"
  142. fi
  143. done
  144. }
  145. fun_file_touch () # 1 - путь к создаваемому файлу
  146. {
  147. if [ ! -f "$1" ];
  148. then
  149. touch $1
  150. fun_analize_command "lib.sh Create $1"
  151. else
  152. fun_echo_lib_stadia 10 0 "$1 exist"
  153. fi
  154. }
  155. fun_for_continue_enter_password ()
  156. {
  157. password="$((1 + RANDOM % 1000))"
  158. until [ "$enter_password" == "$password" ]
  159. do
  160. ,speech_en.sh "For continue press $password"
  161. read enter_password
  162. done
  163. enter_password=""
  164. }
  165. con_test_ip_port_open () # 1 - ip адрес (127.0.0.xxx всегда доступен) , 2 - порт (опционально)
  166. {
  167. if ping -c 1 192.168.100.1 &> /dev/null # доступность роутера
  168. then
  169. fun_analize_condition "Router is online"
  170. if ping -c 1 $1 &> /dev/null # доступность ip адреса
  171. then
  172. fun_analize_condition "ip adress $1 online"
  173. else
  174. fun_analize_condition "ip adress $1 offline"
  175. fi
  176. if [ $# == "2" ] # если 2 аргумента
  177. then
  178. nc -z $1 $2
  179. if [ "$?" -eq 0 ]
  180. then
  181. fun_analize_condition "ip port $2 open"
  182. else
  183. fun_analize_condition "ip port $2 closed"
  184. fi
  185. fi
  186. else
  187. fun_analize_condition "Router offline"
  188. fi
  189. }
  190. fun_run_command ()
  191. {
  192. error_file="$HOME/Desktop/error.log"
  193. "$@"
  194. local error=$?
  195. if [ "$error" -eq "0" ] # проверка на ошибки
  196. then
  197. fun_echo_lib_stadia 10 0 "Command: $0 $@."
  198. else
  199. echo "$(date +%H-%M-%S_%6N) fun_run_command Command: $0 $@. Error № $error." >> "$error_file"
  200. fun_echo_lib_stadia 9 0 "Command: $0 $@. Error № $error."
  201. cat "$error_file"
  202. exit 1004
  203. fi
  204. }
  205. fun_ask_and_run_command ()
  206. {
  207. while true
  208. do
  209. echo ""
  210. fun_echo_lib_stadia 10 0 "fun_ask_and_run_command"
  211. echo "[1] Run command: $@ ?"
  212. echo "[0] Continue without run command"
  213. read choice
  214. case $choice in
  215. [1] )
  216. fun_run_command "$@"
  217. break
  218. ;;
  219. [0] )
  220. echo "Command skipped"
  221. break
  222. ;;
  223. * ) fun_echo_lib_stadia 9 0 "Error. Press 1 or 0";;
  224. esac
  225. done
  226. }
  227. fun_create_directory () # пути до создаваемых папок через пробел
  228. {
  229. for dir in "$@"
  230. do
  231. if [ ! -d "$dir" ]
  232. then
  233. mkdir -p "$dir"
  234. fun_analize_command "lib.sh Create folder $dir"
  235. else
  236. fun_echo_lib_stadia 10 0 "Folder $dir exist"
  237. fi
  238. done
  239. }
  240. fun_echo_stadia () # 1 - цвет текста, 2 - цвет фона, остальные текст. Для стадий из скриптов без анализа кода возврата.
  241. {
  242. # Цветной текст 19:07:41.514784 line.2 Копирование file
  243. fun_echo_color $1 $2 "$(date +%H-%M-%S_%6N) line.${BASH_LINENO[0]} ${@:3}"
  244. }
  245. fun_echo_lib_stadia () # 1 - цвет текста, 2 - цвет фона, остальные текст. Для обычных сообщений из lib.sh
  246. {
  247. # Цветной текст 22:55:24.167452 line.260 lib.sh com Удаление /tmp/lock
  248. fun_echo_color $1 $2 "$(date +%H-%M-%S_%6N) line.${BASH_LINENO[0]} lib.sh ${@:3}"
  249. }
  250. fun_echo_color () # 1 - цвет текста, 2 - цвет фона, остальные текст. Цвета смотрите в /opt/system_configurator.sh
  251. {
  252. tput setaf $1
  253. tput setab $2
  254. echo -n "${@:3}"
  255. echo $(tput sgr0)
  256. }
  257. fun_create_random_string ()
  258. {
  259. unset random_string
  260. random_string="$(date +%s | sha256sum | base64 | head -c 12)"
  261. }
  262. fun_convert_to_mins () # конвертация минут в формат $час $минута и наоборот
  263. {
  264. if [ $# == "1" ] # если агрумент один
  265. then
  266. echo "$(($1 / 60)) $(($1 % 60))"
  267. else
  268. echo "$(( ($1 * 60) + $2 ))"
  269. fi
  270. }
  271. fun_statistic_uptime () # среднеарифметический аптайм за $1 дней
  272. {
  273. sum="$(cat $HOME/LOG/uptime_counter.sh/tmp1/* | tail -n$1 | awk '{s += $1} END {print s}' )"
  274. middle_sum="$(echo "scale=0; $sum / $1 " | bc)"
  275. stat_in_hours="$(($middle_sum / 60 ))"
  276. stat_in_hours_ost="$(($middle_sum % 60 ))"
  277. echo "$stat_in_hours:$stat_in_hours_ost"
  278. }
  279. fun_lftp_tvbox () # аргументы в '' приставку
  280. {
  281. lftp -e "open tvbox && set net:timeout 10 && $@ && bye"
  282. }
  283. fun_lftp_tvbox_torrent_list () # выдает список файлов в папке torrent
  284. {
  285. fun_lftp_tvbox 'find -l /storage/emulated/0/torrent' | grep -v '0/torrent/$' | grep -v '0/torrent/dl/$' | grep -v '0/torrent/m1/$' | grep -v '0/torrent/m2/$' | cut -b35- | sed s/^\ *// | sort
  286. }
  287. fun_lftp_tvbox_torrent_size ()
  288. {
  289. size="$(fun_lftp_tvbox 'du -s /storage/emulated/0/torrent' | cut -f1)"
  290. size_h=$(echo "scale=1; x=$size/1000000; if(x<1) print 0; x" | bc)
  291. fun_echo_stadia 11 0 "Torrent folder size is $size Кб or $size_h Гб"
  292. }
  293. fun_lftp_smart () # аргументы в '' телефон
  294. {
  295. lftp -e "open smart && $@ && bye"
  296. }
  297. fun_transmission () # 1 аргумент pc или tvbox, остальные для transmission
  298. {
  299. if [ "$1" == "pc" ]
  300. then
  301. read auth < "$HOME/.ssh/trans_pc_auth"
  302. transmission-remote 127.0.0.1:9091 "$auth" "${@:2}"
  303. fi
  304. if [ "$1" == "tvbox" ]
  305. then
  306. read auth < "$HOME/.ssh/trans_tvbox_auth"
  307. transmission-remote 192.168.100.101:9091 "$auth" "${@:2}"
  308. fi
  309. }
  310. con_transmission_not_download () # 1 аргумент pc или tvbox
  311. {
  312. download_speed="$(fun_transmission "$1" -l | tail -n1 | awk '{print $NF}')"
  313. if [ "$download_speed" == "0.0" ]
  314. then
  315. fun_analize_condition "$1 download speed 0.0"
  316. else
  317. fun_analize_condition "$1 download speed not equal to 0.0"
  318. fi
  319. }
  320. fun_pup_parser ()
  321. # 1 - файл для парсинга, 2 - паттерн для pup, 3 - номер выводимой строки
  322. # Пример: fun_pup_parser ~/Downloads/download.html div[class="day__date"] 1
  323. {
  324. cat "$1" | "$HOME/.pup/pup" "$2" | grep -v "<" | awk '{$1=$1};1' | sed ''$3'!D'
  325. }
  326. fun_pup_parser_all ()
  327. # 1 - файл для парсинга, 2 - паттерн для pup
  328. # тестовая функция для показа всех строк
  329. {
  330. cat "$1" | "$HOME/.pup/pup" "$2" | grep -v "<" | awk '{$1=$1};1'
  331. }
  332. fun_list_files_in_flash () # выдает список файлов на флешке
  333. {
  334. find /media/a/flash59gb/ -maxdepth 2 -type f -printf "%T@ %Tc %p\n" | sort -n
  335. }
  336. fun_color_comb () # Demonstrate color combinations
  337. {
  338. for fg_color in {0..15}; do
  339. set_foreground=$(tput setaf $fg_color)
  340. for bg_color in {0..15}; do
  341. set_background=$(tput setab $bg_color)
  342. echo -n $set_background$set_foreground
  343. printf 'f%sb%s' $fg_color $bg_color
  344. done
  345. echo $(tput sgr0)
  346. done
  347. }
  348. fun_file_resize () # 1 - сократить до размера в Кб, 2 - путь до файла
  349. {
  350. file_size="$(stat "$2" -c %s)"
  351. while [ "$file_size" -gt "$1" ]
  352. do
  353. sed -i 1d "$2" # удаляем первую строку
  354. file_size="$(stat "$2" -c %s)"
  355. done
  356. }
  357. fun_mem_val () # return memory values
  358. {
  359. MemAvailable="$(cat /proc/meminfo | grep "MemAvailable" | awk '{print $2}')"
  360. MemTotal="$(cat /proc/meminfo | grep "MemTotal" | awk '{print $2}')"
  361. MemAvailableP="$(echo "scale=0; ${MemAvailable}/($MemTotal/100)" | bc)"
  362. echo "$MemAvailable / ($MemTotal / 100 ) = $MemAvailableP% MemAvailable"
  363. }