ad.backup.zfs

Yohn Y. 2026-05-17

0:00bb6c16b4b6 Go to Latest

ad.backup.zfs/lib/main.sh

.. init . По сути архивация имеющегося самопиского решания для памяти.

History
1 #!/bin/sh
2 # devel.a0fs.net: zfsbackup.lib.log - v0.1 by awgur
3 # ---
4 # Файл содержит процедуры и функции организации определения и исполнения
5 # заданий на резервное копирование наборов данных ZFS
7 # Определяем корень иерархии файлов относительно файла задания $dir_root/task/$task_name
8 # при условии что данная переменная не определена в вызывающем скрипте
9 dir_root="${dir_root:-$(dirname "$(dirname "$(readlink -f "$0")")")}"
10 dir_lib="${dir_lib:-${dir_root}/lib}" # Директория с библиотеками
12 . "${dir_lib}/log.sh"
14 sys_propNamePrefix="net.a0fs.zfsbackup" # префикс для свойств набора данных ZFS,
15 # в которые будут сохранятся параметры
17 sys_backupType_d="daily"
18 sys_backupType_h="hourly"
19 sys_date_now="$(date '+%Y%m%d-%H%M%S')"
20 sys_date_today="$(date '+%Y%m%d')"
21 sys_date_thisHour="$(date '+%Y%m%d-%H')"
23 svc_isNum () {
24 # Проверяет, является ли аргумент числом
25 echo "$1" | grep -vE '^[[:space:]]*$' | sed 's/[[:space:]]//g' | tr -d '\n\r' | grep -E '^[0-9]+$' > /dev/null 2>&1
26 }
28 svc_makeName () {
29 # Конструктор имени снимка. Для однотипного именования по всему скрипту
30 # Аргументы:
31 # dataset_name : Имя набора данных, для которого получаем снимок
32 # backup_type : Имя типа резервного копирования
33 # timeMark : Метка времени
34 if ! [ "$1" -a "$2" -a "$3" ] ; then
35 log_err "svc_makeName(): Not enough arguments (dataset_name='$1', backup_type='$2', timeMark='$3')"
36 return 1
37 fi
38 echo "$1@${sys_propNamePrefix}_${3}_${2}"
39 }
41 svc_date_getSnapTime () {
42 # Получение временной метки из имени снимка
43 local buf
44 if ! [ "$1" ] ; then
45 return 1
46 fi
48 echo "$1" | sed "s/.*@${sys_propNamePrefix}_//" | cut -f 1 -d '_'
49 }
51 svc_date_isToday () {
52 # Проверка, сделан ли снимок набора данных в день проверки
53 local buf
54 if ! [ "$1" ] ; then
55 return 1
56 fi
58 svc_date_getSnapTime "$1" | grep -E "^${sys_date_today}" >/dev/null 2>&1
59 }
61 svc_date_isThisHour () {
62 # Проверка, сделан ли снимок набора данных в час проверки
63 local buf
64 if ! [ "$1" ] ; then
65 return 1
66 fi
68 svc_date_getSnapTime "$1" | grep -E "^${sys_date_thisHour}" >/dev/null 2>&1
69 }
71 zfs_getSnaps () {
72 # Получить список снимков для данного в аргументах набора.
73 # ВНИМАНИЕ! Снимки сортируются в обратном порядке
74 # Аргументы:
75 # dataset_name : Имя набора, для которго получаем снимки
76 # backup_type : Имя типа резервного копирования
77 if ! [ "$1" -a "$2" ] ; then
78 log_err "zfs_getSnaps(): Dataset or backup type not set: dataset='$1' backup_type='$2'"
79 return 1
80 fi
82 zfs list -Ho name -d 1 -r -t snapshot "$1" \
83 | grep -E "@${sys_propNamePrefix}_[0-9]{8}-[0-9]{6}_${2}\$" \
84 | sort -r
85 }
87 zfs_getLastSnap () {
88 # Получить последний снимок созданный системой резервного копирования
89 # Аргументы:
90 # dataset_name : Имя набора, для которого получаем снимок
91 if ! [ "$1" ] ; then
92 log_err "zfs_getLastSnap(): Dataset not set"
93 return 1
94 fi
96 zfs list -Ho name -d 1 -r -t snapshot "$1" \
97 | grep -E "@${sys_propNamePrefix}_[0-9]{8}-[0-9]{6}_" \
98 | sort -r | head -n 1
99 }
101 zfs_getProp () {
102 # Получить значение свойства из zfs, относящиеся к системе резервного копирования
103 # Аргументы:
104 # dataset_name : Имя набора данных
105 # prop_name : Имя свойства
106 local res
108 if ! [ "$1" -a "$2" ] ; then
109 return 1
110 fi
111 res=$(zfs get -Hp -o value "${sys_propNamePrefix}:$2" "$1")
113 if [ "${res}" = "-" ] ; then
114 res=""
115 fi
116 echo "$res"
119 zfs_setProp () {
120 # Установить значение свойства в zfs, относящиеся к системе резервного копирования
121 # Аргументы:
122 # dataset_name : Имя набора данных
123 # prop_name : Имя свойства
124 # prop_value : Значение свойства
125 if ! [ "$1" -a "$2" -a "$3" ] ; then
126 return 1
127 fi
129 zfs set "${sys_propNamePrefix}:$2"="$3" "$1"
130 log "zfs_setProp(): Property changed for '$1': user='$(whoami 2>/dev/null)' uid='$(id -u)' property='$2' value='$3'"
133 zfs_isBackup () {
134 # Необходимо ли резервное копирование для данного набора данных
135 # Аргументы:
136 # dataset_name : Имя исследуемого набора данных
137 case "$(zfs_getProp "$1" "enable")" in
138 yes|y )
139 return 0
140 ;;
141 * )
142 return 1
143 ;;
144 esac
147 zfs_clean () {
148 # Удаление устаревших резервных копий
149 # Аргументы:
150 # dataset_name : Набор данных для которого производится операция
151 # backup_type : Тип резервной копии
152 # count : Количество копий, которые необходимо сохранить
153 local cnt
155 if ! svc_isNum "$3" ; then
156 log_err "zfs_clean(): Wrong backup count: %3 (dataset_name='$1', backup_type='$2')"
157 return 1
158 fi
159 cnt="$(( $cnt + 1 ))"
161 zfs_getSnaps "$1" "$2" \
162 | tail -n "+${cnt}" | xargs -n 1 zfs destroy -v \
163 | awk "{print \"$1: \" \$0 }" | log