您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

185 行
4.9 KiB

  1. #!/usr/bin/env bash
  2. . /etc/log2ram.conf
  3. if [ -z "$PATH_DISK" ]; then
  4. PATH_DISK='/var/log'
  5. fi
  6. LOG_NAME='log2ram.log'
  7. NO_RSYNC=${USE_RSYNC#true}
  8. ## @fn is_safe()
  9. ## @brief Check if hdd log exists
  10. is_safe() {
  11. [ -d "$HDD_LOG" ] || echo "ERROR: $HDD_LOG/ doesn't exist! Can't sync."
  12. [ -d "$HDD_LOG" ] || exit 1
  13. }
  14. ## @fn journald_logrotate()
  15. ## @brief Logrotate the journal if the current RAM_LOG path is part of the journald directory
  16. journald_logrotate() {
  17. if ! [ -x "$(command -v journalctl)" ] || ! [ "$JOURNALD_AWARE" = true ]; then
  18. return 1
  19. fi
  20. if journalctl --header | grep "File path" | grep "$RAM_LOG" >/dev/null 2>&1; then
  21. journalctl --rotate
  22. return 0
  23. else
  24. return 1
  25. fi
  26. }
  27. ## @fn sync_to_disk()
  28. ## @brief Sync memory back to hard disk
  29. sync_to_disk() {
  30. is_safe
  31. optional_params=()
  32. if journald_logrotate; then
  33. optional_params+=("--include=journal/*/*@*.journal")
  34. optional_params+=("--exclude=journal/*/*")
  35. fi
  36. if [ -z "${NO_RSYNC}" ] && [ -x "$(command -v rsync)" ]; then
  37. rsync -aXv --inplace --no-whole-file --delete-after "${optional_params[@]}" "$RAM_LOG"/ "$HDD_LOG"/ 2>&1 |
  38. tee -a "$LOG2RAM_LOG"
  39. else
  40. cp -rfup "$RAM_LOG"/ -T "$HDD_LOG"/ 2>&1 | tee -a "$LOG2RAM_LOG"
  41. fi
  42. }
  43. ## @fn sync_from_disk()
  44. ## @brief Sync hard disk to memory
  45. sync_from_disk() {
  46. is_safe
  47. TP_SIZE=$SIZE
  48. if [ "$ZL2R" = true ]; then
  49. TP_SIZE=$LOG_DISK_SIZE
  50. fi
  51. if [ -n "$(du -sh -t "$TP_SIZE" "$HDD_LOG"/ | cut -f1)" ]; then
  52. echo "ERROR: RAM disk for \"$HDD_LOG/\" too small. Can't sync."
  53. echo -e "File(s) causing issues\n: $(du -sh -t "$TP_SIZE" "$HDD_LOG"/*)"
  54. umount -l "$RAM_LOG"/
  55. umount -l "$HDD_LOG"/
  56. if [ "$MAIL" = true ]; then
  57. echo "LOG2RAM : No place on RAM for \"$HDD_LOG/\" anymore, fallback on the disk" | mail -s 'Log2Ram Error' root
  58. fi
  59. exit 1
  60. fi
  61. if [ -z "${NO_RSYNC}" ] && [ -x "$(command -v rsync)" ]; then
  62. rsync -aXv --inplace --no-whole-file --delete-after "$HDD_LOG"/ "$RAM_LOG"/ 2>&1 | tee -a "$LOG2RAM_LOG"
  63. else
  64. cp -rfup "$HDD_LOG"/ -T "$RAM_LOG"/ 2>&1 | tee -a "$LOG2RAM_LOG"
  65. fi
  66. }
  67. ## @fn wait_for()
  68. ## @brief Wait for directory and create test file to make sure the directory exists
  69. ## @param param1 path to the directory
  70. wait_for() {
  71. WAIT_PATH="$1"
  72. while ! findmnt "$WAIT_PATH" >/dev/null; do
  73. sleep 0.1
  74. done
  75. while [ ! -f "$WAIT_PATH/log2ram.test" ]; do
  76. touch "$WAIT_PATH/log2ram.test"
  77. sleep 0.1
  78. done
  79. rm "$WAIT_PATH/log2ram.test"
  80. }
  81. ## @fn create_zram_log_drive()
  82. ## @brief Create zram log device
  83. create_zram_log_drive() {
  84. # Check Zram Class created
  85. if [ ! -d "/sys/class/zram-control" ]; then
  86. modprobe zram
  87. RAM_DEV='0'
  88. else
  89. RAM_DEV=$(cat /sys/class/zram-control/hot_add)
  90. fi
  91. echo "$COMP_ALG" >"/sys/block/zram${RAM_DEV}/comp_algorithm"
  92. echo "$LOG_DISK_SIZE" >"/sys/block/zram${RAM_DEV}/disksize"
  93. echo "$SIZE" >"/sys/block/zram${RAM_DEV}/mem_limit"
  94. mke2fs -t ext4 "/dev/zram${RAM_DEV}"
  95. }
  96. case "$1" in
  97. start)
  98. IFS=';'
  99. for i in $PATH_DISK; do
  100. # Skip the path if the folder doesn't exist
  101. [ ! -d "$i" ] && continue
  102. PATH_FIRST_PART="${i%/*}"
  103. PATH_LAST_PART="${i##/*/}"
  104. RAM_LOG="$i"
  105. HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}"
  106. LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}"
  107. [ -d "$HDD_LOG" ] || mkdir "$HDD_LOG"
  108. mount --bind "$RAM_LOG"/ "$HDD_LOG"/
  109. mount --make-private "$HDD_LOG"/
  110. wait_for "$HDD_LOG"
  111. if [ "$ZL2R" = true ]; then
  112. create_zram_log_drive
  113. mount -t ext4 -o nosuid,noexec,noatime,nodev,user=log2ram "/dev/zram${RAM_DEV}" "$RAM_LOG"/
  114. else
  115. mount -t tmpfs -o "nosuid,noexec,noatime,nodev,mode=0755,size=${SIZE}" log2ram "$RAM_LOG"/
  116. fi
  117. wait_for "$RAM_LOG"
  118. sync_from_disk
  119. done
  120. exit 0
  121. ;;
  122. stop)
  123. IFS=';'
  124. for i in $PATH_DISK; do
  125. PATH_FIRST_PART="${i%/*}"
  126. PATH_LAST_PART="${i##/*/}"
  127. RAM_LOG="$i"
  128. HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}"
  129. LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}"
  130. sync_to_disk
  131. #ZRAM_LOG=$(awk '$2 == "/var/log" {print $1}' /proc/mounts)
  132. #ZRAM_LOG=$(echo ${ZRAM_LOG} | grep -o -E '[0-9]+')
  133. umount -l "$RAM_LOG"/
  134. umount -l "$HDD_LOG"/
  135. # Unsure as even with Root permision denied
  136. #echo ${ZRAM_LOG} > /sys/class/zram-control/hot_remove
  137. done
  138. exit 0
  139. ;;
  140. write)
  141. IFS=';'
  142. for i in $PATH_DISK; do
  143. PATH_FIRST_PART="${i%/*}"
  144. PATH_LAST_PART="${i##/*/}"
  145. RAM_LOG="$i"
  146. HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}"
  147. LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}"
  148. sync_to_disk
  149. done
  150. exit 0
  151. ;;
  152. *)
  153. echo 'Usage: log2ram {start|stop|write}' >&2
  154. exit 1
  155. ;;
  156. esac