From f55c7a48ea534e342e6efbd4c7edaf1b1e07f61b Mon Sep 17 00:00:00 2001 From: Nick Daly Date: Tue, 23 Apr 2013 17:49:22 -0500 Subject: Merged with James's upstream. Hope I did it right. If I screwed up, withsqlite is borked. --- .gitignore | 5 +- .gitmodules | 6 + COPYING | 8 +- INSTALL | 7 +- Makefile | 73 +- README | 19 +- cfg.py | 42 + cfg.sample.py | 23 - cherrypy | 1 - doc/hacking.mdwn | 7 +- modules/first_boot.py | 1 + modules/installed/first_boot.py | 120 ++ modules/installed/help/help.py | 7 +- modules/installed/lib/forms.py | 33 +- plinth.py | 70 +- plinth.sample.config | 17 + plinth.sample.fhs.config | 17 + plugin_mount.py | 7 +- start.sh | 4 +- templates/base.tmpl | 46 +- templates/err.tmpl | 2 +- templates/login_nav.tmpl | 31 + templates/two_col.tmpl | 19 + util.py | 9 +- vendor/CherryPy-3.2.0/PKG-INFO | 26 - vendor/CherryPy-3.2.0/README.txt | 13 - vendor/CherryPy-3.2.0/docs/cherryd.1 | 263 --- vendor/CherryPy-3.2.0/ez_setup.py | 134 -- vendor/CherryPy-3.2.0/make-sdist | 2 - .../CherryPy-3.2.0/py2/CherryPy.egg-info/PKG-INFO | 26 - .../py2/CherryPy.egg-info/SOURCES.txt | 336 --- .../py2/CherryPy.egg-info/dependency_links.txt | 1 - .../py2/CherryPy.egg-info/top_level.txt | 1 - vendor/CherryPy-3.2.0/py2/cherrypy/LICENSE.txt | 25 - vendor/CherryPy-3.2.0/py2/cherrypy/__init__.py | 620 ------ vendor/CherryPy-3.2.0/py2/cherrypy/_cpchecker.py | 327 --- vendor/CherryPy-3.2.0/py2/cherrypy/_cpcompat.py | 283 --- vendor/CherryPy-3.2.0/py2/cherrypy/_cpconfig.py | 295 --- vendor/CherryPy-3.2.0/py2/cherrypy/_cpdispatch.py | 622 ------ vendor/CherryPy-3.2.0/py2/cherrypy/_cperror.py | 553 ----- vendor/CherryPy-3.2.0/py2/cherrypy/_cplogging.py | 393 ---- vendor/CherryPy-3.2.0/py2/cherrypy/_cpmodpy.py | 333 --- .../py2/cherrypy/_cpnative_server.py | 149 -- vendor/CherryPy-3.2.0/py2/cherrypy/_cpreqbody.py | 941 --------- vendor/CherryPy-3.2.0/py2/cherrypy/_cprequest.py | 926 -------- vendor/CherryPy-3.2.0/py2/cherrypy/_cpserver.py | 195 -- .../py2/cherrypy/_cpthreadinglocal.py | 239 --- vendor/CherryPy-3.2.0/py2/cherrypy/_cptools.py | 510 ----- vendor/CherryPy-3.2.0/py2/cherrypy/_cptree.py | 279 --- vendor/CherryPy-3.2.0/py2/cherrypy/_cpwsgi.py | 347 --- .../CherryPy-3.2.0/py2/cherrypy/_cpwsgi_server.py | 54 - vendor/CherryPy-3.2.0/py2/cherrypy/cherryd | 109 - vendor/CherryPy-3.2.0/py2/cherrypy/favicon.ico | Bin 1406 -> 0 bytes vendor/CherryPy-3.2.0/py2/cherrypy/lib/__init__.py | 45 - vendor/CherryPy-3.2.0/py2/cherrypy/lib/auth.py | 87 - .../CherryPy-3.2.0/py2/cherrypy/lib/auth_basic.py | 87 - .../CherryPy-3.2.0/py2/cherrypy/lib/auth_digest.py | 365 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/caching.py | 465 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/covercp.py | 365 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/cpstats.py | 661 ------ vendor/CherryPy-3.2.0/py2/cherrypy/lib/cptools.py | 611 ------ vendor/CherryPy-3.2.0/py2/cherrypy/lib/encoding.py | 388 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/http.py | 7 - vendor/CherryPy-3.2.0/py2/cherrypy/lib/httpauth.py | 354 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/httputil.py | 469 ----- .../CherryPy-3.2.0/py2/cherrypy/lib/jsontools.py | 87 - vendor/CherryPy-3.2.0/py2/cherrypy/lib/profiler.py | 208 -- vendor/CherryPy-3.2.0/py2/cherrypy/lib/reprconf.py | 351 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/sessions.py | 832 -------- vendor/CherryPy-3.2.0/py2/cherrypy/lib/static.py | 352 ---- vendor/CherryPy-3.2.0/py2/cherrypy/lib/xmlrpc.py | 49 - .../py2/cherrypy/process/__init__.py | 14 - .../CherryPy-3.2.0/py2/cherrypy/process/plugins.py | 681 ------ .../CherryPy-3.2.0/py2/cherrypy/process/servers.py | 418 ---- .../CherryPy-3.2.0/py2/cherrypy/process/win32.py | 174 -- .../CherryPy-3.2.0/py2/cherrypy/process/wspbus.py | 393 ---- .../py2/cherrypy/scaffold/__init__.py | 61 - .../py2/cherrypy/scaffold/apache-fcgi.conf | 22 - .../py2/cherrypy/scaffold/example.conf | 3 - .../CherryPy-3.2.0/py2/cherrypy/scaffold/site.conf | 14 - .../scaffold/static/made_with_cherrypy_small.png | Bin 7455 -> 0 bytes .../CherryPy-3.2.0/py2/cherrypy/test/__init__.py | 25 - .../py2/cherrypy/test/_test_decorators.py | 41 - .../py2/cherrypy/test/_test_states_demo.py | 66 - .../CherryPy-3.2.0/py2/cherrypy/test/benchmark.py | 409 ---- .../py2/cherrypy/test/checkerdemo.py | 47 - .../CherryPy-3.2.0/py2/cherrypy/test/fastcgi.conf | 18 - vendor/CherryPy-3.2.0/py2/cherrypy/test/fcgi.conf | 14 - vendor/CherryPy-3.2.0/py2/cherrypy/test/helper.py | 476 ----- vendor/CherryPy-3.2.0/py2/cherrypy/test/logtest.py | 181 -- .../CherryPy-3.2.0/py2/cherrypy/test/modfastcgi.py | 135 -- .../CherryPy-3.2.0/py2/cherrypy/test/modfcgid.py | 125 -- vendor/CherryPy-3.2.0/py2/cherrypy/test/modpy.py | 163 -- vendor/CherryPy-3.2.0/py2/cherrypy/test/modwsgi.py | 148 -- .../py2/cherrypy/test/native-server.ini | 9 - .../py2/cherrypy/test/sessiondemo.py | 153 -- .../py2/cherrypy/test/static/dirback.jpg | Bin 18238 -> 0 bytes .../py2/cherrypy/test/static/index.html | 1 - vendor/CherryPy-3.2.0/py2/cherrypy/test/style.css | 1 - vendor/CherryPy-3.2.0/py2/cherrypy/test/test.pem | 38 - .../py2/cherrypy/test/test_auth_basic.py | 79 - .../py2/cherrypy/test/test_auth_digest.py | 115 - .../CherryPy-3.2.0/py2/cherrypy/test/test_bus.py | 263 --- .../py2/cherrypy/test/test_caching.py | 329 --- .../py2/cherrypy/test/test_config.py | 249 --- .../py2/cherrypy/test/test_config_server.py | 121 -- .../CherryPy-3.2.0/py2/cherrypy/test/test_conn.py | 734 ------- .../CherryPy-3.2.0/py2/cherrypy/test/test_core.py | 617 ------ .../py2/cherrypy/test/test_dynamicobjectmapping.py | 403 ---- .../py2/cherrypy/test/test_encoding.py | 363 ---- .../CherryPy-3.2.0/py2/cherrypy/test/test_etags.py | 81 - .../CherryPy-3.2.0/py2/cherrypy/test/test_http.py | 168 -- .../py2/cherrypy/test/test_httpauth.py | 151 -- .../py2/cherrypy/test/test_httplib.py | 29 - .../CherryPy-3.2.0/py2/cherrypy/test/test_json.py | 79 - .../py2/cherrypy/test/test_logging.py | 149 -- .../CherryPy-3.2.0/py2/cherrypy/test/test_mime.py | 128 -- .../py2/cherrypy/test/test_misc_tools.py | 202 -- .../py2/cherrypy/test/test_objectmapping.py | 403 ---- .../CherryPy-3.2.0/py2/cherrypy/test/test_proxy.py | 129 -- .../py2/cherrypy/test/test_refleaks.py | 119 -- .../py2/cherrypy/test/test_request_obj.py | 722 ------- .../py2/cherrypy/test/test_routes.py | 69 - .../py2/cherrypy/test/test_session.py | 464 ---- .../py2/cherrypy/test/test_sessionauthenticate.py | 62 - .../py2/cherrypy/test/test_states.py | 436 ---- .../py2/cherrypy/test/test_static.py | 300 --- .../CherryPy-3.2.0/py2/cherrypy/test/test_tools.py | 393 ---- .../py2/cherrypy/test/test_tutorials.py | 201 -- .../py2/cherrypy/test/test_virtualhost.py | 107 - .../py2/cherrypy/test/test_wsgi_ns.py | 80 - .../py2/cherrypy/test/test_wsgi_vhost.py | 36 - .../py2/cherrypy/test/test_wsgiapps.py | 111 - .../py2/cherrypy/test/test_xmlrpc.py | 172 -- vendor/CherryPy-3.2.0/py2/cherrypy/test/webtest.py | 535 ----- .../py2/cherrypy/tutorial/README.txt | 16 - .../py2/cherrypy/tutorial/__init__.py | 3 - .../py2/cherrypy/tutorial/bonus-sqlobject.py | 168 -- .../py2/cherrypy/tutorial/custom_error.html | 14 - .../py2/cherrypy/tutorial/pdf_file.pdf | Bin 85698 -> 0 bytes .../py2/cherrypy/tutorial/tut01_helloworld.py | 35 - .../py2/cherrypy/tutorial/tut02_expose_methods.py | 32 - .../py2/cherrypy/tutorial/tut03_get_and_post.py | 53 - .../py2/cherrypy/tutorial/tut04_complex_site.py | 98 - .../py2/cherrypy/tutorial/tut05_derived_objects.py | 83 - .../py2/cherrypy/tutorial/tut06_default_method.py | 64 - .../py2/cherrypy/tutorial/tut07_sessions.py | 44 - .../tutorial/tut08_generators_and_yield.py | 47 - .../py2/cherrypy/tutorial/tut09_files.py | 107 - .../py2/cherrypy/tutorial/tut10_http_errors.py | 81 - .../py2/cherrypy/tutorial/tutorial.conf | 4 - .../py2/cherrypy/wsgiserver/__init__.py | 2219 -------------------- .../py2/cherrypy/wsgiserver/ssl_builtin.py | 72 - .../py2/cherrypy/wsgiserver/ssl_pyopenssl.py | 256 --- vendor/CherryPy-3.2.0/py3/cherrypy/LICENSE.txt | 25 - vendor/CherryPy-3.2.0/py3/cherrypy/__init__.py | 620 ------ vendor/CherryPy-3.2.0/py3/cherrypy/_cpchecker.py | 327 --- vendor/CherryPy-3.2.0/py3/cherrypy/_cpcompat.py | 283 --- vendor/CherryPy-3.2.0/py3/cherrypy/_cpconfig.py | 295 --- vendor/CherryPy-3.2.0/py3/cherrypy/_cpdispatch.py | 622 ------ vendor/CherryPy-3.2.0/py3/cherrypy/_cperror.py | 553 ----- vendor/CherryPy-3.2.0/py3/cherrypy/_cplogging.py | 398 ---- vendor/CherryPy-3.2.0/py3/cherrypy/_cpmodpy.py | 337 --- .../py3/cherrypy/_cpnative_server.py | 149 -- vendor/CherryPy-3.2.0/py3/cherrypy/_cpreqbody.py | 944 --------- vendor/CherryPy-3.2.0/py3/cherrypy/_cprequest.py | 937 --------- vendor/CherryPy-3.2.0/py3/cherrypy/_cpserver.py | 194 -- vendor/CherryPy-3.2.0/py3/cherrypy/_cptools.py | 510 ----- vendor/CherryPy-3.2.0/py3/cherrypy/_cptree.py | 278 --- vendor/CherryPy-3.2.0/py3/cherrypy/_cpwsgi.py | 351 ---- .../CherryPy-3.2.0/py3/cherrypy/_cpwsgi_server.py | 54 - vendor/CherryPy-3.2.0/py3/cherrypy/cherryd | 109 - vendor/CherryPy-3.2.0/py3/cherrypy/favicon.ico | Bin 1406 -> 0 bytes vendor/CherryPy-3.2.0/py3/cherrypy/lib/__init__.py | 45 - vendor/CherryPy-3.2.0/py3/cherrypy/lib/auth.py | 87 - .../CherryPy-3.2.0/py3/cherrypy/lib/auth_basic.py | 87 - .../CherryPy-3.2.0/py3/cherrypy/lib/auth_digest.py | 365 ---- vendor/CherryPy-3.2.0/py3/cherrypy/lib/caching.py | 465 ---- vendor/CherryPy-3.2.0/py3/cherrypy/lib/covercp.py | 365 ---- vendor/CherryPy-3.2.0/py3/cherrypy/lib/cpstats.py | 661 ------ vendor/CherryPy-3.2.0/py3/cherrypy/lib/cptools.py | 607 ------ vendor/CherryPy-3.2.0/py3/cherrypy/lib/encoding.py | 388 ---- vendor/CherryPy-3.2.0/py3/cherrypy/lib/httpauth.py | 354 ---- vendor/CherryPy-3.2.0/py3/cherrypy/lib/httputil.py | 482 ----- .../CherryPy-3.2.0/py3/cherrypy/lib/jsontools.py | 87 - vendor/CherryPy-3.2.0/py3/cherrypy/lib/profiler.py | 195 -- vendor/CherryPy-3.2.0/py3/cherrypy/lib/reprconf.py | 342 --- vendor/CherryPy-3.2.0/py3/cherrypy/lib/sessions.py | 827 -------- vendor/CherryPy-3.2.0/py3/cherrypy/lib/static.py | 355 ---- vendor/CherryPy-3.2.0/py3/cherrypy/lib/xmlrpc.py | 49 - .../py3/cherrypy/process/__init__.py | 14 - .../CherryPy-3.2.0/py3/cherrypy/process/plugins.py | 681 ------ .../CherryPy-3.2.0/py3/cherrypy/process/servers.py | 418 ---- .../CherryPy-3.2.0/py3/cherrypy/process/win32.py | 174 -- .../CherryPy-3.2.0/py3/cherrypy/process/wspbus.py | 386 ---- .../py3/cherrypy/scaffold/__init__.py | 61 - .../py3/cherrypy/scaffold/apache-fcgi.conf | 22 - .../py3/cherrypy/scaffold/example.conf | 3 - .../CherryPy-3.2.0/py3/cherrypy/scaffold/site.conf | 14 - .../scaffold/static/made_with_cherrypy_small.png | Bin 7455 -> 0 bytes .../CherryPy-3.2.0/py3/cherrypy/test/__init__.py | 25 - .../py3/cherrypy/test/_test_decorators.py | 41 - .../py3/cherrypy/test/_test_states_demo.py | 66 - .../CherryPy-3.2.0/py3/cherrypy/test/benchmark.py | 409 ---- .../py3/cherrypy/test/checkerdemo.py | 47 - vendor/CherryPy-3.2.0/py3/cherrypy/test/fcgi.conf | 14 - vendor/CherryPy-3.2.0/py3/cherrypy/test/helper.py | 476 ----- vendor/CherryPy-3.2.0/py3/cherrypy/test/logtest.py | 187 -- .../CherryPy-3.2.0/py3/cherrypy/test/modfastcgi.py | 135 -- .../CherryPy-3.2.0/py3/cherrypy/test/modfcgid.py | 125 -- vendor/CherryPy-3.2.0/py3/cherrypy/test/modpy.py | 163 -- vendor/CherryPy-3.2.0/py3/cherrypy/test/modwsgi.py | 148 -- .../py3/cherrypy/test/sessiondemo.py | 153 -- .../py3/cherrypy/test/static/dirback.jpg | Bin 18238 -> 0 bytes .../py3/cherrypy/test/static/index.html | 1 - vendor/CherryPy-3.2.0/py3/cherrypy/test/style.css | 1 - vendor/CherryPy-3.2.0/py3/cherrypy/test/test.pem | 38 - .../py3/cherrypy/test/test_auth_basic.py | 79 - .../py3/cherrypy/test/test_auth_digest.py | 115 - .../CherryPy-3.2.0/py3/cherrypy/test/test_bus.py | 263 --- .../py3/cherrypy/test/test_caching.py | 329 --- .../py3/cherrypy/test/test_config.py | 250 --- .../py3/cherrypy/test/test_config_server.py | 121 -- .../CherryPy-3.2.0/py3/cherrypy/test/test_conn.py | 734 ------- .../CherryPy-3.2.0/py3/cherrypy/test/test_core.py | 612 ------ .../py3/cherrypy/test/test_dynamicobjectmapping.py | 401 ---- .../py3/cherrypy/test/test_encoding.py | 363 ---- .../CherryPy-3.2.0/py3/cherrypy/test/test_etags.py | 82 - .../CherryPy-3.2.0/py3/cherrypy/test/test_http.py | 184 -- .../py3/cherrypy/test/test_httpauth.py | 151 -- .../py3/cherrypy/test/test_httplib.py | 29 - .../CherryPy-3.2.0/py3/cherrypy/test/test_json.py | 79 - .../py3/cherrypy/test/test_logging.py | 149 -- .../CherryPy-3.2.0/py3/cherrypy/test/test_mime.py | 128 -- .../py3/cherrypy/test/test_misc_tools.py | 201 -- .../py3/cherrypy/test/test_objectmapping.py | 403 ---- .../CherryPy-3.2.0/py3/cherrypy/test/test_proxy.py | 129 -- .../py3/cherrypy/test/test_refleaks.py | 119 -- .../py3/cherrypy/test/test_request_obj.py | 722 ------- .../py3/cherrypy/test/test_routes.py | 69 - .../py3/cherrypy/test/test_session.py | 464 ---- .../py3/cherrypy/test/test_sessionauthenticate.py | 62 - .../py3/cherrypy/test/test_states.py | 436 ---- .../py3/cherrypy/test/test_static.py | 300 --- .../CherryPy-3.2.0/py3/cherrypy/test/test_tools.py | 393 ---- .../py3/cherrypy/test/test_tutorials.py | 201 -- .../py3/cherrypy/test/test_virtualhost.py | 107 - .../py3/cherrypy/test/test_wsgi_ns.py | 80 - .../py3/cherrypy/test/test_wsgi_vhost.py | 36 - .../py3/cherrypy/test/test_wsgiapps.py | 111 - .../py3/cherrypy/test/test_xmlrpc.py | 142 -- vendor/CherryPy-3.2.0/py3/cherrypy/test/webtest.py | 578 ----- .../py3/cherrypy/tutorial/README.txt | 16 - .../py3/cherrypy/tutorial/__init__.py | 3 - .../py3/cherrypy/tutorial/bonus-sqlobject.py | 168 -- .../py3/cherrypy/tutorial/custom_error.html | 14 - .../py3/cherrypy/tutorial/pdf_file.pdf | Bin 85698 -> 0 bytes .../py3/cherrypy/tutorial/tut01_helloworld.py | 35 - .../py3/cherrypy/tutorial/tut02_expose_methods.py | 32 - .../py3/cherrypy/tutorial/tut03_get_and_post.py | 53 - .../py3/cherrypy/tutorial/tut04_complex_site.py | 98 - .../py3/cherrypy/tutorial/tut05_derived_objects.py | 83 - .../py3/cherrypy/tutorial/tut06_default_method.py | 64 - .../py3/cherrypy/tutorial/tut07_sessions.py | 44 - .../tutorial/tut08_generators_and_yield.py | 47 - .../py3/cherrypy/tutorial/tut09_files.py | 107 - .../py3/cherrypy/tutorial/tut10_http_errors.py | 81 - .../py3/cherrypy/tutorial/tutorial.conf | 4 - .../py3/cherrypy/wsgiserver/__init__.py | 1934 ----------------- .../py3/cherrypy/wsgiserver/ssl_builtin.py | 76 - vendor/CherryPy-3.2.0/setup.cfg | 5 - vendor/CherryPy-3.2.0/setup.py | 141 -- vendor/CherryPy-3.2.0/sphinx/Makefile | 89 - vendor/CherryPy-3.2.0/sphinx/make.bat | 113 - .../sphinx/source/_static/cpdocmain.css | 226 -- .../sphinx/source/appendix/cherrypyspeed.rst | 251 --- .../CherryPy-3.2.0/sphinx/source/appendix/faq.rst | 203 -- .../sphinx/source/appendix/index.rst | 11 - .../sphinx/source/appendix/success.rst | 81 - .../sphinx/source/concepts/basics.rst | 98 - .../sphinx/source/concepts/config.rst | 442 ---- .../sphinx/source/concepts/dispatching.rst | 407 ---- .../sphinx/source/concepts/engine.rst | 76 - .../sphinx/source/concepts/exposing.rst | 42 - .../sphinx/source/concepts/index.rst | 57 - .../sphinx/source/concepts/tools.rst | 105 - vendor/CherryPy-3.2.0/sphinx/source/conf.py | 213 -- .../sphinx/source/deployguide/apache.rst | 4 - .../sphinx/source/deployguide/cherryd.rst | 56 - .../sphinx/source/deployguide/index.rst | 28 - vendor/CherryPy-3.2.0/sphinx/source/index.rst | 47 - .../CherryPy-3.2.0/sphinx/source/intro/index.rst | 77 - .../CherryPy-3.2.0/sphinx/source/intro/install.rst | 144 -- .../CherryPy-3.2.0/sphinx/source/intro/license.rst | 32 - .../sphinx/source/intro/whycherrypy.rst | 102 - .../sphinx/source/progguide/REST.rst | 255 --- .../sphinx/source/progguide/choosingtemplate.rst | 151 -- .../sphinx/source/progguide/cookies.rst | 51 - .../sphinx/source/progguide/cpreturn.gif | Bin 6088 -> 0 bytes .../sphinx/source/progguide/cpyield.gif | Bin 9112 -> 0 bytes .../sphinx/source/progguide/customheaders.rst | 74 - .../source/progguide/extending/customplugins.rst | 131 -- .../source/progguide/extending/customtools.rst | 282 --- .../sphinx/source/progguide/extending/index.rst | 15 - .../sphinx/source/progguide/files/downloading.rst | 50 - .../sphinx/source/progguide/files/favicon.rst | 18 - .../sphinx/source/progguide/files/index.rst | 11 - .../sphinx/source/progguide/files/static.rst | 299 --- .../sphinx/source/progguide/files/uploading.rst | 75 - .../sphinx/source/progguide/index.rst | 35 - .../sphinx/source/progguide/responsetimeouts.rst | 41 - .../sphinx/source/progguide/streaming.rst | 81 - .../sphinx/source/refman/_cpchecker.rst | 12 - .../sphinx/source/refman/_cpconfig.rst | 18 - .../sphinx/source/refman/_cpdispatch.rst | 31 - .../sphinx/source/refman/_cperror.rst | 32 - .../sphinx/source/refman/_cplogging.rst | 15 - .../sphinx/source/refman/_cpreqbody.rst | 37 - .../sphinx/source/refman/_cprequest.rst | 22 - .../sphinx/source/refman/_cpserver.rst | 12 - .../sphinx/source/refman/_cptools.rst | 39 - .../sphinx/source/refman/_cptree.rst | 15 - .../sphinx/source/refman/_cpwsgi.rst | 24 - .../sphinx/source/refman/cherrypy.rst | 40 - .../sphinx/source/refman/cperrors.gif | Bin 12971 -> 0 bytes .../CherryPy-3.2.0/sphinx/source/refman/index.rst | 12 - .../sphinx/source/refman/lib/auth.rst | 14 - .../sphinx/source/refman/lib/auth_basic.rst | 12 - .../sphinx/source/refman/lib/auth_digest.rst | 26 - .../sphinx/source/refman/lib/caching.rst | 26 - .../sphinx/source/refman/lib/covercp.rst | 18 - .../sphinx/source/refman/lib/cptools.rst | 47 - .../sphinx/source/refman/lib/encoding.rst | 22 - .../sphinx/source/refman/lib/httpauth.rst | 23 - .../sphinx/source/refman/lib/httputil.rst | 41 - .../sphinx/source/refman/lib/index.rst | 10 - .../sphinx/source/refman/lib/jsontools.rst | 16 - .../sphinx/source/refman/lib/profiler.rst | 24 - .../sphinx/source/refman/lib/reprconf.rst | 29 - .../sphinx/source/refman/lib/sessions.rst | 41 - .../sphinx/source/refman/lib/static.rst | 19 - .../sphinx/source/refman/lib/xmlrpc.rst | 17 - .../sphinx/source/refman/process/index.rst | 10 - .../source/refman/process/plugins/daemonizer.rst | 47 - .../refman/process/plugins/dropprivileges.rst | 25 - .../sphinx/source/refman/process/plugins/index.rst | 46 - .../source/refman/process/plugins/pidfile.rst | 20 - .../refman/process/plugins/signalhandler.rst | 39 - .../sphinx/source/refman/process/servers.rst | 31 - .../sphinx/source/refman/process/win32.rst | 17 - .../sphinx/source/refman/process/wspbus.rst | 15 - .../sphinx/source/refman/wsgiserver/index.rst | 9 - .../sphinx/source/refman/wsgiserver/init.rst | 87 - .../source/refman/wsgiserver/ssl_builtin.rst | 12 - .../source/refman/wsgiserver/ssl_pyopenssl.rst | 18 - vendor/CherryPy-3.2.0/sphinx/util/convert-trac.py | 117 -- vendor/CherryPy-3.2.0/sphinx/util/test-doc.py | 22 - .../CherryPy-3.2.0/visuals/cherrypy_logo_big.png | Bin 21527 -> 0 bytes .../CherryPy-3.2.0/visuals/cherrypy_logo_small.jpg | Bin 3437 -> 0 bytes vendor/CherryPy-3.2.0/visuals/favicon.ico | Bin 1406 -> 0 bytes .../visuals/made_with_cherrypy_big.png | Bin 24450 -> 0 bytes .../visuals/made_with_cherrypy_small.png | Bin 7455 -> 0 bytes vendor/__init__.py | 0 vendor/exmachina | 1 + vendor/withsqlite/__init__.py | 0 vendor/withsqlite/withsqlite.py | 197 -- 366 files changed, 414 insertions(+), 63826 deletions(-) create mode 100644 .gitmodules create mode 100644 cfg.py delete mode 100644 cfg.sample.py delete mode 120000 cherrypy create mode 120000 modules/first_boot.py create mode 100644 modules/installed/first_boot.py create mode 100644 plinth.sample.config create mode 100644 plinth.sample.fhs.config create mode 100644 templates/login_nav.tmpl delete mode 100644 vendor/CherryPy-3.2.0/PKG-INFO delete mode 100644 vendor/CherryPy-3.2.0/README.txt delete mode 100644 vendor/CherryPy-3.2.0/docs/cherryd.1 delete mode 100644 vendor/CherryPy-3.2.0/ez_setup.py delete mode 100644 vendor/CherryPy-3.2.0/make-sdist delete mode 100644 vendor/CherryPy-3.2.0/py2/CherryPy.egg-info/PKG-INFO delete mode 100644 vendor/CherryPy-3.2.0/py2/CherryPy.egg-info/SOURCES.txt delete mode 100644 vendor/CherryPy-3.2.0/py2/CherryPy.egg-info/dependency_links.txt delete mode 100644 vendor/CherryPy-3.2.0/py2/CherryPy.egg-info/top_level.txt delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/LICENSE.txt delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpchecker.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpcompat.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpconfig.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpdispatch.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cperror.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cplogging.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpmodpy.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpnative_server.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpreqbody.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cprequest.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpserver.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpthreadinglocal.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cptools.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cptree.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpwsgi.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/_cpwsgi_server.py delete mode 100755 vendor/CherryPy-3.2.0/py2/cherrypy/cherryd delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/favicon.ico delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/auth.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/auth_basic.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/auth_digest.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/caching.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/covercp.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/cpstats.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/cptools.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/encoding.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/http.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/httpauth.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/httputil.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/jsontools.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/profiler.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/reprconf.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/sessions.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/static.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/lib/xmlrpc.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/process/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/process/plugins.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/process/servers.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/process/win32.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/process/wspbus.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/scaffold/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/scaffold/apache-fcgi.conf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/scaffold/example.conf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/scaffold/site.conf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/scaffold/static/made_with_cherrypy_small.png delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/_test_decorators.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/_test_states_demo.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/benchmark.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/checkerdemo.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/fastcgi.conf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/fcgi.conf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/helper.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/logtest.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/modfastcgi.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/modfcgid.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/modpy.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/modwsgi.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/native-server.ini delete mode 100755 vendor/CherryPy-3.2.0/py2/cherrypy/test/sessiondemo.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/static/dirback.jpg delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/static/index.html delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/style.css delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test.pem delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_auth_basic.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_auth_digest.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_bus.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_caching.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_config.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_config_server.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_conn.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_core.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_dynamicobjectmapping.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_encoding.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_etags.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_http.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_httpauth.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_httplib.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_json.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_logging.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_mime.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_misc_tools.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_objectmapping.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_proxy.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_refleaks.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_request_obj.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_routes.py delete mode 100755 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_session.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_sessionauthenticate.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_states.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_static.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_tools.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_tutorials.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_virtualhost.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_wsgi_ns.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_wsgi_vhost.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_wsgiapps.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/test_xmlrpc.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/test/webtest.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/README.txt delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/bonus-sqlobject.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/custom_error.html delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/pdf_file.pdf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut01_helloworld.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut02_expose_methods.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut03_get_and_post.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut04_complex_site.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut05_derived_objects.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut06_default_method.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut07_sessions.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut08_generators_and_yield.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut09_files.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tut10_http_errors.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/tutorial/tutorial.conf delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/wsgiserver/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/wsgiserver/ssl_builtin.py delete mode 100644 vendor/CherryPy-3.2.0/py2/cherrypy/wsgiserver/ssl_pyopenssl.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/LICENSE.txt delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpchecker.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpcompat.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpconfig.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpdispatch.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cperror.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cplogging.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpmodpy.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpnative_server.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpreqbody.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cprequest.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpserver.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cptools.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cptree.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpwsgi.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/_cpwsgi_server.py delete mode 100755 vendor/CherryPy-3.2.0/py3/cherrypy/cherryd delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/favicon.ico delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/auth.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/auth_basic.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/auth_digest.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/caching.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/covercp.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/cpstats.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/cptools.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/encoding.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/httpauth.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/httputil.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/jsontools.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/profiler.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/reprconf.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/sessions.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/static.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/lib/xmlrpc.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/process/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/process/plugins.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/process/servers.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/process/win32.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/process/wspbus.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/scaffold/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/scaffold/apache-fcgi.conf delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/scaffold/example.conf delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/scaffold/site.conf delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/scaffold/static/made_with_cherrypy_small.png delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/_test_decorators.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/_test_states_demo.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/benchmark.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/checkerdemo.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/fcgi.conf delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/helper.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/logtest.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/modfastcgi.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/modfcgid.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/modpy.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/modwsgi.py delete mode 100755 vendor/CherryPy-3.2.0/py3/cherrypy/test/sessiondemo.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/static/dirback.jpg delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/static/index.html delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/style.css delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test.pem delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_auth_basic.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_auth_digest.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_bus.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_caching.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_config.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_config_server.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_conn.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_core.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_dynamicobjectmapping.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_encoding.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_etags.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_http.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_httpauth.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_httplib.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_json.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_logging.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_mime.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_misc_tools.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_objectmapping.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_proxy.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_refleaks.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_request_obj.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_routes.py delete mode 100755 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_session.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_sessionauthenticate.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_states.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_static.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_tools.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_tutorials.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_virtualhost.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_wsgi_ns.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_wsgi_vhost.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_wsgiapps.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/test_xmlrpc.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/test/webtest.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/README.txt delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/bonus-sqlobject.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/custom_error.html delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/pdf_file.pdf delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut01_helloworld.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut02_expose_methods.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut03_get_and_post.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut04_complex_site.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut05_derived_objects.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut06_default_method.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut07_sessions.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut08_generators_and_yield.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut09_files.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tut10_http_errors.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/tutorial/tutorial.conf delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/wsgiserver/__init__.py delete mode 100644 vendor/CherryPy-3.2.0/py3/cherrypy/wsgiserver/ssl_builtin.py delete mode 100644 vendor/CherryPy-3.2.0/setup.cfg delete mode 100644 vendor/CherryPy-3.2.0/setup.py delete mode 100644 vendor/CherryPy-3.2.0/sphinx/Makefile delete mode 100644 vendor/CherryPy-3.2.0/sphinx/make.bat delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/_static/cpdocmain.css delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/appendix/cherrypyspeed.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/appendix/faq.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/appendix/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/appendix/success.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/basics.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/config.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/dispatching.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/engine.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/exposing.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/concepts/tools.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/conf.py delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/deployguide/apache.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/deployguide/cherryd.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/deployguide/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/intro/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/intro/install.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/intro/license.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/intro/whycherrypy.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/REST.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/choosingtemplate.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/cookies.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/cpreturn.gif delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/cpyield.gif delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/customheaders.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/extending/customplugins.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/extending/customtools.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/extending/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/files/downloading.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/files/favicon.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/files/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/files/static.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/files/uploading.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/responsetimeouts.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/progguide/streaming.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cpchecker.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cpconfig.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cpdispatch.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cperror.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cplogging.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cpreqbody.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cprequest.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cpserver.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cptools.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cptree.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/_cpwsgi.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/cherrypy.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/cperrors.gif delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/auth.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/auth_basic.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/auth_digest.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/caching.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/covercp.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/cptools.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/encoding.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/httpauth.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/httputil.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/jsontools.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/profiler.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/reprconf.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/sessions.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/static.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/lib/xmlrpc.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/plugins/daemonizer.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/plugins/dropprivileges.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/plugins/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/plugins/pidfile.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/plugins/signalhandler.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/servers.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/win32.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/process/wspbus.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/wsgiserver/index.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/wsgiserver/init.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/wsgiserver/ssl_builtin.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/source/refman/wsgiserver/ssl_pyopenssl.rst delete mode 100644 vendor/CherryPy-3.2.0/sphinx/util/convert-trac.py delete mode 100644 vendor/CherryPy-3.2.0/sphinx/util/test-doc.py delete mode 100644 vendor/CherryPy-3.2.0/visuals/cherrypy_logo_big.png delete mode 100644 vendor/CherryPy-3.2.0/visuals/cherrypy_logo_small.jpg delete mode 100644 vendor/CherryPy-3.2.0/visuals/favicon.ico delete mode 100644 vendor/CherryPy-3.2.0/visuals/made_with_cherrypy_big.png delete mode 100644 vendor/CherryPy-3.2.0/visuals/made_with_cherrypy_small.png create mode 100644 vendor/__init__.py create mode 160000 vendor/exmachina delete mode 100644 vendor/withsqlite/__init__.py delete mode 100644 vendor/withsqlite/withsqlite.py diff --git a/.gitignore b/.gitignore index d5be685..e5bdabe 100644 --- a/.gitignore +++ b/.gitignore @@ -20,9 +20,8 @@ templates/*.py TODO \#* .#* -cfg.py -cherrypy.config +*~ data/users.sqlite3 predepend build/ -*.pid \ No newline at end of file +*.pid diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9622603 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "vendor/withsqlite"] + path = vendor/withsqlite + url = git://github.com/jvasile/withsqlite.git +[submodule "vendor/exmachina"] + path = vendor/exmachina + url = git://github.com/jvasile/exmachina.git diff --git a/COPYING b/COPYING index 9f218c2..694d454 100644 --- a/COPYING +++ b/COPYING @@ -1,9 +1,9 @@ -# License to Copy the Plinth front end to the Freedom Plug +# License to Copy Plinth -Plinth is Copyright 2011 James Vasile (). It +Plinth is Copyright 2011-2013 James Vasile (). It is distributed under the GNU Affero General Public License, Version 3 -or later. A copy of GPLv3 is available [from the Free Software -Foundation](http://www.gnu.org/licenses/gpl.html). +or later. A copy of AGPLv3 is available [from the Free Software +Foundation](http://www.gnu.org/licenses/agpl.html). In addition, the documentation to this software is distributed under a Creative Commons Attribution-ShareAlike 3.0 Unported, Version 3 diff --git a/INSTALL b/INSTALL index e5761a1..a8d6138 100644 --- a/INSTALL +++ b/INSTALL @@ -5,12 +5,7 @@ Install the python-cheetah package, pandoc, python-augeas, and bjsonrpc: -apt-get install python-cheetah pandoc python-augeas python-bjsonrpc - -Install the python-simplejson - -apt-get install python-simplejson - +apt-get install python-cheetah pandoc python-augeas python-bjsonrpc python-cherrypy3 python-simplejson Unzip and untar the source into a directory. Change to the directory containing the program. Run: diff --git a/Makefile b/Makefile index 8b62fe0..cf29a63 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,4 @@ -#SHELL := /bin/bash MAKE=make -BUILD_DIR = vendor - -#TODO: add install target CSS=$(wildcard *.css) CSS=$(subst .tiny,,$(shell find themes -type f -name '*.css')) @@ -10,21 +6,43 @@ COMPRESSED_CSS := $(patsubst %.css,%.tiny.css,$(CSS)) PWD=`pwd` ## Catch-all tagets -default: predepend cfg cherrypy.config dirs template css docs dbs $(BUILD_DIR)/exmachina #$(BUILD_DIR)/bjsonrpc +default: predepend config dirs template css docs dbs all: default -build: - mkdir -p $(BUILD_DIR) - predepend: - su -c "apt-get -y install augeas-tools python-bjsonrpc python-augeas python-simplejson pandoc python-cheetah" + sudo sh -c "apt-get install augeas-tools python-bjsonrpc python-augeas python-simplejson pandoc python-cheetah python-cherrypy3" + git submodule init + git submodule update touch predepend -$(BUILD_DIR)/exmachina: build - git clone git://github.com/tomgalloway/exmachina $(BUILD_DIR)/exmachina - -$(BUILD_DIR)/bjsonrpc: build - git clone git://github.com/deavid/bjsonrpc.git $(BUILD_DIR)/bjsonrpc +install: default + mkdir -p $(DESTDIR)/etc/init.d $(DESTDIR)/etc/plinth + cp plinth.sample.fhs.config $(DESTDIR)/etc/plinth/plinth.config + mkdir -p $(DESTDIR)/usr/lib/python2.7/plinth $(DESTDIR)/usr/bin \ + $(DESTDIR)/usr/share/doc/plinth $(DESTDIR)/usr/share/man/man1 + rsync -L doc/* $(DESTDIR)/usr/share/doc/plinth/ + gzip $(DESTDIR)/usr/share/doc/plinth/plinth.1 + mv $(DESTDIR)/usr/share/doc/plinth/plinth.1.gz $(DESTDIR)/usr/share/man/man1 + rsync -rl *.py modules templates vendor themes static \ + --exclude static/doc --exclude ".git/*" --exclude "*.pyc" \ + $(DESTDIR)/usr/lib/python2.7/plinth + mkdir -p $(DESTDIR)/usr/lib/python2.7/plinth/static/doc + cp doc/*.html $(DESTDIR)/usr/lib/python2.7/plinth/static/doc + rm -f $(DESTDIR)/usr/lib/python2.7/plinth/plinth.config + ln -s ../../../../etc/plinth/plinth.config $(DESTDIR)/usr/lib/python2.7/plinth/plinth.config + cp share/init.d/plinth $(DESTDIR)/etc/init.d + rm -f $(DESTDIR)/usr/bin/plinth + ln -s ../lib/python2.7/plinth/plinth.py $(DESTDIR)/usr/bin/plinth + mkdir -p $(DESTDIR)/var/lib/plinth/cherrypy_sessions $(DESTDIR)/var/log/plinth $(DESTDIR)/var/run + cp -r data/* $(DESTDIR)/var/lib/plinth + rm -f $(DESTDIR)/var/lib/plinth/users/sqlite3.distrib + +uninstall: + rm -rf $(DESTDIR)/usr/lib/python2.7/plinth $(DESTDIR)/usr/share/plinth/ \ + $(DESTDIR)/etc/plinth $(DESTDIR)/var/lib/plinth $(DESTDIR)/usr/share/doc/plinth/ \ + $(DESTDIR)/var/log/plinth + rm -f $(DESTDIR)/usr/bin/plinth $(DESTDIR)/etc/init.d/plinth \ + $(DESTDIR)/usr/share/man/man1/plinth.1.gz $(DESTDIR)/var/run/plinth.pid dbs: data/users.sqlite3 @@ -34,29 +52,8 @@ data/users.sqlite3: data/users.sqlite3.distrib dirs: @mkdir -p data/cherrypy_sessions -cfg: Makefile - test -f cfg.py || cp cfg.sample.py cfg.py - -cherrypy.config: Makefile - @echo [global]\\n\ -server.socket_host = \'0.0.0.0\'\\n\ -server.socket_port = 8000\\n\ -server.thread_pool = 10\\n\ -tools.staticdir.root = \"$(PWD)\"\\n\ -tools.sessions.on = True\\n\ -tools.auth.on = True\\n\ -tools.sessions.storage_type = \"file\"\\n\ -tools.sessions.timeout = 90\\n\ -tools.sessions.storage_path = \"$(PWD)/data/cherrypy_sessions\"\\n\ -\\n\ -[/static]\\n\ -tools.staticdir.on = True\\n\ -tools.staticdir.dir = \"static\"\\n\ -\\n\ -[/favicon.ico]\\n\ -tools.staticfile.on = True\\n\ -tools.staticfile.filename = \"$(PWD)/static/theme/favicon.ico\"\\n\ -> cherrypy.config +config: Makefile + @test -f plinth.config || cp plinth.sample.config plinth.config %.tiny.css: %.css @cat $< | python -c 'import re,sys;print re.sub("\s*([{};,:])\s*", "\\1", re.sub("/\*.*?\*/", "", re.sub("\s+", " ", sys.stdin.read())))' > $@ @@ -83,5 +80,5 @@ clean: @find . -name "*.bak" -exec rm {} \; @$(MAKE) -s -C doc clean @$(MAKE) -s -C templates clean - rm -rf $(BUILD_DIR) + rm -rf $(BUILDDIR) $(DESTDIR) rm -f predepend diff --git a/README b/README index 6e00a78..a5e4bf9 100644 --- a/README +++ b/README @@ -36,19 +36,12 @@ to get newer, better shinier functions. The modules will automatically integrate into the existing menu system so you can control all of the box's parts from one central location. -The interface has a 'basic' and an 'expert' mode. In basic mode, much -of Plinth's configuration and capability are hidden. Sane defaults -are chosen whenever possible. In expert mode, you can get down into -the details and configure things the average user never thinks about. -For example, experts can turn off ntp or switch ntp servers. Basic -users should never even know those options exist. - -One caveat: expert mode is not as powerful as the commandline. We can -only do so much when translating free-form configuration files into -web forms. And if you manually change your configuration files, the -interface will overwrite those changes at first opportunity. This -interface is not a tool for super admins facing complex scenarios. It -is for home users to do a wide variety of basic tasks. +The interface will eventually have a 'basic' and an 'expert' mode. In +basic mode, much of Plinth's configuration and capability are hidden. +Sane defaults are chosen whenever possible. In expert mode, you can +get down into the details and configure things the average user never +thinks about. For example, experts can turn off ntp or switch ntp +servers. Basic users should never even know those options exist. See comments in exmachina/exmachina.py for more details about the configuration management process seperation scheme. diff --git a/cfg.py b/cfg.py new file mode 100644 index 0000000..4d24806 --- /dev/null +++ b/cfg.py @@ -0,0 +1,42 @@ +from menu import Menu +import os + +from ConfigParser import SafeConfigParser +parser = SafeConfigParser( + defaults={ + 'root':os.path.dirname(os.path.realpath(__file__)), + 'product_name':"", + 'box_name':"", + 'file_root':"", + 'data_dir':"", + 'store_file':"", + 'user_db':"", + 'status_log_file':"", + 'access_log_file':"", + 'users_dir':"", + 'host':"127.0.0.1", + 'pidfile':"", + 'port':"", + }) +parser.read(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'plinth.config')) + +product_name = parser.get('Name', 'product_name') +box_name = parser.get('Name', 'box_name') +root = parser.get('Path', 'root') +file_root = parser.get('Path', 'file_root') +data_dir = parser.get('Path', 'data_dir') +store_file = parser.get('Path', 'store_file') +user_db = parser.get('Path', 'user_db') +status_log_file = parser.get('Path', 'status_log_file') +access_log_file = parser.get('Path', 'access_log_file') +users_dir = parser.get('Path', 'users_dir') +pidfile = parser.get('Path', 'pidfile') +host = parser.get('Network', 'host') +port = int(parser.get('Network', 'port')) + +html_root = None +main_menu = Menu() +base_href = "" + +if store_file.endswith(".sqlite3"): + store_file = os.path.splitext(store_file)[0] diff --git a/cfg.sample.py b/cfg.sample.py deleted file mode 100644 index 8521ca6..0000000 --- a/cfg.sample.py +++ /dev/null @@ -1,23 +0,0 @@ -from menu import Menu -import os - -file_root = os.path.dirname(os.path.realpath(__file__)) -data_dir = os.path.join(file_root, "data") -store_file = os.path.join(data_dir, "store.sqlite3") -user_db = os.path.join(data_dir, "users") -status_log_file = os.path.join(data_dir, "status.log") -access_log_file = os.path.join(data_dir, "access.log") -users_dir = os.path.join(data_dir, "users") -pidfile = os.path.join(data_dir, "pidfile.pid") - -product_name = "Plinth" -box_name = "FreedomBox" - -host = "127.0.0.1" -port = 8000 - -## Do not edit below this line ## -html_root = None -main_menu = Menu() -base_href = "" - diff --git a/cherrypy b/cherrypy deleted file mode 120000 index 10eb6dc..0000000 --- a/cherrypy +++ /dev/null @@ -1 +0,0 @@ -vendor/CherryPy-3.2.0/py2/cherrypy \ No newline at end of file diff --git a/doc/hacking.mdwn b/doc/hacking.mdwn index 38e59fb..a334fc5 100644 --- a/doc/hacking.mdwn +++ b/doc/hacking.mdwn @@ -42,6 +42,9 @@ There are lots of bugs. We don't have a spec or tests, so a bug is really just any unexpected behavior. I am not easily surprised, but there are still lots of bugs. +There's an [issue tracker](https://github.com/jvasile/Plinth/issues). +Please add things and consult it for things to tackle. + ## Coding Practices @@ -91,7 +94,9 @@ directories. That makes removal easy. ## Todo -Plinth has a number of open todo items. Please help! +Plinth has a number of open todo items. And there are items in the +[issue tracker](https://github.com/jvasile/Plinth/issues) that need +tackling. Please help! * Implement the functions in the submenus of router.py * Unify our logging and cherrypy's. diff --git a/modules/first_boot.py b/modules/first_boot.py new file mode 120000 index 0000000..ae5c554 --- /dev/null +++ b/modules/first_boot.py @@ -0,0 +1 @@ +installed/first_boot.py \ No newline at end of file diff --git a/modules/installed/first_boot.py b/modules/installed/first_boot.py new file mode 100644 index 0000000..9cf7474 --- /dev/null +++ b/modules/installed/first_boot.py @@ -0,0 +1,120 @@ +from urlparse import urlparse +import os, cherrypy, re +from gettext import gettext as _ +from plugin_mount import PagePlugin, PluginMount, FormPlugin +from modules.auth import require +from forms import Form +import util as u +from vendor.withsqlite.withsqlite import sqlite_db +import cfg + +class FirstBoot(PagePlugin): + def __init__(self, *args, **kwargs): + PagePlugin.__init__(self, *args, **kwargs) + self.register_page("firstboot") # this is the url this page will hang off of (/firstboot) + + @cherrypy.expose + def index(self, *args, **kwargs): + return self.state0(*args, **kwargs) + + ## TODO: flesh out these tests values + def valid_box_name_p(self, name): + name = name.strip() + if re.search("\W", name): + return False + return True + def valid_box_key_p(self, key): + return True + def generate_box_key(self): + return "fake key" + + @cherrypy.expose + def state0(self, message="", box_name="", box_key="", submitted=False): + """ + In this state, we do time config over HTTP, name the box and + server key selection. + + All the parameters are form inputs. They get passed in when + the form is submitted. This method checks the inputs and if + they validate, uses them to take action. If they do not + validate, it displays the form to give the user a chance to + input correct values. It might display an error message (in + the message parameter). + + message is an optional string that we can display to the + user. It's a good place to put error messages. + """ + + ## Until LDAP is in place, we'll put the box name and key in the cfg.store_file + ## Must resist the sick temptation to write an LDAP interface to the sqlite file + with sqlite_db(cfg.store_file, table="thisbox", autocommit=True) as db: + db['about'] = "This table is for information about this FreedomBox" + if box_name: + if self.valid_box_name_p(box_name): + db['box_name'] = box_name + else: + message += _("Invalid box name.") + elif 'box_name' in db and db['box_name']: + box_name = db['box_name'] + #TODO: set /etc/hostname to box name via ex machina + + if box_key: + if self.valid_box_key_p(box_key): + db['box_key'] = box_key + else: + message += _("Invalid key!") + elif 'box_key' in db and db['box_key']: + box_key = _("We already have a key for this box on file.") #TODO: Think this through and handle more gracefully + elif submitted and not box_key: + box_key = self.generate_box_key() + db['box_key'] = box_key + + + if box_name and box_key and self.valid_box_name_p(box_name) and self.valid_box_key_p(box_key): + ## Update state to 1 and head there + with sqlite_db(cfg.store_file, table="firstboot", autocommit=True) as db: + db['state']=1 + raise cherrypy.InternalRedirect('/firstboot/state1') + + main = "

