ncc.zabbix_fbsd_templates

Yohn Y. 2025-01-24 Parent:f5d65a7f34b3 Child:977edf00b200

15:4b52905c8a66 Go to Latest

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

.. v1.r202501.9 + Атомарно изменяем файлы с информацияе по сосотоянию пакетов + Поддержка приколов pkgng 2.0

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="$STATE_ROOT/pkg_update"
8 v_pkg_detail_status_list="${TMP_ROOT}/pkg_detail_status_list"
10 pkg_init () {
11 if ! [ -d "$v_pkg_detail_status" ]; then
12 mkdir -p "$v_pkg_detail_status"
14 else
15 # Удаляем старые директории, в которые давно не не пишутся данные по пакетам
16 log "Clean old detail pakages"
17 find "$v_pkg_detail_status" -type f -ctime +1 -print0 | xargs -0n 1 rm -frv 2>&1 | log
19 fi
21 if ! [ -d "${v_pkg_detail_status_tmp}" ] ; then
22 mkdir -p "${v_pkg_detail_status_tmp}"
24 fi
26 log "Update pakages"
27 pkg update 2>&1 | log
28 # Обновление базы аудита происходит на получении общих данных по пакетам
30 touch "${v_pkg_detail_status_list}"
31 }
33 pkg_get_detail_pkg_list () {
34 local vl_pkg_name
35 local vl_buf
37 cat "${USER_MON_PKG_LIST}" | while read vl_buf; do
38 vl_pkg_name=$(pkg query '%n' "${vl_buf}")
39 [ -n "${vl_pkg_fullname}" ] && echo "${vl_pkg_name}" >> "${v_pkg_detail_status_list}"
40 done
42 service -e | awk '$1 ~ "^/usr/local" {print $1}' | while read vl_buf; do
43 if ! [ -f "$vl_buf" ] ; then
44 continue
45 fi
47 vl_pkg_name="$(pkg which "$vl_buf" | awk '$0 ~ "was installed by package" {print $6}')"
49 if [ -z "$vl_pkg_name" ] ; then
50 log "$vl_buf have no matched pkg"
51 continue
52 fi
54 vl_pkg_name="$(pkg query '%n' "$vl_pkg_name")"
56 {
57 echo "${vl_pkg_name}"
58 pkg query '%rn' "${vl_pkg_name}"
59 pkg query '%dn' "${vl_pkg_name}"
60 } >> "${v_pkg_detail_status_list}"
61 done
62 }
64 pkg_make_detail () {
65 local vl_pkg_buf
66 local vl_pkg_fullname
67 local vl_pkg_repo
68 local vl_pkg_name
69 local vl_pkg_ver
70 local vl_status_file
71 local vl_status_tmp_file
72 local vl_pkg_status
74 pkg_get_detail_pkg_list
75 cat "${v_pkg_detail_status_list}" | sort | uniq | while read vl_pkg_buf; do
76 log "Working with $vl_pkg_buf"
78 vl_pkg_fullname="$(pkg query '%n-%v' "${vl_pkg_buf}")"
79 vl_pkg_name="$(pkg query '%n' "$vl_pkg_fullname")"
80 vl_pkg_repo="$(pkg query '%R' "$vl_pkg_fullname")"
81 vl_pkg_ver="$(pkg query '%v' "$vl_pkg_fullname")"
82 vl_pkg_status="$(pkg version -r "$vl_pkg_repo" -qUn "$vl_pkg_name" | tail -n 1 | awk '{print $2}')"
84 case "$vl_pkg_status" in
85 = )
86 vl_pkg_status=OK
87 ;;
89 "<" )
90 vl_pkg_status="NEED UPDATE"
91 ;;
93 ">" )
94 vl_pkg_status="REPO VERSION LOWER"
95 ;;
97 "?" )
98 vl_pkg_status="NO PACKAGE IN REPO"
99 ;;
101 "!" )
102 vl_pkg_status="ERROR"
103 log_err -s "${vl_pkg_name}: pkg can not compare version of package"
104 ;;
106 * )
107 log_err -s "${vl_pkg_name}: unknown status ${vl_pkg_status}"
108 vl_pkg_status="ERROR"
109 ;;
111 esac
113 vl_status_file="${v_pkg_detail_status}/${vl_pkg_name}"
114 vl_status_tmp_file="${v_pkg_detail_status_tmp}/${vl_pkg_name}"
116 pkg query 'installed=%t\nmainteiner=%m\nsize=%sb\nlocked=%k' "$vl_pkg_fullname" \
117 > "${vl_status_tmp_file}"
119 printf 'ver=%s\nrepo=%s\nstatus=%s\n' "${vl_pkg_ver}" "${vl_pkg_repo}" "${vl_pkg_status}" >> "$vl_status_tmp_file"
122 if [ -n "$(pkg audit -q "$vl_pkg_fullname")" ]; then
123 pkg audit "$vl_pkg_fullname"
124 fi
125 ) > "${vl_status_tmp_file}.audit"
127 mv -f "${vl_status_tmp_file}" "${vl_status_file}"
128 mv -f "${vl_status_tmp_file}.audit" "${vl_status_file}.audit"
130 done
133 pkg_check_up_status () {
134 # Проверка статуса наличия обновления для пакета
135 local vl_pkg_name
136 local vl_pkg_repo
138 cat /dev/null > "$v_pkg_update_status"
139 pkg version -qUL = | awk '$2 != ">" {print $1}' | while read _pkg; do
140 vl_pkg_name="$(pkg query '%n' "${_pkg}")"
141 vl_pkg_repo="$(pkg query '%R' "${_pkg}")"
142 log "Check update for ${vl_pkg_name} in ${vl_pkg_repo}"
143 pkg version -Ur "${vl_pkg_repo}" -n "${vl_pkg_name}" \
144 | awk '$2 != ">" && $2 != "=" {print $1}' \
145 | tee -a "$v_pkg_update_status" \
146 | awk '$0 != "" {print "UPDATE STATUS:", $0}' | log
147 done
149 pkg upgrade -Uqn | tee -a "$v_pkg_update_status" | awk '$0 != "" {print "PKG UPGRADE:", $0}' | log
152 pkg_do () {
153 log_start "pkg_do"
155 pkg_init
157 pkg_check_up_status
158 pkg audit -qF > "${v_pkg_update_status}.audit"
160 pkg_make_detail
162 log_end