ncc.zabbix_fbsd_templates
25:c1d9bf2ab39e
Go to Latest
ncc.zabbix_fbsd_templates/src/aw.fbsd-mon-helper/lib/pkg.sh
.. v1.r202602.4
* Исправлена ошибка с неверным перенаправлением логов ошибок, приводящая к отправке сообщений не в файл, а в демону cron
* Если в результате плохой связности не удалось оюновить базы данных пакетов или аудита, не делаем ничего с имеющимися данными. Это позаоляет не флапать мониторингом на плохих каналах.
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"
13 if !
[ -d
"$v_pkg_detail_status" ]; then
14 mkdir
-p
"$v_pkg_detail_status"
17 if !
[ -d
"${v_pkg_detail_status_tmp}" ]; then
18 mkdir
-p
"${v_pkg_detail_status_tmp}"
21 if !
[ -d
"${v_pkg_update_status_subs}" ]; then
22 mkdir
-p
"${v_pkg_update_status_subs}"
28 echo $? >
"${v_pkg_update_status_subs}/pkg_update"
31 # Обновление базы аудита происходит на получении общих данных по пакетам
33 touch
"${v_pkg_detail_status_list}"
37 pkg_get_detail_pkg_list
() {
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}"
46 service
-e
| awk
'$1 ~ "^/usr/local" {print $1}' | while read vl_buf
; do
47 if !
[ -f
"$vl_buf" ] ; then
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"
58 vl_pkg_name="$(pkg
query
'%n' "$vl_pkg_name")"
62 pkg
query
'%rn' "${vl_pkg_name}"
63 pkg
query
'%dn' "${vl_pkg_name}"
64 } >>
"${v_pkg_detail_status_list}"
76 local vl_status_tmp_file
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"
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
101 vl_pkg_status="NEED UPDATE"
105 vl_pkg_status="REPO VERSION LOWER"
109 vl_pkg_status="NO PACKAGE IN REPO"
113 vl_pkg_status="ERROR"
114 log_err
-s
"${vl_pkg_name}: pkg can not compare version of package"
118 log_err
-s
"${vl_pkg_name}: unknown status ${vl_pkg_status}"
119 vl_pkg_status="ERROR"
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"
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"
144 pkg_check_up_status
() {
145 # Проверка статуса наличия обновления для пакета
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
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
' '
178 # Процедура завершения обработки пакетов
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
187 log
"WARN: pkg update end with error, do nothing"
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
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")"
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"
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"