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