Welcome. It looks like this FreedomBox isn't set up yet. We'll need to ask you a just few questions to get started.

" + form = Form(title="Welcome to Your FreedomBox!", + action="/firstboot", + name="whats_my_name", + message=message) + if not box_name: + box_name = cfg.box_name + form.html("

For convenience, your FreedomBox needs a name. It should be something short that doesn't contain spaces or punctuation. 'Willard' would be a good name. 'Freestyle McFreedomBox!!!' would not.

") + form.text_input('Name your FreedomBox', id="box_name", value=box_name) + form.html("

%(box_name)s uses cryptographic keys so it can prove its identity when talking to you. %(box_name)s can make a key for itself, but if one already exists (from a prior FreedomBox, for example), you can paste it below. This key should not be the same as your key because you are not your FreedomBox!

" % {'box_name':cfg.box_name}) + form.text_box("If you want, paste your box's key here.", id="box_key", value=box_key) + form.hidden(name="submitted", value="True") + form.submit("Box it up!") + + main += form.render() + return self.fill_template(template="base", title=_("First Boot!"), main=main, + sidebar_right=_("""Getting Help

We've done our best to make your FreedomBox easy to use. If you have questions during setup, there are a few places to turn for help. TODO: add links to such help.

""")) + + @cherrypy.expose + def state1(self, message=None): + """ + State 1 is when we have a box name and key. In this state, + our task is to provide a certificate and maybe to guide the + user through installing it. We automatically move to State 2, + which is an HTTPS connection. + + TODO: HTTPS failure in State 2 should returns to state 1. + """ + main = """

