Spaces:
Sleeping
Sleeping
| import os | |
| import json | |
| import random | |
| import shutil | |
| import hashlib | |
| import datetime | |
| from flask import Flask, request | |
| def get_key_sha256(key): | |
| sha256 = hashlib.sha256() | |
| sha256.update(key.encode('utf-8')) | |
| return sha256.hexdigest() | |
| match_sha256 = 'ffa007286cff75ab9c14e42282edd8e7e28b467a6e1bcd3d9b90dc40d375cae3' | |
| data_folder = 'jobs' | |
| stages = ['new', 'doing', 'done'] | |
| for stage in stages: | |
| os.makedirs(os.path.join(data_folder, stage), exist_ok=True) | |
| app = Flask(__name__) | |
| def put(): | |
| d = request.json | |
| key = d['key'] | |
| if not get_key_sha256(key) == match_sha256: | |
| return 'err' | |
| machine_type = d.get('machine_type', 'default') | |
| job = d['job'] | |
| sha256 = get_key_sha256(job) | |
| folder = os.path.join(data_folder, 'new', machine_type) | |
| doing_folder = os.path.join(data_folder, 'doing', machine_type) | |
| done_folder = os.path.join(data_folder, 'done', machine_type) | |
| os.makedirs(folder, exist_ok=True) | |
| os.makedirs(doing_folder, exist_ok=True) | |
| os.makedirs(done_folder, exist_ok=True) | |
| file = os.path.join(folder, sha256) | |
| job_json = {'creat_time': str(datetime.datetime.utcnow()), 'job': job, 'machine_type': machine_type} | |
| open(file, 'w').write(json.dumps(job_json)) | |
| return 'ok' | |
| def get(): | |
| d = request.json | |
| key = d['key'] | |
| if not get_key_sha256(key) == match_sha256: | |
| return 'err' | |
| machine_type = d['machine_type'] | |
| worker = d['worker'] | |
| folder = os.path.join(data_folder, 'new', machine_type) | |
| if not os.path.isdir(folder): | |
| return '' | |
| doing_folder = os.path.join(data_folder, 'doing', machine_type) | |
| files = os.listdir(folder) | |
| if len(files) == 0: | |
| return '' | |
| file = random.choice(files) | |
| source_file = os.path.join(folder, file) | |
| target_file = os.path.join(doing_folder, file) | |
| txt = open(source_file).read() | |
| job_json = json.loads(txt) | |
| job = job_json['job'] | |
| job_json['worker'] = worker | |
| json.dump(job_json, open(target_file, 'w')) | |
| try: | |
| os.remove(source_file) | |
| except: | |
| print('deleteerr') | |
| return json.dumps({'sha256': file, 'job': job, 'start_time': str(datetime.datetime.utcnow())}) | |
| def done(): | |
| d = request.json | |
| key = d['key'] | |
| if not get_key_sha256(key) == match_sha256: | |
| return 'err' | |
| sha256 = d['sha256'] | |
| machine_type = d['machine_type'] | |
| output = d['output'] | |
| dt = d['dt'] | |
| #start_time = d['start_time'] # could be found in doing file | |
| end_time = str(datetime.datetime.utcnow()) | |
| src = os.path.join(data_folder, 'doing', machine_type, sha256) | |
| dst = os.path.join(data_folder, 'done', machine_type, sha256) | |
| job_json = json.load(open(src)) | |
| job_json['dt'] = dt | |
| job_json['end_time'] = end_time | |
| dst_output = dst+'.output' | |
| json.dump(job_json, open(dst, 'w')) | |
| open(dst_output, 'w').write(output) | |
| try: | |
| os.remove(src) | |
| except: | |
| return 'derr' | |
| return 'ok' | |
| def get_folder_list(folder, full=False): | |
| machine_types = os.listdir(folder) | |
| d = {} | |
| for machine_type in machine_types: | |
| fs = os.listdir(os.path.join(folder, machine_type)) | |
| dd = {} | |
| for f in fs: | |
| if full: | |
| dd[f] = open(os.path.join(folder, machine_type, f)).read() | |
| else: | |
| dd[f] = open(os.path.join(folder, machine_type, f)).read(10) | |
| d[machine_type] = dd | |
| return d | |
| def stat(): | |
| d = request.json | |
| key = d['key'] | |
| if not get_key_sha256(key) == match_sha256: | |
| return 'err' | |
| full = int(d['full']) | |
| stat = {} | |
| stat['new'] = get_folder_list(os.path.join(data_folder, 'new'), full) | |
| stat['doing'] = get_folder_list(os.path.join(data_folder, 'doing'), full) | |
| stat['done'] = get_folder_list(os.path.join(data_folder, 'done'), full) | |
| return json.dumps(stat) | |
| def mv(): | |
| ''' | |
| move from doing to new | |
| ''' | |
| d = request.json | |
| key = d['key'] | |
| if not get_key_sha256(key) == match_sha256: | |
| return 'err' | |
| machine_type = d['machine_type'] | |
| sha256 = d['sha256'] | |
| src = os.path.join(data_folder, 'doing', machine_type, sha256) | |
| dst = os.path.join(data_folder, 'new', machine_type, sha256) | |
| os.system(f'mv {src} {dst}') | |
| return 'ok' | |
| def clear(): | |
| ''' | |
| clear all of new, doing, or done | |
| ''' | |
| d = request.json | |
| key = d['key'] | |
| if not get_key_sha256(key) == match_sha256: | |
| return 'err' | |
| what = d['what'] | |
| folder = os.path.join(data_folder, what) | |
| shutil.rmtree(folder) | |
| os.makedirs(folder) | |
| return 'ok' | |
| if __name__ == "__main__": | |
| app.run(host="0.0.0.0", port=7860, debug=True) | |