📄 ha_tool.c
字号:
/* $Id: ha_tool.c,v 1.24 2001/07/11 15:12:45 jm Exp $ * Home Agent Configuration Tool implemetation file * * Dynamic hierarchial IP tunnel * Copyright (C) 1998-2001, Dynamics group * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. See README and COPYING for * more details. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#ifndef __USE_BSD#define __USE_BSD#endif#include <string.h>#include <time.h>#include <unistd.h>#include <getopt.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include "dyn_halib.h"#include "support_tool.h"#include "message.h"#include "util.h"#define PATH_SIZE 100#define DEFAULT_PATH SOCKETDIR "/dynamics_ha_admin"#define MAX_TUNNELS 64#define HELP_STATUS "Usage\n\tstatus [interval]\n" \"Description\n\tRetrieve agents status information.\n"\"\tIf interval is specified, command is run in monitoring mode and "\"interval specifies time between successive calls in seconds."\"To stop monitoring press CTRL-C.\n"#define HELP_LIST "Usage\n\tlist\n" \"Description\n\tList active tunnel ids.\n"#define HELP_SHOW "Usage\n\tshow <MN addr> [HA addr]\n" \"Description\n\tShow information about a tunnel specified with MN/HA addr.\n"#define HELP_DESTROY "Usage\n\tdestroy <MN addr> [HA addr]\n" \"Description\n\tDestroy tunnel with specified MN/HA addr.\n"#define HELP_PATH "Usage\n\tpath <api path>\n"\"Description\n\tSet path to agent interface socket.\n"\"Example: path /etc/dynamics_mn_admin\n"#define HELP_RELOAD "Usage\n\treload\n"\"Description\n\tReload the configuration file.\n"void cmd_getstatus(int argc, char *argv[]);void cmd_list(int argc, char *argv[]);void cmd_show(int argc, char *argv[]);void cmd_destroy(int argc, char *argv[]);void cmd_path(int argc, char *argv[]);void cmd_reload(int argc, char *argv[]);extern int interactive;int main(int argc, char *argv[]){ char agent_path[PATH_SIZE]; int i; dynamics_strlcpy(agent_path, DEFAULT_PATH, PATH_SIZE); tool_add_command("list", 1, cmd_list, HELP_LIST, NULL); tool_add_command("show", 1, cmd_show, HELP_SHOW, NULL); tool_add_command("destroy", 1, cmd_destroy, HELP_DESTROY, NULL); tool_add_command("status", 2, cmd_getstatus, HELP_STATUS, NULL); tool_add_command("path", 4, cmd_path, HELP_PATH, NULL); tool_add_command("reload", 4, cmd_reload, HELP_RELOAD, NULL); i = parse_long_options_tools(argc, argv, "Dynamics Home Agent Control Tool", agent_path, PATH_SIZE, PACKAGE, VERSION); if (interactive) { printf("Dynamics Home Agent Control Tool v%s\n", VERSION); printf("Using agent path \"%s\" \n", agent_path); } dynamics_ha_init(agent_path); return tool_main(argc - i, argv + i);}/*********************************************************************** * COMMAND HANDLERS * * These functions are callback functions, which tool_main calls * * when user executes a command. Commands arguments are passed * * in parameters. argc specifies count of arguments and argv is pointer* * to string array containing the actual argument strings. * * first argument is always commands invocation. It may be an * * abbreviation. * ***********************************************************************/void cmd_getstatus(int argc, char *argv[]){ int r; struct dynamics_ha_status status; if (argc == 2 && (r = atoi(argv[1])) > 0) { tool_monitor(argv[0], r); } r = dynamics_ha_get_status(&status, -1); if (r == API_SUCCESS) { if (interactive) printf("Home Agent status:\n"); printf("version %s\n", status.version); printf("tunnels %d\n", status.tunnel_count); printf("request rejected %li\n", status.req_rejected); printf("request accepted %li\n", status.req_accepted); printf("discard(unk. ext) %li\n", status.discarded_unknown_ext); printf("discard(malformed) %li\n", status.discarded_malformed_msg); printf("discard(vendor) %li\n", status.discarded_vendor_ext); printf("advertisement sent %li\n", status.adv_sent); printf("apicalls(admin) %li\n", status.apicalls_admin); printf("apicalls(read) %li\n", status.apicalls_read); } else { printf("Call failed: %s\n", dynamics_ha_get_error_string(r)); }}void cmd_list(int argc, char *argv[]){ int r, c; dyn_tunnel_id data[MAX_TUNNELS]; c = MAX_TUNNELS; r = dynamics_ha_get_tunnels(&c, data, -1); if (r == API_SUCCESS) { if (interactive) printf("%d tunnels:\n", c); for (r = 0;r < c; r++) printf("%s\n", inet_ntoa(data[r].mn_addr)); printf("\n"); } else { printf("Call failed: %s\n", dynamics_ha_get_error_string(r)); }}void cmd_destroy(int argc, char *argv[]){ int r; dyn_tunnel_id id; memset(&id, 0, sizeof(id)); if (argc != 2 && argc != 3) { printf("Invalid arguments. Usage 'destroy <MN addr> " "[HA addr]'.\n"); return; } if (inet_aton(argv[1], &id.mn_addr) == 0) { printf("Invalid <MN addr> argument\n"); return; } if (argc > 2 && inet_aton(argv[2], &id.ha_addr) == 0) { printf("Invalid [HA addr] argument\n"); return; } r = dynamics_ha_destroy_tunnel(id, -1); if (r == API_SUCCESS) { printf("Destroyed tunnel %s.\n", inet_ntoa(id.mn_addr)); } else { printf("Call failed: %s\n", dynamics_ha_get_error_string(r)); }}void cmd_show(int argc, char *argv[]){ int r, sz; struct dynamics_tunnel_info info; dyn_tunnel_id id; time_t id_time; memset(&id, 0, sizeof(id)); if (argc != 2 && argc != 3) { printf("Invalid arguments. Usage 'show <MN addr> " "[HA addr]'.\n"); return; } if (inet_aton(argv[1], &id.mn_addr) == 0) { printf("Invalid <MN addr> argument\n"); return; } if (argc > 2 && inet_aton(argv[2], &id.ha_addr) == 0) { printf("Invalid [HA addr] argument\n"); return; } sz = sizeof(info); r = dynamics_ha_get_tunnel_info(id, &info, &sz, -1); if (r == API_SUCCESS && sz == sizeof(info)) { if (interactive) printf("Information about tunnel %s:\n", inet_ntoa(info.id.mn_addr)); printf("mobile addr\t%s\n", inet_ntoa(info.mn_addr)); printf("care-of addr\t%s\n", inet_ntoa(info.co_addr)); printf("home agent addr\t%s\n", inet_ntoa(info.ha_addr)); printf("creation time\t%s", ctime(&info.creation_time)); printf("expiration time\t%s", ctime(&info.expiration_time)); printf("refresh time\t%s", ctime(&info.refresh_time)); id_time = info.last_timestamp[0] - UNIX_NTP_DIFF; printf("last timestamp\t%ssecond ID\t%d\n", ctime(&id_time), info.last_timestamp[1]); printf("SPI \t%d\n", info.spi); printf("timeout \t%d\n", info.timeout); } else { printf("Call failed: %s\n", dynamics_ha_get_error_string(r)); }}void cmd_path(int argc, char *argv[]){ char *p; if (argc < 2) { p = dynamics_ha_get_agent_path(); if (p) printf("Current agent path is \"%s\".\n", p); return; } else if (argc > 2) { printf("Invalid arguments. Usage 'path <path>'.\n"); return; } if (dynamics_ha_init(argv[1]) == API_SUCCESS) { printf("Using agent '%s'.\n", argv[1]); } else { printf("Failed.\n"); }}void cmd_reload(int argc, char *argv[]){ dynamics_reload_config(-1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -