import webnotes import webnotes.utils class FrameworkServer: """ Connect to a remote server via HTTP (webservice). * `remote_host` is the the address of the remote server * `path` is the path of the Framework (excluding index.cgi) """ def __init__(self, remote_host, path, user='', password='', account='', cookies=None, opts=None, https = 0): # validate if not (remote_host and path): raise Exception, "Server address and path necessary" if not ((user and password) or (cookies)): raise Exception, "Either cookies or user/password necessary" self.remote_host = remote_host self.path = path self.cookies = cookies or {} self.webservice_method='POST' self.account = account self.account_id = None self.https = https self.conn = None # login if not cookies: args = { 'usr': user, 'pwd': password, 'acx': account } if opts: args.update(opts) res = self.http_get_response('login', args) ret = res.read() try: ret = eval(ret) except Exception, e: webnotes.msgprint(ret) raise Exception, e if 'message' in ret and ret['message']!='Logged In': webnotes.msgprint(ret.get('server_messages'), raise_exception=1) if ret.get('exc'): raise Exception, ret.get('exc') self._extract_cookies(res) self.account_id = self.cookies.get('account_id') self.sid = self.cookies.get('sid') self.login_response = res self.login_return = ret # ----------------------------------------------------------------------------------------- def http_get_response(self, method, args): """ Run a method on the remote server, with the given arguments """ # get response from remote server import urllib, urllib2, os args['cmd'] = method if self.path.startswith('/'): self.path = self.path[1:] protocol = self.https and 'https://' or 'http://' req = urllib2.Request(protocol + os.path.join(self.remote_host, self.path, 'index.cgi'), urllib.urlencode(args)) for key in self.cookies: req.add_header('cookie', '; '.join(['%s=%s' % (key, self.cookies[key]) for key in self.cookies])) return urllib2.urlopen(req) # ----------------------------------------------------------------------------------------- def _extract_cookies(self, res): import Cookie cookies = Cookie.SimpleCookie() cookies.load(res.headers.get('set-cookie')) for c in cookies.values(): self.cookies[c.key] = c.value.rstrip(',') # ----------------------------------------------------------------------------------------- def runserverobj(self, doctype, docname, method, arg=''): """ Returns the response of a remote method called on a system object specified by `doctype` and `docname` """ import json res = self.http_get_response('runserverobj', args = { 'doctype':doctype ,'docname':docname ,'method':method ,'arg':arg }) ret = json.loads(res.read()) if ret.get('exc'): raise Exception, ret.get('exc') return ret # ----------------------------------------------------------------------------------------- def run_method(self, method, args={}): """ Run a method on the remote server """ res = self.http_get_response(method, args).read() import json try: ret = json.loads(res) except Exception, e: webnotes.msgprint('Bad Response: ' + res, raise_exception=1) if ret.get('exc'): raise Exception, ret.get('exc') return ret