ncc.zabbix_fbsd_templates

Yohn Y. 2026-02-15 Parent:b86351df3265 Child:40a104df6589

25:c1d9bf2ab39e Go to Latest

ncc.zabbix_fbsd_templates/src/aw.fbsd-mon-helper/lib/pkg.sh

.. v1.r202602.4 * Исправлена ошибка с неверным перенаправлением логов ошибок, приводящая к отправке сообщений не в файл, а в демону cron * Если в результате плохой связности не удалось оюновить базы данных пакетов или аудита, не делаем ничего с имеющимися данными. Это позаоляет не флапать мониторингом на плохих каналах.

History
1 #!/bin/sh
2 # Различная статистика по пакетам
4 v_pkg_detail_status="$STATE_ROOT/pkg_detail"
5 v_pkg_detail_status_tmp="${TMP_ROOT}/pkg_detail"
7 v_pkg_update_status="${TMP_ROOT}/pkg_update"
8 v_pkg_update_status_subs="${TMP_ROOT}/pkg_update.subs"
9 v_pkg_update_status_res="${STATE_ROOT}/pkg_update"
10 v_pkg_detail_status_list="${TMP_ROOT}/pkg_detail_status_list"
12 pkg_init () {
13 if ! [ -d "$v_pkg_detail_status" ]; then
14 mkdir -p "$v_pkg_detail_status"
15 fi
17 if ! [ -d "${v_pkg_detail_status_tmp}" ]; then
18 mkdir -p "${v_pkg_detail_status_tmp}"
19 fi
21 if ! [ -d "${v_pkg_update_status_subs}" ]; then
22 mkdir -p "${v_pkg_update_status_subs}"
23 fi
25 log "Update pakages"
26 (
27 pkg update 2>&1
28 echo $? > "${v_pkg_update_status_subs}/pkg_update"
30 ) | log
31 # Обновление базы аудита происходит на получении общих данных по пакетам
33 touch "${v_pkg_detail_status_list}"
34 }
37 pkg_get_detail_pkg_list () {
38 local vl_pkg_name
39 local vl_buf
41 cat "${USER_MON_PKG_LIST}" | while read vl_buf; do
42 vl_pkg_name=$(pkg query '%n' "${vl_buf}")
43 [ -n "${vl_pkg_fullname}" ] && echo "${vl_pkg_name}" >> "${v_pkg_detail_status_list}"
44 done
46 service -e | awk '$1 ~ "^/usr/local" {print $1}' | while read vl_buf; do
47 if ! [ -f "$vl_buf" ] ; then
48 continue
49 fi
51 vl_pkg_name="$(pkg which "$vl_buf" | awk '$0 ~ "was installed by package" {print $6}')"
53 if [ -z "$vl_pkg_name" ] ; then
54 log "$vl_buf have no matched pkg"
55 continue
56 fi
58 vl_pkg_name="$(pkg query '%n' "$vl_pkg_name")"
60 {
61 echo "${vl_pkg_name}"
62 pkg query '%rn' "${vl_pkg_name}"
63 pkg query '%dn' "${vl_pkg_name}"
64 } >> "${v_pkg_detail_status_list}"
65 done
66 }
69 pkg_make_detail () {
70 local vl_pkg_buf
71 local vl_pkg_fullname
72 local vl_pkg_repo
73 local vl_pkg_name
74 local vl_pkg_ver
75 local vl_status_file
76 local vl_status_tmp_file
77 local vl_pkg_status
79 pkg_get_detail_pkg_list
80 cat "${v_pkg_detail_status_list}" | sort | uniq | while read vl_pkg_buf; do
81 log "Working with $vl_pkg_buf"
83 vl_pkg_fullname="$(pkg query '%n-%v' "${vl_pkg_buf}")"
85 if [ -z "${vl_pkg_fullname}" ] ; then
86 log_err "${vl_pkg_buf} not found in pkg database"
87 continue
88 fi
90 vl_pkg_name="$(pkg query '%n' "$vl_pkg_fullname")"
91 vl_pkg_repo="$(pkg query '%R' "$vl_pkg_fullname")"
92 vl_pkg_ver="$(pkg query '%v' "$vl_pkg_fullname")"
93 vl_pkg_status="$(pkg version -r "$vl_pkg_repo" -qUn "$vl_pkg_name" | tail -n 1 | awk '{print $2}')"
95 case "$vl_pkg_status" in
96 = )
97 vl_pkg_status=OK
98 ;;
100 "<" )
101 vl_pkg_status="NEED UPDATE"
102 ;;
104 ">" )
105 vl_pkg_status="REPO VERSION LOWER"
106 ;;
108 "?" )
109 vl_pkg_status="NO PACKAGE IN REPO"
110 ;;
112 "!" )
113 vl_pkg_status="ERROR"
114 log_err -s "${vl_pkg_name}: pkg can not compare version of package"
115 ;;
117 * )
118 log_err -s "${vl_pkg_name}: unknown status ${vl_pkg_status}"
119 vl_pkg_status="ERROR"
120 ;;
122 esac
124 vl_status_file="${v_pkg_detail_status}/${vl_pkg_name}"
125 vl_status_tmp_file="${v_pkg_detail_status_tmp}/${vl_pkg_name}"
127 pkg query 'installed=%t\nmainteiner=%m\nsize=%sb\nlocked=%k' "$vl_pkg_fullname" \
128 > "${vl_status_tmp_file}"
130 printf 'ver=%s\nrepo=%s\nstatus=%s\n' "${vl_pkg_ver}" "${vl_pkg_repo}" "${vl_pkg_status}" >> "$vl_status_tmp_file"
133 if [ -n "$(pkg audit -q "$vl_pkg_fullname")" ]; then
134 pkg audit "$vl_pkg_fullname"
135 fi
136 ) > "${vl_status_tmp_file}.audit"
138 mv -f "${vl_status_tmp_file}" "${vl_status_file}"
139 mv -f "${vl_status_tmp_file}.audit" "${vl_status_file}.audit"
140 done
144 pkg_check_up_status () {
145 # Проверка статуса наличия обновления для пакета
146 local vl_pkg_name
147 local vl_pkg_repo
149 cat /dev/null > "$v_pkg_update_status"
150 pkg version -qUL = | awk '$2 != ">" {print $1}' | while read _pkg; do
151 vl_pkg_name="$(pkg query '%n' "${_pkg}")"
152 vl_pkg_repo="$(pkg query '%R' "${_pkg}")"
153 log "Check update for ${vl_pkg_name} in ${vl_pkg_repo}"
154 pkg version -Ur "${vl_pkg_repo}" -n "${vl_pkg_name}" \
155 | awk '$2 == "!" || $2 == "<" || $2 == "?" {print $1}' \
156 | tee -a "$v_pkg_update_status" \
157 | awk '$0 != "" {print "UPDATE STATUS:", $0}' | log
158 done
160 pkg upgrade -Uqn | tee -a "$v_pkg_update_status" | awk '$0 != "" {print "PKG UPGRADE:", $0}' | log
161 mv -f "$v_pkg_update_status" "$v_pkg_update_status_res"
166 pkg_check_pkg_binary () {
167 # Проверяет, нет ли в системе других запущенных приложений pkg.
168 # Необходимо, чтобы не мешать оперативным процессам обновления
171 ps -Ao comm | awk '$1 == "pkg" {print $1}' | wc -l | tr -d ' '
172 } 2>/dev/null
177 pkg_finaly () {
178 # Процедура завершения обработки пакетов
180 # -
181 # Удаляем старые файлы, в которые давно не не пишутся данные по пакетам
182 if [ "$(cat "${v_pkg_update_status_subs}/pkg_update")" -eq 0 ] ; then
183 log "Clean old files -- detail and audit pakages"
184 find "$v_pkg_detail_status" -type f -cmin +30 -print0 | xargs -0n 1 rm -frv 2>&1 | log
186 else
187 log "WARN: pkg update end with error, do nothing"
188 fi
192 pkg_do () {
193 local _other_pkgs
195 log_start "pkg_do"
197 _other_pkgs="$(pkg_check_pkg_binary)"
199 if [ "$_other_pkgs" -ne 0 ] ; then
200 log "Pakages update check fail: other '${_other_pkgs}' binary working"
201 ps -Ao comm,ppid,pid,time | awk '$1 == "pkg" {print $0}' | log
203 else
204 pkg_init
206 if [ "$(cat "${v_pkg_update_status_subs}/pkg_update")" -ne 0 ] ; then
207 log_err "Error on update packages. pkg update status: $(cat "${v_pkg_update_status_subs}/pkg_update")"
209 else
210 pkg_check_up_status
211 pkg_make_detail
212 fi
214 pkg audit -qrF \
215 > "${v_pkg_update_status}.audit" \
216 2> "${v_pkg_update_status_subs}/pkg_audit_err"
218 # Финт ушами, поскольку pkg audit возвращает 1 если всё нормально, но есть пакеты с уязвимостями
219 # и если не всё нормально тоже...
220 if [ "$(cat "${v_pkg_update_status_subs}/pkg_audit_err" | wc -l)" -eq 0 ] ; then
221 mv -f "${v_pkg_update_status}.audit" "${v_pkg_update_status_res}.audit"
223 else
224 log_err "Error on fetch vuln data. pkg audit err:"
225 cat "${v_pkg_update_status_subs}/pkg_audit_err" | awk '{print "PKG AUDIT ERR:", $0}' | log_err
226 touch "${v_pkg_update_status_res}.audit"
227 fi
229 fi
231 pkg_finaly
232 log_end