ncc.zabbix_fbsd_templates

Yohn Y. 2024-10-17 Parent:073195ae32a4 Child:f5d65a7f34b3

10:8e4f72f0be61 Go to Latest

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

+ Мониторим не только сами активные сетевые сервисы, но и их зависимости, #1 + Версия, для отслеживания состояния набора скиптов через zabbix, #3 + Возможность мониторинга дополнительных пакетов, задаётся в конфиге, #2 + Не позволяем запиститься с отсутствующей директорией состояний, #4

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