static int run_list(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs) { int ret=-1; char *cp=NULL; char *backupno=NULL; char *browsedir=NULL; char *listregex=NULL; struct iobuf *rbuf=asfd->rbuf; if(!client_can_generic(cconfs, OPT_CLIENT_CAN_LIST)) { logp("Not allowing list of %s\n", get_string(cconfs[OPT_CNAME])); asfd->write_str(asfd, CMD_GEN, "Client list is not allowed"); goto end; } if(!strncmp_w(rbuf->buf, "list ")) { if((cp=strchr(rbuf->buf, ':'))) { *cp='\0'; if(!(listregex=strdup_w(cp+1, __func__))) goto end; } if(!(backupno=strdup_w(rbuf->buf+strlen("list "), __func__))) goto end; } else if(!strncmp_w(rbuf->buf, "listb ")) { if((cp=strchr(rbuf->buf, ':'))) { *cp='\0'; if(!(browsedir=strdup_w(cp+1, __func__))) goto end; } strip_trailing_slashes(&browsedir); if(!(backupno=strdup_w(rbuf->buf+strlen("listb "), __func__))) goto end; } if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; iobuf_free_content(asfd->rbuf); if(list_server_init(asfd, sdirs, get_cntr(cconfs), get_protocol(cconfs), backupno, listregex, browsedir)) goto end; ret=do_list_server(); end: free_w(&backupno); free_w(&browsedir); free_w(&listregex); list_server_free(); return ret; }
static int run_restore(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs, int srestore) { int ret=-1; char *dir_for_notify=NULL; enum action act=ACTION_RESTORE; struct iobuf *rbuf=asfd->rbuf; const char *cname=get_string(cconfs[OPT_CNAME]); if(parse_restore_str_and_set_confs(rbuf->buf, &act, cconfs)) goto end; iobuf_free_content(rbuf); if(act==ACTION_RESTORE) { int r; if((r=client_can_restore(cconfs))<0) goto end; else if(!r) { logp("Not allowing restore of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client restore is not allowed")) ret=0; goto end; } } if(act==ACTION_VERIFY && !(client_can_generic(cconfs, OPT_CLIENT_CAN_VERIFY))) { logp("Not allowing verify of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client verify is not allowed")) ret=0; goto end; } if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; ret=do_restore_server(asfd, sdirs, act, srestore, &dir_for_notify, cconfs); if(dir_for_notify) maybe_do_notification(asfd, ret, sdirs->client, dir_for_notify, act==ACTION_RESTORE?"restorelog":"verifylog", act==ACTION_RESTORE?"restore":"verify", cconfs); end: free_w(&dir_for_notify); return ret; }
static int client_can_restore(struct conf **cconfs) { struct stat statp; const char *restore_path=get_string(cconfs[OPT_RESTORE_PATH]); // If there is a restore file on the server, it is always OK. if(restore_path && !lstat(restore_path, &statp)) { // Remove the file. unlink(restore_path); return 1; } return client_can_generic(cconfs, OPT_CLIENT_CAN_RESTORE); }
static int run_delete(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs) { char *backupno=NULL; struct iobuf *rbuf=asfd->rbuf; const char *cname=get_string(cconfs[OPT_CNAME]); if(!client_can_generic(cconfs, OPT_CLIENT_CAN_DELETE)) { logp("Not allowing delete of %s\n", cname); asfd->write_str(asfd, CMD_GEN, "Client delete is not allowed"); return -1; } backupno=rbuf->buf+strlen("delete "); return do_delete_server(asfd, sdirs, get_cntr(cconfs), cname, backupno, get_string(cconfs[OPT_MANUAL_DELETE])); }
static int run_diff(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs) { int ret=-1; char *backup1=NULL; char *backup2=NULL; struct iobuf *rbuf=asfd->rbuf; if(!client_can_generic(cconfs, OPT_CLIENT_CAN_DIFF)) { logp("Not allowing diff of %s\n", get_string(cconfs[OPT_CNAME])); asfd->write_str(asfd, CMD_GEN, "Client diff is not allowed"); goto end; } if(!strncmp_w(rbuf->buf, "diff ")) { char *cp; if((cp=strchr(rbuf->buf, ':'))) { *cp='\0'; if(!(backup2=strdup_w(cp+1, __func__))) goto end; } if(!(backup1=strdup_w(rbuf->buf+strlen("diff "), __func__))) goto end; } if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; iobuf_free_content(asfd->rbuf); ret=do_diff_server(asfd, sdirs, get_cntr(cconfs), get_protocol(cconfs), backup1, backup2); end: return ret; }
static int run_restore(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs, int srestore) { int ret=-1; char *cp=NULL; char *copy=NULL; enum action act; char *backupnostr=NULL; char *restoreregex=NULL; char *dir_for_notify=NULL; struct iobuf *rbuf=asfd->rbuf; const char *cname=get_string(cconfs[OPT_CNAME]); if(!(copy=strdup_w(rbuf->buf, __func__))) goto end; iobuf_free_content(rbuf); if(!strncmp_w(copy, "restore ")) act=ACTION_RESTORE; else act=ACTION_VERIFY; if(!(backupnostr=strchr(copy, ' '))) { logp("Could not parse %s in %s\n", copy, __func__); goto end; } backupnostr++; if(set_string(cconfs[OPT_BACKUP], backupnostr)) goto end; // FIX THIS. if((cp=strchr(cconfs[OPT_BACKUP]->data.s, ':'))) *cp='\0'; if(act==ACTION_RESTORE) { int r; if((r=client_can_restore(cconfs))<0) goto end; else if(!r) { logp("Not allowing restore of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client restore is not allowed")) ret=0; goto end; } } if(act==ACTION_VERIFY && !(client_can_generic(cconfs, OPT_CLIENT_CAN_VERIFY))) { logp("Not allowing verify of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client verify is not allowed")) ret=0; goto end; } if((restoreregex=strchr(copy, ':'))) { *restoreregex='\0'; restoreregex++; } if(restoreregex && *restoreregex && set_string(cconfs[OPT_REGEX], restoreregex)) goto end; if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; ret=do_restore_server(asfd, sdirs, act, srestore, &dir_for_notify, cconfs); if(dir_for_notify) maybe_do_notification(asfd, ret, sdirs->client, dir_for_notify, act==ACTION_RESTORE?"restorelog":"verifylog", act==ACTION_RESTORE?"restore":"verify", cconfs); end: free_w(©); free_w(&dir_for_notify); return ret; }