Beginning Python - From Novice to Professional
Beginning Python - From Novice to Professional Beginning Python - From Novice to Professional
CHAPTER 27 ■ PROJECT 8: FILE SHARING WITH XML-RPC 513 def hello(self, other): """ Used to introduce the Node to other Nodes. """ self.known.add(other) return 0 def fetch(self, query, secret): """ Used to make the Node find a file and download it. """ if secret != self.secret: raise AccessDenied result = self.query(query) f = open(join(self.dirname, query), 'w') f.write(result) f.close() return 0 def _start(self): """ Used internally to start the XML-RPC server. """ s = SimpleXMLRPCServer(("", getPort(self.url)), logRequests=False) s.register_instance(self) s.serve_forever() def _handle(self, query): """ Used internally to handle queries. """ dir = self.dirname name = join(dir, query) if not isfile(name): raise UnhandledQuery if not inside(dir, name): raise AccessDenied return open(name).read() def _broadcast(self, query, history): """ Used internally to broadcast a query to all known Nodes. """ for other in self.known.copy(): if other in history: continue try: s = ServerProxy(other) return s.query(query, history)
514 CHAPTER 27 ■ PROJECT 8: FILE SHARING WITH XML-RPC except Fault, f: if f.faultCode == UNHANDLED: pass else: self.known.remove(other) except: self.known.remove(other) raise UnhandledQuery def main(): url, directory, secret = sys.argv[1:] n = Node(url, directory, secret) n._start() if __name__ == '__main__': main() Listing 27-3. A Node Controller Interface (client.py) from xmlrpclib import ServerProxy, Fault from cmd import Cmd from random import choice from string import lowercase from server import Node, UNHANDLED from threading import Thread from time import sleep import sys HEAD_START = 0.1 # Seconds SECRET_LENGTH = 100 def randomString(length): """ Returns a random string of letters with the given length. """ chars = [] letters = lowercase[:26] while length > 0: length -= 1 chars.append(choice(letters)) return ''.join(chars) class Client(Cmd): """ A simple text-based interface to the Node class. """ prompt = '> '
- Page 494 and 495: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 496 and 497: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 498 and 499: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 500 and 501: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 502 and 503: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 504 and 505: CHAPTER 25 ■ ■ ■ Project 6: R
- Page 506 and 507: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 508 and 509: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 510 and 511: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 512: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 515 and 516: 484 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 517 and 518: 486 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 519 and 520: 488 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 521 and 522: 490 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 523 and 524: 492 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 525 and 526: 494 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 527 and 528: 496 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 529 and 530: 498 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 531 and 532: 500 CHAPTER 27 ■ PROJECT 8: FILE
- Page 533 and 534: 502 CHAPTER 27 ■ PROJECT 8: FILE
- Page 535 and 536: 504 CHAPTER 27 ■ PROJECT 8: FILE
- Page 537 and 538: 506 CHAPTER 27 ■ PROJECT 8: FILE
- Page 539 and 540: 508 CHAPTER 27 ■ PROJECT 8: FILE
- Page 541 and 542: 510 CHAPTER 27 ■ PROJECT 8: FILE
- Page 543: 512 CHAPTER 27 ■ PROJECT 8: FILE
- Page 547 and 548: 516 CHAPTER 27 ■ PROJECT 8: FILE
- Page 549 and 550: 518 CHAPTER 28 ■ PROJECT 9: FILE
- Page 551 and 552: 520 CHAPTER 28 ■ PROJECT 9: FILE
- Page 553 and 554: 522 CHAPTER 28 ■ PROJECT 9: FILE
- Page 555 and 556: 524 CHAPTER 28 ■ PROJECT 9: FILE
- Page 558 and 559: CHAPTER 29 ■ ■ ■ Project 10:
- Page 560 and 561: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 562 and 563: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 564 and 565: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 566 and 567: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 568 and 569: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 570 and 571: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 572 and 573: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 574 and 575: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 576 and 577: CHAPTER 29 ■ PROJECT 10: DO-IT-YO
- Page 578 and 579: APPENDIX A ■ ■ ■ The Short Ve
- Page 580 and 581: APPENDIX A ■ THE SHORT VERSION 54
- Page 582 and 583: APPENDIX A ■ THE SHORT VERSION 55
- Page 584 and 585: APPENDIX A ■ THE SHORT VERSION 55
- Page 586: APPENDIX A ■ THE SHORT VERSION 55
- Page 589 and 590: 558 APPENDIX B ■ PYTHON REFERENCE
- Page 591 and 592: 560 APPENDIX B ■ PYTHON REFERENCE
- Page 593 and 594: 562 APPENDIX B ■ PYTHON REFERENCE
514 CHAPTER 27 ■ PROJECT 8: FILE SHARING WITH XML-RPC<br />
except Fault, f:<br />
if f.faultCode == UNHANDLED: pass<br />
else: self.known.remove(other)<br />
except:<br />
self.known.remove(other)<br />
raise UnhandledQuery<br />
def main():<br />
url, direc<strong>to</strong>ry, secret = sys.argv[1:]<br />
n = Node(url, direc<strong>to</strong>ry, secret)<br />
n._start()<br />
if __name__ == '__main__': main()<br />
Listing 27-3. A Node Controller Interface (client.py)<br />
from xmlrpclib import ServerProxy, Fault<br />
from cmd import Cmd<br />
from random import choice<br />
from string import lowercase<br />
from server import Node, UNHANDLED<br />
from threading import Thread<br />
from time import sleep<br />
import sys<br />
HEAD_START = 0.1 # Seconds<br />
SECRET_LENGTH = 100<br />
def randomString(length):<br />
"""<br />
Returns a random string of letters with the given length.<br />
"""<br />
chars = []<br />
letters = lowercase[:26]<br />
while length > 0:<br />
length -= 1<br />
chars.append(choice(letters))<br />
return ''.join(chars)<br />
class Client(Cmd):<br />
"""<br />
A simple text-based interface <strong>to</strong> the Node class.<br />
"""<br />
prompt = '> '