#!/usr/bin/env python try: import boinc_path_config from Boinc import configxml, projectxml except: import configxml, projectxml from optparse import OptionParser import os, logging, sys, stat LINUX_WORKER = """\ #!/bin/sh `python $1 $2 $3` `touch boinc_finish_called` """ WINDOWS_WORKER = """\ @echo off set _path=%path% set _python=%_path:*python=python% set _python=%_python:~0,6% if %_python% neq python set PATH=%path%;C:\python25 python %1 %2 %s3 type nul > boinc_finish_called """ PYMW_APP = """\ import sys import cPickle def pymw_get_input(): infile = open(sys.argv[1], 'r') obj = cPickle.Unpickler(infile).load() infile.close() return obj def pymw_return_output(output): outfile = open(sys.argv[2], 'w') cPickle.Pickler(outfile).dump(output) outfile.close() """ FILE_REF = """\ """ parser = OptionParser(usage="usage: %prog") parser.add_option("-p", "--pymw_dir", dest="pymw_dir", default="", help="specify the working directory of pymw", metavar="") options, args = parser.parse_args() logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") pymw_dir = options.pymw_dir if pymw_dir == "": logging.error("py_mw working directory have to be provided (-p switch)") sys.exit(0) elif not os.path.exists(pymw_dir): logging.error(pymw_dir + " does not exist") sys.exit(0) logging.info("pymw working directory set to " + pymw_dir) logging.info("writing pymw_assimilator in config.xml") config = configxml.ConfigFile().read() # Remove old instances of pymw_assimilator for daemon in config.daemons: if daemon.cmd[0:16] == 'pymw_assimilator': config.daemons.remove_node(daemon) # Append new instance of pymw_assimilator to config.xml config.daemons.make_node_and_append("daemon").cmd = "pymw_assimilator -d 3 -app pymw -pymw_dir " + pymw_dir config.write() # Append new instance of pymw worker to project.xml project = projectxml.ProjectFile().read() found = False for element in project.elements: if element.name == 'pymw': logging.info("PyMW client applications are already installed") sys.exit(0) project.elements.make_node_and_append("app").name = "pymw" project.write() for element in project.elements: if element.name == "pymw": element.user_friendly_name = "PyMW - Master Worker Computing in Python" project.write() # Install worker applications app_dir = os.path.join(config.config.app_dir, "pymw") print app_dir if os.path.isdir(app_dir): logging.info("PyMW client applications are already installed") else: os.mkdir(app_dir) # Linux logging.info("setting up client application for Linux platform") linux_dir = os.path.join(app_dir, "pymw_1.00_i686-pc-linux-gnu") linux_exe = os.path.join(linux_dir, "pymw_1.00_i686-pc-linux-gnu") os.mkdir(linux_dir) open(linux_exe, "w").writelines(LINUX_WORKER) open(os.path.join(linux_dir, "pymw_1.00_i686-pc-linux-gnu.file_ref_info"), "w").writelines(FILE_REF) open(os.path.join(linux_dir, "pymw_app.py"), "w").writelines(PYMW_APP) open(os.path.join(linux_dir, "pymw_app.py.file_ref_info"), "w").writelines(FILE_REF) os.chmod(linux_exe, stat.S_IRWXU) logging.info("client application for Linux platform set up successfully") # Windows logging.info("setting up client application for Windows platform") win_dir = os.path.join(app_dir, "pymw_1.00_windows_intelx86") win_exe = os.path.join(win_dir, "pymw_1.00_windows_intelx86.exe") os.mkdir(win_dir) open(win_exe, "w").writelines(WINDOWS_WORKER) open(os.path.join(win_dir, "pymw_1.00_windows_intelx86.exe.file_ref_info"), "w").writelines(FILE_REF) open(os.path.join(win_dir, "pymw_app.py"), "w").writelines(PYMW_APP) open(os.path.join(win_dir, "pymw_app.py.file_ref_info"), "w").writelines(FILE_REF) os.chmod(win_exe, stat.S_IRWXU) logging.info("client application for Windows platform set up successfully") # Call update_versions project_home = config.config.app_dir.rpartition('/')[0] os.chdir(project_home) os.system("xadd") os.system("update_versions") logging.info("---------------------") logging.info("PyMW setup successful") logging.info("---------------------")