def dashboard(self): from procfs_reader import entries, proc_uptime, disk_free, git_hash from grp import getgrall, getgrnam kb_free = dict(entries('', 'meminfo'))['MemFree'] mb_free = str(round(float(kb_free.split()[0])/1000, 2)) try: mc.has_ownership(self.login, os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config')) except (OSError, KeyError): profile_editable = False else: profile_editable = True return dumps({ 'uptime': str(proc_uptime()[0]), 'memfree': mb_free, 'whoami': self.login, 'group': getgrnam(self.login).gr_name, 'df': dict(disk_free('/')._asdict()), 'groups': [i.gr_name for i in getgrall() if self.login in i.gr_mem or \ self.login in [i.gr_name, 'root']], 'pc_permissions': profile_editable, 'git_hash': git_hash(os.path.dirname(os.path.abspath(__file__))) })
def dashboard(self): from procfs_reader import entries, proc_uptime, disk_free, git_hash from grp import getgrall, getgrgid from pwd import getpwnam from stock_profiles import STOCK_PROFILES kb_free = dict(entries('', 'meminfo'))['MemFree'] mb_free = str(round(float(kb_free.split()[0])/1000, 2)) try: pc_path = os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config') mc.has_ownership(self.login, pc_path) except (OSError, KeyError): profile_editable = False else: profile_editable = True finally: st = os.stat(pc_path) pc_group = getgrgid(st.st_gid).gr_name primary_group = getgrgid(getpwnam(self.login).pw_gid).gr_name return { 'uptime': int(proc_uptime()[0]), 'memfree': mb_free, 'whoami': self.login, 'group': primary_group, 'df': dict(disk_free('/')._asdict()), 'groups': [i.gr_name for i in getgrall() if self.login in i.gr_mem or self.login == 'root'] + [primary_group], 'pc_permissions': profile_editable, 'pc_group': pc_group, 'git_hash': git_hash(os.path.dirname(os.path.abspath(__file__))), 'stock_profiles': [i['name'] for i in STOCK_PROFILES], 'base_directory': self.base_directory, }
def dashboard(self): from procfs_reader import entries, proc_uptime, disk_free, git_hash from grp import getgrall, getgrgid from pwd import getpwnam from stock_profiles import STOCK_PROFILES kb_free = dict(entries('', 'meminfo'))['MemFree'] mb_free = str(round(float(kb_free.split()[0])/1000, 2)) try: pc_path = os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config') mc.has_ownership(self.login, pc_path) except (OSError, KeyError): profile_editable = False else: profile_editable = True finally: st = os.stat(pc_path) pc_group = getgrgid(st.st_gid).gr_name primary_group = getgrgid(getpwnam(self.login).pw_gid).gr_name return { 'uptime': int(proc_uptime()[0]), 'memfree': mb_free, 'whoami': self.login, 'group': primary_group, 'df': dict(disk_free(cherrypy.config['misc.base_directory'])._asdict()), 'groups': [i.gr_name for i in getgrall() if self.login in i.gr_mem or self.login == 'root'] + [primary_group], 'pc_permissions': profile_editable, 'pc_group': pc_group, 'git_hash': git_hash(os.path.dirname(os.path.abspath(__file__))), 'stock_profiles': [i['name'] for i in STOCK_PROFILES], 'base_directory': self.base_directory, }
def host(self, **raw_args): args = {k: str(v) for k, v in raw_args.iteritems()} command = args.pop('cmd') retval = None response = {'result': None, 'cmd': command, 'payload': None} try: if command == 'define_profile': mc.has_ownership( self.login, os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config')) from json import loads from urllib import unquote definition_unicode = loads(args['profile_dict']) definition = { str(k): str(v) for k, v in definition_unicode.iteritems() } try: definition['url'] = unquote(definition['url']) except KeyError: pass if definition['name'] in mc.list_profiles( self.base_directory).keys(): raise KeyError('Profiles may not be modified once created') instance = mc('throwaway', None, self.base_directory) retval = instance.define_profile(definition) elif command == 'update_profile': mc.has_ownership( self.login, os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config')) instance = mc('throwaway', None, self.base_directory) retval = instance.update_profile(**args) elif command == 'remove_profile': for i in mc.list_servers(self.base_directory): if mc(i, None, self.base_directory).profile == args['profile']: raise KeyError( 'May not remove profiles in use by 1 or more servers' ) instance = mc('throwaway', None, self.base_directory) retval = instance.remove_profile(**args) elif command == 'stock_profile': from stock_profiles import STOCK_PROFILES profile = iter([ i for i in STOCK_PROFILES if i['name'] == args['profile'] ]).next() mc('throwaway', None, self.base_directory).define_profile(profile) retval = '%s profile created' % profile['name'] elif command == 'modify_profile': mc('throwaway', None, self.base_directory).modify_profile(args['option'], args['value'], args['section']) retval = '%s profile updated' % args['section'] elif command in self.METHODS: import inspect try: if 'base_directory' in inspect.getargspec( getattr(mc, command)).args: retval = getattr(mc, command)( base_directory=init_args['base_directory'], **args) else: retval = getattr(mc, command)(**args) except TypeError as ex: raise RuntimeError(ex.message) else: raise RuntimeWarning( 'Command not found: should this be to a server?') except (RuntimeError, KeyError, OSError, NotImplementedError) as ex: response['result'] = 'error' retval = ex.message except CalledProcessError as ex: response['result'] = 'error' retval = ex.output except RuntimeWarning as ex: response['result'] = 'warning' retval = ex.message else: response['result'] = 'success' response['payload'] = to_jsonable_type(retval) return response
def host(self, **raw_args): args = {k:str(v) for k,v in raw_args.iteritems()} command = args.pop('cmd') retval = None response = { 'result': None, 'cmd': command, 'payload': None } try: if command == 'define_profile': mc.has_ownership(self.login, os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config')) from json import loads from urllib import unquote definition_unicode = loads(args['profile_dict']) definition = {str(k):str(v) for k,v in definition_unicode.iteritems()} try: definition['url'] = unquote(definition['url']) except KeyError: pass if definition['name'] in mc.list_profiles(self.base_directory).keys(): raise KeyError('Profiles may not be modified once created') instance = mc('throwaway', None, self.base_directory) retval = instance.define_profile(definition) elif command == 'update_profile': mc.has_ownership(self.login, os.path.join(self.base_directory, mc.DEFAULT_PATHS['profiles'], 'profile.config')) instance = mc('throwaway', None, self.base_directory) retval = instance.update_profile(**args) elif command == 'remove_profile': for i in mc.list_servers(self.base_directory): if mc(i, None, self.base_directory).profile == args['profile']: raise KeyError('May not remove profiles in use by 1 or more servers') instance = mc('throwaway', None, self.base_directory) retval = instance.remove_profile(**args) elif command == 'stock_profile': from stock_profiles import STOCK_PROFILES profile = iter([i for i in STOCK_PROFILES if i['name'] == args['profile']]).next() mc('throwaway', None, self.base_directory).define_profile(profile) retval = '%s profile created' % profile['name'] elif command == 'modify_profile': mc('throwaway', None, self.base_directory).modify_profile(args['option'],args['value'],args['section']) retval = '%s profile updated' % args['section'] elif command in self.METHODS: import inspect try: if 'base_directory' in inspect.getargspec(getattr(mc, command)).args: retval = getattr(mc, command)(base_directory=init_args['base_directory'], **args) else: retval = getattr(mc, command)(**args) except TypeError as ex: raise RuntimeError(ex.message) else: raise RuntimeWarning('Command not found: should this be to a server?') except (RuntimeError, KeyError, OSError, NotImplementedError) as ex: response['result'] = 'error' retval = ex.message except CalledProcessError as ex: response['result'] = 'error' retval = ex.output except RuntimeWarning as ex: response['result'] = 'warning' retval = ex.message else: response['result'] = 'success' response['payload'] = to_jsonable_type(retval) return response