ncc.zabbix_fbsd_templates
ncc.zabbix_fbsd_templates/src/aw.fbsd-mon-helper/lib/pkg.sh
+ Запчасти для слежения за логами
| 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@0 | 6 |
| awgur@0 | 7 pkg_init () { |
| awgur@0 | 8 if ! [ -d "$v_pkg_detail_status" ]; then |
| awgur@0 | 9 mkdir -p "$v_pkg_detail_status" |
| awgur@0 | 10 else |
| awgur@0 | 11 # Удаляем старые директории, в которые давно не не пишутся данные по пакетам |
| awgur@0 | 12 log "Clean old detail pakages" |
| awgur@0 | 13 find "$v_pkg_detail_status" -type f -ctime +1 -print0 | xargs -0n 1 rm -frv 2>&1 | log |
| awgur@0 | 14 fi |
| awgur@0 | 15 log "Update pakages" |
| awgur@0 | 16 pkg update 2>&1 | log |
| awgur@0 | 17 # Обновление базы аудита происходит на получении общих данных по пакетам |
| awgur@0 | 18 } |
| awgur@0 | 19 |
| awgur@0 | 20 pkg_make_detail () { |
| awgur@4 | 21 local vl_pkg_fullname |
| awgur@0 | 22 local vl_pkg_repo |
| awgur@0 | 23 local vl_pkg_name |
| awgur@0 | 24 local vl_pkg_ver |
| awgur@0 | 25 local vl_status_file |
| awgur@0 | 26 local vl_pkg_status |
| awgur@0 | 27 |
| awgur@0 | 28 service -e | awk '$1 ~ "^/usr/local" {print $1}' | while read svc_file; do |
| awgur@0 | 29 if ! [ -f "$svc_file" ] ; then |
| awgur@0 | 30 continue |
| awgur@0 | 31 fi |
| awgur@0 | 32 |
| awgur@4 | 33 vl_pkg_fullname="$(pkg which "$svc_file" | awk '$0 ~ "was installed by package" {print $6}')" |
| awgur@4 | 34 if [ -z "$vl_pkg_fullname" ] ; then |
| awgur@0 | 35 log "$svc_file have no matched pkg" |
| awgur@0 | 36 continue |
| awgur@0 | 37 fi |
| awgur@0 | 38 |
| awgur@4 | 39 vl_pkg_name="$(pkg query '%n' "$vl_pkg_fullname")" |
| awgur@4 | 40 vl_pkg_repo="$(pkg query '%R' "$vl_pkg_fullname")" |
| awgur@4 | 41 vl_pkg_ver="$(pkg query '%v' "$vl_pkg_fullname")" |
| awgur@4 | 42 vl_pkg_status="$(pkg version -r "$vl_pkg_repo" -qUn "$vl_pkg_name" | awk '{print $2}')" |
| awgur@0 | 43 |
| awgur@0 | 44 case "$vl_pkg_status" in |
| awgur@0 | 45 = ) |
| awgur@0 | 46 vl_pkg_status=OK |
| awgur@0 | 47 ;; |
| awgur@0 | 48 |
| awgur@0 | 49 "<" ) |
| awgur@0 | 50 vl_pkg_status="NEED UPDATE" |
| awgur@0 | 51 ;; |
| awgur@0 | 52 |
| awgur@0 | 53 ">" ) |
| awgur@0 | 54 vl_pkg_status="REPO VERSION LOWER" |
| awgur@0 | 55 ;; |
| awgur@0 | 56 |
| awgur@0 | 57 "?" ) |
| awgur@0 | 58 vl_pkg_status="NO PACKAGE IN REPO" |
| awgur@0 | 59 ;; |
| awgur@0 | 60 |
| awgur@0 | 61 "!" ) |
| awgur@0 | 62 vl_pkg_status="ERROR" |
| awgur@4 | 63 log_err -s "${vl_pkg_name}: pkg can not compare version of package" |
| awgur@0 | 64 ;; |
| awgur@0 | 65 |
| awgur@0 | 66 * ) |
| awgur@4 | 67 log_err -s "${vl_pkg_name}: unknown status ${vl_pkg_status}" |
| awgur@0 | 68 vl_pkg_status="ERROR" |
| awgur@0 | 69 ;; |
| awgur@0 | 70 |
| awgur@0 | 71 esac |
| awgur@0 | 72 |
| awgur@0 | 73 vl_status_file="${v_pkg_detail_status}/${vl_pkg_name}" |
| awgur@4 | 74 pkg query 'installed=%t\nmainteiner=%m\nsize=%sb\nlocked=%k' "$vl_pkg_fullname" \ |
| awgur@0 | 75 > "${vl_status_file}" |
| awgur@0 | 76 |
| awgur@0 | 77 printf 'ver=%s\nrepo=%s\nstatus=%s\n' "${vl_pkg_ver}" "${vl_pkg_repo}" "${vl_pkg_status}" >> "$vl_status_file" |
| awgur@4 | 78 pkg audit "$vl_pkg_fullname" \ |
| awgur@0 | 79 | awk '!($0 ~ "[0-9]* problem\\(s\\) in [0-9]* installed package\\(s\\) found") {print $0}' \ |
| awgur@0 | 80 > "${vl_status_file}.audit" |
| awgur@0 | 81 |
| awgur@0 | 82 done |
| awgur@0 | 83 } |
| awgur@0 | 84 |
| awgur@0 | 85 pkg_do () { |
| awgur@0 | 86 log_start "pkg_do" |
| awgur@0 | 87 |
| awgur@0 | 88 pkg_init |
| awgur@0 | 89 pkg version -qUL = | awk '$2 != ">" {print $1}' > "$v_pkg_update_status" |
| awgur@0 | 90 pkg audit -qF > "${v_pkg_update_status}.audit" |
| awgur@0 | 91 |
| awgur@0 | 92 pkg_make_detail |
| awgur@0 | 93 |
| awgur@0 | 94 log_end |
| awgur@0 | 95 } |