#include "display.H"
using rxrpc::ref;
+using kafs::afs::RWVOL;
+using kafs::afs::ROVOL;
+using kafs::afs::BACKVOL;
static void print_vl_record(kafs::Context *ctx,
kafs::Vldb_entry *vldb)
!a_locked &&
a_name.name.find('*') == std::string::npos) {
vlservice->look_up_volume_by_name(a_name, vlist);
+ vlservice->map_volume_sites(vlist);
print_vl_record(ctx, vlist[0]);
} else {
vlservice->look_up_volumes_by_attributes(a_server, a_partition,
a_locked, a_name.name, vlist);
+ vlservice->map_volume_sites(vlist);
if (!a_quiet && a_server.specified)
std::cout << "VLDB entries for server " << a_server.name << "\n";
/***
* ALIAS: vos listloc - listvldb
*/
+
+static std::string keyval(const char *key, std::string val)
+{
+ return fmt::format("\e[33m{:s}\e[m={:s}", key, val);
+}
+
+static std::string keyval(const char *key, unsigned int val)
+{
+ return fmt::format("\e[33m{:s}\e[m={:x}", key, val);
+}
+
+/***
+ * COMMAND: vos dumpvldb - Dump the VLDB
+ * ARG: "[-name <volume name>]"
+ * ARG: "[-server <machine name>]"
+ * ARG: "[-partition <partition name>]"
+ * ARG: "[-locked]"
+ * ARG: "[-nosort]"
+ * ARG: "[-cell <cell name>]"
+ * ARG: "[-noauth]" - Auth
+ * ARG: "[-localauth]" - Auth
+ * ARG: "[-verbose]"
+ * ARG: "[-encrypt]" - Auth
+ * NOCOMBINE: name, server
+ * NOCOMBINE: name, partition
+ * NOCOMBINE: name, locked
+ *
+ * Displays a volume's VLDB entry
+ */
+void COMMAND_vos_dumpvldb(
+ kafs::Context *ctx,
+ kafs::Volume_spec &a_name,
+ kafs::Fileserver_spec &a_server,
+ kafs::Partition_spec &a_partition,
+ bool a_locked,
+ bool a_nosort,
+ bool a_verbose)
+{
+ kafs::Vldb_entry_list vlist;
+ unsigned int i;
+
+ _enter("");
+
+ ref<kafs::VL_service> vlservice = new kafs::VL_service(ctx);
+
+ if (a_name.specified &&
+ !a_server.specified &&
+ !a_partition.specified &&
+ !a_locked &&
+ a_name.name.find('*') == std::string::npos) {
+ vlservice->look_up_volume_by_name(a_name, vlist);
+ } else {
+ vlservice->look_up_volumes_by_attributes(a_server, a_partition,
+ a_locked, a_name.name, vlist);
+ if (!a_nosort)
+ std::sort(vlist.begin(), vlist.end(), cmp_entries_by_name);
+ }
+
+ std::cout << "VOLUME WRB\n";
+ std::cout << "================================================================ ===\n";
+
+ for (i = 0; i < vlist.size(); i++) {
+ kafs::Vldb_entry *vldb = vlist[i];
+ unsigned int flags = vldb->flags;
+ std::cout << fmt::format("\e[32m{:64s}\e[m {:c}{:c}{:c}\n",
+ vldb->name,
+ (flags & kafs::afs::VLF_RWEXISTS) ? 'w' : '-',
+ (flags & kafs::afs::VLF_ROEXISTS) ? 'r' : '-',
+ (flags & kafs::afs::VLF_BACKEXISTS) ? 'b' : '-');
+
+ std::cout << " " << keyval("rw", vldb->volume_id[RWVOL])
+ << " " << keyval("ro", vldb->volume_id[ROVOL])
+ << " " << keyval("bak", vldb->volume_id[BACKVOL]);
+
+ if (vldb->clone_id)
+ std::cout << keyval("clone", vldb->volume_id[BACKVOL]);
+ if (vldb->has_match_index)
+ std::cout << " " << keyval("mix", vldb->match_index);
+
+ std::cout << "\n";
+
+ for (unsigned int j = 0; j < vldb->sites.size(); j++) {
+ kafs::Vldb_site *site = &vldb->sites[j];
+ unsigned int flags = site->flags;
+
+ if (!flags)
+ continue;
+
+ std::cout << " [" << j << "]";
+ if (site->has_uuid) {
+ char buf[48];
+ uuid_unparse(site->uuid.uuid, buf);
+ std::cout << " " << keyval("uuid", buf);
+ }
+
+ if (flags) {
+ const char *sep = "";
+ std::string f = "";
+
+ if (flags & kafs::afs::VLSF_NEWREPSITE) {
+ f = f + sep + "new";
+ sep = ",";
+ }
+ if (flags & kafs::afs::VLSF_RWVOL) {
+ f = f + sep + "rw";
+ sep = ",";
+ }
+ if (flags & kafs::afs::VLSF_ROVOL) {
+ f = f + sep + "ro";
+ sep = ",";
+ }
+ if (flags & kafs::afs::VLSF_BACKVOL) {
+ f = f + sep + "bak";
+ sep = ",";
+ }
+ if (flags & kafs::afs::VLSF_UUID) {
+ f = f + sep + "uu";
+ sep = ",";
+ }
+ if (flags & kafs::afs::VLSF_DONTUSE) {
+ f = f + sep + "dont";
+ sep = ",";
+ }
+ std::cout << " " << keyval("fl", f);
+ } else {
+ std::cout << " " << keyval("fl", "0");
+ }
+
+ if (site->has_unique)
+ std::cout << " " << keyval("uq", site->unique);
+ if (site->nr_addrs)
+ std::cout << " " << keyval("naddrs", site->nr_addrs);
+ std::cout << " " << keyval("part", sprint_partition(site->partition));
+
+ std::cout << "\n";
+ }
+ }
+}