]> andersk Git - moira.git/blob - clients/moira/nfs.c
ca99a0d3a460907df921f7daef8d966405719427
[moira.git] / clients / moira / nfs.c
1 #if (!defined(lint) && !defined(SABER))
2   static char rcsid_module_c[] = "$Header$";
3 #endif
4
5 /*      This is the file nfs.c for the MOIRA Client, which allows a nieve
6  *      user to quickly and easily maintain most parts of the MOIRA database.
7  *      It Contains: All functions for manipulating NFS Physical directories.
8  *
9  *      Created:        5/6/88
10  *      By:             Chris D. Peterson
11  *
12  *      $Source$
13  *      $Author$
14  *      $Header$
15  *
16  *      Copyright 1988 by the Massachusetts Institute of Technology.
17  *
18  *      For further information on copyright and distribution
19  *      see the file mit-copyright.h
20  */
21
22 #include <stdio.h>
23 #include <string.h>
24 #include <moira.h>
25 #include <moira_site.h>
26 #include <menu.h>
27
28 #include "mit-copyright.h"
29 #include "defs.h"
30 #include "f_defs.h"
31 #include "globals.h"
32
33
34 #define TYPE_NFS    "NFS"
35
36 #define DEFAULT_DIR    "/u1/lockers"
37 #define DEFAULT_DEVICE "/dev/ra1c"
38 #define DEFAULT_STATUS DEFAULT_YES /* active. */
39 #define DEFAULT_ALLOC  "0"
40 #define DEFAULT_SIZE   "0"
41
42 /*      Function Name: UpdatePrint
43  *      Description: store a useful string for updates to print.
44  *      Arguments: info - info about NFS service stored in array of strings.
45  *      Returns: useful string.
46  */
47
48 static char *UpdatePrint(char **info)
49 {
50   char temp_buf[BUFSIZ];
51   sprintf(temp_buf, "Machine %s Directory %s", info[NFS_NAME], info[NFS_DIR]);
52   return Strsave(temp_buf);     /* Small memory leak here, but no good way
53                                    to avoid it that I see. */
54 }
55
56 /*      Function Name: PrintNFSInfo
57  *      Description: Prints NFS Physical service information.
58  *      Arguments: info - the information.
59  *      Returns: directory of this nfs server, for DeleteNFSService().
60  */
61
62 static char *PrintNFSInfo(char **info)
63 {
64   char buf[BUFSIZ], status_buf[BUFSIZ];
65   int status = atoi(info[NFS_STATUS]);
66   Bool is_one = FALSE;
67
68   status_buf[0] = '\0'; /* clear string. */
69
70   if (status & MR_FS_STUDENT)
71     {
72       strcat(status_buf, "Student");
73       is_one = TRUE;
74     }
75   if (status & MR_FS_FACULTY)
76     {
77       if (is_one)
78         strcat(status_buf, " and ");
79       strcat(status_buf, "Faculty");
80       is_one = TRUE;
81     }
82   if (status & MR_FS_STAFF)
83     {
84       if (is_one)
85         strcat(status_buf, " and ");
86       strcat(status_buf, "Staff");
87       is_one = TRUE;
88     }
89   if (status & MR_FS_MISC)
90     {
91       if (is_one)
92         strcat(status_buf, " and ");
93       strcat(status_buf, "Miscellaneous");
94     }
95   /* Add another type here. */
96   if (status & MR_FS_GROUPQUOTA)
97     {
98       if (is_one)
99         strcat(status_buf, " / ");
100       strcat(status_buf, "Group Quotas Enabled");
101     }
102
103   if (status_buf[0] == '\0')
104     strcat(status_buf, "-- None --");
105
106   Put_message("");
107   sprintf(buf, "Machine: %-20s Directory: %-15s Device: %s",
108           info[NFS_NAME], info[NFS_DIR], info[NFS_DEVICE]);
109   Put_message(buf);
110   sprintf(buf, "Status: %s", status_buf);
111   Put_message(buf);
112   sprintf(buf, "Quota Allocated: %-17s Size: %s",
113           info[NFS_ALLOC], info[NFS_SIZE]);
114   Put_message(buf);
115   sprintf(buf, MOD_FORMAT, info[NFS_MODBY], info[NFS_MODTIME],
116           info[NFS_MODWITH]);
117   Put_message(buf);
118   return info[NFS_DIR];
119 }
120
121 /*      Function Name: AskNFSInfo.
122  *      Description: This function askes the user for information about a
123  *                   machine and saves it into a structure.
124  *      Arguments: info - a pointer the the structure to put the
125  *                             info into.
126  *      Returns: the arglist to make the update call with.
127  */
128
129 char **AskNFSInfo(char **info)
130 {
131   /* Also need name of the machine in this structure. */
132
133   if (GetValueFromUser("Device for this filsystem", &info[NFS_DEVICE]) ==
134       SUB_ERROR)
135     return NULL;
136   if (GetFSTypes(&info[NFS_STATUS], TRUE) == SUB_ERROR)
137     return NULL;
138   if (GetValueFromUser("Allocated Space for this filsystem:",
139                        &info[NFS_ALLOC]) == SUB_ERROR)
140     return NULL;
141   if (GetValueFromUser("Size of this Filsystem:", &info[NFS_SIZE]) ==
142       SUB_ERROR)
143     return NULL;
144
145   FreeAndClear(&info[NFS_MODTIME], TRUE);
146   FreeAndClear(&info[NFS_MODBY], TRUE);
147   FreeAndClear(&info[NFS_MODWITH], TRUE);
148
149   return info;
150 }
151
152
153 /*      Function Name: ShowNFSService
154  *      Description: This function prints all exported partitions.
155  *      Arguments: argc, argv - argv[1] - name of machine.
156  *      Returns: DM_NORMAL.
157  */
158
159 int ShowNFSService(int argc, char **argv)
160 {
161   int stat;
162   struct qelem *elem = NULL;
163   char *args[10];
164
165   if (!ValidName(argv[1]))
166     return DM_NORMAL;
167
168   args[0] = canonicalize_hostname(strsave(argv[1]));
169   args[1] = strsave(DEFAULT_DIR);
170   if (GetValueFromUser("Directory:", &args[1]) == SUB_ERROR)
171     return DM_NORMAL;
172
173   if ((stat = do_mr_query("get_nfsphys", 2, args,
174                           StoreInfo, &elem)))
175     com_err(program_name, stat, " in ShowNFSServices.");
176   free(args[0]);
177   free(args[1]);                /* prevents memory leaks. */
178
179   elem = QueueTop(elem);
180   Loop(elem, (void *) PrintNFSInfo);
181
182   FreeQueue(elem);
183   return DM_NORMAL;
184 }
185
186 /*      Function Name: AddNFSService
187  *      Description: Adds a new partition to the nfsphys relation
188  *      Arguments: arc, argv - argv[1] - machine name.
189  *      Returns: DM_NORMAL.
190  */
191
192 int AddNFSService(int argc, char **argv)
193 {
194   char **add_args, *args[10];
195   char *info[MAX_ARGS_SIZE];
196   int stat;
197
198   args[0] = canonicalize_hostname(strsave(argv[1]));
199   args[1] = strsave(DEFAULT_DIR);
200   if (GetValueFromUser("Directory:", &args[1]) == SUB_ERROR)
201     return DM_NORMAL;
202
203   if (!ValidName(args[0]) || !ValidName(args[1]))
204     return DM_NORMAL;
205
206   if (!(stat = do_mr_query("get_nfsphys", 2, args, NullFunc, NULL)))
207     stat = MR_EXISTS;
208   if (stat != MR_NO_MATCH)
209     {
210       com_err(program_name, stat, " in get_nfsphys.");
211       return DM_NORMAL;
212     }
213
214   info[NFS_NAME]   = Strsave(args[0]);
215   info[NFS_DIR]    = args[1];   /* already saved. */
216   info[NFS_DEVICE] = Strsave(DEFAULT_DEVICE);
217   info[NFS_STATUS] = Strsave(DEFAULT_STATUS);
218   info[NFS_ALLOC]  = Strsave(DEFAULT_ALLOC);
219   info[NFS_SIZE]   = Strsave(DEFAULT_SIZE);
220   info[NFS_MODBY] = info[NFS_MODWITH] = info[NFS_MODTIME] = NULL;
221   info[NFS_END] = NULL;
222
223   if (!(add_args = AskNFSInfo(info)))
224     {
225       Put_message("Aborted.");
226       return DM_NORMAL;
227     }
228
229   if ((stat = do_mr_query("add_nfsphys", CountArgs(add_args), add_args,
230                           Scream, NULL)))
231     com_err(program_name, stat, " in AdsNFSService");
232
233   FreeInfo(info);
234   free(args[0]);
235   return DM_NORMAL;
236 }
237
238 /*      Function Name: RealUpdateNFSService
239  *      Description: performs the actual update of the nfs service.
240  *      Arguments: info - info about NFS service stored in array of strings.
241  *                 junk - an unused boolean.
242  *      Returns: none.
243  */
244
245 static void RealUpdateNFSService(char **info, Bool junk)
246 {
247   char **args;
248   int stat;
249
250   if (!(args = AskNFSInfo(info)))
251     {
252       Put_message("Aborted.");
253       return;
254     }
255
256   if ((stat = do_mr_query("update_nfsphys", CountArgs(args), args,
257                           Scream, NULL)))
258     com_err(program_name, stat, " in RealUpdateNFSService");
259 }
260
261 /*      Function Name: UpdateNFSService
262  *      Description: Update the values for an nfsphys entry.
263  *      Arguments: argc, argv - argv[1] - machine name.
264  *      Returns: DM_NORMAL.
265  */
266
267 int UpdateNFSService(int argc, char **argv)
268 {
269   int stat;
270   struct qelem *elem = NULL;
271   char *args[10];
272
273   if (!ValidName(argv[1]))
274     return DM_NORMAL;
275
276   args[0] = canonicalize_hostname(strsave(argv[1]));
277   args[1] = strsave(DEFAULT_DIR);
278   if (GetValueFromUser("Directory:", &args[1]) == SUB_ERROR)
279     return DM_NORMAL;
280
281   if ((stat = do_mr_query("get_nfsphys", 2, args, StoreInfo, (char *) &elem)))
282     {
283       com_err(program_name, stat, " in UpdateNFSService.");
284       return DM_NORMAL;
285     }
286   free(args[0]);
287   free(args[1]);                /* stop memory leaks. */
288
289   elem = QueueTop(elem);
290   QueryLoop(elem, UpdatePrint, RealUpdateNFSService, "Update NFS Service for");
291
292   FreeQueue(elem);
293   return DM_NORMAL;
294 }
295
296 /*      Function Name: FSPartPrint
297  *      Description: print filesystem partition usage.
298  *      Arguments: info - the filesystem information.
299  *      Returns: none.
300  */
301
302 static void FSPartPrint(char **info)
303 {
304   char buf[BUFSIZ];
305   sprintf(buf, "NFS Filesystem %s uses that partition.", info[FS_NAME]);
306   Put_message(buf);
307 }
308
309 /*      Function Name: RealDeleteNFSService
310  *      Description: Actually Deletes the filesystem (some checks are made).
311  *      Arguments: info - info about NFS service stored in array of strings.
312  *                 one_item - if TRUE then only one item on the queue, and
313  *                            we should confirm.
314  *      Returns: none.
315  */
316
317 static void RealDeleteNFSService(char **info, Bool one_item)
318 {
319   char temp_buf[BUFSIZ], *args[10];
320   struct qelem *elem = NULL;
321   int stat;
322
323   sprintf(temp_buf,
324           "Are you sure that you want to delete the %s directory on %s",
325           info[NFS_DIR], info[NFS_NAME]);
326
327   /*
328    * Check to be sure that it is not used by any of the nfs packs.
329    */
330
331   if (!one_item || Confirm(temp_buf))
332     {
333       args[0] = info[NFS_NAME];
334       args[1] = info[NFS_DIR];
335       args[2] = NULL;
336       switch ((stat = do_mr_query("get_filesys_by_nfsphys", CountArgs(args),
337                                   args, StoreInfo, (char *)&elem)))
338         {
339         case MR_NO_MATCH:       /* it is unused, delete it. */
340           if ((stat = do_mr_query("delete_nfsphys", 2, info, Scream, NULL)))
341             com_err(program_name, stat, " in DeleteNFSService");
342           else
343             Put_message("Physical Filesystem Deleted.");
344           break;
345         case MR_SUCCESS:        /* it is used, print filesys's that use it. */
346           elem = QueueTop(elem);
347           Put_message("The following fileystems are using this partition,");
348           Put_message("and must be removed before it can be deleted.");
349           Put_message("");
350           Loop(elem, FSPartPrint);
351
352           FreeQueue(elem);
353           Put_message("");
354           break;
355         default:
356           com_err(program_name, stat, " while checking usage of partition");
357         }
358     }
359   else
360     Put_message("Physical filesystem not deleted.");
361 }
362
363 /*      Function Name: DeleteNFSService
364  *      Description: Delete an nfsphys entry.
365  *      Arguments: argc, argv - name of the machine in argv[1].
366  *      Returns: DM_NORMAL.
367  */
368
369 int DeleteNFSService(int argc, char **argv)
370 {
371   int stat;
372   struct qelem *elem = NULL;
373   char *args[10];
374
375   if (!ValidName(argv[1]))
376     return DM_NORMAL;
377
378   args[0] = canonicalize_hostname(strsave(argv[1]));
379   args[1] = strsave(DEFAULT_DIR);
380   if (GetValueFromUser("Directory:", &args[1]) == SUB_ERROR)
381     return DM_NORMAL;
382
383   switch ((stat = do_mr_query("get_nfsphys", 2, args,
384                               StoreInfo, (char *) &elem)))
385     {
386     case MR_NO_MATCH:
387       Put_message("This filsystem does not exist!");
388       return DM_NORMAL;
389     case MR_SUCCESS:
390       break;
391     default:
392       com_err(program_name, stat, " in DeleteNFSService");
393       return DM_NORMAL;
394     }
395   free(args[0]);
396   free(args[1]);                /* stop memory leaks, in your neighborhood. */
397
398   QueryLoop(elem, PrintNFSInfo, RealDeleteNFSService,
399             "Delete the Physical Filesystem on Directory");
400
401   FreeQueue(elem);
402   return DM_NORMAL;
403 }
This page took 0.135639 seconds and 3 git commands to generate.