#! /usr/bin/env python # This server code is nearly the same as server.py from the agent example. # except for the path insert because it has to look 1 dir higher, # the fact that it enables PYRO_MOBILE_CODE, # and that it sets a codeValidator for our Pyro object. # NOTE that there is no ShoppingAgent module available here!!! # It will be downloaded from the client. import sys, os import Pyro.core sys.path.insert(0,os.path.join(os.pardir,os.pardir)) # to find testserver.py import testserver import shop Pyro.config.PYRO_MOBILE_CODE=1 # Enable mobile code s1=shop.Shop("Fry's") s1.setStock( { 'tv':2000, 'computer':3000, 'mouse':10, 'cd': 19 } ) s2=shop.Shop("Fred's groceries") s2.setStock( { 'apples':5, 'tomatoes':9, 'bananas':4, 'spices': 3 } ) s3=shop.Shop("Rockport store") s3.setStock( { 'shoes':150, 'boots':190 } ) s4=shop.Shop("Snow world") s4.setStock( { 'snowboard':400, 'bindings': 150, 'goggles':80, 'wax':12 } ) # start the mall. We cannot start the testserver in delegation mode # directly because we have to call setCodeValidator from the core.ObjBase! # So create a subclass from ObjBase and our Mall. class MallObj(Pyro.core.ObjBase, shop.Mall): def __init__(self): Pyro.core.ObjBase.__init__(self) shop.Mall.__init__(self) mall=MallObj() mall.addShop(s1) mall.addShop(s2) mall.addShop(s3) mall.addShop(s4) def codeValidator(n,m,a): # This codevalidator only accepts ShoppingAgent uploads # and object.* downloads. # As an example, to accept all modules in the agent package: # change it to return n.startswith('agent.') if m and a: return n=='agent.ShoppingAgent' # client uploads to us else: return n.startswith("objects.") # client downloads from us # set a custom codeValidator because the default validator # will accept ALL incoming code (HAZARDOUS). mall.setCodeValidator(codeValidator) # finally, start the server. testserver.start(mall,'ShoppingMall')