1
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
29
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
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
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
96 adminuser.groups.append(maintgroup)
97 adminuser.groups.append(admingroup)
98
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
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
134
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