ncc.zabbix_fbsd_templates

Yohn Y. 2025-02-11 Parent:977edf00b200 Child:4c0387be9c91

17:8b401f8069e3 Go to Latest

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

.. v1.r202502.1 * Не допускаем ложного сброса триггера наличия пакетов для обновления.

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_res="${STATE_ROOT}/pkg_update"
9 v_pkg_detail_status_list="${TMP_ROOT}/pkg_detail_status_list"
11 pkg_init () {
12 if ! [ -d "$v_pkg_detail_status" ]; then
13 mkdir -p "$v_pkg_detail_status"
15 else
16 # Удаляем старые директории, в которые давно не не пишутся данные по пакетам
17 log "Clean old detail pakages"
18 find "$v_pkg_detail_status" -type f -ctime +1 -print0 | xargs -0n 1 rm -frv 2>&1 | log
20 fi
22 if ! [ -d "${v_pkg_detail_status_tmp}" ] ; then
23 mkdir -p "${v_pkg_detail_status_tmp}"
25 fi
27 log "Update pakages"
28 pkg update 2>&1 | log
29 # Обновление базы аудита происходит на получении общих данных по пакетам
31 touch "${v_pkg_detail_status_list}"
32 }
34 pkg_get_detail_pkg_list () {
35 local vl_pkg_name
36 local vl_buf
38 cat "${USER_MON_PKG_LIST}" | while read vl_buf; do
39 vl_pkg_name=$(pkg query '%n' "${vl_buf}")
40 [ -n "${vl_pkg_fullname}" ] && echo "${vl_pkg_name}" >> "${v_pkg_detail_status_list}"
41 done
43 service -e | awk '$1 ~ "^/usr/local" {print $1}' | while read vl_buf; do
44 if ! [ -f "$vl_buf" ] ; then
45 continue
46 fi
48 vl_pkg_name="$(pkg which "$vl_buf" | awk '$0 ~ "was installed by package" {print $6}')"
50 if [ -z "$vl_pkg_name" ] ; then
51 log "$vl_buf have no matched pkg"
52 continue
53 fi
55 vl_pkg_name="$(pkg query '%n' "$vl_pkg_name")"
57 {
58 echo "${vl_pkg_name}"
59 pkg query '%rn' "${vl_pkg_name}"
60 pkg query '%dn' "${vl_pkg_name}"
61 } >> "${v_pkg_detail_status_list}"
62 done
63 }
65 pkg_make_detail () {
66 local vl_pkg_buf
67 local vl_pkg_fullname
68 local vl_pkg_repo
69 local vl_pkg_name
70 local vl_pkg_ver
71 local vl_status_file
72 local vl_status_tmp_file
73 local vl_pkg_status
75 pkg_get_detail_pkg_list
76 cat "${v_pkg_detail_status_list}" | sort | uniq | while read vl_pkg_buf; do
77 log "Working with $vl_pkg_buf"
79 vl_pkg_fullname="$(pkg query '%n-%v' "${vl_pkg_buf}")"
80 vl_pkg_name="$(pkg query '%n' "$vl_pkg_fullname")"
81 vl_pkg_repo="$(pkg query '%R' "$vl_pkg_fullname")"
82 vl_pkg_ver="$(pkg query '%v' "$vl_pkg_fullname")"
83 vl_pkg_status="$(pkg version -r "$vl_pkg_repo" -qUn "$vl_pkg_name" | tail -n 1 | awk '{print $2}')"
85 case "$vl_pkg_status" in
86 = )
87 vl_pkg_status=OK
88 ;;
90 "<" )
91 vl_pkg_status="NEED UPDATE"
92 ;;
94 ">" )
95 vl_pkg_status="REPO VERSION LOWER"
96 ;;
98 "?" )
99 vl_pkg_status="NO PACKAGE IN REPO"
100 ;;
102 "!" )
103 vl_pkg_status="ERROR"
104 log_err -s "${vl_pkg_name}: pkg can not compare version of package"
105 ;;
107 * )
108 log_err -s "${vl_pkg_name}: unknown status ${vl_pkg_status}"
109 vl_pkg_status="ERROR"
110 ;;
112 esac
114 vl_status_file="${v_pkg_detail_status}/${vl_pkg_name}"
115 vl_status_tmp_file="${v_pkg_detail_status_tmp}/${vl_pkg_name}"
117 pkg query 'installed=%t\nmainteiner=%m\nsize=%sb\nlocked=%k' "$vl_pkg_fullname" \
118 > "${vl_status_tmp_file}"
120 printf 'ver=%s\nrepo=%s\nstatus=%s\n' "${vl_pkg_ver}" "${vl_pkg_repo}" "${vl_pkg_status}" >> "$vl_status_tmp_file"
123 if [ -n "$(pkg audit -q "$vl_pkg_fullname")" ]; then
124 pkg audit "$vl_pkg_fullname"
125 fi
126 ) > "${vl_status_tmp_file}.audit"
128 mv -f "${vl_status_tmp_file}" "${vl_status_file}"
129 mv -f "${vl_status_tmp_file}.audit" "${vl_status_file}.audit"
131 done
134 pkg_check_up_status () {
135 # Проверка статуса наличия обновления для пакета
136 local vl_pkg_name
137 local vl_pkg_repo
139 cat /dev/null > "$v_pkg_update_status"
140 pkg version -qUL = | awk '$2 != ">" {print $1}' | while read _pkg; do
141 vl_pkg_name="$(pkg query '%n' "${_pkg}")"
142 vl_pkg_repo="$(pkg query '%R' "${_pkg}")"
143 log "Check update for ${vl_pkg_name} in ${vl_pkg_repo}"
144 pkg version -Ur "${vl_pkg_repo}" -n "${vl_pkg_name}" \
145 | awk '$2 == "!" || $2 == "<" || $2 == "?" {print $1}' \
146 | tee -a "$v_pkg_update_status" \
147 | awk '$0 != "" {print "UPDATE STATUS:", $0}' | log
148 done
150 pkg upgrade -Uqn | tee -a "$v_pkg_update_status" | awk '$0 != "" {print "PKG UPGRADE:", $0}' | log
151 mv -f "$v_pkg_update_status" "$v_pkg_update_status_res"
155 pkg_do () {
156 log_start "pkg_do"
158 pkg_init
160 pkg_check_up_status
161 pkg audit -qF > "${v_pkg_update_status}.audit"
162 mv -f "${v_pkg_update_status}.audit" "${v_pkg_update_status_res}.audit"
164 pkg_make_detail
166 log_end