📄 amadmin.c
字号:
tp->reuse = 1; g_printf(_("%s: marking tape %s as reusable.\n"), get_pname(), argv[count]); } else { g_fprintf(stderr, _("%s: tape %s already reusable.\n"), get_pname(), argv[count]); } } if(write_tapelist(conf_tapelist)) { error(_("could not write tapelist \"%s\""), conf_tapelist); /*NOTREACHED*/ }}voidnoreuse( int argc, char ** argv){ tape_t *tp; int count; if(argc < 4) { g_fprintf(stderr,_("%s: expecting \"no-reuse <tapelabel> ...\"\n"), get_pname()); usage(); } for(count=3; count< argc; count++) { tp = lookup_tapelabel(argv[count]); if ( tp == NULL) { g_fprintf(stderr, _("no-reuse: tape label %s not found in tapelist.\n"), argv[count]); continue; } if( tp->reuse == 1 ) { tp->reuse = 0; g_printf(_("%s: marking tape %s as not reusable.\n"), get_pname(), argv[count]); } else { g_fprintf(stderr, _("%s: tape %s already not reusable.\n"), get_pname(), argv[count]); } } if(write_tapelist(conf_tapelist)) { error(_("could not write tapelist \"%s\""), conf_tapelist); /*NOTREACHED*/ }}/* ----------------------------------------------- */static int deleted;voiddelete_one( disk_t * dp){ char *hostname = dp->host->hostname; char *diskname = dp->name; info_t info; if(get_info(hostname, diskname, &info)) { g_printf(_("%s: %s:%s NOT currently in database.\n"), get_pname(), hostname, diskname); return; } deleted++; if(del_info(hostname, diskname)) { error(_("couldn't delete %s:%s from database: %s"), hostname, diskname, strerror(errno)); /*NOTREACHED*/ } else { g_printf(_("%s: %s:%s deleted from curinfo database.\n"), get_pname(), hostname, diskname); }}voiddelete( int argc, char ** argv){ deleted = 0; diskloop(argc, argv, "delete", delete_one); if(deleted) g_printf( _("%s: NOTE: you'll have to remove these from the disklist yourself.\n"), get_pname());}/* ----------------------------------------------- */voidinfo_one( disk_t * dp){ info_t info; int lev; struct tm *tm; stats_t *sp; get_info(dp->host->hostname, dp->name, &info); g_printf(_("\nCurrent info for %s %s:\n"), dp->host->hostname, dp->name); if (ISSET(info.command, FORCE_FULL)) g_printf(_(" (Forcing to level 0 dump at next run)\n")); if (ISSET(info.command, FORCE_BUMP)) g_printf(_(" (Forcing bump at next run)\n")); if (ISSET(info.command, FORCE_NO_BUMP)) g_printf(_(" (Forcing no-bump at next run)\n")); g_printf(_(" Stats: dump rates (kps), Full: %5.1lf, %5.1lf, %5.1lf\n"), info.full.rate[0], info.full.rate[1], info.full.rate[2]); g_printf(_(" Incremental: %5.1lf, %5.1lf, %5.1lf\n"), info.incr.rate[0], info.incr.rate[1], info.incr.rate[2]); g_printf(_(" compressed size, Full: %5.1lf%%,%5.1lf%%,%5.1lf%%\n"), info.full.comp[0]*100, info.full.comp[1]*100, info.full.comp[2]*100); g_printf(_(" Incremental: %5.1lf%%,%5.1lf%%,%5.1lf%%\n"), info.incr.comp[0]*100, info.incr.comp[1]*100, info.incr.comp[2]*100); g_printf(_(" Dumps: lev datestmp tape file origK compK secs\n")); for(lev = 0, sp = &info.inf[0]; lev < 9; lev++, sp++) { if(sp->date < (time_t)0 && sp->label[0] == '\0') continue; tm = localtime(&sp->date); if (tm) { g_printf(_(" %d %04d%02d%02d %-15s %lld %lld %lld %jd\n"), lev, tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, sp->label, (long long)sp->filenum, (long long)sp->size, (long long)sp->csize, (intmax_t)sp->secs); } else { g_printf(_(" %d BAD-DATE %-15s %lld %lld %lld %jd\n"), lev, sp->label, (long long)sp->filenum, (long long)sp->size, (long long)sp->csize, (intmax_t)sp->secs); } }}voidinfo( int argc, char ** argv){ disk_t *dp; if(argc >= 4) diskloop(argc, argv, "info", info_one); else for(dp = diskq.head; dp != NULL; dp = dp->next) info_one(dp);}/* ----------------------------------------------- */voiddue_one( disk_t * dp){ am_host_t *hp; int days; info_t info; hp = dp->host; if(get_info(hp->hostname, dp->name, &info)) { g_printf(_("new disk %s:%s ignored.\n"), hp->hostname, dp->name); } else { days = next_level0(dp, &info); if(days < 0) { g_printf(_("Overdue %2d day%s %s:%s\n"), -days, (-days == 1) ? ": " : "s:", hp->hostname, dp->name); } else if(days == 0) { g_printf(_("Due today: %s:%s\n"), hp->hostname, dp->name); } else { g_printf(_("Due in %2d day%s %s:%s\n"), days, (days == 1) ? ": " : "s:", hp->hostname, dp->name); } }}voiddue( int argc, char ** argv){ disk_t *dp; time(&today); if(argc >= 4) diskloop(argc, argv, "due", due_one); else for(dp = diskq.head; dp != NULL; dp = dp->next) due_one(dp);}/* ----------------------------------------------- */voidtape( int argc, char ** argv){ tape_t *tp, *lasttp; int runtapes, i, j; int nb_days = 1; if(argc > 4 && strcmp(argv[3],"--days") == 0) { nb_days = atoi(argv[4]); if(nb_days < 1) { g_printf(_("days must be an integer bigger than 0\n")); return; } if (nb_days > 10000) nb_days = 10000; } runtapes = getconf_int(CNF_RUNTAPES); tp = lookup_last_reusable_tape(0); for ( j=0 ; j < nb_days ; j++ ) { for ( i=0 ; i < runtapes ; i++ ) { if(i==0) g_printf(_("The next Amanda run should go onto ")); else g_printf(" "); if(tp != NULL) { g_printf(_("tape %s or a new tape.\n"), tp->label); } else { if (runtapes - i == 1) g_printf(_("1 new tape.\n")); else g_printf(_("%d new tapes.\n"), runtapes - i); i = runtapes; } tp = lookup_last_reusable_tape(i + 1); } } lasttp = lookup_tapepos(lookup_nb_tape()); i = runtapes; if(lasttp && i > 0 && strcmp(lasttp->datestamp,"0") == 0) { int c = 0; while(lasttp && i > 0 && strcmp(lasttp->datestamp,"0") == 0) { c++; lasttp = lasttp->prev; i--; } lasttp = lookup_tapepos(lookup_nb_tape()); i = runtapes; if(c == 1) { g_printf(_("The next new tape already labelled is: %s.\n"), lasttp->label); } else { g_printf(_("The next %d new tapes already labelled are: %s"), c, lasttp->label); lasttp = lasttp->prev; c--; while(lasttp && c > 0 && strcmp(lasttp->datestamp,"0") == 0) { g_printf(", %s", lasttp->label); lasttp = lasttp->prev; c--; } g_printf(".\n"); } }}/* ----------------------------------------------- */voidbalance( int argc, char ** argv){ disk_t *dp; struct balance_stats { int disks; off_t origsize, outsize; } *sp; int conf_runspercycle, conf_dumpcycle; int seq, runs_per_cycle, overdue, max_overdue; int later, total, balance, distinct; double fseq, disk_dumpcycle; info_t info; off_t total_balanced, balanced; int empty_day; time(&today); conf_dumpcycle = getconf_int(CNF_DUMPCYCLE); conf_runspercycle = getconf_int(CNF_RUNSPERCYCLE); later = conf_dumpcycle; overdue = 0; max_overdue = 0; if(argc > 4 && strcmp(argv[3],"--days") == 0) { later = atoi(argv[4]); if(later < 0) later = conf_dumpcycle; } if(later > 10000) later = 10000; if(conf_runspercycle == 0) { runs_per_cycle = conf_dumpcycle; } else if(conf_runspercycle == -1 ) { runs_per_cycle = guess_runs_from_tapelist(); } else runs_per_cycle = conf_runspercycle; if (runs_per_cycle <= 0) { runs_per_cycle = 1; } total = later + 1; balance = later + 2; distinct = later + 3; sp = (struct balance_stats *) alloc(SIZEOF(struct balance_stats) * (distinct+1)); for(seq=0; seq <= distinct; seq++) { sp[seq].disks = 0; sp[seq].origsize = sp[seq].outsize = (off_t)0; } for(dp = diskq.head; dp != NULL; dp = dp->next) { if(get_info(dp->host->hostname, dp->name, &info)) { g_printf(_("new disk %s:%s ignored.\n"), dp->host->hostname, dp->name); continue; } if (dp->strategy == DS_NOFULL) { continue; } sp[distinct].disks++; sp[distinct].origsize += info.inf[0].size/(off_t)unitdivisor; sp[distinct].outsize += info.inf[0].csize/(off_t)unitdivisor; sp[balance].disks++; if(dp->dumpcycle == 0) { sp[balance].origsize += (info.inf[0].size/(off_t)unitdivisor) * (off_t)runs_per_cycle; sp[balance].outsize += (info.inf[0].csize/(off_t)unitdivisor) * (off_t)runs_per_cycle; } else { sp[balance].origsize += (info.inf[0].size/(off_t)unitdivisor) * (off_t)(conf_dumpcycle / dp->dumpcycle); sp[balance].outsize += (info.inf[0].csize/(off_t)unitdivisor) * (off_t)(conf_dumpcycle / dp->dumpcycle); } disk_dumpcycle = (double)dp->dumpcycle; if(dp->dumpcycle <= 0) disk_dumpcycle = ((double)conf_dumpcycle) / ((double)runs_per_cycle); seq = next_level0(dp, &info); fseq = seq + 0.0001; do { if(seq < 0) { overdue++; if (-seq > max_overdue) max_overdue = -seq; seq = 0; fseq = seq + 0.0001; } if(seq > later) { seq = later; } sp[seq].disks++; sp[seq].origsize += info.inf[0].size/(off_t)unitdivisor; sp[seq].outsize += info.inf[0].csize/(off_t)unitdivisor; if(seq < later) { sp[total].disks++; sp[total].origsize += info.inf[0].size/(off_t)unitdivisor; sp[total].outsize += info.inf[0].csize/(off_t)unitdivisor; } /* See, if there's another run in this dumpcycle */ fseq += disk_dumpcycle; seq = (int)fseq; } while (seq < later); } if(sp[total].outsize == (off_t)0 && sp[later].outsize == (off_t)0) { g_printf(_("\nNo data to report on yet.\n")); amfree(sp); return; } balanced = sp[balance].outsize / (off_t)runs_per_cycle; if(conf_dumpcycle == later) { total_balanced = sp[total].outsize / (off_t)runs_per_cycle; } else { total_balanced = (((sp[total].outsize/(off_t)1024) * (off_t)conf_dumpcycle) / (off_t)(runs_per_cycle * later)) * (off_t)1024; } empty_day = 0; g_printf(_("\n due-date #fs orig %cB out %cB balance\n"), displayunit[0], displayunit[0]); g_printf("----------------------------------------------\n"); for(seq = 0; seq < later; seq++) { if(sp[seq].disks == 0 && ((seq > 0 && sp[seq-1].disks == 0) || ((seq < later-1) && sp[seq+1].disks == 0))) { empty_day++; } else { if(empty_day > 0) { g_printf("\n"); empty_day = 0; } g_printf(_("%-9.9s %3d %10lld %10lld "), seqdatestr(seq), sp[seq].disks, (long long)sp[seq].origsize, (long long)sp[seq].outsize); if(!sp[seq].outsize) g_printf(" --- \n"); else g_printf(_("%+8.1lf%%\n"), (((double)sp[seq].outsize - (double)balanced) * 100.0 / (double)balanced)); } } if(sp[later].disks != 0) { g_printf(_("later %3d %10lld %10lld "), sp[later].disks, (long long)sp[later].origsize, (long long)sp[later].outsize); if(!sp[later].outsize) g_printf(" --- \n"); else g_printf(_("%+8.1lf%%\n"), (((double)sp[later].outsize - (double)balanced) * 100.0 / (double)balanced)); } g_printf("----------------------------------------------\n"); g_printf(_("TOTAL %3d %10lld %10lld %9lld\n"), sp[total].disks, (long long)sp[total].origsize, (long long)sp[total].outsize, (long long)total_balanced); if (sp[balance].origsize != sp[total].origsize || sp[balance].outsize != sp[total].outsize || balanced != total_balanced) { g_printf(_("BALANCED %10lld %10lld %9lld\n"), (long long)sp[balance].origsize, (long long)sp[balance].outsize, (long long)balanced); } if (sp[distinct].disks != sp[total].disks) { g_printf(_("DISTINCT %3d %10lld %10lld\n"), sp[distinct].disks, (long long)sp[distinct].origsize, (long long)sp[distinct].outsize); } g_printf(plural(_(" (estimated %d run per dumpcycle)\n"), _(" (estimated %d runs per dumpcycle)\n"), runs_per_cycle), runs_per_cycle); if (overdue) { g_printf(plural(_(" (%d filesystem overdue."), _(" (%d filesystems overdue."), overdue), overdue); g_printf(plural(_(" The most being overdue %d day.)\n"), _(" The most being overdue %d days.)\n"), max_overdue), max_overdue); } amfree(sp);}/* ----------------------------------------------- */voidfind( int argc, char ** argv){ int start_argc; char *sort_order = NULL; find_result_t *output_find; char *errstr; if(argc < 3) { g_fprintf(stderr, _("%s: expecting \"find [--sort <hkdlpbf>] [hostname [<disk>]]*\"\n"), get_pname()); usage(); } sort_order = newstralloc(sort_order, DEFAULT_SORT_ORDER); if(argc > 4 && strcmp(argv[3],"--sort") == 0) { size_t i, valid_sort=1; for(i = strlen(argv[4]); i > 0; i--) { switch (argv[4][i - 1]) { case 'h': case 'H': case 'k': case 'K': case 'd': case 'D': case 'f': case 'F': case 'l': case 'L': case 'p': case 'P': case 'b': case 'B': break; default: valid_sort=0; } } if(valid_sort) { sort_order = newstralloc(sort_order, argv[4]); } else { g_printf(_("Invalid sort order: %s\n"), argv[4]); g_printf(_("Use default sort order: %s\n"), sort_order); } start_argc=6; } else { start_argc=4; } errstr = match_disklist(&diskq, argc-(start_argc-1), argv+(start_argc-1)); if (errstr) { g_printf("%s", errstr); amfree(errstr); } output_find = find_dump(&diskq); if(argc-(start_argc-1) > 0) { free_find_result(&output_find); errstr = match_disklist(&diskq, argc-(start_argc-1),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -