zoukankan      html  css  js  c++  java
  • 系统统计脚本

    [root@mysqlmaster mysql]# bash system_summary 
    # Aspersa System Summary Report ##############################
            Date | 2015-03-12 07:55:19 UTC (local TZ: CST +0800)
        Hostname | mysqlmaster
          Uptime | 1:17, 2 users, load average: 1.68, 1.22, 0.60
          System | VMware, Inc.; VMware Virtual Platform; vNone (Other)
     Service Tag | VMware-56 4d 0f 34 fb 1f a3 74-bc fa 0c 56 46 58 e0 c1
        Platform | Linux
         Release | Red Hat Enterprise Linux Server release 5.6 (Tikanga)
          Kernel | 2.6.18-238.el5
    Architecture | CPU = 32-bit, OS = 32-bit
       Threading | NPTL 2.5
        Compiler | GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-50).
         SELinux | Disabled
     Virtualized | VMWare
    # Processor ##################################################
      Processors | physical = 1, cores = 0, virtual = 1, hyperthreading = no
          Speeds | 1x1596.000
          Models | 1xIntel(R) Core(TM)2 CPU T5200 @ 1.60GHz
          Caches | 1x2048 KB
    # Memory #####################################################
           Total | 1010.46M
            Free | 13.41M
            Used | physical = 997.05M, swap = 0.00k, virtual = 997.05M
         Buffers | 42.81M
          Caches | 310.28M
           Dirty | 816 kB
         UsedRSS | 651.3M
      Swappiness | vm.swappiness = 60
     DirtyPolicy | vm.dirty_ratio = 40, vm.dirty_background_ratio = 10
     DirtyStatus | vm.dirty_bytes = 0, vm.dirty_background_bytes = 0
      Locator   Size     Speed             Form Factor   Type          Type Detail
      ========= ======== ================= ============= ============= ===========
      RAM slot #0 1024 MB  Unknown           DIMM          DRAM          EDO     
      RAM slot #10 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #11 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #12 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #13 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #14 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #1 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #2 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #3 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #4 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #5 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #6 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #7 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #8 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
      RAM slot #9 {EMPTY}  Unknown           DIMM          DRAM          Unknown 
    # Mounted Filesystems ########################################
      Filesystem                       Size Used Type  Opts Mountpoint
      /dev/mapper/VolGroup00-LogVol00   13G  72% ext3  rw   /
      /dev/sda1                         99M  13% ext3  rw   /boot
      tmpfs                            506M   0% tmpfs rw   /dev/shm
    # Disk Schedulers And Queue Size #############################
             hdc | [cfq] 128
             sda | [cfq] 128
    # Disk Partioning ############################################
    Device       Type      Start        End               Size
    ============ ==== ========== ========== ==================
    /dev/hdc     Disk                               3188559872
    /dev/sda     Disk                              16106127360
    /dev/sda1    Part          1         13           98703360
    /dev/sda2    Part         14       1958        15989944320
    # Kernel Inode State #########################################
    dentry-state | 50263 42307 45 0 0 0
         file-nr | 2560 0 102180
        inode-nr | 46442 2498
    # LVM Volumes ################################################
      LV       VG         Attr   LSize  Origin Snap%  Move Log Copy%  Convert
      LogVol00 VolGroup00 -wi-ao 12.88G                                      
      LogVol01 VolGroup00 -wi-ao  2.00G                                      
    # RAID Controller ############################################
      Controller | No RAID controller detected
    # Network Config #############################################
      Controller | Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
     FIN Timeout | net.ipv4.tcp_fin_timeout = 60
      Port Range | net.ipv4.ip_local_port_range = 32768 61000
    # Interface Statistics #######################################
      interface  rx_bytes rx_packets  rx_errors   tx_bytes tx_packets  tx_errors
      ========= ========= ========== ========== ========== ========== ==========
      lo           500000       9000          0     500000       9000          0
      eth0         500000       3500          0     700000       8000          0
    # Network Connections ########################################
      Connections from remote IP addresses
        192.168.128.1       2
      Connections to local IP addresses
        192.168.128.128     2
      Connections to top 10 local ports
        22                  2
      States of connections
        ESTABLISHED         2
        LISTEN              5
    # Top Processes ##############################################
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
     6495 root      39  19  6368 1796  960 S  7.8  0.2   0:17.79 makewhatis
    24469 root      39  19  5700 1264  860 S  3.9  0.1   0:00.02 gawk
    24434 root      20   0  2264  928  728 R  1.9  0.1   0:00.02 top
        1 root      15   0  2160  656  564 S  0.0  0.1   0:02.04 init
        2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
        3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
        4 root      10  -5     0    0    0 S  0.0  0.0   0:00.19 events/0
        5 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 khelper
        6 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
    # Simplified and fuzzy rounded vmstat (wait please) ##########
      procs  ---swap-- -----io---- ---system---- --------cpu--------
       r  b    si   so    bi    bo     ir     cs  us  sy  il  wa  st
       3  0     0    0   150    25    800    150   1   9  83   7   0
       3  0     0    0    50   350    900    400   7  85   0   8   0
       1  0     0    0    50     0    900    400  10  87   0   3   0
       1  0     0    0    45     0    900    400  10  86   0   4   0
       3  0     0    0    50     0   1000    400   9  87   0   4   0
    # The End ####################################################

    [root@mysqlmaster mysql]# 

    脚本的内容为:

    #!/bin/sh
    # This program is part of Aspersa (http://code.google.com/p/aspersa/)


    # ########################################################################
    # A script to summarize system information in a nice way.
    # Goals: work well on Linux; create a compact diff-able report that is
    # easy to paste into a wiki or email, and easy to scan and compare too.
    #
    # Usage: $ wget -O- http://aspersa.googlecode.com/svn/trunk/summary |bash
    # Options are set through the ASPERSA_SKIP environment variable.  Set this
    # variable to a comma-separated list of things you want to omit.
    # Options:
    #  MOUNT:   Don't print out mounted filesystems and disk fullness.
    #  NETWORK: Don't print out information on network controllers & config.
    #  PROCESS: Don't print out top processes and vmstat information.
    #
    # Authors:
    #  Baron Schwartz
    #  Kevin van Zonneveld (kvz@php.net || http://kevin.vanzonneveld.net)
    # ########################################################################


    # ########################################################################
    # Globals, settings, helper functions
    # ########################################################################
    POSIXLY_CORRECT=1
    export POSIXLY_CORRECT


    # The awk code for fuzzy rounding.  (It's used in a few places, so makes sense
    # not to duplicate).  It fuzzy-rounds the variable named fuzzy_var.  It goes in
    # steps of 5, 10, 25, then repeats by a factor of 10 larger (50, 100, 250), and
    # so on, until it finds a number that's large enough.  The pattern is slightly
    # broken between the initial 1 and 50, because rounding to the nearest 2.5
    # doesn't seem right to me.
    fuzzy_formula='
       rounded = 0;
       if (fuzzy_var <= 10 ) {
          rounded   = 1;
       }
       factor = 1;
       while ( rounded == 0 ) {
          if ( fuzzy_var <= 50 * factor ) {
             fuzzy_var = sprintf("%.0f", fuzzy_var / (5 * factor)) * 5 * factor;
             rounded   = 1;
          }
          else if ( fuzzy_var <= 100  * factor) {
             fuzzy_var = sprintf("%.0f", fuzzy_var / (10 * factor)) * 10 * factor;
             rounded   = 1;
          }
          else if ( fuzzy_var <= 250  * factor) {
             fuzzy_var = sprintf("%.0f", fuzzy_var / (25 * factor)) * 25 * factor;
             rounded   = 1;
          }
          factor = factor * 10;
       }'


    # Does fuzzy rounding: rounds to nearest interval, but the interval gets larger
    # as the number gets larger.  This is to make things easier to diff.
    fuzz () {
       echo $1 | $AP_AWK "{fuzzy_var=$1; ${fuzzy_formula} print fuzzy_var;}"
    }


    # The temp files are for storing working results so we don't call commands many
    # times (gives inconsistent results, maybe adds load on things I don't want to
    # such as RAID controllers).  They must not exist -- if they did, someone would
    # symlink them to /etc/passwd and then run this program as root.  Call this
    # function with "rm" or "touch" as an argument.
    temp_files() {
       for file in /tmp/aspersa /tmp/aspersa2; do
          case "$1" in
          touch)
             if ! touch "${file}"; then
                echo "I can't make my temp file ${file}";
                exit 1;
             fi
             ;;
          rm)
             rm -f "${file}"
             ;;
          esac
       done
    }


    # Print a space-padded string into $line.  Then translate spaces to hashes, and
    # underscores to spaces.  End result is a line of hashes with words at the
    # start.
    section () {
       echo "$1" | awk '{l=sprintf("#_%-60s", $0 "_"); print l}' | sed -e 's/ /#/g' -e 's/_/ /g'
    }


    # Print a "name | value" line.
    name_val() {
       printf "%12s | %s " "$1" "$(echo $2)"
    }


    # Converts a value to units of power of 2.  Arg 1: the value.  Arg 2: precision (defaults to 2).
    shorten() {
       echo $@ | awk '{
          unit = "k";
          size = 1024;
          val  = $1;
          prec = 2;
          if ( $2 ~ /./ ) {
             prec = $2;
          }
          if ( val >= 1099511627776 ) {
             size = 1099511627776;
             unit = "T";
          }
          else if ( val >= 1073741824 ) {
             size = 1073741824;
             unit = "G";
          }
          else if ( val >= 1048576 ) {
             size = 1048576;
             unit = "M";
          }
          printf "%." prec "f%s", val / size, unit;
       }'
    }


    # ##############################################################################
    # Function to take a file and collapse it into an aggregated list.  This
    # function works on $1, which it expects to be created with 'sort |
    # uniq -c'.  Leading whitespace is deleted.  The result will look like
    # "4xabc, 1xdef"  Copy any changes to 'mysql-summary' too.
    # ##############################################################################
    group_concat () {
       sed -e '{H; $!d}' -e 'x' -e 's/ [[:space:]]*[[:digit:]][[:digit:]]∗[[:space:]]*/, 1x/g' -e 's/[[:space:]][[:space:]]*/ /g' -e 's/, //' ${1}
       # In words: save the whole file into the hold space,
       # {H; $!d}
       # Swap it back into the pattern space,
       # x
       # Join lines with a comma, delete leading whitespace, and put an 'x' between
       # the number and the text that follows,
       # s/ [[:space:]]*[[:digit:]][[:digit:]]∗[[:space:]]*/, 1x/g
       # Collapse whitespace,
       # s/[[:space:]][[:space:]]*/ /g
       # And delete the leading comma-space.
       # s/, //
    }


    # ##############################################################################
    # Functions for parsing specific files and getting desired info from them.
    # These are called from within main() and are separated so they can be tested
    # easily.  The calling convention is that the data they need to run is prepared
    # first by putting it into /tmp/aspersa.  Then code that's testing just needs to
    # put sample data into /tmp/aspersa and call it.
    # ##############################################################################
       
    # ##############################################################################
    # Parse Linux's /proc/cpuinfo, which should be stored in /tmp/aspersa.
    # ##############################################################################
    parse_proc_cpuinfo () {
       # Physical processors are indicated by distinct 'physical id'.  Virtual CPUs
       # are indicated by paragraphs -- one per paragraph.  We assume that all
       # processors are identical, i.e. that there are not some processors with dual
       # cores and some with quad cores.
       virtual=$(grep -c ^processor /tmp/aspersa);
       physical=$(grep 'physical id' /tmp/aspersa | sort -u | wc -l);
       cores=$(grep 'cpu cores' /tmp/aspersa | head -n 1 | cut -d: -f2);


       # Older kernel won't have 'physical id' or 'cpu cores'.
       if [ "${physical}" = "0" ]; then physical=${virtual}; fi
       if [ -z "${cores}" ]; then cores=0; fi


       # Test for HTT; cannot trust the 'ht' flag.  If physical * cores < virtual,
       # then hyperthreading is in use.
       cores=$((${cores} * ${physical}));
       if [ ${cores} -gt 0 -a $cores -lt $virtual ]; then htt=yes; else htt=no; fi


       name_val "Processors" "physical = ${physical}, cores = ${cores}, virtual = ${virtual}, hyperthreading = ${htt}"


       awk -F: '/cpu MHz/{print $2}' /tmp/aspersa
          | sort | uniq -c > /tmp/aspersa2
       name_val "Speeds" "$(group_concat /tmp/aspersa2)"


       awk -F: '/model name/{print $2}' /tmp/aspersa
          | sort | uniq -c > /tmp/aspersa2
       name_val "Models" "$(group_concat /tmp/aspersa2)"


       awk -F: '/cache size/{print $2}' /tmp/aspersa
          | sort | uniq -c > /tmp/aspersa2
       name_val "Caches" "$(group_concat /tmp/aspersa2)"
    }


    # ##############################################################################
    # Parse sysctl -a output on FreeBSD, and format it as CPU info.  The file is the
    # first argument.
    # ##############################################################################
    parse_sysctl_cpu_freebsd() {
       virtual="$(awk '/hw.ncpu/{print $2}' "$1")"
       name_val "Processors" "virtual = ${virtual}"
       name_val "Speeds" "$(awk '/hw.clockrate/{print $2}' "$1")"
       name_val "Models" "$(awk -F: '/hw.model/{print substr($2, 2)}' "$1")"
    }


    # ##############################################################################
    # Parse CPU info from psrinfo -v
    # ##############################################################################
    parse_psrinfo_cpus() {
       name_val Processors $(grep -c 'Status of .* processor' "$1")
       awk '/operates at/ {
          start = index($0, " at ") + 4;
          end   = length($0) - start - 4
          print substr($0, start, end);
       }' "$1" | sort | uniq -c > /tmp/aspersa2
       name_val "Speeds" "$(group_concat /tmp/aspersa2)"
    }


    # ##############################################################################
    # Parse the output of 'free -b' plus the contents of /proc/meminfo
    # ##############################################################################
    parse_free_minus_b () {
       physical=$(awk '/Mem:/{print $3}' "${1}")
       swap=$(awk '/Swap:/{print $3}' "${1}")
       virtual=$(shorten $(($physical + $swap)))


       name_val Total   $(shorten $(awk '/Mem:/{print $2}' "${1}"))
       name_val Free    $(shorten $(awk '/Mem:/{print $4}' "${1}"))
       name_val Used    "physical = $(shorten ${physical}), swap = $(shorten ${swap}), virtual = ${virtual}"
       name_val Buffers $(shorten $(awk '/Mem:/{print $6}' "${1}"))
       name_val Caches  $(shorten $(awk '/Mem:/{print $7}' "${1}"))
       name_val Dirty  "$(awk '/Dirty:/ {print $2, $3}' "${1}")"
    }


    # ##############################################################################
    # Parse FreeBSD memory info from sysctl output.
    # ##############################################################################
    parse_memory_sysctl_freebsd() {
       physical=$(awk '/hw.realmem:/{print $2}' "${1}")
       mem_hw=$(awk '/hw.physmem:/{print $2}' "${1}")
       mem_used=$(awk '
          /hw.physmem/                   { mem_hw       = $2; }
          /vm.stats.vm.v_inactive_count/ { mem_inactive = $2; }
          /vm.stats.vm.v_cache_count/    { mem_cache    = $2; }
          /vm.stats.vm.v_free_count/     { mem_free     = $2; }
          /hw.pagesize/                  { pagesize     = $2; }
          END {
             mem_inactive *= pagesize;
             mem_cache    *= pagesize;
             mem_free     *= pagesize;
             print mem_hw - mem_inactive - mem_cache - mem_free;
          }
       ' "$1");
       name_val Total   $(shorten ${mem_hw} 1)
       name_val Virtual $(shorten ${physical} 1)
       name_val Used    $(shorten ${mem_used} 1)
    }


    # ##############################################################################
    # Parse memory devices from the output of 'dmidecode', which should be stored in
    # /tmp/aspersa.
    # ##############################################################################
    parse_dmidecode_mem_devices () {
       echo "  Locator   Size     Speed             Form Factor   Type          Type Detail"
       echo "  ========= ======== ================= ============= ============= ==========="
       # Print paragraphs containing 'Memory Device ', extract the desired bits,
       # concatenate them into one long line, then format as a table.  The data
       # comes out in this order for each paragraph:
       # $2  Size         2048 MB
       # $3  Form Factor  <OUT OF SPEC>
       # $4  Locator      DIMM1
       # $5  Type         <OUT OF SPEC>
       # $6  Type Detail  Synchronous
       # $7  Speed        667 MHz (1.5 ns)
       sed    -e '/./{H;$!d;}'
              -e 'x;/Memory Device /!d;'
              -e 's/: /:/g'
              -e 's/</{/g'
              -e 's/>/}/g'
              -e 's/[ ]* / /g'
           /tmp/aspersa
           | awk -F: '/Size|Type|Form.Factor|Type.Detail|[^ ]Locator/{printf("|%s", $2)}/Speed/{print "|" $2}'
           | sed -e 's/No Module Installed/{EMPTY}/'
           | sort
           | awk -F'|' '{printf("  %-9s %-8s %-17s %-13s %-13s %-8s ", $4, $2, $7, $3, $5, $6);}'
    }


    # ##############################################################################
    # Parse the output of 'netstat -antp'
    # ##############################################################################
    parse_ip_s_link () {
       echo "  interface  rx_bytes rx_packets  rx_errors   tx_bytes tx_packets  tx_errors"
       echo "  ========= ========= ========== ========== ========== ========== =========="


       awk "/^[1-9][0-9]*:/ {
          save["iface"] = substr($2, 0, index($2, ":") - 1);
          new = 1;
       }
       $0 !~ /[^0-9 ]/ {
          if ( new == 1 ) {
             new = 0;
             fuzzy_var = $1; ${fuzzy_formula} save["bytes"] = fuzzy_var;
             fuzzy_var = $2; ${fuzzy_formula} save["packs"] = fuzzy_var;
             fuzzy_var = $3; ${fuzzy_formula} save["errs"]  = fuzzy_var;
          }
          else {
             fuzzy_var = $1; ${fuzzy_formula} tx_bytes   = fuzzy_var;
             fuzzy_var = $2; ${fuzzy_formula} tx_packets = fuzzy_var;
             fuzzy_var = $3; ${fuzzy_formula} tx_errors  = fuzzy_var;
             printf "  %-8s %10d %10d %10d %10d %10d %10d\n", save["iface"], save["bytes"], save["packs"], save["errs"], tx_bytes, tx_packets, tx_errors;
          }
       }" $@
    }


    # ##############################################################################
    # Parse the output of 'netstat -antp' which should be in /tmp/aspersa.
    # ##############################################################################
    parse_netstat () {
       echo "  Connections from remote IP addresses"
       awk '$1 ~ /^tcp/ && $5 ~ /^[1-9]/ {
          print substr($5, 0, index($5, ":") - 1);
       }' /tmp/aspersa | sort | uniq -c
          | awk "{
             fuzzy_var=$1;
             ${fuzzy_formula}
             printf "    %-15s %5d\n", $2, fuzzy_var;
             }"
          | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
       echo "  Connections to local IP addresses"
       awk '$1 ~ /^tcp/ && $5 ~ /^[1-9]/ {
          print substr($4, 0, index($4, ":") - 1);
       }' /tmp/aspersa | sort | uniq -c
          | awk "{
             fuzzy_var=$1;
             ${fuzzy_formula}
             printf "    %-15s %5d\n", $2, fuzzy_var;
             }"
          | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
       echo "  Connections to top 10 local ports"
       awk '$1 ~ /^tcp/ && $5 ~ /^[1-9]/ {
          print substr($4, index($4, ":") + 1);
       }' /tmp/aspersa | sort | uniq -c | sort -rn | head -n10
          | awk "{
             fuzzy_var=$1;
             ${fuzzy_formula}
             printf "    %-15s %5d\n", $2, fuzzy_var;
             }" | sort
       echo "  States of connections"
       awk '$1 ~ /^tcp/ {
          print $6;
       }' /tmp/aspersa | sort | uniq -c | sort -rn
          | awk "{
             fuzzy_var=$1;
             ${fuzzy_formula}
             printf "    %-15s %5d\n", $2, fuzzy_var;
             }" | sort
    }


    # ##############################################################################
    # Parse the joined output of 'mount' and 'df -hP'.  $1 = file; $2 = ostype.
    # ##############################################################################
    parse_filesystems () {
       # Filesystem names and mountpoints can be very long.  We try to align things
       # as nicely as possible by making columns only as wide as needed.  This
       # requires two passes through the file.  The first pass finds the max size of
       # these columns and prints out a printf spec, and the second prints out the
       # file nicely aligned.
       cat > /tmp/aspersa.awk <<-EOF
          BEGIN {
             device     = 10;
             fstype     = 4;
             options    = 4;
          }
          /./ {
             f_device     = $1;
             f_fstype     = $10;
             f_options    = substr($11, 2, length($11) - 2);
             if ( "$2" == "FreeBSD" ) {
                f_fstype  = substr($9, 2, length($9) - 2);
                f_options = substr($0, index($0, ",") + 2);
                f_options = substr(f_options, 1, length(f_options) - 1);
             }
             if ( length(f_device) > device ) {
                device=length(f_device);
             }
             if ( length(f_fstype) > fstype ) {
                fstype=length(f_fstype);
             }
             if ( length(f_options) > options ) {
                options=length(f_options);
             }
          }
          END{
             print "%-" device "s %5s %4s %-" fstype "s %-" options "s %s";
          }
    EOF
       spec="$( awk -f /tmp/aspersa.awk "$1" )";
       #awk -f /tmp/aspersa.awk "$1"
       #return;


       cat > /tmp/aspersa.awk <<-EOF
          BEGIN {
             spec="  ${spec}\n";
             printf spec, "Filesystem", "Size", "Used", "Type", "Opts", "Mountpoint";
          }
          {
             f_fstype     = $10;
             f_options    = substr($11, 2, length($11) - 2);
             if ( "$2" == "FreeBSD" ) {
                f_fstype  = substr($9, 2, length($9) - 2);
                f_options = substr($0, index($0, ",") + 2);
                f_options = substr(f_options, 1, length(f_options) - 1);
             }
             printf spec, $1, $2, $5, f_fstype, f_options, $6;
          }
    EOF
       awk -f /tmp/aspersa.awk "$1"
    }


    # ##############################################################################
    # Parse the output of fdisk -l, which should be in /tmp/aspersa; there might be
    # multiple fdisk -l outputs in the file.
    # ##############################################################################
    parse_fdisk () {
       awk '
          BEGIN {
             format="%-12s %4s %10s %10s %18s ";
             printf(format, "Device", "Type", "Start", "End", "Size");
             printf(format, "============", "====", "==========", "==========", "==================");
          }
          /Disk.*bytes/ {
             disk = substr($2, 1, length($2) - 1);
             size = $5;
             printf(format, disk, "Disk", "", "", size);
          }
          /Units/ {
             units = $9;
          }
          /^/dev/ {
             if ( $2 == "*" ) {
                start = $3;
                end   = $4;
             }
             else {
                start = $2;
                end   = $3;
             }
             printf(format, $1, "Part", start, end, sprintf("%.0f", (end - start) * units));
          }
       ' /tmp/aspersa
    }


    # ##############################################################################
    # Parse the output of dmesg, which should be in /tmp/aspersa, and detect
    # virtualization.
    # ##############################################################################
    parse_virtualization_dmesg () {
       if grep -qi -e vmware -e vmxnet -e 'paravirtualized kernel on vmi' /tmp/aspersa; then
          echo "VMWare";
       elif grep -qi -e 'paravirtualized kernel on xen' -e 'Xen virtual console' /tmp/aspersa; then
          echo "Xen";
       elif grep -qi qemu /tmp/aspersa; then
          echo "QEmu";
       elif grep -qi 'paravirtualized kernel on KVM' /tmp/aspersa; then
          echo "KVM";
       elif grep -q VBOX /tmp/aspersa; then
          echo "VirtualBox";
       elif grep -qi 'hd.: Virtual .., ATA.*drive' /tmp/aspersa; then
          echo "Microsoft VirtualPC";
       fi
    }


    # ##############################################################################
    # Try to figure out if a system is a guest by looking at prtdiag, smbios, etc.
    # ##############################################################################
    parse_virtualization_generic() {
       if grep -i -e virtualbox "$1" >/dev/null; then
          echo VirtualBox
       elif grep -i -e vmware "$1" >/dev/null; then
          echo VMWare
       fi
    }


    # ##############################################################################
    # Parse the output of lspci, which should be in /tmp/aspersa, and detect
    # Ethernet cards.
    # ##############################################################################
    parse_ethernet_controller_lspci () {
       grep -i ethernet /tmp/aspersa | cut -d: -f3 | while read line; do
          name_val Controller "${line}"
       done
    }


    # ##############################################################################
    # Parse the output of lspci, which should be in /tmp/aspersa, and detect RAID
    # controllers.
    # ##############################################################################
    parse_raid_controller_lspci () {
       if grep -q "RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS" /tmp/aspersa; then
          echo 'LSI Logic MegaRAID SAS'
       elif grep -q "Fusion-MPT SAS" /tmp/aspersa; then
          echo 'Fusion-MPT SAS'
       elif grep -q "RAID bus controller: LSI Logic / Symbios Logic Unknown" /tmp/aspersa; then
          echo 'LSI Logic Unknown'
       elif grep -q "RAID bus controller: Adaptec AAC-RAID" /tmp/aspersa; then
          echo 'AACRAID'
       elif grep -q "3ware [0-9]* Storage Controller" /tmp/aspersa; then
          echo '3Ware'
       elif grep -q "Hewlett-Packard Company Smart Array" /tmp/aspersa; then
          echo 'HP Smart Array'
       elif grep -q " RAID bus controller: " /tmp/aspersa; then
          awk -F: '/RAID bus controller:/ {print $3" "$5" "$6}' /tmp/aspersa
       fi
    }


    # ##############################################################################
    # Parse the output of dmesg, which should be in /tmp/aspersa, and detect RAID
    # controllers.
    # ##############################################################################
    parse_raid_controller_dmesg () {
       pat='scsi[0-9].*: .*'
       if grep -qi "${pat}megaraid" /tmp/aspersa; then
          echo 'LSI Logic MegaRAID SAS'
       elif grep -q "Fusion MPT SAS" /tmp/aspersa; then
          echo 'Fusion-MPT SAS'
       elif grep -q "${pat}aacraid" /tmp/aspersa; then
          echo 'AACRAID'
       elif grep -q "${pat}3ware [0-9]* Storage Controller" /tmp/aspersa; then
          echo '3Ware'
       fi
    }


    # ##############################################################################
    # Parse the output of "hpacucli ctrl all show config", which should be stored in
    # /tmp/aspersa
    # ##############################################################################
    parse_hpacucli () {
       grep 'logicaldrive|physicaldrive' /tmp/aspersa
    }


    # ##############################################################################
    # Parse the output of arcconf, which should be stored in /tmp/aspersa
    # ##############################################################################
    parse_arcconf () {
       model=$(awk -F: '/Controller Model/{print $2}' /tmp/aspersa)
       chan="$(awk -F: '/Channel description/{print $2}' /tmp/aspersa)"
       cache="$(awk -F: '/Installed memory/{print $2}' /tmp/aspersa)"
       status="$(awk -F: '/Controller Status/{print $2}' /tmp/aspersa)"
       name_val Specs "${model/ /},${chan},${cache} cache,${status}"


       battery=$(grep -A5 'Controller Battery Info' /tmp/aspersa
          | awk '/Capacity remaining/ {c=$4}
                 /Status/             {s=$3}
                 /Time remaining/     {t=sprintf("%dd%dh%dm", $7, $9, $11)}
                 END                  {printf("%d%%, %s remaining, %s", c, t, s)}')
       name_val Battery "${battery}"


       # ###########################################################################
       # Logical devices
       # ###########################################################################
       echo
       echo "  LogicalDev Size      RAID Disks Stripe Status  Cache"
       echo "  ========== ========= ==== ===== ====== ======= ======="
       for dev in $(awk '/Logical device number/{print $4}' /tmp/aspersa); do
          sed -n -e "/^Logical device .* ${dev}$/,/^$|^Logical device number/p"
             /tmp/aspersa
          | awk '
             /Logical device name/               {d=$5}
             /Size/                              {z=$3 " " $4}
             /RAID level/                        {r=$4}
             /Group [0-9]/                       {g++}
             /Stripe-unit size/                  {p=$4 " " $5}
             /Status of logical/                 {s=$6}
             /Write-cache mode.*Ena.*write-back/ {c="On (WB)"}
             /Write-cache mode.*Ena.*write-thro/ {c="On (WT)"}
             /Write-cache mode.*Disabled/        {c="Off"}
             END {
                printf("  %-10s %-9s %4d %5d %-6s %-7s %-7s ",
                   d, z, r, g, p, s, c);
             }'
       done


       # ###########################################################################
       # Physical devices
       # ###########################################################################
       echo
       echo "  PhysiclDev State   Speed         Vendor  Model        Size        Cache"
       echo "  ========== ======= ============= ======= ============ =========== ======="


       # Find the paragraph with physical devices, tabularize with assoc arrays.
       tempresult=""
       sed -n -e '/Physical Device information/,/^$/p' /tmp/aspersa
          | awk -F: '
             /Device #[0-9]/ {
                device=substr($0, index($0, "#"));
                devicenames[device]=device;
             }
             /Device is a/ {
                devices[device ",isa"] = substr($0, index($0, "is a") + 5);
             }
             /State/ {
                devices[device ",state"] = substr($2, 2);
             }
             /Transfer Speed/ {
                devices[device ",speed"] = substr($2, 2);
             }
             /Vendor/ {
                devices[device ",vendor"] = substr($2, 2);
             }
             /Model/ {
                devices[device ",model"] = substr($2, 2);
             }
             /Size/ {
                devices[device ",size"] = substr($2, 2);
             }
             /Write Cache/ {
                if ( $2 ~ /Enabled .write-back./ )
                   devices[device ",cache"] = "On (WB)";
                else
                   if ( $2 ~ /Enabled .write-th/ )
                      devices[device ",cache"] = "On (WT)";
                   else
                      devices[device ",cache"] = "Off";
             }
             END {
                for ( device in devicenames ) {
                   if ( devices[device ",isa"] ~ /Hard drive/ ) {
                      printf("  %-10s %-7s %-13s %-7s %-12s %-11s %-7s ",
                         devices[device ",isa"],
                         devices[device ",state"],
                         devices[device ",speed"],
                         devices[device ",vendor"],
                         devices[device ",model"],
                         devices[device ",size"],
                         devices[device ",cache"]);
                   }
                }
             }'


    }


    # ##############################################################################
    # Parse the output of "lsiutil -i -s" from /tmp/aspersa
    # ##############################################################################
    parse_fusionmpt_lsiutil () {
       echo
       awk '/LSI.*Firmware/ { print " ", $0 }' /tmp/aspersa
       grep . /tmp/aspersa | sed -n -e '/B___T___L/,$ {s/^/  /; p}'
    }


    # ##############################################################################
    # Parse the output of MegaCli64 -AdpAllInfo -aALL from /tmp/aspersa.
    # ##############################################################################
    parse_lsi_megaraid_adapter_info () {
       name=$(awk -F: '/Product Name/{print substr($2, 2)}' /tmp/aspersa);
       int=$(awk '/Host Interface/{print $4}' /tmp/aspersa);
       prt=$(awk '/Number of Backend Port/{print $5}' /tmp/aspersa);
       bbu=$(awk '/^BBU             :/{print $3}' /tmp/aspersa);
       mem=$(awk '/Memory Size/{print $4}' /tmp/aspersa);
       vdr=$(awk '/Virtual Drives/{print $4}' /tmp/aspersa);
       dvd=$(awk '/Degraded/{print $3}' /tmp/aspersa);
       phy=$(awk '/^  Disks/{print $3}' /tmp/aspersa);
       crd=$(awk '/Critical Disks/{print $4}' /tmp/aspersa);
       fad=$(awk '/Failed Disks/{print $4}' /tmp/aspersa);
       name_val Model "${name}, ${int} interface, ${prt} ports"
       name_val Cache "${mem} Memory, BBU ${bbu}"
    }


    # ##############################################################################
    # Parse the output (saved in /tmp/aspersa) of
    # /opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL
    # ##############################################################################
    parse_lsi_megaraid_bbu_status () {
       charge=$(awk '/Relative State/{print $5}' /tmp/aspersa);
       temp=$(awk '/^Temperature/{print $2}' /tmp/aspersa);
       soh=$(awk '/isSOHGood:/{print $2}' /tmp/aspersa);
       name_val BBU "${charge}% Charged, Temperature ${temp}C, isSOHGood=${soh}"
    }


    # ##############################################################################
    # Parse physical devices from the output (saved in /tmp/aspersa) of
    # /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -aALL
    # OR, it will also work with the output of
    # /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL
    # ##############################################################################
    parse_lsi_megaraid_devices () {
       echo
       echo "  PhysiclDev Type State   Errors Vendor  Model        Size"
       echo "  ========== ==== ======= ====== ======= ============ ==========="
       for dev in $(awk '/Device Id/{print $3}' /tmp/aspersa); do
          sed -e '/./{H;$!d;}' -e "x;/Device Id: ${dev}/!d;" /tmp/aspersa
          | awk '
             /Media Type/                        {d=substr($0, index($0, ":") + 2)}
             /PD Type/                           {t=$3}
             /Firmware state/                    {s=$3}
             /Media Error Count/                 {me=$4}
             /Other Error Count/                 {oe=$4}
             /Predictive Failure Count/          {pe=$4}
             /Inquiry Data/                      {v=$3; m=$4;}
             /Raw Size/                          {z=$3}
             END {
                printf("  %-10s %-4s %-7s %6s %-7s %-12s %-7s ",
                   substr(d, 0, 10), t, s, me "/" oe "/" pe, v, m, z);
             }'
       done
    }


    # ##############################################################################
    # Parse virtual devices from the output (saved in /tmp/aspersa) of
    # /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -aALL
    # OR, it will also work with the output of
    # /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aAll
    # ##############################################################################
    parse_lsi_megaraid_virtual_devices () {
       # Somewhere on the Internet, I found the following guide to understanding the
       # RAID level, but I don't know the source anymore.
       #    Primary-0, Secondary-0, RAID Level Qualifier-0 = 0
       #    Primary-1, Secondary-0, RAID Level Qualifier-0 = 1
       #    Primary-5, Secondary-0, RAID Level Qualifier-3 = 5
       #    Primary-1, Secondary-3, RAID Level Qualifier-0 = 10
       # I am not sure if this is always correct or not (it seems correct).  The
       # terminology MegaRAID uses is not clear to me, and isn't documented that I
       # am aware of.  Anyone who can clarify the above, please contact me.
       echo
       echo "  VirtualDev Size      RAID Level Disks SpnDpth Stripe Status  Cache"
       echo "  ========== ========= ========== ===== ======= ====== ======= ========="
       awk '
          /^Virtual Disk:/ {
             device              = $3;
             devicenames[device] = device;
          }
          /Number Of Drives/ {
             devices[device ",numdisks"] = substr($0, index($0, ":") + 1);
          }
          /^Name:/ {
             devices[device ",name"] = $2 > "" ? $2 : "(no name)";
          }
          /RAID Level/ {
             devices[device ",primary"]   = substr($3, index($3, "-") + 1, 1);
             devices[device ",secondary"] = substr($4, index($4, "-") + 1, 1);
             devices[device ",qualifier"] = substr($NF, index($NF, "-") + 1, 1);
          }
          /Span Depth/ {
             devices[device ",spandepth"] = substr($2, index($2, ":") + 1);
          }
          /Number of Spans/ {
             devices[device ",numspans"] = $4;
          }
          /^Size:/ {
             devices[device ",size"] = substr($0, index($0, ":") + 1);
          }
          /^State:/ {
             devices[device ",state"] = $2;
          }
          /^Stripe Size:/ {
             devices[device ",stripe"] = $3;
          }
          /^Current Cache Policy/ {
             devices[device ",wpolicy"] = $4 ~ /WriteBack/ ? "WB" : "WT";
             devices[device ",rpolicy"] = $5 ~ /ReadAheadNone/ ? "no RA" : "RA";
          }
          END {
             for ( device in devicenames ) {
                raid = 0;
                if ( devices[device ",primary"] == 1 ) {
                   raid = 1;
                   if ( devices[device ",secondary"] == 3 ) {
                      raid = 10;
                   }
                }
                else {
                   if ( devices[device ",primary"] == 5 ) {
                      raid = 5;
                   }
                }
                printf("  %-10s %-9s %-10s %5d %7s %6s %-7s %s ",
                   device devices[device ",name"],
                   devices[device ",size"],
                   raid " (" devices[device ",primary"] "-" devices[device ",secondary"] "-" devices[device ",qualifier"] ")",
                   devices[device ",numdisks"],
                   devices[device ",spandepth"] "-" devices[device ",numspans"],
                   devices[device ",stripe"], devices[device ",state"],
                   devices[device ",wpolicy"] ", " devices[device ",rpolicy"]);
             }
          }' /tmp/aspersa
    }


    # ##############################################################################
    # Simplifies vmstat and aligns it nicely.  We don't need the memory stats, the
    # system activity is enough.
    # ##############################################################################
    format_vmstat () {
       cat > /tmp/aspersa.awk <<-EOF
          BEGIN {
             format = "  %2s %2s  %4s %4s %5s %5s %6s %6s %3s %3s %3s %3s %3s ";
          }
          /procs/ {
             print  "  procs  ---swap-- -----io---- ---system---- --------cpu--------";
          }
          /bo/ {
             printf format, "r", "b", "si", "so", "bi", "bo", "ir", "cs", "us", "sy", "il", "wa", "st";
          }
          $0 !~ /r/ {
                fuzzy_var = $1;   ${fuzzy_formula}  r   = fuzzy_var;
                fuzzy_var = $2;   ${fuzzy_formula}  b   = fuzzy_var;
                fuzzy_var = $7;   ${fuzzy_formula}  si  = fuzzy_var;
                fuzzy_var = $8;   ${fuzzy_formula}  so  = fuzzy_var;
                fuzzy_var = $9;   ${fuzzy_formula}  bi  = fuzzy_var;
                fuzzy_var = $10;  ${fuzzy_formula}  bo  = fuzzy_var;
                fuzzy_var = $11;  ${fuzzy_formula}  ir  = fuzzy_var;
                fuzzy_var = $12;  ${fuzzy_formula}  cs  = fuzzy_var;
                fuzzy_var = $13;                    us  = fuzzy_var;
                fuzzy_var = $14;                    sy  = fuzzy_var;
                fuzzy_var = $15;                    il  = fuzzy_var;
                fuzzy_var = $16;                    wa  = fuzzy_var;
                fuzzy_var = $17;                    st  = fuzzy_var;
                printf format, r, b, si, so, bi, bo, ir, cs, us, sy, il, wa, st;
             }
    EOF
          awk -f /tmp/aspersa.awk /tmp/aspersa
       }


    # ##############################################################################
    # The main() function is called at the end of the script.  This makes it
    # testable.  Major bits of parsing are separated into functions for testability.
    # As a general rule, we cannot 'cp' files from /proc, because they might be
    # empty afterwards.  (I've seen 'cp /proc/cpuinfo' create an empty file.)  But
    # 'cat' works okay.
    # ##############################################################################
    main () {


       # Begin by setting the $PATH to include some common locations that are not
       # always in the $PATH, including the "sbin" locations, and some common
       # locations for proprietary management software, such as RAID controllers.
       export PATH="${PATH}:/usr/local/bin:/usr/bin:/bin:/usr/libexec"
       export PATH="${PATH}:/usr/local/sbin:/usr/sbin:/sbin"
       export PATH="${PATH}:/usr/StorMan/:/opt/MegaRAID/MegaCli/";


       # Set up temporary files.
       temp_files "rm"
       temp_files "touch"
       section Aspersa_System_Summary_Report


       # ########################################################################
       # Grab a bunch of stuff and put it into temp files for later.
       # ########################################################################
       sysctl -a > /tmp/aspersa.sysctl 2>/dev/null


       # ########################################################################
       # General date, time, load, etc
       # ########################################################################
       platform="$(uname -s)"
       name_val "Date" "`date -u +'%F %T UTC'` (local TZ: `date +'%Z %z'`)"
       name_val "Hostname" "$(uname -n)"
       name_val "Uptime" "$(uptime | awk '{print substr($0, index($0, "up") + 3)}')"
       if which dmidecode > /dev/null 2>&1; then
          vendor="$(dmidecode -s system-manufacturer 2>/dev/null | sed 's/ *$//g')"
          if [ "${vendor}" ]; then
             product="$(dmidecode -s system-product-name 2>/dev/null | sed 's/ *$//g')"
             version="$(dmidecode -s system-version 2>/dev/null | sed 's/ *$//g')"
             chassis="$(dmidecode -s chassis-type 2>/dev/null | sed 's/ *$//g')"
             system="${vendor}; ${product}; v${version} (${chassis})"
             name_val "System" "${system}";
             servicetag="$(dmidecode -s system-serial-number 2>/dev/null | sed 's/ *$//g')"
             name_val "Service Tag" "${servicetag:-Not found}";
          fi
       fi
       name_val "Platform" "${platform}"
       if [ "${platform}" = "SunOS" ]; then
          if which zonename >/dev/null 2>&1 ; then
             name_val "Zonename" "$(zonename)"
          fi
       fi


       # Try to find all sorts of different files that say what the release is.
       if [ "${platform}" = "Linux" ]; then
          kernel="$(uname -r)"
          if [ -e /etc/fedora-release ]; then
             release=$(cat /etc/fedora-release);
          elif [ -e /etc/redhat-release ]; then
             release=$(cat /etc/redhat-release);
          elif [ -e /etc/system-release ]; then
             release=$(cat /etc/system-release);
          elif which lsb_release >/dev/null 2>&1; then
             release="$(lsb_release -ds) ($(lsb_release -cs))"
          elif [ -e /etc/lsb-release ]; then
             release=$(grep DISTRIB_DESCRIPTION /etc/lsb-release |awk -F'=' '{print $2}' |sed 's#"##g');
          elif [ -e /etc/debian_version ]; then
             release="Debian-based version $(cat /etc/debian_version)";
             if [ -e /etc/apt/sources.list ]; then
                 code=`cat /etc/apt/sources.list |awk  '/^deb/ {print $3}' |awk -F/ '{print $1}'| awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -rn |head -n1 |awk '{print $2}'`
                 release="${release} (${code})"
          fi
          elif ls /etc/*release >/dev/null 2>&1; then
             if grep -q DISTRIB_DESCRIPTION /etc/*release; then
                release=$(grep DISTRIB_DESCRIPTION /etc/*release | head -n1);
             else
                release=$(cat /etc/*release | head -n1);
             fi
          fi
       elif [ "${platform}" = "FreeBSD" ]; then
          release="$(uname -r)"
          kernel="$(sysctl -n kern.osrevision)"
       elif [ "${platform}" = "SunOS" ]; then
          release="$(head -n1 /etc/release)"
          if [ -z "${release}" ]; then
             release="$(uname -r)"
          fi
          kernel="$(uname -v)"
       fi
       name_val Release "${release}"
       name_val Kernel "${kernel}"


       CPU_ARCH='32-bit'
       OS_ARCH='32-bit'
       if [ "${platform}" = "Linux" ]; then
          if grep -q ' lm ' /proc/cpuinfo; then
             CPU_ARCH='64-bit'
          fi
       elif [ "${platform}" = "FreeBSD" ]; then
          if sysctl hw.machine_arch | grep -v 'i[36]86' >/dev/null; then
             CPU_ARCH='64-bit'
          fi
       elif [ "${platform}" = "SunOS" ]; then
          if isainfo -b | grep 64 >/dev/null ; then
             CPU_ARCH="64-bit"
          fi
       fi
       if file /bin/sh | grep '64-bit' >/dev/null; then
          OS_ARCH='64-bit'
       fi
       name_val "Architecture" "CPU = $CPU_ARCH, OS = $OS_ARCH"


       # Threading library
       if [ "${platform}" = "Linux" ]; then
          name_val Threading "$(getconf GNU_LIBPTHREAD_VERSION)"
       fi
       if [ -x /lib/libc.so.6 ]; then
          name_val "Compiler" "$(/lib/libc.so.6 | grep 'Compiled by' | cut -c13-)"
       fi


       if [ "${platform}" = "Linux" ]; then
          if getenforce >/dev/null 2>&1; then
             getenforce="$(getenforce 2>&1)";
          fi
          name_val "SELinux" "${getenforce:-No SELinux detected}";
       fi


       # We look in dmesg for virtualization information first, because it's often
       # available to non-root users and usually has telltale signs.  It's most
       # reliable to look at /var/log/dmesg if possible.  There are a number of
       # other ways to find out if a system is virtualized.
       cat /var/log/dmesg > /tmp/aspersa 2>/dev/null
       if [ ! -s /tmp/aspersa ]; then
          dmesg > /tmp/aspersa 2>/dev/null
       fi
       if [ -s /tmp/aspersa ]; then
          virt="$(parse_virtualization_dmesg)"
       fi
       if [ -z "${virt}" ]; then
          if which lspci >/dev/null 2>&1; then
             lspci > /tmp/aspersa 2>/dev/null
             if grep -qi virtualbox /tmp/aspersa; then
                virt=VirtualBox
             elif grep -qi vmware /tmp/aspersa; then
                virt=VMWare
             elif [ -e /proc/user_beancounters ]; then
                virt="OpenVZ/Virtuozzo"
             fi
          fi
       elif [ "${platform}" = "FreeBSD" ]; then
          if ps -o stat | grep J ; then
             virt="FreeBSD Jail"
          fi
       elif [ "${platform}" = "SunOS" ]; then
          if which prtdiag >/dev/null 2>&1 && prtdiag > /tmp/aspersa.prtdiag 2>/dev/null; then
             virt="$(parse_virtualization_generic /tmp/aspersa.prtdiag)"
          elif which smbios >/dev/null 2>&1 && smbios > /tmp/aspersa.smbios 2>/dev/null; then
             virt="$(parse_virtualization_generic /tmp/aspersa.smbios)"
          fi
       fi
       name_val Virtualized "${virt:-No virtualization detected}"


       # ########################################################################
       # Processor/CPU, Memory, Swappiness, dmidecode
       # ########################################################################
       section Processor
       if [ -f /proc/cpuinfo ]; then
          cat /proc/cpuinfo > /tmp/aspersa 2>/dev/null
          parse_proc_cpuinfo
       elif [ "${platform}" = "FreeBSD" ]; then
          parse_sysctl_cpu_freebsd /tmp/aspersa.sysctl
       elif [ "${platform}" = "SunOS" ]; then
          psrinfo -v > /tmp/aspersa
          parse_psrinfo_cpus /tmp/aspersa
          # TODO: prtconf -v actually prints the CPU model name etc.
       fi


       section Memory
       if [ "${platform}" = "Linux" ]; then
          free -b > /tmp/aspersa
          cat /proc/meminfo >> /tmp/aspersa
          parse_free_minus_b /tmp/aspersa
       elif [ "${platform}" = "FreeBSD" ]; then
          parse_memory_sysctl_freebsd /tmp/aspersa.sysctl
       elif [ "${platform}" = "SunOS" ]; then
          name_val Memory "$(prtconf | awk -F: '/Memory/{print $2}')"
       fi


       rss=$(ps -eo rss 2>/dev/null | awk '/[0-9]/{total += $1 * 1024} END {print total}')
       name_val UsedRSS "$(shorten ${rss} 1)"


       if [ "${platform}" = "Linux" ]; then
          name_val Swappiness "$(sysctl vm.swappiness 2>&1)"
          name_val DirtyPolicy "$(sysctl vm.dirty_ratio 2>&1), $(sysctl vm.dirty_background_ratio 2>&1)"
          if sysctl vm.dirty_bytes > /dev/null 2>&1; then
             name_val DirtyStatus "$(sysctl vm.dirty_bytes 2>&1), $(sysctl vm.dirty_background_bytes 2>&1)"
          fi
       fi


       if which dmidecode >/dev/null 2>&1 && dmidecode > /tmp/aspersa 2>/dev/null; then
          parse_dmidecode_mem_devices
       fi


       # ########################################################################
       # Disks, RAID, Filesystems
       # ########################################################################
       # TODO: Add info about software RAID


       if echo "${ASPERSA_SKIP}" | grep -v MOUNT >/dev/null; then
          if [ "${platform}" != "SunOS" ]; then
             section "Mounted_Filesystems"
             cmd="df -h"
             if [ "${platform}" = "Linux" ]; then
                cmd="df -h -P"
             fi
             $cmd | sort > /tmp/aspersa2
             mount | sort | join /tmp/aspersa2 - > /tmp/aspersa
             parse_filesystems /tmp/aspersa "${platform}"
          fi
       fi


       if [ "${platform}" = "Linux" ]; then
          section "Disk_Schedulers_And_Queue_Size"
          echo "" > /tmp/aspersa
          for disk in $(ls /sys/block/ | grep -v -e ram -e loop -e 'fd[0-9]'); do
             if [ -e "/sys/block/${disk}/queue/scheduler" ]; then
                name_val "${disk}" "$(cat /sys/block/${disk}/queue/scheduler | grep -o '

    ..∗
    ') $(cat /sys/block/${disk}/queue/nr_requests)"
                fdisk -l "/dev/${disk}" >> /tmp/aspersa 2>/dev/null
             fi
          done


          # Relies on /tmp/aspersa having data from the Disk Schedulers loop.
          section "Disk_Partioning"
          parse_fdisk


          section "Kernel_Inode_State"
          for file in dentry-state file-nr inode-nr; do
             name_val "${file}" "$(cat /proc/sys/fs/${file} 2>&1)"
          done


          section "LVM_Volumes"


          if which lvs >/dev/null 2>&1 && test -x "$(which lvs)"; then
             lvs 2>&1
          else
             echo "Cannot execute 'lvs'";
          fi
       fi


       section "RAID_Controller"


       # ########################################################################
       # We look in lspci first because it's more reliable, then dmesg, because it's
       # often available to non-root users.  It's most reliable to look at
       # /var/log/dmesg if possible.
       # ########################################################################
       if which lspci >/dev/null 2>&1 && lspci > /tmp/aspersa 2>/dev/null; then
          controller="$(parse_raid_controller_lspci)"
       fi
       if [ -z "${controller}" ]; then
          cat /var/log/dmesg > /tmp/aspersa 2>/dev/null
          if [ ! -s /tmp/aspersa ]; then
             dmesg > /tmp/aspersa 2>/dev/null
          fi
          controller="$(parse_raid_controller_dmesg)"
       fi


       name_val Controller "${controller:-No RAID controller detected}"


       # ########################################################################
       # Attempt to get, parse, and print RAID controller status from possibly
       # proprietary management software.  Any executables that are normally stored
       # in a weird location, such as /usr/StorMan/arcconf, should have their
       # location added to $PATH at the beginning of main().
       # ########################################################################
       notfound=""
       if [ "${controller}" = "AACRAID" ]; then
          if arcconf getconfig 1 > /tmp/aspersa 2>/dev/null; then
             parse_arcconf
          elif ! which arcconf >/dev/null 2>&1; then
             notfound="e.g. http://www.adaptec.com/en-US/support/raid/scsi_raid/ASR-2120S/"
          fi
       elif [ "${controller}" = "HP Smart Array" ]; then
          if hpacucli ctrl all show config > /tmp/aspersa 2>/dev/null; then
             parse_hpacucli
          elif ! which hpacucli >/dev/null 2>&1; then
             notfound="your package repository or the manufacturer's website"
          fi
       elif [ "${controller}" = "LSI Logic MegaRAID SAS" ]; then
          if MegaCli64 -AdpAllInfo -aALL -NoLog > /tmp/aspersa 2>/dev/null; then
             parse_lsi_megaraid_adapter_info
          elif ! which MegaCli64 >/dev/null 2>&1; then
             notfound="your package repository or the manufacturer's website"
          fi
          if MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL -NoLog > /tmp/aspersa 2>/dev/null; then
             parse_lsi_megaraid_bbu_status
          fi
          if MegaCli64 -LdPdInfo -aALL -NoLog > /tmp/aspersa 2>/dev/null; then
             parse_lsi_megaraid_virtual_devices
             parse_lsi_megaraid_devices
          fi
       fi


       if [ "${notfound}" ]; then
          echo "   RAID controller software not found; try getting it from"
          echo "   ${notfound}"
       fi


       if echo "${ASPERSA_SKIP}" | grep -v NETWORK >/dev/null; then
          # #####################################################################
          # Network stuff
          # #####################################################################
          if [ "${platform}" = "Linux" ]; then
             section Network_Config
             if which lspci > /dev/null 2>&1 && lspci > /tmp/aspersa 2>/dev/null; then
                parse_ethernet_controller_lspci
             fi
             if sysctl net.ipv4.tcp_fin_timeout > /dev/null 2>&1; then
                name_val "FIN Timeout" "$(sysctl net.ipv4.tcp_fin_timeout)"
                name_val "Port Range" "$(sysctl net.ipv4.ip_local_port_range)"
             fi
          fi


          # TODO cat /proc/sys/net/ipv4/ip_conntrack_max ; it might be
          # /proc/sys/net/netfilter/nf_conntrack_max or /proc/sys/net/nf_conntrack_max
          # in new kernels like Fedora 12?


          if which ip >/dev/null 2>&1 && ip -s link > /tmp/aspersa 2>/dev/null; then
             section Interface_Statistics
             parse_ip_s_link /tmp/aspersa
          fi


          if [ "${platform}" = "Linux" ]; then
             section Network_Connections
             if netstat -antp > /tmp/aspersa 2>/dev/null; then
                parse_netstat
             fi
          fi
       fi


       # ########################################################################
       # Processes, load, etc
       # ########################################################################
       if echo "${ASPERSA_SKIP}" | grep -v PROCESS >/dev/null; then
          section Top_Processes
          if which prstat > /dev/null 2>&1; then
             prstat | head
          elif which top > /dev/null 2>&1 ; then
             cmd="top -bn 1"
             if [ "${platform}" = "FreeBSD" ]; then
                cmd="top -b -d 1"
             fi
             $cmd | sed -e 's# *$##g' -e '/./{H;$!d;}' -e 'x;/PID/!d;' | grep . | head
          fi
          if which vmstat > /dev/null 2>&1 ; then
             section "Simplified_and_fuzzy_rounded_vmstat_(wait_please)"
             vmstat 1 5 > /tmp/aspersa
             if [ "${platform}" = "Linux" ]; then
                format_vmstat
             else
                # TODO: simplify/format for other platforms
                cat /tmp/aspersa
             fi
          fi
       fi


       # ########################################################################
       # All done.  Signal the end so it's explicit.
       # ########################################################################
       temp_files "rm"
       temp_files "check"
       section The_End
    }


    # Execute the program if it was not included from another file.  This makes it
    # possible to include without executing, and thus test.
    if [ "$(basename "$0")" = "system_summary" ] || [ "$(basename "$0")" = "bash" -a "$_" = "$0" ]; then
        main $@
    fi
  • 相关阅读:
    图像处理笔记(五)
    图像处理笔记(四)
    图像处理(三)
    图像处理(二)
    图像处理(一)
    Halcon安装注意事项
    Tensorflow从开始到放弃(技术篇)
    Tensorflow从开始到放弃
    python 2.x中的中文
    WPF使用border画框
  • 原文地址:https://www.cnblogs.com/liang545621/p/12611384.html
Copyright © 2011-2022 走看看