make force option work
[rrdtool.git] / src / rrd_tool.c
index 41cf3cd..2cad365 100644 (file)
@@ -22,11 +22,16 @@ void PrintUsage(char *cmd)
 {
 
     char help_main[] =
-          "RRDtool 1.1.x  Copyright 1997-2001 by Tobias Oetiker <tobi@oetiker.ch>\n\n"
+          "RRDtool 1.1.x  Copyright 1997-2003 by Tobias Oetiker <tobi@oetiker.ch>\n"
+#ifndef WIN32
+           "               Compiled " MAKE_TIMESTAMP "\n\n"
+#else
+           "               Compiled " __DATE__ " " __TIME__ "\n\n"
+#endif          
           "Usage: rrdtool [options] command command_options\n\n";
 
     char help_list[] =
-          "Valid commands: create, update, graph, dump, restore,\n"
+          "Valid commands: create, update, updatev, graph, dump, restore,\n"
           "\t\tlast, info, fetch, tune, resize, xport\n\n";
 
     char help_listremote[] =
@@ -50,7 +55,7 @@ void PrintUsage(char *cmd)
 
     char help_restore[] =
           "* restore - restore an RRD file from its XML form\n\n"
-          "\trrdtool restore [--range-check|-r] filename.xml filename.rrd\n\n";
+          "\trrdtool restore [--range-check|-r] [--force-overwrite|-f] filename.xml filename.rrd\n\n";
 
     char help_last[] =
            "* last - show last update time for RRD\n\n"
@@ -63,6 +68,15 @@ void PrintUsage(char *cmd)
           "\t\ttime|N:value[:value...]\n\n"
            "\t\tat-time@value[:value...]\n\n"
           "\t\t[ time:value[:value...] ..]\n\n";
+    
+       char help_updatev[] =
+          "* updatev - a verbose verion of update\n"
+          "\treturns information about values, RRAs, and datasources updated\n\n"
+          "\trrdtool updatev filename\n"
+          "\t\t--template|-t ds-name:ds-name:...\n"
+          "\t\ttime|N:value[:value...]\n\n"
+           "\t\tat-time@value[:value...]\n\n"
+          "\t\t[ time:value[:value...] ..]\n\n";
 
     char help_fetch[] =
           "* fetch - fetch data out of an RRD\n\n"
@@ -81,6 +95,7 @@ void PrintUsage(char *cmd)
           "\t\t[-u|--upper-limit value] [-z|--lazy]\n"
           "\t\t[-l|--lower-limit value] [-r|--rigid]\n"
            "\t\t[-g|--no-legend]\n"
+           "\t\t[-j|--only-graph]\n"
           "\t\t[--font FONTTAG:size:font]\n"
            "\t\t[--zoom factor]\n"       
           "\t\t[--alt-autoscale]\n"
@@ -153,7 +168,7 @@ void PrintUsage(char *cmd)
 
     enum { C_NONE, C_CREATE, C_DUMP, C_INFO, C_RESTORE, C_LAST,
           C_UPDATE, C_FETCH, C_GRAPH, C_TUNE, C_RESIZE, C_XPORT,
-           C_QUIT, C_LS, C_CD, C_MKDIR };
+           C_QUIT, C_LS, C_CD, C_MKDIR, C_UPDATEV };
 
     int help_cmd = C_NONE;
 
@@ -171,6 +186,8 @@ void PrintUsage(char *cmd)
                help_cmd = C_LAST;
            else if (!strcmp(cmd,"update"))
                help_cmd = C_UPDATE;
+           else if (!strcmp(cmd,"updatev"))
+               help_cmd = C_UPDATEV;
            else if (!strcmp(cmd,"fetch"))
                help_cmd = C_FETCH;
            else if (!strcmp(cmd,"graph"))
@@ -217,6 +234,9 @@ void PrintUsage(char *cmd)
            case C_UPDATE:
                fputs(help_update, stdout);
                break;
+           case C_UPDATEV:
+               fputs(help_updatev, stdout);
+               break;
            case C_FETCH:
                fputs(help_fetch, stdout);
                break;
