ncc.zabbix_fbsd_templates

Yohn Y. 2025-10-04 Parent:b99e08be3c40

23:b86351df3265 Go to Latest

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

.. v1.r202510.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"
14 fi
16 if ! [ -d "${v_pkg_detail_status_tmp}" ] ; then
17 mkdir -p "${v_pkg_detail_status_tmp}"
18 fi
20 log "Update pakages"
21 pkg update 2>&1 | log
22 # Обновление базы аудита происходит на получении общих данных по пакетам
24 touch "${v_pkg_detail_status_list}"
25 }
28 pkg_get_detail_pkg_list () {
29 local vl_pkg_name
30 local vl_buf
32 cat "${USER_MON_PKG_LIST}" | while read vl_buf; do
33 vl_pkg_name=$(pkg query '%n' "${vl_buf}")
34 [ -n "${vl_pkg_fullname}" ] && echo "${vl_pkg_name}" >> "${v_pkg_detail_status_list}"
35 done
37 service -e | awk '$1 ~ "^/usr/local" {print $1}' | while read vl_buf; do
38 if ! [ -f "$vl_buf" ] ; then
39 continue
40 fi
42 vl_pkg_name="$(pkg which "$vl_buf" | awk '$0 ~ "was installed by package" {print $6}')"
44 if [ -z "$vl_pkg_name" ] ; then
45 log "$vl_buf have no matched pkg"
46 continue
47 fi
49 vl_pkg_name="$(pkg query '%n' "$vl_pkg_name")"
51 {
52 echo "${vl_pkg_name}"
53 pkg query '%rn' "${vl_pkg_name}"
54 pkg query '%dn' "${vl_pkg_name}"
55 } >> "${v_pkg_detail_status_list}"
56 done
57 }
60 pkg_make_detail () {
61 local vl_pkg_buf
62 local vl_pkg_fullname
63 local vl_pkg_repo
64 local vl_pkg_name
65 local vl_pkg_ver
66 local vl_status_file
67 local vl_status_tmp_file
68 local vl_pkg_status
70 pkg_get_detail_pkg_list
71 cat "${v_pkg_detail_status_list}" | sort | uniq | while read vl_pkg_buf; do
72 log "Working with $vl_pkg_buf"
74 vl_pkg_fullname="$(pkg query '%n-%v' "${vl_pkg_buf}")"
76 if [ -z "${vl_pkg_fullname}" ] ; then
77 log_err "${vl_pkg_buf} not found in pkg database"
78 continue
79 fi
81 vl_pkg_name="$(pkg query '%n' "$vl_pkg_fullname")"
82 vl_pkg_repo="$(pkg query '%R' "$vl_pkg_fullname")"
83 vl_pkg_ver="$(pkg query '%v' "$vl_pkg_fullname")"
84 vl_pkg_status="$(pkg version -r "$vl_pkg_repo" -qUn "$vl_pkg_name" | tail -n 1 | awk '{print $2}')"
86 case "$vl_pkg_status" in
87 = )
88 vl_pkg_status=OK
89 ;;
91 "<" )
92 vl_pkg_status="NEED UPDATE"
93 ;;
95 ">" )
96 vl_pkg_status="REPO VERSION LOWER"
97 ;;
99 "?" )
100 vl_pkg_status="NO PACKAGE IN REPO"
101 ;;
103 "!" )
104 vl_pkg_status="ERROR"
105 log_err -s "${vl_pkg_name}: pkg can not compare version of package"
106 ;;
108 * )
109 log_err -s "${vl_pkg_name}: unknown status ${vl_pkg_status}"
110 vl_pkg_status="ERROR"
111 ;;
113 esac
115 vl_status_file="${v_pkg_detail_status}/${vl_pkg_name}"
116 vl_status_tmp_file="${v_pkg_detail_status_tmp}/${vl_pkg_name}"
118 pkg query 'installed=%t\nmainteiner=%m\nsize=%sb\nlocked=%k' "$vl_pkg_fullname" \
119 > "${vl_status_tmp_file}"
121 printf 'ver=%s\nrepo=%s\nstatus=%s\n' "${vl_pkg_ver}" "${vl_pkg_repo}" "${vl_pkg_status}" >> "$vl_status_tmp_file"
124 if [ -n "$(pkg audit -q "$vl_pkg_fullname")" ]; then
125 pkg audit "$vl_pkg_fullname"
126 fi
127 ) > "${vl_status_tmp_file}.audit"
129 mv -f "${vl_status_tmp_file}" "${vl_status_file}"
130 mv -f "${vl_status_tmp_file}.audit" "${vl_status_file}.audit"
131 done
135 pkg_check_up_status () {
136 # Проверка статуса наличия обновления для пакета
137 local vl_pkg_name
138 local vl_pkg_repo
140 cat /dev/null > "$v_pkg_update_status"
141 pkg version -qUL = | awk '$2 != ">" {print $1}' | while read _pkg; do
142 vl_pkg_name="$(pkg query '%n' "${_pkg}")"
143 vl_pkg_repo="$(pkg query '%R' "${_pkg}")"
144 log "Check update for ${vl_pkg_name} in ${vl_pkg_repo}"
145 pkg version -Ur "${vl_pkg_repo}" -n "${vl_pkg_name}" \
146 | awk '$2 == "!" || $2 == "<" || $2 == "?" {print $1}' \
147 | tee -a "$v_pkg_update_status" \
148 | awk '$0 != "" {print "UPDATE STATUS:", $0}' | log
149 done
151 pkg upgrade -Uqn | tee -a "$v_pkg_update_status" | awk '$0 != "" {print "PKG UPGRADE:", $0}' | log
152 mv -f "$v_pkg_update_status" "$v_pkg_update_status_res"
157 pkg_check_pkg_binary () {
158 # Проверяет, нет ли в системе других запущенных приложений pkg.
159 # Необходимо, чтобы не мешать оперативным процессам обновления
162 ps -Ao comm | awk '$1 == "pkg" {print $1}' | wc -l | tr -d ' '
163 } 2>/dev/null
168 pkg_finaly () {
169 # Процедура завершения обработки пакетов
171 # -
172 # Удаляем старые файлы, в которые давно не не пишутся данные по пакетам
173 log "Clean old files -- detail and audit pakages"
174 find "$v_pkg_detail_status" -type f -cmin +30 -print0 | xargs -0n 1 rm -frv 2>&1 | log
178 pkg_do () {
179 local _other_pkgs
181 log_start "pkg_do"
183 _other_pkgs="$(pkg_check_pkg_binary)"
185 if [ "$_other_pkgs" -ne 0 ] ; then
186 log "Pakages update check fail: other '${_other_pkgs}' binary working"
187 ps -Ao comm,ppid,pid,time | awk '$1 == "pkg" {print $0}' | log
189 else
190 pkg_init
192 pkg_check_up_status
193 pkg audit -qrF > "${v_pkg_update_status}.audit"
194 mv -f "${v_pkg_update_status}.audit" "${v_pkg_update_status_res}.audit"
196 pkg_make_detail
197 fi
199 pkg_finaly
200 log_end