Changeset 189 for cleverbox/trunk
- Timestamp:
- 08/14/07 19:02:31 (5 years ago)
- Location:
- cleverbox/trunk/cleverbox
- Files:
-
- 5 modified
-
environment.py (modified) (4 diffs)
-
project.py (modified) (1 diff)
-
scripts/admin.py (modified) (8 diffs)
-
tests/environment.py (modified) (2 diffs)
-
utils/filesystem.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
cleverbox/trunk/cleverbox/environment.py
r181 r189 2 2 import ConfigParser 3 3 from pkg_resources import parse_version 4 from cleverbox.utils import filesystem 4 5 5 6 layout = ('clients-available', 'clients-enabled', … … 23 24 """ 24 25 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 25 33 # Do not do anything if base directories is not empty 26 34 if (len(os.listdir(self.path))): 27 raise IOError, '"%s" directory is not empty' % self.path28 29 if (len(os.listdir(parameters['general']['clients_root']))):30 35 raise IOError, '"%s" directory is not empty' % self.path 31 36 … … 43 48 for dirname in layout: 44 49 env_dirs.append(self.get_path(dirname)) 45 map( os.makedirs, env_dirs)50 map(os.makedirs, env_dirs) 46 51 47 52 # Create VERSION file 48 53 try: 49 print "\n\tCreating VERSION file\n"54 #print "\n\tCreating VERSION file\n" 50 55 fd = open(self.get_path('VERSION'), 'w') 51 56 fd.write(version) … … 63 68 self.config.write(open(self.get_path('cleverbox.ini'), 'w+')) 64 69 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 65 85 except Exception, exception: 66 86 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} 68 88 print "Rolling back changes" 69 89 for entry in os.listdir(self.path): 70 90 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) 74 93 else: 75 94 os.remove(path) 76 77 78 79 def check(self):80 """81 Checks environment directory is usable or not.82 """83 pass84 95 85 96 def needs_upgrade(self, target_version): -
cleverbox/trunk/cleverbox/project.py
r187 r189 153 153 print "Project has been created. Do you want to enable it ?" 154 154 print 155 enable_project = raw_input('Enable project ? [y/N]> ').strip() or False156 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: 158 158 enable(environment, client_name, project_name) 159 159 -
cleverbox/trunk/cleverbox/scripts/admin.py
r188 r189 14 14 style = dummy() 15 15 style.ERROR = termcolors.make_style(fg='red', opts=('bold',)) 16 style.WARN = termcolors.make_style(fg='yellow', opts=('bold',)) 16 17 style.SUCCESS = termcolors.make_style(fg='green', opts=('bold',)) 17 18 style.H1 = termcolors.make_style(fg='white', opts=('bold', 'underline')) … … 37 38 'Available Commands:\n' 38 39 ruler = '' 39 prompt = "Cleverbox > "40 prompt = style.H1("Cleverbox > ") 40 41 _date_format = '%Y-%m-%d' 41 42 _datetime_format = '%Y-%m-%d %H:%M:%S' … … 54 55 ## 55 56 56 def env_set(self, env_path ):57 def env_set(self, env_path, check_upgrade=True): 57 58 58 59 # Load environment … … 61 62 # Check if environment needs an upgrade 62 63 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.path64 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) 66 67 sys.exit(1) 68 elif not self.env.needs_upgrade(_version): 69 print style.SUCCESS("\nCleverbox environment is up to date.\n") 67 70 except IOError, e: 68 71 # no VERSION file means user wants to create an environment … … 88 91 def run(self): 89 92 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") 93 96 self.cmdloop() 94 97 … … 278 281 clients.sort() 279 282 for client_name in clients: 280 print style.H1(" %s :" % client_name)283 print style.H1("\n%s :" % client_name) 281 284 enabled_projects = project.get(self.env, client_name, 'enabled') 282 285 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) 297 293 298 294 def _do_project_disable(self, args): … … 409 405 410 406 def run(args): 411 """Main entry point.""" 407 """ 408 Main entry point. 409 """ 410 412 411 admin = CleverboxAdmin() 413 414 412 if len(args) > 0: 413 if len(args) == 1: 414 while True: 415 admin.env_set(os.path.abspath(args[0])) 416 admin.run() 415 417 if len(args) > 1: 416 418 if args[1] in ('-h', '--help', 'help'): … … 419 421 return admin.onecmd("about") 420 422 elif args[1] in ('-u', '--upgrade', 'upgrade'): 421 admin.env name = args[0]423 admin.env_set(args[0], False) 422 424 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_args428 return admin.onecmd(command)429 425 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) 432 431 else: 433 432 return admin.onecmd("help") -
cleverbox/trunk/cleverbox/tests/environment.py
r177 r189 1 import unittest 1 import grp, logging, os, pwd, shutil, stat, tempfile, unittest 2 from cleverbox.environment import Environment 3 4 # Don't bother with output from scrips 5 logging.basicConfig(stream=open('/dev/null', 'w+')) 2 6 3 7 class EnvironmentTestCase(unittest.TestCase): … … 5 9 # Fixtures 6 10 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) 8 22 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 15 81 def suite(): 16 82 return unittest.makeSuite(EnvironmentTestCase,'test') -
cleverbox/trunk/cleverbox/utils/filesystem.py
r184 r189 3 3 """ 4 4 5 import pwd, grp, os 5 import pwd, grp, os, stat 6 6 7 7 def chowntree(directory, uid, gid): … … 37 37 """ 38 38 return grp.getgrnam(groupname)[2] 39 40 def 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 47 def 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 54 def 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
