LCOV - code coverage report
Current view: top level - src/server/monitor - status_server.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 0 114 0.0 %
Date: 2016-05-01 Functions: 0 5 0.0 %

          Line data    Source code
       1             : #include "../../burp.h"
       2             : #include "../../alloc.h"
       3             : #include "../../asfd.h"
       4             : #include "../../async.h"
       5             : #include "../../bu.h"
       6             : #include "../../cstat.h"
       7             : #include "../../handy.h"
       8             : #include "../../iobuf.h"
       9             : #include "../../log.h"
      10             : #include "cstat.h"
      11             : #include "json_output.h"
      12             : 
      13           0 : static int parse_parent_data(struct asfd *asfd, struct cstat *clist)
      14             : {
      15           0 :         int ret=-1;
      16           0 :         char *cp=NULL;
      17           0 :         char *cname=NULL;
      18           0 :         struct cstat *c=NULL;
      19           0 :         char *path=NULL;
      20             : //printf("got parent data: '%s'\n", asfd->rbuf->buf);
      21             : 
      22             :         // Extract the client name.
      23           0 :         if(!(cp=strchr(asfd->rbuf->buf, '\t')))
      24             :                 return 0;
      25           0 :         *cp='\0';
      26           0 :         if(!(cname=strdup_w(asfd->rbuf->buf, __func__))) goto end;
      27           0 :         *cp='\t';
      28             : 
      29             :         // Find the array entry for this client,
      30             :         // and add the detail from the parent to it.
      31           0 :         for(c=clist; c; c=c->next)
      32             :         {
      33           0 :                 if(!strcmp(c->name, cname))
      34             :                 {
      35             :                         //printf("parse for client %s\n", c->name);
      36           0 :                         if(str_to_cntr(asfd->rbuf->buf, c, &path))
      37             :                                 goto end;
      38             :                 }
      39             :         }
      40             : 
      41             : // FIX THIS: Do something with path.
      42             : 
      43             :         ret=0;
      44             : end:
      45           0 :         free_w(&cname);
      46           0 :         free_w(&path);
      47             :         return ret;
      48             : }
      49             : 
      50           0 : static char *get_str(const char **buf, const char *pre, int last)
      51             : {
      52           0 :         size_t len=0;
      53           0 :         char *cp=NULL;
      54           0 :         char *copy=NULL;
      55           0 :         char *ret=NULL;
      56           0 :         if(!buf || !*buf) goto end;
      57           0 :         len=strlen(pre);
      58           0 :         if(strncmp(*buf, pre, len)
      59           0 :           || !(copy=strdup_w((*buf)+len, __func__)))
      60             :                 goto end;
      61           0 :         if(!last && (cp=strchr(copy, ':'))) *cp='\0';
      62           0 :         *buf+=len+strlen(copy)+1;
      63           0 :         ret=strdup_w(copy, __func__);
      64             : end:
      65           0 :         free_w(&copy);
      66           0 :         return ret;
      67             : }
      68             : 
      69             : /*
      70             : void dump_cbno(struct cstat *clist, const char *msg)
      71             : {
      72             :         if(!clist) return;
      73             :         printf("dump %s: %s\n", msg, clist->name);
      74             :         struct bu *b;
      75             :         for(b=clist->bu; b; b=b->prev)
      76             :                 printf("   %d\n", b->bno);
      77             : }
      78             : */
      79             : 
      80           0 : static int parse_client_data(struct asfd *srfd,
      81             :         struct cstat *clist, struct conf **confs)
      82             : {
      83           0 :         int ret=0;
      84           0 :         char *command=NULL;
      85           0 :         char *client=NULL;
      86           0 :         char *backup=NULL;
      87           0 :         char *logfile=NULL;
      88           0 :         char *browse=NULL;
      89           0 :         const char *cp=NULL;
      90           0 :         struct cstat *cstat=NULL;
      91           0 :         struct bu *bu=NULL;
      92             : //printf("got client data: '%s'\n", srfd->rbuf->buf);
      93             : 
      94           0 :         cp=srfd->rbuf->buf;
      95           0 :         command=get_str(&cp, "j:", 0);
      96           0 :         client=get_str(&cp, "c:", 0);
      97           0 :         backup=get_str(&cp, "b:", 0);
      98           0 :         logfile=get_str(&cp, "l:", 0);
      99           0 :         browse=get_str(&cp, "p:", 1);
     100             : 
     101           0 :         if(command)
     102             :         {
     103           0 :                 if(!strcmp(command, "pretty-print-on"))
     104             :                 {
     105           0 :                         json_set_pretty_print(1);
     106           0 :                         if(json_send_warn(srfd, "Pretty print on"))
     107             :                                 goto error;
     108             :                 }
     109           0 :                 else if(!strcmp(command, "pretty-print-off"))
     110             :                 {
     111           0 :                         json_set_pretty_print(0);
     112           0 :                         if(json_send_warn(srfd, "Pretty print off"))
     113             :                                 goto error;
     114             :                 }
     115             :                 else
     116             :                 {
     117           0 :                         if(json_send_warn(srfd, "Unknown command"))
     118             :                                 goto error;
     119             :                 }
     120             :                 goto end;
     121             :         }
     122             : 
     123           0 :         if(browse)
     124             :         {
     125           0 :                 free_w(&logfile);
     126           0 :                 if(!(logfile=strdup_w("manifest", __func__)))
     127             :                         goto error;
     128           0 :                 strip_trailing_slashes(&browse);
     129             :         }
     130             : 
     131             : //dump_cbno(clist, "pcd");
     132             : 
     133           0 :         if(client && *client)
     134             :         {
     135           0 :                 if(!(cstat=cstat_get_by_name(clist, client)))
     136             :                 {
     137           0 :                         if(json_send_warn(srfd, "Could not find client"))
     138             :                                 goto error;
     139             :                         goto end;
     140             :                 }
     141             : 
     142           0 :                 if(cstat_set_backup_list(cstat))
     143             :                 {
     144           0 :                         if(json_send_warn(srfd, "Could not get backup list"))
     145             :                                 goto error;
     146             :                         goto end;
     147             :                         
     148             :                 }
     149             :         }
     150           0 :         if(cstat && backup)
     151             :         {
     152           0 :                 unsigned long bno=0;
     153           0 :                 if(!(bno=strtoul(backup, NULL, 10)))
     154             :                 {
     155           0 :                         if(json_send_warn(srfd, "Could not get backup number"))
     156             :                                 goto error;
     157             :                         goto end;
     158             :                 }
     159           0 :                 for(bu=cstat->bu; bu; bu=bu->prev)
     160           0 :                         if(bu->bno==bno) break;
     161             : 
     162           0 :                 if(!bu)
     163             :                 {
     164           0 :                         if(json_send_warn(srfd, "Backup not found"))
     165             :                                 goto error;
     166             :                         goto end;
     167             :                 }
     168             :         }
     169           0 :         if(logfile)
     170             :         {
     171           0 :                 if(strcmp(logfile, "manifest")
     172           0 :                   && strcmp(logfile, "backup")
     173           0 :                   && strcmp(logfile, "restore")
     174           0 :                   && strcmp(logfile, "verify")
     175           0 :                   && strcmp(logfile, "backup_stats")
     176           0 :                   && strcmp(logfile, "restore_stats")
     177           0 :                   && strcmp(logfile, "verify_stats"))
     178             :                 {
     179           0 :                         if(json_send_warn(srfd, "File not supported"))
     180             :                                 goto error;
     181             :                         goto end;
     182             :                 }
     183             :         }
     184             : /*
     185             :         printf("client: %s\n", client?:"");
     186             :         printf("backup: %s\n", backup?:"");
     187             :         printf("logfile: %s\n", logfile?:"");
     188             : */
     189             : 
     190           0 :         if(cstat)
     191             :         {
     192           0 :                 if(!cstat->run_status)
     193           0 :                         cstat_set_run_status(cstat);
     194             :         }
     195           0 :         else for(cstat=clist; cstat; cstat=cstat->next)
     196             :         {
     197           0 :                 if(!cstat->run_status)
     198           0 :                         cstat_set_run_status(cstat);
     199             :         }
     200             : 
     201           0 :         if(json_send(srfd, clist, cstat, bu, logfile, browse,
     202           0 :                 get_int(confs[OPT_MONITOR_BROWSE_CACHE])))
     203             :                         goto error;
     204             : 
     205             :         goto end;
     206             : error:
     207             :         ret=-1;
     208             : end:
     209           0 :         free_w(&client);
     210           0 :         free_w(&backup);
     211           0 :         free_w(&logfile);
     212           0 :         free_w(&browse);
     213           0 :         return ret;
     214             : }
     215             : 
     216           0 : static int parse_data(struct asfd *asfd, struct cstat *clist,
     217             :         struct asfd *cfd, struct conf **confs)
     218             : {
     219           0 :         if(asfd==cfd) return parse_client_data(asfd, clist, confs);
     220           0 :         return parse_parent_data(asfd, clist);
     221             : }
     222             : 
     223           0 : int status_server(struct async *as, struct conf **confs)
     224             : {
     225           0 :         int ret=-1;
     226           0 :         int gotdata=0;
     227             :         struct asfd *asfd;
     228           0 :         struct cstat *clist=NULL;
     229           0 :         struct asfd *cfd=as->asfd; // Client.
     230           0 :         struct conf **cconfs=NULL;
     231             : 
     232           0 :         if(!(cconfs=confs_alloc()))
     233             :                 goto end;
     234             : 
     235             :         while(1)
     236             :         {
     237             :                 // Take the opportunity to get data from the disk if nothing
     238             :                 // was read from the fds.
     239           0 :                 if(gotdata) gotdata=0;
     240           0 :                 else if(cstat_load_data_from_disk(&clist, confs, cconfs))
     241             :                         goto end;
     242           0 :                 if(as->read_write(as))
     243             :                 {
     244           0 :                         logp("Exiting main status server loop\n");
     245             :                         break;
     246             :                 }
     247           0 :                 for(asfd=as->asfd; asfd; asfd=asfd->next)
     248           0 :                         while(asfd->rbuf->buf)
     249             :                 {
     250           0 :                         gotdata=1;
     251           0 :                         if(parse_data(asfd, clist, cfd, confs)
     252           0 :                           || asfd->parse_readbuf(asfd))
     253             :                                 goto end;
     254           0 :                         iobuf_free_content(asfd->rbuf);
     255             :                 }
     256             :         }
     257           0 :         ret=0;
     258             : end:
     259             : // FIX THIS: should free clist;
     260           0 :         return ret;
     261             : }

Generated by: LCOV version 1.10