]> git.neil.brown.name Git - TABS.git/blob - tools/smadmin.c
Terminal Alocation and Booking System - June 2006
[TABS.git] / tools / smadmin.c
1
2 /*
3  * smadmin - status/manager admin
4  * Usage: smadmin -[tdDr] [-a dbserver] host
5  *   -t  get table
6  *   -d  get database list
7  *   -D  update database list
8  *   -r  restart manager
9  *   -x  tell manager to exit
10  *   -a server   add server to list of up databases
11  *
12  */
13
14
15 #include        "../db_client/db_client.h"
16 #include        <getopt.h>
17
18 char *Usage[] = {
19     "Usage: smadmin -[tdDrx] [-a server] host",
20     "  -t  : get status table",
21     "  -d  : get database replica list",
22     "  -D  : update database replica list",
23     "  -r  : restart manager",
24     "  -x  : exit",
25     "  -a server : record server as a database server",
26     NULL
27 };
28
29 char *statuses[]=
30 { "Close", "Up", "Unknown", "ReadOnly", "Down", "Unregistered"};
31
32 int main(int argc, char *argv[])
33 {
34
35         extern CLIENT *status_client;
36
37         extern int optind;
38         extern char *optarg;
39     
40         char *host;
41         int get_tab=0;
42         int get_db=0;
43         int update_db=0;
44         int restart=0;
45         int doexit = 0;
46         char *server = NULL;
47
48         int arg;
49
50         while ((arg=getopt(argc, argv, "tdDrxa:"))!= EOF)
51                 switch(arg)
52                 {
53                 case 't': get_tab=1; break;
54                 case 'd': get_db=1;  break;
55                 case 'D': update_db=1; break;
56                 case 'r': restart=1; break;
57                 case 'x': doexit = 1; break;
58                 case 'a': server = optarg; break;
59                 default:
60                         fprintf(stderr,"smadmin: Unknown option.");
61                         usage();exit(1);
62         
63                 }
64
65         if (get_tab+get_db+update_db+restart+doexit+(server!=NULL) != 1)
66         {
67                 fprintf(stderr, "smadmin: must give examply one flag.\n");
68                 usage();
69                 exit(1);
70         }
71         if (optind >= argc)
72         {
73                 fprintf(stderr, "smadmin: not host name given\n");
74                 usage();
75                 exit(1);
76         }
77         if (optind +1 < argc)
78         {
79                 fprintf(stderr, "smadmin: only one host name may be given\n");
80                 usage();
81                 exit(1);
82         }
83         host = argv[optind];
84         if (strcmp(host, ".")==0)
85                 host = "localhost";
86
87         status_client = clnt_create(host, BOOK_STATUS, BOOKVERS, "udp");
88         if (status_client == NULL)
89         {
90                 fprintf(stderr, "smadmin: cannot connect to %s\n", host);
91                 exit(1);
92         }
93
94         if (get_tab)
95         {
96                 table tab;
97                 if (collect_tab(&tab, status_client)== -1)
98                 {
99                         fprintf(stderr, "smadmin: cannot collect table\n");
100                         exit(1);
101                 }
102                 else
103                         print_tab(&tab, stdout);
104         }
105         if (get_db)
106         {
107                 database_list *dblist;
108                 int i;
109                 dblist = get_databases_2(NULL, status_client);
110                 if (dblist == NULL)
111                 {
112                         fprintf(stderr, "smadmin: cannot get database list\n");
113                         exit(1);
114                 }
115         
116                 for (i=0 ; i<dblist->database_list_len ; i++)
117                 {
118                         printf("%-20s %s\n", dblist->database_list_val[i].name,
119                                statuses[dblist->database_list_val[i].state]);
120                 }
121         }
122         if (update_db)
123         {
124                 check_servers();
125         }
126         if (restart)
127         {
128                 int *pid;
129                 int dummy=0;
130                 pid = restart_helper_2(&dummy, status_client);
131                 if (pid && *pid > 1)
132                         printf("manager restarted with pid %d\n", *pid);
133                 else
134                 {
135                         fprintf(stderr,"smadmin: manager restart failed\n");
136                         exit(1);
137                 }
138         }
139         if (doexit)
140         {
141                 if (status_die_2(NULL, status_client) == NULL)
142                 {
143                         fprintf(stderr, "smadmin: could not send kill command to book_status on %s.\n", host );
144                         exit(1);
145                 }
146         }
147         if (server)
148         {
149                 database_info dbi;
150                 dbi.name = server;
151                 dbi.state = DB_UP;
152                 if (set_database_2(&dbi, status_client) == NULL)
153                 {
154                         fprintf(stderr, "smadmin: could not register %s as a server.\n", server);
155                         exit(1);
156                 }
157         }
158         exit(0);
159 }