@@ -253,7 +273,9 @@ int main(int argc, char *argv[])
 {
     char **myargv;
     char aLine[MAX_LENGTH];
+#ifdef HAVE_CHROOT    
     char *firstdir="";
+#endif
 #ifdef MUST_DISABLE_SIGFPE
     signal(SIGFPE,SIG_IGN);
 #endif
@@ -279,7 +301,7 @@ int main(int argc, char *argv[])
            gettimeofday(&starttime,&tz);
 #endif
          RemoteMode=1;
-#ifndef WIN32
+#ifdef HAVE_CHROOT
           if ((argc == 3) && strcmp("",argv[2])){
              if (getuid()==0){
                 chroot(argv[2]);
@@ -303,8 +325,8 @@ int main(int argc, char *argv[])
              }
           }
 #else
-          fprintf(stderr,"ERROR: change root only in unix "
-                         "enviroment posible\n");
+          fprintf(stderr,"ERROR: change root is not supported by your OS "
+                         "or at least by this copy of rrdtool\n");
           exit(1);
 #endif
 
@@ -358,11 +380,17 @@ int main(int argc, char *argv[])
     return 0;
 }
 
+/* HandleInputLine is NOT thread safe - due to readdir issues,
+   resolving them portably is not really simple. */
 int HandleInputLine(int argc, char **argv, FILE* out)
 {
+#if defined(HAVE_OPENDIR) && defined (HAVE_READDIR)
     DIR           *curdir; /* to read current dir with ls */
     struct dirent *dent;
+#endif
+#if defined(HAVE_SYS_STAT_H)
     struct stat   st;
+#endif
     optind=0; /* reset gnu getopt */
     opterr=0; /* no error messages */
 
@@ -374,12 +402,13 @@ int HandleInputLine(int argc, char **argv, FILE* out)
           }
           exit(0);
        }
+#if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
        if (argc>1 && strcmp("cd", argv[1]) == 0){
           if (argc>3){
              printf("ERROR: invalid parameter count for cd\n");
              return(0);
           }
-#ifndef WIN32
+#if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
           if (getuid()==0 && ! ChangeRoot){
              printf("ERROR: chdir security problem - rrdtool is runnig as "
                     "root an no chroot!\n");
@@ -397,7 +426,7 @@ int HandleInputLine(int argc, char **argv, FILE* out)
              printf("ERROR: invalid parameter count for mkdir\n");
              return(0);
           }
-#ifndef WIN32
+#if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
           if (getuid()==0 && ! ChangeRoot){
              printf("ERROR: mkdir security problem - rrdtool is runnig as "
                     "root an no chroot!\n");
@@ -422,8 +451,8 @@ int HandleInputLine(int argc, char **argv, FILE* out)
                       printf("d %s\n",dent->d_name);
                    }
                    if (strlen(dent->d_name)>4 && S_ISREG(st.st_mode)){
-                      if (!strcmp(dent->d_name+strlen(dent->d_name)-4,".rrd") ||
-                          !strcmp(dent->d_name+strlen(dent->d_name)-4,".RRD")){
+                      if (!strcmp(dent->d_name+NAMLEN(dent)-4,".rrd") ||
+                          !strcmp(dent->d_name+NAMLEN(dent)-4,".RRD")){
                          printf("- %s\n",dent->d_name);
                       }
                    }
@@ -436,6 +465,8 @@ int HandleInputLine(int argc, char **argv, FILE* out)
           }
           return(0);
        }
