nsc.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. """
  2. Name server control tool.
  3. Pyro - Python Remote Objects. Copyright by Irmen de Jong (irmen@razorvine.net).
  4. """
  5. from __future__ import print_function
  6. import sys
  7. from Pyro4 import naming, errors
  8. if sys.version_info < (3, 0):
  9. input = raw_input
  10. def handleCommand(nameserver, options, args):
  11. def printListResult(resultdict, title=""):
  12. print("--------START LIST %s" % title)
  13. for name, (uri, metadata) in sorted(resultdict.items()):
  14. print("%s --> %s" % (name, uri))
  15. if metadata:
  16. print(" metadata:", metadata)
  17. print("--------END LIST %s" % title)
  18. def cmd_ping():
  19. nameserver.ping()
  20. print("Name server ping ok.")
  21. def cmd_listprefix():
  22. if len(args) == 1:
  23. printListResult(nameserver.list(return_metadata=True))
  24. else:
  25. printListResult(nameserver.list(prefix=args[1], return_metadata=True), "- prefix '%s'" % args[1])
  26. def cmd_listregex():
  27. if len(args) != 2:
  28. raise SystemExit("requires one argument: pattern")
  29. printListResult(nameserver.list(regex=args[1], return_metadata=True), "- regex '%s'" % args[1])
  30. def cmd_lookup():
  31. if len(args) != 2:
  32. raise SystemExit("requires one argument: name")
  33. uri, metadata = nameserver.lookup(args[1], return_metadata=True)
  34. print(uri)
  35. if metadata:
  36. print("metadata:", metadata)
  37. def cmd_register():
  38. if len(args) != 3:
  39. raise SystemExit("requires two arguments: name uri")
  40. nameserver.register(args[1], args[2], safe=True)
  41. print("Registered %s" % args[1])
  42. def cmd_remove():
  43. count = nameserver.remove(args[1])
  44. if count > 0:
  45. print("Removed %s" % args[1])
  46. else:
  47. print("Nothing removed")
  48. def cmd_removeregex():
  49. if len(args) != 2:
  50. raise SystemExit("requires one argument: pattern")
  51. sure = input("Potentially removing lots of items from the Name server. Are you sure (y/n)?").strip()
  52. if sure in ('y', 'Y'):
  53. count = nameserver.remove(regex=args[1])
  54. print("%d items removed." % count)
  55. def cmd_setmeta():
  56. if len(args) < 2:
  57. raise SystemExit("requires at least 2 arguments: uri and zero or more meta tags")
  58. metadata = set(args[2:])
  59. nameserver.set_metadata(args[1], metadata)
  60. if metadata:
  61. print("Metadata updated")
  62. else:
  63. print("Metadata cleared")
  64. def cmd_listmeta_all():
  65. if len(args) < 2:
  66. raise SystemExit("requires at least one metadata tag argument")
  67. metadata = set(args[1:])
  68. printListResult(nameserver.list(metadata_all=metadata, return_metadata=True), " - searched by metadata")
  69. def cmd_listmeta_any():
  70. if len(args) < 2:
  71. raise SystemExit("requires at least one metadata tag argument")
  72. metadata = set(args[1:])
  73. printListResult(nameserver.list(metadata_any=metadata, return_metadata=True), " - searched by metadata")
  74. commands = {
  75. "ping": cmd_ping,
  76. "list": cmd_listprefix,
  77. "listmatching": cmd_listregex,
  78. "listmeta_all": cmd_listmeta_all,
  79. "listmeta_any": cmd_listmeta_any,
  80. "lookup": cmd_lookup,
  81. "register": cmd_register,
  82. "remove": cmd_remove,
  83. "removematching": cmd_removeregex,
  84. "setmeta": cmd_setmeta
  85. }
  86. try:
  87. commands[args[0]]()
  88. except Exception:
  89. xt, xv, tb = sys.exc_info()
  90. print("Error: %s - %s" % (xt.__name__, xv))
  91. def main(args=None):
  92. from optparse import OptionParser
  93. usage = "usage: %prog [options] command [arguments]\nCommands: " \
  94. "register remove removematching lookup list listmatching\n listmeta_all listmeta_any setmeta ping"
  95. parser = OptionParser(usage=usage)
  96. parser.add_option("-n", "--host", dest="host", help="hostname of the NS")
  97. parser.add_option("-p", "--port", dest="port", type="int",
  98. help="port of the NS (or bc-port if host isn't specified)")
  99. parser.add_option("-u", "--unixsocket", help="Unix domain socket name of the NS")
  100. parser.add_option("-k", "--key", help="the HMAC key to use")
  101. parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="verbose output")
  102. options, args = parser.parse_args(args)
  103. if not args or args[0] not in ("register", "remove", "removematching", "list", "listmatching", "lookup",
  104. "listmeta_all", "listmeta_any", "setmeta", "ping"):
  105. parser.error("invalid or missing command")
  106. if options.verbose:
  107. print("Locating name server...")
  108. if options.unixsocket:
  109. options.host = "./u:" + options.unixsocket
  110. try:
  111. nameserver = naming.locateNS(options.host, options.port, hmac_key=options.key)
  112. except errors.PyroError:
  113. x = sys.exc_info()[1]
  114. print("Failed to locate the name server: %s" % x)
  115. return
  116. if options.verbose:
  117. print("Name server found: %s" % nameserver._pyroUri)
  118. handleCommand(nameserver, options, args)
  119. if options.verbose:
  120. print("Done.")
  121. if __name__ == "__main__":
  122. main()