Here's a certificate. +TODO: explain all this cert stuff to the user.

+

TODO: add instrux for installing certificate.

+

After you have installed +""" + if False: + ## Update state to 2 and head there + with sqlite_db(cfg.store_file, table="firstboot", autocommit=True) as db: + db['state']=1 + #TODO: switch to HTTPS + raise cherrypy.InternalRedirect('/firstboot/state1') + + return self.fill_template(template="base", title=_("Installing the Certificate"), main=main, + sidebar_right=_("""Getting Help

We've done our best to make your FreedomBox easy to use. If you have questions during setup, there are a few places to turn for help. TODO: add links to such help.

""")) diff --git a/modules/installed/help/help.py b/modules/installed/help/help.py index 049f600..e05123b 100644 --- a/modules/installed/help/help.py +++ b/modules/installed/help/help.py @@ -83,7 +83,6 @@ class View(PagePlugin): if page not in ['design', 'plinth', 'hacking', 'faq']: raise cherrypy.HTTPError(404, "The path '/help/view/%s' was not found." % page) return self.fill_template(template="err", main="

Sorry, as much as I would like to show you that page, I don't seem to have a page named %s!

" % page) - IF = open(os.path.join("doc", "%s.part.html" % page), 'r') - main = IF.read() - IF.close() - return self.fill_template(template="two_col", title=_("%s Documentation" % cfg.product_name), main=main) + with open(os.path.join("doc", "%s.part.html" % page), 'r') as IF: + main = IF.read() + return self.fill_template(title=_("%s Documentation" % cfg.product_name), main=main) diff --git a/modules/installed/lib/forms.py b/modules/installed/lib/forms.py index df78eea..2be810f 100644 --- a/modules/installed/lib/forms.py +++ b/modules/installed/lib/forms.py @@ -1,9 +1,32 @@ +""" +The Form class is a helper class that takes parameters and method +calls and can return html for a form with appropriate hooks for css +styling. It should allow you to display a form but have the +formatting and styling added by the class. You can worry less about +how it looks while still getting consistent, decent-looking forms. + +Take a look at the FirstBoot class for an example of forms in action. + +Copyright 2011-2013 James Vasile + +This software is released to you (yes, you) under the terms of the GNU +Affero General Public License, version 3 or later, available at +. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. +""" class Form(): def __init__(self, action=None, cls='form', title=None, onsubmit=None, name=None, message='', method="get"): """Note that there appears to be a bug in cherrypy whereby forms submitted via post don't have their fields included in kwargs for the default index method. So we use get by - default, though it's not as neat.""" + default, though it's not as neat. + + TODO: file bug on this w/ CherryPy project + """ action = self.get_form_attrib_text('action', action) onsubmit = self.get_form_attrib_text('onsubmit', onsubmit) @@ -65,13 +88,15 @@ class Form(): %s """ % (label, type, name, id, value, size) - def text_box(self, label='', name=None, id=None): + def hidden(self, name=None, id=None, value=''): + self.text_input(type="hidden", name=name, id=id, value=value) + def text_box(self, label='', name=None, id=None, value=""): name, id = self.name_or_id(name, id) self.text += """ """ % (label, name, id) + + """ % (label, name, id, value) def submit(self, label='', name=None, id=None): name, id = self.name_or_id(name, id) self.text += """ diff --git a/plinth.py b/plinth.py index 79d9674..9250b67 100755 --- a/plinth.py +++ b/plinth.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import os, sys, argparse -#import logging from gettext import gettext as _ import cfg if not os.path.join(cfg.file_root, "vendor") in sys.path: @@ -13,27 +12,32 @@ from cherrypy.process.plugins import Daemonizer Daemonizer(cherrypy.engine).subscribe() import plugin_mount -from util import * +import util as u + from logger import Logger #from modules.auth import AuthController, require, member_of, name_is +from vendor.withsqlite.withsqlite import sqlite_db +from vendor.exmachina.exmachina import ExMachinaClient import socket __version__ = "0.2.14" __author__ = "James Vasile" -__copyright__ = "Copyright 2011, James Vasile" +__copyright__ = "Copyright 2011-2013, James Vasile" __license__ = "GPLv3 or later" __maintainer__ = "James Vasile" __email__ = "james@jamesvasile.com" __status__ = "Development" def error_page(status, dynamic_msg, stock_msg): - return page_template(template="err", title=status, main="

%s

%s" % (dynamic_msg, stock_msg)) + return u.page_template(template="err", title=status, main="

%s

%s" % (dynamic_msg, stock_msg)) def error_page_404(status, message, traceback, version): - return error_page(status, message, """

