| #!/bin/sh |
| |
| . /etc/utils.sh |
| . /etc/chrome_utils.sh |
| |
| DELAY="$1" # if empty, run only once |
| |
| printstat() |
| { |
| local result="$1" |
| shift |
| |
| "$@" | sort -rn | head -n 5 | ( |
| while read val pid comm arg0 arg1 rest; do |
| [ "$comm" = "python" ] && comm=${arg1##/*/} # use the .py script name |
| [ "$comm" = "browser_shell" ] && \ |
| comm=$(format_chrome_comm "$pid" "$arg1 $rest") |
| result="$result $comm($val)" |
| done; |
| echo "$result" |
| ) |
| } |
| |
| freemem() |
| { |
| free | ( |
| read header |
| read h1 total junk |
| read h2a h2b real_used real_free junk |
| echo "$1 total=$total used=$real_used free=$real_free" |
| ) |
| } |
| |
| |
| buddyinfo() |
| { |
| while read junk1 junk2 junk3 label data; do |
| echo "$1 $label: $data" |
| done </proc/buddyinfo |
| } |
| |
| |
| dfspace() |
| { |
| df -k | { |
| out= |
| read header |
| while read dev blocks used avail percent fs junk; do |
| if [ "$used" != 0 ]; then |
| out="$out$fs:$used " |
| fi |
| done |
| echo "$1 $out" |
| } |
| } |
| |
| |
| carriers() |
| { |
| ip link show | { |
| out= |
| while IFS=': ' read n ifc flags smtu mtu sdisc disc smaster master sstate state junk; do |
| if [ "$smtu $sdisc $smaster" = "mtu qdisc state" ]; then |
| out="$out$ifc($master) " |
| elif [ "$smtu $sdisc $sstate" = "mtu qdisc state" ]; then |
| out="$out$ifc($state) " |
| fi |
| done |
| echo "$1 $out" |
| } |
| } |
| |
| |
| fdcount() |
| { |
| local testopt="$2" |
| ps ax -o pid=,comm= | |
| while read pid comm junk; do |
| for d in /proc/$pid/fd/*; do |
| [ "$testopt" "$d" ] && echo "$comm" |
| done |
| done | |
| sort | |
| uniq -c | |
| sort -nr | |
| head -n10 | { |
| out= |
| while read count comm junk; do |
| out="$out$comm($count) " |
| done |
| echo "$1 $out" |
| } |
| } |
| |
| |
| ip_only() |
| { |
| while read ip junk; do |
| contains "$ip" ":" || echo "$ip" "$junk" |
| done |
| } |
| |
| |
| ip6_only() |
| { |
| while read ip junk; do |
| contains "$ip" ":" && echo "$ip" "$junk" |
| done |
| } |
| |
| |
| nameservers() |
| { |
| grep '^nameserver' /etc/resolv.conf | while read ns ip junk; do |
| echo "$ip" |
| done |
| } |
| |
| |
| defaultroutes() |
| { |
| ip "$@" route list | while read a b IP c IF d; do |
| if [ "$a $b" = "default via" ]; then |
| if startswith "$IP" "fe80:"; then |
| # IPV6 link-local address, return IP and interface |
| echo "$IP,$IF" |
| else |
| echo "$IP" |
| fi |
| fi |
| done |
| } |
| |
| |
| do_ping() |
| { |
| VER=$1 |
| IP=$2 |
| shift 2 |
| ping$VER -n -c1 -w5 "$@" $IP 2>&1 | { |
| while read nbytes bytes from ip serial ttl time ms; do |
| if [ "$bytes $from $ms" = "bytes from ms" ]; then |
| echo "${time#time=}ms/${ttl#ttl=}ttl" |
| exit |
| fi |
| done |
| echo "ERR" |
| } |
| } |
| |
| |
| pings() |
| { |
| out= |
| for ip in \ |
| 127.0.0.1 \ |
| $(defaultroutes) \ |
| $(nameservers | ip_only) \ |
| gstatic.com |
| do |
| out="$out$ip($(do_ping "" $ip)) " |
| done |
| echo "$1 $out" |
| } |
| |
| |
| pings6() |
| { |
| out= |
| for ip_if in \ |
| ::1 \ |
| $(defaultroutes -6) \ |
| $(nameservers | ip6_only) \ |
| gstatic.com |
| do |
| out=$out$(echo "$ip_if" | while IFS=, read ip if; do |
| if [ -n "$if" ]; then |
| echo "$ip($(do_ping "6" $ip -I $if)) " |
| else |
| echo "$ip($(do_ping "6" $ip)) " |
| fi |
| done) |
| done |
| echo "$1 $out" |
| } |
| |
| |
| # integration tests can set different files to read from |
| extrapingfile() |
| { |
| VER="$1" |
| if [ "$VER" = "6" ]; then |
| filename=${EXTRAPING6FILE:-"/tmp/extra_ping6_servers"} |
| else |
| filename=${EXTRAPINGFILE:-"/tmp/extra_ping_servers"} |
| fi |
| echo $filename |
| } |
| |
| |
| extrapings() |
| { |
| LOG="$1" |
| VER="$2" |
| filename=$(extrapingfile "$VER") |
| if [ -f "$filename" ]; then |
| out= |
| for ip in $(cat "$filename" | sed -e 's/,/ /g'); do |
| out="$out$ip($(do_ping "$VER" $ip)) " |
| done |
| echo "$LOG $out" |
| fi |
| } |
| |
| |
| get_list_length() |
| { |
| filename="$1" |
| len=0 |
| for x in $(cat "$filename" 2>/dev/null | sed -e 's/,/ /g'); do |
| len=$((len + 1)) |
| done |
| echo $len |
| } |
| |
| |
| select_by_index() |
| { |
| filename="$1" |
| index="$2" |
| i=0 |
| for x in $(cat "$filename" 2>/dev/null | sed -e 's/,/ /g'); do |
| if [ "$i" -eq "$index" ]; then |
| echo "$x" |
| return |
| fi |
| i=$((i + 1)) |
| done |
| } |
| |
| |
| # Traceroute to one destination in the extra ping servers |
| extratraceroute() |
| { |
| LOG="$1" |
| VER="$2" |
| TOTAL="$3" |
| filename=$(extrapingfile "$VER") |
| if [ "$VER" = "6" ]; then |
| ipver="-6" |
| else |
| ipver="-4" |
| fi |
| len=$(get_list_length "$filename") |
| if [ "$len" -gt 0 ]; then |
| index=$((TOTAL % len)) |
| site=$(select_by_index "$filename" "$index") |
| echo -n "$LOG $site" |
| traceroute -n -N 1 -q 1 -w 1 "$ipver" "$site" | tail -n +2 | while read num ip tim unit; do |
| echo -n " $ip($tim$unit)" |
| done |
| echo |
| fi |
| } |
| |
| |
| gstatics() |
| { |
| gs=$(gstatic) |
| rv=$? |
| if [ -n "$gs" ]; then |
| echo "$gs" | while read ip stat; do |
| echo -n "$ip($stat) " |
| done |
| fi |
| echo |
| return $rv |
| } |
| |
| |
| wifistats() |
| { |
| local phy="$1" |
| local queuefile="/sys/kernel/debug/ieee80211/$phy/ath9k/queues" |
| if [ -e "$queuefile" ]; then |
| while read line; do |
| echo "$phy: ath9k-queue: $line" |
| done <$queuefile |
| fi |
| } |
| |
| |
| if [ -n "$DELAY" ]; then |
| # Stagger startup after a power outage |
| sleep $(randint 1 "$DELAY") |
| fi |
| |
| # Setting LONGPING in the environment allows test cases to be constructed |
| rand=$(randint 1 3600) |
| longping=${LONGPING:-$rand} |
| numtraceroutes=0 |
| |
| while :; do |
| # time used by each process, followed by cumulative time (which includes |
| # children, including already terminated ones). Note that the 'cputime' |
| # format doesn't work with --cumulative, so we need to use bsdtime instead. |
| printstat "cputop:" ps --no-headers -e -o bsdtime,pid,comm,cmd |
| printstat "ccputop:" ps --no-headers --cumulative -e -o bsdtime,pid,comm,cmd |
| |
| printstat "memtop:" ps --no-headers -e -o rss,pid,comm,cmd |
| echo "loadavg: $(cat /proc/loadavg)" |
| freemem "mem:" |
| buddyinfo "buddyinfo:" |
| dfspace "df:" |
| carriers "carriers:" |
| fdcount "fdcount:" -e |
| fdcount "sockcount:" -S |
| |
| for phy in /sys/kernel/debug/ieee80211/phy*; do |
| wifistats "$(basename "$phy")" |
| done |
| |
| # these can cause network activity, so /tmp/disable_pings is a way to |
| # stop it if it's getting annoying or causing trouble. |
| if [ ! -e /tmp/disable_pings ]; then |
| pings "ping:" "$gs_retval" |
| pings6 "ping6:" "$gs_retval" |
| |
| if [ -z "$DELAY" ] || [ "$longping" -gt 3600 ]; then |
| if is-network-box || is-storage-box; then |
| extrapings "ping:" "" |
| extrapings "ping6:" "6" |
| echo "gstatic: $(gstatics)" |
| extratraceroute "traceroute:" "" "$numtraceroutes" |
| extratraceroute "traceroute6:" "6" "$numtraceroutes" |
| numtraceroutes=$((numtraceroutes + 1)) |
| fi |
| longping=0 |
| fi |
| |
| if is-network-box || is-storage-box; then |
| echo "dns: $(dnsck 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844)" |
| else |
| echo "dns: $(dnsck)" |
| fi |
| fi |
| |
| if runnable castcheck; then |
| echo "castcheck: $(castcheck)" |
| fi |
| |
| if runnable dialcheck; then |
| echo "dialcheck: $(dialcheck)" |
| fi |
| |
| # Trigger nexus heap stats, if available |
| if [ -e /proc/bcmdriver/debug ]; then |
| echo core >/proc/bcmdriver/debug |
| fi |
| |
| if [ -n "$DELAY" ]; then |
| sleep "$DELAY" || exit 1 |
| longping=$((longping + DELAY)) |
| else |
| break |
| fi |
| done |