vos: remaddrs sub-command
authorMichael Meffie <mmeffie@sinenomine.net>
Mon, 17 Nov 2014 16:23:38 +0000 (11:23 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Sun, 22 Mar 2015 17:12:57 +0000 (13:12 -0400)
Introduce the vos remaddrs sub-command for removing multi-homed server
entries from the vldb.  The remaddrs sub-command completes the listaddrs
and setaddrs command suite and allows vos changeaddr to be deprecated
completely.

Change-Id: I98e92e776a153591a617a5b04037c3b6139d4732
Reviewed-on: http://gerrit.openafs.org/11606
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Chas Williams <3chas3@gmail.com>
Reviewed-by: Daria Brashear <shadow@your-file-system.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

doc/man-pages/pod1/.gitignore
doc/man-pages/pod1/vos.pod.in
doc/man-pages/pod1/vos_changeaddr.pod.in
doc/man-pages/pod1/vos_listaddrs.pod.in
doc/man-pages/pod1/vos_remaddrs.pod.in [new file with mode: 0644]
doc/man-pages/pod1/vos_setaddrs.pod.in
src/volser/vos.c

index c41eb7c..63ac918 100644 (file)
@@ -48,6 +48,7 @@
 /vos_online.pod
 /vos_partinfo.pod
 /vos_release.pod
+/vos_remaddrs.pod
 /vos_remove.pod
 /vos_remsite.pod
 /vos_rename.pod
index 8ce7fd4..f0ec34a 100644 (file)
@@ -61,7 +61,8 @@ and L<B<vos zap>|vos_zap(1)>.
 Commands to edit or display VLDB server entries:
 L<B<vos changeaddr>|vos_changeaddr(1)>,
 L<B<vos listaddrs>|vos_listaddrs(1)>
-and L<B<vos setaddrs>|vos_setaddrs(1)>.
+L<B<vos setaddrs>|vos_setaddrs(1)>,
+and L<B<vos remaddrs>|vos_remaddrs(1)>.
 
 =item *
 
index 8945919..fe69633 100644 (file)
@@ -30,9 +30,9 @@ The B<vos changeaddr> command removes a server entry from the Volume
 Location Database (VLDB) when the B<-remove> flag is combined with the
 B<-oldaddr> argument. There must be no VLDB entries that list the machine
 as a site for any version of a volume (if necessary, use the B<vos move>
-or B<vos remove> command to more or remove volumes). It is appropriate to
+or B<vos remove> command to move or remove volumes). It is appropriate to
 remove a VLDB server entry when removing the corresponding file server
-machine from service; this is the only recommended use of the command.
+machine from service.
 
 To display all VLDB server entries, use the B<vos listaddrs> command.
 
index d4f0dee..66a6e34 100644 (file)
@@ -102,9 +102,10 @@ None
 L<fs_uuid(1)>,
 L<sysid(5)>,
 L<vos(1)>,
-L<vos_changeaddr(1)>,
 L<vos_examine(1)>,
-L<vos_listvldb(1)>
+L<vos_listvldb(1)>,
+L<vos_setaddrs(1)>,
+L<vos_remaddrs(1)>
 
 =head1 COPYRIGHT
 
diff --git a/doc/man-pages/pod1/vos_remaddrs.pod.in b/doc/man-pages/pod1/vos_remaddrs.pod.in
new file mode 100644 (file)
index 0000000..1c1a11f
--- /dev/null
@@ -0,0 +1,76 @@
+=head1 NAME
+
+vos_remaddrs - removes a file server machine's entry from the VLDB
+
+=head1 SYNOPSIS
+
+=for html
+<div class="synopsis">
+
+B<vos remaddrs> S<<< B<-uuid> <I<UUID of server>> >>>
+    S<<< [B<-cell> <I<cell name>>] >>> [B<-noauth>] [B<-localauth>]
+    [B<-verbose>] [B<-encrypt>] [B<-noresolve>]
+    S<<< [B<-config> <I<config directory>>] >>>
+    [B<-help>]
+
+B<vos rema> S<<< B<-u> <I<UUID of server>> >>>
+    S<<< [B<-c> <I<cell name>>] >>>
+    [B<-noa>] [B<-l>] [B<-v>] [B<-e>] [B<-nor>]
+    S<<< [B<-co> <I<config directory>>] >>>
+    [B<-h>]
+
+=for html
+</div>
+
+=head1 DESCRIPTION
+
+The B<vos remaddrs> command removes a server entry from the Volume Location
+Database (VLDB). There must be no VLDB entries that list the machine as a site
+for any version of a volume. If necessary, use the B<vos move> or B<vos remove>
+command to move or remove volumes. It is appropriate to remove a VLDB server
+entry when removing the corresponding file server machine from service.
+
+To display all VLDB server entries, use the B<vos listaddrs> command.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-uuid> <I<UUID of server>>
+
+The unique ID as provided by the C<vos listaddrs -printuuid> command.
+
+=back
+
+=head1 EXAMPLES
+
+The following command removes the VLDB server entry for the file server
+with the addresses C<192.12.107.214> and C<10.47.11.17>.
+
+   $ vos remaddrs -uuid 008f157e-bad0-157c-0ffee-357c4d1faa77 -verbose
+   vos: Removing UUID with addresses:
+   UUID: 008f157e-bad0-157c-0ffee-357c4d1faa77
+   192.12.107.214
+   10.47.11.17
+
+=head1 PRIVILEGE REQUIRED
+
+Issuer must be listed in the F</usr/afs/etc/UserList> file on each database
+server machine.
+
+=head1 SEE ALSO
+
+L<CellServDB(5)>,
+L<UserList(5)>,
+L<fileserver(8)>,
+L<vos(1)>,
+L<vos_listaddrs(1)>,
+L<vos_setaddrs(1)>
+
+=head1 COPYRIGHT
+
+Copyright 2014 Sine Nomine Associates.  All Rights Reserved.
+
+This documentation is covered by the BSD License as written in the
+doc/LICENSE file. This man page was written by Michael Meffie for
+OpenAFS.
index 63792c1..eee1c11 100644 (file)
@@ -96,7 +96,8 @@ L<UserList(5)>,
 L<sysid(5)>,
 L<fileserver(8)>,
 L<vos(1)>,
