From owner-svn-src-stable@FreeBSD.ORG Mon Mar 23 09:00:33 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BBC67106566B; Mon, 23 Mar 2009 09:00:33 +0000 (UTC) (envelope-from maxim@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A7D7D8FC0A; Mon, 23 Mar 2009 09:00:33 +0000 (UTC) (envelope-from maxim@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n2N90Xu5001149; Mon, 23 Mar 2009 09:00:33 GMT (envelope-from maxim@svn.freebsd.org) Received: (from maxim@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n2N90XbS001147; Mon, 23 Mar 2009 09:00:33 GMT (envelope-from maxim@svn.freebsd.org) Message-Id: <200903230900.n2N90XbS001147@svn.freebsd.org> From: Maxim Konovalov Date: Mon, 23 Mar 2009 09:00:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r190316 - stable/7/usr.sbin/gstat X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Mar 2009 09:00:34 -0000 Author: maxim Date: Mon Mar 23 09:00:33 2009 New Revision: 190316 URL: http://svn.freebsd.org/changeset/base/190316 Log: MFC r175118: when the ms/req fields exceed 1 second, drop the fractions to fit more digits. MFC r183665: batch mode. MFC r189738: fix man page sinopsys; remove BUG section. MFC r189739: turn the batch mode on if stdout is not tty. > Description of fields to fill in above: 76 columns --| > PR: If a GNATS PR is affected by the change. > Submitted by: If someone else sent in the change. > Reviewed by: If someone else reviewed your modification. > Approved by: If you needed approval for this commit. > Obtained from: If the change is from a third party. > MFC after: N [day[s]|week[s]|month[s]]. Request a reminder email. > Security: Vulnerability reference (one per line) or description. > Empty fields above will be automatically removed. _M gstat M gstat/gstat.c M gstat/gstat.8 Modified: stable/7/usr.sbin/gstat/ (props changed) stable/7/usr.sbin/gstat/gstat.8 stable/7/usr.sbin/gstat/gstat.c Modified: stable/7/usr.sbin/gstat/gstat.8 ============================================================================== --- stable/7/usr.sbin/gstat/gstat.8 Mon Mar 23 08:33:19 2009 (r190315) +++ stable/7/usr.sbin/gstat/gstat.8 Mon Mar 23 09:00:33 2009 (r190316) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 20, 2006 +.Dd March 12, 2009 .Dt GSTAT 8 .Os .Sh NAME @@ -32,7 +32,7 @@ .Nd print statistics about GEOM disks .Sh SYNOPSIS .Nm -.Op Fl acd +.Op Fl abcd .Op Fl f Ar filter .Op Fl I Ar interval .Sh DESCRIPTION @@ -46,6 +46,10 @@ The options are as follows: .Bl -tag -width indent .It Fl a Only display providers that are at least 0.1% busy. +.It Fl b +Batch mode. +Collect numbers, print and exit. +Default if stdout is not a tty. .It Fl c Enable display of .Xr geom 4 @@ -90,15 +94,3 @@ A .Nm utility appeared in .Fx 5.0 . -.Sh BUGS -The -.Nm -utility only works interactively. -It should probably detect when it is run non-interactively and produce -simple -.Tn ASCII -text output. -Otherwise, this utility should probably be folded into -.Xr systat 1 -which only works interactively and is the obvious utility to run for -various other forms of system statistics. Modified: stable/7/usr.sbin/gstat/gstat.c ============================================================================== --- stable/7/usr.sbin/gstat/gstat.c Mon Mar 23 08:33:19 2009 (r190315) +++ stable/7/usr.sbin/gstat/gstat.c Mon Mar 23 09:00:33 2009 (r190316) @@ -51,9 +51,16 @@ #include #include -static int flag_a, flag_c, flag_d; +static int flag_a, flag_b, flag_c, flag_d; static int flag_I = 1000000; +#define PRINTMSG(...) do { \ + if (flag_b && !loop) \ + printf(__VA_ARGS__); \ + else if (!flag_b) \ + printw(__VA_ARGS__); \ + } while(0) + static void usage(void); static const char* @@ -67,7 +74,7 @@ int main(int argc, char **argv) { int error, i, quit; - int curx, cury, maxx, maxy, line_len, max_flen; + int curx, cury, maxx, maxy, line_len, loop, max_flen; struct devstat *gsp, *gsq; void *sp, *sq; double dt; @@ -87,12 +94,24 @@ main(int argc, char **argv) History *hist; HistEvent hist_ev; + hist = NULL; + el = NULL; + maxx = -1; + curx = -1; + loop = 1; + /* Turn on batch mode if output is not tty. */ + if (!isatty(fileno(stdout))) + flag_b = 1; + f_s[0] = '\0'; - while ((i = getopt(argc, argv, "adcf:I:")) != -1) { + while ((i = getopt(argc, argv, "adcf:I:b")) != -1) { switch (i) { case 'a': flag_a = 1; break; + case 'b': + flag_b = 1; + break; case 'c': flag_c = 1; break; @@ -141,34 +160,36 @@ main(int argc, char **argv) sq = geom_stats_snapshot_get(); if (sq == NULL) err(1, "geom_stats_snapshot()"); - /* Setup curses */ - initscr(); - start_color(); - use_default_colors(); - pair_content(0, &cf, &cb); - init_pair(1, COLOR_GREEN, cb); - init_pair(2, COLOR_MAGENTA, cb); - init_pair(3, COLOR_RED, cb); - cbreak(); - noecho(); - nonl(); - nodelay(stdscr, 1); - intrflush(stdscr, FALSE); - keypad(stdscr, TRUE); - /* Setup libedit */ - hist = history_init(); - if (hist == NULL) - err(EX_SOFTWARE, "history_init()"); - history(hist, &hist_ev, H_SETSIZE, 100); - el = el_init("gstat", stdin, stdout, stderr); - if (el == NULL) - err(EX_SOFTWARE, "el_init"); - el_set(el, EL_EDITOR, "emacs"); - el_set(el, EL_SIGNAL, 1); - el_set(el, EL_HIST, history, hist); - el_set(el, EL_PROMPT, el_prompt); - if (f_s[0] != '\0') - history(hist, &hist_ev, H_ENTER, f_s); + if (!flag_b) { + /* Setup curses */ + initscr(); + start_color(); + use_default_colors(); + pair_content(0, &cf, &cb); + init_pair(1, COLOR_GREEN, cb); + init_pair(2, COLOR_MAGENTA, cb); + init_pair(3, COLOR_RED, cb); + cbreak(); + noecho(); + nonl(); + nodelay(stdscr, 1); + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + /* Setup libedit */ + hist = history_init(); + if (hist == NULL) + err(EX_SOFTWARE, "history_init()"); + history(hist, &hist_ev, H_SETSIZE, 100); + el = el_init("gstat", stdin, stdout, stderr); + if (el == NULL) + err(EX_SOFTWARE, "el_init"); + el_set(el, EL_EDITOR, "emacs"); + el_set(el, EL_SIGNAL, 1); + el_set(el, EL_HIST, history, hist); + el_set(el, EL_PROMPT, el_prompt); + if (f_s[0] != '\0') + history(hist, &hist_ev, H_ENTER, f_s); + } geom_stats_snapshot_timestamp(sq, &tq); for (quit = 0; !quit;) { sp = geom_stats_snapshot_get(); @@ -182,12 +203,13 @@ main(int argc, char **argv) geom_stats_snapshot_reset(sp); geom_stats_snapshot_reset(sq); move(0,0); - printw("dT: %5.3fs w: %.3fs", - dt, (float)flag_I / 1000000); + PRINTMSG("dT: %5.3fs w: %.3fs", dt, (float)flag_I / 1000000); if (f_s[0] != '\0') { - printw(" filter: "); - getyx(stdscr, cury, curx); - getmaxyx(stdscr, maxy, maxx); + PRINTMSG(" filter: "); + if (!flag_b) { + getyx(stdscr, cury, curx); + getmaxyx(stdscr, maxy, maxx); + } strncpy(pf_s, f_s, sizeof(pf_s)); max_flen = maxx - curx - 1; if ((int)strlen(f_s) > max_flen && max_flen >= 0) { @@ -199,15 +221,15 @@ main(int argc, char **argv) pf_s[max_flen - 1] = '.'; pf_s[max_flen] = '\0'; } - printw("%s", pf_s); + PRINTMSG("%s", pf_s); } - printw("\n"); - printw(" L(q) ops/s "); - printw(" r/s kBps ms/r "); - printw(" w/s kBps ms/w "); + PRINTMSG("\n"); + PRINTMSG(" L(q) ops/s "); + PRINTMSG(" r/s kBps ms/r "); + PRINTMSG(" w/s kBps ms/w "); if (flag_d) - printw(" d/s kBps ms/d "); - printw("%%busy Name\n"); + PRINTMSG(" d/s kBps ms/d "); + PRINTMSG("%%busy Name\n"); for (;;) { gsp = geom_stats_snapshot_next(sp); gsq = geom_stats_snapshot_next(sq); @@ -228,9 +250,11 @@ main(int argc, char **argv) if (gid->lg_what == ISCONSUMER && !flag_c) continue; /* Do not print past end of window */ - getyx(stdscr, cury, curx); - if (curx > 0) - continue; + if (!flag_b) { + getyx(stdscr, cury, curx); + if (curx > 0) + continue; + } if ((gid->lg_what == ISPROVIDER || gid->lg_what == ISCONSUMER) && f_s[0] != '\0') { pp = gid->lg_ptr; @@ -239,7 +263,7 @@ main(int argc, char **argv) continue; } if (gsp->sequence0 != gsp->sequence1) { - printw("*\n"); + PRINTMSG("*\n"); continue; } devstat_compute_statistics(gsp, gsq, dt, @@ -265,19 +289,28 @@ main(int argc, char **argv) continue; } - printw(" %4ju", (uintmax_t)u64); - printw(" %6.0f", (double)ld[0]); - printw(" %6.0f", (double)ld[1]); - printw(" %6.0f", (double)ld[2] * 1024); - printw(" %6.1f", (double)ld[3]); - printw(" %6.0f", (double)ld[4]); - printw(" %6.0f", (double)ld[5] * 1024); - printw(" %6.1f", (double)ld[6]); + PRINTMSG(" %4ju", (uintmax_t)u64); + PRINTMSG(" %6.0f", (double)ld[0]); + PRINTMSG(" %6.0f", (double)ld[1]); + PRINTMSG(" %6.0f", (double)ld[2] * 1024); + if (ld[3] > 1e3) + PRINTMSG(" %6.0f", (double)ld[3]); + else + PRINTMSG(" %6.1f", (double)ld[3]); + PRINTMSG(" %6.0f", (double)ld[4]); + PRINTMSG(" %6.0f", (double)ld[5] * 1024); + if (ld[6] > 1e3) + PRINTMSG(" %6.0f", (double)ld[6]); + else + PRINTMSG(" %6.1f", (double)ld[6]); if (flag_d) { - printw(" %6.0f", (double)ld[8]); - printw(" %6.0f", (double)ld[9] * 1024); - printw(" %6.1f", (double)ld[10]); + PRINTMSG(" %6.0f", (double)ld[8]); + PRINTMSG(" %6.0f", (double)ld[9] * 1024); + if (ld[10] > 1e3) + PRINTMSG(" %6.0f", (double)ld[10]); + else + PRINTMSG(" %6.1f", (double)ld[10]); } if (ld[7] > 80) @@ -286,27 +319,40 @@ main(int argc, char **argv) i = 2; else i = 1; - attron(COLOR_PAIR(i)); - printw(" %6.1lf", (double)ld[7]); - attroff(COLOR_PAIR(i)); - printw("|"); + if (!flag_b) + attron(COLOR_PAIR(i)); + PRINTMSG(" %6.1lf", (double)ld[7]); + if (!flag_b) { + attroff(COLOR_PAIR(i)); + PRINTMSG("|"); + } else + PRINTMSG(" "); if (gid == NULL) { - printw(" ??"); + PRINTMSG(" ??"); } else if (gid->lg_what == ISPROVIDER) { pp = gid->lg_ptr; - printw(" %s", pp->lg_name); + PRINTMSG(" %s", pp->lg_name); } else if (gid->lg_what == ISCONSUMER) { cp = gid->lg_ptr; - printw(" %s/%s/%s", + PRINTMSG(" %s/%s/%s", cp->lg_geom->lg_class->lg_name, cp->lg_geom->lg_name, cp->lg_provider->lg_name); } - clrtoeol(); - printw("\n"); + if (!flag_b) + clrtoeol(); + PRINTMSG("\n"); *gsq = *gsp; } geom_stats_snapshot_free(sp); + if (flag_b) { + /* We loop extra to make sure we get the information. */ + if (!loop) + break; + loop = 0; + usleep(flag_I); + continue; + } getyx(stdscr, cury, curx); getmaxyx(stdscr, maxy, maxx); clrtobot(); @@ -369,15 +415,17 @@ main(int argc, char **argv) } } - endwin(); - el_end(el); + if (!flag_b) { + endwin(); + el_end(el); + } exit(EX_OK); } static void usage(void) { - fprintf(stderr, "usage: gstat [-acd] [-f filter] [-I interval]\n"); + fprintf(stderr, "usage: gstat [-abcd] [-f filter] [-I interval]\n"); exit(EX_USAGE); /* NOTREACHED */ }