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.
 
 
 

89 lines
3.5 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. "-d [key ...]")
  13. cmd.set_defaults(handler = cmd_metadata)
  14. group = cmd.add_argument_group("Required arguments")
  15. group.add_argument("path",
  16. help="Path of stream, e.g. /foo/bar",
  17. ).completer = self.complete.path
  18. group = cmd.add_argument_group("Actions")
  19. exc = group.add_mutually_exclusive_group()
  20. exc.add_argument("-g", "--get", nargs="*", metavar="key",
  21. help="Get metadata for specified keys (default all)",
  22. ).completer = self.complete.meta_key
  23. exc.add_argument("-s", "--set", nargs="+", metavar="key=value",
  24. help="Replace all metadata with provided "
  25. "key=value pairs",
  26. ).completer = self.complete.meta_keyval
  27. exc.add_argument("-u", "--update", nargs="+", metavar="key=value",
  28. help="Update metadata using provided "
  29. "key=value pairs",
  30. ).completer = self.complete.meta_keyval
  31. exc.add_argument("-d", "--delete", nargs="*", metavar="key",
  32. help="Delete metadata for specified keys (default all)",
  33. ).completer = self.complete.meta_key
  34. return cmd
  35. def cmd_metadata(self):
  36. """Manipulate metadata"""
  37. if self.args.set is not None or self.args.update is not None:
  38. # Either set, or update
  39. if self.args.set is not None:
  40. keyvals = self.args.set
  41. handler = self.client.stream_set_metadata
  42. else:
  43. keyvals = self.args.update
  44. handler = self.client.stream_update_metadata
  45. # Extract key=value pairs
  46. data = {}
  47. for keyval in keyvals:
  48. kv = keyval.split('=')
  49. if len(kv) != 2 or kv[0] == "":
  50. self.die("error parsing key=value argument '%s'", keyval)
  51. data[kv[0]] = kv[1]
  52. # Make the call
  53. try:
  54. handler(self.args.path, data)
  55. except nilmdb.client.ClientError as e:
  56. self.die("error setting/updating metadata: %s", str(e))
  57. elif self.args.delete is not None:
  58. # Delete (by setting values to empty strings)
  59. keys = None
  60. if self.args.delete:
  61. keys = list(self.args.delete)
  62. try:
  63. data = self.client.stream_get_metadata(self.args.path, keys)
  64. for key in data:
  65. data[key] = ""
  66. self.client.stream_update_metadata(self.args.path, data)
  67. except nilmdb.client.ClientError as e:
  68. self.die("error deleting metadata: %s", str(e))
  69. else:
  70. # Get (or unspecified)
  71. keys = None
  72. if self.args.get:
  73. keys = list(self.args.get)
  74. try:
  75. data = self.client.stream_get_metadata(self.args.path, keys)
  76. except nilmdb.client.ClientError as e:
  77. self.die("error getting metadata: %s", str(e))
  78. for key, value in sorted(data.items()):
  79. # Print nonexistant keys as having empty value
  80. if value is None:
  81. value = ""
  82. printf("%s=%s\n", key, value)