Package eggbasket :: Module commands
[hide private]

Source Code for Module eggbasket.commands

  1  # -*- coding: utf-8 -*- 
  2  """This module contains functions called from console script entry points.""" 
  3   
  4  import logging 
  5  import optparse 
  6  import sys 
  7   
  8  from os import getcwd 
  9  from os.path import dirname, exists, join 
 10   
 11  import pkg_resources 
 12  pkg_resources.require("TurboGears >= 1.0.4.4") 
 13  pkg_resources.require("SQLAlchemy >= 0.4") 
 14  pkg_resources.require("Genshi >= 0.4") 
 15  pkg_resources.require("docutils >= 0.4") 
 16   
 17  import cherrypy 
 18  import turbogears 
 19   
 20  from turbogears.util import load_project_config, get_model 
 21   
 22   
 23  cherrypy.lowercase_api = True 
 24  log = logging.getLogger("eggbasket") 
 25   
 26   
27 -class ConfigurationError(Exception):
28 pass
29
30 -def find_config(args):
31 """Return for environment-specific configuration in several places. 32 33 First look on the command line for a desired config file, 34 if it's not on the command line, then look for 'setup.py' 35 in the current directory. If there, load configuration 36 from a file called 'dev.cfg'. If it's not there, the project 37 is probably installed and we'll look first for a file called 38 'prod.cfg' in the current directory and then for a default 39 config file called 'default.cfg' packaged in the egg. 40 41 If all fails, raise ConfigurationError. 42 """ 43 setupdir = dirname(dirname(__file__)) 44 curdir = getcwd() 45 46 if args: 47 configfile = args[0] 48 elif exists(join(setupdir, "setup.py")): 49 configfile = join(setupdir, "dev.cfg") 50 elif exists(join(curdir, "prod.cfg")): 51 configfile = join(curdir, "prod.cfg") 52 else: 53 try: 54 configfile = pkg_resources.resource_filename( 55 pkg_resources.Requirement.parse("EggBasket"), 56 "config/default.cfg") 57 except pkg_resources.DistributionNotFound: 58 raise ConfigurationError("Could not find default configuration.") 59 log.info("Using configuration file %s", configfile) 60 return configfile
61
62 -def init_database(args):
63 """Create bootstrap data in the database specified by the given config file. 64 65 This will create a user with user_name/password "admin", who belongs 66 to the group "maintainers", which has the "upload" permission. 67 68 This function can safely be run several times for the same database. If a 69 a user with user_name == 'admin' already exists, it does nothing. 70 71 """ 72 configfile = find_config(args) 73 turbogears.update_config(configfile=configfile, 74 modulename="eggbasket.config") 75 from turbogears import database 76 model = get_model() 77 session = database.session 78 database.bind_meta_data() 79 database.metadata.create_all(database.get_engine()) 80 81 try: 82 model.User.query().filter_by(user_name=u'admin').one() 83 except model.InvalidRequestError: 84 # Create user and group objects 85 adminuser = model.User(display_name=u"Administrator", user_name=u"admin", 86 password=u"admin", email_address=u"admin@localhost.localdomain") 87 anongroup = model.Group(display_name=u"Anonymous users", 88 group_name=u"anonymous") 89 authgroup = model.Group(display_name=u"Authenticated users", 90 group_name=u"authenticated") 91 maintgroup = model.Group(display_name=u"Package maintainers", 92 group_name=u"maintainer") 93 admingroup = model.Group(display_name=u"Administrators", 94 group_name=u"admin") 95 # Add users to groups 96 adminuser.groups.append(maintgroup) 97 adminuser.groups.append(admingroup) 98 # Create permission objects 99 uploadperm = model.Permission(permission_name=u"upload", 100 description=u"Can upload package files") 101 overwriteperm = model.Permission(permission_name=u"overwrite", 102 description=u"Can overwrite existing files in the package " 103 "repository") 104 deleteperm = model.Permission(permission_name=u"delete", 105 description=u"Can delete package files from the repository") 106 dloadperm = model.Permission(permission_name=u"download", 107 description=u"Can download package files") 108 viewpkgsperm = model.Permission(permission_name=u"viewpkgs", 109 description=u"Can view package list") 110 viewfilesperm = model.Permission(permission_name=u"viewfiles", 111 description=u"Can view package file list") 112 viewinfoperm = model.Permission(permission_name=u"viewinfo", 113 description=u"Can view package meta data") 114 # Set permisssions on groups 115 uploadperm.groups.append(maintgroup) 116 overwriteperm.groups.append(maintgroup) 117 deleteperm.groups.append(maintgroup) 118 dloadperm.groups.extend([anongroup,authgroup]) 119 viewfilesperm.groups.extend([anongroup,authgroup]) 120 viewpkgsperm.groups.extend([anongroup,authgroup]) 121 viewinfoperm.groups.extend([anongroup,authgroup]) 122 session.flush() 123 print "Database initialized successfully" 124 else: 125 print "There already is an 'admin' user in the database."
126
127 -def start_server(args):
128 """Start the CherryPy application server.""" 129 configfile = find_config(args) 130 turbogears.update_config(configfile=configfile, 131 modulename="eggbasket.config") 132 from eggbasket.controllers import Root 133 turbogears.start_server(Root())
134
135 -def main():
136 from eggbasket import __version__ 137 parser = optparse.OptionParser(prog='eggbasket-server', 138 version=__version__) 139 parser.add_option("-i", "--init", action="store_true", 140 help="Init database only, don't start server.", 141 dest="init", default=False) 142 (options, args) = parser.parse_args() 143 144 if options.init: 145 init_database(args) 146 else: 147 start_server(args)
148 149 if __name__ == '__main__': 150 main() 151