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 136 0.0 %
Date: 2015-10-31 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           0 :                 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           0 :                                 goto end;
      38             :                 }
      39             :         }
      40             : 
      41             : // FIX THIS: Do something with path.
      42             : 
      43           0 :         ret=0;
      44             : end:
      45           0 :         free_w(&cname);
      46           0 :         free_w(&path);
      47           0 :         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           0 :                 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           0 :                                 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           0 :                                 goto error;
     114             :                 }
     115             :                 else
     116             :                 {
     117           0 :                         if(json_send_warn(srfd, "Unknown command"))
     118           0 :                                 goto error;
     119             :                 }
     120           0 :                 goto end;
     121             :         }
     122             : 
     123           0 :         if(browse)
     124             :         {
     125           0 :                 free_w(&logfile);
     126           0 :                 if(!(logfile=strdup_w("manifest", __func__)))
     127           0 :                         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           0 :                                 goto error;
     139           0 :                         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           0 :                                 goto error;
     146           0 :                         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           0 :                                 goto error;
     157           0 :                         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           0 :                                 goto error;
     166           0 :                         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           0 :                                 goto error;
     181           0 :                         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 && cstat_set_run_status(cstat))
     193           0 :                         goto error;
     194             :         }
     195           0 :         else for(cstat=clist; cstat; cstat=cstat->next)
     196             :         {
     197           0 :                 if(!cstat->run_status && cstat_set_run_status(cstat))
     198           0 :                         goto error;
     199             :         }
     200             : 
     201           0 :         if(json_send(srfd, clist, cstat, bu, logfile, browse, confs))
     202           0 :                 goto error;
     203             : 
     204           0 :         goto end;
     205             : error:
     206           0 :         ret=-1;
     207             : end:
     208           0 :         free_w(&client);
     209           0 :         free_w(&backup);
     210           0 :         free_w(&logfile);
     211           0 :         free_w(&browse);
     212           0 :         return ret;
     213             : }
     214             : 
     215           0 : static int parse_data(struct asfd *asfd, struct cstat *clist,
     216             :         struct asfd *cfd, struct conf **confs)
     217             : {
     218           0 :         if(asfd==cfd) return parse_client_data(asfd, clist, confs);
     219           0 :         return parse_parent_data(asfd, clist);
     220             : }
     221             : 
     222           0 : int status_server(struct async *as, struct conf **confs)
     223             : {
     224           0 :         int gotdata=0;
     225             :         struct asfd *asfd;
     226           0 :         struct cstat *clist=NULL;
     227           0 :         struct asfd *cfd=as->asfd; // Client.
     228             :         while(1)
     229             :         {
     230             :                 // Take the opportunity to get data from the disk if nothing
     231             :                 // was read from the fds.
     232           0 :                 if(gotdata) gotdata=0;
     233           0 :                 else if(cstat_load_data_from_disk(&clist, confs))
     234           0 :                         goto error;
     235           0 :                 if(as->read_write(as))
     236             :                 {
     237           0 :                         logp("Exiting main status server loop\n");
     238           0 :                         break;
     239             :                 }
     240           0 :                 for(asfd=as->asfd; asfd; asfd=asfd->next)
     241           0 :                         while(asfd->rbuf->buf)
     242             :                 {
     243           0 :                         gotdata=1;
     244           0 :                         if(parse_data(asfd, clist, cfd, confs)
     245           0 :                           || asfd->parse_readbuf(asfd))
     246           0 :                                 goto error;
     247           0 :                         iobuf_free_content(asfd->rbuf);
     248             :                 }
     249             :         }
     250             : // FIX THIS: should free clist;
     251           0 :         return 0;
     252             : error:
     253           0 :         return -1;
     254             : }

Generated by: LCOV version 1.10