Create database upgrade framework
[cascardo/ipsilon.git] / ipsilon / ipsilon
1 #!/usr/bin/python
2 #
3 # Copyright (C) 2013 Ipsilon project Contributors, for license see COPYING
4
5 import sys
6 sys.stdout = sys.stderr
7 import glob
8 import os
9 import atexit
10 import cherrypy
11 from ipsilon import find_config
12 from ipsilon.util.data import AdminStore
13 from ipsilon.util import page
14 from ipsilon.root import Root
15 from jinja2 import Environment, FileSystemLoader, ChoiceLoader
16 import ipsilon.util.sessions
17
18
19 def nuke_session_locks():
20     if cherrypy.config['tools.sessions.on']:
21         try:
22             sessdir = cherrypy.config['tools.sessions.storage_path']
23             for l in glob.glob(os.path.join(sessdir, '*.lock')):
24                 try:
25                     os.remove(l)
26                 except Exception:  # pylint: disable=broad-except
27                     pass
28         except Exception:  # pylint: disable=broad-except
29             pass
30
31 cfgfile = find_config()
32
33 cherrypy.lib.sessions.SqlSession = ipsilon.util.sessions.SqlSession
34 cherrypy.config.update(cfgfile)
35
36 nuke_session_locks()
37
38 datastore = AdminStore()
39 admin_config = datastore.load_config()
40 for option in admin_config:
41     cherrypy.config[option] = admin_config[option]
42
43 template_loaders = []
44 default_template_dir = 'templates'
45 template_dir = cherrypy.config.get('template_dir', default_template_dir)
46 if template_dir.startswith('/'):
47     template_loaders.append(FileSystemLoader(template_dir))
48 else:
49     template_loaders.append(FileSystemLoader(
50         os.path.join(cherrypy.config['base.dir'],
51                      template_dir)))
52 # Fall-back to the default templates
53 template_loaders.append(FileSystemLoader(
54     os.path.join(cherrypy.config['base.dir'],
55                  default_template_dir)))
56 template_env = Environment(loader=ChoiceLoader(template_loaders),
57                            autoescape=True,
58                            extensions=['jinja2.ext.autoescape'])
59
60 if __name__ == "__main__":
61     conf = {'/': {'tools.staticdir.root': os.getcwd()},
62             '/ui': {'tools.staticdir.on': True,
63                     'tools.staticdir.dir': 'ui'}}
64     cherrypy.quickstart(Root('default', template_env),
65                         cherrypy.config['base.mount'], conf)
66
67 else:
68     cherrypy.config['environment'] = 'embedded'
69
70     if cherrypy.__version__.startswith('3.0') and cherrypy.engine.state == 0:
71         cherrypy.engine.start(blocking=False)
72         atexit.register(cherrypy.engine.stop)
73
74     application = cherrypy.Application(Root('default', template_env),
75                                        script_name=None, config=None)