ncc.zabbix_fbsd_templates
ncc.zabbix_fbsd_templates/src/aw.fbsd-mon-helper/lib/pkg.sh
* Увеличен разброс по времени запуска * Отучаем утилиту freebsd-update жаловаться на отсутсвие терминала
| 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@11 | 24 local vl_pkg_name |
| awgur@10 | 25 local vl_buf |
| awgur@10 | 26 |
| awgur@10 | 27 cat "${USER_MON_PKG_LIST}" | while read vl_buf; do |
| awgur@11 | 28 vl_pkg_name=$(pkg query '%n' "${vl_buf}") |
| awgur@11 | 29 [ -n "${vl_pkg_fullname}" ] && echo "${vl_pkg_name}" >> "${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@11 | 37 vl_pkg_name="$(pkg which "$vl_buf" | awk '$0 ~ "was installed by package" {print $6}')" |
| awgur@10 | 38 |
| awgur@11 | 39 if [ -z "$vl_pkg_name" ] ; then |
| awgur@10 | 40 log "$vl_buf have no matched pkg" |
| awgur@10 | 41 continue |
| awgur@10 | 42 fi |
| awgur@10 | 43 |
| awgur@11 | 44 vl_pkg_name="$(pkg query '%n' "$vl_pkg_name")" |
| awgur@11 | 45 |
| awgur@10 | 46 { |
| awgur@11 | 47 echo "${vl_pkg_name}" |
| awgur@11 | 48 pkg query '%rn' "${vl_pkg_name}" |
| awgur@11 | 49 pkg query '%dn' "${vl_pkg_name}" |
| awgur@10 | 50 } >> "${v_pkg_detail_status_list}" |
| awgur@10 | 51 done |
| awgur@0 | 52 } |
| awgur@0 | 53 |
| awgur@0 | 54 pkg_make_detail () { |
| awgur@11 | 55 local vl_pkg_buf |
| awgur@4 | 56 local vl_pkg_fullname |
| awgur@0 | 57 local vl_pkg_repo |
| awgur@0 | 58 local vl_pkg_name |
| awgur@0 | 59 local vl_pkg_ver |
| awgur@0 | 60 local vl_status_file |
| awgur@0 | 61 local vl_pkg_status |
| awgur@0 | 62 |
| awgur@10 | 63 pkg_get_detail_pkg_list |
| awgur@11 | 64 cat "${v_pkg_detail_status_list}" | sort | uniq | while read vl_pkg_buf; do |
| awgur@11 | 65 log "Working with $vl_pkg_buf" |
| awgur@0 | 66 |
| awgur@11 | 67 vl_pkg_fullname="$(pkg query '%n-%v' "${vl_pkg_buf}")" |
| awgur@10 | 68 vl_pkg_name="$(pkg query '%n' "$vl_pkg_fullname")" |
| awgur@10 | 69 vl_pkg_repo="$(pkg query '%R' "$vl_pkg_fullname")" |
| awgur@10 | 70 vl_pkg_ver="$(pkg query '%v' "$vl_pkg_fullname")" |
| awgur@10 | 71 vl_pkg_status="$(pkg version -r "$vl_pkg_repo" -qUn "$vl_pkg_name" | awk '{print $2}')" |
| awgur@0 | 72 |
| awgur@10 | 73 case "$vl_pkg_status" in |
| awgur@10 | 74 = ) |
| awgur@10 | 75 vl_pkg_status=OK |
| awgur@10 | 76 ;; |
| awgur@0 | 77 |
| awgur@10 | 78 "<" ) |
| awgur@10 | 79 vl_pkg_status="NEED UPDATE" |
| awgur@10 | 80 ;; |
| awgur@0 | 81 |
| awgur@10 | 82 ">" ) |
| awgur@10 | 83 vl_pkg_status="REPO VERSION LOWER" |
| awgur@10 | 84 ;; |
| awgur@0 | 85 |
| awgur@10 | 86 "?" ) |
| awgur@10 | 87 vl_pkg_status="NO PACKAGE IN REPO" |
| awgur@10 | 88 ;; |
| awgur@0 | 89 |
| awgur@10 | 90 "!" ) |
| awgur@10 | 91 vl_pkg_status="ERROR" |
| awgur@10 | 92 log_err -s "${vl_pkg_name}: pkg can not compare version of package" |
| awgur@10 | 93 ;; |
| awgur@0 | 94 |
| awgur@10 | 95 * ) |
| awgur@10 | 96 log_err -s "${vl_pkg_name}: unknown status ${vl_pkg_status}" |
| awgur@10 | 97 vl_pkg_status="ERROR" |
| awgur@10 | 98 ;; |
| awgur@0 | 99 |
| awgur@10 | 100 esac |
| awgur@0 | 101 |
| awgur@10 | 102 vl_status_file="${v_pkg_detail_status}/${vl_pkg_name}" |
| awgur@10 | 103 pkg query 'installed=%t\nmainteiner=%m\nsize=%sb\nlocked=%k' "$vl_pkg_fullname" \ |
| awgur@10 | 104 > "${vl_status_file}" |
| awgur@0 | 105 |
| awgur@10 | 106 printf 'ver=%s\nrepo=%s\nstatus=%s\n' "${vl_pkg_ver}" "${vl_pkg_repo}" "${vl_pkg_status}" >> "$vl_status_file" |
| awgur@10 | 107 pkg audit "$vl_pkg_fullname" \ |
| awgur@10 | 108 | awk '!($0 ~ "[0-9]* problem\\(s\\) in [0-9]* installed package\\(s\\) found") {print $0}' \ |
| awgur@10 | 109 > "${vl_status_file}.audit" |
| awgur@0 | 110 |
| awgur@10 | 111 done |
| awgur@0 | 112 } |
| awgur@0 | 113 |
| awgur@6 | 114 pkg_check_up_status () { |
| awgur@6 | 115 # Проверка статуса наличия обновления для пакета |
| awgur@7 | 116 local vl_pkg_name |
| awgur@7 | 117 local vl_pkg_repo |
| awgur@6 | 118 |
| awgur@6 | 119 cat /dev/null > "$v_pkg_update_status" |
| awgur@6 | 120 pkg version -qUL = | awk '$2 != ">" {print $1}' | while read _pkg; do |
| awgur@7 | 121 vl_pkg_name="$(pkg query '%n' "${_pkg}")" |
| awgur@7 | 122 vl_pkg_repo="$(pkg query '%R' "${_pkg}")" |
| awgur@8 | 123 log "Check update for ${vl_pkg_name} in ${vl_pkg_repo}" |
| awgur@7 | 124 pkg version -Ur "${vl_pkg_repo}" -n "${vl_pkg_name}" \ |
| awgur@6 | 125 | awk '$2 != ">" && $2 != "=" {print $1}' \ |
| awgur@9 | 126 | tee -a "$v_pkg_update_status" \ |
| awgur@9 | 127 | awk '$0 != "" {print "UPDATE STATUS:", $0}' | log |
| awgur@6 | 128 done |
| awgur@8 | 129 |
| awgur@8 | 130 pkg upgrade -Uqn | tee -a "$v_pkg_update_status" | awk '$0 != "" {print "PKG UPGRADE:", $0}' | log |
| awgur@6 | 131 } |
| awgur@6 | 132 |
| awgur@0 | 133 pkg_do () { |
| awgur@0 | 134 log_start "pkg_do" |
| awgur@0 | 135 |
| awgur@0 | 136 pkg_init |
| awgur@6 | 137 |
| awgur@6 | 138 pkg_check_up_status |
| awgur@0 | 139 pkg audit -qF > "${v_pkg_update_status}.audit" |
| awgur@0 | 140 |
| awgur@0 | 141 pkg_make_detail |
| awgur@0 | 142 |
| awgur@0 | 143 log_end |
| awgur@0 | 144 } |