# This file is part of BOINC. # http://boinc.berkeley.edu # Copyright (C) 2016 University of California # # BOINC is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License # as published by the Free Software Foundation, # either version 3 of the License, or (at your option) any later version. # # BOINC 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with BOINC. If not, see . # Python bindings of remote job submission and file management APIs import urllib import copy import xml.etree.ElementTree as ET import requests # you'll need to "yip install requests" # represents an input file # class FILE_DESC: def __init__(self): return def to_xml(self): xml = ('\n' '%s\n' ) %(self.mode) if self.mode == 'remote': xml += ('%s\n' '%f\n' '%s\n' ) %(self.url, self.nbytes, self.md5) else: xml += '%s\n' %(self.source) xml += '\n' return xml # represents a job # class JOB_DESC: def __init__(self): return def to_xml(self): xml = ('\n' '%f\n' '%s\n' ) %(self.rsc_fpops_est, self.command_line) for file in self.files: xml += file.to_xml() xml += '\n' return xml # represents a batch description for submit() or estimate() # class BATCH_DESC: def __init__(self): return def to_xml(self, op): xml = ('<%s>\n' '%s\n' '\n' '%s\n' '%s\n' ) %(op, self.authenticator, self.app_name, self.batch_name) for job in self.jobs: xml += job.to_xml() xml += '\n\n' %(op) return xml # a generic request # class REQUEST: def __init__(self): return def do_http_post(req, project_url): url = project_url + 'submit_rpc_handler.php' params = urllib.urlencode({'request': req}) f = urllib.urlopen(url, params) reply = f.read() print reply return ET.fromstring(reply) def estimate_batch(req): return do_http_post(req.to_xml('estimate_batch'), req.project) def submit_batch(req): return do_http_post(req.to_xml('submit_batch'), req.project) def query_batches(req): req_xml = ('\n' '%s\n' '%d\n' '\n' ) %(req.authenticator, 1 if req.get_cpu_time else 0) return do_http_post(req_xml, req.project) def query_batch(req): req_xml = ('\n' '%s\n' '%s\n' '%d\n' '\n' ) %(req.authenticator, req.batch_id, 1 if req.get_cpu_time else 0) return do_http_post(req_xml, req.project) def query_job(req): req_xml = ('\n' '%s\n' '%s\n' '\n' ) %(req.authenticator, req.job_id) return do_http_post(req_xml, req.project) def abort_batch(req): req_xml = ('\n' '%s\n' '%s\n' '\n' ) %(req.authenticator, req.batch_id) return do_http_post(req_xml, req.project) def get_output_file(req): auth_str = md5.new(req.authenticator+req.instance_name).digest() name = req.instance_name file_num = req.file_num return project_url+"/get_output.php?cmd=result_file&result_name=%s&file_num=%s&auth_str=%s"%(name, file_num, auth_str) def get_output_files(req): auth_str = md5.new(req.authenticator+req.batch_id).digest() return project_url+"/get_output.php?cmd=batch_files&batch_id=%s&auth_str=%s"%(req.batch_id, auth_str) def retire_batch(req): req_xml = ('\n' '%s\n' '%s\n' '\n' ) %(req.authenticator, req.batch_id) return do_http_post(req_xml, project_url) ############ FILE MANAGEMENT API ############## class QUERY_FILES_REQ: def __init__(self): return def to_xml(self): xml = ('\n' '%s\n' class UPLOAD_FILES_REQ: def __init__(self): return def to_xml(self): xml = ('\n' '%s\n' def query_files(query_files_req): return do_http_post(query_files_req.to_xml(), req.project) def upload_files(upload_files_req): return do_http_post(upload_files_req.to_xml(), req.project)