hammer2 - Start adding ioctl infrastructure, start writing hammer2 utility
[dragonfly.git] / sbin / hammer2 / main.c
1 /*
2  * Copyright (c) 2011-2012 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@dragonflybsd.org>
6  * by Venkatesh Srinivas <vsrinivas@dragonflybsd.org>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  * 3. Neither the name of The DragonFly Project nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific, prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
26  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35
36 #include "hammer2.h"
37
38 static void usage(int code);
39
40 int
41 main(int ac, char **av)
42 {
43         const char *sel_path = ".";
44         const char *uuid_str = NULL;
45         int pfs_type = HAMMER2_PFSTYPE_NONE;
46         int quick_opt = 0;
47         int all_opt = 0;
48         int ecode = 0;
49         int ch;
50
51         /*
52          * Core options
53          */
54         while ((ch = getopt(ac, av, "aqs:t:u:")) != -1) {
55                 switch(ch) {
56                 case 'a':
57                         all_opt = 1;
58                         break;
59                 case 'q':
60                         /*
61                          * Quick mode - do not block verifying certain
62                          * operations such as (connect).
63                          */
64                         quick_opt = 1;
65                         break;
66                 case 's':
67                         sel_path = optarg;
68                         break;
69                 case 't':
70                         /*
71                          * set node type for mkpfs
72                          */
73                         if (strcasecmp(optarg, "ADMIN") == 0) {
74                                 pfs_type = HAMMER2_PFSTYPE_ADMIN;
75                         } else if (strcasecmp(optarg, "CACHE") == 0) {
76                                 pfs_type = HAMMER2_PFSTYPE_CACHE;
77                         } else if (strcasecmp(optarg, "COPY") == 0) {
78                                 pfs_type = HAMMER2_PFSTYPE_COPY;
79                         } else if (strcasecmp(optarg, "SLAVE") == 0) {
80                                 pfs_type = HAMMER2_PFSTYPE_SLAVE;
81                         } else if (strcasecmp(optarg, "SOFT_SLAVE") == 0) {
82                                 pfs_type = HAMMER2_PFSTYPE_SOFT_SLAVE;
83                         } else if (strcasecmp(optarg, "SOFT_MASTER") == 0) {
84                                 pfs_type = HAMMER2_PFSTYPE_SOFT_MASTER;
85                         } else if (strcasecmp(optarg, "MASTER") == 0) {
86                                 pfs_type = HAMMER2_PFSTYPE_MASTER;
87                         } else {
88                                 fprintf(stderr, "-t: Unrecognized node type\n");
89                                 usage(1);
90                         }
91                         break;
92                 case 'u':
93                         /*
94                          * set uuid for mkpfs, else one will be generated
95                          * (required for all except the MASTER node_type)
96                          */
97                         uuid_str = optarg;
98                         break;
99                 default:
100                         fprintf(stderr, "Unknown option: %c\n", ch);
101                         usage(1);
102                         /* not reached */
103                         break;
104                 }
105         }
106
107         /*
108          * Adjust, then process the command
109          */
110         ac -= optind;
111         av += optind;
112         if (ac < 1) {
113                 fprintf(stderr, "Missing command\n");
114                 usage(1);
115                 /* not reached */
116         }
117
118         if (strcmp(av[0], "connect") == 0) {
119                 /*
120                  * Add cluster connection
121                  */
122                 if (ac < 2) {
123                         fprintf(stderr, "connect: missing argument\n");
124                         usage(1);
125                 }
126                 ecode = cmd_remote_connect(sel_path, av[1]);
127         } else if (strcmp(av[0], "disconnect") == 0) {
128                 /*
129                  * Remove cluster connection
130                  */
131                 if (ac < 2) {
132                         fprintf(stderr, "disconnect: missing argument\n");
133                         usage(1);
134                 }
135                 ecode = cmd_remote_disconnect(sel_path, av[1]);
136         } else if (strcmp(av[0], "status") == 0) {
137                 /*
138                  * Get status of PFS and its connections (-a for all PFSs)
139                  */
140                 ecode = cmd_remote_status(sel_path, all_opt);
141         } else if (strcmp(av[0], "mkpfs") == 0) {
142                 /*
143                  * Create new PFS using pfs_type
144                  */
145         } else if (strcmp(av[0], "snapshot") == 0) {
146                 /*
147                  * Create snapshot with optional pfs_type and optional
148                  * label override.
149                  */
150         } else if (strcmp(av[0], "helper") == 0) {
151                 /*
152                  * Typically run as a daemon, this multi-threaded helper
153                  * subsystem manages socket communications for the
154                  * filesystem.
155                  */
156         } else {
157                 fprintf(stderr, "Unrecognized command: %s\n", av[0]);
158                 usage(1);
159         }
160         return (ecode);
161 }
162
163 static
164 void
165 usage(int code)
166 {
167         fprintf(stderr,
168                 "hammer2 [-s path] command...\n"
169                 "    -s path            Select filesystem\n"
170         );
171         exit(code);
172 }