1
2
3 """
4 Perform namesite operations
5 """
6
7
8
9 import sys, os, getopt, traceback, mimetypes, time
10
11 import node
12
13
14
15 progname = sys.argv[0]
16
17
18
20 """
21 """
22
23
24 synonyms = {"addservice" : "newservice",
25 "listservice" : "listservices",
26 }
27
28
29
31 """
32 Create a command interface for names service
33 """
34 self.node = node
35
36
37
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
51
53
54 help()
55 sys.exit(0)
56
57
58
83
84
85
87 """
88 delservice <name>
89
90 Remove local service <name> and deletes its records
91 """
92
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
104
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
113
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
131
133 """
134 addpeer <name> <uri>
135
136 Adds a peer name service
137 """
138
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
150
152 """
153 delpeer <name>
154
155 Remove peer name service <name>
156 """
157
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
169
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
178
180 """
181 addrecord <service> <sitename> <uri>
182
183 Add to local service <service> a record mapping <sitename> to <uri>
184 """
185
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
196
198 """
199 delrecord <service> <sitename>
200
201 Remove from local service <service> the record for name <sitename>
202 """
203
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
214
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
235
236
237 localPrivUri = rec['privuri'] + "/" + domain + "/0"
238
239
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
254
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
284
285
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
306
308 """
309 lookup <name>
310
311 look up <name>, and print its target uri
312 """
313
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
327
328
329
330
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
342
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
399
401 """
402 Front end for fcpget utility
403 """
404
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
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
427 usage()
428 sys.exit(2)
429 output = None
430 verbose = False
431
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
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
481
482
483
484
485