From a48da07dfd95b4140e14d8fe390335df8933b821 Mon Sep 17 00:00:00 2001 From: Karl Chen Date: Fri, 18 Jul 2003 22:41:11 +0000 Subject: [PATCH] *** empty log message *** svn path=/trunk/boinc/; revision=1737 --- tools/make_project | 187 ++++++++++++++++++++++++++++++--------------- 1 file changed, 124 insertions(+), 63 deletions(-) diff --git a/tools/make_project b/tools/make_project index e7c605a592..a91aa21c33 100755 --- a/tools/make_project +++ b/tools/make_project @@ -3,16 +3,17 @@ # $Id$ # Creates a new BOINC project. -import sys, os, getopt +import sys, os, getopt, re sys.path.append('../py') from version import * from boinc import * argv0 = sys.argv[0] HOME = os.path.expanduser('~') +USER = os.environ['USER'] HELP = """ -syntax: %(argv0)s [options] project-dir-name 'Project Long Name'] +syntax: %(argv0)s [options] project-dir-name 'Project Long Name' app-exe 'App Name' Creates a new project with given name with everything running on a single server. @@ -21,6 +22,7 @@ Misc options: --verbose={0,1,2} default: 1 -v alias for --verbose=2 --no_query accept all directories without querying + --user_name default: $USER (%(USER)s) Dir-options: --base default: $HOME (%(HOME)s) @@ -32,17 +34,6 @@ Dir-options: --html_ops_url default: URL_BASE/PROJECT_ops/ --cgi_url default: URL_BASE/PROJECT_cgi/ -Project-specific directory structure that you probably don't need to change: - - --bin_dir default: PROJECT_ROOT/bin - --cgi_bin_dir default: PROJECT_ROOT/cgi-bin - --html_user_dir default: PROJECT_ROOT/html_user - --html_ops_dir default: PROJECT_ROOT/html_ops - --download_dir default: PROJECT_ROOT/download - --upload_dir default: PROJECT_ROOT/upload - --log_dir default: PROJECT_ROOT/log - --pid_dir default: PROJECT_ROOT/pid - E.g. if you run make_project --base $HOME/boinc --url_base http://boink/ yah 'YETI @ Home' Then upload_dir = $HOME/boinc/projects/yah/upload @@ -52,8 +43,19 @@ By default, directory options will be queried if they do not exist yet. """ %locals() -def syntax_error(): - raise SystemExit('See "%s --help" for help\n' % sys.argv[0]) +# Project-specific directory structure that you probably don't need to change: + +# --bin_dir default: PROJECT_ROOT/bin +# --cgi_bin_dir default: PROJECT_ROOT/cgi-bin +# --html_user_dir default: PROJECT_ROOT/html_user +# --html_ops_dir default: PROJECT_ROOT/html_ops +# --download_dir default: PROJECT_ROOT/download +# --upload_dir default: PROJECT_ROOT/upload +# --log_dir default: PROJECT_ROOT/log +# --pid_dir default: PROJECT_ROOT/pid + +def syntax_error(str): + raise SystemExit('%s; See "%s --help" for help\n' % (str,sys.argv[0])) def usage(): print HELP @@ -65,6 +67,7 @@ try: [ 'help', 'verbose=', 'no_query', + 'user_name=', 'base=', 'key_dir=', 'project_root=', @@ -72,74 +75,132 @@ try: 'html_user_url=', 'html_ops_url=', 'cgi_url=', - 'bin_dir=', - 'cgi_bin_dir=', - 'html_user_dir=', - 'html_ops_dir=', - 'download_dir=', - 'upload_dir=', - 'log_dir=', - 'pid_dir=' ]) -except getopt.GetoptError: - syntax_error() + # 'bin_dir=', + # 'cgi_bin_dir=', + # 'html_user_dir=', + # 'html_ops_dir=', + # 'download_dir=', + # 'upload_dir=', + # 'log_dir=', + # 'pid_dir=' + ]) +except getopt.GetoptError, e: + syntax_error(e) options.url_base = None +options.no_query = False for o,a in opts: if o == '-h' or o == '--help': usage() - elif o == 'v': options.echo_verbose = 2 - elif o == 'verbose': options.echo_verbose = int(a) - elif o == 'no_query': options.no_query = True - elif o == 'base': options.base = a - elif o == 'key_dir': options.key_dir = a - elif o == 'project_root': options.project_root = a - elif o == 'url_base': options.url_base = a - elif o == 'html_user_url': options.html_user_url = a - elif o == 'html_ops_url': options.html_ops_url = a - elif o == 'cgi_url': options.cgi_url = a - elif o == 'bin_dir': options.bin_dir = a - elif o == 'cgi_bin_dir': options.cgi_bin_dir = a - elif o == 'html_user_dir': options.html_user_dir = a - elif o == 'html_ops_dir': options.html_ops_dir = a - elif o == 'download_dir': options.download_dir = a - elif o == 'upload_dir': options.upload_dir = a - elif o == 'log_dir': options.log_dir = a - elif o == 'pid_dir': options.pid_dir = a + elif o == '-v': options.echo_verbose = 2 + elif o == '--verbose': options.echo_verbose = int(a) + elif o == '--no_query': options.no_query = True + elif o == '--user_name': options.user_name = a + elif o == '--base': options.base = a + elif o == '--key_dir': options.key_dir = a + elif o == '--project_root': options.project_root = a + elif o == '--url_base': options.url_base = a + elif o == '--html_user_url': options.html_user_url = a + elif o == '--html_ops_url': options.html_ops_url = a + elif o == '--cgi_url': options.cgi_url = a + # elif o == '--bin_dir': options.bin_dir = a + # elif o == '--cgi_bin_dir': options.cgi_bin_dir = a + # elif o == '--html_user_dir': options.html_user_dir = a + # elif o == '--html_ops_dir': options.html_ops_dir = a + # elif o == '--download_dir': options.download_dir = a + # elif o == '--upload_dir': options.upload_dir = a + # elif o == '--log_dir': options.log_dir = a + # elif o == '--pid_dir': options.pid_dir = a else: - raise SystemExit('internal error') + raise SystemExit('internal error o=%s'%o) -if len(args) != 2 or not options.url_base: - syntax_error() +if len(args) != 4: + syntax_error('Need four arguments') -(project_shortname, project_longname) = args +(project_shortname, project_longname, app_exe, app_name) = args +if not options.url_base: + syntax_error('Need --url_base') +if not options.url_base.startswith('http://'): + syntax_error('url_base needs to be an URL') +options.url_base = os.path.join(options.url_base, '') +opt_repls = {'PROJECT':project_shortname, 'URL_BASE':options.url_base} +def replopt(str): + for key in opt_repls: + str = re.compile('\\b'+key+'\\b').sub(os.path.join(opt_repls[key],'')[:-1], str) + return str +def add_slash(str, action=True): + if action: + return os.path.join(str,'') + else: + return str +def defopt(name, v, isdir=True): + options.__dict__[name] = opt_repls[name.upper()] = add_slash(replopt(options.__dict__.get(name) or v), isdir) -# if BLAH: -# print """I created the directories BLAH and BLAH. You need to add this (or similar) to your Apache config.httpd: +defopt('user_name', USER, isdir=False) +defopt('base', HOME) +defopt('key_dir', 'BASE/keys') +defopt('project_root', 'BASE/projects/PROJECT') -# Alias /%(project)s %(BOINC_HTML_USER_DIR)s -# ScriptAlias /%(project)s_cgi %(BOINC_CGI_BIN_DIR)s +defopt('html_user_url', 'URL_BASE/PROJECT') +defopt('html_ops_url', 'URL_BASE/PROJECT_ops') +defopt('cgi_url', 'URL_BASE/PROJECT_cgi') +print "Creating project '%s' (short name '%s'):" %(project_longname, project_shortname) +for k in ['base', + 'key_dir', + 'project_root', + 'url_base', + 'html_user_url', + 'html_ops_url', + 'cgi_url' ]: + print k.upper().rjust(15), "=", options.__dict__[k] +project_root_parent = os.path.realpath(os.path.join(options.project_root,'..')) +if not os.path.exists(project_root_parent): + os.makedirs(project_root_parent) -# # Note: projects/*/keys/ should NOT be readable! +if not options.no_query: + if not query_yesno("Continue?"): + raise SystemExit('Aborted') -# Options Indexes FollowSymlinks MultiViews -# AllowOverride None -# Order allow,deny -# Allow from all -# +app = App(app_name) +app_version = AppVersion(app, exec_names=[app_exe]) -# -# Options FollowSymLinks -# AllowOverride AuthConfig -# Order allow,deny -# Allow from all -# +options.install_method = 'copy' +init() +project = Project(project_shortname, project_longname, + project_dir = options.project_root, + master_url = options.url_base, + cgi_url = options.cgi_url, + apps=[app], app_versions=[app_version], + ) +project.install_project() +print '''You need to manually edit your Apache config.httpd to add these lines: + + Alias /%(project)s %(options.project_root)s/html_user + Alias /%(project)s_ops %(options.project_root)s/html_ops + ScriptAlias /%(project)s_cgi %(options.project_root)s/cgi-bin + + # Note: projects/*/keys/ should NOT be readable! + + Options Indexes FollowSymlinks MultiViews + AllowOverride None + Order allow,deny + Allow from all + + + + Options FollowSymLinks + AllowOverride AuthConfig + Order allow,deny + Allow from all + +'''%locals() ## TODO: first time: by default query all options with raw_input() ; use --no-query to use only environ vars