//2013.1.15 // not deduplication // zhou peng ju static bool check_data(char hash[20],char* buf,int buflen){ uint8_t tmphash[20]; SHA_CTX ctx; SHA1_Init(&ctx); SHA1_Update(&ctx, buf, buflen); SHA1_Final(tmphash,&ctx); if(memcmp(tmphash, hash, 20)!=0){ err_msg1("data has been corrupted!"); return false; } return true; }
/*main function*/ int main(int argc, char **argv) { int opt; enum OPER_TYPE type; char path[FILE_NAME_LEN] = {0}; char output_path[FILE_NAME_LEN] = {0}; int delete_job; Client *c= NULL; if(argc<2) return -1; struct option long_options[] = { {"Simulate", 1, NULL, 'S'}, {"quit", 0, NULL, 'q'}, {"backup", 1, NULL, 'b'}, {"delete", 1, NULL, 'd'}, {"restore", 1, NULL, 'r'}, {"list", 0, NULL, 'l'}, {"pipeline", 0, NULL, 'p'}, {"output", 1, NULL, 'o'}, {"cloud", 0, NULL, 'c'}, {"rewrite", 1, NULL, 'R'}, /*CFL*/ {"CFL", 1, NULL, 'C'}, {"seg_reuse", 1, NULL, 's'}, /*capping*/ {"cap_size", 1, NULL, 'a'}, {"cap_count", 1, NULL, 'e'}, /*perferect rewrite*/ {"ref_threshold", 1, NULL, 'u'}, {"overhead", 1, NULL, 'O'}, {"test", 1, NULL, 't'}, {"server", 1, NULL, 'H'}, {"help", 0, NULL, 'h'}, {NULL, 0, NULL, 0} }; while((opt=getopt_long(argc, argv, "S:qb:d:r:lpo:cR:C:s:a:e:u:O:t:H:h", long_options, NULL))!=-1){ switch(opt){ case 'S': type=type_simulate; SIMULATE = true; strncpy(path, optarg, strlen(optarg)); break; case 'q': type=type_quit; break; case 'b': type=type_backup; strncpy(path,optarg,strlen(optarg)); break; case 'd': type=type_delete; sscanf(optarg, "%d", &delete_job); break; case 'r': type=type_restore; strncpy(path,optarg,strlen(optarg)); break; case 'R': if (strcmp(optarg, "CFL") == 0) REWRITE = CFL_REWRITE; else if (strcmp(optarg, "CAP") == 0) REWRITE = CAPPING_REWRITE; else if (strcmp(optarg, "PER") == 0) REWRITE = PERFECT_REWRITE; break; case 'C': sscanf(optarg, "%f", &LWM); break; case 's': sscanf(optarg, "%f", &default_container_reuse); break; case 'a': sscanf(optarg, "%lld", &buffer_capacity); break; case 'e': sscanf(optarg, "%d", &max_refer_count); break; case 'u': sscanf(optarg, "%f", &segment_usage_threshold); break; case 'O': OVERHEAD = true; sscanf(optarg, "%f", &bandwidth); break; case 't': type=type_test; strncpy(path,optarg,strlen(optarg)); break; case 'h': type=type_help; break; break; case 'H': memset(SERVER_IP,0,30); strncpy(SERVER_IP,optarg,strlen(optarg)); break; case 'l': type=type_list; break; case 'p': G_PIPELINE = true; break; case 'o': OUTPUT_RESULT = true; strncpy(output_path, optarg, strlen(optarg)); break; case 'c': CLOUD = true; break; default: printf("Your command is wrong \n"); type=type_help; break; } } if(type==type_help){ usage(argv[0]); return 0; } c = create_client(); if (type == type_simulate) { simulata_backup(c, path, output_path); free(c); return 0; }else if(OVERHEAD == true) { backup_overhead(c, path, output_path); free(c); return 0; } if ((c->fd = bnet_connect(SERVER_IP, SERVER_PORT)) == -1){ err_msg1("Connection rejected!"); return 0; } if (G_PIPELINE) { c->recipe_fd = bnet_connect(SERVER_IP, SERVER_OTH_PORT); if (c->recipe_fd == -1) { err_msg1("Connection rejected!"); return 0; } } if(type==type_test){ test_data(c->fd, path); return 0; } switch(type){ case type_login: login(c); break; case type_logout: logout(c); break; case type_quit: quit_client(c); break; case type_backup: if (G_PIPELINE) pipeline_backup(c, path, output_path); else backup_client(c, path, output_path); break; case type_restore: restore_client(c, path, output_path); break; case type_delete: delete_client(c, delete_job); break; case type_list: list_client(c); break; default: printf("Your command is wrong \n"); break; } free_client(c); return 0; }
void backup_formal(int fd,char *msg){ JCR *jcr=NULL; char fileset[256]={0}; char *buf=(char *)calloc(1,SOCKET_BUF_SIZE+21); int len; int index=1; char vol_name[FILE_NAME_LEN]; int vol_fd; Recipe *rp=NULL; FingerChunk *fc=NULL; char *p=NULL; int64_t rwlen=0; jobcount_init(); jcr=jcr_new(); jcr->dataSocket=fd; memset(vol_name,0,FILE_NAME_LEN); strcpy(vol_name,BackupVolPath); strcat(vol_name,"data_vol"); vol_fd=open(vol_name,O_RDWR| O_CREAT,00644); if(vol_fd<0){ err_msg1("can't open file"); goto FAIL; } printf("%s %d vol_name:%s\n",__FILE__,__LINE__,vol_name); rwlen=lseek(vol_fd,0,SEEK_END); TIMER_DECLARE(gstart,gend); TIMER_DECLARE(wstart,wend); TIMER_START(gstart); if(sscanf(msg,backup_cmd,fileset)!=1){ // backup cmd goto FAIL; } jcr->jobv=jobv_new(fileset); jcr->nJobId=jcr->jobv->nJobId; printf("===========backup start==============\n"); printf("%s,%d pathname:%s \n", __FILE__,__LINE__,fileset); while(bnet_recv(jcr->dataSocket,buf,&len)!=ERROR){ //文件名 if(len==STREAM_END){ printf("%s %d backup is over\n",__FILE__,__LINE__); break; } //printf("\033[40;32m recv file: %s (%d) \033[0m\n",buf,len); rp=recipe_new(); memcpy(rp->filename,buf,len); rp->fileindex=index++; while(bnet_recv(jcr->dataSocket,buf,&len)>0){ /*format: fingerprintf data data dta..*/ //printf("\033[40;32m recv: file data (%d) \033[0m\n",len); fc=fingerchunk_new(buf,0); fc->offset=rwlen; fc->length=len-sizeof(Fingerprint); check_data(fc->fingerprint,buf+sizeof(Fingerprint),fc->length); TIMER_START(wstart); if(writen(vol_fd,buf+sizeof(Fingerprint),fc->length)!=fc->length) err_msg1("wrintn wrong"); TIMER_END(wend); TIMER_DIFF(jcr->writeDataTime,wstart,wend); rwlen+=fc->length; jcr->nChunkCount++; jcr->nSize+=fc->length; recipe_append_fingerchunk(rp,fc); } jcr->nFileCount++; if(G_VERBOSE) printf("receive file %s OK, total: %d\n",rp->filename,jcr->nFileCount); jobv_insert_recipe(jcr->jobv, rp); rp=NULL; } FAIL: bnet_send(fd,"OK",2); // 发送备份成功信息 TIMER_END(gend); TIMER_DIFF(jcr->recvTime,gstart,gend); printf("============back over===============\n"); printf("total time:%.4f %.4f MB/s\n",jcr->recvTime,jcr->nSize*1.0/jcr->recvTime/1036288.0); printf("write time:%.4f %.4f MB/s\n",jcr->writeDataTime,jcr->nSize*1.0/jcr->writeDataTime/1036288.0); printf("chunk count:%d\n",jcr->nChunkCount); printf("file count:%d\n",jcr->nFileCount); if(rp){ recipe_free(rp); } jobv_destroy(jcr->jobv); jcr_free(jcr); jobcount_close(); close(vol_fd); }
void restore_formal(int fd,char *msg){ JCR *jcr=NULL; Recipe *rp=NULL; FingerChunk *fc=NULL; char *buf=(char *)calloc(1,SOCKET_BUF_SIZE+21); char vol_name[FILE_NAME_LEN]; int vol_fd; //char stream[30]={0}; memset(vol_name,0,FILE_NAME_LEN); strcpy(vol_name,BackupVolPath); strcat(vol_name,"data_vol"); vol_fd=open(vol_name,O_RDWR| O_CREAT,00644); jcr=jcr_new(); jcr->dataSocket=fd; if(vol_fd<0){ err_msg1("can't open file"); goto FAIL; } if(sscanf(msg,restore_cmd,&jcr->nJobId)!=1){ // backup cmd goto FAIL; } jcr->jobv=jobv_open(jcr->nJobId); if(jcr->jobv==NULL){ goto FAIL; } printf("%s,%d restore jobid:%d \n", __FILE__,__LINE__,jcr->nJobId); // send pathname bnet_send(fd,jcr->jobv->szBackupPath,strlen(jcr->jobv->szBackupPath)); while((rp=jobv_search_next_recipe(jcr->jobv))){ //send file name if(G_VERBOSE) printf("send file %s \n",rp->filename); bnet_send(fd,rp->filename,strlen(rp->filename)); //send data for(fc=rp->first;fc;fc=fc->next){ lseek(vol_fd,fc->offset,SEEK_SET); if(readn(vol_fd,buf,fc->length)!=fc->length) err_msg1("readn wrong"); check_data(fc->fingerprint,buf,fc->length); bnet_send(fd,buf,fc->length); } bnet_signal(fd,DATA_END); recipe_free(rp); } FAIL: bnet_signal(fd,STREAM_END); /* over */ jobv_destroy(jcr->jobv); jcr_free(jcr); }