⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amrecover.c

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (!server_name) {	server_name = getenv("AMANDA_SERVER");	if (server_name) {	    g_printf(_("Using index server from environment AMANDA_SERVER (%s)\n"), server_name);	}    }    if (!server_name) {	server_name = getconf_str(CNF_INDEX_SERVER);    }    if (!server_name) {	error(_("No index server set"));	/*NOTREACHED*/    }    server_name = stralloc(server_name);    tape_server_name = NULL;    if (getconf_seen(CNF_TAPE_SERVER) == -2) { /* command line argument */	tape_server_name = getconf_str(CNF_TAPE_SERVER);    }    if (!tape_server_name) {	tape_server_name = getenv("AMANDA_TAPE_SERVER");	if (!tape_server_name) {	    tape_server_name = getenv("AMANDA_TAPESERVER");	    if (tape_server_name) {		g_printf(_("Using tape server from environment AMANDA_TAPESERVER (%s)\n"), tape_server_name);	    }	} else {	    g_printf(_("Using tape server from environment AMANDA_TAPE_SERVER (%s)\n"), tape_server_name);	}    }    if (!tape_server_name) {	tape_server_name = getconf_str(CNF_TAPE_SERVER);    }    if (!tape_server_name) {	error(_("No tape server set"));	/*NOTREACHED*/    }    tape_server_name = stralloc(tape_server_name);    amfree(tape_device_name);    tape_device_name = getconf_str(CNF_TAPEDEV);    if (!tape_device_name ||	strlen(tape_device_name) == 0 ||	!getconf_seen(CNF_TAPEDEV)) {	tape_device_name = NULL;    } else {	tape_device_name = stralloc(tape_device_name);    }    authopt = stralloc(getconf_str(CNF_AUTH));    amfree(disk_name);    amfree(mount_point);    amfree(disk_path);    dump_date[0] = '\0';    /* Don't die when child closes pipe */    signal(SIGPIPE, SIG_IGN);    /* set up signal handler */    act.sa_handler = sigint_handler;    sigemptyset(&act.sa_mask);    act.sa_flags = 0;    if (sigaction(SIGINT, &act, &oact) != 0) {	error(_("error setting signal handler: %s"), strerror(errno));	/*NOTREACHED*/    }    protocol_init();    /* We assume that amindexd support fe_amindexd_options_features */    /*                             and fe_amindexd_options_auth     */    /* We should send a noop to really know                         */    req = vstrallocf("SERVICE amindexd\n"		    "OPTIONS features=%s;auth=%s;\n",		    our_features_string, authopt);    secdrv = security_getdriver(authopt);    if (secdrv == NULL) {	error(_("no '%s' security driver available for host '%s'"),	    authopt, server_name);	/*NOTREACHED*/    }    protocol_sendreq(server_name, secdrv, generic_client_get_security_conf,		     req, STARTUP_TIMEOUT, amindexd_response, &response_error);    amfree(req);    protocol_run();    g_printf(_("AMRECOVER Version %s. Contacting server on %s ...\n"),	   version(), server_name);    if(response_error != 0) {	g_fprintf(stderr,"%s\n",errstr);	exit(1);    }    /* get server's banner */    if (grab_reply(1) == -1) {        aclose(server_socket);	exit(1);    }    if (!server_happy()) {	dbclose();	aclose(server_socket);	exit(1);    }    /* try to get the features from the server */    {	char *their_feature_string = NULL;	line = vstrallocf("FEATURES %s", our_features_string);	if(exchange(line) == 0) {	    their_feature_string = stralloc(server_line+13);	    indexsrv_features = am_string_to_feature(their_feature_string);	}	else {	    indexsrv_features = am_set_default_feature_set();        }	amfree(their_feature_string);	amfree(line);    }    /* set the date of extraction to be today */    (void)time(&timer);    tm = localtime(&timer);    if (tm) 	strftime(dump_date, sizeof(dump_date), "%Y-%m-%d", tm);    else	error(_("BAD DATE"));    g_printf(_("Setting restore date to today (%s)\n"), dump_date);    line = vstrallocf("DATE %s", dump_date);    if (converse(line) == -1) {        aclose(server_socket);	exit(1);    }    amfree(line);    line = vstrallocf("SCNF %s", config_name);    if (converse(line) == -1) {        aclose(server_socket);	exit(1);    }    amfree(line);    if (server_happy()) {	/* set host we are restoring to this host by default */	amfree(dump_hostname);	set_host(localhost);	if (dump_hostname)	    g_printf(_("Use the setdisk command to choose dump disk to recover\n"));	else	    g_printf(_("Use the sethost command to choose a host to recover\n"));    }    quit_prog = 0;    do {	if ((lineread = readline("amrecover> ")) == NULL) {	    clearerr(stdin);	    putchar('\n');	    break;	}	if (lineread[0] != '\0') 	{	    add_history(lineread);	    dbprintf(_("user command: '%s'\n"), lineread);	    process_line(lineread);	/* act on line's content */	}	amfree(lineread);    } while (!quit_prog);    dbclose();    aclose(server_socket);    return 0;}static voidamindexd_response(    void *datap,    pkt_t *pkt,    security_handle_t *sech){    int ports[NSTREAMS], *response_error = datap, i;    char *p;    char *tok;    char *extra = NULL;    assert(response_error != NULL);    assert(sech != NULL);    if (pkt == NULL) {	errstr = newvstrallocf(errstr, _("[request failed: %s]"),			     security_geterror(sech));	*response_error = 1;	return;    }    if (pkt->type == P_NAK) {#if defined(PACKET_DEBUG)	dbprintf(_("got nak response:\n----\n%s\n----\n\n"), pkt->body);#endif	tok = strtok(pkt->body, " ");	if (tok == NULL || strcmp(tok, "ERROR") != 0)	    goto bad_nak;	tok = strtok(NULL, "\n");	if (tok != NULL) {	    errstr = newvstrallocf(errstr, "NAK: %s", tok);	    *response_error = 1;	} else {bad_nak:	    errstr = newvstrallocf(errstr, _("request NAK"));	    *response_error = 2;	}	return;    }    if (pkt->type != P_REP) {	errstr = newvstrallocf(errstr, _("received strange packet type %s: %s"),			      pkt_type2str(pkt->type), pkt->body);	*response_error = 1;	return;    }#if defined(PACKET_DEBUG)    g_fprintf(stderr, _("got response:\n----\n%s\n----\n\n"), pkt->body);#endif    for(i = 0; i < NSTREAMS; i++) {        ports[i] = -1;        streams[i].fd = NULL;    }    p = pkt->body;    while((tok = strtok(p, " \n")) != NULL) {	p = NULL;	/*	 * Error response packets have "ERROR" followed by the error message	 * followed by a newline.	 */	if (strcmp(tok, "ERROR") == 0) {	    tok = strtok(NULL, "\n");	    if (tok == NULL) {	        errstr = newvstrallocf(errstr, _("[bogus error packet]"));	    } else {		errstr = newvstrallocf(errstr, "%s", tok);	    }	    *response_error = 2;	    return;	}        /*         * Regular packets have CONNECT followed by three streams         */        if (strcmp(tok, "CONNECT") == 0) {	    /*	     * Parse the three stream specifiers out of the packet.	     */	    for (i = 0; i < NSTREAMS; i++) {		tok = strtok(NULL, " ");		if (tok == NULL || strcmp(tok, streams[i].name) != 0) {		    extra = vstrallocf(			   _("CONNECT token is \"%s\": expected \"%s\""),			   tok ? tok : _("(null)"), streams[i].name);		    goto parse_error;		}		tok = strtok(NULL, " \n");		if (tok == NULL || sscanf(tok, "%d", &ports[i]) != 1) {		    extra = vstrallocf(			   _("CONNECT %s token is \"%s\" expected a port number"),			   streams[i].name, tok ? tok : _("(null)"));		    goto parse_error;		}	    }	    continue;	}	/*	 * OPTIONS [options string] '\n'	 */	if (strcmp(tok, "OPTIONS") == 0) {	    tok = strtok(NULL, "\n");	    if (tok == NULL) {		extra = vstrallocf(_("OPTIONS token is missing"));		goto parse_error;	    }#if 0	    tok_end = tok + strlen(tok);	    while((p = strchr(tok, ';')) != NULL) {		*p++ = '\0';		if(strncmp_const(tok, "features=") == 0) {		    tok += SIZEOF("features=") - 1;		    am_release_feature_set(their_features);		    if((their_features = am_string_to_feature(tok)) == NULL) {			errstr = newvstrallocf(errstr,				      _("OPTIONS: bad features value: %s"),				      tok);			goto parse_error;		    }		}		tok = p;	    }#endif	    continue;	}#if 0	extra = vstrallocf(_("next token is \"%s\": expected \"CONNECT\", \"ERROR\" or \"OPTIONS\""), tok ? tok : _("(null)"));	goto parse_error;#endif    }    /*     * Connect the streams to their remote ports     */    for (i = 0; i < NSTREAMS; i++) {/*@i@*/	if (ports[i] == -1)	    continue;	streams[i].fd = security_stream_client(sech, ports[i]);	if (streams[i].fd == NULL) {	    errstr = newvstrallocf(errstr,			_("[could not connect %s stream: %s]"),			streams[i].name, security_geterror(sech));	    goto connect_error;	}    }    /*     * Authenticate the streams     */    for (i = 0; i < NSTREAMS; i++) {	if (streams[i].fd == NULL)	    continue;	if (security_stream_auth(streams[i].fd) < 0) {	    errstr = newvstrallocf(errstr,		_("[could not authenticate %s stream: %s]"),		streams[i].name, security_stream_geterror(streams[i].fd));	    goto connect_error;	}    }    /*     * The MESGFD and DATAFD streams are mandatory.  If we didn't get     * them, complain.     */    if (streams[MESGFD].fd == NULL) {        errstr = newvstrallocf(errstr, _("[couldn't open MESG streams]"));        goto connect_error;    }    /* everything worked */    *response_error = 0;    amindexd_alive = 1;    return;parse_error:    errstr = newvstrallocf(errstr,			  _("[parse of reply message failed: %s]"),			  extra ? extra : _("(no additional information)"));    amfree(extra);    *response_error = 2;    return;connect_error:    stop_amindexd();    *response_error = 1;}/* * This is called when everything needs to shut down so event_loop() * will exit. */voidstop_amindexd(void){    int i;    amindexd_alive = 0;    for (i = 0; i < NSTREAMS; i++) {        if (streams[i].fd != NULL) {            security_stream_close(streams[i].fd);            streams[i].fd = NULL;        }    }}char *amindexd_client_get_security_conf(    char *	string,    void *	arg){    (void)arg;	/* Quiet unused parameter warning */    if(!string || !*string)	return(NULL);    if(strcmp(string, "auth")==0) {	return(getconf_str(CNF_AUTH));    }    else if(strcmp(string, "ssh_keys")==0) {	return(getconf_str(CNF_SSH_KEYS));    }    return(NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -