You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

71 lines
2.7 KiB

  1. from nilmdb.utils.printf import *
  2. import nilmdb
  3. import nilmdb.client
  4. def setup(self, sub):
  5. cmd = sub.add_parser("metadata", help="Get or set stream metadata",
  6. description="""
  7. Get or set key=value metadata associated with
  8. a stream.
  9. """,
  10. usage="%(prog)s path [-g [key ...] | "
  11. "-s key=value [...] | -u key=value [...]]")
  12. cmd.set_defaults(handler = cmd_metadata)
  13. group = cmd.add_argument_group("Required arguments")
  14. group.add_argument("path",
  15. help="Path of stream, e.g. /foo/bar",
  16. ).completer = self.complete.path
  17. group = cmd.add_argument_group("Actions")
  18. exc = group.add_mutually_exclusive_group()
  19. exc.add_argument("-g", "--get", nargs="*", metavar="key",
  20. help="Get metadata for specified keys (default all)",
  21. ).completer = self.complete.meta_key
  22. exc.add_argument("-s", "--set", nargs="+", metavar="key=value",
  23. help="Replace all metadata with provided "
  24. "key=value pairs",
  25. ).completer = self.complete.meta_keyval
  26. exc.add_argument("-u", "--update", nargs="+", metavar="key=value",
  27. help="Update metadata using provided "
  28. "key=value pairs",
  29. ).completer = self.complete.meta_keyval
  30. return cmd
  31. def cmd_metadata(self):
  32. """Manipulate metadata"""
  33. if self.args.set is not None or self.args.update is not None:
  34. # Either set, or update
  35. if self.args.set is not None:
  36. keyvals = self.args.set
  37. handler = self.client.stream_set_metadata
  38. else:
  39. keyvals = self.args.update
  40. handler = self.client.stream_update_metadata
  41. # Extract key=value pairs
  42. data = {}
  43. for keyval in keyvals:
  44. kv = keyval.split('=')
  45. if len(kv) != 2 or kv[0] == "":
  46. self.die("error parsing key=value argument '%s'", keyval)
  47. data[kv[0]] = kv[1]
  48. # Make the call
  49. try:
  50. handler(self.args.path, data)
  51. except nilmdb.client.ClientError as e:
  52. self.die("error setting/updating metadata: %s", str(e))
  53. else:
  54. # Get (or unspecified)
  55. keys = self.args.get or None
  56. try:
  57. data = self.client.stream_get_metadata(self.args.path, keys)
  58. except nilmdb.client.ClientError as e:
  59. self.die("error getting metadata: %s", str(e))
  60. for key, value in sorted(data.items()):
  61. # Omit nonexistant keys
  62. if value is None:
  63. value = ""
  64. printf("%s=%s\n", key, value)