UNPKG

decentralized-internet

Version:

An NPM library of programs to create decentralized web and distributed computing projects

1 lines 2.58 kB
module.exports=function(t){var r=require("fs"),a=require("bluebird"),e=require("underscore"),n=require("child_process").spawn,s=require("path"),o=require("@hapi/joi"),u=(require("./executionserver.methods")(t),require("clusterpost-model")),i=require("xml2js").parseString,c={};return c.submitJob=function(t,i){return o.assert(t,u.job),new a(function(a,o){var u,c=t.parameters,b=[];t.jobparameters&&(b=e.clone(t.jobparameters)),b.push({flag:"-V"}),b.push({flag:"-d",name:i}),b.push({flag:"-e",name:"stderr.err"}),b.push({flag:"-o",name:"stdout.out"}),b.push({flag:"-M",name:t.userEmail}),u=t.name?t.name:t.userEmail,b.push({flag:"-N",name:u});var f="#!/bin/bash\n#### PBS preamble\n";f+="#PBS "+e.map(b,function(t){return e.compact([t.flag,t.name]).join(" ")}).join("\n#PBS ")+"\n",f+="#### End PBS preamble\n",f+='\nif [ -n "$PBS_O_WORKDIR" ]; then cd $PBS_O_WORKDIR; fi\n\n';var d="";c&&(d=" "+e.map(c,function(t){return e.compact([t.flag,t.name]).join(" ")}).join(" ")),f+=t.executable+d;try{var l=s.join(i,"script.pbs");r.writeFileSync(l,f);const t=n("qsub",[l]);var j="";t.stderr.on("data",function(t){j+=t});var m="";t.stdout.on("data",function(t){m+=t}),t.on("close",function(t){if(t)a({status:"FAIL",error:j+m});else try{var r=m.split(".")[0];a({jobid:Number.parseInt(r),status:"RUN"})}catch(t){o({status:"FAIL",error:j,stat:m})}})}catch(t){o({status:"FAIL",error:t})}})},c.getJobStatus=function(t){return o.assert(t.jobstatus,u.jobstatus),o.assert(t.jobstatus.jobid,o.number().required(),"Please execute the job first."),new a(function(r,s){try{var o=t.jobstatus.jobid;const c=n("qstat",["-x",o]);c.stderr.on("data",function(t){t});var u="";c.stdout.on("data",function(t){u+=t}),c.on("close",function(t){if(-1!==u.indexOf("Unknown Job Id Error"))return{status:"DONE",stat:u};var n;(n=u,new a(function(t,r){i(n,function(a,e){a?r(a):t(e)})})).then(function(t){if(t&&t.Data&&t.Data.Job&&e.isArray(t.Data.Job)&&1===t.Data.Job.length){var r=t.Data.Job[0];return(e.isArray(r.job_state)?-1!==e.findIndex(r.job_state,function(t){return"C"===t||"E"===t}):"C"===r.job_state||"E"===r.job_state)?{status:"DONE",stat:t}:{jobid:o,status:"RUN",stat:t}}return{status:"FAIL",stat:t}}).catch(function(t){return{status:"FAIL",error:t,stat:u}}).then(r).catch(s)})}catch(t){s(t)}})},c.killJob=function(t){return o.assert(t.jobstatus,u.jobstatus),new a(function(r,a){try{var e=t.jobstatus.jobid;const u=n("qdel",[e]);var s="";u.stderr.on("data",function(t){s+=t});var o="";u.stdout.on("data",function(t){o+=t}),u.on("close",function(t){r({status:"EXIT",stat:s+o})})}catch(t){a(t)}})},c};