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