If you believe this missing page should exist, please file a - bug with either the Plinth project or the people responsible for - the module you are trying to access.

+ return error_page(status, message, """

If you believe this + missing page should exist, please file a bug with either the Plinth + project (it has + an issue tracker) or the people responsible for the module you + are trying to access.

Sorry for the mistake.

""") @@ -42,13 +46,20 @@ def error_page_500(status, message, traceback, version): cfg.log.error("500 Internal Server Error. Trackback is above.") more="""

This is an internal error and not something you caused or can fix. Please report the error on the bug tracker so + href="https://github.com/jvasile/Plinth/issues">bug tracker so we can fix it.

""" return error_page(status, message, "

%s

%s
" % (more, "\n".join(traceback.split("\n")))) class Root(plugin_mount.PagePlugin): @cherrypy.expose def index(self): + ## TODO: firstboot hijacking root should probably be in the firstboot module with a hook in plinth.py + with sqlite_db(cfg.store_file, table="firstboot") as db: + if not 'state' in db: + raise cherrypy.InternalRedirect('/firstboot') + elif db['state'] < 5: + cfg.log("First Boot state = %d" % db['state']) + raise cherrypy.InternalRedirect('/firstboot/state%d' % db['state']) if cherrypy.session.get(cfg.session_key, None): raise cherrypy.InternalRedirect('/router') else: @@ -79,8 +90,12 @@ def parse_arguments(): if args.pidfile: cfg.pidfile = args.pidfile else: - if not cfg.pidfile: + try: + if not cfg.pidfile: cfg.pidfile = "plinth.pid" + except AttributeError: + cfg.pidfile = "plinth.pid" + if args.listen_exmachina_key: # this is where we optionally try to read in a shared secret key to # authenticate connections to exmachina @@ -129,25 +144,24 @@ def setup(): # Configure default server cherrypy.config.update( - { 'server.socket_host': cfg.host, - 'server.socket_port': cfg.port, - 'server.thread_pool':10, - 'tools.staticdir.root': cfg.file_root, - 'tools.sessions.on':True, - 'tools.auth.on':True, - 'tools.sessions.storage_type':"file", - 'tools.sessions.timeout':90, - 'tools.sessions.storage_path': - "%s/data/cherrypy_sessions" % cfg.file_root, - }) - - config = {'/': {'tools.staticdir.root': '%s/static' % cfg.file_root, - 'tools.proxy.on':True,}, - '/static': {'tools.staticdir.on': True, - 'tools.staticdir.dir':"."}, - '/favicon.ico':{'tools.staticfile.on':True, - 'tools.staticfile.filename': - "%s/static/theme/favicon.ico" % cfg.file_root}} + {'server.socket_host': cfg.host, + 'server.socket_port': cfg.port, + 'server.thread_pool':10, + 'tools.staticdir.root': cfg.file_root, + 'tools.sessions.on':True, + 'tools.auth.on':True, + 'tools.sessions.storage_type':"file", + 'tools.sessions.timeout':90, + 'tools.sessions.storage_path':"%s/cherrypy_sessions" % cfg.data_dir,}) + + config = { + '/': {'tools.staticdir.root': '%s/static' % cfg.file_root, + 'tools.proxy.on': True,}, + '/static': {'tools.staticdir.on': True, + 'tools.staticdir.dir': "."}, + '/favicon.ico':{'tools.staticfile.on': True, + 'tools.staticfile.filename': + "%s/static/theme/favicon.ico" % cfg.file_root}} cherrypy.tree.mount(cfg.html_root, '/', config=config) cherrypy.engine.signal_handler.subscribe() diff --git a/plinth.sample.config b/plinth.sample.config new file mode 100644 index 0000000..ece4d06 --- /dev/null +++ b/plinth.sample.config @@ -0,0 +1,17 @@ +[Name] +product_name = Plinth +box_name = FreedomBox + +[Path] +file_root = %(root)s +data_dir = %(file_root)s/data +store_file = %(data_dir)s/store.sqlite3 +user_db = %(data_dir)s/users +status_log_file = %(data_dir)s/status.log +access_log_file = %(data_dir)s/access.log +users_dir = %(data_dir)s/users +pidfile = %(data_dir)s/pidfile.pid + +[Network] +host = 127.0.0.1 +port = 8000 diff --git a/plinth.sample.fhs.config b/plinth.sample.fhs.config new file mode 100644 index 0000000..3e226da --- /dev/null +++ b/plinth.sample.fhs.config @@ -0,0 +1,17 @@ +[Name] +product_name = Plinth +box_name = FreedomBox + +[Path] +file_root = /usr/lib/python2.7/plinth +data_dir = /var/lib/plinth +store_file = %(data_dir)s/store.sqlite3 +user_db = %(data_dir)s/users +status_log_file = /var/log/plinth/status.log +access_log_file = /var/log/plinth/access.log +users_dir = %(data_dir)s/users +pidfile = /var/run/plinth.pid + +[Network] +host = 127.0.0.1 +port = 8000 diff --git a/plugin_mount.py b/plugin_mount.py index 5ad414a..cf0f268 100644 --- a/plugin_mount.py +++ b/plugin_mount.py @@ -67,6 +67,7 @@ class PagePlugin: def __init__(self, *args, **kwargs): """If cfg.html_root is none, then this is the html_root.""" if not cfg.html_root: + cfg.log('Setting html root to %s' % self.__class__.__name__) cfg.html_root = self def register_page(self, url): @@ -165,6 +166,10 @@ class UserStoreModule: user_store.py: get, get_all, set, exists, remove, attr, expert. See source code for doc strings. + This is designed as a plugin so mutiple types of user store can be + supported. But the project is moving towards LDAP for + compatibility with third party software. A future version of + Plinth is likely to require LDAP. """ - __metaclass__ = PluginMountSingular + __metaclass__ = PluginMountSingular # singular because we can only use one user store at a time diff --git a/start.sh b/start.sh index 4be20c1..8b97c0b 100755 --- a/start.sh +++ b/start.sh @@ -1,10 +1,10 @@ #! /bin/sh -PYTHONPATH=build/exmachina:$PYTHONPATH +#PYTHONPATH=vendor/exmachina:$PYTHONPATH export PYTHONPATH sudo killall exmachina.py -sudo build/exmachina/exmachina.py -v & +sudo vendor/exmachina/exmachina.py -v & python plinth.py sudo killall exmachina.py diff --git a/templates/base.tmpl b/templates/base.tmpl index 5a37f53..08443b0 100644 --- a/templates/base.tmpl +++ b/templates/base.tmpl @@ -118,17 +118,8 @@ FreedomBoxFreedomBox Dashboard - @@ -136,18 +127,26 @@
+ #if $nav or $sidebar_right or $sidebar_left
+ #if $nav -
+ #end if + #if $sidebar_left + + #end if + #if $sidebar_right + + #end if +
+ #end if
-
+

#block title_block $title @@ -157,15 +156,6 @@ $main #end block main_block

- -
-
- #block sidebar_right_block - $sidebar_right - #end block sidebar_right_block -
-
-
diff --git a/templates/err.tmpl b/templates/err.tmpl index 74dc12c..0210618 100644 --- a/templates/err.tmpl +++ b/templates/err.tmpl @@ -1,4 +1,4 @@ -#extends templates.two_col +#extends templates.login_nav #def title_block Error: $title diff --git a/templates/login_nav.tmpl b/templates/login_nav.tmpl new file mode 100644 index 0000000..05780d0 --- /dev/null +++ b/templates/login_nav.tmpl @@ -0,0 +1,31 @@ +#extends templates.base + +#def add_nav_and_login +