-L<vos_listaddrs(1)>
+L<vos_listaddrs(1)>,
+L<vos_remaddrs(1)>
 
 =head1 COPYRIGHT
 
index be2958d..96031b3 100644 (file)
@@ -5319,7 +5319,7 @@ print_addrs(const bulkaddrs * addrs, afsUUID * m_uuid, int nentries,
            int print)
 {
     int i;
-    afs_uint32 *addrp;
+    afs_uint32 addr;
     char buf[1024];
 
     if (print) {
@@ -5328,14 +5328,13 @@ print_addrs(const bulkaddrs * addrs, afsUUID * m_uuid, int nentries,
     }
 
     /* print out the list of all the server */
-    addrp = (afs_uint32 *) addrs->bulkaddrs_val;
-    for (i = 0; i < nentries; i++, addrp++) {
-       *addrp = htonl(*addrp);
+    for (i = 0; i < addrs->bulkaddrs_len; i++) {
+       addr = htonl(addrs->bulkaddrs_val[i]);
        if (noresolve) {
            char hoststr[16];
-           printf("%s\n", afs_inet_ntoa_r(*addrp, hoststr));
+           printf("%s\n", afs_inet_ntoa_r(addr, hoststr));
        } else {
-           printf("%s\n", hostutil_GetNameByINet(*addrp));
+           printf("%s\n", hostutil_GetNameByINet(addr));
        }
     }
 
@@ -5518,6 +5517,68 @@ SetAddrs(struct cmd_syndesc *as, void *arock)
 }
 
 static int
+RemoveAddrs(struct cmd_syndesc *as, void *arock)
+{
+    afs_int32 code;
+    ListAddrByAttributes attrs;
+    afsUUID uuid;
+    afs_int32 uniq = 0;
+    afs_int32 nentries = 0;
+    bulkaddrs addrs;
+    afs_uint32 ip1;
+    afs_uint32 ip2;
+
+    memset(&attrs, 0, sizeof(ListAddrByAttributes));
+    memset(&addrs, 0, sizeof(bulkaddrs));
+    memset(&uuid, 0, sizeof(afsUUID));
+    attrs.Mask = VLADDR_UUID;
+
+    if (as->parms[0].items) {  /* -uuid */
+       if (afsUUID_from_string(as->parms[0].items->data, &attrs.uuid) < 0) {
+           fprintf(STDERR, "vos: invalid UUID '%s'\n",
+                   as->parms[0].items->data);
+           return EINVAL;
+       }
+    }
+
+    code =
+       ubik_VL_GetAddrsU(cstruct, UBIK_CALL_NEW, &attrs, &uuid, &uniq,
+                         &nentries, &addrs);
+    if (code == VL_NOENT) {
+       fprintf(STDERR, "vos: UUID not found\n");
+       goto out;
+    }
+    if (code != 0) {
+       fprintf(STDERR, "vos: could not list the server addresses\n");
+       PrintError("", code);
+       goto out;
+    }
+    if (addrs.bulkaddrs_len == 0) {
+       fprintf(STDERR, "vos: no addresses found for UUID\n");
+       goto out;
+    }
+
+    ip2 = addrs.bulkaddrs_val[0]; /* network byte order */
+    ip1 = 0xffffffff;             /* indicates removal mode */
+
+    if (verbose) {
+       printf("vos: Removing UUID with hosts:\n");
+       print_addrs(&addrs, &uuid, nentries, 1);
+    }
+
+    code = ubik_VL_ChangeAddr(cstruct, UBIK_CALL_NEW, ip1, ip2);
+    if (code) {
+       fprintf(STDERR, "Could not remove server entry from the VLDB.\n");
+       PrintError("", code);
+    }
+
+  out:
+    xdr_free((xdrproc_t) xdr_bulkaddrs, &addrs);
+    return code;
+}
+
+
+static int
 LockEntry(struct cmd_syndesc *as, void *arock)
 {
     afs_uint32 avolid;
@@ -6267,10 +6328,14 @@ main(int argc, char **argv)
     COMMONPARMS;
 
     ts = cmd_CreateSyntax("setaddrs", SetAddrs, NULL, 0,
-                         "set the list of IP address for a given UUID in the VLDB");
+                         "set the list of IP addresses for a given UUID in the VLDB");
     cmd_AddParm(ts, "-uuid", CMD_SINGLE, 0, "uuid of server");
     cmd_AddParm(ts, "-host", CMD_LIST, 0, "address of host");
 
+    ts = cmd_CreateSyntax("remaddrs", RemoveAddrs, NULL, 0,
+                         "remove the list of IP addresses for a given UUID in the VLDB");
+    cmd_AddParm(ts, "-uuid", CMD_SINGLE, 0, "uuid of server");
+
     COMMONPARMS;
     code = cmd_Dispatch(argc, argv);
     if (rxInitDone) {