2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * This file implements the vos related funtions for afscp
14 #include <afsconfig.h>
15 #include <afs/param.h>
18 #include <netinet/in.h>
19 #include <arpa/inet.h>
20 #include <afs/afsutil.h>
32 * Generic fuction for converting input string to an integer. Pass
33 * the error_msg you want displayed if there is an error converting
38 GetIntFromString(const char *int_str, const char *error_msg)
41 char *bad_char = NULL;
43 i = strtoul(int_str, &bad_char, 10);
44 if ((bad_char == NULL) || (*bad_char == 0)) {
52 * Generic fuction for converting input string to a volume number
53 * It will accept integer strings as well as volume names.
57 GetVolumeIdFromString(const char *volume)
59 unsigned int volume_id;
60 char *bad_char = NULL;
62 vos_vldbEntry_t entry;
64 volume_id = strtoul(volume, &bad_char, 10);
65 if ((bad_char == NULL) || (*bad_char == 0)) {
70 * We failed to convert the string to a number, so see if it
74 (cellHandle, 0, NULL, (char *)volume, &entry, &st)) {
75 return entry.volumeId[VOS_READ_WRITE_VOLUME];
77 ERR_EXT("failed to convert specified volume to an id");
82 * Generic fuction for converting input string to a partition number
83 * It will accept integer strings as well as partition names.
87 GetPartitionIdFromString(const char *partition)
89 unsigned int partition_id;
90 char *bad_char = NULL;
95 partition_id = strtoul(partition, &bad_char, 10);
96 if ((bad_char == NULL) || (*bad_char == 0)) {
101 * We failed to convert the string to a number, so see if it
102 * is a partition name
105 pname_len = strlen(partition);
107 sprintf(pname, "%s", "/vicep");
108 if (pname_len <= 2) {
109 strcat(pname, partition);
110 } else if (!strncmp(partition, "/vicep", 6)) {
111 strcat(pname, partition + 6);
112 } else if (!strncmp(partition, "vicep", 5)) {
113 strcat(pname, partition + 5);
115 ERR_EXT("invalid partition");
118 if (!vos_PartitionNameToId((const char *)pname, &partition_id, &st)) {
119 ERR_ST_EXT("invalid partition", st);
126 * Generic fuction for converting input string to an address in host order.
127 * It will accept strings in the form "128.98.12.1"
131 GetAddressFromString(const char *addr_str)
133 int addr = inet_addr(addr_str);
136 ERR_EXT("failed to convert specified address");
144 PrintMessage(vos_messageType_t type, char *message)
146 printf("%s\n", message);
151 DoVosBackupVolumeCreate(struct cmd_syndesc *as, void *arock)
153 typedef enum { VOLUME } DoVosBackupVolumeCreate_parm_t;
155 unsigned int volume_id = 0;
157 if (as->parms[VOLUME].items) {
158 const char *volume = as->parms[VOLUME].items->data;
159 volume_id = GetVolumeIdFromString(volume);
162 if (!vos_BackupVolumeCreate(cellHandle, 0, volume_id, &st)) {
163 ERR_ST_EXT("vos_BackupVolumeCreate", st);
169 DoVosBackupVolumeCreateMultiple(struct cmd_syndesc *as, void *arock)
171 typedef enum { SERVER, PARTITION, PREFIX,
173 } DoVosBackupVolumeCreate_parm_t;
175 void *vos_server = NULL;
176 unsigned int partition_id;
177 const unsigned int *part_ptr = NULL;
178 const char *prefix = NULL;
179 vos_exclude_t exclude = VOS_INCLUDE;
181 if (as->parms[SERVER].items) {
183 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
184 ERR_ST_EXT("vos_ServerOpen", st);
188 if (as->parms[PARTITION].items) {
190 GetPartitionIdFromString(as->parms[PARTITION].items->data);
191 part_ptr = &partition_id;
194 if (as->parms[PREFIX].items) {
195 prefix = as->parms[PREFIX].items->data;
198 if (as->parms[EXCLUDE].items) {
199 exclude = VOS_EXCLUDE;
202 if (!vos_BackupVolumeCreateMultiple
203 (cellHandle, vos_server, (vos_MessageCallBack_t) 0, part_ptr, prefix,
205 ERR_ST_EXT("vos_BackupVolumeCreate", st);
211 Print_vos_partitionEntry_p(vos_partitionEntry_p part, const char *prefix)
213 printf("%sInformation for partition %s\n", prefix, part->name);
214 printf("%s\tDevice name: %s\n", prefix, part->deviceName);
215 printf("%s\tlockFileDescriptor: %d\n", prefix, part->lockFileDescriptor);
216 printf("%s\tTotal space: %d\n", prefix, part->totalSpace);
217 printf("%s\tTotal Free space: %d\n", prefix, part->totalFreeSpace);
221 DoVosPartitionGet(struct cmd_syndesc *as, void *arock)
223 typedef enum { SERVER, PARTITION } DoVosPartitionGet_parm_t;
225 void *vos_server = NULL;
226 unsigned int partition_id = 0;
227 vos_partitionEntry_t entry;
229 if (as->parms[SERVER].items) {
231 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
232 ERR_ST_EXT("vos_ServerOpen", st);
236 if (as->parms[PARTITION].items) {
238 GetPartitionIdFromString(as->parms[PARTITION].items->data);
241 if (!vos_PartitionGet
242 (cellHandle, vos_server, 0, partition_id, &entry, &st)) {
243 ERR_ST_EXT("vos_PartitionGet", st);
246 Print_vos_partitionEntry_p(&entry, "");
252 DoVosPartitionList(struct cmd_syndesc *as, void *arock)
254 typedef enum { SERVER } DoVosPartitionGet_parm_t;
256 void *vos_server = NULL;
258 vos_partitionEntry_t entry;
260 if (as->parms[SERVER].items) {
262 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
263 ERR_ST_EXT("vos_ServerOpen", st);
267 if (!vos_PartitionGetBegin(cellHandle, vos_server, 0, &iter, &st)) {
268 ERR_ST_EXT("vos_PartitionGetBegin", st);
271 printf("Listing partitions at server %s\n",
272 as->parms[SERVER].items->data);
273 while (vos_PartitionGetNext(iter, &entry, &st)) {
274 Print_vos_partitionEntry_p(&entry, " ");
277 if (st != ADMITERATORDONE) {
278 ERR_ST_EXT("vos_PartitionGetNext", st);
281 if (!vos_PartitionGetDone(iter, &st)) {
282 ERR_ST_EXT("vos_PartitionGetDone", st);
288 DoVosServerSync(struct cmd_syndesc *as, void *arock)
290 typedef enum { SERVER, PARTITION } DoVosServerSync_parm_t;
292 void *vos_server = NULL;
293 unsigned int partition_id;
294 const unsigned int *part_ptr = NULL;
296 if (as->parms[SERVER].items) {
298 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
299 ERR_ST_EXT("vos_ServerOpen", st);
303 if (as->parms[PARTITION].items) {
305 GetPartitionIdFromString(as->parms[PARTITION].items->data);
306 part_ptr = &partition_id;
309 if (!vos_ServerSync(cellHandle, vos_server, 0, part_ptr, &st)) {
310 ERR_ST_EXT("vos_PartitionGetDone", st);
316 DoVosFileServerAddressChange(struct cmd_syndesc *as, void *arock)
318 typedef enum { OLDADDRESS,
320 } DoVosFileServerAddressChange_parm_t;
325 if (as->parms[OLDADDRESS].items) {
326 const char *addr = as->parms[OLDADDRESS].items->data;
327 old_addr = GetAddressFromString(addr);
330 if (as->parms[NEWADDRESS].items) {
331 const char *addr = as->parms[OLDADDRESS].items->data;
332 new_addr = GetAddressFromString(addr);
335 if (!vos_FileServerAddressChange(cellHandle, 0, old_addr, new_addr, &st)) {
336 ERR_ST_EXT("vos_FileServerAddressChange", st);
342 DoVosFileServerAddressRemove(struct cmd_syndesc *as, void *arock)
344 typedef enum { ADDRESS } DoVosFileServerAddressRemove_parm_t;
348 if (as->parms[ADDRESS].items) {
349 const char *addr = as->parms[ADDRESS].items->data;
350 address = GetAddressFromString(addr);
353 if (!vos_FileServerAddressRemove(cellHandle, 0, address, &st)) {
354 ERR_ST_EXT("vos_FileServerAddressRemove", st);
360 Print_vos_fileServerEntry_p(vos_fileServerEntry_p serv, const char *prefix)
364 for (i = 0; i < serv->count; i++) {
365 printf("%s%x ", prefix, serv->serverAddress[i]);
371 DoVosFileServerList(struct cmd_syndesc *as, void *arock)
375 vos_fileServerEntry_t entry;
377 if (!vos_FileServerGetBegin(cellHandle, 0, &iter, &st)) {
378 ERR_ST_EXT("vos_FileServerGetBegin", st);
381 while (vos_FileServerGetNext(iter, &entry, &st)) {
382 Print_vos_fileServerEntry_p(&entry, "");
385 if (st != ADMITERATORDONE) {
386 ERR_ST_EXT("vos_FileServerGetNext", st);
389 if (!vos_FileServerGetDone(iter, &st)) {
390 ERR_ST_EXT("vos_FileServerGetDone", st);
397 Print_vos_serverTransactionStatus_p(vos_serverTransactionStatus_p tran,
400 printf("%sTransaction id\t\t\t%d\n", prefix, tran->transactionId);
401 printf("%sLast active time\t\t\t%d\n", prefix, tran->lastActiveTime);
402 printf("%sCreation time\t\t\t%d\n", prefix, tran->creationTime);
403 printf("%sError code\t\t\t%d\n", prefix, tran->errorCode);
404 printf("%sVolume id\t\t\t\t%u\n", prefix, tran->volumeId);
405 printf("%sPartition\t\t\t\t%d\n", prefix, tran->partition);
406 printf("%sLast procedure name\t\t\t%s\n", prefix,
407 tran->lastProcedureName);
408 printf("%sNext receive packet seq num\t\t\t%d\n", prefix,
409 tran->nextReceivePacketSequenceNumber);
410 printf("%sNext send packet seq num\t\t\t%d\n", prefix,
411 tran->nextSendPacketSequenceNumber);
412 printf("%sLast receive time\t\t\t%d\n", prefix, tran->lastReceiveTime);
413 printf("%sLast send time\t\t\t%d\n", prefix, tran->lastSendTime);
414 printf("%sVolume attach mode\t\t\t%d\n", prefix, tran->volumeAttachMode);
415 printf("%sVolume active status\t\t\t%d\n", prefix,
416 tran->volumeActiveStatus);
417 printf("%sVolume tran status\t\t\t%d\n", prefix,
418 tran->volumeTransactionStatus);
422 DoVosServerTransactionStatusList(struct cmd_syndesc *as, void *arock)
424 typedef enum { SERVER } DoVosServerTransactionStatusList_parm_t;
426 void *vos_server = NULL;
428 vos_serverTransactionStatus_t tran;
431 if (as->parms[SERVER].items) {
433 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
434 ERR_ST_EXT("vos_ServerOpen", st);
438 if (!vos_ServerTransactionStatusGetBegin
439 (cellHandle, vos_server, 0, &iter, &st)) {
440 ERR_ST_EXT("vos_ServerTransactionStatusGetBegin", st);
443 while (vos_ServerTransactionStatusGetNext(iter, &tran, &st)) {
444 Print_vos_serverTransactionStatus_p(&tran, "");
447 if (st != ADMITERATORDONE) {
448 ERR_ST_EXT("vos_ServerTransactionStatusGetNext", st);
451 if (!vos_ServerTransactionStatusGetDone(iter, &st)) {
452 ERR_ST_EXT("vos_ServerTransactionStatusGetDone", st);
458 Print_vos_vldbEntry_p(vos_vldbEntry_p entry, const char *prefix)
462 printf("%sVolume entry %s\n", prefix, entry->name);
463 printf("%sNumber of servers %d\n", prefix, entry->numServers);
464 printf("%sRead write volume %u\n", prefix,
465 entry->volumeId[VOS_READ_WRITE_VOLUME]);
466 printf("%sRead only volume %u\n", prefix,
467 entry->volumeId[VOS_READ_ONLY_VOLUME]);
468 printf("%sBackup volume %u\n", prefix,
469 entry->volumeId[VOS_BACKUP_VOLUME]);
470 printf("%sClone volume %u\n", prefix, entry->cloneId);
472 printf("%sVolume entry status:\n", prefix);
473 if (entry->status & VOS_VLDB_ENTRY_OK) {
474 printf("%s\tVOS_VLDB_ENTRY_OK\n", prefix);
476 if (entry->status & VOS_VLDB_ENTRY_MOVE) {
477 printf("%s\tVOS_VLDB_ENTRY_MOVE\n", prefix);
479 if (entry->status & VOS_VLDB_ENTRY_RELEASE) {
480 printf("%s\tVOS_VLDB_ENTRY_RELEASE\n", prefix);
482 if (entry->status & VOS_VLDB_ENTRY_BACKUP) {
483 printf("%s\tVOS_VLDB_ENTRY_BACKUP\n", prefix);
485 if (entry->status & VOS_VLDB_ENTRY_DELETE) {
486 printf("%s\tVOS_VLDB_ENTRY_DELETE\n", prefix);
488 if (entry->status & VOS_VLDB_ENTRY_DUMP) {
489 printf("%s\tVOS_VLDB_ENTRY_DUMP\n", prefix);
491 if (entry->status & VOS_VLDB_ENTRY_LOCKED) {
492 printf("%s\tVOS_VLDB_ENTRY_LOCKED\n", prefix);
494 if (entry->status & VOS_VLDB_ENTRY_RWEXISTS) {
495 printf("%s\tVOS_VLDB_ENTRY_RWEXISTS\n", prefix);
497 if (entry->status & VOS_VLDB_ENTRY_ROEXISTS) {
498 printf("%s\tVOS_VLDB_ENTRY_ROEXISTS\n", prefix);
500 if (entry->status & VOS_VLDB_ENTRY_BACKEXISTS) {
501 printf("%s\tVOS_VLDB_ENTRY_BACKEXISTS\n", prefix);
504 printf("%sVolume location information for replicas:\n", prefix);
505 for (i = 0; i < entry->numServers; i++) {
506 printf("%s\tServer %x\n", prefix,
507 entry->volumeSites[i].serverAddress);
508 printf("%s\tPartition %x\n", prefix,
509 entry->volumeSites[i].serverPartition);
510 if (entry->volumeSites[i].serverFlags & VOS_VLDB_NEW_REPSITE) {
511 printf("%s\tVOS_VLDB_NEW_REPSITE\n", prefix);
513 if (entry->volumeSites[i].serverFlags & VOS_VLDB_READ_ONLY) {
514 printf("%s\tVOS_VLDB_READ_ONLY\n", prefix);
516 if (entry->volumeSites[i].serverFlags & VOS_VLDB_READ_WRITE) {
517 printf("%s\tVOS_VLDB_READ_WRITE\n", prefix);
519 if (entry->volumeSites[i].serverFlags & VOS_VLDB_BACKUP) {
520 printf("%s\tVOS_VLDB_BACKUP\n", prefix);
522 if (entry->volumeSites[i].serverFlags & VOS_VLDB_DONT_USE) {
523 printf("%s\tVOS_VLDB_DONT_USE\n", prefix);
530 DoVosVLDBGet(struct cmd_syndesc *as, void *arock)
532 typedef enum { VOLUME } DoVosVLDBGet_parm_t;
534 vos_vldbEntry_t entry;
535 unsigned int volume_id;
536 char *volume_name = NULL;
538 if (as->parms[VOLUME].items) {
539 const char *volume = as->parms[VOLUME].items->data;
540 volume_id = GetVolumeIdFromString(volume);
544 if (!vos_VLDBGet(cellHandle, 0, &volume_id, volume_name, &entry, &st)) {
545 ERR_ST_EXT("vos_VLDBGet", st);
548 Print_vos_vldbEntry_p(&entry, "");
554 DoVosVLDBList(struct cmd_syndesc *as, void *arock)
556 typedef enum { SERVER, PARTITION } DoVosVLDBList_parm_t;
558 void *vos_server = NULL;
559 unsigned int partition_id;
560 unsigned int *part_ptr = NULL;
562 vos_vldbEntry_t entry;
565 if (as->parms[SERVER].items) {
567 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
568 ERR_ST_EXT("vos_ServerOpen", st);
573 if (as->parms[PARTITION].items) {
575 ERR_EXT("must specify server when specifying partition");
578 GetPartitionIdFromString(as->parms[PARTITION].items->data);
579 part_ptr = &partition_id;
582 if (!vos_VLDBGetBegin(cellHandle, vos_server, 0, part_ptr, &iter, &st)) {
583 ERR_ST_EXT("vos_VLDBGetBegin", st);
586 while (vos_VLDBGetNext(iter, &entry, &st)) {
587 Print_vos_vldbEntry_p(&entry, "");
590 if (st != ADMITERATORDONE) {
591 ERR_ST_EXT("vos_VLDBGetNext", st);
594 if (!vos_VLDBGetDone(iter, &st)) {
595 ERR_ST_EXT("vos_VLDBGetDone", st);
602 DoVosVLDBEntryRemove(struct cmd_syndesc *as, void *arock)
604 typedef enum { SERVER, PARTITION, VOLUME } DoVosVLDBEntryRemove_parm_t;
606 void *vos_server = NULL;
607 unsigned int partition_id;
608 unsigned int *part_ptr = NULL;
610 unsigned int volume_id;
611 unsigned int *vol_ptr = NULL;
613 if (as->parms[SERVER].items) {
615 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
616 ERR_ST_EXT("vos_ServerOpen", st);
621 if (as->parms[PARTITION].items) {
623 ERR_EXT("must specify server when specifying partition");
626 GetPartitionIdFromString(as->parms[PARTITION].items->data);
627 part_ptr = &partition_id;
630 if (as->parms[VOLUME].items) {
631 const char *volume = as->parms[VOLUME].items->data;
632 volume_id = GetVolumeIdFromString(volume);
633 vol_ptr = &volume_id;
636 if (!vos_VLDBEntryRemove
637 (cellHandle, vos_server, 0, part_ptr, vol_ptr, &st)) {
638 ERR_ST_EXT("vos_VLDBEntryRemove", st);
645 DoVosVLDBUnlock(struct cmd_syndesc *as, void *arock)
647 typedef enum { SERVER, PARTITION } DoVosVLDBUnlock_parm_t;
649 void *vos_server = NULL;
650 unsigned int partition_id;
651 unsigned int *part_ptr = NULL;
654 if (as->parms[SERVER].items) {
656 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
657 ERR_ST_EXT("vos_ServerOpen", st);
662 if (as->parms[PARTITION].items) {
664 ERR_EXT("must specify server when specifying partition");
667 GetPartitionIdFromString(as->parms[PARTITION].items->data);
668 part_ptr = &partition_id;
671 if (!vos_VLDBUnlock(cellHandle, vos_server, 0, part_ptr, &st)) {
672 ERR_ST_EXT("vos_VLDBUnlock", st);
679 DoVosVLDBEntryLock(struct cmd_syndesc *as, void *arock)
681 typedef enum { VOLUME } DoVosVLDBEntryLoc_parm_tk;
683 unsigned int volume_id = 0;
685 if (as->parms[VOLUME].items) {
686 const char *volume = as->parms[VOLUME].items->data;
687 volume_id = GetVolumeIdFromString(volume);
690 if (!vos_VLDBEntryLock(cellHandle, 0, volume_id, &st)) {
691 ERR_ST_EXT("vos_VLDBEntryLock", st);
698 DoVosVLDBEntryUnlock(struct cmd_syndesc *as, void *arock)
700 typedef enum { VOLUME } DoVosVLDBEntryUnlock_parm_t;
702 unsigned int volume_id = 0;
704 if (as->parms[VOLUME].items) {
705 const char *volume = as->parms[VOLUME].items->data;
706 volume_id = GetVolumeIdFromString(volume);
709 if (!vos_VLDBEntryUnlock(cellHandle, 0, volume_id, &st)) {
710 ERR_ST_EXT("vos_VLDBEntryUnlock", st);
717 DoVosVLDBReadOnlySiteCreate(struct cmd_syndesc *as, void *arock)
719 typedef enum { SERVER, PARTITION,
721 } DoVosVLDBReadOnlySiteCreate_parm_t;
723 void *vos_server = NULL;
724 unsigned int partition_id = 0;
725 unsigned int volume_id = 0;
727 if (as->parms[SERVER].items) {
729 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
730 ERR_ST_EXT("vos_ServerOpen", st);
734 if (as->parms[PARTITION].items) {
736 GetPartitionIdFromString(as->parms[PARTITION].items->data);
739 if (as->parms[VOLUME].items) {
740 const char *volume = as->parms[VOLUME].items->data;
741 volume_id = GetVolumeIdFromString(volume);
744 if (!vos_VLDBReadOnlySiteCreate
745 (cellHandle, vos_server, 0, partition_id, volume_id, &st)) {
746 ERR_ST_EXT("vos_VLDBReadOnlySiteCreate", st);
752 DoVosVLDBReadOnlySiteDelete(struct cmd_syndesc *as, void *arock)
754 typedef enum { SERVER, PARTITION,
756 } DoVosVLDBReadOnlySiteDelete_parm_t;
758 void *vos_server = NULL;
759 unsigned int partition_id = 0;
760 unsigned int volume_id = 0;
762 if (as->parms[SERVER].items) {
764 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
765 ERR_ST_EXT("vos_ServerOpen", st);
769 if (as->parms[PARTITION].items) {
771 GetPartitionIdFromString(as->parms[PARTITION].items->data);
774 if (as->parms[VOLUME].items) {
775 const char *volume = as->parms[VOLUME].items->data;
776 volume_id = GetVolumeIdFromString(volume);
779 if (!vos_VLDBReadOnlySiteDelete
780 (cellHandle, vos_server, 0, partition_id, volume_id, &st)) {
781 ERR_ST_EXT("vos_VLDBReadOnlySiteDelete", st);
788 DoVosVLDBSync(struct cmd_syndesc *as, void *arock)
790 typedef enum { SERVER, PARTITION, FORCE } DoVosVLDBSync_parm_t;
792 void *vos_server = NULL;
793 unsigned int partition_id;
794 unsigned int *part_ptr = NULL;
796 vos_force_t force = VOS_NORMAL;
798 if (as->parms[SERVER].items) {
800 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
801 ERR_ST_EXT("vos_ServerOpen", st);
806 if (as->parms[PARTITION].items) {
808 ERR_EXT("must specify server when specifying partition");
811 GetPartitionIdFromString(as->parms[PARTITION].items->data);
812 part_ptr = &partition_id;
815 if (as->parms[FORCE].items) {
819 if (!vos_VLDBSync(cellHandle, vos_server, 0, part_ptr, force, &st)) {
820 ERR_ST_EXT("vos_VLDBSync", st);
827 DoVosVolumeCreate(struct cmd_syndesc *as, void *arock)
829 typedef enum { SERVER, PARTITION, VOLUME,
831 } DoVosVolumeCreate_parm_t;
833 void *vos_server = NULL;
834 unsigned int partition_id = 0;
835 unsigned int volume_id;
837 unsigned int quota = 0;
839 if (as->parms[SERVER].items) {
841 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
842 ERR_ST_EXT("vos_ServerOpen", st);
846 if (as->parms[PARTITION].items) {
848 GetPartitionIdFromString(as->parms[PARTITION].items->data);
851 if (as->parms[VOLUME].items) {
852 volume = as->parms[VOLUME].items->data;
855 if (as->parms[QUOTA].items) {
857 GetIntFromString(as->parms[QUOTA].items->data, "invalid quota");
860 if (!vos_VolumeCreate
861 (cellHandle, vos_server, 0, partition_id, volume, quota, &volume_id,
863 ERR_ST_EXT("vos_VolumeCreate", st);
866 printf("Created volume %u\n", volume_id);
872 DoVosVolumeDelete(struct cmd_syndesc *as, void *arock)
874 typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeDelete_parm_t;
876 void *vos_server = NULL;
877 unsigned int partition_id = 0;
878 unsigned int volume_id = 0;
880 if (as->parms[SERVER].items) {
882 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
883 ERR_ST_EXT("vos_ServerOpen", st);
887 if (as->parms[PARTITION].items) {
889 GetPartitionIdFromString(as->parms[PARTITION].items->data);
892 if (as->parms[VOLUME].items) {
893 const char *volume = as->parms[VOLUME].items->data;
894 volume_id = GetVolumeIdFromString(volume);
897 if (!vos_VolumeDelete
898 (cellHandle, vos_server, 0, partition_id, volume_id, &st)) {
899 ERR_ST_EXT("vos_VolumeDelete", st);
906 DoVosVolumeRename(struct cmd_syndesc *as, void *arock)
908 typedef enum { OLDVOLUME, NEWVOLUME } DoVosVolumeRename_parm_t;
910 unsigned int old_volume = 0;
911 char *new_volume = NULL;
913 if (as->parms[OLDVOLUME].items) {
914 const char *volume = as->parms[OLDVOLUME].items->data;
915 old_volume = GetVolumeIdFromString(volume);
918 if (as->parms[NEWVOLUME].items) {
919 new_volume = as->parms[NEWVOLUME].items->data;
922 if (!vos_VolumeRename(cellHandle, 0, old_volume, new_volume, &st)) {
923 ERR_ST_EXT("vos_VolumeRename", st);
930 DoVosVolumeDump(struct cmd_syndesc *as, void *arock)
932 typedef enum { SERVER, PARTITION, VOLUME, STARTTIME,
934 } DoVosVolumeDump_parm_t;
936 void *vos_server = NULL;
937 unsigned int partition_id;
938 unsigned int *part_ptr = NULL;
940 unsigned int volume_id = 0;
941 unsigned int start_time = 0;
942 const char *dumpfile = NULL;
944 if (as->parms[SERVER].items) {
946 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
947 ERR_ST_EXT("vos_ServerOpen", st);
952 if (as->parms[PARTITION].items) {
954 ERR_EXT("must specify server when specifying partition");
957 GetPartitionIdFromString(as->parms[PARTITION].items->data);
958 part_ptr = &partition_id;
961 if (as->parms[VOLUME].items) {
962 const char *volume = as->parms[VOLUME].items->data;
963 volume_id = GetVolumeIdFromString(volume);
966 if (as->parms[STARTTIME].items) {
968 GetIntFromString(as->parms[STARTTIME].items->data,
969 "invalid start time");
972 if (as->parms[DUMPFILE].items) {
973 dumpfile = as->parms[DUMPFILE].items->data;
977 (cellHandle, vos_server, 0, part_ptr, volume_id, start_time, dumpfile,
979 ERR_ST_EXT("vos_VolumeDump", st);
986 DoVosVolumeRestore(struct cmd_syndesc *as, void *arock)
988 typedef enum { SERVER, PARTITION, ID, VOLUME, DUMPFILE,
990 } DoVosVolumeRestore_parm_t;
992 void *vos_server = NULL;
993 unsigned int partition_id = 0;
994 unsigned int volume_id;
995 unsigned int *vol_ptr = NULL;
996 const char *dumpfile = NULL;
997 char *volume_name = NULL;
998 vos_volumeRestoreType_t restore = VOS_RESTORE_INCREMENTAL;
1000 if (as->parms[SERVER].items) {
1002 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1003 ERR_ST_EXT("vos_ServerOpen", st);
1007 if (as->parms[PARTITION].items) {
1009 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1012 if (as->parms[VOLUME].items) {
1013 volume_name = as->parms[VOLUME].items->data;
1016 if (as->parms[ID].items) {
1017 const char *volume = as->parms[ID].items->data;
1018 volume_id = GetVolumeIdFromString(volume);
1019 vol_ptr = &volume_id;
1022 if (as->parms[DUMPFILE].items) {
1023 dumpfile = as->parms[DUMPFILE].items->data;
1026 if (as->parms[FULL].items) {
1027 restore = VOS_RESTORE_FULL;
1030 if (!vos_VolumeRestore
1031 (cellHandle, vos_server, 0, partition_id, vol_ptr, volume_name,
1032 dumpfile, restore, &st)) {
1033 ERR_ST_EXT("vos_VolumeRestore", st);
1040 DoVosVolumeOnline(struct cmd_syndesc *as, void *arock)
1042 typedef enum { SERVER, PARTITION, VOLUME, SLEEP,
1044 } DoVosVolumeOnline_parm_t;
1045 afs_status_t st = 0;
1046 void *vos_server = NULL;
1047 unsigned int partition_id = 0;
1048 unsigned int volume_id = 0;
1049 unsigned int sleep = 0;
1050 vos_volumeOnlineType_t type = VOS_ONLINE_OFFLINE;
1052 if (as->parms[SERVER].items) {
1054 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1055 ERR_ST_EXT("vos_ServerOpen", st);
1059 if (as->parms[PARTITION].items) {
1061 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1064 if (as->parms[VOLUME].items) {
1065 const char *volume = as->parms[VOLUME].items->data;
1066 volume_id = GetVolumeIdFromString(volume);
1069 if (as->parms[SLEEP].items) {
1071 GetIntFromString(as->parms[SLEEP].items->data,
1072 "invalid sleep time");
1075 if (as->parms[BUSY].items) {
1076 type = VOS_ONLINE_BUSY;
1079 if (!vos_VolumeOnline
1080 (vos_server, 0, partition_id, volume_id, sleep, type, &st)) {
1081 ERR_ST_EXT("vos_VolumeOnline", st);
1088 DoVosVolumeOffline(struct cmd_syndesc *as, void *arock)
1090 typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeOffline_parm_t;
1091 afs_status_t st = 0;
1092 void *vos_server = NULL;
1093 unsigned int partition_id = 0;
1094 unsigned int volume_id = 0;
1096 if (as->parms[SERVER].items) {
1098 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1099 ERR_ST_EXT("vos_ServerOpen", st);
1103 if (as->parms[PARTITION].items) {
1105 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1108 if (as->parms[VOLUME].items) {
1109 const char *volume = as->parms[VOLUME].items->data;
1110 volume_id = GetVolumeIdFromString(volume);
1113 if (!vos_VolumeOffline(vos_server, 0, partition_id, volume_id, &st)) {
1114 ERR_ST_EXT("vos_VolumeOffline", st);
1121 Print_vos_volumeEntry_p(vos_volumeEntry_p entry, const char *prefix)
1123 if (entry->status == VOS_OK) {
1124 printf("%sVolume name %s id %u\n", prefix, entry->name, entry->id);
1125 printf("%sRead write id %u\n", prefix, entry->readWriteId);
1126 printf("%sRead only id %u\n", prefix, entry->readOnlyId);
1127 printf("%sBackup id %u\n", prefix, entry->backupId);
1128 printf("%sCreation date %lu\n", prefix, entry->creationDate);
1129 printf("%sLast access date %lu\n", prefix, entry->lastAccessDate);
1130 printf("%sLast update date %lu\n", prefix, entry->lastUpdateDate);
1131 printf("%sLast backup date %lu\n", prefix, entry->lastBackupDate);
1132 printf("%sLast copy creation date %lu\n", prefix,
1133 entry->copyCreationDate);
1134 printf("%sAccesses since midnight %d\n", prefix,
1135 entry->accessesSinceMidnight);
1136 printf("%sFile count %d\n", prefix, entry->fileCount);
1137 printf("%sMax quota %d\n", prefix, entry->maxQuota);
1138 printf("%sCurrent size %d\n", prefix, entry->currentSize);
1140 printf("%sVolume status: VOS_OK\n", prefix);
1142 printf("%sVolume disposition:\n", prefix);
1144 switch (entry->volumeDisposition) {
1146 printf("%s\tVOS_OK\n", prefix);
1149 printf("%s\tVOS_SALVAGE\n", prefix);
1152 printf("%s\tVOS_NO_VNODE\n", prefix);
1155 printf("%s\tVOS_NO_VOL\n", prefix);
1157 case VOS_VOL_EXISTS:
1158 printf("%s\tVOS_VOL_EXISTS\n", prefix);
1160 case VOS_NO_SERVICE:
1161 printf("%s\tVOS_NO_SERVICE\n", prefix);
1164 printf("%s\tVOS_OFFLINE\n", prefix);
1167 printf("%s\tVOS_ONLINE\n", prefix);
1170 printf("%s\tVOS_DISK_FULL\n", prefix);
1172 case VOS_OVER_QUOTA:
1173 printf("%s\tVOS_OVER_QUOTA\n", prefix);
1176 printf("%s\tVOS_BUSY\n", prefix);
1179 printf("%s\tVOS_MOVED\n", prefix);
1182 printf("Unknown volume disposition %d\n",
1183 entry->volumeDisposition);
1187 printf("%sVolume type: ", prefix);
1189 if (entry->type == VOS_READ_WRITE_VOLUME) {
1190 printf("read write\n");
1191 } else if (entry->type == VOS_READ_ONLY_VOLUME) {
1192 printf("read only\n");
1197 printf("\n%s\tSame Network\tSame Network Authenticated"
1198 "\tDifferent Network\tDifferent Network Authenticated\n\n",
1200 printf("%sRead\t%d\t%d\t%d\t%d\n", prefix,
1201 entry->readStats[VOS_VOLUME_READ_WRITE_STATS_SAME_NETWORK],
1204 [VOS_VOLUME_READ_WRITE_STATS_SAME_NETWORK_AUTHENTICATED],
1206 readStats[VOS_VOLUME_READ_WRITE_STATS_DIFFERENT_NETWORK],
1209 [VOS_VOLUME_READ_WRITE_STATS_DIFFERENT_NETWORK_AUTHENTICATED]);
1210 printf("%sWrite\t%d\t%d\t%d\t%d\n", prefix,
1211 entry->writeStats[VOS_VOLUME_READ_WRITE_STATS_SAME_NETWORK],
1214 [VOS_VOLUME_READ_WRITE_STATS_SAME_NETWORK_AUTHENTICATED],
1216 writeStats[VOS_VOLUME_READ_WRITE_STATS_DIFFERENT_NETWORK],
1219 [VOS_VOLUME_READ_WRITE_STATS_DIFFERENT_NETWORK_AUTHENTICATED]);
1222 ("\n%s\t0 to 60 secs\t1 to 10 mins\t10 to 60 mins\t1 to 24 hrs\t1 to 7 days\t more than 7 days\n",
1224 printf("%sFile Author Write Same Network\t%d\t%d\t%d\t%d\t%d\t%d\n",
1227 fileAuthorWriteSameNetwork
1228 [VOS_VOLUME_TIME_STATS_0_TO_60_SECONDS],
1230 fileAuthorWriteSameNetwork
1231 [VOS_VOLUME_TIME_STATS_1_TO_10_MINUTES],
1233 fileAuthorWriteSameNetwork
1234 [VOS_VOLUME_TIME_STATS_10_TO_60_MINUTES],
1236 fileAuthorWriteSameNetwork
1237 [VOS_VOLUME_TIME_STATS_1_TO_24_HOURS],
1239 fileAuthorWriteSameNetwork[VOS_VOLUME_TIME_STATS_1_TO_7_DAYS],
1241 fileAuthorWriteSameNetwork
1242 [VOS_VOLUME_TIME_STATS_GREATER_THAN_7_DAYS]);
1243 printf("%sFile Author Write Diff Network\t%d\t%d\t%d\t%d\t%d\t%d\n",
1246 fileAuthorWriteDifferentNetwork
1247 [VOS_VOLUME_TIME_STATS_0_TO_60_SECONDS],
1249 fileAuthorWriteDifferentNetwork
1250 [VOS_VOLUME_TIME_STATS_1_TO_10_MINUTES],
1252 fileAuthorWriteDifferentNetwork
1253 [VOS_VOLUME_TIME_STATS_10_TO_60_MINUTES],
1255 fileAuthorWriteDifferentNetwork
1256 [VOS_VOLUME_TIME_STATS_1_TO_24_HOURS],
1258 fileAuthorWriteDifferentNetwork
1259 [VOS_VOLUME_TIME_STATS_1_TO_7_DAYS],
1261 fileAuthorWriteDifferentNetwork
1262 [VOS_VOLUME_TIME_STATS_GREATER_THAN_7_DAYS]);
1263 printf("%sDir Author Write Same Network\t%d\t%d\t%d\t%d\t%d\t%d\n",
1266 dirAuthorWriteSameNetwork
1267 [VOS_VOLUME_TIME_STATS_0_TO_60_SECONDS],
1269 dirAuthorWriteSameNetwork
1270 [VOS_VOLUME_TIME_STATS_1_TO_10_MINUTES],
1272 dirAuthorWriteSameNetwork
1273 [VOS_VOLUME_TIME_STATS_10_TO_60_MINUTES],
1275 dirAuthorWriteSameNetwork[VOS_VOLUME_TIME_STATS_1_TO_24_HOURS],
1277 dirAuthorWriteSameNetwork[VOS_VOLUME_TIME_STATS_1_TO_7_DAYS],
1279 dirAuthorWriteSameNetwork
1280 [VOS_VOLUME_TIME_STATS_GREATER_THAN_7_DAYS]);
1281 printf("%sDir Author Write Diff Network\t%d\t%d\t%d\t%d\t%d\t%d\n",
1284 dirAuthorWriteDifferentNetwork
1285 [VOS_VOLUME_TIME_STATS_0_TO_60_SECONDS],
1287 dirAuthorWriteDifferentNetwork
1288 [VOS_VOLUME_TIME_STATS_1_TO_10_MINUTES],
1290 dirAuthorWriteDifferentNetwork
1291 [VOS_VOLUME_TIME_STATS_10_TO_60_MINUTES],
1293 dirAuthorWriteDifferentNetwork
1294 [VOS_VOLUME_TIME_STATS_1_TO_24_HOURS],
1296 dirAuthorWriteDifferentNetwork
1297 [VOS_VOLUME_TIME_STATS_1_TO_7_DAYS],
1299 dirAuthorWriteDifferentNetwork
1300 [VOS_VOLUME_TIME_STATS_GREATER_THAN_7_DAYS]);
1302 printf("%sUnable to print volume because volume status:\n", prefix);
1303 switch (entry->status) {
1305 printf("%s\tVOS_SALVAGE\n", prefix);
1308 printf("%s\tVOS_NO_VNODE\n", prefix);
1311 printf("%s\tVOS_NO_VOL\n", prefix);
1313 case VOS_VOL_EXISTS:
1314 printf("%s\tVOS_VOL_EXISTS\n", prefix);
1316 case VOS_NO_SERVICE:
1317 printf("%s\tVOS_NO_SERVICE\n", prefix);
1320 printf("%s\tVOS_OFFLINE\n", prefix);
1323 printf("%s\tVOS_ONLINE\n", prefix);
1326 printf("%s\tVOS_DISK_FULL\n", prefix);
1328 case VOS_OVER_QUOTA:
1329 printf("%s\tVOS_OVER_QUOTA\n", prefix);
1332 printf("%s\tVOS_BUSY\n", prefix);
1335 printf("%s\tVOS_MOVED\n", prefix);
1338 printf("Unknown volume status %d\n", entry->status);
1345 DoVosVolumeGet(struct cmd_syndesc *as, void *arock)
1347 typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeGet_parm_t;
1348 afs_status_t st = 0;
1349 void *vos_server = NULL;
1350 unsigned int partition_id = 0;
1351 unsigned int volume_id = 0;
1352 vos_volumeEntry_t entry;
1354 if (as->parms[SERVER].items) {
1356 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1357 ERR_ST_EXT("vos_ServerOpen", st);
1361 if (as->parms[PARTITION].items) {
1363 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1366 if (as->parms[VOLUME].items) {
1367 const char *volume = as->parms[VOLUME].items->data;
1368 volume_id = GetVolumeIdFromString(volume);
1372 (cellHandle, vos_server, 0, partition_id, volume_id, &entry, &st)) {
1373 ERR_ST_EXT("vos_VolumeGet", st);
1376 Print_vos_volumeEntry_p(&entry, "");
1382 DoVosVolumeList(struct cmd_syndesc *as, void *arock)
1384 typedef enum { SERVER, PARTITION } DoVosVolumeList_parm_t;
1385 afs_status_t st = 0;
1386 void *vos_server = NULL;
1388 unsigned int partition_id = 0;
1389 vos_volumeEntry_t entry;
1391 if (as->parms[SERVER].items) {
1393 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1394 ERR_ST_EXT("vos_ServerOpen", st);
1398 if (as->parms[PARTITION].items) {
1400 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1403 if (!vos_VolumeGetBegin
1404 (cellHandle, vos_server, 0, partition_id, &iter, &st)) {
1405 ERR_ST_EXT("vos_VolumeGetBegin", st);
1408 printf("Volumes located at %s partition %s\n",
1409 as->parms[SERVER].items->data, as->parms[PARTITION].items->data);
1411 while (vos_VolumeGetNext(iter, &entry, &st)) {
1412 Print_vos_volumeEntry_p(&entry, " ");
1416 if (st != ADMITERATORDONE) {
1417 ERR_ST_EXT("vos_VolumeGetNext", st);
1420 if (!vos_VolumeGetDone(iter, &st)) {
1421 ERR_ST_EXT("vos_VolumeGetDone", st);
1428 DoVosVolumeMove(struct cmd_syndesc *as, void *arock)
1430 typedef enum { VOLUME, FROMSERVER, FROMPARTITION, TOSERVER,
1432 } DoVosVolumeMove_parm_t;
1433 afs_status_t st = 0;
1434 void *from_server = NULL;
1435 void *to_server = NULL;
1436 unsigned int from_partition = 0;
1437 unsigned int to_partition = 0;
1438 unsigned int volume_id = 0;
1440 if (as->parms[FROMSERVER].items) {
1442 (cellHandle, as->parms[FROMSERVER].items->data, &from_server,
1444 ERR_ST_EXT("vos_ServerOpen", st);
1448 if (as->parms[TOSERVER].items) {
1450 (cellHandle, as->parms[TOSERVER].items->data, &to_server, &st)) {
1451 ERR_ST_EXT("vos_ServerOpen", st);
1455 if (as->parms[FROMPARTITION].items) {
1457 GetPartitionIdFromString(as->parms[FROMPARTITION].items->data);
1460 if (as->parms[TOPARTITION].items) {
1462 GetPartitionIdFromString(as->parms[TOPARTITION].items->data);
1465 if (as->parms[VOLUME].items) {
1466 const char *volume = as->parms[VOLUME].items->data;
1467 volume_id = GetVolumeIdFromString(volume);
1471 (cellHandle, 0, volume_id, from_server, from_partition, to_server,
1472 to_partition, &st)) {
1473 ERR_ST_EXT("vos_VolumeMove", st);
1480 DoVosVolumeRelease(struct cmd_syndesc *as, void *arock)
1482 typedef enum { VOLUME, FORCE } DoVosVolumeRelease_parm_t;
1483 afs_status_t st = 0;
1484 unsigned int volume_id = 0;
1485 vos_force_t force = VOS_NORMAL;
1487 if (as->parms[VOLUME].items) {
1488 const char *volume = as->parms[VOLUME].items->data;
1489 volume_id = GetVolumeIdFromString(volume);
1492 if (as->parms[FORCE].items) {
1496 if (!vos_VolumeRelease(cellHandle, 0, volume_id, force, &st)) {
1497 ERR_ST_EXT("vos_VolumeRelease", st);
1503 DoVosVolumeZap(struct cmd_syndesc *as, void *arock)
1505 typedef enum { SERVER, PARTITION, VOLUME, FORCE } DoVosVolumeZap_parm_t;
1506 afs_status_t st = 0;
1507 void *vos_server = NULL;
1508 unsigned int partition_id = 0;
1509 unsigned int volume_id = 0;
1510 vos_force_t force = VOS_NORMAL;
1512 if (as->parms[SERVER].items) {
1514 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1515 ERR_ST_EXT("vos_ServerOpen", st);
1519 if (as->parms[PARTITION].items) {
1521 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1524 if (as->parms[VOLUME].items) {
1525 const char *volume = as->parms[VOLUME].items->data;
1526 volume_id = GetVolumeIdFromString(volume);
1529 if (as->parms[FORCE].items) {
1534 (cellHandle, vos_server, 0, partition_id, volume_id, force, &st)) {
1535 ERR_ST_EXT("vos_VolumeZap", st);
1542 DoVosPartitionNameToId(struct cmd_syndesc *as, void *arock)
1544 typedef enum { PARTITION } DoVosPartitionNameToId_parm_t;
1545 unsigned int partition_id = 0;
1547 if (as->parms[PARTITION].items) {
1549 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1552 printf("The id for partition %s is %u\n",
1553 as->parms[PARTITION].items->data, partition_id);
1559 DoVosPartitionIdToName(struct cmd_syndesc *as, void *arock)
1561 typedef enum { PARTITIONID } DoVosPartitionIdToName_parm_t;
1562 afs_status_t st = 0;
1563 unsigned int partition_id = 0;
1564 char partition[VOS_MAX_PARTITION_NAME_LEN];
1566 if (as->parms[PARTITIONID].items) {
1568 GetIntFromString(as->parms[PARTITIONID].items->data,
1569 "bad partition id");
1572 if (!vos_PartitionIdToName(partition_id, partition, &st)) {
1573 ERR_ST_EXT("bad partition id", st);
1576 printf("The partition for id %u is %s\n", partition_id, partition);
1582 DoVosVolumeQuotaChange(struct cmd_syndesc *as, void *arock)
1584 typedef enum { SERVER, PARTITION, VOLUME,
1586 } DoVosVolumeQuotaChange_parm_t;
1587 afs_status_t st = 0;
1588 void *vos_server = NULL;
1589 unsigned int partition_id = 0;
1590 unsigned int volume_id = 0;
1591 unsigned int quota = 0;
1593 if (as->parms[SERVER].items) {
1595 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1596 ERR_ST_EXT("vos_ServerOpen", st);
1600 if (as->parms[PARTITION].items) {
1602 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1605 if (as->parms[VOLUME].items) {
1606 const char *volume = as->parms[VOLUME].items->data;
1607 volume_id = GetVolumeIdFromString(volume);
1610 if (as->parms[QUOTA].items) {
1612 GetIntFromString(as->parms[QUOTA].items->data, "invalid quota");
1615 if (!vos_VolumeQuotaChange
1616 (cellHandle, vos_server, 0, partition_id, volume_id, quota, &st)) {
1617 ERR_ST_EXT("vos_VolumeQuotaChange", st);
1624 * Parse a server name/address and return the address in HOST BYTE order
1627 GetServer(char *aname)
1633 char hostname[MAXHOSTCHARS];
1635 code = sscanf(aname, "%d.%d.%d.%d", &b1, &b2, &b3, &b4);
1637 addr = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
1638 addr = ntohl(addr); /* convert to host order */
1640 th = gethostbyname(aname);
1643 memcpy(&addr, th->h_addr, sizeof(addr));
1646 if (rx_IsLoopbackAddr(ntohl(addr))) { /* local host */
1647 code = gethostname(hostname, MAXHOSTCHARS);
1650 th = gethostbyname(hostname); /* returns host byte order */
1653 memcpy(&addr, th->h_addr, sizeof(addr));
1660 Print_vos_volintInfo(afs_uint32 server, afs_uint32 partition, volintInfo* pinfo, const char *prefix)
1662 static afs_uint32 server_cache;
1663 static int cache_valid = 0;
1664 static char hostname[256], address[32];
1666 if (!cache_valid || server != server_cache) {
1670 strcpy(hostname, hostutil_GetNameByINet(server));
1671 strcpy(address, inet_ntoa(s));
1672 server_cache = server;
1677 printf("%sname\t\t%s\n",prefix, pinfo->name);
1678 printf("%sid\t\t%lu\n",prefix, afs_printable_uint32_lu(pinfo->volid));
1679 printf("%sserv\t\t%s\t%s\n",prefix, address,hostname);
1680 printf("%spart\t\t%u\n", prefix,partition);
1682 switch (pinfo->status) {
1684 printf("%sstatus\t\tOK\n",prefix);
1686 case 101: /* VBUSY */
1687 printf("%sstatus\t\tBUSY\n",prefix);
1690 printf("%sstatus\t\tUNATTACHABLE\n",prefix);
1693 printf("%sbackupID\t%lu\n",prefix,
1694 afs_printable_uint32_lu(pinfo->backupID));
1695 printf("%sparentID\t%lu\n",prefix,
1696 afs_printable_uint32_lu(pinfo->parentID));
1697 printf("%scloneID\t%lu\n",prefix,
1698 afs_printable_uint32_lu(pinfo->cloneID));
1699 printf("%sinUse\t\t%s\n",prefix, pinfo->inUse ? "Y" : "N");
1700 printf("%sneedsSalvaged\t%s\n",prefix, pinfo->needsSalvaged ? "Y" : "N");
1701 /* 0xD3 is from afs/volume.h since I had trouble including the file */
1702 printf("%sdestroyMe\t%s\n",prefix, pinfo->destroyMe == 0xD3 ? "Y" : "N");
1703 switch (pinfo->type) {
1705 printf("%stype\t\tRW\n",prefix);
1708 printf("%stype\t\tRO\n",prefix);
1711 printf("%stype\t\tBK\n",prefix);
1714 printf("%stype\t\t?\n",prefix);
1717 printf("%screationDate\t%-9lu\n", prefix,
1718 afs_printable_uint32_lu(pinfo->creationDate));
1719 printf("%saccessDate\t%-9lu\n", prefix,
1720 afs_printable_uint32_lu(pinfo->accessDate));
1721 printf("%supdateDate\t%-9lu\n", prefix,
1722 afs_printable_uint32_lu(pinfo->updateDate));
1723 printf("%sbackupDate\t%-9lu\n", prefix,
1724 afs_printable_uint32_lu(pinfo->backupDate));
1725 printf("%scopyDate\t%-9lu\n", prefix,
1726 afs_printable_uint32_lu(pinfo->copyDate));
1728 printf("%sflags\t\t%#lx\t(Optional)\n",prefix, afs_printable_int32_ld(pinfo->flags));
1729 printf("%sdiskused\t%u\n",prefix, pinfo->size);
1730 printf("%smaxquota\t%u\n",prefix, pinfo->maxquota);
1731 printf("%sminquota\t%lu\t(Optional)\n",prefix,
1732 afs_printable_uint32_lu(pinfo->spare0));
1733 printf("%sfilecount\t%u\n",prefix, pinfo->filecount);
1734 printf("%sdayUse\t\t%u\n",prefix, pinfo->dayUse);
1735 printf("%sweekUse\t%lu\t(Optional)\n",prefix,
1736 afs_printable_uint32_lu(pinfo->spare1));
1737 printf("%svolUpdateCounter\t\t%lu\t(Optional)\n",prefix,
1738 afs_printable_uint32_lu(pinfo->spare2));
1739 printf("%sspare3\t\t%lu\t(Optional)\n",prefix,
1740 afs_printable_uint32_lu(pinfo->spare3));
1744 DoVosVolumeGet2(struct cmd_syndesc *as, void *arock)
1746 typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeGet_parm_t;
1747 afs_status_t st = 0;
1748 void *vos_server = NULL;
1749 afs_uint32 partition_id = 0;
1750 afs_uint32 volume_id = 0;
1753 memset(&info, 0, sizeof(struct volintInfo));
1755 if (as->parms[SERVER].items) {
1757 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1758 ERR_ST_EXT("vos_ServerOpen", st);
1762 if (as->parms[PARTITION].items) {
1764 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1767 if (as->parms[VOLUME].items) {
1768 const char *volume = as->parms[VOLUME].items->data;
1769 volume_id = GetVolumeIdFromString(volume);
1774 (cellHandle, vos_server, 0, partition_id, volume_id, &info, &st)) {
1775 ERR_ST_EXT("vos_VolumeGet2", st);
1779 Print_vos_volintInfo(GetServer(as->parms[SERVER].items->data),partition_id,&info," ");
1786 DoVos_ClearVolUpdateCounter(struct cmd_syndesc *as, void *arock)
1788 typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeGet_parm_t;
1789 afs_status_t st = 0;
1790 void *vos_server = NULL;
1791 unsigned int partition_id = 0;
1792 unsigned int volume_id = 0;
1794 if (as->parms[SERVER].items) {
1796 (cellHandle, as->parms[SERVER].items->data, &vos_server, &st)) {
1797 ERR_ST_EXT("vos_ServerOpen", st);
1801 if (as->parms[PARTITION].items) {
1803 GetPartitionIdFromString(as->parms[PARTITION].items->data);
1806 if (as->parms[VOLUME].items) {
1807 const char *volume = as->parms[VOLUME].items->data;
1808 volume_id = GetVolumeIdFromString(volume);
1811 if (!vos_ClearVolUpdateCounter
1812 (cellHandle, vos_server,partition_id, volume_id, &st)) {
1813 ERR_ST_EXT("vos_ClearVolUpdateCounter", st);
1820 SetupVosAdminCmd(void)
1822 struct cmd_syndesc *ts;
1824 ts = cmd_CreateSyntax("VosBackupVolumeCreate", DoVosBackupVolumeCreate, NULL,
1825 "create a backup volume");
1826 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to back up");
1827 SetupCommonCmdArgs(ts);
1829 ts = cmd_CreateSyntax("VosBackupVolumeCreateMultiple",
1830 DoVosBackupVolumeCreateMultiple, NULL,
1831 "create a backup volume");
1832 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL,
1833 "server housing volumes to back up");
1834 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1835 "partition housing volumes to back up");
1836 cmd_AddParm(ts, "-prefix", CMD_SINGLE, CMD_OPTIONAL,
1837 "common prefix of volumes to back up");
1838 cmd_AddParm(ts, "-exclude", CMD_FLAG, CMD_OPTIONAL,
1839 "exclude volumes from backup that match prefix");
1840 SetupCommonCmdArgs(ts);
1842 ts = cmd_CreateSyntax("VosPartitionGet", DoVosPartitionGet, NULL,
1843 "get information about a partition");
1844 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1845 "server housing partition of interest");
1846 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
1847 "partition to query");
1848 SetupCommonCmdArgs(ts);
1850 ts = cmd_CreateSyntax("VosPartitionList", DoVosPartitionList, NULL,
1851 "list information about all partitions at a server");
1852 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1853 "server housing partitions of interest");
1854 SetupCommonCmdArgs(ts);
1856 ts = cmd_CreateSyntax("VosServerSync", DoVosServerSync, NULL,
1857 "sync server with vldb");
1858 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to sync");
1859 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1860 "partition to sync");
1861 SetupCommonCmdArgs(ts);
1863 ts = cmd_CreateSyntax("VosFileServerAddressChange",
1864 DoVosFileServerAddressChange, NULL,
1865 "change a server's address in the vldb");
1866 cmd_AddParm(ts, "-oldaddress", CMD_SINGLE, CMD_REQUIRED,
1867 "old address to change");
1868 cmd_AddParm(ts, "-newaddress", CMD_SINGLE, CMD_REQUIRED, "new address");
1869 SetupCommonCmdArgs(ts);
1871 ts = cmd_CreateSyntax("VosFileServerAddressRemove",
1872 DoVosFileServerAddressRemove, NULL,
1873 "remove a server's address from the vldb");
1874 cmd_AddParm(ts, "-address", CMD_SINGLE, CMD_REQUIRED,
1875 "address to remove");
1876 SetupCommonCmdArgs(ts);
1878 ts = cmd_CreateSyntax("VosFileServerList", DoVosFileServerList, NULL,
1879 "list the file servers in a cell");
1880 SetupCommonCmdArgs(ts);
1882 ts = cmd_CreateSyntax("VosServerTransactionStatusList",
1883 DoVosServerTransactionStatusList, NULL,
1884 "list the active transactions at a server");
1885 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
1886 SetupCommonCmdArgs(ts);
1888 ts = cmd_CreateSyntax("VosVLDBGet", DoVosVLDBGet, NULL,
1889 "get a vldb entry for a volume");
1890 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
1891 "volume to retrieve");
1892 SetupCommonCmdArgs(ts);
1894 ts = cmd_CreateSyntax("VosVLDBList", DoVosVLDBList, NULL,
1895 "list a group of vldb entries");
1896 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL,
1897 "limit entries to a particular server");
1898 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1899 "limit entries to a particular partition");
1900 SetupCommonCmdArgs(ts);
1902 ts = cmd_CreateSyntax("VosVLDBEntryRemove", DoVosVLDBEntryRemove, NULL,
1903 "remove vldb entries");
1904 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL,
1905 "limit entries to a particular server");
1906 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1907 "limit entries to a particular partition");
1908 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_OPTIONAL, "volume to remove");
1909 SetupCommonCmdArgs(ts);
1911 ts = cmd_CreateSyntax("VosVLDBUnlock", DoVosVLDBUnlock, NULL,
1912 "unlock a group of vldb entries");
1913 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL,
1914 "limit entries to a particular server");
1915 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1916 "limit entries to a particular partition");
1917 SetupCommonCmdArgs(ts);
1919 ts = cmd_CreateSyntax("VosVLDBEntryLock", DoVosVLDBList, NULL,
1920 "lock a single vldb entry");
1921 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to lock");
1922 SetupCommonCmdArgs(ts);
1924 ts = cmd_CreateSyntax("VosVLDBEntryUnlock", DoVosVLDBEntryUnlock, NULL,
1925 "unlock a single vldb entry");
1926 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to unlock");
1927 SetupCommonCmdArgs(ts);
1929 ts = cmd_CreateSyntax("VosVLDBReadOnlySiteCreate",
1930 DoVosVLDBReadOnlySiteCreate, NULL,
1931 "create a read only site");
1932 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1933 "server where read only will be created");
1934 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
1935 "partition where read only will be created");
1936 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
1937 "volume to replicate");
1938 SetupCommonCmdArgs(ts);
1940 ts = cmd_CreateSyntax("VosVLDBReadOnlySiteDelete",
1941 DoVosVLDBReadOnlySiteDelete, NULL,
1942 "delete a read only site before initial replication");
1943 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL,
1944 "server where read only will be deleted");
1945 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1946 "partition where read only will be deleted");
1947 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to delete");
1948 SetupCommonCmdArgs(ts);
1950 ts = cmd_CreateSyntax("VosVLDBSync", DoVosVLDBSync, NULL,
1951 "sync vldb with server");
1952 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to sync");
1953 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1954 "limit sync to a particular partition");
1955 cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "force sync to occur");
1956 SetupCommonCmdArgs(ts);
1958 ts = cmd_CreateSyntax("VosVolumeCreate", DoVosVolumeCreate, NULL,
1959 "create a read write volume");
1960 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1961 "server where volume will be created");
1962 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
1963 "partition where volume will be created");
1964 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
1965 "name of new volume");
1966 cmd_AddParm(ts, "-quota", CMD_SINGLE, CMD_REQUIRED,
1967 "size quota of new volume in 1kb units");
1968 SetupCommonCmdArgs(ts);
1970 ts = cmd_CreateSyntax("VosVolumeDelete", DoVosVolumeDelete, NULL,
1972 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1973 "server where volume exists");
1974 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
1975 "partition where volume exists");
1976 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to delete");
1977 SetupCommonCmdArgs(ts);
1979 ts = cmd_CreateSyntax("VosVolumeRename", DoVosVolumeRename, NULL,
1981 cmd_AddParm(ts, "-oldname", CMD_SINGLE, CMD_REQUIRED, "old volume name");
1982 cmd_AddParm(ts, "-newname", CMD_SINGLE, CMD_REQUIRED, "new volume name");
1983 SetupCommonCmdArgs(ts);
1985 ts = cmd_CreateSyntax("VosVolumeDump", DoVosVolumeDump, NULL,
1986 "dump a volume to a file");
1987 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL,
1988 "dump volume at a particular server");
1989 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
1990 "dump volume at a particular partition");
1991 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to dump");
1992 cmd_AddParm(ts, "-starttime", CMD_SINGLE, CMD_REQUIRED,
1993 "files modified after this time will be dumped");
1994 cmd_AddParm(ts, "-dumpfile", CMD_SINGLE, CMD_REQUIRED,
1995 "file to contain dump results");
1996 SetupCommonCmdArgs(ts);
1998 ts = cmd_CreateSyntax("VosVolumeRestore", DoVosVolumeRestore, NULL,
1999 "restore a volume from a dumpfile");
2000 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2001 "server that houses volume to restore");
2002 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2003 "partition that houses volume to restore");
2004 cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_OPTIONAL, "id of volume restored");
2005 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2006 "name of volume restored");
2007 cmd_AddParm(ts, "-dumpfile", CMD_SINGLE, CMD_REQUIRED,
2008 "file contained dump of volume");
2009 cmd_AddParm(ts, "-full", CMD_FLAG, CMD_OPTIONAL,
2010 "does a full restore of volume");
2011 SetupCommonCmdArgs(ts);
2013 ts = cmd_CreateSyntax("VosVolumeOnline", DoVosVolumeOnline, NULL,
2014 "bring a volume online");
2015 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2016 "server that houses volume");
2017 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2018 "partition that houses volume");
2019 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2020 "volume to bring online");
2021 cmd_AddParm(ts, "-sleep", CMD_SINGLE, CMD_REQUIRED, "seconds to sleep");
2022 cmd_AddParm(ts, "-busy", CMD_FLAG, CMD_OPTIONAL, "mark volume busy");
2023 SetupCommonCmdArgs(ts);
2025 ts = cmd_CreateSyntax("VosVolumeOffline", DoVosVolumeOffline, NULL,
2026 "take a volume offline");
2027 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2028 "server that houses volume");
2029 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2030 "partition that houses volume");
2031 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2032 "volume to bring offline");
2033 SetupCommonCmdArgs(ts);
2035 ts = cmd_CreateSyntax("VosVolumeGet", DoVosVolumeGet, NULL,
2036 "get a volume entry");
2037 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2038 "server that houses volume");
2039 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2040 "partition that houses volume");
2041 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2042 "volume to retrieve");
2043 SetupCommonCmdArgs(ts);
2045 ts = cmd_CreateSyntax("VosVolumeList", DoVosVolumeList, NULL,
2046 "list a group of volumes");
2047 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2048 "limit volumes to a particular server");
2049 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2050 "limit volumes to a particular partition");
2051 SetupCommonCmdArgs(ts);
2053 ts = cmd_CreateSyntax("VosVolumeMove", DoVosVolumeMove, NULL,
2055 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to move");
2056 cmd_AddParm(ts, "-fromserver", CMD_SINGLE, CMD_REQUIRED, "source server");
2057 cmd_AddParm(ts, "-frompartition", CMD_SINGLE, CMD_REQUIRED,
2058 "source partition");
2059 cmd_AddParm(ts, "-toserver", CMD_SINGLE, CMD_REQUIRED,
2060 "destination server");
2061 cmd_AddParm(ts, "-topartition", CMD_SINGLE, CMD_REQUIRED,
2062 "destination partition");
2063 SetupCommonCmdArgs(ts);
2065 ts = cmd_CreateSyntax("VosVolumeRelease", DoVosVolumeRelease, NULL,
2066 "release updates to read only");
2067 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2068 "volume to replicate");
2069 cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL,
2070 "force release to occur");
2071 SetupCommonCmdArgs(ts);
2073 ts = cmd_CreateSyntax("VosVolumeZap", DoVosVolumeZap, NULL, "zap a volume");
2074 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2075 "server that houses the volume to zap");
2076 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2077 "partition that houses the volume to zap");
2078 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to zap");
2079 cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "force zap");
2080 SetupCommonCmdArgs(ts);
2082 ts = cmd_CreateSyntax("VosPartitionNameToId", DoVosPartitionNameToId, NULL,
2083 "convert a partition name to a number");
2084 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2085 "partition to convert");
2086 SetupCommonCmdArgs(ts);
2088 ts = cmd_CreateSyntax("VosPartitionIdToName", DoVosPartitionIdToName, NULL,
2089 "convert a number to a partition");
2090 cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_REQUIRED, "number to convert");
2091 SetupCommonCmdArgs(ts);
2093 ts = cmd_CreateSyntax("VosVolumeQuotaChange", DoVosVolumeQuotaChange, NULL,
2094 "change the quota for a partition");
2095 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2096 "server that houses the volume");
2097 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2098 "partition that houses the volume");
2099 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to change");
2100 cmd_AddParm(ts, "-quota", CMD_SINGLE, CMD_REQUIRED,
2101 "new quota in 1kb units");
2102 SetupCommonCmdArgs(ts);
2104 ts = cmd_CreateSyntax("VosVolumeGet2", DoVosVolumeGet2, NULL,
2105 "get a volume entry");
2106 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2107 "server that houses volume");
2108 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2109 "partition that houses volume");
2110 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2111 "volume to retrieve");
2112 SetupCommonCmdArgs(ts);
2114 ts = cmd_CreateSyntax("ClearVolUpdateCounter", DoVos_ClearVolUpdateCounter, NULL,
2115 "clear volUpdateCounter");
2116 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2117 "server that houses volume");
2118 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED,
2119 "partition that houses volume");
2120 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
2122 SetupCommonCmdArgs(ts);