Package fcp :: Module names
[hide private]
[frames] | no frames]

Source Code for Module fcp.names

  1  #@+leo-ver=4 
  2  #@+node:@file names.py 
  3  """ 
  4  Perform namesite operations 
  5  """ 
  6   
  7  #@+others 
  8  #@+node:imports 
  9  import sys, os, getopt, traceback, mimetypes, time 
 10   
 11  import node 
 12   
 13  #@-node:imports 
 14  #@+node:globals 
 15  progname = sys.argv[0] 
 16   
 17  #@-node:globals 
 18  #@+node:class NamesMgr 
19 -class NamesMgr:
20 """ 21 """ 22 #@ @+others 23 #@+node:synonyms 24 synonyms = {"addservice" : "newservice", 25 "listservice" : "listservices", 26 } 27 28 #@-node:synonyms 29 #@+node:__init__
30 - def __init__(self, node):
31 """ 32 Create a command interface for names service 33 """ 34 self.node = node
35 36 #@-node:__init__ 37 #@+node:execute
38 - def execute(self, cmd, *args):
39 """ 40 executes command with args 41 """ 42 cmd = self.synonyms.get(cmd, cmd) 43 44 method = getattr(self, "cmd_"+cmd, None) 45 if not method: 46 usage("unrecognised command '%s'" % cmd) 47 return method(*args)
48 49 50 #@-node:execute 51 #@+node:cmd_help
52 - def cmd_help(self, *args):
53 54 help() 55 sys.exit(0)
56 57 #@-node:cmd_help 58 #@+node:cmd_newservice
59 - def cmd_newservice(self, *args):
60 """ 61 Creates a new local name service 62 """ 63 #print "cmd_newservice %s" % repr(args) 64 65 nargs = len(args) 66 67 if nargs not in [1, 2]: 68 usage("newservice: bad argument count") 69 70 name = args[0] 71 if len(args) == 2: 72 priv = args[1] 73 pub = self.node.invertkey(priv) 74 else: 75 pub, priv = self.node.genkey() 76 77 pub = self.node.namesiteProcessUri(pub) 78 priv = self.node.namesiteProcessUri(priv) 79 80 self.node.namesiteAddLocal(name, priv) 81 82 print pub
83 84 #@-node:cmd_newservice 85 #@+node:cmd_delservice
86 - def cmd_delservice(self, *args):
87 """ 88 delservice <name> 89 90 Remove local service <name> and deletes its records 91 """ 92 #print "cmd_delservice %s" % repr(args) 93 94 nargs = len(args) 95 96 if nargs != 1: 97 usage("delservice: bad argument count") 98 99 name = args[0] 100 101 self.node.namesiteDelLocal(name)
102 103 #@-node:cmd_delservice 104 #@+node:cmd_listservices
105 - def cmd_listservices(self):
106 """ 107 Print a list of services as 'name uri' lines 108 """ 109 for rec in self.node.namesiteLocals: 110 print "%s %s" % (rec['name'], rec['puburi'])
111 112 #@-node:cmd_listservices 113 #@+node:cmd_dumpservice
114 - def cmd_dumpservice(self, *args):
115 """ 116 Dumps out all records for given service 117 """ 118 nargs = len(args) 119 120 if nargs != 1: 121 usage("dumpservice: bad argument count") 122 123 name = args[0] 124 125 for rec in self.node.namesiteLocals: 126 if rec['name'] == name: 127 for k,v in rec['cache'].items(): 128 print "%s %s" % (k, v)
129 130 #@-node:cmd_dumpservice 131 #@+node:cmd_addpeer
132 - def cmd_addpeer(self, *args):
133 """ 134 addpeer <name> <uri> 135 136 Adds a peer name service 137 """ 138 #print "cmd_addpeer %s" % repr(args) 139 140 nargs = len(args) 141 142 if nargs != 2: 143 usage("addpeer: bad argument count") 144 145 name, uri = args 146 147 self.node.namesiteAddPeer(name, uri)
148 149 #@-node:cmd_addpeer 150 #@+node:cmd_delpeer
151 - def cmd_delpeer(self, *args):
152 """ 153 delpeer <name> 154 155 Remove peer name service <name> 156 """ 157 #print "cmd_delpeer %s" % repr(args) 158 159 nargs = len(args) 160 161 if nargs != 1: 162 usage("delpeer: bad argument count") 163 164 name = args[0] 165 166 self.node.namesiteRemovePeer(name)
167 168 #@-node:cmd_delpeer 169 #@+node:cmd_listpeers
170 - def cmd_listpeers(self):
171 """ 172 Prints a list of peers and their URIs 173 """ 174 for rec in self.node.namesitePeers: 175 print "%s %s" % (rec['name'], rec['puburi'])
176 177 #@-node:cmd_listpeers 178 #@+node:cmd_addrecord
179 - def cmd_addrecord(self, *args):
180 """ 181 addrecord <service> <sitename> <uri> 182 183 Add to local service <service> a record mapping <sitename> to <uri> 184 """ 185 #print "cmd_addrecord %s" % repr(args) 186 187 nargs = len(args) 188 if nargs != 3: 189 usage("addrecord: bad argument count") 190 191 localname, domain, uri = args 192 193 self.node.namesiteAddRecord(localname, domain, uri)
194 195 #@-node:cmd_addrecord 196 #@+node:cmd_delrecord
197 - def cmd_delrecord(self, *args):
198 """ 199 delrecord <service> <sitename> 200 201 Remove from local service <service> the record for name <sitename> 202 """ 203 #print "cmd_delrecord %s" % repr(args) 204 205 nargs = len(args) 206 if nargs != 2: 207 usage("delrecord: bad argument count") 208 209 service, sitename = args 210 211 self.node.namesiteDelRecord(service, sitename)
212 213 #@-node:cmd_delrecord 214 #@+node:cmd_reinsertservice
215 - def cmd_reinsertservice(self, *args):
216 """ 217 Forces a reinsert of all records for given service 218 """ 219 nargs = len(args) 220 221 if nargs != 1: 222 usage("dumpservice: bad argument count") 223 224 name = args[0] 225 226 for r in self.node.namesiteLocals: 227 if r['name'] == name: 228 rec = r 229 break 230 if not rec: 231 return 232 233 for domain,uri in rec['cache'].items(): 234 # reinsert each record 235 236 # determine the insert uri 237 localPrivUri = rec['privuri'] + "/" + domain + "/0" 238 239 # and stick it in, via global queue 240 id = "namesite|%s|%s|%s" % (name, domain, int(time.time())) 241 self.node.put( 242 localPrivUri, 243 id=id, 244 data=uri, 245 persistence="forever", 246 Global=True, 247 priority=0, 248 async=True, 249 ) 250 251 self.node.refreshPersistentRequests()
252 253 #@-node:cmd_reinsertservice 254 #@+node:cmd_verifyservice
255 - def cmd_verifyservice(self, *args):
256 """ 257 Tries to retrieve all the records of a given service 258 """ 259 nargs = len(args) 260 261 if nargs != 1: 262 usage("dumpservice: bad argument count") 263 264 name = args[0] 265 266 rec = None 267 for r in self.node.namesiteLocals: 268 if r['name'] == name: 269 rec = r 270 break 271 if not rec: 272 usage("No local service called '%s'" % name) 273 274 ntotal = 0 275 nsuccessful = 0 276 nfailed = 0 277 nincorrect = 0 278 279 for domain,uri in rec['cache'].items(): 280 281 ntotal += 1 282 283 # retrieve each record 284 285 # determine the insert uri 286 localPubUri = rec['puburi'] + "/" + domain + "/0" 287 288 print ("Trying to retrieve record %s..." % domain), 289 290 try: 291 mimetype, data = recUri = self.node.get(localPubUri, priority=0) 292 if data == uri: 293 print " successful!" 294 nsuccessful += 1 295 else: 296 print " incorrect! :(" 297 nincorrect += 1 298 except: 299 print " failed to fetch" 300 nfailed += 1 301 302 print "Result: total=%s successful=%s failed=%s" % ( 303 ntotal, nsuccessful, nfailed+nincorrect)
304 305 #@-node:cmd_verifyservice 306 #@+node:cmd_lookup
307 - def cmd_lookup(self, *args):
308 """ 309 lookup <name> 310 311 look up <name>, and print its target uri 312 """ 313 #print "cmd_lookup %s" % repr(args) 314 315 if len(args) != 1: 316 usage("Syntax: lookup <domainname>") 317 318 domain = args[0] 319 320 uri = self.node.namesiteLookup(domain) 321 if uri: 322 print uri 323 else: 324 return 1
325 326 #@-node:cmd_lookup 327 #@-others 328 329 #@-node:class NamesMgr 330 #@+node:usage
331 -def usage(msg=None, ret=1):
332 """ 333 Prints usage message then exits 334 """ 335 if msg: 336 sys.stderr.write(msg+"\n") 337 sys.stderr.write("Usage: %s [options]\n" % progname) 338 sys.stderr.write("Type '%s -h' for help\n" % progname) 339 sys.exit(ret)
340 341 #@-node:usage 342 #@+node:help
343 -def help():
344 """ 345 print help options, then exit 346 """ 347 print "%s: operate on pyFreenet 'namesites'" % progname 348 print 349 print "Usage: %s [options]" % progname 350 print 351 print "Options:" 352 print " -h, -?, --help" 353 print " Print this help message" 354 print " -v, --verbose" 355 print " Print verbose progress messages to stderr" 356 print " -H, --fcpHost=<hostname>" 357 print " Connect to FCP service at host <hostname>" 358 print " -P, --fcpPort=<portnum>" 359 print " Connect to FCP service at port <portnum>" 360 print " -V, --version" 361 print " Print version number and exit" 362 print 363 print "Commands:" 364 print " newservice <name> [<privuri>]" 365 print " create a new local service" 366 print " delservice <name>" 367 print " remove local service <name> and delete its records" 368 print " listservices" 369 print " print details for local services as '<name> <uri>' lines," 370 print " so that peers can 'addpeer' one or more of these" 371 print " dumpservice <name>" 372 print " print a list of records in local name service <name>, as a" 373 print " set of lines in the form '<name> <targetURI>'" 374 print " reinsertservice <name>" 375 print " reinsert all records of local service <name> - USE ONLY IF DESPERATE" 376 print " verifyservice <name>" 377 print " retrieves all records of local service <name> to check" 378 print " retrievability and accuracy" 379 print " addpeer <name> <uri>" 380 print " Adds a peer name service" 381 print " delpeer <name>" 382 print " Remove peer name service <name>" 383 print " listpeers" 384 print " Print a list of registered peer namesites, as '<name> <uri>' lines" 385 print " addrecord <service> <sitename> <uri>" 386 print " Add to local service <service> a record mapping <sitename> to <uri>" 387 print " delrecord <service> <sitename>" 388 print " Remove from local service <service> the record for name <name>" 389 print " lookup <name>" 390 print " look up <name>, and print its target uri" 391 print 392 print "Environment:" 393 print " Instead of specifying -H and/or -P, you can define the environment" 394 print " variables FCP_HOST and/or FCP_PORT respectively" 395 396 sys.exit(0)
397 398 #@-node:help 399 #@+node:main
400 -def main():
401 """ 402 Front end for fcpget utility 403 """ 404 # default job options 405 verbosity = node.ERROR 406 verbose = False 407 fcpHost = node.defaultFCPHost 408 fcpPort = node.defaultFCPPort 409 mimetype = None 410 cfgfile = None 411 412 opts = { 413 "Verbosity" : 0, 414 } 415 416 # process command line switches 417 try: 418 cmdopts, args = getopt.getopt( 419 sys.argv[1:], 420 "?hvH:P:Vc:", 421 ["help", "verbose", "fcpHost=", "fcpPort=", "version", 422 "config-file=", 423 ] 424 ) 425 except getopt.GetoptError: 426 # print help information and exit: 427 usage() 428 sys.exit(2) 429 output = None 430 verbose = False 431 #print cmdopts 432 for o, a in cmdopts: 433 434 if o in ("-?", "-h", "--help"): 435 help() 436 437 if o in ("-V", "--version"): 438 print "This is %s, version %s" % (progname, node.fcpVersion) 439 sys.exit(0) 440 441 if o in ("-c", "--config-file"): 442 cfgfile = a 443 444 if o in ("-v", "--verbosity"): 445 verbosity = node.DETAIL 446 opts['Verbosity'] = 1023 447 verbose = True 448 449 if o in ("-H", "--fcpHost"): 450 fcpHost = a 451 452 if o in ("-P", "--fcpPort"): 453 try: 454 fcpPort = int(a) 455 except: 456 usage("Invalid fcpPort argument %s" % repr(a)) 457 458 # try to create the node 459 try: 460 n = node.FCPNode(host=fcpHost, port=fcpPort, verbosity=verbosity, 461 logfile=sys.stderr, 462 namesitefile=cfgfile) 463 except: 464 if verbose: 465 traceback.print_exc(file=sys.stderr) 466 usage("Failed to connect to FCP service at %s:%s" % (fcpHost, fcpPort)) 467 468 if len(args) < 1: 469 usage("No command specified") 470 471 mgr = NamesMgr(n) 472 res = mgr.execute(*args) 473 474 n.shutdown() 475 if res: 476 sys.exit(1) 477 else: 478 sys.exit(0)
479 480 #@-node:main 481 #@-others 482 483 #@-node:@file names.py 484 #@-leo 485