At Sat, 18 Jun 2011 17:04:05 +0100,
Chris Webb wrote:
> 
> This option modifies the info and list displays to make them easier to parse
> reliably from C and shell scripts, separating each column with a single
> space character. We also display times in seconds since the epoch, print
> sizes in raw bytes rather than using units of MB, GB, TB, etc., and escape
> whitespace characters and backslashes in VDI names with a leading backslash
> escape.
> 
> Signed-off-by: Chris Webb <[email protected]>
> ---
>  collie/collie.c |   97 
> +++++++++++++++++++++++++++++++++++++++----------------
>  1 files changed, 69 insertions(+), 28 deletions(-)

Applied, thanks!

Kazutaka


> 
> diff --git a/collie/collie.c b/collie/collie.c
> index 3b91f84..759d4c0 100644
> --- a/collie/collie.c
> +++ b/collie/collie.c
> @@ -8,6 +8,7 @@
>   * You should have received a copy of the GNU General Public License
>   * along with this program. If not, see <http://www.gnu.org/licenses/>.
>   */
> +#include <ctype.h>
>  #include <errno.h>
>  #include <getopt.h>
>  #include <inttypes.h>
> @@ -35,6 +36,7 @@ static char program_name[] = "collie";
>  static const char *sdhost = "localhost";
>  static int sdport = SD_LISTEN_PORT;
>  static int highlight = 1;
> +static int raw_output = 0;
>  
>  #define TEXT_NORMAL "\033[0m"
>  #define TEXT_BOLD   "\033[1m"
> @@ -42,9 +44,10 @@ static int highlight = 1;
>  #define COMMON_LONG_OPTIONS                          \
>       {"address", required_argument, NULL, 'a'},      \
>       {"port", required_argument, NULL, 'p'},         \
> +     {"raw", no_argument, NULL, 'r'},                \
>       {"help", no_argument, NULL, 'h'},               \
>  
> -#define COMMON_SHORT_OPTIONS "a:p:h"
> +#define COMMON_SHORT_OPTIONS "a:p:hr"
>  
>  static void usage(int status)
>  {
> @@ -62,6 +65,8 @@ Command syntax:\n\
>  Common parameters:\n\
>    -a, --address           specify the daemon address (default: localhost)\n\
>    -p, --port              specify the daemon port\n\
> +  -r, --raw               raw output mode: omit headers, separate fields 
> with\n\
> +                          single spaces and print all sizes in decimal 
> bytes\n\
>    -h, --help              display this help and exit\n\
>  ");
>       }
> @@ -84,12 +89,17 @@ static char *size_to_str(uint64_t _size, char *str, int 
> str_size)
>  {
>       const char *units[] = {"MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
>       int i = 0;
> -     double size = (double)_size;
> +     double size;
>  
> +     if (raw_output) {
> +             snprintf(str, str_size, "%" PRIu64, _size);
> +             return str;
> +     }
> +
> +     size = (double)_size;
>       size /= 1024 * 1024;
>       while (i < ARRAY_SIZE(units) && size >= 1024) {
>               i++;
> -
>               size /= 1024;
>       }
>  
> @@ -360,16 +370,19 @@ static void print_vdi_list(uint32_t vid, char *name, 
> char *tag, uint32_t snapid,
>  {
>       int idx;
>       uint64_t my_objs, cow_objs;
> -     char vdi_size_str[8], my_objs_str[8], cow_objs_str[8];
> +     char vdi_size_str[16], my_objs_str[16], cow_objs_str[16];
>       time_t ti;
>       struct tm tm;
>       char dbuf[128];
>  
>       ti = i->ctime >> 32;
> -     localtime_r(&ti, &tm);
> -
> -     strftime(dbuf, sizeof(dbuf),
> -              "%Y-%m-%d %H:%M", &tm);
> +     if (raw_output) {
> +             snprintf(dbuf, sizeof(dbuf), "%" PRIu64, (uint64_t) ti);
> +     } else {
> +             localtime_r(&ti, &tm);
> +             strftime(dbuf, sizeof(dbuf),
> +                      "%Y-%m-%d %H:%M", &tm);
> +     }
>  
>       my_objs = 0;
>       cow_objs = 0;
> @@ -387,9 +400,20 @@ static void print_vdi_list(uint32_t vid, char *name, 
> char *tag, uint32_t snapid,
>       size_to_str(cow_objs * SD_DATA_OBJ_SIZE, cow_objs_str, 
> sizeof(cow_objs_str));
>  
>       if (!data || strcmp(name, data) == 0) {
> -             printf("%c %-8s %5d %7s %7s %7s %s  %7" PRIx32 "\n",
> -                    is_current(i) ? ' ' : 's', name, snapid,
> -                    vdi_size_str, my_objs_str, cow_objs_str, dbuf, vid);
> +             if (raw_output) {
> +                     printf("%c ", is_current(i) ? '=' : 's');
> +                     while (*name) {
> +                             if (isspace(*name) || *name == '\\')
> +                                     putchar('\\');
> +                             putchar(*name++);
> +                     }
> +                     printf(" %d %s %s %s %s %" PRIx32 "\n", snapid,
> +                            vdi_size_str, my_objs_str, cow_objs_str, dbuf, 
> vid);
> +             } else {
> +                     printf("%c %-8s %5d %7s %7s %7s %s  %7" PRIx32 "\n",
> +                            is_current(i) ? ' ' : 's', name, snapid,
> +                            vdi_size_str, my_objs_str, cow_objs_str, dbuf, 
> vid);
> +             }
>       }
>  }
>  
> @@ -598,8 +622,10 @@ static int node_list(int argc, char **argv)
>  {
>       int i;
>  
> -     printf("   Idx - Host:Port              Number of vnodes\n");
> -     printf("------------------------------------------------\n");
> +     if (!raw_output) {
> +             printf("   Idx - Host:Port              Number of vnodes\n");
> +             printf("------------------------------------------------\n");
> +     }
>       for (i = 0; i < nr_nodes; i++) {
>               char data[128];
>  
> @@ -609,11 +635,13 @@ static int node_list(int argc, char **argv)
>               if (i == master_idx) {
>                       if (highlight)
>                               printf(TEXT_BOLD);
> -                     printf("* %4d - %-20s\t%d\n", i, data, 
> node_list_entries[i].nr_vnodes);
> +                     printf(raw_output ? "* %d %s %d\n" : "* %4d - 
> %-20s\t%d\n",
> +                            i, data, node_list_entries[i].nr_vnodes);
>                       if (highlight)
>                               printf(TEXT_NORMAL);
>               } else
> -                     printf("  %4d - %-20s\t%d\n", i, data, 
> node_list_entries[i].nr_vnodes);
> +                     printf(raw_output ? "- %d %s %d\n" : "  %4d - 
> %-20s\t%d\n",
> +                            i, data, node_list_entries[i].nr_vnodes);
>       }
>  
>       return EXIT_SUCCESS;
> @@ -625,7 +653,8 @@ static int node_info(int argc, char **argv)
>       uint64_t total_size = 0, total_avail = 0, total_vdi_size = 0;
>       char total_str[8], avail_str[8], vdi_size_str[8];
>  
> -     printf("Id\tSize\tUsed\tUse%%\n");
> +     if (!raw_output)
> +             printf("Id\tSize\tUsed\tUse%%\n");
>  
>       for (i = 0; i < nr_nodes; i++) {
>               char name[128];
> @@ -655,7 +684,8 @@ static int node_info(int argc, char **argv)
>               size_to_str(rsp->store_size - rsp->store_free, free_str,
>                           sizeof(free_str));
>               if (!ret && rsp->result == SD_RES_SUCCESS) {
> -                     printf("%2d\t%s\t%s\t%3d%%\n", i, store_str, free_str,
> +                     printf(raw_output ? "%d %s %s %d%%\n" : 
> "%2d\t%s\t%s\t%3d%%\n",
> +                            i, store_str, free_str,
>                              (int)(((double)(rsp->store_size - 
> rsp->store_free) / rsp->store_size) * 100));
>                       success++;
>               }
> @@ -664,8 +694,6 @@ static int node_info(int argc, char **argv)
>               total_avail += rsp->store_free;
>       }
>  
> -     printf("\n");
> -
>       if (success == 0) {
>               fprintf(stderr, "cannot get information from any nodes\n");
>               return EXIT_SYSFAIL;
> @@ -676,7 +704,8 @@ static int node_info(int argc, char **argv)
>       size_to_str(total_size, total_str, sizeof(total_str));
>       size_to_str(total_size - total_avail, avail_str, sizeof(avail_str));
>       size_to_str(total_vdi_size, vdi_size_str, sizeof(vdi_size_str));
> -     printf("Total\t%s\t%s\t%3d%%, total virtual VDI Size\t%s\n",
> +     printf(raw_output ? "Total %s %s %d%% %s\n"
> +                       : "\nTotal\t%s\t%s\t%3d%%, total virtual VDI 
> Size\t%s\n",
>              total_str, avail_str,
>              (int)(((double)(total_size - total_avail) / total_size) * 100),
>              vdi_size_str);
> @@ -692,8 +721,10 @@ static struct subcommand node_cmd[] = {
>  
>  static int vdi_list(int argc, char **argv)
>  {
> -     printf("  name        id    size    used  shared    creation time   vdi 
> id\n");
> -     
> printf("------------------------------------------------------------------\n");
> +     if (!raw_output) {
> +             printf("  name        id    size    used  shared    creation 
> time   vdi id\n");
> +             
> printf("------------------------------------------------------------------\n");
> +     }
>  
>       parse_vdi(print_vdi_list, SD_INODE_SIZE, NULL);
>       return EXIT_SUCCESS;
> @@ -1143,13 +1174,16 @@ static int cluster_info(int argc, char **argv)
>       if (ret != 0)
>               return EXIT_SYSFAIL;
>  
> +     if (!raw_output)
> +             printf("Cluster status: ");
>       if (rsp->result == SD_RES_SUCCESS)
>               printf("running\n");
>       else
>               printf("%s\n", sd_strerror(rsp->result));
>  
> -     printf("\n");
> -     printf("Ctime                Epoch Nodes\n");
> +     if (!raw_output)
> +             printf("\nCreation time        Epoch Nodes\n");
> +
>       nr_logs = rsp->data_length / sizeof(struct epoch_log);
>       for (i = 0; i < nr_logs; i++) {
>               int j;
> @@ -1157,10 +1191,14 @@ static int cluster_info(int argc, char **argv)
>               struct sheepdog_node_list_entry *entry;
>  
>               ti = logs[i].ctime >> 32;
> -             localtime_r(&ti, &tm);
> -             strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", &tm);
> +             if (raw_output) {
> +                     snprintf(time_str, sizeof(time_str), "%" PRIu64, 
> (uint64_t) ti);
> +             } else {
> +                     localtime_r(&ti, &tm);
> +                     strftime(time_str, sizeof(time_str), "%Y-%m-%d 
> %H:%M:%S", &tm);
> +             }
>  
> -             printf("%s %6d", time_str, logs[i].epoch);
> +             printf(raw_output ? "%s %d" : "%s %6d", time_str, 
> logs[i].epoch);
>               printf(" [");
>               for (j = 0; j < logs[i].nr_nodes; j++) {
>                       entry = logs[i].nodes + j;
> @@ -1300,6 +1338,9 @@ int main(int argc, char **argv)
>               case 'p':
>                       sdport = atoi(optarg);
>                       break;
> +             case 'r':
> +                     raw_output = 1;
> +                     break;
>               case 'h':
>                       if (command_help)
>                               command_help();
> @@ -1316,7 +1357,7 @@ int main(int argc, char **argv)
>               }
>       }
>  
> -     if (!isatty(STDOUT_FILENO))
> +     if (!isatty(STDOUT_FILENO) || raw_output)
>               highlight = 0;
>  
>       if (flags & SUBCMD_FLAG_NEED_NODELIST) {
> -- 
> 1.7.4.1
> 
> -- 
> sheepdog mailing list
> [email protected]
> http://lists.wpkg.org/mailman/listinfo/sheepdog
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to