Changeset 189 for cleverbox/trunk

Show
Ignore:
Timestamp:
08/14/07 19:02:31 (5 years ago)
Author:
trivoallan
Message:

cleverbox :

  • added more filesystem helpers
  • implemented environment test case
  • fixed bug occuring when launching commands in non interactive mode
  • implemented better permissions when creating environment
  • fixed bug with default shell answers in project.py
Location:
cleverbox/trunk/cleverbox
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • cleverbox/trunk/cleverbox/environment.py

    r181 r189  
    22import ConfigParser 
    33from pkg_resources import parse_version 
     4from cleverbox.utils import filesystem 
    45 
    56layout = ('clients-available', 'clients-enabled', 
     
    2324        """ 
    2425 
     26        #Parameters sanity check 
     27        try: 
     28           parameters['general']['assets_dir'] 
     29           parameters['general']['apache_group'] 
     30        except KeyError, e: 
     31           raise Exception, "Supplied parameters are not complete." 
     32 
    2533        # Do not do anything if base directories is not empty 
    2634        if (len(os.listdir(self.path))): 
    27             raise IOError, '"%s" directory is not empty' % self.path 
    28  
    29         if (len(os.listdir(parameters['general']['clients_root']))): 
    3035            raise IOError, '"%s" directory is not empty' % self.path 
    3136 
     
    4348            for dirname in layout: 
    4449                env_dirs.append(self.get_path(dirname)) 
    45             map( os.makedirs, env_dirs ) 
     50            map(os.makedirs, env_dirs) 
    4651 
    4752            # Create VERSION file 
    4853            try: 
    49                 print "\n\tCreating VERSION file\n" 
     54                #print "\n\tCreating VERSION file\n" 
    5055                fd = open(self.get_path('VERSION'), 'w') 
    5156                fd.write(version) 
     
    6368            self.config.write(open(self.get_path('cleverbox.ini'), 'w+')) 
    6469 
     70            # Setting permissions 
     71            for entry in os.listdir(self.path): 
     72                entry_path = self.get_path(entry) 
     73                if filesystem.is_file(entry_path): 
     74                    os.chmod(entry_path, 0640) 
     75                else: 
     76                    os.chmod(entry_path, 0750) 
     77           
     78            profile_path = os.path.join(self.get_path('profiles'), 'default') 
     79            os.chmod(profile_path, 0750) 
     80            for entry in os.listdir(profile_path): 
     81                os.chmod(os.path.join(profile_path, entry), 0640) 
     82 
     83            filesystem.chowntree(self.path, 0, filesystem.get_gid_from_name(parameters['general']['apache_group'])) 
     84 
    6585        except Exception, exception: 
    6686            print exception 
    67             print "** Environment couldn't be initialized in %(env_dir)s\n" % {'env_dir' : self.env.path} 
     87            print "** Environment couldn't be initialized in %(env_dir)s\n" % {'env_dir' : self.path} 
    6888            print "Rolling back changes" 
    6989            for entry in os.listdir(self.path): 
    7090                path = os.path.join(self.path, entry) 
    71                 stats = os.stat(path) 
    72                 if (stat.S_ISDIR(stats[stat.ST_MODE])): 
    73                     os.rmdir(path) 
     91                if filesystem.is_directory(path): 
     92                    shutil.rmtree(path) 
    7493                else: 
    7594                    os.remove(path) 
    76  
    77  
    78      
    79     def check(self): 
    80         """ 
    81         Checks environment directory is usable or not. 
    82         """ 
    83         pass 
    8495     
    8596    def needs_upgrade(self, target_version): 
  • cleverbox/trunk/cleverbox/project.py

    r187 r189  
    153153    print "Project has been created. Do you want to enable it ?" 
    154154    print 
    155     enable_project = raw_input('Enable project ? [y/N]> ').strip() or False 
    156  
    157     if enable_project or enable_project.find('y') == 0: 
     155    enable_project = raw_input('Enable project ? [y/N]> ').strip() or 'n' 
     156 
     157    if str(enable_project).find('y') == 0: 
    158158        enable(environment, client_name, project_name) 
    159159 
  • cleverbox/trunk/cleverbox/scripts/admin.py

    r188 r189  
    1414style = dummy() 
    1515style.ERROR = termcolors.make_style(fg='red', opts=('bold',)) 
     16style.WARN = termcolors.make_style(fg='yellow', opts=('bold',)) 
    1617style.SUCCESS = termcolors.make_style(fg='green', opts=('bold',)) 
    1718style.H1 = termcolors.make_style(fg='white', opts=('bold', 'underline')) 
     
    3738                 'Available Commands:\n' 
    3839    ruler = '' 
    39     prompt = "Cleverbox > " 
     40    prompt = style.H1("Cleverbox > ") 
    4041    _date_format = '%Y-%m-%d' 
    4142    _datetime_format = '%Y-%m-%d %H:%M:%S' 
     
    5455    ## 
    5556 
    56     def env_set(self, env_path): 
     57    def env_set(self, env_path, check_upgrade=True): 
    5758         
    5859        # Load environment 
     
    6162        # Check if environment needs an upgrade 
    6263        try: 
    63             if self.env.needs_upgrade(_version): 
    64                 print "\nCleverbox environment needs to be upgraded. Please run :" 
    65                 print "  cleverbox-admin %s upgrade\n" % self.env.path 
     64            if check_upgrade and self.env.needs_upgrade(_version): 
     65                print style.ERROR("\nCleverbox environment needs to be upgraded. Please run :") 
     66                print style.ERROR("  cleverbox-admin %s upgrade\n" % self.env.path) 
    6667                sys.exit(1) 
     68            elif not self.env.needs_upgrade(_version): 
     69                print style.SUCCESS("\nCleverbox environment is up to date.\n") 
    6770        except IOError, e: 
    6871            # no VERSION file means user wants to create an environment 
     
    8891    def run(self): 
    8992        self.interactive = True 
    90         print 'Welcome to cleverbox-admin\n'                \ 
    91               'Interactive Cleverbox administration console.\n'       \ 
    92               "Type:  '?' or 'help' for help on commands.\n" 
     93        print style.H1('Welcome to cleverbox-admin\n'                \ 
     94                       'Interactive Cleverbox administration console.\n'       \ 
     95                        "Type:  '?' or 'help' for help on commands.\n") 
    9396        self.cmdloop() 
    9497 
     
    278281        clients.sort() 
    279282        for client_name in clients: 
    280             print style.H1("%s :" % client_name) 
     283            print style.H1("\n%s :" % client_name) 
    281284            enabled_projects = project.get(self.env, client_name, 'enabled') 
    282285            disabled_projects = project.get(self.env, client_name, 'disabled') 
    283             
    284             if enabled_projects: 
    285                 enabled_projects.sort() 
    286                 print "  Enabled :" 
    287                 for project_name in enabled_projects: 
    288                     print style.ENABLED("    - %s" % project_name) 
    289  
    290             if disabled_projects: 
    291                 disabled_projects.sort() 
    292                 print "  Disabled :" 
    293                 for project_name in disabled_projects: 
    294                     print style.DISABLED("    - %s" % project_name) 
    295  
    296  
     286            all_projects = project.get(self.env, client_name) 
     287            all_projects.sort() 
     288            for project_name in all_projects: 
     289                if project_name in enabled_projects: 
     290                    print style.ENABLED("[E] %s" % project_name) 
     291                else: 
     292                    print style.DISABLED("[D] %s" % project_name) 
    297293 
    298294    def _do_project_disable(self, args): 
     
    409405 
    410406def run(args): 
    411     """Main entry point.""" 
     407    """ 
     408    Main entry point. 
     409    """ 
     410 
    412411    admin = CleverboxAdmin() 
    413  
    414412    if len(args) > 0: 
     413        if len(args) == 1: 
     414            while True: 
     415                admin.env_set(os.path.abspath(args[0])) 
     416                admin.run() 
    415417        if len(args) > 1: 
    416418            if args[1] in ('-h', '--help', 'help'): 
     
    419421                return admin.onecmd("about") 
    420422            elif args[1] in ('-u', '--upgrade', 'upgrade'): 
    421                 admin.envname = args[0] 
     423                admin.env_set(args[0], False) 
    422424                return admin.onecmd("upgrade") 
    423         else: 
    424             admin.env_set(os.path.abspath(args[0])) 
    425             if len(args) > 1: 
    426                 s_args = ' '.join(["'%s'" % command_parts for command_parts in args[2:]]) 
    427                 command = args[1] + ' ' +s_args 
    428                 return admin.onecmd(command) 
    429425            else: 
    430                 while True: 
    431                     admin.run() 
     426                admin.env_set(os.path.abspath(args[0])) 
     427                if len(args) > 1: 
     428                    s_args = ' '.join(["'%s'" % command_parts for command_parts in args[2:]]) 
     429                    command = args[1] + ' ' +s_args 
     430                    return admin.onecmd(command) 
    432431    else: 
    433432        return admin.onecmd("help") 
  • cleverbox/trunk/cleverbox/tests/environment.py

    r177 r189  
    1 import unittest 
     1import grp, logging, os, pwd, shutil, stat, tempfile, unittest 
     2from cleverbox.environment import Environment 
     3 
     4# Don't bother with output from scrips 
     5logging.basicConfig(stream=open('/dev/null', 'w+')) 
    26 
    37class EnvironmentTestCase(unittest.TestCase): 
     
    59    # Fixtures 
    610    def setUp(self): 
    7         pass 
     11        env_path = os.path.join(tempfile.gettempdir(), 'cleverbox-tempenv') 
     12        os.mkdir(env_path) 
     13        self.env = Environment(env_path) 
     14        parameters = {'general' :  
     15                         {'clients_root' : os.path.join(env_path, 'var', 'cleverbox'),  
     16                          'assets_dir'   : os.path.join('/root/tmp/cleverbox-trunk/assets'), 
     17                          'apache_group' : 'www-data'}} 
     18        self.env.create('0.5test', parameters) 
     19  
     20    def tearDown(self): 
     21        shutil.rmtree(self.env.path) 
    822     
    9     def tearDown(self): 
    10         pass 
    11      
    12     def test_initenv_creates_expected_layout(self): 
    13         pass 
    14      
     23    def test_create(self): 
     24        """Environment.create() generates a correct directory layout.""" 
     25 
     26        expected = {'VERSION'                               : ('S_ISREG', '0640', 'root', 'www-data'), 
     27                    'cleverbox.ini'                         : ('S_ISREG', '0640', 'root', 'www-data'), 
     28                    'clients-available'                     : ('S_ISDIR', '0750', 'root', 'www-data'), 
     29                    'clients-enabled'                       : ('S_ISDIR', '0750', 'root', 'www-data'), 
     30                    'projects-available'                    : ('S_ISDIR', '0750', 'root', 'www-data'), 
     31                    'projects-enabled'                      : ('S_ISDIR', '0750', 'root', 'www-data'), 
     32                    'profiles'                              : ('S_ISDIR', '0750', 'root', 'www-data'), 
     33                    'profiles/default'                      : ('S_ISDIR', '0750', 'root', 'www-data'), 
     34                    'profiles/default/trac-defaults.ini'    : ('S_ISREG', '0640', 'root', 'www-data'), 
     35                    'profiles/default/project.apache.conf'  : ('S_ISREG', '0640', 'root', 'www-data'), 
     36                    'profiles/default/permissions.ini'      : ('S_ISREG', '0640', 'root', 'www-data')} 
     37 
     38        for (entry, spec) in expected.items(): 
     39            st = os.stat(self.env.get_path(entry)) 
     40            mode = st[stat.ST_MODE] 
     41 
     42            # Validate file type 
     43            func = getattr(stat, spec[0]) 
     44            assert func.__call__(mode), '"%s" type is correct (%s)' % (entry, spec[0]) 
     45 
     46            # Validate file mode 
     47            assert oct(stat.S_IMODE(mode)) == spec[1], '"%s" mode is correct (expected %s, got %s)' % (entry, spec[1], oct(stat.S_IMODE(mode))) 
     48 
     49            # Validate ownership 
     50            uid = st[stat.ST_UID] 
     51            gid = st[stat.ST_GID] 
     52            expected_uid = pwd.getpwnam(spec[2])[2] 
     53            expected_gid = grp.getgrnam(spec[3])[2] 
     54            assert uid == expected_uid, '"%s" owner is correct (expected %s, got %s)' % (entry, pwd.getpwuid(uid)[0], spec[2]) 
     55            assert gid == expected_gid, '"%s" group is correct (expected %s, got %s)' % (entry, grp.getgrgid(uid)[0], spec[3]) 
     56             
     57 
     58    def test_create_creates_enough_elements(self): 
     59        """Environment.create() creates the right number of elements on filesystem.""" 
     60        assert len(os.listdir(self.env.path)) == 7 
     61        assert len(os.listdir(os.path.join(self.env.path, 'profiles'))) == 1 
     62        assert len(os.listdir(os.path.join(self.env.path, 'profiles', 'default'))) == 3 
     63 
     64    def test_needs_upgrade_triggers_when_needs(self): 
     65        """Environment.needs_upgrade() returns true if environment needs an upgrade.""" 
     66        assert self.env.needs_upgrade('0.6') 
     67 
     68    def test_needs_upgrade_does_not_trigger_when_unneeded(self): 
     69        """Environment.needs_upgrade() returns false if environment does not need an upgrade.""" 
     70        assert self.env.needs_upgrade('0.4') == False 
     71 
     72    def test_get_version(self): 
     73        """Environment.get_version() returns the right version number.""" 
     74        assert self.env.get_version() == '0.5test' 
     75 
     76    def test_get_path(self): 
     77        """Environment.get_path() returns the right path.""" 
     78        assert self.env.get_path('TEST') == os.path.join(self.env.path, 'TEST') 
     79 
     80             
    1581def suite(): 
    1682    return unittest.makeSuite(EnvironmentTestCase,'test') 
  • cleverbox/trunk/cleverbox/utils/filesystem.py

    r184 r189  
    33""" 
    44 
    5 import pwd, grp, os 
     5import pwd, grp, os, stat 
    66 
    77def chowntree(directory, uid, gid): 
     
    3737    """ 
    3838    return grp.getgrnam(groupname)[2] 
     39 
     40def is_file(path): 
     41   """ 
     42   Returns true if path points to a regular file (stat.S_ISREG). 
     43   """ 
     44   mode = os.stat(path)[stat.ST_MODE] 
     45   return stat.S_ISREG(mode) 
     46 
     47def is_directory(path): 
     48   """ 
     49   Returns true if path points to a directory (stat.S_ISDIR). 
     50   """ 
     51   mode = os.stat(path)[stat.ST_MODE] 
     52   return stat.S_ISDIR(mode) 
     53 
     54def is_symlink(path): 
     55   """ 
     56   Returns true if path points to a symlink (stat.S_ISLNK). 
     57   """ 
     58   mode = os.stat(path)[stat.ST_MODE] 
     59   return stat.S_ISLNK(mode) 
     60