+#endif /* opendir and readdir */
+
     }
     if (argc < 3 
        || strcmp("help", argv[1]) == 0
@@ -451,9 +482,13 @@ int HandleInputLine(int argc, char **argv, FILE* out)
        rrd_create(argc-1, &argv[1]);
     else if (strcmp("dump", argv[1]) == 0)
        rrd_dump(argc-1, &argv[1]);
-    else if (strcmp("info", argv[1]) == 0){
+    else if (strcmp("info", argv[1]) == 0 
+               || strcmp("updatev", argv[1]) == 0){
        info_t *data,*save;
-       data=rrd_info(argc-1, &argv[1]);
+       if (strcmp("info",argv[1]) == 0)
+          data=rrd_info(argc-1, &argv[1]);
+    else
+          data=rrd_update_v(argc-1, &argv[1]);
        while (data) {
            save=data;
            printf ("%s = ", data->key);
@@ -469,6 +504,9 @@ int HandleInputLine(int argc, char **argv, FILE* out)
            case RD_I_CNT:
                printf ("%lu", data->value.u_cnt);
                break;
+           case RD_I_INT:
+               printf ("%d", data->value.u_int);
+               break;
            case RD_I_STR:
                printf ("\"%s\"", data->value.u_str);
                free(data->value.u_str);
@@ -486,7 +524,7 @@ int HandleInputLine(int argc, char **argv, FILE* out)
             strcmp("v", argv[1]) == 0 ||
             strcmp("-v", argv[1]) == 0  ||
             strcmp("-version", argv[1]) == 0  )
-        printf("RRDtool 1.1.x  Copyright (C) 1997-2001 by Tobias Oetiker <tobi@oetiker.ch>\n");
+        printf("RRDtool 1.1.x  Copyright (C) 1997-2003 by Tobias Oetiker <tobi@oetiker.ch>\n");
     else if (strcmp("restore", argv[1]) == 0)
        rrd_restore(argc-1, &argv[1]);
     else if (strcmp("resize", argv[1]) == 0)
@@ -496,7 +534,7 @@ int HandleInputLine(int argc, char **argv, FILE* out)
     else if (strcmp("update", argv[1]) == 0)
        rrd_update(argc-1, &argv[1]);
     else if (strcmp("fetch", argv[1]) == 0) {
-       time_t        start,end;
+       time_t        start,end, ti;
        unsigned long step, ds_cnt,i,ii;
        rrd_value_t   *data,*datai;
        char          **ds_namv;
@@ -504,10 +542,10 @@ int HandleInputLine(int argc, char **argv, FILE* out)
            datai=data;
            printf("           ");
            for (i = 0; i<ds_cnt;i++)
-               printf("%14s",ds_namv[i]);
+               printf("%20s",ds_namv[i]);
            printf ("\n\n");
-           for (i = start+step; i <= end; i += step){
-               printf("%10lu:", i);
+           for (ti = start+step; ti <= end; ti += step){
+               printf("%10lu:", ti);
                for (ii = 0; ii < ds_cnt; ii++)
                    printf(" %0.10e", *(datai++));
                printf("\n");
@@ -519,8 +557,8 @@ int HandleInputLine(int argc, char **argv, FILE* out)
        }
     } else if (strcmp("xport", argv[1]) == 0) {
        int xxsize;
-       int i = 0, j = 0;
-       time_t        start,end;
+       unsigned long int j = 0;
+       time_t        start,end, ti;
        unsigned long step, col_cnt,row_cnt;
        rrd_value_t   *data,*ptr;
        char          **legend_v;
@@ -546,9 +584,9 @@ int HandleInputLine(int argc, char **argv, FILE* out)
          printf("    </%s>\n", LEGEND_TAG);
          printf("  </%s>\n", META_TAG);
          printf("  <%s>\n", DATA_TAG);
-         for (i = start+step; i <= end; i += step) {
+         for (ti = start+step; ti <= end; ti += step) {
            printf ("    <%s>", DATA_ROW_TAG);
-           printf ("<%s>%lu</%s>", COL_TIME_TAG, i, COL_TIME_TAG);
+           printf ("<%s>%lu</%s>", COL_TIME_TAG, ti, COL_TIME_TAG);
            for (j = 0; j < col_cnt; j++) {
              rrd_value_t newval = DNAN;
              newval = *ptr;
@@ -571,12 +609,13 @@ int HandleInputLine(int argc, char **argv, FILE* out)
        const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */
        int xsize, ysize;
        int i;
-       if( rrd_graph(argc-1, &argv[1], &calcpr, &xsize, &ysize) != -1 ) {
-           if (strcmp(imgfile,"-") != 0) 
+       int tostdout = (strcmp(argv[2],"-") == 0);      
+       if( rrd_graph(argc-1, &argv[1], &calcpr, &xsize, &ysize, NULL) != -1 ) {
+           if (!tostdout) 
                printf ("%dx%d\n",xsize,ysize);
            if (calcpr) {
                for(i=0;calcpr[i];i++){
-                   if (strcmp(imgfile,"-") != 0
+                   if (!tostdout
                        printf("%s\n",calcpr[i]);
                    free(calcpr[i]);
                }