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(©);
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)
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 0 : goto error;
204 :
205 0 : goto end;
206 : error:
207 0 : 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 0 : 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 0 : goto end;
242 0 : if(as->read_write(as))
243 : {
244 0 : logp("Exiting main status server loop\n");
245 0 : 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 0 : 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 : }
|