def restart_server(self, force_start=True): # signal the controller on this metadata server's host to restart this metadata server. # the state of the server (running/stopped) should not change, except on error server = self.api.connect_mdctl(self['host']) import SMDS.user # get our users user_ids = self['user_ids'] users = [] if user_ids: users = SMDS.user.Users(self.api, user_ids) logger.info("Restarting metadata server '%s' with users '%s'" % (self['name'], [user['username'] for user in users])) rc = 0 try: as_dict = {} as_dict.update(self) user_dicts = [] for user in users: user_dict = {} user_dict.update(user) user_dicts.append(user_dict) rc = server.restart_server(as_dict, user_dicts, force_start) except Exception, e: logger.exception(e, "Could not restart metadata server") rc = -500 self['status'] = 'stopped' self.sync()
def navbar(self, prefix='Welcome', action=None): """ Create a pretty navigation bar """ try: user = None session = current.session if session.auth: user = session.auth['user'] request = current.request T = current.T if isinstance(prefix, str): prefix = T(prefix) if not action: action = URL(request.application, request.controller, 'user') if prefix: prefix = prefix.strip() + ' ' if user: logout = A(T('logout'), _href=action + '/logout') profile = A(T('profile'), _href=action + '/profile') password = A(T('password'), _href=action + '/change_password') bar = SPAN(prefix, user['username'], ' [ ', logout, ']', _class='auth_navbar') if not 'profile' in self.settings.actions_disabled: bar.insert(4, ' | ') bar.insert(5, profile) if not 'change_password' in self.settings.actions_disabled: bar.insert(-1, ' | ') bar.insert(-1, password) else: login = A(T('login'), _href=action + '/login') register = A(T('register'), _href=action + '/register') retrieve_username = A(T('forgot username?'), _href=action + '/retrieve_username') lost_password = A(T('lost password?'), _href=action + '/request_reset_password') bar = SPAN('[ ', login, ' ]', _class='auth_navbar') if not 'register' in self.settings.actions_disabled: bar.insert(2, ' | ') bar.insert(3, register) if 'username' in User.public_fieldnames and not 'retrieve_username' in self.settings.actions_disabled: bar.insert(-1, ' | ') bar.insert(-1, retrieve_username) if not 'request_reset_password' in self.settings.actions_disabled: bar.insert(-1, ' | ') bar.insert(-1, lost_password) return bar except Exception, e: logger.exception(e, "Navbar error") logger.flush()
def create_server(self): # signal the controller on this metadata server's host to create this server self['status'] = 'stopped' server = self.api.connect_mdctl(self['host']) import SMDS.user # get our users if self.get('user_ids') == None: self['user_ids'] = [] user_ids = self['user_ids'] users = [] if user_ids: users = SMDS.user.Users(self.api, user_ids) logger.info("Creating metadata server '%s' with users '%s'" % (self['name'], [user['username'] for user in users])) rc = 0 try: as_dict = {} as_dict.update(self) user_dicts = [] for user in users: user_dict = {} user_dict.update(user) user_dicts.append(user_dict) rc = server.create_server(as_dict, user_dicts) except Exception, e: logger.exception(e, "Could not restart metadata server") rc = -500
def create_server(self): # signal the controller on this metadata server's host to create this server self['status'] = 'stopped' server = self.api.connect_mdctl( self['host'] ) import SMDS.user # get our users if self.get('user_ids') == None: self['user_ids'] = [] user_ids = self['user_ids'] users = [] if user_ids: users = SMDS.user.Users( self.api, user_ids ) logger.info("Creating metadata server '%s' with users '%s'" % (self['name'], [user['username'] for user in users])) rc = 0 try: as_dict = {} as_dict.update( self ) user_dicts = [] for user in users: user_dict = {} user_dict.update( user ) user_dicts.append( user_dict ) rc = server.create_server( as_dict, user_dicts ) except Exception, e: logger.exception( e, "Could not restart metadata server") rc = -500
def restart_server(self, force_start=True ): # signal the controller on this metadata server's host to restart this metadata server. # the state of the server (running/stopped) should not change, except on error server = self.api.connect_mdctl( self['host'] ) import SMDS.user # get our users user_ids = self['user_ids'] users = [] if user_ids: users = SMDS.user.Users( self.api, user_ids ) logger.info("Restarting metadata server '%s' with users '%s'" % (self['name'], [user['username'] for user in users])) rc = 0 try: as_dict = {} as_dict.update( self ) user_dicts = [] for user in users: user_dict = {} user_dict.update( user ) user_dicts.append( user_dict ) rc = server.restart_server( as_dict, user_dicts, force_start ) except Exception, e: logger.exception( e, "Could not restart metadata server") rc = -500 self['status'] = 'stopped' self.sync()
def add_content(self, user, content_url): content_info = { "url": content_url, "enabled": True, "description": "Created by SMDS", "content_provider_id": self.content_provider['content_provider_id'] } rc = None try: # try the new API (works with CoSFA) rc = self.cdn_api.Create(self.CDN_auth, "Content", content_info) except Exception, e: traceback.print_exc() # possibly using the old API try: logger.warn( "VerivueCoBlitz(add_content): new API failed; trying old API" ) rc = self.cdn_api.AddContent( self.CDN_auth, content_info['content_provider_id'], content_info) except Exception, e2: logger.exception( e2, "VerivueCoBlitz(add_content): could not add content '%s'" % content_url)
def navbar(self,prefix='Welcome',action=None): """ Create a pretty navigation bar """ try: user = None session = current.session if session.auth: user = session.auth['user'] request = current.request T = current.T if isinstance(prefix,str): prefix = T(prefix) if not action: action=URL(request.application,request.controller,'user') if prefix: prefix = prefix.strip()+' ' if user: logout=A(T('logout'),_href=action+'/logout') profile=A(T('profile'),_href=action+'/profile') password=A(T('password'),_href=action+'/change_password') bar = SPAN(prefix, user['username'],' [ ', logout, ']',_class='auth_navbar') if not 'profile' in self.settings.actions_disabled: bar.insert(4, ' | ') bar.insert(5, profile) if not 'change_password' in self.settings.actions_disabled: bar.insert(-1, ' | ') bar.insert(-1, password) else: login=A(T('login'),_href=action+'/login') register=A(T('register'),_href=action+'/register') retrieve_username=A(T('forgot username?'), _href=action+'/retrieve_username') lost_password=A(T('lost password?'), _href=action+'/request_reset_password') bar = SPAN('[ ',login,' ]',_class='auth_navbar') if not 'register' in self.settings.actions_disabled: bar.insert(2, ' | ') bar.insert(3, register) if 'username' in User.public_fieldnames and not 'retrieve_username' in self.settings.actions_disabled: bar.insert(-1, ' | ') bar.insert(-1, retrieve_username) if not 'request_reset_password' in self.settings.actions_disabled: bar.insert(-1, ' | ') bar.insert(-1, lost_password) return bar except Exception, e: logger.exception(e, "Navbar error") logger.flush()
def read_config( config_file, required_attrs=None ): """ Read the configuration, and assert that every required attribute is present. """ try: fd = open( config_file, "r" ) except Exception, e: logger.exception( e, "Could not open %s" % config_file ) return None
def read_config(config_file, required_attrs=None): """ Read the configuration, and assert that every required attribute is present. """ try: fd = open(config_file, "r") except Exception, e: logger.exception(e, "Could not open %s" % config_file) return None
def get_contents( self, filter_=None, ret=None ): content = None try: # try the new API (works with CoSFA) content = self.cdn_api.ListAll( self.CDN_auth, "Content", filter_, ret ) except Exception, e: # possibly using the old API try: logger.warn("VerivueCoBlitz: new API failed; trying old API") content = self.cdn_api.GetContents( self.CDN_auth, filter_, ret ) except Exception, e: logger.exception( e, "Could not get content")
def execute(self, query, params = None): cursor = self.cursor() try: # psycopg2 requires %()s format for all parameters, # regardless of type. # this needs to be done carefully though as with pattern-based filters # we might have percents embedded in the query # so e.g. GetPersons({'email':'*fake*'}) was resulting in .. LIKE '%sake%' if psycopg2: query = re.sub(r'(%\([^)]*\)|%)[df]', r'\1s', query) # rewrite wildcards set by Filter.py as '***' into '%' query = query.replace ('***','%') if not params: if self.debug: print >> log,'execute0',query cursor.execute(query) elif isinstance(params,dict): if self.debug: print >> log,'execute-dict: params',params,'query',query%params cursor.execute(query,params) elif isinstance(params,tuple) and len(params)==1: if self.debug: print >> log,'execute-tuple',query%params[0] cursor.execute(query,params[0]) else: param_seq=(params,) if self.debug: for params in param_seq: print >> log,'executemany',query%params cursor.executemany(query, param_seq) (self.rowcount, self.description, self.lastrowid) = \ (cursor.rowcount, cursor.description, cursor.lastrowid) except Exception, e: try: self.rollback() except: pass uuid = commands.getoutput("uuidgen") log.exception( e, "Database error %s:" % uuid ) log.error( "Failed Query:" ) log.error( query ) log.error( "Failed Params:" ) log.error( pformat(params) ) raise MDDBError("Please contact " + \ self.api.config.MD_NAME + " Support " + \ "<" + self.api.config.MD_MAIL_SUPPORT_ADDRESS + ">" + \ " and reference " + uuid)
def get_contents(self, filter_=None, ret=None): content = None try: # try the new API (works with CoSFA) content = self.cdn_api.ListAll(self.CDN_auth, "Content", filter_, ret) except Exception, e: # possibly using the old API try: logger.warn("VerivueCoBlitz: new API failed; trying old API") content = self.cdn_api.GetContents(self.CDN_auth, filter_, ret) except Exception, e: logger.exception(e, "Could not get content")
def rm_content( self, content_id ): rc = None try: # try the new API (works with CoSFA) rc = self.cdn_api.Delete( self.CDN_auth, "Content", content_id ) except Exception, e: traceback.print_exc() # possibly using the old API try: logger.warn("VerivueCoBlitz(rm_contet): new API failed; trying old API") rc = self.cdn_api.DeleteContent( self.CDN_auth, content_id ) except Exception, e2: logger.exception( e2, "VerivueCoBlitz(rm_content): could not remove content '%s'" % content_id )
def destroy_server(self): # signal the controller on this metadata server's host to destroy this server self['status'] = 'stopped' server = self.api.connect_mdctl(self['host']) logger.info("Destroying metadata server '%s'" % self['name']) rc = 0 try: as_dict = {} as_dict.update(self) rc = server.destroy_server(as_dict) except Exception, e: logger.exception(e, "Could not restart metadata server") rc = -500
def destroy_server(self): # signal the controller on this metadata server's host to destroy this server self['status'] = 'stopped' server = self.api.connect_mdctl( self['host'] ) logger.info("Destroying metadata server '%s'" % self['name']) rc = 0 try: as_dict = {} as_dict.update( self ) rc = server.destroy_server( as_dict ) except Exception, e: logger.exception( e, "Could not restart metadata server") rc = -500
def start_server(self): # signal the controller on this metadata server's host to start this metadata server old_status = self['status'] self['status'] = 'running' server = self.api.connect_mdctl(self['host']) logger.info("Starting metadata server '%s'" % self['name']) ret = None try: as_dict = {} as_dict.update(self) ret = server.start_server(as_dict) except Exception, e: logger.exception(e, "Could not start metadata server") ret = None
def start_server(self): # signal the controller on this metadata server's host to start this metadata server old_status = self['status'] self['status'] = 'running' server = self.api.connect_mdctl( self['host'] ) logger.info("Starting metadata server '%s'" % self['name']) ret = None try: as_dict = {} as_dict.update( self ) ret = server.start_server( as_dict ) except Exception, e: logger.exception( e, "Could not start metadata server") ret = None
def setup(self, api): self.api = api self.CDN_auth = { "AuthMethod": "password", "Username": api.config.MD_CDN_USERNAME, "AuthString": api.config.MD_CDN_PASSWORD, } # read the SFA credential, if it exists try: credf = open(api.config.MD_SFA_CREDENTIAL) credstr = credf.read() credf.close() self.CDN_auth["SFA_DelegatedCred"] = credstr except: logger.warn("VerivueCoBlitz: no SFA credential given") rc = None # connect to the CMI self.cdn_api = xmlrpclib.ServerProxy(api.config.MD_CDN_API_URL, allow_none=True) # get our content provider struct try: self.content_provider = self.cdn_api.Read( self.CDN_auth, "ContentProvider", api.config.MD_CONTENT_PROVIDER)[0] rc = 1 except Exception, e: try: logger.warn( "VerivueCoBlitz(setup): new API failed; trying old API") self.content_provider = self.cdn_api.GetContentProviders( self.CDN_auth, {'account': api.config.MD_CONTENT_PROVIDER})[0] rc = 1 except Exception, e2: logger.exception( e2, "VerivueCoBlitz(setup): could not look up SMDS CDN content provider account '%s'" % api.config.MD_CONTENT_PROVIDER) rc = None
def rm_content(self, content_id): rc = None try: # try the new API (works with CoSFA) rc = self.cdn_api.Delete(self.CDN_auth, "Content", content_id) except Exception, e: traceback.print_exc() # possibly using the old API try: logger.warn( "VerivueCoBlitz(rm_contet): new API failed; trying old API" ) rc = self.cdn_api.DeleteContent(self.CDN_auth, content_id) except Exception, e2: logger.exception( e2, "VerivueCoBlitz(rm_content): could not remove content '%s'" % content_id)
def add_content( self, user, content_url ): content_info = { "url": content_url, "enabled": True, "description": "Created by SMDS", "content_provider_id": self.content_provider['content_provider_id'] } rc = None try: # try the new API (works with CoSFA) rc = self.cdn_api.Create( self.CDN_auth, "Content", content_info ) except Exception, e: traceback.print_exc() # possibly using the old API try: logger.warn("VerivueCoBlitz(add_content): new API failed; trying old API") rc = self.cdn_api.AddContent( self.CDN_auth, content_info['content_provider_id'], content_info ) except Exception, e2: logger.exception( e2, "VerivueCoBlitz(add_content): could not add content '%s'" % content_url )
def stop_server(self): # signal the controller on this metadata server's host to stop this metadata server old_status = self['status'] self['status'] = 'stopped' server = self.api.connect_mdctl( self['host'] ) logger.info("Stopping metadata server '%s'" % self['name']) rc = 0 try: as_dict = {} as_dict.update( self ) rc = server.stop_server( as_dict ) if rc == 0: logger.warn( "Server '%s' was not running" % self['name']) rc = 1 # it's OK if it wasn't running except Exception, e: logger.exception( e, "Could not stop metadata server") rc = -500;
def stop_server(self): # signal the controller on this metadata server's host to stop this metadata server old_status = self['status'] self['status'] = 'stopped' server = self.api.connect_mdctl(self['host']) logger.info("Stopping metadata server '%s'" % self['name']) rc = 0 try: as_dict = {} as_dict.update(self) rc = server.stop_server(as_dict) if rc == 0: logger.warn("Server '%s' was not running" % self['name']) rc = 1 # it's OK if it wasn't running except Exception, e: logger.exception(e, "Could not stop metadata server") rc = -500
def __call__(self, *args, **kwds): """ Main entry point for all MDAPI functions. Type checks arguments, authenticates, and executes call(). """ try: start = time.time() (min_args, max_args, defaults) = self.args() # Check that the right number of arguments were passed in if len(args) < len(min_args) or len(args) > len(max_args): raise MDInvalidArgumentCount(len(args), len(min_args), len(max_args)) for name, value, expected in zip(max_args, args, self.accepts): self.type_check(name, value, expected, args) result = self.call(*args, **kwds) runtime = time.time() - start return result except MDException, fault: if self.caller: caller = 'uid %s' % self.caller.get('user_id') else: caller = '(unknown)' # Prepend caller and method name to expected faults fault.faultString = caller + ": " + self.name + ": " + fault.faultString runtime = time.time() - start logger.exception(fault, "%s: %s" % (caller, str(args))) raise fault
def __call__(self, *args, **kwds): """ Main entry point for all MDAPI functions. Type checks arguments, authenticates, and executes call(). """ try: start = time.time() (min_args, max_args, defaults) = self.args() # Check that the right number of arguments were passed in if len(args) < len(min_args) or len(args) > len(max_args): raise MDInvalidArgumentCount(len(args), len(min_args), len(max_args)) for name, value, expected in zip(max_args, args, self.accepts): self.type_check(name, value, expected, args) result = self.call(*args, **kwds) runtime = time.time() - start return result except MDException, fault: if self.caller: caller = 'uid %s' % self.caller.get('user_id') else: caller = '(unknown)' # Prepend caller and method name to expected faults fault.faultString = caller + ": " + self.name + ": " + fault.faultString runtime = time.time() - start logger.exception( fault, "%s: %s" % (caller, str(args)) ) raise fault
def setup(self, api): self.api = api self.CDN_auth = { "AuthMethod": "password", "Username": api.config.MD_CDN_USERNAME, "AuthString": api.config.MD_CDN_PASSWORD, } # read the SFA credential, if it exists try: credf = open(api.config.MD_SFA_CREDENTIAL) credstr = credf.read() credf.close() self.CDN_auth["SFA_DelegatedCred"] = credstr except: logger.warn("VerivueCoBlitz: no SFA credential given") rc = None # connect to the CMI self.cdn_api = xmlrpclib.ServerProxy( api.config.MD_CDN_API_URL, allow_none = True ) # get our content provider struct try: self.content_provider = self.cdn_api.Read( self.CDN_auth, "ContentProvider", api.config.MD_CONTENT_PROVIDER )[0] rc = 1 except Exception, e: try: logger.warn("VerivueCoBlitz(setup): new API failed; trying old API") self.content_provider = self.cdn_api.GetContentProviders( self.CDN_auth, {'account': api.config.MD_CONTENT_PROVIDER} )[0] rc = 1 except Exception, e2: logger.exception(e2, "VerivueCoBlitz(setup): could not look up SMDS CDN content provider account '%s'" % api.config.MD_CONTENT_PROVIDER ) rc = None
def register(self, next=DEFAULT, onvalidation=DEFAULT, onaccept=DEFAULT, log=DEFAULT): """ Register a new user """ request = current.request response = current.response session = current.session if self.is_logged_in(): # don't allow registration if we're already logged in redirect(self.settings.logged_url) # fill in defaults if next == DEFAULT: next = request.get_vars._next \ or request.post_vars._next \ or self.settings.register_next if onvalidation == DEFAULT: onvalidation = self.settings.register_onvalidation if onaccept == DEFAULT: onaccept = self.settings.register_onaccept if log == DEFAULT: log = self.messages.register_log # create a form... userfield = self.settings.login_userfield passfield = self.settings.password_field formstyle = self.settings.formstyle form =FORM( \ TABLE( \ TR(TD('Username:'******'Email:'), TD(INPUT(_name="email", _type="text",requires=IS_EMAIL(error_message=self.messages.invalid_email)))), \ TR(TD('Password:'******'Re-type Password:'******'password',None))), \ error_message=self.settings.mismatched_password))) \ ), \ INPUT(_type="Submit",_value="Register"), \ _name="register" ) if form.accepts(request, session, formname='register', onvalidation=onvalidation,hideerror=self.settings.hideerror): # verify that the password forms are the same if form.vars['password'] != form.vars['password2']: response.flash = messages.mismatched_password # inform the admin """ if not self.settings.mailer or \ not self.settings.mailer.send( to=self.maint_email, subject=self.messages.verify_email_subject, message=self.messages.verify_email % dict(username=form.vars['username'], email=form.vars['email'])): response.flash = self.messages.unable_send_email return form session.flash = self.messages.email_sent """ # make sure this user does not exist rc = 0 msg = "" try: user = Users(self.api, {'username': form.vars['username']})[0] rc = -1 # already exists msg = "User already exists" except: pass # create the user if rc == 0: try: user_fields = {'username': form.vars['username'], 'password': form.vars['password'], 'email': form.vars['email']} rc = self.api.call( ("127.0.0.1", "localhost"), "AddUser", self.api.maint_auth, user_fields ) except Exception, e: logger.exception(e, "register: exception") logger.flush() msg = "User could not be registered" rc = -1 if rc < 0: response.flash = msg logger.error("Failed to add user '%s' (email '%s')" % (user_fields['username'], user_fields['email']) ) return form session.flash = self.messages.registration_pending if log: logger.info("Added user '%s' (email '%s')" % (user_fields['username'], user_fields['email']) ) callback(onaccept,form) if not next: next = self.url(args = request.args) elif isinstance(next, (list, tuple)): ### fix issue with 2.6 next = next[0] elif next and not next[0] == '/' and next[:4] != 'http': next = self.url(next.replace('[id]', str(form.vars.id))) redirect(next)
def register(self, next=DEFAULT, onvalidation=DEFAULT, onaccept=DEFAULT, log=DEFAULT): """ Register a new user """ request = current.request response = current.response session = current.session if self.is_logged_in(): # don't allow registration if we're already logged in redirect(self.settings.logged_url) # fill in defaults if next == DEFAULT: next = request.get_vars._next \ or request.post_vars._next \ or self.settings.register_next if onvalidation == DEFAULT: onvalidation = self.settings.register_onvalidation if onaccept == DEFAULT: onaccept = self.settings.register_onaccept if log == DEFAULT: log = self.messages.register_log # create a form... userfield = self.settings.login_userfield passfield = self.settings.password_field formstyle = self.settings.formstyle form =FORM( \ TABLE( \ TR(TD('Username:'******'Email:'), TD(INPUT(_name="email", _type="text",requires=IS_EMAIL(error_message=self.messages.invalid_email)))), \ TR(TD('Password:'******'Re-type Password:'******'password',None))), \ error_message=self.settings.mismatched_password))) \ ), \ INPUT(_type="Submit",_value="Register"), \ _name="register" ) if form.accepts(request, session, formname='register', onvalidation=onvalidation, hideerror=self.settings.hideerror): # verify that the password forms are the same if form.vars['password'] != form.vars['password2']: response.flash = messages.mismatched_password # inform the admin """ if not self.settings.mailer or \ not self.settings.mailer.send( to=self.maint_email, subject=self.messages.verify_email_subject, message=self.messages.verify_email % dict(username=form.vars['username'], email=form.vars['email'])): response.flash = self.messages.unable_send_email return form session.flash = self.messages.email_sent """ # make sure this user does not exist rc = 0 msg = "" try: user = Users(self.api, {'username': form.vars['username']})[0] rc = -1 # already exists msg = "User already exists" except: pass # create the user if rc == 0: try: user_fields = { 'username': form.vars['username'], 'password': form.vars['password'], 'email': form.vars['email'] } rc = self.api.call(("127.0.0.1", "localhost"), "AddUser", self.api.maint_auth, user_fields) except Exception, e: logger.exception(e, "register: exception") logger.flush() msg = "User could not be registered" rc = -1 if rc < 0: response.flash = msg logger.error("Failed to add user '%s' (email '%s')" % (user_fields['username'], user_fields['email'])) return form session.flash = self.messages.registration_pending if log: logger.info("Added user '%s' (email '%s')" % (user_fields['username'], user_fields['email'])) callback(onaccept, form) if not next: next = self.url(args=request.args) elif isinstance(next, (list, tuple)): ### fix issue with 2.6 next = next[0] elif next and not next[0] == '/' and next[:4] != 'http': next = self.url(next.replace('[id]', str(form.vars.id))) redirect(next)