From 0038770f9ef37fa765c74c264bf4ca2014227d3e Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 2 Jul 2024 16:42:11 -0400 Subject: [PATCH 001/126] pre diving deep to fine connection error --- package.json | 3 +- tools/MANIFEST.txt | 5 + tools/inc/misc_tools.mjs | 0 tools/inc/misc_tools.sh | 10 +- tools/jamrun | 39 +- tools/jamrun.mjs | 1021 ++++++++++++++++++++++++++++++++++++++ tools/jstart.js | 16 + 7 files changed, 1072 insertions(+), 22 deletions(-) create mode 100644 tools/MANIFEST.txt create mode 100644 tools/inc/misc_tools.mjs create mode 100755 tools/jamrun.mjs create mode 100644 tools/jstart.js diff --git a/package.json b/package.json index 28dd1c4c7..f2e386dd1 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,8 @@ "random-js": "^2.1.0", "redis": "^2.8.0", "toml": "3.0.0", - "ws": "^8.13.0" + "ws": "^8.13.0", + "zx": "^8.0.2" }, "engines": { "node": ">= 12.22", diff --git a/tools/MANIFEST.txt b/tools/MANIFEST.txt new file mode 100644 index 000000000..7e40c3c5c --- /dev/null +++ b/tools/MANIFEST.txt @@ -0,0 +1,5 @@ +VERSION = 2.0 +DESCRIPTION = JAMScript executable file +NAME = undefined +CREATE-TIME = 1719428633839 +JDATA = true diff --git a/tools/inc/misc_tools.mjs b/tools/inc/misc_tools.mjs new file mode 100644 index 000000000..e69de29bb diff --git a/tools/inc/misc_tools.sh b/tools/inc/misc_tools.sh index faa06a696..d5182ec53 100644 --- a/tools/inc/misc_tools.sh +++ b/tools/inc/misc_tools.sh @@ -24,6 +24,7 @@ inc_counter() { ((value++)) result=$value else + #why setting both value and result? SHAHIN value=1 result=1 fi @@ -239,9 +240,9 @@ buildjargs() { local str= for x in $@; do str+=" " + local xtail="${x##*=}" local xhead="${x%=*}" - if [ ! -z $xtail ]; then str+=$x fi @@ -250,6 +251,7 @@ buildjargs() { str+=" --$type" results=$str + } buildcargs() { @@ -261,8 +263,12 @@ buildcargs() { if [ ! -z $xtail ]; then str+="$xhead $xtail" + fi + done - + results=$str + # echo "${results}" } +# echo "${results} \ No newline at end of file diff --git a/tools/jamrun b/tools/jamrun index 0f9035872..e222f0431 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -164,7 +164,7 @@ cleanup() { #kill -9 ${AOUT_PIDS[@]} #reset - cleanuptmux + # cleanuptmux exit 1 } @@ -177,7 +177,7 @@ dojamout_p2_fg() { buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" "--localregistryhost=$localregistryhost" local args=$results - echo $args + echo "these are my jArgs : ${args}" case $type in cloud) node jstart.js $args @@ -202,6 +202,7 @@ dojamout_p2_bg() { buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" local args=$results + echo "${args}, there are my args" if [ `uname` == "Linux" ]; then script -a -c "node jstart.js $args" -f log.j > /dev/null & @@ -231,7 +232,7 @@ doaout() { # execute the program.. we are in the folder.. buildcargs "-a=$jappid" "-p=$port" "-n=$counter" "-g=$group" "-t=$tags" "-o=$datap" local cargs=$results - + echo "these are my c args : ${cargs}" if [ -z $DISABLE_STDOUT_REDIRECT ]; then if [ -z $log ]; then $TMUX new-session -s $tmuxapp-$counter -d "$VALGRIND ./a.out $cargs" @@ -293,7 +294,7 @@ setuptmux() { echo "$tmuxapp" > $1/tmuxid save "$tmuxapp" $appfolder/tmuxid - trap cleanuptmux SIGINT + # trap cleanuptmux SIGINT } getappid() { @@ -313,19 +314,19 @@ getappid() { save "$jappid" $appfolder/appid } -killtmux() { - for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do - echo $q - tmux kill-session -t $q - done -} +# killtmux() { +# for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do +# echo $q +# tmux kill-session -t $q +# done +# } -cleanuptmux() { - #if [ ! -z $tmuxapp ]; then - #killtmux $tmuxapp - #fi - exit -} +# cleanuptmux() { +# #if [ ! -z $tmuxapp ]; then +# #killtmux $tmuxapp +# #fi +# exit +# } startredis() { local port=$1 @@ -736,9 +737,9 @@ if [ -e "$file" ]; then setuptmux $folder/$iport doaout $num $iport $group $dport dojamout_p2 $type $iport $folder $group - if [ -z $bg ]; then - cleanuptmux - fi + # if [ -z $bg ]; then + # # cleanuptmux + # fi ;; esac else diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs new file mode 100755 index 000000000..241d795a2 --- /dev/null +++ b/tools/jamrun.mjs @@ -0,0 +1,1021 @@ +#!/usr/bin/env zx +import { fileURLToPath } from 'url'; +import { dirname, basename, extname} from 'path'; +import { homedir, type } from 'os'; +import { fs } from 'zx'; +//REPLACE $RANDOM WITH MORE REAL VALUES +//PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected +//ABSTRACT ALL THE WRITES AWAAAAYYY +//QUESTION: WE ONLY CREATE ONE MQTT BROKER?!?!?! +//HOW TO REPLACE THE RANDOM VARIABLE IN BASH SCRIPTING?? +/** + * trap cleanup SIGTERM SIGINT SIGKILL + * QUESTION: I do not thing the SIGKILL is being trapped at all + */ + +process.on('SIGINT', () => {cleanup(), cleanuptmux()}); +process.on('SIGTERM', () => cleanup()); + +function die(error){ + process.stderr.write(`${error}\n`); + process.exit(1); +}; +let HOME = os.homedir(); +let jappid; +let VALGRIND; +let iflow; +let oflow; +//NOTE: don't need to check if the directory exists +//NODE: ABSOLUTE PATH INSTEAD OF RELATIVE +//source "$IDIR/inc/misc_tools.sh" (IMPORT THE FUNCTIONS ONE BY ONE WHEN IT IS NEEDED) +const mqttPromiseProcesses= []; +const filePath = fileURLToPath(import.meta.url); +const IDIR = dirname(filePath); +const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); +//we run on node not shell(this is not shellPID but node PID) +const SHELLPID = process.pid; +const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; +let NOVERBOSE=1 +let tmuxapp; +let RANDOM; +let appfolder; +let DISABLE_STDOUT_REDIRECT; + +// const Machine = (() =>{ +// switch (type().toLowerCase()) { +// case "linux": +// return "Linux"; +// case "darwin": +// return "Mac"; +// default: +// return `UNKNOWN:${type()}` +// } +// })(); + +const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( + ["mosquitto","mosquitto_pub", "tmux"].map( + async (entry)=> { + try{ + const p = await $`which ${entry}`; + return p.stdout.trim(); + } + catch(error){ + switch(entry){ + case "tmux": + die("tmux not installed. Quitting.") + case "mosquitto_pub": + die("mosquitto_pub (MQTT tools) not installed. Quitting.") + case "mosquitto": + die("mosquitto (MQTT broker) not installed. Quitting.") + } + } + } + ) +) + +function show_usage(){ + const usageMessage = + ` + jamrun program.jxe + Runs J and C node, one each, of a device with program.jxe + under a default application name 'app-N'. To run under a different + app name X, use the --app=X option. + + jamrun program.jxe --fog + Runs a fog node (only J node) with program.jxe. Similarly, the --cloud + flag runs a cloud node. + + By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the + data store. The Redis server needs to be started before launching the + application. To use a different Redis server use the --data option. + + jamrun program.jxe --data=127.0.0.1:7000 + Runs program.jxe and connects it to an already running Redis server at + port 7000 of the local host. Redis server can run outside the + local host (Redis needs to the configured to accept outside + connections). + + To start more than one C node at a device use the following command. + jamrun program.jxe --num=4 + + To provide a set of tags to the program, use the following command. + jamrun program.jxe --tag="param1, param2" + + Use the --bg option to run a command in the background.fr + + Use the --old option to run the previous version in .jamruns folder. + You can edit that version and rerun a custom version of a file. + + Use the --log option to turn on logging. This is useful for programs where + the C side is crashing at the startup. The tmux console would not run when + the program crash at startup. So the --log option allows us to see the + program error messages. + + Use the --verb option to turn on verbose messaging. + + Use --valgrind to run the cside with valgrind for leak checking. + + Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. + + Usage: jamrun file.jxe + [--app=appl_name] + [--fog|--cloud] + [--num=num_c_devs] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--bg] + [--old] + [--iflow=flow_name] + [--oflow=flow_name] + [--log] + [--verb] + [--loc=long,lat] + [--edge=num_edge_connections] + [--valgrind] + [--local] + + The jamrun command creates a run state in the $HOME/.jamruns folder. + `; + + console.log(usageMessage); + +} + + +//TOBE TESTED +async function startmqtt(port, cFile){ + // console.log(cFile, "this is my cfile") + //Check whether the MQTT server is running.. if not start it + //QUESTION : why aren't we throwing an error?SHAHIN: what if it is running on another server?? + //how does the error hanfling work over here? + //what ensures tht it is waiting for the mqtt to actually run ? + try{ + await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); + } + catch(error){ + if(!NOVERBOSE) + console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); + const mqttPromiseProcess = $`${MOSQUITTO} -c ${cFile}`.stdio('ignore', 'pipe', 'pipe').quiet().nothrow(); + mqttPromiseProcesses.push(mqttPromiseProcess) + return; + } +} +//missing argument for dojamOut_p2 querion what is happeing +// function dojamout(type, iport, folder, group=null) { +// dojamout_p1 (type , iport ,folder) +// dojamout_p2 (type , iport ,folder) +// } + +async function dojamout_p1(pnum ,floc) { + + await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) + //just writing the string? + fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); + fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); + //SHELL PID CAN BE PROCESS ID IN NODE WHAT DO WE EXACTLY WANT OVER HERE< CAN THEU BE USED INTERCHANGABLY? + fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); + //just writing string?//WE can do more + fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); +} + + +async function dojamout_p2(type, iport, folder, group=null){ + if(!bg) + + await dojamout_p2_fg(type, iport, folder, group) + else + + dojamout_p2_bg(type, iport, folder, group) +} + +function cleanup(){ + if(killbroker === 1){ + // console.log(`Killing broker with PID: ${mqttPromiseProcess}`) + mqttPromiseProcess.kill("SIGTERM"); + } + /** + * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX + **/ + // cleanuptmux(); + process.exit(1) +} + +async function dojamout_p2_fg(type, pnum, floc, group=null){ + + //why shouldn't I do this in place? + // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` + //what if it is not? + let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` + + console.log("these are my jargs: ", jargs) + + if(type === "cloud" || type === "fog" || type === "device"){ + //not really running in the fg. we just await so it's blockking(maybe use the current approch in bash script) + // console.log("STARTING THE JS FILE") + // console.log(floc) + const p =await $`cd ${floc} && node jstart.js ${jargs}` + // const p =await $`node jstart.js ${jargs}` + + // console.log(p.stdout) + + } + + cleanup() +} +//don't forget to address the missmatching argument +function dojamout_p2_bg(type, pnum, floc, group=null){ + const args = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` + + // if(Machine === "Linux"){ + // //NOT TRUE BG .SEE IF IT CAUSES ERROR OR NOT(make sure to check if it is terminated or not before existing ) + // const p = $`script -a -c "node jstart.js ${args}" -f log.j > /dev/null`.stdio('ignore', 'pipe', 'pipe') + // } + + // else{ + // const p = $`script -a -t 1 log.j node jstart.js $args > /dev/null` + // } + //I don't think it needs to be machine specific + // const p = $`node jstart.js ${args}`.stdio('ignore', 'pipe', 'pipe'); + const p = $`node jstart.js ${args}`.stdio('ignore', 'pipe', 'pipe'); + + p.stdout.pipe(fs.createWriteStream("./log.j"), { flags: 'a' }); + p.stderr.pipe(fs.createWriteStream("./log.j"), { flags: 'a' }); + + + + if(!NOVERBOSE){ + console.log("Started the J node in background") + } +} + +//how to check this?SHAHIN +async function doaout(num,port,group,datap,myf){ + let counter=1 + if (fs.existsSync('a.out')) { + await $`chmod +x a.out` + } + while(counter <= num){ + if(fs.existsSync('a.out')){ + // let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -t ${tags} -o ${datap}` + let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -o ${datap}` + console.log("these are my cargs", cargs) + if(!DISABLE_STDOUT_REDIRECT){ + if (!log) + { + + await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d`; + //HOW DO WE DEAL WITH THE CASES WITHOUT VALGRID IN AN OK WAY? + if(VALGRIND) + await $`cd ${myf} && ${TMUX} send-keys -t ${tmuxapp}-${counter} ${VALGRIND} ./a.out ${cargs} C-m`; + else + await $`cd ${myf} && ${TMUX} send-keys -t ${tmuxapp}-${counter} ./a.out ${cargs} C-m`; + } + + else{ + if(Machine === "Linux"){ + //TO BE FIXE + let p = await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d script -a -c "${VALGRIND} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") + // console.log(p.stdout) + // console.log(p.stdout) + } + + else{ + //TO BE FIXE + let p = await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") + // console.log(p.stdout) + // console.log(p.stdout) + } + } + } + else{ + let p = await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") + // console.log(p.stdout) + // console.log(p.stdout) + } + } + counter++; + if(!NOVERBOSE) + console.log("Started a C node") + } +} +//THIS IS VERY HARD TO TEST FOR ME +async function portavailable(folder,port) { + let pid; + if(fs.existsSync(`./${folder}/${port}`)){ + // console.log("folder exist") + if(fs.existsSync(`${folder}/${port}/processId`)){ + // console.log("process ID exists") + try{ + pid = fs.readFileSync(`${folder}/${port}/processId`) + } + catch(error){ + pid = null; + } + + if(pid === "new"){ + // console.log("PID is new") + porttaken=1; + } + else if(pid){ + // console.log("pid is in the folder") + //this can be imporved by keeping track of the proccessesPromise directly(why do we do all this writes?) + porttaken= await $`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` + } + else{ + // console.log("pid is not in the folder") + porttaken=0; + } + } + else{ + // console.log("process ID Not exists") + porttaken=0; + } + } + else{ + // console.log("folder NOT exist") + porttaken=0; + } + if(porttaken === 0){ + // console.log("port taken is zero") + const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() + // console.log(p.stdout.trim(), "this is my stdout") + porttaken= p.stdout.trim() + } +} + +function setuptmux(path) { + if(!tmuxid){ + tmuxapp=`tg-${Math.floor(Math.random() * 32768)}` + } + else{ + tmuxapp=tmuxid; + } + + //is it fine if this is blocking (the save is not synchroness in misc_tools.sh and why we use Save helper insted of doing it here) + fs.writeFileSync(`${path}/tmuxid`,tmuxapp.toString()+"\n"); + fs.writeFileSync(`${appfolder}/tmuxid`,tmuxapp.toString()+"\n"); + +} + + + +function getappid(mainf, localf, appid){ + if(appid === "app-n"){ + // console.log(appid, "this is my app id") + //can be imporved by a try catch instead + let result; + if(fs.existsSync(`${mainf}/counter`)){ + // console.log("it's a main f") + let value = fs.readFileSync(`${mainf}/counter`); + result = Number(value.toString().trim()) + 1; + } + else{ + result = 1; + } + fs.writeFileSync(`${mainf}/counter`, `${result}\n`) + fs.writeFileSync(`${localf}/appid`, `app-${result}\n`) + } + else{ + fs.writeFileSync(`${localf}/appid`,`${appid}`) + } + jappid = fs.readFileSync(`${localf}/appid`) + // console.log("this is my jappid", jappid) + fs.writeFileSync(`${appfolder}/appid`,`${jappid}`) +} + +// async function killtmux(sesh){ +// const result = await $`tmux ls | grep ${sesh} | cut -d ':' -f 1`; +// for (const q of result.stdout.trim().split('\n')) { +// console.log(q); +// await $`tmux kill-session -t ${q}`; +// } +// } +// ASK about this function logic specially how it exists +// function cleanuptmux() { +// process.exit(1); +// } +//there should be better ways to do this(CHECK THIS STEP) +function startredis(port) { + //should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) + //discuss the version you have in the bash vs this + $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow(); +} +//there should be better ways to do this(CHECK THIS STEP) +async function waitforredis(port){ + while (true) { + const p = await $`redis-cli -p ${port} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() + // console.log(p.stdout) + if (p.stdout.trim() === "PONG") { + break; + } + if (!NOVERBOSE) { + console.log("Trying to find Redis server..."); + } + await sleep(1000) + } + + if (!NOVERBOSE) { + console.log(`Redis running at port: ${port}`); + } +} +//HOW TO CHECK IF RADIS IS ACTUALLY SET(WHAT IT IS EXACTLY USED FOR?) +async function setupredis(port) { + await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` + await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` + //I feel like the syntacs is off//spacing Added MODIFICATION + await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` + + + +} + + +async function resolvedata(Name) { + const [host, port] = Name.split(':'); + // console.log(port, "redis port is this ") + startredis(Number(port)); + await waitforredis(port); + await setupredis(port); + + if(host === "docker"){ + const ipaddr= `hostname -I` + Name = `${ipaddr}:${port}` + } + + //trim space left behind by hostname -I + data = Name.split(/\s+/).join(''); + // console.log(data) +} +async function unpack(pfile, folder){ + const file = pfile + if(!old){ + let p; + if(!fs.existsSync("./MANIFEST.txt")){ + try{ + p = await $`cd ${folder} && unzip -o ${file}`.quiet() + } + catch(error){ + die(`Problem reading file: ${file}\n${error}`) + } + + } + else{ + const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; + const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; + const ntime = p1.stdout.trim(); + const ontime = p2.stdout.trim(); + let p3; + if(ntime > ontime){ + try{ + p3 = await $`cd ${folder} && unzip -oq ${file}`.quiet() + } + catch(error){ + die(`Problem reading file: ${file}\n${error}`) + } + } + } + } +} + +async function getheight(folder) { + + const p = await $`cd ${folder} && grep MAX-HEIGHT MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() + return p.stdout.trim() +} + +async function getjdata(folder) { + const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() + return p.stdout.trim() +} + +function getlonglat(loc) { + return [long, lat] = loc.split(","); +} + +function generatelonglat() { + const a = Math.floor(Math.random() * 180); + const b = Math.floor(Math.random() * 10000); + const long=`${a}.${b}` + const c= Math.floor(Math.random() * 90); + const d = Math.floor(Math.random() * 10000); + const lat=`${c}.${d}` + return [long,lat] + +} + +let app="app-n" +//note: the key word has changed +let Type="device" +let data = "127.0.0.1:6379" +let num=1 +let tags; +let bg; +let old; +let local; +let porttaken=0; +let tmuxid; +let log; +let edge=1 +let localregistryhost=0 +let killbroker=0 + +let [long, lat] = generatelonglat(); + +//processing the args to +//bad bad bad +let args = process.argv.filter((entry) => (entry != 'jamrun.mjs' && !entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) +// this step can be abstracted away and improved to be more detailed +if(args.length === 0 || args[0].toLowerCase() === "-h" || args[0].toLowerCase() === "--help"){ + show_usage(); + process.exit(1); +} +const file = `${args[0]}`; +const fext = file.split(".").pop() +args = args.filter((_,index) => (index !== 0 )); + +if(fext !== "jxe"){ + if(!fext) + die(`${file} is not file name or missing extention`); + else + die(`Extension on ${file} is not .jxe`); +} +//////this is really bad fix it ASAP +//arg processing is very poorly design for a js script +while(true){ + //pooorly handled + if(args.length === 0){ + break; + } + + if( "--help" === args[0].toLowerCase()|| "-h" === args[0].toLowerCase()){ + show_usage(); + process.exit(1); + } + else if("--app"=== args[0].toLowerCase()){ + if(args.length > 1){ + //can be imporove --app = + app = args[1]; + args = args.filter((_,index) => (index !== 0 && index !== 1)); + + } + else + die('ERROR: "--app" requires a non-empty option argument.') + } + + + else if(args[0].toLowerCase() === "--app=") + //--app= 3 -> error + die( 'ERROR: "--args" requires a non-empty option argument.') + + else if(args[0].includes("--app=") || args[0].includes("--App=")) { + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + app = value; + args = args.filter((_,index) => (index !== 0)); + } + else if(args[0].toLowerCase() === "--tags"){ + + if(args.length > 1){ + tags = args[1]; + args = args.filter((_,index) => (index !== 0 && index !== 1)); + } + else + die('ERROR: "--tags" requires a non-empty option argument.') + } + + else if(args[0].toLowerCase() === "--tags=") + die('ERROR: "--tags" requires a non-empty option argument.') + + else if(args[0].includes("--Tags=") || args[0].includes("--tags=")){ + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + tags = value; + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase() === "--tmux"){ + + if(args.length > 1){ + tmuxid = args[1]; + args = args.filter((_,index) => (index !== 0 && index !== 1)); + } + else + die('ERROR: "--tmux" requires a non-empty option argument.') + } + + else if(args[0].toLowerCase() === "--tmux=") + die('ERROR: "--tmux" requires a non-empty option argument.') + + else if(args[0].includes("--tmux=") || args[0].includes("--Tmux=")){ + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + tmuxid = value; + args = args.filter((_,index) => (index !== 0)); + } + + + else if(args[0].toLowerCase() === "--num"){ + + if(args.length > 1){ + num = args[1]; + args = args.filter((_,index) => (index !== 0 && index !== 1)); + } + else + die('ERROR: "--num" requires a non-empty option argument.') + } + + else if(args[0].toLowerCase() === "--num=") + die('ERROR: "--num" requires a non-empty option argument.') + + else if(args[0].includes("--num=") || args[0].includes("--Num=")){ + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + num = value; + args = args.filter((_,index) => (index !== 0)); + } + + + + + else if(args[0].toLowerCase() === "--loc"){ + + if(args.length > 1){ + //this shpuld not be a getter but a setter + [long, lat] = getlonglat(args[1]) + args = args.filter((_,index) => (index !== 0 && index !== 1)); + } + else + die('ERROR: "--loc" requires a non-empty option argument.') + } + + else if(args[0].toLowerCase() === "--loc=") + die('ERROR: "--loc" requires a non-empty option argument.') + + else if(args[0].includes("--Loc=") || args[0].includes("--loc=")){ + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + //this shpuld not be a getter but a setter + [long, lat] = getlonglat(value) + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase()=== "--edge"){ + + if(args.length > 1){ + edge = args[1]; + args = args.filter((_,index) => (index !== 0 && index !== 1)); + } + else + die('ERROR: "--edge" requires a non-empty option argument.') + } + + else if(args[0].toLowerCase() === "--edge=") + die('ERROR: "--edge" requires a non-empty option argument.') + + else if(args[0].includes("--edge=") || args[0].includes("--Edge=")){ + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + edge = value; + args = args.filter((_,index) => (index !== 0)); + } + + + + else if(args[0].toLowerCase() === "--data="){ + + if(args.length > 1){ + data = args[1]; + args = args.filter((_,index) => (index !== 0 && index !== 1)); + } + else + die('ERROR: "--data" requires a non-empty option argument.') + } + + else if(args[0].toLowerCase() === "--data") + die('ERROR: "--data" requires a non-empty option argument.') + + else if(args[0].includes("--data=") || args[0].includes("--Data=")){ + const [_, ...rest] = args[0].split("="); + const value = rest.join(''); + data = value; + args = args.filter((_,index) => (index !== 0)); + } + + + else if(args[0].toLowerCase() === "--fog"){ + //Do we mean == device + if( Type != "device"){ + die( 'ERROR: "type" cannot be reassigned.') + } + else{ + Type = "fog" + num = undefined; + args = args.filter((_,index) => (index !== 0)); + } + } + + else if(args[0].toLowerCase() === "--cloud"){ + //Do we mean == device + if( Type != "device"){ + die( 'ERROR: "type" cannot be reassigned.') + } + else{ + Type = "cloud" + num = undefined; + args = args.filter((_,index) => (index !== 0)); + } + } + + else if(args[0].toLowerCase() === "--cloud"){ + //Do we mean == device + if( Type != "device"){ + die( 'ERROR: "type" cannot be reassigned.') + } + else{ + Type = "cloud" + num = undefined; + args = args.filter((_,index) => (index !== 0)); + } + } + + else if(args[0].toLowerCase() === "--device"){ + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase() === "--local_registry"){ + localregistryhost=1; + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase() === "--temp_broker"){ + killbroker=1; + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase() === "--bg"){ + bg=1; + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase() === "--verb"){ + NOVERBOSE=undefined; + args = args.filter((_,index) => (index !== 0)); + } + + else if(args[0].toLowerCase() === "--log"){ + log=1 + args = args.filter((_,index) => (index !== 0)); + } + else if(args[0].toLowerCase() === "--old"){ + old=1 + args = args.filter((_,index) => (index !== 0)); + } + else if(args[0].toLowerCase() === "--local"){ + local=1 + args = args.filter((_,index) => (index !== 0)); + } + else if(args[0].toLowerCase() === "--valgrind"){ + VALGRIND="$VALGRIND_OPTS" + args = args.filter((_,index) => (index !== 0)); + } + else if(args[0].toLowerCase() === "--disable-stdout-redirect"){ + DISABLE_STDOUT_REDIRECT=1 + args = args.filter((_,index) => (index !== 0)); + } + else{ + //fix this to err instead of stdout + // console.log(`WARN: Unknown option (ignored):${ args[0]}`) + args = args.filter((_,index) => (index !== 0)); + } +} + + + +if(Type !== "device"){ + edge = undefined; + if(num){ + die("number of devices can't be speciied for fog/cloud") + } + if(edge){ + die( "number of edge connections can't be specified for fog/cloud") + } + +} + +if(fs.existsSync(`./${file}`)){ + /** + * replace by try catch + */ + const jamfolder=`${HOME}/.jamruns` + if(!fs.existsSync(jamfolder,{ recursive: true })){ + fs.mkdirSync(jamfolder) + } + /** + * replace by try catch + */ + //FileManager for all the scripts + appfolder=`${jamfolder}/apps`; + /** + * replace by try catch + */ + if(!fs.existsSync(appfolder,{ recursive: true })){ + fs.mkdirSync(appfolder) + } + /** + * replace by try catch + */ + const filenoext = path.basename(file, path.extname(file)); + const folder=`${appfolder}/${filenoext}_${app}` + if(!fs.existsSync(folder,{ recursive: true })){ + + fs.mkdirSync(folder) + } + //Be careful about changing the file directory + const ifile = path.resolve(file); + // console.log(ifile) + //NOTE THIS CHANGE THE CWD BUT NOT PWD AND THIS NEEDS TO BE CONSIDERED THATS WHY FOLDER IS PASSED TO UNPACK + process.chdir(folder); + await unpack(ifile, folder) + const height = await getheight(folder); + const jdata = await getjdata(folder); + let dport; + if(fs.existsSync(`./jstart.js`)){ + let group; + //soppused to overwrite? + fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) + fs.writeFileSync(`${appfolder}/app`, `${app}\n`) + switch(Type){ + case "device": + //SHAHIN: EVEN WHEN IT IS RUNNING I'M FACING NO AN JUST GET ANOTHER PORTISSUES + const iport=1883; + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + // console.log(iport , "this is my port") + } + // console.log(porttaken, "this is my port takken") + + if(!local){ + //what is exactly happening here? + group= iport-1882 + // console.log(group, "this is group") + } + else + group = 0; + if(jdata){ + // console.log("data is true") + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + //teird + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + // console.log("data before jamout", data) + await dojamout_p1(iport,folsder) + setuptmux(`${folder}/${iport}`) + await doaout(num,iport, group, dport,folder) + // const p = await $`redis-cli -p ${iport} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() + const p = await $`redis-cli -p ${dport} -c PING` + const p2 = await $`redis-cli -p ${dport} CONFIG GET protected-mode`.quiet(); + console.log(p2.stdout.trim()) + console.log(p.stdout) + // console.log("jsfile port is this : ", iport) + await dojamout_p2(Type, iport, folder, group) + + } + + } + else{ + die(`File: ${file} is not a valid JAMScript executable`) + } + + + + +} +else{ + die( `File: ${file} not found`) +} + + + +// if [ -e "$file" ]; then + +// # Check whether the global .jamruns folder is there +// jamfolder=$HOME"/.jamruns" +// create_missingdir $jamfolder + +// # Check whether the app folder is there +// appfolder=$jamfolder/apps +// create_missingdir $appfolder + +// # Get the folder +// filenoext="${file%.*}" +// filenoext="${filenoext##*/}" +// folder=$appfolder/$filenoext"_"$app +// create_missingdir $folder + +// #save handle to file +// ifile="$(cd "$(dirname "$file")"; pwd)/$(basename "$file")" +// cd $folder +// unpack $ifile # We are already in $folder +// # find the machine height +// getheight +// getjdata + +// if [ -e jstart.js ]; then +// # save the current program information for short cut use +// save "$filenoext" $appfolder/program +// save "$app" $appfolder/app + +// # execute the program.. we are in the folder.. +// case $type in +// cloud) +// iport=9883 +// while [ : ]; do +// portavailable $folder $iport +// [[ $porttaken == 1 ]] || break +// ((iport++)) +// done +// if [ "$jdata" = true ]; then +// dport=$((iport + 20000)) +// resolvedata "127.0.0.1:$dport" +// fi +// create_missingdir $folder/$iport +// create_conffile "${folder}/${iport}/mqtt.conf" $iport +// getappid $jamfolder $folder/$iport $app +// dojamout $type $iport $folder +// ;; +// fog) +// iport=5883 +// while [ : ]; do +// portavailable $folder $iport +// [[ $porttaken == 1 ]] || break +// ((iport++)) +// done +// if [ "$jdata" = true ]; then +// dport=$((iport + 20000)) +// resolvedata "127.0.0.1:$dport" +// fi +// create_missingdir $folder/$iport +// create_conffile "${folder}/${iport}/mqtt.conf" $iport +// getappid $jamfolder $folder/$iport $app +// dojamout $type $iport $folder +// ;; +// device) +// iport=1883 +// while [ : ]; do +// portavailable $folder $iport +// [[ $porttaken == 1 ]] || break +// ((iport++)) +// done +// if [ -z $local ]; then +// group="$((iport-1882))" +// else +// group=0 +// fi +// if [ "$jdata" = true ]; then +// dport=$((iport + 20000)) +// resolvedata "127.0.0.1:$dport" +// fi +// create_missingdir $folder/$iport +// create_conffile "${folder}/${iport}/mqtt.conf" $iport +// getappid $jamfolder $folder/$iport $app +// dojamout_p1 $type $iport $folder +// setuptmux $folder/$iport +// doaout $num $iport $group $dport +// dojamout_p2 $type $iport $folder $group +// if [ -z $bg ]; then +// cleanuptmux +// fi +// ;; +// esac +// else +// die "File: $file is not a valid JAMScript executable" +// fi + +// else +// die "File: $file not found" +// fi + + + + + + + + + + + + diff --git a/tools/jstart.js b/tools/jstart.js new file mode 100644 index 000000000..921ee2338 --- /dev/null +++ b/tools/jstart.js @@ -0,0 +1,16 @@ +const minicore = require('core/minicore'); +const jaminit = require('core/jaminit'); +const JAMCore = require('core/jamcore'); + +const mbox = new Map(); +async function launch() { + console.log("------"); + minicore.init('./jamout.js', []); + var ports = await minicore.run(); + var jsys = await jaminit.run(); + var jcore = new JAMCore(jsys, jaminit.reggie); + jcore.registerFuncs(mbox); + await jcore.run(); + jcore.addWorker(ports.app); +} +launch().then(() => console.log("Starting App..")); \ No newline at end of file From 2bdd0cfd48eb909cfbf9d85012f1ff7784552b96 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 2 Jul 2024 22:31:27 -0400 Subject: [PATCH 002/126] mid fix, semi working --- tools/jamrun.mjs | 79 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 241d795a2..6dac74140 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -3,6 +3,8 @@ import { fileURLToPath } from 'url'; import { dirname, basename, extname} from 'path'; import { homedir, type } from 'os'; import { fs } from 'zx'; +const { spawn } = require('child_process'); + //REPLACE $RANDOM WITH MORE REAL VALUES //PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected //ABSTRACT ALL THE WRITES AWAAAAYYY @@ -25,6 +27,7 @@ let jappid; let VALGRIND; let iflow; let oflow; +const childs =[] //NOTE: don't need to check if the directory exists //NODE: ABSOLUTE PATH INSTEAD OF RELATIVE //source "$IDIR/inc/misc_tools.sh" (IMPORT THE FUNCTIONS ONE BY ONE WHEN IT IS NEEDED) @@ -191,7 +194,10 @@ async function dojamout_p2(type, iport, folder, group=null){ function cleanup(){ if(killbroker === 1){ // console.log(`Killing broker with PID: ${mqttPromiseProcess}`) - mqttPromiseProcess.kill("SIGTERM"); + mqttPromiseProcesses.kill("SIGTERM"); + } + for (let p of childs){ + p.kill("SIGTERM") } /** * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX @@ -205,7 +211,8 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ //why shouldn't I do this in place? // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` //what if it is not? - let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` + // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` + let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; console.log("these are my jargs: ", jargs) @@ -213,14 +220,21 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ //not really running in the fg. we just await so it's blockking(maybe use the current approch in bash script) // console.log("STARTING THE JS FILE") // console.log(floc) - const p =await $`cd ${floc} && node jstart.js ${jargs}` + // const p =await $`cd ${floc} && node jstart.js ${jargs}` // const p =await $`node jstart.js ${jargs}` - - // console.log(p.stdout) + console.log(floc) + const command = 'node'; + const args = ['jstart.js', ...jargs]; + const options = { + cwd: floc, + stdio: 'inherit' + }; + const child = spawn(command, args, options); + childs.push(child) } - cleanup() + // cleanup() } //don't forget to address the missmatching argument function dojamout_p2_bg(type, pnum, floc, group=null){ @@ -383,17 +397,22 @@ function getappid(mainf, localf, appid){ fs.writeFileSync(`${appfolder}/appid`,`${jappid}`) } -// async function killtmux(sesh){ -// const result = await $`tmux ls | grep ${sesh} | cut -d ':' -f 1`; -// for (const q of result.stdout.trim().split('\n')) { -// console.log(q); -// await $`tmux kill-session -t ${q}`; -// } -// } +async function killtmux(sesh){ + const result = await $`tmux ls | grep ${sesh} | cut -d ':' -f 1`; + for (const q of result.stdout.trim().split('\n')) { + console.log(q); + await $`tmux kill-session -t ${q}`; + } +} // ASK about this function logic specially how it exists -// function cleanuptmux() { -// process.exit(1); -// } +function cleanuptmux() { + for(p of childs){ + console.log(p); + p.kill('SIGTERM'); + } + process.exit(1); + +} //there should be better ways to do this(CHECK THIS STEP) function startredis(port) { //should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) @@ -881,7 +900,7 @@ if(fs.existsSync(`./${file}`)){ getappid(jamfolder, `${folder}/${iport}` ,app) // console.log("data before jamout", data) - await dojamout_p1(iport,folsder) + await dojamout_p1(iport,folder) setuptmux(`${folder}/${iport}`) await doaout(num,iport, group, dport,folder) // const p = await $`redis-cli -p ${iport} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() @@ -1017,5 +1036,27 @@ else{ - - +// if(fs.existsSync(`./${file}`)){ +// /** +// * replace by try catch +// */ +// const jamfolder=`${HOME}/.jamruns` +// if(!fs.existsSync(jamfolder,{ recursive: true })){ +// fs.mkdirSync(jamfolder) +// } +// /** +// * replace by try catch +// */ +// //FileManager for all the scripts +// appfolder=`${jamfolder}/apps`; +// /** +// * replace by try catch +// */ +// if(!fs.existsSync(appfolder,{ recursive: true })){ +// fs.mkdirSync(appfolder) +// } +// /** +// * replace by try catch +// */ +// const filenoext = path.basename(file, path.extname(file)); +// const folder=`${appfolder}/${filenoext}_${app}` \ No newline at end of file From e8e3bb2a3868cb50a56d95a8eaba65401f575cf7 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 3 Jul 2024 16:33:37 -0400 Subject: [PATCH 003/126] first draft --- tools/jamrun | 41 +++++++++++++-------------- tools/jamrun.mjs | 74 +++++++++++++++++++++++++++++++++++++++--------- tools/test.mjs | 39 +++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 34 deletions(-) create mode 100644 tools/test.mjs diff --git a/tools/jamrun b/tools/jamrun index e222f0431..555f98f38 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -164,7 +164,7 @@ cleanup() { #kill -9 ${AOUT_PIDS[@]} #reset - # cleanuptmux + cleanuptmux exit 1 } @@ -177,7 +177,7 @@ dojamout_p2_fg() { buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" "--localregistryhost=$localregistryhost" local args=$results - echo "these are my jArgs : ${args}" + echo $args case $type in cloud) node jstart.js $args @@ -202,7 +202,6 @@ dojamout_p2_bg() { buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" local args=$results - echo "${args}, there are my args" if [ `uname` == "Linux" ]; then script -a -c "node jstart.js $args" -f log.j > /dev/null & @@ -232,7 +231,7 @@ doaout() { # execute the program.. we are in the folder.. buildcargs "-a=$jappid" "-p=$port" "-n=$counter" "-g=$group" "-t=$tags" "-o=$datap" local cargs=$results - echo "these are my c args : ${cargs}" + if [ -z $DISABLE_STDOUT_REDIRECT ]; then if [ -z $log ]; then $TMUX new-session -s $tmuxapp-$counter -d "$VALGRIND ./a.out $cargs" @@ -294,7 +293,7 @@ setuptmux() { echo "$tmuxapp" > $1/tmuxid save "$tmuxapp" $appfolder/tmuxid - # trap cleanuptmux SIGINT + trap cleanuptmux SIGINT } getappid() { @@ -314,19 +313,19 @@ getappid() { save "$jappid" $appfolder/appid } -# killtmux() { -# for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do -# echo $q -# tmux kill-session -t $q -# done -# } +killtmux() { + for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do + echo $q + tmux kill-session -t $q + done +} -# cleanuptmux() { -# #if [ ! -z $tmuxapp ]; then -# #killtmux $tmuxapp -# #fi -# exit -# } +cleanuptmux() { + #if [ ! -z $tmuxapp ]; then + #killtmux $tmuxapp + #fi + exit +} startredis() { local port=$1 @@ -737,9 +736,9 @@ if [ -e "$file" ]; then setuptmux $folder/$iport doaout $num $iport $group $dport dojamout_p2 $type $iport $folder $group - # if [ -z $bg ]; then - # # cleanuptmux - # fi + if [ -z $bg ]; then + cleanuptmux + fi ;; esac else @@ -748,4 +747,4 @@ if [ -e "$file" ]; then else die "File: $file not found" -fi +fi \ No newline at end of file diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 6dac74140..ffde84a08 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -3,7 +3,7 @@ import { fileURLToPath } from 'url'; import { dirname, basename, extname} from 'path'; import { homedir, type } from 'os'; import { fs } from 'zx'; -const { spawn } = require('child_process'); +const { spawn,spawnSync } = require('child_process'); //REPLACE $RANDOM WITH MORE REAL VALUES //PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected @@ -164,10 +164,10 @@ async function startmqtt(port, cFile){ } } //missing argument for dojamOut_p2 querion what is happeing -// function dojamout(type, iport, folder, group=null) { -// dojamout_p1 (type , iport ,folder) -// dojamout_p2 (type , iport ,folder) -// } +async function dojamout(type, iport, folder, group=null) { + await dojamout_p1 (type , iport ,folder) + await dojamout_p2 (type , iport ,folder) +} async function dojamout_p1(pnum ,floc) { @@ -196,9 +196,9 @@ function cleanup(){ // console.log(`Killing broker with PID: ${mqttPromiseProcess}`) mqttPromiseProcesses.kill("SIGTERM"); } - for (let p of childs){ - p.kill("SIGTERM") - } + // for (let p of childs){ + // p.kill("SIGTERM") + // } /** * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX **/ @@ -230,7 +230,8 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ stdio: 'inherit' }; - const child = spawn(command, args, options); + // const child = spawn(command, args, options); + const child = spawnSync(command, args, options); childs.push(child) } @@ -406,10 +407,7 @@ async function killtmux(sesh){ } // ASK about this function logic specially how it exists function cleanuptmux() { - for(p of childs){ - console.log(p); - p.kill('SIGTERM'); - } + process.exit(1); } @@ -864,6 +862,56 @@ if(fs.existsSync(`./${file}`)){ fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) fs.writeFileSync(`${appfolder}/app`, `${app}\n`) switch(Type){ + case "cloud": + iport=9883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + } + if(jdata){ + // console.log("data is true") + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout( Type, iport, folder) + + case "fog": + iport=5883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + } + if(jdata){ + // console.log("data is true") + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout( Type, iport, folder) + case "device": //SHAHIN: EVEN WHEN IT IS RUNNING I'M FACING NO AN JUST GET ANOTHER PORTISSUES const iport=1883; diff --git a/tools/test.mjs b/tools/test.mjs new file mode 100644 index 000000000..7dd11d7a6 --- /dev/null +++ b/tools/test.mjs @@ -0,0 +1,39 @@ +#!/usr/bin/env zx + +// let HOME = os.homedir(); +// console.log(HOME) +// let jargs = "--app=test1 --port=1883 --group=1 --data=127.0.0.1:21883 --edge=1 --long=123.7404 --lat=15.1625 --localregistryhost=0 --device" + + +// let floc = `${HOME}/.jamruns/apps/jt2_test1` +// const p = $`(cd ${floc} && node jstart.js ${jargs})` +// // console.log(p.stdout) + +const { spawn } = require('child_process'); +const os = require('os'); +const path = require('path'); + +let HOME = os.homedir(); +console.log(`Home directory: ${HOME}`); + +let jargs = ["--app=test1", "--port=1883", "--group=1", "--data=127.0.0.1:21883", "--edge=1", "--long=123.7404", "--lat=15.1625", "--localregistryhost=0", "--device"]; + +let floc = path.join(HOME, '.jamruns', 'apps', 'jt2_test1'); +console.log(`App directory: ${floc}`); + +const command = 'node'; +const args = ['jstart.js', ...jargs]; +const options = { + cwd: floc, + stdio: 'inherit' +}; + +const child = spawn(command, args, options); + +// child.on('error', (error) => { +// console.error(`Error: ${error.message}`); +// }); + +// child.on('close', (code) => { +// console.log(`Child process exited with code ${code}`); +// }); \ No newline at end of file From 58030b57c4a871bcc45f2e55cbb9d94179d298e0 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 3 Jul 2024 17:20:12 -0400 Subject: [PATCH 004/126] first working draft for device/cloud/fog level --- tools/jamrun.mjs | 197 +++++++++-------------------------------------- 1 file changed, 37 insertions(+), 160 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index ffde84a08..be1f07331 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -164,17 +164,22 @@ async function startmqtt(port, cFile){ } } //missing argument for dojamOut_p2 querion what is happeing -async function dojamout(type, iport, folder, group=null) { - await dojamout_p1 (type , iport ,folder) - await dojamout_p2 (type , iport ,folder) +async function dojamout(iport, folder, group=null) { + await dojamout_p1 (iport ,folder) + await dojamout_p2 (iport ,folder) } async function dojamout_p1(pnum ,floc) { await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) //just writing the string? + fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); + + fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); + + //SHELL PID CAN BE PROCESS ID IN NODE WHAT DO WE EXACTLY WANT OVER HERE< CAN THEU BE USED INTERCHANGABLY? fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); //just writing string?//WE can do more @@ -196,9 +201,7 @@ function cleanup(){ // console.log(`Killing broker with PID: ${mqttPromiseProcess}`) mqttPromiseProcesses.kill("SIGTERM"); } - // for (let p of childs){ - // p.kill("SIGTERM") - // } + /** * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX **/ @@ -214,7 +217,7 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; - console.log("these are my jargs: ", jargs) + if(type === "cloud" || type === "fog" || type === "device"){ //not really running in the fg. we just await so it's blockking(maybe use the current approch in bash script) @@ -222,7 +225,7 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ // console.log(floc) // const p =await $`cd ${floc} && node jstart.js ${jargs}` // const p =await $`node jstart.js ${jargs}` - console.log(floc) + const command = 'node'; const args = ['jstart.js', ...jargs]; const options = { @@ -232,10 +235,10 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ // const child = spawn(command, args, options); const child = spawnSync(command, args, options); - childs.push(child) + } - // cleanup() + cleanup() } //don't forget to address the missmatching argument function dojamout_p2_bg(type, pnum, floc, group=null){ @@ -273,7 +276,6 @@ async function doaout(num,port,group,datap,myf){ if(fs.existsSync('a.out')){ // let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -t ${tags} -o ${datap}` let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -o ${datap}` - console.log("these are my cargs", cargs) if(!DISABLE_STDOUT_REDIRECT){ if (!log) { @@ -290,22 +292,19 @@ async function doaout(num,port,group,datap,myf){ if(Machine === "Linux"){ //TO BE FIXE let p = await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d script -a -c "${VALGRIND} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") - // console.log(p.stdout) - // console.log(p.stdout) + } else{ //TO BE FIXE let p = await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") - // console.log(p.stdout) - // console.log(p.stdout) + } } } else{ let p = await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") - // console.log(p.stdout) - // console.log(p.stdout) + } } counter++; @@ -414,17 +413,28 @@ function cleanuptmux() { //there should be better ways to do this(CHECK THIS STEP) function startredis(port) { //should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) - //discuss the version you have in the bash vs this + $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow(); + + } //there should be better ways to do this(CHECK THIS STEP) async function waitforredis(port){ while (true) { - const p = await $`redis-cli -p ${port} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() - // console.log(p.stdout) + console.log("this is the port we have", port) + let p + try{ + // const p = await $`redis-cli -p ${port} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() + p = await $`redis-cli -p ${port} -c PING` if (p.stdout.trim() === "PONG") { - break; + break; + } + + } + catch(error){ } + + if (!NOVERBOSE) { console.log("Trying to find Redis server..."); } @@ -861,7 +871,9 @@ if(fs.existsSync(`./${file}`)){ //soppused to overwrite? fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) fs.writeFileSync(`${appfolder}/app`, `${app}\n`) + let iport; switch(Type){ + case "cloud": iport=9883 while(true){ @@ -885,7 +897,7 @@ if(fs.existsSync(`./${file}`)){ fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout( Type, iport, folder) + await dojamout(iport, folder) case "fog": iport=5883 @@ -910,11 +922,11 @@ if(fs.existsSync(`./${file}`)){ fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout( Type, iport, folder) + await dojamout(iport, folder) case "device": //SHAHIN: EVEN WHEN IT IS RUNNING I'M FACING NO AN JUST GET ANOTHER PORTISSUES - const iport=1883; + iport=1883; while(true){ await portavailable(folder ,iport) if(porttaken !== 1){ @@ -972,139 +984,4 @@ if(fs.existsSync(`./${file}`)){ } else{ die( `File: ${file} not found`) -} - - - -// if [ -e "$file" ]; then - -// # Check whether the global .jamruns folder is there -// jamfolder=$HOME"/.jamruns" -// create_missingdir $jamfolder - -// # Check whether the app folder is there -// appfolder=$jamfolder/apps -// create_missingdir $appfolder - -// # Get the folder -// filenoext="${file%.*}" -// filenoext="${filenoext##*/}" -// folder=$appfolder/$filenoext"_"$app -// create_missingdir $folder - -// #save handle to file -// ifile="$(cd "$(dirname "$file")"; pwd)/$(basename "$file")" -// cd $folder -// unpack $ifile # We are already in $folder -// # find the machine height -// getheight -// getjdata - -// if [ -e jstart.js ]; then -// # save the current program information for short cut use -// save "$filenoext" $appfolder/program -// save "$app" $appfolder/app - -// # execute the program.. we are in the folder.. -// case $type in -// cloud) -// iport=9883 -// while [ : ]; do -// portavailable $folder $iport -// [[ $porttaken == 1 ]] || break -// ((iport++)) -// done -// if [ "$jdata" = true ]; then -// dport=$((iport + 20000)) -// resolvedata "127.0.0.1:$dport" -// fi -// create_missingdir $folder/$iport -// create_conffile "${folder}/${iport}/mqtt.conf" $iport -// getappid $jamfolder $folder/$iport $app -// dojamout $type $iport $folder -// ;; -// fog) -// iport=5883 -// while [ : ]; do -// portavailable $folder $iport -// [[ $porttaken == 1 ]] || break -// ((iport++)) -// done -// if [ "$jdata" = true ]; then -// dport=$((iport + 20000)) -// resolvedata "127.0.0.1:$dport" -// fi -// create_missingdir $folder/$iport -// create_conffile "${folder}/${iport}/mqtt.conf" $iport -// getappid $jamfolder $folder/$iport $app -// dojamout $type $iport $folder -// ;; -// device) -// iport=1883 -// while [ : ]; do -// portavailable $folder $iport -// [[ $porttaken == 1 ]] || break -// ((iport++)) -// done -// if [ -z $local ]; then -// group="$((iport-1882))" -// else -// group=0 -// fi -// if [ "$jdata" = true ]; then -// dport=$((iport + 20000)) -// resolvedata "127.0.0.1:$dport" -// fi -// create_missingdir $folder/$iport -// create_conffile "${folder}/${iport}/mqtt.conf" $iport -// getappid $jamfolder $folder/$iport $app -// dojamout_p1 $type $iport $folder -// setuptmux $folder/$iport -// doaout $num $iport $group $dport -// dojamout_p2 $type $iport $folder $group -// if [ -z $bg ]; then -// cleanuptmux -// fi -// ;; -// esac -// else -// die "File: $file is not a valid JAMScript executable" -// fi - -// else -// die "File: $file not found" -// fi - - - - - - - - - - -// if(fs.existsSync(`./${file}`)){ -// /** -// * replace by try catch -// */ -// const jamfolder=`${HOME}/.jamruns` -// if(!fs.existsSync(jamfolder,{ recursive: true })){ -// fs.mkdirSync(jamfolder) -// } -// /** -// * replace by try catch -// */ -// //FileManager for all the scripts -// appfolder=`${jamfolder}/apps`; -// /** -// * replace by try catch -// */ -// if(!fs.existsSync(appfolder,{ recursive: true })){ -// fs.mkdirSync(appfolder) -// } -// /** -// * replace by try catch -// */ -// const filenoext = path.basename(file, path.extname(file)); -// const folder=`${appfolder}/${filenoext}_${app}` \ No newline at end of file +} \ No newline at end of file From 9bcdead5000d21db9de59d15f84e14c7b1fc4d7f Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 3 Jul 2024 17:50:02 -0400 Subject: [PATCH 005/126] bg working --- tools/jamrun.mjs | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index be1f07331..00d45c578 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -201,7 +201,11 @@ function cleanup(){ // console.log(`Killing broker with PID: ${mqttPromiseProcess}`) mqttPromiseProcesses.kill("SIGTERM"); } - + if(childs.length!=0){ + for(let p of childs){ + p.kill("SIGTERM") + } + } /** * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX **/ @@ -234,7 +238,7 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ }; // const child = spawn(command, args, options); - const child = spawnSync(command, args, options); + spawnSync(command, args, options); } @@ -242,7 +246,7 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ } //don't forget to address the missmatching argument function dojamout_p2_bg(type, pnum, floc, group=null){ - const args = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` + // const jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` // if(Machine === "Linux"){ // //NOT TRUE BG .SEE IF IT CAUSES ERROR OR NOT(make sure to check if it is terminated or not before existing ) @@ -254,11 +258,25 @@ function dojamout_p2_bg(type, pnum, floc, group=null){ // } //I don't think it needs to be machine specific // const p = $`node jstart.js ${args}`.stdio('ignore', 'pipe', 'pipe'); - const p = $`node jstart.js ${args}`.stdio('ignore', 'pipe', 'pipe'); - - p.stdout.pipe(fs.createWriteStream("./log.j"), { flags: 'a' }); - p.stderr.pipe(fs.createWriteStream("./log.j"), { flags: 'a' }); - + let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; + const command = 'node'; + const args = ['jstart.js', ...jargs]; + const options = { + cwd: floc, + stdio: ['ignore', 'pipe', 'pipe'] + }; + + const p = spawn(command, args, options); + childs.push(p); + p.stdout.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); + p.stderr.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); + p.on('error', (error) => { + console.error(`Error: ${error.message}`); + }); + + p.on('close', (code) => { + console.log(`Child process exited with code ${code}`); + }); if(!NOVERBOSE){ From 077675dcd7e7f4894ad793b0e4bd7113f17ddcd3 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 4 Jul 2024 06:00:27 -0400 Subject: [PATCH 006/126] pre varName Refactor --- package.json | 2 +- tools/jamrun.mjs | 461 ++++++++++++++++++++-------------------------- tools/parsArg.mjs | 131 +++++++++++++ 3 files changed, 332 insertions(+), 262 deletions(-) create mode 100644 tools/parsArg.mjs diff --git a/package.json b/package.json index f2e386dd1..005d9dd1b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "cbor-x": "1.5.4", - "command-line-args": ">= 3.0.5", + "command-line-args": "^5.2.1", "command-line-usage": "^6.1.0", "express": "^4.18.2", "ioredis": "^5.3.2", diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 00d45c578..cb607e3fd 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,60 +1,76 @@ #!/usr/bin/env zx +import {jamrunParsArg} from './parsArg.mjs' + + import { fileURLToPath } from 'url'; import { dirname, basename, extname} from 'path'; import { homedir, type } from 'os'; import { fs } from 'zx'; const { spawn,spawnSync } = require('child_process'); - -//REPLACE $RANDOM WITH MORE REAL VALUES -//PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected -//ABSTRACT ALL THE WRITES AWAAAAYYY -//QUESTION: WE ONLY CREATE ONE MQTT BROKER?!?!?! -//HOW TO REPLACE THE RANDOM VARIABLE IN BASH SCRIPTING?? -/** - * trap cleanup SIGTERM SIGINT SIGKILL - * QUESTION: I do not thing the SIGKILL is being trapped at all +/*** + * NOTES + * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected + * 2) ABSTRACT ALL THE WRITES AWAY + * 3) the SIGKILL is being trapped at all + * 4) iFlow , oflow NOT BEING SET, I ADDED THEM. MAKE SURE IT'S NEEDED AND IT'S STRING + * 5) TODO: MAKE SURE ALL THE DIRECTORIES WE USE EXIST + * 6) TAKE CARE OF THE RELATIVE PATHS + * 7) abstract waiting for mqtt and redis + * 8) CLEAR FILES ONCLOSE(EX: LOG FILE) + * 9)if [ -e jstart.js ]; then Search this up in the js file. this does not make sence to me. it should check if the jxe has the jStart or not + * 10) why aren't we checking the content of the jxe file? */ +// + + + +//SETUP CLEANING process.on('SIGINT', () => {cleanup(), cleanuptmux()}); process.on('SIGTERM', () => cleanup()); +//REPLACE DIE WITH THROWING DIRECT ERROR function die(error){ process.stderr.write(`${error}\n`); process.exit(1); }; +//MOVE HOME TO CONST FILE let HOME = os.homedir(); +//MOVE IT TO THE MAIN PROCESS, RETURN CONST IN APP ID let jappid; +//SET IN THE ARGCHECK FILE let VALGRIND; +//SET IN THE ARGCHECK FILE let iflow; +//SET IN THE ARGCHECK FILE let oflow; +//TO KEEP TRACK OF BG PROCESSES const childs =[] -//NOTE: don't need to check if the directory exists -//NODE: ABSOLUTE PATH INSTEAD OF RELATIVE -//source "$IDIR/inc/misc_tools.sh" (IMPORT THE FUNCTIONS ONE BY ONE WHEN IT IS NEEDED) +//DO WE NEED THE MQTT PROCESSES +//RETURN IT InStEAD const mqttPromiseProcesses= []; +//SET REDIS PATH UP const filePath = fileURLToPath(import.meta.url); const IDIR = dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); + //we run on node not shell(this is not shellPID but node PID) const SHELLPID = process.pid; + +//ADD TO THE CONSTATNT FILES const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; +//SET IN THE ARGCHECK FILE let NOVERBOSE=1 +//THIS IS ALWAYS EQUAL TMAXID +//SET IN THE ARGCHECK FILE let tmuxapp; -let RANDOM; +//SET IN THE MAIN PROCESS let appfolder; +//SET IN THE ARGCHECK FILE let DISABLE_STDOUT_REDIRECT; -// const Machine = (() =>{ -// switch (type().toLowerCase()) { -// case "linux": -// return "Linux"; -// case "darwin": -// return "Mac"; -// default: -// return `UNKNOWN:${type()}` -// } -// })(); +//setup const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ["mosquitto","mosquitto_pub", "tmux"].map( async (entry)=> { @@ -76,6 +92,7 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ) ) + function show_usage(){ const usageMessage = ` @@ -147,11 +164,7 @@ function show_usage(){ //TOBE TESTED async function startmqtt(port, cFile){ - // console.log(cFile, "this is my cfile") //Check whether the MQTT server is running.. if not start it - //QUESTION : why aren't we throwing an error?SHAHIN: what if it is running on another server?? - //how does the error hanfling work over here? - //what ensures tht it is waiting for the mqtt to actually run ? try{ await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); } @@ -163,7 +176,7 @@ async function startmqtt(port, cFile){ return; } } -//missing argument for dojamOut_p2 querion what is happeing + async function dojamout(iport, folder, group=null) { await dojamout_p1 (iport ,folder) await dojamout_p2 (iport ,folder) @@ -172,17 +185,12 @@ async function dojamout(iport, folder, group=null) { async function dojamout_p1(pnum ,floc) { await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - //just writing the string? + //TODO: JAMOUT FILE DIRECTORY ABSTRACTION TODO fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); - - fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); - - - //SHELL PID CAN BE PROCESS ID IN NODE WHAT DO WE EXACTLY WANT OVER HERE< CAN THEU BE USED INTERCHANGABLY? fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); - //just writing string?//WE can do more + //just writing string?WE CAN KEEP TRACK OF ACTUAL PROCESS ID fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); } @@ -198,7 +206,7 @@ async function dojamout_p2(type, iport, folder, group=null){ function cleanup(){ if(killbroker === 1){ - // console.log(`Killing broker with PID: ${mqttPromiseProcess}`) + console.log(`Killing broker with PID: ${mqttPromiseProcesses}`) mqttPromiseProcesses.kill("SIGTERM"); } if(childs.length!=0){ @@ -215,20 +223,14 @@ function cleanup(){ async function dojamout_p2_fg(type, pnum, floc, group=null){ - //why shouldn't I do this in place? + //TODO: parsArg for J FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` - //what if it is not? // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; if(type === "cloud" || type === "fog" || type === "device"){ - //not really running in the fg. we just await so it's blockking(maybe use the current approch in bash script) - // console.log("STARTING THE JS FILE") - // console.log(floc) - // const p =await $`cd ${floc} && node jstart.js ${jargs}` - // const p =await $`node jstart.js ${jargs}` const command = 'node'; const args = ['jstart.js', ...jargs]; @@ -236,28 +238,14 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ cwd: floc, stdio: 'inherit' }; - - // const child = spawn(command, args, options); spawnSync(command, args, options); - } - cleanup() } -//don't forget to address the missmatching argument function dojamout_p2_bg(type, pnum, floc, group=null){ - // const jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` - - // if(Machine === "Linux"){ - // //NOT TRUE BG .SEE IF IT CAUSES ERROR OR NOT(make sure to check if it is terminated or not before existing ) - // const p = $`script -a -c "node jstart.js ${args}" -f log.j > /dev/null`.stdio('ignore', 'pipe', 'pipe') - // } - // else{ - // const p = $`script -a -t 1 log.j node jstart.js $args > /dev/null` - // } - //I don't think it needs to be machine specific - // const p = $`node jstart.js ${args}`.stdio('ignore', 'pipe', 'pipe'); + //TODO: parsArg for J FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) + // const jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; const command = 'node'; const args = ['jstart.js', ...jargs]; @@ -284,7 +272,6 @@ function dojamout_p2_bg(type, pnum, floc, group=null){ } } -//how to check this?SHAHIN async function doaout(num,port,group,datap,myf){ let counter=1 if (fs.existsSync('a.out')) { @@ -292,6 +279,7 @@ async function doaout(num,port,group,datap,myf){ } while(counter <= num){ if(fs.existsSync('a.out')){ + //TODO: parsArg for C FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) // let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -t ${tags} -o ${datap}` let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -o ${datap}` if(!DISABLE_STDOUT_REDIRECT){ @@ -330,13 +318,12 @@ async function doaout(num,port,group,datap,myf){ console.log("Started a C node") } } -//THIS IS VERY HARD TO TEST FOR ME + + async function portavailable(folder,port) { let pid; if(fs.existsSync(`./${folder}/${port}`)){ - // console.log("folder exist") if(fs.existsSync(`${folder}/${port}/processId`)){ - // console.log("process ID exists") try{ pid = fs.readFileSync(`${folder}/${port}/processId`) } @@ -345,32 +332,24 @@ async function portavailable(folder,port) { } if(pid === "new"){ - // console.log("PID is new") porttaken=1; } else if(pid){ - // console.log("pid is in the folder") - //this can be imporved by keeping track of the proccessesPromise directly(why do we do all this writes?) porttaken= await $`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` } else{ - // console.log("pid is not in the folder") porttaken=0; } } else{ - // console.log("process ID Not exists") porttaken=0; } } else{ - // console.log("folder NOT exist") porttaken=0; } if(porttaken === 0){ - // console.log("port taken is zero") const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() - // console.log(p.stdout.trim(), "this is my stdout") porttaken= p.stdout.trim() } } @@ -383,7 +362,7 @@ function setuptmux(path) { tmuxapp=tmuxid; } - //is it fine if this is blocking (the save is not synchroness in misc_tools.sh and why we use Save helper insted of doing it here) + //TODO: ABSTRACT THE TMUX SETUP. fs.writeFileSync(`${path}/tmuxid`,tmuxapp.toString()+"\n"); fs.writeFileSync(`${appfolder}/tmuxid`,tmuxapp.toString()+"\n"); @@ -393,11 +372,9 @@ function setuptmux(path) { function getappid(mainf, localf, appid){ if(appid === "app-n"){ - // console.log(appid, "this is my app id") - //can be imporved by a try catch instead + //TODO: can be imporved by a try catch instead let result; if(fs.existsSync(`${mainf}/counter`)){ - // console.log("it's a main f") let value = fs.readFileSync(`${mainf}/counter`); result = Number(value.toString().trim()) + 1; } @@ -411,10 +388,9 @@ function getappid(mainf, localf, appid){ fs.writeFileSync(`${localf}/appid`,`${appid}`) } jappid = fs.readFileSync(`${localf}/appid`) - // console.log("this is my jappid", jappid) fs.writeFileSync(`${appfolder}/appid`,`${jappid}`) } - +//MAYBE USED LATER async function killtmux(sesh){ const result = await $`tmux ls | grep ${sesh} | cut -d ':' -f 1`; for (const q of result.stdout.trim().split('\n')) { @@ -422,37 +398,34 @@ async function killtmux(sesh){ await $`tmux kill-session -t ${q}`; } } -// ASK about this function logic specially how it exists +//MAYBE USED LATER function cleanuptmux() { - process.exit(1); - } -//there should be better ways to do this(CHECK THIS STEP) + function startredis(port) { - //should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) + //should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow(); - } -//there should be better ways to do this(CHECK THIS STEP) +//TODO, abstract the wait away async function waitforredis(port){ while (true) { console.log("this is the port we have", port) let p + try{ - // const p = await $`redis-cli -p ${port} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() - p = await $`redis-cli -p ${port} -c PING` - if (p.stdout.trim() === "PONG") { - break; - } - + p = await $`redis-cli -p ${port} -c PING` + if (p.stdout.trim() === "PONG") { + break; + } + } + catch(error){ } - if (!NOVERBOSE) { console.log("Trying to find Redis server..."); } @@ -463,21 +436,16 @@ async function waitforredis(port){ console.log(`Redis running at port: ${port}`); } } -//HOW TO CHECK IF RADIS IS ACTUALLY SET(WHAT IT IS EXACTLY USED FOR?) async function setupredis(port) { + await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` - //I feel like the syntacs is off//spacing Added MODIFICATION await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` - - - } async function resolvedata(Name) { const [host, port] = Name.split(':'); - // console.log(port, "redis port is this ") startredis(Number(port)); await waitforredis(port); await setupredis(port); @@ -489,9 +457,10 @@ async function resolvedata(Name) { //trim space left behind by hostname -I data = Name.split(/\s+/).join(''); - // console.log(data) } + async function unpack(pfile, folder){ + const file = pfile if(!old){ let p; @@ -526,9 +495,11 @@ async function getheight(folder) { const p = await $`cd ${folder} && grep MAX-HEIGHT MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() return p.stdout.trim() + } async function getjdata(folder) { + const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() return p.stdout.trim() } @@ -548,6 +519,7 @@ function generatelonglat() { } +//these should be options let app="app-n" //note: the key word has changed let Type="device" @@ -566,26 +538,13 @@ let killbroker=0 let [long, lat] = generatelonglat(); -//processing the args to -//bad bad bad -let args = process.argv.filter((entry) => (entry != 'jamrun.mjs' && !entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) -// this step can be abstracted away and improved to be more detailed -if(args.length === 0 || args[0].toLowerCase() === "-h" || args[0].toLowerCase() === "--help"){ - show_usage(); - process.exit(1); -} -const file = `${args[0]}`; -const fext = file.split(".").pop() -args = args.filter((_,index) => (index !== 0 )); +jamrunParsArg(process.argv) + + -if(fext !== "jxe"){ - if(!fext) - die(`${file} is not file name or missing extention`); - else - die(`Extension on ${file} is not .jxe`); -} //////this is really bad fix it ASAP //arg processing is very poorly design for a js script + while(true){ //pooorly handled if(args.length === 0){ @@ -835,7 +794,7 @@ while(true){ } - +//SET IN THE ARGCHECK FILE if(Type !== "device"){ edge = undefined; if(num){ @@ -846,160 +805,140 @@ if(Type !== "device"){ } } - -if(fs.existsSync(`./${file}`)){ - /** - * replace by try catch - */ - const jamfolder=`${HOME}/.jamruns` - if(!fs.existsSync(jamfolder,{ recursive: true })){ - fs.mkdirSync(jamfolder) - } - /** - * replace by try catch - */ - //FileManager for all the scripts - appfolder=`${jamfolder}/apps`; - /** - * replace by try catch - */ - if(!fs.existsSync(appfolder,{ recursive: true })){ - fs.mkdirSync(appfolder) - } - /** - * replace by try catch - */ - const filenoext = path.basename(file, path.extname(file)); - const folder=`${appfolder}/${filenoext}_${app}` - if(!fs.existsSync(folder,{ recursive: true })){ - - fs.mkdirSync(folder) - } - //Be careful about changing the file directory - const ifile = path.resolve(file); - // console.log(ifile) - //NOTE THIS CHANGE THE CWD BUT NOT PWD AND THIS NEEDS TO BE CONSIDERED THATS WHY FOLDER IS PASSED TO UNPACK - process.chdir(folder); - await unpack(ifile, folder) - const height = await getheight(folder); - const jdata = await getjdata(folder); - let dport; - if(fs.existsSync(`./jstart.js`)){ - let group; - //soppused to overwrite? - fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) - fs.writeFileSync(`${appfolder}/app`, `${app}\n`) - let iport; - switch(Type){ - - case "cloud": - iport=9883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - // console.log("data is true") - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) +//TODO: HAVE A MAIN FUNCTION +/** + * replace by try catch + */ +//FileManager for all the scripts +const jamfolder=`${HOME}/.jamruns` +if(!fs.existsSync(jamfolder,{ recursive: true })){ + fs.mkdirSync(jamfolder) +} +appfolder=`${jamfolder}/apps`; +if(!fs.existsSync(appfolder,{ recursive: true })){ + fs.mkdirSync(appfolder) +} +const filenoext = path.basename(file, path.extname(file)); +const folder=`${appfolder}/${filenoext}_${app}` +if(!fs.existsSync(folder,{ recursive: true })){ + fs.mkdirSync(folder) +} +//Be careful about changing the file directory +const ifile = path.resolve(file); +process.chdir(folder); +await unpack(ifile, folder) +//height is never used +const height = await getheight(folder); +const jdata = await getjdata(folder); +let dport; +//SHOULD THIS ChECK THE UNPACKED PART?! +if(fs.existsSync(`./jstart.js`)){ + let group; + //soppused to overwrite? + fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) + fs.writeFileSync(`${appfolder}/app`, `${app}\n`) + let iport; + switch(Type){ + + case "cloud": + iport=9883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; } - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout(iport, folder) + iport++; + } + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - case "fog": - iport=5883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - // console.log("data is true") - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout(iport, folder) - - case "device": - //SHAHIN: EVEN WHEN IT IS RUNNING I'M FACING NO AN JUST GET ANOTHER PORTISSUES - iport=1883; - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - // console.log(iport , "this is my port") + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout(iport, folder) + + case "fog": + iport=5883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; } - // console.log(porttaken, "this is my port takken") + iport++; + } + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout(iport, folder) - if(!local){ - //what is exactly happening here? - group= iport-1882 - // console.log(group, "this is group") - } - else - group = 0; - if(jdata){ - // console.log("data is true") - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - //teird - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) + case "device": + + iport=1883; + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; } - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - // console.log("data before jamout", data) - await dojamout_p1(iport,folder) - setuptmux(`${folder}/${iport}`) - await doaout(num,iport, group, dport,folder) - // const p = await $`redis-cli -p ${iport} -c PING`.stdio('ignore', 'pipe', 'ignore').quiet() - const p = await $`redis-cli -p ${dport} -c PING` - const p2 = await $`redis-cli -p ${dport} CONFIG GET protected-mode`.quiet(); - console.log(p2.stdout.trim()) - console.log(p.stdout) - // console.log("jsfile port is this : ", iport) - await dojamout_p2(Type, iport, folder, group) + iport++; + } - } + if(!local){ + //what is exactly happening here? + group= iport-1882 + // console.log(group, "this is group") + } + else + group = 0; + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY - } - else{ - die(`File: ${file} is not a valid JAMScript executable`) - } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout_p1(iport,folder) + setuptmux(`${folder}/${iport}`) + await doaout(num,iport, group, dport,folder) - + await dojamout_p2(Type, iport, folder, group) + + } } else{ - die( `File: ${file} not found`) -} \ No newline at end of file + die(`File: ${file} is not a valid JAMScript executable`) +} + + + + + diff --git a/tools/parsArg.mjs b/tools/parsArg.mjs new file mode 100644 index 000000000..cdaac9d5f --- /dev/null +++ b/tools/parsArg.mjs @@ -0,0 +1,131 @@ +#!/usr/bin/env zx +import commandLineArgs from 'command-line-args'; +import { fs } from 'zx'; +const path = require('path'); + +function generatelonglat() { + const a = Math.floor(Math.random() * 180); + const b = Math.floor(Math.random() * 10000); + const long=`${a}.${b}` + const c= Math.floor(Math.random() * 90); + const d = Math.floor(Math.random() * 10000); + const lat=`${c}.${d}` + return [long,lat] + +} +let [long, lat] = generatelonglat(); + +const jamrunOptionDefinitions = [ + { name: 'help', alias: 'h', type: Boolean, defaultValue: false}, + {name : 'app', type: String , defaultValue: "app-n"}, + {name : 'tags', type: String , defaultValue: undefined}, + {name : 'iflow', type: String , defaultValue: undefined}, + {name : 'oflow', type: String , defaultValue: undefined}, + {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, + {name : 'num', type: Number , defaultValue: 1}, + {name : 'loc', type: String , defaultValue: `${long},${lat}`}, + {name : 'edge', type: Number , defaultValue: 1}, + {name : 'data', type: String , defaultValue: "127.0.0.1:6379"}, + {name : 'fog', type: Boolean, defaultValue: false}, + {name : 'cloud', type: Boolean, defaultValue: false}, + {name : 'device', type: Boolean, defaultValue: false}, + {name : 'local_registry', type: Boolean, defaultValue: false}, + {name : 'temp_broker', type: Boolean, defaultValue: false}, + {name : 'bg', type: Boolean, defaultValue: false}, + {name : 'verb', type: Boolean, defaultValue: false}, + {name : 'log', type: Boolean, defaultValue: false}, + {name : 'old', type: Boolean, defaultValue: false}, + {name : 'local', type: Boolean, defaultValue: false}, + {name : 'valgrind', type: Boolean, defaultValue: false}, + {name : 'disable-stdout-redirect', type: Boolean, defaultValue: false}, +]; + +const OptionToVarMap =new Map( + ["tmux","tmuxid"], + ["loc",["long","lat"]] +) + + +function retrieveType(device, fog, cloud){ + if(!fog && !device && !cloud){ + return "device"; + } + + else if( ((fog?1:0) + (device?1:0) + (cloud?1:0)) > 1){ + const error = new Error("Only one fog, device, cloud flag can be true") + error.type = 'MultiTypeFlag' + throw error; + } + + else{ + if(fog) + return "fog" + if(device) + return "device" + if(cloud) + return "cloud" + } + +} + +function getJamrunArgs(args){ + + let options + try{ + options = commandLineArgs(jamrunOptionDefinitions, {argv: args}); + } + catch(error){ + } + return options; + +} + +function checkJXEfile(arg){ + + if(arg.length === 0 || arg[0].toLowerCase() === "-h" || arg[0].toLowerCase() === "--help"){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; + } + const file = `${arg[0]}`; + const fext = file.split(".").pop() + if(fext !== "jxe"){ + if(!fext) + throw new Error(`${file} is not file name or missing extention`) + else + throw new Error(`Extension on ${file} is not .jxe`) + } + const absolutePath = path.resolve(file); + if(!fs.existsSync(absolutePath)){ + throw new Error(`File: ${file} not found`) + } +} + +//question one on remNote + +export function jamrunParsArg(argv){ + //remove redundent arfs + const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) + checkJXEfile(arg) + let proccessedArgs = arg.filter((_,index) => (index !== 0 )); + const options = getJamrunArgs(proccessedArgs); + if(!options || options.help){ + const error = new Error('SHOW USAGE'); + error.type = 'UsageError'; + throw error; + + } + for(let optionDefinition of jamrunOptionDefinitions ){ + if(options[optionDefinition.name] === null && optionDefinition.type != Boolean){ + const error = new Error(`--${optionDefinition.name} requires a non-empty option argument`); + error.type = 'OptionError'; + throw error; + } + } + + +} + + + + From 82f6a14e75c70be41e701b09017108f95a6f7392 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 4 Jul 2024 23:36:26 -0400 Subject: [PATCH 007/126] pre file directory abstraction --- tools/fileDirectory.mjs | 6 + tools/jamrun.mjs | 727 +++++++++++------------------- tools/{parsArg.mjs => parser.mjs} | 91 +++- 3 files changed, 337 insertions(+), 487 deletions(-) create mode 100644 tools/fileDirectory.mjs rename tools/{parsArg.mjs => parser.mjs} (57%) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs new file mode 100644 index 000000000..86375884d --- /dev/null +++ b/tools/fileDirectory.mjs @@ -0,0 +1,6 @@ +#!/usr/bin/env zx +let HOME = os.homedir(); + +export function fileDirectorySetUp(){ + +} \ No newline at end of file diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index cb607e3fd..965c607ea 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env zx -import {jamrunParsArg} from './parsArg.mjs' +import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; @@ -19,11 +19,22 @@ const { spawn,spawnSync } = require('child_process'); * 8) CLEAR FILES ONCLOSE(EX: LOG FILE) * 9)if [ -e jstart.js ]; then Search this up in the js file. this does not make sence to me. it should check if the jxe has the jStart or not * 10) why aren't we checking the content of the jxe file? + * 11) verify this error is true + * 12) we set edge equal undefined the check if it is defined or not. makes no sense (Type !== "device")(those checks are simply not working) + * 13) discuss what fields should be undefinecd and what fields should not be undefined + * 14) error check for cArg ad jArg? + * 15) a.out + * 16) ---------------- message-to-j [ + 0, 4, 6, 10, 12, 16, + 18, 22, 26, 28, 32, 34, + 38, 40, 44 +] J arg does not clearup */ // - - - +//global variables +let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, iflow, oflow, tags, file; +let porttaken=0; +let jappid; //SETUP CLEANING process.on('SIGINT', () => {cleanup(), cleanuptmux()}); @@ -35,39 +46,15 @@ function die(error){ process.exit(1); }; //MOVE HOME TO CONST FILE -let HOME = os.homedir(); -//MOVE IT TO THE MAIN PROCESS, RETURN CONST IN APP ID -let jappid; -//SET IN THE ARGCHECK FILE -let VALGRIND; -//SET IN THE ARGCHECK FILE -let iflow; -//SET IN THE ARGCHECK FILE -let oflow; -//TO KEEP TRACK OF BG PROCESSES const childs =[] -//DO WE NEED THE MQTT PROCESSES -//RETURN IT InStEAD const mqttPromiseProcesses= []; //SET REDIS PATH UP const filePath = fileURLToPath(import.meta.url); const IDIR = dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); - -//we run on node not shell(this is not shellPID but node PID) const SHELLPID = process.pid; - -//ADD TO THE CONSTATNT FILES -const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; -//SET IN THE ARGCHECK FILE -let NOVERBOSE=1 -//THIS IS ALWAYS EQUAL TMAXID -//SET IN THE ARGCHECK FILE -let tmuxapp; -//SET IN THE MAIN PROCESS let appfolder; //SET IN THE ARGCHECK FILE -let DISABLE_STDOUT_REDIRECT; //setup @@ -81,11 +68,11 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( catch(error){ switch(entry){ case "tmux": - die("tmux not installed. Quitting.") + throw new Error("tmux not installed. Quitting.") case "mosquitto_pub": - die("mosquitto_pub (MQTT tools) not installed. Quitting.") + throw new Error("mosquitto_pub (MQTT tools) not installed. Quitting.") case "mosquitto": - die("mosquitto (MQTT broker) not installed. Quitting.") + throw new Error("mosquitto (MQTT broker) not installed. Quitting.") } } } @@ -205,7 +192,7 @@ async function dojamout_p2(type, iport, folder, group=null){ } function cleanup(){ - if(killbroker === 1){ + if(temp_broker === 1){ console.log(`Killing broker with PID: ${mqttPromiseProcesses}`) mqttPromiseProcesses.kill("SIGTERM"); } @@ -223,11 +210,23 @@ function cleanup(){ async function dojamout_p2_fg(type, pnum, floc, group=null){ - //TODO: parsArg for J FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) - // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` - // let jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --edge=${edge} --long=${long} --lat=${lat} --localregistryhost=${localregistryhost} --${type}` - let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; + let argObject = { + "--app":jappid, + "--port":pnum, + "--group":group, + "--data":data, + "--tags":tags, + "--iflow":iflow, + "--oflow":oflow, + "--edge":edge, + "--long":long, + "--lat":lat, + "--localregistryhost":local_registry, + "--type": type + } + + let jargs = getJargs(argObject) if(type === "cloud" || type === "fog" || type === "device"){ @@ -246,7 +245,24 @@ function dojamout_p2_bg(type, pnum, floc, group=null){ //TODO: parsArg for J FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) // const jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` - let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${localregistryhost}`, `--${type}`]; + // let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${local_registry}`, `--${type}`]; + let argObject = { + "--app":jappid, + "--port":pnum, + "--group":group, + "--data":data, + "--tags":tags, + "--iflow":iflow, + "--oflow":oflow, + "--edge":edge, + "--long":long, + "--lat":lat, + "--localregistryhost":local_registry, + "--type": type + } + let jargs = getJargs(argObject) + + const command = 'node'; const args = ['jstart.js', ...jargs]; const options = { @@ -274,41 +290,55 @@ function dojamout_p2_bg(type, pnum, floc, group=null){ async function doaout(num,port,group,datap,myf){ let counter=1 + //TODO: make sure it is checking the folder if (fs.existsSync('a.out')) { await $`chmod +x a.out` } while(counter <= num){ + // if(fs.existsSync('a.out')){ - //TODO: parsArg for C FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) - // let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -t ${tags} -o ${datap}` - let cargs = ` -a ${jappid} -p ${port} -n ${counter} -g ${group} -o ${datap}` - if(!DISABLE_STDOUT_REDIRECT){ + + const argObject = + { + "-a": jappid.toString(), + "-p": port, + "-n": counter, + "-g": group, + "-t": tags, + "-o": datap + + } + let cargs = getCargs(argObject) + await $`${TMUX} new-session -s ${tmux}-${counter} -d`; + if(!disable_stdout_redirect){ if (!log) - { - await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d`; - //HOW DO WE DEAL WITH THE CASES WITHOUT VALGRID IN AN OK WAY? - if(VALGRIND) - await $`cd ${myf} && ${TMUX} send-keys -t ${tmuxapp}-${counter} ${VALGRIND} ./a.out ${cargs} C-m`; + { + console.log("this is my valgrind", valgrind) + if(valgrind) + await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; else - await $`cd ${myf} && ${TMUX} send-keys -t ${tmuxapp}-${counter} ./a.out ${cargs} C-m`; + await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; } else{ if(Machine === "Linux"){ //TO BE FIXE - let p = await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d script -a -c "${VALGRIND} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") + + let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d script -a -c "${valgrind} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") } else{ //TO BE FIXE - let p = await $`${TMUX} new-session -s ${tmuxapp}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") + //none linix machines does not have this? + let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") } } } else{ + //check if this works. if it does. Investigate what is going on with j file let p = await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") } @@ -355,21 +385,14 @@ async function portavailable(folder,port) { } function setuptmux(path) { - if(!tmuxid){ - tmuxapp=`tg-${Math.floor(Math.random() * 32768)}` - } - else{ - tmuxapp=tmuxid; - } + //TODO: ABSTRACT THE TMUX SETUP. - fs.writeFileSync(`${path}/tmuxid`,tmuxapp.toString()+"\n"); - fs.writeFileSync(`${appfolder}/tmuxid`,tmuxapp.toString()+"\n"); + fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); + fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); } - - function getappid(mainf, localf, appid){ if(appid === "app-n"){ //TODO: can be imporved by a try catch instead @@ -443,7 +466,6 @@ async function setupredis(port) { await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` } - async function resolvedata(Name) { const [host, port] = Name.split(':'); startredis(Number(port)); @@ -504,439 +526,194 @@ async function getjdata(folder) { return p.stdout.trim() } -function getlonglat(loc) { - return [long, lat] = loc.split(","); -} - -function generatelonglat() { - const a = Math.floor(Math.random() * 180); - const b = Math.floor(Math.random() * 10000); - const long=`${a}.${b}` - const c= Math.floor(Math.random() * 90); - const d = Math.floor(Math.random() * 10000); - const lat=`${c}.${d}` - return [long,lat] - -} - -//these should be options -let app="app-n" -//note: the key word has changed -let Type="device" -let data = "127.0.0.1:6379" -let num=1 -let tags; -let bg; -let old; -let local; -let porttaken=0; -let tmuxid; -let log; -let edge=1 -let localregistryhost=0 -let killbroker=0 - -let [long, lat] = generatelonglat(); - -jamrunParsArg(process.argv) - - - -//////this is really bad fix it ASAP -//arg processing is very poorly design for a js script - -while(true){ - //pooorly handled - if(args.length === 0){ - break; - } - - if( "--help" === args[0].toLowerCase()|| "-h" === args[0].toLowerCase()){ - show_usage(); - process.exit(1); - } - else if("--app"=== args[0].toLowerCase()){ - if(args.length > 1){ - //can be imporove --app = - app = args[1]; - args = args.filter((_,index) => (index !== 0 && index !== 1)); - - } - else - die('ERROR: "--app" requires a non-empty option argument.') - } - - - else if(args[0].toLowerCase() === "--app=") - //--app= 3 -> error - die( 'ERROR: "--args" requires a non-empty option argument.') - - else if(args[0].includes("--app=") || args[0].includes("--App=")) { - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - app = value; - args = args.filter((_,index) => (index !== 0)); - } - else if(args[0].toLowerCase() === "--tags"){ - - if(args.length > 1){ - tags = args[1]; - args = args.filter((_,index) => (index !== 0 && index !== 1)); - } - else - die('ERROR: "--tags" requires a non-empty option argument.') - } - - else if(args[0].toLowerCase() === "--tags=") - die('ERROR: "--tags" requires a non-empty option argument.') - - else if(args[0].includes("--Tags=") || args[0].includes("--tags=")){ - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - tags = value; - args = args.filter((_,index) => (index !== 0)); - } - - else if(args[0].toLowerCase() === "--tmux"){ - - if(args.length > 1){ - tmuxid = args[1]; - args = args.filter((_,index) => (index !== 0 && index !== 1)); - } - else - die('ERROR: "--tmux" requires a non-empty option argument.') - } - - else if(args[0].toLowerCase() === "--tmux=") - die('ERROR: "--tmux" requires a non-empty option argument.') - - else if(args[0].includes("--tmux=") || args[0].includes("--Tmux=")){ - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - tmuxid = value; - args = args.filter((_,index) => (index !== 0)); - } - - - else if(args[0].toLowerCase() === "--num"){ - - if(args.length > 1){ - num = args[1]; - args = args.filter((_,index) => (index !== 0 && index !== 1)); - } - else - die('ERROR: "--num" requires a non-empty option argument.') - } - - else if(args[0].toLowerCase() === "--num=") - die('ERROR: "--num" requires a non-empty option argument.') - - else if(args[0].includes("--num=") || args[0].includes("--Num=")){ - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - num = value; - args = args.filter((_,index) => (index !== 0)); - } - - - - - else if(args[0].toLowerCase() === "--loc"){ - - if(args.length > 1){ - //this shpuld not be a getter but a setter - [long, lat] = getlonglat(args[1]) - args = args.filter((_,index) => (index !== 0 && index !== 1)); - } - else - die('ERROR: "--loc" requires a non-empty option argument.') - } - - else if(args[0].toLowerCase() === "--loc=") - die('ERROR: "--loc" requires a non-empty option argument.') - - else if(args[0].includes("--Loc=") || args[0].includes("--loc=")){ - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - //this shpuld not be a getter but a setter - [long, lat] = getlonglat(value) - args = args.filter((_,index) => (index !== 0)); - } - - else if(args[0].toLowerCase()=== "--edge"){ - - if(args.length > 1){ - edge = args[1]; - args = args.filter((_,index) => (index !== 0 && index !== 1)); - } - else - die('ERROR: "--edge" requires a non-empty option argument.') - } - - else if(args[0].toLowerCase() === "--edge=") - die('ERROR: "--edge" requires a non-empty option argument.') - - else if(args[0].includes("--edge=") || args[0].includes("--Edge=")){ - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - edge = value; - args = args.filter((_,index) => (index !== 0)); - } - - - - else if(args[0].toLowerCase() === "--data="){ - - if(args.length > 1){ - data = args[1]; - args = args.filter((_,index) => (index !== 0 && index !== 1)); - } - else - die('ERROR: "--data" requires a non-empty option argument.') - } - - else if(args[0].toLowerCase() === "--data") - die('ERROR: "--data" requires a non-empty option argument.') - - else if(args[0].includes("--data=") || args[0].includes("--Data=")){ - const [_, ...rest] = args[0].split("="); - const value = rest.join(''); - data = value; - args = args.filter((_,index) => (index !== 0)); - } - - else if(args[0].toLowerCase() === "--fog"){ - //Do we mean == device - if( Type != "device"){ - die( 'ERROR: "type" cannot be reassigned.') - } - else{ - Type = "fog" - num = undefined; - args = args.filter((_,index) => (index !== 0)); - } - } - - else if(args[0].toLowerCase() === "--cloud"){ - //Do we mean == device - if( Type != "device"){ - die( 'ERROR: "type" cannot be reassigned.') - } - else{ - Type = "cloud" - num = undefined; - args = args.filter((_,index) => (index !== 0)); - } - } - - else if(args[0].toLowerCase() === "--cloud"){ - //Do we mean == device - if( Type != "device"){ - die( 'ERROR: "type" cannot be reassigned.') - } - else{ - Type = "cloud" - num = undefined; - args = args.filter((_,index) => (index !== 0)); - } +async function main(){ + try{ + ({ + app, + tmux, + num, + edge, + data, + local_registry, + temp_broker, + bg, + NOVERBOSE, + log, + old, + local, + valgrind, + disable_stdout_redirect, + long, + lat, + Type, + iflow, + oflow, + tags, + file + } = jamrunParsArg(process.argv)) + } + catch(error){ + if(error.type === "UsageError"){ + show_usage() + process.kill("SIGTERM") } - - else if(args[0].toLowerCase() === "--device"){ - args = args.filter((_,index) => (index !== 0)); + else{ + throw new Error(error.message) } + } + console.log("SETTING VARIABLES ARE DONE") + //can be decoupled + + const jamfolder=`${HOME}/.jamruns` + if(!fs.existsSync(jamfolder,{ recursive: true })){ + fs.mkdirSync(jamfolder) + } + //can be decoupled - else if(args[0].toLowerCase() === "--local_registry"){ - localregistryhost=1; - args = args.filter((_,index) => (index !== 0)); - } + appfolder=`${jamfolder}/apps`; + if(!fs.existsSync(appfolder,{ recursive: true })){ + fs.mkdirSync(appfolder) + } + //can be decoupled - else if(args[0].toLowerCase() === "--temp_broker"){ - killbroker=1; - args = args.filter((_,index) => (index !== 0)); + const filenoext = path.basename(file, path.extname(file)); + const folder=`${appfolder}/${filenoext}_${app}` + if(!fs.existsSync(folder,{ recursive: true })){ + fs.mkdirSync(folder) + } + //Be careful about changing the file directory + const ifile = path.resolve(file); + process.chdir(folder); + console.log("SETTING PATHS ARE DONE") + await unpack(ifile, folder) + console.log("UNPACKED") + //height is never used + const height = await getheight(folder); + const jdata = await getjdata(folder); + let dport; + //SHOULD THIS ChECK THE UNPACKED PART?! + if(fs.existsSync(`./jstart.js`)){ + console.log("INTO THE MAIN PROCESS") + let group; + //soppused to overwrite? + fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) + fs.writeFileSync(`${appfolder}/app`, `${app}\n`) + let iport; + switch(Type){ + + case "cloud": + iport=9883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + } + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout(iport, folder) + + case "fog": + iport=5883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + } + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout(iport, folder) + + case "device": + + iport=1883; + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + } + + if(!local){ + //what is exactly happening here? + group= iport-1882 + // console.log(group, "this is group") + } + else + group = 0; + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + + getappid(jamfolder, `${folder}/${iport}` ,app) + await dojamout_p1(iport,folder) + setuptmux(`${folder}/${iport}`) + + await doaout(num,iport, group, dport,folder) + console.log("CFILE EXECUTED") + await dojamout_p2(Type, iport, folder, group) + } + + } + else{ + die(`File: ${file} is not a valid JAMScript executable`) + } - else if(args[0].toLowerCase() === "--bg"){ - bg=1; - args = args.filter((_,index) => (index !== 0)); - } +} - else if(args[0].toLowerCase() === "--verb"){ - NOVERBOSE=undefined; - args = args.filter((_,index) => (index !== 0)); - } - else if(args[0].toLowerCase() === "--log"){ - log=1 - args = args.filter((_,index) => (index !== 0)); - } - else if(args[0].toLowerCase() === "--old"){ - old=1 - args = args.filter((_,index) => (index !== 0)); - } - else if(args[0].toLowerCase() === "--local"){ - local=1 - args = args.filter((_,index) => (index !== 0)); - } - else if(args[0].toLowerCase() === "--valgrind"){ - VALGRIND="$VALGRIND_OPTS" - args = args.filter((_,index) => (index !== 0)); - } - else if(args[0].toLowerCase() === "--disable-stdout-redirect"){ - DISABLE_STDOUT_REDIRECT=1 - args = args.filter((_,index) => (index !== 0)); - } - else{ - //fix this to err instead of stdout - // console.log(`WARN: Unknown option (ignored):${ args[0]}`) - args = args.filter((_,index) => (index !== 0)); - } -} -//SET IN THE ARGCHECK FILE -if(Type !== "device"){ - edge = undefined; - if(num){ - die("number of devices can't be speciied for fog/cloud") - } - if(edge){ - die( "number of edge connections can't be specified for fog/cloud") - } +await main() -} //TODO: HAVE A MAIN FUNCTION /** * replace by try catch */ //FileManager for all the scripts -const jamfolder=`${HOME}/.jamruns` -if(!fs.existsSync(jamfolder,{ recursive: true })){ - fs.mkdirSync(jamfolder) -} -appfolder=`${jamfolder}/apps`; -if(!fs.existsSync(appfolder,{ recursive: true })){ - fs.mkdirSync(appfolder) -} -const filenoext = path.basename(file, path.extname(file)); -const folder=`${appfolder}/${filenoext}_${app}` -if(!fs.existsSync(folder,{ recursive: true })){ - fs.mkdirSync(folder) -} -//Be careful about changing the file directory -const ifile = path.resolve(file); -process.chdir(folder); -await unpack(ifile, folder) -//height is never used -const height = await getheight(folder); -const jdata = await getjdata(folder); -let dport; -//SHOULD THIS ChECK THE UNPACKED PART?! -if(fs.existsSync(`./jstart.js`)){ - let group; - //soppused to overwrite? - fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) - fs.writeFileSync(`${appfolder}/app`, `${app}\n`) - let iport; - switch(Type){ - - case "cloud": - iport=9883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout(iport, folder) - - case "fog": - iport=5883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout(iport, folder) - - case "device": - - iport=1883; - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(!local){ - //what is exactly happening here? - group= iport-1882 - // console.log(group, "this is group") - } - else - group = 0; - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout_p1(iport,folder) - setuptmux(`${folder}/${iport}`) - await doaout(num,iport, group, dport,folder) - - await dojamout_p2(Type, iport, folder, group) - - } - -} -else{ - die(`File: ${file} is not a valid JAMScript executable`) -} diff --git a/tools/parsArg.mjs b/tools/parser.mjs similarity index 57% rename from tools/parsArg.mjs rename to tools/parser.mjs index cdaac9d5f..00e30b3dd 100644 --- a/tools/parsArg.mjs +++ b/tools/parser.mjs @@ -2,6 +2,7 @@ import commandLineArgs from 'command-line-args'; import { fs } from 'zx'; const path = require('path'); +const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; function generatelonglat() { const a = Math.floor(Math.random() * 180); @@ -37,13 +38,9 @@ const jamrunOptionDefinitions = [ {name : 'old', type: Boolean, defaultValue: false}, {name : 'local', type: Boolean, defaultValue: false}, {name : 'valgrind', type: Boolean, defaultValue: false}, - {name : 'disable-stdout-redirect', type: Boolean, defaultValue: false}, + {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, ]; -const OptionToVarMap =new Map( - ["tmux","tmuxid"], - ["loc",["long","lat"]] -) function retrieveType(device, fog, cloud){ @@ -52,9 +49,8 @@ function retrieveType(device, fog, cloud){ } else if( ((fog?1:0) + (device?1:0) + (cloud?1:0)) > 1){ - const error = new Error("Only one fog, device, cloud flag can be true") - error.type = 'MultiTypeFlag' - throw error; + throw Error("Only one of fog, device, cloud flag can be true") + } else{ @@ -67,6 +63,9 @@ function retrieveType(device, fog, cloud){ } } +function retrieveLongLat(loc){ + return [long, lat] = loc.split(","); +} function getJamrunArgs(args){ @@ -99,6 +98,43 @@ function checkJXEfile(arg){ if(!fs.existsSync(absolutePath)){ throw new Error(`File: ${file} not found`) } + return file; +} +function SetJamrunVar(options){ + const Type = retrieveType(options.device , options.fog, options.cloud); + if(Type !== "device"){ + options.num = undefined; + options.edge = undefined; + } + const NOVERBOSE = !options.verb + const valgrid = options.valgrid? VALGRIND_OPTS : false + const [long, lat] = retrieveLongLat(options.loc) + + const toAdd = {"valgrind" : valgrid,"long" : long,"lat" : lat, "NOVERBOSE":NOVERBOSE , "Type" : Type } + const skip = ["help","fog","cloud","device","loc", "verb"] + const AssignedVar ={} + for(let option of Object.keys(options)){ + if(skip.includes(option)){ + continue + } + AssignedVar[option]= options[option] + + } + for(let option of Object.keys(toAdd)){ + AssignedVar[option]= toAdd[option] + } + console.log(Object.keys(AssignedVar)) + if(!("iflow" in AssignedVar)){ + AssignedVar["iflow"] = undefined; + } + if(!("oflow" in AssignedVar)){ + AssignedVar["oflow"] = undefined; + } + if(!("tags" in AssignedVar)){ + AssignedVar["tags"] = undefined; + } + return AssignedVar; + } //question one on remNote @@ -106,7 +142,7 @@ function checkJXEfile(arg){ export function jamrunParsArg(argv){ //remove redundent arfs const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) - checkJXEfile(arg) + const file = checkJXEfile(arg) let proccessedArgs = arg.filter((_,index) => (index !== 0 )); const options = getJamrunArgs(proccessedArgs); if(!options || options.help){ @@ -117,14 +153,45 @@ export function jamrunParsArg(argv){ } for(let optionDefinition of jamrunOptionDefinitions ){ if(options[optionDefinition.name] === null && optionDefinition.type != Boolean){ - const error = new Error(`--${optionDefinition.name} requires a non-empty option argument`); - error.type = 'OptionError'; - throw error; + throw new Error(`--${optionDefinition.name} requires a non-empty option argument`); + } } + const varsObject = SetJamrunVar(options); + varsObject["file"] = file; + return varsObject; +} +//ASK wHAT VARIABLES ARE OPTIONAL +//TO BE TESTED +export function getCargs(argObject){ + // console.log("this is my cObject arg\n", argObject) + let args = "" + for(let key of Object.keys(argObject)){ + + if(argObject[key] != undefined ){ + + args=args+` ${key} ${argObject[key]}` + } + } + return args; +} +export function getJargs(argObject){ + const args = [] + for(let key of Object.keys(argObject)){ + + if(argObject[key] != undefined){ + if(key === "--type") + args.push(`--${argObject[key]}`) + else + args.push(`${key}=${argObject[key]}`) + } + } + console.log("this is my jArgs\n",args ) + return args; } +// let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${local_registry}`, `--${type}`]; From 6387306110814c2738659df8829091fd5c2cd12c Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 5 Jul 2024 03:57:19 -0400 Subject: [PATCH 008/126] checkpoint --- tools/fileDirectory.mjs | 41 ++++++- tools/jamrun.mjs | 256 ++++++++++++++++------------------------ 2 files changed, 141 insertions(+), 156 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 86375884d..ad5ae1dc2 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -1,6 +1,43 @@ #!/usr/bin/env zx let HOME = os.homedir(); -export function fileDirectorySetUp(){ - +export function fileDirectorySetUp(file,app){ + const jamfolder=`${HOME}/.jamruns` + if(!fs.existsSync(jamfolder,{ recursive: true })){ + fs.mkdirSync(jamfolder) + } + const appfolder=`${jamfolder}/apps`; + if(!fs.existsSync(appfolder,{ recursive: true })){ + fs.mkdirSync(appfolder) + } + const filenoext = path.basename(file, path.extname(file)); + const folder=`${appfolder}/${filenoext}_${app}` + if(!fs.existsSync(folder,{ recursive: true })){ + fs.mkdirSync(folder) + } + fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) + fs.writeFileSync(`${appfolder}/app`, `${app}\n`) + return [jamfolder,appfolder,folder,filenoext ] +} + +export function isValidExecutable(){ + if(!fs.existsSync(`./jstart.js`)) + throw new Error("jstart.js is missing") + + if(!fs.existsSync(`jamout.js`)) + throw new Error("jamout.js is missing") + + if(!fs.existsSync(`a.out`)) + throw new Error("a.out is missing") + if(!fs.existsSync(`./MANIFEST.txt`)) + throw new Error("./MANIFEST.txt is missing") + +} + +export function fileDirectoryMqtt(folder, iport){ + fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); + fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + } \ No newline at end of file diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 965c607ea..87de30cdf 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -4,6 +4,7 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import { dirname, basename, extname} from 'path'; +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt} from './fileDirectory.mjs' import { homedir, type } from 'os'; import { fs } from 'zx'; const { spawn,spawnSync } = require('child_process'); @@ -24,11 +25,15 @@ const { spawn,spawnSync } = require('child_process'); * 13) discuss what fields should be undefinecd and what fields should not be undefined * 14) error check for cArg ad jArg? * 15) a.out + * 17) abstracting the wait + * 16) directly throw error insted of die function + * height is not used * 16) ---------------- message-to-j [ 0, 4, 6, 10, 12, 16, 18, 22, 26, 28, 32, 34, 38, 40, 44 ] J arg does not clearup + */ // //global variables @@ -36,6 +41,7 @@ let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, let porttaken=0; let jappid; + //SETUP CLEANING process.on('SIGINT', () => {cleanup(), cleanuptmux()}); process.on('SIGTERM', () => cleanup()); @@ -53,8 +59,6 @@ const filePath = fileURLToPath(import.meta.url); const IDIR = dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); const SHELLPID = process.pid; -let appfolder; -//SET IN THE ARGCHECK FILE //setup @@ -149,9 +153,7 @@ function show_usage(){ } -//TOBE TESTED async function startmqtt(port, cFile){ - //Check whether the MQTT server is running.. if not start it try{ await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); } @@ -173,11 +175,9 @@ async function dojamout_p1(pnum ,floc) { await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - //TODO: JAMOUT FILE DIRECTORY ABSTRACTION TODO fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); - //just writing string?WE CAN KEEP TRACK OF ACTUAL PROCESS ID fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); } @@ -243,9 +243,6 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ } function dojamout_p2_bg(type, pnum, floc, group=null){ - //TODO: parsArg for J FILE(FIX THE ARG TO AVOID MULTIPLE GLOBAL VARIABLES) - // const jargs = `--app=${jappid} --port=${pnum} --group=${group} --data=${data} --tags=${tags} --iflow=${iflow} --oflow=${oflow} --edge=${edge} --long=${long} --lat=${lat} --${type}` - // let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${local_registry}`, `--${type}`]; let argObject = { "--app":jappid, "--port":pnum, @@ -272,6 +269,7 @@ function dojamout_p2_bg(type, pnum, floc, group=null){ const p = spawn(command, args, options); childs.push(p); + //overwrite if it already exists p.stdout.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); p.stderr.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); p.on('error', (error) => { @@ -384,7 +382,7 @@ async function portavailable(folder,port) { } } -function setuptmux(path) { +function setuptmux(path, appfolder) { //TODO: ABSTRACT THE TMUX SETUP. @@ -393,7 +391,7 @@ function setuptmux(path) { } -function getappid(mainf, localf, appid){ +function getappid(mainf, localf, appid,appfolder){ if(appid === "app-n"){ //TODO: can be imporved by a try catch instead let result; @@ -481,17 +479,17 @@ async function resolvedata(Name) { data = Name.split(/\s+/).join(''); } -async function unpack(pfile, folder){ +async function unpack(file,folder){ - const file = pfile + if(!old){ - let p; + if(!fs.existsSync("./MANIFEST.txt")){ try{ - p = await $`cd ${folder} && unzip -o ${file}`.quiet() + await $`cd ${folder} && unzip -o ${file}`.quiet() } catch(error){ - die(`Problem reading file: ${file}\n${error}`) + throw new Error(`Problem reading file: ${file}\n${error}`) } } @@ -506,7 +504,9 @@ async function unpack(pfile, folder){ p3 = await $`cd ${folder} && unzip -oq ${file}`.quiet() } catch(error){ - die(`Problem reading file: ${file}\n${error}`) + + throw new Error(`Problem reading file: ${file}\n${error}`) + } } } @@ -526,8 +526,26 @@ async function getjdata(folder) { return p.stdout.trim() } +async function runNoneDevice(iport){ + fileDirectoryMqtt(folder,iport) + getappid(jamfolder, `${folder}/${iport}`,app,appfolder) + await dojamout(iport, folder) +} + +async function runDevice(iport,group){ + fileDirectoryMqtt(folder,iport) + getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) + await dojamout_p1(iport,folder) + setuptmux(`${folder}/${iport}`, appfolder) + await doaout(num,iport, group, dport,folder) + await dojamout_p2(Type, iport, folder, group) +} + async function main(){ + let iport; + let dport; + let group; try{ ({ app, @@ -562,160 +580,90 @@ async function main(){ throw new Error(error.message) } } - console.log("SETTING VARIABLES ARE DONE") - //can be decoupled - - const jamfolder=`${HOME}/.jamruns` - if(!fs.existsSync(jamfolder,{ recursive: true })){ - fs.mkdirSync(jamfolder) - } - //can be decoupled - - appfolder=`${jamfolder}/apps`; - if(!fs.existsSync(appfolder,{ recursive: true })){ - fs.mkdirSync(appfolder) - } - //can be decoupled + const [jamfolder, appfolder, folder, filenoext] = fileDirectorySetUp(file,app) - const filenoext = path.basename(file, path.extname(file)); - const folder=`${appfolder}/${filenoext}_${app}` - if(!fs.existsSync(folder,{ recursive: true })){ - fs.mkdirSync(folder) - } - //Be careful about changing the file directory const ifile = path.resolve(file); process.chdir(folder); - console.log("SETTING PATHS ARE DONE") await unpack(ifile, folder) - console.log("UNPACKED") - //height is never used + isValidExecutable() const height = await getheight(folder); const jdata = await getjdata(folder); - let dport; - //SHOULD THIS ChECK THE UNPACKED PART?! - if(fs.existsSync(`./jstart.js`)){ - console.log("INTO THE MAIN PROCESS") - let group; - //soppused to overwrite? - fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) - fs.writeFileSync(`${appfolder}/app`, `${app}\n`) - let iport; - switch(Type){ - - case "cloud": - iport=9883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout(iport, folder) - - case "fog": - iport=5883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout(iport, folder) - - case "device": - - iport=1883; - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - - if(!local){ - //what is exactly happening here? - group= iport-1882 - // console.log(group, "this is group") + + switch(Type){ + case "cloud": + iport=9883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; } - else - group = 0; - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) + iport++; + } + //what if jdata is wrong? + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + //TODO: CODE DUPLICATE, ABSTRACT AWAY + await runNoneDevice(iport) + + case "fog": + iport=5883 + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) + iport++; + } + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + await runNoneDevice(iport) + + case "device": + iport=1883; + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - - fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); - fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); - - getappid(jamfolder, `${folder}/${iport}` ,app) - await dojamout_p1(iport,folder) - setuptmux(`${folder}/${iport}`) - - await doaout(num,iport, group, dport,folder) - console.log("CFILE EXECUTED") - await dojamout_p2(Type, iport, folder, group) - - } - - } - else{ - die(`File: ${file} is not a valid JAMScript executable`) - } + iport++; + } -} + if(!local){ + group= iport-1882 + } + else + group = 0; + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + await runDevice(iport,group) + -await main() + } + + -//TODO: HAVE A MAIN FUNCTION -/** - * replace by try catch - */ -//FileManager for all the scripts +} - +await main() From f734ea6674c1b292286dbcae233f400e15a71897 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 5 Jul 2024 13:17:00 -0400 Subject: [PATCH 009/126] pre localizing variables --- tools/fileDirectory.mjs | 9 +++ tools/jamrun.mjs | 124 +++++++++++++++------------------------- 2 files changed, 56 insertions(+), 77 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index ad5ae1dc2..992a0b65c 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -19,6 +19,15 @@ export function fileDirectorySetUp(file,app){ fs.writeFileSync(`${appfolder}/app`, `${app}\n`) return [jamfolder,appfolder,folder,filenoext ] } +export function getPaths(file,app){ + + const jamfolder=`${HOME}/.jamruns` + const appfolder=`${jamfolder}/apps`; + const filenoext = path.basename(file, path.extname(file)); + const folder=`${appfolder}/${filenoext}_${app}` + + return [jamfolder,appfolder,folder] +} export function isValidExecutable(){ if(!fs.existsSync(`./jstart.js`)) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 87de30cdf..0cfd255f9 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -4,13 +4,15 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import { dirname, basename, extname} from 'path'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt} from './fileDirectory.mjs' +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths} from './fileDirectory.mjs' import { homedir, type } from 'os'; import { fs } from 'zx'; const { spawn,spawnSync } = require('child_process'); /*** * NOTES * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected + * 2)SHOULDE FILE DIRECTORY BE A CLASS + * 2)GLOBAL VARIABLE SITUATION * 2) ABSTRACT ALL THE WRITES AWAY * 3) the SIGKILL is being trapped at all * 4) iFlow , oflow NOT BEING SET, I ADDED THEM. MAKE SURE IT'S NEEDED AND IT'S STRING @@ -27,6 +29,8 @@ const { spawn,spawnSync } = require('child_process'); * 15) a.out * 17) abstracting the wait * 16) directly throw error insted of die function + * 17) if device no tg + * 17) file directory manager * height is not used * 16) ---------------- message-to-j [ 0, 4, 6, 10, 12, 16, @@ -46,11 +50,6 @@ let jappid; process.on('SIGINT', () => {cleanup(), cleanuptmux()}); process.on('SIGTERM', () => cleanup()); -//REPLACE DIE WITH THROWING DIRECT ERROR -function die(error){ - process.stderr.write(`${error}\n`); - process.exit(1); -}; //MOVE HOME TO CONST FILE const childs =[] const mqttPromiseProcesses= []; @@ -312,7 +311,7 @@ async function doaout(num,port,group,datap,myf){ if (!log) { - console.log("this is my valgrind", valgrind) + if(valgrind) await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; else @@ -323,15 +322,19 @@ async function doaout(num,port,group,datap,myf){ if(Machine === "Linux"){ //TO BE FIXE - let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d script -a -c "${valgrind} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") + if(valgrind) + await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; + else + await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; + // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d script -a -c "${valgrind} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") } else{ //TO BE FIXE //none linix machines does not have this? - let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") - + // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") + await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; } } } @@ -426,27 +429,22 @@ function cleanuptmux() { function startredis(port) { - //should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) + //QUESTION: should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow(); } -//TODO, abstract the wait away + async function waitforredis(port){ while (true) { console.log("this is the port we have", port) - let p - try{ - p = await $`redis-cli -p ${port} -c PING` + const p = await $`redis-cli -p ${port} -c PING` if (p.stdout.trim() === "PONG") { break; } - } - catch(error){ } - if (!NOVERBOSE) { console.log("Trying to find Redis server..."); } @@ -457,11 +455,13 @@ async function waitforredis(port){ console.log(`Redis running at port: ${port}`); } } + async function setupredis(port) { await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` + } async function resolvedata(Name) { @@ -527,12 +527,14 @@ async function getjdata(folder) { } async function runNoneDevice(iport){ + const [jamfolder,appfolder,folder] = getPaths(file,app) fileDirectoryMqtt(folder,iport) getappid(jamfolder, `${folder}/${iport}`,app,appfolder) await dojamout(iport, folder) } -async function runDevice(iport,group){ +async function runDevice(iport,dport,group){ + const [jamfolder,appfolder,folder] = getPaths(file,app) fileDirectoryMqtt(folder,iport) getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) await dojamout_p1(iport,folder) @@ -574,7 +576,7 @@ async function main(){ catch(error){ if(error.type === "UsageError"){ show_usage() - process.kill("SIGTERM") + process.exit(1) } else{ throw new Error(error.message) @@ -588,78 +590,46 @@ async function main(){ isValidExecutable() const height = await getheight(folder); const jdata = await getjdata(folder); + let isDevice; switch(Type){ case "cloud": iport=9883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - //what if jdata is wrong? - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - //TODO: CODE DUPLICATE, ABSTRACT AWAY - await runNoneDevice(iport) - + isDevice = false; + case "fog": iport=5883 - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - if(jdata){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - await runNoneDevice(iport) + isDevice = false case "device": iport=1883; - while(true){ - await portavailable(folder ,iport) - if(porttaken !== 1){ - break; - } - iport++; - } - + isDevice = true; if(!local){ group= iport-1882 } else - group = 0; - - if(jdata){ - - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - } - - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - await runDevice(iport,group) - - + group = 0; } - - + while(true){ + await portavailable(folder ,iport) + if(porttaken !== 1){ + break; + } + iport++; + } + //QUESTION: what if jdata is wrong? + if(jdata){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + if(isDevice) + await runDevice(iport,dport,group) + else + await runNoneDevice(iport) } From 26c656fef515fc16b358697268537398ff6ca230 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 5 Jul 2024 13:34:07 -0400 Subject: [PATCH 010/126] Broken after jappid changes --- tools/fileDirectory.mjs | 23 ++++++++++++++++++ tools/jamrun.mjs | 52 +++++++++++++---------------------------- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 992a0b65c..d7d23d74c 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -29,6 +29,29 @@ export function getPaths(file,app){ return [jamfolder,appfolder,folder] } + +export function getappid(mainf, localf, appid,appfolder){ + if(appid === "app-n"){ + //TODO: can be imporved by a try catch instead + let result; + if(fs.existsSync(`${mainf}/counter`)){ + let value = fs.readFileSync(`${mainf}/counter`); + result = Number(value.toString().trim()) + 1; + } + else{ + result = 1; + } + fs.writeFileSync(`${mainf}/counter`, `${result}\n`) + fs.writeFileSync(`${localf}/appid`, `app-${result}\n`) + } + else{ + fs.writeFileSync(`${localf}/appid`,`${appid}`) + } + const jappid = fs.readFileSync(`${localf}/appid`) + fs.writeFileSync(`${appfolder}/appid`,`${jappid}`) + return jappid; +} + export function isValidExecutable(){ if(!fs.existsSync(`./jstart.js`)) throw new Error("jstart.js is missing") diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 0cfd255f9..caaa69188 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -4,7 +4,7 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import { dirname, basename, extname} from 'path'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths} from './fileDirectory.mjs' +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid} from './fileDirectory.mjs' import { homedir, type } from 'os'; import { fs } from 'zx'; const { spawn,spawnSync } = require('child_process'); @@ -43,8 +43,6 @@ const { spawn,spawnSync } = require('child_process'); //global variables let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, iflow, oflow, tags, file; let porttaken=0; -let jappid; - //SETUP CLEANING process.on('SIGINT', () => {cleanup(), cleanuptmux()}); @@ -165,9 +163,9 @@ async function startmqtt(port, cFile){ } } -async function dojamout(iport, folder, group=null) { +async function dojamout(iport, folder,jappid, group=null) { await dojamout_p1 (iport ,folder) - await dojamout_p2 (iport ,folder) + await dojamout_p2 (iport ,folder, jappid) } async function dojamout_p1(pnum ,floc) { @@ -181,13 +179,13 @@ async function dojamout_p1(pnum ,floc) { } -async function dojamout_p2(type, iport, folder, group=null){ +async function dojamout_p2(type, iport, folder, jappid, group=null){ if(!bg) - await dojamout_p2_fg(type, iport, folder, group) + await dojamout_p2_fg(type, iport, folder,jappid, group) else - dojamout_p2_bg(type, iport, folder, group) + dojamout_p2_bg(type, iport, folder,jappid, group) } function cleanup(){ @@ -207,7 +205,7 @@ function cleanup(){ process.exit(1) } -async function dojamout_p2_fg(type, pnum, floc, group=null){ +async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ let argObject = { @@ -240,7 +238,7 @@ async function dojamout_p2_fg(type, pnum, floc, group=null){ } cleanup() } -function dojamout_p2_bg(type, pnum, floc, group=null){ +function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ let argObject = { "--app":jappid, @@ -285,7 +283,7 @@ function dojamout_p2_bg(type, pnum, floc, group=null){ } } -async function doaout(num,port,group,datap,myf){ +async function doaout(num,port,group,datap,myf,jappid){ let counter=1 //TODO: make sure it is checking the folder if (fs.existsSync('a.out')) { @@ -394,26 +392,7 @@ function setuptmux(path, appfolder) { } -function getappid(mainf, localf, appid,appfolder){ - if(appid === "app-n"){ - //TODO: can be imporved by a try catch instead - let result; - if(fs.existsSync(`${mainf}/counter`)){ - let value = fs.readFileSync(`${mainf}/counter`); - result = Number(value.toString().trim()) + 1; - } - else{ - result = 1; - } - fs.writeFileSync(`${mainf}/counter`, `${result}\n`) - fs.writeFileSync(`${localf}/appid`, `app-${result}\n`) - } - else{ - fs.writeFileSync(`${localf}/appid`,`${appid}`) - } - jappid = fs.readFileSync(`${localf}/appid`) - fs.writeFileSync(`${appfolder}/appid`,`${jappid}`) -} + //MAYBE USED LATER async function killtmux(sesh){ const result = await $`tmux ls | grep ${sesh} | cut -d ':' -f 1`; @@ -529,18 +508,18 @@ async function getjdata(folder) { async function runNoneDevice(iport){ const [jamfolder,appfolder,folder] = getPaths(file,app) fileDirectoryMqtt(folder,iport) - getappid(jamfolder, `${folder}/${iport}`,app,appfolder) - await dojamout(iport, folder) + const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) + await dojamout(iport, folder, jappid) } async function runDevice(iport,dport,group){ const [jamfolder,appfolder,folder] = getPaths(file,app) fileDirectoryMqtt(folder,iport) - getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) + const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) await dojamout_p1(iport,folder) setuptmux(`${folder}/${iport}`, appfolder) - await doaout(num,iport, group, dport,folder) - await dojamout_p2(Type, iport, folder, group) + await doaout(num,iport, group, dport,folder,jappid) + await dojamout_p2(Type, iport, folder, group, jappid) } @@ -626,6 +605,7 @@ async function main(){ if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } + console.log("is it device", isDevice) if(isDevice) await runDevice(iport,dport,group) else From 2a617450d5bc04f534c158a2045f1237d98a8598 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 5 Jul 2024 15:15:48 -0400 Subject: [PATCH 011/126] pre meeting --- tools/fileDirectory.mjs | 10 +++++ tools/jamrun.mjs | 90 ++++++++++++++++++----------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index d7d23d74c..a6de832c3 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -1,4 +1,5 @@ #!/usr/bin/env zx + let HOME = os.homedir(); export function fileDirectorySetUp(file,app){ @@ -29,6 +30,15 @@ export function getPaths(file,app){ return [jamfolder,appfolder,folder] } +export function getFolder(file,app){ + const jamfolder=`${HOME}/.jamruns` + const appfolder=`${jamfolder}/apps`; + const filenoext = path.basename(file, path.extname(file)); + const folder=`${appfolder}/${filenoext}_${app}` + + return folder; +} + export function getappid(mainf, localf, appid,appfolder){ if(appid === "app-n"){ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index caaa69188..8067911f1 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,16 +1,12 @@ #!/usr/bin/env zx import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' - - import { fileURLToPath } from 'url'; -import { dirname, basename, extname} from 'path'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid} from './fileDirectory.mjs' -import { homedir, type } from 'os'; -import { fs } from 'zx'; +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); + /*** * NOTES - * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected + * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected(TO BE INVESTIGATED) * 2)SHOULDE FILE DIRECTORY BE A CLASS * 2)GLOBAL VARIABLE SITUATION * 2) ABSTRACT ALL THE WRITES AWAY @@ -30,8 +26,11 @@ const { spawn,spawnSync } = require('child_process'); * 17) abstracting the wait * 16) directly throw error insted of die function * 17) if device no tg + * 19) WHY DOES VALGRID NOT USED? * 17) file directory manager - * height is not used + * --valgrind in jamScript + * height is not used\ + * Is it ok if you kill all the tmux servers? * 16) ---------------- message-to-j [ 0, 4, 6, 10, 12, 16, 18, 22, 26, 28, 32, 34, @@ -42,18 +41,18 @@ const { spawn,spawnSync } = require('child_process'); // //global variables let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, iflow, oflow, tags, file; -let porttaken=0; + //SETUP CLEANING -process.on('SIGINT', () => {cleanup(), cleanuptmux()}); -process.on('SIGTERM', () => cleanup()); +process.on('SIGINT', async () => await cleanup()); +process.on('SIGTERM', async () => await cleanup()); //MOVE HOME TO CONST FILE const childs =[] -const mqttPromiseProcesses= []; +let mqttPromiseProcesses; //SET REDIS PATH UP const filePath = fileURLToPath(import.meta.url); -const IDIR = dirname(filePath); +const IDIR = path.dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); const SHELLPID = process.pid; @@ -157,13 +156,13 @@ async function startmqtt(port, cFile){ catch(error){ if(!NOVERBOSE) console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); - const mqttPromiseProcess = $`${MOSQUITTO} -c ${cFile}`.stdio('ignore', 'pipe', 'pipe').quiet().nothrow(); - mqttPromiseProcesses.push(mqttPromiseProcess) + mqttPromiseProcesses = $`${MOSQUITTO} -c ${cFile}`.stdio('ignore', 'pipe', 'pipe').quiet().nothrow(); + return; } } -async function dojamout(iport, folder,jappid, group=null) { +async function dojamout(iport, folder,jappid) { await dojamout_p1 (iport ,folder) await dojamout_p2 (iport ,folder, jappid) } @@ -171,7 +170,6 @@ async function dojamout(iport, folder,jappid, group=null) { async function dojamout_p1(pnum ,floc) { await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); @@ -188,7 +186,10 @@ async function dojamout_p2(type, iport, folder, jappid, group=null){ dojamout_p2_bg(type, iport, folder,jappid, group) } -function cleanup(){ +async function cleanup(){ + + await killtmux() + if(temp_broker === 1){ console.log(`Killing broker with PID: ${mqttPromiseProcesses}`) mqttPromiseProcesses.kill("SIGTERM"); @@ -201,13 +202,12 @@ function cleanup(){ /** * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX **/ - // cleanuptmux(); + process.exit(1) } async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ - let argObject = { "--app":jappid, "--port":pnum, @@ -225,18 +225,15 @@ async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ let jargs = getJargs(argObject) + const command = 'node'; + const args = ['jstart.js', ...jargs]; + const options = { + cwd: floc, + stdio: 'inherit' + }; + spawnSync(command, args, options); - if(type === "cloud" || type === "fog" || type === "device"){ - - const command = 'node'; - const args = ['jstart.js', ...jargs]; - const options = { - cwd: floc, - stdio: 'inherit' - }; - spawnSync(command, args, options); - } - cleanup() + await cleanup() } function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ @@ -266,7 +263,7 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ const p = spawn(command, args, options); childs.push(p); - //overwrite if it already exists + //QUESTION: overwrite if it already exists p.stdout.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); p.stderr.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); p.on('error', (error) => { @@ -351,6 +348,7 @@ async function doaout(num,port,group,datap,myf,jappid){ async function portavailable(folder,port) { let pid; + let porttaken; if(fs.existsSync(`./${folder}/${port}`)){ if(fs.existsSync(`${folder}/${port}/processId`)){ try{ @@ -381,6 +379,7 @@ async function portavailable(folder,port) { const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() porttaken= p.stdout.trim() } + return porttaken; } function setuptmux(path, appfolder) { @@ -394,18 +393,11 @@ function setuptmux(path, appfolder) { //MAYBE USED LATER -async function killtmux(sesh){ - const result = await $`tmux ls | grep ${sesh} | cut -d ':' -f 1`; - for (const q of result.stdout.trim().split('\n')) { - console.log(q); - await $`tmux kill-session -t ${q}`; - } -} -//MAYBE USED LATER -function cleanuptmux() { - process.exit(1); +async function killtmux(){ + await $`pkill tmux`.stdio('ignore', 'ignore', 'ignore').quiet().nothrow(); } + function startredis(port) { //QUESTION: should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) @@ -477,10 +469,9 @@ async function unpack(file,folder){ const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; const ntime = p1.stdout.trim(); const ontime = p2.stdout.trim(); - let p3; if(ntime > ontime){ try{ - p3 = await $`cd ${folder} && unzip -oq ${file}`.quiet() + await $`cd ${folder} && unzip -oq ${file}`.quiet() } catch(error){ @@ -519,7 +510,7 @@ async function runDevice(iport,dport,group){ await dojamout_p1(iport,folder) setuptmux(`${folder}/${iport}`, appfolder) await doaout(num,iport, group, dport,folder,jappid) - await dojamout_p2(Type, iport, folder, group, jappid) + await dojamout_p2(Type, iport, folder,jappid,group ) } @@ -561,12 +552,14 @@ async function main(){ throw new Error(error.message) } } - const [jamfolder, appfolder, folder, filenoext] = fileDirectorySetUp(file,app) + fileDirectorySetUp(file,app) + const folder = getFolder(file,app) const ifile = path.resolve(file); process.chdir(folder); await unpack(ifile, folder) isValidExecutable() + //Question: height is not used const height = await getheight(folder); const jdata = await getjdata(folder); let isDevice; @@ -591,7 +584,7 @@ async function main(){ } while(true){ - await portavailable(folder ,iport) + const porttaken = await portavailable(folder ,iport) if(porttaken !== 1){ break; } @@ -605,7 +598,6 @@ async function main(){ if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } - console.log("is it device", isDevice) if(isDevice) await runDevice(iport,dport,group) else @@ -613,7 +605,5 @@ async function main(){ } - - await main() From d233e3502e34da8711c058d5fedf995f7366e945 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 9 Jul 2024 00:09:23 -0400 Subject: [PATCH 012/126] blocking bg jamrun fixed --- tools/fileDirectory.mjs | 7 +- tools/jamrun.mjs | 153 ++++++++++++++++++++++------------------ tools/parser.mjs | 10 +-- 3 files changed, 88 insertions(+), 82 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index a6de832c3..6b44136ea 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -63,7 +63,7 @@ export function getappid(mainf, localf, appid,appfolder){ } export function isValidExecutable(){ - if(!fs.existsSync(`./jstart.js`)) + if(!fs.existsSync(`jstart.js`)) throw new Error("jstart.js is missing") if(!fs.existsSync(`jamout.js`)) @@ -71,8 +71,9 @@ export function isValidExecutable(){ if(!fs.existsSync(`a.out`)) throw new Error("a.out is missing") - if(!fs.existsSync(`./MANIFEST.txt`)) - throw new Error("./MANIFEST.txt is missing") + + if(!fs.existsSync(`MANIFEST.txt`)) + throw new Error("MANIFEST.txt is missing") } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 8067911f1..9cb0384a7 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -6,46 +6,33 @@ const { spawn,spawnSync } = require('child_process'); /*** * NOTES + * num Error(HAVE IN MIND) + * handle log seperation in close(); + * new command: + + * add a new command as an indication of the continuity of jamrun app and if it's false clean the redis + 3) REDIS THROWS unexpected ERROR IN SOME CASES FOR SOME REASON + 4) CHECK THE NUM ISSUE. WE DON"T SEE THAT CLEARLY in the jamrun + 5) fully detach the proccesses + * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected(TO BE INVESTIGATED) - * 2)SHOULDE FILE DIRECTORY BE A CLASS - * 2)GLOBAL VARIABLE SITUATION - * 2) ABSTRACT ALL THE WRITES AWAY - * 3) the SIGKILL is being trapped at all - * 4) iFlow , oflow NOT BEING SET, I ADDED THEM. MAKE SURE IT'S NEEDED AND IT'S STRING - * 5) TODO: MAKE SURE ALL THE DIRECTORIES WE USE EXIST - * 6) TAKE CARE OF THE RELATIVE PATHS - * 7) abstract waiting for mqtt and redis - * 8) CLEAR FILES ONCLOSE(EX: LOG FILE) - * 9)if [ -e jstart.js ]; then Search this up in the js file. this does not make sence to me. it should check if the jxe has the jStart or not - * 10) why aren't we checking the content of the jxe file? - * 11) verify this error is true - * 12) we set edge equal undefined the check if it is defined or not. makes no sense (Type !== "device")(those checks are simply not working) - * 13) discuss what fields should be undefinecd and what fields should not be undefined - * 14) error check for cArg ad jArg? - * 15) a.out - * 17) abstracting the wait - * 16) directly throw error insted of die function - * 17) if device no tg - * 19) WHY DOES VALGRID NOT USED? - * 17) file directory manager - * --valgrind in jamScript - * height is not used\ - * Is it ok if you kill all the tmux servers? - * 16) ---------------- message-to-j [ - 0, 4, 6, 10, 12, 16, - 18, 22, 26, 28, 32, 34, - 38, 40, 44 + + * 4) iFlow , oflow NOT BEING SET, I ADDED THEM. MAKE SURE IT'S NEEDED AND IT'S STRING(NEED TO BE REMOVED) + + * height is not used (REMOVE) + * + ] J arg does not clearup */ // //global variables -let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, iflow, oflow, tags, file; +let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, tags, file; //SETUP CLEANING -process.on('SIGINT', async () => await cleanup()); -process.on('SIGTERM', async () => await cleanup()); +// process.on('SIGINT', async () => await cleanup()); +// process.on('SIGTERM', async () => await cleanup()); //MOVE HOME TO CONST FILE const childs =[] @@ -150,8 +137,11 @@ function show_usage(){ async function startmqtt(port, cFile){ + + try{ await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); + } catch(error){ if(!NOVERBOSE) @@ -168,8 +158,12 @@ async function dojamout(iport, folder,jappid) { } async function dojamout_p1(pnum ,floc) { + + await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) + + fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); @@ -199,23 +193,16 @@ async function cleanup(){ p.kill("SIGTERM") } } - /** - * ADD TMUX HERE IF IT CAN"T BE DONE WITHOUT TMUX - **/ - process.exit(1) } async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ - let argObject = { "--app":jappid, "--port":pnum, "--group":group, "--data":data, "--tags":tags, - "--iflow":iflow, - "--oflow":oflow, "--edge":edge, "--long":long, "--lat":lat, @@ -235,16 +222,15 @@ async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ await cleanup() } + function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ - + console.log("THE EXECUTION IS ON THE BG") let argObject = { "--app":jappid, "--port":pnum, "--group":group, "--data":data, "--tags":tags, - "--iflow":iflow, - "--oflow":oflow, "--edge":edge, "--long":long, "--lat":lat, @@ -253,26 +239,27 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ } let jargs = getJargs(argObject) - + console.log(floc) + const out = fs.openSync(`${floc}/log.j`, 'a'); + + const command = 'node'; const args = ['jstart.js', ...jargs]; const options = { cwd: floc, - stdio: ['ignore', 'pipe', 'pipe'] + stdio: ['ignore', out, out], + detached: true, }; - const p = spawn(command, args, options); + + + + + const p = spawn(command, args, options); + p.unref(); + childs.push(p); - //QUESTION: overwrite if it already exists - p.stdout.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); - p.stderr.pipe(fs.createWriteStream(`${floc}/log.j`), { flags: 'a' }); - p.on('error', (error) => { - console.error(`Error: ${error.message}`); - }); - - p.on('close', (code) => { - console.log(`Child process exited with code ${code}`); - }); + if(!NOVERBOSE){ @@ -400,17 +387,22 @@ async function killtmux(){ function startredis(port) { - //QUESTION: should it throw an error if it does not work? now are the input/output/err is ignored.(DIVE DEEPER IN THIS) - $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow(); + + $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow() + } async function waitforredis(port){ while (true) { console.log("this is the port we have", port) try{ + const p = await $`redis-cli -p ${port} -c PING` + console.log(p.stdout) + if (p.stdout.trim() === "PONG") { + break; } } @@ -421,16 +413,22 @@ async function waitforredis(port){ } await sleep(1000) } - + if (!NOVERBOSE) { console.log(`Redis running at port: ${port}`); } + } async function setupredis(port) { + + await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` + + await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` + await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` } @@ -439,15 +437,20 @@ async function resolvedata(Name) { const [host, port] = Name.split(':'); startredis(Number(port)); await waitforredis(port); + await setupredis(port); + + if(host === "docker"){ const ipaddr= `hostname -I` Name = `${ipaddr}:${port}` } - + //trim space left behind by hostname -I data = Name.split(/\s+/).join(''); + + } async function unpack(file,folder){ @@ -483,13 +486,6 @@ async function unpack(file,folder){ } } -async function getheight(folder) { - - const p = await $`cd ${folder} && grep MAX-HEIGHT MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() - return p.stdout.trim() - -} - async function getjdata(folder) { const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() @@ -505,11 +501,20 @@ async function runNoneDevice(iport){ async function runDevice(iport,dport,group){ const [jamfolder,appfolder,folder] = getPaths(file,app) + fileDirectoryMqtt(folder,iport) const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) + + await dojamout_p1(iport,folder) + + setuptmux(`${folder}/${iport}`, appfolder) + + await doaout(num,iport, group, dport,folder,jappid) + + await dojamout_p2(Type, iport, folder,jappid,group ) } @@ -537,12 +542,12 @@ async function main(){ long, lat, Type, - iflow, - oflow, tags, file } = jamrunParsArg(process.argv)) + console.log(bg, "this is my backgroundß") } + catch(error){ if(error.type === "UsageError"){ show_usage() @@ -559,8 +564,7 @@ async function main(){ process.chdir(folder); await unpack(ifile, folder) isValidExecutable() - //Question: height is not used - const height = await getheight(folder); + const jdata = await getjdata(folder); let isDevice; @@ -590,18 +594,27 @@ async function main(){ } iport++; } - //QUESTION: what if jdata is wrong? if(jdata){ dport=iport + 20000; await resolvedata(`127.0.0.1:${dport}`) + + + } + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } if(isDevice) + { + await runDevice(iport,dport,group) + process.exit(0) + } else await runNoneDevice(iport) + + } diff --git a/tools/parser.mjs b/tools/parser.mjs index 00e30b3dd..91a437519 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -16,12 +16,11 @@ function generatelonglat() { } let [long, lat] = generatelonglat(); + const jamrunOptionDefinitions = [ { name: 'help', alias: 'h', type: Boolean, defaultValue: false}, {name : 'app', type: String , defaultValue: "app-n"}, {name : 'tags', type: String , defaultValue: undefined}, - {name : 'iflow', type: String , defaultValue: undefined}, - {name : 'oflow', type: String , defaultValue: undefined}, {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, {name : 'num', type: Number , defaultValue: 1}, {name : 'loc', type: String , defaultValue: `${long},${lat}`}, @@ -124,12 +123,6 @@ function SetJamrunVar(options){ AssignedVar[option]= toAdd[option] } console.log(Object.keys(AssignedVar)) - if(!("iflow" in AssignedVar)){ - AssignedVar["iflow"] = undefined; - } - if(!("oflow" in AssignedVar)){ - AssignedVar["oflow"] = undefined; - } if(!("tags" in AssignedVar)){ AssignedVar["tags"] = undefined; } @@ -191,7 +184,6 @@ export function getJargs(argObject){ return args; } -// let jargs = [`--app=${jappid}`, `--port=${pnum}`, `--group=${group}`, `--data=${data}`, `--edge=${edge}`, `--long=${long}`, `--lat=${lat}`, `--localregistryhost=${local_registry}`, `--${type}`]; From cb0f28ddb15d69ab16e84a0920e936898948785c Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 10 Jul 2024 12:17:00 -0400 Subject: [PATCH 013/126] cleanUp problem fixed --- tools/jamrun.mjs | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 9cb0384a7..034a128b4 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -13,13 +13,14 @@ const { spawn,spawnSync } = require('child_process'); * add a new command as an indication of the continuity of jamrun app and if it's false clean the redis 3) REDIS THROWS unexpected ERROR IN SOME CASES FOR SOME REASON 4) CHECK THE NUM ISSUE. WE DON"T SEE THAT CLEARLY in the jamrun - 5) fully detach the proccesses + 6)add arg to check if the app is + 5)add the tag * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected(TO BE INVESTIGATED) - * 4) iFlow , oflow NOT BEING SET, I ADDED THEM. MAKE SURE IT'S NEEDED AND IT'S STRING(NEED TO BE REMOVED) - * height is not used (REMOVE) + + * ] J arg does not clearup @@ -31,8 +32,8 @@ let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, //SETUP CLEANING -// process.on('SIGINT', async () => await cleanup()); -// process.on('SIGTERM', async () => await cleanup()); +process.on('SIGINT', async () => await cleanup()); +process.on('SIGTERM', async () => await cleanup()); //MOVE HOME TO CONST FILE const childs =[] @@ -181,19 +182,24 @@ async function dojamout_p2(type, iport, folder, jappid, group=null){ } async function cleanup(){ - - await killtmux() - - if(temp_broker === 1){ - console.log(`Killing broker with PID: ${mqttPromiseProcesses}`) - mqttPromiseProcesses.kill("SIGTERM"); + if(bg){ + process.exit(0); } - if(childs.length!=0){ - for(let p of childs){ - p.kill("SIGTERM") + else{ + await killtmux() + + if(temp_broker === 1){ + console.log(`Killing broker with PID: ${mqttPromiseProcesses}`) + mqttPromiseProcesses.kill("SIGTERM"); + } + if(childs.length!=0){ + for(let p of childs){ + p.kill("SIGTERM") + } } + process.exit(0) } - process.exit(1) + } async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ @@ -265,6 +271,7 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ if(!NOVERBOSE){ console.log("Started the J node in background") } + process.exit(0) } async function doaout(num,port,group,datap,myf,jappid){ @@ -504,17 +511,9 @@ async function runDevice(iport,dport,group){ fileDirectoryMqtt(folder,iport) const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) - - await dojamout_p1(iport,folder) - - setuptmux(`${folder}/${iport}`, appfolder) - - await doaout(num,iport, group, dport,folder,jappid) - - await dojamout_p2(Type, iport, folder,jappid,group ) } @@ -609,7 +608,7 @@ async function main(){ { await runDevice(iport,dport,group) - process.exit(0) + } else await runNoneDevice(iport) From 7f34694a05b6ac7e282031460ba3275c407a4b85 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 10 Jul 2024 13:03:51 -0400 Subject: [PATCH 014/126] resume arg added --- tools/jamrun.mjs | 43 +++++++++++++++++++++++++++++++------------ tools/parser.mjs | 1 + 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 034a128b4..c15518136 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -19,8 +19,16 @@ const { spawn,spawnSync } = require('child_process'); * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected(TO BE INVESTIGATED) - - +QUESTION: +writing to dflow... [ 0, 4, 8, 10, 14 ] +await $`redis-cli -p ${port} FLUSHALL`;the count the count is 17 message-to-c-local-node +the count the count is 18 message-to-c-local-node +---------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] +---------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] +in resume writing to dflow changes and restarts but +---------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] +---------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] +stays the same * ] J arg does not clearup @@ -28,7 +36,7 @@ const { spawn,spawnSync } = require('child_process'); */ // //global variables -let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, tags, file; +let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, tags, file, resume; //SETUP CLEANING @@ -42,6 +50,7 @@ let mqttPromiseProcesses; const filePath = fileURLToPath(import.meta.url); const IDIR = path.dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); +console.log(REDISFUNCS) const SHELLPID = process.pid; @@ -224,8 +233,11 @@ async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ cwd: floc, stdio: 'inherit' }; + if(resume){ + console.log("############## RESUME ##############") + } spawnSync(command, args, options); - + await cleanup() } @@ -246,14 +258,16 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ let jargs = getJargs(argObject) console.log(floc) - const out = fs.openSync(`${floc}/log.j`, 'a'); + const logFile = fs.openSync(`${floc}/log.j`, 'a'); + if(resume){ + fs.writeFileSync(`${floc}/log.j`,"############## RESUME ##############") + } - const command = 'node'; const args = ['jstart.js', ...jargs]; const options = { cwd: floc, - stdio: ['ignore', out, out], + stdio: ['ignore', logFile, logFile], detached: true, }; @@ -397,6 +411,8 @@ function startredis(port) { $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow() + + } @@ -424,19 +440,20 @@ async function waitforredis(port){ if (!NOVERBOSE) { console.log(`Redis running at port: ${port}`); } + } async function setupredis(port) { - + await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` - - await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` - await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` + if(!resume){ + await $`redis-cli -p ${port} FLUSHALL`; + } } @@ -542,9 +559,11 @@ async function main(){ lat, Type, tags, - file + file, + resume, } = jamrunParsArg(process.argv)) console.log(bg, "this is my backgroundß") + console.log(resume, "this is my resume") } catch(error){ diff --git a/tools/parser.mjs b/tools/parser.mjs index 91a437519..e5d847e07 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -38,6 +38,7 @@ const jamrunOptionDefinitions = [ {name : 'local', type: Boolean, defaultValue: false}, {name : 'valgrind', type: Boolean, defaultValue: false}, {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, + {name : 'resume', type: Boolean, defaultValue: false}, ]; From b1324de19db97caeeba524e7f6491417c7d469f4 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 10 Jul 2024 20:41:26 -0400 Subject: [PATCH 015/126] num issue is fixed,tmux running in the right directory, file creation in the wrong directory fixed --- tools/jamrun.mjs | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index c15518136..02c18c19a 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -30,6 +30,7 @@ in resume writing to dflow changes and restarts but ---------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] stays the same * +Question: HOW IS THIS EXPECTED TO WOR? await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") bg/fg/pipe/nonePipe? what is the logic, having hard time to comprehend ] J arg does not clearup @@ -290,9 +291,9 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ async function doaout(num,port,group,datap,myf,jappid){ let counter=1 - //TODO: make sure it is checking the folder + if (fs.existsSync('a.out')) { - await $`chmod +x a.out` + await $`cd ${myf} && chmod +x a.out` } while(counter <= num){ // @@ -309,16 +310,25 @@ async function doaout(num,port,group,datap,myf,jappid){ } let cargs = getCargs(argObject) - await $`${TMUX} new-session -s ${tmux}-${counter} -d`; + console.log(process.cwd()) + + console.log(myf) + await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; + + if(!disable_stdout_redirect){ if (!log) { if(valgrind) - await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; + { + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; + } else - await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; + { + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; + } } else{ @@ -326,7 +336,7 @@ async function doaout(num,port,group,datap,myf,jappid){ //TO BE FIXE if(valgrind) - await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d script -a -c "${valgrind} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") @@ -343,7 +353,8 @@ async function doaout(num,port,group,datap,myf,jappid){ } else{ //check if this works. if it does. Investigate what is going on with j file - let p = await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") + console.log("got here") + await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") } } @@ -585,17 +596,22 @@ async function main(){ const jdata = await getjdata(folder); let isDevice; - + console.log("this is my type",Type) switch(Type){ case "cloud": + console.log("got in cloud") iport=9883 isDevice = false; - + break; case "fog": + console.log("got in fog") + iport=5883 isDevice = false - + break; case "device": + console.log("got in device") + iport=1883; isDevice = true; if(!local){ @@ -604,7 +620,7 @@ async function main(){ else group = 0; } - + console.log(isDevice, ": if true it is a device") while(true){ const porttaken = await portavailable(folder ,iport) if(porttaken !== 1){ @@ -616,16 +632,15 @@ async function main(){ dport=iport + 20000; await resolvedata(`127.0.0.1:${dport}`) - - } if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } + console.log("this is my port", iport) if(isDevice) { - + console.log("is here running device") await runDevice(iport,dport,group) } From be9609be5feaf080c3c8a65fe21c415509d0766f Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 10 Jul 2024 21:03:24 -0400 Subject: [PATCH 016/126] Fog and Cloud breaking fixed --- tools/jamrun.mjs | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 02c18c19a..4cdcc09dc 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -165,7 +165,10 @@ async function startmqtt(port, cFile){ async function dojamout(iport, folder,jappid) { await dojamout_p1 (iport ,folder) + console.log("P1 is over") await dojamout_p2 (iport ,folder, jappid) + console.log("P2 is over") + } async function dojamout_p1(pnum ,floc) { @@ -182,13 +185,16 @@ async function dojamout_p1(pnum ,floc) { } -async function dojamout_p2(type, iport, folder, jappid, group=null){ - if(!bg) - - await dojamout_p2_fg(type, iport, folder,jappid, group) +async function dojamout_p2(iport, folder, jappid, group=null){ + if(!bg){ + console.log("running on fg") + await dojamout_p2_fg(iport, folder,jappid, group) + } else - - dojamout_p2_bg(type, iport, folder,jappid, group) + { + console.log("running on bg") + dojamout_p2_bg(iport, folder,jappid, group) + } } async function cleanup(){ @@ -212,7 +218,7 @@ async function cleanup(){ } -async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ +async function dojamout_p2_fg(pnum, floc,jappid, group=null){ let argObject = { "--app":jappid, "--port":pnum, @@ -223,7 +229,7 @@ async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ "--long":long, "--lat":lat, "--localregistryhost":local_registry, - "--type": type + "--type": Type } let jargs = getJargs(argObject) @@ -237,8 +243,9 @@ async function dojamout_p2_fg(type, pnum, floc,jappid, group=null){ if(resume){ console.log("############## RESUME ##############") } + spawnSync(command, args, options); - + console.log("gettinf to the cleanUp") await cleanup() } @@ -322,13 +329,11 @@ async function doaout(num,port,group,datap,myf,jappid){ { if(valgrind) - { await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; - } + else - { await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; - } + } else{ @@ -338,7 +343,7 @@ async function doaout(num,port,group,datap,myf,jappid){ if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else - await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d script -a -c "${valgrind} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") } @@ -347,7 +352,7 @@ async function doaout(num,port,group,datap,myf,jappid){ //TO BE FIXE //none linix machines does not have this? // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") - await $`cd ${myf} && ${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; } } } @@ -421,7 +426,7 @@ function startredis(port) { - $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow() + $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow() @@ -531,6 +536,7 @@ async function runNoneDevice(iport){ const [jamfolder,appfolder,folder] = getPaths(file,app) fileDirectoryMqtt(folder,iport) const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) + console.log("doing dojamout") await dojamout(iport, folder, jappid) } @@ -603,12 +609,13 @@ async function main(){ iport=9883 isDevice = false; break; + case "fog": console.log("got in fog") - iport=5883 isDevice = false break; + case "device": console.log("got in device") @@ -645,8 +652,10 @@ async function main(){ } else - await runNoneDevice(iport) - + { + console.log("is here running noneDevice") + await runNoneDevice(iport) + } } From e8cd997c751f2fc13e969636e22f05ef2c816fb2 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 15 Jul 2024 16:29:25 -0400 Subject: [PATCH 017/126] list kill working first itter --- tools/fileDirectory.mjs | 26 +++- tools/jamkill | 5 + tools/jamkill.mjs | 274 ++++++++++++++++++++++++++++++++++++++++ tools/jamlist.mjs | 164 ++++++++++++++++++++++++ tools/jamrun.mjs | 41 +++--- tools/parser.mjs | 52 ++++++++ 6 files changed, 542 insertions(+), 20 deletions(-) create mode 100644 tools/jamkill.mjs create mode 100644 tools/jamlist.mjs diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 6b44136ea..c8282aeaa 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -20,7 +20,16 @@ export function fileDirectorySetUp(file,app){ fs.writeFileSync(`${appfolder}/app`, `${app}\n`) return [jamfolder,appfolder,folder,filenoext ] } -export function getPaths(file,app){ + +export function getJamFolder(){ + return `${HOME}/.jamruns` +} + +export function getAppFolder(){ + return `${HOME}/.jamruns/apps` +} + +export function getPaths(file=null,app=null){ const jamfolder=`${HOME}/.jamruns` const appfolder=`${jamfolder}/apps`; @@ -39,6 +48,21 @@ export function getFolder(file,app){ return folder; } +export async function getAppFolderAndSubDir(){ + const jamfolder=`${HOME}/.jamruns` + const appfolder=`${jamfolder}/apps`; + if(!fs.existsSync(appfolder)){ + throw new Error("No running instances of JAMScript") + } + const subDirs = ((await fs.readdir(appfolder, { withFileTypes: true })).filter((entry) => entry.isDirectory())) + if(!subDirs || subDirs.lenth === 0 ){ + throw new Error("No running instances of JAMScript") + } + const subDirsName = subDirs.map(entry => entry.name ) + + return [subDirsName, appfolder] +} + export function getappid(mainf, localf, appid,appfolder){ if(appid === "app-n"){ diff --git a/tools/jamkill b/tools/jamkill index b85b2f02e..2eca83c31 100755 --- a/tools/jamkill +++ b/tools/jamkill @@ -1,6 +1,7 @@ #!/bin/bash IDIR="${BASH_SOURCE%/*}" +echo $BASH_SOURCE if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi source "$IDIR/inc/misc_tools.sh" @@ -104,6 +105,10 @@ killjob() { local appid=`cat $dir/appid` if [ $appid == $jobid ]; then + echo $dir + echo "this is my dir" + echo $jexs + echo "this is my jexs" killprocess $dir $jexs if [ -e $dir/tmuxid ]; then killtmux `cat $dir/tmuxid` diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs new file mode 100644 index 000000000..3268a85e3 --- /dev/null +++ b/tools/jamkill.mjs @@ -0,0 +1,274 @@ +#!/usr/bin/env zx +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +import {getKilltArgs} from "./parser.mjs" + +/* + * 1)shouldn't kill last kill the last running job in the packground instead of the last job itself? + 2) we kill based on app name but not the program name for some reason(ex. jt2,jt3 with appname shahin will both be killed and no way to seperate them apart from each others) + 3)discuss the new kill app appriach + 4)what id the app is not found? + 5)what if you run jamKill with no args back to back? + 6)what is app_id exactly? + 7)app and appId concept is mixed up in my head I don't think it is what it should be + 8) how does the default name works? + */ + + +async function killtmux(tmuxid){ + try{ + console.log("curr address", process.cwd()) + console.log(`${tmuxid}`) + const p = await $`tmux ls | grep ${tmuxid} | cut -d ':' -f 1`; + const tmuxList = p.stdout.toString().trim().split("\n") + for(let tmux of tmuxList){ + console.log("list of tmuxes" , tmuxList) + await $`tmux kill-session -t ${tmux}` + } + } + catch(error){ + } +} + + +async function killprocess(){ + if(fs.existsSync("./shellpid")){ + const pid = fs.readFileSync("./shellpid").toString().trim(); + let exists; + try { + const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` + exists = Number(p.stdout.trim()); + } catch (error) { + exists = 0 + } + if(exists){ + console.log(`Killing process ${pid}`) + process.kill(pid); + } + } + if(fs.existsSync("./processId")){ + const pid = fs.readFileSync("./processId").toString().trim(); + let exists; + try { + const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` + exists = Number(p.stdout.trim()); + } catch (error) { + exists = 0 + } + if(exists){ + console.log(`Killing process ${pid}`) + process.kill(pid); + } + try { + const port = process.cwd().split("/").pop() + const p = await $`ps ax | grep node | grep ${port} | cut -d ' ' -f 2 | tr -d '[:space:]'` + exists = Number(p.stdout.trim()); + } catch (error) { + exists = 0 + } + if(exists){ + console.log(`Killing process ${pid}`) + process.kill(pid); + } + + + } +} +async function getJobsSubDirMap(){ + const subDirMap = new Map() + const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) + for(let dir of subdirs){ + if(dir.length > 2){ + + const head = dir[0] + const tail =(dir.filter((_,index) => index !== 0)).join("_") + const dirName = dir.join("_") + + + + subDirMap.set(tail, dirName) + + } + else{ + const head = dir[0] + const tail = dir[1]; + const dirName = dir.join("_") + subDirMap.set(tail, dirName) + } + } + return subDirMap; +} + +async function getPortSubDir(){ + const ports = (((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name)) + if(ports.length !== 0){ + return ports + } +} + +async function killAll(){ + const appsMap = await getJobsSubDirMap(); + for(let app of appsMap.keys()){ + process.chdir(`./${appsMap.get(app)}`); + const ports =await getPortSubDir(); + if(ports){ + for(let port of ports){ + process.chdir(`./${port}`); + await killprocess() + if(fs.existsSync("./tmuxid")){ + await killtmux(fs.readFileSync("./tmuxid").toString().trim()); + } + process.chdir("..") + } + } + process.chdir("..") + } +} +//brute force approach(safest but not best) +async function killjob(jobName){ + const appsMap = await getJobsSubDirMap(); + for(let app of appsMap.keys()){ + + process.chdir(`./${appsMap.get(app)}`); + const ports = await getPortSubDir(); + if(ports){ + for(let port of ports){ + process.chdir(`./${port}`); + if(fs.existsSync("./appid")){ + const appId = fs.readFileSync("./appid").toString().trim() + if(appId === jobName){ + await killprocess() + if(fs.existsSync("./tmuxid")){ + await killtmux(fs.readFileSync("./tmuxid").toString().trim()); + } + + } + } + process.chdir("..") + } + } + process.chdir("..") + } +} +//More effiecent in time but vonurable to problems +// async function killjob_V2(lastRunningJob){ +// const jobId = lastRunningJob; +// const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) +// let jobFolder; +// for(let dir of subdirs){ +// if(dir.length > 2){ +// const head = dir[0]; +// const tail =(dir.filter((_,index) => index !== 0)).join("_") +// if(tail === jobId){ +// jobFolder = `${head}`+"_"+`${tail}` +// process.chdir(`./${jobFolder}`) +// const dirs = ((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name); +// await killprocess() +// if(fs.existsSync("./tmuxid")){ +// const tmuxid = fs.readFileSync("./tmuxid").toString().trim() +// await killtmux(tmuxid) +// } + +// } +// } +// else{ +// const head = dir[0]; +// const tail = dir[1]; +// if(tail === jobId){ +// jobFolder = `${head}`+"_"+`${tail}` +// await killprocess() +// if(fs.existsSync("./tmuxid")){ +// const tmuxid = fs.readFileSync("./tmuxid").toString().trim() +// await killtmux(tmuxid) +// } +// } +// else if( tail === "app-n" ){ +// process.chdir("./app-n") +// const dirs = ((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name); +// for(let dir of dirs){ +// process.chdir(`./${dir}`) +// if(fs.existsSync('./appid')){ +// const id = fs.readFileSync('./appid').toString().trim() +// if(id === jobId ){ +// await killprocess() +// if(fs.existsSync("./tmuxid")){ +// const tmuxid = fs.readFileSync("./tmuxid").toString().trim(); +// await killtmux(tmuxid); +// } +// } +// } +// process.chdir('..') +// } +// process.chdir('..') +// } +// } +// } + + +// } +async function main(){ + + let arg; + + try{ + arg = getKilltArgs(process.argv) + + } + catch(error){ + if(error.type === "ShowUsage"){ + console.log( + ` + Kill running instances of the application. + + Usage: jamkill [--all|app_id|--help] + + jamkill + kill the program started last among the currently running ones + + jamkill --help + displays this help messages + + jamkill --all + kills all running instances + + jamkill app_id + kills all running instances that were started under app-id + + ` + ) + } + process.exit(1); + } + console.log(arg, "this is my arg") + const jamfolder = getJamFolder(); + const appfolder = getAppFolder(); + if( !fs.existsSync(jamfolder) ){ + throw new Error('.jamruns folder missing. JAMScript tools not setup?') + }; + + if( !fs.existsSync(appfolder) ){ + throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') + }; + + process.chdir(appfolder); + + if(arg === "last"){ + const lastRunningJob = fs.readFileSync("./appid").toString().trim() + console.log(lastRunningJob, "JOB TO KILL") + await killjob(lastRunningJob) + } + if(arg === "all"){ + await killAll(); + } + + else{ + console.log("IM KILLING JOBS") + await killjob(arg); + } + + + +} + +(async() => { + await main() +})() \ No newline at end of file diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs new file mode 100644 index 000000000..98a3e8387 --- /dev/null +++ b/tools/jamlist.mjs @@ -0,0 +1,164 @@ +#!/usr/bin/env zx +/** + * 1)The option to limit the search to the impprted app variable is not working + * 2)Fix the usage msg + * 3) when can /machType` be empty?! + * 4)if device is _ then it is not running (true or false) + * 5)can we have a jNode without a CNode? + * 6)discuss strategies for jamlist + * 7) what is the cleanUp exactly? + * + * + * + */ +import { getJamListArgs } from "./parser.mjs"; +import {getAppFolderAndSubDir} from "./fileDirectory.mjs" + + +let app; +try{ + app = getJamListArgs(process.argv) +} +catch(error){ + if(error.type = "ShowUsage"){ + console.log( + ` + Usage: jamlist [--app=appl_name] + + Lists details about all activated instances of JAMScript programs. Use the --app=X + option to limit the listing to programs that match the given name (i.e., X). + ` + + ) + process.exit(1); + } + throw error; +} + +async function printNodeInfo(dirName, programName){ + const path = `${process.cwd()}/${dirName}` + let mType,appid,dstore,tmuxid,parid + + if(fs.existsSync(`${path}/machType`)){ + mType= fs.readFileSync(`${path}/machType`).toString().trim() + } + else{ + mType = "-"; + // fs.writeFileSync(`${path}/processId`,"old") + } + if(fs.existsSync(`${path}/appid`)){ + appid= fs.readFileSync(`${path}/appid`).toString().trim() + } + else{ + appid = "-" + } + if(fs.existsSync(`${path}/dataStore`)){ + dstore= fs.readFileSync(`${path}/dataStore`).toString().trim() + } + else{ + dstore = "-" + } + if(fs.existsSync(`${path}/tmuxid`)){ + tmuxid= fs.readFileSync(`${path}/tmuxid`).toString().trim() + } + else{ + tmuxid = "-" + } + if(fs.existsSync(`${path}/parentId`)){ + parid= fs.readFileSync(`${path}/parentId`).toString().trim() + } + else{ + parid = "-" + } + let cdevs = 0; + if(mType !== "--"){ + if(mType == "device"){ + + let cdevProcesses = (await fs.readdir(path)).filter(entry => entry.includes("cdevProcessId")); + for(let cdevProcess of cdevProcesses){ + let pid = fs.readFileSync(`${path}/${cdevProcess}`).toString().trim(); + const process = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'`.nothrow() + const isOk = process.stdout.trim() + if(isOk){ + cdevs++ + } + } + const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; + console.log(headerString) + + } + else{ + const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${("--").padEnd(15)} ${tmuxid.padEnd(15)}`; + console.log(headerString) + } + } + +} + +async function main(){ + let subDirs; + let appfolder; + try{ + + [subDirs, appfolder] =await getAppFolderAndSubDir(); + } + catch(error){ + console.log("No running instances of JAMScript.") + } + process.chdir(appfolder) + const headerString = ` ${"ID".padEnd(15)} ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(15)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; + console.log(headerString); + for(let subDir of subDirs ){ + const [programName, appName] = subDir.split("_"); + process.chdir(`${subDir}`) + const jexs = ((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name) + if(!jexs || jexs.length === 0){ + break; + } + + for(let jex of jexs){ + let running; + if(fs.existsSync(`${appfolder}/${subDir}/${jex}/processId`)){ + const pid = fs.readFileSync(`${appfolder}/${subDir}/${jex}/processId`).toString().trim(); + if(pid === "new") + running = "new"; + else if(!pid){ + running = "none" + } + else{ + + const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'`.nothrow() + const present = p.stdout.trim() + if (present == "1") + running="ps" + else + running="none" + } + } + else{ + running = "none" + } + if(running === "ps" || running === "new"){ + if(!app) + printNodeInfo(jex,programName) + + else + if(appName.includes(app)) + printNodeInfo(jex,programName) + + + } + } + + + process.chdir(`./..`) + + + + } + + +} +(async () => { + await main() +})(); \ No newline at end of file diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 4cdcc09dc..75f714554 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -2,6 +2,7 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder} from './fileDirectory.mjs' +import { inherits } from 'util'; const { spawn,spawnSync } = require('child_process'); /*** @@ -181,7 +182,7 @@ async function dojamout_p1(pnum ,floc) { fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); - fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); + fs.writeFileSync(`${floc}/${pnum}/{processId}`, "new"+"\n"); } @@ -249,7 +250,7 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ await cleanup() } -function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ +function dojamout_p2_bg(pnum, floc, jappid, group=null){ console.log("THE EXECUTION IS ON THE BG") let argObject = { "--app":jappid, @@ -261,7 +262,7 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ "--long":long, "--lat":lat, "--localregistryhost":local_registry, - "--type": type + "--type": Type } let jargs = getJargs(argObject) @@ -279,10 +280,6 @@ function dojamout_p2_bg(type, pnum, floc, jappid, group=null){ detached: true, }; - - - - const p = spawn(command, args, options); p.unref(); @@ -303,7 +300,7 @@ async function doaout(num,port,group,datap,myf,jappid){ await $`cd ${myf} && chmod +x a.out` } while(counter <= num){ - // + if(fs.existsSync('a.out')){ const argObject = @@ -317,9 +314,8 @@ async function doaout(num,port,group,datap,myf,jappid){ } let cargs = getCargs(argObject) - console.log(process.cwd()) - console.log(myf) + console.log(cargs, "this is my carg pre") await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; @@ -339,27 +335,34 @@ async function doaout(num,port,group,datap,myf,jappid){ else{ if(Machine === "Linux"){ //TO BE FIXE - if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; - // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d script -a -c "${valgrind} ./a.out ${cargs}" -f log`.stdio("pipe","pipe","pipe") - } else{ //TO BE FIXE - //none linix machines does not have this? - // let p = await $`${TMUX} new-session -s ${tmux}-${counter} -d "script -a -t 1 log ./a.out ${cargs}"`.stdio("pipe","pipe","pipe") await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; } } } else{ - //check if this works. if it does. Investigate what is going on with j file - console.log("got here") - await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") + //for some reson that I'm strugling to figure out this does not work(TO BE FIXE) + const command = './a.out'; + + const args = cargs.split('-').filter(entry => entry !== " ").map((entry => "-"+entry.trim())); + console.log(args) + console.log(myf) + const options = { + cwd: myf, + stdio: ['ignore', 'ignore', 'ignore'], + detached: true, + }; + const p1 = spawn(command,args,options); + p1.unref() + await sleep(200) + } } @@ -548,7 +551,7 @@ async function runDevice(iport,dport,group){ await dojamout_p1(iport,folder) setuptmux(`${folder}/${iport}`, appfolder) await doaout(num,iport, group, dport,folder,jappid) - await dojamout_p2(Type, iport, folder,jappid,group ) + await dojamout_p2(iport, folder,jappid,group ) } diff --git a/tools/parser.mjs b/tools/parser.mjs index e5d847e07..e0dde6d01 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -41,6 +41,18 @@ const jamrunOptionDefinitions = [ {name : 'resume', type: Boolean, defaultValue: false}, ]; +const jamlistOptionDefinition = [ + {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : 'app',alias : "a", type: String , defaultValue: undefined }, + ]; + +const jamkillOptionDefinition = [ + {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : 'all',alias : "a", type: Boolean , defaultValue: false }, + {name : 'app_id', type: String , defaultValue: undefined }, + +]; + function retrieveType(device, fog, cloud){ @@ -186,6 +198,46 @@ export function getJargs(argObject){ } +export function getJamListArgs(argv){ + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlist.mjs'))) + let options + try{ + options = commandLineArgs(jamlistOptionDefinition, {argv: args}); + } + catch(error){ + } + if(options === undefined || options.help){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; + } + return options.app + + +} + + +export function getKilltArgs(argv){ + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) + let options + try{ + options = commandLineArgs(jamkillOptionDefinition, {argv: args}); + } + catch(error){ + } + if(args.length === 0){ + return "last" + } + if(options === undefined || options.help || args.length>1){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; + } + const arg = options.all? "all": options.app_id + return arg + + +} From e4f04f6a5d8fcb336fc5b1bce69f74da0ad3493d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 15 Jul 2024 17:57:25 -0400 Subject: [PATCH 018/126] jamClean big issues fixed first running iter --- tools/jamclean.mjs | 84 ++++++++++++++++++++++++++++++++++++++++++++++ tools/jamlist.mjs | 79 ++++++++++++++++++++++--------------------- tools/parser.mjs | 23 +++++++++++++ 3 files changed, 148 insertions(+), 38 deletions(-) create mode 100644 tools/jamclean.mjs diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs new file mode 100644 index 000000000..33a51ded5 --- /dev/null +++ b/tools/jamclean.mjs @@ -0,0 +1,84 @@ +#!/usr/bin/env zx +import getcleanArgs from "./parser.mjs" +import { getJamFolder } from "./fileDirectory.mjs"; + + + +async function getJobsSubDirMap(){ + const subDirMap = new Map() + const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) + for(let dir of subdirs){ + if(dir.length > 2){ + + const head = dir[0] + const tail =(dir.filter((_,index) => index !== 0)).join("_") + const dirName = dir.join("_") + + + + subDirMap.set(tail, dirName) + + } + else{ + const head = dir[0] + const tail = dir[1]; + const dirName = dir.join("_") + subDirMap.set(tail, dirName) + } + } + return subDirMap; +} + +export async function cleanUp(){ + try{ + getcleanArgs(process.argv) + + } + catch(error){ + if(error.type === "ShowUsage"){ + console.log( + ` + + Usage: jamclean + Purges inactive JAMScript programs from the listing. + + ` + ) + } + process.exit(1); + } + const jamfolder = getJamFolder(); + if(!fs.existsSync(jamfolder)){ + process.exit(0) + } + process.chdir(jamfolder); + const appsMap = await getJobsSubDirMap(); + + for(let app of appsMap.keys()){ + process.chdir(`./${appsMap.get(app)}`); + const ports = await getPortSubDir(); + if(ports){ + for(let port of ports){ + let isRunning + process.chdir(`./${port}`); + const toCheck = (fs.existsSync("./processId")) ? fs.fs.readFileSync("./processId") : fs.fs.readFileSync("./shellpid") + try{ + const p = await $`ps -p ${toCheck} | grep node | wc -l | tr -d '[:space:]'` + isRunning = true + } + catch(error){ + isRunning = false; + } + process.chdir("..") + if(!isRunning){ + await $`rm -rf ./${port}` + } + } + } + process.chdir("..") + } +} + +(async() =>{ + await cleanUp(); +})() \ No newline at end of file diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 98a3e8387..d3b342f0a 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -13,27 +13,10 @@ */ import { getJamListArgs } from "./parser.mjs"; import {getAppFolderAndSubDir} from "./fileDirectory.mjs" +import { cleanUp } from "./jamclean.mjs"; -let app; -try{ - app = getJamListArgs(process.argv) -} -catch(error){ - if(error.type = "ShowUsage"){ - console.log( - ` - Usage: jamlist [--app=appl_name] - Lists details about all activated instances of JAMScript programs. Use the --app=X - option to limit the listing to programs that match the given name (i.e., X). - ` - - ) - process.exit(1); - } - throw error; -} async function printNodeInfo(dirName, programName){ const path = `${process.cwd()}/${dirName}` @@ -44,7 +27,7 @@ async function printNodeInfo(dirName, programName){ } else{ mType = "-"; - // fs.writeFileSync(`${path}/processId`,"old") + } if(fs.existsSync(`${path}/appid`)){ appid= fs.readFileSync(`${path}/appid`).toString().trim() @@ -71,33 +54,52 @@ async function printNodeInfo(dirName, programName){ parid = "-" } let cdevs = 0; - if(mType !== "--"){ - if(mType == "device"){ - - let cdevProcesses = (await fs.readdir(path)).filter(entry => entry.includes("cdevProcessId")); - for(let cdevProcess of cdevProcesses){ - let pid = fs.readFileSync(`${path}/${cdevProcess}`).toString().trim(); - const process = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'`.nothrow() - const isOk = process.stdout.trim() - if(isOk){ - cdevs++ - } - } - const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; - console.log(headerString) - - } - else{ - const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${("--").padEnd(15)} ${tmuxid.padEnd(15)}`; - console.log(headerString) + + if(mType == "device"){ + + let cdevProcesses = (await fs.readdir(path)).filter(entry => entry.includes("cdevProcessId")); + for(let cdevProcess of cdevProcesses){ + let pid = fs.readFileSync(`${path}/${cdevProcess}`).toString().trim(); + const process = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'`.nothrow() + const isOk = process.stdout.trim() + if(isOk){ + cdevs++ + } } + const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; + console.log(headerString) + + } + else{ + const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${("--").padEnd(15)} ${tmuxid.padEnd(15)}`; + console.log(headerString) } + } async function main(){ let subDirs; let appfolder; + let app; + try{ + app = getJamListArgs(process.argv) + } + catch(error){ + if(error.type = "ShowUsage"){ + console.log( + ` + Usage: jamlist [--app=appl_name] + + Lists details about all activated instances of JAMScript programs. Use the --app=X + option to limit the listing to programs that match the given name (i.e., X). + ` + + ) + process.exit(1); + } + throw error; + } try{ [subDirs, appfolder] =await getAppFolderAndSubDir(); @@ -105,6 +107,7 @@ async function main(){ catch(error){ console.log("No running instances of JAMScript.") } + await cleanUp() process.chdir(appfolder) const headerString = ` ${"ID".padEnd(15)} ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(15)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; console.log(headerString); diff --git a/tools/parser.mjs b/tools/parser.mjs index e0dde6d01..2629a4174 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -52,7 +52,10 @@ const jamkillOptionDefinition = [ {name : 'app_id', type: String , defaultValue: undefined }, ]; +const jamcleanOptionDefinition = [ + {name : "help", alias : "h", type: Boolean, defaultValue : false }, +]; function retrieveType(device, fog, cloud){ @@ -241,3 +244,23 @@ export function getKilltArgs(argv){ +export function getcleanArgs(argv){ + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) + let options + try{ + options = commandLineArgs(jamcleanOptionDefinition, {argv: args}); + } + catch(error){ + } + + if(options === undefined || options.help){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; + } + +} + + + + From a6d2fc417eebeb49ee3fed72e1bbf774e50b492c Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 15 Jul 2024 20:12:32 -0400 Subject: [PATCH 019/126] start of the file by file finilizing --- tools/jamclean.mjs | 24 ++++++++++++++++++------ tools/jamlist.mjs | 2 +- tools/parser.mjs | 4 +++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 33a51ded5..e33cc2d9d 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env zx -import getcleanArgs from "./parser.mjs" +import {getcleanArgs} from "./parser.mjs" import { getJamFolder } from "./fileDirectory.mjs"; @@ -28,6 +28,12 @@ async function getJobsSubDirMap(){ } return subDirMap; } +async function getPortSubDir(){ + const ports = (((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name)) + if(ports.length !== 0){ + return ports + } +} export async function cleanUp(){ try{ @@ -51,17 +57,23 @@ export async function cleanUp(){ if(!fs.existsSync(jamfolder)){ process.exit(0) } - process.chdir(jamfolder); + process.chdir(`${jamfolder}/apps`); const appsMap = await getJobsSubDirMap(); - for(let app of appsMap.keys()){ - process.chdir(`./${appsMap.get(app)}`); + + process.chdir(`${appsMap.get(app)}`); + console.log(process.cwd(), "this is my app dir") const ports = await getPortSubDir(); + console.log(process.cwd(), "this is my portDir dir") if(ports){ + console.log(process.cwd(), "this is my portDir dir") for(let port of ports){ + console.log(process.cwd(), "this is my portDir dir") let isRunning - process.chdir(`./${port}`); - const toCheck = (fs.existsSync("./processId")) ? fs.fs.readFileSync("./processId") : fs.fs.readFileSync("./shellpid") + console.log(port, "this is my port") + console.log(process.cwd(), "this is my portDir dir") + process.chdir(`${port}`); + const toCheck = (fs.existsSync("processId")) ? fs.readFileSync("processId") : fs.readFileSync("shellpid") try{ const p = await $`ps -p ${toCheck} | grep node | wc -l | tr -d '[:space:]'` isRunning = true diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index d3b342f0a..a011bd711 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -107,7 +107,7 @@ async function main(){ catch(error){ console.log("No running instances of JAMScript.") } - await cleanUp() + await cleanUp(); process.chdir(appfolder) const headerString = ` ${"ID".padEnd(15)} ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(15)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; console.log(headerString); diff --git a/tools/parser.mjs b/tools/parser.mjs index 2629a4174..ba7d34e79 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -245,13 +245,15 @@ export function getKilltArgs(argv){ export function getcleanArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs') && !entry.includes('jamlist.mjs'))) let options + console.log(args) try{ options = commandLineArgs(jamcleanOptionDefinition, {argv: args}); } catch(error){ } + console.log(options) if(options === undefined || options.help){ const error = new Error("SHOW USAGE") From 24a1356aac7650e1397fee903f86f43288c1d33f Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 15 Jul 2024 22:17:51 -0400 Subject: [PATCH 020/126] checkpoint --- tools/jamlist.mjs | 4 ++-- tools/jamrun.mjs | 17 +++++++++-------- tools/parser.mjs | 23 ++++++++++++++++------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index a011bd711..a5e1fbfb1 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -13,7 +13,7 @@ */ import { getJamListArgs } from "./parser.mjs"; import {getAppFolderAndSubDir} from "./fileDirectory.mjs" -import { cleanUp } from "./jamclean.mjs"; +// import { cleanUp } from "./jamclean.mjs"; @@ -107,7 +107,7 @@ async function main(){ catch(error){ console.log("No running instances of JAMScript.") } - await cleanUp(); + // await cleanUp(); process.chdir(appfolder) const headerString = ` ${"ID".padEnd(15)} ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(15)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; console.log(headerString); diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 75f714554..7f8cf5bf4 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -123,6 +123,8 @@ function show_usage(){ Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. + Use --resume to avoid reseting the reddis and resume the ongoing task + Usage: jamrun file.jxe [--app=appl_name] [--fog|--cloud] @@ -139,6 +141,7 @@ function show_usage(){ [--edge=num_edge_connections] [--valgrind] [--local] + [--resume] The jamrun command creates a run state in the $HOME/.jamruns folder. `; @@ -320,8 +323,8 @@ async function doaout(num,port,group,datap,myf,jappid){ if(!disable_stdout_redirect){ - if (!log) + if (!log) { if(valgrind) @@ -329,7 +332,7 @@ async function doaout(num,port,group,datap,myf,jappid){ else await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; - + } else{ @@ -582,17 +585,17 @@ async function main(){ file, resume, } = jamrunParsArg(process.argv)) - console.log(bg, "this is my backgroundß") - console.log(resume, "this is my resume") + } catch(error){ - if(error.type === "UsageError"){ + if(error.type === "ShowUsage"){ show_usage() process.exit(1) } else{ - throw new Error(error.message) + console.log(error.message) + process.exit(1) } } fileDirectorySetUp(file,app) @@ -602,10 +605,8 @@ async function main(){ process.chdir(folder); await unpack(ifile, folder) isValidExecutable() - const jdata = await getjdata(folder); let isDevice; - console.log("this is my type",Type) switch(Type){ case "cloud": console.log("got in cloud") diff --git a/tools/parser.mjs b/tools/parser.mjs index ba7d34e79..d566ebe47 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -90,6 +90,7 @@ function getJamrunArgs(args){ } catch(error){ } + return options; } @@ -101,18 +102,24 @@ function checkJXEfile(arg){ error.type = "ShowUsage" throw error; } + const file = `${arg[0]}`; const fext = file.split(".").pop() + if(fext !== "jxe"){ if(!fext) + throw new Error(`${file} is not file name or missing extention`) - else + else + { throw new Error(`Extension on ${file} is not .jxe`) + } } const absolutePath = path.resolve(file); if(!fs.existsSync(absolutePath)){ throw new Error(`File: ${file} not found`) } + return file; } function SetJamrunVar(options){ @@ -138,7 +145,7 @@ function SetJamrunVar(options){ for(let option of Object.keys(toAdd)){ AssignedVar[option]= toAdd[option] } - console.log(Object.keys(AssignedVar)) + if(!("tags" in AssignedVar)){ AssignedVar["tags"] = undefined; } @@ -149,8 +156,10 @@ function SetJamrunVar(options){ //question one on remNote export function jamrunParsArg(argv){ - //remove redundent arfs + + const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) + const file = checkJXEfile(arg) let proccessedArgs = arg.filter((_,index) => (index !== 0 )); const options = getJamrunArgs(proccessedArgs); @@ -173,7 +182,7 @@ export function jamrunParsArg(argv){ //ASK wHAT VARIABLES ARE OPTIONAL //TO BE TESTED export function getCargs(argObject){ - // console.log("this is my cObject arg\n", argObject) + let args = "" for(let key of Object.keys(argObject)){ @@ -196,7 +205,7 @@ export function getJargs(argObject){ args.push(`${key}=${argObject[key]}`) } } - console.log("this is my jArgs\n",args ) + return args; } @@ -247,13 +256,13 @@ export function getKilltArgs(argv){ export function getcleanArgs(argv){ const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs') && !entry.includes('jamlist.mjs'))) let options - console.log(args) + try{ options = commandLineArgs(jamcleanOptionDefinition, {argv: args}); } catch(error){ } - console.log(options) + if(options === undefined || options.help){ const error = new Error("SHOW USAGE") From bac632b3bd2bc70cba7e8f0f7c8041e1816aa130 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 16 Jul 2024 16:10:07 -0400 Subject: [PATCH 021/126] checkPoint --- tools/jamlist | 2 +- tools/jamlist.mjs | 4 +++- tools/jamrun.mjs | 10 ++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tools/jamlist b/tools/jamlist index f8c1e13f6..7fa5f91ab 100755 --- a/tools/jamlist +++ b/tools/jamlist @@ -222,4 +222,4 @@ if [ "$(ls -A $appsfolder)" ]; then else echo "No running instances of JAMScript." exit 0 -fi +fi \ No newline at end of file diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index a5e1fbfb1..1cae0536b 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -107,7 +107,7 @@ async function main(){ catch(error){ console.log("No running instances of JAMScript.") } - // await cleanUp(); + process.chdir(appfolder) const headerString = ` ${"ID".padEnd(15)} ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(15)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; console.log(headerString); @@ -122,7 +122,9 @@ async function main(){ for(let jex of jexs){ let running; if(fs.existsSync(`${appfolder}/${subDir}/${jex}/processId`)){ + const pid = fs.readFileSync(`${appfolder}/${subDir}/${jex}/processId`).toString().trim(); + console.log(`I got here. PROCESSID`, pid) if(pid === "new") running = "new"; else if(!pid){ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 7f8cf5bf4..a3e5c51ac 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -16,6 +16,8 @@ const { spawn,spawnSync } = require('child_process'); 4) CHECK THE NUM ISSUE. WE DON"T SEE THAT CLEARLY in the jamrun 6)add arg to check if the app is 5)add the tag + 6)running shahin with 3 tmux then inxreas it to 4 and then decirese it to 2 + 7)tmux is not being cleaned up * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected(TO BE INVESTIGATED) @@ -35,6 +37,8 @@ Question: HOW IS THIS EXPECTED TO WOR? await $`./a.out ${cargs}`.stdio("pipe","p ] J arg does not clearup +running the same bg task + */ // //global variables @@ -587,6 +591,7 @@ async function main(){ } = jamrunParsArg(process.argv)) } + catch(error){ if(error.type === "ShowUsage"){ @@ -594,13 +599,14 @@ async function main(){ process.exit(1) } else{ - console.log(error.message) + show_usage() process.exit(1) } } + fileDirectorySetUp(file,app) const folder = getFolder(file,app) - + console.log(num) const ifile = path.resolve(file); process.chdir(folder); await unpack(ifile, folder) From 94747b9fb0f967b3690ee63e4645719e29cb656d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 16 Jul 2024 16:55:30 -0400 Subject: [PATCH 022/126] port issue is resolved for the device --- tools/jamlist.mjs | 1 - tools/jamrun.mjs | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 1cae0536b..409dea568 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -124,7 +124,6 @@ async function main(){ if(fs.existsSync(`${appfolder}/${subDir}/${jex}/processId`)){ const pid = fs.readFileSync(`${appfolder}/${subDir}/${jex}/processId`).toString().trim(); - console.log(`I got here. PROCESSID`, pid) if(pid === "new") running = "new"; else if(!pid){ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index a3e5c51ac..628d849e6 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -189,7 +189,7 @@ async function dojamout_p1(pnum ,floc) { fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); - fs.writeFileSync(`${floc}/${pnum}/{processId}`, "new"+"\n"); + fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); } @@ -383,8 +383,10 @@ async function doaout(num,port,group,datap,myf,jappid){ async function portavailable(folder,port) { let pid; let porttaken; - if(fs.existsSync(`./${folder}/${port}`)){ + + if(fs.existsSync(`${folder}/${port}`)){ if(fs.existsSync(`${folder}/${port}/processId`)){ + console.log("process id available(portavailable)"); try{ pid = fs.readFileSync(`${folder}/${port}/processId`) } @@ -393,10 +395,13 @@ async function portavailable(folder,port) { } if(pid === "new"){ + console.log("processId was new(portavailable)"); porttaken=1; } else if(pid){ - porttaken= await $`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` + const p = await $`ps -o pid= -p ${pid} | wc -l | tr -d '[:space:]'` + porttaken = p.stdout.toString().trim() + console.log("port taken (portavailable)", porttaken) } else{ porttaken=0; @@ -410,9 +415,11 @@ async function portavailable(folder,port) { porttaken=0; } if(porttaken === 0){ + console.log("WE GOT HERE(portavailable)") const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() porttaken= p.stdout.trim() } + console.log("returned port taken(portavailable)", porttaken) return porttaken; } @@ -639,7 +646,10 @@ async function main(){ } console.log(isDevice, ": if true it is a device") while(true){ - const porttaken = await portavailable(folder ,iport) + console.log("this is my iport from main: " , iport) + console.log("this is my folder from main: ", folder) + const porttaken = Number(await portavailable(folder ,iport)) + console.log("porttaken from the main", porttaken) if(porttaken !== 1){ break; } From af8ce5befab0b694333bd469bb2f85348db86262 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 17 Jul 2024 13:50:29 -0400 Subject: [PATCH 023/126] mqtt redundent parent process fixed --- tools/jamlist.mjs | 11 ++- tools/jamrun.mjs | 183 +++++++++++++++++++++------------------------- 2 files changed, 95 insertions(+), 99 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 409dea568..79c95da1b 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -6,9 +6,18 @@ * 4)if device is _ then it is not running (true or false) * 5)can we have a jNode without a CNode? * 6)discuss strategies for jamlist + * 8)what to delete in the cleanUp process * 7) what is the cleanUp exactly? * * + * 8)make it monitor constantly. find a way to watch the file system. inotifyewait. keep it running. rp + * + * + * + * --------- + * remove cdevProcessId on jamlist if it is running + * + * * */ import { getJamListArgs } from "./parser.mjs"; @@ -130,7 +139,7 @@ async function main(){ running = "none" } else{ - + //can use try catch istead const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'`.nothrow() const present = p.stdout.trim() if (present == "1") diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 628d849e6..b710b14e1 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -2,47 +2,34 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder} from './fileDirectory.mjs' -import { inherits } from 'util'; const { spawn,spawnSync } = require('child_process'); /*** + * QUESTION: + * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? * NOTES - * num Error(HAVE IN MIND) - * handle log seperation in close(); - * new command: - - * add a new command as an indication of the continuity of jamrun app and if it's false clean the redis - 3) REDIS THROWS unexpected ERROR IN SOME CASES FOR SOME REASON - 4) CHECK THE NUM ISSUE. WE DON"T SEE THAT CLEARLY in the jamrun - 6)add arg to check if the app is - 5)add the tag - 6)running shahin with 3 tmux then inxreas it to 4 and then decirese it to 2 - 7)tmux is not being cleaned up + TOCHANGE: use spawn instead of $ in mosquitto. + categtorize the log files. + REMOVE THE DISABLE-RE_DERICET(DONE) + when old does not exist breaks + remove portDir on kill. + remove only the tmux you need to remove + mosquitto duplicate fix(done) + + - * 1) PORT IMPLEMENTATIONS SEEMS NOT TO BE WORKING -> PORT ID IS NOT BNEONG incremented as expected(TO BE INVESTIGATED) + -QUESTION: -writing to dflow... [ 0, 4, 8, 10, 14 ] -await $`redis-cli -p ${port} FLUSHALL`;the count the count is 17 message-to-c-local-node -the count the count is 18 message-to-c-local-node ----------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] ----------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] -in resume writing to dflow changes and restarts but ----------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] ----------------- message-to-j [ 0, 4, 8, 10, 14, 16 ] -stays the same - * -Question: HOW IS THIS EXPECTED TO WOR? await $`./a.out ${cargs}`.stdio("pipe","pipe","pipe") bg/fg/pipe/nonePipe? what is the logic, having hard time to comprehend + 7 + 8)old can introduce errors -] J arg does not clearup -running the same bg task */ // //global variables -let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, disable_stdout_redirect, long, lat, Type, tags, file, resume; +let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume; //SETUP CLEANING @@ -51,7 +38,7 @@ process.on('SIGTERM', async () => await cleanup()); //MOVE HOME TO CONST FILE const childs =[] -let mqttPromiseProcesses; +let mqttProcesse; //SET REDIS PATH UP const filePath = fileURLToPath(import.meta.url); const IDIR = path.dirname(filePath); @@ -61,6 +48,7 @@ const SHELLPID = process.pid; //setup +//tested.working const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ["mosquitto","mosquitto_pub", "tmux"].map( async (entry)=> { @@ -82,7 +70,7 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ) ) - +//tested.working function show_usage(){ const usageMessage = ` @@ -137,8 +125,6 @@ function show_usage(){ [--tags=quoted_list_of_tags] [--bg] [--old] - [--iflow=flow_name] - [--oflow=flow_name] [--log] [--verb] [--loc=long,lat] @@ -154,18 +140,30 @@ function show_usage(){ } - +//teste.working beside a lingering bash(due to zx nature) async function startmqtt(port, cFile){ - + console.log("MQTT STARTING") try{ await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); } catch(error){ - if(!NOVERBOSE) + + if(!NOVERBOSE){ console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); - mqttPromiseProcesses = $`${MOSQUITTO} -c ${cFile}`.stdio('ignore', 'pipe', 'pipe').quiet().nothrow(); + } + console.log("MQTTT THIS IS MY PROCVESS") + const command = MOSQUITTO; + const args = ['-c', cFile]; + const options = { + stdio: ['ignore', 'pipe', 'pipe'], + detached: true, + }; + mqttProcesse = spawn(command, args, options); + console.log(mqttProcesse, "this is what spawn returned to me") + mqttProcesse.unref(); + return; } @@ -211,11 +209,12 @@ async function cleanup(){ } else{ await killtmux() - - if(temp_broker === 1){ - console.log(`Killing broker with PID: ${mqttPromiseProcesses}`) - mqttPromiseProcesses.kill("SIGTERM"); - } + + // if(!temp_broker){ + // console.log(`Killing broker with PID: ${mqttProcesse}`) + // console.log(mqttProcesse) + // mqttProcesse.kill(); + // } if(childs.length!=0){ for(let p of childs){ p.kill("SIGTERM") @@ -324,84 +323,64 @@ async function doaout(num,port,group,datap,myf,jappid){ console.log(cargs, "this is my carg pre") await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; + if (!log) + { - - if(!disable_stdout_redirect){ - - if (!log) - { - - if(valgrind) - await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; - - else - await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; + if(valgrind) + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; - } - - else{ - if(Machine === "Linux"){ - //TO BE FIXE - if(valgrind) - await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; - else - await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; - } + else + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; - else{ - //TO BE FIXE + } + + else{ + if(Machine === "Linux"){ + //TO BE FIXE + if(valgrind) + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; + else await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; - } + } + + else{ + //TO BE FIXE + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; + } } } - else{ - //for some reson that I'm strugling to figure out this does not work(TO BE FIXE) - const command = './a.out'; - - const args = cargs.split('-').filter(entry => entry !== " ").map((entry => "-"+entry.trim())); - console.log(args) - console.log(myf) - const options = { - cwd: myf, - stdio: ['ignore', 'ignore', 'ignore'], - detached: true, - }; - const p1 = spawn(command,args,options); - p1.unref() - await sleep(200) - + counter++; - } } - counter++; + if(!NOVERBOSE) console.log("Started a C node") } -} +//tested. working async function portavailable(folder,port) { let pid; let porttaken; if(fs.existsSync(`${folder}/${port}`)){ if(fs.existsSync(`${folder}/${port}/processId`)){ - console.log("process id available(portavailable)"); + try{ - pid = fs.readFileSync(`${folder}/${port}/processId`) + pid = Number(fs.readFileSync(`${folder}/${port}/processId`).toString().trim()) } catch(error){ pid = null; } if(pid === "new"){ - console.log("processId was new(portavailable)"); + porttaken=1; } else if(pid){ - const p = await $`ps -o pid= -p ${pid} | wc -l | tr -d '[:space:]'` - porttaken = p.stdout.toString().trim() - console.log("port taken (portavailable)", porttaken) + + const p = await $`ps -o pid= -p ${pid} | wc -l | tr -d '[:space:]'`.nothrow() + porttaken = Number(p.stdout.toString().trim()) } else{ porttaken=0; @@ -415,26 +394,32 @@ async function portavailable(folder,port) { porttaken=0; } if(porttaken === 0){ - console.log("WE GOT HERE(portavailable)") const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() - porttaken= p.stdout.trim() + porttaken= Number(p.stdout.trim()) } - console.log("returned port taken(portavailable)", porttaken) + return porttaken; } +//tested and working function setuptmux(path, appfolder) { - - //TODO: ABSTRACT THE TMUX SETUP. fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); } -//MAYBE USED LATER + + + + async function killtmux(){ + const [jamfolder,appfolder,folder] = getPaths(file,app) + console.log("current address:", process.cwd()) + console.log("FOLDEr:", folder) + + await $`pkill tmux`.stdio('ignore', 'ignore', 'ignore').quiet().nothrow(); } @@ -514,7 +499,6 @@ async function unpack(file,folder){ if(!old){ - if(!fs.existsSync("./MANIFEST.txt")){ try{ await $`cd ${folder} && unzip -o ${file}`.quiet() @@ -541,6 +525,9 @@ async function unpack(file,folder){ } } } + else{ + isValidExecutable() + } } async function getjdata(folder) { @@ -588,7 +575,6 @@ async function main(){ old, local, valgrind, - disable_stdout_redirect, long, lat, Type, @@ -681,4 +667,5 @@ async function main(){ await main() +// await killtmux() From a26dafba949f1a5b4df3ae0c9ee7570398602589 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 17 Jul 2024 17:09:40 -0400 Subject: [PATCH 024/126] tmux kill fixed --- tools/jamrun.mjs | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index b710b14e1..870a0fef8 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -8,7 +8,7 @@ const { spawn,spawnSync } = require('child_process'); * QUESTION: * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? * NOTES - TOCHANGE: use spawn instead of $ in mosquitto. + TOCHANGE: categtorize the log files. REMOVE THE DISABLE-RE_DERICET(DONE) when old does not exist breaks @@ -30,11 +30,16 @@ const { spawn,spawnSync } = require('child_process'); // //global variables let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume; - +const tmuxIds = []; //SETUP CLEANING -process.on('SIGINT', async () => await cleanup()); -process.on('SIGTERM', async () => await cleanup()); +process.on('SIGINT', async () => + { + await killtmux() + await cleanup() + }); +process.on('SIGTERM', async () => await cleanup()); + //MOVE HOME TO CONST FILE const childs =[] @@ -140,7 +145,7 @@ function show_usage(){ } -//teste.working beside a lingering bash(due to zx nature) +//teste.working. async function startmqtt(port, cFile){ console.log("MQTT STARTING") @@ -157,7 +162,7 @@ async function startmqtt(port, cFile){ const command = MOSQUITTO; const args = ['-c', cFile]; const options = { - stdio: ['ignore', 'pipe', 'pipe'], + stdio: ['ignore', 'ignore', 'ignore'], detached: true, }; mqttProcesse = spawn(command, args, options); @@ -204,17 +209,11 @@ async function dojamout_p2(iport, folder, jappid, group=null){ } async function cleanup(){ + console.log("CLEANING") if(bg){ process.exit(0); } else{ - await killtmux() - - // if(!temp_broker){ - // console.log(`Killing broker with PID: ${mqttProcesse}`) - // console.log(mqttProcesse) - // mqttProcesse.kill(); - // } if(childs.length!=0){ for(let p of childs){ p.kill("SIGTERM") @@ -251,9 +250,11 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ console.log("############## RESUME ##############") } - spawnSync(command, args, options); - console.log("gettinf to the cleanUp") - await cleanup() + // spawnSync(command, args, options); + const child = spawn(command, args, options); + child.on('exit', () => { + process.exit(1); + }); } function dojamout_p2_bg(pnum, floc, jappid, group=null){ @@ -349,6 +350,7 @@ async function doaout(num,port,group,datap,myf,jappid){ } } } + tmuxIds.push(`${tmux}-${counter}`) counter++; } @@ -415,12 +417,10 @@ function setuptmux(path, appfolder) { async function killtmux(){ - const [jamfolder,appfolder,folder] = getPaths(file,app) - console.log("current address:", process.cwd()) - console.log("FOLDEr:", folder) - - - await $`pkill tmux`.stdio('ignore', 'ignore', 'ignore').quiet().nothrow(); + for(let id of tmuxIds){ + console.log(id) + spawnSync(TMUX, ['kill-session', '-t', id]); + } } @@ -668,4 +668,4 @@ async function main(){ await main() // await killtmux() - +// sleep(1000) From 4800b169d6f16df52af8a8b64a3d9b760308b6c2 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 18 Jul 2024 17:50:56 -0400 Subject: [PATCH 025/126] checkpoint broken group --- tools/jamrun.mjs | 231 +++++++++++++++++++++++++---------------------- 1 file changed, 122 insertions(+), 109 deletions(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 870a0fef8..d14b55346 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,54 +1,50 @@ #!/usr/bin/env zx import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder} from './fileDirectory.mjs' +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); /*** * QUESTION: * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? + * 2----> logging system needs improvement + * 3----> same name can't connect to reddis(two instances of shahin12 running as device is going to be problamatic) + * 4----> temp broker to remove broker + * 5---->.jamruns/ports/port# : ls ->>>apps using port number + * 6---->keep track of num of workers + * 7---->log directory + * 8---> don't like the idea of using other mqtt servers, what if the one that started them closes them?''''''''''''''av + * 9 ---> what if another reddis is already using? + * + * * NOTES TOCHANGE: categtorize the log files. - REMOVE THE DISABLE-RE_DERICET(DONE) - when old does not exist breaks remove portDir on kill. - remove only the tmux you need to remove - mosquitto duplicate fix(done) - - 7 - 8)old can introduce errors - - */ // //global variables let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume; const tmuxIds = []; +let removablePort; //SETUP CLEANING -process.on('SIGINT', async () => - { - await killtmux() - await cleanup() - }); +process.on('SIGINT', async () => {await cleanup()}); process.on('SIGTERM', async () => await cleanup()); //MOVE HOME TO CONST FILE -const childs =[] let mqttProcesse; //SET REDIS PATH UP const filePath = fileURLToPath(import.meta.url); const IDIR = path.dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); -console.log(REDISFUNCS) const SHELLPID = process.pid; @@ -141,15 +137,14 @@ function show_usage(){ The jamrun command creates a run state in the $HOME/.jamruns folder. `; - console.log(usageMessage); + // console.log(usageMessage); } //teste.working. async function startmqtt(port, cFile){ - console.log("MQTT STARTING") - try{ + try{ await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); } @@ -158,7 +153,6 @@ async function startmqtt(port, cFile){ if(!NOVERBOSE){ console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); } - console.log("MQTTT THIS IS MY PROCVESS") const command = MOSQUITTO; const args = ['-c', cFile]; const options = { @@ -166,7 +160,6 @@ async function startmqtt(port, cFile){ detached: true, }; mqttProcesse = spawn(command, args, options); - console.log(mqttProcesse, "this is what spawn returned to me") mqttProcesse.unref(); @@ -176,19 +169,18 @@ async function startmqtt(port, cFile){ async function dojamout(iport, folder,jappid) { await dojamout_p1 (iport ,folder) - console.log("P1 is over") + await dojamout_p2 (iport ,folder, jappid) - console.log("P2 is over") + } +//tested.working async function dojamout_p1(pnum ,floc) { await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - - fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); @@ -198,33 +190,42 @@ async function dojamout_p1(pnum ,floc) { async function dojamout_p2(iport, folder, jappid, group=null){ if(!bg){ - console.log("running on fg") await dojamout_p2_fg(iport, folder,jappid, group) } else { - console.log("running on bg") dojamout_p2_bg(iport, folder,jappid, group) } } +//tested.working async function cleanup(){ - console.log("CLEANING") + if(bg){ process.exit(0); } else{ - if(childs.length!=0){ - for(let p of childs){ - p.kill("SIGTERM") + if(fs.existsSync(`${removablePort}`)){ + try { + // console.log("removing") + await fs.rm(`${removablePort}`, { recursive: true, force: true }) + // console.log("removedz") + + + } catch (error) { + console.log(error) } } - process.exit(0) + + await killtmux(); + process.exit(0); } } +//tested, working async function dojamout_p2_fg(pnum, floc,jappid, group=null){ + let argObject = { "--app":jappid, "--port":pnum, @@ -239,7 +240,7 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ } let jargs = getJargs(argObject) - + console.log("this is my jarg", jargs) const command = 'node'; const args = ['jstart.js', ...jargs]; const options = { @@ -250,15 +251,15 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ console.log("############## RESUME ##############") } - // spawnSync(command, args, options); const child = spawn(command, args, options); child.on('exit', () => { process.exit(1); }); } + function dojamout_p2_bg(pnum, floc, jappid, group=null){ - console.log("THE EXECUTION IS ON THE BG") + // console.log("THE EXECUTION IS ON THE BG") let argObject = { "--app":jappid, "--port":pnum, @@ -273,7 +274,7 @@ function dojamout_p2_bg(pnum, floc, jappid, group=null){ } let jargs = getJargs(argObject) - console.log(floc) + // console.log(floc) const logFile = fs.openSync(`${floc}/log.j`, 'a'); if(resume){ fs.writeFileSync(`${floc}/log.j`,"############## RESUME ##############") @@ -290,16 +291,12 @@ function dojamout_p2_bg(pnum, floc, jappid, group=null){ const p = spawn(command, args, options); p.unref(); - childs.push(p); - - - if(!NOVERBOSE){ console.log("Started the J node in background") } process.exit(0) } - +//linux test left, rest working async function doaout(num,port,group,datap,myf,jappid){ let counter=1 @@ -317,15 +314,13 @@ async function doaout(num,port,group,datap,myf,jappid){ "-n": counter, "-g": group, "-t": tags, - "-o": datap - + "-o": datap, } let cargs = getCargs(argObject) - - console.log(cargs, "this is my carg pre") + // console.log("THIS IS MY CARGS",cargs) await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; - if (!log) - { + // console.log("this is my log", log) + if (!log){ if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; @@ -336,18 +331,13 @@ async function doaout(num,port,group,datap,myf,jappid){ } else{ - if(Machine === "Linux"){ - //TO BE FIXE + + //check if it works on linux or nor if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else - await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; - } - - else{ - //TO BE FIXE - await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} -f log C-m`; - } + await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 log ./a.out" ${cargs} C-m`; + } } tmuxIds.push(`${tmux}-${counter}`) @@ -356,7 +346,7 @@ async function doaout(num,port,group,datap,myf,jappid){ } if(!NOVERBOSE) - console.log("Started a C node") + console.log("Started a C node") } @@ -415,32 +405,37 @@ function setuptmux(path, appfolder) { - +//tested.works async function killtmux(){ for(let id of tmuxIds){ - console.log(id) + // console.log(id) spawnSync(TMUX, ['kill-session', '-t', id]); } } - -function startredis(port) { - - - - $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').quiet().nothrow() - - +//patially tested, hopefullt works +async function startredis(port) { + // console.log("this is my port in Start redis:", port); + try{ + // console.log(process.cwd()) + const p =$`redis-server --port ${port}`.stdio('inherit', 'inherit', 'inherit') + // console.log("terminated") + } + catch(error){ + console.log(error) + } } +//tested, works async function waitforredis(port){ while (true) { - console.log("this is the port we have", port) + // console.log("this is the port we have in waitforredis", port) try{ const p = await $`redis-cli -p ${port} -c PING` - console.log(p.stdout) + // console.log("stdout for waitForRedis") + // console.log(p.stdout) if (p.stdout.trim() === "PONG") { @@ -448,6 +443,8 @@ async function waitforredis(port){ } } catch(error){ + // console.log("Ponging reddis error") + console.log(error) } if (!NOVERBOSE) { console.log("Trying to find Redis server..."); @@ -459,13 +456,12 @@ async function waitforredis(port){ console.log(`Redis running at port: ${port}`); } - } +//tested, works async function setupredis(port) { - await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` @@ -475,29 +471,25 @@ async function setupredis(port) { } +//tested, works async function resolvedata(Name) { const [host, port] = Name.split(':'); - startredis(Number(port)); + // console.log(port) + // console.log(host) + await startredis(Number(port)); await waitforredis(port); await setupredis(port); - - - if(host === "docker"){ - const ipaddr= `hostname -I` - Name = `${ipaddr}:${port}` - } - //trim space left behind by hostname -I data = Name.split(/\s+/).join(''); + // console.log("THIS IS MY DATA INRESOLVE DATA" , data) } - +//tested working async function unpack(file,folder){ - - + // console.log("got to unpack") if(!old){ if(!fs.existsSync("./MANIFEST.txt")){ try{ @@ -509,44 +501,68 @@ async function unpack(file,folder){ } else{ - const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; - const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; - const ntime = p1.stdout.trim(); - const ontime = p2.stdout.trim(); - if(ntime > ontime){ - try{ - await $`cd ${folder} && unzip -oq ${file}`.quiet() + let forceRedo = false; + try{ + isValidExecutable() + } + catch(error){ + forceRedo = true; + } + // console.log("this is my forced red0 var", forceRedo) + if(!forceRedo){ + const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; + const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; + const ntime = Number(p1.stdout.toString().trim()); + const ontime = Number(p2.stdout.toString().trim()); + if(ntime > ontime){ + try{ + await $`cd ${folder} && unzip -oq ${file}`.quiet() + } + catch(error){ + + throw new Error(`Problem reading file: ${file}\n${error}`) + + } } - catch(error){ + } + else{ + if(!NOVERBOSE) + console.log("The corrupted unziped files. files will be unziped again based on the existing MANIFEST.txt") + await cleanExecutables() + await $`cd ${folder} && unzip -oq ${file}`.quiet() - throw new Error(`Problem reading file: ${file}\n${error}`) - } } + + + + } } else{ + if(!NOVERBOSE){ + console.log("WARNING: Unziped files might be outdated") + } isValidExecutable() } } - +//tested.working async function getjdata(folder) { const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() return p.stdout.trim() + } async function runNoneDevice(iport){ const [jamfolder,appfolder,folder] = getPaths(file,app) fileDirectoryMqtt(folder,iport) const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) - console.log("doing dojamout") await dojamout(iport, folder, jappid) } async function runDevice(iport,dport,group){ const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport) const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) await dojamout_p1(iport,folder) @@ -599,7 +615,7 @@ async function main(){ fileDirectorySetUp(file,app) const folder = getFolder(file,app) - console.log(num) + // console.log(num) const ifile = path.resolve(file); process.chdir(folder); await unpack(ifile, folder) @@ -608,41 +624,42 @@ async function main(){ let isDevice; switch(Type){ case "cloud": - console.log("got in cloud") iport=9883 isDevice = false; break; case "fog": - console.log("got in fog") iport=5883 isDevice = false break; case "device": - console.log("got in device") iport=1883; isDevice = true; + console.log("IS LOCAL", local) if(!local){ group= iport-1882 } else group = 0; } - console.log(isDevice, ": if true it is a device") + // console.log("this Is my group:" , group) + while(true){ - console.log("this is my iport from main: " , iport) - console.log("this is my folder from main: ", folder) + const porttaken = Number(await portavailable(folder ,iport)) - console.log("porttaken from the main", porttaken) + if(porttaken !== 1){ break; } iport++; } + removablePort = iport; + if(jdata){ dport=iport + 20000; + // console.log(dport) await resolvedata(`127.0.0.1:${dport}`) } @@ -650,16 +667,13 @@ async function main(){ if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } - console.log("this is my port", iport) if(isDevice) { - console.log("is here running device") await runDevice(iport,dport,group) } else { - console.log("is here running noneDevice") await runNoneDevice(iport) } @@ -667,5 +681,4 @@ async function main(){ await main() -// await killtmux() -// sleep(1000) + From 9603b8d22dd7285d80e7f0bdcd269e233521edfa Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 19 Jul 2024 16:33:58 -0400 Subject: [PATCH 026/126] Pre fixing mosquitto --- tools/fileDirectory.mjs | 26 +++++++++- tools/jamkill.mjs | 4 +- tools/jamlist.mjs | 16 +++---- tools/jamrun | 1 + tools/jamrun.mjs | 102 ++++++++++++++++++++++------------------ 5 files changed, 92 insertions(+), 57 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index c8282aeaa..aaa7307ee 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -7,6 +7,9 @@ export function fileDirectorySetUp(file,app){ if(!fs.existsSync(jamfolder,{ recursive: true })){ fs.mkdirSync(jamfolder) } + if(!fs.existsSync(`${jamfolder}/ports`,{ recursive: true })){ + fs.mkdirSync(`${jamfolder}/ports`) + } const appfolder=`${jamfolder}/apps`; if(!fs.existsSync(appfolder,{ recursive: true })){ fs.mkdirSync(appfolder) @@ -16,6 +19,7 @@ export function fileDirectorySetUp(file,app){ if(!fs.existsSync(folder,{ recursive: true })){ fs.mkdirSync(folder) } + fs.writeFileSync(`${appfolder}/program`, `${filenoext}\n`) fs.writeFileSync(`${appfolder}/app`, `${app}\n`) return [jamfolder,appfolder,folder,filenoext ] @@ -101,10 +105,30 @@ export function isValidExecutable(){ } -export function fileDirectoryMqtt(folder, iport){ +export async function cleanExecutables(){ + if(fs.existsSync(`jstart.js`)) + await fs.unlink("jstart.js") + + if(fs.existsSync(`jamout.js`)) + await fs.unlink("jamout.js") + + if(fs.existsSync(`a.out`)) + await fs.unlink("a.out") + + +} + +export function fileDirectoryMqtt(folder, iport,jamfolder,app){ fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + if(fs.existsSync(`${jamfolder}/ports/${iport}`)){ + fs.appendFileSync(`${jamfolder}/ports/${iport}`, `${app}\n`) + } + else{ + fs.writeFileSync(`${jamfolder}/ports/${iport}`, `${app}\n`) + } + } \ No newline at end of file diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 3268a85e3..f686d2729 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -4,12 +4,12 @@ import {getKilltArgs} from "./parser.mjs" /* * 1)shouldn't kill last kill the last running job in the packground instead of the last job itself? - 2) we kill based on app name but not the program name for some reason(ex. jt2,jt3 with appname shahin will both be killed and no way to seperate them apart from each others) + 2) we kill based on app name but not the program name for some reason(ex. jt2,jt3 with appname shahin will both be killed and no way to seperate them apart from each others)(we can use the pattern) 3)discuss the new kill app appriach 4)what id the app is not found? 5)what if you run jamKill with no args back to back? 6)what is app_id exactly? - 7)app and appId concept is mixed up in my head I don't think it is what it should be + 7)app and appId concept is mixed up in my head I don't think it is what it should be() 8) how does the default name works? */ diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 79c95da1b..8307f5a3b 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -64,17 +64,15 @@ async function printNodeInfo(dirName, programName){ } let cdevs = 0; - if(mType == "device"){ + if(mType === "device"){ - let cdevProcesses = (await fs.readdir(path)).filter(entry => entry.includes("cdevProcessId")); - for(let cdevProcess of cdevProcesses){ - let pid = fs.readFileSync(`${path}/${cdevProcess}`).toString().trim(); - const process = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'`.nothrow() - const isOk = process.stdout.trim() - if(isOk){ - cdevs++ - } + if(fs.existsSync(`${path}/numCnodes`)){ + cdevs= fs.readFileSync(`${path}/numCnodes`).toString().trim() } + else{ + cdevs = "-" + } + const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; console.log(headerString) diff --git a/tools/jamrun b/tools/jamrun index 555f98f38..921860454 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -178,6 +178,7 @@ dojamout_p2_fg() { buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" "--localregistryhost=$localregistryhost" local args=$results echo $args + echo $args case $type in cloud) node jstart.js $args diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index d14b55346..6b1b30c3b 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -6,17 +6,15 @@ const { spawn,spawnSync } = require('child_process'); /*** * QUESTION: - * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? - * 2----> logging system needs improvement + * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? (don't use others mqtt) + * 2----> logging system needs improvementm * 3----> same name can't connect to reddis(two instances of shahin12 running as device is going to be problamatic) - * 4----> temp broker to remove broker * 5---->.jamruns/ports/port# : ls ->>>apps using port number * 6---->keep track of num of workers * 7---->log directory * 8---> don't like the idea of using other mqtt servers, what if the one that started them closes them?''''''''''''''av - * 9 ---> what if another reddis is already using? - * * + * DONOT FORGET TO: discuss about the temp broker topic. with the new ports dir we don't necessarily need the temp_broker no more cuz that would not make the decison of when to remove and when not to. * NOTES TOCHANGE: categtorize the log files. @@ -36,7 +34,7 @@ let removablePort; //SETUP CLEANING process.on('SIGINT', async () => {await cleanup()}); -process.on('SIGTERM', async () => await cleanup()); +process.on('SIGTERM', async () => {await cleanup()}); //MOVE HOME TO CONST FILE @@ -185,6 +183,9 @@ async function dojamout_p1(pnum ,floc) { fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); + if(Type === "device"){ + fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); + } } @@ -200,26 +201,29 @@ async function dojamout_p2(iport, folder, jappid, group=null){ //tested.working async function cleanup(){ + if(removablePort){ + console.log("remove mqtt if you can") + const [jamfolder,appfolder,folder] = getPaths(file,app) + const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n") + console.log(appNames) + if(appNames.length === 1 && appNames[0] === app){ + mqttProcesse.kill(); + } - if(bg){ - process.exit(0); } - else{ - if(fs.existsSync(`${removablePort}`)){ - try { - // console.log("removing") - await fs.rm(`${removablePort}`, { recursive: true, force: true }) - // console.log("removedz") - - } catch (error) { - console.log(error) - } + if(fs.existsSync(`${removablePort}`)){ + try { + console.log("removing") + await fs.rm(`${removablePort}`, { recursive: true, force: true }) + console.log("removedz") + } catch (error) { + console.log(error) } - - await killtmux(); - process.exit(0); } + + await killtmux(); + process.exit(0); } @@ -388,6 +392,7 @@ async function portavailable(folder,port) { if(porttaken === 0){ const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() porttaken= Number(p.stdout.trim()) + console.log("this is my port taken:", porttaken) } return porttaken; @@ -408,7 +413,7 @@ function setuptmux(path, appfolder) { //tested.works async function killtmux(){ for(let id of tmuxIds){ - // console.log(id) + console.log(id) spawnSync(TMUX, ['kill-session', '-t', id]); } } @@ -418,7 +423,7 @@ async function startredis(port) { // console.log("this is my port in Start redis:", port); try{ // console.log(process.cwd()) - const p =$`redis-server --port ${port}`.stdio('inherit', 'inherit', 'inherit') + const p =$`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); // console.log("terminated") } catch(error){ @@ -474,8 +479,7 @@ async function setupredis(port) { //tested, works async function resolvedata(Name) { const [host, port] = Name.split(':'); - // console.log(port) - // console.log(host) + await startredis(Number(port)); await waitforredis(port); @@ -556,14 +560,14 @@ async function getjdata(folder) { async function runNoneDevice(iport){ const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport) + fileDirectoryMqtt(folder,iport,jamfolder,app) const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) await dojamout(iport, folder, jappid) } async function runDevice(iport,dport,group){ const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport) + fileDirectoryMqtt(folder,iport,jamfolder,app) const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) await dojamout_p1(iport,folder) setuptmux(`${folder}/${iport}`, appfolder) @@ -626,40 +630,51 @@ async function main(){ case "cloud": iport=9883 isDevice = false; + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; + } + removablePort = iport; break; case "fog": iport=5883 isDevice = false + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; + } + removablePort = iport; break; case "device": - iport=1883; isDevice = true; - console.log("IS LOCAL", local) + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; + } + removablePort = iport; if(!local){ group= iport-1882 } else group = 0; } - // console.log("this Is my group:" , group) - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - - if(porttaken !== 1){ - break; - } - iport++; - } - removablePort = iport; if(jdata){ dport=iport + 20000; - // console.log(dport) await resolvedata(`127.0.0.1:${dport}`) } @@ -668,14 +683,11 @@ async function main(){ fs.mkdirSync(`${folder}/${iport}`) } if(isDevice) - { await runDevice(iport,dport,group) - } else - { - await runNoneDevice(iport) - } + await runNoneDevice(iport) + } From 78cdb95eaeb123f3ec1b7be203e1d9c2eb6f57e9 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 22 Jul 2024 00:51:36 -0400 Subject: [PATCH 027/126] jamKill refactor --- tools/cleanUp.mjs | 169 ++++++++++++++++++++++++++++++++ tools/fileDirectory.mjs | 11 ++- tools/jamkill.mjs | 212 ++++++++++++++++++++++++++++++++++++---- tools/jamrun | 3 +- tools/jamrun.mjs | 93 ++++++------------ tools/parser.mjs | 7 +- 6 files changed, 407 insertions(+), 88 deletions(-) create mode 100644 tools/cleanUp.mjs diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs new file mode 100644 index 000000000..0f5dfe2fd --- /dev/null +++ b/tools/cleanUp.mjs @@ -0,0 +1,169 @@ +#!/usr/bin/env zx +import {getJamFolder, getPaths} from './fileDirectory.mjs' +const { spawnSync } = require('child_process'); +const p = spawnSync('which', ['tmux']); +const TMUX = p.stdout.toString().trim() + +function getTmuxIds(PortNumber,appName , programName){ + // console.log(process.cwd()) + const [jamfolder,appfolder,folder] = getPaths(programName,appName); + console.log(`${folder}/${PortNumber}/tmuxid`) + console.log() + if(fs.existsSync(`${folder}/${PortNumber}/tmuxid`)){ + + const tmuxID = fs.readFileSync(`${folder}/${PortNumber}/tmuxid`).toString().trim(); + console.log(tmuxID, "this is my tmux id") + const p = spawnSync(TMUX, ['ls', '-F', '#S']); + const runningTMUXS = p.stdout.toString().trim().split("\n"); + console.log(runningTMUXS, "this is my alllllll tmux running") + const currTmuxids = runningTMUXS.filter((entry) => entry.includes(tmuxID)); + console.log(currTmuxids, "this is my curr tmux running") + return currTmuxids; + + } + +} +function killtmux(PortNumber,appName , programName){ + const tmuxIds = getTmuxIds(PortNumber,appName , programName) + console.log(tmuxIds) + for(let id of tmuxIds){ + spawnSync(TMUX, ['kill-session', '-t', id]); + } + return tmuxIds +} + +function stalePort(removablePort,app,programName){ + const jamfolder = getJamFolder() + if(!removablePort){ + return false; + }; + if(!fs.existsSync(`${jamfolder}/ports/${removablePort}`)){ + return false; + } + + const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n"); + if(appNames.includes(programName)){ + if(appNames.length === 1){ + fs.rmSync(`${jamfolder}/ports/${removablePort}`, { recursive: true, force: true }); + return true; + + } + else{ + const newAppNames = appNames.filter((appName) => appName !== programName) + console.log( newAppNames.join("\n")) + fs.writeFileSync(`${jamfolder}/ports/${removablePort}`, newAppNames.join("\n")) + return false; + } + } + else{ + console.log("PORT DIR IS CORRUPTED") + return false; + } +} + +function killMosquitto(removablePort){ + + const result = spawnSync('lsof', ['-i', `tcp:${Number(removablePort)}`, '-sTCP:LISTEN', '-t']); + if(result.error){ + return + } + const pid = result.stdout.toString().trim(); + spawnSync('kill', ['-9' ,pid]); + +} + +function killRedis(removablePort){ + const dport = Number(removablePort)+2000 + spawnSync('redis-cli', ['-p', dport, 'shutdown']); +} + +function cleanPort(removablePort,app,programName){ + const isPortStale = stalePort(removablePort,app,programName); + if(isPortStale){ + killMosquitto(removablePort); + killRedis(removablePort); + return true + } + return false + + +} +function ArchiveLog(removablePort, appName, programName){ + const [jamfolder,appfolder,folder] = getPaths(programName,appName) + console.log(folder) + if(fs.existsSync(`${folder}/${removablePort}`)){ + process.chdir(`${folder}/${removablePort}`); + const logs = fs.readdirSync('.').filter( (entry) => entry.includes("log")) + fs.writeFileSync(`${folder}/log`, "logs\n-------------\n" ) + for(const log of logs){ + if(log.includes("j")){ + console.log("THIS NEEDS TO BE TESTE IN THE BG MODE") + data = fs.readFileSync(log) + fs.appendFileSync(`${folder}/log`, `J Log:\n-------------\n`); + fs.appendFileSync(`${folder}/log`, data); + } + else{ + console.log("WRITING WORKER LOG") + const workerNumber = log.split(".")[1]; + data = fs.readFileSync(log) + fs.appendFileSync(`${folder}/log`, `woker number ${workerNumber} Log:\n-------------\n`); + fs.appendFileSync(`${folder}/log`, data); + + } + } + + } + +} +function cleanAppDir(removablePort,appName, programName){ + const [jamfolder,appfolder,folder] = getPaths(programName,appName) + console.log(folder, "this is my folder") + if(fs.existsSync(`${folder}/${removablePort}`)){ + try { + console.log("removing") + console.log(removablePort) + fs.rmSync(`${folder}/${removablePort}`, { recursive: true, force: true }); + console.log("removedz") + } catch (error) { + console.log(error) + } + return true; + } + return false; +} + +export function cleanup(removablePort, tmuxIds,app,TMUX){ + cleanPort(removablePort,app); + ArchiveLog(removablePort); + console.log("LOGS ARE ARCHIVED"); + cleanAppDir(removablePort); + console.log("STOPPED PORT IS REMOVED GROM APP DIR"); + killtmux(tmuxIds,TMUX); + console.log("STOPPED TMUX"); +} + +export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE){ + if(!programName || !appName || !PortNumber){ + if(!NOVERBOSE) + console.log("NO NEED FOR CLEANING") + return; + } + + console.log("LOGS ARE ARCHIVED"); + const tmuxIds = killtmux(PortNumber,appName ,programName); + if(!NOVERBOSE && tmuxIds.length !== 0 ) + console.log("Killed :", tmuxIds) + + const isPortCleaned = cleanPort(PortNumber,appName,programName); + if(!NOVERBOSE && isPortCleaned ){ + console.log("Redis and mosquitto on port ",PortNumber, "are removed" ) + } + ArchiveLog(PortNumber, appName, programName); + if(!NOVERBOSE ){ + console.log("All logs are archived for", `${programName.split(".")[0]}_${appName} on port:${PortNumber}` ) + } + const isDirCleaned = cleanAppDir(PortNumber, appName, programName); + if(!NOVERBOSE && isDirCleaned ){ + console.log(`port ${PortNumber} is cleaned for ${programName.split(".")[0]}_${appName}`) + } +}; diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index aaa7307ee..69688f342 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -33,7 +33,7 @@ export function getAppFolder(){ return `${HOME}/.jamruns/apps` } -export function getPaths(file=null,app=null){ +export function getPaths(file,app){ const jamfolder=`${HOME}/.jamruns` const appfolder=`${jamfolder}/apps`; @@ -123,11 +123,16 @@ export function fileDirectoryMqtt(folder, iport,jamfolder,app){ fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); + const dirName = folder.split("/").pop() if(fs.existsSync(`${jamfolder}/ports/${iport}`)){ - fs.appendFileSync(`${jamfolder}/ports/${iport}`, `${app}\n`) + const dirNames = fs.readFileSync(`${jamfolder}/ports/${iport}`).toString().trim().split("\n") + if(!dirNames.includes(dirName)){ + fs.appendFileSync(`${jamfolder}/ports/${iport}`, `${dirName}\n`) + } + } else{ - fs.writeFileSync(`${jamfolder}/ports/${iport}`, `${app}\n`) + fs.writeFileSync(`${jamfolder}/ports/${iport}`, `${dirName}\n`) } diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index f686d2729..10dc60093 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -14,29 +14,203 @@ import {getKilltArgs} from "./parser.mjs" */ -async function killtmux(tmuxid){ - try{ - console.log("curr address", process.cwd()) - console.log(`${tmuxid}`) - const p = await $`tmux ls | grep ${tmuxid} | cut -d ':' -f 1`; - const tmuxList = p.stdout.toString().trim().split("\n") - for(let tmux of tmuxList){ - console.log("list of tmuxes" , tmuxList) - await $`tmux kill-session -t ${tmux}` +// async function killtmux(tmuxid){ +// try{ +// console.log("curr address", process.cwd()) +// console.log(`${tmuxid}`) +// const p = await $`tmux ls | grep ${tmuxid} | cut -d ':' -f 1`; +// const tmuxList = p.stdout.toString().trim().split("\n") +// for(let tmux of tmuxList){ +// console.log("list of tmuxes" , tmuxList) +// await $`tmux kill-session -t ${tmux}` +// } +// } +// catch(error){ +// } +// } + +function getRunningDirs(){ + const jamFolder = getJamFolder() + const appToPort = new Map() + if(!fs.existsSync(jamFolder)){ + throw new Error("jamFolder is Missing ") + } + if(!fs.existsSync(`${jamFolder}/ports`)){ + console.log("THERE IS NO APP RUNNING") + return [] + } + const activePorts = fs.readdirSync(`${jamFolder}/ports`) + for(let port of activePorts){ + const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } } } - catch(error){ + return appToPort; +} + +function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") + } + else{ + return dir[1]; } + +} +function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] + } +function getAppDirs(){ + const jamFolder = getJamFolder() + const subdirs = ((fs.readdirSync(`${jamFolder}/apps`,{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name); + return subdirs +} + + -async function killprocess(){ - if(fs.existsSync("./shellpid")){ - const pid = fs.readFileSync("./shellpid").toString().trim(); +function killDataByAppName(appName){ + const toClean=[]; + const activeDirs = getRunningDirs(); + for(let dir of activeDirs.keys()){ + const currApp = dirNameToAppName(dir) + if(currApp === appName){ + for(let port of activeDirs.get(dir)){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : currApp, + portNumber : port + } + toClean.push(info) + } + } + } + return toClean +} + +function killDataByProgramName(programName){ + const toClean=[]; + const activeDirs = getRunningDirs(); + for(let dir of activeDirs.keys()){ + const currProgram = dirNameToProgramName(dir) + if(currProgram === programName){ + for(let port of activeDirs.get(dir)){ + const info ={ + programName : currProgram+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + } + return toClean +} + + +function killDataByDirName(dirName){ + const toClean=[]; + const activeDirs = getRunningDirs(); + console.log(activeDirs) + for(let dir of activeDirs.keys()){ + console.log("this is my dir name", dir) + if(dir === dirName){ + for(let port of activeDirs.get(dir)){ + console.log("this is my port name", port) + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + } + return toClean +} + +function killDataForAll(){ + const activeDirs = getRunningDirs(); + for(let dir of Object.keys(activeDirs)){ + for(let port of activeDirs.get(dir)){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + return toClean +} + +function jamKillByAppName(appName){ + const data = killDataByAppName(appName); + if(data.length === 0 ){ + console.log("No app with ",appName," name is running") + } + + +} + + + + + + + +function getDirNameFromApp(appName){ + const dirMap = new Map() + const subdirs = (fs.readdirSync(process.cwd()).map(entry => entry.split("_"))).filter(entry => entry.length > 1) + for(let dir of subdirs){ + if(dir.length > 2){ + const tail =(dir.filter((_,index) => index !== 0)).join("_") + if(tail === appName){ + const dirName = dir.join("_") + dirMap.set(tail, dirName) + } + + + + + dirMap.set(tail, dirName) + + } + else{ + const head = dir[0] + const tail = dir[1]; + const dirName = dir.join("_") + dirMap.set(tail, dirName) + } + } + return dirMap; +} + + + + +async function killprocess(data){ + const appName = data.programName; + const programName = data.programName + const portNumber = data.port + const dirName = ((programName.split('.'))[0]) +"_"+ appName; + const appfolder = getAppFolder() + if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`)){ + const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); let exists; try { const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` - exists = Number(p.stdout.trim()); + exists = Number(p.stdout.toString().trim()); } catch (error) { exists = 0 } @@ -69,8 +243,6 @@ async function killprocess(){ console.log(`Killing process ${pid}`) process.kill(pid); } - - } } async function getJobsSubDirMap(){ @@ -269,6 +441,8 @@ async function main(){ } -(async() => { - await main() -})() \ No newline at end of file +// (async() => { +// await main() +// })() + +// console.log(getAppDirs()) diff --git a/tools/jamrun b/tools/jamrun index 921860454..acbedc037 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -178,7 +178,6 @@ dojamout_p2_fg() { buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" "--localregistryhost=$localregistryhost" local args=$results echo $args - echo $args case $type in cloud) node jstart.js $args @@ -280,6 +279,8 @@ portavailable() { if [ $porttaken -eq 0 ]; then porttaken=`netstat -an -p tcp 2>/dev/null | grep $port | wc -l` + echo "this is my takken port" + echo $porttaken fi } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 6b1b30c3b..74cd350d3 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,7 +1,8 @@ #!/usr/bin/env zx import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables} from './fileDirectory.mjs' +import { cleanByPortNumber } from './cleanUp.mjs'; +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); /*** @@ -13,7 +14,9 @@ const { spawn,spawnSync } = require('child_process'); * 6---->keep track of num of workers * 7---->log directory * 8---> don't like the idea of using other mqtt servers, what if the one that started them closes them?''''''''''''''av - * + * 9 ----> app appid program tmuxid we do not need + * 10 ---> do not use mqtt of another file + * 11 ---> kill reddiss on cleaning * DONOT FORGET TO: discuss about the temp broker topic. with the new ports dir we don't necessarily need the temp_broker no more cuz that would not make the decison of when to remove and when not to. * NOTES TOCHANGE: @@ -28,13 +31,13 @@ const { spawn,spawnSync } = require('child_process'); */ // //global variables -let app, tmux, num, edge, data, local_registry, temp_broker, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume; +let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume; const tmuxIds = []; -let removablePort; +let removablePort //SETUP CLEANING -process.on('SIGINT', async () => {await cleanup()}); -process.on('SIGTERM', async () => {await cleanup()}); +process.on('SIGINT', () => {cleanByPortNumber(file,app,removablePort,NOVERBOSE); process.exit();}); +process.on('SIGTERM', () => {cleanByPortNumber(file,app,removablePort,NOVERBOSE); process.exit();}); //MOVE HOME TO CONST FILE @@ -160,24 +163,18 @@ async function startmqtt(port, cFile){ mqttProcesse = spawn(command, args, options); mqttProcesse.unref(); - return; } } async function dojamout(iport, folder,jappid) { await dojamout_p1 (iport ,folder) - await dojamout_p2 (iport ,folder, jappid) - } //tested.working async function dojamout_p1(pnum ,floc) { - - - await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); @@ -199,34 +196,6 @@ async function dojamout_p2(iport, folder, jappid, group=null){ } } -//tested.working -async function cleanup(){ - if(removablePort){ - console.log("remove mqtt if you can") - const [jamfolder,appfolder,folder] = getPaths(file,app) - const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n") - console.log(appNames) - if(appNames.length === 1 && appNames[0] === app){ - mqttProcesse.kill(); - } - - } - - if(fs.existsSync(`${removablePort}`)){ - try { - console.log("removing") - await fs.rm(`${removablePort}`, { recursive: true, force: true }) - console.log("removedz") - } catch (error) { - console.log(error) - } - } - - await killtmux(); - process.exit(0); - -} - //tested, working async function dojamout_p2_fg(pnum, floc,jappid, group=null){ @@ -278,10 +247,9 @@ function dojamout_p2_bg(pnum, floc, jappid, group=null){ } let jargs = getJargs(argObject) - // console.log(floc) - const logFile = fs.openSync(`${floc}/log.j`, 'a'); + const logFile = fs.openSync(`${floc}/${pnum}/log.j`, 'a'); if(resume){ - fs.writeFileSync(`${floc}/log.j`,"############## RESUME ##############") + fs.writeFileSync(`${floc}/${pnum}/log.j`,"############## RESUME ##############") } const command = 'node'; @@ -300,10 +268,10 @@ function dojamout_p2_bg(pnum, floc, jappid, group=null){ } process.exit(0) } + //linux test left, rest working async function doaout(num,port,group,datap,myf,jappid){ let counter=1 - if (fs.existsSync('a.out')) { await $`cd ${myf} && chmod +x a.out` } @@ -340,7 +308,7 @@ async function doaout(num,port,group,datap,myf,jappid){ if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else - await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 log ./a.out" ${cargs} C-m`; + await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; } } @@ -358,8 +326,9 @@ async function doaout(num,port,group,datap,myf,jappid){ async function portavailable(folder,port) { let pid; let porttaken; - + const jamFolder = getJamFolder() if(fs.existsSync(`${folder}/${port}`)){ + if(fs.existsSync(`${folder}/${port}/processId`)){ try{ @@ -386,38 +355,31 @@ async function portavailable(folder,port) { porttaken=0; } } + else{ porttaken=0; } + if(porttaken === 0){ - const p = await $`netstat -an -p tcp 2>/dev/null | grep ${port} | wc -l`.nothrow().quiet() - porttaken= Number(p.stdout.trim()) - console.log("this is my port taken:", porttaken) + if(!fs.existsSync(`${jamFolder}/ports`)){ + console.log(port) + const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() + console.log((p.stdout.trim())) + porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; + } } - + console.log(porttaken) return porttaken; } //tested and working function setuptmux(path, appfolder) { - fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); } - - - -//tested.works -async function killtmux(){ - for(let id of tmuxIds){ - console.log(id) - spawnSync(TMUX, ['kill-session', '-t', id]); - } -} - //patially tested, hopefullt works async function startredis(port) { // console.log("this is my port in Start redis:", port); @@ -577,10 +539,12 @@ async function runDevice(iport,dport,group){ async function main(){ + console.log("HI") let iport; let dport; let group; try{ + ({ app, tmux, @@ -588,7 +552,6 @@ async function main(){ edge, data, local_registry, - temp_broker, bg, NOVERBOSE, log, @@ -602,7 +565,7 @@ async function main(){ file, resume, } = jamrunParsArg(process.argv)) - + console.log("HO") } @@ -613,9 +576,11 @@ async function main(){ } else{ show_usage() + console.log(error) process.exit(1) } } + fileDirectorySetUp(file,app) const folder = getFolder(file,app) diff --git a/tools/parser.mjs b/tools/parser.mjs index d566ebe47..02195caa4 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -157,10 +157,12 @@ function SetJamrunVar(options){ export function jamrunParsArg(argv){ - + console.log("got here") const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) const file = checkJXEfile(arg) + + let proccessedArgs = arg.filter((_,index) => (index !== 0 )); const options = getJamrunArgs(proccessedArgs); if(!options || options.help){ @@ -169,6 +171,7 @@ export function jamrunParsArg(argv){ throw error; } + for(let optionDefinition of jamrunOptionDefinitions ){ if(options[optionDefinition.name] === null && optionDefinition.type != Boolean){ throw new Error(`--${optionDefinition.name} requires a non-empty option argument`); @@ -177,6 +180,7 @@ export function jamrunParsArg(argv){ } const varsObject = SetJamrunVar(options); varsObject["file"] = file; + return varsObject; } //ASK wHAT VARIABLES ARE OPTIONAL @@ -192,6 +196,7 @@ export function getCargs(argObject){ args=args+` ${key} ${argObject[key]}` } } + return args; } export function getJargs(argObject){ From bbc63b3f84d495a4eb2c7dfda4c47053c2fae9e3 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 23 Jul 2024 03:15:30 -0400 Subject: [PATCH 028/126] jamkill refactored --- tools/cleanUp.mjs | 34 +++-- tools/jamclean.mjs | 170 ++++++++++++--------- tools/jamkill.mjs | 374 ++++++++++++++++----------------------------- tools/parser.mjs | 53 +++++-- 4 files changed, 295 insertions(+), 336 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 0f5dfe2fd..327fca203 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -5,7 +5,6 @@ const p = spawnSync('which', ['tmux']); const TMUX = p.stdout.toString().trim() function getTmuxIds(PortNumber,appName , programName){ - // console.log(process.cwd()) const [jamfolder,appfolder,folder] = getPaths(programName,appName); console.log(`${folder}/${PortNumber}/tmuxid`) console.log() @@ -25,7 +24,9 @@ function getTmuxIds(PortNumber,appName , programName){ } function killtmux(PortNumber,appName , programName){ const tmuxIds = getTmuxIds(PortNumber,appName , programName) - console.log(tmuxIds) + if(!tmuxIds){ + return + } for(let id of tmuxIds){ spawnSync(TMUX, ['kill-session', '-t', id]); } @@ -42,14 +43,16 @@ function stalePort(removablePort,app,programName){ } const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n"); - if(appNames.includes(programName)){ + console.log("this is my program name : ", programName) + const dirName = (programName.split(".")[0])+"_"+app + if(appNames.includes(dirName)){ if(appNames.length === 1){ fs.rmSync(`${jamfolder}/ports/${removablePort}`, { recursive: true, force: true }); return true; } else{ - const newAppNames = appNames.filter((appName) => appName !== programName) + const newAppNames = appNames.filter((appName) => appName !== dirName) console.log( newAppNames.join("\n")) fs.writeFileSync(`${jamfolder}/ports/${removablePort}`, newAppNames.join("\n")) return false; @@ -73,8 +76,9 @@ function killMosquitto(removablePort){ } function killRedis(removablePort){ - const dport = Number(removablePort)+2000 + const dport = Number(removablePort)+20000 spawnSync('redis-cli', ['-p', dport, 'shutdown']); + console.log("REDIS CLEANED") } function cleanPort(removablePort,app,programName){ @@ -90,30 +94,36 @@ function cleanPort(removablePort,app,programName){ } function ArchiveLog(removablePort, appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) + console.log("CLEAN UP, PORT NUMBER:" , removablePort); + console.log("CLEAN UP, app number" , appName); + console.log("CLEAN UP, program NUMBER:" , programName); + + console.log(folder) if(fs.existsSync(`${folder}/${removablePort}`)){ process.chdir(`${folder}/${removablePort}`); const logs = fs.readdirSync('.').filter( (entry) => entry.includes("log")) fs.writeFileSync(`${folder}/log`, "logs\n-------------\n" ) + console.log(logs) for(const log of logs){ if(log.includes("j")){ console.log("THIS NEEDS TO BE TESTE IN THE BG MODE") - data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log`, `J Log:\n-------------\n`); + const data = fs.readFileSync(log) + fs.appendFileSync(`${folder}/log`, `:\n-------------\n J Log:\n-------------\n`); fs.appendFileSync(`${folder}/log`, data); } else{ console.log("WRITING WORKER LOG") const workerNumber = log.split(".")[1]; - data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log`, `woker number ${workerNumber} Log:\n-------------\n`); + const data = fs.readFileSync(log) + fs.appendFileSync(`${folder}/log`, `\n-------------\n woker number ${workerNumber} Log:\n-------------\n`); fs.appendFileSync(`${folder}/log`, data); } } } - + process.chdir(`..`); } function cleanAppDir(removablePort,appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) @@ -142,7 +152,7 @@ export function cleanup(removablePort, tmuxIds,app,TMUX){ console.log("STOPPED TMUX"); } -export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE){ +export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ if(!programName || !appName || !PortNumber){ if(!NOVERBOSE) console.log("NO NEED FOR CLEANING") @@ -151,7 +161,7 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE){ console.log("LOGS ARE ARCHIVED"); const tmuxIds = killtmux(PortNumber,appName ,programName); - if(!NOVERBOSE && tmuxIds.length !== 0 ) + if(!NOVERBOSE && tmuxIds) console.log("Killed :", tmuxIds) const isPortCleaned = cleanPort(PortNumber,appName,programName); diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index e33cc2d9d..c72d0297f 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -4,93 +4,111 @@ import { getJamFolder } from "./fileDirectory.mjs"; -async function getJobsSubDirMap(){ - const subDirMap = new Map() - const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) - for(let dir of subdirs){ - if(dir.length > 2){ +// async function getJobsSubDirMap(){ +// const subDirMap = new Map() +// const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) +// for(let dir of subdirs){ +// if(dir.length > 2){ - const head = dir[0] - const tail =(dir.filter((_,index) => index !== 0)).join("_") - const dirName = dir.join("_") +// const head = dir[0] +// const tail =(dir.filter((_,index) => index !== 0)).join("_") +// const dirName = dir.join("_") - subDirMap.set(tail, dirName) +// subDirMap.set(tail, dirName) - } - else{ - const head = dir[0] - const tail = dir[1]; - const dirName = dir.join("_") - subDirMap.set(tail, dirName) - } - } - return subDirMap; -} -async function getPortSubDir(){ - const ports = (((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name)) - if(ports.length !== 0){ - return ports - } -} +// } +// else{ +// const head = dir[0] +// const tail = dir[1]; +// const dirName = dir.join("_") +// subDirMap.set(tail, dirName) +// } +// } +// return subDirMap; +// } +// async function getPortSubDir(){ +// const ports = (((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name)) +// if(ports.length !== 0){ +// return ports +// } +// } -export async function cleanUp(){ - try{ - getcleanArgs(process.argv) +// export async function cleanUp(){ +// try{ +// getcleanArgs(process.argv) - } - catch(error){ - if(error.type === "ShowUsage"){ - console.log( - ` +// } +// catch(error){ +// if(error.type === "ShowUsage"){ +// console.log( +// ` - Usage: jamclean - Purges inactive JAMScript programs from the listing. +// Usage: jamclean +// Purges inactive JAMScript programs from the listing. - ` - ) - } - process.exit(1); +// ` +// ) +// } +// process.exit(1); +// } +// const jamfolder = getJamFolder(); +// if(!fs.existsSync(jamfolder)){ +// process.exit(0) +// } +// process.chdir(`${jamfolder}/apps`); +// const appsMap = await getJobsSubDirMap(); +// for(let app of appsMap.keys()){ + +// process.chdir(`${appsMap.get(app)}`); +// console.log(process.cwd(), "this is my app dir") +// const ports = await getPortSubDir(); +// console.log(process.cwd(), "this is my portDir dir") +// if(ports){ +// console.log(process.cwd(), "this is my portDir dir") +// for(let port of ports){ +// console.log(process.cwd(), "this is my portDir dir") +// let isRunning +// console.log(port, "this is my port") +// console.log(process.cwd(), "this is my portDir dir") +// process.chdir(`${port}`); +// const toCheck = (fs.existsSync("processId")) ? fs.readFileSync("processId") : fs.readFileSync("shellpid") +// try{ +// const p = await $`ps -p ${toCheck} | grep node | wc -l | tr -d '[:space:]'` +// isRunning = true +// } +// catch(error){ +// isRunning = false; +// } +// process.chdir("..") +// if(!isRunning){ +// await $`rm -rf ./${port}` +// } +// } +// } +// process.chdir("..") +// } +// } + + +function hardReset(){ + const jamFolder = getJamFolder() + fs.rmSync(`${jamFolder}/apps`, { recursive: true, force: true }); + fs.rmSync(`${jamFolder}/ports`, { recursive: true, force: true }); +}3 + +function main(){ + let arg; + try{ + arg = getcleanArgs(process.argv) } - const jamfolder = getJamFolder(); - if(!fs.existsSync(jamfolder)){ - process.exit(0) + catch(error){ + throw error } - process.chdir(`${jamfolder}/apps`); - const appsMap = await getJobsSubDirMap(); - for(let app of appsMap.keys()){ - - process.chdir(`${appsMap.get(app)}`); - console.log(process.cwd(), "this is my app dir") - const ports = await getPortSubDir(); - console.log(process.cwd(), "this is my portDir dir") - if(ports){ - console.log(process.cwd(), "this is my portDir dir") - for(let port of ports){ - console.log(process.cwd(), "this is my portDir dir") - let isRunning - console.log(port, "this is my port") - console.log(process.cwd(), "this is my portDir dir") - process.chdir(`${port}`); - const toCheck = (fs.existsSync("processId")) ? fs.readFileSync("processId") : fs.readFileSync("shellpid") - try{ - const p = await $`ps -p ${toCheck} | grep node | wc -l | tr -d '[:space:]'` - isRunning = true - } - catch(error){ - isRunning = false; - } - process.chdir("..") - if(!isRunning){ - await $`rm -rf ./${port}` - } - } - } - process.chdir("..") + if(arg === "reset"){ + hardReset() } } -(async() =>{ - await cleanUp(); -})() \ No newline at end of file +main() \ No newline at end of file diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 10dc60093..e90e9b57f 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -1,6 +1,7 @@ #!/usr/bin/env zx import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" +import { cleanByPortNumber } from "./cleanUp.mjs"; /* * 1)shouldn't kill last kill the last running job in the packground instead of the last job itself? @@ -11,34 +12,14 @@ import {getKilltArgs} from "./parser.mjs" 6)what is app_id exactly? 7)app and appId concept is mixed up in my head I don't think it is what it should be() 8) how does the default name works? - */ + IMPORTANT: fix it for the default name such as app_n + */ -// async function killtmux(tmuxid){ -// try{ -// console.log("curr address", process.cwd()) -// console.log(`${tmuxid}`) -// const p = await $`tmux ls | grep ${tmuxid} | cut -d ':' -f 1`; -// const tmuxList = p.stdout.toString().trim().split("\n") -// for(let tmux of tmuxList){ -// console.log("list of tmuxes" , tmuxList) -// await $`tmux kill-session -t ${tmux}` -// } -// } -// catch(error){ -// } -// } function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() - if(!fs.existsSync(jamFolder)){ - throw new Error("jamFolder is Missing ") - } - if(!fs.existsSync(`${jamFolder}/ports`)){ - console.log("THERE IS NO APP RUNNING") - return [] - } const activePorts = fs.readdirSync(`${jamFolder}/ports`) for(let port of activePorts){ const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); @@ -70,14 +51,53 @@ function dirNameToProgramName(dirName){ return (dirName.split('_'))[0] } - -function getAppDirs(){ +function killDataByPortDir(portDir){ const jamFolder = getJamFolder() - const subdirs = ((fs.readdirSync(`${jamFolder}/apps`,{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name); - return subdirs -} + const infoList = portDir.split("/") + if(infoList.length !== 2){ + throw new Error("Wrong Path input") +0 } + const dirName = infoList[0] + const portName = infoList[1] + console.log("dirName",dirName ) + console.log("portNumber", portName) + if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ + return[] + } + const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n") + console.log("running dir", dirsRunning) + if(!dirsRunning.includes(dirName)){ + return [] + } + const info ={ + programName : dirNameToProgramName(dirName)+".jxe", + appName : dirNameToAppName(dirName), + portNumber : portName + } + return [info] +} +function killDataByPortNum(portNum){ + const jamFolder = getJamFolder() + const toClean=[]; + const activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) + if(!activePorts.includes(Number(portNum))){ + return []; + } + const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") + for(let dir of dirsRunning){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : portNum + } + toClean.push(info) + } + console.log(toClean, "return from portkill") + return toClean; + +} function killDataByAppName(appName){ const toClean=[]; @@ -99,10 +119,14 @@ function killDataByAppName(appName){ } function killDataByProgramName(programName){ + console.log("gathering data for program name") const toClean=[]; const activeDirs = getRunningDirs(); for(let dir of activeDirs.keys()){ const currProgram = dirNameToProgramName(dir) + console.log("this are the active dirs", activeDirs.keys()) + console.log("this is the curretn program", currProgram) + if(currProgram === programName){ for(let port of activeDirs.get(dir)){ const info ={ @@ -140,9 +164,14 @@ function killDataByDirName(dirName){ } function killDataForAll(){ + const toClean=[]; + console.log("I M HERE GATHERING DATA FOR ALL") const activeDirs = getRunningDirs(); - for(let dir of Object.keys(activeDirs)){ + console.log(activeDirs) + for(let dir of activeDirs.keys()){ + console.log("this is my dir:", dir) for(let port of activeDirs.get(dir)){ + console.log("this is my port:", port) const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), @@ -153,74 +182,47 @@ function killDataForAll(){ } return toClean } - -function jamKillByAppName(appName){ - const data = killDataByAppName(appName); - if(data.length === 0 ){ - console.log("No app with ",appName," name is running") - } - - -} - - - - - - - -function getDirNameFromApp(appName){ - const dirMap = new Map() - const subdirs = (fs.readdirSync(process.cwd()).map(entry => entry.split("_"))).filter(entry => entry.length > 1) - for(let dir of subdirs){ - if(dir.length > 2){ - const tail =(dir.filter((_,index) => index !== 0)).join("_") - if(tail === appName){ - const dirName = dir.join("_") - dirMap.set(tail, dirName) - } - - - - - dirMap.set(tail, dirName) - - } - else{ - const head = dir[0] - const tail = dir[1]; - const dirName = dir.join("_") - dirMap.set(tail, dirName) - } - } - return dirMap; -} - - - - -async function killprocess(data){ - const appName = data.programName; +async function killJamRun(data){ + console.log("KILL JAM RUNS STARTING"); + const appName = data.appName; const programName = data.programName - const portNumber = data.port + const portNumber = data.portNumber const dirName = ((programName.split('.'))[0]) +"_"+ appName; const appfolder = getAppFolder() + console.log(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`, "IF MY FILE EXISTS")) if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`)){ const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); + console.log("THIS IS MY PID", pid) let exists; try { + console.log("BEFORE GETTING THE ERROR") + const cwd = process.cwd() + console.log(cwd) const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` exists = Number(p.stdout.toString().trim()); + console.log("NO ERRIR") } catch (error) { exists = 0 + console.log("ERROR") + console.log(error) } + console.log("got here 5") + console.log(exists, "this is my flag to kill or not to kill") if(exists){ console.log(`Killing process ${pid}`) process.kill(pid); } } - if(fs.existsSync("./processId")){ - const pid = fs.readFileSync("./processId").toString().trim(); +} + +async function killJFile(data){ + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + const dirName = ((programName.split('.'))[0]) +"_"+ appName; + const appfolder = getAppFolder() + if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/processId`)){ + const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/processId`).toString().trim(); let exists; try { const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` @@ -231,161 +233,76 @@ async function killprocess(data){ if(exists){ console.log(`Killing process ${pid}`) process.kill(pid); - } - try { - const port = process.cwd().split("/").pop() - const p = await $`ps ax | grep node | grep ${port} | cut -d ' ' -f 2 | tr -d '[:space:]'` - exists = Number(p.stdout.trim()); - } catch (error) { - exists = 0 - } - if(exists){ - console.log(`Killing process ${pid}`) - process.kill(pid); + return; } } } -async function getJobsSubDirMap(){ - const subDirMap = new Map() - const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) - for(let dir of subdirs){ - if(dir.length > 2){ - - const head = dir[0] - const tail =(dir.filter((_,index) => index !== 0)).join("_") - const dirName = dir.join("_") - +async function killProcess(data){ + await killJamRun(data); + console.log("got here 3") + await killJFile(data); +} - subDirMap.set(tail, dirName) +async function jamKill(flag, name) +{ + console.log("KILLING PROCESS STARTING") + let jamData; + if(flag === "dir"){ + jamData = killDataByDirName(name) + } + else if(flag === "app"){ + jamData = killDataByAppName(name) + + } + else if(flag === "program"){ + console.log("killing by program name") + jamData = killDataByProgramName(name) + } + else if(flag === "port"){ + console.log("USING PORT TO CLEAN") + jamData = killDataByPortNum(name) + } + else if(flag === "portDir"){ + jamData = killDataByPortDir(name) + } + else{ + jamData = killDataForAll() + } + console.log(jamData) + if(jamData.length === 0 ){ + if(flag === "all"){ + console.log("no running app") } else{ - const head = dir[0] - const tail = dir[1]; - const dirName = dir.join("_") - subDirMap.set(tail, dirName) + console.log("no such running app") } + } - return subDirMap; -} - -async function getPortSubDir(){ - const ports = (((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name)) - if(ports.length !== 0){ - return ports - } -} - -async function killAll(){ - const appsMap = await getJobsSubDirMap(); - for(let app of appsMap.keys()){ - process.chdir(`./${appsMap.get(app)}`); - const ports =await getPortSubDir(); - if(ports){ - for(let port of ports){ - process.chdir(`./${port}`); - await killprocess() - if(fs.existsSync("./tmuxid")){ - await killtmux(fs.readFileSync("./tmuxid").toString().trim()); - } - process.chdir("..") - } - } - process.chdir("..") + for(let data of jamData){ + console.log(data) + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + console.log("got here1") + await killProcess(data); + console.log("got here2") + cleanByPortNumber(programName,appName,portNumber) } -} -//brute force approach(safest but not best) -async function killjob(jobName){ - const appsMap = await getJobsSubDirMap(); - for(let app of appsMap.keys()){ - process.chdir(`./${appsMap.get(app)}`); - const ports = await getPortSubDir(); - if(ports){ - for(let port of ports){ - process.chdir(`./${port}`); - if(fs.existsSync("./appid")){ - const appId = fs.readFileSync("./appid").toString().trim() - if(appId === jobName){ - await killprocess() - if(fs.existsSync("./tmuxid")){ - await killtmux(fs.readFileSync("./tmuxid").toString().trim()); - } - - } - } - process.chdir("..") - } - } - process.chdir("..") - } } -//More effiecent in time but vonurable to problems -// async function killjob_V2(lastRunningJob){ -// const jobId = lastRunningJob; -// const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) -// let jobFolder; -// for(let dir of subdirs){ -// if(dir.length > 2){ -// const head = dir[0]; -// const tail =(dir.filter((_,index) => index !== 0)).join("_") -// if(tail === jobId){ -// jobFolder = `${head}`+"_"+`${tail}` -// process.chdir(`./${jobFolder}`) -// const dirs = ((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name); -// await killprocess() -// if(fs.existsSync("./tmuxid")){ -// const tmuxid = fs.readFileSync("./tmuxid").toString().trim() -// await killtmux(tmuxid) -// } -// } -// } -// else{ -// const head = dir[0]; -// const tail = dir[1]; -// if(tail === jobId){ -// jobFolder = `${head}`+"_"+`${tail}` -// await killprocess() -// if(fs.existsSync("./tmuxid")){ -// const tmuxid = fs.readFileSync("./tmuxid").toString().trim() -// await killtmux(tmuxid) -// } -// } -// else if( tail === "app-n" ){ -// process.chdir("./app-n") -// const dirs = ((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name); -// for(let dir of dirs){ -// process.chdir(`./${dir}`) -// if(fs.existsSync('./appid')){ -// const id = fs.readFileSync('./appid').toString().trim() -// if(id === jobId ){ -// await killprocess() -// if(fs.existsSync("./tmuxid")){ -// const tmuxid = fs.readFileSync("./tmuxid").toString().trim(); -// await killtmux(tmuxid); -// } -// } -// } -// process.chdir('..') -// } -// process.chdir('..') -// } -// } -// } - - -// } async function main(){ - let arg; + let args; try{ - arg = getKilltArgs(process.argv) + args = getKilltArgs(process.argv) } catch(error){ + console.log(error) if(error.type === "ShowUsage"){ console.log( ` @@ -410,39 +327,18 @@ async function main(){ } process.exit(1); } - console.log(arg, "this is my arg") const jamfolder = getJamFolder(); const appfolder = getAppFolder(); if( !fs.existsSync(jamfolder) ){ throw new Error('.jamruns folder missing. JAMScript tools not setup?') }; - if( !fs.existsSync(appfolder) ){ throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') }; - - process.chdir(appfolder); - - if(arg === "last"){ - const lastRunningJob = fs.readFileSync("./appid").toString().trim() - console.log(lastRunningJob, "JOB TO KILL") - await killjob(lastRunningJob) - } - if(arg === "all"){ - await killAll(); - } - - else{ - console.log("IM KILLING JOBS") - await killjob(arg); - } - - - + await jamKill(args.flag , args.name); } -// (async() => { -// await main() -// })() - -// console.log(getAppDirs()) +(async() => { + await main() + // console.log(killDataByPortNum(1883)) +})() diff --git a/tools/parser.mjs b/tools/parser.mjs index 02195caa4..9778f952e 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -48,12 +48,18 @@ const jamlistOptionDefinition = [ const jamkillOptionDefinition = [ {name : "help", alias : "h", type: Boolean, defaultValue : false }, - {name : 'all',alias : "a", type: Boolean , defaultValue: false }, - {name : 'app_id', type: String , defaultValue: undefined }, + {name : 'all', type: Boolean , defaultValue: false }, + {name : 'app', type: Boolean , defaultValue: false }, + {name : 'program', type: Boolean , defaultValue: false }, + {name : 'dir', type: Boolean , defaultValue: false }, + {name : 'port', type: Boolean , defaultValue: false }, + {name: "portDir", type: Boolean, defaultValue: false }, + {name : 'name', alias : "n" , type: String , defaultValue: false }, ]; const jamcleanOptionDefinition = [ {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : "reset", alias: "r", type: Boolean, defaultValue : false } ]; @@ -237,27 +243,55 @@ export function getJamListArgs(argv){ export function getKilltArgs(argv){ const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) let options + try{ options = commandLineArgs(jamkillOptionDefinition, {argv: args}); } catch(error){ } - if(args.length === 0){ - return "last" + + console.log(options, "these are my options") + if(options === undefined || options.help){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; + } + const flagCheck = ((options.all?1:0) + (options.app?1:0) + (options.dir?1:0) + (options.program?1:0) + (options.port? 1: 0) + (options.portDir? 1: 0) ); + if( flagCheck !== 1 ){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; } - if(options === undefined || options.help || args.length>1){ + let flag; + if(!options.name && !options.all){ const error = new Error("SHOW USAGE") error.type = "ShowUsage" throw error; } - const arg = options.all? "all": options.app_id - return arg + if(options.all){ + flag = "all"; + } + else if(options.app){ + flag = "app"; + } + else if(options.dir){ + flag = "dir"; + } + else if(options.port){ + flag = "port" + } + else if(options.portDir){ + flag = "portDir" + } + else{ + flag = "program"; + } + console.log() + return {"flag": flag, "name" : options.name} } - - export function getcleanArgs(argv){ const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs') && !entry.includes('jamlist.mjs'))) let options @@ -274,6 +308,7 @@ export function getcleanArgs(argv){ error.type = "ShowUsage" throw error; } + return "reset" } From eae2b2493ed20af0abf6558fa3f21cc3342a81f6 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 23 Jul 2024 22:09:49 -0400 Subject: [PATCH 029/126] monitoring added, refactored jamlist --- package.json | 2 + tools/cleanUp.mjs | 13 +- tools/fileDirectory.mjs | 72 +++++++++- tools/jamkill.mjs | 8 +- tools/jamlist.mjs | 301 +++++++++++++++++++++++----------------- tools/parser.mjs | 43 +++++- 6 files changed, 296 insertions(+), 143 deletions(-) diff --git a/package.json b/package.json index 005d9dd1b..f1bceffec 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,13 @@ }, "dependencies": { "cbor-x": "1.5.4", + "chokidar": "^3.6.0", "command-line-args": "^5.2.1", "command-line-usage": "^6.1.0", "express": "^4.18.2", "ioredis": "^5.3.2", "jszip": "^3.10.1", + "lodash": "^4.17.21", "mercator-projection": "^0.0.2", "mqtt": "=4.3.7", "node-localstorage": ">= 1.3.0", diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 327fca203..f505a9ddc 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -103,21 +103,24 @@ function ArchiveLog(removablePort, appName, programName){ if(fs.existsSync(`${folder}/${removablePort}`)){ process.chdir(`${folder}/${removablePort}`); const logs = fs.readdirSync('.').filter( (entry) => entry.includes("log")) - fs.writeFileSync(`${folder}/log`, "logs\n-------------\n" ) + if(!fs.existsSync(`${folder}/log`)){ + fs.mkdirSync(`${folder}/log`); + } + fs.writeFileSync(`${folder}/log/${removablePort}`, "logs\n-------------\n" ) console.log(logs) for(const log of logs){ if(log.includes("j")){ console.log("THIS NEEDS TO BE TESTE IN THE BG MODE") const data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log`, `:\n-------------\n J Log:\n-------------\n`); - fs.appendFileSync(`${folder}/log`, data); + fs.appendFileSync(`${folder}/log/${removablePort}`, `:\n-------------\n J Log:\n-------------\n`); + fs.appendFileSync(`${folder}/log/${removablePort}`, data); } else{ console.log("WRITING WORKER LOG") const workerNumber = log.split(".")[1]; const data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log`, `\n-------------\n woker number ${workerNumber} Log:\n-------------\n`); - fs.appendFileSync(`${folder}/log`, data); + fs.appendFileSync(`${folder}/log/${removablePort}`, `\n-------------\n woker number ${workerNumber} Log:\n-------------\n`); + fs.appendFileSync(`${folder}/log/${removablePort}`, data); } } diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 69688f342..cc3d98ef2 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -136,4 +136,74 @@ export function fileDirectoryMqtt(folder, iport,jamfolder,app){ } -} \ No newline at end of file +} + +// export function getJamlistPaths(appToPortMap){ +// const fileNames =["machType","appid", "dataStore","tmuxid", "parentId", "numCnodes" ] +// const paths = []; +// for(let app of appToPortMap.key()){ +// for(let port of appToPortMap.get(app)){ +// info = {} +// } +// } +// } + + + +// async function printNodeInfo(dirName, programName){ +// const path = `${process.cwd()}/${dirName}` +// let mType,appid,dstore,tmuxid,parid + +// if(fs.existsSync(`${path}/machType`)){ +// mType= fs.readFileSync(`${path}/machType`).toString().trim() +// } +// else{ +// mType = "-"; + +// } +// if(fs.existsSync(`${path}/appid`)){ +// appid= fs.readFileSync(`${path}/appid`).toString().trim() +// } +// else{ +// appid = "-" +// } +// if(fs.existsSync(`${path}/dataStore`)){ +// dstore= fs.readFileSync(`${path}/dataStore`).toString().trim() +// } +// else{ +// dstore = "-" +// } +// if(fs.existsSync(`${path}/tmuxid`)){ +// tmuxid= fs.readFileSync(`${path}/tmuxid`).toString().trim() +// } +// else{ +// tmuxid = "-" +// } +// if(fs.existsSync(`${path}/parentId`)){ +// parid= fs.readFileSync(`${path}/parentId`).toString().trim() +// } +// else{ +// parid = "-" +// } +// let cdevs = 0; + +// if(mType === "device"){ + +// if(fs.existsSync(`${path}/numCnodes`)){ +// cdevs= fs.readFileSync(`${path}/numCnodes`).toString().trim() +// } +// else{ +// cdevs = "-" +// } + +// const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; +// console.log(headerString) + +// } +// else{ +// const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${("--").padEnd(15)} ${tmuxid.padEnd(15)}`; +// console.log(headerString) +// } + + +// } \ No newline at end of file diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index e90e9b57f..efe665187 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -17,7 +17,7 @@ import { cleanByPortNumber } from "./cleanUp.mjs"; */ -function getRunningDirs(){ +export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() const activePorts = fs.readdirSync(`${jamFolder}/ports`) @@ -37,7 +37,7 @@ function getRunningDirs(){ return appToPort; } -function dirNameToAppName(dirName){ +export function dirNameToAppName(dirName){ const dir = dirName.split('_') if(dir.length > 2){ return (dir.filter((_,index) => index !== 0)).join("_") @@ -47,7 +47,7 @@ function dirNameToAppName(dirName){ } } -function dirNameToProgramName(dirName){ +export function dirNameToProgramName(dirName){ return (dirName.split('_'))[0] } @@ -340,5 +340,5 @@ async function main(){ (async() => { await main() - // console.log(killDataByPortNum(1883)) + })() diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 8307f5a3b..8fb968817 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -1,98 +1,169 @@ #!/usr/bin/env zx /** - * 1)The option to limit the search to the impprted app variable is not working - * 2)Fix the usage msg - * 3) when can /machType` be empty?! - * 4)if device is _ then it is not running (true or false) - * 5)can we have a jNode without a CNode? - * 6)discuss strategies for jamlist - * 8)what to delete in the cleanUp process - * 7) what is the cleanUp exactly? - * - * - * 8)make it monitor constantly. find a way to watch the file system. inotifyewait. keep it running. rp - * - * - * - * --------- - * remove cdevProcessId on jamlist if it is running - * - * - * + + * //DISCUSS PASUING AND THE INFO WE NEED HERE +++++ TAKE CARE OF THE DEFAULT APP NAME + */ import { getJamListArgs } from "./parser.mjs"; -import {getAppFolderAndSubDir} from "./fileDirectory.mjs" -// import { cleanUp } from "./jamclean.mjs"; +import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" +const { debounce } = require('lodash'); +const chokidar = require('chokidar'); +const jamFolder = getJamFolder() +let lastInfo; +function watch(filters) { + const updateInfo = debounce(async () => { + await sleep(500); + if (!filters || filters === "all" || Object.keys(filters).length === 0) { + const info = getNodeInfo(); + lastInfo = info; + if (info.length === 0) { + console.log("---------"); + console.log("---------"); + console.log("---------"); + console.log("There is no program running"); + } else { + console.log("---------"); + console.log("---------"); + console.log("---------"); + printHeader(); + printNodeInfo(info); + } + } else { + const nodeinfo = getNodeInfo(); + const filtered = filter(nodeinfo, filters); + lastInfo = nodeinfo; -async function printNodeInfo(dirName, programName){ - const path = `${process.cwd()}/${dirName}` - let mType,appid,dstore,tmuxid,parid + if (filtered.length === 0) { + console.log("---------"); + console.log("---------"); + console.log("---------"); + console.log("There is no such program running"); + } else { + console.log("---------"); + console.log("---------"); + console.log("---------"); + printHeader(); + printNodeInfo(filtered); + } + } + }, 500); + chokidar.watch(`${jamFolder}/ports`, { persistent: true, ignoreInitial: true }).on('all', () => { + updateInfo(); + }); +} - if(fs.existsSync(`${path}/machType`)){ - mType= fs.readFileSync(`${path}/machType`).toString().trim() - } - else{ - mType = "-"; +export function getRunningDirs(){ + const jamFolder = getJamFolder() + const appToPort = new Map() + const activePorts = fs.readdirSync(`${jamFolder}/ports`) + for(let port of activePorts){ + const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } } - if(fs.existsSync(`${path}/appid`)){ - appid= fs.readFileSync(`${path}/appid`).toString().trim() - } - else{ - appid = "-" - } - if(fs.existsSync(`${path}/dataStore`)){ - dstore= fs.readFileSync(`${path}/dataStore`).toString().trim() - } - else{ - dstore = "-" - } - if(fs.existsSync(`${path}/tmuxid`)){ - tmuxid= fs.readFileSync(`${path}/tmuxid`).toString().trim() - } - else{ - tmuxid = "-" - } - if(fs.existsSync(`${path}/parentId`)){ - parid= fs.readFileSync(`${path}/parentId`).toString().trim() + return appToPort; +} + +export function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") } else{ - parid = "-" + return dir[1]; } - let cdevs = 0; - if(mType === "device"){ - - if(fs.existsSync(`${path}/numCnodes`)){ - cdevs= fs.readFileSync(`${path}/numCnodes`).toString().trim() - } - else{ - cdevs = "-" - } - - const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; - console.log(headerString) +} +export function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] + +} + +function getNodeInfo(){ + const appToPortMap = getRunningDirs() + // console.log(appToPortMap) + const appfolder = getAppFolder(); + const nodeInfo= []; + for(let app of appToPortMap.keys()){ + const appName = dirNameToAppName(app) + const programName = dirNameToProgramName(app) + for(let port of appToPortMap.get(app)){ + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" } + const dirPath = `${appfolder}/${app}/${port}` + if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ + throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + } + for(let fileName of Object.keys(fileNames)){ + if(fs.existsSync(`${dirPath}/${fileName}`)){ + const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + fileNames[fileName] = data; + } + } + fileNames["portNum"] = String(port) + fileNames["appName"] = appName + fileNames["programName"] = programName + + nodeInfo.push(fileNames) + } } - else{ - const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${("--").padEnd(15)} ${tmuxid.padEnd(15)}`; + + return nodeInfo; +} + +function printNodeInfo(info){ + + for (let row of info){ + + const headerString = ` ${row["appName"].padEnd(15)} ${row["programName"].padEnd(15)} ${("Local:"+row["portNum"]).padEnd(15)} ${row["parentId"].padEnd(15)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(15)} ${row["numCnodes"].padEnd(15)} ${row["tmuxid"].padEnd(15)}`; console.log(headerString) } - +} + + +function printHeader(){ + const headerString = ` ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; + console.log(headerString) +} +function filter(nodeinfo, filters){ + const filteredInfo =[]; + for(let info of nodeinfo){ + let isPassing = true + for(let filter of Object.keys(filters)){ + if(!(filters[filter] === info[filter])){ + isPassing = false + break; + } + } + if(isPassing){ + filteredInfo.push(info) + } + } + return filteredInfo; } -async function main(){ - let subDirs; - let appfolder; - let app; + +function main(){ + let args; try{ - app = getJamListArgs(process.argv) + args = getJamListArgs(process.argv) } catch(error){ + console.log(error) + if(error.type = "ShowUsage"){ console.log( ` @@ -105,71 +176,45 @@ async function main(){ ) process.exit(1); } + throw error; } - try{ - - [subDirs, appfolder] =await getAppFolderAndSubDir(); - } - catch(error){ - console.log("No running instances of JAMScript.") - } - - process.chdir(appfolder) - const headerString = ` ${"ID".padEnd(15)} ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(15)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; - console.log(headerString); - for(let subDir of subDirs ){ - const [programName, appName] = subDir.split("_"); - process.chdir(`${subDir}`) - const jexs = ((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name) - if(!jexs || jexs.length === 0){ - break; - } - - for(let jex of jexs){ - let running; - if(fs.existsSync(`${appfolder}/${subDir}/${jex}/processId`)){ - - const pid = fs.readFileSync(`${appfolder}/${subDir}/${jex}/processId`).toString().trim(); - if(pid === "new") - running = "new"; - else if(!pid){ - running = "none" - } - else{ - //can use try catch istead - const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'`.nothrow() - const present = p.stdout.trim() - if (present == "1") - running="ps" - else - running="none" - } + const filters = args.filters; + const monitor = args.monitor; + if(monitor){ + watch(filters); + } + if(!filters || filters === "all" || Object.keys(filter) === 0){ + const info = getNodeInfo(); + lastInfo = info; + if(info.length === 0 ){ + console.log("there is No program running") + if(!monitor){ + process.exit(0) } - else{ - running = "none" + + } + printHeader(); + printNodeInfo(info); + } + else{ + const nodeinfo = getNodeInfo() + const filtered = filter(nodeinfo, filters) + lastInfo = filtered; + if(filtered.length === 0 ){ + console.log("there is No such program running") + if(!monitor){ + process.exit(0) } - if(running === "ps" || running === "new"){ - if(!app) - printNodeInfo(jex,programName) - - else - if(appName.includes(app)) - printNodeInfo(jex,programName) - - - } } - - - process.chdir(`./..`) - + printHeader(); + printNodeInfo(filtered); + } - } - } -(async () => { - await main() + +(async () => { + main() })(); \ No newline at end of file diff --git a/tools/parser.mjs b/tools/parser.mjs index 9778f952e..51d60c24d 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -43,9 +43,16 @@ const jamrunOptionDefinitions = [ const jamlistOptionDefinition = [ {name : "help", alias : "h", type: Boolean, defaultValue : false }, - {name : 'app',alias : "a", type: String , defaultValue: undefined }, - ]; + {name : "monitor", alias : "m", type: Boolean, defaultValue : false }, + {name : 'type', type: String , defaultValue: undefined }, + {name : 'dataStore', type: String , defaultValue: undefined }, + {name : 'tmuxid', type: String , defaultValue: undefined }, + {name : 'portNum', type: String , defaultValue: undefined }, + {name : 'appName', type: String , defaultValue: undefined }, + {name : 'programName', type: String , defaultValue: undefined }, + ]; + const jamkillOptionDefinition = [ {name : "help", alias : "h", type: Boolean, defaultValue : false }, {name : 'all', type: Boolean , defaultValue: false }, @@ -163,7 +170,6 @@ function SetJamrunVar(options){ export function jamrunParsArg(argv){ - console.log("got here") const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) const file = checkJXEfile(arg) @@ -229,12 +235,39 @@ export function getJamListArgs(argv){ } catch(error){ } - if(options === undefined || options.help){ + if(options?.help || !options){ + console.log("DON") const error = new Error("SHOW USAGE") error.type = "ShowUsage" throw error; } - return options.app + if(Object.keys(options).length === 1){ + return "all" + } + + const filters = {} + for(let key of Object.keys(options)){ + if(key === "help" || key === "monitor") + continue; + + if(key=== "type"){ + const deviceType = options[key] + if(deviceType !== "device" && deviceType !== "fog" && deviceType !== "cloud"){ + throw new Error("wrong device type") + } + filters["machType"] = deviceType + + } + else{ + filters[key] = options[key] + + } + + } + + + + return {filters : filters, monitor: options.monitor} } From cc17ab05eaa51dbb7065c1c2bb82f27423bc0ca9 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 24 Jul 2024 21:47:28 -0400 Subject: [PATCH 030/126] jamClean added --- tools/jamclean.mjs | 289 +++++++++++++++++++++++++++++++++++++++++++-- tools/jamkill.mjs | 34 ++++-- tools/jamlist.mjs | 14 ++- tools/jamrun.mjs | 3 +- tools/parser.mjs | 40 ++++--- 5 files changed, 338 insertions(+), 42 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index c72d0297f..d857e4ec2 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -1,8 +1,36 @@ #!/usr/bin/env zx import {getcleanArgs} from "./parser.mjs" -import { getJamFolder } from "./fileDirectory.mjs"; +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +const { spawnSync } = require('child_process'); +import { cleanByPortNumber } from "./cleanUp.mjs"; +////////////////// //////// /////// //////// ////// ////// /// +/////////////what should we do when we see new? linger there? wait/force. what to do exactly?. it is for broken apps.MAKE THE JT@ FILES BREAK. +///////Shopuld we check of reddis is running or not like we do for mqtt, JFile, Cfiles +/** + * //use later(ABSTRACT AWAAY) + * //WE SHOULD KEEP JAMRUN ALIVE UNTIL THE VALUE ASSIGNED TO THE PROCESSID + * while(true){ + if(!fs.existsSync(`${processId}`)){ + return false; + } + const pid = fs.readFileSync(`${processId}`).toString().trim(); + if(pid === "new"){ + if(!flag){ + flag = true; + await sleep(500); + continue; + } + } + break; + + } + * + * + */ +////////////////// //////// /////// //////// ////// ////// /// + // async function getJobsSubDirMap(){ // const subDirMap = new Map() @@ -91,24 +119,259 @@ import { getJamFolder } from "./fileDirectory.mjs"; // } // } +////////////////////////////////////////////////////////////////////////// +const p = spawnSync('which', ['mosquitto_pub']); +const MOSQUITTO_PUB = p.stdout.toString().trim() -function hardReset(){ - const jamFolder = getJamFolder() - fs.rmSync(`${jamFolder}/apps`, { recursive: true, force: true }); - fs.rmSync(`${jamFolder}/ports`, { recursive: true, force: true }); -}3 +function getRunningDirs(){ + const appFolder = getAppFolder() + const appToPort = new Map() + const activePorts = fs.readdirSync(`${appFolder}`) + for(let port of activePorts){ + const apps = fs.readFileSync(`${appFolder}/${port}`).toString().trim().split("\n"); + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } + } + return appToPort; +} + +function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") + } + else{ + return dir[1]; + } + +} +function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] +} + + +async function isJamrunRunning(dir,portNum){ + const appFolder = getAppFolder() + const myAppDir = dir; + //should be string. + const myAppPortNum = portNum; + const shellPIDpath = `${appFolder}/${myAppDir}/${myAppPortNum}/shellpid` + + if(!fs.existsSync(`${shellPIDpath}`)){ + return false; + } + const pid = fs.readFileSync(`${shellPIDpath}`).toString().trim(); + let running; + try{ + const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` + running = Number(p.stdout.toString().trim()) + } + catch(error){ + return false + } + if(!running){ + return false + } + return pid; +} + +async function isJfileRunning(dir,portNum){ + const appFolder = getAppFolder() + const myAppDir = dir; + const myAppPortNum = portNum; + const processId = `${appFolder}/${myAppDir}/${myAppPortNum}/processId` + + //make sure j file is getting the time to write to filedirectory + + if(!fs.existsSync(`${processId}`)){ + return false; + } + const pid = fs.readFileSync(`${processId}`).toString().trim(); + + + let running; + try{ + const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` + running = Number(p.stdout.toString().trim()); + } + catch(error){ + return false; + } + if(!running){ + return false; + } + return pid; +} + + +async function isMosquittoRunning(port){ + try{ + await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); + return true; + } + catch(error){ + return false; + } +} -function main(){ - let arg; +async function isCfileRunning(Dir,port,num){ + const myAppDir = Dir; + const portNum = port; + const workerNum = num; + const appFolder = getAppFolder() + const cdevID = `${appFolder}/${myAppDir}/${portNum}/cdevProcessId.${workerNum}` + //make sure j file is getting the time to write to filedirectory + if(!fs.existsSync(`${cdevID}`)){ + return false; + } + const pid = fs.readFileSync(`${cdevID}`).toString().trim(); + let running; try{ - arg = getcleanArgs(process.argv) + const p = await $`ps -p ${pid} | grep ./a.out | wc -l | tr -d '[:space:]'` + running = Number(p.stdout.toString().trim()); } catch(error){ - throw error + return false; + } + if(!running){ + return false; + } + return pid; +} +async function isDevice(Dir,port){ + const appFolder = getAppFolder(); + const appDir = Dir; + const portNum = port; + const machType = `${appFolder}/${appDir}/${portNum}/machType` + if(!fs.existsSync(`${machType}`)){ + return false; + } + const type = fs.readFileSync(`${machType}`).toString().trim() + if(type === "device"){ + return true + } + return false; +} + +async function getRunningCfiles(Dir,port){ + const appFolder = getAppFolder(); + const appDir = Dir; + const portNum = port; + const runningCfiles = [] + const portDir = `${appFolder}/${appDir}/${portNum}` + if(!fs.existsSync(portDir)){ + return; + } + const cfilesNum = ((fs.readdirSync(portDir)).filter((entry) => entry.includes("cdevProcessId"))).map((entry) => entry.split(".")[1]) + for(let cfileNum of cfilesNum){ + if(await isCfileRunning(appDir,portNum,cfileNum)){ + runningCfiles.push(`${cfileNum}`) + } + } + return runningCfiles; +} + +function cleanCfiles(portDir, currCfile){ + const oldCdevs = (fs.readdirSync(portDir)).filter((entry) => entry.includes("cdev")) + if( (oldCdevs.length)*2 === currCfile.length){ + return; + } + for(let oldCdev of oldCdevs){ + const cNum = oldCdev.split(".")[1]; + if(!currCfile.includes(cNum)){ + fs.unlinkSync(`${portDir}/oldCdev`); + } + } +} +function cleanPorts(AppToRemove){ + const jamFolder = getJamFolder() + for(let port of AppToRemove.keys()){ + if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ + continue; + } + const oldApss = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n") + const toRemove = AppToRemove.get(port) + const newApps = oldApss.filter((entry) => !toRemove.includes(entry)) + fs.writeFileSync(`${jamFolder}/ports/${port}`, newApps ) + } +} + +async function clean(){ + //port --> dir + const AppToRemove = new Map(); + const jamFolder = getJamFolder() + const portsDir = `${jamFolder}/ports` + const appFolder = getAppFolder() + if(!fs.existsSync(portsDir)){ + return; } - if(arg === "reset"){ - hardReset() + const ports = fs.readdirSync(portsDir) + if(ports.length === 0 ){ + return + } + portLoop: + for(let port of ports){ + if(!fs.existsSync(`${portsDir}/${port}`)){ + continue; + } + const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") + for(let dir of dirs){ + //mosquitto not running kill + if(!await isMosquittoRunning(port)){ + await $`zx jamkill.mjs --port --name=${port}` + continue portLoop; + } + //jFile is not running. to remove fromport list + if(!(await isJamrunRunning(dir,port)) && !(await isJfileRunning(dir,port))){ + const programName = dirNameToProgramName(dir)+".jxe"; + const appName = dirNameToAppName(dir); + cleanByPortNumber(programName, appName, port); + if(AppToRemove.has(port)){ + const dummy = AppToRemove.get(port); + dummy.push(dir); + AppToRemove.set(port,dummy) + } + else{ + AppToRemove.set(port,dir) + } + } + //It's running and files are uptodate, update Cnum and clean cdevs + if( (await isJfileRunning(dir,port)) && (await isDevice(Dir,port))){ + const Cfiles = await getRunningCfiles(dir,port); + const numCnodes = Cfiles.length + if(!fs.existsSync(`${jamFolder}/${dir}/${port}/numCnodes`)){ + fs.writeFileSync(`${jamFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) + continue; + } + const numCnodeFile = Number(fs.readFileSync(`${jamFolder}/${dir}/${port}/numCnodes`).toString().trim()) + if(numCnodeFile !== numCnodes){ + fs.writeFileSync(`${jamFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) + } + cleanCfiles(`${jamFolder}/${dir}/${port}`, Cfiles) + } + + } } + cleanPorts(AppToRemove) } -main() \ No newline at end of file + + + + + + + +// main() + +(async () =>{ + await clean() +})(); \ No newline at end of file diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index efe665187..577832fe5 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -192,10 +192,8 @@ async function killJamRun(data){ console.log(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`, "IF MY FILE EXISTS")) if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`)){ const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); - console.log("THIS IS MY PID", pid) let exists; try { - console.log("BEFORE GETTING THE ERROR") const cwd = process.cwd() console.log(cwd) const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` @@ -203,11 +201,9 @@ async function killJamRun(data){ console.log("NO ERRIR") } catch (error) { exists = 0 - console.log("ERROR") - console.log(error) + } - console.log("got here 5") - console.log(exists, "this is my flag to kill or not to kill") + if(exists){ console.log(`Killing process ${pid}`) process.kill(pid); @@ -226,7 +222,7 @@ async function killJFile(data){ let exists; try { const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` - exists = Number(p.stdout.trim()); + exists = Number(p.stdout.toString().trim()); } catch (error) { exists = 0 } @@ -240,7 +236,6 @@ async function killJFile(data){ async function killProcess(data){ await killJamRun(data); - console.log("got here 3") await killJFile(data); } @@ -293,6 +288,21 @@ async function jamKill(flag, name) } +async function jamKillBruteForce(){ + await $`pkill node`.nothrow().quiet(); + await $`pkill mosquitto`.nothrow().quiet(); + await $`pkill tmux`.nothrow().quiet(); + await $`ps aux | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill`.nothrow().quiet(); + const jamfolder = getJamFolder(); + //should I remove the apps as well or that is not required + try{ + fs.rmSync(`${jamfolder}/ports`, { recursive: true, force: true }) + } + catch(error){ + + } +} + async function main(){ let args; @@ -335,7 +345,13 @@ async function main(){ if( !fs.existsSync(appfolder) ){ throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') }; - await jamKill(args.flag , args.name); + if(args.flag === "reset"){ + await jamKillBruteForce() + } + else{ + await jamKill(args.flag , args.name); + } + } (async() => { diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 8fb968817..982971984 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -184,7 +184,18 @@ function main(){ if(monitor){ watch(filters); } - if(!filters || filters === "all" || Object.keys(filter) === 0){ + const jamfolder = getJamFolder() + + if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ + console.log("there is No program running") + if(!monitor){ + process.exit(0) + } + + + } + + else if(!filters || filters === "all" || Object.keys(filter) === 0){ const info = getNodeInfo(); lastInfo = info; if(info.length === 0 ){ @@ -197,6 +208,7 @@ function main(){ printHeader(); printNodeInfo(info); } + else{ const nodeinfo = getNodeInfo() const filtered = filter(nodeinfo, filters) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 74cd350d3..06687c8e4 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -226,7 +226,8 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ const child = spawn(command, args, options); child.on('exit', () => { - process.exit(1); + console.log("gotHERE") + process.kill(process.pid, 'SIGTERM'); }); } diff --git a/tools/parser.mjs b/tools/parser.mjs index 51d60c24d..3b9c0c6ce 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -56,6 +56,7 @@ const jamlistOptionDefinition = [ const jamkillOptionDefinition = [ {name : "help", alias : "h", type: Boolean, defaultValue : false }, {name : 'all', type: Boolean , defaultValue: false }, + {name : 'reset', type: Boolean , defaultValue: false }, {name : 'app', type: Boolean , defaultValue: false }, {name : 'program', type: Boolean , defaultValue: false }, {name : 'dir', type: Boolean , defaultValue: false }, @@ -289,14 +290,14 @@ export function getKilltArgs(argv){ error.type = "ShowUsage" throw error; } - const flagCheck = ((options.all?1:0) + (options.app?1:0) + (options.dir?1:0) + (options.program?1:0) + (options.port? 1: 0) + (options.portDir? 1: 0) ); + const flagCheck = ((options.all?1:0) + (options.app?1:0) + (options.dir?1:0) + (options.program?1:0) + (options.port? 1: 0) + (options.portDir? 1: 0) + (options.reset? 1: 0)); if( flagCheck !== 1 ){ const error = new Error("SHOW USAGE") error.type = "ShowUsage" throw error; } let flag; - if(!options.name && !options.all){ + if(!options.name && !options.all && !options.reset){ const error = new Error("SHOW USAGE") error.type = "ShowUsage" throw error; @@ -317,33 +318,36 @@ export function getKilltArgs(argv){ else if(options.portDir){ flag = "portDir" } + else if(options.reset){ + flag = "reset" + } else{ flag = "program"; } - console.log() + console.log(flag, "this is my flag") return {"flag": flag, "name" : options.name} } -export function getcleanArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs') && !entry.includes('jamlist.mjs'))) - let options +// export function getcleanArgs(argv){ +// const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs') && !entry.includes('jamlist.mjs'))) +// let options - try{ - options = commandLineArgs(jamcleanOptionDefinition, {argv: args}); - } - catch(error){ - } +// try{ +// options = commandLineArgs(jamcleanOptionDefinition, {argv: args}); +// } +// catch(error){ +// } - if(options === undefined || options.help){ - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" - throw error; - } - return "reset" +// if(options === undefined || options.help){ +// const error = new Error("SHOW USAGE") +// error.type = "ShowUsage" +// throw error; +// } +// return "reset" -} +// } From d2048f038a212f8f636ba640bbdb451ee6cbe6d6 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 24 Jul 2024 23:20:40 -0400 Subject: [PATCH 031/126] cleaning included/ monitoring improved --- tools/jamclean.mjs | 17 +++++----- tools/jamlist.mjs | 81 +++++++++++++++++++++++++++++++++------------- tools/jamrun.mjs | 2 +- 3 files changed, 68 insertions(+), 32 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index d857e4ec2..1de194306 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -1,5 +1,4 @@ #!/usr/bin/env zx -import {getcleanArgs} from "./parser.mjs" import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; const { spawnSync } = require('child_process'); import { cleanByPortNumber } from "./cleanUp.mjs"; @@ -287,7 +286,7 @@ function cleanCfiles(portDir, currCfile){ for(let oldCdev of oldCdevs){ const cNum = oldCdev.split(".")[1]; if(!currCfile.includes(cNum)){ - fs.unlinkSync(`${portDir}/oldCdev`); + fs.unlinkSync(`${portDir}/${oldCdev}`); } } } @@ -300,7 +299,7 @@ function cleanPorts(AppToRemove){ const oldApss = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n") const toRemove = AppToRemove.get(port) const newApps = oldApss.filter((entry) => !toRemove.includes(entry)) - fs.writeFileSync(`${jamFolder}/ports/${port}`, newApps ) + fs.writeFileSync(`${jamFolder}/ports/${port}`, newApps.join("\n")) } } @@ -344,18 +343,18 @@ async function clean(){ } } //It's running and files are uptodate, update Cnum and clean cdevs - if( (await isJfileRunning(dir,port)) && (await isDevice(Dir,port))){ + if( (await isJfileRunning(dir,port)) && (await isDevice(dir,port))){ const Cfiles = await getRunningCfiles(dir,port); const numCnodes = Cfiles.length - if(!fs.existsSync(`${jamFolder}/${dir}/${port}/numCnodes`)){ - fs.writeFileSync(`${jamFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) + if(!fs.existsSync(`${appFolder}/${dir}/${port}/numCnodes`)){ + fs.writeFileSync(`${appFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) continue; } - const numCnodeFile = Number(fs.readFileSync(`${jamFolder}/${dir}/${port}/numCnodes`).toString().trim()) + const numCnodeFile = Number(fs.readFileSync(`${appFolder}/${dir}/${port}/numCnodes`).toString().trim()) if(numCnodeFile !== numCnodes){ - fs.writeFileSync(`${jamFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) + fs.writeFileSync(`${appFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) } - cleanCfiles(`${jamFolder}/${dir}/${port}`, Cfiles) + cleanCfiles(`${appFolder}/${dir}/${port}`, Cfiles) } } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 982971984..45d82683b 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -10,9 +10,65 @@ const { debounce } = require('lodash'); const chokidar = require('chokidar'); const jamFolder = getJamFolder() let lastInfo; +let watcher; + + + + +function getRunningDirs(){ + const jamFolder = getJamFolder() + const appToPort = new Map() + const activePorts = fs.readdirSync(`${jamFolder}/ports`) + for(let port of activePorts){ + const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } + } + return appToPort; +} +function getWatchList(){ + const watchList = [] + const appFolder = getAppFolder() + watchList.push(`${jamFolder}/ports`) + const dirs = getRunningDirs() + for(let dir of dirs.keys()){ + for(let port of dirs.get(dir)){ + watchList.push(`${appFolder}/${dir}/${port}/numCnodes`) + } + } + return watchList + +} + function watch(filters) { + function updateWatchList(watchList){ + const newWatchList = getWatchList(); + console.log(newWatchList); + console.log(watchList) + for(let item of newWatchList){ + if(!watchList.includes(item)){ + console.log(item) + watcher.add(item) + } + } + for(let item of watchList){ + if(!newWatchList.includes(item)){ + console.log(item); + watcher.unwatch(item) + } + } + return newWatchList; + } const updateInfo = debounce(async () => { await sleep(500); if (!filters || filters === "all" || Object.keys(filters).length === 0) { @@ -50,32 +106,13 @@ function watch(filters) { } } }, 500); - chokidar.watch(`${jamFolder}/ports`, { persistent: true, ignoreInitial: true }).on('all', () => { + let watchList = getWatchList() + watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', () => { + watchList = updateWatchList(watchList) updateInfo(); }); } - -export function getRunningDirs(){ - const jamFolder = getJamFolder() - const appToPort = new Map() - const activePorts = fs.readdirSync(`${jamFolder}/ports`) - for(let port of activePorts){ - const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); - for(let app of apps){ - if(appToPort.has(app)){ - const portList = appToPort.get(app); - portList.push(port) - appToPort.set(app,portList) - } - else{ - appToPort.set(app,[port]) - } - } - } - return appToPort; -} - export function dirNameToAppName(dirName){ const dir = dirName.split('_') if(dir.length > 2){ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 06687c8e4..a5083d842 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -657,6 +657,6 @@ async function main(){ } - +await $`zx jamclean.mjs` await main() From 0afeaa95a35e97e2d16fed0de81e8959ca193e6d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 24 Jul 2024 23:25:38 -0400 Subject: [PATCH 032/126] interval added --- tools/jamlist.mjs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 45d82683b..f57377598 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -51,6 +51,9 @@ function getWatchList(){ function watch(filters) { + setInterval(async () => { + await $`zx jamclean.mjs` + }, 200); function updateWatchList(watchList){ const newWatchList = getWatchList(); console.log(newWatchList); @@ -77,13 +80,11 @@ function watch(filters) { if (info.length === 0) { console.log("---------"); - console.log("---------"); - console.log("---------"); + console.log("There is no program running"); } else { console.log("---------"); - console.log("---------"); - console.log("---------"); + printHeader(); printNodeInfo(info); } @@ -94,13 +95,11 @@ function watch(filters) { if (filtered.length === 0) { console.log("---------"); - console.log("---------"); - console.log("---------"); + console.log("There is no such program running"); } else { console.log("---------"); - console.log("---------"); - console.log("---------"); + printHeader(); printNodeInfo(filtered); } From 13690960c8db8ad43b1b70df2c8f8e99de5b5e85 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 25 Jul 2024 12:47:49 -0400 Subject: [PATCH 033/126] live demo checkpoint --- tools/cleanUp.mjs | 24 ------------------------ tools/jamkill.mjs | 31 +------------------------------ tools/jamlist.mjs | 7 ++----- tools/jamrun.mjs | 28 +++------------------------- 4 files changed, 6 insertions(+), 84 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index f505a9ddc..0472b370a 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -6,17 +6,12 @@ const TMUX = p.stdout.toString().trim() function getTmuxIds(PortNumber,appName , programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName); - console.log(`${folder}/${PortNumber}/tmuxid`) - console.log() if(fs.existsSync(`${folder}/${PortNumber}/tmuxid`)){ const tmuxID = fs.readFileSync(`${folder}/${PortNumber}/tmuxid`).toString().trim(); - console.log(tmuxID, "this is my tmux id") const p = spawnSync(TMUX, ['ls', '-F', '#S']); const runningTMUXS = p.stdout.toString().trim().split("\n"); - console.log(runningTMUXS, "this is my alllllll tmux running") const currTmuxids = runningTMUXS.filter((entry) => entry.includes(tmuxID)); - console.log(currTmuxids, "this is my curr tmux running") return currTmuxids; } @@ -43,7 +38,6 @@ function stalePort(removablePort,app,programName){ } const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n"); - console.log("this is my program name : ", programName) const dirName = (programName.split(".")[0])+"_"+app if(appNames.includes(dirName)){ if(appNames.length === 1){ @@ -53,13 +47,11 @@ function stalePort(removablePort,app,programName){ } else{ const newAppNames = appNames.filter((appName) => appName !== dirName) - console.log( newAppNames.join("\n")) fs.writeFileSync(`${jamfolder}/ports/${removablePort}`, newAppNames.join("\n")) return false; } } else{ - console.log("PORT DIR IS CORRUPTED") return false; } } @@ -78,7 +70,6 @@ function killMosquitto(removablePort){ function killRedis(removablePort){ const dport = Number(removablePort)+20000 spawnSync('redis-cli', ['-p', dport, 'shutdown']); - console.log("REDIS CLEANED") } function cleanPort(removablePort,app,programName){ @@ -94,11 +85,6 @@ function cleanPort(removablePort,app,programName){ } function ArchiveLog(removablePort, appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) - console.log("CLEAN UP, PORT NUMBER:" , removablePort); - console.log("CLEAN UP, app number" , appName); - console.log("CLEAN UP, program NUMBER:" , programName); - - console.log(folder) if(fs.existsSync(`${folder}/${removablePort}`)){ process.chdir(`${folder}/${removablePort}`); @@ -110,13 +96,11 @@ function ArchiveLog(removablePort, appName, programName){ console.log(logs) for(const log of logs){ if(log.includes("j")){ - console.log("THIS NEEDS TO BE TESTE IN THE BG MODE") const data = fs.readFileSync(log) fs.appendFileSync(`${folder}/log/${removablePort}`, `:\n-------------\n J Log:\n-------------\n`); fs.appendFileSync(`${folder}/log/${removablePort}`, data); } else{ - console.log("WRITING WORKER LOG") const workerNumber = log.split(".")[1]; const data = fs.readFileSync(log) fs.appendFileSync(`${folder}/log/${removablePort}`, `\n-------------\n woker number ${workerNumber} Log:\n-------------\n`); @@ -130,15 +114,10 @@ function ArchiveLog(removablePort, appName, programName){ } function cleanAppDir(removablePort,appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) - console.log(folder, "this is my folder") if(fs.existsSync(`${folder}/${removablePort}`)){ try { - console.log("removing") - console.log(removablePort) fs.rmSync(`${folder}/${removablePort}`, { recursive: true, force: true }); - console.log("removedz") } catch (error) { - console.log(error) } return true; } @@ -148,11 +127,8 @@ function cleanAppDir(removablePort,appName, programName){ export function cleanup(removablePort, tmuxIds,app,TMUX){ cleanPort(removablePort,app); ArchiveLog(removablePort); - console.log("LOGS ARE ARCHIVED"); cleanAppDir(removablePort); - console.log("STOPPED PORT IS REMOVED GROM APP DIR"); killtmux(tmuxIds,TMUX); - console.log("STOPPED TMUX"); } export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 577832fe5..21aa4c714 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -4,15 +4,6 @@ import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber } from "./cleanUp.mjs"; /* - * 1)shouldn't kill last kill the last running job in the packground instead of the last job itself? - 2) we kill based on app name but not the program name for some reason(ex. jt2,jt3 with appname shahin will both be killed and no way to seperate them apart from each others)(we can use the pattern) - 3)discuss the new kill app appriach - 4)what id the app is not found? - 5)what if you run jamKill with no args back to back? - 6)what is app_id exactly? - 7)app and appId concept is mixed up in my head I don't think it is what it should be() - 8) how does the default name works? - IMPORTANT: fix it for the default name such as app_n */ @@ -59,13 +50,11 @@ function killDataByPortDir(portDir){ 0 } const dirName = infoList[0] const portName = infoList[1] - console.log("dirName",dirName ) - console.log("portNumber", portName) + if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ return[] } const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n") - console.log("running dir", dirsRunning) if(!dirsRunning.includes(dirName)){ return [] } @@ -94,7 +83,6 @@ function killDataByPortNum(portNum){ } toClean.push(info) } - console.log(toClean, "return from portkill") return toClean; } @@ -119,14 +107,10 @@ function killDataByAppName(appName){ } function killDataByProgramName(programName){ - console.log("gathering data for program name") const toClean=[]; const activeDirs = getRunningDirs(); for(let dir of activeDirs.keys()){ const currProgram = dirNameToProgramName(dir) - console.log("this are the active dirs", activeDirs.keys()) - console.log("this is the curretn program", currProgram) - if(currProgram === programName){ for(let port of activeDirs.get(dir)){ const info ={ @@ -145,12 +129,9 @@ function killDataByProgramName(programName){ function killDataByDirName(dirName){ const toClean=[]; const activeDirs = getRunningDirs(); - console.log(activeDirs) for(let dir of activeDirs.keys()){ - console.log("this is my dir name", dir) if(dir === dirName){ for(let port of activeDirs.get(dir)){ - console.log("this is my port name", port) const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), @@ -165,13 +146,9 @@ function killDataByDirName(dirName){ function killDataForAll(){ const toClean=[]; - console.log("I M HERE GATHERING DATA FOR ALL") const activeDirs = getRunningDirs(); - console.log(activeDirs) for(let dir of activeDirs.keys()){ - console.log("this is my dir:", dir) for(let port of activeDirs.get(dir)){ - console.log("this is my port:", port) const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), @@ -183,29 +160,24 @@ function killDataForAll(){ return toClean } async function killJamRun(data){ - console.log("KILL JAM RUNS STARTING"); const appName = data.appName; const programName = data.programName const portNumber = data.portNumber const dirName = ((programName.split('.'))[0]) +"_"+ appName; const appfolder = getAppFolder() - console.log(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`, "IF MY FILE EXISTS")) if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`)){ const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); let exists; try { const cwd = process.cwd() - console.log(cwd) const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` exists = Number(p.stdout.toString().trim()); - console.log("NO ERRIR") } catch (error) { exists = 0 } if(exists){ - console.log(`Killing process ${pid}`) process.kill(pid); } } @@ -227,7 +199,6 @@ async function killJFile(data){ exists = 0 } if(exists){ - console.log(`Killing process ${pid}`) process.kill(pid); return; } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index f57377598..6d1964e3f 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -53,20 +53,17 @@ function getWatchList(){ function watch(filters) { setInterval(async () => { await $`zx jamclean.mjs` - }, 200); + }, 1000); function updateWatchList(watchList){ const newWatchList = getWatchList(); - console.log(newWatchList); - console.log(watchList) + for(let item of newWatchList){ if(!watchList.includes(item)){ - console.log(item) watcher.add(item) } } for(let item of watchList){ if(!newWatchList.includes(item)){ - console.log(item); watcher.unwatch(item) } } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index a5083d842..9f8fb90d6 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -25,7 +25,8 @@ const { spawn,spawnSync } = require('child_process'); - +ADD PAUSE UNPAUSE +ADD GIT LOG */ @@ -138,7 +139,6 @@ function show_usage(){ The jamrun command creates a run state in the $HOME/.jamruns folder. `; - // console.log(usageMessage); } @@ -213,7 +213,6 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ } let jargs = getJargs(argObject) - console.log("this is my jarg", jargs) const command = 'node'; const args = ['jstart.js', ...jargs]; const options = { @@ -226,14 +225,12 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ const child = spawn(command, args, options); child.on('exit', () => { - console.log("gotHERE") process.kill(process.pid, 'SIGTERM'); }); } function dojamout_p2_bg(pnum, floc, jappid, group=null){ - // console.log("THE EXECUTION IS ON THE BG") let argObject = { "--app":jappid, "--port":pnum, @@ -290,9 +287,7 @@ async function doaout(num,port,group,datap,myf,jappid){ "-o": datap, } let cargs = getCargs(argObject) - // console.log("THIS IS MY CARGS",cargs) await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; - // console.log("this is my log", log) if (!log){ if(valgrind) @@ -363,13 +358,10 @@ async function portavailable(folder,port) { if(porttaken === 0){ if(!fs.existsSync(`${jamFolder}/ports`)){ - console.log(port) const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() - console.log((p.stdout.trim())) porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; } } - console.log(porttaken) return porttaken; } @@ -383,11 +375,8 @@ function setuptmux(path, appfolder) { //patially tested, hopefullt works async function startredis(port) { - // console.log("this is my port in Start redis:", port); try{ - // console.log(process.cwd()) const p =$`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); - // console.log("terminated") } catch(error){ console.log(error) @@ -398,12 +387,10 @@ async function startredis(port) { //tested, works async function waitforredis(port){ while (true) { - // console.log("this is the port we have in waitforredis", port) try{ const p = await $`redis-cli -p ${port} -c PING` - // console.log("stdout for waitForRedis") - // console.log(p.stdout) + if (p.stdout.trim() === "PONG") { @@ -411,8 +398,6 @@ async function waitforredis(port){ } } catch(error){ - // console.log("Ponging reddis error") - console.log(error) } if (!NOVERBOSE) { console.log("Trying to find Redis server..."); @@ -450,13 +435,11 @@ async function resolvedata(Name) { //trim space left behind by hostname -I data = Name.split(/\s+/).join(''); - // console.log("THIS IS MY DATA INRESOLVE DATA" , data) } //tested working async function unpack(file,folder){ - // console.log("got to unpack") if(!old){ if(!fs.existsSync("./MANIFEST.txt")){ try{ @@ -475,7 +458,6 @@ async function unpack(file,folder){ catch(error){ forceRedo = true; } - // console.log("this is my forced red0 var", forceRedo) if(!forceRedo){ const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; @@ -540,7 +522,6 @@ async function runDevice(iport,dport,group){ async function main(){ - console.log("HI") let iport; let dport; let group; @@ -566,7 +547,6 @@ async function main(){ file, resume, } = jamrunParsArg(process.argv)) - console.log("HO") } @@ -577,7 +557,6 @@ async function main(){ } else{ show_usage() - console.log(error) process.exit(1) } } @@ -585,7 +564,6 @@ async function main(){ fileDirectorySetUp(file,app) const folder = getFolder(file,app) - // console.log(num) const ifile = path.resolve(file); process.chdir(folder); await unpack(ifile, folder) From 55b6f358b43f45c19e5c4c0ce425f20cb69b5ccc Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 25 Jul 2024 18:27:58 -0400 Subject: [PATCH 034/126] quick fixes --- tools/jamkill.mjs | 26 ++++++++++++-------------- tools/jamlist.mjs | 17 ++++++++++++----- tools/jamrun | 2 -- tools/jamrun.mjs | 22 +++++++++++----------- tools/parser.mjs | 10 ++++++---- 5 files changed, 41 insertions(+), 36 deletions(-) diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 21aa4c714..b9df61a04 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -5,9 +5,8 @@ import { cleanByPortNumber } from "./cleanUp.mjs"; /* IMPORTANT: fix it for the default name such as app_n - */ - - + Important +*/ export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() @@ -266,12 +265,11 @@ async function jamKillBruteForce(){ await $`ps aux | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill`.nothrow().quiet(); const jamfolder = getJamFolder(); //should I remove the apps as well or that is not required - try{ + if(fs.existsSync(`${jamfolder}/ports`)) fs.rmSync(`${jamfolder}/ports`, { recursive: true, force: true }) - } - catch(error){ - - } + if(fs.existsSync(`${jamfolder}/apps`)) + fs.rmSync(`${jamfolder}/apps`, { recursive: true, force: true }) + } async function main(){ @@ -310,15 +308,15 @@ async function main(){ } const jamfolder = getJamFolder(); const appfolder = getAppFolder(); - if( !fs.existsSync(jamfolder) ){ - throw new Error('.jamruns folder missing. JAMScript tools not setup?') - }; - if( !fs.existsSync(appfolder) ){ - throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') - }; if(args.flag === "reset"){ await jamKillBruteForce() } + else if( !fs.existsSync(jamfolder) ){ + throw new Error('.jamruns folder missing. JAMScript tools not setup?') + } + else if( !fs.existsSync(appfolder) ){ + throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') + } else{ await jamKill(args.flag , args.name); } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 6d1964e3f..9f094e94f 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -18,6 +18,9 @@ let watcher; function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() + if(!fs.existsSync(`${jamFolder}/ports`)){ + return appToPort; + } const activePorts = fs.readdirSync(`${jamFolder}/ports`) for(let port of activePorts){ const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); @@ -189,7 +192,7 @@ function filter(nodeinfo, filters){ } -function main(){ +async function main(){ let args; try{ args = getJamListArgs(process.argv) @@ -214,9 +217,7 @@ function main(){ } const filters = args.filters; const monitor = args.monitor; - if(monitor){ - watch(filters); - } + const jamfolder = getJamFolder() if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ @@ -228,7 +229,9 @@ function main(){ } + else if(!filters || filters === "all" || Object.keys(filter) === 0){ + await $`zx jamclean.mjs` const info = getNodeInfo(); lastInfo = info; if(info.length === 0 ){ @@ -243,6 +246,7 @@ function main(){ } else{ + await $`zx jamclean.mjs` const nodeinfo = getNodeInfo() const filtered = filter(nodeinfo, filters) lastInfo = filtered; @@ -255,11 +259,14 @@ function main(){ printHeader(); printNodeInfo(filtered); } + if(monitor){ + watch(filters); + } } (async () => { - main() + await main() })(); \ No newline at end of file diff --git a/tools/jamrun b/tools/jamrun index acbedc037..555f98f38 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -279,8 +279,6 @@ portavailable() { if [ $porttaken -eq 0 ]; then porttaken=`netstat -an -p tcp 2>/dev/null | grep $port | wc -l` - echo "this is my takken port" - echo $porttaken fi } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 9f8fb90d6..66fd1608c 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -5,7 +5,9 @@ import { cleanByPortNumber } from './cleanUp.mjs'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); -/*** +/***\ + * ///MAIN SCRIPT AND MY SCRIPT HAS A DEFAULT VALUE WHICH IS 127.0.0.1:6379. WHy? shouldn't it be undefinced? + * ///DOES NOT CONNECT TO THE MAIN CLOSEST ONE * QUESTION: * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? (don't use others mqtt) * 2----> logging system needs improvementm @@ -176,7 +178,9 @@ async function dojamout(iport, folder,jappid) { //tested.working async function dojamout_p1(pnum ,floc) { await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); + if(data){ + fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); + } fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); @@ -198,7 +202,6 @@ async function dojamout_p2(iport, folder, jappid, group=null){ //tested, working async function dojamout_p2_fg(pnum, floc,jappid, group=null){ - let argObject = { "--app":jappid, "--port":pnum, @@ -389,7 +392,7 @@ async function waitforredis(port){ while (true) { try{ - const p = await $`redis-cli -p ${port} -c PING` + const p = await $`redis-cli -p ${port} -c PING`.quiet() if (p.stdout.trim() === "PONG") { @@ -465,6 +468,7 @@ async function unpack(file,folder){ const ontime = Number(p2.stdout.toString().trim()); if(ntime > ontime){ try{ + console.log("outdated, unzippping again") await $`cd ${folder} && unzip -oq ${file}`.quiet() } catch(error){ @@ -500,6 +504,7 @@ async function getjdata(folder) { const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() return p.stdout.trim() + } @@ -526,7 +531,6 @@ async function main(){ let dport; let group; try{ - ({ app, tmux, @@ -548,7 +552,7 @@ async function main(){ resume, } = jamrunParsArg(process.argv)) } - + catch(error){ if(error.type === "ShowUsage"){ @@ -616,8 +620,7 @@ async function main(){ } - - if(jdata){ + if(jdata.toLowerCase() === "true"){ dport=iport + 20000; await resolvedata(`127.0.0.1:${dport}`) @@ -631,10 +634,7 @@ async function main(){ else await runNoneDevice(iport) - - } - await $`zx jamclean.mjs` await main() diff --git a/tools/parser.mjs b/tools/parser.mjs index 3b9c0c6ce..a9af09c1d 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -25,7 +25,8 @@ const jamrunOptionDefinitions = [ {name : 'num', type: Number , defaultValue: 1}, {name : 'loc', type: String , defaultValue: `${long},${lat}`}, {name : 'edge', type: Number , defaultValue: 1}, - {name : 'data', type: String , defaultValue: "127.0.0.1:6379"}, +// {name : 'data', type: String , defaultValue: "127.0.0.1:6379"}, + {name : 'data', type: String , defaultValue: undefined}, {name : 'fog', type: Boolean, defaultValue: false}, {name : 'cloud', type: Boolean, defaultValue: false}, {name : 'device', type: Boolean, defaultValue: false}, @@ -163,6 +164,7 @@ function SetJamrunVar(options){ if(!("tags" in AssignedVar)){ AssignedVar["tags"] = undefined; } + return AssignedVar; } @@ -237,7 +239,7 @@ export function getJamListArgs(argv){ catch(error){ } if(options?.help || !options){ - console.log("DON") + const error = new Error("SHOW USAGE") error.type = "ShowUsage" throw error; @@ -284,7 +286,7 @@ export function getKilltArgs(argv){ catch(error){ } - console.log(options, "these are my options") + if(options === undefined || options.help){ const error = new Error("SHOW USAGE") error.type = "ShowUsage" @@ -324,7 +326,7 @@ export function getKilltArgs(argv){ else{ flag = "program"; } - console.log(flag, "this is my flag") + return {"flag": flag, "name" : options.name} } From 6fd49ad0f78fbc7fc8d0f614ac5a9f59bf67835b Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 25 Jul 2024 23:48:36 -0400 Subject: [PATCH 035/126] before pause(potential revert required) --- tools/cleanUp.mjs | 39 +++++++++--- tools/jamclean.mjs | 6 +- tools/jamkill.mjs | 43 +++++++++---- tools/jamlist.mjs | 11 +++- tools/jamlog.mjs | 147 +++++++++++++++++++++++++++++++++++++++++++++ tools/jamrun.mjs | 43 ++++++++++--- tools/parser.mjs | 69 +++++++++++++++------ 7 files changed, 306 insertions(+), 52 deletions(-) create mode 100644 tools/jamlog.mjs diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 0472b370a..242d0d242 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env zx -import {getJamFolder, getPaths} from './fileDirectory.mjs' +import {getJamFolder,getAppFolder, getPaths} from './fileDirectory.mjs' const { spawnSync } = require('child_process'); const p = spawnSync('which', ['tmux']); const TMUX = p.stdout.toString().trim() @@ -89,22 +89,25 @@ function ArchiveLog(removablePort, appName, programName){ if(fs.existsSync(`${folder}/${removablePort}`)){ process.chdir(`${folder}/${removablePort}`); const logs = fs.readdirSync('.').filter( (entry) => entry.includes("log")) - if(!fs.existsSync(`${folder}/log`)){ - fs.mkdirSync(`${folder}/log`); + + if(!logs || logs.length === 0 ){ + return + } + if(!fs.existsSync(`${folder}/log/${removablePort}`,{recursive: true})){ + fs.mkdirSync(`${folder}/log/${removablePort}`,{recursive: true}); } - fs.writeFileSync(`${folder}/log/${removablePort}`, "logs\n-------------\n" ) - console.log(logs) + fs.writeFileSync(`${folder}/log/${removablePort}/log.c`,"----") + fs.writeFileSync(`${folder}/log/${removablePort}/log.j`,"----") for(const log of logs){ if(log.includes("j")){ const data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log/${removablePort}`, `:\n-------------\n J Log:\n-------------\n`); - fs.appendFileSync(`${folder}/log/${removablePort}`, data); + fs.appendFileSync(`${folder}/log/${removablePort}/\n-------------\nlog.j`, data); } else{ const workerNumber = log.split(".")[1]; const data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log/${removablePort}`, `\n-------------\n woker number ${workerNumber} Log:\n-------------\n`); - fs.appendFileSync(`${folder}/log/${removablePort}`, data); + fs.appendFileSync(`${folder}/log/${removablePort}/log.c`, `\n-------------\nworker number ${workerNumber}:`); + fs.appendFileSync(`${folder}/log/${removablePort}/log.c`, data); } } @@ -124,6 +127,11 @@ function cleanAppDir(removablePort,appName, programName){ return false; } +function markPause(PortNumber,appName ,programName){ + const appfolder = getAppFolder() + const pName = programName.split(".")[0] + fs.writeFileSync(`${appfolder}/${pName}_${appName}/${PortNumber}/paused`, `${PortNumber}`) +} export function cleanup(removablePort, tmuxIds,app,TMUX){ cleanPort(removablePort,app); ArchiveLog(removablePort); @@ -156,3 +164,16 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr console.log(`port ${PortNumber} is cleaned for ${programName.split(".")[0]}_${appName}`) } }; + +export function pauseByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ + if(!programName || !appName || !PortNumber){ + if(!NOVERBOSE) + console.log("NO NEED FOR CLEANING") + return; + } + const tmuxIds = killtmux(PortNumber,appName ,programName); + if(!NOVERBOSE && tmuxIds) + console.log("Killed :", tmuxIds) + markPause(PortNumber,appName ,programName) + +}; \ No newline at end of file diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 1de194306..0b8ce4bb7 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -227,7 +227,7 @@ async function isCfileRunning(Dir,port,num){ const workerNum = num; const appFolder = getAppFolder() const cdevID = `${appFolder}/${myAppDir}/${portNum}/cdevProcessId.${workerNum}` - //make sure j file is getting the time to write to filedirectory + if(!fs.existsSync(`${cdevID}`)){ return false; } @@ -323,6 +323,10 @@ async function clean(){ } const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") for(let dir of dirs){ + const isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) === "true") ? true : false + if(isPaused){ + continue; + } //mosquitto not running kill if(!await isMosquittoRunning(port)){ await $`zx jamkill.mjs --port --name=${port}` diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index b9df61a04..f25c61a65 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env zx import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" -import { cleanByPortNumber } from "./cleanUp.mjs"; +import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; /* IMPORTANT: fix it for the default name such as app_n @@ -209,7 +209,12 @@ async function killProcess(data){ await killJFile(data); } -async function jamKill(flag, name) +async function pauseProcess(data){ + await killJamRun(data); + await killJFile(data); +} + +async function jamKill(flag, name, pause) { console.log("KILLING PROCESS STARTING") let jamData; @@ -245,16 +250,30 @@ async function jamKill(flag, name) } } - for(let data of jamData){ - console.log(data) - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - console.log("got here1") - await killProcess(data); - console.log("got here2") - cleanByPortNumber(programName,appName,portNumber) + console.log(pause) + if(pause){ + for(let data of jamData){ + console.log(data) + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + pauseByPortNumber(programName,appName,portNumber) + await pauseProcess(data); + + + } } + else{ + for(let data of jamData){ + console.log(data) + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + await killProcess(data); + cleanByPortNumber(programName,appName,portNumber) + } + } + } @@ -318,7 +337,7 @@ async function main(){ throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') } else{ - await jamKill(args.flag , args.name); + await jamKill(args.flag , args.name, args.pause); } } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 9f094e94f..e7549b3d2 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -151,6 +151,13 @@ function getNodeInfo(){ fileNames["portNum"] = String(port) fileNames["appName"] = appName fileNames["programName"] = programName + if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() === "true"){ + fileNames["status"] = "paused" + } + else{ + fileNames["status"] = "running" + + } nodeInfo.push(fileNames) } @@ -163,14 +170,14 @@ function printNodeInfo(info){ for (let row of info){ - const headerString = ` ${row["appName"].padEnd(15)} ${row["programName"].padEnd(15)} ${("Local:"+row["portNum"]).padEnd(15)} ${row["parentId"].padEnd(15)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(15)} ${row["numCnodes"].padEnd(15)} ${row["tmuxid"].padEnd(15)}`; + const headerString = ` ${row["appName"].padEnd(10)} ${row["programName"].padEnd(10)} ${("Local:"+row["portNum"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)}`; console.log(headerString) } } function printHeader(){ - const headerString = ` ${"NAME".padEnd(15)} ${"PROGRAM".padEnd(15)} ${"HOST".padEnd(15)} ${"PARENT".padEnd(15)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(15)} ${"C-NODES".padEnd(15)} ${"TMUX-ID".padEnd(15)}`; + const headerString = ` ${"NAME".padEnd(10)} ${"PROGRAM".padEnd(10)} ${"HOST".padEnd(10)} ${"PARENT".padEnd(10)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(10)} ${"C-NODES".padEnd(10)} ${"TMUX-ID".padEnd(10)} ${"STATUS".padEnd(10)}`; console.log(headerString) } diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs new file mode 100644 index 000000000..d980c7df3 --- /dev/null +++ b/tools/jamlog.mjs @@ -0,0 +1,147 @@ +#!/usr/bin/env zx +import { getAppFolder } from "./fileDirectory.mjs"; +import { getLogArgs } from "./parser.mjs"; +const readline = require('readline'); + + +function printlog(path,tail){ + + if (tail) { + const fileName = path.split("/").pop(); + + if (fileName.includes("j")) { + return new Promise((resolve) =>{ + console.log(`\nLast ${tail} lines of J-File\n------`); + const myLineJ = readline.createInterface({ + input: fs.createReadStream(path), + }); + + const linesJ = []; + myLineJ.on('line', (line) => { + linesJ.push(line); + if (linesJ.length > tail) { + linesJ.shift(); + } + }); + console.log("GOT HERER 2") + + myLineJ.on('close', () => { + console.log(linesJ.join('\n')); + resolve() + }); + }) + + + } else { + return new Promise((resolve) =>{ + console.log(`Last ${tail} lines of C-NODES`); + const myLineC = readline.createInterface({ + input: fs.createReadStream(path), + }); + + const linesC = []; + let header; + let cNode = []; + myLineC.on('line', (line) => { + if (line.includes('worker number')) { + if (cNode.length !== 0) { + linesC.push(header) + linesC.push(cNode.join("\n")); + header = line; + } + } + cNode.push(line); + if (cNode.length > tail) { + cNode.shift(); + } + }); + + myLineC.on('close', () => { + console.log(linesC.join('\n')); + resolve() + }); + }) + + } + + } + + else{ + const data = fs.readFileSync(path, 'utf8'); + console.log(data); + } +} + +async function main(){ + let arg; + try{ + arg = getLogArgs(process.argv) + } + catch(error){ + if(error.type = "ShowUsage"){ + console.log( + ` + Usage: jamlist [--app=appl_name] + + Lists details about all activated instances of JAMScript programs. Use the --app=X + option to limit the listing to programs that match the given name (i.e., X). + ` + + ) + process.exit(1); + } + } + const flag = arg.flag; + const port =Number(arg.file.split("/")[ arg.file.split("/").length-1]); + const logFiles =arg.file.split("/")[0]+"/log"; + const tail = arg.tail + const appFolder = getAppFolder() + const path = `${appFolder}/${logFiles}/${port}` + + if(port){ + + if(!fs.existsSync(path)){ + console.log(`THERE IS NO LOG ON ${port} for ${logFiles.split("/")[0]}`) + } + + if(flag === "all"){ + if(!fs.existsSync(`${path}/log.j`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + + await printlog(`${path}/log.j`,tail) + + } + if(!fs.existsSync(`${path}/log.c`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlog(`${path}/log.c`,tail) + } + } + else if(flag === "j"){ + if(!fs.existsSync(`${path}/log.j`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlog(`${path}/log.j`,tail) + } + } + else if(flag === "c"){ + if(!fs.existsSync(`${path}/log.c`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlog(`${path}/log.c`,tail) + } + } + } + +} + + +(async () =>{ + await main() + +})() \ No newline at end of file diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 66fd1608c..bf72868e1 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -182,6 +182,7 @@ async function dojamout_p1(pnum ,floc) { fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); } fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); + fs.writeFileSync(`${floc}/${pnum}/paused`, "false\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); if(Type === "device"){ @@ -218,18 +219,42 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ let jargs = getJargs(argObject) const command = 'node'; const args = ['jstart.js', ...jargs]; - const options = { - cwd: floc, - stdio: 'inherit' - }; + if(resume){ console.log("############## RESUME ##############") } + if(log){ + const options = { + cwd: floc, + stdio: ['pipe', 'pipe', 'pipe'] + }; + const stream = fs.createWriteStream(`${floc}/${pnum}/log.j`, { flags: 'a' }); + const child = spawn(command, args, options); + child.stdout.on('data', (data) => { + process.stdout.write(data); + stream.write(data); + }); + + child.stderr.on('data', (data) => { + process.stderr.write(data); + stream.write(data); + }); + + child.on('exit', () => { + process.kill(process.pid, 'SIGTERM'); + }); + + }else{ + const options = { + cwd: floc, + stdio: 'inherit' + }; + const child = spawn(command, args, options); + child.on('exit', () => { + process.kill(process.pid, 'SIGTERM'); + }); + } - const child = spawn(command, args, options); - child.on('exit', () => { - process.kill(process.pid, 'SIGTERM'); - }); } @@ -417,7 +442,7 @@ async function waitforredis(port){ //tested, works async function setupredis(port) { - + //QUESTION: how would it work if multiple apps are using the same reddis? how would the flush work. how any of this work? await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` diff --git a/tools/parser.mjs b/tools/parser.mjs index a9af09c1d..bc7c48830 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -63,12 +63,22 @@ const jamkillOptionDefinition = [ {name : 'dir', type: Boolean , defaultValue: false }, {name : 'port', type: Boolean , defaultValue: false }, {name: "portDir", type: Boolean, defaultValue: false }, - {name : 'name', alias : "n" , type: String , defaultValue: false }, + {name: "pause", type: Boolean, defaultValue: false }, + {name : 'name', alias : "n" , type: String , defaultValue: undefined }, ]; -const jamcleanOptionDefinition = [ +const jamclogOptionDefinition = [ {name : "help", alias : "h", type: Boolean, defaultValue : false }, - {name : "reset", alias: "r", type: Boolean, defaultValue : false } + {name : "program", type: String, defaultValue : undefined }, + {name : "app", type: String, defaultValue : undefined }, + {name: "port", type:String, defaultValue: undefined}, + {name : "j", alias: "j", type: Boolean, defaultValue : false }, + {name : "c", alias: "c", type: Boolean, defaultValue : false }, + {name : "tail", alias: "t", type: Number, defaultValue : undefined }, + + + + ]; @@ -327,29 +337,50 @@ export function getKilltArgs(argv){ flag = "program"; } - return {"flag": flag, "name" : options.name} + return {"flag": flag, "name" : options.name, "pause": options.pause} } -// export function getcleanArgs(argv){ -// const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs') && !entry.includes('jamlist.mjs'))) -// let options +export function getLogArgs(argv){ + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog.mjs') )) + let options + let file; + let flag; + try{ + options = commandLineArgs(jamclogOptionDefinition, {argv: args}); + + } + catch(error){ + console.log(error) + } + + + if(options === undefined || options.help){ + const error = new Error("SHOW USAGE") + error.type = "ShowUsage" + throw error; + } -// try{ -// options = commandLineArgs(jamcleanOptionDefinition, {argv: args}); -// } -// catch(error){ -// } + else if(!options.program || !options.app || !options.port){ + throw new Error("Missing programName or appName or port") + } + else if(options.port && options.app && options.program){ + file = `${options.program}_${options.app}/${options.port}` + } + else{ + file = `${options.program}_${options.app}` + } + if((options.j && options.c) || (!options.c && !options.j)){ + flag = "all" + } + else{ + flag = (options.j)? "j" : "c" + } + return {file : file , flag : flag, tail : options.tail} -// if(options === undefined || options.help){ -// const error = new Error("SHOW USAGE") -// error.type = "ShowUsage" -// throw error; -// } -// return "reset" -// } +} From 0fc3c6515014318c62dbce9c437b9cd41c29eac8 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 26 Jul 2024 14:38:45 -0400 Subject: [PATCH 036/126] pre resume changes --- tools/cleanUp.mjs | 23 +++--- tools/jamclean.mjs | 3 +- tools/jamkill.mjs | 4 + tools/jamlist.mjs | 5 +- tools/jamlog.mjs | 198 ++++++++++++++++++++++++++++++++------------- tools/jamrun.mjs | 72 +++++++++++++++-- tools/parser.mjs | 5 +- 7 files changed, 234 insertions(+), 76 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 242d0d242..57878022b 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -96,17 +96,17 @@ function ArchiveLog(removablePort, appName, programName){ if(!fs.existsSync(`${folder}/log/${removablePort}`,{recursive: true})){ fs.mkdirSync(`${folder}/log/${removablePort}`,{recursive: true}); } - fs.writeFileSync(`${folder}/log/${removablePort}/log.c`,"----") - fs.writeFileSync(`${folder}/log/${removablePort}/log.j`,"----") + fs.writeFileSync(`${folder}/log/${removablePort}/log.c`,"---") + fs.writeFileSync(`${folder}/log/${removablePort}/log.j`,"---") for(const log of logs){ if(log.includes("j")){ const data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log/${removablePort}/\n-------------\nlog.j`, data); + fs.appendFileSync(`${folder}/log/${removablePort}/log.j`, data); } else{ const workerNumber = log.split(".")[1]; const data = fs.readFileSync(log) - fs.appendFileSync(`${folder}/log/${removablePort}/log.c`, `\n-------------\nworker number ${workerNumber}:`); + fs.appendFileSync(`${folder}/log/${removablePort}/log.c`, `\nworker number ${workerNumber}:\n`); fs.appendFileSync(`${folder}/log/${removablePort}/log.c`, data); } @@ -132,14 +132,16 @@ function markPause(PortNumber,appName ,programName){ const pName = programName.split(".")[0] fs.writeFileSync(`${appfolder}/${pName}_${appName}/${PortNumber}/paused`, `${PortNumber}`) } -export function cleanup(removablePort, tmuxIds,app,TMUX){ - cleanPort(removablePort,app); - ArchiveLog(removablePort); - cleanAppDir(removablePort); - killtmux(tmuxIds,TMUX); -} +// export function cleanup(removablePort, tmuxIds,app,TMUX){ +// cleanPort(removablePort,app); +// ArchiveLog(removablePort); +// cleanAppDir(removablePort); +// killtmux(tmuxIds,TMUX); +// } export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ + console.log("killing port") + if(!programName || !appName || !PortNumber){ if(!NOVERBOSE) console.log("NO NEED FOR CLEANING") @@ -166,6 +168,7 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr }; export function pauseByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ + console.log("pausing port") if(!programName || !appName || !PortNumber){ if(!NOVERBOSE) console.log("NO NEED FOR CLEANING") diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 0b8ce4bb7..ba7fb5b0b 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -323,12 +323,13 @@ async function clean(){ } const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") for(let dir of dirs){ - const isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) === "true") ? true : false + const isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false if(isPaused){ continue; } //mosquitto not running kill if(!await isMosquittoRunning(port)){ + console.log("gotHERE") await $`zx jamkill.mjs --port --name=${port}` continue portLoop; } diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index f25c61a65..b02c8307c 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -252,6 +252,7 @@ async function jamKill(flag, name, pause) } console.log(pause) if(pause){ + console.log("Pausing from jam kill") for(let data of jamData){ console.log(data) const appName = data.appName; @@ -264,7 +265,9 @@ async function jamKill(flag, name, pause) } } else{ + console.log("KILL,KILL") for(let data of jamData){ + console.log("I GET HERE") console.log(data) const appName = data.appName; const programName = data.programName @@ -328,6 +331,7 @@ async function main(){ const jamfolder = getJamFolder(); const appfolder = getAppFolder(); if(args.flag === "reset"){ + console.log("kill reset") await jamKillBruteForce() } else if( !fs.existsSync(jamfolder) ){ diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index e7549b3d2..bd0c1206d 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -45,6 +45,7 @@ function getWatchList(){ for(let dir of dirs.keys()){ for(let port of dirs.get(dir)){ watchList.push(`${appFolder}/${dir}/${port}/numCnodes`) + watchList.push(`${appFolder}/${dir}/${port}/paused`) } } return watchList @@ -58,8 +59,8 @@ function watch(filters) { await $`zx jamclean.mjs` }, 1000); function updateWatchList(watchList){ - const newWatchList = getWatchList(); + const newWatchList = getWatchList(); for(let item of newWatchList){ if(!watchList.includes(item)){ watcher.add(item) @@ -151,7 +152,7 @@ function getNodeInfo(){ fileNames["portNum"] = String(port) fileNames["appName"] = appName fileNames["programName"] = programName - if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() === "true"){ + if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ fileNames["status"] = "paused" } else{ diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs index d980c7df3..e301b9bf1 100644 --- a/tools/jamlog.mjs +++ b/tools/jamlog.mjs @@ -4,37 +4,21 @@ import { getLogArgs } from "./parser.mjs"; const readline = require('readline'); -function printlog(path,tail){ - - if (tail) { +function printlogArchived(path,tail){ + const appfolder = getAppFolder() + if(tail) { const fileName = path.split("/").pop(); if (fileName.includes("j")) { - return new Promise((resolve) =>{ - console.log(`\nLast ${tail} lines of J-File\n------`); - const myLineJ = readline.createInterface({ - input: fs.createReadStream(path), - }); - - const linesJ = []; - myLineJ.on('line', (line) => { - linesJ.push(line); - if (linesJ.length > tail) { - linesJ.shift(); - } - }); - console.log("GOT HERER 2") - - myLineJ.on('close', () => { - console.log(linesJ.join('\n')); - resolve() - }); - }) - + const string = (fs.readFileSync(`${path}`).toString().trim()) + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number J file \n---`) + console.log(lastNLines.join('\n')) } else { return new Promise((resolve) =>{ - console.log(`Last ${tail} lines of C-NODES`); + console.log(`\nLast ${tail} lines of C-NODES`); const myLineC = readline.createInterface({ input: fs.createReadStream(path), }); @@ -45,20 +29,34 @@ function printlog(path,tail){ myLineC.on('line', (line) => { if (line.includes('worker number')) { if (cNode.length !== 0) { + // linesC.push("---") linesC.push(header) + linesC.push("---") linesC.push(cNode.join("\n")); - header = line; + } + header = line + + } - cNode.push(line); - if (cNode.length > tail) { - cNode.shift(); - } + + cNode.push(line); + if (cNode.length > tail) { + cNode.shift(); + } + }); myLineC.on('close', () => { - console.log(linesC.join('\n')); - resolve() + + // linesC.push("---") + linesC.push(header) + linesC.push("---") + linesC.push(cNode.join("\n")); + + + console.log(linesC.join('\n')); + resolve() }); }) @@ -72,6 +70,8 @@ function printlog(path,tail){ } } + + async function main(){ let arg; try{ @@ -97,46 +97,134 @@ async function main(){ const tail = arg.tail const appFolder = getAppFolder() const path = `${appFolder}/${logFiles}/${port}` - - if(port){ - - if(!fs.existsSync(path)){ - console.log(`THERE IS NO LOG ON ${port} for ${logFiles.split("/")[0]}`) - } - + if(fs.existsSync(`${appFolder}/${arg.file}`)){ if(flag === "all"){ - if(!fs.existsSync(`${path}/log.j`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ + console.log("we do not have the log file for j files") + } + const string = (fs.readFileSync(`${appFolder}/${arg.file}/log.j`).toString().trim()) + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number J file \n---`) + console.log(lastNLines.join('\n')) } else{ - - await printlog(`${path}/log.j`,tail) - + + + console.log(`---\nworker number J file \n---`) + console.log(string) } - if(!fs.existsSync(`${path}/log.c`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + + const cFiles = fs.readdirSync(`${appFolder}/${arg.file}`).filter((entry) => (entry.includes("log") && !entry.includes(".j"))); + if(cFiles.length === 0 ){ + console.log("we do not have the log files for c files") } else{ - await printlog(`${path}/log.c`,tail) + for(let cFile of cFiles ){ + const string = fs.readFileSync(`${appFolder}/${arg.file}/${cFile}`).toString().trim() + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + + console.log(lastNLines.join('\n')) + } + else{ + + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + console.log(string) + } + } } - } + + } else if(flag === "j"){ - if(!fs.existsSync(`${path}/log.j`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + + if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ + console.log("we do not have the log file for j files") + } + const string = (fs.readFileSync(`${appFolder}/${arg.file}/log.j`).toString().trim()) + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number J file \n---`) + console.log(lastNLines.join('\n')) } else{ - await printlog(`${path}/log.j`,tail) + + + console.log(`---\nworker number J file \n---`) + console.log(string) } + } - else if(flag === "c"){ - if(!fs.existsSync(`${path}/log.c`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + else{ + const cFiles = fs.readdirSync(`${appFolder}/${arg.file}`).filter((entry) => (entry.includes("log") && !entry.includes(".j"))); + if(cFiles.length === 0 ){ + console.log("we do not have the log files for c files") } else{ - await printlog(`${path}/log.c`,tail) + for(let cFile of cFiles ){ + const string = fs.readFileSync(`${appFolder}/${arg.file}/${cFile}`).toString().trim() + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + + console.log(lastNLines.join('\n')) + } + else{ + + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + console.log(string) + } + } + } + + } + } + else{ + if(port){ + if(!fs.existsSync(path)){ + console.log(`THERE IS NO LOG ON ${port} for ${logFiles.split("/")[0]}`) + } + + if(flag === "all"){ + if(!fs.existsSync(`${path}/log.j`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + + await printlogArchived(`${path}/log.j`,tail) + + } + if(!fs.existsSync(`${path}/log.c`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlogArchived(`${path}/log.c`,tail) + } + } + else if(flag === "j"){ + if(!fs.existsSync(`${path}/log.j`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlogArchived(`${path}/log.j`,tail) + } + } + else if(flag === "c"){ + if(!fs.existsSync(`${path}/log.c`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlogArchived(`${path}/log.c`,tail) + } } } } + } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index bf72868e1..6482275de 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env zx import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; -import { cleanByPortNumber } from './cleanUp.mjs'; +import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); @@ -34,13 +34,58 @@ ADD GIT LOG */ // //global variables -let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume; +let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port; const tmuxIds = []; let removablePort //SETUP CLEANING -process.on('SIGINT', () => {cleanByPortNumber(file,app,removablePort,NOVERBOSE); process.exit();}); -process.on('SIGTERM', () => {cleanByPortNumber(file,app,removablePort,NOVERBOSE); process.exit();}); +process.on('SIGINT', () => { + if(removablePort){ + const toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() + console.log(toPause); + if(toPause !== "false"){ + console.log("Cleaning") + pauseByPortNumber(file,app,removablePort,NOVERBOSE) + process.exit(); + + } + else{ + console.log("Killing") + cleanByPortNumber(file,app,removablePort,NOVERBOSE); + process.exit(); + } + } + else{ + console.log("Killing") + cleanByPortNumber(file,app,removablePort,NOVERBOSE); + process.exit(); + } +}); +process.on('SIGTERM', () => { + if(removablePort){ + const toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() + console.log(toPause); + if(toPause !== "false"){ + console.log("Cleaning") + pauseByPortNumber(file,app,removablePort,NOVERBOSE) + process.exit(); + + } + else{ + console.log("Killing") + cleanByPortNumber(file,app,removablePort,NOVERBOSE); + process.exit(); + } + } + else{ + console.log("Killing") + + cleanByPortNumber(file,app,removablePort,NOVERBOSE); + process.exit(); + } + + +}); //MOVE HOME TO CONST FILE @@ -251,6 +296,7 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ }; const child = spawn(command, args, options); child.on('exit', () => { + console.log("sending sig term") process.kill(process.pid, 'SIGTERM'); }); } @@ -363,7 +409,6 @@ async function portavailable(folder,port) { } if(pid === "new"){ - porttaken=1; } else if(pid){ @@ -575,6 +620,7 @@ async function main(){ tags, file, resume, + port } = jamrunParsArg(process.argv)) } @@ -589,8 +635,22 @@ async function main(){ process.exit(1) } } - + if(resume){ + if(!port){ + console.log("can't resume the app without port number") + } + const folder = getFolder(file,app); + process.chdir(folder); + console.log(process.cwd()) + + + + } + + else{ + + } fileDirectorySetUp(file,app) const folder = getFolder(file,app) const ifile = path.resolve(file); diff --git a/tools/parser.mjs b/tools/parser.mjs index bc7c48830..2815981db 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -1,5 +1,6 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; +import { string } from 'random-js'; import { fs } from 'zx'; const path = require('path'); const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; @@ -31,7 +32,6 @@ const jamrunOptionDefinitions = [ {name : 'cloud', type: Boolean, defaultValue: false}, {name : 'device', type: Boolean, defaultValue: false}, {name : 'local_registry', type: Boolean, defaultValue: false}, - {name : 'temp_broker', type: Boolean, defaultValue: false}, {name : 'bg', type: Boolean, defaultValue: false}, {name : 'verb', type: Boolean, defaultValue: false}, {name : 'log', type: Boolean, defaultValue: false}, @@ -39,7 +39,8 @@ const jamrunOptionDefinitions = [ {name : 'local', type: Boolean, defaultValue: false}, {name : 'valgrind', type: Boolean, defaultValue: false}, {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, - {name : 'resume', type: Boolean, defaultValue: false}, + {name: 'resume', type: Boolean, defaultValue: false}, + {name: "port", type: String, defaultValue: undefined}, ]; const jamlistOptionDefinition = [ From 4a587333ddb1104c8fa9b90a810bffe44ff8b6d8 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 26 Jul 2024 18:08:05 -0400 Subject: [PATCH 037/126] remote changes stashed --- tools/fileDirectory.mjs | 6 +- tools/jamclean.mjs | 7 +- tools/jamkill.mjs | 15 +++- tools/jamrun.mjs | 182 +++++++++++++++++++++++++--------------- tools/parser.mjs | 2 +- 5 files changed, 137 insertions(+), 75 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index cc3d98ef2..9981ecf94 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -46,12 +46,16 @@ export function getPaths(file,app){ export function getFolder(file,app){ const jamfolder=`${HOME}/.jamruns` const appfolder=`${jamfolder}/apps`; - const filenoext = path.basename(file, path.extname(file)); + const filenoext = path.basename(file, path.extname(file)); const folder=`${appfolder}/${filenoext}_${app}` return folder; } +export function getFileNoext(file){ + return path.basename(file, path.extname(file)); +} + export async function getAppFolderAndSubDir(){ const jamfolder=`${HOME}/.jamruns` const appfolder=`${jamfolder}/apps`; diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index ba7fb5b0b..377670f7e 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -193,9 +193,10 @@ async function isJfileRunning(dir,portNum){ if(!fs.existsSync(`${processId}`)){ return false; } - const pid = fs.readFileSync(`${processId}`).toString().trim(); - - + let pid = fs.readFileSync(`${processId}`).toString().trim(); + if(pid === "new"){ + return false; + } let running; try{ const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index b02c8307c..96216f17e 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -255,13 +255,24 @@ async function jamKill(flag, name, pause) console.log("Pausing from jam kill") for(let data of jamData){ console.log(data) + let appfolder = getAppFolder() const appName = data.appName; const programName = data.programName const portNumber = data.portNumber + if( + (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`)) || + (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/numCnodes`)) || + (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/mqtt.conf`)) || + (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/dataStore`)) || + (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`)) + ){ + console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) + } + if(fs.readFileSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`).toString().trim() === "new"){ + console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) + } pauseByPortNumber(programName,appName,portNumber) await pauseProcess(data); - - } } else{ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 6482275de..a8dbc08ad 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -2,12 +2,13 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder} from './fileDirectory.mjs' +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); /***\ * ///MAIN SCRIPT AND MY SCRIPT HAS A DEFAULT VALUE WHICH IS 127.0.0.1:6379. WHy? shouldn't it be undefinced? * ///DOES NOT CONNECT TO THE MAIN CLOSEST ONE + * //CONNECTING TO THE SAME REDIS CAN CAUSE MULTIPLE PROBLEMS(THE INTERACT WITH EACHOTHERS IN A WEIRD WAY) * QUESTION: * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? (don't use others mqtt) * 2----> logging system needs improvementm @@ -394,45 +395,31 @@ async function doaout(num,port,group,datap,myf,jappid){ //tested. working async function portavailable(folder,port) { - let pid; let porttaken; const jamFolder = getJamFolder() if(fs.existsSync(`${folder}/${port}`)){ - - if(fs.existsSync(`${folder}/${port}/processId`)){ - - try{ - pid = Number(fs.readFileSync(`${folder}/${port}/processId`).toString().trim()) - } - catch(error){ - pid = null; - } - - if(pid === "new"){ - porttaken=1; - } - else if(pid){ - - const p = await $`ps -o pid= -p ${pid} | wc -l | tr -d '[:space:]'`.nothrow() - porttaken = Number(p.stdout.toString().trim()) - } - else{ - porttaken=0; - } - } - else{ - porttaken=0; - } + porttaken=1 } - else{ porttaken=0; } if(porttaken === 0){ - if(!fs.existsSync(`${jamFolder}/ports`)){ + if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() + console.log(Number(p.stdout.trim())) porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; + + } + else{ + const runningApps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split(); + const fileNoExt = getFileNoext(file) + if(runningApps.includes(`${fileNoExt}_${app}`)){ + porttaken = 1; + } + else{ + porttaken = 0; + } } } return porttaken; @@ -491,6 +478,7 @@ async function setupredis(port) { await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` + //IMPORTANT: flushing redis if(!resume){ await $`redis-cli -p ${port} FLUSHALL`; } @@ -635,68 +623,124 @@ async function main(){ process.exit(1) } } - + let folder; + let ifile; + let jdata; if(resume){ + const fileNoExt = getFileNoext(file) if(!port){ console.log("can't resume the app without port number") + process.exit(1) + } - const folder = getFolder(file,app); - process.chdir(folder); - console.log(process.cwd()) + folder = getFolder(file,app); + if(!fs.existsSync(folder)){ + console.log("NO PAUSED INSTANCE OF", `${fileNoExt}_${app}` ) + process.exit(1) - + } + if(!fs.existsSync(`${folder}/${port}`) || !fs.existsSync(`${folder}/${port}/paused`)){ + console.log("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) + process.exit(1) + } + else{ + const isPaused = (fs.readFileSync(`${folder}/${port}/paused`).toString().trim()) === "false" ? false : true; + if(!isPaused){ + console.log("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) + process.exit(1) + } + + } + if(num, data, Type){ + console.log("IN CASE OF RESUMING, WILL NOT USE ANY OF NUM, DATA, TYPE ARGUMENTS.") + } + // num = fs.readFileSync(`${folder}/${port}/numCnodes`).toString().trim(); + Type = fs.readFileSync(`${folder}/${port}/machType`).toString().trim(); + // data = fs.readFileSync(`${folder}/${port}/dataStore`).toString().trim(); + // process.chdir(folder); + // iport = port; + process.chdir(folder); + isValidExecutable(); + jdata = await getjdata(folder); } - else{ - + if(port){ + console.log("Warning. If it's not to resume the port argument will not be used") + } + fileDirectorySetUp(file,app) + folder = getFolder(file,app) + ifile = path.resolve(file); + process.chdir(folder); + await unpack(ifile, folder) + isValidExecutable() + jdata = await getjdata(folder); } - fileDirectorySetUp(file,app) - const folder = getFolder(file,app) - const ifile = path.resolve(file); - process.chdir(folder); - await unpack(ifile, folder) - isValidExecutable() - const jdata = await getjdata(folder); + let isDevice; + switch(Type){ case "cloud": - iport=9883 - isDevice = false; - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; + if(resume){ + iport = port; + removablePort = port; + isDevice = false; + } + else{ + iport=9883 + isDevice = false; + + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; } - iport++; + removablePort = iport; } - removablePort = iport; break; case "fog": - iport=5883 - isDevice = false - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; + if(resume){ + iport = port; + removablePort = port; + isDevice = false; + } + else{ + iport=5883 + isDevice = false + while(true){ + + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; } - iport++; + removablePort = iport; } - removablePort = iport; + break; case "device": - iport=1883; - isDevice = true; - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; + if(resume){ + iport = port; + removablePort = port; + isDevice = true; + } + else{ + iport=1883; + isDevice = true; + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; } - iport++; + removablePort = iport; } - removablePort = iport; if(!local){ group= iport-1882 } @@ -719,7 +763,9 @@ async function main(){ else await runNoneDevice(iport) -} + } + + await $`zx jamclean.mjs` await main() diff --git a/tools/parser.mjs b/tools/parser.mjs index 2815981db..11518ba3c 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -40,7 +40,7 @@ const jamrunOptionDefinitions = [ {name : 'valgrind', type: Boolean, defaultValue: false}, {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, {name: 'resume', type: Boolean, defaultValue: false}, - {name: "port", type: String, defaultValue: undefined}, + {name: "port", type: Number, defaultValue: undefined}, ]; const jamlistOptionDefinition = [ From bb8aba6f4d675774d6f4846fa4bed55dec1d82a1 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 26 Jul 2024 23:34:41 -0400 Subject: [PATCH 038/126] added the usage(not final v) --- tools/jamkill.mjs | 25 +++++++++++++++++++------ tools/jamlist.mjs | 16 +++++++++++----- tools/jamlog.mjs | 18 ++++++++++++++++-- tools/jamrun.mjs | 36 ++++++++++++++++-------------------- tools/parser.mjs | 1 - 5 files changed, 62 insertions(+), 34 deletions(-) diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 96216f17e..ef4109f74 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -3,10 +3,7 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; -/* - IMPORTANT: fix it for the default name such as app_n - Important -*/ + export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() @@ -317,6 +314,18 @@ async function main(){ console.log(error) if(error.type === "ShowUsage"){ console.log( + /** + {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : 'all', type: Boolean , defaultValue: false }, + {name : 'reset', type: Boolean , defaultValue: false }, + {name : 'app', type: Boolean , defaultValue: false }, + {name : 'program', type: Boolean , defaultValue: false }, + {name : 'dir', type: Boolean , defaultValue: false }, + {name : 'port', type: Boolean , defaultValue: false }, + {name: "portDir", type: Boolean, defaultValue: false }, + {name: "pause", type: Boolean, defaultValue: false }, + {name : 'name', alias : "n" , type: String , defaultValue: undefined }, + */ ` Kill running instances of the application. @@ -331,8 +340,12 @@ async function main(){ jamkill --all kills all running instances - jamkill app_id - kills all running instances that were started under app-id + [--name && (--app= || --program=(without ext)|| --dir= || --port= || --portDir)] + the --name is used to set the name and the other flags are used to mention what the name associates to + + [--pause] is used to pause the running program + + [--reset] is the hard reset. it closes all the running nodes, mosquito,tmux,reddis and remove all the directories including ports and apps ` ) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index bd0c1206d..6fa6e2f78 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env zx /** - * //DISCUSS PASUING AND THE INFO WE NEED HERE +++++ TAKE CARE OF THE DEFAULT APP NAME + * //DISCUSS PASUING AND THE INFO WE NEED HERE +++++ */ import { getJamListArgs } from "./parser.mjs"; @@ -210,11 +210,17 @@ async function main(){ if(error.type = "ShowUsage"){ console.log( - ` - Usage: jamlist [--app=appl_name] + /** - Lists details about all activated instances of JAMScript programs. Use the --app=X - option to limit the listing to programs that match the given name (i.e., X). + */ + + ` + Usage: jamlist [--app=appl_name] + [help] to show the Usage. + [monitor] use this flag to turnn on the monitoring mode + [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] + the flags abouve are used for filtering the jamlist + ` ) diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs index e301b9bf1..f09b8f886 100644 --- a/tools/jamlog.mjs +++ b/tools/jamlog.mjs @@ -80,11 +80,25 @@ async function main(){ catch(error){ if(error.type = "ShowUsage"){ console.log( + /** + * {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : "program", type: String, defaultValue : undefined }, + {name : "app", type: String, defaultValue : undefined }, + {name: "port", type:String, defaultValue: undefined}, + {name : "j", alias: "j", type: Boolean, defaultValue : false }, + {name : "c", alias: "c", type: Boolean, defaultValue : false }, + {name : "tail", alias: "t", type: Number, defaultValue : undefined }, + + */ ` Usage: jamlist [--app=appl_name] - Lists details about all activated instances of JAMScript programs. Use the --app=X - option to limit the listing to programs that match the given name (i.e., X). + [--help] is used to show usage + [--program && --app && --port] all used togeather to indicate what log we want to get + [--c] is a flag used to only show the c file + [--j] is a flagused to only show the j file + [--tail=] shows the last n lines of the log + [--all] shows all the logs ` ) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index a8dbc08ad..3cf87a350 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -4,27 +4,20 @@ import { fileURLToPath } from 'url'; import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); +import { Client } from 'ssh2'; /***\ - * ///MAIN SCRIPT AND MY SCRIPT HAS A DEFAULT VALUE WHICH IS 127.0.0.1:6379. WHy? shouldn't it be undefinced? - * ///DOES NOT CONNECT TO THE MAIN CLOSEST ONE +//REMOVE PARENT ID + * ///DOES NOT CONNECT TO THE MAIN CLOSEST ONE(LET IT BE AS IS) * //CONNECTING TO THE SAME REDIS CAN CAUSE MULTIPLE PROBLEMS(THE INTERACT WITH EACHOTHERS IN A WEIRD WAY) * QUESTION: - * 1----> WHEN TO KILL MQTT? WHY and who and how to kill it? (don't use others mqtt) - * 2----> logging system needs improvementm - * 3----> same name can't connect to reddis(two instances of shahin12 running as device is going to be problamatic) - * 5---->.jamruns/ports/port# : ls ->>>apps using port number - * 6---->keep track of num of workers - * 7---->log directory - * 8---> don't like the idea of using other mqtt servers, what if the one that started them closes them?''''''''''''''av + * 9 ----> app appid program tmuxid we do not need - * 10 ---> do not use mqtt of another file - * 11 ---> kill reddiss on cleaning - * DONOT FORGET TO: discuss about the temp broker topic. with the new ports dir we don't necessarily need the temp_broker no more cuz that would not make the decison of when to remove and when not to. + * NOTES TOCHANGE: - categtorize the log files. - remove portDir on kill. + + @@ -166,11 +159,13 @@ function show_usage(){ Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. - Use --resume to avoid reseting the reddis and resume the ongoing task + Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags + + Use --port only with --resume (it's gonna be dissabled if --resume flag is is not on.) to resume the program on the program on the right port. Usage: jamrun file.jxe [--app=appl_name] - [--fog|--cloud] + [--fog|--cloud|--device] [--num=num_c_devs] [--data=data-url] [--tags=quoted_list_of_tags] @@ -183,6 +178,8 @@ function show_usage(){ [--valgrind] [--local] [--resume] + + The jamrun command creates a run state in the $HOME/.jamruns folder. `; @@ -448,12 +445,8 @@ async function startredis(port) { async function waitforredis(port){ while (true) { try{ - const p = await $`redis-cli -p ${port} -c PING`.quiet() - - if (p.stdout.trim() === "PONG") { - break; } } @@ -479,6 +472,9 @@ async function setupredis(port) { await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` //IMPORTANT: flushing redis + //USE FLUSH DB TO ONLY FLUSH THE CURRENT DB FOR THE APP + //DB NUMBER + //FOR NOW KEEP AS IT IS if(!resume){ await $`redis-cli -p ${port} FLUSHALL`; } diff --git a/tools/parser.mjs b/tools/parser.mjs index 11518ba3c..b8ed7d8d3 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -26,7 +26,6 @@ const jamrunOptionDefinitions = [ {name : 'num', type: Number , defaultValue: 1}, {name : 'loc', type: String , defaultValue: `${long},${lat}`}, {name : 'edge', type: Number , defaultValue: 1}, -// {name : 'data', type: String , defaultValue: "127.0.0.1:6379"}, {name : 'data', type: String , defaultValue: undefined}, {name : 'fog', type: Boolean, defaultValue: false}, {name : 'cloud', type: Boolean, defaultValue: false}, From e501249b21312a60ce1b80b7e3c45aaab26e7cbc Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 29 Jul 2024 16:28:16 -0400 Subject: [PATCH 039/126] relative path issue fixded, dockerFile Updated --- scripts/install/Dockerfile | 61 ++++++++++++++++++++++++++++++-------- tools/cleanUp.mjs | 2 ++ tools/jamclean.mjs | 13 +++++++- tools/jamlist.mjs | 12 ++++++-- tools/jamrun.mjs | 30 +++++++++++++------ tools/parser.mjs | 4 +-- 6 files changed, 95 insertions(+), 27 deletions(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 194138952..f77564713 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -1,36 +1,73 @@ FROM ubuntu + +RUN apt update && apt install -y openssh-server +RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config + + RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ apt-get install -y -q wget \ build-essential \ - python \ + python3 \ unzip \ libbsd-dev \ git \ sudo \ vim \ curl \ - libssl-dev \ - cmake \ + make \ + clang \ iproute2 \ net-tools \ - iputils-ping \ + unzip \ + iputils-ping + +RUN apt-get install -y -q mosquitto \ + mosquitto-clients \ + libmosquitto-dev + +RUN apt-get install -y -q redis-server \ + redis-tools \ + libhiredis-dev + +RUN apt-get install -y -q libevent-dev \ + tmux \ inotify-tools RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers USER admin WORKDIR /home/admin -RUN wget https://deb.nodesource.com/setup_13.x && chmod +x ./setup_13.x && echo admin | sudo -S ./setup_13.x && \ +RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ sudo apt-get install -y -q nodejs -RUN git clone https://github.com/citelab/JAMScript +RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript -RUN mkdir ~/.npm-global && npm config set prefix '~/.npm-global' +WORKDIR /home/admin/JAMScript/deps +RUN git clone https://github.com/intel/tinycbor +WORKDIR /home/admin/JAMScript/deps/tinycbor +RUN make +RUN sudo make install + +WORKDIR /home/admin/JAMScript/deps/mujs2 +RUN make +RUN sudo make install WORKDIR /home/admin/JAMScript -RUN npm run link -ENV PATH="/home/admin/.npm-global/bin:$PATH" -RUN mkdir /home/admin/temp -WORKDIR /home/admin/temp +RUN npm install + +WORKDIR /home/admin/JAMScript/lib/cside +RUN make archive + +WORKDIR /home/admin +RUN mkdir .jamruns +WORKDIR /home/admin/.jamruns +RUN ln -s /home/admin/JAMScript/lib/cside clib +RUN ln -s /home/admin/JAMScript jamhome +RUN ln -s /home/admin/JAMScript/lib/jside node_modules + +WORKDIR /home/admin + +ENV PATH="$PATH:/home/admin/JAMScript/tools" -CMD sudo chmod -R a+Xr /etc/avahi && sudo sed -i "s|rlimit-nproc=3|#rlimit-nproc=3 |g" /etc/avahi/avahi-daemon.conf && sudo chmod -R a+Xr /var/run && cd /var/run/ && sudo rm -rf dbus && sudo mkdir dbus && sudo dbus-daemon --system && sudo avahi-daemon +EXPOSE 22 +ENTRYPOINT sudo service ssh start && bash diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 57878022b..92a0e8198 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -39,6 +39,8 @@ function stalePort(removablePort,app,programName){ const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n"); const dirName = (programName.split(".")[0])+"_"+app + console.log(dirName, "DIR NAME") + console.log("PROGRAM NAME", programName) if(appNames.includes(dirName)){ if(appNames.length === 1){ fs.rmSync(`${jamfolder}/ports/${removablePort}`, { recursive: true, force: true }); diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 377670f7e..095eb9003 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -2,6 +2,8 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; const { spawnSync } = require('child_process'); import { cleanByPortNumber } from "./cleanUp.mjs"; +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; ////////////////// //////// /////// //////// ////// ////// /// /////////////what should we do when we see new? linger there? wait/force. what to do exactly?. it is for broken apps.MAKE THE JT@ FILES BREAK. ///////Shopuld we check of reddis is running or not like we do for mqtt, JFile, Cfiles @@ -119,6 +121,12 @@ import { cleanByPortNumber } from "./cleanUp.mjs"; // } ////////////////////////////////////////////////////////////////////////// + + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename); +const jamcKillPath = resolve(__dirname, 'jamkill.mjs'); + const p = spawnSync('which', ['mosquitto_pub']); const MOSQUITTO_PUB = p.stdout.toString().trim() @@ -323,7 +331,10 @@ async function clean(){ continue; } const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") + console.log(dirs) for(let dir of dirs){ + console.log(fs.readFileSync(`${appFolder}/${dir}/${port}/paused`), "THIS IS FROM JAMCLEAN") + const isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false if(isPaused){ continue; @@ -331,7 +342,7 @@ async function clean(){ //mosquitto not running kill if(!await isMosquittoRunning(port)){ console.log("gotHERE") - await $`zx jamkill.mjs --port --name=${port}` + await $`zx ${jamcKillPath} --port --name=${port}` continue portLoop; } //jFile is not running. to remove fromport list diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 6fa6e2f78..4d908f6cd 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -6,11 +6,17 @@ */ import { getJamListArgs } from "./parser.mjs"; import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; const { debounce } = require('lodash'); const chokidar = require('chokidar'); const jamFolder = getJamFolder() let lastInfo; let watcher; +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename); +const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); + @@ -56,7 +62,7 @@ function getWatchList(){ function watch(filters) { setInterval(async () => { - await $`zx jamclean.mjs` + await $`zx ${jamcleanPath}` }, 1000); function updateWatchList(watchList){ @@ -245,7 +251,7 @@ async function main(){ else if(!filters || filters === "all" || Object.keys(filter) === 0){ - await $`zx jamclean.mjs` + await $`zx ${jamcleanPath}` const info = getNodeInfo(); lastInfo = info; if(info.length === 0 ){ @@ -260,7 +266,7 @@ async function main(){ } else{ - await $`zx jamclean.mjs` + await $`zx ${jamcleanPath}` const nodeinfo = getNodeInfo() const filtered = filter(nodeinfo, filters) lastInfo = filtered; diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 3cf87a350..54c5f21c0 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -2,6 +2,7 @@ import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' import { fileURLToPath } from 'url'; import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; +import { dirname, resolve } from 'path'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); import { Client } from 'ssh2'; @@ -35,23 +36,29 @@ let removablePort //SETUP CLEANING process.on('SIGINT', () => { if(removablePort){ + const toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() console.log(toPause); if(toPause !== "false"){ console.log("Cleaning") - pauseByPortNumber(file,app,removablePort,NOVERBOSE) + const fileNoext = getFileNoext(file); + pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) process.exit(); } else{ console.log("Killing") - cleanByPortNumber(file,app,removablePort,NOVERBOSE); + console.log(file) + const fileNoext = getFileNoext(file); + cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } } else{ console.log("Killing") - cleanByPortNumber(file,app,removablePort,NOVERBOSE); + console.log(file) + const fileNoext = getFileNoext(file); + cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } }); @@ -61,20 +68,22 @@ process.on('SIGTERM', () => { console.log(toPause); if(toPause !== "false"){ console.log("Cleaning") - pauseByPortNumber(file,app,removablePort,NOVERBOSE) + const fileNoext = getFileNoext(file); + pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) process.exit(); } else{ console.log("Killing") - cleanByPortNumber(file,app,removablePort,NOVERBOSE); + const fileNoext = getFileNoext(file); + cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } } else{ console.log("Killing") - - cleanByPortNumber(file,app,removablePort,NOVERBOSE); + const fileNoext = getFileNoext(file); + cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } @@ -761,7 +770,10 @@ async function main(){ await runNoneDevice(iport) } - -await $`zx jamclean.mjs` +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename); +const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); +console.log(jamcleanPath) +await $`zx ${jamcleanPath}` await main() diff --git a/tools/parser.mjs b/tools/parser.mjs index b8ed7d8d3..d58e810cc 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -205,7 +205,7 @@ export function jamrunParsArg(argv){ } const varsObject = SetJamrunVar(options); varsObject["file"] = file; - + console.log(varsObject) return varsObject; } //ASK wHAT VARIABLES ARE OPTIONAL @@ -221,7 +221,7 @@ export function getCargs(argObject){ args=args+` ${key} ${argObject[key]}` } } - + return args; } export function getJargs(argObject){ From 48db3aac71cf621ea8d92faf78e7d3fba44d0500 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 29 Jul 2024 19:02:08 -0400 Subject: [PATCH 040/126] mainCompiler UptoDate --- mainCompiler.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mainCompiler.js b/mainCompiler.js index c4103875a..a66b5e1e5 100755 --- a/mainCompiler.js +++ b/mainCompiler.js @@ -210,7 +210,7 @@ function nativeCompile(code, cargs, userIncludes, userLinkerFlags) { fs.writeFileSync(`${tmpDir}/jamout.c`, code); try { - var command = `clang -g ${tmpDir}/jamout.c -o ${tmpDir}/a.out -I/usr/local/include -I${homeDir}/.jamruns/clib/include -I${homeDir}/.jamruns/clib/src ${options} -pthread -ltinycbor -lmosquitto -lhiredis -levent ${userLinkerFlags.join(" ")} ${homeDir}/.jamruns/clib/libjam.a ${homeDir}/.jamruns/jamhome/deps/mujs2/build/release/libmujs.a -L/usr/local/lib ${includes}`; + var command = `clang -g ${tmpDir}/jamout.c -o ${tmpDir}/a.out -I/usr/local/include -I${homeDir}/.jamruns/clib/include -I${homeDir}/.jamruns/clib/src ${options} -pthread -ltinycbor -lmosquitto -lhiredis -levent ${userLinkerFlags.join(" ")} ${homeDir}/.jamruns/clib/libjam.a ${homeDir}/.jamruns/jamhome/deps/mujs2/build/release/libmujs.a ${homeDir}/.jamruns/jamhome/deps/tinycbor/lib/libtinycbor.a ${includes}`; if (args.verbosity) console.log("[C] Compiling code..."); if (cargs.verbosity == 2) { @@ -331,4 +331,4 @@ function deleteFolderRecursive(path) { }); fs.rmdirSync(path); } -} +} \ No newline at end of file From 2a244dbb51233a2945c512e93a4dea49af00f530 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 29 Jul 2024 20:20:10 -0400 Subject: [PATCH 041/126] install zx globaly --- scripts/install/Dockerfile | 4 ++- tools/jamrun.mjs | 56 ++++++++++++++++++++++++++++++++++---- tools/parser.mjs | 10 +++++-- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index f77564713..77493e0ec 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -55,6 +55,7 @@ RUN sudo make install WORKDIR /home/admin/JAMScript RUN npm install + WORKDIR /home/admin/JAMScript/lib/cside RUN make archive @@ -67,7 +68,8 @@ RUN ln -s /home/admin/JAMScript/lib/jside node_modules WORKDIR /home/admin -ENV PATH="$PATH:/home/admin/JAMScript/tools" +# ENV PATH="$PATH:/home/admin/JAMScript/tools" +ENV PATH="/home/admin/JAMScript/node_modules/.bin:$PATH" EXPOSE 22 ENTRYPOINT sudo service ssh start && bash diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 54c5f21c0..50f4890e1 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -29,7 +29,7 @@ ADD GIT LOG */ // //global variables -let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port; +let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote; const tmuxIds = []; let removablePort @@ -123,6 +123,21 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ) ) + +async function executeCommand(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + if (err) throw err; + let result; + stream.on("close", () => { + resolve(result) + }) + stream.on("data" , (data) =>{ + result = data.toString() + }) + }) + })) +} //tested.working function show_usage(){ const usageMessage = @@ -611,9 +626,8 @@ async function main(){ lat, Type, tags, - file, - resume, - port + port, + remote, } = jamrunParsArg(process.argv)) } @@ -624,13 +638,43 @@ async function main(){ process.exit(1) } else{ - show_usage() - process.exit(1) + throw error } } let folder; let ifile; let jdata; + let client; + if(remote){ + console.log("SET UP SSH CONNECTION"); + const config = { + host: 'localhost', + port: remote, + username: 'admin', + // You may need to specify a password or private key depending on your SSH server configuration + password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') + }; + client = await new Promise((resolve, reject) => { + const client = new Client(); + + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); + + executeCommand(client, "node ") + + + + } + + if(resume){ const fileNoExt = getFileNoext(file) if(!port){ diff --git a/tools/parser.mjs b/tools/parser.mjs index d58e810cc..3cf9404c3 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -1,8 +1,8 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; -import { string } from 'random-js'; import { fs } from 'zx'; -const path = require('path'); +import { path } from 'zx'; + const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; function generatelonglat() { @@ -20,7 +20,7 @@ let [long, lat] = generatelonglat(); const jamrunOptionDefinitions = [ { name: 'help', alias: 'h', type: Boolean, defaultValue: false}, - {name : 'app', type: String , defaultValue: "app-n"}, + {name : 'app', type: String , defaultValue: undefined}, {name : 'tags', type: String , defaultValue: undefined}, {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, {name : 'num', type: Number , defaultValue: 1}, @@ -40,6 +40,7 @@ const jamrunOptionDefinitions = [ {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, {name: 'resume', type: Boolean, defaultValue: false}, {name: "port", type: Number, defaultValue: undefined}, + {name: "remote", type:Number, defaultValue: undefined} ]; const jamlistOptionDefinition = [ @@ -205,6 +206,9 @@ export function jamrunParsArg(argv){ } const varsObject = SetJamrunVar(options); varsObject["file"] = file; + if(!varsObject.app){ + throw new Error("MISSING APP NAME") + } console.log(varsObject) return varsObject; } From 9b106a337a58e329bf7e64bf1d15eeb61cb2ad9f Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 29 Jul 2024 21:22:37 -0400 Subject: [PATCH 042/126] fixed file errors, docker working --- tools/fileDirectory.mjs | 2 ++ tools/jamrun.mjs | 51 ++++++++++++++++++++++------------------- tools/parser.mjs | 3 ++- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 9981ecf94..9ca58c86e 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -3,6 +3,8 @@ let HOME = os.homedir(); export function fileDirectorySetUp(file,app){ + console.log(file) + console.log(app) const jamfolder=`${HOME}/.jamruns` if(!fs.existsSync(jamfolder,{ recursive: true })){ fs.mkdirSync(jamfolder) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 50f4890e1..0768deb5f 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -627,6 +627,7 @@ async function main(){ Type, tags, port, + file, remote, } = jamrunParsArg(process.argv)) } @@ -645,34 +646,34 @@ async function main(){ let ifile; let jdata; let client; - if(remote){ - console.log("SET UP SSH CONNECTION"); - const config = { - host: 'localhost', - port: remote, - username: 'admin', - // You may need to specify a password or private key depending on your SSH server configuration - password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') - }; - client = await new Promise((resolve, reject) => { - const client = new Client(); - - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.connect(config); - }); + // if(remote){ + // console.log("SET UP SSH CONNECTION"); + // const config = { + // host: 'localhost', + // port: remote, + // username: 'admin', + // // You may need to specify a password or private key depending on your SSH server configuration + // password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') + // }; + // client = await new Promise((resolve, reject) => { + // const client = new Client(); + + // client.on('ready', () => { + // resolve(client); + // }); + + // client.on('error', (error) => { + // reject(error); + // }); - executeCommand(client, "node ") + // client.connect(config); + // }); + + // executeCommand(client, "node ") - } + // } if(resume){ @@ -717,6 +718,8 @@ async function main(){ if(port){ console.log("Warning. If it's not to resume the port argument will not be used") } + console.log(file,"this is my file") + console.log(app, "this is my path") fileDirectorySetUp(file,app) folder = getFolder(file,app) ifile = path.resolve(file); diff --git a/tools/parser.mjs b/tools/parser.mjs index 3cf9404c3..29decb243 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -1,8 +1,9 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; +import { string } from 'random-js'; import { fs } from 'zx'; -import { path } from 'zx'; +const path = require('path'); const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; function generatelonglat() { From fd25d83f846e1dd74e1c6b5d9191442dcd846bd7 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 30 Jul 2024 14:48:45 -0400 Subject: [PATCH 043/126] aiming to fix the ssh not finding the shell issue --- scripts/install/Dockerfile | 145 +++++++++++++++++++++++++++++-------- tools/jamrun.mjs | 92 ++++++++++++++--------- tools/parser.mjs | 46 +++++++++++- 3 files changed, 220 insertions(+), 63 deletions(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 77493e0ec..51b8a9cc6 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -1,44 +1,131 @@ +# FROM ubuntu + +# RUN apt update && apt install -y openssh-server +# RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config + + +# RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ +# apt-get install -y -q wget \ +# build-essential \ +# python3 \ +# unzip \ +# libbsd-dev \ +# git \ +# sudo \ +# vim \ +# curl \ +# make \ +# clang \ +# iproute2 \ +# net-tools \ +# unzip \ +# iputils-ping + +# RUN apt-get install -y -q mosquitto \ +# mosquitto-clients \ +# libmosquitto-dev + +# RUN apt-get install -y -q redis-server \ +# redis-tools \ +# libhiredis-dev + +# RUN apt-get install -y -q libevent-dev \ +# tmux \ +# inotify-tools + +# RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo +# RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers +# USER admin +# WORKDIR /home/admin +# RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ +# sudo apt-get install -y -q nodejs + +# RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript + +# WORKDIR /home/admin/JAMScript/deps +# RUN git clone https://github.com/intel/tinycbor +# WORKDIR /home/admin/JAMScript/deps/tinycbor +# RUN make +# RUN sudo make install + +# WORKDIR /home/admin/JAMScript/deps/mujs2 +# RUN make +# RUN sudo make install + +# WORKDIR /home/admin/JAMScript +# RUN npm install + + +# WORKDIR /home/admin/JAMScript/lib/cside +# RUN make archive + +# WORKDIR /home/admin +# RUN mkdir .jamruns +# WORKDIR /home/admin/.jamruns +# RUN ln -s /home/admin/JAMScript/lib/cside clib +# RUN ln -s /home/admin/JAMScript jamhome +# RUN ln -s /home/admin/JAMScript/lib/jside node_modules + +# WORKDIR /home/admin + +# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/profile +# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/bash.bashrc +# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc +# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile +# # ENV PATH="$PATH:/home/admin/JAMScript/tools" +# # ENV PATH="/home/admin/JAMScript/node_modules/.bin:$PATH" + +# EXPOSE 22 FROM ubuntu RUN apt update && apt install -y openssh-server RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config - RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ - apt-get install -y -q wget \ - build-essential \ - python3 \ - unzip \ - libbsd-dev \ - git \ - sudo \ - vim \ - curl \ - make \ - clang \ - iproute2 \ - net-tools \ - unzip \ - iputils-ping + apt-get install -y -q wget \ + build-essential \ + python3 \ + unzip \ + libbsd-dev \ + git \ + sudo \ + vim \ + curl \ + make \ + clang \ + iproute2 \ + net-tools \ + unzip \ + iputils-ping RUN apt-get install -y -q mosquitto \ - mosquitto-clients \ - libmosquitto-dev + mosquitto-clients \ + libmosquitto-dev RUN apt-get install -y -q redis-server \ - redis-tools \ - libhiredis-dev + redis-tools \ + libhiredis-dev RUN apt-get install -y -q libevent-dev \ - tmux \ - inotify-tools + tmux \ + inotify-tools RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers + +# Switch to root user to modify system files +USER root + +# Add global npm bin directory to PATH for all users and sessions +RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/profile +RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/bash.bashrc + +# Switch back to admin user USER admin + WORKDIR /home/admin RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ - sudo apt-get install -y -q nodejs + sudo apt-get install -y -q nodejs RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript @@ -46,17 +133,16 @@ WORKDIR /home/admin/JAMScript/deps RUN git clone https://github.com/intel/tinycbor WORKDIR /home/admin/JAMScript/deps/tinycbor RUN make -RUN sudo make install +RUN sudo make install WORKDIR /home/admin/JAMScript/deps/mujs2 RUN make RUN sudo make install WORKDIR /home/admin/JAMScript -RUN npm install - +RUN npm install -WORKDIR /home/admin/JAMScript/lib/cside +WORKDIR /home/admin/JAMScript/lib/cside RUN make archive WORKDIR /home/admin @@ -68,8 +154,9 @@ RUN ln -s /home/admin/JAMScript/lib/jside node_modules WORKDIR /home/admin -# ENV PATH="$PATH:/home/admin/JAMScript/tools" -ENV PATH="/home/admin/JAMScript/node_modules/.bin:$PATH" +# Add global npm bin directory to PATH for the admin user +RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc +RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile EXPOSE 22 ENTRYPOINT sudo service ssh start && bash diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 0768deb5f..cdd16f26e 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env zx -import {jamrunParsArg , getCargs, getJargs} from './parser.mjs' +import {jamrunParsArg , getCargs, getJargs, getRemoteArgs} from './parser.mjs' import { fileURLToPath } from 'url'; import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; import { dirname, resolve } from 'path'; @@ -124,16 +124,16 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ) -async function executeCommand(client, command){ +async function executeScript(client, command){ return (await new Promise((resolve, reject) =>{ client.exec(command, (err,stream) =>{ - if (err) throw err; - let result; + if (err) reject(err); + let result = '' stream.on("close", () => { resolve(result) }) stream.on("data" , (data) =>{ - result = data.toString() + result = result + data; }) }) })) @@ -646,34 +646,60 @@ async function main(){ let ifile; let jdata; let client; - // if(remote){ - // console.log("SET UP SSH CONNECTION"); - // const config = { - // host: 'localhost', - // port: remote, - // username: 'admin', - // // You may need to specify a password or private key depending on your SSH server configuration - // password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') - // }; - // client = await new Promise((resolve, reject) => { - // const client = new Client(); - - // client.on('ready', () => { - // resolve(client); - // }); - - // client.on('error', (error) => { - // reject(error); - // }); - - // client.connect(config); - // }); - - // executeCommand(client, "node ") - - - - // } + if(remote){ + console.log("SET UP SSH CONNECTION"); + const config = { + host: 'localhost', + port: remote, + username: 'admin', + // You may need to specify a password or private key depending on your SSH server configuration + password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') + }; + client = await new Promise((resolve, reject) => { + const client = new Client(); + + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); + const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) + //QUESTION: HOW TO FIND WHERE THE FILE EXACTLY IS?(JAMRUN>MJS) + const toExecute = `zx jamrun ${remoteArgs}` + console.log(toExecute) + console.log(remoteArgs, "from JAM RUN") + console.log(await executeScript(client, "cd JAMScript/tools && node --version")) + console.log(await executeScript(client, "ls")) + + // try{ + // const check = await executeScript(client, "node --version") + // console.log(check) + // } + // catch(error){ + // throw error + // } + //run the new sctipy. + const jamfolder = getJamFolder() + const fileNoext = getFileNoext(file); + if(!fs.existsSync(`${jamfolder}/remote`)){ + fs.mkdirSync(`${jamfolder}/remote`); + } + if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}`).toString().trim().split("\n") + if(!remoteApps.includes(`${fileNoext}_app`)){ + fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}`, `${fileNoext}_app`); + } + } + else{ + fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}`, `${fileNoext}_app`) + } + process.exit(0) + } if(resume){ diff --git a/tools/parser.mjs b/tools/parser.mjs index 29decb243..137588382 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -345,7 +345,51 @@ export function getKilltArgs(argv){ return {"flag": flag, "name" : options.name, "pause": options.pause} } - +/** + *{ name: 'help', alias: 'h', type: Boolean, defaultValue: false}, + {name : 'app', type: String , defaultValue: undefined}, + {name : 'tags', type: String , defaultValue: undefined}, + {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, + {name : 'num', type: Number , defaultValue: 1}, + {name : 'loc', type: String , defaultValue: `${long},${lat}`}, + {name : 'edge', type: Number , defaultValue: 1}, + {name : 'data', type: String , defaultValue: undefined}, + {name : 'fog', type: Boolean, defaultValue: false}, + {name : 'cloud', type: Boolean, defaultValue: false}, + {name : 'device', type: Boolean, defaultValue: false}, + {name : 'local_registry', type: Boolean, defaultValue: false}, + {name : 'bg', type: Boolean, defaultValue: false}, + {name : 'verb', type: Boolean, defaultValue: false}, + {name : 'log', type: Boolean, defaultValue: false}, + {name : 'old', type: Boolean, defaultValue: false}, + {name : 'local', type: Boolean, defaultValue: false}, + {name : 'valgrind', type: Boolean, defaultValue: false}, + {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, + {name: 'resume', type: Boolean, defaultValue: false}, + {name: "port", type: Number, defaultValue: undefined}, + {name: "remote", type:Number, defaultValue: undefined} + */ +export function getRemoteArgs(argObject){ + const args =[] + for(let arg of Object.keys(argObject)){ + if(argObject[arg] === false || argObject[arg] === undefined ){ + continue; + } + if(arg === "long" || arg ==="lat" || arg === "Type" || arg === "NOVERBOSE" || arg === "remote"){ + continue; + } + if(argObject[arg] === true){ + args.push(`--${arg}`) + } + else{ + args.push(`--${arg}=${argObject[arg]}`) + } + } + args.push(`--loc=${long},${lat}`) + if (argObject["NOVERBOSE"]) args.push(`--verb`) + args.push(`--${argObject["Type"]}`) + return args.join(" ") +} export function getLogArgs(argv){ const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog.mjs') )) let options From da8e7614c8babb81be1f1599762ce266b403db7b Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 30 Jul 2024 17:12:37 -0400 Subject: [PATCH 044/126] attemp to expose the ports for network connections --- scripts/install/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 51b8a9cc6..0f58342e0 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -158,5 +158,5 @@ WORKDIR /home/admin RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile -EXPOSE 22 +EXPOSE 22 1883 21883 ENTRYPOINT sudo service ssh start && bash From e859e5fda3057841cad14bf09481212410c42b4f Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 30 Jul 2024 17:34:39 -0400 Subject: [PATCH 045/126] remove port expose --- scripts/install/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 0f58342e0..23838f1d6 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -158,5 +158,5 @@ WORKDIR /home/admin RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile -EXPOSE 22 1883 21883 +EXPOSE 22 ENTRYPOINT sudo service ssh start && bash From b82160c439063e1dde08f40dccbe5d91d3f7eddc Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 30 Jul 2024 20:41:34 -0400 Subject: [PATCH 046/126] ulternative dockerfile, redis blocker --- scripts/install/Dockerfile | 234 +++++++++++++++++++------------------ 1 file changed, 118 insertions(+), 116 deletions(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 23838f1d6..377548ebf 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -1,44 +1,132 @@ +FROM ubuntu + +RUN apt update && apt install -y openssh-server +RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config + + +RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ + apt-get install -y -q wget \ + build-essential \ + python3 \ + unzip \ + libbsd-dev \ + git \ + sudo \ + vim \ + curl \ + make \ + clang \ + iproute2 \ + net-tools \ + unzip \ + iputils-ping + +RUN apt-get install -y -q mosquitto \ + mosquitto-clients \ + libmosquitto-dev + +RUN apt-get install -y -q redis-server \ + redis-tools \ + libhiredis-dev + +RUN apt-get install -y -q libevent-dev \ + tmux \ + inotify-tools + +RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo +RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers +USER admin +WORKDIR /home/admin +RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ + sudo apt-get install -y -q nodejs + + RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript + +WORKDIR /home/admin/JAMScript/deps +RUN git clone https://github.com/intel/tinycbor +WORKDIR /home/admin/JAMScript/deps/tinycbor +RUN make +RUN sudo make install + +WORKDIR /home/admin/JAMScript/deps/mujs2 +RUN make +RUN sudo make install + +WORKDIR /home/admin/JAMScript +RUN npm install +RUN sudo npm install zx -g + +WORKDIR /home/admin/JAMScript/lib/cside +RUN make archive + +WORKDIR /home/admin +RUN mkdir .jamruns +WORKDIR /home/admin/.jamruns +RUN ln -s /home/admin/JAMScript/lib/cside clib +RUN ln -s /home/admin/JAMScript jamhome +RUN ln -s /home/admin/JAMScript/lib/jside node_modules + +WORKDIR /home/admin +RUN mkdir .npm-global +RUN mkdir .npm-global/bin + +ENV PATH="$PATH:/home/admin/JAMScript/tools:/home/admin/.npm-global/bin" + +EXPOSE 22 +ENTRYPOINT sudo service ssh start && bash + +# EXPOSE 22 +####################BROKEN REDIS # FROM ubuntu # RUN apt update && apt install -y openssh-server # RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config - # RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ -# apt-get install -y -q wget \ -# build-essential \ -# python3 \ -# unzip \ -# libbsd-dev \ -# git \ -# sudo \ -# vim \ -# curl \ -# make \ -# clang \ -# iproute2 \ -# net-tools \ -# unzip \ -# iputils-ping +# apt-get install -y -q wget \ +# build-essential \ +# python3 \ +# unzip \ +# libbsd-dev \ +# git \ +# sudo \ +# vim \ +# curl \ +# make \ +# clang \ +# iproute2 \ +# net-tools \ +# unzip \ +# iputils-ping # RUN apt-get install -y -q mosquitto \ -# mosquitto-clients \ -# libmosquitto-dev +# mosquitto-clients \ +# libmosquitto-dev # RUN apt-get install -y -q redis-server \ -# redis-tools \ -# libhiredis-dev +# redis-tools \ +# libhiredis-dev # RUN apt-get install -y -q libevent-dev \ -# tmux \ -# inotify-tools +# tmux \ +# inotify-tools # RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo # RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers + +# # Switch to root user to modify system files +# USER root + +# # Add global npm bin directory to PATH for all users and sessions +# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/profile +# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/bash.bashrc + +# # Switch back to admin user # USER admin + # WORKDIR /home/admin # RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ -# sudo apt-get install -y -q nodejs +# sudo apt-get install -y -q nodejs # RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript @@ -46,17 +134,16 @@ # RUN git clone https://github.com/intel/tinycbor # WORKDIR /home/admin/JAMScript/deps/tinycbor # RUN make -# RUN sudo make install +# RUN sudo make install # WORKDIR /home/admin/JAMScript/deps/mujs2 # RUN make # RUN sudo make install # WORKDIR /home/admin/JAMScript -# RUN npm install - +# RUN npm install -# WORKDIR /home/admin/JAMScript/lib/cside +# WORKDIR /home/admin/JAMScript/lib/cside # RUN make archive # WORKDIR /home/admin @@ -68,95 +155,10 @@ # WORKDIR /home/admin -# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/profile -# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/bash.bashrc +# # Add global npm bin directory to PATH for the admin user # RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc # RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile -# # ENV PATH="$PATH:/home/admin/JAMScript/tools" -# # ENV PATH="/home/admin/JAMScript/node_modules/.bin:$PATH" - -# EXPOSE 22 -FROM ubuntu - -RUN apt update && apt install -y openssh-server -RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config - -RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ - apt-get install -y -q wget \ - build-essential \ - python3 \ - unzip \ - libbsd-dev \ - git \ - sudo \ - vim \ - curl \ - make \ - clang \ - iproute2 \ - net-tools \ - unzip \ - iputils-ping - -RUN apt-get install -y -q mosquitto \ - mosquitto-clients \ - libmosquitto-dev - -RUN apt-get install -y -q redis-server \ - redis-tools \ - libhiredis-dev - -RUN apt-get install -y -q libevent-dev \ - tmux \ - inotify-tools - -RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo -RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers - -# Switch to root user to modify system files -USER root - -# Add global npm bin directory to PATH for all users and sessions -RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/profile -RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/bash.bashrc - -# Switch back to admin user -USER admin - -WORKDIR /home/admin -RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ - sudo apt-get install -y -q nodejs - -RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript - -WORKDIR /home/admin/JAMScript/deps -RUN git clone https://github.com/intel/tinycbor -WORKDIR /home/admin/JAMScript/deps/tinycbor -RUN make -RUN sudo make install - -WORKDIR /home/admin/JAMScript/deps/mujs2 -RUN make -RUN sudo make install - -WORKDIR /home/admin/JAMScript -RUN npm install -WORKDIR /home/admin/JAMScript/lib/cside -RUN make archive - -WORKDIR /home/admin -RUN mkdir .jamruns -WORKDIR /home/admin/.jamruns -RUN ln -s /home/admin/JAMScript/lib/cside clib -RUN ln -s /home/admin/JAMScript jamhome -RUN ln -s /home/admin/JAMScript/lib/jside node_modules - -WORKDIR /home/admin - -# Add global npm bin directory to PATH for the admin user -RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc -RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile - -EXPOSE 22 -ENTRYPOINT sudo service ssh start && bash +# EXPOSE 22 +# ENTRYPOINT sudo service ssh start && bash +####################BROKEN REDIS \ No newline at end of file From 9cbadcafc5a893b131b9d217cae444bf732bdd2d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 31 Jul 2024 19:05:22 -0400 Subject: [PATCH 047/126] docker fixed --- deps/tinycbor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/tinycbor b/deps/tinycbor index e5414c0ff..26c63e3d5 160000 --- a/deps/tinycbor +++ b/deps/tinycbor @@ -1 +1 @@ -Subproject commit e5414c0ff69561aac32abdbf807b2dae2a35e385 +Subproject commit 26c63e3d5977f77a6483edde4519489254670375 From a509f1451c43b708854efa0fbfae2c402802026d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 2 Aug 2024 19:13:51 -0400 Subject: [PATCH 048/126] working jamlist/jamclean/jamkill/jamrun for remote machin(DOCKER VERSION) --- tools/cleanUp.mjs | 35 +++- tools/fileDirectory.mjs | 3 + tools/jamclean.mjs | 178 ++++++++++++++++++++- tools/jamkill.mjs | 342 ++++++++++++++++++++++++++++++++++------ tools/jamlist.mjs | 337 +++++++++++++++++++++++++++++++-------- tools/jamrun.mjs | 186 ++++++++++++++++------ tools/parser.mjs | 42 +++-- 7 files changed, 931 insertions(+), 192 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 92a0e8198..aa141a311 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -29,6 +29,7 @@ function killtmux(PortNumber,appName , programName){ } function stalePort(removablePort,app,programName){ + console.log("PORT STALE CLEANING PORT") const jamfolder = getJamFolder() if(!removablePort){ return false; @@ -43,29 +44,45 @@ function stalePort(removablePort,app,programName){ console.log("PROGRAM NAME", programName) if(appNames.includes(dirName)){ if(appNames.length === 1){ + console.log("RETERNING TURE") fs.rmSync(`${jamfolder}/ports/${removablePort}`, { recursive: true, force: true }); return true; } else{ + console.log("RETERNING false 1") const newAppNames = appNames.filter((appName) => appName !== dirName) fs.writeFileSync(`${jamfolder}/ports/${removablePort}`, newAppNames.join("\n")) return false; } } else{ + console.log("RETERNING false 2") return false; } } function killMosquitto(removablePort){ - - const result = spawnSync('lsof', ['-i', `tcp:${Number(removablePort)}`, '-sTCP:LISTEN', '-t']); - if(result.error){ - return + // console.log("CLOSING THE MOSQUITTO") + // const result = spawnSync('lsof', ['-i', `tcp:${Number(removablePort)}`, '-sTCP:LISTEN', '-t']); + // console.log("GOT THE RESULT") + // if(result.error){ + // console.log("THERE IS AN ERROR") + // console.log(error) + // return + // } + // const pid = result.stdout.toString().trim(); + // console.log("PID WE NEED", pid) + const jamfolder = getJamFolder() + if(fs.existsSync(`${jamfolder}/mqttpid/${removablePort}`)){ + const pid = fs.readFileSync(`${jamfolder}/mqttpid/${removablePort}`).toString().trim() + fs.rmSync(`${jamfolder}/mqttpid/${removablePort}`) + spawnSync('kill', ['-9' ,pid]); } - const pid = result.stdout.toString().trim(); - spawnSync('kill', ['-9' ,pid]); + else{ + console.log("corrupted file directory ,pid can't be found ") + } + } @@ -76,6 +93,7 @@ function killRedis(removablePort){ function cleanPort(removablePort,app,programName){ const isPortStale = stalePort(removablePort,app,programName); + console.log("THIS IS THE PORT", isPortStale) if(isPortStale){ killMosquitto(removablePort); killRedis(removablePort); @@ -142,7 +160,7 @@ function markPause(PortNumber,appName ,programName){ // } export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ - console.log("killing port") + console.log("killing port ") if(!programName || !appName || !PortNumber){ if(!NOVERBOSE) @@ -154,7 +172,7 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr const tmuxIds = killtmux(PortNumber,appName ,programName); if(!NOVERBOSE && tmuxIds) console.log("Killed :", tmuxIds) - + console.log("PRE CLEANING THE CLEAN PORT") const isPortCleaned = cleanPort(PortNumber,appName,programName); if(!NOVERBOSE && isPortCleaned ){ console.log("Redis and mosquitto on port ",PortNumber, "are removed" ) @@ -167,6 +185,7 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr if(!NOVERBOSE && isDirCleaned ){ console.log(`port ${PortNumber} is cleaned for ${programName.split(".")[0]}_${appName}`) } + console.log("CLEANED UP OVER") }; export function pauseByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 9ca58c86e..e42acdcfd 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -125,6 +125,9 @@ export async function cleanExecutables(){ } export function fileDirectoryMqtt(folder, iport,jamfolder,app){ + if(!fs.existsSync(`${jamfolder}/mqttpid`)){ + fs.mkdirSync(`${jamfolder}/mqttpid`); + } fs.writeFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "allow_anonymous true\n"); fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, "#\n"); diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 095eb9003..86b50de4e 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -4,7 +4,9 @@ const { spawnSync } = require('child_process'); import { cleanByPortNumber } from "./cleanUp.mjs"; import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; -////////////////// //////// /////// //////// ////// ////// /// +import { Client } from 'ssh2'; + +////////////////// //////// /////// //////// ////// ////// ///NOTE: NAME CAN NOT HAVE = IN IT /////////////what should we do when we see new? linger there? wait/force. what to do exactly?. it is for broken apps.MAKE THE JT@ FILES BREAK. ///////Shopuld we check of reddis is running or not like we do for mqtt, JFile, Cfiles @@ -295,7 +297,14 @@ function cleanCfiles(portDir, currCfile){ for(let oldCdev of oldCdevs){ const cNum = oldCdev.split(".")[1]; if(!currCfile.includes(cNum)){ - fs.unlinkSync(`${portDir}/${oldCdev}`); + try{ + fs.unlinkSync(`${portDir}/${oldCdev}`); + + } + catch(error){ + + } + } } } @@ -331,17 +340,14 @@ async function clean(){ continue; } const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") - console.log(dirs) for(let dir of dirs){ - console.log(fs.readFileSync(`${appFolder}/${dir}/${port}/paused`), "THIS IS FROM JAMCLEAN") - const isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false if(isPaused){ continue; } //mosquitto not running kill if(!await isMosquittoRunning(port)){ - console.log("gotHERE") + await $`zx ${jamcKillPath} --port --name=${port}` continue portLoop; } @@ -382,12 +388,170 @@ async function clean(){ +function getRemoteapps(){ + const jamfolder = getJamFolder() + const myMap = new Map() + if(!fs.existsSync(`${jamfolder}/remote`)){ + return null + } + const remoteMachines = fs.readdirSync(`${jamfolder}/remote`) + for(let remoteMachine of remoteMachines){ + const ports = fs.readdirSync(`${jamfolder}/remote/${remoteMachine}`) + let arg='' + for(let port of ports){ + const apps = fs.readFileSync(`${jamfolder}/remote/${remoteMachine}/${port}`).toString().trim().split("\n") + for(let app of apps){ + arg = arg+app+":"+port+"##" + } + } + const result = arg.slice(0, -2); + myMap.set(remoteMachine,result) + } + return myMap; +} +async function makeConnection(config){ + return await new Promise((resolve, reject) => { + const client = new Client(); + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); +} +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + + if (err) console.log(error); + let result = ''; + stream.on("close", () => { + resolve(result) + }) + stream.on("data" , (data) =>{ + + if(data.includes("TOREMOVE:")){ + let rm = data.toString().split(":")[1] + result = result + rm + } + }) + }) + })) +} +// main() +async function cleanRemote(toRemove){ + const jamfolder = getJamFolder() + for(let machine of toRemove.keys()){ + for(let rm of toRemove.get(machine)){ -// main() + const dir = rm.split("/")[0] + const port = rm.split("/")[1] + if(!port){ + fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); + } + if(!fs.readFileSync(`${jamfolder}/remote/${machine}/${port}`)){ + return + } + const apps = fs.readFileSync(`${jamfolder}/remote/${machine}/${port}`).toString().trim().split("\n"); + const currApps = apps.filter((entry)=>(!entry.includes(dir))); + + if(currApps.length === 0 ){ + fs.rmSync(`${jamfolder}/remote/${machine}/${port}`, { recursive: true, force: true }); + } + else{ + const toWrite = currApps.join("\n") + fs.writeFileSync(`${jamfolder}/remote/${machine}/${port}`,`${toWrite}`) + } + } + if((fs.readdirSync(`${jamfolder}/remote/${machine}`)).length === 0 ){ + fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); + } + } +} (async () =>{ + const arg = process.argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs'))); + const appfolder = getAppFolder(); + const jamFolder = getJamFolder(); + if(arg.length === 0){ + let currIP ; + if (os.platform() === 'win32') { + currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'darwin') { + currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'linux') { + currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); + } + const map = getRemoteapps(); + + const removalMap = new Map() + if(map){ + for(let machines of map.keys()){ + const [host,port] = machines.split("_"); + const arg = map.get(machines); + const config = { + host: host, + port: port, + username: 'admin', + password: 'admin' + }; + const client = await makeConnection(config); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + const script = `zx jamclean.mjs --root=${currIP} --hash=${arg}` + const result = await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) + const toRemove = result.trim().split("\n"); + if(toRemove.length !==0 && toRemove[0] !== ''){ + removalMap.set(machines,toRemove) + } + + } + + cleanRemote(removalMap) + } + } await clean() + + if(arg.length === 2){ + const rootIP = (arg[0].split("="))[1] + const hash = (arg[1].split("="))[1] + + const portDirs = hash.split("##") + for(let portDir of portDirs){ + let dirName = portDir.split(":")[0] + let portName = portDir.split(":")[1] + if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + const running = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim(); + console.log(running, "this is my running") + if(!running.includes(dirName)){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + if(!fs.existsSync(`${appfolder}/${dirName}/${portName}/root`)){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + const dirRoot = fs.readFileSync(`${appfolder}/${dirName}/${portName}/root`).toString().trim() + if(rootIP !== dirRoot){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + } + } + process.exit() + })(); \ No newline at end of file diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index ef4109f74..aa7c2f828 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -2,7 +2,16 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; - +import { Client } from 'ssh2'; +//can't specify what port ti jukk exactly +let currIP; +if (os.platform() === 'win32') { + currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'darwin') { + currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'linux') { + currIP =( await $`hostname -I`.catch(() => '')).toString().trim(); + } export function getRunningDirs(){ const jamFolder = getJamFolder() @@ -38,83 +47,176 @@ export function dirNameToProgramName(dirName){ return (dirName.split('_'))[0] } -function killDataByPortDir(portDir){ +function killDataByPortDir(portDir, root){ const jamFolder = getJamFolder() + const appFolder = getAppFolder() const infoList = portDir.split("/") + console.log("IF STATEMENT 1") if(infoList.length !== 2){ throw new Error("Wrong Path input") 0 } const dirName = infoList[0] const portName = infoList[1] + console.log("IF STATEMENT 2") if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ return[] } + console.log("IF STATEMENT 4") + const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n") if(!dirsRunning.includes(dirName)){ return [] } - const info ={ - programName : dirNameToProgramName(dirName)+".jxe", - appName : dirNameToAppName(dirName), - portNumber : portName + console.log("PRE ROOT") + if(root){ + console.log("root exists") + console.log("portName", portName) + if(fs.existsSync(`${jamFolder}/ports/${portName}`)){ + console.log("file exists") + const rootIP = fs.readFileSync(`${appFolder}/${portDir}/root`).toString().trim(); + if(rootIP === root){ + console.log("root matches") + const info = { + programName : dirNameToProgramName(dirName)+".jxe", + appName : dirNameToAppName(dirName), + portNumber : portName + } + console.log(info, "this is my info") + return [info] + } + } + } - return [info] + else{ + const info ={ + programName : dirNameToProgramName(dirName)+".jxe", + appName : dirNameToAppName(dirName), + portNumber : portName + } + return [info] + } + } -function killDataByPortNum(portNum){ +function killDataByPortNum(portNum, root){ const jamFolder = getJamFolder() const toClean=[]; const activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) + const appfolder = getAppFolder() if(!activePorts.includes(Number(portNum))){ return []; } const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") for(let dir of dirsRunning){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : portNum + if(root){ + console.log("root exists from port num") + if(fs.existsSync(`${appfolder}/${dir}/${portNum}/root`)){ + console.log("file exists") + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${portNum}/root`).toString().trim(); + if(rootIP === root){ + console.log("PORT MATCHING") + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : portNum + } + console.log(info, "TO KILL") + toClean.push(info) + } + } + + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : portNum + } + toClean.push(info) } - toClean.push(info) } return toClean; } -function killDataByAppName(appName){ +function killDataByAppName(appName, root){ const toClean=[]; const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() for(let dir of activeDirs.keys()){ const currApp = dirNameToAppName(dir) if(currApp === appName){ for(let port of activeDirs.get(dir)){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : currApp, - portNumber : port + if(root){ + console.log("root EXISTS") + if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ + console.log("FILE EXISTS") + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + console.log(root, "root OLD") + console.log(rootIP, "root new") + if(rootIP === root){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) } - toClean.push(info) } } } return toClean } -function killDataByProgramName(programName){ +function killDataByProgramName(programName, root){ + console.log("KILLING DATA BY NAME") const toClean=[]; const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() for(let dir of activeDirs.keys()){ const currProgram = dirNameToProgramName(dir) if(currProgram === programName){ for(let port of activeDirs.get(dir)){ - const info ={ - programName : currProgram+".jxe", - appName : dirNameToAppName(dir), - portNumber : port + if(root){ + console.log("ROOT EXISTS") + if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ + console.log("file exist") + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + console.log(rootIP) + console.log(root) + if(rootIP === root){ + const info = { + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + console.log("this is the info", info) + toClean.push(info) + } + } + + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) } - toClean.push(info) } } } @@ -122,35 +224,74 @@ function killDataByProgramName(programName){ } -function killDataByDirName(dirName){ +function killDataByDirName(dirName, root){ + console.log("KILLING BT NAME STARTED") const toClean=[]; const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() for(let dir of activeDirs.keys()){ if(dir === dirName){ for(let port of activeDirs.get(dir)){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port + if(root){ + console.log("ROOT IS HERE") + if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ + console.log("FILE IS HERE") + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + console.log("ID MATCHED") + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + console.log("INFO") + toClean.push(info) + } + } + + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) } - toClean.push(info) } } } return toClean } -function killDataForAll(){ +function killDataForAll(root){ const toClean=[]; const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() for(let dir of activeDirs.keys()){ for(let port of activeDirs.get(dir)){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port + if(root){ + if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) } - toClean.push(info) } } return toClean @@ -211,39 +352,43 @@ async function pauseProcess(data){ await killJFile(data); } -async function jamKill(flag, name, pause) +async function jamKill(flag, name, pause, root) { console.log("KILLING PROCESS STARTING") + console.log("this is my flag in jamkill", flag) let jamData; if(flag === "dir"){ - jamData = killDataByDirName(name) + jamData = killDataByDirName(name, root) } else if(flag === "app"){ - jamData = killDataByAppName(name) + jamData = killDataByAppName(name, root) + console.log("data from name", jamData) } else if(flag === "program"){ console.log("killing by program name") - jamData = killDataByProgramName(name) + jamData = killDataByProgramName(name, root) } else if(flag === "port"){ console.log("USING PORT TO CLEAN") - jamData = killDataByPortNum(name) + jamData = killDataByPortNum(name, root) } else if(flag === "portDir"){ - jamData = killDataByPortDir(name) + console.log("GOT TO THE PORT DIR") + jamData = killDataByPortDir(name, root) } else{ - jamData = killDataForAll() + console.log("CLEANING DATA FOR ALL") + jamData = killDataForAll(root) } console.log(jamData) if(jamData.length === 0 ){ if(flag === "all"){ - console.log("no running app") + console.log("no running app on local") } else{ - console.log("no such running app") + console.log("no such running app on local") } } @@ -283,27 +428,62 @@ async function jamKill(flag, name, pause) await killProcess(data); cleanByPortNumber(programName,appName,portNumber) } + } - + console.log("KILLING IS OVER, IT IS OVER INDEEDE") + console.log("KILLING IS OVER") } async function jamKillBruteForce(){ + console.log("KILL RESER BRUTE FORCEAS") await $`pkill node`.nothrow().quiet(); + console.log("KILL RESER BRUTE FORCEAS") + await $`pkill mosquitto`.nothrow().quiet(); + console.log("KILL RESER BRUTE FORCEAS") + await $`pkill tmux`.nothrow().quiet(); + console.log("GOT HERE") await $`ps aux | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill`.nothrow().quiet(); + console.log("GOT HERE") const jamfolder = getJamFolder(); //should I remove the apps as well or that is not required if(fs.existsSync(`${jamfolder}/ports`)) fs.rmSync(`${jamfolder}/ports`, { recursive: true, force: true }) if(fs.existsSync(`${jamfolder}/apps`)) fs.rmSync(`${jamfolder}/apps`, { recursive: true, force: true }) + if(fs.existsSync(`${jamfolder}/mqttpid`)) + fs.rmSync(`${jamfolder}/mqttpid`, { recursive: true, force: true }) } +async function executeScript(client, command){ + console.log("GOT HERE") + // console.log(client) + // console.log(command) + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + console.log("got here") + if (err) throw err; + let result = '' + stream.on("close", () => { + resolve(result) + }) + stream.on("data" , (data) =>{ + console.log(data.toString()) + if(data.includes("KILLING IS OVER")) + { + console.log(data.toString()) + resolve(data.toString()) + } + + }) + }) + })) +} async function main(){ - + console.log("gothere") let args; try{ @@ -354,7 +534,62 @@ async function main(){ } const jamfolder = getJamFolder(); const appfolder = getAppFolder(); + if(fs.existsSync(`${jamfolder}/remote`) && args.remote && !args.root){ + console.log("GOT HERE !") + const remotes = fs.readdirSync(`${jamfolder}/remote`) + console.log(remotes) + console.log("GOT HERE 2") + for(let remote of remotes){ + const [host,port] = remote.split("_"); + console.log(host) + console.log(port) + const config = { + host: host, + port: port, + username: 'admin', + // You may need to specify a password or private key depending on your SSH server configuration + password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') + }; + let client = await new Promise((resolve, reject) => { + const client = new Client(); + + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let toExecute; + if(args.flag == "reset"){ + toExecute = `zx jamkill.mjs --reset --root=${currIP}` + } + else if(args.flag == "all"){ + if(!args.pause) + toExecute = `zx jamkill.mjs --${args.flag} --root=${currIP}` + else + toExecute = `zx jamkill.mjs --${args.flag} --${args.pause} --root=${currIP}` + } + else{ + if(!args.pause) + toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --root=${currIP}` + else + toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --${args.pause} --root=${currIP}` + } + console.log(toExecute) + const command=`${pathExport} && ${changeDir} && ${toExecute}` + await executeScript(client, command); + } + } if(args.flag === "reset"){ + if(args.root){ + throw new Error("DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE") + } console.log("kill reset") await jamKillBruteForce() } @@ -365,12 +600,21 @@ async function main(){ throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') } else{ - await jamKill(args.flag , args.name, args.pause); + console.log("PRE KILL") + console.log("flag", args.flag) + console.log("name", args.name) + console.log("root", args.root) + await jamKill(args.flag , args.name, args.pause, args.root); } + + + process.exit(0); } + (async() => { + console.log("SCRIPT STARTS") await main() })() diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 4d908f6cd..104dedf83 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -8,16 +8,24 @@ import { getJamListArgs } from "./parser.mjs"; import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; +import { Client } from 'ssh2'; + const { debounce } = require('lodash'); const chokidar = require('chokidar'); const jamFolder = getJamFolder() -let lastInfo; let watcher; const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); - - +let NODESINFO = [] +let currIP ; +if (os.platform() === 'win32') { +currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); +} else if (os.platform() === 'darwin') { +currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); +} else if (os.platform() === 'linux') { +currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); +} @@ -46,7 +54,9 @@ function getRunningDirs(){ function getWatchList(){ const watchList = [] const appFolder = getAppFolder() + //make sure it is watching recursively watchList.push(`${jamFolder}/ports`) + watchList.push(`${jamFolder}/remote`) const dirs = getRunningDirs() for(let dir of dirs.keys()){ for(let port of dirs.get(dir)){ @@ -81,11 +91,14 @@ function watch(filters) { } const updateInfo = debounce(async () => { await sleep(500); - if (!filters || filters === "all" || Object.keys(filters).length === 0) { + if (!filters || filters.all === true || Object.keys(filters).length === 0) { const info = getNodeInfo(); - lastInfo = info; + NODESINFO = [] + await main(true) + - if (info.length === 0) { + + if (info.length + NODESINFO.length === 0) { console.log("---------"); console.log("There is no program running"); @@ -94,13 +107,21 @@ function watch(filters) { printHeader(); printNodeInfo(info); + printNodeInfo(NODESINFO); } } else { const nodeinfo = getNodeInfo(); - const filtered = filter(nodeinfo, filters); - lastInfo = nodeinfo; + let keysToRemove = ["root","remote","help","all" ]; + let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + const filtered = filter(nodeinfo, filteredObj); + NODESINFO = [] + await main(true) + + + + - if (filtered.length === 0) { + if (filtered.length + NODESINFO.length === 0) { console.log("---------"); console.log("There is no such program running"); @@ -109,11 +130,14 @@ function watch(filters) { printHeader(); printNodeInfo(filtered); + printNodeInfo(NODESINFO); + } } }, 500); let watchList = getWatchList() - watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', () => { + watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', (event, path) => { + console.log(`Event: ${event}, Path: ${path}`); watchList = updateWatchList(watchList) updateInfo(); }); @@ -134,39 +158,85 @@ export function dirNameToProgramName(dirName){ } - -function getNodeInfo(){ +function getNodeInfo(root=null){ const appToPortMap = getRunningDirs() + + // console.log(appToPortMap) + const jamfolder = getJamFolder() const appfolder = getAppFolder(); - const nodeInfo= []; + const nodeInfo =[] + if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ + return [] + } + for(let app of appToPortMap.keys()){ const appName = dirNameToAppName(app) const programName = dirNameToProgramName(app) for(let port of appToPortMap.get(app)){ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" } - const dirPath = `${appfolder}/${app}/${port}` - if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ - throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") - } - for(let fileName of Object.keys(fileNames)){ - if(fs.existsSync(`${dirPath}/${fileName}`)){ - const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); - fileNames[fileName] = data; + if(root){ + if(fs.existsSync(`${appfolder}/${app}/${port}/root`)){ + const rootIP = fs.readFileSync(`${appfolder}/${app}/${port}/root`).toString().trim(); + if(rootIP === root){ + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-"} + const dirPath = `${appfolder}/${app}/${port}` + if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ + throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + } + for(let fileName of Object.keys(fileNames)){ + if(fs.existsSync(`${dirPath}/${fileName}`)){ + const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + fileNames[fileName] = data; + } + } + fileNames["portNum"] = String(port) + fileNames["appName"] = appName + fileNames["programName"] = programName + if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ + fileNames["status"] = "paused" + } + else{ + fileNames["status"] = "running" + + } + + fileNames["host"] = currIP + + + + nodeInfo.push(fileNames) + + } } } - fileNames["portNum"] = String(port) - fileNames["appName"] = appName - fileNames["programName"] = programName - if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ - fileNames["status"] = "paused" - } else{ - fileNames["status"] = "running" - + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" } + const dirPath = `${appfolder}/${app}/${port}` + if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ + throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + } + for(let fileName of Object.keys(fileNames)){ + if(fs.existsSync(`${dirPath}/${fileName}`)){ + const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + fileNames[fileName] = data; + } + } + fileNames["portNum"] = String(port) + fileNames["appName"] = appName + fileNames["programName"] = programName + if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ + fileNames["status"] = "paused" + } + else{ + fileNames["status"] = "running" + + } + fileNames["host"] = "localHost" + + + nodeInfo.push(fileNames) } - nodeInfo.push(fileNames) } } @@ -176,15 +246,17 @@ function getNodeInfo(){ function printNodeInfo(info){ for (let row of info){ - - const headerString = ` ${row["appName"].padEnd(10)} ${row["programName"].padEnd(10)} ${("Local:"+row["portNum"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)}`; + if(row["host"] === currIP){ + row["host"] = "localHost" + } + const headerString = ` ${row["appName"].padEnd(10)} ${row["programName"].padEnd(10)} ${("Local:"+row["portNum"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)}`; console.log(headerString) } } function printHeader(){ - const headerString = ` ${"NAME".padEnd(10)} ${"PROGRAM".padEnd(10)} ${"HOST".padEnd(10)} ${"PARENT".padEnd(10)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(10)} ${"C-NODES".padEnd(10)} ${"TMUX-ID".padEnd(10)} ${"STATUS".padEnd(10)}`; + const headerString = ` ${"NAME".padEnd(10)} ${"PROGRAM".padEnd(10)} ${"HOST".padEnd(10)} ${"PARENT".padEnd(10)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(10)} ${"C-NODES".padEnd(10)} ${"TMUX-ID".padEnd(10)} ${"STATUS".padEnd(10)} ${"HOST".padEnd(10)}`; console.log(headerString) } @@ -205,8 +277,62 @@ function filter(nodeinfo, filters){ return filteredInfo; } +function getRemoteMachines(){ + const jamfolder = getJamFolder() + if(!fs.existsSync(`${jamfolder}/remote`)){ + return [] + } + return (fs.readdirSync(`${jamfolder}/remote`)) + +} + +async function makeConnection(config){ + return await new Promise((resolve, reject) => { + const client = new Client(); + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); +} + +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + if (err) console.log(error); + stream.on("close", () => { + resolve("closed") + }) + stream.on("data" , (data) =>{ + // console.log(data.toString()) + if(data.includes("NODEINFO##")){ + let JSONrow = data.toString().trim().split("##")[1] + let row; + try{ + row = JSON.parse(JSONrow) + } + catch(error){ + console.log(error) + } + + + + + NODESINFO.push(row) + } + }) + }) + })) +} + +async function main(update=null){ + NODESINFO = [] -async function main(){ let args; try{ args = getJamListArgs(process.argv) @@ -232,58 +358,131 @@ async function main(){ ) process.exit(1); } - + console.log(error) throw error; } const filters = args.filters; const monitor = args.monitor; const jamfolder = getJamFolder() - - if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ - console.log("there is No program running") - if(!monitor){ - process.exit(0) - } + if(filters.remote || update){ + + const map = getRemoteMachines(); + + for(let machines of map){ + + const [host,port] = machines.split("_"); + const config = { + host: host, + port: port, + username: 'admin', + password: 'admin' + }; + const client = await makeConnection(config); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let args= "" + for(let filter of Object.keys(filters)){ + if(filter === "remote"){ + continue + } + if(filter === "all" || filter === "help" ){ + if(filters.filter) + { + args = args + `--${filter} ` + + } + continue + + } + args = args + `--${filter}=${filters[filter]} ` + } + args =args.trim() + - + const script = `zx jamlist.mjs ${args} --root=${currIP}` + await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) + + } } + if(filters.root){ - else if(!filters || filters === "all" || Object.keys(filter) === 0){ - await $`zx ${jamcleanPath}` - const info = getNodeInfo(); - lastInfo = info; - if(info.length === 0 ){ - console.log("there is No program running") - if(!monitor){ - process.exit(0) - } + if(filters.all){ + + await $`zx ${jamcleanPath}` + + + const info = getNodeInfo(filters.root); + + + + for(let row of info){ + + const jsonRow = JSON.stringify(row) + await sleep(50) + } } - printHeader(); - printNodeInfo(info); - } + else{ - else{ - await $`zx ${jamcleanPath}` - const nodeinfo = getNodeInfo() - const filtered = filter(nodeinfo, filters) - lastInfo = filtered; - if(filtered.length === 0 ){ - console.log("there is No such program running") - if(!monitor){ - process.exit(0) + await $`zx ${jamcleanPath}` + const nodeinfo = getNodeInfo(filters.root) + + + let keysToRemove = ["root","remote","help","all" ]; + let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + + const filtered = filter(nodeinfo, filteredObj) + + if(filtered.length === 0 ){ + process.exit(0) + } + for(let row of filtered){ + const jsonRow = JSON.stringify(row) + console.log(`NODEINFO##${jsonRow}`) + await sleep(50) } } - printHeader(); - printNodeInfo(filtered); - } - if(monitor){ - watch(filters); } + else if(!update){ + if(filters.all){ + await $`zx ${jamcleanPath}` + const info = getNodeInfo(); + if(info.length + NODESINFO.length === 0 ){ + console.log("there is No program running") + if(!monitor){ + process.exit(0) + } + } + printHeader(); + printNodeInfo(info); + printNodeInfo(NODESINFO) + } + else{ + // console.log("got here") + await $`zx ${jamcleanPath}` + const nodeinfo = getNodeInfo() + let keysToRemove = ["root","remote","help","all" ]; + let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + + const filtered = filter(nodeinfo, filteredObj) + if(filtered.length + NODESINFO.length === 0 ){ + console.log("there is No such program running") + if(!monitor){ + process.exit(0) + } + } + printHeader(); + printNodeInfo(filtered); + printNodeInfo(NODESINFO) + } + if(monitor){ + watch(filters); + } + } } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index cdd16f26e..fa58367ca 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -27,9 +27,9 @@ ADD GIT LOG */ -// +//FORE NOW DON"T RUN REMOTE TASKS ON THE FOREGROUND //global variables -let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote; +let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote, root; const tmuxIds = []; let removablePort @@ -122,18 +122,51 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( } ) ) - +// async function executeScript(client, command) { +// return await new Promise((resolve, reject) => { +// client.exec(command, (err, stream) => { +// if (err) return reject(err); +// let result = ''; +// stream.on('close', () => { +// resolve(result); +// }); +// stream.on('data', (data) => { +// result += data.toString(); +// }); +// stream.stderr.on('data', (data) => { +// result += data.toString(); +// }); +// stream.on('error', (streamErr) => { +// reject(streamErr); +// }); +// }); +// }); +// } async function executeScript(client, command){ + console.log("GOT HERE") return (await new Promise((resolve, reject) =>{ client.exec(command, (err,stream) =>{ - if (err) reject(err); - let result = '' + if (err){ + console.log(err) + reject(err); + } + let result; stream.on("close", () => { + console.log("closed") resolve(result) }) - stream.on("data" , (data) =>{ - result = result + data; + stream.on("data" , async (data) =>{ + console.log(data.toString()) + if(data.includes("MY PORT IS:")) + { + console.log(data.toString()) + result = data.toString().trim().split(":")[1] + } + if(data.includes("EXIT BG")){ + // await sleep(5000) + resolve(result) + } }) }) })) @@ -213,7 +246,7 @@ function show_usage(){ //teste.working. async function startmqtt(port, cFile){ - + const jamfolder = getJamFolder() try{ await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); @@ -230,6 +263,8 @@ async function startmqtt(port, cFile){ detached: true, }; mqttProcesse = spawn(command, args, options); + console.log(mqttProcesse.pid) + fs.writeFileSync(`${jamfolder}/mqttpid/${port}`,`${mqttProcesse.pid}` ) mqttProcesse.unref(); return; @@ -255,6 +290,9 @@ async function dojamout_p1(pnum ,floc) { if(Type === "device"){ fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); } + if(root){ + fs.writeFileSync(`${floc}/${pnum}/root`, root) + } } @@ -323,6 +361,7 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ }); } + } @@ -360,6 +399,8 @@ function dojamout_p2_bg(pnum, floc, jappid, group=null){ if(!NOVERBOSE){ console.log("Started the J node in background") } + + console.log("EXIT BG") process.exit(0) } @@ -383,6 +424,7 @@ async function doaout(num,port,group,datap,myf,jappid){ "-o": datap, } let cargs = getCargs(argObject) + console.log("this is my cargs",cargs ) await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; if (!log){ @@ -400,8 +442,20 @@ async function doaout(num,port,group,datap,myf,jappid){ if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else - await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; - + + { + console.log("WTFWTFWTF") + console.log("GOT TO THE TMUX") + console.log(process.cwd()) + console.log(myf) + console.log(port) + console.log(`${myf}/${port}/log.${counter}`) + console.log(fs.existsSync(`${myf}/${port}`)) + //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) + await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; + + + } } } tmuxIds.push(`${tmux}-${counter}`) @@ -457,7 +511,11 @@ function setuptmux(path, appfolder) { //patially tested, hopefullt works async function startredis(port) { try{ - const p =$`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); + + const p = $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); + + console.log(p) + } catch(error){ console.log(error) @@ -475,6 +533,7 @@ async function waitforredis(port){ } } catch(error){ + console.log(error) } if (!NOVERBOSE) { console.log("Trying to find Redis server..."); @@ -591,6 +650,8 @@ async function runNoneDevice(iport){ fileDirectoryMqtt(folder,iport,jamfolder,app) const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) await dojamout(iport, folder, jappid) + console.log("SCRIPT RUNNING") + } async function runDevice(iport,dport,group){ @@ -601,6 +662,7 @@ async function runDevice(iport,dport,group){ setuptmux(`${folder}/${iport}`, appfolder) await doaout(num,iport, group, dport,folder,jappid) await dojamout_p2(iport, folder,jappid,group ) + console.log("SCRIPT RUNNING") } @@ -629,6 +691,7 @@ async function main(){ port, file, remote, + root, } = jamrunParsArg(process.argv)) } @@ -647,14 +710,29 @@ async function main(){ let jdata; let client; if(remote){ - console.log("SET UP SSH CONNECTION"); const config = { host: 'localhost', port: remote, username: 'admin', - // You may need to specify a password or private key depending on your SSH server configuration - password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') - }; + password: 'admin' + }; + if(resume){ + const jamfolder = getJamFolder() + const fileNoext = getFileNoext(file); + if(!fs.existsSync(`${jamfolder}/remote`)){ + console.log(`this machine is not the root for any running app`); + process.exit(0); + } + if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ + console.log(`this machine is not the root for any running app on ${config.host}_${config.port}`); + process.exit(0); + } + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}`).toString().trim().split("\n") + if(!remoteApps.includes(`${fileNoext}_${app}`)){ + console.log(`this machine is not the root for any running ${fileNoext}_${app}`); + process.exit(0) + } + } client = await new Promise((resolve, reject) => { const client = new Client(); @@ -669,36 +747,49 @@ async function main(){ client.connect(config); }); const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) - //QUESTION: HOW TO FIND WHERE THE FILE EXACTLY IS?(JAMRUN>MJS) - const toExecute = `zx jamrun ${remoteArgs}` - console.log(toExecute) - console.log(remoteArgs, "from JAM RUN") - console.log(await executeScript(client, "cd JAMScript/tools && node --version")) - console.log(await executeScript(client, "ls")) - - // try{ - // const check = await executeScript(client, "node --version") - // console.log(check) - // } - // catch(error){ - // throw error - // } - //run the new sctipy. - const jamfolder = getJamFolder() - const fileNoext = getFileNoext(file); - if(!fs.existsSync(`${jamfolder}/remote`)){ - fs.mkdirSync(`${jamfolder}/remote`); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let currIP ; + if (os.platform() === 'win32') { + currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'darwin') { + currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'linux') { + currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); } - if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ - const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}`).toString().trim().split("\n") - if(!remoteApps.includes(`${fileNoext}_app`)){ - fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}`, `${fileNoext}_app`); + const toExecute = `zx jamrun.mjs ${remoteArgs} --root=${currIP}` + console.log(toExecute) + const remoteTerminal = '/dev/pts/1'; + // const command = `${pathExport} && ${changeDir} && ${toExecute} > > ${remoteTerminal} 2>&1` + // THIS SHOULD BE THE IDEAM SOLUTION!!!!!!!!! + // const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP} > ${remoteTerminal} 2>&1`) + const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP}`) + + console.log(myPort) + if(!resume){ + const jamfolder = getJamFolder() + const fileNoext = getFileNoext(file); + if(!fs.existsSync(`${jamfolder}/remote`)){ + fs.mkdirSync(`${jamfolder}/remote`); } - } - else{ - fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}`, `${fileNoext}_app`) + if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ + fs.mkdirSync(`${jamfolder}/remote/${config.host}_${config.port}`); + + } + if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`)){ + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`).toString().trim().split("\n") + if(!remoteApps.includes(`${fileNoext}_${app}`)){ + console.log("NOT INCLUDEDE APPEND") + fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`); + } + } + else{ + console.log("FILE DONT EXISTS") + fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`) + } } process.exit(0) + } @@ -756,7 +847,7 @@ async function main(){ } let isDevice; - + console.log("SELECTING THE TYPE") switch(Type){ case "cloud": if(resume){ @@ -836,6 +927,7 @@ async function main(){ if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } + console.log(`MY PORT IS:${removablePort}`) if(isDevice) await runDevice(iport,dport,group) @@ -846,7 +938,13 @@ async function main(){ const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); -console.log(jamcleanPath) -await $`zx ${jamcleanPath}` + +// console.log(jamcleanPath) + +// await $`zx ${jamcleanPath}` + + await main() +// const p = await $`redis-server --port ${port}` +// console.log(p) diff --git a/tools/parser.mjs b/tools/parser.mjs index 137588382..3bbc76f04 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -1,5 +1,6 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; +import { type } from 'os'; import { string } from 'random-js'; import { fs } from 'zx'; @@ -20,7 +21,7 @@ let [long, lat] = generatelonglat(); const jamrunOptionDefinitions = [ - { name: 'help', alias: 'h', type: Boolean, defaultValue: false}, + { name: 'help',type: Boolean, defaultValue: false}, {name : 'app', type: String , defaultValue: undefined}, {name : 'tags', type: String , defaultValue: undefined}, {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, @@ -41,23 +42,29 @@ const jamrunOptionDefinitions = [ {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, {name: 'resume', type: Boolean, defaultValue: false}, {name: "port", type: Number, defaultValue: undefined}, - {name: "remote", type:Number, defaultValue: undefined} + {name: "remote", type:Number, defaultValue: undefined},//the IP ADDRESS YOU WANT TO CONNECT TO + {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call + ]; const jamlistOptionDefinition = [ - {name : "help", alias : "h", type: Boolean, defaultValue : false }, - {name : "monitor", alias : "m", type: Boolean, defaultValue : false }, + {name : "help", type: Boolean, defaultValue : false }, + {name : "all", type: Boolean, defaultValue : false }, + {name : "monitor", type: Boolean, defaultValue : false }, {name : 'type', type: String , defaultValue: undefined }, {name : 'dataStore', type: String , defaultValue: undefined }, {name : 'tmuxid', type: String , defaultValue: undefined }, {name : 'portNum', type: String , defaultValue: undefined }, {name : 'appName', type: String , defaultValue: undefined }, {name : 'programName', type: String , defaultValue: undefined }, + {name : 'hostIP', type: String , defaultValue: undefined }, + {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO + {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call ]; const jamkillOptionDefinition = [ - {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : "help", type: Boolean, defaultValue : false }, {name : 'all', type: Boolean , defaultValue: false }, {name : 'reset', type: Boolean , defaultValue: false }, {name : 'app', type: Boolean , defaultValue: false }, @@ -66,17 +73,20 @@ const jamkillOptionDefinition = [ {name : 'port', type: Boolean , defaultValue: false }, {name: "portDir", type: Boolean, defaultValue: false }, {name: "pause", type: Boolean, defaultValue: false }, - {name : 'name', alias : "n" , type: String , defaultValue: undefined }, + {name : 'name', type: String , defaultValue: undefined }, + {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO + {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call + ]; const jamclogOptionDefinition = [ - {name : "help", alias : "h", type: Boolean, defaultValue : false }, + {name : "help", type: Boolean, defaultValue : false }, {name : "program", type: String, defaultValue : undefined }, {name : "app", type: String, defaultValue : undefined }, {name: "port", type:String, defaultValue: undefined}, - {name : "j", alias: "j", type: Boolean, defaultValue : false }, - {name : "c", alias: "c", type: Boolean, defaultValue : false }, - {name : "tail", alias: "t", type: Number, defaultValue : undefined }, + {name : "j", type: Boolean, defaultValue : false }, + {name : "c", type: Boolean, defaultValue : false }, + {name : "tail", type: Number, defaultValue : undefined }, @@ -143,7 +153,7 @@ function checkJXEfile(arg){ } } const absolutePath = path.resolve(file); - if(!fs.existsSync(absolutePath)){ + if(!fs.existsSync(absolutePath) && !arg.some(item => item.startsWith('--remote='))){ throw new Error(`File: ${file} not found`) } @@ -210,7 +220,7 @@ export function jamrunParsArg(argv){ if(!varsObject.app){ throw new Error("MISSING APP NAME") } - console.log(varsObject) + return varsObject; } //ASK wHAT VARIABLES ARE OPTIONAL @@ -253,6 +263,7 @@ export function getJamListArgs(argv){ } catch(error){ } + if(options?.help || !options){ const error = new Error("SHOW USAGE") @@ -284,7 +295,7 @@ export function getJamListArgs(argv){ } - + return {filters : filters, monitor: options.monitor} @@ -342,7 +353,7 @@ export function getKilltArgs(argv){ flag = "program"; } - return {"flag": flag, "name" : options.name, "pause": options.pause} + return {"flag": flag, "name" : options.name, "pause": options.pause , "remote": options.remote , "root":options.root} } /** @@ -371,11 +382,12 @@ export function getKilltArgs(argv){ */ export function getRemoteArgs(argObject){ const args =[] + args.push(argObject.file) for(let arg of Object.keys(argObject)){ if(argObject[arg] === false || argObject[arg] === undefined ){ continue; } - if(arg === "long" || arg ==="lat" || arg === "Type" || arg === "NOVERBOSE" || arg === "remote"){ + if(arg === "long" || arg ==="lat" || arg === "Type" || arg === "NOVERBOSE" || arg === "remote" || arg =="file"){ continue; } if(argObject[arg] === true){ From 7e72a88408b1c9fc2fc1f422445c59bd296b9a4a Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 2 Aug 2024 21:51:42 -0400 Subject: [PATCH 049/126] remoteLog --- tools/jamlog.mjs | 81 +++++++++++++++++++++++++++++++++++++++++++++++- tools/parser.mjs | 4 ++- 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs index f09b8f886..996c72c2b 100644 --- a/tools/jamlog.mjs +++ b/tools/jamlog.mjs @@ -1,7 +1,9 @@ #!/usr/bin/env zx -import { getAppFolder } from "./fileDirectory.mjs"; +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import { getLogArgs } from "./parser.mjs"; const readline = require('readline'); +import { Client } from 'ssh2'; + function printlogArchived(path,tail){ @@ -71,6 +73,34 @@ function printlogArchived(path,tail){ } +async function makeConnection(config){ + return await new Promise((resolve, reject) => { + const client = new Client(); + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); +} + +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + if (err) console.log(error); + stream.on("close", () => { + resolve("closed") + }) + stream.on("data" , (data) =>{ + console.log(data.toString()) + }) + }) + })) +} async function main(){ let arg; @@ -110,7 +140,56 @@ async function main(){ const logFiles =arg.file.split("/")[0]+"/log"; const tail = arg.tail const appFolder = getAppFolder() + const jamfolder = getJamFolder() const path = `${appFolder}/${logFiles}/${port}` + if(arg.remote){ + if(!fs.existsSync(`${jamfolder}/remote/localhost_${arg.remote}`)){ + console.log("there is no such remote machine available for this host") + } + + const config = { + host: "localhost", + port: arg.remote, + username: 'admin', + password: 'admin' + }; + const client = await makeConnection(config); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let args = ''; + //return {file : file , flag : flag, tail : options.tail, remote: options.remote} + for(let myArg of Object.keys(arg)){ + if(myArg === "file"){ + const file = arg[myArg]; + const port = file.split("/")[1]; + const app = (file.split("/")[0]).split("_")[1]; + const program = (file.split("/")[0]).split("_")[0]; + args = args + `--app=${app} --program=${program} --port=${port} ` + } + if(myArg === "flag"){ + if(arg.flag === "all"){ + args = args + `--j --c ` + } + else{ + args = args + `--${arg.flag} ` + } + + } + if(myArg === "tail"){ + args = args + `--tail=${arg.tail} ` + } + } + const finalArg = args.trim() + console.log(args) + const command = `${pathExport} && ${changeDir} && zx jamlog.mjs ${finalArg}` + console.log(command) + await makeConnection(config) + await executeScript(client, command) + process.exit(0) + + + } + if(fs.existsSync(`${appFolder}/${arg.file}`)){ if(flag === "all"){ if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ diff --git a/tools/parser.mjs b/tools/parser.mjs index 3bbc76f04..4157ef0a1 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -87,6 +87,8 @@ const jamclogOptionDefinition = [ {name : "j", type: Boolean, defaultValue : false }, {name : "c", type: Boolean, defaultValue : false }, {name : "tail", type: Number, defaultValue : undefined }, + {name : "remote", type: String, defaultValue : undefined }, + @@ -438,7 +440,7 @@ export function getLogArgs(argv){ else{ flag = (options.j)? "j" : "c" } - return {file : file , flag : flag, tail : options.tail} + return {file : file , flag : flag, tail : options.tail, remote: options.remote} } From 58f811dc7ee4333caddad04027b44e359f64f15b Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 2 Aug 2024 22:30:06 -0400 Subject: [PATCH 050/126] usage update --- tools/jamkill.mjs | 2 ++ tools/jamlist.mjs | 2 +- tools/jamrun.mjs | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index aa7c2f828..5969857b7 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -527,6 +527,8 @@ async function main(){ [--reset] is the hard reset. it closes all the running nodes, mosquito,tmux,reddis and remove all the directories including ports and apps + [--remote] is a flag to kill programs on remote machines as well if the program root is current machine + ` ) } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 104dedf83..515c9ffe2 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -352,7 +352,7 @@ async function main(update=null){ [monitor] use this flag to turnn on the monitoring mode [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] the flags abouve are used for filtering the jamlist - + [--remote] is a flag to list the apps running on the remote machines. only for programs that chave current machine as root ` ) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index fa58367ca..33bee7f00 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -219,6 +219,8 @@ function show_usage(){ Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags Use --port only with --resume (it's gonna be dissabled if --resume flag is is not on.) to resume the program on the program on the right port. + + USE --remote to run the jamscript on another machine: --remote= Usage: jamrun file.jxe [--app=appl_name] From 4af06ca70dac96714726c932a70ae83f91608176 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 5 Aug 2024 16:36:34 -0400 Subject: [PATCH 051/126] minor fixes pre undockerizing the config --- tools/jamclean.mjs | 16 ++++++++++++---- tools/jamkill.mjs | 10 +++++----- tools/jamlist.mjs | 40 ++++++++++++++++++++++++++++------------ 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 86b50de4e..90c09bee9 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -245,7 +245,7 @@ async function isCfileRunning(Dir,port,num){ const pid = fs.readFileSync(`${cdevID}`).toString().trim(); let running; try{ - const p = await $`ps -p ${pid} | grep ./a.out | wc -l | tr -d '[:space:]'` + const p = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'` running = Number(p.stdout.toString().trim()); } catch(error){ @@ -456,7 +456,7 @@ async function cleanRemote(toRemove){ if(!port){ fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); } - if(!fs.readFileSync(`${jamfolder}/remote/${machine}/${port}`)){ + if(!fs.existsSync(`${jamfolder}/remote/${machine}/${port}`)){ return } const apps = fs.readFileSync(`${jamfolder}/remote/${machine}/${port}`).toString().trim().split("\n"); @@ -467,7 +467,7 @@ async function cleanRemote(toRemove){ } else{ const toWrite = currApps.join("\n") - fs.writeFileSync(`${jamfolder}/remote/${machine}/${port}`,`${toWrite}`) + fs.writeFileSync(`${jamfolder}/remote/${machine}/${port}`,`${toWrite}\n`) } } if((fs.readdirSync(`${jamfolder}/remote/${machine}`)).length === 0 ){ @@ -502,7 +502,15 @@ async function cleanRemote(toRemove){ username: 'admin', password: 'admin' }; - const client = await makeConnection(config); + let client + try{ + client = await makeConnection(config); + } + catch(error){ + fs.rmSync(`${jamFolder}/remote/${machines}`, { recursive: true, force: true }); + continue; + } + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir= "cd JAMScript/tools" const script = `zx jamclean.mjs --root=${currIP} --hash=${arg}` diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 5969857b7..2fce57659 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -268,9 +268,11 @@ function killDataForAll(root){ const toClean=[]; const activeDirs = getRunningDirs(); const appfolder = getAppFolder() + console.log("ACTIVE DIRS", activeDirs) for(let dir of activeDirs.keys()){ for(let port of activeDirs.get(dir)){ if(root){ + console.log("root exists") if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); if(rootIP === root){ @@ -285,6 +287,7 @@ function killDataForAll(root){ } else{ + console.log("root does not exists") const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), @@ -294,6 +297,7 @@ function killDataForAll(root){ } } } + console.log("TO CLEAN", toClean) return toClean } async function killJamRun(data){ @@ -402,11 +406,7 @@ async function jamKill(flag, name, pause, root) const programName = data.programName const portNumber = data.portNumber if( - (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`)) || - (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/numCnodes`)) || - (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/mqtt.conf`)) || - (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/dataStore`)) || - (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`)) + (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`)) ){ console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 515c9ffe2..b240ca436 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -51,12 +51,16 @@ function getRunningDirs(){ } return appToPort; } -function getWatchList(){ +function getWatchList(filters){ const watchList = [] const appFolder = getAppFolder() + console.log(filters) //make sure it is watching recursively watchList.push(`${jamFolder}/ports`) - watchList.push(`${jamFolder}/remote`) + if(filters.remote){ + watchList.push(`${jamFolder}/remote`) + + } const dirs = getRunningDirs() for(let dir of dirs.keys()){ for(let port of dirs.get(dir)){ @@ -75,8 +79,8 @@ function watch(filters) { await $`zx ${jamcleanPath}` }, 1000); function updateWatchList(watchList){ - - const newWatchList = getWatchList(); + console.log(filters, "this is my filters from watch function") + const newWatchList = getWatchList(filters); for(let item of newWatchList){ if(!watchList.includes(item)){ watcher.add(item) @@ -93,8 +97,10 @@ function watch(filters) { await sleep(500); if (!filters || filters.all === true || Object.keys(filters).length === 0) { const info = getNodeInfo(); - NODESINFO = [] - await main(true) + if(filters.remote){ + NODESINFO = [] + await main(true) + } @@ -107,15 +113,21 @@ function watch(filters) { printHeader(); printNodeInfo(info); - printNodeInfo(NODESINFO); + if(filters.remote){ + printNodeInfo(NODESINFO); + } } } else { const nodeinfo = getNodeInfo(); let keysToRemove = ["root","remote","help","all" ]; let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); const filtered = filter(nodeinfo, filteredObj); - NODESINFO = [] - await main(true) + console.log("INCLUDING REMOTE?", filters.remote); + if(filters.remote){ + NODESINFO = [] + await main(true) + } + @@ -130,12 +142,14 @@ function watch(filters) { printHeader(); printNodeInfo(filtered); + if(filters.remote){ printNodeInfo(NODESINFO); + } } } }, 500); - let watchList = getWatchList() + let watchList = getWatchList(filters) watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', (event, path) => { console.log(`Event: ${event}, Path: ${path}`); watchList = updateWatchList(watchList) @@ -366,6 +380,7 @@ async function main(update=null){ const jamfolder = getJamFolder() if(filters.remote || update){ + console.log("GOT TO THE remote call SECTION") const map = getRemoteMachines(); @@ -407,6 +422,7 @@ async function main(update=null){ } if(filters.root){ + console.log("GOT TO THE root SECTION") if(filters.all){ @@ -446,7 +462,7 @@ async function main(update=null){ } } else if(!update){ - + console.log("GOT TO THE LOCAL SECTION") if(filters.all){ await $`zx ${jamcleanPath}` const info = getNodeInfo(); @@ -462,7 +478,7 @@ async function main(update=null){ } else{ - // console.log("got here") + await $`zx ${jamcleanPath}` const nodeinfo = getNodeInfo() let keysToRemove = ["root","remote","help","all" ]; From 934a543f8fd8c61f1688dc3ff5de803c7a3f3f98 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 5 Aug 2024 19:11:17 -0400 Subject: [PATCH 052/126] resume fixed local only --- tools/jamkill.mjs | 9 +++++++-- tools/jamrun.mjs | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 2fce57659..21d1a7c07 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -541,6 +541,8 @@ async function main(){ const remotes = fs.readdirSync(`${jamfolder}/remote`) console.log(remotes) console.log("GOT HERE 2") + console.log(args.pause, "IF IT IS PAUSED") + for(let remote of remotes){ const [host,port] = remote.split("_"); console.log(host) @@ -568,22 +570,25 @@ async function main(){ const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir= "cd JAMScript/tools" let toExecute; + if(args.flag == "reset"){ toExecute = `zx jamkill.mjs --reset --root=${currIP}` } + else if(args.flag == "all"){ if(!args.pause) toExecute = `zx jamkill.mjs --${args.flag} --root=${currIP}` else - toExecute = `zx jamkill.mjs --${args.flag} --${args.pause} --root=${currIP}` + toExecute = `zx jamkill.mjs --${args.flag} --pause --root=${currIP}` } else{ if(!args.pause) toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --root=${currIP}` else - toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --${args.pause} --root=${currIP}` + toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --pause --root=${currIP}` } console.log(toExecute) + const command=`${pathExport} && ${changeDir} && ${toExecute}` await executeScript(client, command); } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 33bee7f00..bececde3b 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -682,6 +682,7 @@ async function main(){ local_registry, bg, NOVERBOSE, + resume, log, old, local, From eb8dbfc3078a77ee823ba048d52286d729e4958d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 5 Aug 2024 19:33:57 -0400 Subject: [PATCH 053/126] remote resume fixed --- tools/jamclean.mjs | 8 +++++++- tools/jamrun.mjs | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 90c09bee9..904c74cbe 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -341,7 +341,13 @@ async function clean(){ } const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") for(let dir of dirs){ - const isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false + let isPaused; + try{ + isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false + } + catch(error){ + + } if(isPaused){ continue; } diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index bececde3b..fd6e867d7 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -705,7 +705,8 @@ async function main(){ process.exit(1) } else{ - throw error + show_usage() + process.exit(1) } } let folder; From 245fed1ba6bb6781b57fc7320386517daa8cda0d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 5 Aug 2024 20:18:03 -0400 Subject: [PATCH 054/126] quick fix --- tools/jamlist.mjs | 5 ----- tools/jamrun.mjs | 11 ++--------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index b240ca436..35c902391 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -128,11 +128,6 @@ function watch(filters) { await main(true) } - - - - - if (filtered.length + NODESINFO.length === 0) { console.log("---------"); diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index fd6e867d7..07aa09f2e 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -700,14 +700,7 @@ async function main(){ catch(error){ - if(error.type === "ShowUsage"){ - show_usage() - process.exit(1) - } - else{ - show_usage() - process.exit(1) - } + throw(error) } let folder; let ifile; @@ -731,7 +724,7 @@ async function main(){ console.log(`this machine is not the root for any running app on ${config.host}_${config.port}`); process.exit(0); } - const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}`).toString().trim().split("\n") + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`).toString().trim().split("\n") if(!remoteApps.includes(`${fileNoext}_${app}`)){ console.log(`this machine is not the root for any running ${fileNoext}_${app}`); process.exit(0) From 785170e124b623241f3f4f72c49e07c8479b0018 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Mon, 5 Aug 2024 21:49:56 -0400 Subject: [PATCH 055/126] jam run resume path fix --- tools/jamrun.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 07aa09f2e..42b05a7b4 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -720,7 +720,7 @@ async function main(){ console.log(`this machine is not the root for any running app`); process.exit(0); } - if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ + if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`)){ console.log(`this machine is not the root for any running app on ${config.host}_${config.port}`); process.exit(0); } From 29688a2f3d5e9dcf2f930e587a1bfc601e5a8a0d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 7 Aug 2024 19:09:23 -0400 Subject: [PATCH 056/126] PATCH FIX, USAGE UPDATE, CLEANUP --- tools/fileDirectory.mjs | 69 --------- tools/jamclean.mjs | 117 --------------- tools/jamkill.mjs | 307 +++++++++++++++++++--------------------- tools/jamlist.mjs | 68 ++++----- tools/jamlog.mjs | 22 +-- tools/jamrun.mjs | 267 +++++++++++----------------------- tools/parser.mjs | 25 +--- 7 files changed, 269 insertions(+), 606 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index e42acdcfd..c5a19216c 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -147,72 +147,3 @@ export function fileDirectoryMqtt(folder, iport,jamfolder,app){ } -// export function getJamlistPaths(appToPortMap){ -// const fileNames =["machType","appid", "dataStore","tmuxid", "parentId", "numCnodes" ] -// const paths = []; -// for(let app of appToPortMap.key()){ -// for(let port of appToPortMap.get(app)){ -// info = {} -// } -// } -// } - - - -// async function printNodeInfo(dirName, programName){ -// const path = `${process.cwd()}/${dirName}` -// let mType,appid,dstore,tmuxid,parid - -// if(fs.existsSync(`${path}/machType`)){ -// mType= fs.readFileSync(`${path}/machType`).toString().trim() -// } -// else{ -// mType = "-"; - -// } -// if(fs.existsSync(`${path}/appid`)){ -// appid= fs.readFileSync(`${path}/appid`).toString().trim() -// } -// else{ -// appid = "-" -// } -// if(fs.existsSync(`${path}/dataStore`)){ -// dstore= fs.readFileSync(`${path}/dataStore`).toString().trim() -// } -// else{ -// dstore = "-" -// } -// if(fs.existsSync(`${path}/tmuxid`)){ -// tmuxid= fs.readFileSync(`${path}/tmuxid`).toString().trim() -// } -// else{ -// tmuxid = "-" -// } -// if(fs.existsSync(`${path}/parentId`)){ -// parid= fs.readFileSync(`${path}/parentId`).toString().trim() -// } -// else{ -// parid = "-" -// } -// let cdevs = 0; - -// if(mType === "device"){ - -// if(fs.existsSync(`${path}/numCnodes`)){ -// cdevs= fs.readFileSync(`${path}/numCnodes`).toString().trim() -// } -// else{ -// cdevs = "-" -// } - -// const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${(cdevs.toString()).padEnd(15)} ${tmuxid.padEnd(15)}`; -// console.log(headerString) - -// } -// else{ -// const headerString = ` ${appid.padEnd(15)} ${appid.padEnd(15)} ${programName.padEnd(15)} ${("Local:"+dirName).padEnd(15)} ${parid.padEnd(15)} ${dstore.padEnd(15)} ${mType.padEnd(15)} ${("--").padEnd(15)} ${tmuxid.padEnd(15)}`; -// console.log(headerString) -// } - - -// } \ No newline at end of file diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 904c74cbe..8e41384b3 100644 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -6,124 +6,8 @@ import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; import { Client } from 'ssh2'; -////////////////// //////// /////// //////// ////// ////// ///NOTE: NAME CAN NOT HAVE = IN IT -/////////////what should we do when we see new? linger there? wait/force. what to do exactly?. it is for broken apps.MAKE THE JT@ FILES BREAK. -///////Shopuld we check of reddis is running or not like we do for mqtt, JFile, Cfiles -/** - * //use later(ABSTRACT AWAAY) - * //WE SHOULD KEEP JAMRUN ALIVE UNTIL THE VALUE ASSIGNED TO THE PROCESSID - * while(true){ - if(!fs.existsSync(`${processId}`)){ - return false; - } - const pid = fs.readFileSync(`${processId}`).toString().trim(); - if(pid === "new"){ - if(!flag){ - flag = true; - await sleep(500); - continue; - } - } - break; - - } - * - * - */ -////////////////// //////// /////// //////// ////// ////// /// - - -// async function getJobsSubDirMap(){ -// const subDirMap = new Map() -// const subdirs = (((await fs.readdir(process.cwd())).map(entry => entry.split("_"))).filter(entry => entry.length > 1)) -// for(let dir of subdirs){ -// if(dir.length > 2){ - -// const head = dir[0] -// const tail =(dir.filter((_,index) => index !== 0)).join("_") -// const dirName = dir.join("_") - - - -// subDirMap.set(tail, dirName) - -// } -// else{ -// const head = dir[0] -// const tail = dir[1]; -// const dirName = dir.join("_") -// subDirMap.set(tail, dirName) -// } -// } -// return subDirMap; -// } -// async function getPortSubDir(){ -// const ports = (((await fs.readdir(process.cwd(),{ withFileTypes: true })).filter( entry => entry.isDirectory())).map(entry => entry.name)) -// if(ports.length !== 0){ -// return ports -// } -// } - -// export async function cleanUp(){ -// try{ -// getcleanArgs(process.argv) - -// } -// catch(error){ -// if(error.type === "ShowUsage"){ -// console.log( -// ` - -// Usage: jamclean -// Purges inactive JAMScript programs from the listing. - -// ` -// ) -// } -// process.exit(1); -// } -// const jamfolder = getJamFolder(); -// if(!fs.existsSync(jamfolder)){ -// process.exit(0) -// } -// process.chdir(`${jamfolder}/apps`); -// const appsMap = await getJobsSubDirMap(); -// for(let app of appsMap.keys()){ - -// process.chdir(`${appsMap.get(app)}`); -// console.log(process.cwd(), "this is my app dir") -// const ports = await getPortSubDir(); -// console.log(process.cwd(), "this is my portDir dir") -// if(ports){ -// console.log(process.cwd(), "this is my portDir dir") -// for(let port of ports){ -// console.log(process.cwd(), "this is my portDir dir") -// let isRunning -// console.log(port, "this is my port") -// console.log(process.cwd(), "this is my portDir dir") -// process.chdir(`${port}`); -// const toCheck = (fs.existsSync("processId")) ? fs.readFileSync("processId") : fs.readFileSync("shellpid") -// try{ -// const p = await $`ps -p ${toCheck} | grep node | wc -l | tr -d '[:space:]'` -// isRunning = true -// } -// catch(error){ -// isRunning = false; -// } -// process.chdir("..") -// if(!isRunning){ -// await $`rm -rf ./${port}` -// } -// } -// } -// process.chdir("..") -// } -// } - -////////////////////////////////////////////////////////////////////////// - const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); @@ -547,7 +431,6 @@ async function cleanRemote(toRemove){ continue }; const running = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim(); - console.log(running, "this is my running") if(!running.includes(dirName)){ console.log(`TOREMOVE:${dirName}/${portName}`); await sleep(5) diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 21d1a7c07..ff90acea8 100644 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -3,6 +3,7 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; import { Client } from 'ssh2'; +import { transport } from "pino"; //can't specify what port ti jukk exactly let currIP; if (os.platform() === 'win32') { @@ -16,9 +17,21 @@ if (os.platform() === 'win32') { export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() - const activePorts = fs.readdirSync(`${jamFolder}/ports`) + let activePorts + try{ + activePorts = fs.readdirSync(`${jamFolder}/ports`) + } + catch(error){ + return appToPort + } for(let port of activePorts){ - const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + let apps; + try{ + apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + } + catch(error){ + continue + } for(let app of apps){ if(appToPort.has(app)){ const portList = appToPort.get(app); @@ -51,42 +64,41 @@ function killDataByPortDir(portDir, root){ const jamFolder = getJamFolder() const appFolder = getAppFolder() const infoList = portDir.split("/") - console.log("IF STATEMENT 1") + if(infoList.length !== 2){ throw new Error("Wrong Path input") 0 } const dirName = infoList[0] const portName = infoList[1] - console.log("IF STATEMENT 2") - if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ + let dirsRunning; + try{ + dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n"); + } + catch(error){ return[] } - console.log("IF STATEMENT 4") - const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n") if(!dirsRunning.includes(dirName)){ return [] } - console.log("PRE ROOT") + if(root){ - console.log("root exists") - console.log("portName", portName) - if(fs.existsSync(`${jamFolder}/ports/${portName}`)){ - console.log("file exists") + try{ const rootIP = fs.readFileSync(`${appFolder}/${portDir}/root`).toString().trim(); if(rootIP === root){ - console.log("root matches") const info = { programName : dirNameToProgramName(dirName)+".jxe", appName : dirNameToAppName(dirName), portNumber : portName } - console.log(info, "this is my info") return [info] } + return []; + } + catch(error){ + return []; } - } else{ const info ={ @@ -96,37 +108,40 @@ function killDataByPortDir(portDir, root){ } return [info] } - - - } + function killDataByPortNum(portNum, root){ const jamFolder = getJamFolder() const toClean=[]; - const activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) const appfolder = getAppFolder() - if(!activePorts.includes(Number(portNum))){ - return []; + let activePorts; + let dirsRunning; + try{ + activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) + if(!activePorts.includes(Number(portNum))){ + return []; + } + dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") + } + catch(error){ + return [] } - const dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") for(let dir of dirsRunning){ if(root){ - console.log("root exists from port num") - if(fs.existsSync(`${appfolder}/${dir}/${portNum}/root`)){ - console.log("file exists") + try{ const rootIP = fs.readFileSync(`${appfolder}/${dir}/${portNum}/root`).toString().trim(); if(rootIP === root){ - console.log("PORT MATCHING") const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), portNumber : portNum } - console.log(info, "TO KILL") toClean.push(info) } } - + catch(error){ + continue; + } } else{ const info ={ @@ -138,7 +153,6 @@ function killDataByPortNum(portNum, root){ } } return toClean; - } function killDataByAppName(appName, root){ @@ -150,12 +164,8 @@ function killDataByAppName(appName, root){ if(currApp === appName){ for(let port of activeDirs.get(dir)){ if(root){ - console.log("root EXISTS") - if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ - console.log("FILE EXISTS") + try{ const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - console.log(root, "root OLD") - console.log(rootIP, "root new") if(rootIP === root){ const info ={ programName : dirNameToProgramName(dir)+".jxe", @@ -165,7 +175,9 @@ function killDataByAppName(appName, root){ toClean.push(info) } } - + catch(error){ + continue; + } } else{ const info ={ @@ -182,7 +194,7 @@ function killDataByAppName(appName, root){ } function killDataByProgramName(programName, root){ - console.log("KILLING DATA BY NAME") + const toClean=[]; const activeDirs = getRunningDirs(); const appfolder = getAppFolder() @@ -191,23 +203,20 @@ function killDataByProgramName(programName, root){ if(currProgram === programName){ for(let port of activeDirs.get(dir)){ if(root){ - console.log("ROOT EXISTS") - if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ - console.log("file exist") + try{ const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - console.log(rootIP) - console.log(root) if(rootIP === root){ const info = { programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), portNumber : port } - console.log("this is the info", info) toClean.push(info) } } - + catch(error){ + continue; + } } else{ const info ={ @@ -225,7 +234,7 @@ function killDataByProgramName(programName, root){ function killDataByDirName(dirName, root){ - console.log("KILLING BT NAME STARTED") + const toClean=[]; const activeDirs = getRunningDirs(); const appfolder = getAppFolder() @@ -233,22 +242,21 @@ function killDataByDirName(dirName, root){ if(dir === dirName){ for(let port of activeDirs.get(dir)){ if(root){ - console.log("ROOT IS HERE") - if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ - console.log("FILE IS HERE") + try{ const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); if(rootIP === root){ - console.log("ID MATCHED") + const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), portNumber : port } - console.log("INFO") toClean.push(info) } } - + catch(error){ + continue; + } } else{ const info ={ @@ -268,12 +276,11 @@ function killDataForAll(root){ const toClean=[]; const activeDirs = getRunningDirs(); const appfolder = getAppFolder() - console.log("ACTIVE DIRS", activeDirs) + for(let dir of activeDirs.keys()){ for(let port of activeDirs.get(dir)){ if(root){ - console.log("root exists") - if(fs.existsSync(`${appfolder}/${dir}/${port}/root`)){ + try{ const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); if(rootIP === root){ const info ={ @@ -284,10 +291,12 @@ function killDataForAll(root){ toClean.push(info) } } - + catch(error){ + continue; + } } else{ - console.log("root does not exists") + const info ={ programName : dirNameToProgramName(dir)+".jxe", appName : dirNameToAppName(dir), @@ -297,7 +306,7 @@ function killDataForAll(root){ } } } - console.log("TO CLEAN", toClean) + return toClean } async function killJamRun(data){ @@ -306,22 +315,18 @@ async function killJamRun(data){ const portNumber = data.portNumber const dirName = ((programName.split('.'))[0]) +"_"+ appName; const appfolder = getAppFolder() - if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/shellpid`)){ + try{ const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); - let exists; - try { - const cwd = process.cwd() - const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` - exists = Number(p.stdout.toString().trim()); - } catch (error) { - exists = 0 - - } - + const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` + const exists = Number(p.stdout.toString().trim()); if(exists){ process.kill(pid); + return } } + catch(error){ + return + } } async function killJFile(data){ @@ -330,20 +335,18 @@ async function killJFile(data){ const portNumber = data.portNumber const dirName = ((programName.split('.'))[0]) +"_"+ appName; const appfolder = getAppFolder() - if(fs.existsSync(`${appfolder}/${dirName}/${portNumber}/processId`)){ + try{ const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/processId`).toString().trim(); - let exists; - try { - const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` - exists = Number(p.stdout.toString().trim()); - } catch (error) { - exists = 0 - } + const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` + const exists = Number(p.stdout.toString().trim()); if(exists){ process.kill(pid); return; } } + catch(error){ + return + } } async function killProcess(data){ @@ -358,35 +361,35 @@ async function pauseProcess(data){ async function jamKill(flag, name, pause, root) { - console.log("KILLING PROCESS STARTING") - console.log("this is my flag in jamkill", flag) + + let jamData; if(flag === "dir"){ jamData = killDataByDirName(name, root) } else if(flag === "app"){ jamData = killDataByAppName(name, root) - console.log("data from name", jamData) + } else if(flag === "program"){ - console.log("killing by program name") + jamData = killDataByProgramName(name, root) } else if(flag === "port"){ - console.log("USING PORT TO CLEAN") + jamData = killDataByPortNum(name, root) } else if(flag === "portDir"){ - console.log("GOT TO THE PORT DIR") + jamData = killDataByPortDir(name, root) } else{ - console.log("CLEANING DATA FOR ALL") + jamData = killDataForAll(root) } - console.log(jamData) + if(jamData.length === 0 ){ if(flag === "all"){ console.log("no running app on local") @@ -396,21 +399,20 @@ async function jamKill(flag, name, pause, root) } } - console.log(pause) + if(pause){ - console.log("Pausing from jam kill") for(let data of jamData){ - console.log(data) let appfolder = getAppFolder() const appName = data.appName; const programName = data.programName const portNumber = data.portNumber - if( - (!fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`)) - ){ - console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) + try{ + fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`) + if(fs.readFileSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`).toString().trim() === "new"){ + console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) + } } - if(fs.readFileSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`).toString().trim() === "new"){ + catch(error){ console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) } pauseByPortNumber(programName,appName,portNumber) @@ -418,37 +420,26 @@ async function jamKill(flag, name, pause, root) } } else{ - console.log("KILL,KILL") for(let data of jamData){ - console.log("I GET HERE") - console.log(data) const appName = data.appName; const programName = data.programName const portNumber = data.portNumber await killProcess(data); cleanByPortNumber(programName,appName,portNumber) } - } - console.log("KILLING IS OVER, IT IS OVER INDEEDE") + //keep this LOG console.log("KILLING IS OVER") } async function jamKillBruteForce(){ - console.log("KILL RESER BRUTE FORCEAS") - await $`pkill node`.nothrow().quiet(); - console.log("KILL RESER BRUTE FORCEAS") + await $`pkill node`.nothrow().quiet(); await $`pkill mosquitto`.nothrow().quiet(); - console.log("KILL RESER BRUTE FORCEAS") - await $`pkill tmux`.nothrow().quiet(); - console.log("GOT HERE") await $`ps aux | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill`.nothrow().quiet(); - console.log("GOT HERE") const jamfolder = getJamFolder(); - //should I remove the apps as well or that is not required if(fs.existsSync(`${jamfolder}/ports`)) fs.rmSync(`${jamfolder}/ports`, { recursive: true, force: true }) if(fs.existsSync(`${jamfolder}/apps`)) @@ -458,22 +449,18 @@ async function jamKillBruteForce(){ } async function executeScript(client, command){ - console.log("GOT HERE") - // console.log(client) - // console.log(command) return (await new Promise((resolve, reject) =>{ client.exec(command, (err,stream) =>{ - console.log("got here") + if (err) throw err; let result = '' stream.on("close", () => { resolve(result) }) stream.on("data" , (data) =>{ - console.log(data.toString()) + if(data.includes("KILLING IS OVER")) { - console.log(data.toString()) resolve(data.toString()) } @@ -483,7 +470,7 @@ async function executeScript(client, command){ } async function main(){ - console.log("gothere") + let args; try{ @@ -491,68 +478,72 @@ async function main(){ } catch(error){ - console.log(error) - if(error.type === "ShowUsage"){ + + console.log( - /** - {name : "help", alias : "h", type: Boolean, defaultValue : false }, - {name : 'all', type: Boolean , defaultValue: false }, - {name : 'reset', type: Boolean , defaultValue: false }, - {name : 'app', type: Boolean , defaultValue: false }, - {name : 'program', type: Boolean , defaultValue: false }, - {name : 'dir', type: Boolean , defaultValue: false }, - {name : 'port', type: Boolean , defaultValue: false }, - {name: "portDir", type: Boolean, defaultValue: false }, - {name: "pause", type: Boolean, defaultValue: false }, - {name : 'name', alias : "n" , type: String , defaultValue: undefined }, - */ + ` Kill running instances of the application. - - Usage: jamkill [--all|app_id|--help] - - jamkill - kill the program started last among the currently running ones + Usage: + + jamkill --reset [--remote] + To kill all the programs and remove the ports, mqttpid and apps directory which would be equivelant to a hard reset + --reset flag should be used. have in mind uninsg the --reset flag will dissable all the other flags and do a hard reset. + the only flag which can be used with --reset is --remote which runs the kill --reset on the local machine and all the remote + machines. jamkill --help - displays this help messages - - jamkill --all - kills all running instances - - [--name && (--app= || --program=(without ext)|| --dir= || --port= || --portDir)] - the --name is used to set the name and the other flags are used to mention what the name associates to - - [--pause] is used to pause the running program + displays this help messages. - [--reset] is the hard reset. it closes all the running nodes, mosquito,tmux,reddis and remove all the directories including ports and apps - - [--remote] is a flag to kill programs on remote machines as well if the program root is current machine + jamkill --all [--remote] [--pause] + to kill all the programs running --all flag should be used. It differ from --reset since it just removes the running programs + and does no file directory cleanup. The only other flag which can be used next to --all is --remote and --pause. use --remote to include all the remote + machines in the killing process. use --pause to pause all the programs instead of completly killing them. + + jamkill --app --name== [--remote] [--pause] + to kill program with a specific appName. use --app flag as an indicator of the killing criteria(which is app name), followed by --name= + to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex) jamkill --app --name=testingApp --remote --pause + + jamkill --program --name== [--remote] [--pause] + to kill program with a specific programName. use --program flag as an indicator of the killing criteria(which is program name), followed by --name= + to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex)jamkill --program --name=jt2 [--remote] [--pause] + + jamkill --port --name== [--remote] [--pause] + to kill program with on a specific portNumber, use --port flag as an indicator of the killing criteria(which is portNumbrt), followed by --name= + to specify what program on which port should be killed. [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex) jamkill --app --name=1883 --remote --pause + + jamkill --dir --name== [--remote] [--pause] + Directory name is refered to the directory associated to a program under the apps folder. dirName is a combination of the --program and --name flag. + If a program with specific appName and programName should be killed --dir flag should be used followed by the --name=. + [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex)jamkill --dir --name=jt2_testingApp --remote --pause + + jamkill --portDir --name== [--remote] [--pause] + portDir refers to the directory in the folder for a specific program which contains the info of that program running on an specific port. + portdir is a combination of --app, --program and --ports which always targetes a signle running program. + [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex)jamkill --portDir --name==jt2_shahin/1883 [--remote] [--pause] + + NOTE: only one of --app && --program && --dir && --portDir && --port can be used. ` ) - } - process.exit(1); + throw error } const jamfolder = getJamFolder(); const appfolder = getAppFolder(); if(fs.existsSync(`${jamfolder}/remote`) && args.remote && !args.root){ - console.log("GOT HERE !") const remotes = fs.readdirSync(`${jamfolder}/remote`) - console.log(remotes) - console.log("GOT HERE 2") - console.log(args.pause, "IF IT IS PAUSED") - for(let remote of remotes){ const [host,port] = remote.split("_"); - console.log(host) - console.log(port) const config = { host: host, port: port, username: 'admin', - // You may need to specify a password or private key depending on your SSH server configuration - password: 'admin' // or use privateKey: require('fs').readFileSync('/path/to/your/key') + password: 'admin' }; let client = await new Promise((resolve, reject) => { const client = new Client(); @@ -587,7 +578,7 @@ async function main(){ else toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --pause --root=${currIP}` } - console.log(toExecute) + const command=`${pathExport} && ${changeDir} && ${toExecute}` await executeScript(client, command); @@ -597,7 +588,7 @@ async function main(){ if(args.root){ throw new Error("DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE") } - console.log("kill reset") + await jamKillBruteForce() } else if( !fs.existsSync(jamfolder) ){ @@ -607,10 +598,6 @@ async function main(){ throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') } else{ - console.log("PRE KILL") - console.log("flag", args.flag) - console.log("name", args.name) - console.log("root", args.root) await jamKill(args.flag , args.name, args.pause, args.root); } @@ -621,7 +608,7 @@ async function main(){ (async() => { - console.log("SCRIPT STARTS") + await main() })() diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 35c902391..2b0acc1af 100644 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -1,9 +1,5 @@ #!/usr/bin/env zx -/** - * //DISCUSS PASUING AND THE INFO WE NEED HERE +++++ - - */ import { getJamListArgs } from "./parser.mjs"; import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" import { dirname, resolve } from 'path'; @@ -28,16 +24,24 @@ currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); } - -function getRunningDirs(){ +export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() - if(!fs.existsSync(`${jamFolder}/ports`)){ - return appToPort; + let activePorts + try{ + activePorts = fs.readdirSync(`${jamFolder}/ports`) + } + catch(error){ + return appToPort } - const activePorts = fs.readdirSync(`${jamFolder}/ports`) for(let port of activePorts){ - const apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + let apps; + try{ + apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + } + catch(error){ + continue + } for(let app of apps){ if(appToPort.has(app)){ const portList = appToPort.get(app); @@ -54,8 +58,6 @@ function getRunningDirs(){ function getWatchList(filters){ const watchList = [] const appFolder = getAppFolder() - console.log(filters) - //make sure it is watching recursively watchList.push(`${jamFolder}/ports`) if(filters.remote){ watchList.push(`${jamFolder}/remote`) @@ -79,7 +81,7 @@ function watch(filters) { await $`zx ${jamcleanPath}` }, 1000); function updateWatchList(watchList){ - console.log(filters, "this is my filters from watch function") + const newWatchList = getWatchList(filters); for(let item of newWatchList){ if(!watchList.includes(item)){ @@ -122,7 +124,7 @@ function watch(filters) { let keysToRemove = ["root","remote","help","all" ]; let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); const filtered = filter(nodeinfo, filteredObj); - console.log("INCLUDING REMOTE?", filters.remote); + if(filters.remote){ NODESINFO = [] await main(true) @@ -146,7 +148,7 @@ function watch(filters) { }, 500); let watchList = getWatchList(filters) watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', (event, path) => { - console.log(`Event: ${event}, Path: ${path}`); + watchList = updateWatchList(watchList) updateInfo(); }); @@ -169,9 +171,6 @@ export function dirNameToProgramName(dirName){ function getNodeInfo(root=null){ const appToPortMap = getRunningDirs() - - - // console.log(appToPortMap) const jamfolder = getJamFolder() const appfolder = getAppFolder(); const nodeInfo =[] @@ -318,7 +317,6 @@ async function executeScript(client, command){ resolve("closed") }) stream.on("data" , (data) =>{ - // console.log(data.toString()) if(data.includes("NODEINFO##")){ let JSONrow = data.toString().trim().split("##")[1] let row; @@ -351,17 +349,23 @@ async function main(update=null){ if(error.type = "ShowUsage"){ console.log( - /** - */ - ` - Usage: jamlist [--app=appl_name] - [help] to show the Usage. - [monitor] use this flag to turnn on the monitoring mode - [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] - the flags abouve are used for filtering the jamlist - [--remote] is a flag to list the apps running on the remote machines. only for programs that chave current machine as root + + Usage: + jamlist --help: show this usage msg. + + jamlist has two made modes. the default is just printing the list of requested programs but if it's required to monitor the apps and update upon changes, + the --monitor should be used. it prints the list of requested programs, and keeps montoring them, if there is any change it will be updated. + + by default jamlist only monitors or prints out locally running programs yet if it's required to monitor or list none local programs as well, --remote + flag should be used. + + by passing the --all flag jamlist is going to list all the running apps. if there is certain restriction needs to be applied the following filters can be used: + [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] + NOTE: all the abouve arguments can be used togeather but using --all will dissable them all and removes all the filters + + ` ) @@ -375,7 +379,7 @@ async function main(update=null){ const jamfolder = getJamFolder() if(filters.remote || update){ - console.log("GOT TO THE remote call SECTION") + const map = getRemoteMachines(); @@ -417,7 +421,7 @@ async function main(update=null){ } if(filters.root){ - console.log("GOT TO THE root SECTION") + if(filters.all){ @@ -457,12 +461,12 @@ async function main(update=null){ } } else if(!update){ - console.log("GOT TO THE LOCAL SECTION") + if(filters.all){ await $`zx ${jamcleanPath}` const info = getNodeInfo(); if(info.length + NODESINFO.length === 0 ){ - console.log("there is No program running") + if(!monitor){ process.exit(0) } diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs index 996c72c2b..ae4e47847 100644 --- a/tools/jamlog.mjs +++ b/tools/jamlog.mjs @@ -110,25 +110,15 @@ async function main(){ catch(error){ if(error.type = "ShowUsage"){ console.log( - /** - * {name : "help", alias : "h", type: Boolean, defaultValue : false }, - {name : "program", type: String, defaultValue : undefined }, - {name : "app", type: String, defaultValue : undefined }, - {name: "port", type:String, defaultValue: undefined}, - {name : "j", alias: "j", type: Boolean, defaultValue : false }, - {name : "c", alias: "c", type: Boolean, defaultValue : false }, - {name : "tail", alias: "t", type: Number, defaultValue : undefined }, - - */ + ` - Usage: jamlist [--app=appl_name] - [--help] is used to show usage - [--program && --app && --port] all used togeather to indicate what log we want to get + [--program= && --app= && --port= && --remote=] all used togeather to indicate what log we want to get (THESE ARE MANDATORY but IPAddress) + NOTE: --remote is optional. [--c] is a flag used to only show the c file [--j] is a flagused to only show the j file [--tail=] shows the last n lines of the log - [--all] shows all the logs + [--remote=] ` ) @@ -180,9 +170,9 @@ async function main(){ } } const finalArg = args.trim() - console.log(args) + const command = `${pathExport} && ${changeDir} && zx jamlog.mjs ${finalArg}` - console.log(command) + await makeConnection(config) await executeScript(client, command) process.exit(0) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 42b05a7b4..5804d860c 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -7,83 +7,60 @@ import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, geta const { spawn,spawnSync } = require('child_process'); import { Client } from 'ssh2'; -/***\ -//REMOVE PARENT ID - * ///DOES NOT CONNECT TO THE MAIN CLOSEST ONE(LET IT BE AS IS) - * //CONNECTING TO THE SAME REDIS CAN CAUSE MULTIPLE PROBLEMS(THE INTERACT WITH EACHOTHERS IN A WEIRD WAY) - * QUESTION: - - * 9 ----> app appid program tmuxid we do not need - - * NOTES - TOCHANGE: - - - - - -ADD PAUSE UNPAUSE -ADD GIT LOG - - */ -//FORE NOW DON"T RUN REMOTE TASKS ON THE FOREGROUND -//global variables let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote, root; const tmuxIds = []; let removablePort -//SETUP CLEANING process.on('SIGINT', () => { if(removablePort){ - - const toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() - console.log(toPause); + let toPause; + try{ + toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() + } + catch(error){ + toPause = "false" + } + if(toPause !== "false"){ - console.log("Cleaning") const fileNoext = getFileNoext(file); pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) process.exit(); } else{ - console.log("Killing") - console.log(file) const fileNoext = getFileNoext(file); cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } } else{ - console.log("Killing") - console.log(file) - const fileNoext = getFileNoext(file); - cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } }); process.on('SIGTERM', () => { if(removablePort){ - const toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() - console.log(toPause); + let toPause; + try{ + toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() + } + catch(error){ + toPause = "false" + } + if(toPause !== "false"){ - console.log("Cleaning") const fileNoext = getFileNoext(file); pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) process.exit(); } else{ - console.log("Killing") const fileNoext = getFileNoext(file); cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } } else{ - console.log("Killing") - const fileNoext = getFileNoext(file); - cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); process.exit(); } @@ -91,17 +68,12 @@ process.on('SIGTERM', () => { }); -//MOVE HOME TO CONST FILE -let mqttProcesse; -//SET REDIS PATH UP const filePath = fileURLToPath(import.meta.url); const IDIR = path.dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); const SHELLPID = process.pid; -//setup -//tested.working const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( ["mosquitto","mosquitto_pub", "tmux"].map( async (entry)=> { @@ -122,49 +94,26 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( } ) ) -// async function executeScript(client, command) { -// return await new Promise((resolve, reject) => { -// client.exec(command, (err, stream) => { -// if (err) return reject(err); -// let result = ''; -// stream.on('close', () => { -// resolve(result); -// }); -// stream.on('data', (data) => { -// result += data.toString(); -// }); -// stream.stderr.on('data', (data) => { -// result += data.toString(); -// }); -// stream.on('error', (streamErr) => { -// reject(streamErr); -// }); -// }); -// }); -// } + async function executeScript(client, command){ - console.log("GOT HERE") + return (await new Promise((resolve, reject) =>{ client.exec(command, (err,stream) =>{ if (err){ - console.log(err) reject(err); } let result; stream.on("close", () => { - console.log("closed") resolve(result) }) stream.on("data" , async (data) =>{ - console.log(data.toString()) if(data.includes("MY PORT IS:")) { console.log(data.toString()) result = data.toString().trim().split(":")[1] } if(data.includes("EXIT BG")){ - // await sleep(5000) resolve(result) } }) @@ -177,16 +126,14 @@ function show_usage(){ ` jamrun program.jxe Runs J and C node, one each, of a device with program.jxe - under a default application name 'app-N'. To run under a different - app name X, use the --app=X option. + under a app name X, use the --app=X option. It is mandatory to set the app name. jamrun program.jxe --fog Runs a fog node (only J node) with program.jxe. Similarly, the --cloud flag runs a cloud node. - By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the - data store. The Redis server needs to be started before launching the - application. To use a different Redis server use the --data option. + By default, jamrun uses a Redis server running at 127.0.0.1:(20000+porttaken) as the + data store. To use a different Redis server use the --data option. jamrun program.jxe --data=127.0.0.1:7000 Runs program.jxe and connects it to an already running Redis server at @@ -195,12 +142,13 @@ function show_usage(){ connections). To start more than one C node at a device use the following command. - jamrun program.jxe --num=4 + jamrun program.jxe --num=4. To provide a set of tags to the program, use the following command. jamrun program.jxe --tag="param1, param2" - Use the --bg option to run a command in the background.fr + Use the --bg option to run a command in the background. the --bg is mandatory for the cases + that program is running on a remote machine. Use the --old option to run the previous version in .jamruns folder. You can edit that version and rerun a custom version of a file. @@ -216,11 +164,17 @@ function show_usage(){ Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. - Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags - - Use --port only with --resume (it's gonna be dissabled if --resume flag is is not on.) to resume the program on the program on the right port. + Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags. + the program can be resumed only if it was pased before. + --resume tag have to be used with --port tag to specify exactly which program shoukd be resumed. - USE --remote to run the jamscript on another machine: --remote= + to start the c nodes and j files on a remote machine the --remote is used. + the value assinge to --remote is IP addrress of the remote machine to make the connection. + + by default the location assigned to a program has random long and lat values. to set a specific + location for the progam the --loc is used. + value passsed to the loc contains long and lat with a ',' seperator between them. + Usage: jamrun file.jxe [--app=appl_name] @@ -236,13 +190,15 @@ function show_usage(){ [--edge=num_edge_connections] [--valgrind] [--local] - [--resume] + [--resume && port=] + [--remote=] + The jamrun command creates a run state in the $HOME/.jamruns folder. `; - + return usageMessage; } @@ -264,7 +220,7 @@ async function startmqtt(port, cFile){ stdio: ['ignore', 'ignore', 'ignore'], detached: true, }; - mqttProcesse = spawn(command, args, options); + const mqttProcesse = spawn(command, args, options); console.log(mqttProcesse.pid) fs.writeFileSync(`${jamfolder}/mqttpid/${port}`,`${mqttProcesse.pid}` ) mqttProcesse.unref(); @@ -401,12 +357,11 @@ function dojamout_p2_bg(pnum, floc, jappid, group=null){ if(!NOVERBOSE){ console.log("Started the J node in background") } - + //keep this log file console.log("EXIT BG") process.exit(0) } -//linux test left, rest working async function doaout(num,port,group,datap,myf,jappid){ let counter=1 if (fs.existsSync('a.out')) { @@ -437,40 +392,23 @@ async function doaout(num,port,group,datap,myf,jappid){ await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; } - - else{ - - //check if it works on linux or nor - if(valgrind) + + else{ + if(valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; else - - { - console.log("WTFWTFWTF") - console.log("GOT TO THE TMUX") - console.log(process.cwd()) - console.log(myf) - console.log(port) - console.log(`${myf}/${port}/log.${counter}`) - console.log(fs.existsSync(`${myf}/${port}`)) - //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) - await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; - - - } + //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) + await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; } } tmuxIds.push(`${tmux}-${counter}`) counter++; - } - - if(!NOVERBOSE) - console.log("Started a C node") + if(!NOVERBOSE) + console.log("Started a C node") } -//tested. working async function portavailable(folder,port) { let porttaken; const jamFolder = getJamFolder() @@ -484,7 +422,6 @@ async function portavailable(folder,port) { if(porttaken === 0){ if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() - console.log(Number(p.stdout.trim())) porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; } @@ -502,7 +439,6 @@ async function portavailable(folder,port) { return porttaken; } -//tested and working function setuptmux(path, appfolder) { fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); @@ -510,22 +446,16 @@ function setuptmux(path, appfolder) { } -//patially tested, hopefullt works async function startredis(port) { try{ - const p = $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); - console.log(p) - } catch(error){ console.log(error) } - } -//tested, works async function waitforredis(port){ while (true) { try{ @@ -549,10 +479,9 @@ async function waitforredis(port){ } -//tested, works + async function setupredis(port) { - //QUESTION: how would it work if multiple apps are using the same reddis? how would the flush work. how any of this work? await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` @@ -566,21 +495,17 @@ async function setupredis(port) { } -//tested, works async function resolvedata(Name) { const [host, port] = Name.split(':'); await startredis(Number(port)); await waitforredis(port); - await setupredis(port); - - //trim space left behind by hostname -I data = Name.split(/\s+/).join(''); } -//tested working + async function unpack(file,folder){ if(!old){ if(!fs.existsSync("./MANIFEST.txt")){ @@ -622,13 +547,7 @@ async function unpack(file,folder){ console.log("The corrupted unziped files. files will be unziped again based on the existing MANIFEST.txt") await cleanExecutables() await $`cd ${folder} && unzip -oq ${file}`.quiet() - - } - - - - } } else{ @@ -638,13 +557,10 @@ async function unpack(file,folder){ isValidExecutable() } } -//tested.working -async function getjdata(folder) { +async function getjdata(folder) { const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() return p.stdout.trim() - - } async function runNoneDevice(iport){ @@ -652,8 +568,6 @@ async function runNoneDevice(iport){ fileDirectoryMqtt(folder,iport,jamfolder,app) const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) await dojamout(iport, folder, jappid) - console.log("SCRIPT RUNNING") - } async function runDevice(iport,dport,group){ @@ -664,7 +578,6 @@ async function runDevice(iport,dport,group){ setuptmux(`${folder}/${iport}`, appfolder) await doaout(num,iport, group, dport,folder,jappid) await dojamout_p2(iport, folder,jappid,group ) - console.log("SCRIPT RUNNING") } @@ -700,6 +613,7 @@ async function main(){ catch(error){ + show_usage() throw(error) } let folder; @@ -716,19 +630,18 @@ async function main(){ if(resume){ const jamfolder = getJamFolder() const fileNoext = getFileNoext(file); - if(!fs.existsSync(`${jamfolder}/remote`)){ - console.log(`this machine is not the root for any running app`); - process.exit(0); - } - if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`)){ - console.log(`this machine is not the root for any running app on ${config.host}_${config.port}`); - process.exit(0); - } + if(!fs.existsSync(`${jamfolder}/remote`)) + throw new Error("this machine is not the root for any running app") + + + if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`)) + throw new Error(`this machine is not the root for any running app on ${config.host}_${config.port}`); + + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`).toString().trim().split("\n") - if(!remoteApps.includes(`${fileNoext}_${app}`)){ - console.log(`this machine is not the root for any running ${fileNoext}_${app}`); - process.exit(0) - } + if(!remoteApps.includes(`${fileNoext}_${app}`)) + throw new Error(`this machine is not the root for any running ${fileNoext}_${app}`); + } client = await new Promise((resolve, reject) => { const client = new Client(); @@ -744,7 +657,7 @@ async function main(){ client.connect(config); }); const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + // const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir= "cd JAMScript/tools" let currIP ; if (os.platform() === 'win32') { @@ -754,15 +667,8 @@ async function main(){ } else if (os.platform() === 'linux') { currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); } - const toExecute = `zx jamrun.mjs ${remoteArgs} --root=${currIP}` - console.log(toExecute) - const remoteTerminal = '/dev/pts/1'; - // const command = `${pathExport} && ${changeDir} && ${toExecute} > > ${remoteTerminal} 2>&1` - // THIS SHOULD BE THE IDEAM SOLUTION!!!!!!!!! - // const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP} > ${remoteTerminal} 2>&1`) const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP}`) - console.log(myPort) if(!resume){ const jamfolder = getJamFolder() const fileNoext = getFileNoext(file); @@ -776,12 +682,10 @@ async function main(){ if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`)){ const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`).toString().trim().split("\n") if(!remoteApps.includes(`${fileNoext}_${app}`)){ - console.log("NOT INCLUDEDE APPEND") fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`); } } else{ - console.log("FILE DONT EXISTS") fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`) } } @@ -792,38 +696,33 @@ async function main(){ if(resume){ const fileNoExt = getFileNoext(file) - if(!port){ - console.log("can't resume the app without port number") - process.exit(1) - - } + if(!port) + throw new Error("can't resume the app without port number") + folder = getFolder(file,app); if(!fs.existsSync(folder)){ - console.log("NO PAUSED INSTANCE OF", `${fileNoExt}_${app}` ) - process.exit(1) + throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app}` ) } if(!fs.existsSync(`${folder}/${port}`) || !fs.existsSync(`${folder}/${port}/paused`)){ - console.log("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) - process.exit(1) + throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) } else{ const isPaused = (fs.readFileSync(`${folder}/${port}/paused`).toString().trim()) === "false" ? false : true; if(!isPaused){ - console.log("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) - process.exit(1) + throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) } } if(num, data, Type){ - console.log("IN CASE OF RESUMING, WILL NOT USE ANY OF NUM, DATA, TYPE ARGUMENTS.") + console.log("WARNING: IN CASE OF RESUMING, WILL NOT USE ANY OF NUM, DATA, TYPE ARGUMENTS.") + } + try{ + Type = fs.readFileSync(`${folder}/${port}/machType`).toString().trim(); + } + catch(error){ + throw new Error('type missing, corrupted program, it should be killed') } - - // num = fs.readFileSync(`${folder}/${port}/numCnodes`).toString().trim(); - Type = fs.readFileSync(`${folder}/${port}/machType`).toString().trim(); - // data = fs.readFileSync(`${folder}/${port}/dataStore`).toString().trim(); - // process.chdir(folder); - // iport = port; process.chdir(folder); isValidExecutable(); jdata = await getjdata(folder); @@ -832,8 +731,7 @@ async function main(){ if(port){ console.log("Warning. If it's not to resume the port argument will not be used") } - console.log(file,"this is my file") - console.log(app, "this is my path") + fileDirectorySetUp(file,app) folder = getFolder(file,app) ifile = path.resolve(file); @@ -844,7 +742,6 @@ async function main(){ } let isDevice; - console.log("SELECTING THE TYPE") switch(Type){ case "cloud": if(resume){ @@ -935,13 +832,7 @@ async function main(){ const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); - -// console.log(jamcleanPath) - -// await $`zx ${jamcleanPath}` - - +await $`zx ${jamcleanPath}` await main() -// const p = await $`redis-server --port ${port}` -// console.log(p) + diff --git a/tools/parser.mjs b/tools/parser.mjs index 4157ef0a1..1551e77f7 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -358,30 +358,7 @@ export function getKilltArgs(argv){ return {"flag": flag, "name" : options.name, "pause": options.pause , "remote": options.remote , "root":options.root} } -/** - *{ name: 'help', alias: 'h', type: Boolean, defaultValue: false}, - {name : 'app', type: String , defaultValue: undefined}, - {name : 'tags', type: String , defaultValue: undefined}, - {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, - {name : 'num', type: Number , defaultValue: 1}, - {name : 'loc', type: String , defaultValue: `${long},${lat}`}, - {name : 'edge', type: Number , defaultValue: 1}, - {name : 'data', type: String , defaultValue: undefined}, - {name : 'fog', type: Boolean, defaultValue: false}, - {name : 'cloud', type: Boolean, defaultValue: false}, - {name : 'device', type: Boolean, defaultValue: false}, - {name : 'local_registry', type: Boolean, defaultValue: false}, - {name : 'bg', type: Boolean, defaultValue: false}, - {name : 'verb', type: Boolean, defaultValue: false}, - {name : 'log', type: Boolean, defaultValue: false}, - {name : 'old', type: Boolean, defaultValue: false}, - {name : 'local', type: Boolean, defaultValue: false}, - {name : 'valgrind', type: Boolean, defaultValue: false}, - {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, - {name: 'resume', type: Boolean, defaultValue: false}, - {name: "port", type: Number, defaultValue: undefined}, - {name: "remote", type:Number, defaultValue: undefined} - */ + export function getRemoteArgs(argObject){ const args =[] args.push(argObject.file) From 86653c38452f63357cf2776097cd038d8f824e8f Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 13:00:15 -0400 Subject: [PATCH 057/126] USage fix --- tools/jamrun.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 5804d860c..6d5e2b72e 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -198,7 +198,7 @@ function show_usage(){ The jamrun command creates a run state in the $HOME/.jamruns folder. `; - return usageMessage; + console.log(usageMessage) } @@ -613,6 +613,7 @@ async function main(){ catch(error){ + console.log('got here') show_usage() throw(error) } From c4457ac75c5147662f877cd1cb6a56f41845c668 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 14:34:25 -0400 Subject: [PATCH 058/126] cleanUp for file directory, removing .mjs extention --- tools/MANIFEST.txt | 5 - tools/README.md | 10 - tools/crun | 212 ----- tools/djam | 98 --- tools/djambuild | 41 - tools/djamcompile | 70 -- tools/djamexec | 220 ----- tools/djaminit | 178 ---- tools/djamload | 127 --- tools/djamlog | 149 ---- tools/djampull | 42 - tools/djamrun | 574 ------------- tools/djamterm | 141 ---- tools/djamtest | 121 --- tools/inc/docker_tools.sh | 1 - tools/inc/mach_tools.sh | 162 ---- tools/inc/misc_tools.mjs | 0 tools/inc/misc_tools.sh | 274 ------ tools/inc/pumba_tools.sh | 84 -- tools/jam | 57 -- tools/jamc | 1 - tools/jamclean | 532 ++++++++++-- tools/jamclean.mjs | 454 ---------- tools/jamclose | 84 -- tools/jamexec | 425 ---------- tools/jaminstall | 133 --- tools/jamkill | 777 +++++++++++++---- tools/jamkill.mjs | 614 -------------- tools/jamlist | 683 ++++++++++----- tools/jamlist.mjs | 506 ----------- tools/jamlog | 418 +++++++--- tools/jamlog.mjs | 318 ------- tools/jamrun | 1477 +++++++++++++++++---------------- tools/jamrun.mjs | 839 ------------------- tools/jamrun_epm | 401 --------- tools/jamterm | 97 --- tools/jamtoast | 1159 -------------------------- tools/jamvis | 71 -- tools/jamvis_internal/serv.js | 303 ------- tools/jamvis_internal/view.js | 603 -------------- tools/jrun | 388 --------- tools/jstart.js | 16 - tools/parser.mjs | 8 +- tools/test.mjs | 39 - tools/testjs.js | 8 - tools/testsh.sh | 4 - 46 files changed, 2642 insertions(+), 10282 deletions(-) delete mode 100644 tools/MANIFEST.txt delete mode 100644 tools/README.md delete mode 100755 tools/crun delete mode 100755 tools/djam delete mode 100755 tools/djambuild delete mode 100755 tools/djamcompile delete mode 100755 tools/djamexec delete mode 100755 tools/djaminit delete mode 100755 tools/djamload delete mode 100755 tools/djamlog delete mode 100755 tools/djampull delete mode 100755 tools/djamrun delete mode 100755 tools/djamterm delete mode 100755 tools/djamtest delete mode 100644 tools/inc/docker_tools.sh delete mode 100644 tools/inc/mach_tools.sh delete mode 100644 tools/inc/misc_tools.mjs delete mode 100644 tools/inc/misc_tools.sh delete mode 100644 tools/inc/pumba_tools.sh delete mode 100755 tools/jam delete mode 120000 tools/jamc mode change 100755 => 100644 tools/jamclean delete mode 100644 tools/jamclean.mjs delete mode 100755 tools/jamclose delete mode 100755 tools/jamexec delete mode 100755 tools/jaminstall mode change 100755 => 100644 tools/jamkill delete mode 100644 tools/jamkill.mjs mode change 100755 => 100644 tools/jamlist delete mode 100644 tools/jamlist.mjs mode change 100755 => 100644 tools/jamlog delete mode 100644 tools/jamlog.mjs delete mode 100755 tools/jamrun.mjs delete mode 100755 tools/jamrun_epm delete mode 100755 tools/jamterm delete mode 100755 tools/jamtoast delete mode 100755 tools/jamvis delete mode 100644 tools/jamvis_internal/serv.js delete mode 100644 tools/jamvis_internal/view.js delete mode 100755 tools/jrun delete mode 100644 tools/jstart.js delete mode 100644 tools/test.mjs delete mode 100644 tools/testjs.js delete mode 100755 tools/testsh.sh diff --git a/tools/MANIFEST.txt b/tools/MANIFEST.txt deleted file mode 100644 index 7e40c3c5c..000000000 --- a/tools/MANIFEST.txt +++ /dev/null @@ -1,5 +0,0 @@ -VERSION = 2.0 -DESCRIPTION = JAMScript executable file -NAME = undefined -CREATE-TIME = 1719428633839 -JDATA = true diff --git a/tools/README.md b/tools/README.md deleted file mode 100644 index 0f2b4583f..000000000 --- a/tools/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# JAMTools - - -A collection of tools to compile and run JAMScript programs. These tools are best used with the docker version of JAMScript. - -*Before you use these tools, you need to setup your account so that docker can run without sudo*. Check the Ubuntu or the particular Linux distribution's documentation to find out how you can setup your system. - -Clone this repository into a local directory like $HOME/JAMTools. Add this location to your $PATH. Check whether a command like djam is in your path and is picked up from this repository. Once you have got djam in your path, you are all set! - -Type djam to see the options that are available to you. diff --git a/tools/crun b/tools/crun deleted file mode 100755 index e287ec8ac..000000000 --- a/tools/crun +++ /dev/null @@ -1,212 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Usage: runc file.jxe -a appl_name -n number -g group_name - -The runc command runs the C component of the file.jxe (JAM executable). -The -g group_name needs to specified to connect the C node to the proper -group (J node). Otherwise, it will connect the C node to the 'default' -group. -EOF -} - - -getappid() { - local mainf=$1 - local localf=$2 - local appid=$3 - - if [ -e $mainf/counter ]; then - local count=`cat $mainf/counter` - ((count++)) - echo $count > $mainf/counter - else - local count=1 - echo $count > $mainf/counter - fi - - if [[ $appid == app-* ]]; then - if [ ! -e $localf/appid ]; then - echo "app-"$count > $localf/appid - fi - else - echo $appid > $localf/appid - fi - - jappid=`cat $localf/appid` -} - - -# Initialize all the option variables. -app=testapp -num=1 -group="default" -port= -tags= - -file=$1 -shift -fext="${file##*.}" - -if [ -z $file ] || [ $file = "-h" ]; then - show_usage - exit 1 -fi - -if [ "$fext" != "jxe" ]; then - die "file extension is not .jxe" -fi - -# Set the global variable 'port' based on the -# group name. -getgroupport() { - local gname=$1 - if [ $gname == "default" ]; then - port=1883 - fi - - for dir in */; do - if [ -e $dir/group ]; then - local grp=`cat $dir/group` - if [ $grp == $gname ]; then - port=$dir - break; - fi - fi - done -} - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - -n|--num) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - num=$2 - shift - else - die 'ERROR: "--num" requires a non-empty option argument.' - fi - ;; - --num=?*) - num=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --num=) # Handle the case of an empty - die 'ERROR: "--num" requires a non-empty option argument.' - ;; - -g|--group) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - group=$2 - shift - else - die 'ERROR: "--group" requires a non-empty option argument.' - fi - ;; - --group=?*) - group=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --group=) # Handle the case of an empty - die 'ERROR: "--group" requires a non-empty option argument.' - ;; - -t|--tags) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tags=$2 - shift - else - die 'ERROR: "--tags" requires a non-empty option argument.' - fi - ;; - --tags=?*) - tags=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tags=) # Handle the case of an empty - die 'ERROR: "--tags" requires a non-empty option argument.' - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - - -echo "Don't use jrun and crun! Use jamrun instead of them." -echo "Exiting." -exit - - -if [ -e "$file" ]; then - - # Check whether the global .jamruns folder is there - jamfolder="$HOME/.jamruns" - wait_missingdir $HOME $jamfolder - - appfolder=$jamfolder/apps - wait_missingdir $jamfolder $appfolder - - # Get the folder - filenoext="${file%.*}" - folder=$HOME"/.jamruns/apps/"$filenoext"_"$app - wait_missingdir $appfolder $folder - - cd $folder - while :; do - getgroupport $group - if [ -n $port ]; then break; fi - inotifywait -r -e create $folder - done - - # Note: you need to use --num=value to point to the correct - # device sequence number. - # with two devices; 1, 2 are the numbers - # - - if [ -e a.out ]; then - - # execute the program.. we are in the folder.. - chmod +x a.out - if [ -z $tags ]; then - ./a.out -a $app -n $num -p $port - else - ./a.out -a $app -n $num -t $tags -p $port - fi - else - die "$file is not a valid JAMScript executable" - fi - -else - die "JAMScript executable: $file not found" -fi diff --git a/tools/djam b/tools/djam deleted file mode 100755 index ec47bd777..000000000 --- a/tools/djam +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF - -Runs JAMScript instances in docker containers. -The docker version of the normal 'jam' commands - -djam help - Prints this help. -djam build - Rebuilds another docker image. -djam clean - Cleans up the mess left behind by old runs. - Use this command if errors occur due to incomplete runs. -djam close - Close all tmux terminals opened by the 'term' command. -djam comp - Compile the JAMScript program in the container. - Executable file is copied back to the original folder. -djam exec - Execute the given program in an existing (running) configuration. -djam init - Initializes the delay values for the docker topology. - Saves zones information and starts pumba (net emulator). -djam kill - Kill a particular application or all active applications. -djam list - Lists all the JAMScript programs running in the system. -djam load - Loads the given file into each node in the current topology. - New file goes into the /jamfiles folder. -djam log - Shows the logs written by the C nodes. A good way to - see the debug messages from the C side. -djam pull - Pull the given docker image and make it the default -djam run - Start a device, fog, or cloud -djam term - Reattach to a tmux terminal of a running JAMScript instance - Use the 'list' command to find out the ID to connect. -djam test - Configures a test topology based on the parameter provided in 'init'. -djam stat - Get the configuration status of djam installation. - -Type 'djam cmd --help' for more help on the specific command. - -EOF -} - -if [ -z $1 ] || [ $1 == "help" ]; then - show_usage - exit 0 -fi - -jcmd=$1 -shift 1 -params=$@ - - -case $jcmd in - list) - jamlist $params - ;; - build) - djambuild $params - ;; - init) - djaminit $params - ;; - term) - djamterm $params - ;; - test) - djamtest $params - ;; - kill) - jamkill $params - ;; - clean) - jamclean $params - ;; - log) - djamlog $params - ;; - run) - djamrun $params - ;; - close) - jamclose $params - ;; - pull) - djampull $params - ;; - comp) - djamcompile $params - ;; - compile) - djamcompile $params - ;; - exec) - djamexec $params - ;; - stat) - djamstat $params - ;; -esac diff --git a/tools/djambuild b/tools/djambuild deleted file mode 100755 index 2c76e09b6..000000000 --- a/tools/djambuild +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -show_usage() { - cat << EOF -Builds a new docker image using the current JAMScript version in the github repo -at https://github.com/citelab/JAMScript. - -Usage: djambuild [repo] - -djambuild -h -djambuild --help -Prints this help message. - -djambuild repository -Builds a new jamscript docker image and uploads to the given repository. - -EOF -} - - -if [ -z $JAMHOME ]; then - echo "$JAMHOME not set. $JAMHOME needs to point towards a JAMScript source directory." - die -fi - -if [ -z $1 ]; then - docker build --no-cache -t jamscript $JAMHOME/scripts/install - docker tag jamscript mahes25/jamscript - docker push mahes25/jamscript -elif [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit -else - docker build --no-cache -t jamscript $JAMHOME/scripts/install - docker tag jamscript $1 - docker push $1 -fi diff --git a/tools/djamcompile b/tools/djamcompile deleted file mode 100755 index bcbbd04f2..000000000 --- a/tools/djamcompile +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - - -# Spin up the build container if it is not there. -# No need to spin up if the container is already there - -# Copy the files into the container -# Run the jamc compiler in the container using 'docker exec..' -# Get the results back - copy the .jxe file back to the original folder -# - - -show_usage() { - cat << EOF - -djamcompile or djamcompile -h or djamcompile --help prints this help -information. - -djamcompile f1.jxe f2.c -compiles f1.js and f2.c to obtain f1.jxe. Here, the source files are -copied into the docker container and the compiler is run in the container. -The resulting file f1.jxe is copied back to the host. - -EOF -} - -make_container() { - local type=$1 - local contname=$2 - - local dockerImage=`cat $jamfolder/dockerImage` - - create_missingdir $jamfolder/type - create_missingdir $jamfolder/type/contname - - # Just kill the older container and recreate a new one. - docker kill $contname - docker rm $contname - - local dockerSer=`docker run -it -d --privileged --name $contname $dockerImage` - local dockerSer=${dockerSer:0:12} - echo $dockerSer > $jamfolder/type/contname/dockerId - echo "1" > $jamfolder/type/contname/refCount -} - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder "JAMScript not setup in the system." -exit_missingfile $jamfolder/dockerImage "Run djam pull repository" - -dbuildc="dbuildctnr-"$UID -make_container test $dbuildc - -efile= -for f in $@; do - if [ $f != "-d" ]; then - docker cp $f $dbuildc:/home/admin/temp/$f - efile+=" /home/admin/temp/$f" - else - efile+=" -d" - fi -done - -docker exec -it $dbuildc jamc $efile -filename=$1 -jxefile="${filename%.*}.jxe" -docker cp $dbuildc:/home/admin/temp/$jxefile $jxefile diff --git a/tools/djamexec b/tools/djamexec deleted file mode 100755 index 327652135..000000000 --- a/tools/djamexec +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -This command executes the given command in the docker containers that are -already executing the target program under the given application ID. - -If the program and application ID are not specified, we use the containers -executing the last launched (active) program. - -Usage: djamexec [--program=program --app=appl_name --type=node_type] command - -NOTE: djamexec differs from the rest because the command is at the end. - -The "command" could be JAMScript executable (file.jxe) or some -arbitrary Linux command (e.g., ls) with arguments. - -If no running instance is found, an error message will be printed. - -EOF -} - -if [ -z $1 ]; then - show_usage - exit 0 -fi - - -checkdocker() { - - if [ -e $1/dockerId ]; then - local didp=`cat $1/dockerId` - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - running="docker" - else - running="none" - fi - fi -} - - -app= -program= -type=device -xapp= - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - -x|--xapp) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - xapp=$2 - shift - else - die 'ERROR: "--xapp" requires a non-empty option argument.' - fi - ;; - --xapp=?*) - xapp=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --xapp=) # Handle the case of an empty - die 'ERROR: "--xapp" requires a non-empty option argument.' - ;; - -p|--program) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - program=$2 - shift - else - die 'ERROR: "--program" requires a non-empty option argument.' - fi - ;; - --program=?*) - program=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --program=) # Handle the case of an empty - die 'ERROR: "--program" requires a non-empty option argument.' - ;; - -t|--type) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - type=$2 - shift - else - die 'ERROR: "--type" requires a non-empty option argument.' - fi - ;; - --type=?*) - type=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --type=) # Handle the case of an empty - die 'ERROR: "--type" requires a non-empty option argument.' - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -file=$1 -shift -rest=$* - -# Check folder -appsfolder=$HOME"/.jamruns/apps" -exit_missingdir $appsfolder "ERROR! No running instance found. " - -if [ -z $program ]; then - if [ -e $appsfolder/program ]; then - program=`cat $appsfolder/program` - else - die "Cannot execute with empty program name" - fi -fi - -if [ -z $app ]; then - if [ -e $appsfolder/app ]; then - app=`cat $appsfolder/app` - else - die "Cannot execute with empty application ID" - fi -fi - - -tname="${program%.*}" -tname=$tname"_"$app -fext="${file##*.}" - -xyapp=$xapp -if [ ! -z $xapp ]; then - xapp="--app=$xapp" -fi - - -if [ "$(ls -A $appsfolder)" ]; then - - olddir=`pwd` - cd $appsfolder - - if [ ! -d $tname ]; then - die "No folder $tname found." - fi - - for jruns in `ls $appsfolder/$tname`; do - dir=$appsfolder/$tname/$jruns - echo "Directory: " $dir - if [ -d $dir ]; then - checkdocker $dir - if [ $running == "docker" ]; then - mtype=`cat $dir/machType` - if [ -z $type ] || [ $type == $mtype ]; then - data=`cat $dir/dataStore` - runon=`cat $dir/dockerId` - present=`docker exec -it $runon jamlist | wc -l | tr -d '[:space:]'` - if [ $present != "0" ]; then - # go back to the old directory and run these command otherwise $file won't be found - cd $olddir - case $mtype in - cloud) - if [ $fext == "jxe" ]; then - djamrun $file "$xapp" --cloud --data=$data --runon=$runon --bg - else - docker exec -it $runon $file $rest - fi - ;; - fog) - if [ $fext == "jxe" ]; then - djamrun $file "$xapp" --fog --data=$data --runon=$runon --bg - else - docker exec -it $runon $file $rest - fi - ;; - device) - if [ $fext == "jxe" ]; then - djamrun $file "$xapp" --data=$data --runon=$runon --num=`cat $dir/cdevs` --bg - else - docker exec -it $runon $file $rest - fi - ;; - esac - fi - fi - fi - fi - done -fi diff --git a/tools/djaminit b/tools/djaminit deleted file mode 100755 index a25733889..000000000 --- a/tools/djaminit +++ /dev/null @@ -1,178 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/pumba_tools.sh" -source "$IDIR/inc/misc_tools.sh" - - - -show_usage() { - cat << EOF - -djaminit --ideal -The inter-container delays are not manipulated. They are set at the natural values -to get a packet transmitted from container A to container B. No other option -should be specified with this one. - -djaminit --zones=num_of_zones --indelay=delay:jitter --outdelay=delay:jitter -Inside a zone we have small delays and between zones we have large delays. -The '--indelay' option tells the delay and jitter within a zone and '--outdelay' -tells the delay and jitter between zones. - -djaminit --cldelay=delay:jitter -Is the delay and jitter to the cloud from the zones. - -The pumba is started if the option is not '--ideal'. - -All delay and jitter values are in milliseconds. IMPORTANT: Just numbers should -be specified - no units. - -EOF -} - -# Show the usage -if [ -z $1 ]; then - show_usage - exit -fi - - -# Check the .jamruns folder -jamfolder=$HOME"/.jamruns" -create_missingdir $jamfolder - - -ideal= -zones=1 -cldelay=0:0 -indelay=0:0 -outdelay=0:0 - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -c|--cldelay) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - cldelay=$2 - shift - else - die 'ERROR: "--cldelay" requires a non-empty option argument.' - fi - ;; - --cldelay=?*) - cldelay=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --cldelay=) # Handle the case of an empty - die 'ERROR: "--cldelay" requires a non-empty option argument.' - ;; - -i|--indelay) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - indelay=$2 - shift - else - die 'ERROR: "--indelay" requires a non-empty option argument.' - fi - ;; - --indelay=?*) - indelay=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --indelay=) # Handle the case of an empty - die 'ERROR: "--indelay" requires a non-empty option argument.' - ;; - -o|--outdelay) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - outdelay=$2 - shift - else - die 'ERROR: "--outdelay" requires a non-empty option argument.' - fi - ;; - --outdelay=?*) - outdelay=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --outdelay=) # Handle the case of an empty - die 'ERROR: "--outdelay" requires a non-empty option argument.' - ;; - -z|--zones) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - zones=$2 - shift - else - die 'ERROR: "--zones" requires a non-empty option argument.' - fi - ;; - --zones=?*) - zones=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --zones=) # Handle the case of an empty - die 'ERROR: "--zones" requires a non-empty option argument.' - ;; - -d|--ideal) - ideal=1 - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -create_missingdir $jamfolder/pumba - -if [ ! -z $ideal ]; then - echo "off" > $jamfolder/pumba/status - create_missingdir $jamfolder/zones - echo "1" > $jamfolder/zones/count - killrouterpumba - killcloudpumba - killfogpumba - exit -fi - -check_prog pumba "Pumba not installed. Download it from https://github.com/gaia-adm/pumba/releases" - -pversion=`pumba -v | cut -d ' ' -f 3 | cut -d '.' -f 1,2` -if (( $(echo "$pversion < 0.5" | bc -l) )); then - echo "Pumba version 0.5 or new is needed. Exiting." - exit -fi - - -# We are using pumba - validate parameters - -clddelay="${cldelay%:*}" -cldjitter="${cldelay##*:}" - -inpdelay="${indelay%:*}" -inpjitter="${indelay##*:}" - -outpdelay="${outdelay%:*}" -outpjitter="${outdelay##*:}" - -save "on" $jamfolder/pumba/status - -# Set delay between cloud and fogs -# we are setting for 1 hour recurrent delay. There is one minute every 1hr where the delay is not in effect -save "pumba -l fatal --interval 1h netem --duration 59m delay -t $clddelay -j $cldjitter " $jamfolder/pumba/cloud_cmd - -# Set delay inside fog zones -save "pumba -l fatal --interval 1h netem --duration 59m delay -t $inpdelay -j $inpjitter " $jamfolder/pumba/infog_cmd - -# Set delay between fog zones -save "pumba -l fatal --interval 1h netem --duration 59m delay -t $outpdelay -j $outpjitter " $jamfolder/pumba/outfog_cmd - -# Write the number of num_of_zones -create_missingdir $jamfolder/zones - -save $zones $jamfolder/zones/count diff --git a/tools/djamload b/tools/djamload deleted file mode 100755 index 96d00eb31..000000000 --- a/tools/djamload +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/bash - -# djam load file --target=prog --app=app_name - -# We load the given file into the containers that are used by the target program -# and application. - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF - -djamload file.jxe --target=program --app=appl_name - -This command will load the file.jxe in the docker containers that are already -running the target program under the given application name (appl_name). - -If no running instance is found, an error message will be printed. - -EOF -} - -if [ -z $1 ]; then - show_usage - exit 0 -fi - - -checkdocker() { - - if [ -e $1/dockerId ]; then - local didp=`cat $1/dockerId` - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - running="docker" - else - running="none" - fi - fi -} - - -app= -target= -file=$1 -shift - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - - -t|--target) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - target=$2 - shift - else - die 'ERROR: "--target" requires a non-empty option argument.' - fi - ;; - --target=?*) - target=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --target=) # Handle the case of an empty - die 'ERROR: "--target" requires a non-empty option argument.' - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -# Check folder -jamfolder=$HOME"/.jamruns" -if [ ! -d $jamfolder ]; then - die "ERROR! No running instance found. " -fi - -if [ -z $target ]; then - die "Target not specified.. cannot locate the running application." -fi - -tname="${target%.*}" -tname=$tname"_"$app - -if [ "$(ls -A $jamfolder)" ]; then - - cd $jamfolder - - for jruns in `ls $jamfolder/$tname`; do - dir=$jamfolder/$tname/$jruns - if [ -d $dir ]; then - checkdocker $dir - if [ $running == "docker" ]; then - runon=`cat $dir/dockerId` - docker cp $file $dbuildc:$file - fi - fi - done -fi diff --git a/tools/djamlog b/tools/djamlog deleted file mode 100755 index ea9cec85b..000000000 --- a/tools/djamlog +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Extracts the logs written by the C nodes and displays them in the terminal. - -Usage: djamlog [--program=pgm --app=app_name] - -djamlog -Extracts the logs from the last program that was run or is running. - -djamlog --program=stringlog --app=q5 -Extracts the logs from the execution of stringlog under the application ID q5 -if logs from such a run exists. - -This is the docker version of jamlog. - -EOF -} - - -checkdocker() { - - if [ -e $1/dockerId ]; then - local didp=`cat $1/dockerId` - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - running="docker" - else - running="none" - fi - fi -} - - -### -# Main script execution begins here... -# - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" - -appsfolder=$jamfolder/apps -exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" - -cd $appsfolder - -j= - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - - -p|--program) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - program=$2 - shift - else - die 'ERROR: "--program" requires a non-empty option argument.' - fi - ;; - --program=?*) - program=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --program=) # Handle the case of an empty - die 'ERROR: "--program" requires a non-empty option argument.' - ;; - -j|--j) - j=1 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - shift -done - - -if [ -z $app ] && [ -z $program ]; then - # no args specified.. get it from previous runs - lprogram=`cat $appsfolder/program` - lapp=`cat $appsfolder/app` -else - lprogram=$program - lapp=$app -fi - -if [ -e $appsfolder/$lprogram"_"$lapp ]; then - cd $appsfolder - - for jruns in `ls $appsfolder/$lprogram"_"$lapp`; do - dir=$appsfolder/$lprogram"_"$lapp/$jruns - if [ -d $dir ]; then - checkdocker $dir - echo "Running " $running - - if [ $running == "docker" ]; then - runon=`cat $dir/dockerId` - if [ -z $app ] && [ -z $program ]; then - if [ -z $j ]; then - docker exec -it $runon jamlog - else - docker exec -it $runon jamlog --j - fi - else - if [ -z $j ]; then - docker exec -it $runon jamlog --program=$program --app=$app - else - docker exec -it $runon jamlog --program=$program --app=$app --j - fi - fi - fi - fi - - done -fi - - -# for jruns in */; do -# if [ -d $jruns ] && [ -e $jruns/dockerId ]; then -# dockerId=`cat $jruns/dockerId` -# docker exec -it $dockerId jamlog --program=$program --app=$app -# fi -# done diff --git a/tools/djampull b/tools/djampull deleted file mode 100755 index 76a62bcd1..000000000 --- a/tools/djampull +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF - -djampull [repository] -Pulls the latest image from the repository. If no repository is provided, -it pulls the last one. - -EOF -} - -jamfolder=$HOME"/.jamruns" -if [ ! -d $jamfolder ]; then - mkdir $jamfolder -fi - -if [ -z $1 ]; then - if [ -e $jamfolder/dockerImage ]; then - docker pull `cat $jamfolder/dockerImage` - else - echo "ERROR! Need to provide for the first use" - fi - exit -fi - -if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit -fi - -# Now we pull a given image -echo $1 > $jamfolder/dockerImage -docker pull $1 diff --git a/tools/djamrun b/tools/djamrun deleted file mode 100755 index 8f53f837f..000000000 --- a/tools/djamrun +++ /dev/null @@ -1,574 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -#source "$IDIR/inc/pumba_tools.sh" -source "$IDIR/inc/mach_tools.sh" -source "$IDIR/inc/misc_tools.sh" -source "$IDIR/inc/docker_tools.sh" - - - -show_usage() { - cat << EOF -Runs the JAMScript executable (.jxe) in a Docker container. - -djamrun program.jxe -Runs J and C node, one each, of a device with program.jxe -under the application name 'app-N'. To run under a different -app name X, use the --app=X option. - -djamrun program.jxe --fog -Runs a fog node (only J node) with program.jxe. Similarly, the --cloud -flag runs a cloud node. - -By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the -data store. The Redis server needs to be started before launching the -application. To use a different Redis server use the --data option. - -djamrun program.jxe --data=127.0.0.1:7000 -Runs program.jxe and connects it to an already running Redis server at -port 7000 of the local host. Redis server can run outside the -local host (Redis needs to the configured to accept outside -connections). - -To start more than one C node at a device use the following command. -djamrun program.jxe --num=4 - -To provide a set of tags to the program, use the following command. -djamrun program.jxe --tags="param1, param2" - -Use the --bg option to run a command in the backgroud. - -Usage: djamrun file.jxe [--app=appl_name] [--fog|--cloud] [--num=num_c_devs] - [--data=data-url] - [--tags=quoted_list_of_tags] - [--bg] - [--runon=container_to_run] - [--log] - [--loc] - [--link=random|near|best] - [--publish=dport:hport] - - -The djamrun command creates a run state in the $HOME/__jamrun folder. -EOF -} - - - -# runatcloud $dockid $file $jappid $data $tags -runatcloud() { - local dockid=$1 - local file=$2 - local appid=$3 - local data=$4 - local tags=$5 - - - argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " - if [ ! -z $log ]; then - argstr="$argstr --log" - fi - - buildjargs $argstr - - if [ -z $bg ]; then - echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results - else - echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results - fi - -} - -# runatfog $dockid $file $jappid $data $tags -runatfog() { - local dockid=$1 - local file=$2 - local appid=$3 - local data=$4 - local tags=$5 - - argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " - if [ ! -z $log ]; then - argstr="$argstr --log" - fi - - buildjargs $argstr - - if [ -z $bg ]; then - echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results - else - echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results - fi - -} - -# runatdevice $dockid $file $jappid $data $num $tags -runatdevice() { - local dockid=$1 - local file=$2 - local appid=$3 - local data=$4 - local num=$5 - local tags=$6 - - echo $num > $thisappfolder/$dockid/cdevs - echo "$dockid-c" > $thisappfolder/$dockid/tmuxid_c - - # save for short cut use - echo "$dockid-c" > $appfolder/tmuxid - - argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " - if [ ! -z $log ]; then - argstr="$argstr --log" - fi - - buildjargs $argstr - if [ -z $bg ]; then - echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results - else - echo $dockid"-j" > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results - fi - echo ">>> Device started in container $dockid" -} - - -dojamrun() { - local type=$1 - local dockid=$2 - local file=$3 - local num=$4 - - save $type $thisappfolder/$dockid/machType - save $data $thisappfolder/$dockid/dataStore - save $dockerSer $thisappfolder/$dockid/dockerId - save "docker" $thisappfolder/$dockid/class - - case $type in - cloud) - runatcloud $dockid $file $jappid $data $tags - ;; - fog) - runatfog $dockid $file $jappid $data $tags - ;; - device) - runatdevice $dockid $file $jappid $data $num $tags - ;; - esac -} - - -# we generate a new app-XX only if the -# input is app-n, otherwise the jappid (output) is -# the input argument ($1) -getappid() { - local appid=$1 - local docki=$2 - - inc_counter $jamfolder/counter - count=$result - - if [ $appid == "app-n" ]; then - save_no_overwrite "app-"$count $thisappfolder/$docki/appid - else - save $appid $thisappfolder/$docki/appid - fi - - jappid=`cat $thisappfolder/$docki/appid` - - # save for short cut use - save "$jappid" $appfolder/appid -} - - -getdockerid() { - local rundock=$1 - - inc_counter $jamfolder/counter - local count=$result - dockerid="u-"$UID"-${type:0:3}-"$count - - if [ -z $rundock ] || [ `docker ps --filter id=$rundock | grep $rundock | wc -l | tr -d '[:space:]'` == "0" ]; then - result="new" - else - dockerSer=$rundock - result="old" - fi - -} - - -make_container() { - local type=$1 - local contname=$2 - - create_missingdir $jamfolder/$type - create_missingdir $jamfolder/$type/$contname - - if [ $type == "cloud" ]; then - startglobalmach $contname jamnet `cat $jamfolder/network` $dport $hport -# restartcloudpumba $contname - else - exit_missingfile $jamfolder/zones/count - local zcount=`cat $jamfolder/zones/count` - if [ -z $zcount ]; then - die "Zone count is undefined.. run djaminit again." - fi - local zone=$(( 1 + $RANDOM % $zcount )) - - startzonemach $zone $contname jamnet `cat $jamfolder/network` $dport $hport -# if [ $type == "fog" ]; then -# restartfogpumba $contname -# fi - fi - - save $result $jamfolder/$type/$contname/dockerId - save "1" $jamfolder/$type/$contname/refCount -} - -reuse_container() { - local type=$1 - local contname=$2 - - create_missingdir $jamfolder/$type - create_missingdir $jamfolder/$type/$contname - - inc_counter $jamfolder/$type/$contname/refCount -} - -createzonerouters() { - exit_missingfile $jamfolder/zones/count - - local zcount=`cat $jamfolder/zones/count` - - for i in `seq 1 $zcount`; do - startzonerouter $i "u-$UID-router-$i" jamnet `cat $jamfolder/network` -# restartrouterpumba "u-$UID-router-$i" - done -} - - -killdocker() { - local dock_id=$1 - - if [ -e $jamfolder/$type/$dock_id ]; then - dec_counter $jamfolder/$type/$dock_id/refCount - if [ $result == 0 ]; then - docker kill `cat $jamfolder/$type/$dock_id/dockerId` - docker rm $dock_id - fi - fi -} - - -removetmux() { - local tmid=$1 - - tmux has-session -t $tmid 2>/dev/null - local res=$? - if [ $res == "0" ]; then - tmux kill-session -t $tmid - fi -} - -removedockermach() { - - local tmid=`cat $thisappfolder/$dockerid/tmuxid` - removetmux $tmid - - if [ -e $thisappfolder/$dockerid/cdevs ]; then - local num=`cat $thisappfolder/$dockerid/cdevs` - for i in `seq 1 $num`; do - removetmux $tmid"-"$i - done - fi - - killdocker $dockerid - -} - - -processjxe() { - result="ok" -} - - -getportinfo() { - local pinfo=$1 - - dport="${pinfo%:*}" - hport="${pinfo##*:}" -} - - - -# Initialize all the option variables. -app=app-n -type=device -data=docker:6379 -tags= -num=1 -bg= -log= -runon= -link= -loc= -dport= -hport= -mount= - -file=$1 -shift -fext="${file##*.}" - -if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then - show_usage - exit 1 -fi - -if [ "$fext" != "jxe" ]; then - die "Extension on $file is not .jxe" -fi - - -while :; do - case $1 in - --help) - show_usage # Display a usage synopsis. - exit - ;; - --app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - --runon) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - runon=$2 - shift - else - die 'ERROR: "--runon" requires a non-empty option argument.' - fi - ;; - --runon=?*) - runon=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --runon=) # Handle the case of an empty - die 'ERROR: "--runon" requires a non-empty option argument.' - ;; - --tags) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tags=$2 - shift - else - die 'ERROR: "--tags" requires a non-empty option argument.' - fi - ;; - --tags=?*) - tags=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tags=) # Handle the case of an empty - die 'ERROR: "--tags" requires a non-empty option argument.' - ;; - --num) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - num=$2 - shift - else - die 'ERROR: "--num" requires a non-empty option argument.' - fi - ;; - --num=?*) - num=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --num=) # Handle the case of an empty - die 'ERROR: "--num" requires a non-empty option argument.' - ;; - --data) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - data=$2 - shift - else - die 'ERROR: "--data" requires a non-empty option argument.' - fi - ;; - --data=?*) - data=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --data=) # Handle the case of an empty - die 'ERROR: "--data" requires a non-empty option argument.' - ;; - --loc) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - loc=$2 - shift - else - die 'ERROR: "--loc" requires longitude and lattitude specification' - fi - ;; - --loc=?*) - loc=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --loc=) # Handle the case of an empty - die 'ERROR: "--loc" requires longitude and lattitude specification' - ;; - --link) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - link=$2 - shift - else - die 'ERROR: "--link" requires a non-empty option argument.' - fi - ;; - --link=?*) - link=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --link=) # Handle the case of an empty - die 'ERROR: "--link" requires a non-empty option argument.' - ;; - --publish) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - getportinfo $2 - shift - else - die 'ERROR: "--publish" requires docker and port information' - fi - ;; - --publish=?*) - publish=${1#*=} # Delete everything up to "=" and assign the remainder. - getlonglat $publish - ;; - --publish=) # Handle the case of an empty - die 'ERROR: "--publish" requires docker and port information' - ;; - --fog) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="fog" - num= - fi - ;; - --cloud) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="cloud" - num= - fi - ;; - --bg) - bg=1 - ;; - --log) - log=1 - ;; - --mount) - mount=1 - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -# Check necessary parameters and set defaults - -if [ "$type" != "device" ] && [ -n "$num" ]; then - die "number of devices can't be speciied for fog/cloud" -fi - -if [ ! -z $mount ]; then - if [ -z ${JAMDATA} ]; then - echo "JAMDATA is not set. Set JAMDATA to the directory containing the datasets" - exit 1 - fi -fi - -# If docker is not installed, we fail here -check_prog docker "Docker not installed. Exiting." -#check_prog pumba "Pumba not installed. Download it from https://github.com/gaia-adm/pumba/releases" -check_prog tmux "tmux not installed. Exiting." - -# Check whether the global .jamruns folder is there -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder "__jamdir directory not found. Run djam pull first. " -exit_missingdir $jamfolder/zones "zones not setup. Run djam init first" -exit_missingfile $jamfolder/dockerImage "DockerImage not setup. Run djam pull first." - -#pumbastatus=`cat $jamfolder/pumba/status` - -appfolder=$jamfolder/apps -create_missingdir $appfolder - -if [ -e "$file" ]; then - - # Get the folder - filenoext="${file%.*}" - thisappfolder=$appfolder"/"$filenoext"_"$app - create_missingdir $thisappfolder - - # save for short cut use - save "$filenoext" $appfolder/program - save "$app" $appfolder/app - - # process the .jxe file - file=`pwd`/$file - processjxe $file - if [ $result != "ok" ]; then - die "Problem with JAMScript executable" - fi - - - dockerImage=`cat $jamfolder/dockerImage` - createzonerouters - createnetwork jamnet 10 $jamfolder - # cd into the $thisappfolder - cd $thisappfolder - - getdockerid $runon - docktype=$result - - create_missingdir $thisappfolder/$dockerid - getappid $app $dockerid - - if [ $docktype == "new" ]; then - # We are also putting resources such as redis on the container - make_container $type $dockerid - else - # Automatically inherit the redis.. no checking?? - reuse_container $type $dockerid - fi - - docker cp $file $dockerSer:/home/admin/temp/`basename $file` - dojamrun $type $dockerid `basename $file` $num - if [ -z $bg ] && [ $docktype == "new" ]; then - removedockermach - fi -else - die "File: $file not found" -fi diff --git a/tools/djamterm b/tools/djamterm deleted file mode 100755 index d055fba66..000000000 --- a/tools/djamterm +++ /dev/null @@ -1,141 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -# Edit the following locations to provide the -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Shows the background terminals of with the given tmux-id and terminal-num -running in the docker machines. - -Usage: djamterm [tmux-id] [-t terminal-num] - -This is the docker version of the jamterm command. - -djamterm -Shows the first C terminal of the program that was last started. - -djamterm -t 2 -Shows the second C terminal of the program that was last started. - -djamterm u-600-dev-2331-c -t 2 -Shows the second C terminal of the program running under u-600-dev-2331. - -djamterm u-600-dev-2331-c -Shows the first C terminal of the program running under u-600-dev-2331. - -djamterm u-600-dev-2331-j -Shows the J terminal of the program running under u-600-dev-2331. - -EOF -} - - -localtmux() { - local tmuxapp=$1 - local termno=$2 - - $TMUX has-session -t $tmuxapp 2>/dev/null - res=$? - if [ $res == "0" ]; then - if [ -z $termno ]; then - $TMUX attach -t $tmuxapp - else - $TMUX attach -t $tmuxapp-$termno - fi - fi -} - - -dockertmux() { - local tmuxapp=$1 - local termno=$2 - - appsfolder=$HOME"/.jamruns/apps" - cd $appsfolder - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ] && [ -e $dir/class ]; then - local dcl=`cat $dir/class | tr -d '[:space:]'` - - if [ $dcl == "docker" ]; then - if [ -e $dir/tmuxid_c ]; then - local dtm=`cat $dir/tmuxid_c | tr -d '[:space:]'` - if [ $dtm == $tmuxapp ]; then - docker exec -ti `cat $dir/dockerId` script -q -c "/usr/bin/tmux attach -t $tmuxapp-$termno" /dev/null - break - fi - fi - fi - fi - done - fi - done -} - - -### -# Main script execution begins here... -# - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" - -appsfolder=$jamfolder/apps -exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" - -cd $appsfolder - - -if [ -z $1 ]; then - if [ -e tmuxid ]; then - tmuxid=`cat tmuxid` - dockertmux $tmuxid 1 - exit # this improves the readability of the script later - not needed! - fi -else - # Show help - if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit # readability improver! - elif [ $1 == "-t" ]; then - if [ -e tmuxid ]; then - tmuxid=`cat tmuxid` - dockertmux $tmuxid $2 - fi - exit # readability improver! - else - if [ -z $2 ]; then - txid=$1 - if [ ${txid: -1} == "c" ]; then - # Connect to the docker to display the C panes - dockertmux $txid 1 - else - localtmux $txid - fi - exit # readability improver! - else - if [ -n $3 ] && [ $2 == "-t" ]; then - termid=$3 - dockertmux $1 $termid - fi - fi - fi -fi diff --git a/tools/djamtest b/tools/djamtest deleted file mode 100755 index 816a73310..000000000 --- a/tools/djamtest +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/pumba_tools.sh" -source "$IDIR/inc/mach_tools.sh" -source "$IDIR/inc/misc_tools.sh" - - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF - -djam test -Creates a test configuration of containers. Does not run JAMScript. One cloud node -(u-UID-test-cloud), two fog nodes (u-UID-test-fog-1) and (u-UID-test-fog-2). The fog -nodes are in different zones. It also creates two device nodes (u-UID-test-dev-1) and -(u-UID-test-dev-2). - -You can login into the different nodes and ping each other to test the inter-container -latency. - -All machines are detached. You need to attach to them again using: - -docker attach node-name - -To stop the test, run - -djam test stop - -EOF -} - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder "JAMScript emulation is not yet initialized. Run djaminit first." - - -if [ ! -z $1 ]; then - if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit - fi -fi - -if [ -z $1 ]; then - - exit_missingfile $jamfolder/dockerImage "Run djam pull to setup the docker image" - - exit_missingfile $jamfolder/pumba/cloud_cmd "Run 'djam init' before running the 'djam test'. " - exit_missingfile $jamfolder/pumba/infog_cmd "Run 'djam init' before running the 'djam test'. " - exit_missingfile $jamfolder/pumba/outfog_cmd "Run 'djam init' before running the 'djam test'. " - - # Image - dockerImage=`cat $jamfolder/dockerImage` - - createnetwork jamtest 54 - - # These containers are not created in the proper way - # This is for testing purposes.. so this is OK. - - # Start a cloud machine - startglobalmach "u-$UID-cloud-test" jamtest 54 - - startzonerouter 1 "u-$UID-router-test-1" jamtest 54 - startzonerouter 2 "u-$UID-router-test-2" jamtest 54 - - # Start two fog machines - - startzonemach 1 "u-$UID-fog-test-1" jamtest 54 - startzonemach 1 "u-$UID-dev-test-1" jamtest 54 - - - startzonemach 2 "u-$UID-fog-test-2" jamtest 54 - startzonemach 2 "u-$UID-dev-test-2" jamtest 54 - - restartcloudpumba "u-$UID-cloud-test" - restartrouterpumba "u-$UID-router-test-1" - restartrouterpumba "u-$UID-router-test-2" - restartfogpumba "u-$UID-fog-test-1" - restartfogpumba "u-$UID-fog-test-2" - - # Print a message - echo "Done. Configured the test topology." - -elif [ $1 == "stop" ]; then - - killfogpumba "test" - killrouterpumba "test" - killcloudpumba "test" - - resarr=$(docker ps -a -q --filter name=cloud-test) - for res in $resarr; do - docker kill $res - docker rm $res - done - - resarr=$(docker ps -a -q --filter name=fog-test) - for res in $resarr; do - docker kill $res - docker rm $res - done - - resarr=$(docker ps -a -q --filter name=dev-test) - for res in $resarr; do - docker kill $res - docker rm $res - done - - resarr=$(docker ps -a -q --filter name=router-test) - for res in $resarr; do - docker kill $res - docker rm $res - done - -fi diff --git a/tools/inc/docker_tools.sh b/tools/inc/docker_tools.sh deleted file mode 100644 index 25d35dd0a..000000000 --- a/tools/inc/docker_tools.sh +++ /dev/null @@ -1 +0,0 @@ -# Docker tools go here.. diff --git a/tools/inc/mach_tools.sh b/tools/inc/mach_tools.sh deleted file mode 100644 index 7841817a9..000000000 --- a/tools/inc/mach_tools.sh +++ /dev/null @@ -1,162 +0,0 @@ - -# Call..like the following -# createnetwork jamtest 54 -# -createnetwork() { - local netname=$1 - local subnet=$2 - local folder=$3 - - while : ; do - local present=`docker network ls | grep $netname | wc -l | tr -d '[:space:]'` - if [ $present == "0" ]; then - docker network create --driver=bridge --subnet=10.$subnet.0.0/16 --ip-range=10.$subnet.0.0/16 $netname - if [ $? != 0 ]; then - # Could not create the network.. check with another subnet - subnet=$(( $subnet + 1 )) - else - present=1 - if [ ! -z $folder ]; then - echo $subnet > $folder/network - fi - fi - else - subnet=`docker network inspect $netname | grep IPRange | awk '{split($0,a, "\""); print a[4]}' | awk '{split($0,a, "."); print a[2]}'` - echo $subnet > $folder/network - fi - - if [ $present == 1 ]; then - break - fi - done -} - - - -# for example, call like -# startzonerouter zonenum jamtest 54 -# TODO: See whether this can actually fail due to address reuse problem.. -# If so, we need to use another address... and save it in the jamrun state. -# -startzonerouter() { - local zonenum=$1 - local machname=$2 - local netname=$3 - local subnet=$4 - - local present=`docker ps -a --filter name=$machname | grep $machname | wc -l` - - if [ $present == "0" ]; then - # Create the machine - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.254 $dockerImage` - dockerSer=${dockerSer:0:12} - result=$dockerSer - fi - -} - - -# for example, call like -# startzonemach zonenum - -startzonemach() { - local zonenum=$1 - local machname=$2 - local netname=$3 - local subnet=$4 - - local dport=$5 - local hport=$6 - - local present - - create_missingdir $jamfolder/zones/$zonenum - while : ; do - inc_counter $jamfolder/zones/$zonenum/count - local count=$result - newcount=$(( $count % 254 )) - if [ $newcount != $count ]; then - count=$(( $newcount + 1 )) - fi - - echo "Machine: " $machname " starting with IP: " 10.$subnet.$zonenum.$count - - # Create the machine - if [ -z $dport ] && [ -z $hport ]; then - if [ -z $mount ]; then - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules $dockerImage` - else - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` - fi - else - if [ -z $mount ]; then - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules $dockerImage` - else - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` - fi - fi - if [ $? != 0 ]; then - present=0 - docker rm $machname - else - present=1 - fi - dockerSer=${dockerSer:0:12} - result=$dockerSer - if [ $present == 1 ]; then break; fi - done - - # Setup the routes - docker exec -d $machname ip route del 10.$subnet/16 - docker exec -d $machname ip route add 10.$subnet.0/24 dev eth0 - docker exec -d $machname ip route add 10.$subnet.$zonenum/24 dev eth0 - docker exec -d $machname ip route add 10.$subnet/16 via 10.$subnet.$zonenum.254 - -} - -startglobalmach() { - local machname=$1 - local netname=$2 - local subnet=$3 - local dport=$4 - local hport=$5 - - local present - - create_missingdir $jamfolder/global - set_counter 10 $jamfolder/global/count - while : ; do - # Above command runs if the counter is not already set - inc_counter $jamfolder/global/count - local count=$result - newcount=$(( $count % 254 )) - if [ $newcount != $count ]; then - count=$(( $newcount + 1 )) - fi - - # Create the machine - if [ -z $dport ] && [ -z $hport ]; then - if [ -z $mount ]; then - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules $dockerImage` - else - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` - fi - else - if [ -z $mount ]; then - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules $dockerImage` - else - dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` - fi - fi - if [ $? != 0 ]; then - present=0 - docker rm $machname - else - present=1 - fi - dockerSer=${dockerSer:0:12} - result=$dockerSer - if [ $present == 1 ]; then break; fi - done - -} diff --git a/tools/inc/misc_tools.mjs b/tools/inc/misc_tools.mjs deleted file mode 100644 index e69de29bb..000000000 diff --git a/tools/inc/misc_tools.sh b/tools/inc/misc_tools.sh deleted file mode 100644 index d5182ec53..000000000 --- a/tools/inc/misc_tools.sh +++ /dev/null @@ -1,274 +0,0 @@ - -# Utils used in the bash scripts - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - - -# We use the global variable 'result' to pass parameter values back -# - -# -# Call like the following -# inc_counter counter_name -# the counter_name is a file location -# -inc_counter() { - local counter=$1 - local value - - if [ -e $counter ]; then - value=`cat $counter` - ((value++)) - result=$value - else - #why setting both value and result? SHAHIN - value=1 - result=1 - fi - echo $value > $counter -} - -inc_counter_sync() { - local counter=$1 - local value - - if [ -e $counter ]; then - value=`cat $counter` - ((value++)) - result=$value - else - value=1 - result=1 - fi - echo $value > $counter - sync -} - - -# set_counter 10 $jamfolder/global/count -set_counter() { - local value=$1 - local counter=$2 - - if [ ! -e $counter ]; then - echo $value > $counter - fi -} - -set_counter_sync() { - local value=$1 - local counter=$2 - - if [ ! -e $counter ]; then - echo $value > $counter - fi - sync -} - - - -# dec_counter counter_name -# -dec_counter() { - local counter=$1 - - if [ ! -e $counter ]; then - die "Trying to decrement a non-existent counter $counter" - fi - - local value=`cat $counter` - if [ ! -z $value ]; then - ((value--)) - echo $value > $counter - fi - result=$value -} - -dec_counter_sync() { - local counter=$1 - - if [ ! -e $counter ]; then - die "Trying to decrement a non-existent counter $counter" - fi - - local value=`cat $counter` - if [ ! -z $value ]; then - ((value--)) - echo $value > $counter - fi - result=$value - sync -} - -# save_no_overwrite value location -# -save_no_overwrite() { - local value=$1 - local location=$2 - - if [ ! -e $location ]; then - echo $value > $location - else - local x=`cat $location` - if [ -z $x ]; then - echo $value > $location - fi - fi -} - - -save_no_overwrite_sync() { - local value=$1 - local location=$2 - - if [ ! -e $location ]; then - echo $value > $location - else - local x=`cat $location` - if [ -z $x ]; then - echo $value > $location - fi - fi - sync -} - - -# save value location -# with overwrite -save() { - local value=$1 - local location=$2 - - echo $value > $location -} - - -save_sync() { - local value=$1 - local location=$2 - - echo $value > $location - sync -} - - -create_missingdir() { - local dirn=$1 - - if [ ! -e $dirn ]; then - mkdir $dirn - fi -} - -exit_missingdir() { - local dirn=$1 - local emsg=$2 - if [ ! -d $dirn ]; then - echo $emsg - exit 0 - fi -} - -wait_missingdir() { - local rootdir=$1 - local watchdir=$2 - - if [ ! -d $watchdir ]; then - while :; do - inotifywait -e create -t 1 $rootdir - if [ -d $watchdir ]; then break; fi - done - fi -} - - -exit_missingfile() { - local file=$1 - local emsg=$2 - - if [ ! -e $file ]; then - echo $emsg - exit 0 - fi -} - -create_conffile() { - local file=$1 - local contents=$2 - - echo "#" | cat > $1 - echo "allow_anonymous true" | cat >> $1 - echo "#" | cat >> $1 - echo "listener ${2}" | cat >> $1 -} - -check_prog() { - local prog=$1 - local msg=$2 - - local present=`which $prog` - if [ -z $present ]; then - echo $msg - exit 0 - fi -} - -# Check the Program -# If the program is not there.. check the alt. -# Print error and exit if the alt is missing as well -# -check_set_check_prog() { - prog=$1 - local msg=$2 - altprog=$3 - - local present=`which $prog` - if [ -z $present ]; then - prog=$altprog - local present=`which $prog` - if [ -z $present ]; then - echo $msg - exit 0 - fi - fi -} - -buildjargs() { - local str= - for x in $@; do - str+=" " - - local xtail="${x##*=}" - local xhead="${x%=*}" - if [ ! -z $xtail ]; then - str+=$x - fi - done - - str+=" --$type" - - results=$str - -} - -buildcargs() { - local str= - for x in $@; do - str+=" " - local xtail="${x##*=}" - local xhead="${x%=*}" - - if [ ! -z $xtail ]; then - str+="$xhead $xtail" - - fi - - done - - results=$str - # echo "${results}" -} -# echo "${results} \ No newline at end of file diff --git a/tools/inc/pumba_tools.sh b/tools/inc/pumba_tools.sh deleted file mode 100644 index 050817b71..000000000 --- a/tools/inc/pumba_tools.sh +++ /dev/null @@ -1,84 +0,0 @@ - - -killrouterpumba() { - - if [ -z $1 ]; then - local pid=`ps axw | grep pumba | grep router | awk '{split($0,a, " "); print a[1]}'` - else - local pid=`ps axw | grep pumba | grep router | grep $1 | awk '{split($0,a, " "); print a[1]}'` - fi - - for p in $pid; do - kill $p - done -} - -startrouterpumba() { - - if [ $pumbastatus == "on" ]; then - local routercmd=`cat $jamfolder/pumba/outfog_cmd` - $routercmd $@ & - fi -} - -restartrouterpumba() { - - killrouterpumba $@ - startrouterpumba $@ -} - - -killfogpumba() { - - if [ -z $1 ]; then - local pid=`ps axw | grep pumba | grep fog | awk '{split($0,a, " "); print a[1]}'` - else - local pid=`ps axw | grep pumba | grep fog | grep $1 | awk '{split($0,a, " "); print a[1]}'` - fi - - for p in $pid; do - kill $p - done -} - -startfogpumba() { - - if [ $pumbastatus == "on" ]; then - local fogcmd=`cat $jamfolder/pumba/infog_cmd` - $fogcmd $@ & - fi -} - -restartfogpumba() { - - killfogpumba $@ - startfogpumba $@ -} - - -killcloudpumba() { - - if [ -z $1 ]; then - local pid=`ps axw | grep pumba | grep cloud | awk '{split($0,a, " "); print a[1]}'` - else - local pid=`ps axw | grep pumba | grep cloud | grep $1 | awk '{split($0,a, " "); print a[1]}'` - fi - - if [ ! -z $pid ]; then - kill $pid - fi -} - -startcloudpumba() { - - if [ $pumbastatus == "on" ]; then - local cloudcmd=`cat $jamfolder/pumba/cloud_cmd` - $cloudcmd $@ & - fi -} - -restartcloudpumba() { - - killcloudpumba $@ - startcloudpumba $@ -} diff --git a/tools/jam b/tools/jam deleted file mode 100755 index 6255a16d8..000000000 --- a/tools/jam +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF - -Runs a collection of jam machine commands. - -jam help - prints this help -jam clean - clean the setup left behind by old runs -jam close - close all terminaled opened by the 'term' command -jam install - install the JAMScript from source. -jam kill - kill a node -jam list - lists all the JAMScript programs running in the system -jam run - start a device, fog, or cloud -jam term - show the tmux terminals of the running nodes - - -Type 'jam cmd --help' for more help on the specific command. - -EOF -} - -if [ -z $1 ] || [ $1 == "help" ]; then - show_usage - exit 0 -fi - -jcmd=$1 -shift 1 -params=$@ - - -case $jcmd in - list) - jamlist $params - ;; - term) - jamterm $params - ;; - kill) - jamkill $params - ;; - clean) - jamclean $params - ;; - run) - jamrun $params - ;; - install) - jaminstall $params - ;; -esac diff --git a/tools/jamc b/tools/jamc deleted file mode 120000 index 14f41bc1d..000000000 --- a/tools/jamc +++ /dev/null @@ -1 +0,0 @@ -../mainCompiler.js \ No newline at end of file diff --git a/tools/jamclean b/tools/jamclean old mode 100755 new mode 100644 index 89688e047..b8b102b3e --- a/tools/jamclean +++ b/tools/jamclean @@ -1,77 +1,455 @@ -#!/bin/bash - -# Edit the following locations to provide the correct location if needed -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Usage: jamclean - -Purges inactive JAMScript programs from the listing. - -EOF -} - - -checkrunning() { - local folder=$1 - local runf=$2 - local runflag="false" - for q in `ls $folder/$runf`; do - local dir=$folder/$runf$q - if [ -d $dir ]; then - if [ -e $1$q/processId ]; then - local pid=`cat $1$q/processId` - local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - runflag="true" - fi - elif [ -e $1$q/dockerId ]; then - local didp=`cat $1$q/dockerId` - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - runflag="true" - fi - fi - fi - done - running=$runflag -} - -if [ ! -z $1 ]; then - if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit - fi -fi - -jamfolder=$HOME"/.jamruns" -if [ ! -d $jamfolder ]; then - exit 0 -fi - -if [ "$(ls -A $jamfolder)" ]; then - - cd $jamfolder - - for jruns in */; do - if [ $jruns != "*/" ]; then - if [[ $jruns =~ .*$app.* ]]; then - checkrunning $jamfolder/$jruns - if [ $running == "false" ]; then - rm -rf $jamfolder/$jruns - fi - fi - fi - done -fi +#!/usr/bin/env node --input-type=module + +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +const { spawnSync } = require('child_process'); +import { cleanByPortNumber } from "./cleanUp.mjs"; +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { Client } from 'ssh2'; + + + + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename); +const jamcKillPath = resolve(__dirname, 'jamkill'); + +const p = spawnSync('which', ['mosquitto_pub']); +const MOSQUITTO_PUB = p.stdout.toString().trim() + +function getRunningDirs(){ + const appFolder = getAppFolder() + const appToPort = new Map() + const activePorts = fs.readdirSync(`${appFolder}`) + for(let port of activePorts){ + const apps = fs.readFileSync(`${appFolder}/${port}`).toString().trim().split("\n"); + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } + } + return appToPort; +} + +function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") + } + else{ + return dir[1]; + } + +} +function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] +} + + +async function isJamrunRunning(dir,portNum){ + const appFolder = getAppFolder() + const myAppDir = dir; + //should be string. + const myAppPortNum = portNum; + const shellPIDpath = `${appFolder}/${myAppDir}/${myAppPortNum}/shellpid` + + if(!fs.existsSync(`${shellPIDpath}`)){ + return false; + } + const pid = fs.readFileSync(`${shellPIDpath}`).toString().trim(); + let running; + try{ + const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` + running = Number(p.stdout.toString().trim()) + } + catch(error){ + return false + } + if(!running){ + return false + } + return pid; +} + +async function isJfileRunning(dir,portNum){ + const appFolder = getAppFolder() + const myAppDir = dir; + const myAppPortNum = portNum; + const processId = `${appFolder}/${myAppDir}/${myAppPortNum}/processId` + + //make sure j file is getting the time to write to filedirectory + + if(!fs.existsSync(`${processId}`)){ + return false; + } + let pid = fs.readFileSync(`${processId}`).toString().trim(); + if(pid === "new"){ + return false; + } + let running; + try{ + const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` + running = Number(p.stdout.toString().trim()); + } + catch(error){ + return false; + } + if(!running){ + return false; + } + return pid; +} + + +async function isMosquittoRunning(port){ + try{ + await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); + return true; + } + catch(error){ + return false; + } +} + +async function isCfileRunning(Dir,port,num){ + const myAppDir = Dir; + const portNum = port; + const workerNum = num; + const appFolder = getAppFolder() + const cdevID = `${appFolder}/${myAppDir}/${portNum}/cdevProcessId.${workerNum}` + + if(!fs.existsSync(`${cdevID}`)){ + return false; + } + const pid = fs.readFileSync(`${cdevID}`).toString().trim(); + let running; + try{ + const p = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'` + running = Number(p.stdout.toString().trim()); + } + catch(error){ + return false; + } + if(!running){ + return false; + } + return pid; +} +async function isDevice(Dir,port){ + const appFolder = getAppFolder(); + const appDir = Dir; + const portNum = port; + const machType = `${appFolder}/${appDir}/${portNum}/machType` + if(!fs.existsSync(`${machType}`)){ + return false; + } + const type = fs.readFileSync(`${machType}`).toString().trim() + if(type === "device"){ + return true + } + return false; +} + +async function getRunningCfiles(Dir,port){ + const appFolder = getAppFolder(); + const appDir = Dir; + const portNum = port; + const runningCfiles = [] + const portDir = `${appFolder}/${appDir}/${portNum}` + if(!fs.existsSync(portDir)){ + return; + } + const cfilesNum = ((fs.readdirSync(portDir)).filter((entry) => entry.includes("cdevProcessId"))).map((entry) => entry.split(".")[1]) + for(let cfileNum of cfilesNum){ + if(await isCfileRunning(appDir,portNum,cfileNum)){ + runningCfiles.push(`${cfileNum}`) + } + } + return runningCfiles; +} + +function cleanCfiles(portDir, currCfile){ + const oldCdevs = (fs.readdirSync(portDir)).filter((entry) => entry.includes("cdev")) + if( (oldCdevs.length)*2 === currCfile.length){ + return; + } + for(let oldCdev of oldCdevs){ + const cNum = oldCdev.split(".")[1]; + if(!currCfile.includes(cNum)){ + try{ + fs.unlinkSync(`${portDir}/${oldCdev}`); + + } + catch(error){ + + } + + } + } +} +function cleanPorts(AppToRemove){ + const jamFolder = getJamFolder() + for(let port of AppToRemove.keys()){ + if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ + continue; + } + const oldApss = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n") + const toRemove = AppToRemove.get(port) + const newApps = oldApss.filter((entry) => !toRemove.includes(entry)) + fs.writeFileSync(`${jamFolder}/ports/${port}`, newApps.join("\n")) + } +} + +async function clean(){ + //port --> dir + const AppToRemove = new Map(); + const jamFolder = getJamFolder() + const portsDir = `${jamFolder}/ports` + const appFolder = getAppFolder() + if(!fs.existsSync(portsDir)){ + return; + } + const ports = fs.readdirSync(portsDir) + if(ports.length === 0 ){ + return + } + portLoop: + for(let port of ports){ + if(!fs.existsSync(`${portsDir}/${port}`)){ + continue; + } + const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") + for(let dir of dirs){ + let isPaused; + try{ + isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false + } + catch(error){ + + } + if(isPaused){ + continue; + } + //mosquitto not running kill + if(!await isMosquittoRunning(port)){ + + await $`zx ${jamcKillPath} --port --name=${port}` + continue portLoop; + } + //jFile is not running. to remove fromport list + if(!(await isJamrunRunning(dir,port)) && !(await isJfileRunning(dir,port))){ + const programName = dirNameToProgramName(dir)+".jxe"; + const appName = dirNameToAppName(dir); + cleanByPortNumber(programName, appName, port); + if(AppToRemove.has(port)){ + const dummy = AppToRemove.get(port); + dummy.push(dir); + AppToRemove.set(port,dummy) + } + else{ + AppToRemove.set(port,dir) + } + } + //It's running and files are uptodate, update Cnum and clean cdevs + if( (await isJfileRunning(dir,port)) && (await isDevice(dir,port))){ + const Cfiles = await getRunningCfiles(dir,port); + const numCnodes = Cfiles.length + if(!fs.existsSync(`${appFolder}/${dir}/${port}/numCnodes`)){ + fs.writeFileSync(`${appFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) + continue; + } + const numCnodeFile = Number(fs.readFileSync(`${appFolder}/${dir}/${port}/numCnodes`).toString().trim()) + if(numCnodeFile !== numCnodes){ + fs.writeFileSync(`${appFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) + } + cleanCfiles(`${appFolder}/${dir}/${port}`, Cfiles) + } + + } + } + cleanPorts(AppToRemove) +} + + + + +function getRemoteapps(){ + const jamfolder = getJamFolder() + const myMap = new Map() + if(!fs.existsSync(`${jamfolder}/remote`)){ + return null + } + const remoteMachines = fs.readdirSync(`${jamfolder}/remote`) + for(let remoteMachine of remoteMachines){ + const ports = fs.readdirSync(`${jamfolder}/remote/${remoteMachine}`) + let arg='' + for(let port of ports){ + const apps = fs.readFileSync(`${jamfolder}/remote/${remoteMachine}/${port}`).toString().trim().split("\n") + for(let app of apps){ + arg = arg+app+":"+port+"##" + } + } + const result = arg.slice(0, -2); + myMap.set(remoteMachine,result) + } + + return myMap; +} +async function makeConnection(config){ + return await new Promise((resolve, reject) => { + const client = new Client(); + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); +} +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + + if (err) console.log(error); + let result = ''; + stream.on("close", () => { + resolve(result) + }) + stream.on("data" , (data) =>{ + + if(data.includes("TOREMOVE:")){ + let rm = data.toString().split(":")[1] + result = result + rm + } + }) + }) + })) +} +// main() +async function cleanRemote(toRemove){ + const jamfolder = getJamFolder() + + + for(let machine of toRemove.keys()){ + for(let rm of toRemove.get(machine)){ + + const dir = rm.split("/")[0] + const port = rm.split("/")[1] + if(!port){ + fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); + } + if(!fs.existsSync(`${jamfolder}/remote/${machine}/${port}`)){ + return + } + const apps = fs.readFileSync(`${jamfolder}/remote/${machine}/${port}`).toString().trim().split("\n"); + const currApps = apps.filter((entry)=>(!entry.includes(dir))); + + if(currApps.length === 0 ){ + fs.rmSync(`${jamfolder}/remote/${machine}/${port}`, { recursive: true, force: true }); + } + else{ + const toWrite = currApps.join("\n") + fs.writeFileSync(`${jamfolder}/remote/${machine}/${port}`,`${toWrite}\n`) + } + } + if((fs.readdirSync(`${jamfolder}/remote/${machine}`)).length === 0 ){ + fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); + } + } +} + +(async () =>{ + const arg = process.argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean'))); + const appfolder = getAppFolder(); + const jamFolder = getJamFolder(); + if(arg.length === 0){ + let currIP ; + if (os.platform() === 'win32') { + currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'darwin') { + currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'linux') { + currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); + } + const map = getRemoteapps(); + + const removalMap = new Map() + if(map){ + for(let machines of map.keys()){ + const [host,port] = machines.split("_"); + const arg = map.get(machines); + const config = { + host: host, + port: port, + username: 'admin', + password: 'admin' + }; + let client + try{ + client = await makeConnection(config); + } + catch(error){ + fs.rmSync(`${jamFolder}/remote/${machines}`, { recursive: true, force: true }); + continue; + } + + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + const script = `zx jamclean --root=${currIP} --hash=${arg}` + const result = await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) + const toRemove = result.trim().split("\n"); + if(toRemove.length !==0 && toRemove[0] !== ''){ + removalMap.set(machines,toRemove) + } + + } + + cleanRemote(removalMap) + } + } + await clean() + + if(arg.length === 2){ + const rootIP = (arg[0].split("="))[1] + const hash = (arg[1].split("="))[1] + + const portDirs = hash.split("##") + for(let portDir of portDirs){ + let dirName = portDir.split(":")[0] + let portName = portDir.split(":")[1] + if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + const running = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim(); + if(!running.includes(dirName)){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + if(!fs.existsSync(`${appfolder}/${dirName}/${portName}/root`)){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + const dirRoot = fs.readFileSync(`${appfolder}/${dirName}/${portName}/root`).toString().trim() + if(rootIP !== dirRoot){ + console.log(`TOREMOVE:${dirName}/${portName}`); + await sleep(5) + continue + }; + } + } + process.exit() + +})(); \ No newline at end of file diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs deleted file mode 100644 index 8e41384b3..000000000 --- a/tools/jamclean.mjs +++ /dev/null @@ -1,454 +0,0 @@ -#!/usr/bin/env zx -import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; -const { spawnSync } = require('child_process'); -import { cleanByPortNumber } from "./cleanUp.mjs"; -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; -import { Client } from 'ssh2'; - - - - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename); -const jamcKillPath = resolve(__dirname, 'jamkill.mjs'); - -const p = spawnSync('which', ['mosquitto_pub']); -const MOSQUITTO_PUB = p.stdout.toString().trim() - -function getRunningDirs(){ - const appFolder = getAppFolder() - const appToPort = new Map() - const activePorts = fs.readdirSync(`${appFolder}`) - for(let port of activePorts){ - const apps = fs.readFileSync(`${appFolder}/${port}`).toString().trim().split("\n"); - for(let app of apps){ - if(appToPort.has(app)){ - const portList = appToPort.get(app); - portList.push(port) - appToPort.set(app,portList) - } - else{ - appToPort.set(app,[port]) - } - } - } - return appToPort; -} - -function dirNameToAppName(dirName){ - const dir = dirName.split('_') - if(dir.length > 2){ - return (dir.filter((_,index) => index !== 0)).join("_") - } - else{ - return dir[1]; - } - -} -function dirNameToProgramName(dirName){ - return (dirName.split('_'))[0] -} - - -async function isJamrunRunning(dir,portNum){ - const appFolder = getAppFolder() - const myAppDir = dir; - //should be string. - const myAppPortNum = portNum; - const shellPIDpath = `${appFolder}/${myAppDir}/${myAppPortNum}/shellpid` - - if(!fs.existsSync(`${shellPIDpath}`)){ - return false; - } - const pid = fs.readFileSync(`${shellPIDpath}`).toString().trim(); - let running; - try{ - const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` - running = Number(p.stdout.toString().trim()) - } - catch(error){ - return false - } - if(!running){ - return false - } - return pid; -} - -async function isJfileRunning(dir,portNum){ - const appFolder = getAppFolder() - const myAppDir = dir; - const myAppPortNum = portNum; - const processId = `${appFolder}/${myAppDir}/${myAppPortNum}/processId` - - //make sure j file is getting the time to write to filedirectory - - if(!fs.existsSync(`${processId}`)){ - return false; - } - let pid = fs.readFileSync(`${processId}`).toString().trim(); - if(pid === "new"){ - return false; - } - let running; - try{ - const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` - running = Number(p.stdout.toString().trim()); - } - catch(error){ - return false; - } - if(!running){ - return false; - } - return pid; -} - - -async function isMosquittoRunning(port){ - try{ - await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); - return true; - } - catch(error){ - return false; - } -} - -async function isCfileRunning(Dir,port,num){ - const myAppDir = Dir; - const portNum = port; - const workerNum = num; - const appFolder = getAppFolder() - const cdevID = `${appFolder}/${myAppDir}/${portNum}/cdevProcessId.${workerNum}` - - if(!fs.existsSync(`${cdevID}`)){ - return false; - } - const pid = fs.readFileSync(`${cdevID}`).toString().trim(); - let running; - try{ - const p = await $`ps -p ${pid} | grep a.out | wc -l | tr -d '[:space:]'` - running = Number(p.stdout.toString().trim()); - } - catch(error){ - return false; - } - if(!running){ - return false; - } - return pid; -} -async function isDevice(Dir,port){ - const appFolder = getAppFolder(); - const appDir = Dir; - const portNum = port; - const machType = `${appFolder}/${appDir}/${portNum}/machType` - if(!fs.existsSync(`${machType}`)){ - return false; - } - const type = fs.readFileSync(`${machType}`).toString().trim() - if(type === "device"){ - return true - } - return false; -} - -async function getRunningCfiles(Dir,port){ - const appFolder = getAppFolder(); - const appDir = Dir; - const portNum = port; - const runningCfiles = [] - const portDir = `${appFolder}/${appDir}/${portNum}` - if(!fs.existsSync(portDir)){ - return; - } - const cfilesNum = ((fs.readdirSync(portDir)).filter((entry) => entry.includes("cdevProcessId"))).map((entry) => entry.split(".")[1]) - for(let cfileNum of cfilesNum){ - if(await isCfileRunning(appDir,portNum,cfileNum)){ - runningCfiles.push(`${cfileNum}`) - } - } - return runningCfiles; -} - -function cleanCfiles(portDir, currCfile){ - const oldCdevs = (fs.readdirSync(portDir)).filter((entry) => entry.includes("cdev")) - if( (oldCdevs.length)*2 === currCfile.length){ - return; - } - for(let oldCdev of oldCdevs){ - const cNum = oldCdev.split(".")[1]; - if(!currCfile.includes(cNum)){ - try{ - fs.unlinkSync(`${portDir}/${oldCdev}`); - - } - catch(error){ - - } - - } - } -} -function cleanPorts(AppToRemove){ - const jamFolder = getJamFolder() - for(let port of AppToRemove.keys()){ - if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ - continue; - } - const oldApss = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n") - const toRemove = AppToRemove.get(port) - const newApps = oldApss.filter((entry) => !toRemove.includes(entry)) - fs.writeFileSync(`${jamFolder}/ports/${port}`, newApps.join("\n")) - } -} - -async function clean(){ - //port --> dir - const AppToRemove = new Map(); - const jamFolder = getJamFolder() - const portsDir = `${jamFolder}/ports` - const appFolder = getAppFolder() - if(!fs.existsSync(portsDir)){ - return; - } - const ports = fs.readdirSync(portsDir) - if(ports.length === 0 ){ - return - } - portLoop: - for(let port of ports){ - if(!fs.existsSync(`${portsDir}/${port}`)){ - continue; - } - const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") - for(let dir of dirs){ - let isPaused; - try{ - isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false - } - catch(error){ - - } - if(isPaused){ - continue; - } - //mosquitto not running kill - if(!await isMosquittoRunning(port)){ - - await $`zx ${jamcKillPath} --port --name=${port}` - continue portLoop; - } - //jFile is not running. to remove fromport list - if(!(await isJamrunRunning(dir,port)) && !(await isJfileRunning(dir,port))){ - const programName = dirNameToProgramName(dir)+".jxe"; - const appName = dirNameToAppName(dir); - cleanByPortNumber(programName, appName, port); - if(AppToRemove.has(port)){ - const dummy = AppToRemove.get(port); - dummy.push(dir); - AppToRemove.set(port,dummy) - } - else{ - AppToRemove.set(port,dir) - } - } - //It's running and files are uptodate, update Cnum and clean cdevs - if( (await isJfileRunning(dir,port)) && (await isDevice(dir,port))){ - const Cfiles = await getRunningCfiles(dir,port); - const numCnodes = Cfiles.length - if(!fs.existsSync(`${appFolder}/${dir}/${port}/numCnodes`)){ - fs.writeFileSync(`${appFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) - continue; - } - const numCnodeFile = Number(fs.readFileSync(`${appFolder}/${dir}/${port}/numCnodes`).toString().trim()) - if(numCnodeFile !== numCnodes){ - fs.writeFileSync(`${appFolder}/${dir}/${port}/numCnodes`,`${numCnodes}`) - } - cleanCfiles(`${appFolder}/${dir}/${port}`, Cfiles) - } - - } - } - cleanPorts(AppToRemove) -} - - - - -function getRemoteapps(){ - const jamfolder = getJamFolder() - const myMap = new Map() - if(!fs.existsSync(`${jamfolder}/remote`)){ - return null - } - const remoteMachines = fs.readdirSync(`${jamfolder}/remote`) - for(let remoteMachine of remoteMachines){ - const ports = fs.readdirSync(`${jamfolder}/remote/${remoteMachine}`) - let arg='' - for(let port of ports){ - const apps = fs.readFileSync(`${jamfolder}/remote/${remoteMachine}/${port}`).toString().trim().split("\n") - for(let app of apps){ - arg = arg+app+":"+port+"##" - } - } - const result = arg.slice(0, -2); - myMap.set(remoteMachine,result) - } - - return myMap; -} -async function makeConnection(config){ - return await new Promise((resolve, reject) => { - const client = new Client(); - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.connect(config); - }); -} -async function executeScript(client, command){ - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ - - if (err) console.log(error); - let result = ''; - stream.on("close", () => { - resolve(result) - }) - stream.on("data" , (data) =>{ - - if(data.includes("TOREMOVE:")){ - let rm = data.toString().split(":")[1] - result = result + rm - } - }) - }) - })) -} -// main() -async function cleanRemote(toRemove){ - const jamfolder = getJamFolder() - - - for(let machine of toRemove.keys()){ - for(let rm of toRemove.get(machine)){ - - const dir = rm.split("/")[0] - const port = rm.split("/")[1] - if(!port){ - fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); - } - if(!fs.existsSync(`${jamfolder}/remote/${machine}/${port}`)){ - return - } - const apps = fs.readFileSync(`${jamfolder}/remote/${machine}/${port}`).toString().trim().split("\n"); - const currApps = apps.filter((entry)=>(!entry.includes(dir))); - - if(currApps.length === 0 ){ - fs.rmSync(`${jamfolder}/remote/${machine}/${port}`, { recursive: true, force: true }); - } - else{ - const toWrite = currApps.join("\n") - fs.writeFileSync(`${jamfolder}/remote/${machine}/${port}`,`${toWrite}\n`) - } - } - if((fs.readdirSync(`${jamfolder}/remote/${machine}`)).length === 0 ){ - fs.rmSync(`${jamfolder}/remote/${machine}`, { recursive: true, force: true }); - } - } -} - -(async () =>{ - const arg = process.argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs'))); - const appfolder = getAppFolder(); - const jamFolder = getJamFolder(); - if(arg.length === 0){ - let currIP ; - if (os.platform() === 'win32') { - currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'darwin') { - currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'linux') { - currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); - } - const map = getRemoteapps(); - - const removalMap = new Map() - if(map){ - for(let machines of map.keys()){ - const [host,port] = machines.split("_"); - const arg = map.get(machines); - const config = { - host: host, - port: port, - username: 'admin', - password: 'admin' - }; - let client - try{ - client = await makeConnection(config); - } - catch(error){ - fs.rmSync(`${jamFolder}/remote/${machines}`, { recursive: true, force: true }); - continue; - } - - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - const script = `zx jamclean.mjs --root=${currIP} --hash=${arg}` - const result = await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) - const toRemove = result.trim().split("\n"); - if(toRemove.length !==0 && toRemove[0] !== ''){ - removalMap.set(machines,toRemove) - } - - } - - cleanRemote(removalMap) - } - } - await clean() - - if(arg.length === 2){ - const rootIP = (arg[0].split("="))[1] - const hash = (arg[1].split("="))[1] - - const portDirs = hash.split("##") - for(let portDir of portDirs){ - let dirName = portDir.split(":")[0] - let portName = portDir.split(":")[1] - if(!fs.existsSync(`${jamFolder}/ports/${portName}`)){ - console.log(`TOREMOVE:${dirName}/${portName}`); - await sleep(5) - continue - }; - const running = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim(); - if(!running.includes(dirName)){ - console.log(`TOREMOVE:${dirName}/${portName}`); - await sleep(5) - continue - }; - if(!fs.existsSync(`${appfolder}/${dirName}/${portName}/root`)){ - console.log(`TOREMOVE:${dirName}/${portName}`); - await sleep(5) - continue - }; - const dirRoot = fs.readFileSync(`${appfolder}/${dirName}/${portName}/root`).toString().trim() - if(rootIP !== dirRoot){ - console.log(`TOREMOVE:${dirName}/${portName}`); - await sleep(5) - continue - }; - } - } - process.exit() - -})(); \ No newline at end of file diff --git a/tools/jamclose b/tools/jamclose deleted file mode 100755 index 40a0ed24d..000000000 --- a/tools/jamclose +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -# Edit the following locations to provide the -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - - -closeterm() { - local tmuxapp=$1 - - $TMUX has-session -t $tmuxapp 2>/dev/null - local res=$? - - if [ $res == "0" ]; then - $TMUX detach-client -s $tmuxapp - fi -} - -closeall() { - - if [ "$(ls -A $jamfolder)" ]; then - - cd $jamfolder - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jport in `ls $jamfolder/$jruns`; do - dir=$jamfolder/$jruns$jport - if [ -d $dir ]; then - if [ -e $dir/tmuxid ]; then - local tmuxid=`cat $dir/tmuxid` - closeterm $tmuxid - fi - fi - done - fi - done - fi -} - - -show_usage() { - cat << EOF - -jamclose tmux-id -Closes the given terminal. - -jamclose -Closes all open terminal (tmux terminals showing running JAMScript devices). - -EOF -} - -jamfolder=$HOME"/.jamruns" - -if [ -z $1 ]; then - if [ ! -d $jamfolder ]; then - echo "No running instances of JAMScript." - exit 0 - fi - closeall - exit -fi - -if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit -fi - -if [ ! -d $jamfolder ]; then - echo "No running instances of JAMScript." - exit 0 -fi - -closeterm $1 diff --git a/tools/jamexec b/tools/jamexec deleted file mode 100755 index 17a72d8d6..000000000 --- a/tools/jamexec +++ /dev/null @@ -1,425 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -SHELLPID=$$ -trap cleanup SIGTERM SIGINT -TMUX=`which tmux` - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Stripped down version of jamrun for use by the shell. Unlike jamrun, jamexec -assumes all resources except tmux terminals are available and reuses them. - -Usage: jamexec file.jxe [--app=appl_name] [--fog|--cloud] [--num=num_c_devs] - [--data=data-url] - [--tags=quoted_list_of_tags] - [--bg] - [--iflow=flow_name] - [--oflow=flow_name] - [--log] -EOF -} - -dojamout() { - dojamout_p1 $1 $2 $3 - dojamout_p2 $1 $2 $3 -} - -dojamout_p1() { - local type=$1 - local pnum=$2 - local floc=$3 - - echo "$data" > $floc/$pnum/dataStore - echo "process" > $floc/$pnum/class - echo "$SHELLPID" > $floc/$pnum/shellpid - echo "new" > $floc/$pnum/processId -} - -dojamout_p2() { - - if [ -z $bg ]; then - dojamout_p2_fg $1 $2 $3 - else - dojamout_p2_bg $1 $2 $3 - fi -} - -cleanup() { - reset - cleanuptmux - exit 1 -} - -dojamout_p2_fg() { - local type=$1 - local pnum=$2 - local floc=$3 - - buildjargs "--app=$jappid" "--port=$pnum" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" - local args=$results - - case $type in - cloud) - node jamout.js $args - ;; - fog) - node jamout.js $args - ;; - device) - node jamout.js $args - ;; - esac - echo ">>> Started the J node at port $pnum" -} - -dojamout_p2_bg() { - local type=$1 - local pnum=$2 - local floc=$3 - - buildjargs "--app=$jappid" "--port=$pnum" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" - node jamout.js $results & - jpid=$! -} - -doaout() { - local counter=1 - local num=$1 - local port=$2 - - if [ -e a.out ]; then - chmod +x a.out - fi - - while [ $counter -le $num ]; do - if [ -e a.out ]; then - # execute the program.. we are in the folder.. - buildcargs "-a=$jappid" "-p=$port" "-n=$counter" "-t=$tags" - local cargs=$results - if [ -z $log ]; then - $TMUX new-session -s $tmuxapp-$counter -d "./a.out $cargs" - else - if [ `uname` == "Linux" ]; then - $TMUX new-session -s $tmuxapp-$counter -d script -a -c "./a.out $cargs" -f log - else - $TMUX new-session -s $tmuxapp-$counter -d "script -a -t 1 log ./a.out $cargs" - fi - fi - fi - ((counter++)) - done -} - -setuptmux() { - - if [ -z $tmuxid ]; then - tmuxapp="tg-$RANDOM" - else - tmuxapp=$tmuxid - fi - - echo "$tmuxapp" > $1/tmuxid - save "$tmuxapp" $appfolder/tmuxid - - trap cleanuptmux SIGINT -} - -getappid() { - local mainf=$1 - local localf=$2 - local appid=$3 - - if [ $appid == "app-n" ]; then - inc_counter $mainf/counter - save "app-$result" $localf/appid - else - save "$appid" $localf/appid - fi - - jappid=`cat $localf/appid` -} - -cleanuptmux() { - if [ ! -z $tmuxapp ]; then - $TMUX kill-session -t $tmuxapp - fi - exit -} - -# We are already in the correct foldler -# We should find MANIFEST if there is a previous version in the current folder -# We unzip to the current folder if needed. -unpack() { - local file=$1 - - if [ -z $old ]; then - if [ ! -e MANIFEST.txt ]; then - # there is no old file. unpack - unzip -oq $file - if [ $? -ne 0 ]; then - die "Problem reading file: $file" - fi - else - ntime=`zipgrep CREATE $file | awk '{split($0,a, " "); print a[3]}'` - otime=`grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` - if (( $ntime > $otime )); then - # newer file so unpack it - unzip -oq $file - if [ $? -ne 0 ]; then - die "Problem reading file: $file" - fi - fi - fi - fi -} - - -### -# Main script execution begins here... -# - -# Initialize all the option variables. -app=app-n -type=device -data=127.0.0.1:6379 -iport=1883 -num=1 -tags= -bg= -old= -tmuxid= -log= -iflow= -oflow= - -file=$1 -shift -fext="${file##*.}" - -if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then - show_usage - exit 1 -fi - -if [ "$fext" != "jxe" ]; then - die "Extension on $file is not .jxe" -fi - - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--args" requires a non-empty option argument.' - ;; - -p|--port) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - iport=$2 - shift - else - die 'ERROR: "--port" requires a non-empty option argument.' - fi - ;; - --port=?*) - iport=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --port=) # Handle the case of an empty - die 'ERROR: "--port" requires a non-empty option argument.' - ;; - -t|--tags) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tags=$2 - shift - else - die 'ERROR: "--tags" requires a non-empty option argument.' - fi - ;; - --tags=?*) - tags=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tags=) # Handle the case of an empty - die 'ERROR: "--tags" requires a non-empty option argument.' - ;; - -m|--tmux) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tmuxid=$2 - shift - else - die 'ERROR: "--tmux" requires a non-empty option argument.' - fi - ;; - --tmux=?*) - tmuxid=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tmux=) # Handle the case of an empty - die 'ERROR: "--tmux" requires a non-empty option argument.' - ;; - -n|--num) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - num=$2 - shift - else - die 'ERROR: "--num" requires a non-empty option argument.' - fi - ;; - --num=?*) - num=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --num=) # Handle the case of an empty - die 'ERROR: "--num" requires a non-empty option argument.' - ;; - -u|--oflow) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - oflow=$2 - shift - else - die 'ERROR: "--oflow" requires a non-empty option argument.' - fi - ;; - --oflow=?*) - oflow=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --oflow=) # Handle the case of an empty - die 'ERROR: "--oflow" requires a non-empty option argument.' - ;; - -i|--iflow) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - iflow=$2 - shift - else - die 'ERROR: "--iflow" requires a non-empty option argument.' - fi - ;; - --iflow=?*) - iflow=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --iflow=) # Handle the case of an empty - die 'ERROR: "--iflow" requires a non-empty option argument.' - ;; - -d|--data) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - data=$2 - shift - else - die 'ERROR: "--data" requires a non-empty option argument.' - fi - ;; - --data=?*) - data=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --data=) # Handle the case of an empty - die 'ERROR: "--data" requires a non-empty option argument.' - ;; - -f|--fog) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="fog" - num= - fi - ;; - -c|--cloud) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="cloud" - num= - fi - ;; - -b|--bg) - bg=1 - ;; - -l|--log) - log=1 - ;; - -o|--old) - old=1 - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - - - -if [ -e "$file" ]; then - - jamfolder=$HOME"/.jamruns" - appfolder=$jamfolder/apps - - # Get the folder - filenoext="${file%.*}" - filenoext="${filenoext##*/}" - folder=$appfolder/$filenoext"_"$app - create_missingdir $folder - - #save handle to file - ifile="$(cd "$(dirname "$file")"; pwd)/$(basename "$file")" - cd $folder - unpack $ifile # We are already in $folder - - if [ -e jamout.js ]; then - - # execute the program.. we are in the folder.. - case $type in - cloud) - create_missingdir $folder/$iport - getappid $jamfolder $folder/$iport $app - dojamout $type $iport $folder - ;; - fog) - create_missingdir $folder/$iport - getappid $jamfolder $folder/$iport $app - dojamout $type $iport $folder - ;; - device) - create_missingdir $folder/$iport - getappid $jamfolder $folder/$iport $app - dojamout_p1 $type $iport $folder - setuptmux $folder/$iport - doaout $num $iport - dojamout_p2 $type $iport $folder - if [ -z $bg ]; then - cleanuptmux - fi - ;; - esac - else - die "File: $file is not a valid JAMScript executable" - fi - -else - die "File: $file not found" -fi diff --git a/tools/jaminstall b/tools/jaminstall deleted file mode 100755 index 21309a8e7..000000000 --- a/tools/jaminstall +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -# Edit the following locations to provide the -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -jamkill --all -kills all running instances - -jamkill app-id -kills all running instances that are from application app-id - -Usage: jamkill --all|app-id - -EOF -} - -killtmux() { - local tmid=$1 - - tmux has-session -t $tmid 2>/dev/null - local res=$? - if [ $res == "0" ]; then - tmux kill-session -t $tmid - fi -} - -killprocess() { - - if [ -e $1/shellpid ]; then - local pid=`cat $1/shellpid` - local present=`ps -p $pid | grep jamrun | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - kill $pid - fi - fi - - if [ -e $1/processId ]; then - local pid=`cat $1/processId` - local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - kill -9 $pid - fi - elif [ -e $1/dockerId ]; then - local didp=`cat $1/dockerId` - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - docker kill $didp - docker rm $didp - fi - fi -} - - -killjob() { - local jobid=$1 - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ]; then - local appid=`cat $dir/appid` - if [ $appid == $jobid ]; then - echo "Killing application running at " $jexs - killprocess $dir - if [ -e $dir/tmuxid ]; then - killtmux `cat $dir/tmuxid` - fi - fi - fi - done - fi - done -} - -killalljobs() { - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ]; then - echo "Killing application running at " $jexs - killprocess $dir - if [ -e $dir/tmuxid ]; then - killtmux `cat $dir/tmuxid` - fi - fi - done - fi - done - -} - - -if [ -z $1 ] || [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit -fi - - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder "No running instances of JAMScript." - -appsfolder=$jamfolder/apps - -if [ "$(ls -A $appsfolder)" ]; then - - cd $appsfolder - - if [ $1 == "--all" ]; then - killalljobs - exit - fi - - killjob $1 -fi diff --git a/tools/jamkill b/tools/jamkill old mode 100755 new mode 100644 index 2eca83c31..65844245f --- a/tools/jamkill +++ b/tools/jamkill @@ -1,167 +1,614 @@ -#!/bin/bash +#!/usr/bin/env node --input-type=module +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +import {getKilltArgs} from "./parser.mjs" +import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; +import { Client } from 'ssh2'; +import { transport } from "pino"; +//can't specify what port ti jukk exactly +let currIP; +if (os.platform() === 'win32') { + currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'darwin') { + currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'linux') { + currIP =( await $`hostname -I`.catch(() => '')).toString().trim(); + } -IDIR="${BASH_SOURCE%/*}" -echo $BASH_SOURCE -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" +export function getRunningDirs(){ + const jamFolder = getJamFolder() + const appToPort = new Map() + let activePorts + try{ + activePorts = fs.readdirSync(`${jamFolder}/ports`) + } + catch(error){ + return appToPort + } + for(let port of activePorts){ + let apps; + try{ + apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + } + catch(error){ + continue + } + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } + } + return appToPort; +} + +export function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") + } + else{ + return dir[1]; + } + +} +export function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] + +} +function killDataByPortDir(portDir, root){ + const jamFolder = getJamFolder() + const appFolder = getAppFolder() + const infoList = portDir.split("/") + + if(infoList.length !== 2){ + throw new Error("Wrong Path input") +0 } + const dirName = infoList[0] + const portName = infoList[1] + + let dirsRunning; + try{ + dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n"); + } + catch(error){ + return[] + } + + if(!dirsRunning.includes(dirName)){ + return [] + } + + if(root){ + try{ + const rootIP = fs.readFileSync(`${appFolder}/${portDir}/root`).toString().trim(); + if(rootIP === root){ + const info = { + programName : dirNameToProgramName(dirName)+".jxe", + appName : dirNameToAppName(dirName), + portNumber : portName + } + return [info] + } + return []; + } + catch(error){ + return []; + } + } + else{ + const info ={ + programName : dirNameToProgramName(dirName)+".jxe", + appName : dirNameToAppName(dirName), + portNumber : portName + } + return [info] + } +} + +function killDataByPortNum(portNum, root){ + const jamFolder = getJamFolder() + const toClean=[]; + const appfolder = getAppFolder() + let activePorts; + let dirsRunning; + try{ + activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) + if(!activePorts.includes(Number(portNum))){ + return []; + } + dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") + } + catch(error){ + return [] + } + for(let dir of dirsRunning){ + if(root){ + try{ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${portNum}/root`).toString().trim(); + if(rootIP === root){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : portNum + } + toClean.push(info) + } + } + catch(error){ + continue; + } + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : portNum + } + toClean.push(info) + } + } + return toClean; +} + +function killDataByAppName(appName, root){ + const toClean=[]; + const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() + for(let dir of activeDirs.keys()){ + const currApp = dirNameToAppName(dir) + if(currApp === appName){ + for(let port of activeDirs.get(dir)){ + if(root){ + try{ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + catch(error){ + continue; + } + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + } + } + return toClean +} + +function killDataByProgramName(programName, root){ + + const toClean=[]; + const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() + for(let dir of activeDirs.keys()){ + const currProgram = dirNameToProgramName(dir) + if(currProgram === programName){ + for(let port of activeDirs.get(dir)){ + if(root){ + try{ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + const info = { + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + catch(error){ + continue; + } + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + } + } + return toClean +} + + +function killDataByDirName(dirName, root){ + + const toClean=[]; + const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() + for(let dir of activeDirs.keys()){ + if(dir === dirName){ + for(let port of activeDirs.get(dir)){ + if(root){ + try{ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + catch(error){ + continue; + } + } + else{ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + } + } + return toClean +} + +function killDataForAll(root){ + const toClean=[]; + const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() + + for(let dir of activeDirs.keys()){ + for(let port of activeDirs.get(dir)){ + if(root){ + try{ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + catch(error){ + continue; + } + } + else{ + + const info ={ + programName : dirNameToProgramName(dir)+".jxe", + appName : dirNameToAppName(dir), + portNumber : port + } + toClean.push(info) + } + } + } + + return toClean +} +async function killJamRun(data){ + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + const dirName = ((programName.split('.'))[0]) +"_"+ appName; + const appfolder = getAppFolder() + try{ + const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); + const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` + const exists = Number(p.stdout.toString().trim()); + if(exists){ + process.kill(pid); + return + } + } + catch(error){ + return + } +} + +async function killJFile(data){ + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + const dirName = ((programName.split('.'))[0]) +"_"+ appName; + const appfolder = getAppFolder() + try{ + const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/processId`).toString().trim(); + const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` + const exists = Number(p.stdout.toString().trim()); + if(exists){ + process.kill(pid); + return; + } + } + catch(error){ + return + } +} + +async function killProcess(data){ + await killJamRun(data); + await killJFile(data); +} + +async function pauseProcess(data){ + await killJamRun(data); + await killJFile(data); +} + +async function jamKill(flag, name, pause, root) +{ + + + let jamData; + if(flag === "dir"){ + jamData = killDataByDirName(name, root) + } + else if(flag === "app"){ + jamData = killDataByAppName(name, root) + + + } + else if(flag === "program"){ + + jamData = killDataByProgramName(name, root) + } + else if(flag === "port"){ + + jamData = killDataByPortNum(name, root) + } + else if(flag === "portDir"){ + + jamData = killDataByPortDir(name, root) + } + else{ + + jamData = killDataForAll(root) + } + + + if(jamData.length === 0 ){ + if(flag === "all"){ + console.log("no running app on local") + } + else{ + console.log("no such running app on local") + } + + } + + if(pause){ + for(let data of jamData){ + let appfolder = getAppFolder() + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + try{ + fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`) + if(fs.readFileSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`).toString().trim() === "new"){ + console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) + } + } + catch(error){ + console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) + } + pauseByPortNumber(programName,appName,portNumber) + await pauseProcess(data); + } + } + else{ + for(let data of jamData){ + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + await killProcess(data); + cleanByPortNumber(programName,appName,portNumber) + } + } + //keep this LOG + console.log("KILLING IS OVER") + +} + +async function jamKillBruteForce(){ + + await $`pkill node`.nothrow().quiet(); + await $`pkill mosquitto`.nothrow().quiet(); + await $`pkill tmux`.nothrow().quiet(); + await $`ps aux | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill`.nothrow().quiet(); + const jamfolder = getJamFolder(); + if(fs.existsSync(`${jamfolder}/ports`)) + fs.rmSync(`${jamfolder}/ports`, { recursive: true, force: true }) + if(fs.existsSync(`${jamfolder}/apps`)) + fs.rmSync(`${jamfolder}/apps`, { recursive: true, force: true }) + if(fs.existsSync(`${jamfolder}/mqttpid`)) + fs.rmSync(`${jamfolder}/mqttpid`, { recursive: true, force: true }) + +} +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + + if (err) throw err; + let result = '' + stream.on("close", () => { + resolve(result) + }) + stream.on("data" , (data) =>{ + + if(data.includes("KILLING IS OVER")) + { + resolve(data.toString()) + } + + }) + }) + })) +} + +async function main(){ + + let args; + + try{ + args = getKilltArgs(process.argv) + + } + catch(error){ + + + console.log( + + ` + Kill running instances of the application. + Usage: + + jamkill --reset [--remote] + To kill all the programs and remove the ports, mqttpid and apps directory which would be equivelant to a hard reset + --reset flag should be used. have in mind uninsg the --reset flag will dissable all the other flags and do a hard reset. + the only flag which can be used with --reset is --remote which runs the kill --reset on the local machine and all the remote + machines. + + jamkill --help + displays this help messages. + + jamkill --all [--remote] [--pause] + to kill all the programs running --all flag should be used. It differ from --reset since it just removes the running programs + and does no file directory cleanup. The only other flag which can be used next to --all is --remote and --pause. use --remote to include all the remote + machines in the killing process. use --pause to pause all the programs instead of completly killing them. + + + jamkill --app --name== [--remote] [--pause] + to kill program with a specific appName. use --app flag as an indicator of the killing criteria(which is app name), followed by --name= + to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex) jamkill --app --name=testingApp --remote --pause + + jamkill --program --name== [--remote] [--pause] + to kill program with a specific programName. use --program flag as an indicator of the killing criteria(which is program name), followed by --name= + to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex)jamkill --program --name=jt2 [--remote] [--pause] + + jamkill --port --name== [--remote] [--pause] + to kill program with on a specific portNumber, use --port flag as an indicator of the killing criteria(which is portNumbrt), followed by --name= + to specify what program on which port should be killed. [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex) jamkill --app --name=1883 --remote --pause + + jamkill --dir --name== [--remote] [--pause] + Directory name is refered to the directory associated to a program under the apps folder. dirName is a combination of the --program and --name flag. + If a program with specific appName and programName should be killed --dir flag should be used followed by the --name=. + [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex)jamkill --dir --name=jt2_testingApp --remote --pause + + jamkill --portDir --name== [--remote] [--pause] + portDir refers to the directory in the folder for a specific program which contains the info of that program running on an specific port. + portdir is a combination of --app, --program and --ports which always targetes a signle running program. + [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. + ex)jamkill --portDir --name==jt2_shahin/1883 [--remote] [--pause] + + NOTE: only one of --app && --program && --dir && --portDir && --port can be used. + ` + ) + throw error + } + const jamfolder = getJamFolder(); + const appfolder = getAppFolder(); + if(fs.existsSync(`${jamfolder}/remote`) && args.remote && !args.root){ + const remotes = fs.readdirSync(`${jamfolder}/remote`) + for(let remote of remotes){ + const [host,port] = remote.split("_"); + const config = { + host: host, + port: port, + username: 'admin', + password: 'admin' + }; + let client = await new Promise((resolve, reject) => { + const client = new Client(); + + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let toExecute; + + if(args.flag == "reset"){ + toExecute = `zx jamkill --reset --root=${currIP}` + } + + else if(args.flag == "all"){ + if(!args.pause) + toExecute = `zx jamkill --${args.flag} --root=${currIP}` + else + toExecute = `zx jamkill --${args.flag} --pause --root=${currIP}` + } + else{ + if(!args.pause) + toExecute = `zx jamkill --${args.flag} --name=${args.name} --root=${currIP}` + else + toExecute = `zx jamkill --${args.flag} --name=${args.name} --pause --root=${currIP}` + } + + + const command=`${pathExport} && ${changeDir} && ${toExecute}` + await executeScript(client, command); + } + } + if(args.flag === "reset"){ + if(args.root){ + throw new Error("DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE") + } + + await jamKillBruteForce() + } + else if( !fs.existsSync(jamfolder) ){ + throw new Error('.jamruns folder missing. JAMScript tools not setup?') + } + else if( !fs.existsSync(appfolder) ){ + throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') + } + else{ + await jamKill(args.flag , args.name, args.pause, args.root); + } + + + process.exit(0); + +} + + +(async() => { + + await main() -# Edit the following locations to provide the -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Kill running instances of the application. - -Usage: jamkill [--all|app-id|--help] - -jamkill -kill the program started last among the currently running ones - -jamkill --help -displays this help messages - -jamkill --all -kills all running instances - -jamkill app-id -kills all running instances that were started under app-id - -EOF -} - - -killtmux() { - - for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do - tmux kill-session -t $q - done -} - -# called with two args.. -# dir port -killprocess() { - - if [ -e $1/shellpid ]; then - local pid=`cat $1/shellpid` - local present=`ps -p $pid | grep jamrun | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - echo "Killing process $pid" - kill $pid - fi - fi - - if [ -e $1/processId ]; then - local pid=`cat $1/processId` - local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - echo "Killing process $pid" - kill -9 $pid - fi - - if [ `uname` == "Linux" ]; then - local spid=`ps ax | grep node | grep $2 | cut -d ' ' -f 2 | tr -d '[:space:]'` - if [ ! -z $spid ]; then - echo "Killing process $pid" - kill -9 $spid - fi - fi - - elif [ -e $1/dockerId ]; then - local didp=`cat $1/dockerId` - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - docker exec -it $didp jamkill `cat $1/appid` - echo "-" > $1/dockerId - local count=`docker exec -it $didp jamlist | wc -l | tr -d '[:space:]'` - if (( $count <= 2 )); then - echo "Killing docker $didp" - docker kill $didp - docker rm $didp - fi - fi - fi -} - - -killjob() { - local jobid=$1 - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ]; then - if [ -e $dir/appid ]; then - local appid=`cat $dir/appid` - - if [ $appid == $jobid ]; then - echo $dir - echo "this is my dir" - echo $jexs - echo "this is my jexs" - killprocess $dir $jexs - if [ -e $dir/tmuxid ]; then - killtmux `cat $dir/tmuxid` - fi - fi - fi - fi - done - fi - done -} - -killalljobs() { - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ]; then - killprocess $dir $jexs - if [ -e $dir/tmuxid ]; then - killtmux `cat $dir/tmuxid` - fi - fi - done - fi - done - -} - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" - -appsfolder=$jamfolder/apps -exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" - -cd $appsfolder - -if [ -z $1 ]; then - # kill the job that is under the file 'appid' - # this is the job that was started last - if [ -e appid ]; then - appid=`cat appid` - killjob $appid - fi -else - # Show help - if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit - elif [ $1 == "--all" ]; then - killalljobs - else - killjob $1 - fi -fi +})() diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs deleted file mode 100644 index ff90acea8..000000000 --- a/tools/jamkill.mjs +++ /dev/null @@ -1,614 +0,0 @@ -#!/usr/bin/env zx -import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; -import {getKilltArgs} from "./parser.mjs" -import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; -import { Client } from 'ssh2'; -import { transport } from "pino"; -//can't specify what port ti jukk exactly -let currIP; -if (os.platform() === 'win32') { - currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'darwin') { - currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'linux') { - currIP =( await $`hostname -I`.catch(() => '')).toString().trim(); - } - -export function getRunningDirs(){ - const jamFolder = getJamFolder() - const appToPort = new Map() - let activePorts - try{ - activePorts = fs.readdirSync(`${jamFolder}/ports`) - } - catch(error){ - return appToPort - } - for(let port of activePorts){ - let apps; - try{ - apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); - } - catch(error){ - continue - } - for(let app of apps){ - if(appToPort.has(app)){ - const portList = appToPort.get(app); - portList.push(port) - appToPort.set(app,portList) - } - else{ - appToPort.set(app,[port]) - } - } - } - return appToPort; -} - -export function dirNameToAppName(dirName){ - const dir = dirName.split('_') - if(dir.length > 2){ - return (dir.filter((_,index) => index !== 0)).join("_") - } - else{ - return dir[1]; - } - -} -export function dirNameToProgramName(dirName){ - return (dirName.split('_'))[0] - -} -function killDataByPortDir(portDir, root){ - const jamFolder = getJamFolder() - const appFolder = getAppFolder() - const infoList = portDir.split("/") - - if(infoList.length !== 2){ - throw new Error("Wrong Path input") -0 } - const dirName = infoList[0] - const portName = infoList[1] - - let dirsRunning; - try{ - dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n"); - } - catch(error){ - return[] - } - - if(!dirsRunning.includes(dirName)){ - return [] - } - - if(root){ - try{ - const rootIP = fs.readFileSync(`${appFolder}/${portDir}/root`).toString().trim(); - if(rootIP === root){ - const info = { - programName : dirNameToProgramName(dirName)+".jxe", - appName : dirNameToAppName(dirName), - portNumber : portName - } - return [info] - } - return []; - } - catch(error){ - return []; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dirName)+".jxe", - appName : dirNameToAppName(dirName), - portNumber : portName - } - return [info] - } -} - -function killDataByPortNum(portNum, root){ - const jamFolder = getJamFolder() - const toClean=[]; - const appfolder = getAppFolder() - let activePorts; - let dirsRunning; - try{ - activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) - if(!activePorts.includes(Number(portNum))){ - return []; - } - dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") - } - catch(error){ - return [] - } - for(let dir of dirsRunning){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${portNum}/root`).toString().trim(); - if(rootIP === root){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : portNum - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : portNum - } - toClean.push(info) - } - } - return toClean; -} - -function killDataByAppName(appName, root){ - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - for(let dir of activeDirs.keys()){ - const currApp = dirNameToAppName(dir) - if(currApp === appName){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - } - return toClean -} - -function killDataByProgramName(programName, root){ - - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - for(let dir of activeDirs.keys()){ - const currProgram = dirNameToProgramName(dir) - if(currProgram === programName){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - const info = { - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - } - return toClean -} - - -function killDataByDirName(dirName, root){ - - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - for(let dir of activeDirs.keys()){ - if(dir === dirName){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - } - return toClean -} - -function killDataForAll(root){ - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - - for(let dir of activeDirs.keys()){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - - return toClean -} -async function killJamRun(data){ - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - const dirName = ((programName.split('.'))[0]) +"_"+ appName; - const appfolder = getAppFolder() - try{ - const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/shellpid`).toString().trim(); - const p = await $`ps -p ${pid} | grep jamrun | wc -l | tr -d '[:space:]'` - const exists = Number(p.stdout.toString().trim()); - if(exists){ - process.kill(pid); - return - } - } - catch(error){ - return - } -} - -async function killJFile(data){ - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - const dirName = ((programName.split('.'))[0]) +"_"+ appName; - const appfolder = getAppFolder() - try{ - const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/processId`).toString().trim(); - const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` - const exists = Number(p.stdout.toString().trim()); - if(exists){ - process.kill(pid); - return; - } - } - catch(error){ - return - } -} - -async function killProcess(data){ - await killJamRun(data); - await killJFile(data); -} - -async function pauseProcess(data){ - await killJamRun(data); - await killJFile(data); -} - -async function jamKill(flag, name, pause, root) -{ - - - let jamData; - if(flag === "dir"){ - jamData = killDataByDirName(name, root) - } - else if(flag === "app"){ - jamData = killDataByAppName(name, root) - - - } - else if(flag === "program"){ - - jamData = killDataByProgramName(name, root) - } - else if(flag === "port"){ - - jamData = killDataByPortNum(name, root) - } - else if(flag === "portDir"){ - - jamData = killDataByPortDir(name, root) - } - else{ - - jamData = killDataForAll(root) - } - - - if(jamData.length === 0 ){ - if(flag === "all"){ - console.log("no running app on local") - } - else{ - console.log("no such running app on local") - } - - } - - if(pause){ - for(let data of jamData){ - let appfolder = getAppFolder() - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - try{ - fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`) - if(fs.readFileSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`).toString().trim() === "new"){ - console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) - } - } - catch(error){ - console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) - } - pauseByPortNumber(programName,appName,portNumber) - await pauseProcess(data); - } - } - else{ - for(let data of jamData){ - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - await killProcess(data); - cleanByPortNumber(programName,appName,portNumber) - } - } - //keep this LOG - console.log("KILLING IS OVER") - -} - -async function jamKillBruteForce(){ - - await $`pkill node`.nothrow().quiet(); - await $`pkill mosquitto`.nothrow().quiet(); - await $`pkill tmux`.nothrow().quiet(); - await $`ps aux | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill`.nothrow().quiet(); - const jamfolder = getJamFolder(); - if(fs.existsSync(`${jamfolder}/ports`)) - fs.rmSync(`${jamfolder}/ports`, { recursive: true, force: true }) - if(fs.existsSync(`${jamfolder}/apps`)) - fs.rmSync(`${jamfolder}/apps`, { recursive: true, force: true }) - if(fs.existsSync(`${jamfolder}/mqttpid`)) - fs.rmSync(`${jamfolder}/mqttpid`, { recursive: true, force: true }) - -} -async function executeScript(client, command){ - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ - - if (err) throw err; - let result = '' - stream.on("close", () => { - resolve(result) - }) - stream.on("data" , (data) =>{ - - if(data.includes("KILLING IS OVER")) - { - resolve(data.toString()) - } - - }) - }) - })) -} - -async function main(){ - - let args; - - try{ - args = getKilltArgs(process.argv) - - } - catch(error){ - - - console.log( - - ` - Kill running instances of the application. - Usage: - - jamkill --reset [--remote] - To kill all the programs and remove the ports, mqttpid and apps directory which would be equivelant to a hard reset - --reset flag should be used. have in mind uninsg the --reset flag will dissable all the other flags and do a hard reset. - the only flag which can be used with --reset is --remote which runs the kill --reset on the local machine and all the remote - machines. - - jamkill --help - displays this help messages. - - jamkill --all [--remote] [--pause] - to kill all the programs running --all flag should be used. It differ from --reset since it just removes the running programs - and does no file directory cleanup. The only other flag which can be used next to --all is --remote and --pause. use --remote to include all the remote - machines in the killing process. use --pause to pause all the programs instead of completly killing them. - - - jamkill --app --name== [--remote] [--pause] - to kill program with a specific appName. use --app flag as an indicator of the killing criteria(which is app name), followed by --name= - to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex) jamkill --app --name=testingApp --remote --pause - - jamkill --program --name== [--remote] [--pause] - to kill program with a specific programName. use --program flag as an indicator of the killing criteria(which is program name), followed by --name= - to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex)jamkill --program --name=jt2 [--remote] [--pause] - - jamkill --port --name== [--remote] [--pause] - to kill program with on a specific portNumber, use --port flag as an indicator of the killing criteria(which is portNumbrt), followed by --name= - to specify what program on which port should be killed. [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex) jamkill --app --name=1883 --remote --pause - - jamkill --dir --name== [--remote] [--pause] - Directory name is refered to the directory associated to a program under the apps folder. dirName is a combination of the --program and --name flag. - If a program with specific appName and programName should be killed --dir flag should be used followed by the --name=. - [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex)jamkill --dir --name=jt2_testingApp --remote --pause - - jamkill --portDir --name== [--remote] [--pause] - portDir refers to the directory in the folder for a specific program which contains the info of that program running on an specific port. - portdir is a combination of --app, --program and --ports which always targetes a signle running program. - [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex)jamkill --portDir --name==jt2_shahin/1883 [--remote] [--pause] - - NOTE: only one of --app && --program && --dir && --portDir && --port can be used. - ` - ) - throw error - } - const jamfolder = getJamFolder(); - const appfolder = getAppFolder(); - if(fs.existsSync(`${jamfolder}/remote`) && args.remote && !args.root){ - const remotes = fs.readdirSync(`${jamfolder}/remote`) - for(let remote of remotes){ - const [host,port] = remote.split("_"); - const config = { - host: host, - port: port, - username: 'admin', - password: 'admin' - }; - let client = await new Promise((resolve, reject) => { - const client = new Client(); - - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.connect(config); - }); - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let toExecute; - - if(args.flag == "reset"){ - toExecute = `zx jamkill.mjs --reset --root=${currIP}` - } - - else if(args.flag == "all"){ - if(!args.pause) - toExecute = `zx jamkill.mjs --${args.flag} --root=${currIP}` - else - toExecute = `zx jamkill.mjs --${args.flag} --pause --root=${currIP}` - } - else{ - if(!args.pause) - toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --root=${currIP}` - else - toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --pause --root=${currIP}` - } - - - const command=`${pathExport} && ${changeDir} && ${toExecute}` - await executeScript(client, command); - } - } - if(args.flag === "reset"){ - if(args.root){ - throw new Error("DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE") - } - - await jamKillBruteForce() - } - else if( !fs.existsSync(jamfolder) ){ - throw new Error('.jamruns folder missing. JAMScript tools not setup?') - } - else if( !fs.existsSync(appfolder) ){ - throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') - } - else{ - await jamKill(args.flag , args.name, args.pause, args.root); - } - - - process.exit(0); - -} - - -(async() => { - - await main() - -})() diff --git a/tools/jamlist b/tools/jamlist old mode 100755 new mode 100644 index 7fa5f91ab..a0b586c19 --- a/tools/jamlist +++ b/tools/jamlist @@ -1,225 +1,506 @@ -#!/bin/bash +#!/usr/bin/env node --input-type=module -# Edit the following locations to provide the correct location if needed -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi +import { getJamListArgs } from "./parser.mjs"; +import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { Client } from 'ssh2'; -# No need to edit below this line unless you find a bug! +const { debounce } = require('lodash'); +const chokidar = require('chokidar'); +const jamFolder = getJamFolder() +let watcher; +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename); +const jamcleanPath = resolve(__dirname, 'jamclean'); +let NODESINFO = [] +let currIP ; +if (os.platform() === 'win32') { +currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); +} else if (os.platform() === 'darwin') { +currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); +} else if (os.platform() === 'linux') { +currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); +} + + +export function getRunningDirs(){ + const jamFolder = getJamFolder() + const appToPort = new Map() + let activePorts + try{ + activePorts = fs.readdirSync(`${jamFolder}/ports`) + } + catch(error){ + return appToPort + } + for(let port of activePorts){ + let apps; + try{ + apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + } + catch(error){ + continue + } + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } + } + return appToPort; +} +function getWatchList(filters){ + const watchList = [] + const appFolder = getAppFolder() + watchList.push(`${jamFolder}/ports`) + if(filters.remote){ + watchList.push(`${jamFolder}/remote`) + + } + const dirs = getRunningDirs() + for(let dir of dirs.keys()){ + for(let port of dirs.get(dir)){ + watchList.push(`${appFolder}/${dir}/${port}/numCnodes`) + watchList.push(`${appFolder}/${dir}/${port}/paused`) + } + } + return watchList + +} + + + +function watch(filters) { + setInterval(async () => { + await $`zx ${jamcleanPath}` + }, 1000); + function updateWatchList(watchList){ + + const newWatchList = getWatchList(filters); + for(let item of newWatchList){ + if(!watchList.includes(item)){ + watcher.add(item) + } + } + for(let item of watchList){ + if(!newWatchList.includes(item)){ + watcher.unwatch(item) + } + } + return newWatchList; + } + const updateInfo = debounce(async () => { + await sleep(500); + if (!filters || filters.all === true || Object.keys(filters).length === 0) { + const info = getNodeInfo(); + if(filters.remote){ + NODESINFO = [] + await main(true) + } + + + + if (info.length + NODESINFO.length === 0) { + console.log("---------"); + + console.log("There is no program running"); + } else { + console.log("---------"); + + printHeader(); + printNodeInfo(info); + if(filters.remote){ + printNodeInfo(NODESINFO); + } + } + } else { + const nodeinfo = getNodeInfo(); + let keysToRemove = ["root","remote","help","all" ]; + let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + const filtered = filter(nodeinfo, filteredObj); + + if(filters.remote){ + NODESINFO = [] + await main(true) + } -die() { - printf '%s\n' "$1" >&2 - exit 1 + if (filtered.length + NODESINFO.length === 0) { + console.log("---------"); + + console.log("There is no such program running"); + } else { + console.log("---------"); + + printHeader(); + printNodeInfo(filtered); + if(filters.remote){ + printNodeInfo(NODESINFO); + } + + } + } + }, 500); + let watchList = getWatchList(filters) + watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', (event, path) => { + + watchList = updateWatchList(watchList) + updateInfo(); + }); } -show_usage() { - cat << EOF -Usage: jamlist [--app=appl_name] +export function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") + } + else{ + return dir[1]; + } + +} +export function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] + +} -Lists details about all activated instances of JAMScript programs. Use the --app=X -option to limit the listing to programs that match the given name (i.e., X). +function getNodeInfo(root=null){ + const appToPortMap = getRunningDirs() + const jamfolder = getJamFolder() + const appfolder = getAppFolder(); + const nodeInfo =[] + if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ + return [] + } -EOF + for(let app of appToPortMap.keys()){ + const appName = dirNameToAppName(app) + const programName = dirNameToProgramName(app) + for(let port of appToPortMap.get(app)){ + if(root){ + if(fs.existsSync(`${appfolder}/${app}/${port}/root`)){ + const rootIP = fs.readFileSync(`${appfolder}/${app}/${port}/root`).toString().trim(); + if(rootIP === root){ + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-"} + const dirPath = `${appfolder}/${app}/${port}` + if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ + throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + } + for(let fileName of Object.keys(fileNames)){ + if(fs.existsSync(`${dirPath}/${fileName}`)){ + const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + fileNames[fileName] = data; + } + } + fileNames["portNum"] = String(port) + fileNames["appName"] = appName + fileNames["programName"] = programName + if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ + fileNames["status"] = "paused" + } + else{ + fileNames["status"] = "running" + + } + + fileNames["host"] = currIP + + + + nodeInfo.push(fileNames) + + } + } + } + else{ + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" } + const dirPath = `${appfolder}/${app}/${port}` + if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ + throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + } + for(let fileName of Object.keys(fileNames)){ + if(fs.existsSync(`${dirPath}/${fileName}`)){ + const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + fileNames[fileName] = data; + } + } + fileNames["portNum"] = String(port) + fileNames["appName"] = appName + fileNames["programName"] = programName + if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ + fileNames["status"] = "paused" + } + else{ + fileNames["status"] = "running" + + } + fileNames["host"] = "localHost" + + + nodeInfo.push(fileNames) + } + + } + } + + return nodeInfo; } -checkprocess() { - - if [ -e $1/processId ]; then - local pid=`cat $1/processId` - if [ $pid == "new" ]; then - running="new" - else - local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - running="ps" - else - running="none" - fi - fi - elif [ -e $1/dockerId ]; then - local didp=`cat $1/dockerId` - local appid=`cat $1/appid` - if [ -z $didp ] || [ $didp == "-" ]; then - running="none" - else - local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - local present=`docker exec -it $didp jamlist | grep $appid | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - running="docker" - else - running="none" - fi - else - running="none" - fi - fi - else - running="none" - fi +function printNodeInfo(info){ + + for (let row of info){ + if(row["host"] === currIP){ + row["host"] = "localHost" + } + const headerString = ` ${row["appName"].padEnd(10)} ${row["programName"].padEnd(10)} ${("Local:"+row["portNum"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)}`; + console.log(headerString) + } } -# save information in global varibales -# appl= -# prog= -saveapplinfo() { +function printHeader(){ + const headerString = ` ${"NAME".padEnd(10)} ${"PROGRAM".padEnd(10)} ${"HOST".padEnd(10)} ${"PARENT".padEnd(10)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(10)} ${"C-NODES".padEnd(10)} ${"TMUX-ID".padEnd(10)} ${"STATUS".padEnd(10)} ${"HOST".padEnd(10)}`; + console.log(headerString) +} - prog=`echo $1 | awk '{split($0,a,"_"); print a[1]}'` - appl=`echo $1 | awk '{split($0,a,"_"); split(a[2],b, "/"); print b[1]}'` +function filter(nodeinfo, filters){ + const filteredInfo =[]; + for(let info of nodeinfo){ + let isPassing = true + for(let filter of Object.keys(filters)){ + if(!(filters[filter] === info[filter])){ + isPassing = false + break; + } + } + if(isPassing){ + filteredInfo.push(info) + } + } + return filteredInfo; } -printnodeinfo() { - local port=$1 - if [ -e $2/machType ]; then - local mtype=`cat $2/machType` - else - local mtype="-" - fi - if [ -e $2/appid ]; then - local appid=`cat $2/appid` - else - local appid="-" - fi - if [ -e $2/dataStore ]; then - local dstore=`cat $2/dataStore` - else - local dstore="-" - fi - if [ -e $2/tmuxid ]; then - local tmuxid=`cat $2/tmuxid` - else - local tmuxid="-" - fi - if [ -e $2/parentId ]; then - local parid=`cat $2/parentId` - else - local parid='-' - fi - - if [ $mtype == "device" ]; then - local cdevs=0 - for pidf in `ls $2/cdevProcessId.*`; do - local pid=`cat $pidf` - local pidok=`ps -p $pid | grep a.out | wc -l | tr -d '[:space:]'` - if [ $pidok == 1 ]; then - ((cdevs++)) - fi - done - printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "Local:$port" "$parid" "$dstore" "$mtype" "$cdevs" "$tmuxid" - else - printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "Local:$port" "$parid" "$dstore" "$mtype" "--" "$tmuxid" - fi +function getRemoteMachines(){ + const jamfolder = getJamFolder() + if(!fs.existsSync(`${jamfolder}/remote`)){ + return [] + } + return (fs.readdirSync(`${jamfolder}/remote`)) + +} + +async function makeConnection(config){ + return await new Promise((resolve, reject) => { + const client = new Client(); + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); } +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + if (err) console.log(error); + stream.on("close", () => { + resolve("closed") + }) + stream.on("data" , (data) =>{ + if(data.includes("NODEINFO##")){ + let JSONrow = data.toString().trim().split("##")[1] + let row; + try{ + row = JSON.parse(JSONrow) + } + catch(error){ + console.log(error) + } + + -printdockerinfo() { - local port=$1 - local mtype=`cat $2/machType` - local appid=`cat $2/appid` - local dstore=`cat $2/dataStore` - if [ -e $2/tmuxid ]; then - local tmuxid=`cat $2/tmuxid` - else - local tmuxid="-" - fi - if [ -e $2/tmuxid_c ]; then - local tmuxid_c=`cat $2/tmuxid_c` - else - local tmuxid_c="-" - fi - - - local dockerid=`cat $2/dockerId` - - tmux has-session -t $tmuxid 2>/dev/null - local res=$? - if [ $res == "1" ]; then - tmuxid="-" - fi - - if [ $mtype == "device" ]; then -# local cdevs=`docker exec $dockerid jamquery $appid cdevs` - cdevs=`cat $2/cdevs` - printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "$dockerid" "" "$dstore" "$mtype" "$cdevs" "$tmuxid,$tmuxid_c" - else - printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "$dockerid" "" "$dstore" "$mtype" "--" "$tmuxid" - fi + + NODESINFO.push(row) + } + }) + }) + })) } +async function main(update=null){ + NODESINFO = [] + + let args; + try{ + args = getJamListArgs(process.argv) + } + catch(error){ + console.log(error) + + if(error.type = "ShowUsage"){ + console.log( + + ` + + Usage: + jamlist --help: show this usage msg. + + jamlist has two made modes. the default is just printing the list of requested programs but if it's required to monitor the apps and update upon changes, + the --monitor should be used. it prints the list of requested programs, and keeps montoring them, if there is any change it will be updated. + + by default jamlist only monitors or prints out locally running programs yet if it's required to monitor or list none local programs as well, --remote + flag should be used. + + by passing the --all flag jamlist is going to list all the running apps. if there is certain restriction needs to be applied the following filters can be used: + [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] + NOTE: all the abouve arguments can be used togeather but using --all will dissable them all and removes all the filters + + + ` + + ) + process.exit(1); + } + console.log(error) + throw error; + } + const filters = args.filters; + const monitor = args.monitor; + + const jamfolder = getJamFolder() + if(filters.remote || update){ + + + const map = getRemoteMachines(); + + for(let machines of map){ + + const [host,port] = machines.split("_"); + const config = { + host: host, + port: port, + username: 'admin', + password: 'admin' + }; + const client = await makeConnection(config); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let args= "" + for(let filter of Object.keys(filters)){ + if(filter === "remote"){ + continue + } + if(filter === "all" || filter === "help" ){ + if(filters.filter) + { + args = args + `--${filter} ` + + } + continue + + } + args = args + `--${filter}=${filters[filter]} ` + } + args =args.trim() + + + const script = `zx jamlist ${args} --root=${currIP}` + await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) + + } + } + + if(filters.root){ + + + if(filters.all){ + + await $`zx ${jamcleanPath}` + + + const info = getNodeInfo(filters.root); + + + + for(let row of info){ + + const jsonRow = JSON.stringify(row) + + await sleep(50) + } + } + else{ + + await $`zx ${jamcleanPath}` + const nodeinfo = getNodeInfo(filters.root) + + + let keysToRemove = ["root","remote","help","all" ]; + let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + + const filtered = filter(nodeinfo, filteredObj) + + if(filtered.length === 0 ){ + process.exit(0) + } + for(let row of filtered){ + const jsonRow = JSON.stringify(row) + console.log(`NODEINFO##${jsonRow}`) + await sleep(50) + } + } + } + else if(!update){ + + if(filters.all){ + await $`zx ${jamcleanPath}` + const info = getNodeInfo(); + if(info.length + NODESINFO.length === 0 ){ + + if(!monitor){ + process.exit(0) + } + } + printHeader(); + printNodeInfo(info); + printNodeInfo(NODESINFO) + } + + else{ + + await $`zx ${jamcleanPath}` + const nodeinfo = getNodeInfo() + let keysToRemove = ["root","remote","help","all" ]; + let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + const filtered = filter(nodeinfo, filteredObj) + if(filtered.length + NODESINFO.length === 0 ){ + console.log("there is No such program running") + if(!monitor){ + process.exit(0) + } + } + printHeader(); + printNodeInfo(filtered); + printNodeInfo(NODESINFO) + } + if(monitor){ + watch(filters); + } + } -printheader() { - printf "\n%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "ID" "NAME" "PROGRAM" "HOST" "PARENT" "D-STORE" "TYPE" "C-NODES" "TMUX-ID" } -app= - - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - - -appsfolder=$HOME"/.jamruns/apps" -if [ ! -d $appsfolder ]; then - echo "No running instances of JAMScript." - exit 0 -fi - -if [ "$(ls -A $appsfolder)" ]; then - - cd $appsfolder - - printheader - for jruns in */; do - if [ $jruns != "*/" ]; then - saveapplinfo $jruns - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ]; then - checkprocess $dir - if [ $running == "ps" ] || [ $running == "new" ]; then - printnodeinfo $jexs $dir - elif [ $running == "docker" ]; then - printdockerinfo $jexs $dir - fi - fi - done - fi - done -else - echo "No running instances of JAMScript." - exit 0 -fi \ No newline at end of file +(async () => { + await main() +})(); \ No newline at end of file diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs deleted file mode 100644 index 2b0acc1af..000000000 --- a/tools/jamlist.mjs +++ /dev/null @@ -1,506 +0,0 @@ -#!/usr/bin/env zx - -import { getJamListArgs } from "./parser.mjs"; -import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; -import { Client } from 'ssh2'; - -const { debounce } = require('lodash'); -const chokidar = require('chokidar'); -const jamFolder = getJamFolder() -let watcher; -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename); -const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); -let NODESINFO = [] -let currIP ; -if (os.platform() === 'win32') { -currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); -} else if (os.platform() === 'darwin') { -currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); -} else if (os.platform() === 'linux') { -currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); -} - - -export function getRunningDirs(){ - const jamFolder = getJamFolder() - const appToPort = new Map() - let activePorts - try{ - activePorts = fs.readdirSync(`${jamFolder}/ports`) - } - catch(error){ - return appToPort - } - for(let port of activePorts){ - let apps; - try{ - apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); - } - catch(error){ - continue - } - for(let app of apps){ - if(appToPort.has(app)){ - const portList = appToPort.get(app); - portList.push(port) - appToPort.set(app,portList) - } - else{ - appToPort.set(app,[port]) - } - } - } - return appToPort; -} -function getWatchList(filters){ - const watchList = [] - const appFolder = getAppFolder() - watchList.push(`${jamFolder}/ports`) - if(filters.remote){ - watchList.push(`${jamFolder}/remote`) - - } - const dirs = getRunningDirs() - for(let dir of dirs.keys()){ - for(let port of dirs.get(dir)){ - watchList.push(`${appFolder}/${dir}/${port}/numCnodes`) - watchList.push(`${appFolder}/${dir}/${port}/paused`) - } - } - return watchList - -} - - - -function watch(filters) { - setInterval(async () => { - await $`zx ${jamcleanPath}` - }, 1000); - function updateWatchList(watchList){ - - const newWatchList = getWatchList(filters); - for(let item of newWatchList){ - if(!watchList.includes(item)){ - watcher.add(item) - } - } - for(let item of watchList){ - if(!newWatchList.includes(item)){ - watcher.unwatch(item) - } - } - return newWatchList; - } - const updateInfo = debounce(async () => { - await sleep(500); - if (!filters || filters.all === true || Object.keys(filters).length === 0) { - const info = getNodeInfo(); - if(filters.remote){ - NODESINFO = [] - await main(true) - } - - - - if (info.length + NODESINFO.length === 0) { - console.log("---------"); - - console.log("There is no program running"); - } else { - console.log("---------"); - - printHeader(); - printNodeInfo(info); - if(filters.remote){ - printNodeInfo(NODESINFO); - } - } - } else { - const nodeinfo = getNodeInfo(); - let keysToRemove = ["root","remote","help","all" ]; - let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); - const filtered = filter(nodeinfo, filteredObj); - - if(filters.remote){ - NODESINFO = [] - await main(true) - } - - if (filtered.length + NODESINFO.length === 0) { - console.log("---------"); - - console.log("There is no such program running"); - } else { - console.log("---------"); - - printHeader(); - printNodeInfo(filtered); - if(filters.remote){ - printNodeInfo(NODESINFO); - } - - } - } - }, 500); - let watchList = getWatchList(filters) - watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', (event, path) => { - - watchList = updateWatchList(watchList) - updateInfo(); - }); -} - -export function dirNameToAppName(dirName){ - const dir = dirName.split('_') - if(dir.length > 2){ - return (dir.filter((_,index) => index !== 0)).join("_") - } - else{ - return dir[1]; - } - -} -export function dirNameToProgramName(dirName){ - return (dirName.split('_'))[0] - -} - -function getNodeInfo(root=null){ - const appToPortMap = getRunningDirs() - const jamfolder = getJamFolder() - const appfolder = getAppFolder(); - const nodeInfo =[] - if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ - return [] - } - - for(let app of appToPortMap.keys()){ - const appName = dirNameToAppName(app) - const programName = dirNameToProgramName(app) - for(let port of appToPortMap.get(app)){ - if(root){ - if(fs.existsSync(`${appfolder}/${app}/${port}/root`)){ - const rootIP = fs.readFileSync(`${appfolder}/${app}/${port}/root`).toString().trim(); - if(rootIP === root){ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-"} - const dirPath = `${appfolder}/${app}/${port}` - if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ - throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") - } - for(let fileName of Object.keys(fileNames)){ - if(fs.existsSync(`${dirPath}/${fileName}`)){ - const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); - fileNames[fileName] = data; - } - } - fileNames["portNum"] = String(port) - fileNames["appName"] = appName - fileNames["programName"] = programName - if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ - fileNames["status"] = "paused" - } - else{ - fileNames["status"] = "running" - - } - - fileNames["host"] = currIP - - - - nodeInfo.push(fileNames) - - } - } - } - else{ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" } - const dirPath = `${appfolder}/${app}/${port}` - if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ - throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") - } - for(let fileName of Object.keys(fileNames)){ - if(fs.existsSync(`${dirPath}/${fileName}`)){ - const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); - fileNames[fileName] = data; - } - } - fileNames["portNum"] = String(port) - fileNames["appName"] = appName - fileNames["programName"] = programName - if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ - fileNames["status"] = "paused" - } - else{ - fileNames["status"] = "running" - - } - fileNames["host"] = "localHost" - - - nodeInfo.push(fileNames) - } - - } - } - - return nodeInfo; -} - -function printNodeInfo(info){ - - for (let row of info){ - if(row["host"] === currIP){ - row["host"] = "localHost" - } - const headerString = ` ${row["appName"].padEnd(10)} ${row["programName"].padEnd(10)} ${("Local:"+row["portNum"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)}`; - console.log(headerString) - } -} - - -function printHeader(){ - const headerString = ` ${"NAME".padEnd(10)} ${"PROGRAM".padEnd(10)} ${"HOST".padEnd(10)} ${"PARENT".padEnd(10)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(10)} ${"C-NODES".padEnd(10)} ${"TMUX-ID".padEnd(10)} ${"STATUS".padEnd(10)} ${"HOST".padEnd(10)}`; - console.log(headerString) -} - -function filter(nodeinfo, filters){ - const filteredInfo =[]; - for(let info of nodeinfo){ - let isPassing = true - for(let filter of Object.keys(filters)){ - if(!(filters[filter] === info[filter])){ - isPassing = false - break; - } - } - if(isPassing){ - filteredInfo.push(info) - } - } - return filteredInfo; -} - -function getRemoteMachines(){ - const jamfolder = getJamFolder() - if(!fs.existsSync(`${jamfolder}/remote`)){ - return [] - } - return (fs.readdirSync(`${jamfolder}/remote`)) - -} - -async function makeConnection(config){ - return await new Promise((resolve, reject) => { - const client = new Client(); - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.connect(config); - }); -} - -async function executeScript(client, command){ - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ - if (err) console.log(error); - stream.on("close", () => { - resolve("closed") - }) - stream.on("data" , (data) =>{ - if(data.includes("NODEINFO##")){ - let JSONrow = data.toString().trim().split("##")[1] - let row; - try{ - row = JSON.parse(JSONrow) - } - catch(error){ - console.log(error) - } - - - - - NODESINFO.push(row) - } - }) - }) - })) -} - -async function main(update=null){ - NODESINFO = [] - - let args; - try{ - args = getJamListArgs(process.argv) - } - catch(error){ - console.log(error) - - if(error.type = "ShowUsage"){ - console.log( - - ` - - Usage: - jamlist --help: show this usage msg. - - jamlist has two made modes. the default is just printing the list of requested programs but if it's required to monitor the apps and update upon changes, - the --monitor should be used. it prints the list of requested programs, and keeps montoring them, if there is any change it will be updated. - - by default jamlist only monitors or prints out locally running programs yet if it's required to monitor or list none local programs as well, --remote - flag should be used. - - by passing the --all flag jamlist is going to list all the running apps. if there is certain restriction needs to be applied the following filters can be used: - [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] - NOTE: all the abouve arguments can be used togeather but using --all will dissable them all and removes all the filters - - - ` - - ) - process.exit(1); - } - console.log(error) - throw error; - } - const filters = args.filters; - const monitor = args.monitor; - - const jamfolder = getJamFolder() - if(filters.remote || update){ - - - const map = getRemoteMachines(); - - for(let machines of map){ - - const [host,port] = machines.split("_"); - const config = { - host: host, - port: port, - username: 'admin', - password: 'admin' - }; - const client = await makeConnection(config); - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let args= "" - for(let filter of Object.keys(filters)){ - if(filter === "remote"){ - continue - } - if(filter === "all" || filter === "help" ){ - if(filters.filter) - { - args = args + `--${filter} ` - - } - continue - - } - args = args + `--${filter}=${filters[filter]} ` - } - args =args.trim() - - - const script = `zx jamlist.mjs ${args} --root=${currIP}` - await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) - - } - } - - if(filters.root){ - - - if(filters.all){ - - await $`zx ${jamcleanPath}` - - - const info = getNodeInfo(filters.root); - - - - for(let row of info){ - - const jsonRow = JSON.stringify(row) - - await sleep(50) - } - } - else{ - - await $`zx ${jamcleanPath}` - const nodeinfo = getNodeInfo(filters.root) - - - let keysToRemove = ["root","remote","help","all" ]; - let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); - - const filtered = filter(nodeinfo, filteredObj) - - if(filtered.length === 0 ){ - process.exit(0) - } - for(let row of filtered){ - const jsonRow = JSON.stringify(row) - console.log(`NODEINFO##${jsonRow}`) - await sleep(50) - } - } - } - else if(!update){ - - if(filters.all){ - await $`zx ${jamcleanPath}` - const info = getNodeInfo(); - if(info.length + NODESINFO.length === 0 ){ - - if(!monitor){ - process.exit(0) - } - } - printHeader(); - printNodeInfo(info); - printNodeInfo(NODESINFO) - } - - else{ - - await $`zx ${jamcleanPath}` - const nodeinfo = getNodeInfo() - let keysToRemove = ["root","remote","help","all" ]; - let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); - - const filtered = filter(nodeinfo, filteredObj) - if(filtered.length + NODESINFO.length === 0 ){ - console.log("there is No such program running") - if(!monitor){ - process.exit(0) - } - } - printHeader(); - printNodeInfo(filtered); - printNodeInfo(NODESINFO) - } - if(monitor){ - watch(filters); - } - } - -} - -(async () => { - await main() -})(); \ No newline at end of file diff --git a/tools/jamlog b/tools/jamlog old mode 100755 new mode 100644 index 7039c69ae..f9dfec868 --- a/tools/jamlog +++ b/tools/jamlog @@ -1,125 +1,319 @@ -#!/bin/bash +#!/usr/bin/env node --input-type=module -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +import { getLogArgs } from "./parser.mjs"; +const readline = require('readline'); +import { Client } from 'ssh2'; -die() { - printf '%s\n' "$1" >&2 - exit 1 + + +function printlogArchived(path,tail){ + const appfolder = getAppFolder() + if(tail) { + const fileName = path.split("/").pop(); + + if (fileName.includes("j")) { + const string = (fs.readFileSync(`${path}`).toString().trim()) + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number J file \n---`) + console.log(lastNLines.join('\n')) + + } else { + return new Promise((resolve) =>{ + console.log(`\nLast ${tail} lines of C-NODES`); + const myLineC = readline.createInterface({ + input: fs.createReadStream(path), + }); + + const linesC = []; + let header; + let cNode = []; + myLineC.on('line', (line) => { + if (line.includes('worker number')) { + if (cNode.length !== 0) { + // linesC.push("---") + linesC.push(header) + linesC.push("---") + linesC.push(cNode.join("\n")); + + } + header = line + + + } + + cNode.push(line); + if (cNode.length > tail) { + cNode.shift(); + } + + }); + + myLineC.on('close', () => { + + // linesC.push("---") + linesC.push(header) + linesC.push("---") + linesC.push(cNode.join("\n")); + + + console.log(linesC.join('\n')); + resolve() + }); + }) + + } + + } + + else{ + const data = fs.readFileSync(path, 'utf8'); + console.log(data); + } +} + + +async function makeConnection(config){ + return await new Promise((resolve, reject) => { + const client = new Client(); + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); +} + +async function executeScript(client, command){ + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + if (err) console.log(error); + stream.on("close", () => { + resolve("closed") + }) + stream.on("data" , (data) =>{ + console.log(data.toString()) + }) + }) + })) } -show_usage() { - cat << EOF -Extracts the logs written by the C nodes and displays them in the terminal. +async function main(){ + let arg; + try{ + arg = getLogArgs(process.argv) + } + catch(error){ + if(error.type = "ShowUsage"){ + console.log( + + ` + [--help] is used to show usage + [--program= && --app= && --port= && --remote=] all used togeather to indicate what log we want to get (THESE ARE MANDATORY but IPAddress) + NOTE: --remote is optional. + [--c] is a flag used to only show the c file + [--j] is a flagused to only show the j file + [--tail=] shows the last n lines of the log + [--remote=] + ` + + ) + process.exit(1); + } + } + const flag = arg.flag; + const port =Number(arg.file.split("/")[ arg.file.split("/").length-1]); + const logFiles =arg.file.split("/")[0]+"/log"; + const tail = arg.tail + const appFolder = getAppFolder() + const jamfolder = getJamFolder() + const path = `${appFolder}/${logFiles}/${port}` + if(arg.remote){ + if(!fs.existsSync(`${jamfolder}/remote/localhost_${arg.remote}`)){ + console.log("there is no such remote machine available for this host") + } + + const config = { + host: "localhost", + port: arg.remote, + username: 'admin', + password: 'admin' + }; + const client = await makeConnection(config); + const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let args = ''; + //return {file : file , flag : flag, tail : options.tail, remote: options.remote} + for(let myArg of Object.keys(arg)){ + if(myArg === "file"){ + const file = arg[myArg]; + const port = file.split("/")[1]; + const app = (file.split("/")[0]).split("_")[1]; + const program = (file.split("/")[0]).split("_")[0]; + args = args + `--app=${app} --program=${program} --port=${port} ` + } + if(myArg === "flag"){ + if(arg.flag === "all"){ + args = args + `--j --c ` + } + else{ + args = args + `--${arg.flag} ` + } + + } + if(myArg === "tail"){ + args = args + `--tail=${arg.tail} ` + } + } + const finalArg = args.trim() + + const command = `${pathExport} && ${changeDir} && zx jamlog ${finalArg}` + + await makeConnection(config) + await executeScript(client, command) + process.exit(0) + + + } -Usage: jamlog [--program=pgm --app=app_name] [--msg] [--j] + if(fs.existsSync(`${appFolder}/${arg.file}`)){ + if(flag === "all"){ + if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ + console.log("we do not have the log file for j files") + } + const string = (fs.readFileSync(`${appFolder}/${arg.file}/log.j`).toString().trim()) + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number J file \n---`) + console.log(lastNLines.join('\n')) + } + else{ + -jamlog -Extracts the logs from the last program that was run or is running. + console.log(`---\nworker number J file \n---`) + console.log(string) + } -jamlog --program=stringlog --app=q5 -Extracts the logs from the execution of stringlog under the application ID q5 -if logs from such a run exists. + const cFiles = fs.readdirSync(`${appFolder}/${arg.file}`).filter((entry) => (entry.includes("log") && !entry.includes(".j"))); + if(cFiles.length === 0 ){ + console.log("we do not have the log files for c files") + } + else{ + for(let cFile of cFiles ){ + const string = fs.readFileSync(`${appFolder}/${arg.file}/${cFile}`).toString().trim() + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) -jamlog --msg -Puts a message line in the log file to indicate that the log was displayed -up to that point. + console.log(lastNLines.join('\n')) + } + else{ -jamlog --j -Extracts the logs created by the J node. + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + console.log(string) + } + } + } -EOF + } + else if(flag === "j"){ + + if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ + console.log("we do not have the log file for j files") + } + const string = (fs.readFileSync(`${appFolder}/${arg.file}/log.j`).toString().trim()) + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number J file \n---`) + console.log(lastNLines.join('\n')) + } + else{ + + + console.log(`---\nworker number J file \n---`) + console.log(string) + } + + } + else{ + const cFiles = fs.readdirSync(`${appFolder}/${arg.file}`).filter((entry) => (entry.includes("log") && !entry.includes(".j"))); + if(cFiles.length === 0 ){ + console.log("we do not have the log files for c files") + } + else{ + for(let cFile of cFiles ){ + const string = fs.readFileSync(`${appFolder}/${arg.file}/${cFile}`).toString().trim() + if(tail){ + const lines = string.split('\n'); + const lastNLines = lines.slice(-Number(tail)); + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + + console.log(lastNLines.join('\n')) + } + else{ + + console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) + console.log(string) + } + } + } + + } + } + else{ + if(port){ + if(!fs.existsSync(path)){ + console.log(`THERE IS NO LOG ON ${port} for ${logFiles.split("/")[0]}`) + } + + if(flag === "all"){ + if(!fs.existsSync(`${path}/log.j`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + + await printlogArchived(`${path}/log.j`,tail) + + } + if(!fs.existsSync(`${path}/log.c`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlogArchived(`${path}/log.c`,tail) + } + } + else if(flag === "j"){ + if(!fs.existsSync(`${path}/log.j`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlogArchived(`${path}/log.j`,tail) + } + } + else if(flag === "c"){ + if(!fs.existsSync(`${path}/log.c`)){ + console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) + } + else{ + await printlogArchived(`${path}/log.c`,tail) + } + } + } + } + + } -### -# Main script execution begins here... -# - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" - -appsfolder=$jamfolder/apps -exit_missingdir $appsfolder "No logs to show!" - -cd $appsfolder - -j= - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - - -p|--program) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - program=$2 - shift - else - die 'ERROR: "--program" requires a non-empty option argument.' - fi - ;; - --program=?*) - program=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --program=) # Handle the case of an empty - die 'ERROR: "--program" requires a non-empty option argument.' - ;; - -m|--msg) - msg=1 - ;; - -j|--j) - j=1 - ;; - - *) # Default case: No more options, so break out of the loop. - break - esac - shift -done - - -if [ -z $app ] && [ -z $program ]; then - # no args specified.. get it from previous runs - program=`cat $appsfolder/program` - app=`cat $appsfolder/app` -fi - -echo $appsfolder/$program"_"$app - -if [ -e $appsfolder/$program"_"$app/log ]; then - if [ -z $j ]; then - cat $appsfolder/$program"_"$app/log - - if [ ! -z $msg ]; then - echo >> $appsfolder/$program"_"$app/log - echo "========================= >> log displayed >> " `date` >> $appsfolder/$program"_"$app/log - echo >> $appsfolder/$program"_"$app/log - fi - else - cat $appsfolder/$program"_"$app/log.j - - if [ ! -z $msg ]; then - echo >> $appsfolder/$program"_"$app/log.j - echo "========================= >> log displayed >> " `date` >> $appsfolder/$program"_"$app/log.j - echo >> $appsfolder/$program"_"$app/log.j - fi - fi -fi +(async () =>{ + await main() + +})() \ No newline at end of file diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs deleted file mode 100644 index ae4e47847..000000000 --- a/tools/jamlog.mjs +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env zx -import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; -import { getLogArgs } from "./parser.mjs"; -const readline = require('readline'); -import { Client } from 'ssh2'; - - - -function printlogArchived(path,tail){ - const appfolder = getAppFolder() - if(tail) { - const fileName = path.split("/").pop(); - - if (fileName.includes("j")) { - const string = (fs.readFileSync(`${path}`).toString().trim()) - const lines = string.split('\n'); - const lastNLines = lines.slice(-Number(tail)); - console.log(`---\nworker number J file \n---`) - console.log(lastNLines.join('\n')) - - } else { - return new Promise((resolve) =>{ - console.log(`\nLast ${tail} lines of C-NODES`); - const myLineC = readline.createInterface({ - input: fs.createReadStream(path), - }); - - const linesC = []; - let header; - let cNode = []; - myLineC.on('line', (line) => { - if (line.includes('worker number')) { - if (cNode.length !== 0) { - // linesC.push("---") - linesC.push(header) - linesC.push("---") - linesC.push(cNode.join("\n")); - - } - header = line - - - } - - cNode.push(line); - if (cNode.length > tail) { - cNode.shift(); - } - - }); - - myLineC.on('close', () => { - - // linesC.push("---") - linesC.push(header) - linesC.push("---") - linesC.push(cNode.join("\n")); - - - console.log(linesC.join('\n')); - resolve() - }); - }) - - } - - } - - else{ - const data = fs.readFileSync(path, 'utf8'); - console.log(data); - } -} - - -async function makeConnection(config){ - return await new Promise((resolve, reject) => { - const client = new Client(); - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.connect(config); - }); -} - -async function executeScript(client, command){ - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ - if (err) console.log(error); - stream.on("close", () => { - resolve("closed") - }) - stream.on("data" , (data) =>{ - console.log(data.toString()) - }) - }) - })) -} - -async function main(){ - let arg; - try{ - arg = getLogArgs(process.argv) - } - catch(error){ - if(error.type = "ShowUsage"){ - console.log( - - ` - [--help] is used to show usage - [--program= && --app= && --port= && --remote=] all used togeather to indicate what log we want to get (THESE ARE MANDATORY but IPAddress) - NOTE: --remote is optional. - [--c] is a flag used to only show the c file - [--j] is a flagused to only show the j file - [--tail=] shows the last n lines of the log - [--remote=] - ` - - ) - process.exit(1); - } - } - const flag = arg.flag; - const port =Number(arg.file.split("/")[ arg.file.split("/").length-1]); - const logFiles =arg.file.split("/")[0]+"/log"; - const tail = arg.tail - const appFolder = getAppFolder() - const jamfolder = getJamFolder() - const path = `${appFolder}/${logFiles}/${port}` - if(arg.remote){ - if(!fs.existsSync(`${jamfolder}/remote/localhost_${arg.remote}`)){ - console.log("there is no such remote machine available for this host") - } - - const config = { - host: "localhost", - port: arg.remote, - username: 'admin', - password: 'admin' - }; - const client = await makeConnection(config); - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let args = ''; - //return {file : file , flag : flag, tail : options.tail, remote: options.remote} - for(let myArg of Object.keys(arg)){ - if(myArg === "file"){ - const file = arg[myArg]; - const port = file.split("/")[1]; - const app = (file.split("/")[0]).split("_")[1]; - const program = (file.split("/")[0]).split("_")[0]; - args = args + `--app=${app} --program=${program} --port=${port} ` - } - if(myArg === "flag"){ - if(arg.flag === "all"){ - args = args + `--j --c ` - } - else{ - args = args + `--${arg.flag} ` - } - - } - if(myArg === "tail"){ - args = args + `--tail=${arg.tail} ` - } - } - const finalArg = args.trim() - - const command = `${pathExport} && ${changeDir} && zx jamlog.mjs ${finalArg}` - - await makeConnection(config) - await executeScript(client, command) - process.exit(0) - - - } - - if(fs.existsSync(`${appFolder}/${arg.file}`)){ - if(flag === "all"){ - if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ - console.log("we do not have the log file for j files") - } - const string = (fs.readFileSync(`${appFolder}/${arg.file}/log.j`).toString().trim()) - if(tail){ - const lines = string.split('\n'); - const lastNLines = lines.slice(-Number(tail)); - console.log(`---\nworker number J file \n---`) - console.log(lastNLines.join('\n')) - } - else{ - - - console.log(`---\nworker number J file \n---`) - console.log(string) - } - - const cFiles = fs.readdirSync(`${appFolder}/${arg.file}`).filter((entry) => (entry.includes("log") && !entry.includes(".j"))); - if(cFiles.length === 0 ){ - console.log("we do not have the log files for c files") - } - else{ - for(let cFile of cFiles ){ - const string = fs.readFileSync(`${appFolder}/${arg.file}/${cFile}`).toString().trim() - if(tail){ - const lines = string.split('\n'); - const lastNLines = lines.slice(-Number(tail)); - console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) - - console.log(lastNLines.join('\n')) - } - else{ - - console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) - console.log(string) - } - } - } - - } - else if(flag === "j"){ - - if(!fs.existsSync(`${appFolder}/${arg.file}/log.j`)){ - console.log("we do not have the log file for j files") - } - const string = (fs.readFileSync(`${appFolder}/${arg.file}/log.j`).toString().trim()) - if(tail){ - const lines = string.split('\n'); - const lastNLines = lines.slice(-Number(tail)); - console.log(`---\nworker number J file \n---`) - console.log(lastNLines.join('\n')) - } - else{ - - - console.log(`---\nworker number J file \n---`) - console.log(string) - } - - } - else{ - const cFiles = fs.readdirSync(`${appFolder}/${arg.file}`).filter((entry) => (entry.includes("log") && !entry.includes(".j"))); - if(cFiles.length === 0 ){ - console.log("we do not have the log files for c files") - } - else{ - for(let cFile of cFiles ){ - const string = fs.readFileSync(`${appFolder}/${arg.file}/${cFile}`).toString().trim() - if(tail){ - const lines = string.split('\n'); - const lastNLines = lines.slice(-Number(tail)); - console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) - - console.log(lastNLines.join('\n')) - } - else{ - - console.log(`---\nworker number ${cFile.split(".")[1]} \n---`) - console.log(string) - } - } - } - - } - } - else{ - if(port){ - if(!fs.existsSync(path)){ - console.log(`THERE IS NO LOG ON ${port} for ${logFiles.split("/")[0]}`) - } - - if(flag === "all"){ - if(!fs.existsSync(`${path}/log.j`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) - } - else{ - - await printlogArchived(`${path}/log.j`,tail) - - } - if(!fs.existsSync(`${path}/log.c`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) - } - else{ - await printlogArchived(`${path}/log.c`,tail) - } - } - else if(flag === "j"){ - if(!fs.existsSync(`${path}/log.j`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) - } - else{ - await printlogArchived(`${path}/log.j`,tail) - } - } - else if(flag === "c"){ - if(!fs.existsSync(`${path}/log.c`)){ - console.log(`There is no log for C files on port ${port} for ${logFiles.split("/")[0]}`) - } - else{ - await printlogArchived(`${path}/log.c`,tail) - } - } - } - } - - -} - - -(async () =>{ - await main() - -})() \ No newline at end of file diff --git a/tools/jamrun b/tools/jamrun index 555f98f38..63394ffc2 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -1,750 +1,839 @@ -#!/bin/bash -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" -REDISFUNCS=`realpath "$IDIR/../deps/lua/jredlib.lua"` - -SHELLPID=$$ -trap cleanup SIGTERM SIGINT SIGKILL - -die() { - printf '%s\n' "$1" >&2 - exit 1 +#!/usr/bin/env node --input-type=module +import {jamrunParsArg , getCargs, getJargs, getRemoteArgs} from './parser.mjs' +import { fileURLToPath } from 'url'; +import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; +import { dirname, resolve } from 'path'; +import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' +const { spawn,spawnSync } = require('child_process'); +import { Client } from 'ssh2'; + + +let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote, root; +const tmuxIds = []; +let removablePort + +process.on('SIGINT', () => { + if(removablePort){ + let toPause; + try{ + toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() + } + catch(error){ + toPause = "false" + } + + if(toPause !== "false"){ + const fileNoext = getFileNoext(file); + pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) + process.exit(); + + } + else{ + const fileNoext = getFileNoext(file); + cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); + process.exit(); + } + } + else{ + process.exit(); + } +}); +process.on('SIGTERM', () => { + if(removablePort){ + let toPause; + try{ + toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() + } + catch(error){ + toPause = "false" + } + + if(toPause !== "false"){ + const fileNoext = getFileNoext(file); + pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) + process.exit(); + + } + else{ + const fileNoext = getFileNoext(file); + cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); + process.exit(); + } + } + else{ + process.exit(); + } + + +}); + + +const filePath = fileURLToPath(import.meta.url); +const IDIR = path.dirname(filePath); +const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); +const SHELLPID = process.pid; + + +const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( + ["mosquitto","mosquitto_pub", "tmux"].map( + async (entry)=> { + try{ + const p = await $`which ${entry}`; + return p.stdout.trim(); + } + catch(error){ + switch(entry){ + case "tmux": + throw new Error("tmux not installed. Quitting.") + case "mosquitto_pub": + throw new Error("mosquitto_pub (MQTT tools) not installed. Quitting.") + case "mosquitto": + throw new Error("mosquitto (MQTT broker) not installed. Quitting.") + } + } + } + ) +) + + +async function executeScript(client, command){ + + return (await new Promise((resolve, reject) =>{ + client.exec(command, (err,stream) =>{ + if (err){ + reject(err); + } + let result; + stream.on("close", () => { + resolve(result) + }) + stream.on("data" , async (data) =>{ + if(data.includes("MY PORT IS:")) + { + console.log(data.toString()) + result = data.toString().trim().split(":")[1] + } + if(data.includes("EXIT BG")){ + resolve(result) + } + }) + }) + })) } +//tested.working +function show_usage(){ + const usageMessage = + ` + jamrun program.jxe + Runs J and C node, one each, of a device with program.jxe + under a app name X, use the --app=X option. It is mandatory to set the app name. + + jamrun program.jxe --fog + Runs a fog node (only J node) with program.jxe. Similarly, the --cloud + flag runs a cloud node. + + By default, jamrun uses a Redis server running at 127.0.0.1:(20000+porttaken) as the + data store. To use a different Redis server use the --data option. + + jamrun program.jxe --data=127.0.0.1:7000 + Runs program.jxe and connects it to an already running Redis server at + port 7000 of the local host. Redis server can run outside the + local host (Redis needs to the configured to accept outside + connections). + + To start more than one C node at a device use the following command. + jamrun program.jxe --num=4. + + To provide a set of tags to the program, use the following command. + jamrun program.jxe --tag="param1, param2" + + Use the --bg option to run a command in the background. the --bg is mandatory for the cases + that program is running on a remote machine. + + Use the --old option to run the previous version in .jamruns folder. + You can edit that version and rerun a custom version of a file. + + Use the --log option to turn on logging. This is useful for programs where + the C side is crashing at the startup. The tmux console would not run when + the program crash at startup. So the --log option allows us to see the + program error messages. + + Use the --verb option to turn on verbose messaging. + + Use --valgrind to run the cside with valgrind for leak checking. + + Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. + + Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags. + the program can be resumed only if it was pased before. + --resume tag have to be used with --port tag to specify exactly which program shoukd be resumed. + + to start the c nodes and j files on a remote machine the --remote is used. + the value assinge to --remote is IP addrress of the remote machine to make the connection. + + by default the location assigned to a program has random long and lat values. to set a specific + location for the progam the --loc is used. + value passsed to the loc contains long and lat with a ',' seperator between them. + + + Usage: jamrun file.jxe + [--app=appl_name] + [--fog|--cloud|--device] + [--num=num_c_devs] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--bg] + [--old] + [--log] + [--verb] + [--loc=long,lat] + [--edge=num_edge_connections] + [--valgrind] + [--local] + [--resume && port=] + [--remote=] + + -# Determine the platform we are running on -unameOut="$(uname -s)" -case "${unameOut}" in - Linux*) machine=Linux;; - Darwin*) machine=Mac;; - *) machine="UNKNOWN:${unameOut}" -esac - -VALGRIND_OPTS='valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s' - -MOSQUITTO=`which mosquitto` -MOSQUITTO_PUB=`which mosquitto_pub` -TMUX=`which tmux` -NOVERBOSE=1 - -if [ -z $MOSQUITTO ]; then - die "mosquitto (MQTT broker) not installed. Quitting." -fi -if [ -z $MOSQUITTO_PUB ]; then - die "mosquitto_pub (MQTT tools) not installed. Quitting." -fi -if [ -z $TMUX ]; then - die "tmux not installed. Quitting." -fi - - -show_usage() { - cat << EOF -jamrun program.jxe -Runs J and C node, one each, of a device with program.jxe -under a default application name 'app-N'. To run under a different -app name X, use the --app=X option. - -jamrun program.jxe --fog -Runs a fog node (only J node) with program.jxe. Similarly, the --cloud -flag runs a cloud node. - -By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the -data store. The Redis server needs to be started before launching the -application. To use a different Redis server use the --data option. - -jamrun program.jxe --data=127.0.0.1:7000 -Runs program.jxe and connects it to an already running Redis server at -port 7000 of the local host. Redis server can run outside the -local host (Redis needs to the configured to accept outside -connections). - -To start more than one C node at a device use the following command. -jamrun program.jxe --num=4 - -To provide a set of tags to the program, use the following command. -jamrun program.jxe --tag="param1, param2" - -Use the --bg option to run a command in the backgroud. - -Use the --old option to run the previous version in .jamruns folder. -You can edit that version and rerun a custom version of a file. - -Use the --log option to turn on logging. This is useful for programs where -the C side is crashing at the startup. The tmux console would not run when -the program crash at startup. So the --log option allows us to see the -program error messages. - -Use the --verb option to turn on verbose messaging. - -Use --valgrind to run the cside with valgrind for leak checking. - -Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. - -Usage: jamrun file.jxe - [--app=appl_name] - [--fog|--cloud] - [--num=num_c_devs] - [--data=data-url] - [--tags=quoted_list_of_tags] - [--bg] - [--old] - [--iflow=flow_name] - [--oflow=flow_name] - [--log] - [--verb] - [--loc=long,lat] - [--edge=num_edge_connections] - [--valgrind] - [--local] - - -The jamrun command creates a run state in the $HOME/.jamruns folder. -EOF + + The jamrun command creates a run state in the $HOME/.jamruns folder. + `; + console.log(usageMessage) + } - -startmqtt() { - local port=$1 - local cfile=$2 - - # Check whether the MQTT server is running.. if not start it - $MOSQUITTO_PUB -p $port -t "test" -m "hello" 2> /dev/null - - if [ $? -ne 0 ]; then - if [ -z $NOVERBOSE ]; then - echo "MQTT is not running at $port" - echo "Attempting to start MQTT at $port" - fi - if [ $machine = Mac ]; then - open -n -a $MOSQUITTO --stdout /dev/null --args -c $cfile - #$MOSQUITTO -c $cfile &>/dev/null & MOSQUITTO_PID=$! - #MOSQUITTO_PID=$! # Currently Broken - elif [ $machine = Linux ]; then - nohup $MOSQUITTO -c $cfile &>/dev/null & MOSQUITTO_PID=$! - fi - fi +//teste.working. +async function startmqtt(port, cFile){ + const jamfolder = getJamFolder() + try{ + await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); + + } + catch(error){ + + if(!NOVERBOSE){ + console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); + } + const command = MOSQUITTO; + const args = ['-c', cFile]; + const options = { + stdio: ['ignore', 'ignore', 'ignore'], + detached: true, + }; + const mqttProcesse = spawn(command, args, options); + console.log(mqttProcesse.pid) + fs.writeFileSync(`${jamfolder}/mqttpid/${port}`,`${mqttProcesse.pid}` ) + mqttProcesse.unref(); + + return; + } } - -dojamout() { - dojamout_p1 $1 $2 $3 - dojamout_p2 $1 $2 $3 +async function dojamout(iport, folder,jappid) { + await dojamout_p1 (iport ,folder) + await dojamout_p2 (iport ,folder, jappid) + } - -dojamout_p1() { - local type=$1 - local pnum=$2 - local floc=$3 - - startmqtt $pnum "${floc}/${pnum}/mqtt.conf" - echo "$data" > $floc/$pnum/dataStore - echo "process" > $floc/$pnum/class - echo "$SHELLPID" > $floc/$pnum/shellpid - echo "new" > $floc/$pnum/processId +//tested.working +async function dojamout_p1(pnum ,floc) { + await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) + if(data){ + fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); + } + fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); + fs.writeFileSync(`${floc}/${pnum}/paused`, "false\n"); + fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); + fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); + if(Type === "device"){ + fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); + } + if(root){ + fs.writeFileSync(`${floc}/${pnum}/root`, root) + } } -dojamout_p2() { - - if [ -z $bg ]; then - dojamout_p2_fg $1 $2 $3 $4 +async function dojamout_p2(iport, folder, jappid, group=null){ + if(!bg){ + await dojamout_p2_fg(iport, folder,jappid, group) + } else - dojamout_p2_bg $1 $2 $3 $4 - fi + { + dojamout_p2_bg(iport, folder,jappid, group) + } } -cleanup() { - if [ $killbroker == "1" ]; then - echo Killing broker with PID: $MOSQUITTO_PID - kill -9 $MOSQUITTO_PID - fi - #echo ${AOUT_PIDS[@]} - #kill -9 ${AOUT_PIDS[@]} - - #reset - cleanuptmux - exit 1 -} +//tested, working +async function dojamout_p2_fg(pnum, floc,jappid, group=null){ + let argObject = { + "--app":jappid, + "--port":pnum, + "--group":group, + "--data":data, + "--tags":tags, + "--edge":edge, + "--long":long, + "--lat":lat, + "--localregistryhost":local_registry, + "--type": Type + } + + let jargs = getJargs(argObject) + const command = 'node'; + const args = ['jstart.js', ...jargs]; + + if(resume){ + console.log("############## RESUME ##############") + } + if(log){ + const options = { + cwd: floc, + stdio: ['pipe', 'pipe', 'pipe'] + }; + const stream = fs.createWriteStream(`${floc}/${pnum}/log.j`, { flags: 'a' }); + const child = spawn(command, args, options); + child.stdout.on('data', (data) => { + process.stdout.write(data); + stream.write(data); + }); + + child.stderr.on('data', (data) => { + process.stderr.write(data); + stream.write(data); + }); + + child.on('exit', () => { + process.kill(process.pid, 'SIGTERM'); + }); + + }else{ + const options = { + cwd: floc, + stdio: 'inherit' + }; + const child = spawn(command, args, options); + child.on('exit', () => { + console.log("sending sig term") + process.kill(process.pid, 'SIGTERM'); + }); + } -dojamout_p2_fg() { - local type=$1 - local pnum=$2 - local floc=$3 - local group=$4 - - buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" "--localregistryhost=$localregistryhost" - local args=$results - echo $args - case $type in - cloud) - node jstart.js $args - ;; - fog) - node jstart.js $args - ;; - device) - node jstart.js $args - ;; - esac - - cleanup } -dojamout_p2_bg() { - local type=$1 - local pnum=$2 - local floc=$3 - local group=$4 - - buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" - local args=$results - - if [ `uname` == "Linux" ]; then - script -a -c "node jstart.js $args" -f log.j > /dev/null & - else - script -a -t 1 log.j node jstart.js $args > /dev/null & - fi - - if [ -z $NOVERBOSE ]; then - echo ">>> Started the J node in background" - fi +function dojamout_p2_bg(pnum, floc, jappid, group=null){ + let argObject = { + "--app":jappid, + "--port":pnum, + "--group":group, + "--data":data, + "--tags":tags, + "--edge":edge, + "--long":long, + "--lat":lat, + "--localregistryhost":local_registry, + "--type": Type + } + let jargs = getJargs(argObject) + + const logFile = fs.openSync(`${floc}/${pnum}/log.j`, 'a'); + if(resume){ + fs.writeFileSync(`${floc}/${pnum}/log.j`,"############## RESUME ##############") + } + + const command = 'node'; + const args = ['jstart.js', ...jargs]; + const options = { + cwd: floc, + stdio: ['ignore', logFile, logFile], + detached: true, + }; + + const p = spawn(command, args, options); + p.unref(); + + if(!NOVERBOSE){ + console.log("Started the J node in background") + } + //keep this log file + console.log("EXIT BG") + process.exit(0) } - -doaout() { - local counter=1 - local num=$1 - local port=$2 - local group=$3 - local datap=$4 - - if [ -e a.out ]; then - chmod +x a.out - fi - - while [ $counter -le $num ]; do - if [ -e a.out ]; then - # execute the program.. we are in the folder.. - buildcargs "-a=$jappid" "-p=$port" "-n=$counter" "-g=$group" "-t=$tags" "-o=$datap" - local cargs=$results - - if [ -z $DISABLE_STDOUT_REDIRECT ]; then - if [ -z $log ]; then - $TMUX new-session -s $tmuxapp-$counter -d "$VALGRIND ./a.out $cargs" - else - if [ `uname` == "Linux" ]; then - $TMUX new-session -s $tmuxapp-$counter -d script -a -c "$VALGRIND ./a.out $cargs" -f log +async function doaout(num,port,group,datap,myf,jappid){ + let counter=1 + if (fs.existsSync('a.out')) { + await $`cd ${myf} && chmod +x a.out` + } + while(counter <= num){ + + if(fs.existsSync('a.out')){ + + const argObject = + { + "-a": jappid.toString(), + "-p": port, + "-n": counter, + "-g": group, + "-t": tags, + "-o": datap, + } + let cargs = getCargs(argObject) + console.log("this is my cargs",cargs ) + await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; + if (!log){ + + if(valgrind) + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; + else - $TMUX new-session -s $tmuxapp-$counter -d "script -a -t 1 log ./a.out $cargs" - fi - fi - else - # As simple as can be - ./a.out $cargs & - echo This worked correctly - fi - fi - ((counter++)) - if [ -z $NOVERBOSE ]; then - echo ">>> Started a C node" - fi - done -} - -# This is always scanning for a command with 'node' -portavailable() { - local folder=$1 - local port=$2 - - if [ -d $folder/$port ]; then - if [ -e $folder/$port/processId ]; then - local pid=`cat $folder/$port/processId` - if [ $pid == "new" ]; then - porttaken=1 - elif [ ! -z $pid ]; then - porttaken=`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` - else - porttaken=0 - fi - else - porttaken=0 - fi - else - porttaken=0 - fi + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; + + } - if [ $porttaken -eq 0 ]; then - porttaken=`netstat -an -p tcp 2>/dev/null | grep $port | wc -l` - fi + else{ + if(valgrind) + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; + else + //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) + await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; + } + } + tmuxIds.push(`${tmux}-${counter}`) + counter++; + } + if(!NOVERBOSE) + console.log("Started a C node") + } + + +async function portavailable(folder,port) { + let porttaken; + const jamFolder = getJamFolder() + if(fs.existsSync(`${folder}/${port}`)){ + porttaken=1 + } + else{ + porttaken=0; + } + + if(porttaken === 0){ + if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ + const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() + porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; + + } + else{ + const runningApps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split(); + const fileNoExt = getFileNoext(file) + if(runningApps.includes(`${fileNoExt}_${app}`)){ + porttaken = 1; + } + else{ + porttaken = 0; + } + } + } + return porttaken; } -setuptmux() { - - if [ -z $tmuxid ]; then - tmuxapp="tg-$RANDOM" - else - tmuxapp=$tmuxid - fi - - echo "$tmuxapp" > $1/tmuxid - save "$tmuxapp" $appfolder/tmuxid +function setuptmux(path, appfolder) { + fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); + fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); - trap cleanuptmux SIGINT } -getappid() { - local mainf=$1 - local localf=$2 - local appid=$3 - - if [ $appid == "app-n" ]; then - inc_counter $mainf/counter - save "app-$result" $localf/appid - else - save "$appid" $localf/appid - fi - - jappid=`cat $localf/appid` - # save for short cut use - save "$jappid" $appfolder/appid -} -killtmux() { - for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do - echo $q - tmux kill-session -t $q - done +async function startredis(port) { + try{ + const p = $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); + console.log(p) + } + catch(error){ + console.log(error) + } } -cleanuptmux() { - #if [ ! -z $tmuxapp ]; then - #killtmux $tmuxapp - #fi - exit +async function waitforredis(port){ + while (true) { + try{ + const p = await $`redis-cli -p ${port} -c PING`.quiet() + if (p.stdout.trim() === "PONG") { + break; + } + } + catch(error){ + console.log(error) + } + if (!NOVERBOSE) { + console.log("Trying to find Redis server..."); + } + await sleep(1000) + } + + if (!NOVERBOSE) { + console.log(`Redis running at port: ${port}`); + } + } -startredis() { - local port=$1 - redis-server --port $port - 1> /dev/null & -} -waitforredis() { - local port=$1 - - while : ; do - local resp=`redis-cli -p $port -c PING 2>/dev/null` - if [[ $resp == "PONG" ]]; then - break - fi - if [ -z $NOVERBOSE ]; then - echo Trying to find redis server... - fi - sleep 1 - done - if [ -z $NOVERBOSE ]; then - echo ">>> Redis running at port: $port" - fi -} +async function setupredis(port) { -setupredis() { - local port=$1 + await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` + await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` + await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` + //IMPORTANT: flushing redis + //USE FLUSH DB TO ONLY FLUSH THE CURRENT DB FOR THE APP + //DB NUMBER + //FOR NOW KEEP AS IT IS + if(!resume){ + await $`redis-cli -p ${port} FLUSHALL`; + } - cat $REDISFUNCS | redis-cli -p $port -x FUNCTION LOAD REPLACE > /dev/null - echo "set protected-mode no" | redis-cli -p $port > /dev/null - echo 'config set save ""protected-mode no' | redis-cli -p $port > /dev/null } +async function resolvedata(Name) { + const [host, port] = Name.split(':'); -resolvedata() { - local name=$1 + await startredis(Number(port)); + await waitforredis(port); + await setupredis(port); + data = Name.split(/\s+/).join(''); - local host="${name%:*}" - local port="${name##*:}" - startredis $port - waitforredis $port - setupredis $port - - if [ $host == "docker" ]; then - local ipaddr=`hostname -I` - name=$ipaddr:$port - fi - # trim space left behind by hostname -I - data=$(echo $name | tr -d '[:space:]') } - -# We are already in the correct foldler -# We should find MANIFEST if there is a previous version in the current folder -# We unzip to the current folder if needed. -unpack() { - local file=$1 - - if [ -z $old ]; then - if [ ! -e MANIFEST.txt ]; then - # there is no old file. unpack - unzip -oq $file - if [ $? -ne 0 ]; then - die "Problem reading file: $file" - fi - else - # get new time - by just peaking into the ZIP file - ntime=`zipgrep CREATE $file | awk 'NR==1{split($0,a, " "); print a[3]}'` - # get the old one by reading the previous MANIFEST.txt - otime=`grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` - if (( $ntime > $otime )); then - # newer file so unpack it - unzip -oq $file - if [ $? -ne 0 ]; then - die "Problem reading file: $file" - fi - fi - fi - fi +async function unpack(file,folder){ + if(!old){ + if(!fs.existsSync("./MANIFEST.txt")){ + try{ + await $`cd ${folder} && unzip -o ${file}`.quiet() + } + catch(error){ + throw new Error(`Problem reading file: ${file}\n${error}`) + } + + } + else{ + let forceRedo = false; + try{ + isValidExecutable() + } + catch(error){ + forceRedo = true; + } + if(!forceRedo){ + const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; + const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; + const ntime = Number(p1.stdout.toString().trim()); + const ontime = Number(p2.stdout.toString().trim()); + if(ntime > ontime){ + try{ + console.log("outdated, unzippping again") + await $`cd ${folder} && unzip -oq ${file}`.quiet() + } + catch(error){ + + throw new Error(`Problem reading file: ${file}\n${error}`) + + } + } + } + else{ + if(!NOVERBOSE) + console.log("The corrupted unziped files. files will be unziped again based on the existing MANIFEST.txt") + await cleanExecutables() + await $`cd ${folder} && unzip -oq ${file}`.quiet() + } + } + } + else{ + if(!NOVERBOSE){ + console.log("WARNING: Unziped files might be outdated") + } + isValidExecutable() + } } -getheight() { - height=`grep MAX-HEIGHT MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` +async function getjdata(folder) { + const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() + return p.stdout.trim() } -getjdata() { - jdata=`grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` +async function runNoneDevice(iport){ + const [jamfolder,appfolder,folder] = getPaths(file,app) + fileDirectoryMqtt(folder,iport,jamfolder,app) + const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) + await dojamout(iport, folder, jappid) } -# set the global longitude and lattitude variables -# -getlonglat() { - local loc=$1 - - long="${loc%,*}" - lat="${loc##*,}" +async function runDevice(iport,dport,group){ + const [jamfolder,appfolder,folder] = getPaths(file,app) + fileDirectoryMqtt(folder,iport,jamfolder,app) + const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) + await dojamout_p1(iport,folder) + setuptmux(`${folder}/${iport}`, appfolder) + await doaout(num,iport, group, dport,folder,jappid) + await dojamout_p2(iport, folder,jappid,group ) } -# for now, just roam the north-eastern part... -generatelonglat() { - a=$(( $RANDOM % 180 )) - b=$(( $RANDOM % 10000 )) - long=$a.$b - c=$(( $RANDOM % 90 )) - d=$(( $RANDOM % 10000 )) - lat=$c.$d -} -### -# Main script execution begins here... -# - -# Initialize all the option variables. -app=app-n -type=device -data=127.0.0.1:6379 -num=1 -tags= -bg= -old= -local= -porttaken=0 -tmuxid= -log= -edge=1 -localregistryhost=0 -killbroker=0 - -# generate the random longitude and lattitude values -# use the --loc option to override these values -generatelonglat - -file=$1 -shift -fext="${file##*.}" - -if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then - show_usage - exit 1 -fi - -if [ "$fext" != "jxe" ]; then - die "Extension on $file is not .jxe" -fi - - -while :; do - case $1 in - --help) - show_usage # Display a usage synopsis. - exit - ;; - --app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--args" requires a non-empty option argument.' - ;; - - --tags) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tags=$2 - shift - else - die 'ERROR: "--tags" requires a non-empty option argument.' - fi - ;; - --tags=?*) - tags=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tags=) # Handle the case of an empty - die 'ERROR: "--tags" requires a non-empty option argument.' - ;; - --tmux) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tmuxid=$2 - shift - else - die 'ERROR: "--tmux" requires a non-empty option argument.' - fi - ;; - --tmux=?*) - tmuxid=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tmux=) # Handle the case of an empty - die 'ERROR: "--tmux" requires a non-empty option argument.' - ;; - --num) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - num=$2 - shift - else - die 'ERROR: "--num" requires a non-empty option argument.' - fi - ;; - --num=?*) - num=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --num=) # Handle the case of an empty - die 'ERROR: "--num" requires a non-empty option argument.' - ;; - --loc) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - getlonglat $2 - shift - else - die 'ERROR: "--loc" requires longitude and lattitude specification' - fi - ;; - --loc=?*) - loc=${1#*=} # Delete everything up to "=" and assign the remainder. - getlonglat $loc - ;; - --loc=) # Handle the case of an empty - die 'ERROR: "--loc" requires longitude and lattitude specification' - ;; - --edge) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - edge=$2 - shift - else - die 'ERROR: "--edge" requires a non-empty option argument.' - fi - ;; - --edge=?*) - edge=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --edge=) # Handle the case of an empty - die 'ERROR: "--edge" requires a non-empty option argument.' - ;; - --data) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - data=$2 - shift - else - die 'ERROR: "--data" requires a non-empty option argument.' - fi - ;; - --data=?*) - data=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --data=) # Handle the case of an empty - die 'ERROR: "--data" requires a non-empty option argument.' - ;; - --fog) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="fog" - num= - fi - ;; - --cloud) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="cloud" - num= - fi - ;; - --device) - ;; - --local_registry) - localregistryhost=1 - ;; - --temp_broker) - killbroker=1 - ;; - --bg) - bg=1 - ;; - --verb) - NOVERBOSE= - ;; - --log) - log=1 - ;; - --old) - old=1 - ;; - --local) - local=1 - ;; - --valgrind) - VALGRIND="$VALGRIND_OPTS" - ;; - --disable-stdout-redirect) - DISABLE_STDOUT_REDIRECT=1 - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -# Check necessary parameters and set defaults - -if [ "$type" != "device" ]; then - edge= - if [ -n "$num" ]; then - die "number of devices can't be speciied for fog/cloud" - fi - if [ -n "$edge" ]; then - die "number of edge connections can't be specified for fog/cloud" - fi -fi - - -if [ -e "$file" ]; then - - # Check whether the global .jamruns folder is there - jamfolder=$HOME"/.jamruns" - create_missingdir $jamfolder - - # Check whether the app folder is there - appfolder=$jamfolder/apps - create_missingdir $appfolder - - # Get the folder - filenoext="${file%.*}" - filenoext="${filenoext##*/}" - folder=$appfolder/$filenoext"_"$app - create_missingdir $folder - - #save handle to file - ifile="$(cd "$(dirname "$file")"; pwd)/$(basename "$file")" - cd $folder - unpack $ifile # We are already in $folder - # find the machine height - getheight - getjdata - - if [ -e jstart.js ]; then - # save the current program information for short cut use - save "$filenoext" $appfolder/program - save "$app" $appfolder/app - - # execute the program.. we are in the folder.. - case $type in - cloud) +async function main(){ + let iport; + let dport; + let group; + try{ + ({ + app, + tmux, + num, + edge, + data, + local_registry, + bg, + NOVERBOSE, + resume, + log, + old, + local, + valgrind, + long, + lat, + Type, + tags, + port, + file, + remote, + root, + } = jamrunParsArg(process.argv)) + } + + + catch(error){ + console.log('got here') + show_usage() + throw(error) + } + let folder; + let ifile; + let jdata; + let client; + if(remote){ + const config = { + host: 'localhost', + port: remote, + username: 'admin', + password: 'admin' + }; + if(resume){ + const jamfolder = getJamFolder() + const fileNoext = getFileNoext(file); + if(!fs.existsSync(`${jamfolder}/remote`)) + throw new Error("this machine is not the root for any running app") + + + if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`)) + throw new Error(`this machine is not the root for any running app on ${config.host}_${config.port}`); + + + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`).toString().trim().split("\n") + if(!remoteApps.includes(`${fileNoext}_${app}`)) + throw new Error(`this machine is not the root for any running ${fileNoext}_${app}`); + + } + client = await new Promise((resolve, reject) => { + const client = new Client(); + + client.on('ready', () => { + resolve(client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.connect(config); + }); + const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) + // const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" + const changeDir= "cd JAMScript/tools" + let currIP ; + if (os.platform() === 'win32') { + currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'darwin') { + currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); + } else if (os.platform() === 'linux') { + currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); + } + const myPort = await executeScript(client, `${changeDir} && zx jamrun ${remoteArgs} --root=${currIP}`) + + if(!resume){ + const jamfolder = getJamFolder() + const fileNoext = getFileNoext(file); + if(!fs.existsSync(`${jamfolder}/remote`)){ + fs.mkdirSync(`${jamfolder}/remote`); + } + if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ + fs.mkdirSync(`${jamfolder}/remote/${config.host}_${config.port}`); + + } + if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`)){ + const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`).toString().trim().split("\n") + if(!remoteApps.includes(`${fileNoext}_${app}`)){ + fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`); + } + } + else{ + fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`) + } + } + process.exit(0) + + } + + + if(resume){ + const fileNoExt = getFileNoext(file) + if(!port) + throw new Error("can't resume the app without port number") + + folder = getFolder(file,app); + if(!fs.existsSync(folder)){ + throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app}` ) + + } + if(!fs.existsSync(`${folder}/${port}`) || !fs.existsSync(`${folder}/${port}/paused`)){ + throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) + } + else{ + const isPaused = (fs.readFileSync(`${folder}/${port}/paused`).toString().trim()) === "false" ? false : true; + if(!isPaused){ + throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) + } + + } + if(num, data, Type){ + console.log("WARNING: IN CASE OF RESUMING, WILL NOT USE ANY OF NUM, DATA, TYPE ARGUMENTS.") + } + try{ + Type = fs.readFileSync(`${folder}/${port}/machType`).toString().trim(); + } + catch(error){ + throw new Error('type missing, corrupted program, it should be killed') + } + process.chdir(folder); + isValidExecutable(); + jdata = await getjdata(folder); + } + else{ + if(port){ + console.log("Warning. If it's not to resume the port argument will not be used") + } + + fileDirectorySetUp(file,app) + folder = getFolder(file,app) + ifile = path.resolve(file); + process.chdir(folder); + await unpack(ifile, folder) + isValidExecutable() + jdata = await getjdata(folder); + } + + let isDevice; + switch(Type){ + case "cloud": + if(resume){ + iport = port; + removablePort = port; + isDevice = false; + } + else{ iport=9883 - while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) - done - if [ "$jdata" = true ]; then - dport=$((iport + 20000)) - resolvedata "127.0.0.1:$dport" - fi - create_missingdir $folder/$iport - create_conffile "${folder}/${iport}/mqtt.conf" $iport - getappid $jamfolder $folder/$iport $app - dojamout $type $iport $folder - ;; - fog) + isDevice = false; + + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; + } + removablePort = iport; + } + break; + + case "fog": + if(resume){ + iport = port; + removablePort = port; + isDevice = false; + } + else{ iport=5883 - while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) - done - if [ "$jdata" = true ]; then - dport=$((iport + 20000)) - resolvedata "127.0.0.1:$dport" - fi - create_missingdir $folder/$iport - create_conffile "${folder}/${iport}/mqtt.conf" $iport - getappid $jamfolder $folder/$iport $app - dojamout $type $iport $folder - ;; - device) - iport=1883 - while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) - done - if [ -z $local ]; then - group="$((iport-1882))" - else - group=0 - fi - if [ "$jdata" = true ]; then - dport=$((iport + 20000)) - resolvedata "127.0.0.1:$dport" - fi - create_missingdir $folder/$iport - create_conffile "${folder}/${iport}/mqtt.conf" $iport - getappid $jamfolder $folder/$iport $app - dojamout_p1 $type $iport $folder - setuptmux $folder/$iport - doaout $num $iport $group $dport - dojamout_p2 $type $iport $folder $group - if [ -z $bg ]; then - cleanuptmux - fi - ;; - esac + isDevice = false + while(true){ + + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; + } + removablePort = iport; + } + + break; + + case "device": + if(resume){ + iport = port; + removablePort = port; + isDevice = true; + } + else{ + iport=1883; + isDevice = true; + while(true){ + const porttaken = Number(await portavailable(folder ,iport)) + if(porttaken !== 1){ + break; + } + iport++; + } + removablePort = iport; + } + if(!local){ + group= iport-1882 + } + else + group = 0; + } + + + if(jdata.toLowerCase() === "true"){ + dport=iport + 20000; + await resolvedata(`127.0.0.1:${dport}`) + + } + + if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ + fs.mkdirSync(`${folder}/${iport}`) + } + console.log(`MY PORT IS:${removablePort}`) + if(isDevice) + await runDevice(iport,dport,group) + else - die "File: $file is not a valid JAMScript executable" - fi + await runNoneDevice(iport) + } + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename); +const jamcleanPath = resolve(__dirname, 'jamclean'); +await $`zx ${jamcleanPath}` +await main() + -else - die "File: $file not found" -fi \ No newline at end of file diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs deleted file mode 100755 index 6d5e2b72e..000000000 --- a/tools/jamrun.mjs +++ /dev/null @@ -1,839 +0,0 @@ -#!/usr/bin/env zx -import {jamrunParsArg , getCargs, getJargs, getRemoteArgs} from './parser.mjs' -import { fileURLToPath } from 'url'; -import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; -import { dirname, resolve } from 'path'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' -const { spawn,spawnSync } = require('child_process'); -import { Client } from 'ssh2'; - - -let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote, root; -const tmuxIds = []; -let removablePort - -process.on('SIGINT', () => { - if(removablePort){ - let toPause; - try{ - toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() - } - catch(error){ - toPause = "false" - } - - if(toPause !== "false"){ - const fileNoext = getFileNoext(file); - pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) - process.exit(); - - } - else{ - const fileNoext = getFileNoext(file); - cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); - process.exit(); - } - } - else{ - process.exit(); - } -}); -process.on('SIGTERM', () => { - if(removablePort){ - let toPause; - try{ - toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() - } - catch(error){ - toPause = "false" - } - - if(toPause !== "false"){ - const fileNoext = getFileNoext(file); - pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) - process.exit(); - - } - else{ - const fileNoext = getFileNoext(file); - cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); - process.exit(); - } - } - else{ - process.exit(); - } - - -}); - - -const filePath = fileURLToPath(import.meta.url); -const IDIR = path.dirname(filePath); -const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); -const SHELLPID = process.pid; - - -const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( - ["mosquitto","mosquitto_pub", "tmux"].map( - async (entry)=> { - try{ - const p = await $`which ${entry}`; - return p.stdout.trim(); - } - catch(error){ - switch(entry){ - case "tmux": - throw new Error("tmux not installed. Quitting.") - case "mosquitto_pub": - throw new Error("mosquitto_pub (MQTT tools) not installed. Quitting.") - case "mosquitto": - throw new Error("mosquitto (MQTT broker) not installed. Quitting.") - } - } - } - ) -) - - -async function executeScript(client, command){ - - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ - if (err){ - reject(err); - } - let result; - stream.on("close", () => { - resolve(result) - }) - stream.on("data" , async (data) =>{ - if(data.includes("MY PORT IS:")) - { - console.log(data.toString()) - result = data.toString().trim().split(":")[1] - } - if(data.includes("EXIT BG")){ - resolve(result) - } - }) - }) - })) -} -//tested.working -function show_usage(){ - const usageMessage = - ` - jamrun program.jxe - Runs J and C node, one each, of a device with program.jxe - under a app name X, use the --app=X option. It is mandatory to set the app name. - - jamrun program.jxe --fog - Runs a fog node (only J node) with program.jxe. Similarly, the --cloud - flag runs a cloud node. - - By default, jamrun uses a Redis server running at 127.0.0.1:(20000+porttaken) as the - data store. To use a different Redis server use the --data option. - - jamrun program.jxe --data=127.0.0.1:7000 - Runs program.jxe and connects it to an already running Redis server at - port 7000 of the local host. Redis server can run outside the - local host (Redis needs to the configured to accept outside - connections). - - To start more than one C node at a device use the following command. - jamrun program.jxe --num=4. - - To provide a set of tags to the program, use the following command. - jamrun program.jxe --tag="param1, param2" - - Use the --bg option to run a command in the background. the --bg is mandatory for the cases - that program is running on a remote machine. - - Use the --old option to run the previous version in .jamruns folder. - You can edit that version and rerun a custom version of a file. - - Use the --log option to turn on logging. This is useful for programs where - the C side is crashing at the startup. The tmux console would not run when - the program crash at startup. So the --log option allows us to see the - program error messages. - - Use the --verb option to turn on verbose messaging. - - Use --valgrind to run the cside with valgrind for leak checking. - - Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. - - Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags. - the program can be resumed only if it was pased before. - --resume tag have to be used with --port tag to specify exactly which program shoukd be resumed. - - to start the c nodes and j files on a remote machine the --remote is used. - the value assinge to --remote is IP addrress of the remote machine to make the connection. - - by default the location assigned to a program has random long and lat values. to set a specific - location for the progam the --loc is used. - value passsed to the loc contains long and lat with a ',' seperator between them. - - - Usage: jamrun file.jxe - [--app=appl_name] - [--fog|--cloud|--device] - [--num=num_c_devs] - [--data=data-url] - [--tags=quoted_list_of_tags] - [--bg] - [--old] - [--log] - [--verb] - [--loc=long,lat] - [--edge=num_edge_connections] - [--valgrind] - [--local] - [--resume && port=] - [--remote=] - - - - - The jamrun command creates a run state in the $HOME/.jamruns folder. - `; - console.log(usageMessage) - -} - -//teste.working. -async function startmqtt(port, cFile){ - const jamfolder = getJamFolder() - try{ - await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); - - } - catch(error){ - - if(!NOVERBOSE){ - console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); - } - const command = MOSQUITTO; - const args = ['-c', cFile]; - const options = { - stdio: ['ignore', 'ignore', 'ignore'], - detached: true, - }; - const mqttProcesse = spawn(command, args, options); - console.log(mqttProcesse.pid) - fs.writeFileSync(`${jamfolder}/mqttpid/${port}`,`${mqttProcesse.pid}` ) - mqttProcesse.unref(); - - return; - } -} - -async function dojamout(iport, folder,jappid) { - await dojamout_p1 (iport ,folder) - await dojamout_p2 (iport ,folder, jappid) - -} - -//tested.working -async function dojamout_p1(pnum ,floc) { - await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - if(data){ - fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); - } - fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); - fs.writeFileSync(`${floc}/${pnum}/paused`, "false\n"); - fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); - fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); - if(Type === "device"){ - fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); - } - if(root){ - fs.writeFileSync(`${floc}/${pnum}/root`, root) - } -} - - -async function dojamout_p2(iport, folder, jappid, group=null){ - if(!bg){ - await dojamout_p2_fg(iport, folder,jappid, group) - } - else - { - dojamout_p2_bg(iport, folder,jappid, group) - } -} - -//tested, working -async function dojamout_p2_fg(pnum, floc,jappid, group=null){ - let argObject = { - "--app":jappid, - "--port":pnum, - "--group":group, - "--data":data, - "--tags":tags, - "--edge":edge, - "--long":long, - "--lat":lat, - "--localregistryhost":local_registry, - "--type": Type - } - - let jargs = getJargs(argObject) - const command = 'node'; - const args = ['jstart.js', ...jargs]; - - if(resume){ - console.log("############## RESUME ##############") - } - if(log){ - const options = { - cwd: floc, - stdio: ['pipe', 'pipe', 'pipe'] - }; - const stream = fs.createWriteStream(`${floc}/${pnum}/log.j`, { flags: 'a' }); - const child = spawn(command, args, options); - child.stdout.on('data', (data) => { - process.stdout.write(data); - stream.write(data); - }); - - child.stderr.on('data', (data) => { - process.stderr.write(data); - stream.write(data); - }); - - child.on('exit', () => { - process.kill(process.pid, 'SIGTERM'); - }); - - }else{ - const options = { - cwd: floc, - stdio: 'inherit' - }; - const child = spawn(command, args, options); - child.on('exit', () => { - console.log("sending sig term") - process.kill(process.pid, 'SIGTERM'); - }); - } - - -} - - -function dojamout_p2_bg(pnum, floc, jappid, group=null){ - let argObject = { - "--app":jappid, - "--port":pnum, - "--group":group, - "--data":data, - "--tags":tags, - "--edge":edge, - "--long":long, - "--lat":lat, - "--localregistryhost":local_registry, - "--type": Type - } - let jargs = getJargs(argObject) - - const logFile = fs.openSync(`${floc}/${pnum}/log.j`, 'a'); - if(resume){ - fs.writeFileSync(`${floc}/${pnum}/log.j`,"############## RESUME ##############") - } - - const command = 'node'; - const args = ['jstart.js', ...jargs]; - const options = { - cwd: floc, - stdio: ['ignore', logFile, logFile], - detached: true, - }; - - const p = spawn(command, args, options); - p.unref(); - - if(!NOVERBOSE){ - console.log("Started the J node in background") - } - //keep this log file - console.log("EXIT BG") - process.exit(0) -} - -async function doaout(num,port,group,datap,myf,jappid){ - let counter=1 - if (fs.existsSync('a.out')) { - await $`cd ${myf} && chmod +x a.out` - } - while(counter <= num){ - - if(fs.existsSync('a.out')){ - - const argObject = - { - "-a": jappid.toString(), - "-p": port, - "-n": counter, - "-g": group, - "-t": tags, - "-o": datap, - } - let cargs = getCargs(argObject) - console.log("this is my cargs",cargs ) - await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; - if (!log){ - - if(valgrind) - await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; - - else - await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; - - } - - else{ - if(valgrind) - await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; - else - //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) - await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; - } - } - tmuxIds.push(`${tmux}-${counter}`) - counter++; - } - if(!NOVERBOSE) - console.log("Started a C node") - } - - -async function portavailable(folder,port) { - let porttaken; - const jamFolder = getJamFolder() - if(fs.existsSync(`${folder}/${port}`)){ - porttaken=1 - } - else{ - porttaken=0; - } - - if(porttaken === 0){ - if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ - const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() - porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; - - } - else{ - const runningApps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split(); - const fileNoExt = getFileNoext(file) - if(runningApps.includes(`${fileNoExt}_${app}`)){ - porttaken = 1; - } - else{ - porttaken = 0; - } - } - } - return porttaken; -} - -function setuptmux(path, appfolder) { - fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); - fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); - -} - - -async function startredis(port) { - try{ - const p = $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); - console.log(p) - } - catch(error){ - console.log(error) - } -} - -async function waitforredis(port){ - while (true) { - try{ - const p = await $`redis-cli -p ${port} -c PING`.quiet() - if (p.stdout.trim() === "PONG") { - break; - } - } - catch(error){ - console.log(error) - } - if (!NOVERBOSE) { - console.log("Trying to find Redis server..."); - } - await sleep(1000) - } - - if (!NOVERBOSE) { - console.log(`Redis running at port: ${port}`); - } - -} - - -async function setupredis(port) { - - await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` - await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` - await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` - //IMPORTANT: flushing redis - //USE FLUSH DB TO ONLY FLUSH THE CURRENT DB FOR THE APP - //DB NUMBER - //FOR NOW KEEP AS IT IS - if(!resume){ - await $`redis-cli -p ${port} FLUSHALL`; - } - -} - -async function resolvedata(Name) { - const [host, port] = Name.split(':'); - - await startredis(Number(port)); - await waitforredis(port); - await setupredis(port); - data = Name.split(/\s+/).join(''); - - -} - -async function unpack(file,folder){ - if(!old){ - if(!fs.existsSync("./MANIFEST.txt")){ - try{ - await $`cd ${folder} && unzip -o ${file}`.quiet() - } - catch(error){ - throw new Error(`Problem reading file: ${file}\n${error}`) - } - - } - else{ - let forceRedo = false; - try{ - isValidExecutable() - } - catch(error){ - forceRedo = true; - } - if(!forceRedo){ - const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; - const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; - const ntime = Number(p1.stdout.toString().trim()); - const ontime = Number(p2.stdout.toString().trim()); - if(ntime > ontime){ - try{ - console.log("outdated, unzippping again") - await $`cd ${folder} && unzip -oq ${file}`.quiet() - } - catch(error){ - - throw new Error(`Problem reading file: ${file}\n${error}`) - - } - } - } - else{ - if(!NOVERBOSE) - console.log("The corrupted unziped files. files will be unziped again based on the existing MANIFEST.txt") - await cleanExecutables() - await $`cd ${folder} && unzip -oq ${file}`.quiet() - } - } - } - else{ - if(!NOVERBOSE){ - console.log("WARNING: Unziped files might be outdated") - } - isValidExecutable() - } -} - -async function getjdata(folder) { - const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() - return p.stdout.trim() -} - -async function runNoneDevice(iport){ - const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport,jamfolder,app) - const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) - await dojamout(iport, folder, jappid) -} - -async function runDevice(iport,dport,group){ - const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport,jamfolder,app) - const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) - await dojamout_p1(iport,folder) - setuptmux(`${folder}/${iport}`, appfolder) - await doaout(num,iport, group, dport,folder,jappid) - await dojamout_p2(iport, folder,jappid,group ) -} - - -async function main(){ - let iport; - let dport; - let group; - try{ - ({ - app, - tmux, - num, - edge, - data, - local_registry, - bg, - NOVERBOSE, - resume, - log, - old, - local, - valgrind, - long, - lat, - Type, - tags, - port, - file, - remote, - root, - } = jamrunParsArg(process.argv)) - } - - - catch(error){ - console.log('got here') - show_usage() - throw(error) - } - let folder; - let ifile; - let jdata; - let client; - if(remote){ - const config = { - host: 'localhost', - port: remote, - username: 'admin', - password: 'admin' - }; - if(resume){ - const jamfolder = getJamFolder() - const fileNoext = getFileNoext(file); - if(!fs.existsSync(`${jamfolder}/remote`)) - throw new Error("this machine is not the root for any running app") - - - if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`)) - throw new Error(`this machine is not the root for any running app on ${config.host}_${config.port}`); - - - const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`).toString().trim().split("\n") - if(!remoteApps.includes(`${fileNoext}_${app}`)) - throw new Error(`this machine is not the root for any running ${fileNoext}_${app}`); - - } - client = await new Promise((resolve, reject) => { - const client = new Client(); - - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.connect(config); - }); - const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) - // const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let currIP ; - if (os.platform() === 'win32') { - currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'darwin') { - currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'linux') { - currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); - } - const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP}`) - - if(!resume){ - const jamfolder = getJamFolder() - const fileNoext = getFileNoext(file); - if(!fs.existsSync(`${jamfolder}/remote`)){ - fs.mkdirSync(`${jamfolder}/remote`); - } - if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ - fs.mkdirSync(`${jamfolder}/remote/${config.host}_${config.port}`); - - } - if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`)){ - const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`).toString().trim().split("\n") - if(!remoteApps.includes(`${fileNoext}_${app}`)){ - fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`); - } - } - else{ - fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`) - } - } - process.exit(0) - - } - - - if(resume){ - const fileNoExt = getFileNoext(file) - if(!port) - throw new Error("can't resume the app without port number") - - folder = getFolder(file,app); - if(!fs.existsSync(folder)){ - throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app}` ) - - } - if(!fs.existsSync(`${folder}/${port}`) || !fs.existsSync(`${folder}/${port}/paused`)){ - throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) - } - else{ - const isPaused = (fs.readFileSync(`${folder}/${port}/paused`).toString().trim()) === "false" ? false : true; - if(!isPaused){ - throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) - } - - } - if(num, data, Type){ - console.log("WARNING: IN CASE OF RESUMING, WILL NOT USE ANY OF NUM, DATA, TYPE ARGUMENTS.") - } - try{ - Type = fs.readFileSync(`${folder}/${port}/machType`).toString().trim(); - } - catch(error){ - throw new Error('type missing, corrupted program, it should be killed') - } - process.chdir(folder); - isValidExecutable(); - jdata = await getjdata(folder); - } - else{ - if(port){ - console.log("Warning. If it's not to resume the port argument will not be used") - } - - fileDirectorySetUp(file,app) - folder = getFolder(file,app) - ifile = path.resolve(file); - process.chdir(folder); - await unpack(ifile, folder) - isValidExecutable() - jdata = await getjdata(folder); - } - - let isDevice; - switch(Type){ - case "cloud": - if(resume){ - iport = port; - removablePort = port; - isDevice = false; - } - else{ - iport=9883 - isDevice = false; - - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; - } - iport++; - } - removablePort = iport; - } - break; - - case "fog": - if(resume){ - iport = port; - removablePort = port; - isDevice = false; - } - else{ - iport=5883 - isDevice = false - while(true){ - - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; - } - iport++; - } - removablePort = iport; - } - - break; - - case "device": - if(resume){ - iport = port; - removablePort = port; - isDevice = true; - } - else{ - iport=1883; - isDevice = true; - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; - } - iport++; - } - removablePort = iport; - } - if(!local){ - group= iport-1882 - } - else - group = 0; - } - - - if(jdata.toLowerCase() === "true"){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - - } - - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) - } - console.log(`MY PORT IS:${removablePort}`) - if(isDevice) - await runDevice(iport,dport,group) - - else - await runNoneDevice(iport) - } - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename); -const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); -await $`zx ${jamcleanPath}` -await main() - - diff --git a/tools/jamrun_epm b/tools/jamrun_epm deleted file mode 100755 index f9acff3b2..000000000 --- a/tools/jamrun_epm +++ /dev/null @@ -1,401 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" -REDISFUNCS=`realpath "$IDIR/../deps/lua/jredlib.lua"` - -SHELLPID=$$ -trap cleanup SIGTERM SIGINT - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -cleanup() { - exit 1 -} - -# Determine the platform we are running on -unameOut="$(uname -s)" -case "${unameOut}" in - Linux*) machine=Linux;; - Darwin*) machine=Mac;; - *) machine="UNKNOWN:${unameOut}" -esac - -MOSQUITTO=`which mosquitto` -MOSQUITTO_PUB=`which mosquitto_pub` - - -startmqtt() { - local port=$1 - local cfile=$2 - - # Check whether the MQTT server is running.. if not start it - $MOSQUITTO_PUB -p $port -t "test" -m "hello" - if [ $? -ne 0 ]; then - echo "MQTT is not running at $port" - echo "Attempting to start MQTT at $port" - if [ $machine = Mac ]; then - open -n -a $MOSQUITTO --stdout /dev/null --args -c $cfile - elif [ $machine = Linux ]; then - nohup $MOSQUITTO -c $cfile &>/dev/null & - fi - fi -} - -dojamout() { - dojamout_p1 $1 $2 $3 - dojamout_p2 $1 $2 $3 -} - - -dojamout_p1() { - local type=$1 - local pnum=$2 - local floc=$3 - - startmqtt $pnum "${floc}/${pnum}/mqtt.conf" - echo "$data" > $floc/$pnum/dataStore - echo "process" > $floc/$pnum/class - echo "$SHELLPID" > $floc/$pnum/shellpid - echo "new" > $floc/$pnum/processId -} - - -dojamout_p2() { - - if [ -z $bg ]; then - dojamout_p2_fg $1 $2 $3 $4 - else - dojamout_p2_bg $1 $2 $3 $4 - fi -} - - -dojamout_p2_fg() { - local type=$1 - local pnum=$2 - local floc=$3 - local group=$4 - - buildjargs "--app=$app" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" - local args=$results - case $type in - cloud) - node jstart.js $args - ;; - fog) - node jstart.js $args - ;; - device) - node jstart.js $args - ;; - esac -} - - -dojamout_p2_bg() { - local type=$1 - local pnum=$2 - local floc=$3 - local group=$4 - - buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" - local args=$results - - if [ `uname` == "Linux" ]; then - script -a -c "node jstart.js $args" -f log.j > /dev/null & - else - script -a -t 1 log.j node jstart.js $args > /dev/null & - fi - - echo ">>> Started the J node in background" -} - - -# This is always scanning for a command with 'node' -portavailable() { - local folder=$1 - local port=$2 - - if [ -d $folder/$port ]; then - if [ -e $folder/$port/processId ]; then - local pid=`cat $folder/$port/processId` - if [ $pid == "new" ]; then - porttaken=1 - elif [ ! -z $pid ]; then - porttaken=`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` - else - porttaken=0 - fi - else - porttaken=0 - fi - else - porttaken=0 - fi -} - - -startredis() { - local port=$1 - - # Start redis with no protected-mode and at the port - echo -e "port $1\nprotected-mode no" | redis-server --port $port - 1> /dev/null & -} - -waitforredis() { - local port=$1 - - while : ; do - local present=`ps auwwx | grep redis-server | grep $port | wc -l | tr -d '[:space:]'` - if [ $present == "1" ]; then - break - fi - sleep 1 - done - echo ">>> Redis running at port: $port" - cat $REDISFUNCS | redis-cli -p $port -x FUNCTION LOAD REPLACE > /dev/null -} - -resolvedata() { - local name=$1 - - local host="${name%:*}" - local port="${name##*:}" - - startredis $port - waitforredis $port - - if [ $host == "docker" ]; then - local ipaddr=`hostname -I` - name=$ipaddr:$port - fi - # trim space left behind by hostname -I - data=$(echo $name | tr -d '[:space:]') -} - -getjdata() { - jdata=`grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` -} - -# set the global longitude and lattitude variables -# -getlonglat() { - local loc=$1 - - long="${loc%,*}" - lat="${loc##*,}" -} - -# for now, just roam the north-eastern part... -generatelonglat() { - a=$(( $RANDOM % 180 )) - b=$(( $RANDOM % 10000 )) - long=$a.$b - c=$(( $RANDOM % 90 )) - d=$(( $RANDOM % 10000 )) - lat=$c.$d -} - -### -# Main script execution begins here... -# - -# Initialize all the option variables. -app=app-n -type=fog -data=127.0.0.1:6379 -num= -tags= -bg= -old= -porttaken=0 -tmuxid= -log= -edge=1 -folder=`pwd` - -# generate the random longitude and lattitude values -# use the --loc option to override these values -generatelonglat - - -while :; do - case $1 in - --help) - show_usage # Display a usage synopsis. - exit - ;; - --app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--args" requires a non-empty option argument.' - ;; - - --tags) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tags=$2 - shift - else - die 'ERROR: "--tags" requires a non-empty option argument.' - fi - ;; - --tags=?*) - tags=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tags=) # Handle the case of an empty - die 'ERROR: "--tags" requires a non-empty option argument.' - ;; - --tmux) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tmuxid=$2 - shift - else - die 'ERROR: "--tmux" requires a non-empty option argument.' - fi - ;; - --tmux=?*) - tmuxid=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tmux=) # Handle the case of an empty - die 'ERROR: "--tmux" requires a non-empty option argument.' - ;; - --num) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - num=$2 - shift - else - die 'ERROR: "--num" requires a non-empty option argument.' - fi - ;; - --num=?*) - num=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --num=) # Handle the case of an empty - die 'ERROR: "--num" requires a non-empty option argument.' - ;; - --loc) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - getlonglat $2 - shift - else - die 'ERROR: "--loc" requires longitude and lattitude specification' - fi - ;; - --loc=?*) - loc=${1#*=} # Delete everything up to "=" and assign the remainder. - getlonglat $loc - ;; - --loc=) # Handle the case of an empty - die 'ERROR: "--loc" requires longitude and lattitude specification' - ;; - --edge) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - edge=$2 - shift - else - die 'ERROR: "--edge" requires a non-empty option argument.' - fi - ;; - --edge=?*) - edge=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --edge=) # Handle the case of an empty - die 'ERROR: "--edge" requires a non-empty option argument.' - ;; - --data) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - data=$2 - shift - else - die 'ERROR: "--data" requires a non-empty option argument.' - fi - ;; - --data=?*) - data=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --data=) # Handle the case of an empty - die 'ERROR: "--data" requires a non-empty option argument.' - ;; - --fog) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="fog" - num= - fi - ;; - --cloud) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="cloud" - num= - fi - ;; - --device) - ;; - --bg) - bg=1 - ;; - --log) - log=1 - ;; - --old) - old=1 - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -# Check necessary parameters and set defaults - -if [ "$type" != "device" ]; then - edge= - if [ -n "$num" ]; then - die "number of devices can't be speciied for fog/cloud" - fi - if [ -n "$edge" ]; then - die "number of edge connections can't be specified for fog/cloud" - fi -fi - -# find the machine height - -getjdata -if [ "$jdata" = true ]; then - resolvedata $data -fi - -iport=2883 -while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) -done -create_missingdir $folder/$iport -create_conffile "${folder}/${iport}/mqtt.conf" $iport -dojamout $type $iport $folder diff --git a/tools/jamterm b/tools/jamterm deleted file mode 100755 index 7f7a0a509..000000000 --- a/tools/jamterm +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -# Edit the following locations to provide the -TMUX=`which tmux` -if [ -z $TMUX ]; then - TMUX=/usr/local/bin/tmux -fi - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -Shows the background terminals with the given tmux-id and terminal-num. - -Usage: jamterm [tmux-id] [-t terminal-num] - -jamterm -Shows the first C terminal of the program that was last started. - -jamterm -t 2 - - -jamterm u-600-dev-2331 -t 2 -Shows the second C terminal of the program running under u-600-dev-2331. - -jamterm u-600-dev-2331 -Shows the first C terminal of the program running under u-600-dev-2331. - -EOF -} - -localtmux() { - local tmuxapp=$1 - local termno=$2 - - $TMUX has-session -t $tmuxapp-$termno 2>/dev/null - res=$? - if [ $res == "0" ]; then - if [ -z $termno ]; then - $TMUX attach -t $tmuxapp - else - $TMUX attach -t $tmuxapp-$termno - fi - fi -} - - -### -# Main script execution begins here... -# - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" - -appsfolder=$jamfolder/apps -exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" - -cd $appsfolder - -if [ -z $1 ]; then - if [ -e tmuxid ]; then - tmuxid=`cat tmuxid` - localtmux $tmuxid 1 - exit - fi -else - # Show help - if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit - elif [ $1 == "-t" ]; then - if [ -e tmuxid ]; then - tmuxid=`cat tmuxid` - localtmux $tmuxid $2 - exit - fi - exit - else - if [ -z $2 ]; then - termid=1 - else - if [ -n $3 ] && [ $2 == "-t" ]; then - termid=$3 - fi - fi - localtmux $1 $termid - fi -fi diff --git a/tools/jamtoast b/tools/jamtoast deleted file mode 100755 index de6d3a39a..000000000 --- a/tools/jamtoast +++ /dev/null @@ -1,1159 +0,0 @@ -#!/usr/bin/env node - -/******************************* - * JAMSCRIPT TESTING FRAMEWORK * - *******************************/ - -const fs = require('fs'), - os = require('os'), - path = require('path'), - process = require('process'), - assert = require('assert'), - child_process = require('child_process'), - toml = require('toml'); - - -const USAGE = ` -jamtoast [options] file -Toaster is a testing framework for JAMScript that wraps over jamrun. -Individual test files and test directories are both accepted inputs. If a -directory is provided, toaster will recursively search for tests. Currently, -a test is defined as one javascript file and one C file in the same directory -with the same name. To specify an indidivudal test provide the path to the test -without the .js or .c extension. - - -Command Line Options: --t [duration] --timeout [duration] sets the maximum amount of time for a test to run. --nt --no-timeout disables timeout --i --ignore-error ignore runtime errors --v --verbose verbose (shows stdout of running programs) --l --local runs jamrun with --local - -Keywords: -Toaster provides two keywords that can be used inside of tests (both jside and cside). - -assert(condition); -- this functions as a regular assert but hooks into the toaster error logging system -coverage(); -- For a test to pass it must execute every coverage function in the test at least once. - -For coverage markers, by default the test will exit once every coverage marker has been reached. To prevent this, -you can use the RunToTimeout option in the Toaster Config. - -Toaster Config: -For tests that must run on multiple nodes at once, the toaster config is a way of -describing basic network structure. This is all done through comments within one of your test files. - -You start the configuration with the @ToasterConfig annotation. - -// @ToasterConfig -// Fogs: [number of fogs] -// Devices: [number of devices] -// Workers: [number of workers for each device] -// Cloud: [true/false run a cloud] -// NetworkDescriptor: [path to a network descriptor] -// RunToTimeout: [true/false ignore early exit from coverage markers] - -Network Descriptor: -This is an alternative to the Toaster Config's Fogs/Devices/Workers/Cloud options. They cannot be both used for the same test. The following example network descriptor demonstrates all possible options for each node type. - -appname="YOUR_NAME" - -[[device]] -tags="YOUR_DEVICE" -data="127.0.0.1:6379" -loc={long=30, lat=30} -edge=4 - -[[fog]] -tags="YOUR_FOG" -data="127.0.0.1:6380" -loc={long=30, lat=30} -host-local-registry=true - -[cloud] -tags="YOUR_CLOUD" -data="127.0.0.1:6381" - -`; - -// Feature TODO: -// - Seperate Node Logs (filename should be nodeid perhaps) DONE -// - Final Report should highlight offending Node DONE -// - Add an option to display all log file urls. - - - - -const TEST_RESULT_DIR_NAME = "toast-results"; -const DEFAULT_TEST_DIR = "toaster" - -const JAMRUNS_DIR = `${os.homedir()}/.jamruns`; - -const TOASTER_JS_HOOKS = - `jtask function assert(cond){if(!(cond)){let _err = new Error(); console.log("\\n@ToasterAssert#{"+_err.stack+"}#");}} -jtask function coverage(_id){console.log("\\n@ToasterCoverage#{"+_id+"}#");}\n`; -const TOASTER_C_HOOKS = - `#undef assert -#define assert(cond, line) {if(!(cond)){printf("\\n@ToasterAssert#{%d, %s}#\\n", line, #cond);fflush(stdout);}} -#define coverage(_id){printf("\\n@ToasterCoverage#{%d}#\\n", _id);fflush(stdout);}\n`; - - -// Just while the compiler is broken: - -const TOASTER_JS_HOOK_ASSERT_L = "if(!("; -const TOASTER_JS_HOOK_ASSERT_R = `)){let _err = new Error(); console.log("@ToasterAssert#{"+_err.stack+"}#");}`; - -const TOASTER_JS_HOOK_COVERAGE_L = `console.log("@ToasterCoverage#{`; -const TOASTER_JS_HOOK_COVERAGE_R = `}#");` - - -const TOASTER_ASSERT_KEYWORD = "@ToasterAssert"; -const TOASTER_COVERAGE_KEYWORD = "@ToasterCoverage"; - -const MAGIC_ANSI_REMOVAL_REGEX = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; - -function ansiiGreen(text) { - return `\x1b[32m${text}\x1b[0m`; -} - -function ansiiYellow(text) { - return `\x1b[33m${text}\x1b[0m`; -} - -function ansiiRed(text) { - return `\x1b[31m${text}\x1b[0m`; -} - -const TestState = { - COMPILING: 0, - STARTING: 1, - RUNNING: 2, - PASSED: 3, - FAILED: 4, - COMPILE_FAILED: 5, -}; - -const FailDetails = { - TEST_FAILED: 0, - LAUNCH_FAILED: 1, - RUNTIME_FAILED: 2, - CRASH_FAILED: 3, -} - -const NODETYPE_DEVICE = "device"; -const NODETYPE_FOG = "fog"; -const NODETYPE_CLOUD = "cloud"; - -Toaster.prototype.writeLog = function(text) { - process.stdout.write(text); - if(this.logFile) { - let prunedText = text.replace(MAGIC_ANSI_REMOVAL_REGEX,""); - fs.writeSync(this.logFile, prunedText); - } -} - -Toaster.prototype.log = function(text) { - this.writeLog(text+"\n"); -} - -Toaster.prototype.updateTestState = function (test) { - let completeStr = `${this.currentTest}`; - let totalStr = `${this.tests.length}`; - - // Magic characters clear line - let prefix = `\x1b[2K\r(${completeStr}/${totalStr}) `; - let padding = totalStr.length - completeStr.length; - prefix += " ".repeat(padding); - if(test.state==TestState.COMPILING) { - this.writeLog(`${prefix}${ansiiYellow(test.testName)} ${ansiiYellow("Compiling")} `); - } else if (test.state == TestState.STARTING) { - let beginning = `${ansiiYellow(test.testName)} ${ansiiGreen("Compiled")}`; - this.writeLog(`${prefix}${beginning} Starting...`) - } else if (test.state == TestState.RUNNING) { - let beginning = `${ansiiYellow(test.testName)} ${ansiiGreen("Compiled")}`; - let coverageStatus = ""; - if(test.coverageMarkers.length) { - coverageStatus = `(${test.completedCoverageMarkers}/${test.coverageMarkers.length})`; - } - this.writeLog(`${prefix}${beginning} ${ansiiYellow("Running")} ${coverageStatus}`) - } else if (test.state == TestState.PASSED) { - this.writeLog(`${prefix}${ansiiGreen(test.testName + " Passed")}`) - } else if (test.state == TestState.FAILED) { - if(test.compilerWarnings != "") { - this.writeLog(`${prefix}${test.compilerWarnings}`); - } - - if (test.failDetails == FailDetails.TEST_FAILED || - test.failDetails == FailDetails.RUNTIME_FAILED || - test.failDetails == FailDetails.CRASH_FAILED) { - // Provide some context as to why - let reason = ""; - if(test.completedCoverageMarkers != test.coverageMarkers.length) { - reason += `${test.completedCoverageMarkers}/${test.coverageMarkers.length} Coverage Markers` - } - if(test.assertMessage) { - if(reason!="") { - reason += ", "; - } - reason += "Failed Assert"; - } - if(test.failDetails == FailDetails.RUNTIME_FAILED) { - if(reason!="") { - reason += ", "; - } - reason += "JAMScript Runtime Error"; - } else if (test.failDetails == FailDetails.CRASH_FAILED) { - if(reason!="") { - reason += ", "; - } - reason += "Test Crashed"; - } - - if(reason == "") { - reason = "!INTERNAL!"; - console.trace(); - } - - this.writeLog(`${prefix}${ansiiRed(test.testName + " Failed")} (${reason}) `) - } else if (test.failDetails == FailDetails.COMPILE_FAILED) { - this.writeLog(`${prefix}${ansiiRed(test.testName + " Failed to compile")}`); - } else if (test.failDetails == FailDetails.LAUNCH_FAILED) { - this.writeLog(`${prefix}${ansiiRed(test.testName + " Failed to start test")} `); - } else { - console.error("Mistakes were made while programming this."); - console.trace(); - } - } -} - -Toaster.prototype.setTestState = function(test, state) { - test.state = state; - this.updateTestState(test); -} - -function Toaster(conf) { - this.conf = conf; - - if(conf.testDirectory == undefined) { - if(fs.existsSync(DEFAULT_TEST_DIR)) { - this.log("Using default test directory " + DEFAULT_TEST_DIR); - this.testDirectory = DEFAULT_TEST_DIR; - } else { - this.log("Must provide a test folder."); - process.exit(); - } - } else { - this.testDirectory = conf.testDirectory; - } - - this.timeoutAmount = conf.timeoutAmount || 10000; - - this.testDirectoryName = path.basename(this.testDirectory); - this.currentTest = 0; - this.testProcesses = new Set(); - - this.logFile = undefined; - - let that = this; - process.on("SIGINT", ()=>that.exitHook()); - //process.on("exit", ()=>that.exitHook()); -} - - -Toaster.prototype.exitHook = function() { - let endTime = Date.now(); - this.finalReport(endTime-this.startTime); - process.exit(); -} - - -Toaster.prototype.setupTestingEnvironment = function () { - if (!fs.existsSync(TEST_RESULT_DIR_NAME)) { - fs.mkdirSync(TEST_RESULT_DIR_NAME); - } - this.resultDirectory = `${TEST_RESULT_DIR_NAME}/${this.testDirectoryName}-${new Date().toISOString()}` - fs.mkdirSync(this.resultDirectory); - - this.logFile = fs.openSync(`${this.resultDirectory}/log.txt`, 'w'); -} - -Toaster.prototype.walkTestDir = function (folder) { - let that = this; - var tests = []; - for(let file of fs.readdirSync(folder)) { - let completePath = `${folder}/${file}`; - - if(fs.lstatSync(completePath).isDirectory()) { - tests.push(...that.walkTestDir(completePath)); - } - - let extension = path.extname(file); - if(extension === ".c") { - let baseName = file.substring(0, file.length-2); - if(fs.existsSync(`${folder}/${baseName}.js`)){ - let testName = `${folder}/${baseName}`.substring(this.testDirectory.length+1); - tests.push({ - testName: testName, - baseName: baseName, - appName: baseName, - testFolder: folder, - cFile: `${folder}/${baseName}.c`, - jsFile: `${folder}/${baseName}.js`, - testResultDirectory: `${that.resultDirectory}/${testName}`, - logFile: `${that.resultDirectory}/${testName}/jlog.txt`, - logFiles: new Map(), - state: TestState.COMPILING, - completedCoverageMarkers: 0, - compilationDuration: 0, - compilerWarnings: "", - runDuration: 0, - assertMessage: undefined, - failDetails: undefined, - offendingNodes: [], - networkConfig: { - devices: 1, - workers: 1, - cloud: false, - fogs: 0, - netDescPath: undefined, - netDesc: undefined - }}); - } - } - } - return tests; -} - - -Toaster.prototype.scanTests = function () { - if(this.conf.singleTest) { - let basename = path.basename(this.testDirectory); - let folder = basename.substring(0, basename.lastIndexOf('/')); - this.tests = []; - this.tests.push({ - testName: basename, - baseName: basename, - appName: basename, - testFolder: folder, - cFile: `${this.testDirectory}.c`, - jsFile: `${this.testDirectory}.js`, - testResultDirectory: `${this.resultDirectory}/${basename}`, - logFile: `${this.resultDirectory}/${basename}/jlog.txt`, - logFiles: new Map(), - state: TestState.COMPILING, - completedCoverageMarkers: 0, - compilationDuration: 0, - compilerWarnings: "", - runDuration: 0, - assertMessage: undefined, - failDetails: undefined, - offendingNodes: [], - networkConfig: { - devices: 1, - workers: 1, - cloud: false, - fogs: 0, - netDescPath: undefined, - netDesc: undefined - } - }); - } else { - this.tests = this.walkTestDir(this.testDirectory); - } - this.log(`Found ${this.tests.length} tests.`); -} - -const ASSERT_IDENTIFIER = "assert("; -const COVERAGE_IDENTIFIER = "coverage("; - -function findMatchingParens(text, start) { - var end = -1; - var lastIndex = start; - var depth = 0; - - while(true) { - let nextOpen = text.indexOf('(', lastIndex); - let nextClose = text.indexOf(')', lastIndex); - - if(nextOpen == -1 && nextClose == -1) { - console.error(`Error: was unable to find matching closing paren for '${text}'`); - process.exit(); - } - - if(nextOpen == -1 || nextClose < nextOpen) { - depth--; - assert(lastIndex != start); - lastIndex = nextClose + 1; - - if(depth == 0) { - end = nextClose; - break; - } - } - - if(nextOpen != -1 && nextOpen < nextClose) { - depth++; - lastIndex = nextOpen + 1; - } - } - return end; -} - -const FOGS_KEYWORD = "fogs:"; -const DEVICES_KEYWORD = "devices:"; -const CLOUD_KEYWORD = "cloud:"; -const WORKERS_KEYWORD = "workers:"; -const NET_DESC_KEYWORD = "networkdescriptor:"; -const TIMEOUT_KEYWORD = "runtotimeout:"; - -Toaster.prototype.scanForToasterConfig = function(test, line, lineIter) { - const keywords = [FOGS_KEYWORD, DEVICES_KEYWORD, WORKERS_KEYWORD, NET_DESC_KEYWORD, TIMEOUT_KEYWORD]; - if(line.includes("@ToasterConfig")) { - let lineResult; - while(!(lineResult = lineIter.next()).done) { - line = lineResult.value.toLowerCase(); - - let keywordFound = false; - for(let keyword of keywords) { - if(line.includes(keyword)) { - keywordFound = true; - let start = line.indexOf(keyword) + keyword.length; - let value = line.substring(start).trim(); - - if(keyword == FOGS_KEYWORD) { - test.networkConfig.fogs = parseInt(value); - } else if (keyword == DEVICES_KEYWORD) { - test.networkConfig.devices = parseInt(value); - } else if (keyword == WORKERS_KEYWORD) { - test.networkConfig.workers = parseInt(value); - } else if (keyword == CLOUD_KEYWORD){ - test.networkConfig.cloud = value.toLowerCase().includes('true'); - } else if (keyword == TIMEOUT_KEYWORD) { - test.runToTimeout = value.toLowerCase().includes('true'); - } else if (keyword == NET_DESC_KEYWORD) { - if(test.networkConfig.netDescPath != undefined) { - this.log("ERROR: More than one network descriptor provided!"); - } - test.networkConfig.netDescPath = value; - } - } - } - - if(!keywordFound) { - break; - } - } - - // Check valid config - if(test.networkConfig.netDescPath && (test.networkConfig.fogs != 0 || test.networkConfig.devices != 1 || test.networkConfig.cloud)) { - this.log("ERROR: Toaster config has both network descriptor and manual network configuration."); - } - - if(test.networkConfig.netDescPath) { - let netDescToml = fs.readFileSync(test.testFolder + "/" + test.networkConfig.netDescPath); - test.networkConfig.netDesc = toml.parse(netDescToml); - - if('appname' in test.networkConfig.netDesc) { - test.appName = test.networkConfig.netDesc['appname']; - } - } - } -} - -Toaster.prototype.compileTest = async function(test) { - const buildEnv = `${JAMRUNS_DIR}/_toaster_build_env`; - if(!fs.existsSync(buildEnv)) { - fs.mkdirSync(buildEnv); - } - - this.updateTestState(test); - - let cTestPath = `${buildEnv}/${test.baseName}.c`; - let jsTestPath = `${buildEnv}/${test.baseName}.js`; - - let cFileContents = fs.readFileSync(test.cFile, 'utf-8'); - let cTestOutput = fs.openSync(cTestPath, 'w'); - - let jsFileContents = fs.readFileSync(test.jsFile, 'utf-8'); - let jsTestOutput = fs.openSync(jsTestPath, 'w'); - - let coverageMarkers = []; - var coverageUID = 0; - var lineCount = 0; - - - // Roll c-side and j-side processing into one single processor... - - // Process c-side - fs.writeSync(cTestOutput, TOASTER_C_HOOKS); - - let lines = cFileContents.split(/\r?\n/); - let lineIter = lines[Symbol.iterator](); - - var lineResult; - while(!(lineResult = lineIter.next()).done) { - let line = lineResult.value; - - lineCount++; - let regularLine = true; - - this.scanForToasterConfig(test, line, lineIter); - - let commentStart = Number.MAX_SAFE_INTEGER; - if(line.includes("//")) { - commentStart = line.indexOf("//"); - } - - if(line.toLowerCase().includes("error")) { - test.compilerWarnings +=`WARNING: Printing 'Error' to standard out will mark the test as failed! (${lineCount})\n`; - test.compilerWarnings += `--> ${line}\n`; - } - - if(line.includes(ASSERT_IDENTIFIER)) { - regularLine = false; - let start = line.indexOf(ASSERT_IDENTIFIER); - if(start < commentStart) { - let end = findMatchingParens(line, start); - fs.writeSync(cTestOutput, line.substring(0, end)); - fs.writeSync(cTestOutput, `,${lineCount}`); - fs.writeSync(cTestOutput, line.substring(end) + "\n"); - } - } - if(line.includes(COVERAGE_IDENTIFIER)) { - regularLine = false; - let start = line.indexOf(COVERAGE_IDENTIFIER); - - if(start < commentStart) { - let end = findMatchingParens(line, start); - - let currentCoverageID = coverageUID++; - - fs.writeSync(cTestOutput, line.substring(0, end)); - fs.writeSync(cTestOutput, `${currentCoverageID}`); - fs.writeSync(cTestOutput, line.substring(end)+"\n"); - - coverageMarkers.push({ - id: currentCoverageID, - line: lineCount, - covered: false - }); - } - } - if(regularLine) { - fs.writeSync(cTestOutput, line+"\n"); - } - } - - // Process c-side - lineCount = 0; - - lines = jsFileContents.split(/\r?\n/); - lineIter = lines[Symbol.iterator](); - while(!(lineResult = lineIter.next()).done) { - let line = lineResult.value; - - lineCount++; - let regularLine = true; - - this.scanForToasterConfig(test, line, lineIter); - - if(line.toLowerCase().includes("error")) { - test.compilerWarnings +=`WARNING: Printing 'Error' to standard out will mark the test as failed! (${lineCount})\n`; - test.compilerWarnings += `--> ${line}\n`; - } - - let commentStart = Number.MAX_SAFE_INTEGER; - if(line.includes("//")) { - commentStart = line.indexOf("//"); - } - - // TODO: remove this when compiler bug is fixed - if(line.includes(ASSERT_IDENTIFIER)) { - regularLine = false; - let start = line.indexOf(ASSERT_IDENTIFIER); - if(start < commentStart) { - let end = findMatchingParens(line, start); - - let condition = line.substring(start + ASSERT_IDENTIFIER.length, end); - if(condition=="") { - this.log(`\nAssert is missing condition! \\/ (${lineCount})\n--> ${line}`); - } - fs.writeSync(jsTestOutput, line.substring(0, start)); - fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_ASSERT_L); - fs.writeSync(jsTestOutput, condition); - fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_ASSERT_R); - fs.writeSync(jsTestOutput, line.substring(end+2)+"\n"); - } - } - - if(line.includes(COVERAGE_IDENTIFIER)) { - regularLine = false; - let start = line.indexOf(COVERAGE_IDENTIFIER); - if(start < commentStart) { - let end = findMatchingParens(line, start); - - let currentCoverageID = coverageUID++; - - fs.writeSync(jsTestOutput, line.substring(0, start)); - fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_COVERAGE_L); - fs.writeSync(jsTestOutput, `${currentCoverageID}`); - fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_COVERAGE_R); - fs.writeSync(jsTestOutput, line.substring(end+2)+"\n"); - - coverageMarkers.push({ - id: currentCoverageID, - line: lineCount, - covered: false - }); - } - } - if(regularLine) { - fs.writeSync(jsTestOutput, line+"\n"); - } - } - - fs.closeSync(jsTestOutput); - fs.closeSync(cTestOutput); - - test.coverageMarkers = coverageMarkers; - - const compilationStart = Date.now(); - - // Forward preprocessed files into JamC - - let command = 'jamc'; - let args = [ - '-d', - cTestPath, - jsTestPath, - '-o', - `${test.testResultDirectory}/test`]; - - // We should log compiler output in the event of a compiler error. - - //this.writeLog("Compiling... "); - var proc = undefined; - let stdoutLog = ""; - let stderrLog = ""; - - try { - proc = child_process.spawn(command,args, {detached: true});//, {stdio: [0,test.output,test.output]}); - proc.stderr.setEncoding('utf-8'); - proc.stdout.setEncoding('utf-8'); - - - - proc.stdout.on('data', (data)=> { - stdoutLog += data; - }); - - let shouldFail = false; - proc.stderr.on('data', (data)=> { - stderrLog += data; - if(data.toLowerCase().includes("error")) { - shouldFail = true; - } - }); - - await new Promise((resolve)=>{ - proc.stderr.on('close', ()=>{resolve()}); - }); - - if(!fs.existsSync(`${test.testResultDirectory}/test.jxe`) || - shouldFail) { - throw new Error(); - } - - const compilationEnd = Date.now(); - test.compilationDuration = compilationEnd-compilationStart; - - this.setTestState(test,TestState.STARTING); - - test.output.write(stdoutLog); - test.output.write("Stderr Follows: \n"); - test.output.write(stderrLog); - - return true; - } catch(err) { - - test.failDetails = FailDetails.COMPILE_FAILED; - this.setTestState(test,TestState.FAILED); - /*this.log("Failed!");*/ - - test.output.write(stdoutLog); - test.output.write("Stderr Follows: \n"); - test.output.write(stderrLog); - test.output.close(); - //this.log(` Full log can be found at ${test.logFile}`); - - return false; - } - -} - -// NOTE: this a bit hacky at the moment, we are killing the group of the same pid -// as our initial process. Works well consistently so far... Should come back and -// figure out a cleaner way of getting this done. -function killGroup(pgid) { - try { - child_process.execSync(`kill -- -${pgid}`, {stdio:'ignore'}); - } catch (err) { - console.log("Failed to terminate test process."); - } -} - -// Loop through process ID files (use this) -Toaster.prototype.killWorkerTmuxSessions = function() { - - const searchDir = `${os.homedir()}/.jamruns/apps/test_${this.testDirectory}`; - - for(let file of fs.readdirSync(searchDir)) { - let completePath = `${searchDir}/${file}`; - if(fs.lstatSync(completePath).isDirectory()) { - let tmuxid = fs.readFileSync(`${completePath}/tmuxid`, 'utf-8'); - child_process.execSync(`tmux kill-session -t ${tmuxid}`); - } - } -} - -function extractOutputKeywordData(text){ - let start = text.indexOf("#{")+2; - let end = text.indexOf("}#"); - return text.substring(start, end); -} - -Toaster.prototype.processOutput = function (test, data, log, pid) { - if(test.state == TestState.STARTING) { - this.setTestState(test, TestState.RUNNING); - } - - if(typeof data != 'string') { - return; - } - - for(let line of data.split('\n')) { - if (test.state == TestState.PASSED || - test.state == TestState.FAILED) { - return false; - } - - log.write(line+ '\n'); - - // Try to pick up any spurrious errors we may have missed otherwise. - if(line.toLowerCase().includes("error")) { - if(this.conf.ignoreError) { - continue; - } - // NOTE: this is super hacky edge case handling for an already hacky - // way of detecting errors! - if(line.includes("error: 0")) { - continue; - } - test.offendingNodes.push(pid); - test.failDetails = FailDetails.RUNTIME_FAILED; - this.setTestState(test, TestState.FAILED); - return true; - } - - if(line.includes('@')) { - - if(line.includes(TOASTER_ASSERT_KEYWORD)) { - test.assertMessage = extractOutputKeywordData(line); - test.failDetails = FailDetails.TEST_FAILED; - this.setTestState(test, TestState.FAILED); - test.offendingNodes.push(pid); - return true - } else if (line.includes(TOASTER_COVERAGE_KEYWORD)) { - let coverageId = extractOutputKeywordData(line); - for(let marker of test.coverageMarkers) { - if(marker.id == coverageId && - marker.covered == false) { - test.completedCoverageMarkers++; - marker.covered = true; - this.updateTestState(test); - } - } - } - // Test is complete - if(test.completedCoverageMarkers == test.coverageMarkers.length) { - if(!test.runToTimeout) { - this.setTestState(test,TestState.PASSED); - return true; - } - } - } - } - return false; -} - -Toaster.prototype.cleanupResidualTests = function() { - for(let pid of this.testProcesses) { - killGroup(pid); - } - this.testProcesses.clear(); -} - -Toaster.prototype.executeTest = async function(test, - machType, - tags=undefined, - data=undefined, - shouldHost=undefined, - loc=undefined, - edge=undefined) { - let command = `jamrun` - let args = [ - `${test.testResultDirectory}/test.jxe`, - `--app=${test.appName}`, - //"--log", - "--disable-stdout-redirect"]; - - if(machType==NODETYPE_FOG) { - args.push("--fog"); - } else if (machType==NODETYPE_DEVICE) { - args.push(`--num=${test.networkConfig.workers}`); - } else if (machType==NODETYPE_CLOUD) { - args.push("--cloud"); - } - - if(tags) { - args.push("--tags="+tags); - } - if(data) { - args.push("--data="+data); - } - if(shouldHost && machType==NODETYPE_FOG) { - args.push("--local_registry"); - } - if(loc) { - args.push(`--loc=${loc.long},${loc.lat}`) - } - if(edge) { - args.push("--edge="+edge); - } - if(this.conf.local) { - args.push("--local"); - } - - if(this.conf.valgrind) { - args.push("--valgrind"); - } - - let that = this; - var timeout; - - function cleanup() { - // In the case where timeout is never set - if(!that.conf.noTimeout) { - clearTimeout(timeout); - } - - const testEndTime = Date.now(); - test.runDuration = testEndTime-testStartTime; - try { - if(test.failDetails != FailDetails.CRASH_FAILED || - test.failDetails != FailDetails.LAUNCH_FAILED) { - killGroup(testProcess.pid); // Not entirely sure why this works... - } - test.logFiles.get(testProcess.pid).close(); - that.testProcesses.delete(testProcess.pid); - } catch(e){ that.log(e); } - } - - const testStartTime = Date.now(); - - // We should log compiler output in the event of a compiler error. - let testProcess = child_process.spawn(command, args, {shell: false, detached: true}); - let pid = testProcess.pid; - this.testProcesses.add(pid); - //let log = fs.openSync(`${test.testResultDirectory}/${testProcess.pid}.txt`, 'w'); - let log = fs.createWriteStream(`${test.testResultDirectory}/${machType}_${testProcess.pid}.txt`); - test.logFiles.set(pid, log); - - if(!this.conf.noTimeout) { - var timeout = setTimeout(()=>{ - if(test.state == TestState.STARTING) { - test.failDetails = FailDetails.LAUNCH_FAILED; - that.setTestState(test, TestState.FAILED); - test.offendingNodes.push(pid); - this.testProcesses.delete(pid); - cleanup(); - } - if(test.state == TestState.RUNNING) { - if(test.coverageMarkers.length != test.completedCoverageMarkers) { - test.failDetails = FailDetails.TEST_FAILED; - that.setTestState(test, TestState.FAILED); - test.offendingNodes.push(pid); - } else { - that.setTestState(test, TestState.PASSED); - } - cleanup(); - } - }, this.timeoutAmount); - } - - testProcess.stdout.setEncoding('utf-8'); - testProcess.stderr.setEncoding('utf-8'); - - testProcess.stdout.on('data', (data) => { - if(that.conf.verbose) { - process.stdout.write(data); - } - if(that.processOutput(test, data, log, pid)) { - cleanup(); - } - }); - - testProcess.stderr.on('data', (data) => { - if(test.state == TestState.RUNNING) { - log.write(`STDERR: ${data}`); - if(that.processOutput(test, data, log, pid)) { - cleanup(); - } - } - }); - - await new Promise((resolve) => { - testProcess.on('close', () => { - - if(test.state == TestState.RUNNING) { - // Crash - test.failDetails = FailDetails.CRASH_FAILED; - that.setTestState(test, TestState.FAILED); - that.testProcesses.delete(pid); - test.offendingNodes.push(pid); - } else if(test.state == TestState.STARTING) { - test.failDetails = FailDetails.LAUNCH_FAILED - that.setTestState(test, TestState.FAILED); - test.offendingNodes.push(pid); - } - if(this.testProcesses.size) { - let report = that.generateReport(test); - test.output.write(`\n\n\n${report}`); - } - resolve(); - }); - }); -} - -Toaster.prototype.generateReport = function(test) { - var reportMessage = ""; - if(test.state == TestState.PASSED) { - reportMessage = `Test: ${test.testName} Completed Succesfully\n`+ - `Time to Compile: ${test.compilationDuration/1000.0}s\n` + - `Time to Run Test: ${test.runDuration/1000.0}s\n`; - } else if (test.state == TestState.FAILED) { - reportMessage = `Test: ${test.testName} Failed\n`+ - `Time to Compile: ${test.compilationDuration/1000.0}s\n` + - `Time to Run Test: ${test.runDuration/1000.0}s\n` + - `Reached ${test.completedCoverageMarkers} coverage markers out of ${test.coverageMarkers.length}\n`; - if(test.completedCoverageMarkers != test.coverageMarkers.length) { - for(let marker of test.coverageMarkers) { - if(!marker.covered) { - reportMessage += ` Missed coverage marker on line ${marker.line}\n` - } - } - } - } - return reportMessage; -} - -Toaster.prototype.testAll = async function () { - this.startTime = Date.now(); - - for(let test of this.tests) { - this.currentTest++; - - await this.runTest(test); - } - - let endTime = Date.now(); - this.finalReport(endTime-this.startTime); - process.exit(1); -} - -Toaster.prototype.runTest = async function (test) { - this.writeLog('\n'); - - fs.mkdirSync(test.testResultDirectory, {recursive: true}); - - test.output = fs.createWriteStream(`${test.testResultDirectory}/jlog.txt`); - - // The directory could be included in the test object, that would make more sense - if(!await this.compileTest(test)) { - return; - } - - //console.log(test.networkConfig); - - let sleep = 750; - - // Resume as soon as one of these exits. - await new Promise( async (resolve) => { - if(test.networkConfig.netDesc) { - let netDesc = test.networkConfig.netDesc; - if('cloud' in netDesc) { - this.executeTest(test, - NODETYPE_CLOUD, - netDesc['cloud']['tags'], - netDesc['cloud']['data'] - ).then(()=>{resolve()}); - await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); - } - - if('fog' in netDesc) { - for (let fog of netDesc['fog']) { - this.executeTest(test, - NODETYPE_FOG, - fog['tags'], - fog['data'], - fog['hostLocalRegistry'], - fog['loc'] - ).then(()=>{resolve()}); - await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); - } - } - - if('device' in netDesc) { - for (let device of netDesc['device']) { - this.executeTest(test, - NODETYPE_DEVICE, - device['tags'], - device['data'], - false, - device['loc'], - device['edge'] - ).then(()=>{resolve()}); - await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); - } - } - } else { - if(test.networkConfig.cloud) { - this.executeTest(test, NODETYPE_CLOUD).then(()=>{resolve()}); - await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); - } - for(let _ = 0; _ < test.networkConfig.fogs; _++){ - this.executeTest(test, NODETYPE_FOG).then(()=>{resolve()}); - await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); - } - - for(let _ = 0; _ < test.networkConfig.devices; _++){ - this.executeTest(test, NODETYPE_DEVICE).then(()=>{resolve()}); - await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); - } - } - - }); - - this.cleanupResidualTests(); - - test.output.close(); -} - -Toaster.prototype.finalReport = function(duration) { - const total = this.tests.length; - let passed = 0; - - let allTestsFinished = true; - - for(let test of this.tests) { - if(test.state == TestState.PASSED) { - passed++; - } - // COMPILING is the initial state. - // Could refactor to make that more clear to be honest. - if(test.state == TestState.COMPILING) { - allTestsFinished = false; - } - } - - let exitText = `\n\n${allTestsFinished ? "All Tests Finished" : "Not All Tests Finished"} (${passed}/${total}) in ${duration/1000}s`; - - if(passed == total) { - exitText = ansiiGreen(exitText); - } else if (!passed) { - // oopsies... - exitText = ansiiRed(exitText); - } - - this.log(exitText); - - this.log(`Toaster Log: ${this.resultDirectory}/log.txt`); - - if(passed != total) { - this.log("Logs of Failed Tests:"); - for(let test of this.tests) { - if(test.state == TestState.FAILED) { - this.log(`${ansiiRed(test.testName)} ${" ".repeat(Math.max(0,20-test.testName.length))} ${test.logFile}`); - for(let node of test.offendingNodes) { - this.log(`${" ".repeat(20)} ${test.logFiles.get(node).path}`); - } - } - } - } - - if(this.logFile) { - fs.close(this.logFile); - this.logFile = undefined; - } -} - -function processArgs() { - let args = process.argv.slice(2); - let conf = { - testDirectory: undefined, - singleTest: false, - timeoutAmount: undefined, - noTimeout: false, - verbose: false, - local: false, - valgrind: false - }; - - for (var i = 0; i < args.length; i++) { - if (args[i].charAt(0) === "-") { - if (args[i] === "-t" || args[i] === "--timeout") { - conf.timeoutAmount = parseInt(args[i+1]); - if(Number.isNaN(conf.timeoutAmount)) { - console.error("Unable to parse timeout duration: "+args[i+1]); - conf.timeoutAmount = undefined; - } - i++; - } else if (args[i] === "-h" || args[i] === "--help") { - console.log(USAGE); - process.exit(); - } else if (args[i] === "-v" || args[i] === "--verbose") { - conf.verbose = true; - } else if (args[i] === "-nt" || args[i] === "--no-timeout") { - conf.noTimeout = true; - } else if (args[i] === "-l" || args[i] === "--local") { - conf.local = true; - } else if (args[i] === "-i" || args[i] === "--ignore-error") { - conf.ignoreError = true; - } else if (args[i] === "-va" || args[i] === "--valgrind") { - conf.valgrind = true; - } - } else { - let inputPath = args[i]; - if(conf.testDirectory != undefined) { - console.log("Can only provide one test folder!"); - process.exit(); - } - - if(fs.existsSync(inputPath)) { - conf.testDirectory = inputPath; - } else if (fs.existsSync(inputPath + ".js")){ - conf.testDirectory = inputPath; - conf.singleTest = true; - } else { - console.log(`Folder/Test '${inputPath}' Doesn't Exist.`); - } - } - } - - return conf; -} - -let toaster = new Toaster(processArgs()); -toaster.setupTestingEnvironment(); -toaster.scanTests(); -toaster.testAll(); diff --git a/tools/jamvis b/tools/jamvis deleted file mode 100755 index ef107d24e..000000000 --- a/tools/jamvis +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -JAMVis, a visualizer for JAMScript Networks. - -JAMVis works by running starting a webserver on the same machine that the global registry runs on. It recursively scans all brokers by looking through all registries advertised accross the network. All network state is passively monitered and visualized. - -Comand Line Options: ---help Shows this message ---app={appname} Selects which app JAMVis should target (REQUIRED) ---batch Batches JAMScript command events to reduce websocket traffic. ---remote={host} Starts JAMVis webserver on remote host through ssh remote command execution and tunneling. Remote host must have JAMScript installed. - -Web interface: -By default the port the website gets hosted on is :8580. - -click and drag to look. -scroll to zoom. - -'h' toggles visibility of text on screen -'c' toggles visibility of device-fog connections -'l' toggles visibility of local registry connections - -EOF -} -batch=false -while :; do - case $1 in - --help) - show_usage - exit - ;; - --batch) - batch=true - ;; - --app=?*) - app=${1#*=} - ;; - --remote=) - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - --remote=?*) - remote=${1#*=} - ;; - --remote=) - die 'ERROR: "--remote" requires a non-empty option argument.' - ;; - *) - break - esac - shift -done - -if [ -z "$remote" ]; then - node $SCRIPT_DIR/jamvis_internal/serv.js $app $batch - #open "localhost:8580" -else - echo "Connecting to remote." - #(sleep 3 && open "http://localhost:8580") & - ssh -t -t -L 8580:localhost:8580 -L 8681:localhost:8681 $remote ". ~/.bashrc && jamvis --app=$app" -fi - - diff --git a/tools/jamvis_internal/serv.js b/tools/jamvis_internal/serv.js deleted file mode 100644 index d293e3495..000000000 --- a/tools/jamvis_internal/serv.js +++ /dev/null @@ -1,303 +0,0 @@ -#!/usr/bin/env node - -const express = require('express'), - child_process = require('child_process'), - fs = require('fs'), - ws = require('ws'), - process = require('process'), - merc = require('mercator-projection'), - cbor = require('cbor-x'), - mqtt = require('mqtt'); - -const app = express(); - -const port = 8580; -var app_name = 'jt1'; -var batch = false; - -///////////////////// -// MQTT Management // -///////////////////// - -/// Try to conenct to local host -const global_broker = connect_global_broker(); - -///var brokers = []; -var node_map = new Map(); - -function connect_global_broker() { - const global_broker = mqtt.connect("mqtt://127.0.0.1:18830"); - - global_broker.on('error', (error) => { - if (error.code == 'ECONNREFUSED') { - console.log("Couldn't establish a connection to the global registry."); - global_broker.end(); - process.exit(); - } else { - console.log(error); - } - }); - - global_broker.on("connect", () => { - global_broker.subscribe(`${app_name}/local_registry/#`, (error) => { - if(error) { - console.log("Error doing Subscription for global registry: "+error.toString()); - } - }); - }); - - global_broker.on("message", (topic, message) => { - mqtt_message_handler(topic, message); - }); - - return global_broker; -} - -function connect_broker(url, port) { - const broker = mqtt.connect(`mqtt://${url}:${port}`); - - broker.on('error', (error) => { - console.log(error); - }); - - broker.on('connect', () => { - // EVERYTHING!!!! - broker.subscribe(`#`, (error) => { - if(error) { - console.log("Error doing Subscription for global registry: "+error.toString()); - } - }); - }); - - broker.on('message', mqtt_message_handler); - return broker; -} - -function register_broker(online_message, node_id, mach_type) { - console.log("Tracking New Node: "+node_id); - let internal_mach_type = mach_type; - let local_registry = false; - - console.log(mach_type); - if(mach_type == 'local_registry') { - internal_mach_type = 'fog'; - local_registry = true; - } - - let entry = { - broker: connect_broker(online_message.ip, online_message.port), - node_id: String(node_id), - loc: online_message.loc, - mach_type: internal_mach_type, - local_registry: local_registry, - connections: [] - }; - - node_map.set(node_id, entry); - update_node_view(entry); -} - -function handle_message_transport(message_data) { - let data = cbor.decode(message_data); - // receiver/sender is not consistently correct at the moment. - - update_transport_view({ - receiver: String(data.nodeid), - sender: String(data.oldid), - task_id: String(data.taskid) - }); -} - -function mqtt_message_handler(topic, message_text) { - let topic_levels = topic.split('/'); - let mach_type = topic_levels[1]; - let node_id = topic_levels[2]; - let message_type = topic_levels[3]; - - // For now... - if(topic.charAt(0) == '/') { - handle_message_transport(message_text); - return; - } - - if(message_text == "") - return; - - try { - - var message = JSON.parse(message_text); - } catch(e) { - console.log("Failed to parse message..."); - return; - } - - // TODO: handle local registry unhost - if(message_type == 'status') { - if(message.payload == 'offline') { - if(mach_type == 'local_registry') { - let node = node_map.get(node_id); - if(!node) - return; - node.local_registry = false; - } else { - node_map.delete(node_id); - } - - } else if (!node_map.has(node_id)) { - register_broker(message.payload, node_id, mach_type); - } - } else if (message_type == 'curLoc') { - let node = node_map.get(node_id); - if(node == undefined) - return; - node.loc['long'] = message.payload['long']; - node.loc['lat'] = message.payload['lat']; - update_node_view(node); - } else if (message_type == '_debug_selfHost') { // TODO: this seems useless now - let node = node_map.get(node_id); - if(node == undefined) - return; - - node.local_registry = message.payload; - - } else if (message_type == '_debug_conns') { - let node = node_map.get(node_id); - if(node == undefined) - return; - node.connections = message.payload; - update_node_view(node); - } -} - -function transform_coords(loc) { - let xy = merc.fromLatLngToPoint({lat: loc['lat'], lng: loc['long']}); - let adjusted_xy = {x: xy.x/256.0, y: (xy.y/256.0)+0.5}; - return adjusted_xy; -} - -function update_node_view(node) { - let xy = merc.fromLatLngToPoint({lat: node.loc['lat'], lng: node.loc['long']}); - let adjusted_xy = {x: xy.x/256.0, y: (xy.y/256.0)+0.5}; - - let relevant_info = { - node_id: node.node_id, - loc_proj: adjusted_xy, - loc: node.loc, - mach_type: node.mach_type, - local_registry: node.local_registry, - connections: node.connections - }; - - let pack = { - type: 'state', - data: relevant_info - }; - websocketSend(JSON.stringify(pack)); -} - -var transport_update_queue = [] - -// for now, TODO: add more information from here -function update_transport_view(event_data) { - let pack = { - type: 'event', - data: event_data - }; - if(batch) { - transport_update_queue.push(event_data); - } else { - websocketSend(JSON.stringify(pack)); - } -} - -function dump_transport_view_batch() { - let pack = { - type: 'event-batch', - data: transport_update_queue - } - websocketSend(JSON.stringify(pack)); - transport_update_queue = [] -} - -////////////////////////// -// Websocket Management // -////////////////////////// - -const websocket_server = new ws.WebSocketServer({port:8681 }); - -var websockets = []; - -function location_average() { - - var acc = {x: 0, y: 0}; - for(var node_entry of node_map) { - var node = node_entry[1]; - var pos = transform_coords(node.loc); - acc = { - x: acc.x + pos.x, - y: acc.y + pos.y - }; - } - return {x: acc.x/node_map.size, - y: acc.y/node_map.size}; -} - -function websocketSend(message) { - for(var websocket of websockets) { - websocket.send(message); - } -} - -websocket_server.on('error', (err)=>{console.error("WS: "); console.error(err)}); -websocket_server.on('connection', function(websocket) { - console.log("Someone Connected to the websocket."); - websockets.push(websocket); - - let pack = { - type: 'viewport', - data: location_average() - }; - websocket.send(JSON.stringify(pack)); - - // Bring websocket up to date - for(var node_entry of node_map) { - var node = node_entry[1]; - update_node_view(node); - } -}); - - -//////////////////// -// Initialization // -//////////////////// - -let args = process.argv.slice(2); -app_name = args[0]; -batch = args[1] == 'true'; -if(batch) { - console.log("Sending Batched Message Transport Packets."); - setInterval(()=>{dump_transport_view_batch()}, 500) -} - - -///////////////////// -// Website Hosting // -///////////////////// - -const raw_html = ` - - -`; - -app.get('/', (req, res) => { - res.send(raw_html); -}); - -app.get('/sketch.js', (req, res) => { - let sketch = fs.readFileSync(`${__dirname}/view.js`, {encoding: 'utf8', flag: 'r' }); - res.send(sketch); -}); - -app.listen(port, () => { - console.log(`JAMVis Webserver listening on port ${port}`); -}); diff --git a/tools/jamvis_internal/view.js b/tools/jamvis_internal/view.js deleted file mode 100644 index 59add156b..000000000 --- a/tools/jamvis_internal/view.js +++ /dev/null @@ -1,603 +0,0 @@ - -let node_map = new Map(); -let fogs = []; -let devices = []; -var view_scale = 750; -var viewport_pos = {x:0,y:0}; -var view_offset = {x:0,y:0}; - -let app, graphics; - -let dragging = false; -let drag_start = {x:0,y:0}; -var view_offset_drag_start = {x:0,y:0}; - -var remote_calls_observed = 0; - -var remote_calls_last_sec = 0; -var remote_calls_this_sec = 0; - -var bounding_boxes = []; -var selected_node = undefined; - -var hide_text = false; -var show_lr_conn = false; -var show_conn = true; -var show_trails = false; -var trail_mode = 0; - - -const DEFAULT_LINE_COLOUR = {r:100, g:50, b:50}; -const SIGNAL_LINE_COLOUR = {r:255, g:50, b:50}; -const SELECTED_LINE_COLOUR = {r: 150, g: 150, b: 150}; -const SELECTED_SIGNAL_LINE_COLOUR = {r: 255, g: 255, b: 255}; -const LR_LINE_COLOUR = {r: 50, g: 100, b: 70}; -const LR_SIGNAL_LINE_COLOUR = {r: 50, g: 255, b: 255}; - -const FOG_COLOUR = {r: 14,g:149,b:148}; -const DEVICE_COLOUR = {r: 245,g:84,b:45}; -const LR_COLOUR = {r: 255,g:255,b:255}; - -const TRAIL_COLOUR = {r: 150,g:150,b:150}; - -const TRAIL_MAX = 40; - -const TRAIL_LEN1 = 5; -const TRAIL_LEN2 = 15; - - -const style_large = new PIXI.TextStyle({ - fontFamily: 'Times New Roman', - fontSize: 36, - fill: "White" -}); - -const style_medium = new PIXI.TextStyle({ - fontFamily: 'Times New Roman', - fontSize: 24, - fill: "White" -}); - -function scalarAddition(vec2, scale) { - return {x: vec2.x+scale, y: vec2.y+scale}; -} - -var ui_cache = new Map(); -function render_text(app, desc, text_content, offset) { - let text = undefined; - if(ui_cache.has(desc)) { - text = ui_cache.get(desc); - } else { - text = new PIXI.Text(text_content, style_medium); - text.should_visible = true; - ui_cache.set(desc,text); - text.x = 40; - app.stage.addChild(text); - } - - if(hide_text) { - text.visible = false; - } else { - text.visible = text.should_visible; - } - - if(!text.visible) - return offset; - - text.text = text_content; - text.y = offset; - - return offset + 35; -} - -function text_visible(app, desc, state) { - if(!ui_cache.has(desc)) { - console.log("Couldn't find text with descriptor: "+desc); - return; - } - var text = ui_cache.get(desc); - text.should_visible = state; - if(hide_text) { - text.visible = false; - } else { - text.visible = text.should_visible; - } -} - -function init_ui(app) { - - var y = 40; - - var text = new PIXI.Text("JAMVis", style_large); - text.x = 40; - text.y = y; - - app.stage.addChild(text); -} - - -function update_ui() { - y = 90 - if(selected_node) { - y = render_text(app, 'selected_node', `Selected Node: ${selected_node.data.node_id}`, y); - y = render_text(app, 'selected_node_lat', `Latitude: ${selected_node.data.loc['lat']}`, y); - y = render_text(app, 'selected_node_long', `Longitude: ${selected_node.data.loc['long']}`, y); - } - y = render_text(app, 'remote_commands_ps', `Commands Per Second: ${remote_calls_last_sec}`, y); - y = render_text(app, 'remote_commands', `Total Commands: ${remote_calls_observed}`, y); - y = render_text(app, 'devices', `Devices: ${devices.length}`, y); - y = render_text(app, 'fogs', `Fogs: ${fogs.length}`, y); -} - -function setup() { - let Application = PIXI.Application; - let Sprite = PIXI.Sprite; - let Assets = PIXI.Assets; - let Ticker = PIXI.Ticker; - - app = new Application({width: window.innerWidth, - height: window.innerHeight, - resolution: 1, - antialias:true}); - document.body.appendChild(app.view); - graphics = new PIXI.Graphics(); - app.stage.addChild(graphics); - - init_ui(app); - - const socket = new WebSocket(`ws://localhost:8681`); - socket.addEventListener('message', (event) => websocket_receive(event)); - - // Event Handlers - window.addEventListener("resize", function() { - resize(app); - }); - - document.addEventListener("wheel", (event) => { - let delta = event.deltaY/8*view_scale*0.001; - view_scale -= delta; - }); - - - document.addEventListener("keydown", (event) => { - handle_key(event); - }); - - - document.addEventListener("mousedown", (event) => { - if(handle_click(app, event)) { - dragging = true; - drag_start = {x: event.screenX, y: event.screenY}; - view_offset_drag_start = viewport_pos; - } - }); - - document.addEventListener("mouseup", (event) => { - dragging = false; - }); - - document.addEventListener("mouseleave", (event) => { - dragging = false; - }); - - document.addEventListener("mousemove", (event) => { - if(!dragging) - return; - - let current_delta = {x: drag_start.x - event.screenX, - y: drag_start.y - event.screenY}; - - viewport_pos = {x: view_offset_drag_start.x + current_delta.x/view_scale, - y: view_offset_drag_start.y + current_delta.y/view_scale}; - }); - - let shared_ticker = Ticker.shared; - shared_ticker.add((delta) => update(delta)); -} - -function handle_key(event) { - console.log(event); - if(event.key == 'h') { - hide_text = !hide_text; - } else if(event.key == 'l') { - show_lr_conn = !show_lr_conn; - } else if(event.key == 'c') { - show_conn = !show_conn; - } else if(event.key == 't') { - trail_mode++; - trail_mode = trail_mode % 4; - } -} - - -// returns true if its a drag event -function handle_click(app, event) { - for(var box of bounding_boxes) { - if(box.left < event.clientX && - event.clientX < box.right && - box.top < event.clientY && - event.clientY < box.bottom) { - - selected_node = box.node; - text_visible(app, 'selected_node', true); - text_visible(app, 'selected_node_long', true); - text_visible(app, 'selected_node_lat', true); - - return false; - } - } - if(selected_node) { - text_visible(app, 'selected_node', false); - text_visible(app, 'selected_node_long', false); - text_visible(app, 'selected_node_lat', false); - console.log("bro"); - } - selected_node = undefined; - - return true; -} - -let resizeTimer = undefined; -function resize(app) { - if(resizeTimer) { - clearTimeout(resizeTimer); - } - resizeTimer = setTimeout(()=>{ - app.renderer.resize(window.innerWidth, window.innerHeight); - resizeTimer = undefined; - },100); -} - -function websocket_receive(event) { - let pack = JSON.parse(event.data); - if (pack.type === 'event') { - handle_transport_event(pack.data); - } else if (pack.type === 'event-batch') { - for(var item of pack.data) { - handle_transport_event(item); - } - } else if (pack.type === 'state') { - handle_mqtt(pack.data); - } else if (pack.type === 'viewport') { - handle_viewport_update(pack.data); - } -} - -function handle_viewport_update(data) { - console.log(data); - viewport_pos = data; -} - -function handle_transport_event(data) { - remote_calls_observed++; - remote_calls_this_sec++; - - let task_id = data.task_id; - - var device = undefined; - var other = undefined - let sender = node_map.get(data.sender); - let receiver = node_map.get(data.receiver); - - if(sender == undefined || receiver == undefined) { - return; - } - - if(sender.data.mach_type == 'device') { - device = sender; - other = receiver - } - - if(receiver.data.mach_type == 'device') { - if(device) { - console.log("Invalid Thing????!?!?!?!"); - return; - } - device = receiver; - other = sender; - } - - if(device == undefined) - return; - - device.graphics.signals[other.data.node_id] = 1; -} - -function handle_mqtt(message) { - - if(!node_map.has(message.node_id)) { - switch(message.mach_type) { - case 'device': - devices.push(message.node_id); - break; - case 'fog': - fogs.push(message.node_id); - break; - } - - node_map.set(message.node_id, { - graphics: { - pos: { - x: message.loc_proj.x, - y: message.loc_proj.y - }, - locs: new Array(TRAIL_MAX), - loc_off: 0, - signals: {} - }, - data: message - }); - } - - let node = node_map.get(message.node_id); - - // Unfortunate hack for now... - if(node.data.loc_proj.x !== message.loc_proj.x || - node.data.loc_proj.y !== message.loc_proj.y){ - node.graphics.locs[node.graphics.loc_off % TRAIL_MAX] = node.data.loc_proj; - node.graphics.loc_off++; - } - - node.data = message; -} - -function transform_pos(pos) { - return {x: (pos.x - viewport_pos.x)*view_scale + window.innerWidth/2, - y: (pos.y - viewport_pos.y)*view_scale + window.innerHeight/2}; -// return {x: pos.x*view_scale+view_offset.x, -// y: pos.y*view_scale+view_offset.y}; -} - -function corner_from_center(pos, size) { - return {x: pos.x - size/2, - y: pos.y - size/2}; -} - -function center_of_square(pos, size) { - return {x: pos.x + size/2, - y: pos.y + size/2}; -} - -function lerp(v0, v1, a) { - return v0 + a * (v1 - v0); -} - -function lerp_colour(col1, col2, a) { - return {r: lerp(col1.r, col2.r, a), - g: lerp(col1.g, col2.g, a), - b: lerp(col1.b, col2.b, a)}; -} - -function get_past_loc(node, index) { - return node.graphics.locs[(node.graphics.loc_off+index) % TRAIL_MAX]; -} - -const rect_size = 20 - -function render_trace() { - // Trace Pass - - - let default_line_style = { - width: 5, - color: TRAIL_COLOUR - }; - let len = 0; - switch(trail_mode) { - case 1: - len = TRAIL_LEN1; - break; - case 2: - len = TRAIL_LEN2; - break; - case 3: - len = TRAIL_MAX; - break; - } - - - graphics.lineStyle(default_line_style); - -// let diff = TRAIL_MAX-len; - - for(var device of devices) { - var node = node_map.get(device); - for(var i = 0; i < len; i++) { - var loc = get_past_loc(node,i-len); // a bit of a hack - - if(i!=(len-1)) { - var next_loc = get_past_loc(node,i-len+1); - } else { - var next_loc = node.data.loc_proj; - } - - if(loc === undefined || next_loc === undefined) - continue; - - var pos = transform_pos(loc); - var next_pos = transform_pos(next_loc); - - graphics.moveTo(pos.x, pos.y); - graphics.lineTo(next_pos.x, next_pos.y); - - } - - } -} - -function render(delta) { - graphics.clear(); - - let default_line_colour = DEFAULT_LINE_COLOUR; - let default_line_style = { - width: 2, - color: default_line_colour - }; - - let signal_line_colour = SIGNAL_LINE_COLOUR; - - graphics.lineStyle(default_line_style); - var width = 2; - - // Connection Pass - for(var device of devices) { - var node = node_map.get(device); - var pos = transform_pos(node.graphics.pos); - - for(var node_id of node.data.connections) { - var conn_node = node_map.get(node_id); - if(conn_node == undefined) - continue; - - if(conn_node.data.local_registry) { - if(show_lr_conn) { - var reset = true; - default_line_colour = LR_LINE_COLOUR - signal_line_colour = LR_SIGNAL_LINE_COLOUR - graphics.lineStyle({ - width: 2, - color: default_line_colour - }); - } else { - continue; - } - } else if(!show_conn) { - // This might be a little weird as the reset never gets hit. - - // Im thinking that it shouldn't matter though - continue; - } - - if(conn_node == selected_node || - node == selected_node) { - var reset = true; - default_line_colour = SELECTED_LINE_COLOUR - signal_line_colour = SELECTED_SIGNAL_LINE_COLOUR - width = 3; - graphics.lineStyle({ - width: width, - color: default_line_colour - }) - } - - let signal = node.graphics.signals[node_id]; - if(signal) { - var reset = true; - graphics.lineStyle({ - width: width, - - color: lerp_colour(default_line_colour, signal_line_colour, Math.pow(signal, 0.5)) - }) - } - - var conn_pos = transform_pos(conn_node.graphics.pos); - - graphics.moveTo(pos.x, pos.y); - graphics.lineTo(conn_pos.x, conn_pos.y); - - if(reset) { - default_line_colour = DEFAULT_LINE_COLOUR; - signal_line_colour = SIGNAL_LINE_COLOUR; - graphics.lineStyle(default_line_style); - width = 2; - - } - } - } - - - if(trail_mode) - render_trace(); - - graphics.lineStyle({ - width: 0, - color: 0 - }); - - - // Local Registry Pass - graphics.beginFill(LR_COLOUR); - - for(var fog of fogs) { - var node = node_map.get(fog); - if(!node.data.local_registry) { - continue; - } - - let pos = corner_from_center(transform_pos(node.graphics.pos), rect_size); - - graphics.drawRect(pos.x-2, pos.y-2, rect_size+4, rect_size+4); - } - graphics.endFill(); - - // Fog Pass - graphics.beginFill(FOG_COLOUR); - for(var fog of fogs) { - var node = node_map.get(fog); - - let pos = corner_from_center(transform_pos(node.graphics.pos), rect_size); - - graphics.drawRect(pos.x, pos.y, rect_size, rect_size); - } - graphics.endFill(); - - // Device Pass - graphics.beginFill(DEVICE_COLOUR); - for(var device of devices) { - var node = node_map.get(device); - - let pos = corner_from_center(transform_pos(node.graphics.pos), rect_size); - - graphics.drawRect(pos.x, pos.y, rect_size, rect_size); - } - graphics.endFill(); - -} - -var last_sec = Date.now(); - -function update(delta) { - - if(last_sec + 1000 <= Date.now()) { - last_sec = Date.now(); - remote_calls_last_sec = remote_calls_this_sec; - remote_calls_this_sec = 0; - } - - var new_bounding_boxes = []; - - // Animate Location Changes - for(var node_entry of node_map) { - var node = node_entry[1]; - - var dx = node.data.loc_proj.x - node.graphics.pos.x; - var dy = node.data.loc_proj.y - node.graphics.pos.y; - - node.graphics.pos.x += dx * 0.25 * delta; - node.graphics.pos.y += dy * 0.25 * delta; - - var screen_pos = transform_pos(node.graphics.pos); - - new_bounding_boxes.push({ - node: node, - top: screen_pos.y-10, - bottom: screen_pos.y+10, - left: screen_pos.x-10, - right: screen_pos.x+10, - }); - - for(var signal_node_id in node.graphics.signals) { - node.graphics.signals[signal_node_id] -= 0.05 * delta; - if(node.graphics.signals[signal_node_id] <= 0) { - delete(node.graphics.signals[signal_node_id]); - } - } - } - bounding_boxes = new_bounding_boxes; -// console.log(bounding_boxes); - - update_ui(); - render(); -} - -setup(); diff --git a/tools/jrun b/tools/jrun deleted file mode 100755 index 367b06abd..000000000 --- a/tools/jrun +++ /dev/null @@ -1,388 +0,0 @@ -#!/bin/bash - -IDIR="${BASH_SOURCE%/*}" -if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi -source "$IDIR/inc/misc_tools.sh" - -# Edit the following locations to provide the -MOSQUITTO=`which mosquitto` -if [ -z $MOSQUITTO ]; then - MOSQUITTO=/usr/local/sbin/mosquitto -fi -MOSQUITTO_PUB=`which mosquitto_pub` -if [ -z $MOSQUITTO_PUB ]; then - MOSQUITTO_PUB=/usr/local/bin/mosquitto_pub -fi - - -# No need to edit below this line unless you find a bug! - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - -show_usage() { - cat << EOF -jrun program.jxe -Runs only the J node of a device with program.jxe -under the application name 'testapp'. To run under a different -app name X, use the --app=X option. Use the --fog option to run at the -J node at the fog level or --cloud option to run at the cloud level. - -By default, jrun uses a Redis server running at 127.0.0.1:6379 as the -data store. The Redis server needs to be started before launching the -application. To use a different Redis server use the --data option like -the following command using a Redis at local port 7000. - -jrun program.jxe --data=127.0.0.1:7000 - -To provide a set of tags to the program, use the following command. -jrun program.jxe --tag="param1, param2" - -Usage: runj file.jxe [--app=appl_name] [--fog|--cloud] - [--data=data-url] - [--tags=quoted_list_of_tags] - [--group=group_name] - -The jrun command creates a run state in the $HOME/__jamrun folder. -EOF -} - - -writegroup() { - - local port=$1 - local gname=$2 - - if [ ! -e $port ]; then - mkdir $port - fi - echo $gname > $port/group -} - -checkmosquitto() { - - # Check the required commands.. - if [ ! -e $MOSQUITTO ]; then - die "Mosquitto MQTT broker $MOSQUITTO not found. Set new location." - fi - if [ ! -e $MOSQUITTO_PUB ]; then - die "Mosquitto tools $MOSQUITTO_PUB not found. Set new location." - fi - if [ ! -e $TMUX ]; then - die "terminal multiplexor $TMUX not found. Set new location." - fi -} - -startmqtt() { - local port=$1 - - # Check whether the MQTT server is running.. if not start it - $MOSQUITTO_PUB -p $port -t "test" -m "hello" - if [ $? -ne 0 ]; then - echo "MQTT is not running at $port" - echo "Attempting to start MQTT at $port" - $MOSQUITTO -p $port & - fi -} - -startredis() { - - # Start redis with no protected-mode and at the port - echo -e "port $1\nprotected-mode no" | redis-server - & -} - -waitforredis() { - local port=$1 - - while : ; do - local present=`ps ax | grep redis-server | grep $port | wc -l` - if [ $present == "1" ]; then - break - fi - sleep 1 - done -} - - -resolvedocker() { - local name=$1 - - local host="${name%:*}" - local port="${name##*:}" - - startredis $port - waitforredis $port - - if [ $host == "docker" ]; then - local ipaddr=`hostname -I` - name=$ipaddr:$port - fi - # trim space left behind by hostname -I - data=$(echo $name | tr -d '[:space:]') -} - - -dojamout() { - dojamout_p1 $1 $2 $3 - dojamout_p2 $1 $2 $3 -} - - -dojamout_p1() { - local type=$1 - local pnum=$2 - local floc=$3 - - startmqtt $pnum - echo $data > $floc/$pnum/dataStore - echo "process" > $floc/$pnum/class - echo $SHELLPID > $floc/$pnum/shellpid - echo "new" > $floc/$pnum/processId -} - - - -dojamout_p2() { - local type=$1 - local pnum=$2 - local floc=$3 - - case $type in - cloud) - if [ -z "$tags" ]; then - node jamout.js --app=$app --cloud --port=$pnum --data=$data - else - node jamout.js --app=$app --cloud --port=$pnum --data=$data --tags=$tags - fi - ;; - fog) - if [ -z "$tags" ]; then - node jamout.js --app=$app --fog --port=$pnum --data=$data - else - node jamout.js --app=$app --fog --port=$pnum --data=$data --tags=$tags - fi - ;; - device) - if [ -z "$tags" ]; then - node jamout.js --app=$app --port=$pnum --data=$data - else - node jamout.js --app=$app --port=$pnum --data=$data --tags=$tags - fi - ;; - esac -} - - -# This is always scanning for a command with 'node' -portavailable() { - local folder=$1 - local port=$2 - - if [ -d $folder/$port ]; then - if [ -e $folder/$port/processId ]; then - local pid=`cat $folder/$port/processId` - if [ ! -z $pid ]; then - porttaken=`ps -p $pid | grep node | wc -l` - else - porttaken=0 - fi - else - porttaken=0 - fi - else - porttaken=0 - fi -} - -# Initialize all the option variables. -app=testapp -type=device -data=127.0.0.1:6379 -tags= -group="default" - -file=$1 -shift -fext="${file##*.}" - -if [ -z $file ] || [ $file = "-h" ]; then - show_usage - exit 1 -fi - -if [ "$fext" != "jxe" ]; then - die "Extension on $file is not .jxe" -fi - -# Check whether mosquitto tools are there -checkmosquitto - - -while :; do - case $1 in - -h|-\?|--help) - show_usage # Display a usage synopsis. - exit - ;; - -a|--app) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - app=$2 - shift - else - die 'ERROR: "--app" requires a non-empty option argument.' - fi - ;; - --app=?*) - app=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --app=) # Handle the case of an empty - die 'ERROR: "--app" requires a non-empty option argument.' - ;; - -t|--tags) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - tags=$2 - shift - else - die 'ERROR: "--tags" requires a non-empty option argument.' - fi - ;; - --tags=?*) - tags=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --tags=) # Handle the case of an empty - die 'ERROR: "--tags" requires a non-empty option argument.' - ;; - -d|--data) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - data=$2 - shift - else - die 'ERROR: "--data" requires a non-empty option argument.' - fi - ;; - --data=?*) - data=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --data=) # Handle the case of an empty - die 'ERROR: "--data" requires a non-empty option argument.' - ;; - -g|--group) # Takes an option argument; ensure it has been specified. - if [ "$2" ]; then - group=$2 - shift - else - die 'ERROR: "--group" requires a non-empty option argument.' - fi - ;; - --group=?*) - group=${1#*=} # Delete everything up to "=" and assign the remainder. - ;; - --group=) # Handle the case of an empty - die 'ERROR: "--group" requires a non-empty option argument.' - ;; - -f|--fog) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="fog" - fi - ;; - -c|--cloud) - if [ "$type" != "device" ]; then - die 'ERROR: "type" cannot be reassigned.' - else - type="cloud" - fi - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - - shift -done - -echo "Don't use jrun and crun! Use jamrun instead of them." -echo "Exiting." -exit - -if [ "$type" != "device" ] && [ -n "$num" ]; then - die "number of devices can't be speciied for fog/cloud" -fi - - -resolvedocker $data - -if [ -e "$file" ]; then - - # Check whether the global .jamruns folder is there - jamfolder=$HOME"/.jamruns" - create_missingdir $jamfolder - - appfolder=$jamfolder/apps - create_missingdir $appfolder - - # Get the folder - filenoext="${file%.*}" - folder=$appfolder/$filenoext"_"$app - create_missingdir $folder - - # unzip the executable in the folder and run it.. - # We are unzipping the copying the files no matter what! - unzip -oq $file -d $folder - if [ $? -ne 0 ]; then - die "Problem reading file: $file" - fi - - cd $folder - - if [ -e jamout.js ]; then - # execute the program.. we are in the folder.. - case $type in - cloud) - iport=9883 - while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) - done - create_missingdir $folder/$iport - dojamout $type $iport $folder - ;; - fog) - iport=5883 - while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) - done - create_missingdir $folder/$iport - dojamout $type $iport $folder - ;; - device) - iport=1883 - while [ : ]; do - portavailable $folder $iport - [[ $porttaken == 1 ]] || break - ((iport++)) - done - create_missingdir $folder/$iport - writegroup $iport $group - dojamout $type $iport $folder - ;; - esac - else - die "Not a valid .jxe file" - fi - -else - die ".jxe file not found" -fi diff --git a/tools/jstart.js b/tools/jstart.js deleted file mode 100644 index 921ee2338..000000000 --- a/tools/jstart.js +++ /dev/null @@ -1,16 +0,0 @@ -const minicore = require('core/minicore'); -const jaminit = require('core/jaminit'); -const JAMCore = require('core/jamcore'); - -const mbox = new Map(); -async function launch() { - console.log("------"); - minicore.init('./jamout.js', []); - var ports = await minicore.run(); - var jsys = await jaminit.run(); - var jcore = new JAMCore(jsys, jaminit.reggie); - jcore.registerFuncs(mbox); - await jcore.run(); - jcore.addWorker(ports.app); -} -launch().then(() => console.log("Starting App..")); \ No newline at end of file diff --git a/tools/parser.mjs b/tools/parser.mjs index 1551e77f7..4614a3ae5 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -197,7 +197,7 @@ function SetJamrunVar(options){ export function jamrunParsArg(argv){ - const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) + const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun'))) const file = checkJXEfile(arg) @@ -258,7 +258,7 @@ export function getJargs(argObject){ } export function getJamListArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlist.mjs'))) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlist'))) let options try{ options = commandLineArgs(jamlistOptionDefinition, {argv: args}); @@ -305,7 +305,7 @@ export function getJamListArgs(argv){ export function getKilltArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill'))) let options try{ @@ -382,7 +382,7 @@ export function getRemoteArgs(argObject){ return args.join(" ") } export function getLogArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog.mjs') )) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog') )) let options let file; let flag; diff --git a/tools/test.mjs b/tools/test.mjs deleted file mode 100644 index 7dd11d7a6..000000000 --- a/tools/test.mjs +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env zx - -// let HOME = os.homedir(); -// console.log(HOME) -// let jargs = "--app=test1 --port=1883 --group=1 --data=127.0.0.1:21883 --edge=1 --long=123.7404 --lat=15.1625 --localregistryhost=0 --device" - - -// let floc = `${HOME}/.jamruns/apps/jt2_test1` -// const p = $`(cd ${floc} && node jstart.js ${jargs})` -// // console.log(p.stdout) - -const { spawn } = require('child_process'); -const os = require('os'); -const path = require('path'); - -let HOME = os.homedir(); -console.log(`Home directory: ${HOME}`); - -let jargs = ["--app=test1", "--port=1883", "--group=1", "--data=127.0.0.1:21883", "--edge=1", "--long=123.7404", "--lat=15.1625", "--localregistryhost=0", "--device"]; - -let floc = path.join(HOME, '.jamruns', 'apps', 'jt2_test1'); -console.log(`App directory: ${floc}`); - -const command = 'node'; -const args = ['jstart.js', ...jargs]; -const options = { - cwd: floc, - stdio: 'inherit' -}; - -const child = spawn(command, args, options); - -// child.on('error', (error) => { -// console.error(`Error: ${error.message}`); -// }); - -// child.on('close', (code) => { -// console.log(`Child process exited with code ${code}`); -// }); \ No newline at end of file diff --git a/tools/testjs.js b/tools/testjs.js deleted file mode 100644 index 24c2bd4f7..000000000 --- a/tools/testjs.js +++ /dev/null @@ -1,8 +0,0 @@ - -process.on('message', function(x) { - console.log("received message ", x); -}); - -setInterval(()=> { - console.log("hi.."); -}, 100); diff --git a/tools/testsh.sh b/tools/testsh.sh deleted file mode 100755 index 88adbb6d8..000000000 --- a/tools/testsh.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -echo "hello..." -node /Users/maheswar/Programs/JAMScript/tools/testjs.js From cf6ad1f335910c3127c24a93a08354ebea7fd87b Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 14:47:46 -0400 Subject: [PATCH 059/126] executable scripts --- tools/jamclean | 0 tools/jamkill | 0 tools/jamlist | 0 tools/jamlog | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/jamclean mode change 100644 => 100755 tools/jamkill mode change 100644 => 100755 tools/jamlist mode change 100644 => 100755 tools/jamlog diff --git a/tools/jamclean b/tools/jamclean old mode 100644 new mode 100755 diff --git a/tools/jamkill b/tools/jamkill old mode 100644 new mode 100755 diff --git a/tools/jamlist b/tools/jamlist old mode 100644 new mode 100755 diff --git a/tools/jamlog b/tools/jamlog old mode 100644 new mode 100755 From c715db13f1a13263917713603ab69edd63223a59 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 16:06:11 -0400 Subject: [PATCH 060/126] shabang fixed, error not throw but just logged --- tools/cleanUp.mjs | 1 + tools/jamclean | 2 +- tools/jamkill | 10 ++++++---- tools/jamlist | 10 ++++------ tools/jamlog | 9 ++++++--- tools/jamrun | 11 +++++++---- 6 files changed, 25 insertions(+), 18 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index aa141a311..7f0d49e87 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -1,4 +1,5 @@ #!/usr/bin/env zx + import {getJamFolder,getAppFolder, getPaths} from './fileDirectory.mjs' const { spawnSync } = require('child_process'); const p = spawnSync('which', ['tmux']); diff --git a/tools/jamclean b/tools/jamclean index b8b102b3e..4feb24b3a 100755 --- a/tools/jamclean +++ b/tools/jamclean @@ -1,4 +1,4 @@ -#!/usr/bin/env node --input-type=module +#!/usr/bin/env zx import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; const { spawnSync } = require('child_process'); diff --git a/tools/jamkill b/tools/jamkill index 65844245f..154c12587 100755 --- a/tools/jamkill +++ b/tools/jamkill @@ -1,10 +1,10 @@ -#!/usr/bin/env node --input-type=module +#!/usr/bin/env zx + import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; import { Client } from 'ssh2'; -import { transport } from "pino"; -//can't specify what port ti jukk exactly + let currIP; if (os.platform() === 'win32') { currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); @@ -531,7 +531,9 @@ async function main(){ NOTE: only one of --app && --program && --dir && --portDir && --port can be used. ` ) - throw error + console.log(error.message); + process.exit(1); + } const jamfolder = getJamFolder(); const appfolder = getAppFolder(); diff --git a/tools/jamlist b/tools/jamlist index a0b586c19..864358369 100755 --- a/tools/jamlist +++ b/tools/jamlist @@ -1,4 +1,4 @@ -#!/usr/bin/env node --input-type=module +#!/usr/bin/env zx import { getJamListArgs } from "./parser.mjs"; import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" @@ -345,9 +345,8 @@ async function main(update=null){ args = getJamListArgs(process.argv) } catch(error){ - console.log(error) - if(error.type = "ShowUsage"){ + console.log( ` @@ -369,10 +368,9 @@ async function main(update=null){ ` ) + console.log(error.message); process.exit(1); - } - console.log(error) - throw error; + } const filters = args.filters; const monitor = args.monitor; diff --git a/tools/jamlog b/tools/jamlog index f9dfec868..651d807e4 100755 --- a/tools/jamlog +++ b/tools/jamlog @@ -1,4 +1,4 @@ -#!/usr/bin/env node --input-type=module +#!/usr/bin/env zx import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import { getLogArgs } from "./parser.mjs"; @@ -109,7 +109,7 @@ async function main(){ arg = getLogArgs(process.argv) } catch(error){ - if(error.type = "ShowUsage"){ + console.log( ` @@ -123,8 +123,11 @@ async function main(){ ` ) + console.log(error.message); process.exit(1); - } + + + } const flag = arg.flag; const port =Number(arg.file.split("/")[ arg.file.split("/").length-1]); diff --git a/tools/jamrun b/tools/jamrun index 63394ffc2..78040a1e8 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -1,4 +1,5 @@ -#!/usr/bin/env node --input-type=module +#!/usr/bin/env zx + import {jamrunParsArg , getCargs, getJargs, getRemoteArgs} from './parser.mjs' import { fileURLToPath } from 'url'; import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; @@ -199,6 +200,7 @@ function show_usage(){ The jamrun command creates a run state in the $HOME/.jamruns folder. `; console.log(usageMessage) + } @@ -613,9 +615,10 @@ async function main(){ catch(error){ - console.log('got here') - show_usage() - throw(error) + show_usage() + console.log(error.message) + process.exit(1); + } let folder; let ifile; From b2565303467a4d5a5066690bada44051bdab85b2 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 16:12:25 -0400 Subject: [PATCH 061/126] console.log cleanup --- tools/cleanUp.mjs | 36 +++++++++++++----------------------- tools/fileDirectory.mjs | 2 -- tools/jamrun | 15 ++++++++------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 7f0d49e87..d0eb87e61 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -30,7 +30,6 @@ function killtmux(PortNumber,appName , programName){ } function stalePort(removablePort,app,programName){ - console.log("PORT STALE CLEANING PORT") const jamfolder = getJamFolder() if(!removablePort){ return false; @@ -41,39 +40,30 @@ function stalePort(removablePort,app,programName){ const appNames = fs.readFileSync(`${jamfolder}/ports/${removablePort}`).toString().trim().split("\n"); const dirName = (programName.split(".")[0])+"_"+app - console.log(dirName, "DIR NAME") - console.log("PROGRAM NAME", programName) + + if(appNames.includes(dirName)){ if(appNames.length === 1){ - console.log("RETERNING TURE") + fs.rmSync(`${jamfolder}/ports/${removablePort}`, { recursive: true, force: true }); return true; } else{ - console.log("RETERNING false 1") + const newAppNames = appNames.filter((appName) => appName !== dirName) fs.writeFileSync(`${jamfolder}/ports/${removablePort}`, newAppNames.join("\n")) return false; } } else{ - console.log("RETERNING false 2") + return false; } } function killMosquitto(removablePort){ - // console.log("CLOSING THE MOSQUITTO") - // const result = spawnSync('lsof', ['-i', `tcp:${Number(removablePort)}`, '-sTCP:LISTEN', '-t']); - // console.log("GOT THE RESULT") - // if(result.error){ - // console.log("THERE IS AN ERROR") - // console.log(error) - // return - // } - // const pid = result.stdout.toString().trim(); - // console.log("PID WE NEED", pid) + const jamfolder = getJamFolder() if(fs.existsSync(`${jamfolder}/mqttpid/${removablePort}`)){ const pid = fs.readFileSync(`${jamfolder}/mqttpid/${removablePort}`).toString().trim() @@ -94,7 +84,7 @@ function killRedis(removablePort){ function cleanPort(removablePort,app,programName){ const isPortStale = stalePort(removablePort,app,programName); - console.log("THIS IS THE PORT", isPortStale) + if(isPortStale){ killMosquitto(removablePort); killRedis(removablePort); @@ -106,7 +96,7 @@ function cleanPort(removablePort,app,programName){ } function ArchiveLog(removablePort, appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) - console.log(folder) + if(fs.existsSync(`${folder}/${removablePort}`)){ process.chdir(`${folder}/${removablePort}`); const logs = fs.readdirSync('.').filter( (entry) => entry.includes("log")) @@ -161,7 +151,7 @@ function markPause(PortNumber,appName ,programName){ // } export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ - console.log("killing port ") + if(!programName || !appName || !PortNumber){ if(!NOVERBOSE) @@ -169,11 +159,11 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr return; } - console.log("LOGS ARE ARCHIVED"); + const tmuxIds = killtmux(PortNumber,appName ,programName); if(!NOVERBOSE && tmuxIds) console.log("Killed :", tmuxIds) - console.log("PRE CLEANING THE CLEAN PORT") + const isPortCleaned = cleanPort(PortNumber,appName,programName); if(!NOVERBOSE && isPortCleaned ){ console.log("Redis and mosquitto on port ",PortNumber, "are removed" ) @@ -186,11 +176,11 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr if(!NOVERBOSE && isDirCleaned ){ console.log(`port ${PortNumber} is cleaned for ${programName.split(".")[0]}_${appName}`) } - console.log("CLEANED UP OVER") + }; export function pauseByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ - console.log("pausing port") + if(!programName || !appName || !PortNumber){ if(!NOVERBOSE) console.log("NO NEED FOR CLEANING") diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index c5a19216c..72133f0c3 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -3,8 +3,6 @@ let HOME = os.homedir(); export function fileDirectorySetUp(file,app){ - console.log(file) - console.log(app) const jamfolder=`${HOME}/.jamruns` if(!fs.existsSync(jamfolder,{ recursive: true })){ fs.mkdirSync(jamfolder) diff --git a/tools/jamrun b/tools/jamrun index 78040a1e8..8de012c83 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -111,7 +111,7 @@ async function executeScript(client, command){ stream.on("data" , async (data) =>{ if(data.includes("MY PORT IS:")) { - console.log(data.toString()) + result = data.toString().trim().split(":")[1] } if(data.includes("EXIT BG")){ @@ -223,7 +223,7 @@ async function startmqtt(port, cFile){ detached: true, }; const mqttProcesse = spawn(command, args, options); - console.log(mqttProcesse.pid) + fs.writeFileSync(`${jamfolder}/mqttpid/${port}`,`${mqttProcesse.pid}` ) mqttProcesse.unref(); @@ -316,7 +316,7 @@ async function dojamout_p2_fg(pnum, floc,jappid, group=null){ }; const child = spawn(command, args, options); child.on('exit', () => { - console.log("sending sig term") + process.kill(process.pid, 'SIGTERM'); }); } @@ -383,7 +383,7 @@ async function doaout(num,port,group,datap,myf,jappid){ "-o": datap, } let cargs = getCargs(argObject) - console.log("this is my cargs",cargs ) + await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; if (!log){ @@ -451,10 +451,10 @@ function setuptmux(path, appfolder) { async function startredis(port) { try{ const p = $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); - console.log(p) + } catch(error){ - console.log(error) + } } @@ -534,7 +534,8 @@ async function unpack(file,folder){ const ontime = Number(p2.stdout.toString().trim()); if(ntime > ontime){ try{ - console.log("outdated, unzippping again") + if(!NOVERBOSE) + console.log("outdated, unzippping again") await $`cd ${folder} && unzip -oq ${file}`.quiet() } catch(error){ From 037df70407369429f1f23d1c80745ccca9e579e5 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 16:30:41 -0400 Subject: [PATCH 062/126] remove set of extra logs --- tools/jamrun | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/jamrun b/tools/jamrun index 8de012c83..4d7264516 100755 --- a/tools/jamrun +++ b/tools/jamrun @@ -467,7 +467,7 @@ async function waitforredis(port){ } } catch(error){ - console.log(error) + } if (!NOVERBOSE) { console.log("Trying to find Redis server..."); @@ -826,7 +826,6 @@ async function main(){ if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ fs.mkdirSync(`${folder}/${iport}`) } - console.log(`MY PORT IS:${removablePort}`) if(isDevice) await runDevice(iport,dport,group) From 39aa8794f6c0c0a6688c7ff532b2471a87824ac3 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 21:50:39 -0400 Subject: [PATCH 063/126] corrupted portDir fic --- tools/fileDirectory.mjs | 8 +++++++- tools/jamclean | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 72133f0c3..a416539b5 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -132,13 +132,19 @@ export function fileDirectoryMqtt(folder, iport,jamfolder,app){ fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); const dirName = folder.split("/").pop() if(fs.existsSync(`${jamfolder}/ports/${iport}`)){ + console.log("exists") const dirNames = fs.readFileSync(`${jamfolder}/ports/${iport}`).toString().trim().split("\n") if(!dirNames.includes(dirName)){ - fs.appendFileSync(`${jamfolder}/ports/${iport}`, `${dirName}\n`) + console.log("append") + console.log("dirName",dirName ) + console.log("filePath",`${jamfolder}/ports/${iport}`) + fs.appendFileSync(`${jamfolder}/ports/${iport}`, `\n${dirName}\n`) } } else{ + console.log("new ") + fs.writeFileSync(`${jamfolder}/ports/${iport}`, `${dirName}\n`) } diff --git a/tools/jamclean b/tools/jamclean index 4feb24b3a..6dc675931 100755 --- a/tools/jamclean +++ b/tools/jamclean @@ -202,7 +202,14 @@ function cleanPorts(AppToRemove){ const oldApss = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n") const toRemove = AppToRemove.get(port) const newApps = oldApss.filter((entry) => !toRemove.includes(entry)) - fs.writeFileSync(`${jamFolder}/ports/${port}`, newApps.join("\n")) + if(newApps.length === 1){ + fs.writeFileSync(`${jamFolder}/ports/${port}`, `${newApps[0]}\n`) + } + else{ + console.log(`${newApps.join("\n")}\n`) + fs.writeFileSync(`${jamFolder}/ports/${port}`, `${newApps.join("\n")}`) + } + } } From 498ae1c2b5aab70c99913d0ded981ce67d84c6c3 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 8 Aug 2024 22:03:33 -0400 Subject: [PATCH 064/126] no ext -> mjs --- tools/{jamclean => jamclean.mjs} | 7 +++---- tools/{jamkill => jamkill.mjs} | 10 +++++----- tools/{jamlist => jamlist.mjs} | 4 ++-- tools/{jamlog => jamlog.mjs} | 2 +- tools/{jamrun => jamrun.mjs} | 4 ++-- tools/parser.mjs | 8 ++++---- 6 files changed, 17 insertions(+), 18 deletions(-) rename tools/{jamclean => jamclean.mjs} (98%) rename tools/{jamkill => jamkill.mjs} (97%) rename tools/{jamlist => jamlist.mjs} (99%) rename tools/{jamlog => jamlog.mjs} (99%) rename tools/{jamrun => jamrun.mjs} (99%) diff --git a/tools/jamclean b/tools/jamclean.mjs similarity index 98% rename from tools/jamclean rename to tools/jamclean.mjs index 6dc675931..8c43e4635 100755 --- a/tools/jamclean +++ b/tools/jamclean.mjs @@ -12,7 +12,7 @@ import { Client } from 'ssh2'; const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); -const jamcKillPath = resolve(__dirname, 'jamkill'); +const jamcKillPath = resolve(__dirname, 'jamkill.mjs'); const p = spawnSync('which', ['mosquitto_pub']); const MOSQUITTO_PUB = p.stdout.toString().trim() @@ -214,7 +214,6 @@ function cleanPorts(AppToRemove){ } async function clean(){ - //port --> dir const AppToRemove = new Map(); const jamFolder = getJamFolder() const portsDir = `${jamFolder}/ports` @@ -375,7 +374,7 @@ async function cleanRemote(toRemove){ } (async () =>{ - const arg = process.argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean'))); + const arg = process.argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamclean.mjs'))); const appfolder = getAppFolder(); const jamFolder = getJamFolder(); if(arg.length === 0){ @@ -411,7 +410,7 @@ async function cleanRemote(toRemove){ const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir= "cd JAMScript/tools" - const script = `zx jamclean --root=${currIP} --hash=${arg}` + const script = `zx jamclean.mjs --root=${currIP} --hash=${arg}` const result = await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) const toRemove = result.trim().split("\n"); if(toRemove.length !==0 && toRemove[0] !== ''){ diff --git a/tools/jamkill b/tools/jamkill.mjs similarity index 97% rename from tools/jamkill rename to tools/jamkill.mjs index 154c12587..e945c9ff0 100755 --- a/tools/jamkill +++ b/tools/jamkill.mjs @@ -565,20 +565,20 @@ async function main(){ let toExecute; if(args.flag == "reset"){ - toExecute = `zx jamkill --reset --root=${currIP}` + toExecute = `zx jamkill.mjs --reset --root=${currIP}` } else if(args.flag == "all"){ if(!args.pause) - toExecute = `zx jamkill --${args.flag} --root=${currIP}` + toExecute = `zx jamkill.mjs --${args.flag} --root=${currIP}` else - toExecute = `zx jamkill --${args.flag} --pause --root=${currIP}` + toExecute = `zx jamkill.mjs --${args.flag} --pause --root=${currIP}` } else{ if(!args.pause) - toExecute = `zx jamkill --${args.flag} --name=${args.name} --root=${currIP}` + toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --root=${currIP}` else - toExecute = `zx jamkill --${args.flag} --name=${args.name} --pause --root=${currIP}` + toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --pause --root=${currIP}` } diff --git a/tools/jamlist b/tools/jamlist.mjs similarity index 99% rename from tools/jamlist rename to tools/jamlist.mjs index 864358369..67cd611dd 100755 --- a/tools/jamlist +++ b/tools/jamlist.mjs @@ -12,7 +12,7 @@ const jamFolder = getJamFolder() let watcher; const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); -const jamcleanPath = resolve(__dirname, 'jamclean'); +const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); let NODESINFO = [] let currIP ; if (os.platform() === 'win32') { @@ -412,7 +412,7 @@ async function main(update=null){ args =args.trim() - const script = `zx jamlist ${args} --root=${currIP}` + const script = `zx jamlist.mjs ${args} --root=${currIP}` await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) } diff --git a/tools/jamlog b/tools/jamlog.mjs similarity index 99% rename from tools/jamlog rename to tools/jamlog.mjs index 651d807e4..877a14488 100755 --- a/tools/jamlog +++ b/tools/jamlog.mjs @@ -175,7 +175,7 @@ async function main(){ } const finalArg = args.trim() - const command = `${pathExport} && ${changeDir} && zx jamlog ${finalArg}` + const command = `${pathExport} && ${changeDir} && zx jamlog.mjs ${finalArg}` await makeConnection(config) await executeScript(client, command) diff --git a/tools/jamrun b/tools/jamrun.mjs similarity index 99% rename from tools/jamrun rename to tools/jamrun.mjs index 4d7264516..fa82a1f61 100755 --- a/tools/jamrun +++ b/tools/jamrun.mjs @@ -672,7 +672,7 @@ async function main(){ } else if (os.platform() === 'linux') { currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); } - const myPort = await executeScript(client, `${changeDir} && zx jamrun ${remoteArgs} --root=${currIP}`) + const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP}`) if(!resume){ const jamfolder = getJamFolder() @@ -835,7 +835,7 @@ async function main(){ const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); -const jamcleanPath = resolve(__dirname, 'jamclean'); +const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); await $`zx ${jamcleanPath}` await main() diff --git a/tools/parser.mjs b/tools/parser.mjs index 4614a3ae5..1551e77f7 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -197,7 +197,7 @@ function SetJamrunVar(options){ export function jamrunParsArg(argv){ - const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun'))) + const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) const file = checkJXEfile(arg) @@ -258,7 +258,7 @@ export function getJargs(argObject){ } export function getJamListArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlist'))) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlist.mjs'))) let options try{ options = commandLineArgs(jamlistOptionDefinition, {argv: args}); @@ -305,7 +305,7 @@ export function getJamListArgs(argv){ export function getKilltArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill'))) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) let options try{ @@ -382,7 +382,7 @@ export function getRemoteArgs(argObject){ return args.join(" ") } export function getLogArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog') )) + const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog.mjs') )) let options let file; let flag; From 8eb85fe48ed09520a8f4fbe816ed1430c5410d93 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 9 Aug 2024 04:10:21 -0400 Subject: [PATCH 065/126] jamkill filtering added, all usage updated but jamlist --- tools/chalk.mjs | 34 ++++ tools/jamkill.mjs | 431 ++++++++++++++-------------------------------- tools/jamlog.mjs | 69 ++++++-- tools/jamrun.mjs | 164 +++++++++++------- tools/parser.mjs | 49 +----- 5 files changed, 326 insertions(+), 421 deletions(-) create mode 100644 tools/chalk.mjs diff --git a/tools/chalk.mjs b/tools/chalk.mjs new file mode 100644 index 000000000..0c704eed9 --- /dev/null +++ b/tools/chalk.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +export function header_1(txt){ + return chalk.bgGreen.black.bold.inverse(txt) +} + +export function header_2(txt){ + return chalk.bgBlack.cyan.bold.italic(txt) +} + +export function body_1(txt){ + return chalk.bgBlack.bold.cyan(txt) +} +export function body_sec(txt){ + return chalk.dim.italic(txt) +} + +export function body_2(txt){ + return chalk.black(txt) +} +export function body_2_line(txt){ + return chalk.black.underline(txt) +} +export function body_2_bold(txt){ + return chalk.black.bold(txt) +} + +export function keyWord(txt){ + return chalk.italic.underline(txt) +} + +export function bodyBold(txt){ + return chalk.bold(txt) +} \ No newline at end of file diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index e945c9ff0..578210341 100755 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -4,6 +4,7 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; import { Client } from 'ssh2'; +import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; let currIP; if (os.platform() === 'win32') { @@ -14,6 +15,76 @@ if (os.platform() === 'win32') { currIP =( await $`hostname -I`.catch(() => '')).toString().trim(); } +function show_usage(){ + const usageMessage = + ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jamkill`)}${body_1(` -- a tool to kill or pause the running JXE files.`)} + + ${header_1(`SYNOPSIS`)} + + Usage: jamkill + [--reset] + [--help] + [--all] + [--remote = ${body_sec(`IPAddress`)}] + [--pause] + [--appName = ${body_sec(`appName`)}] + [--programName = ${body_sec(`programName`)}] + [--portNum = ${body_sec(`portNum`)}] + + ${header_1(`DESCRIPTION`)} + + --- ${keyWord('jamkill')} by default kills all the running local apps. + + --- jamkill [--reset] + ${body_2(`Use this flag to kill all the running programs and remove appfolder, port directory and mqttPID directory. + it's useful for the cases that either the file directory is corrupted or a fresh start is required.`)} + ${body_2_bold(`NOTE: + The only usable flag is next to --reset flag is --remote otherwise, + --reset flag will dissable all the other flags and do a hard reset.`)} + + --- jamkill [--help] + ${body_2(`Use this flag to display this usage msg.`)} + + --- jamkill [--all] + ${body_2(`Use this flag to kill all the running apps.`)} + ${body_2_bold(`NOTE: + 1) if using --all next to the --reset flag. --all will be dissabled. + 2) if using --all flag --appName, --programName, --appName will be dissabled.`)} + + --- jamkill [--pause] + ${body_2(`Use this flag to pause the running programs instead of killing them.`)} + + --- jamkill [--remote] + ${body_2(`Use this flag to kill the remote files as well as local ones.`)} + ${body_2_bold(`NOTE: + jamkill --remote is only allowed to kill the remote programs which are started by thesame local machine which is running the jamkill.`)} + + --- jamkill [--appName=X] + ${body_2(`Use this flag to kill or pause a program with a scpecific appName.`)} + + --- jamkill [--programName=X] + ${body_2(`Use this flag to kill or pause a program with a specific programName.`)} + + --- jamkill [--portNum=X] + ${body_2(`Use this flag to kill or pause a program with running on a certain port.`)} + + NOTE: + ${body_2(`--appName & --programName & --portNumber can be used all togeather or two by two to select the programs to be killed or paused.`)} + + RESTRICTIONS: + ${body_2(`can't use multiple --appName , --programName and --portNumber flags hoping to kill apps with different appNames, + programNames and portNumbers in one shot.`)} + + + `; + + console.log(usageMessage) + + +} export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() @@ -60,217 +131,6 @@ export function dirNameToProgramName(dirName){ return (dirName.split('_'))[0] } -function killDataByPortDir(portDir, root){ - const jamFolder = getJamFolder() - const appFolder = getAppFolder() - const infoList = portDir.split("/") - - if(infoList.length !== 2){ - throw new Error("Wrong Path input") -0 } - const dirName = infoList[0] - const portName = infoList[1] - - let dirsRunning; - try{ - dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portName}`).toString().trim().split("\n"); - } - catch(error){ - return[] - } - - if(!dirsRunning.includes(dirName)){ - return [] - } - - if(root){ - try{ - const rootIP = fs.readFileSync(`${appFolder}/${portDir}/root`).toString().trim(); - if(rootIP === root){ - const info = { - programName : dirNameToProgramName(dirName)+".jxe", - appName : dirNameToAppName(dirName), - portNumber : portName - } - return [info] - } - return []; - } - catch(error){ - return []; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dirName)+".jxe", - appName : dirNameToAppName(dirName), - portNumber : portName - } - return [info] - } -} - -function killDataByPortNum(portNum, root){ - const jamFolder = getJamFolder() - const toClean=[]; - const appfolder = getAppFolder() - let activePorts; - let dirsRunning; - try{ - activePorts = (fs.readdirSync(`${jamFolder}/ports`)).map((entry) => Number(entry)) - if(!activePorts.includes(Number(portNum))){ - return []; - } - dirsRunning = fs.readFileSync(`${jamFolder}/ports/${portNum}`).toString().trim().split("\n") - } - catch(error){ - return [] - } - for(let dir of dirsRunning){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${portNum}/root`).toString().trim(); - if(rootIP === root){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : portNum - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : portNum - } - toClean.push(info) - } - } - return toClean; -} - -function killDataByAppName(appName, root){ - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - for(let dir of activeDirs.keys()){ - const currApp = dirNameToAppName(dir) - if(currApp === appName){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - } - return toClean -} - -function killDataByProgramName(programName, root){ - - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - for(let dir of activeDirs.keys()){ - const currProgram = dirNameToProgramName(dir) - if(currProgram === programName){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - const info = { - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - } - return toClean -} - - -function killDataByDirName(dirName, root){ - - const toClean=[]; - const activeDirs = getRunningDirs(); - const appfolder = getAppFolder() - for(let dir of activeDirs.keys()){ - if(dir === dirName){ - for(let port of activeDirs.get(dir)){ - if(root){ - try{ - const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); - if(rootIP === root){ - - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - catch(error){ - continue; - } - } - else{ - const info ={ - programName : dirNameToProgramName(dir)+".jxe", - appName : dirNameToAppName(dir), - portNumber : port - } - toClean.push(info) - } - } - } - } - return toClean -} function killDataForAll(root){ const toClean=[]; @@ -359,39 +219,54 @@ async function pauseProcess(data){ await killJFile(data); } -async function jamKill(flag, name, pause, root) -{ - - - let jamData; - if(flag === "dir"){ - jamData = killDataByDirName(name, root) - } - else if(flag === "app"){ - jamData = killDataByAppName(name, root) - - - } - else if(flag === "program"){ - - jamData = killDataByProgramName(name, root) +function filter(data, filters){ + console.log("filter", filters) + console.log("data", data) + const filteredInfo =[]; + for(let info of data){ + let isPassing = true + for(let filter of Object.keys(filters)){ + if(!(filters[filter] === info[filter])){ + isPassing = false + break; + } + } + if(isPassing){ + filteredInfo.push(info) + } } - else if(flag === "port"){ + return filteredInfo; +} - jamData = killDataByPortNum(name, root) - } - else if(flag === "portDir"){ +async function jamKill(args) +{ - jamData = killDataByPortDir(name, root) + let pause = args.pause + let root = args.root + let jamData = killDataForAll(root) + console.log(jamData, "this is my jam data") + let toKill; + if(args.all){ + toKill = jamData } else{ - - jamData = killDataForAll(root) + let Filter ={} + if(args.programName){ + Filter["programName"] = `${args.programName}.jxe` + } + if(args.appName){ + Filter["appName"] = args.appName + } + if(args.portNum){ + Filter["portNumber"] = args.portNum + } + + toKill = filter(jamData,Filter ) } + console.log(toKill, "this is my to kill") - - if(jamData.length === 0 ){ - if(flag === "all"){ + if(toKill.length === 0 ){ + if(args.all){ console.log("no running app on local") } else{ @@ -401,7 +276,7 @@ async function jamKill(flag, name, pause, root) } if(pause){ - for(let data of jamData){ + for(let data of toKill){ let appfolder = getAppFolder() const appName = data.appName; const programName = data.programName @@ -420,7 +295,7 @@ async function jamKill(flag, name, pause, root) } } else{ - for(let data of jamData){ + for(let data of toKill){ const appName = data.appName; const programName = data.programName const portNumber = data.portNumber @@ -479,59 +354,7 @@ async function main(){ } catch(error){ - - console.log( - - ` - Kill running instances of the application. - Usage: - - jamkill --reset [--remote] - To kill all the programs and remove the ports, mqttpid and apps directory which would be equivelant to a hard reset - --reset flag should be used. have in mind uninsg the --reset flag will dissable all the other flags and do a hard reset. - the only flag which can be used with --reset is --remote which runs the kill --reset on the local machine and all the remote - machines. - - jamkill --help - displays this help messages. - - jamkill --all [--remote] [--pause] - to kill all the programs running --all flag should be used. It differ from --reset since it just removes the running programs - and does no file directory cleanup. The only other flag which can be used next to --all is --remote and --pause. use --remote to include all the remote - machines in the killing process. use --pause to pause all the programs instead of completly killing them. - - - jamkill --app --name== [--remote] [--pause] - to kill program with a specific appName. use --app flag as an indicator of the killing criteria(which is app name), followed by --name= - to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex) jamkill --app --name=testingApp --remote --pause - - jamkill --program --name== [--remote] [--pause] - to kill program with a specific programName. use --program flag as an indicator of the killing criteria(which is program name), followed by --name= - to specify what program should be kiiled.[--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex)jamkill --program --name=jt2 [--remote] [--pause] - - jamkill --port --name== [--remote] [--pause] - to kill program with on a specific portNumber, use --port flag as an indicator of the killing criteria(which is portNumbrt), followed by --name= - to specify what program on which port should be killed. [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex) jamkill --app --name=1883 --remote --pause - - jamkill --dir --name== [--remote] [--pause] - Directory name is refered to the directory associated to a program under the apps folder. dirName is a combination of the --program and --name flag. - If a program with specific appName and programName should be killed --dir flag should be used followed by the --name=. - [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex)jamkill --dir --name=jt2_testingApp --remote --pause - - jamkill --portDir --name== [--remote] [--pause] - portDir refers to the directory in the folder for a specific program which contains the info of that program running on an specific port. - portdir is a combination of --app, --program and --ports which always targetes a signle running program. - [--remote] and [--pause] are optional flags to include remote machines or pause instead of complete termination. - ex)jamkill --portDir --name==jt2_shahin/1883 [--remote] [--pause] - - NOTE: only one of --app && --program && --dir && --portDir && --port can be used. - ` - ) - console.log(error.message); + show_usage() process.exit(1); } @@ -563,22 +386,34 @@ async function main(){ const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir= "cd JAMScript/tools" let toExecute; + let filters =``; + if(args.programName){ + filters = filters+`--programName=${programName} ` + } + if(args.appName){ + filters = filters+`--appName=${appName} ` + } + if(args.portNum){ + filters = filters+`--portNum=${portNum} ` + } + filters = filters.trim() if(args.flag == "reset"){ toExecute = `zx jamkill.mjs --reset --root=${currIP}` } + else if(args.flag == "all"){ if(!args.pause) - toExecute = `zx jamkill.mjs --${args.flag} --root=${currIP}` + toExecute = `zx jamkill.mjs ${filters} --root=${currIP}` else - toExecute = `zx jamkill.mjs --${args.flag} --pause --root=${currIP}` + toExecute = `zx jamkill.mjs ${filters} --pause --root=${currIP}` } else{ if(!args.pause) - toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --root=${currIP}` + toExecute = `zx jamkill.mjs ${filters} --name=${args.name} --root=${currIP}` else - toExecute = `zx jamkill.mjs --${args.flag} --name=${args.name} --pause --root=${currIP}` + toExecute = `zx jamkill.mjs ${filters} --name=${args.name} --pause --root=${currIP}` } @@ -586,7 +421,7 @@ async function main(){ await executeScript(client, command); } } - if(args.flag === "reset"){ + if(args.reset){ if(args.root){ throw new Error("DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE") } @@ -600,7 +435,7 @@ async function main(){ throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') } else{ - await jamKill(args.flag , args.name, args.pause, args.root); + await jamKill(args); } diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs index 877a14488..1862e4903 100755 --- a/tools/jamlog.mjs +++ b/tools/jamlog.mjs @@ -4,6 +4,60 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import { getLogArgs } from "./parser.mjs"; const readline = require('readline'); import { Client } from 'ssh2'; +import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; + + +function show_usage(){ + const usageMessage = + ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jamlog`)}${body_1(` -- a tool to display archived or live, J node and C node log files.`)} + + ${header_1(`SYNOPSIS`)} + + Usage: jamlog + --program = ${body_sec(`programName`)} && --app = ${body_sec(`appName`)} && --port = ${body_sec(`portNum`)} + [--help] + [--all] + [--remote = ${body_sec(`IPAddress`)}] + [--tail = ${body_sec('num')}] + [--c] + [--j] + + + + ${header_1(`DESCRIPTION`)} + + --- ${keyWord('jamlog')} can't be used without arguments. + + --- jamlog --help + ${body_2(`Usethis flag to display the usage msg.`)} + + --- jamlog --program=jt2 --app=xxx2 --port=1883 + ${body_2(`Use this three options to get the specific log file of an app which runs a program on a certain port. + The command above prints the log for xxx2 app running a jt2 program on port 1883.`)} + ${body_2_bold(`NOTE: + 1) All three of these options are mandatory for jamlog to work. + 2) If there is a program currently running with the above info jamlog will print the running program log, + otherwise jamlog will print the archive log on that port if exists.`)} + + + --- jamlog --program=jt2 --app=xxx2 --port=1883 [--remote=] + ${body_2(`Use --remote option to print the log of the running program on a remote machine with a given IPaddress.`)} + + --- jamlog --program=jt2 --app=xxx2 --port=1883 [--c] [--j] + ${body_2(`Use either or both --c flag and --j flag to get either or both C node and J node log files for the given program.`)} + ${body_2_bold(`NOTE: By default jamlog will print both C node and J node log files.`)} + + --- jamlog --program=jt2 --app=xxx2 --port=1883 [--tail=4] + ${body_2(`Use the tail flag to only get last few lines of log files. + the command above displays the last 4 lines of log files. + Useful for finding the error and avoid over populating the console `)} + + `; + console.log(usageMessage) +} @@ -109,20 +163,7 @@ async function main(){ arg = getLogArgs(process.argv) } catch(error){ - - console.log( - - ` - [--help] is used to show usage - [--program= && --app= && --port= && --remote=] all used togeather to indicate what log we want to get (THESE ARE MANDATORY but IPAddress) - NOTE: --remote is optional. - [--c] is a flag used to only show the c file - [--j] is a flagused to only show the j file - [--tail=] shows the last n lines of the log - [--remote=] - ` - - ) + show_usage() console.log(error.message); process.exit(1); diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index fa82a1f61..4f87a1405 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -7,7 +7,7 @@ import { dirname, resolve } from 'path'; import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' const { spawn,spawnSync } = require('child_process'); import { Client } from 'ssh2'; - +import { body_1, header_1 ,header_2, body_sec, keyWord, bodyBold, body_2 , body_2_bold , body_2_line} from './chalk.mjs'; let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote, root; const tmuxIds = []; @@ -125,79 +125,109 @@ async function executeScript(client, command){ function show_usage(){ const usageMessage = ` - jamrun program.jxe - Runs J and C node, one each, of a device with program.jxe - under a app name X, use the --app=X option. It is mandatory to set the app name. - - jamrun program.jxe --fog - Runs a fog node (only J node) with program.jxe. Similarly, the --cloud - flag runs a cloud node. + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jamrun`)}${body_1(` -- a tool to run JXE files with a given name`)} + + ${header_1(`SYNOPSIS`)} + + Usage: jamrun file.jxe + + --app = ${body_sec(`app_name`)} + [--help] + [--fog | --cloud | --device] + [--num = ${body_sec(`num_c_devs`)}] + [--dat = ${body_sec(`data-url`)}] + [--tags = ${body_sec(`quoted_list_of_tags`)}] + [--bg] + [--old] + [--log] + [--verb] + [--loc = ${body_sec(`long,lat`)}] + [--edge= ${body_sec(`num_edge_connections`)}] + [--valgrind] + [--local] + [--resume && --port = ${body_sec(`portNum`)}] + [--remote = ${body_sec(`IPAddress`)}] + + ${header_1(`DESCRIPTION`)} + + --- ${keyWord('jamrun')} Runs J node and C nodes, one each, of a device with ${keyWord('program.jxe')} + under a app name X, use the ${keyWord('--app')}=${keyWord(`X`)} option. ${bodyBold(`It is mandatory to set the app name.`)}. - By default, jamrun uses a Redis server running at 127.0.0.1:(20000+porttaken) as the - data store. To use a different Redis server use the --data option. + --- jamrun --help + ${body_2('--help : use this flag to display this usage message.')} + + --- jamrun program.jxe --app=X [ --fog || --device || --cloud ] + ${body_2_bold(`Among the flags above only one of them can be used`)} + ${body_2_bold(`If none of the flags are set the program will run as device by default`)} + ${body_2('--fog : runs a fog node (only J node) with program.jxe.')} + ${body_2('--cloud : runs a cloud node (only J node). ')} + ${body_2('--device : runs a device node (J node and C node).')} - jamrun program.jxe --data=127.0.0.1:7000 - Runs program.jxe and connects it to an already running Redis server at + --- jamrun program.jxe --app=X [ --data=127.0.0.1:7000 ] + ${body_2_bold(`By default, jamrun uses a Redis server running at 127.0.0.1:(20000+porttaken) as the + data store. To use a different Redis server use the --data option.`)} + ${body_2(`--data: Runs program.jxe and connects it to an already running Redis server at port 7000 of the local host. Redis server can run outside the local host (Redis needs to the configured to accept outside - connections). - - To start more than one C node at a device use the following command. - jamrun program.jxe --num=4. - - To provide a set of tags to the program, use the following command. - jamrun program.jxe --tag="param1, param2" - - Use the --bg option to run a command in the background. the --bg is mandatory for the cases - that program is running on a remote machine. - - Use the --old option to run the previous version in .jamruns folder. - You can edit that version and rerun a custom version of a file. + connections).`)} - Use the --log option to turn on logging. This is useful for programs where - the C side is crashing at the startup. The tmux console would not run when - the program crash at startup. So the --log option allows us to see the - program error messages. + --- jamrun program.jxe --app=X [ --num=4 ] + ${body_2_bold(`By default, jamrun runs one c node.`)} + ${body_2(`--num: use this option to start more than one C node at a device. + the command abouve starts the program with 4 C nodes`)} - Use the --verb option to turn on verbose messaging. - - Use --valgrind to run the cside with valgrind for leak checking. - - Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. - - Use --resume to resume the paused program. Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags. - the program can be resumed only if it was pased before. - --resume tag have to be used with --port tag to specify exactly which program shoukd be resumed. + --- jamrun program.jxe --app=X [ --tag="param1, param2" ] + ${body_2_bold(`By default, no tag is assigned.`)} + ${body_2(`--tag: use this option to provide a set of tags to the program.`)} + + --- jamrun program.jxe --app=X [ --bg ] + ${body_2_bold(`By default, the program is running on the foreground.`)} + ${body_2(`--bg: use this flag to run a command in the background. the --bg is mandatory for the cases + that program is running on a remote machine.`)} + + --- jamrun program.jxe --app=X [ --old ] + ${body_2_bold(`By default, the program is using the latest version in .jamruns folder.`)} + ${body_2(`--old: use this flag to run the previous version in .jamruns folder. + You can edit that version and rerun a custom version of a file.`)} + + --- jamrun program.jxe --app=X [ --log ] + ${body_2_bold(`By default, the C node output is never stored and J node output stored only when + the program is running in the background.`)} + ${body_2(`--log: use this flag to turn on logging, capturing the output of C file and J file and + adding them to the archive when the program stops running. + This is useful for programs where the C side is crashing at the startup. + The tmux console would not run when the program crash at startup. + So the --log option allows us to see the program error messages.`)} + + --- jamrun program.jxe --app=X [ --verb ] + ${body_2(`--verb : use this flag to turn on verbose messaging.`)} - to start the c nodes and j files on a remote machine the --remote is used. - the value assinge to --remote is IP addrress of the remote machine to make the connection. - - by default the location assigned to a program has random long and lat values. to set a specific - location for the progam the --loc is used. - value passsed to the loc contains long and lat with a ',' seperator between them. - - - Usage: jamrun file.jxe - [--app=appl_name] - [--fog|--cloud|--device] - [--num=num_c_devs] - [--data=data-url] - [--tags=quoted_list_of_tags] - [--bg] - [--old] - [--log] - [--verb] - [--loc=long,lat] - [--edge=num_edge_connections] - [--valgrind] - [--local] - [--resume && port=] - [--remote=] - - - + --- jamrun program.jxe --app=X [ --valgrind ] + ${body_2(`--verb : use this flag to run the cside with valgrind for leak checking.`)} + + --- jamrun program.jxe --app=X [ --local ] + ${body_2(`--verb : use this flag to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback.`)} + + --- jamrun program.jxe --app=X [ --resume ] [ --port=portNumber ] + ${body_2_bold(`the --resume flag and --port option should be always used together`)} + ${body_2_bold(`--port flag will be dissabled if used alone`)} + ${body_2_bold(`--resume flag will throw an error if used alone`)} + ${body_2_bold(`Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags`)} + ${body_2(`--resume : use this flag to resume the paused program with app name X program name program.jxe and + app on port --port`)} + + --- jamrun program.jxe --app=X [ --remote=IPAddress ] [ --bg ] + ${body_2_bold(`the --remote and --bg flag should always be used together. + remote programs can only run on the background`)} + ${body_2(`--remote: use this option to run the program on remote machine and in the background`)} + + --- jamrun program.jxe --app=X [ --loc=long,lat ] + ${body_2_bold(`By default, a random long and lat will be assigned to the running program`)} + ${body_2(`--loc: use this option to run the program with and specific long and lat value`)} - The jamrun command creates a run state in the $HOME/.jamruns folder. + ${header_2(`The jamrun command creates a run state in the $HOME/.jamruns folder.`)} `; console.log(usageMessage) @@ -617,7 +647,7 @@ async function main(){ catch(error){ show_usage() - console.log(error.message) + error.message === "SHOW USAGE" ? null : console.log(error.message) process.exit(1); } diff --git a/tools/parser.mjs b/tools/parser.mjs index 1551e77f7..8de7fe7b8 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -57,23 +57,19 @@ const jamlistOptionDefinition = [ {name : 'portNum', type: String , defaultValue: undefined }, {name : 'appName', type: String , defaultValue: undefined }, {name : 'programName', type: String , defaultValue: undefined }, - {name : 'hostIP', type: String , defaultValue: undefined }, {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call ]; const jamkillOptionDefinition = [ - {name : "help", type: Boolean, defaultValue : false }, + {name : 'help', type: Boolean, defaultValue : false }, {name : 'all', type: Boolean , defaultValue: false }, {name : 'reset', type: Boolean , defaultValue: false }, - {name : 'app', type: Boolean , defaultValue: false }, - {name : 'program', type: Boolean , defaultValue: false }, - {name : 'dir', type: Boolean , defaultValue: false }, - {name : 'port', type: Boolean , defaultValue: false }, - {name: "portDir", type: Boolean, defaultValue: false }, + {name : 'appName', type: String , defaultValue: false }, + {name : 'programName', type: String , defaultValue: false }, + {name : 'portNum', type: String , defaultValue: false }, {name: "pause", type: Boolean, defaultValue: false }, - {name : 'name', type: String , defaultValue: undefined }, {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call @@ -320,42 +316,11 @@ export function getKilltArgs(argv){ error.type = "ShowUsage" throw error; } - const flagCheck = ((options.all?1:0) + (options.app?1:0) + (options.dir?1:0) + (options.program?1:0) + (options.port? 1: 0) + (options.portDir? 1: 0) + (options.reset? 1: 0)); - if( flagCheck !== 1 ){ - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" - throw error; - } - let flag; - if(!options.name && !options.all && !options.reset){ - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" - throw error; - } - if(options.all){ - flag = "all"; - } - else if(options.app){ - flag = "app"; - } - else if(options.dir){ - flag = "dir"; - } - else if(options.port){ - flag = "port" - } - else if(options.portDir){ - flag = "portDir" - } - else if(options.reset){ - flag = "reset" - } - else{ - flag = "program"; - } - return {"flag": flag, "name" : options.name, "pause": options.pause , "remote": options.remote , "root":options.root} + + + return options } From 972a2782a0c7c2414f922302c0aae47745b6b1e0 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 9 Aug 2024 16:48:26 -0400 Subject: [PATCH 066/126] jamlist and jamkill args to '==' format and --app, --prog, --port --- tools/jamkill.mjs | 47 ++++++++++++++++++++----------------- tools/jamlist.mjs | 17 ++++++++------ tools/parser.mjs | 60 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 82 insertions(+), 42 deletions(-) diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 578210341..01ea41fd9 100755 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -28,11 +28,11 @@ function show_usage(){ [--reset] [--help] [--all] - [--remote = ${body_sec(`IPAddress`)}] + [--remote=${body_sec(`IPAddress`)}] [--pause] - [--appName = ${body_sec(`appName`)}] - [--programName = ${body_sec(`programName`)}] - [--portNum = ${body_sec(`portNum`)}] + [--app==${body_sec(`appName`)}] + [--prog==${body_sec(`programName`)}] + [--port==${body_sec(`portNum`)}] ${header_1(`DESCRIPTION`)} @@ -52,7 +52,7 @@ function show_usage(){ ${body_2(`Use this flag to kill all the running apps.`)} ${body_2_bold(`NOTE: 1) if using --all next to the --reset flag. --all will be dissabled. - 2) if using --all flag --appName, --programName, --appName will be dissabled.`)} + 2) if using --all flag --app, --prog, --port will be dissabled.`)} --- jamkill [--pause] ${body_2(`Use this flag to pause the running programs instead of killing them.`)} @@ -62,20 +62,22 @@ function show_usage(){ ${body_2_bold(`NOTE: jamkill --remote is only allowed to kill the remote programs which are started by thesame local machine which is running the jamkill.`)} - --- jamkill [--appName=X] + --- jamkill [--app==X] ${body_2(`Use this flag to kill or pause a program with a scpecific appName.`)} - --- jamkill [--programName=X] + --- jamkill [--prog==X] ${body_2(`Use this flag to kill or pause a program with a specific programName.`)} - --- jamkill [--portNum=X] + --- jamkill [--port=3] ${body_2(`Use this flag to kill or pause a program with running on a certain port.`)} NOTE: - ${body_2(`--appName & --programName & --portNumber can be used all togeather or two by two to select the programs to be killed or paused.`)} + ${body_2(`1) --app & --prog & --port can be used all togeather or two by two to select the programs to be killed or paused.`)} + ${body_2(`2) To set --app , --prog and --port options two equal signs has to be used.`)} + RESTRICTIONS: - ${body_2(`can't use multiple --appName , --programName and --portNumber flags hoping to kill apps with different appNames, + ${body_2(`can't use multiple --app , --prog and --port flags hoping to kill apps with different appNames, programNames and portNumbers in one shot.`)} @@ -251,14 +253,14 @@ async function jamKill(args) } else{ let Filter ={} - if(args.programName){ - Filter["programName"] = `${args.programName}.jxe` + if(args.prog){ + Filter["programName"] = `${args.prog}.jxe` } - if(args.appName){ - Filter["appName"] = args.appName + if(args.app){ + Filter["appName"] = args.app } - if(args.portNum){ - Filter["portNumber"] = args.portNum + if(args.port){ + Filter["portNumber"] = args.port } toKill = filter(jamData,Filter ) @@ -355,6 +357,7 @@ async function main(){ catch(error){ show_usage() + error.message === "SHOW USAGE"?null:console.log(error.message) process.exit(1); } @@ -387,14 +390,14 @@ async function main(){ const changeDir= "cd JAMScript/tools" let toExecute; let filters =``; - if(args.programName){ - filters = filters+`--programName=${programName} ` + if(args.prog){ + filters = filters+`--prog==${args.prog} ` } - if(args.appName){ - filters = filters+`--appName=${appName} ` + if(args.app){ + filters = filters+`--app==${args.app} ` } - if(args.portNum){ - filters = filters+`--portNum=${portNum} ` + if(args.port){ + filters = filters+`--port==${args.port} ` } filters = filters.trim() diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 67cd611dd..b276470bb 100755 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -197,9 +197,9 @@ function getNodeInfo(root=null){ fileNames[fileName] = data; } } - fileNames["portNum"] = String(port) - fileNames["appName"] = appName - fileNames["programName"] = programName + fileNames["port"] = String(port) + fileNames["app"] = appName + fileNames["prog"] = programName if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ fileNames["status"] = "paused" } @@ -229,9 +229,9 @@ function getNodeInfo(root=null){ fileNames[fileName] = data; } } - fileNames["portNum"] = String(port) - fileNames["appName"] = appName - fileNames["programName"] = programName + fileNames["port"] = String(port) + fileNames["app"] = appName + fileNames["prog"] = programName if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ fileNames["status"] = "paused" } @@ -257,7 +257,7 @@ function printNodeInfo(info){ if(row["host"] === currIP){ row["host"] = "localHost" } - const headerString = ` ${row["appName"].padEnd(10)} ${row["programName"].padEnd(10)} ${("Local:"+row["portNum"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)}`; + const headerString = ` ${row["app"].padEnd(10)} ${row["prog"].padEnd(10)} ${("Local:"+row["port"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)}`; console.log(headerString) } } @@ -445,6 +445,9 @@ async function main(update=null){ let keysToRemove = ["root","remote","help","all" ]; let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + if(filteredObj["prog"]){ + filteredObj["prog"] + } const filtered = filter(nodeinfo, filteredObj) diff --git a/tools/parser.mjs b/tools/parser.mjs index 8de7fe7b8..6d9cbb171 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -1,5 +1,6 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; +import { error } from 'console'; import { type } from 'os'; import { string } from 'random-js'; import { fs } from 'zx'; @@ -54,9 +55,9 @@ const jamlistOptionDefinition = [ {name : 'type', type: String , defaultValue: undefined }, {name : 'dataStore', type: String , defaultValue: undefined }, {name : 'tmuxid', type: String , defaultValue: undefined }, - {name : 'portNum', type: String , defaultValue: undefined }, - {name : 'appName', type: String , defaultValue: undefined }, - {name : 'programName', type: String , defaultValue: undefined }, + {name : 'port', type: String , defaultValue: undefined }, + {name : 'app', type: String , defaultValue: undefined }, + {name : 'prog', type: String , defaultValue: undefined }, {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call @@ -66,9 +67,9 @@ const jamkillOptionDefinition = [ {name : 'help', type: Boolean, defaultValue : false }, {name : 'all', type: Boolean , defaultValue: false }, {name : 'reset', type: Boolean , defaultValue: false }, - {name : 'appName', type: String , defaultValue: false }, - {name : 'programName', type: String , defaultValue: false }, - {name : 'portNum', type: String , defaultValue: false }, + {name : 'app', type: String , defaultValue: false }, + {name : 'prog', type: String , defaultValue: false }, + {name : 'port', type: String , defaultValue: false }, {name: "pause", type: Boolean, defaultValue: false }, {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call @@ -262,7 +263,7 @@ export function getJamListArgs(argv){ catch(error){ } - if(options?.help || !options){ + if(options.help || !options){ const error = new Error("SHOW USAGE") error.type = "ShowUsage" @@ -286,8 +287,16 @@ export function getJamListArgs(argv){ } else{ - filters[key] = options[key] - + console.log(options[key], key, options) + if(key === "prog" || key === "app" || key === "port"){ + if(options[key].includes("=")) + filters[key]=(((options[key].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') + else + throw new Error(`${key} is missing '='`) + } + else{ + filters[key] = options[key] + } } } @@ -316,10 +325,35 @@ export function getKilltArgs(argv){ error.type = "ShowUsage" throw error; } - - - - + if(options["app"]){ + if(options["app"].includes("=")){ + let newOption = (((options["app"].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') + console.log(newOption) + options["app"] = newOption + } + else{ + throw new Error("app argument missing '=' ") + } + } + if(options["prog"]){ + if(options["prog"].includes("=")){ + let newOption = (((options["prog"].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') + options["prog"] = newOption + } + else{ + throw new Error("program argument missing '=' ") + } + } + if(options["port"]){ + if(options["port"].includes("=")){ + let newOption = (((options["port"].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') + options["port"] = newOption + } + else{ + throw new Error("port argument missing '=' ") + } + } + console.log(options) return options } From 71df879ec32fd3de1d6b427104e97cca08cd2838 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 9 Aug 2024 18:37:05 -0400 Subject: [PATCH 067/126] jamlist monitoring fixed, jamlist usage updated --- tools/jamlist.mjs | 119 ++++++++++++++++++++++++++++++++++++---------- tools/parser.mjs | 2 +- 2 files changed, 95 insertions(+), 26 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index b276470bb..7f2c107b9 100755 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -5,6 +5,8 @@ import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; import { Client } from 'ssh2'; +import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; + const { debounce } = require('lodash'); const chokidar = require('chokidar'); @@ -23,6 +25,97 @@ currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); } +function show_usage(){ + + const usageMessage = + ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jamlist`)}${body_1(` -- a tool to display the active programs and their attributes.`)} + + ${header_1(`SYNOPSIS`)} + + Usage: jamlist + [--help] + [--all] + [--monitor] + [--type==${body_sec(`program type`)}] + [--dataStore==${body_sec(`dataStore address`)}] + [--tmuxid==${body_sec(`tmuxid`)}] + [--port==${body_sec(`portNum`)}] + [--app==${body_sec(`appName`)}] + [--prog==${body_sec(`programName`)}] + [--remote] + + + + + ${header_1(`DESCRIPTION`)} + + ${keyWord('Note: By default jamlist lists all the active local programs and print it before terminating.')} + + --- ${keyWord('jamlist displays the folloing attribute of the running apps:')} + + 1) NAME: ${body_2("program's app name.")} + 2) PROGRAM: ${body_2("program's program name.")} + 3) PORT: ${body_2("the MQTT port used by program.")} + 4) D-STORE: ${body_2("the dataStore used by the program.")} + 5) TYPE: ${body_2("either one of fog, device or cloud depending on the program's type.")} + 7) TMUX-ID: ${body_2("the generic tmux ID used by the program (not including the tag).")} + 8) STATUS: ${body_2("either running or paused based on the program status.")} + 9) HOST: ${body_2("localHost if program is running locally or IPAddress of the remote machine running the program.")} + 10) UP-TIME: ${body_2("the duration of the program running in the format of hour-minute-sec.")} + + + --- jamlist [--help] + ${body_2("use this flag to dispaly this usage msg.")} + + --- jamlist [--all] + ${body_2("use this flag to dispaly all the Active programs.")} + ${body_2_bold(`NOTE: + 1) This is same as using jamlist with no option and flags. + 2) Using --all disable all the filtering flags (the ones with "==").`)} + + --- jamlist [--monitor] + ${body_2(`monitor flag keeps the jamlist alive after priniting the list of programs. + as the program stays alive it re-paints the console with new info on any chnages.`)} + + --- jamlist [--remote] + ${body_2(`Use this flag to include the remote active apps started by the local machine running the jamlist.`)} + + --- jamlist [--type==fog] + ${body_2(`Use --type to list only active programs with a certain type. + The command above lists all the fog programs. + The valid values for type are:`)} + ${body_2_bold(`1) device + 2) cloud + 3) fog`)} + + --- jamlist [--dataStore==127.0.0.1:21883] + ${body_2(`used --dataStore option to list all the active apps with the given dataStore address.`)} + + --- jamlist [--tmuxid==tg-25165] + ${body_2(`used ---tmuxid option to list all the active apps with the given tmuxid.`)} + + --- jamlist [--port=3] + ${body_2(`used --port option to list all the active apps running on the given port.`)} + + --- jamlist [--app==XX3] + ${body_2(`used --app option to list all the active apps with the given app name.`)} + + --- jamlist [--prog==X] + ${body_2(`used --prog option to list all the active apps with the given program name.`)} + + NOTE: + --type, --dataStore, --tmuxid, --port, --app and --prog are filters and can be used together. + + `; + + console.log(usageMessage) + + +} + export function getRunningDirs(){ const jamFolder = getJamFolder() @@ -347,27 +440,7 @@ async function main(update=null){ catch(error){ - console.log( - - ` - - Usage: - jamlist --help: show this usage msg. - - jamlist has two made modes. the default is just printing the list of requested programs but if it's required to monitor the apps and update upon changes, - the --monitor should be used. it prints the list of requested programs, and keeps montoring them, if there is any change it will be updated. - - by default jamlist only monitors or prints out locally running programs yet if it's required to monitor or list none local programs as well, --remote - flag should be used. - - by passing the --all flag jamlist is going to list all the running apps. if there is certain restriction needs to be applied the following filters can be used: - [type= | dataStore= | tmuxid= | portNum= | appName= | programName= ] - NOTE: all the abouve arguments can be used togeather but using --all will dissable them all and removes all the filters - - - ` - - ) + show_usage() console.log(error.message); process.exit(1); @@ -445,10 +518,6 @@ async function main(update=null){ let keysToRemove = ["root","remote","help","all" ]; let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); - if(filteredObj["prog"]){ - filteredObj["prog"] - } - const filtered = filter(nodeinfo, filteredObj) if(filtered.length === 0 ){ diff --git a/tools/parser.mjs b/tools/parser.mjs index 6d9cbb171..67c167594 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -288,7 +288,7 @@ export function getJamListArgs(argv){ } else{ console.log(options[key], key, options) - if(key === "prog" || key === "app" || key === "port"){ + if(key === "prog" || key === "app" || key === "port" || key === "type" || key === "tmuxid" || key === "dataStore"){ if(options[key].includes("=")) filters[key]=(((options[key].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') else From 5921a872a614b22aeb4f5a9e9d304bbe547a0eb6 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 9 Aug 2024 23:02:42 -0400 Subject: [PATCH 068/126] format fix, jamlist fix, uptime added --- tools/jamlist.mjs | 72 ++++++++++++++++++++++++++++++++++++++++------- tools/jamrun.mjs | 4 ++- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index 7f2c107b9..b45c6022a 100755 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -6,6 +6,7 @@ import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; import { Client } from 'ssh2'; import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; +import { chalk } from "zx"; const { debounce } = require('lodash'); @@ -16,6 +17,7 @@ const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); let NODESINFO = [] +let cachedInfo = [] let currIP ; if (os.platform() === 'win32') { currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); @@ -116,6 +118,32 @@ function show_usage(){ } +function getUpTime(startStamp){ + const now = Date.now(); + const Diff = now - startStamp; + const hours = Math.floor(Diff / (1000 * 60 * 60)); + const minutes = Math.floor((Diff % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((Diff % (1000 * 60)) / 1000); + + let result = ''; + + if (hours !== 0) { + result = result + `${hours}h `; + } + if (minutes !== 0) { + result = result + `${minutes}min `; + } + if (seconds !== 0) { + result = result + `${seconds}sec`; + } + if (result === '') { + result = Diff + "ms"; + } + + return result; + + +} export function getRunningDirs(){ const jamFolder = getJamFolder() @@ -169,9 +197,15 @@ function getWatchList(filters){ + function watch(filters) { setInterval(async () => { await $`zx ${jamcleanPath}` + if(cachedInfo){ + console.clear() + printHeader(); + printNodeInfo(cachedInfo); + } }, 1000); function updateWatchList(watchList){ @@ -200,17 +234,18 @@ function watch(filters) { if (info.length + NODESINFO.length === 0) { - console.log("---------"); + console.clear() console.log("There is no program running"); } else { - console.log("---------"); + console.clear() printHeader(); printNodeInfo(info); if(filters.remote){ printNodeInfo(NODESINFO); } + cachedInfo = info.concat(NODESINFO) } } else { const nodeinfo = getNodeInfo(); @@ -224,16 +259,15 @@ function watch(filters) { } if (filtered.length + NODESINFO.length === 0) { - console.log("---------"); - + console.clear() console.log("There is no such program running"); } else { - console.log("---------"); - + console.clear() printHeader(); printNodeInfo(filtered); if(filters.remote){ printNodeInfo(NODESINFO); + cachedInfo = filtered.concat(NODESINFO) } } @@ -279,7 +313,7 @@ function getNodeInfo(root=null){ if(fs.existsSync(`${appfolder}/${app}/${port}/root`)){ const rootIP = fs.readFileSync(`${appfolder}/${app}/${port}/root`).toString().trim(); if(rootIP === root){ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-"} + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-", "startStamp": '-'} const dirPath = `${appfolder}/${app}/${port}` if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") @@ -311,7 +345,7 @@ function getNodeInfo(root=null){ } } else{ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" } + const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" , "startStamp": "-"} const dirPath = `${appfolder}/${app}/${port}` if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") @@ -350,15 +384,29 @@ function printNodeInfo(info){ if(row["host"] === currIP){ row["host"] = "localHost" } - const headerString = ` ${row["app"].padEnd(10)} ${row["prog"].padEnd(10)} ${("Local:"+row["port"]).padEnd(10)} ${row["parentId"].padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)}`; + + let UPTIME; + if(row["status"]!=="paused"){ + UPTIME = getUpTime(row["startStamp"]) + } + else{ + UPTIME = "-" + } + const headerString = ` ${row["app"].padEnd(10)} ${row["prog"].padEnd(10)} ${("Local:"+row["port"]).padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)} ${UPTIME.padEnd(10)}`; console.log(headerString) } } function printHeader(){ - const headerString = ` ${"NAME".padEnd(10)} ${"PROGRAM".padEnd(10)} ${"HOST".padEnd(10)} ${"PARENT".padEnd(10)} ${"D-STORE".padEnd(20)} ${"TYPE".padEnd(10)} ${"C-NODES".padEnd(10)} ${"TMUX-ID".padEnd(10)} ${"STATUS".padEnd(10)} ${"HOST".padEnd(10)}`; + const headerString = ` ${chalk.bold.italic("NAME".padEnd(10))} ${chalk.bold.italic("PROGRAM".padEnd(10))} ${chalk.bold.italic("PORT".padEnd(10))} ${chalk.bold.italic("D-STORE".padEnd(20))} ${chalk.bold.italic("TYPE".padEnd(10))} ${chalk.bold.italic("C-NODES".padEnd(10))} ${chalk.bold.italic("TMUX-ID".padEnd(10))} ${chalk.bold.italic("STATUS".padEnd(10))} ${chalk.bold.italic("HOST".padEnd(10))} ${chalk.bold.italic("UP-TIME".padEnd(10))}`; console.log(headerString) + // console.log(`${chalk.black.cyan("--------------------------------------------------------------------------------------------------------------")}`) + console.log(`${chalk.cyan("=========================================================================================================================")}`) + + + + } function filter(nodeinfo, filters){ @@ -541,9 +589,11 @@ async function main(update=null){ process.exit(0) } } + console.clear(); printHeader(); printNodeInfo(info); printNodeInfo(NODESINFO) + cachedInfo = info.concat(NODESINFO) } else{ @@ -560,9 +610,11 @@ async function main(update=null){ process.exit(0) } } + console.clear(); printHeader(); printNodeInfo(filtered); printNodeInfo(NODESINFO) + cachedInfo = filtered.concat(NODESINFO) } if(monitor){ watch(filters); diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 4f87a1405..432272fe8 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -137,7 +137,7 @@ function show_usage(){ [--help] [--fog | --cloud | --device] [--num = ${body_sec(`num_c_devs`)}] - [--dat = ${body_sec(`data-url`)}] + [--data = ${body_sec(`data-url`)}] [--tags = ${body_sec(`quoted_list_of_tags`)}] [--bg] [--old] @@ -277,6 +277,8 @@ async function dojamout_p1(pnum ,floc) { fs.writeFileSync(`${floc}/${pnum}/paused`, "false\n"); fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); + fs.writeFileSync(`${floc}/${pnum}/startStamp`, `${Date.now()}`+"\n"); + if(Type === "device"){ fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); } From 35f39c2fbb9850789aaede261017f4f0cb90e118 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Sat, 10 Aug 2024 16:07:53 -0400 Subject: [PATCH 069/126] patch fix -- old version of jamterm cherry picked --- tools/inc/misc_tools.sh | 268 ++++++++++++++++++++++++++++++++++++++++ tools/jamclean.mjs | 2 +- tools/jamterm | 97 +++++++++++++++ 3 files changed, 366 insertions(+), 1 deletion(-) create mode 100644 tools/inc/misc_tools.sh create mode 100755 tools/jamterm diff --git a/tools/inc/misc_tools.sh b/tools/inc/misc_tools.sh new file mode 100644 index 000000000..faa06a696 --- /dev/null +++ b/tools/inc/misc_tools.sh @@ -0,0 +1,268 @@ + +# Utils used in the bash scripts + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + + +# We use the global variable 'result' to pass parameter values back +# + +# +# Call like the following +# inc_counter counter_name +# the counter_name is a file location +# +inc_counter() { + local counter=$1 + local value + + if [ -e $counter ]; then + value=`cat $counter` + ((value++)) + result=$value + else + value=1 + result=1 + fi + echo $value > $counter +} + +inc_counter_sync() { + local counter=$1 + local value + + if [ -e $counter ]; then + value=`cat $counter` + ((value++)) + result=$value + else + value=1 + result=1 + fi + echo $value > $counter + sync +} + + +# set_counter 10 $jamfolder/global/count +set_counter() { + local value=$1 + local counter=$2 + + if [ ! -e $counter ]; then + echo $value > $counter + fi +} + +set_counter_sync() { + local value=$1 + local counter=$2 + + if [ ! -e $counter ]; then + echo $value > $counter + fi + sync +} + + + +# dec_counter counter_name +# +dec_counter() { + local counter=$1 + + if [ ! -e $counter ]; then + die "Trying to decrement a non-existent counter $counter" + fi + + local value=`cat $counter` + if [ ! -z $value ]; then + ((value--)) + echo $value > $counter + fi + result=$value +} + +dec_counter_sync() { + local counter=$1 + + if [ ! -e $counter ]; then + die "Trying to decrement a non-existent counter $counter" + fi + + local value=`cat $counter` + if [ ! -z $value ]; then + ((value--)) + echo $value > $counter + fi + result=$value + sync +} + +# save_no_overwrite value location +# +save_no_overwrite() { + local value=$1 + local location=$2 + + if [ ! -e $location ]; then + echo $value > $location + else + local x=`cat $location` + if [ -z $x ]; then + echo $value > $location + fi + fi +} + + +save_no_overwrite_sync() { + local value=$1 + local location=$2 + + if [ ! -e $location ]; then + echo $value > $location + else + local x=`cat $location` + if [ -z $x ]; then + echo $value > $location + fi + fi + sync +} + + +# save value location +# with overwrite +save() { + local value=$1 + local location=$2 + + echo $value > $location +} + + +save_sync() { + local value=$1 + local location=$2 + + echo $value > $location + sync +} + + +create_missingdir() { + local dirn=$1 + + if [ ! -e $dirn ]; then + mkdir $dirn + fi +} + +exit_missingdir() { + local dirn=$1 + local emsg=$2 + if [ ! -d $dirn ]; then + echo $emsg + exit 0 + fi +} + +wait_missingdir() { + local rootdir=$1 + local watchdir=$2 + + if [ ! -d $watchdir ]; then + while :; do + inotifywait -e create -t 1 $rootdir + if [ -d $watchdir ]; then break; fi + done + fi +} + + +exit_missingfile() { + local file=$1 + local emsg=$2 + + if [ ! -e $file ]; then + echo $emsg + exit 0 + fi +} + +create_conffile() { + local file=$1 + local contents=$2 + + echo "#" | cat > $1 + echo "allow_anonymous true" | cat >> $1 + echo "#" | cat >> $1 + echo "listener ${2}" | cat >> $1 +} + +check_prog() { + local prog=$1 + local msg=$2 + + local present=`which $prog` + if [ -z $present ]; then + echo $msg + exit 0 + fi +} + +# Check the Program +# If the program is not there.. check the alt. +# Print error and exit if the alt is missing as well +# +check_set_check_prog() { + prog=$1 + local msg=$2 + altprog=$3 + + local present=`which $prog` + if [ -z $present ]; then + prog=$altprog + local present=`which $prog` + if [ -z $present ]; then + echo $msg + exit 0 + fi + fi +} + +buildjargs() { + local str= + for x in $@; do + str+=" " + local xtail="${x##*=}" + local xhead="${x%=*}" + + if [ ! -z $xtail ]; then + str+=$x + fi + done + + str+=" --$type" + + results=$str +} + +buildcargs() { + local str= + for x in $@; do + str+=" " + local xtail="${x##*=}" + local xhead="${x%=*}" + + if [ ! -z $xtail ]; then + str+="$xhead $xtail" + fi + done + + results=$str +} diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 8c43e4635..f6a59a946 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -259,7 +259,7 @@ async function clean(){ AppToRemove.set(port,dummy) } else{ - AppToRemove.set(port,dir) + AppToRemove.set(port,[dir]) } } //It's running and files are uptodate, update Cnum and clean cdevs diff --git a/tools/jamterm b/tools/jamterm new file mode 100755 index 000000000..7f7a0a509 --- /dev/null +++ b/tools/jamterm @@ -0,0 +1,97 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +# Edit the following locations to provide the +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Shows the background terminals with the given tmux-id and terminal-num. + +Usage: jamterm [tmux-id] [-t terminal-num] + +jamterm +Shows the first C terminal of the program that was last started. + +jamterm -t 2 + + +jamterm u-600-dev-2331 -t 2 +Shows the second C terminal of the program running under u-600-dev-2331. + +jamterm u-600-dev-2331 +Shows the first C terminal of the program running under u-600-dev-2331. + +EOF +} + +localtmux() { + local tmuxapp=$1 + local termno=$2 + + $TMUX has-session -t $tmuxapp-$termno 2>/dev/null + res=$? + if [ $res == "0" ]; then + if [ -z $termno ]; then + $TMUX attach -t $tmuxapp + else + $TMUX attach -t $tmuxapp-$termno + fi + fi +} + + +### +# Main script execution begins here... +# + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" + +appsfolder=$jamfolder/apps +exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" + +cd $appsfolder + +if [ -z $1 ]; then + if [ -e tmuxid ]; then + tmuxid=`cat tmuxid` + localtmux $tmuxid 1 + exit + fi +else + # Show help + if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit + elif [ $1 == "-t" ]; then + if [ -e tmuxid ]; then + tmuxid=`cat tmuxid` + localtmux $tmuxid $2 + exit + fi + exit + else + if [ -z $2 ]; then + termid=1 + else + if [ -n $3 ] && [ $2 == "-t" ]; then + termid=$3 + fi + fi + localtmux $1 $termid + fi +fi From ae8431be7e3dde2d9af49243ed88da796cac7384 Mon Sep 17 00:00:00 2001 From: Mahesh Maheswaran Date: Sun, 11 Aug 2024 12:39:46 -0400 Subject: [PATCH 070/126] modified the install scripts --- install.sh | 2 +- package.json | 2 +- tests/LocalCalls/test.js | 24 ++++++++++++++++++++++++ tools/jamc | 1 + tools/jamclean.mjs | 2 +- tools/jamkill.mjs | 10 +++++----- tools/jamlist.mjs | 8 ++++---- tools/jamlog.mjs | 2 +- tools/jamrun.mjs | 25 ++++++++++++++++++------- tools/parser.mjs | 2 +- 10 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 tests/LocalCalls/test.js create mode 120000 tools/jamc diff --git a/install.sh b/install.sh index 67d0c864c..b22b7b9c6 100755 --- a/install.sh +++ b/install.sh @@ -149,7 +149,7 @@ cd $SCRIPT_DIR git submodule update --init --recursive lib/ #install tinycbor -cd $SCRIPT_DIR/deps/tinycbor +cd $SCRIPT_DIR/deps git clone https://github.com/intel/tinycbor cd tinycbor make diff --git a/package.json b/package.json index f1bceffec..35f7b00e8 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "mqtt": "=4.3.7", "node-localstorage": ">= 1.3.0", "node-ssh": "^13.1.0", - "ohm-js": "17.1.0", + "ohm-js": "^17.1.0", "pino": "^8.15.0", "ps-node": "^0.1.6", "random-js": "^2.1.0", diff --git a/tests/LocalCalls/test.js b/tests/LocalCalls/test.js new file mode 100644 index 000000000..88e644b11 --- /dev/null +++ b/tests/LocalCalls/test.js @@ -0,0 +1,24 @@ +const { readFileSync } = require('fs'); + +const { Client } = require('ssh2'); + +const conn = new Client(); +conn.on('ready', () => { + console.log('Client :: ready'); + conn.shell((err, stream) => { + if (err) throw err; + stream.on('close', () => { + console.log('Stream :: close'); + conn.end(); + }).on('data', (data) => { + console.log('OUTPUT: ' + data); + }); + stream.end('export PATH=$PATH:$HOME/Programs/JAMScript/tools\n which jamrun.mjs \nexit\n'); + }); +}).connect({ + host: '10.0.1.9', + port: 22, + username: 'maheswar', + password: 'pass4des' +}); + diff --git a/tools/jamc b/tools/jamc new file mode 120000 index 000000000..14f41bc1d --- /dev/null +++ b/tools/jamc @@ -0,0 +1 @@ +../mainCompiler.js \ No newline at end of file diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index f6a59a946..4e53195a0 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -410,7 +410,7 @@ async function cleanRemote(toRemove){ const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir= "cd JAMScript/tools" - const script = `zx jamclean.mjs --root=${currIP} --hash=${arg}` + const script = `jamclean.mjs --root=${currIP} --hash=${arg}` const result = await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) const toRemove = result.trim().split("\n"); if(toRemove.length !==0 && toRemove[0] !== ''){ diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 01ea41fd9..d31536f63 100755 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -402,21 +402,21 @@ async function main(){ filters = filters.trim() if(args.flag == "reset"){ - toExecute = `zx jamkill.mjs --reset --root=${currIP}` + toExecute = `jamkill.mjs --reset --root=${currIP}` } else if(args.flag == "all"){ if(!args.pause) - toExecute = `zx jamkill.mjs ${filters} --root=${currIP}` + toExecute = `jamkill.mjs ${filters} --root=${currIP}` else - toExecute = `zx jamkill.mjs ${filters} --pause --root=${currIP}` + toExecute = `jamkill.mjs ${filters} --pause --root=${currIP}` } else{ if(!args.pause) - toExecute = `zx jamkill.mjs ${filters} --name=${args.name} --root=${currIP}` + toExecute = `jamkill.mjs ${filters} --name=${args.name} --root=${currIP}` else - toExecute = `zx jamkill.mjs ${filters} --name=${args.name} --pause --root=${currIP}` + toExecute = `jamkill.mjs ${filters} --name=${args.name} --pause --root=${currIP}` } diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index b45c6022a..d591e95be 100755 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -507,9 +507,9 @@ async function main(update=null){ const [host,port] = machines.split("_"); const config = { host: host, - port: port, - username: 'admin', - password: 'admin' + port: 22, + username: 'maheswar', + password: 'pass4des' }; const client = await makeConnection(config); const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" @@ -533,7 +533,7 @@ async function main(update=null){ args =args.trim() - const script = `zx jamlist.mjs ${args} --root=${currIP}` + const script = `jamlist.mjs ${args} --root=${currIP}` await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) } diff --git a/tools/jamlog.mjs b/tools/jamlog.mjs index 1862e4903..fb9fa7d3e 100755 --- a/tools/jamlog.mjs +++ b/tools/jamlog.mjs @@ -216,7 +216,7 @@ async function main(){ } const finalArg = args.trim() - const command = `${pathExport} && ${changeDir} && zx jamlog.mjs ${finalArg}` + const command = `${pathExport} && ${changeDir} && jamlog.mjs ${finalArg}` await makeConnection(config) await executeScript(client, command) diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 432272fe8..72a6957d9 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -99,19 +99,24 @@ const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( async function executeScript(client, command){ + console.log("Execute Script cmd ", command ); + command = "echo $PATH"; + return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ + client.exec(command, (err,stream) => { if (err){ + console.log("Rejected...."); reject(err); } let result; stream.on("close", () => { + console.log("Closing..."); resolve(result) }) stream.on("data" , async (data) =>{ + console.log("hi --------------- ", data.toString()); if(data.includes("MY PORT IS:")) { - result = data.toString().trim().split(":")[1] } if(data.includes("EXIT BG")){ @@ -657,12 +662,15 @@ async function main(){ let ifile; let jdata; let client; + + console.log("Remote ..", remote); + if(remote){ const config = { - host: 'localhost', - port: remote, - username: 'admin', - password: 'admin' + host: remote, + port: 22, + username: 'maheswar', + password: 'pass4des' }; if(resume){ const jamfolder = getJamFolder() @@ -691,6 +699,7 @@ async function main(){ reject(error); }); + console.log("Initiating connection to ....", config); client.connect(config); }); const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) @@ -704,7 +713,9 @@ async function main(){ } else if (os.platform() === 'linux') { currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); } - const myPort = await executeScript(client, `${changeDir} && zx jamrun.mjs ${remoteArgs} --root=${currIP}`) + const myPort = await executeScript(client, `${changeDir} && jamrun.mjs ${remoteArgs} --root=${currIP}`) + + console.log("IP ", currIP, " port ", myPort); if(!resume){ const jamfolder = getJamFolder() diff --git a/tools/parser.mjs b/tools/parser.mjs index 67c167594..793dce140 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -43,7 +43,7 @@ const jamrunOptionDefinitions = [ {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, {name: 'resume', type: Boolean, defaultValue: false}, {name: "port", type: Number, defaultValue: undefined}, - {name: "remote", type:Number, defaultValue: undefined},//the IP ADDRESS YOU WANT TO CONNECT TO + {name: "remote", type:String, defaultValue: undefined},//the IP ADDRESS YOU WANT TO CONNECT TO {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call ]; From a605ff5cfc726cc414ae4b442ff4b0bf3d8045f2 Mon Sep 17 00:00:00 2001 From: Mahesh Maheswaran Date: Sun, 11 Aug 2024 20:36:36 -0400 Subject: [PATCH 071/126] removed the resume and pause --- tools/cleanUp.mjs | 25 -- tools/jamclean.mjs | 10 - tools/jamkill.mjs | 261 +++++------ tools/jamlist.mjs | 768 ++++++++++++++++---------------- tools/jamrun.mjs | 1046 +++++++++++++++++++++----------------------- tools/parser.mjs | 655 ++++++++++++++------------- 6 files changed, 1339 insertions(+), 1426 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index d0eb87e61..09ae85ac3 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -138,17 +138,6 @@ function cleanAppDir(removablePort,appName, programName){ return false; } -function markPause(PortNumber,appName ,programName){ - const appfolder = getAppFolder() - const pName = programName.split(".")[0] - fs.writeFileSync(`${appfolder}/${pName}_${appName}/${PortNumber}/paused`, `${PortNumber}`) -} -// export function cleanup(removablePort, tmuxIds,app,TMUX){ -// cleanPort(removablePort,app); -// ArchiveLog(removablePort); -// cleanAppDir(removablePort); -// killtmux(tmuxIds,TMUX); -// } export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ @@ -178,17 +167,3 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr } }; - -export function pauseByPortNumber(programName, appName, PortNumber, NOVERBOSE=true){ - - if(!programName || !appName || !PortNumber){ - if(!NOVERBOSE) - console.log("NO NEED FOR CLEANING") - return; - } - const tmuxIds = killtmux(PortNumber,appName ,programName); - if(!NOVERBOSE && tmuxIds) - console.log("Killed :", tmuxIds) - markPause(PortNumber,appName ,programName) - -}; \ No newline at end of file diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 4e53195a0..eafbbbb0a 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -232,16 +232,6 @@ async function clean(){ } const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") for(let dir of dirs){ - let isPaused; - try{ - isPaused = ((fs.readFileSync(`${appFolder}/${dir}/${port}/paused`).toString().trim()) !== "false") ? true : false - } - catch(error){ - - } - if(isPaused){ - continue; - } //mosquitto not running kill if(!await isMosquittoRunning(port)){ diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index d31536f63..702e1a26d 100755 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -2,25 +2,33 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" -import { cleanByPortNumber , pauseByPortNumber} from "./cleanUp.mjs"; +import { cleanByPortNumber} from "./cleanUp.mjs"; import { Client } from 'ssh2'; import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; let currIP; -if (os.platform() === 'win32') { - currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'darwin') { - currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'linux') { - currIP =( await $`hostname -I`.catch(() => '')).toString().trim(); - } +if (os.platform() === "win32") { + currIP = ( + await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch( + () => "" + ) + ) + .toString() + .trim(); +} else if (os.platform() === "darwin") { + currIP = (await $`ipconfig getifaddr en0`.catch(() => "")) + .toString() + .trim(); +} else if (os.platform() === "linux") { + currIP = (await $`hostname -I`.catch(() => "")).toString().trim(); +} function show_usage(){ const usageMessage = ` ${header_1(`JAMTools 2.0`)} - ${header_2(`jamkill`)}${body_1(` -- a tool to kill or pause the running JXE files.`)} + ${header_2(`jamkill`)}${body_1(` -- a tool to kill one or more running JXE files.`)} ${header_1(`SYNOPSIS`)} @@ -29,7 +37,6 @@ function show_usage(){ [--help] [--all] [--remote=${body_sec(`IPAddress`)}] - [--pause] [--app==${body_sec(`appName`)}] [--prog==${body_sec(`programName`)}] [--port==${body_sec(`portNum`)}] @@ -43,7 +50,7 @@ function show_usage(){ it's useful for the cases that either the file directory is corrupted or a fresh start is required.`)} ${body_2_bold(`NOTE: The only usable flag is next to --reset flag is --remote otherwise, - --reset flag will dissable all the other flags and do a hard reset.`)} + --reset flag will disable all the other flags and do a hard reset.`)} --- jamkill [--help] ${body_2(`Use this flag to display this usage msg.`)} @@ -51,42 +58,37 @@ function show_usage(){ --- jamkill [--all] ${body_2(`Use this flag to kill all the running apps.`)} ${body_2_bold(`NOTE: - 1) if using --all next to the --reset flag. --all will be dissabled. - 2) if using --all flag --app, --prog, --port will be dissabled.`)} - - --- jamkill [--pause] - ${body_2(`Use this flag to pause the running programs instead of killing them.`)} + 1) If --all used next to the --reset flag. --all will be disabled. + 2) If --all used with --all flag --app, --prog, --port, they will be disabled.`)} --- jamkill [--remote] - ${body_2(`Use this flag to kill the remote files as well as local ones.`)} + ${body_2(`Use this flag to kill the executions as well as local ones.`)} ${body_2_bold(`NOTE: - jamkill --remote is only allowed to kill the remote programs which are started by thesame local machine which is running the jamkill.`)} + jamkill --remote only kills the remote programs which are started by the local machine running jamkill.`)} --- jamkill [--app==X] - ${body_2(`Use this flag to kill or pause a program with a scpecific appName.`)} + ${body_2(`Use this flag to kill a program with a specific appName.`)} --- jamkill [--prog==X] - ${body_2(`Use this flag to kill or pause a program with a specific programName.`)} + ${body_2(`Use this flag to kill a program with a specific programName.`)} --- jamkill [--port=3] - ${body_2(`Use this flag to kill or pause a program with running on a certain port.`)} + ${body_2(`Use this flag to kill a program running on a certain port.`)} NOTE: - ${body_2(`1) --app & --prog & --port can be used all togeather or two by two to select the programs to be killed or paused.`)} + ${body_2(`1) --app & --prog & --port can be used all together or two by two to select the programs to be killed.`)} ${body_2(`2) To set --app , --prog and --port options two equal signs has to be used.`)} RESTRICTIONS: - ${body_2(`can't use multiple --app , --prog and --port flags hoping to kill apps with different appNames, + ${body_2(`single command cannot have multiple --app , --prog and --port conditions to kill apps with different appNames, programNames and portNumbers in one shot.`)} - `; console.log(usageMessage) - - } + export function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() @@ -129,6 +131,7 @@ export function dirNameToAppName(dirName){ } } + export function dirNameToProgramName(dirName){ return (dirName.split('_'))[0] @@ -216,10 +219,6 @@ async function killProcess(data){ await killJFile(data); } -async function pauseProcess(data){ - await killJamRun(data); - await killJFile(data); -} function filter(data, filters){ console.log("filter", filters) @@ -242,8 +241,6 @@ function filter(data, filters){ async function jamKill(args) { - - let pause = args.pause let root = args.root let jamData = killDataForAll(root) console.log(jamData, "this is my jam data") @@ -277,37 +274,15 @@ async function jamKill(args) } - if(pause){ - for(let data of toKill){ - let appfolder = getAppFolder() - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - try{ - fs.existsSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/machType`) - if(fs.readFileSync(`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}/processId`).toString().trim() === "new"){ - console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) - } - } - catch(error){ - console.log("CAN'T PAUSE",`${appfolder}/${programName.split(".")[0]}_${appName}/${portNumber}. TRY LATER` ) - } - pauseByPortNumber(programName,appName,portNumber) - await pauseProcess(data); - } - } - else{ - for(let data of toKill){ - const appName = data.appName; - const programName = data.programName - const portNumber = data.portNumber - await killProcess(data); - cleanByPortNumber(programName,appName,portNumber) - } + for(let data of toKill){ + const appName = data.appName; + const programName = data.programName + const portNumber = data.portNumber + await killProcess(data); + cleanByPortNumber(programName,appName,portNumber) } //keep this LOG - console.log("KILLING IS OVER") - + console.log("Jobs terminated."); } async function jamKillBruteForce(){ @@ -346,109 +321,91 @@ async function executeScript(client, command){ })) } -async function main(){ - - let args; +async function main() { + let args; - try{ - args = getKilltArgs(process.argv) - - } - catch(error){ - - show_usage() - error.message === "SHOW USAGE"?null:console.log(error.message) + try { + args = getKilltArgs(process.argv); + } catch (error) { + show_usage(); + error.message === "SHOW USAGE" ? null : console.log(error.message); process.exit(1); + } - } - const jamfolder = getJamFolder(); - const appfolder = getAppFolder(); - if(fs.existsSync(`${jamfolder}/remote`) && args.remote && !args.root){ - const remotes = fs.readdirSync(`${jamfolder}/remote`) - for(let remote of remotes){ - const [host,port] = remote.split("_"); - const config = { - host: host, - port: port, - username: 'admin', - password: 'admin' - }; - let client = await new Promise((resolve, reject) => { - const client = new Client(); - - client.on('ready', () => { - resolve(client); - }); - - client.on('error', (error) => { - reject(error); + const jamfolder = getJamFolder(); + const appfolder = getAppFolder(); + if (fs.existsSync(`${jamfolder}/remote`) && args.remote && !args.root) { + const remotes = fs.readdirSync(`${jamfolder}/remote`); + for (let remote of remotes) { + const [host, port] = remote.split("_"); + const config = { + host: host, + port: port, + username: "admin", + password: "admin", + }; + let client = await new Promise((resolve, reject) => { + const client = new Client(); + + client.on("ready", () => { + resolve(client); + }); + + client.on("error", (error) => { + reject(error); + }); + + client.connect(config); }); + const pathExport = + "export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin"; + const changeDir = "cd JAMScript/tools"; + let toExecute; + let filters = ``; + if (args.prog) { + filters = filters + `--prog==${args.prog} `; + } + if (args.app) { + filters = filters + `--app==${args.app} `; + } + if (args.port) { + filters = filters + `--port==${args.port} `; + } + filters = filters.trim(); + + if (args.flag == "reset") { + toExecute = `jamkill.mjs --reset --root=${currIP}`; + } else if (args.flag == "all") { + toExecute = `jamkill.mjs ${filters} --root=${currIP}`; + } else { + toExecute = `jamkill.mjs ${filters} --name=${args.name} --root=${currIP}`; + } - client.connect(config); - }); - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let toExecute; - let filters =``; - if(args.prog){ - filters = filters+`--prog==${args.prog} ` - } - if(args.app){ - filters = filters+`--app==${args.app} ` - } - if(args.port){ - filters = filters+`--port==${args.port} ` - } - filters = filters.trim() - - if(args.flag == "reset"){ - toExecute = `jamkill.mjs --reset --root=${currIP}` - } - - - else if(args.flag == "all"){ - if(!args.pause) - toExecute = `jamkill.mjs ${filters} --root=${currIP}` - else - toExecute = `jamkill.mjs ${filters} --pause --root=${currIP}` + const command = `${pathExport} && ${changeDir} && ${toExecute}`; + await executeScript(client, command); } - else{ - if(!args.pause) - toExecute = `jamkill.mjs ${filters} --name=${args.name} --root=${currIP}` - else - toExecute = `jamkill.mjs ${filters} --name=${args.name} --pause --root=${currIP}` + } + if (args.reset) { + if (args.root) { + throw new Error( + "DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE" + ); } - - const command=`${pathExport} && ${changeDir} && ${toExecute}` - await executeScript(client, command); - } - } - if(args.reset){ - if(args.root){ - throw new Error("DOES NOT HAVE THE PERMISSION TO RESET A REMOTE MACHINE") + await jamKillBruteForce(); + } else if (!fs.existsSync(jamfolder)) { + throw new Error(".jamruns folder missing. JAMScript tools not setup?"); + } else if (!fs.existsSync(appfolder)) { + throw new Error( + ".jamruns/apps folder missing. JAMScript tools not setup?" + ); + } else { + await jamKill(args); } - await jamKillBruteForce() - } - else if( !fs.existsSync(jamfolder) ){ - throw new Error('.jamruns folder missing. JAMScript tools not setup?') - } - else if( !fs.existsSync(appfolder) ){ - throw new Error('.jamruns/apps folder missing. JAMScript tools not setup?') - } - else{ - await jamKill(args); - } - - - process.exit(0); - + process.exit(0); } - (async() => { - await main() - })() diff --git a/tools/jamlist.mjs b/tools/jamlist.mjs index d591e95be..376cd37d3 100755 --- a/tools/jamlist.mjs +++ b/tools/jamlist.mjs @@ -1,39 +1,54 @@ #!/usr/bin/env zx import { getJamListArgs } from "./parser.mjs"; -import {getAppFolder,getJamFolder} from "./fileDirectory.mjs" -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; -import { Client } from 'ssh2'; -import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +import { dirname, resolve } from "path"; +import { fileURLToPath } from "url"; +import { Client } from "ssh2"; +import { + header_1, + header_2, + body_1, + body_sec, + keyWord, + body_2, + body_2_bold, +} from "./chalk.mjs"; import { chalk } from "zx"; - -const { debounce } = require('lodash'); -const chokidar = require('chokidar'); -const jamFolder = getJamFolder() +const { debounce } = require("lodash"); +const chokidar = require("chokidar"); +const jamFolder = getJamFolder(); let watcher; -const __filename = fileURLToPath(import.meta.url) +const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); -let NODESINFO = [] -let cachedInfo = [] -let currIP ; -if (os.platform() === 'win32') { -currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); -} else if (os.platform() === 'darwin') { -currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); -} else if (os.platform() === 'linux') { -currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); +const jamcleanPath = resolve(__dirname, "jamclean.mjs"); +let NODESINFO = []; +let cachedInfo = []; +let currIP; +if (os.platform() === "win32") { + currIP = ( + await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch( + () => "" + ) + ) + .toString() + .trim(); +} else if (os.platform() === "darwin") { + currIP = (await $`ipconfig getifaddr en0`.catch(() => "")) + .toString() + .trim(); +} else if (os.platform() === "linux") { + currIP = (await $`hostname -I`.catch(() => "")).toString().trim(); } -function show_usage(){ - - const usageMessage = - ` +function show_usage() { + const usageMessage = ` ${header_1(`JAMTools 2.0`)} - ${header_2(`jamlist`)}${body_1(` -- a tool to display the active programs and their attributes.`)} + ${header_2(`jamlist`)}${body_1( + ` -- a tool to display the active programs and their attributes.` + )} ${header_1(`SYNOPSIS`)} @@ -54,19 +69,33 @@ function show_usage(){ ${header_1(`DESCRIPTION`)} - ${keyWord('Note: By default jamlist lists all the active local programs and print it before terminating.')} + ${keyWord( + "Note: By default jamlist lists all the active local programs and print it before terminating." + )} - --- ${keyWord('jamlist displays the folloing attribute of the running apps:')} + --- ${keyWord( + "jamlist displays the folloing attribute of the running apps:" + )} 1) NAME: ${body_2("program's app name.")} 2) PROGRAM: ${body_2("program's program name.")} 3) PORT: ${body_2("the MQTT port used by program.")} 4) D-STORE: ${body_2("the dataStore used by the program.")} - 5) TYPE: ${body_2("either one of fog, device or cloud depending on the program's type.")} - 7) TMUX-ID: ${body_2("the generic tmux ID used by the program (not including the tag).")} - 8) STATUS: ${body_2("either running or paused based on the program status.")} - 9) HOST: ${body_2("localHost if program is running locally or IPAddress of the remote machine running the program.")} - 10) UP-TIME: ${body_2("the duration of the program running in the format of hour-minute-sec.")} + 5) TYPE: ${body_2( + "either one of fog, device or cloud depending on the program's type." + )} + 7) TMUX-ID: ${body_2( + "the generic tmux ID used by the program (not including the tag)." + )} + 8) STATUS: ${body_2( + "running is only program status now." + )} + 9) HOST: ${body_2( + "localHost if program is running locally or IPAddress of the remote machine running the program." + )} + 10) UP-TIME: ${body_2( + "the duration of the program running in the format of hour-minute-sec." + )} --- jamlist [--help] @@ -83,7 +112,9 @@ function show_usage(){ as the program stays alive it re-paints the console with new info on any chnages.`)} --- jamlist [--remote] - ${body_2(`Use this flag to include the remote active apps started by the local machine running the jamlist.`)} + ${body_2( + `Use this flag to include the remote active apps started by the local machine running the jamlist.` + )} --- jamlist [--type==fog] ${body_2(`Use --type to list only active programs with a certain type. @@ -94,39 +125,47 @@ function show_usage(){ 3) fog`)} --- jamlist [--dataStore==127.0.0.1:21883] - ${body_2(`used --dataStore option to list all the active apps with the given dataStore address.`)} + ${body_2( + `used --dataStore option to list all the active apps with the given dataStore address.` + )} --- jamlist [--tmuxid==tg-25165] - ${body_2(`used ---tmuxid option to list all the active apps with the given tmuxid.`)} + ${body_2( + `used ---tmuxid option to list all the active apps with the given tmuxid.` + )} --- jamlist [--port=3] - ${body_2(`used --port option to list all the active apps running on the given port.`)} + ${body_2( + `used --port option to list all the active apps running on the given port.` + )} --- jamlist [--app==XX3] - ${body_2(`used --app option to list all the active apps with the given app name.`)} + ${body_2( + `used --app option to list all the active apps with the given app name.` + )} --- jamlist [--prog==X] - ${body_2(`used --prog option to list all the active apps with the given program name.`)} + ${body_2( + `used --prog option to list all the active apps with the given program name.` + )} NOTE: --type, --dataStore, --tmuxid, --port, --app and --prog are filters and can be used together. `; - - console.log(usageMessage) - - + + console.log(usageMessage); } -function getUpTime(startStamp){ +function getUpTime(startStamp) { const now = Date.now(); const Diff = now - startStamp; const hours = Math.floor(Diff / (1000 * 60 * 60)); const minutes = Math.floor((Diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((Diff % (1000 * 60)) / 1000); - - let result = ''; - + + let result = ""; + if (hours !== 0) { result = result + `${hours}h `; } @@ -136,313 +175,329 @@ function getUpTime(startStamp){ if (seconds !== 0) { result = result + `${seconds}sec`; } - if (result === '') { + if (result === "") { result = Diff + "ms"; } - - return result; - + return result; } -export function getRunningDirs(){ - const jamFolder = getJamFolder() - const appToPort = new Map() - let activePorts - try{ - activePorts = fs.readdirSync(`${jamFolder}/ports`) +export function getRunningDirs() { + const jamFolder = getJamFolder(); + const appToPort = new Map(); + let activePorts; + try { + activePorts = fs.readdirSync(`${jamFolder}/ports`); + } catch (error) { + return appToPort; } - catch(error){ - return appToPort - } - for(let port of activePorts){ + for (let port of activePorts) { let apps; - try{ - apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); - } - catch(error){ - continue + try { + apps = fs + .readFileSync(`${jamFolder}/ports/${port}`) + .toString() + .trim() + .split("\n"); + } catch (error) { + continue; } - for(let app of apps){ - if(appToPort.has(app)){ + for (let app of apps) { + if (appToPort.has(app)) { const portList = appToPort.get(app); - portList.push(port) - appToPort.set(app,portList) - } - else{ - appToPort.set(app,[port]) + portList.push(port); + appToPort.set(app, portList); + } else { + appToPort.set(app, [port]); } } } return appToPort; } -function getWatchList(filters){ - const watchList = [] - const appFolder = getAppFolder() - watchList.push(`${jamFolder}/ports`) - if(filters.remote){ - watchList.push(`${jamFolder}/remote`) - +function getWatchList(filters) { + const watchList = []; + const appFolder = getAppFolder(); + watchList.push(`${jamFolder}/ports`); + if (filters.remote) { + watchList.push(`${jamFolder}/remote`); } - const dirs = getRunningDirs() - for(let dir of dirs.keys()){ - for(let port of dirs.get(dir)){ - watchList.push(`${appFolder}/${dir}/${port}/numCnodes`) - watchList.push(`${appFolder}/${dir}/${port}/paused`) + const dirs = getRunningDirs(); + for (let dir of dirs.keys()) { + for (let port of dirs.get(dir)) { + watchList.push(`${appFolder}/${dir}/${port}/numCnodes`); } } - return watchList - + return watchList; } - - - function watch(filters) { setInterval(async () => { - await $`zx ${jamcleanPath}` - if(cachedInfo){ - console.clear() + await $`zx ${jamcleanPath}`; + if (cachedInfo) { + console.clear(); printHeader(); printNodeInfo(cachedInfo); } }, 1000); - function updateWatchList(watchList){ - + function updateWatchList(watchList) { const newWatchList = getWatchList(filters); - for(let item of newWatchList){ - if(!watchList.includes(item)){ - watcher.add(item) + for (let item of newWatchList) { + if (!watchList.includes(item)) { + watcher.add(item); } } - for(let item of watchList){ - if(!newWatchList.includes(item)){ - watcher.unwatch(item) + for (let item of watchList) { + if (!newWatchList.includes(item)) { + watcher.unwatch(item); } } return newWatchList; } const updateInfo = debounce(async () => { - await sleep(500); - if (!filters || filters.all === true || Object.keys(filters).length === 0) { + await sleep(500); + if ( + !filters || + filters.all === true || + Object.keys(filters).length === 0 + ) { const info = getNodeInfo(); - if(filters.remote){ - NODESINFO = [] - await main(true) + if (filters.remote) { + NODESINFO = []; + await main(true); } - - if (info.length + NODESINFO.length === 0) { - - console.clear() + console.clear(); console.log("There is no program running"); + cachedInfo = null; } else { - - console.clear() + console.clear(); printHeader(); printNodeInfo(info); - if(filters.remote){ + if (filters.remote) { printNodeInfo(NODESINFO); } - cachedInfo = info.concat(NODESINFO) + cachedInfo = info.concat(NODESINFO); } } else { const nodeinfo = getNodeInfo(); - let keysToRemove = ["root","remote","help","all" ]; - let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); + let keysToRemove = ["root", "remote", "help", "all"]; + let filteredObj = Object.keys(filters) + .filter((key) => !keysToRemove.includes(key)) + .reduce((acc, key) => { + acc[key] = filters[key]; + return acc; + }, {}); const filtered = filter(nodeinfo, filteredObj); - if(filters.remote){ - NODESINFO = [] - await main(true) + if (filters.remote) { + NODESINFO = []; + await main(true); } if (filtered.length + NODESINFO.length === 0) { - console.clear() + console.clear(); console.log("There is no such program running"); + cachedInfo = null; } else { - console.clear() + console.clear(); printHeader(); printNodeInfo(filtered); - if(filters.remote){ - printNodeInfo(NODESINFO); - cachedInfo = filtered.concat(NODESINFO) - } - + if (filters.remote) { + printNodeInfo(NODESINFO); + } + cachedInfo = filtered.concat(NODESINFO); } } - }, 500); - let watchList = getWatchList(filters) - watcher = chokidar.watch(watchList, { persistent: true, ignoreInitial: true }).on('all', (event, path) => { - - watchList = updateWatchList(watchList) - updateInfo(); - }); + }, 500); + let watchList = getWatchList(filters); + watcher = chokidar + .watch(watchList, { persistent: true, ignoreInitial: true }) + .on("all", (event, path) => { + watchList = updateWatchList(watchList); + updateInfo(); + }); } -export function dirNameToAppName(dirName){ - const dir = dirName.split('_') - if(dir.length > 2){ - return (dir.filter((_,index) => index !== 0)).join("_") - } - else{ +export function dirNameToAppName(dirName) { + const dir = dirName.split("_"); + if (dir.length > 2) { + return dir.filter((_, index) => index !== 0).join("_"); + } else { return dir[1]; } - } -export function dirNameToProgramName(dirName){ - return (dirName.split('_'))[0] - +export function dirNameToProgramName(dirName) { + return dirName.split("_")[0]; } -function getNodeInfo(root=null){ - const appToPortMap = getRunningDirs() - const jamfolder = getJamFolder() - const appfolder = getAppFolder(); - const nodeInfo =[] - if( (!fs.existsSync(`${jamfolder}/ports`)) || (!fs.existsSync(`${jamfolder}/apps`)) ){ - return [] +function getNodeInfo(root = null) { + const appToPortMap = getRunningDirs(); + const jamfolder = getJamFolder(); + const appfolder = getAppFolder(); + const nodeInfo = []; + if ( + !fs.existsSync(`${jamfolder}/ports`) || + !fs.existsSync(`${jamfolder}/apps`) + ) { + return []; } - for(let app of appToPortMap.keys()){ - const appName = dirNameToAppName(app) - const programName = dirNameToProgramName(app) - for(let port of appToPortMap.get(app)){ - if(root){ - if(fs.existsSync(`${appfolder}/${app}/${port}/root`)){ - const rootIP = fs.readFileSync(`${appfolder}/${app}/${port}/root`).toString().trim(); - if(rootIP === root){ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-", "startStamp": '-'} - const dirPath = `${appfolder}/${app}/${port}` - if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ - throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + for (let app of appToPortMap.keys()) { + const appName = dirNameToAppName(app); + const programName = dirNameToProgramName(app); + for (let port of appToPortMap.get(app)) { + if (root) { + if (fs.existsSync(`${appfolder}/${app}/${port}/root`)) { + const rootIP = fs + .readFileSync(`${appfolder}/${app}/${port}/root`) + .toString() + .trim(); + if (rootIP === root) { + const fileNames = { + machType: "-", + dataStore: "-", + tmuxid: "-", + parentId: "-", + numCnodes: "-", + startStamp: "-", + }; + const dirPath = `${appfolder}/${app}/${port}`; + if (!fs.existsSync(`${appfolder}/${app}/${port}`)) { + throw new Error( + "FileDirectory is corrupted. TAKE REQUIRED ACTION" + ); } - for(let fileName of Object.keys(fileNames)){ - if(fs.existsSync(`${dirPath}/${fileName}`)){ - const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + for (let fileName of Object.keys(fileNames)) { + if (fs.existsSync(`${dirPath}/${fileName}`)) { + const data = fs + .readFileSync(`${dirPath}/${fileName}`) + .toString() + .trim(); fileNames[fileName] = data; } } - fileNames["port"] = String(port) - fileNames["app"] = appName - fileNames["prog"] = programName - if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ - fileNames["status"] = "paused" - } - else{ - fileNames["status"] = "running" - - } - - fileNames["host"] = currIP - - - - nodeInfo.push(fileNames) - + fileNames["port"] = String(port); + fileNames["app"] = appName; + fileNames["prog"] = programName; + fileNames["status"] = "running"; + fileNames["host"] = currIP; + + nodeInfo.push(fileNames); } } - } - else{ - const fileNames ={"machType": "-", "dataStore": "-" ,"tmuxid": "-", "parentId":"-", "numCnodes": "-" , "startStamp": "-"} - const dirPath = `${appfolder}/${app}/${port}` - if(!fs.existsSync( `${appfolder}/${app}/${port}`)){ - throw new Error("FileDirectory is corrupted. TAKE REQUIRED ACTION") + } else { + const fileNames = { + machType: "-", + dataStore: "-", + tmuxid: "-", + parentId: "-", + numCnodes: "-", + startStamp: "-", + }; + const dirPath = `${appfolder}/${app}/${port}`; + if (!fs.existsSync(`${appfolder}/${app}/${port}`)) { + throw new Error( + "FileDirectory is corrupted. TAKE REQUIRED ACTION" + ); } - for(let fileName of Object.keys(fileNames)){ - if(fs.existsSync(`${dirPath}/${fileName}`)){ - const data = fs.readFileSync(`${dirPath}/${fileName}`).toString().trim(); + for (let fileName of Object.keys(fileNames)) { + if (fs.existsSync(`${dirPath}/${fileName}`)) { + const data = fs + .readFileSync(`${dirPath}/${fileName}`) + .toString() + .trim(); fileNames[fileName] = data; } } - fileNames["port"] = String(port) - fileNames["app"] = appName - fileNames["prog"] = programName - if(fs.readFileSync(`${appfolder}/${app}/${port}/paused`).toString().trim() !== "false"){ - fileNames["status"] = "paused" - } - else{ - fileNames["status"] = "running" - - } - fileNames["host"] = "localHost" + fileNames["port"] = String(port); + fileNames["app"] = appName; + fileNames["prog"] = programName; + fileNames["status"] = "running"; + fileNames["host"] = "localHost"; - - nodeInfo.push(fileNames) + nodeInfo.push(fileNames); } - } } return nodeInfo; } -function printNodeInfo(info){ - - for (let row of info){ - if(row["host"] === currIP){ - row["host"] = "localHost" +function printNodeInfo(info) { + for (let row of info) { + if (row["host"] === currIP) { + row["host"] = "localHost"; } - let UPTIME; - if(row["status"]!=="paused"){ - UPTIME = getUpTime(row["startStamp"]) - } - else{ - UPTIME = "-" - } - const headerString = ` ${row["app"].padEnd(10)} ${row["prog"].padEnd(10)} ${("Local:"+row["port"]).padEnd(10)} ${row["dataStore"].padEnd(20)} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row["tmuxid"].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd(10)} ${UPTIME.padEnd(10)}`; - console.log(headerString) + let UPTIME = getUpTime(row["startStamp"]); + const headerString = ` ${row["app"].padEnd(10)} ${row["prog"].padEnd( + 10 + )} ${("Local:" + row["port"]).padEnd(10)} ${row["dataStore"].padEnd( + 20 + )} ${row["machType"].padEnd(10)} ${row["numCnodes"].padEnd(10)} ${row[ + "tmuxid" + ].padEnd(10)} ${row["status"].padEnd(10)} ${row["host"].padEnd( + 10 + )} ${UPTIME.padEnd(10)}`; + console.log(headerString); } } - -function printHeader(){ - const headerString = ` ${chalk.bold.italic("NAME".padEnd(10))} ${chalk.bold.italic("PROGRAM".padEnd(10))} ${chalk.bold.italic("PORT".padEnd(10))} ${chalk.bold.italic("D-STORE".padEnd(20))} ${chalk.bold.italic("TYPE".padEnd(10))} ${chalk.bold.italic("C-NODES".padEnd(10))} ${chalk.bold.italic("TMUX-ID".padEnd(10))} ${chalk.bold.italic("STATUS".padEnd(10))} ${chalk.bold.italic("HOST".padEnd(10))} ${chalk.bold.italic("UP-TIME".padEnd(10))}`; - console.log(headerString) +function printHeader() { + const headerString = ` ${chalk.bold.italic( + "APP".padEnd(10) + )} ${chalk.bold.italic("PROGRAM".padEnd(10))} ${chalk.bold.italic( + "PORT".padEnd(10) + )} ${chalk.bold.italic("D-STORE".padEnd(20))} ${chalk.bold.italic( + "TYPE".padEnd(10) + )} ${chalk.bold.italic("C-NODES".padEnd(10))} ${chalk.bold.italic( + "TMUX-ID".padEnd(10) + )} ${chalk.bold.italic("STATUS".padEnd(10))} ${chalk.bold.italic( + "HOST".padEnd(10) + )} ${chalk.bold.italic("UP-TIME".padEnd(10))}`; + console.log(headerString); // console.log(`${chalk.black.cyan("--------------------------------------------------------------------------------------------------------------")}`) - console.log(`${chalk.cyan("=========================================================================================================================")}`) - - - - + console.log( + `${chalk.cyan( + "=========================================================================================================================" + )}` + ); } -function filter(nodeinfo, filters){ - const filteredInfo =[]; - for(let info of nodeinfo){ - let isPassing = true - for(let filter of Object.keys(filters)){ - if(!(filters[filter] === info[filter])){ - isPassing = false +function filter(nodeinfo, filters) { + const filteredInfo = []; + for (let info of nodeinfo) { + let isPassing = true; + for (let filter of Object.keys(filters)) { + if (!(filters[filter] === info[filter])) { + isPassing = false; break; } } - if(isPassing){ - filteredInfo.push(info) + if (isPassing) { + filteredInfo.push(info); } } return filteredInfo; } -function getRemoteMachines(){ - const jamfolder = getJamFolder() - if(!fs.existsSync(`${jamfolder}/remote`)){ - return [] +function getRemoteMachines() { + const jamfolder = getJamFolder(); + if (!fs.existsSync(`${jamfolder}/remote`)) { + return []; } - return (fs.readdirSync(`${jamfolder}/remote`)) - + return fs.readdirSync(`${jamfolder}/remote`); } -async function makeConnection(config){ +async function makeConnection(config) { return await new Promise((resolve, reject) => { const client = new Client(); - client.on('ready', () => { + client.on("ready", () => { resolve(client); }); - client.on('error', (error) => { + client.on("error", (error) => { reject(error); }); @@ -450,179 +505,160 @@ async function makeConnection(config){ }); } -async function executeScript(client, command){ - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) =>{ +async function executeScript(client, command) { + return await new Promise((resolve, reject) => { + client.exec(command, (err, stream) => { if (err) console.log(error); stream.on("close", () => { - resolve("closed") - }) - stream.on("data" , (data) =>{ - if(data.includes("NODEINFO##")){ - let JSONrow = data.toString().trim().split("##")[1] + resolve("closed"); + }); + stream.on("data", (data) => { + if (data.includes("NODEINFO##")) { + let JSONrow = data.toString().trim().split("##")[1]; let row; - try{ - row = JSON.parse(JSONrow) - } - catch(error){ - console.log(error) + try { + row = JSON.parse(JSONrow); + } catch (error) { + console.log(error); } - - - - NODESINFO.push(row) + NODESINFO.push(row); } - }) - }) - })) + }); + }); + }); } -async function main(update=null){ - NODESINFO = [] +async function main(update = null) { + NODESINFO = []; let args; - try{ - args = getJamListArgs(process.argv) - } - catch(error){ - - - show_usage() + try { + args = getJamListArgs(process.argv); + } catch (error) { + show_usage(); console.log(error.message); process.exit(1); - } const filters = args.filters; const monitor = args.monitor; - const jamfolder = getJamFolder() - if(filters.remote || update){ - - + const jamfolder = getJamFolder(); + if (filters.remote || update) { const map = getRemoteMachines(); - for(let machines of map){ - - const [host,port] = machines.split("_"); + for (let machines of map) { + const [host, port] = machines.split("_"); const config = { host: host, port: 22, - username: 'maheswar', - password: 'pass4des' + username: "maheswar", + password: "pass4des", }; const client = await makeConnection(config); - const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let args= "" - for(let filter of Object.keys(filters)){ - if(filter === "remote"){ - continue + const pathExport = + "export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin"; + const changeDir = "cd JAMScript/tools"; + let args = ""; + for (let filter of Object.keys(filters)) { + if (filter === "remote") { + continue; } - if(filter === "all" || filter === "help" ){ - if(filters.filter) - { - args = args + `--${filter} ` - - } - continue - + if (filter === "all" || filter === "help") { + if (filters.filter) { + args = args + `--${filter} `; + } + continue; } - args = args + `--${filter}=${filters[filter]} ` - } - args =args.trim() - + args = args + `--${filter}=${filters[filter]} `; + } + args = args.trim(); - const script = `jamlist.mjs ${args} --root=${currIP}` - await executeScript(client,`${pathExport} && ${changeDir} && ${script}`) - - } + const script = `jamlist.mjs ${args} --root=${currIP}`; + await executeScript( + client, + `${pathExport} && ${changeDir} && ${script}` + ); + } } - if(filters.root){ - - - if(filters.all){ - - await $`zx ${jamcleanPath}` - + if (filters.root) { + if (filters.all) { + await $`zx ${jamcleanPath}`; const info = getNodeInfo(filters.root); + for (let row of info) { + const jsonRow = JSON.stringify(row); - - for(let row of info){ - - const jsonRow = JSON.stringify(row) - - await sleep(50) + await sleep(50); } - } - else{ - - await $`zx ${jamcleanPath}` - const nodeinfo = getNodeInfo(filters.root) - - - let keysToRemove = ["root","remote","help","all" ]; - let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); - const filtered = filter(nodeinfo, filteredObj) + } else { + await $`zx ${jamcleanPath}`; + const nodeinfo = getNodeInfo(filters.root); + + let keysToRemove = ["root", "remote", "help", "all"]; + let filteredObj = Object.keys(filters) + .filter((key) => !keysToRemove.includes(key)) + .reduce((acc, key) => { + acc[key] = filters[key]; + return acc; + }, {}); + const filtered = filter(nodeinfo, filteredObj); - if(filtered.length === 0 ){ - process.exit(0) + if (filtered.length === 0) { + process.exit(0); } - for(let row of filtered){ - const jsonRow = JSON.stringify(row) - console.log(`NODEINFO##${jsonRow}`) - await sleep(50) + for (let row of filtered) { + const jsonRow = JSON.stringify(row); + console.log(`NODEINFO##${jsonRow}`); + await sleep(50); } } - } - else if(!update){ - - if(filters.all){ - await $`zx ${jamcleanPath}` + } else if (!update) { + if (filters.all) { + await $`zx ${jamcleanPath}`; const info = getNodeInfo(); - if(info.length + NODESINFO.length === 0 ){ - - if(!monitor){ - process.exit(0) + if (info.length + NODESINFO.length === 0) { + if (!monitor) { + process.exit(0); } } console.clear(); printHeader(); printNodeInfo(info); - printNodeInfo(NODESINFO) - cachedInfo = info.concat(NODESINFO) - } + printNodeInfo(NODESINFO); + cachedInfo = info.concat(NODESINFO); + } else { + await $`zx ${jamcleanPath}`; + const nodeinfo = getNodeInfo(); + let keysToRemove = ["root", "remote", "help", "all"]; + let filteredObj = Object.keys(filters) + .filter((key) => !keysToRemove.includes(key)) + .reduce((acc, key) => { + acc[key] = filters[key]; + return acc; + }, {}); - else{ - - await $`zx ${jamcleanPath}` - const nodeinfo = getNodeInfo() - let keysToRemove = ["root","remote","help","all" ]; - let filteredObj = Object.keys(filters).filter(key => !keysToRemove.includes(key)).reduce((acc, key) => {acc[key] = filters[key]; return acc;}, {}); - - const filtered = filter(nodeinfo, filteredObj) - if(filtered.length + NODESINFO.length === 0 ){ - console.log("there is No such program running") - if(!monitor){ - process.exit(0) + const filtered = filter(nodeinfo, filteredObj); + if (filtered.length + NODESINFO.length === 0) { + console.log("there is No such program running"); + if (!monitor) { + process.exit(0); } } console.clear(); printHeader(); printNodeInfo(filtered); - printNodeInfo(NODESINFO) - cachedInfo = filtered.concat(NODESINFO) + printNodeInfo(NODESINFO); + cachedInfo = filtered.concat(NODESINFO); } - if(monitor){ + if (monitor) { watch(filters); } } - } -(async () => { - await main() -})(); \ No newline at end of file +(async () => { + await main(); +})(); diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 72a6957d9..d429f46ee 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -1,138 +1,151 @@ #!/usr/bin/env zx -import {jamrunParsArg , getCargs, getJargs, getRemoteArgs} from './parser.mjs' -import { fileURLToPath } from 'url'; -import { cleanByPortNumber, pauseByPortNumber } from './cleanUp.mjs'; -import { dirname, resolve } from 'path'; -import {fileDirectorySetUp, isValidExecutable, fileDirectoryMqtt, getPaths, getappid, getFolder , cleanExecutables, getJamFolder, getFileNoext} from './fileDirectory.mjs' -const { spawn,spawnSync } = require('child_process'); -import { Client } from 'ssh2'; -import { body_1, header_1 ,header_2, body_sec, keyWord, bodyBold, body_2 , body_2_bold , body_2_line} from './chalk.mjs'; - -let app, tmux, num, edge, data, local_registry, bg, NOVERBOSE, log, old, local, valgrind, long, lat, Type, tags, file, resume, port, remote, root; +import { jamrunParsArg, getCargs, getJargs, getRemoteArgs } from "./parser.mjs"; +import { fileURLToPath } from "url"; +import { cleanByPortNumber } from "./cleanUp.mjs"; +import { dirname, resolve } from "path"; +import { + fileDirectorySetUp, + isValidExecutable, + fileDirectoryMqtt, + getPaths, + getappid, + getFolder, + cleanExecutables, + getJamFolder, + getFileNoext, +} from "./fileDirectory.mjs"; +const { spawn, spawnSync } = require("child_process"); +import { Client } from "ssh2"; +import { + body_1, + header_1, + header_2, + body_sec, + keyWord, + bodyBold, + body_2, + body_2_bold, + body_2_line, +} from "./chalk.mjs"; + +let app, + tmux, + num, + edge, + data, + local_registry, + bg, + NOVERBOSE, + log, + old, + local, + valgrind, + long, + lat, + Type, + tags, + file, + port, + remote, + root; const tmuxIds = []; -let removablePort +let removablePort; -process.on('SIGINT', () => { - if(removablePort){ - let toPause; - try{ - toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() - } - catch(error){ - toPause = "false" - } - - if(toPause !== "false"){ - const fileNoext = getFileNoext(file); - pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) - process.exit(); - - } - else{ - const fileNoext = getFileNoext(file); - cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); - process.exit(); - } - } - else{ +process.on("SIGINT", () => { + if (removablePort) { + const fileNoext = getFileNoext(file); + cleanByPortNumber( + `${fileNoext}.jxe`, + app, + removablePort, + NOVERBOSE + ); + process.exit(); + } else { process.exit(); } }); -process.on('SIGTERM', () => { - if(removablePort){ - let toPause; - try{ - toPause = fs.readFileSync(`${process.cwd()}/${removablePort}/paused`).toString().trim() - } - catch(error){ - toPause = "false" - } - - if(toPause !== "false"){ - const fileNoext = getFileNoext(file); - pauseByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE) - process.exit(); - } - else{ - const fileNoext = getFileNoext(file); - cleanByPortNumber(`${fileNoext}.jxe`,app,removablePort,NOVERBOSE); - process.exit(); - } - } - else{ +process.on("SIGTERM", () => { + if (removablePort) { + + const fileNoext = getFileNoext(file); + cleanByPortNumber( + `${fileNoext}.jxe`, + app, + removablePort, + NOVERBOSE + ); process.exit(); - } - + } else { + process.exit(); + } }); - const filePath = fileURLToPath(import.meta.url); const IDIR = path.dirname(filePath); const REDISFUNCS = fs.realpathSync(`${IDIR}/../deps/lua/jredlib.lua`); const SHELLPID = process.pid; - const [MOSQUITTO, MOSQUITTO_PUB, TMUX] = await Promise.all( - ["mosquitto","mosquitto_pub", "tmux"].map( - async (entry)=> { - try{ - const p = await $`which ${entry}`; - return p.stdout.trim(); - } - catch(error){ - switch(entry){ - case "tmux": - throw new Error("tmux not installed. Quitting.") - case "mosquitto_pub": - throw new Error("mosquitto_pub (MQTT tools) not installed. Quitting.") - case "mosquitto": - throw new Error("mosquitto (MQTT broker) not installed. Quitting.") - } + ["mosquitto", "mosquitto_pub", "tmux"].map(async (entry) => { + try { + const p = await $`which ${entry}`; + return p.stdout.trim(); + } catch (error) { + switch (entry) { + case "tmux": + throw new Error("tmux not installed. Quitting."); + case "mosquitto_pub": + throw new Error( + "mosquitto_pub (MQTT tools) not installed. Quitting." + ); + case "mosquitto": + throw new Error( + "mosquitto (MQTT broker) not installed. Quitting." + ); } } - ) -) + }) +); - -async function executeScript(client, command){ - - console.log("Execute Script cmd ", command ); +async function executeScript(client, command) { + console.log("Execute Script cmd ", command); command = "echo $PATH"; - return (await new Promise((resolve, reject) =>{ - client.exec(command, (err,stream) => { - if (err){ + return await new Promise((resolve, reject) => { + client.exec(command, (err, stream) => { + if (err) { console.log("Rejected...."); reject(err); - } + } let result; stream.on("close", () => { console.log("Closing..."); - resolve(result) - }) - stream.on("data" , async (data) =>{ + resolve(result); + }); + stream.on("data", async (data) => { console.log("hi --------------- ", data.toString()); - if(data.includes("MY PORT IS:")) - { - result = data.toString().trim().split(":")[1] - } - if(data.includes("EXIT BG")){ - resolve(result) - } - }) - }) - })) + if (data.includes("MY PORT IS:")) { + result = data.toString().trim().split(":")[1]; + } + if (data.includes("EXIT BG")) { + resolve(result); + } + }); + }); + }); } //tested.working -function show_usage(){ - const usageMessage = - ` +function show_usage() { + const usageMessage = ` ${header_1(`JAMTools 2.0`)} - ${header_2(`jamrun`)}${body_1(` -- a tool to run JXE files with a given name`)} + ${header_2(`jamrun`)}${body_1( + ` -- a tool to run JXE files with a given name` + )} ${header_1(`SYNOPSIS`)} @@ -152,23 +165,30 @@ function show_usage(){ [--edge= ${body_sec(`num_edge_connections`)}] [--valgrind] [--local] - [--resume && --port = ${body_sec(`portNum`)}] [--remote = ${body_sec(`IPAddress`)}] ${header_1(`DESCRIPTION`)} - --- ${keyWord('jamrun')} Runs J node and C nodes, one each, of a device with ${keyWord('program.jxe')} - under a app name X, use the ${keyWord('--app')}=${keyWord(`X`)} option. ${bodyBold(`It is mandatory to set the app name.`)}. + --- ${keyWord( + "jamrun" + )} Runs J node and C nodes, one each, of a device with ${keyWord( + "program.jxe" + )} + under a app name X, use the ${keyWord("--app")}=${keyWord( + `X` + )} option. ${bodyBold(`It is mandatory to set the app name.`)}. --- jamrun --help - ${body_2('--help : use this flag to display this usage message.')} + ${body_2("--help : use this flag to display this usage message.")} --- jamrun program.jxe --app=X [ --fog || --device || --cloud ] ${body_2_bold(`Among the flags above only one of them can be used`)} - ${body_2_bold(`If none of the flags are set the program will run as device by default`)} - ${body_2('--fog : runs a fog node (only J node) with program.jxe.')} - ${body_2('--cloud : runs a cloud node (only J node). ')} - ${body_2('--device : runs a device node (J node and C node).')} + ${body_2_bold( + `If none of the flags are set the program will run as device by default` + )} + ${body_2("--fog : runs a fog node (only J node) with program.jxe.")} + ${body_2("--cloud : runs a cloud node (only J node). ")} + ${body_2("--device : runs a device node (J node and C node).")} --- jamrun program.jxe --app=X [ --data=127.0.0.1:7000 ] ${body_2_bold(`By default, jamrun uses a Redis server running at 127.0.0.1:(20000+porttaken) as the @@ -193,7 +213,9 @@ function show_usage(){ that program is running on a remote machine.`)} --- jamrun program.jxe --app=X [ --old ] - ${body_2_bold(`By default, the program is using the latest version in .jamruns folder.`)} + ${body_2_bold( + `By default, the program is using the latest version in .jamruns folder.` + )} ${body_2(`--old: use this flag to run the previous version in .jamruns folder. You can edit that version and rerun a custom version of a file.`)} @@ -210,267 +232,247 @@ function show_usage(){ ${body_2(`--verb : use this flag to turn on verbose messaging.`)} --- jamrun program.jxe --app=X [ --valgrind ] - ${body_2(`--verb : use this flag to run the cside with valgrind for leak checking.`)} + ${body_2( + `--verb : use this flag to run the cside with valgrind for leak checking.` + )} --- jamrun program.jxe --app=X [ --local ] - ${body_2(`--verb : use this flag to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback.`)} - - --- jamrun program.jxe --app=X [ --resume ] [ --port=portNumber ] - ${body_2_bold(`the --resume flag and --port option should be always used together`)} - ${body_2_bold(`--port flag will be dissabled if used alone`)} - ${body_2_bold(`--resume flag will throw an error if used alone`)} - ${body_2_bold(`Using resume will dissable [--old | --data | --num | --fog|--cloud|--device ] flags`)} - ${body_2(`--resume : use this flag to resume the paused program with app name X program name program.jxe and - app on port --port`)} + ${body_2( + `--verb : use this flag to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback.` + )} --- jamrun program.jxe --app=X [ --remote=IPAddress ] [ --bg ] ${body_2_bold(`the --remote and --bg flag should always be used together. remote programs can only run on the background`)} - ${body_2(`--remote: use this option to run the program on remote machine and in the background`)} + ${body_2( + `--remote: use this option to run the program on remote machine and in the background` + )} --- jamrun program.jxe --app=X [ --loc=long,lat ] - ${body_2_bold(`By default, a random long and lat will be assigned to the running program`)} - ${body_2(`--loc: use this option to run the program with and specific long and lat value`)} + ${body_2_bold( + `By default, a random long and lat will be assigned to the running program` + )} + ${body_2( + `--loc: use this option to run the program with and specific long and lat value` + )} - ${header_2(`The jamrun command creates a run state in the $HOME/.jamruns folder.`)} + ${header_2( + `The jamrun command creates a run state in the $HOME/.jamruns folder.` + )} `; - console.log(usageMessage) - - + console.log(usageMessage); } //teste.working. -async function startmqtt(port, cFile){ - const jamfolder = getJamFolder() - try{ +async function startmqtt(port, cFile) { + const jamfolder = getJamFolder(); + try { await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); - - } - catch(error){ - - if(!NOVERBOSE){ - console.log(`MQTT is not running at ${port}\nAttempting to start MQTT at ${port}`); + } catch (error) { + if (!NOVERBOSE) { + console.log( + `MQTT is not running at ${port}\nAttempting to start MQTT at ${port}` + ); } const command = MOSQUITTO; - const args = ['-c', cFile]; + const args = ["-c", cFile]; const options = { - stdio: ['ignore', 'ignore', 'ignore'], + stdio: ["ignore", "ignore", "ignore"], detached: true, }; - const mqttProcesse = spawn(command, args, options); + const mqttProcesse = spawn(command, args, options); - fs.writeFileSync(`${jamfolder}/mqttpid/${port}`,`${mqttProcesse.pid}` ) + fs.writeFileSync(`${jamfolder}/mqttpid/${port}`, `${mqttProcesse.pid}`); mqttProcesse.unref(); - + return; } } -async function dojamout(iport, folder,jappid) { - await dojamout_p1 (iport ,folder) - await dojamout_p2 (iport ,folder, jappid) - +async function dojamout(iport, folder, jappid) { + await dojamout_p1(iport, folder); + await dojamout_p2(iport, folder, jappid); } //tested.working -async function dojamout_p1(pnum ,floc) { - await startmqtt(pnum , `${floc}/${pnum}/mqtt.conf`, data) - if(data){ +async function dojamout_p1(pnum, floc) { + await startmqtt(pnum, `${floc}/${pnum}/mqtt.conf`, data); + if (data) { fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); } fs.writeFileSync(`${floc}/${pnum}/class`, "process\n"); - fs.writeFileSync(`${floc}/${pnum}/paused`, "false\n"); - fs.writeFileSync(`${floc}/${pnum}/shellpid`,SHELLPID.toString()+"\n" ); - fs.writeFileSync(`${floc}/${pnum}/processId`, "new"+"\n"); - fs.writeFileSync(`${floc}/${pnum}/startStamp`, `${Date.now()}`+"\n"); + fs.writeFileSync(`${floc}/${pnum}/shellpid`, SHELLPID.toString() + "\n"); + fs.writeFileSync(`${floc}/${pnum}/processId`, "new" + "\n"); + fs.writeFileSync(`${floc}/${pnum}/startStamp`, `${Date.now()}` + "\n"); - if(Type === "device"){ - fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); + if (Type === "device") { + fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); } - if(root){ - fs.writeFileSync(`${floc}/${pnum}/root`, root) + if (root) { + fs.writeFileSync(`${floc}/${pnum}/root`, root); } } - -async function dojamout_p2(iport, folder, jappid, group=null){ - if(!bg){ - await dojamout_p2_fg(iport, folder,jappid, group) - } - else - { - dojamout_p2_bg(iport, folder,jappid, group) +async function dojamout_p2(iport, folder, jappid, group = null) { + if (!bg) { + await dojamout_p2_fg(iport, folder, jappid, group); + } else { + dojamout_p2_bg(iport, folder, jappid, group); } } //tested, working -async function dojamout_p2_fg(pnum, floc,jappid, group=null){ +async function dojamout_p2_fg(pnum, floc, jappid, group = null) { let argObject = { - "--app":jappid, - "--port":pnum, - "--group":group, - "--data":data, - "--tags":tags, - "--edge":edge, - "--long":long, - "--lat":lat, - "--localregistryhost":local_registry, - "--type": Type - } + "--app": jappid, + "--port": pnum, + "--group": group, + "--data": data, + "--tags": tags, + "--edge": edge, + "--long": long, + "--lat": lat, + "--localregistryhost": local_registry, + "--type": Type, + }; - let jargs = getJargs(argObject) - const command = 'node'; - const args = ['jstart.js', ...jargs]; + let jargs = getJargs(argObject); + const command = "node"; + const args = ["jstart.js", ...jargs]; - if(resume){ - console.log("############## RESUME ##############") - } - if(log){ + if (log) { const options = { cwd: floc, - stdio: ['pipe', 'pipe', 'pipe'] + stdio: ["pipe", "pipe", "pipe"], }; - const stream = fs.createWriteStream(`${floc}/${pnum}/log.j`, { flags: 'a' }); + const stream = fs.createWriteStream(`${floc}/${pnum}/log.j`, { + flags: "a", + }); const child = spawn(command, args, options); - child.stdout.on('data', (data) => { + child.stdout.on("data", (data) => { process.stdout.write(data); stream.write(data); }); - child.stderr.on('data', (data) => { + child.stderr.on("data", (data) => { process.stderr.write(data); stream.write(data); }); - child.on('exit', () => { - process.kill(process.pid, 'SIGTERM'); + child.on("exit", () => { + process.kill(process.pid, "SIGTERM"); }); - - }else{ + } else { const options = { cwd: floc, - stdio: 'inherit' + stdio: "inherit", }; const child = spawn(command, args, options); - child.on('exit', () => { - - process.kill(process.pid, 'SIGTERM'); + child.on("exit", () => { + process.kill(process.pid, "SIGTERM"); }); } - - } - -function dojamout_p2_bg(pnum, floc, jappid, group=null){ +function dojamout_p2_bg(pnum, floc, jappid, group = null) { let argObject = { - "--app":jappid, - "--port":pnum, - "--group":group, - "--data":data, - "--tags":tags, - "--edge":edge, - "--long":long, - "--lat":lat, - "--localregistryhost":local_registry, - "--type": Type - } - let jargs = getJargs(argObject) + "--app": jappid, + "--port": pnum, + "--group": group, + "--data": data, + "--tags": tags, + "--edge": edge, + "--long": long, + "--lat": lat, + "--localregistryhost": local_registry, + "--type": Type, + }; + let jargs = getJargs(argObject); - const logFile = fs.openSync(`${floc}/${pnum}/log.j`, 'a'); - if(resume){ - fs.writeFileSync(`${floc}/${pnum}/log.j`,"############## RESUME ##############") - } - - const command = 'node'; - const args = ['jstart.js', ...jargs]; + const logFile = fs.openSync(`${floc}/${pnum}/log.j`, "a"); + + const command = "node"; + const args = ["jstart.js", ...jargs]; const options = { - cwd: floc, - stdio: ['ignore', logFile, logFile], - detached: true, + cwd: floc, + stdio: ["ignore", logFile, logFile], + detached: true, }; - const p = spawn(command, args, options); + const p = spawn(command, args, options); p.unref(); - if(!NOVERBOSE){ - console.log("Started the J node in background") + if (!NOVERBOSE) { + console.log("Started the J node in background"); } //keep this log file - console.log("EXIT BG") - process.exit(0) + console.log("EXIT BG"); + process.exit(0); } -async function doaout(num,port,group,datap,myf,jappid){ - let counter=1 - if (fs.existsSync('a.out')) { - await $`cd ${myf} && chmod +x a.out` +async function doaout(num, port, group, datap, myf, jappid) { + let counter = 1; + if (fs.existsSync("a.out")) { + await $`cd ${myf} && chmod +x a.out`; } - while(counter <= num){ - - if(fs.existsSync('a.out')){ - - const argObject = - { + while (counter <= num) { + if (fs.existsSync("a.out")) { + const argObject = { "-a": jappid.toString(), "-p": port, "-n": counter, "-g": group, "-t": tags, "-o": datap, - } - let cargs = getCargs(argObject) + }; + let cargs = getCargs(argObject); await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; - if (!log){ - - if(valgrind) - await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; - - else - await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; - - } - - else{ - if(valgrind) - await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; - else - //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) - await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; - } + if (!log) { + if (valgrind) + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} C-m`; + else + await $`${TMUX} send-keys -t ${tmux}-${counter} ./a.out ${cargs} C-m`; + } else { + if (valgrind) + await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; + //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) + else + await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; } - tmuxIds.push(`${tmux}-${counter}`) - counter++; - } - if(!NOVERBOSE) - console.log("Started a C node") + } + tmuxIds.push(`${tmux}-${counter}`); + counter++; } + if (!NOVERBOSE) console.log("Started a C node"); +} - -async function portavailable(folder,port) { +async function portavailable(folder, port) { let porttaken; - const jamFolder = getJamFolder() - if(fs.existsSync(`${folder}/${port}`)){ - porttaken=1 - } - else{ - porttaken=0; - } - - if(porttaken === 0){ - if(!fs.existsSync(`${jamFolder}/ports/${port}`)){ - const p = await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l`.nothrow().quiet() + const jamFolder = getJamFolder(); + if (fs.existsSync(`${folder}/${port}`)) { + porttaken = 1; + } else { + porttaken = 0; + } + + if (porttaken === 0) { + if (!fs.existsSync(`${jamFolder}/ports/${port}`)) { + const p = + await $`netstat -lan -p tcp -f inet | grep ${port} | wc -l` + .nothrow() + .quiet(); porttaken = Number(p.stdout.trim()) === 0 ? 0 : 1; - - } - else{ - const runningApps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split(); - const fileNoExt = getFileNoext(file) - if(runningApps.includes(`${fileNoExt}_${app}`)){ + } else { + const runningApps = fs + .readFileSync(`${jamFolder}/ports/${port}`) + .toString() + .trim() + .split(); + const fileNoExt = getFileNoext(file); + if (runningApps.includes(`${fileNoExt}_${app}`)) { porttaken = 1; - } - else{ + } else { porttaken = 0; } } @@ -479,153 +481,138 @@ async function portavailable(folder,port) { } function setuptmux(path, appfolder) { - fs.writeFileSync(`${path}/tmuxid`,tmux.toString()+"\n"); - fs.writeFileSync(`${appfolder}/tmuxid`,tmux.toString()+"\n"); - + fs.writeFileSync(`${path}/tmuxid`, tmux.toString() + "\n"); + fs.writeFileSync(`${appfolder}/tmuxid`, tmux.toString() + "\n"); } - async function startredis(port) { - try{ - const p = $`redis-server --port ${port}`.stdio('ignore', 'ignore', 'inherit').nothrow().quiet(); - - } - catch(error){ - - } + try { + const p = $`redis-server --port ${port}` + .stdio("ignore", "ignore", "inherit") + .nothrow() + .quiet(); + } catch (error) {} } -async function waitforredis(port){ +async function waitforredis(port) { while (true) { - try{ - const p = await $`redis-cli -p ${port} -c PING`.quiet() + try { + const p = await $`redis-cli -p ${port} -c PING`.quiet(); if (p.stdout.trim() === "PONG") { break; } - } - catch(error){ - - } + } catch (error) {} if (!NOVERBOSE) { - console.log("Trying to find Redis server..."); + console.log("Trying to find Redis server..."); } - await sleep(1000) - } - - if (!NOVERBOSE) { + await sleep(1000); + } + + if (!NOVERBOSE) { console.log(`Redis running at port: ${port}`); - } - + } } - async function setupredis(port) { - - await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null` - await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null` - await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null` + await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null`; + await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null`; + await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null`; //IMPORTANT: flushing redis //USE FLUSH DB TO ONLY FLUSH THE CURRENT DB FOR THE APP //DB NUMBER //FOR NOW KEEP AS IT IS - if(!resume){ - await $`redis-cli -p ${port} FLUSHALL`; - } - + await $`redis-cli -p ${port} FLUSHALL`; } async function resolvedata(Name) { - const [host, port] = Name.split(':'); + const [host, port] = Name.split(":"); await startredis(Number(port)); await waitforredis(port); await setupredis(port); - data = Name.split(/\s+/).join(''); - - + data = Name.split(/\s+/).join(""); } -async function unpack(file,folder){ - if(!old){ - if(!fs.existsSync("./MANIFEST.txt")){ - try{ - await $`cd ${folder} && unzip -o ${file}`.quiet() +async function unpack(file, folder) { + if (!old) { + if (!fs.existsSync("./MANIFEST.txt")) { + try { + await $`cd ${folder} && unzip -o ${file}`.quiet(); + } catch (error) { + throw new Error(`Problem reading file: ${file}\n${error}`); } - catch(error){ - throw new Error(`Problem reading file: ${file}\n${error}`) - } - - } - else{ + } else { let forceRedo = false; - try{ - isValidExecutable() - } - catch(error){ + try { + isValidExecutable(); + } catch (error) { forceRedo = true; } - if(!forceRedo){ - const p1 = await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; - const p2 = await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; + if (!forceRedo) { + const p1 = + await $`cd ${folder} && zipgrep CREATE ${file} | awk 'NR==1{split($0,a, " "); print a[3]}'`; + const p2 = + await $`cd ${folder} && grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`; const ntime = Number(p1.stdout.toString().trim()); const ontime = Number(p2.stdout.toString().trim()); - if(ntime > ontime){ - try{ - if(!NOVERBOSE) - console.log("outdated, unzippping again") - await $`cd ${folder} && unzip -oq ${file}`.quiet() + if (ntime > ontime) { + try { + if (!NOVERBOSE) + console.log("outdated, unzippping again"); + await $`cd ${folder} && unzip -oq ${file}`.quiet(); + } catch (error) { + throw new Error( + `Problem reading file: ${file}\n${error}` + ); } - catch(error){ - - throw new Error(`Problem reading file: ${file}\n${error}`) - - } } - } - else{ - if(!NOVERBOSE) - console.log("The corrupted unziped files. files will be unziped again based on the existing MANIFEST.txt") - await cleanExecutables() - await $`cd ${folder} && unzip -oq ${file}`.quiet() + } else { + if (!NOVERBOSE) + console.log( + "The corrupted unziped files. files will be unziped again based on the existing MANIFEST.txt" + ); + await cleanExecutables(); + await $`cd ${folder} && unzip -oq ${file}`.quiet(); } } - } - else{ - if(!NOVERBOSE){ - console.log("WARNING: Unziped files might be outdated") + } else { + if (!NOVERBOSE) { + console.log("WARNING: Unziped files might be outdated"); } - isValidExecutable() + isValidExecutable(); } } async function getjdata(folder) { - const p = await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'`.nothrow().quiet() - return p.stdout.trim() + const p = + await $`cd ${folder} && grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` + .nothrow() + .quiet(); + return p.stdout.trim(); } -async function runNoneDevice(iport){ - const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport,jamfolder,app) - const jappid = getappid(jamfolder, `${folder}/${iport}`,app,appfolder) - await dojamout(iport, folder, jappid) +async function runNoneDevice(iport) { + const [jamfolder, appfolder, folder] = getPaths(file, app); + fileDirectoryMqtt(folder, iport, jamfolder, app); + const jappid = getappid(jamfolder, `${folder}/${iport}`, app, appfolder); + await dojamout(iport, folder, jappid); } -async function runDevice(iport,dport,group){ - const [jamfolder,appfolder,folder] = getPaths(file,app) - fileDirectoryMqtt(folder,iport,jamfolder,app) - const jappid = getappid(jamfolder, `${folder}/${iport}` ,app,appfolder) - await dojamout_p1(iport,folder) - setuptmux(`${folder}/${iport}`, appfolder) - await doaout(num,iport, group, dport,folder,jappid) - await dojamout_p2(iport, folder,jappid,group ) +async function runDevice(iport, dport, group) { + const [jamfolder, appfolder, folder] = getPaths(file, app); + fileDirectoryMqtt(folder, iport, jamfolder, app); + const jappid = getappid(jamfolder, `${folder}/${iport}`, app, appfolder); + await dojamout_p1(iport, folder); + setuptmux(`${folder}/${iport}`, appfolder); + await doaout(num, iport, group, dport, folder, jappid); + await dojamout_p2(iport, folder, jappid, group); } - -async function main(){ +async function main() { let iport; let dport; let group; - try{ + try { ({ app, tmux, @@ -635,7 +622,6 @@ async function main(){ local_registry, bg, NOVERBOSE, - resume, log, old, local, @@ -648,15 +634,11 @@ async function main(){ file, remote, root, - } = jamrunParsArg(process.argv)) - } - - - catch(error){ - show_usage() - error.message === "SHOW USAGE" ? null : console.log(error.message) + } = jamrunParsArg(process.argv)); + } catch (error) { + show_usage(); + error.message === "SHOW USAGE" ? null : console.log(error.message); process.exit(1); - } let folder; let ifile; @@ -665,221 +647,169 @@ async function main(){ console.log("Remote ..", remote); - if(remote){ + if (remote) { const config = { host: remote, port: 22, - username: 'maheswar', - password: 'pass4des' - }; - if(resume){ - const jamfolder = getJamFolder() - const fileNoext = getFileNoext(file); - if(!fs.existsSync(`${jamfolder}/remote`)) - throw new Error("this machine is not the root for any running app") - - - if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`)) - throw new Error(`this machine is not the root for any running app on ${config.host}_${config.port}`); - - - const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${port}`).toString().trim().split("\n") - if(!remoteApps.includes(`${fileNoext}_${app}`)) - throw new Error(`this machine is not the root for any running ${fileNoext}_${app}`); - - } + username: "maheswar", + password: "pass4des", + }; + client = await new Promise((resolve, reject) => { const client = new Client(); - client.on('ready', () => { + client.on("ready", () => { resolve(client); }); - client.on('error', (error) => { + client.on("error", (error) => { reject(error); }); console.log("Initiating connection to ....", config); client.connect(config); }); - const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)) + const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)); // const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" - const changeDir= "cd JAMScript/tools" - let currIP ; - if (os.platform() === 'win32') { - currIP = (await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'darwin') { - currIP = (await $`ipconfig getifaddr en0`.catch(() => '')).toString().trim(); - } else if (os.platform() === 'linux') { - currIP = (await $`hostname -I`.catch(() => '')).toString().trim(); + const changeDir = "cd JAMScript/tools"; + let currIP; + if (os.platform() === "win32") { + currIP = ( + await $`powershell (Get-NetIPAddress -AddressFamily IPv4).IPAddress`.catch( + () => "" + ) + ) + .toString() + .trim(); + } else if (os.platform() === "darwin") { + currIP = (await $`ipconfig getifaddr en0`.catch(() => "")) + .toString() + .trim(); + } else if (os.platform() === "linux") { + currIP = (await $`hostname -I`.catch(() => "")).toString().trim(); } - const myPort = await executeScript(client, `${changeDir} && jamrun.mjs ${remoteArgs} --root=${currIP}`) + const myPort = await executeScript( + client, + `${changeDir} && jamrun.mjs ${remoteArgs} --root=${currIP}` + ); console.log("IP ", currIP, " port ", myPort); - if(!resume){ - const jamfolder = getJamFolder() - const fileNoext = getFileNoext(file); - if(!fs.existsSync(`${jamfolder}/remote`)){ - fs.mkdirSync(`${jamfolder}/remote`); - } - if(!fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}`)){ - fs.mkdirSync(`${jamfolder}/remote/${config.host}_${config.port}`); - - } - if(fs.existsSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`)){ - const remoteApps = fs.readFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`).toString().trim().split("\n") - if(!remoteApps.includes(`${fileNoext}_${app}`)){ - fs.appendFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`); - } - } - else{ - fs.writeFileSync(`${jamfolder}/remote/${config.host}_${config.port}/${myPort}`,`${fileNoext}_${app}\n`) - } - } - process.exit(0) - - } - - - if(resume){ - const fileNoExt = getFileNoext(file) - if(!port) - throw new Error("can't resume the app without port number") - - folder = getFolder(file,app); - if(!fs.existsSync(folder)){ - throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app}` ) - + const jamfolder = getJamFolder(); + const fileNoext = getFileNoext(file); + if (!fs.existsSync(`${jamfolder}/remote`)) { + fs.mkdirSync(`${jamfolder}/remote`); } - if(!fs.existsSync(`${folder}/${port}`) || !fs.existsSync(`${folder}/${port}/paused`)){ - throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) + if ( + !fs.existsSync( + `${jamfolder}/remote/${config.host}_${config.port}` + ) + ) { + fs.mkdirSync( + `${jamfolder}/remote/${config.host}_${config.port}` + ); } - else{ - const isPaused = (fs.readFileSync(`${folder}/${port}/paused`).toString().trim()) === "false" ? false : true; - if(!isPaused){ - throw new Error("NO PAUSED INSTANCE OF", `${fileNoExt}_${app} on port: ${port}` ) + if ( + fs.existsSync( + `${jamfolder}/remote/${config.host}_${config.port}/${myPort}` + ) + ) { + const remoteApps = fs + .readFileSync( + `${jamfolder}/remote/${config.host}_${config.port}/${myPort}` + ) + .toString() + .trim() + .split("\n"); + if (!remoteApps.includes(`${fileNoext}_${app}`)) { + fs.appendFileSync( + `${jamfolder}/remote/${config.host}_${config.port}/${myPort}`, + `${fileNoext}_${app}\n` + ); } - - } - if(num, data, Type){ - console.log("WARNING: IN CASE OF RESUMING, WILL NOT USE ANY OF NUM, DATA, TYPE ARGUMENTS.") - } - try{ - Type = fs.readFileSync(`${folder}/${port}/machType`).toString().trim(); + } else { + fs.writeFileSync( + `${jamfolder}/remote/${config.host}_${config.port}/${myPort}`, + `${fileNoext}_${app}\n` + ); } - catch(error){ - throw new Error('type missing, corrupted program, it should be killed') - } - process.chdir(folder); - isValidExecutable(); - jdata = await getjdata(folder); + process.exit(0); } - else{ - if(port){ - console.log("Warning. If it's not to resume the port argument will not be used") - } - fileDirectorySetUp(file,app) - folder = getFolder(file,app) - ifile = path.resolve(file); - process.chdir(folder); - await unpack(ifile, folder) - isValidExecutable() - jdata = await getjdata(folder); - } + fileDirectorySetUp(file, app); + folder = getFolder(file, app); + ifile = path.resolve(file); + process.chdir(folder); + await unpack(ifile, folder); + isValidExecutable(); + jdata = await getjdata(folder); let isDevice; - switch(Type){ + switch (Type) { case "cloud": - if(resume){ - iport = port; - removablePort = port; - isDevice = false; - } - else{ - iport=9883 - isDevice = false; - - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; - } - iport++; + iport = 9883; + isDevice = false; + + while (true) { + const porttaken = Number( + await portavailable(folder, iport) + ); + if (porttaken !== 1) { + break; } - removablePort = iport; + iport++; } + removablePort = iport; break; - + case "fog": - if(resume){ - iport = port; - removablePort = port; - isDevice = false; - } - else{ - iport=5883 - isDevice = false - while(true){ - - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; - } - iport++; + iport = 5883; + isDevice = false; + while (true) { + const porttaken = Number( + await portavailable(folder, iport) + ); + if (porttaken !== 1) { + break; } - removablePort = iport; + iport++; } - + removablePort = iport; break; case "device": - if(resume){ - iport = port; - removablePort = port; - isDevice = true; - } - else{ - iport=1883; - isDevice = true; - while(true){ - const porttaken = Number(await portavailable(folder ,iport)) - if(porttaken !== 1){ - break; - } - iport++; + + iport = 1883; + isDevice = true; + while (true) { + const porttaken = Number( + await portavailable(folder, iport) + ); + if (porttaken !== 1) { + break; } - removablePort = iport; + iport++; } - if(!local){ - group= iport-1882 - } - else - group = 0; + removablePort = iport; + if (!local) { + group = iport - 1882; + } else group = 0; } - - if(jdata.toLowerCase() === "true"){ - dport=iport + 20000; - await resolvedata(`127.0.0.1:${dport}`) - - } - - if(!fs.existsSync(`${folder}/${iport}`,{ recursive: true })){ - fs.mkdirSync(`${folder}/${iport}`) + if (jdata.toLowerCase() === "true") { + dport = iport + 20000; + await resolvedata(`127.0.0.1:${dport}`); } - if(isDevice) - await runDevice(iport,dport,group) - - else - await runNoneDevice(iport) + + if (!fs.existsSync(`${folder}/${iport}`, { recursive: true })) { + fs.mkdirSync(`${folder}/${iport}`); } + if (isDevice) await runDevice(iport, dport, group); + else await runNoneDevice(iport); +} -const __filename = fileURLToPath(import.meta.url) +const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -const jamcleanPath = resolve(__dirname, 'jamclean.mjs'); -await $`zx ${jamcleanPath}` -await main() - - +const jamcleanPath = resolve(__dirname, "jamclean.mjs"); +await $`zx ${jamcleanPath}`; +await main(); diff --git a/tools/parser.mjs b/tools/parser.mjs index 793dce140..d35a251cd 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -1,426 +1,451 @@ #!/usr/bin/env zx -import commandLineArgs from 'command-line-args'; -import { error } from 'console'; -import { type } from 'os'; -import { string } from 'random-js'; -import { fs } from 'zx'; +import commandLineArgs from "command-line-args"; +import { error } from "console"; +import { type } from "os"; +import { string } from "random-js"; +import { fs } from "zx"; -const path = require('path'); -const VALGRIND_OPTS = 'valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s'; +const path = require("path"); +const VALGRIND_OPTS = + "valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s"; function generatelonglat() { const a = Math.floor(Math.random() * 180); const b = Math.floor(Math.random() * 10000); - const long=`${a}.${b}` - const c= Math.floor(Math.random() * 90); + const long = `${a}.${b}`; + const c = Math.floor(Math.random() * 90); const d = Math.floor(Math.random() * 10000); - const lat=`${c}.${d}` - return [long,lat] - + const lat = `${c}.${d}`; + return [long, lat]; } let [long, lat] = generatelonglat(); - const jamrunOptionDefinitions = [ - { name: 'help',type: Boolean, defaultValue: false}, - {name : 'app', type: String , defaultValue: undefined}, - {name : 'tags', type: String , defaultValue: undefined}, - {name : 'tmux', type: String , defaultValue: `tg-${Math.floor(Math.random() * 32768)}`}, - {name : 'num', type: Number , defaultValue: 1}, - {name : 'loc', type: String , defaultValue: `${long},${lat}`}, - {name : 'edge', type: Number , defaultValue: 1}, - {name : 'data', type: String , defaultValue: undefined}, - {name : 'fog', type: Boolean, defaultValue: false}, - {name : 'cloud', type: Boolean, defaultValue: false}, - {name : 'device', type: Boolean, defaultValue: false}, - {name : 'local_registry', type: Boolean, defaultValue: false}, - {name : 'bg', type: Boolean, defaultValue: false}, - {name : 'verb', type: Boolean, defaultValue: false}, - {name : 'log', type: Boolean, defaultValue: false}, - {name : 'old', type: Boolean, defaultValue: false}, - {name : 'local', type: Boolean, defaultValue: false}, - {name : 'valgrind', type: Boolean, defaultValue: false}, - {name : 'disable_stdout_redirect', type: Boolean, defaultValue: false}, - {name: 'resume', type: Boolean, defaultValue: false}, - {name: "port", type: Number, defaultValue: undefined}, - {name: "remote", type:String, defaultValue: undefined},//the IP ADDRESS YOU WANT TO CONNECT TO - {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call - + { name: "help", type: Boolean, defaultValue: false }, + { name: "app", type: String, defaultValue: undefined }, + { name: "tags", type: String, defaultValue: undefined }, + { + name: "tmux", + type: String, + defaultValue: `tg-${Math.floor(Math.random() * 32768)}`, + }, + { name: "num", type: Number, defaultValue: 1 }, + { name: "loc", type: String, defaultValue: `${long},${lat}` }, + { name: "edge", type: Number, defaultValue: 1 }, + { name: "data", type: String, defaultValue: undefined }, + { name: "fog", type: Boolean, defaultValue: false }, + { name: "cloud", type: Boolean, defaultValue: false }, + { name: "device", type: Boolean, defaultValue: false }, + { name: "local_registry", type: Boolean, defaultValue: false }, + { name: "bg", type: Boolean, defaultValue: false }, + { name: "verb", type: Boolean, defaultValue: false }, + { name: "log", type: Boolean, defaultValue: false }, + { name: "old", type: Boolean, defaultValue: false }, + { name: "local", type: Boolean, defaultValue: false }, + { name: "valgrind", type: Boolean, defaultValue: false }, + { name: "disable_stdout_redirect", type: Boolean, defaultValue: false }, + { name: "port", type: Number, defaultValue: undefined }, + { name: "remote", type: String, defaultValue: undefined }, //the IP ADDRESS YOU WANT TO CONNECT TO + { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call ]; const jamlistOptionDefinition = [ - {name : "help", type: Boolean, defaultValue : false }, - {name : "all", type: Boolean, defaultValue : false }, - {name : "monitor", type: Boolean, defaultValue : false }, - {name : 'type', type: String , defaultValue: undefined }, - {name : 'dataStore', type: String , defaultValue: undefined }, - {name : 'tmuxid', type: String , defaultValue: undefined }, - {name : 'port', type: String , defaultValue: undefined }, - {name : 'app', type: String , defaultValue: undefined }, - {name : 'prog', type: String , defaultValue: undefined }, - {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO - {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call - - ]; - -const jamkillOptionDefinition = [ - {name : 'help', type: Boolean, defaultValue : false }, - {name : 'all', type: Boolean , defaultValue: false }, - {name : 'reset', type: Boolean , defaultValue: false }, - {name : 'app', type: String , defaultValue: false }, - {name : 'prog', type: String , defaultValue: false }, - {name : 'port', type: String , defaultValue: false }, - {name: "pause", type: Boolean, defaultValue: false }, - {name: "remote", type:Boolean, defaultValue: false},//the IP ADDRESS YOU WANT TO CONNECT TO - {name: "root", type:String, defaultValue: undefined}//THE IP ADRRESS OF THE MACHINE making the remote call - + { name: "help", type: Boolean, defaultValue: false }, + { name: "all", type: Boolean, defaultValue: false }, + { name: "monitor", type: Boolean, defaultValue: false }, + { name: "type", type: String, defaultValue: undefined }, + { name: "dataStore", type: String, defaultValue: undefined }, + { name: "tmuxid", type: String, defaultValue: undefined }, + { name: "port", type: String, defaultValue: undefined }, + { name: "app", type: String, defaultValue: undefined }, + { name: "prog", type: String, defaultValue: undefined }, + { name: "remote", type: Boolean, defaultValue: false }, //the IP ADDRESS YOU WANT TO CONNECT TO + { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call +]; +const jamkillOptionDefinition = [ + { name: "help", type: Boolean, defaultValue: false }, + { name: "all", type: Boolean, defaultValue: false }, + { name: "reset", type: Boolean, defaultValue: false }, + { name: "app", type: String, defaultValue: false }, + { name: "prog", type: String, defaultValue: false }, + { name: "port", type: String, defaultValue: false }, + { name: "remote", type: Boolean, defaultValue: false }, //the IP ADDRESS YOU WANT TO CONNECT TO + { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call ]; const jamclogOptionDefinition = [ - {name : "help", type: Boolean, defaultValue : false }, - {name : "program", type: String, defaultValue : undefined }, - {name : "app", type: String, defaultValue : undefined }, - {name: "port", type:String, defaultValue: undefined}, - {name : "j", type: Boolean, defaultValue : false }, - {name : "c", type: Boolean, defaultValue : false }, - {name : "tail", type: Number, defaultValue : undefined }, - {name : "remote", type: String, defaultValue : undefined }, - - - - - - + { name: "help", type: Boolean, defaultValue: false }, + { name: "program", type: String, defaultValue: undefined }, + { name: "app", type: String, defaultValue: undefined }, + { name: "port", type: String, defaultValue: undefined }, + { name: "j", type: Boolean, defaultValue: false }, + { name: "c", type: Boolean, defaultValue: false }, + { name: "tail", type: Number, defaultValue: undefined }, + { name: "remote", type: String, defaultValue: undefined }, ]; - -function retrieveType(device, fog, cloud){ - if(!fog && !device && !cloud){ +function retrieveType(device, fog, cloud) { + if (!fog && !device && !cloud) { return "device"; + } else if ((fog ? 1 : 0) + (device ? 1 : 0) + (cloud ? 1 : 0) > 1) { + throw Error("Only one of fog, device, cloud flag can be true"); + } else { + if (fog) return "fog"; + if (device) return "device"; + if (cloud) return "cloud"; } - - else if( ((fog?1:0) + (device?1:0) + (cloud?1:0)) > 1){ - throw Error("Only one of fog, device, cloud flag can be true") - - } - - else{ - if(fog) - return "fog" - if(device) - return "device" - if(cloud) - return "cloud" - } - } -function retrieveLongLat(loc){ - return [long, lat] = loc.split(","); +function retrieveLongLat(loc) { + return ([long, lat] = loc.split(",")); } -function getJamrunArgs(args){ - - let options - try{ - options = commandLineArgs(jamrunOptionDefinitions, {argv: args}); - } - catch(error){ - } +function getJamrunArgs(args) { + let options; + try { + options = commandLineArgs(jamrunOptionDefinitions, { argv: args }); + } catch (error) {} return options; - } -function checkJXEfile(arg){ - - if(arg.length === 0 || arg[0].toLowerCase() === "-h" || arg[0].toLowerCase() === "--help"){ - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" +function checkJXEfile(arg) { + if ( + arg.length === 0 || + arg[0].toLowerCase() === "-h" || + arg[0].toLowerCase() === "--help" + ) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; throw error; } - + const file = `${arg[0]}`; - const fext = file.split(".").pop() - - if(fext !== "jxe"){ - if(!fext) - - throw new Error(`${file} is not file name or missing extention`) - else - { - throw new Error(`Extension on ${file} is not .jxe`) + const fext = file.split(".").pop(); + + if (fext !== "jxe") { + if (!fext) + throw new Error(`${file} is not file name or missing extention`); + else { + throw new Error(`Extension on ${file} is not .jxe`); } } const absolutePath = path.resolve(file); - if(!fs.existsSync(absolutePath) && !arg.some(item => item.startsWith('--remote='))){ - throw new Error(`File: ${file} not found`) + if ( + !fs.existsSync(absolutePath) && + !arg.some((item) => item.startsWith("--remote=")) + ) { + throw new Error(`File: ${file} not found`); } - + return file; } -function SetJamrunVar(options){ - const Type = retrieveType(options.device , options.fog, options.cloud); - if(Type !== "device"){ +function SetJamrunVar(options) { + const Type = retrieveType(options.device, options.fog, options.cloud); + if (Type !== "device") { options.num = undefined; options.edge = undefined; - } - const NOVERBOSE = !options.verb - const valgrid = options.valgrid? VALGRIND_OPTS : false - const [long, lat] = retrieveLongLat(options.loc) - - const toAdd = {"valgrind" : valgrid,"long" : long,"lat" : lat, "NOVERBOSE":NOVERBOSE , "Type" : Type } - const skip = ["help","fog","cloud","device","loc", "verb"] - const AssignedVar ={} - for(let option of Object.keys(options)){ - if(skip.includes(option)){ - continue + } + const NOVERBOSE = !options.verb; + const valgrid = options.valgrid ? VALGRIND_OPTS : false; + const [long, lat] = retrieveLongLat(options.loc); + + const toAdd = { + valgrind: valgrid, + long: long, + lat: lat, + NOVERBOSE: NOVERBOSE, + Type: Type, + }; + const skip = ["help", "fog", "cloud", "device", "loc", "verb"]; + const AssignedVar = {}; + for (let option of Object.keys(options)) { + if (skip.includes(option)) { + continue; } - AssignedVar[option]= options[option] - + AssignedVar[option] = options[option]; } - for(let option of Object.keys(toAdd)){ - AssignedVar[option]= toAdd[option] + for (let option of Object.keys(toAdd)) { + AssignedVar[option] = toAdd[option]; } - if(!("tags" in AssignedVar)){ + if (!("tags" in AssignedVar)) { AssignedVar["tags"] = undefined; } return AssignedVar; - } //question one on remNote -export function jamrunParsArg(argv){ - - const arg = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamrun.mjs'))) - - const file = checkJXEfile(arg) - +export function jamrunParsArg(argv) { + const arg = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamrun.mjs") + ); + + const file = checkJXEfile(arg); - let proccessedArgs = arg.filter((_,index) => (index !== 0 )); + let proccessedArgs = arg.filter((_, index) => index !== 0); const options = getJamrunArgs(proccessedArgs); - if(!options || options.help){ - const error = new Error('SHOW USAGE'); - error.type = 'UsageError'; + if (!options || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "UsageError"; throw error; - } - for(let optionDefinition of jamrunOptionDefinitions ){ - if(options[optionDefinition.name] === null && optionDefinition.type != Boolean){ - throw new Error(`--${optionDefinition.name} requires a non-empty option argument`); - + for (let optionDefinition of jamrunOptionDefinitions) { + if ( + options[optionDefinition.name] === null && + optionDefinition.type != Boolean + ) { + throw new Error( + `--${optionDefinition.name} requires a non-empty option argument` + ); } } const varsObject = SetJamrunVar(options); varsObject["file"] = file; - if(!varsObject.app){ - throw new Error("MISSING APP NAME") + if (!varsObject.app) { + throw new Error("MISSING APP NAME"); } return varsObject; } //ASK wHAT VARIABLES ARE OPTIONAL //TO BE TESTED -export function getCargs(argObject){ - - let args = "" - for(let key of Object.keys(argObject)){ - - - if(argObject[key] != undefined ){ - - args=args+` ${key} ${argObject[key]}` +export function getCargs(argObject) { + let args = ""; + for (let key of Object.keys(argObject)) { + if (argObject[key] != undefined) { + args = args + ` ${key} ${argObject[key]}`; } } - + return args; } -export function getJargs(argObject){ - const args = [] - for(let key of Object.keys(argObject)){ - - if(argObject[key] != undefined){ - if(key === "--type") - args.push(`--${argObject[key]}`) - else - args.push(`${key}=${argObject[key]}`) +export function getJargs(argObject) { + const args = []; + for (let key of Object.keys(argObject)) { + if (argObject[key] != undefined) { + if (key === "--type") args.push(`--${argObject[key]}`); + else args.push(`${key}=${argObject[key]}`); } } return args; - } -export function getJamListArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlist.mjs'))) - let options - try{ - options = commandLineArgs(jamlistOptionDefinition, {argv: args}); - } - catch(error){ - } - - if(options.help || !options){ - - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" +export function getJamListArgs(argv) { + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamlist.mjs") + ); + let options; + try { + options = commandLineArgs(jamlistOptionDefinition, { argv: args }); + } catch (error) {} + + if (options.help || !options) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; throw error; } - if(Object.keys(options).length === 1){ - return "all" + if (Object.keys(options).length === 1) { + return "all"; } - const filters = {} - for(let key of Object.keys(options)){ - if(key === "help" || key === "monitor") - continue; - - if(key=== "type"){ - const deviceType = options[key] - if(deviceType !== "device" && deviceType !== "fog" && deviceType !== "cloud"){ - throw new Error("wrong device type") - } - filters["machType"] = deviceType + const filters = {}; + for (let key of Object.keys(options)) { + if (key === "help" || key === "monitor") continue; - } - else{ - console.log(options[key], key, options) - if(key === "prog" || key === "app" || key === "port" || key === "type" || key === "tmuxid" || key === "dataStore"){ - if(options[key].includes("=")) - filters[key]=(((options[key].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') - else - throw new Error(`${key} is missing '='`) + if (key === "type") { + const deviceType = options[key]; + if ( + deviceType !== "device" && + deviceType !== "fog" && + deviceType !== "cloud" + ) { + throw new Error("wrong device type"); } - else{ - filters[key] = options[key] + filters["machType"] = deviceType; + } else { + console.log(options[key], key, options); + if ( + key === "prog" || + key === "app" || + key === "port" || + key === "type" || + key === "tmuxid" || + key === "dataStore" + ) { + if (options[key].includes("=")) + filters[key] = options[key] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + else throw new Error(`${key} is missing '='`); + } else { + filters[key] = options[key]; } } - } - - - return {filters : filters, monitor: options.monitor} - - + return { filters: filters, monitor: options.monitor }; } - -export function getKilltArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamkill.mjs'))) - let options - - try{ - options = commandLineArgs(jamkillOptionDefinition, {argv: args}); - } - catch(error){ - } - - - if(options === undefined || options.help){ - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" +export function getKilltArgs(argv) { + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamkill.mjs") + ); + let options; + + try { + options = commandLineArgs(jamkillOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; throw error; } - if(options["app"]){ - if(options["app"].includes("=")){ - let newOption = (((options["app"].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') - console.log(newOption) - options["app"] = newOption - } - else{ - throw new Error("app argument missing '=' ") + if (options["app"]) { + if (options["app"].includes("=")) { + let newOption = options["app"] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + console.log(newOption); + options["app"] = newOption; + } else { + throw new Error("app argument missing '=' "); } } - if(options["prog"]){ - if(options["prog"].includes("=")){ - let newOption = (((options["prog"].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') - options["prog"] = newOption - } - else{ - throw new Error("program argument missing '=' ") + if (options["prog"]) { + if (options["prog"].includes("=")) { + let newOption = options["prog"] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + options["prog"] = newOption; + } else { + throw new Error("program argument missing '=' "); } } - if(options["port"]){ - if(options["port"].includes("=")){ - let newOption = (((options["port"].split("=")).slice(1)).map((entry)=>{ if(entry === ''){return '='} else{return entry}})).join('') - options["port"] = newOption - } - else{ - throw new Error("port argument missing '=' ") + if (options["port"]) { + if (options["port"].includes("=")) { + let newOption = options["port"] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + options["port"] = newOption; + } else { + throw new Error("port argument missing '=' "); } } - console.log(options) - return options - + console.log(options); + return options; } -export function getRemoteArgs(argObject){ - const args =[] - args.push(argObject.file) - for(let arg of Object.keys(argObject)){ - if(argObject[arg] === false || argObject[arg] === undefined ){ +export function getRemoteArgs(argObject) { + const args = []; + args.push(argObject.file); + for (let arg of Object.keys(argObject)) { + if (argObject[arg] === false || argObject[arg] === undefined) { continue; } - if(arg === "long" || arg ==="lat" || arg === "Type" || arg === "NOVERBOSE" || arg === "remote" || arg =="file"){ + if ( + arg === "long" || + arg === "lat" || + arg === "Type" || + arg === "NOVERBOSE" || + arg === "remote" || + arg == "file" + ) { continue; } - if(argObject[arg] === true){ - args.push(`--${arg}`) - } - else{ - args.push(`--${arg}=${argObject[arg]}`) + if (argObject[arg] === true) { + args.push(`--${arg}`); + } else { + args.push(`--${arg}=${argObject[arg]}`); } } - args.push(`--loc=${long},${lat}`) - if (argObject["NOVERBOSE"]) args.push(`--verb`) - args.push(`--${argObject["Type"]}`) - return args.join(" ") + args.push(`--loc=${long},${lat}`); + if (argObject["NOVERBOSE"]) args.push(`--verb`); + args.push(`--${argObject["Type"]}`); + return args.join(" "); } -export function getLogArgs(argv){ - const args = argv.filter((entry) => (!entry.includes('node') && !entry.includes('zx') && !entry.includes('jamlog.mjs') )) - let options +export function getLogArgs(argv) { + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamlog.mjs") + ); + let options; let file; let flag; - try{ - options = commandLineArgs(jamclogOptionDefinition, {argv: args}); - - } - catch(error){ - console.log(error) + try { + options = commandLineArgs(jamclogOptionDefinition, { argv: args }); + } catch (error) { + console.log(error); } - - if(options === undefined || options.help){ - const error = new Error("SHOW USAGE") - error.type = "ShowUsage" + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; throw error; - } - - else if(!options.program || !options.app || !options.port){ - throw new Error("Missing programName or appName or port") - } - else if(options.port && options.app && options.program){ - file = `${options.program}_${options.app}/${options.port}` - } - else{ - file = `${options.program}_${options.app}` - } - - if((options.j && options.c) || (!options.c && !options.j)){ - flag = "all" - } - else{ - flag = (options.j)? "j" : "c" - } - return {file : file , flag : flag, tail : options.tail, remote: options.remote} - - + } else if (!options.program || !options.app || !options.port) { + throw new Error("Missing programName or appName or port"); + } else if (options.port && options.app && options.program) { + file = `${options.program}_${options.app}/${options.port}`; + } else { + file = `${options.program}_${options.app}`; + } + + if ((options.j && options.c) || (!options.c && !options.j)) { + flag = "all"; + } else { + flag = options.j ? "j" : "c"; + } + return { + file: file, + flag: flag, + tail: options.tail, + remote: options.remote, + }; } - - - - From 1d0c1f7da4131e4dd7b3fe54e987eda8bbccf250 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Sun, 11 Aug 2024 20:54:07 -0400 Subject: [PATCH 072/126] potential ENOENT FIX in jamlist --- tools/cleanUp.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 09ae85ac3..2bd699e33 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -122,9 +122,9 @@ function ArchiveLog(removablePort, appName, programName){ } } - + process.chdir(`..`); } - process.chdir(`..`); + } function cleanAppDir(removablePort,appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) From c563f6243920309563dfd794a13373530eff9c54 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Sun, 11 Aug 2024 22:18:24 -0400 Subject: [PATCH 073/126] jamkill new arg format fixed in jamclean --- tools/jamclean.mjs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index eafbbbb0a..1161c1dee 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -234,8 +234,7 @@ async function clean(){ for(let dir of dirs){ //mosquitto not running kill if(!await isMosquittoRunning(port)){ - - await $`zx ${jamcKillPath} --port --name=${port}` + await $`zx ${jamcKillPath} --port==${port}` continue portLoop; } //jFile is not running. to remove fromport list From 880b531e3071dd34666ce6f0eaa030fa120eb53f Mon Sep 17 00:00:00 2001 From: Mahesh Maheswaran Date: Tue, 13 Aug 2024 10:07:38 -0400 Subject: [PATCH 074/126] applied the patch from shahin --- tools/jamclean.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 1161c1dee..bfd85b7e6 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -233,7 +233,7 @@ async function clean(){ const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") for(let dir of dirs){ //mosquitto not running kill - if(!await isMosquittoRunning(port)){ + if(!await isMosquittoRunning(port) && port){ await $`zx ${jamcKillPath} --port==${port}` continue portLoop; } From cff7e953cd1564d553c4d34f289ff59a8e79774d Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 14 Aug 2024 03:56:42 -0400 Subject: [PATCH 075/126] jamterm itter1 --- tools/fileDirectory.mjs | 1 - tools/jamclean.mjs | 6 +- tools/jamterm.mjs | 263 ++++++++++++++++++++++++++++++++++++++++ tools/parser.mjs | 90 ++++++++++++++ 4 files changed, 356 insertions(+), 4 deletions(-) create mode 100644 tools/jamterm.mjs diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index a416539b5..c79f72729 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -143,7 +143,6 @@ export function fileDirectoryMqtt(folder, iport,jamfolder,app){ } else{ - console.log("new ") fs.writeFileSync(`${jamfolder}/ports/${iport}`, `${dirName}\n`) } diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index 1161c1dee..e76acd8ca 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -9,7 +9,6 @@ import { Client } from 'ssh2'; - const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); const jamcKillPath = resolve(__dirname, 'jamkill.mjs'); @@ -203,7 +202,8 @@ function cleanPorts(AppToRemove){ const toRemove = AppToRemove.get(port) const newApps = oldApss.filter((entry) => !toRemove.includes(entry)) if(newApps.length === 1){ - fs.writeFileSync(`${jamFolder}/ports/${port}`, `${newApps[0]}\n`) + fs.writeFileSync(`${jamFolder}/ports/${port}`, `${newApps[0]}`) + } else{ console.log(`${newApps.join("\n")}\n`) @@ -233,7 +233,7 @@ async function clean(){ const dirs = fs.readFileSync(`${portsDir}/${port}`).toString().trim().split("\n") for(let dir of dirs){ //mosquitto not running kill - if(!await isMosquittoRunning(port)){ + if(!await isMosquittoRunning(port) && port){ await $`zx ${jamcKillPath} --port==${port}` continue portLoop; } diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs new file mode 100644 index 000000000..fba9f45ce --- /dev/null +++ b/tools/jamterm.mjs @@ -0,0 +1,263 @@ +#!/usr/bin/env zx + +import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; +import { Client } from 'ssh2'; +import { getTermArgs } from "./parser.mjs"; +import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; +const { spawnSync } = require('child_process'); +const MAX_TMUX_NUM = 16; +const MAIN_SESH_NAME = "main" +const p = spawnSync('which', ['tmux']); +const MYTMUX = p.stdout.toString().trim() +function getRunningDirs(){ + const jamFolder = getJamFolder() + const appToPort = new Map() + let activePorts + try{ + activePorts = fs.readdirSync(`${jamFolder}/ports`) + } + catch(error){ + return appToPort + } + for(let port of activePorts){ + let apps; + try{ + apps = fs.readFileSync(`${jamFolder}/ports/${port}`).toString().trim().split("\n"); + } + catch(error){ + continue + } + for(let app of apps){ + if(appToPort.has(app)){ + const portList = appToPort.get(app); + portList.push(port) + appToPort.set(app,portList) + } + else{ + appToPort.set(app,[port]) + } + } + } + return appToPort; +} +function dirNameToProgramName(dirName){ + return (dirName.split('_'))[0] +} +function dirNameToAppName(dirName){ + const dir = dirName.split('_') + if(dir.length > 2){ + return (dir.filter((_,index) => index !== 0)).join("_") + } + else{ + return dir[1]; + } + +} + +function getPrograms(root=null){ + const toGet=[]; + const activeDirs = getRunningDirs(); + const appfolder = getAppFolder() + + for(let dir of activeDirs.keys()){ + for(let port of activeDirs.get(dir)){ + if(root){ + try{ + const rootIP = fs.readFileSync(`${appfolder}/${dir}/${port}/root`).toString().trim(); + if(rootIP === root){ + const info = + { + path: `${appfolder}/${dir}/${port}`, + program : dirNameToProgramName(dir), + app : dirNameToAppName(dir), + port : port + } + toGet.push(info) + } + } + catch(error){ + continue; + } + } + else{ + const info = + { + path: `${appfolder}/${dir}/${port}`, + program : dirNameToProgramName(dir), + app : dirNameToAppName(dir), + port : port + + } + + toGet.push(info) + } + } + } + + return toGet +} +function filter(data, filters){ + const filteredInfo =[]; + for(let info of data){ + let isPassing = true + for(let filter of Object.keys(filters)){ + if(!(filters[filter] === info[filter])){ + isPassing = false + break; + } + } + if(isPassing){ + filteredInfo.push(info) + } + } + return filteredInfo; +} +async function getTmuxSessions(filteredData){ + const tmux_sesh = new Map() + for(let data of filteredData){ + if(!fs.existsSync(`${data.path}/tmuxid`)){ + continue; + } + const tmuxID = fs.readFileSync(`${data.path}/tmuxid`).toString().trim() + + const p = await $`${MYTMUX} ls | grep ${tmuxID}`.nothrow().quiet() + if(p.stdout.toString() === ""){ + continue; + } + const tmuxSessions = (p.stdout.toString().trim().split("\n")).map((entry) => entry.split(":")[0]) + const tag = data.program+"_"+data.app+"_"+data.port; + if(tmuxSessions.length > MAX_TMUX_NUM){ + console.log("too many Tmuxm,this app will not be displayed") + continue; + } + tmux_sesh.set(tag, tmuxSessions) + + + } + return tmux_sesh +} + +async function split(number,windowName) { + const targetSesh = `${MAIN_SESH_NAME}:${windowName}`; + console.log(windowName) + let counter=1; + let splitDir = "-v" + let currPane=0 + let NexFlag = false + while(counter < number){ + try{ + if(NexFlag){ + currPane++; + NexFlag = false; + } + console.log(currPane, "before adding PNUM") + console.log(counter, "before adding PNUM") + + let p = await $`${MYTMUX} split-window ${splitDir} -t ${targetSesh}.${currPane}`.quiet() + console.log("Panes state after operation:", p.stdout); + counter++; + } + catch(error){ + console.log(currPane, "error, PNUM") + console.log(error) + console.log(counter, "error, CNUM") + + if(error.stderr.toString().trim() === "no space for new pane"){ + if(currPane >= counter){ + throw new Error("Screan or terminal to small for displaying the tmux sessions") + } + if(splitDir === "-v"){ + + splitDir = "-h" + } + else{ + console.log(currPane, "SETFLAG, PNUM") + console.log(counter, "SETFLAG, CNUM") + splitDir = "-v" + NexFlag = true + } + + } + else{ + throw error; + } + + } + } + + await $`${MYTMUX} select-layout -t ${MAIN_SESH_NAME}:${windowName} tiled`; +} + + + +function parsArgs(){ + let args; + + try { + args = getTermArgs(process.argv); + } catch (error) { + // show_usage(); + // error.message === "SHOW USAGE" ? null : console.log(error.message); + // process.exit(1); + console.log(error) + } + return args +} +async function creatMainSesh(){ + try{ + await $`${MYTMUX} new-session -d -s ${MAIN_SESH_NAME}`.quiet(); + return; + } + catch(error){ + if((error.stderr.toString().trim()).includes("duplicate session")){ + await $`${MYTMUX} kill-session -t ${MAIN_SESH_NAME}`; + } + else{ + throw error + } + } + await $`${MYTMUX} new-session -d -s ${MAIN_SESH_NAME}`; +} + +async function setUpTmux(sessionMap){ + for(let tag of sessionMap.keys()){ + await $`${MYTMUX} new-window -t ${MAIN_SESH_NAME} -n ${tag}`; + const tmuxIDs = sessionMap.get(tag); + const numPanes = tmuxIDs.length; + await split(numPanes,tag) + for(let index = 0; index{main()})() + diff --git a/tools/parser.mjs b/tools/parser.mjs index d35a251cd..13870eb55 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -73,6 +73,18 @@ const jamkillOptionDefinition = [ { name: "remote", type: Boolean, defaultValue: false }, //the IP ADDRESS YOU WANT TO CONNECT TO { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call ]; + +const jamtermOptionDefinition = [ + { name: "help", type: Boolean, defaultValue: false }, + { name: "all", type: Boolean, defaultValue: false }, + { name: "reset", type: Boolean, defaultValue: false }, + { name: "app", type: String, defaultValue: false }, + { name: "prog", type: String, defaultValue: false }, + { name: "port", type: String, defaultValue: false }, + { name: "remote", type: Boolean, defaultValue: false }, //the IP ADDRESS YOU WANT TO CONNECT TO + { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call +]; + const jamclogOptionDefinition = [ { name: "help", type: Boolean, defaultValue: false }, { name: "program", type: String, defaultValue: undefined }, @@ -381,6 +393,84 @@ export function getKilltArgs(argv) { return options; } + +export function getTermArgs(argv) { + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamterm.mjs") + ); + let options; + + try { + options = commandLineArgs(jamtermOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + } + if (options["app"]) { + if (options["app"].includes("=")) { + let newOption = options["app"] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + console.log(newOption); + options["app"] = newOption; + } else { + throw new Error("app argument missing '=' "); + } + } + if (options["prog"]) { + if (options["prog"].includes("=")) { + let newOption = options["prog"] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + options["prog"] = newOption; + } else { + throw new Error("program argument missing '=' "); + } + } + if (options["port"]) { + if (options["port"].includes("=")) { + let newOption = options["port"] + .split("=") + .slice(1) + .map((entry) => { + if (entry === "") { + return "="; + } else { + return entry; + } + }) + .join(""); + options["port"] = newOption; + } else { + throw new Error("port argument missing '=' "); + } + } + console.log(options); + return options; +} + export function getRemoteArgs(argObject) { const args = []; args.push(argObject.file); From 82ebb36b9e086452b2544629988dd3de9177d3a3 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Wed, 14 Aug 2024 21:45:05 -0400 Subject: [PATCH 076/126] tmux split error fixed --- tools/chalk.mjs | 6 +-- tools/jamterm.mjs | 117 +++++++++++++++++++++++++++++++++++++--------- tools/parser.mjs | 2 - 3 files changed, 99 insertions(+), 26 deletions(-) diff --git a/tools/chalk.mjs b/tools/chalk.mjs index 0c704eed9..84cc22b3a 100644 --- a/tools/chalk.mjs +++ b/tools/chalk.mjs @@ -16,13 +16,13 @@ export function body_sec(txt){ } export function body_2(txt){ - return chalk.black(txt) + return chalk.dim(txt) } export function body_2_line(txt){ - return chalk.black.underline(txt) + return chalk.dim.underline(txt) } export function body_2_bold(txt){ - return chalk.black.bold(txt) + return chalk.dim.bold(txt) } export function keyWord(txt){ diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs index fba9f45ce..23d31374d 100644 --- a/tools/jamterm.mjs +++ b/tools/jamterm.mjs @@ -9,6 +9,71 @@ const MAX_TMUX_NUM = 16; const MAIN_SESH_NAME = "main" const p = spawnSync('which', ['tmux']); const MYTMUX = p.stdout.toString().trim() + +function show_usage(){ + const usageMessage = + ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jamterm`)}${body_1(` -- a tool to display multiple C node outputs live`)} + + ${header_1(`SYNOPSIS`)} + + Usage: jamterm + [--help] + [--all] + [--remote=${body_sec(`IPAddress`)}] //NOT IMPEMENTED YET + [--app==${body_sec(`appName`)}] + [--prog==${body_sec(`programName`)}] + [--port==${body_sec(`portNum`)}] + + ${header_1(`DESCRIPTION`)} + + --- ${keyWord('jamterm')} by default displays all the running C node outputs in the different tmux windows and panes. + + ${keyWord('Tmux Format')}: + ${body_2(`1) Each running app will be displayed on a different Tmux window.`)} + ${body_2(`2) Each window will be splited to different panes in a grid format and each pane is showing a C node output.`)} + + ${keyWord('restrictions')}: + ${body_2(`1) If an app has more than 16 C nodes, jamterm will skip that app.`)} + ${body_2(`2) various factors like the size of screen, terminal and resolution effects the number of + possible tmuxes to display.Maybe try a bigger screen `)} + + --- jamterm [--help] + ${body_2(`Use this flag to display this usage msg.`)} + + --- jamterm [--all] + ${body_2(`Use this flag to display all running C nodes.`)} + ${body_2_bold(`NOTE: + 2) If --all used with --all flag --app, --prog, --port, they will be disabled.`)} + + --- jamterm [--remote] + ${body_2(`NOT IMPLEMENTED YET`)} + + --- jamterm [--app==X] + ${body_2(`Use this flag to display C nodes of programs with a specific appName.`)} + + --- jamterm [--prog==X] + ${body_2(`Use this flag to display C nodes of programs with a specific programName.`)} + + --- jamterm [--port=3] + ${body_2(`Use this flag to display C nodes of programs running on a certain port.`)} + + NOTE: + ${body_2(`1) --app & --prog & --port can be used all together or two by two to which programs to display. `)} + ${body_2(`2) To set --app , --prog and --port options two equal signs has to be used.`)} + + + RESTRICTIONS: + ${body_2(`single command cannot have multiple --app , --prog and --port conditions to kill apps with different appNames, + programNames and portNumbers in one shot.`)} + + `; + + console.log(usageMessage) +} + function getRunningDirs(){ const jamFolder = getJamFolder() const appToPort = new Map() @@ -139,7 +204,6 @@ async function getTmuxSessions(filteredData){ async function split(number,windowName) { const targetSesh = `${MAIN_SESH_NAME}:${windowName}`; - console.log(windowName) let counter=1; let splitDir = "-v" let currPane=0 @@ -150,17 +214,17 @@ async function split(number,windowName) { currPane++; NexFlag = false; } - console.log(currPane, "before adding PNUM") - console.log(counter, "before adding PNUM") + + let p = await $`${MYTMUX} split-window ${splitDir} -t ${targetSesh}.${currPane}`.quiet() - console.log("Panes state after operation:", p.stdout); + counter++; } catch(error){ - console.log(currPane, "error, PNUM") - console.log(error) - console.log(counter, "error, CNUM") + + + if(error.stderr.toString().trim() === "no space for new pane"){ if(currPane >= counter){ @@ -171,8 +235,8 @@ async function split(number,windowName) { splitDir = "-h" } else{ - console.log(currPane, "SETFLAG, PNUM") - console.log(counter, "SETFLAG, CNUM") + + splitDir = "-v" NexFlag = true } @@ -180,12 +244,13 @@ async function split(number,windowName) { } else{ throw error; + break; } } } - await $`${MYTMUX} select-layout -t ${MAIN_SESH_NAME}:${windowName} tiled`; + } @@ -196,10 +261,10 @@ function parsArgs(){ try { args = getTermArgs(process.argv); } catch (error) { - // show_usage(); - // error.message === "SHOW USAGE" ? null : console.log(error.message); - // process.exit(1); - console.log(error) + show_usage(); + error.message === "SHOW USAGE" ? null : console.log(error.message); + process.exit(1); + } return args } @@ -225,12 +290,18 @@ async function setUpTmux(sessionMap){ const tmuxIDs = sessionMap.get(tag); const numPanes = tmuxIDs.length; await split(numPanes,tag) + const result = await $`tmux list-panes -t ${MAIN_SESH_NAME}:${tag} -F '#P'`; + const panes = result.stdout.trim().split('\n'); + console.log('Available panes:', panes); + await $`${MYTMUX} select-layout -t ${MAIN_SESH_NAME}:${tag} tiled`; + } + + for(let tag of sessionMap.keys()){ + const tmuxIDs = sessionMap.get(tag); for(let index = 0; index&2 - exit 1 -} - -show_usage() { - cat << EOF -Shows the background terminals with the given tmux-id and terminal-num. - -Usage: jamterm [tmux-id] [-t terminal-num] - -jamterm -Shows the first C terminal of the program that was last started. - -jamterm -t 2 - - -jamterm u-600-dev-2331 -t 2 -Shows the second C terminal of the program running under u-600-dev-2331. - -jamterm u-600-dev-2331 -Shows the first C terminal of the program running under u-600-dev-2331. - -EOF -} - -localtmux() { - local tmuxapp=$1 - local termno=$2 - - $TMUX has-session -t $tmuxapp-$termno 2>/dev/null - res=$? - if [ $res == "0" ]; then - if [ -z $termno ]; then - $TMUX attach -t $tmuxapp - else - $TMUX attach -t $tmuxapp-$termno - fi - fi -} - - -### -# Main script execution begins here... -# - -jamfolder=$HOME"/.jamruns" -exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" - -appsfolder=$jamfolder/apps -exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" - -cd $appsfolder - -if [ -z $1 ]; then - if [ -e tmuxid ]; then - tmuxid=`cat tmuxid` - localtmux $tmuxid 1 - exit - fi -else - # Show help - if [ $1 == "-h" ] || [ $1 == "--help" ]; then - show_usage - exit - elif [ $1 == "-t" ]; then - if [ -e tmuxid ]; then - tmuxid=`cat tmuxid` - localtmux $tmuxid $2 - exit - fi - exit - else - if [ -z $2 ]; then - termid=1 - else - if [ -n $3 ] && [ $2 == "-t" ]; then - termid=$3 - fi - fi - localtmux $1 $termid - fi -fi diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs old mode 100644 new mode 100755 From d651efe95e524ce85e0c3f8d1ed5a627290f0ff7 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 15 Aug 2024 20:03:12 -0400 Subject: [PATCH 078/126] filter fixed --- tools/jamterm.mjs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs index 23d31374d..14b66d12b 100644 --- a/tools/jamterm.mjs +++ b/tools/jamterm.mjs @@ -133,7 +133,7 @@ function getPrograms(root=null){ const info = { path: `${appfolder}/${dir}/${port}`, - program : dirNameToProgramName(dir), + prog : dirNameToProgramName(dir), app : dirNameToAppName(dir), port : port } @@ -148,7 +148,7 @@ function getPrograms(root=null){ const info = { path: `${appfolder}/${dir}/${port}`, - program : dirNameToProgramName(dir), + prog : dirNameToProgramName(dir), app : dirNameToAppName(dir), port : port @@ -244,7 +244,6 @@ async function split(number,windowName) { } else{ throw error; - break; } } @@ -311,13 +310,13 @@ async function main(){ const data = getPrograms() let filters ={} if(args.prog){ - filters["programName"] = `${args.prog}.jxe` + filters["prog"] = `${args.prog}.jxe` } if(args.app){ - filters["appName"] = args.app + filters["app"] = args.app } if(args.port){ - filters["portNumber"] = args.port + filters["port"] = args.port } const filteredData= args.all ? data : filter(data,filters); if(filteredData.length === 0){ From 8abd0b69ae75632e2425d71ec776dc1299018583 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 15 Aug 2024 20:57:24 -0400 Subject: [PATCH 079/126] prog filter fix --- tools/jamterm.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs index 14b66d12b..0d0673d2f 100755 --- a/tools/jamterm.mjs +++ b/tools/jamterm.mjs @@ -310,7 +310,7 @@ async function main(){ const data = getPrograms() let filters ={} if(args.prog){ - filters["prog"] = `${args.prog}.jxe` + filters["prog"] = `${args.prog}` } if(args.app){ filters["app"] = args.app From 30748481d87bb1f770779d5b6e6ddfa54be0e363 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Tue, 27 Aug 2024 00:54:29 -0400 Subject: [PATCH 080/126] jamterm and jamBatch completed --- tools/inc/misc_tools.sh | 268 ---------------------------------------- tools/jambatch.mjs | 100 +++++++++++++++ tools/jamrun.mjs | 35 +++--- tools/jamterm.mjs | 90 +++++++++----- tools/parser.mjs | 125 ++++++++++++++++++- 5 files changed, 299 insertions(+), 319 deletions(-) delete mode 100644 tools/inc/misc_tools.sh create mode 100644 tools/jambatch.mjs diff --git a/tools/inc/misc_tools.sh b/tools/inc/misc_tools.sh deleted file mode 100644 index faa06a696..000000000 --- a/tools/inc/misc_tools.sh +++ /dev/null @@ -1,268 +0,0 @@ - -# Utils used in the bash scripts - -die() { - printf '%s\n' "$1" >&2 - exit 1 -} - - -# We use the global variable 'result' to pass parameter values back -# - -# -# Call like the following -# inc_counter counter_name -# the counter_name is a file location -# -inc_counter() { - local counter=$1 - local value - - if [ -e $counter ]; then - value=`cat $counter` - ((value++)) - result=$value - else - value=1 - result=1 - fi - echo $value > $counter -} - -inc_counter_sync() { - local counter=$1 - local value - - if [ -e $counter ]; then - value=`cat $counter` - ((value++)) - result=$value - else - value=1 - result=1 - fi - echo $value > $counter - sync -} - - -# set_counter 10 $jamfolder/global/count -set_counter() { - local value=$1 - local counter=$2 - - if [ ! -e $counter ]; then - echo $value > $counter - fi -} - -set_counter_sync() { - local value=$1 - local counter=$2 - - if [ ! -e $counter ]; then - echo $value > $counter - fi - sync -} - - - -# dec_counter counter_name -# -dec_counter() { - local counter=$1 - - if [ ! -e $counter ]; then - die "Trying to decrement a non-existent counter $counter" - fi - - local value=`cat $counter` - if [ ! -z $value ]; then - ((value--)) - echo $value > $counter - fi - result=$value -} - -dec_counter_sync() { - local counter=$1 - - if [ ! -e $counter ]; then - die "Trying to decrement a non-existent counter $counter" - fi - - local value=`cat $counter` - if [ ! -z $value ]; then - ((value--)) - echo $value > $counter - fi - result=$value - sync -} - -# save_no_overwrite value location -# -save_no_overwrite() { - local value=$1 - local location=$2 - - if [ ! -e $location ]; then - echo $value > $location - else - local x=`cat $location` - if [ -z $x ]; then - echo $value > $location - fi - fi -} - - -save_no_overwrite_sync() { - local value=$1 - local location=$2 - - if [ ! -e $location ]; then - echo $value > $location - else - local x=`cat $location` - if [ -z $x ]; then - echo $value > $location - fi - fi - sync -} - - -# save value location -# with overwrite -save() { - local value=$1 - local location=$2 - - echo $value > $location -} - - -save_sync() { - local value=$1 - local location=$2 - - echo $value > $location - sync -} - - -create_missingdir() { - local dirn=$1 - - if [ ! -e $dirn ]; then - mkdir $dirn - fi -} - -exit_missingdir() { - local dirn=$1 - local emsg=$2 - if [ ! -d $dirn ]; then - echo $emsg - exit 0 - fi -} - -wait_missingdir() { - local rootdir=$1 - local watchdir=$2 - - if [ ! -d $watchdir ]; then - while :; do - inotifywait -e create -t 1 $rootdir - if [ -d $watchdir ]; then break; fi - done - fi -} - - -exit_missingfile() { - local file=$1 - local emsg=$2 - - if [ ! -e $file ]; then - echo $emsg - exit 0 - fi -} - -create_conffile() { - local file=$1 - local contents=$2 - - echo "#" | cat > $1 - echo "allow_anonymous true" | cat >> $1 - echo "#" | cat >> $1 - echo "listener ${2}" | cat >> $1 -} - -check_prog() { - local prog=$1 - local msg=$2 - - local present=`which $prog` - if [ -z $present ]; then - echo $msg - exit 0 - fi -} - -# Check the Program -# If the program is not there.. check the alt. -# Print error and exit if the alt is missing as well -# -check_set_check_prog() { - prog=$1 - local msg=$2 - altprog=$3 - - local present=`which $prog` - if [ -z $present ]; then - prog=$altprog - local present=`which $prog` - if [ -z $present ]; then - echo $msg - exit 0 - fi - fi -} - -buildjargs() { - local str= - for x in $@; do - str+=" " - local xtail="${x##*=}" - local xhead="${x%=*}" - - if [ ! -z $xtail ]; then - str+=$x - fi - done - - str+=" --$type" - - results=$str -} - -buildcargs() { - local str= - for x in $@; do - str+=" " - local xtail="${x##*=}" - local xhead="${x%=*}" - - if [ ! -z $xtail ]; then - str+="$xhead $xtail" - fi - done - - results=$str -} diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs new file mode 100644 index 000000000..c06844bd3 --- /dev/null +++ b/tools/jambatch.mjs @@ -0,0 +1,100 @@ +#!/usr/bin/env zx +import {getBatchArgs} from './parser.mjs' +import { spawnSync } from 'child_process'; +import { + body_1, + header_1, + header_2, + body_sec, + body_2, + body_2_bold, +} from "./chalk.mjs"; +let args; + +function show_usage() { + const usageMessage = ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jambatch`)}${body_1( + ` -- a tool to run JXE files in batch` + )} + + ${header_1(`SYNOPSIS`)} + + Usage: jambatch + + [--help] + [--fog = ${body_sec(`numProgram1-programName1,numProgram2-programName2`)}] + [--device] = ${body_sec(`numProgram1-programName1,numProgram2-programName2`)}] + [--cloud] = ${body_sec(`numProgram1-programName1,numProgram2-programName2`)}] + [--cFile = ${body_sec(`cloudProg1File,cloudProg2File`)}] + [--fFile = ${body_sec(`fogProg1File,fogProg2File`)}] + [--dFile = ${body_sec(`deviceProg1File,deviceProg2File`)}] + [--num = ${body_sec(`cNumProg1,CnumProg2`)}] + [--cLoc = ${body_sec(`longCloudProg1,latCloudProg1-longCloudProg2-latCloudProg2`)}] + [--fLoc = ${body_sec(`longFogProg1,latFogProg1-longFogProg2-latFogProg2`)}] + [--dLoc = ${body_sec(`longDeviceProg1,latDeviceProg1-longDeviceProg2-latDeviceProg2`)}] + [--cEdge= ${body_sec(`numEdgeCloudProg1,numEdgeCloudProg2`)}] + [--fEdge= ${body_sec(`numEdgeFogProg1,numEdgeFogProg2`)}] + [--dEdge= ${body_sec(`numEdgeDeviceProg1,numEdgeDeviceProg2`)}] + + ${header_1(`DESCRIPTION`)} + + + --- jambatch.mjs --help + ${body_2("--help : use this flag to display this usage message.")} + + --- jambatch.mjs program.jxe --fog=2-XX,3-X --fFile=1-jt2.jxe,2-jt3.jxe,2-jt4.jxe [--fLoc=300,300-400,400] [fEdge=1] + ${body_2_bold(`note: --fog and fFilen prefix numbers should add up to the same number. ex)2+3 = 1+2+2.`)} + ${body_2("the command abouve executes the following commands synchronously:")} + ${body_2(`jamrun.mjs jt2.jxe --app=XX --loc=300,300 --edge=1 --bg --log --fog`)} + ${body_2(`jamrun.mjs jt3.jxe --app=XX --loc=400,400 --bg --log --fog`)} + ${body_2(`jamrun.mjs jt3.jxe --app=X --bg --log --fog`)} + ${body_2(`jamrun.mjs jt4.jxe --app=X --bg --log --fog`)} + ${body_2(`jamrun.mjs jt4.jxe --app=X --bg --log --fog`)} + + + --- jambatch.mjs program.jxe --cloud=2-XX,3-X --cFile=1-jt2.jxe,2-jt3.jxe,2-jt4.jxe [--cLoc=300,300-400,400] [cEdge=1] + ${body_2_bold(`note: --cloud and cFilen prefix numbers should add up to the same number.ex) 2+3 = 1+2+2.`)} + ${body_2("the command abouve executes the following commands synchronously:")} + ${body_2(`jamrun.mjs jt2.jxe --app=XX --loc=300,300 --edge=1 --bg --log --cloud`)} + ${body_2(`jamrun.mjs jt3.jxe --app=XX --loc=400,400 --bg --log --cloud`)} + ${body_2(`jamrun.mjs jt3.jxe --app=X --bg --log --cloud`)} + ${body_2(`jamrun.mjs jt4.jxe --app=X --bg --log --cloud`)} + ${body_2(`jamrun.mjs jt4.jxe --app=X --bg --log --cloud`)} + + --- jambatch.mjs program.jxe --device=2-XX,3-X --dFile=1-jt2.jxe,2-jt3.jxe,2-jt4.jxe [--dLoc=300,300-400,400] [dEdge=1] [num=2,3,1] + ${body_2_bold(`note: --cloud and cFilen prefix numbers should add up to the same number.ex) 2+3 = 1+2+2.`)} + ${body_2("the command abouve executes the following commands synchronously:")} + ${body_2(`jamrun.mjs jt2.jxe --app=XX --loc=300,300 --edge=1 --bg --log --device --num=2`)} + ${body_2(`jamrun.mjs jt3.jxe --app=XX --loc=400,400 --bg --log --device --num=3`)} + ${body_2(`jamrun.mjs jt3.jxe --app=X --bg --log --device --num=1`)} + ${body_2(`jamrun.mjs jt4.jxe --app=X --bg --log --device`)} + ${body_2(`jamrun.mjs jt4.jxe --app=X --bg --log --device`)} + + + ${header_2( + `1) The --bg and --log flags are always set using jambatch.mjs.` + )} + ${header_2( + `2) No possibility running remote jobs using batch mode.` + )} + `; + + console.log(usageMessage); +} + +try { + args = getBatchArgs(process.argv); +} catch (error) { + console.log(show_usage()) + error.message === "SHOW USAGE" ? null : console.log(error); + process.exit(1); +} +for(let arg of args){ + + spawnSync('zx', ['jamrun.mjs'].concat(arg), { + stdio: 'inherit', + shell: true + }); +} diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index d429f46ee..4529f585e 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -233,12 +233,12 @@ function show_usage() { --- jamrun program.jxe --app=X [ --valgrind ] ${body_2( - `--verb : use this flag to run the cside with valgrind for leak checking.` + `--valgrind : use this flag to run the cside with valgrind for leak checking.` )} --- jamrun program.jxe --app=X [ --local ] ${body_2( - `--verb : use this flag to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback.` + `--local : use this flag to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback.` )} --- jamrun program.jxe --app=X [ --remote=IPAddress ] [ --bg ] @@ -317,7 +317,7 @@ async function dojamout_p2(iport, folder, jappid, group = null) { if (!bg) { await dojamout_p2_fg(iport, folder, jappid, group); } else { - dojamout_p2_bg(iport, folder, jappid, group); + await dojamout_p2_bg(iport, folder, jappid, group); } } @@ -374,7 +374,7 @@ async function dojamout_p2_fg(pnum, floc, jappid, group = null) { } } -function dojamout_p2_bg(pnum, floc, jappid, group = null) { +async function dojamout_p2_bg(pnum, floc, jappid, group = null) { let argObject = { "--app": jappid, "--port": pnum, @@ -388,24 +388,16 @@ function dojamout_p2_bg(pnum, floc, jappid, group = null) { "--type": Type, }; let jargs = getJargs(argObject); - const logFile = fs.openSync(`${floc}/${pnum}/log.j`, "a"); + console.log(tmux) + await $`${TMUX} new-session -s ${tmux}-j -c ${floc} -d`; - const command = "node"; - const args = ["jstart.js", ...jargs]; - const options = { - cwd: floc, - stdio: ["ignore", logFile, logFile], - detached: true, - }; - - const p = spawn(command, args, options); - p.unref(); - - if (!NOVERBOSE) { - console.log("Started the J node in background"); + if (!log) { + await $`${TMUX} send-keys -t ${tmux}-j "node jstart.js ${jargs}" C-m`; + } else { + await $`${TMUX} send-keys -t ${tmux}-j "script -a -t 1 ${floc}/${pnum}/log.j node jstart.js ${jargs}" C-m`; } - //keep this log file + console.log("EXIT BG"); process.exit(0); } @@ -806,6 +798,11 @@ async function main() { } if (isDevice) await runDevice(iport, dport, group); else await runNoneDevice(iport); + if(bg){ + console.log("got here") + process.exit(0) + } + } const __filename = fileURLToPath(import.meta.url); diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs index 0d0673d2f..7b2817be5 100755 --- a/tools/jamterm.mjs +++ b/tools/jamterm.mjs @@ -5,7 +5,6 @@ import { Client } from 'ssh2'; import { getTermArgs } from "./parser.mjs"; import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; const { spawnSync } = require('child_process'); -const MAX_TMUX_NUM = 16; const MAIN_SESH_NAME = "main" const p = spawnSync('which', ['tmux']); const MYTMUX = p.stdout.toString().trim() @@ -26,17 +25,16 @@ function show_usage(){ [--app==${body_sec(`appName`)}] [--prog==${body_sec(`programName`)}] [--port==${body_sec(`portNum`)}] + [--pane]=${body_sec(`maxNumPane`)}] + ${header_1(`DESCRIPTION`)} - --- ${keyWord('jamterm')} by default displays all the running C node outputs in the different tmux windows and panes. + --- ${keyWord('jamterm')} by default displays all the running C node and J nodes outputs in the different panes. - ${keyWord('Tmux Format')}: - ${body_2(`1) Each running app will be displayed on a different Tmux window.`)} - ${body_2(`2) Each window will be splited to different panes in a grid format and each pane is showing a C node output.`)} ${keyWord('restrictions')}: - ${body_2(`1) If an app has more than 16 C nodes, jamterm will skip that app.`)} + ${body_2(`2) various factors like the size of screen, terminal and resolution effects the number of possible tmuxes to display.Maybe try a bigger screen `)} @@ -59,6 +57,9 @@ function show_usage(){ --- jamterm [--port=3] ${body_2(`Use this flag to display C nodes of programs running on a certain port.`)} + + --- jamterm [--pane=3] + NOTE: ${body_2(`1) --app & --prog & --port can be used all together or two by two to which programs to display. `)} @@ -190,20 +191,19 @@ async function getTmuxSessions(filteredData){ continue; } const tmuxSessions = (p.stdout.toString().trim().split("\n")).map((entry) => entry.split(":")[0]) - const tag = data.program+"_"+data.app+"_"+data.port; - if(tmuxSessions.length > MAX_TMUX_NUM){ - console.log("too many Tmuxm,this app will not be displayed") - continue; - } - tmux_sesh.set(tag, tmuxSessions) - + for(let tmuxSession of tmuxSessions){ + const tag = data.prog+"_"+data.app+"_"+data.port+"_"+tmuxSession; + tmux_sesh.set(tag, tmuxSession) + } } return tmux_sesh } -async function split(number,windowName) { - const targetSesh = `${MAIN_SESH_NAME}:${windowName}`; + +async function split(number) { + console.log(number) + const targetSesh = `${MAIN_SESH_NAME}`; let counter=1; let splitDir = "-v" let currPane=0 @@ -217,7 +217,7 @@ async function split(number,windowName) { - let p = await $`${MYTMUX} split-window ${splitDir} -t ${targetSesh}.${currPane}`.quiet() + await $`${MYTMUX} split-window ${splitDir} -t ${targetSesh}.${currPane}`.quiet() counter++; } @@ -283,25 +283,51 @@ async function creatMainSesh(){ await $`${MYTMUX} new-session -d -s ${MAIN_SESH_NAME}`; } -async function setUpTmux(sessionMap){ +async function setUpTmux(sessionMap, number){ + + await split(number) + await $`${MYTMUX} select-layout -t ${MAIN_SESH_NAME} tiled`; + let counter = 0 + + + for(let tag of sessionMap.keys()){ - await $`${MYTMUX} new-window -t ${MAIN_SESH_NAME} -n ${tag}`; - const tmuxIDs = sessionMap.get(tag); - const numPanes = tmuxIDs.length; - await split(numPanes,tag) - const result = await $`tmux list-panes -t ${MAIN_SESH_NAME}:${tag} -F '#P'`; - const panes = result.stdout.trim().split('\n'); - console.log('Available panes:', panes); - await $`${MYTMUX} select-layout -t ${MAIN_SESH_NAME}:${tag} tiled`; + if(counter === number){ + break; + } + + console.log("current pane Index:", counter) + await $`unset TMUX;${MYTMUX} select-pane -t ${MAIN_SESH_NAME}.${counter}`; + await $`${MYTMUX} select-pane -T ${tag}`; + counter++; + } + + + counter = 0; + for(let tag of sessionMap.keys()){ - const tmuxIDs = sessionMap.get(tag); - for(let index = 0; index sessionMap.size ? sessionMap.size : args.pane; await creatMainSesh(); - await setUpTmux(sessionMap); + await setUpTmux(sessionMap,MAX_TMUX_NUM ); await $`${MYTMUX} a -t ${MAIN_SESH_NAME}`; } diff --git a/tools/parser.mjs b/tools/parser.mjs index 79e16c530..50592a018 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -43,7 +43,6 @@ const jamrunOptionDefinitions = [ { name: "old", type: Boolean, defaultValue: false }, { name: "local", type: Boolean, defaultValue: false }, { name: "valgrind", type: Boolean, defaultValue: false }, - { name: "disable_stdout_redirect", type: Boolean, defaultValue: false }, { name: "port", type: Number, defaultValue: undefined }, { name: "remote", type: String, defaultValue: undefined }, //the IP ADDRESS YOU WANT TO CONNECT TO { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call @@ -80,6 +79,8 @@ const jamtermOptionDefinition = [ { name: "app", type: String, defaultValue: false }, { name: "prog", type: String, defaultValue: false }, { name: "port", type: String, defaultValue: false }, + { name: "pane", type: Number, defaultValue: 16 }, + { name: "separate", type: Boolean, defaultValue: false }, { name: "remote", type: Boolean, defaultValue: false }, //the IP ADDRESS YOU WANT TO CONNECT TO { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call ]; @@ -95,6 +96,23 @@ const jamclogOptionDefinition = [ { name: "remote", type: String, defaultValue: undefined }, ]; +const jamBatchOptionDefinition = [ + { name: "fog", type: String, defaultValue: undefined }, + { name: "cloud", type: String, defaultValue: undefined }, + { name: "device", type: String, defaultValue: undefined }, + { name: "dFile", type: String, defaultValue: undefined }, + { name: "cFile", type: String, defaultValue: undefined }, + { name: "fFile", type: String, defaultValue: undefined }, + { name: "num", type: String, defaultValue: undefined }, + { name: "cLoc", type: String, defaultValue: undefined}, + { name: "fLoc", type: String, defaultValue: undefined}, + { name: "dLoc", type: String, defaultValue: undefined}, + { name: "dEdge", type: String, defaultValue: undefined}, + { name: "cEdge", type: String, defaultValue: undefined}, + { name: "fEdge", type: String, defaultValue: undefined}, + +]; + function retrieveType(device, fog, cloud) { if (!fog && !device && !cloud) { return "device"; @@ -497,6 +515,8 @@ export function getRemoteArgs(argObject) { args.push(`--${argObject["Type"]}`); return args.join(" "); } + + export function getLogArgs(argv) { const args = argv.filter( (entry) => @@ -537,3 +557,106 @@ export function getLogArgs(argv) { remote: options.remote, }; } + + +function getJobs(names, files, locs, edges, type, cNums=null){ + const appNames = [] + const fileNames = [] + let Cnum = [] + let loc = [] + let edge = [] + const jobs = [] + + + for( let dev of names.split(",")){ + const Cnum = dev.split("-")[0]; + const appName = dev.split("-")[1]; + for(let num = 0 ; num + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jambatch.mjs") + ); + let options; + + try { + options = commandLineArgs(jamBatchOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + } + let deviceJobs = []; + let fogJobs = []; + let cloudJobs = []; + + if(!options.device && !options.fog && !options.cloud){ + throw new Error("TYPE IS NOT DEFINED") + } + if(options.device){ + deviceJobs = getJobs(options.device, options.dFile, options.dLoc, options.dEdge, "device" ,options.num); + } + if(options.fog){ + fogJobs = getJobs(options.fog, options.fFile,options.fLoc,options.fEdge,"fog"); + } + if(options.cloud){ + cloudJobs = getJobs(options.cloud, options.cFile,options.cLoc,options.cEdge,"cloud") + } + + return (deviceJobs.concat(fogJobs)).concat(cloudJobs); + + +} \ No newline at end of file From b8a0e31c5bfae142873fcaf6cc949f7b14e16760 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Thu, 29 Aug 2024 05:44:55 -0400 Subject: [PATCH 081/126] config jambatch added --- tools/batchConfig/config.json | 30 +++++++++++++++++++ tools/jambatch.mjs | 54 +++++++++++++++++++++++++++++++++-- tools/parser.mjs | 9 ++++-- 3 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 tools/batchConfig/config.json diff --git a/tools/batchConfig/config.json b/tools/batchConfig/config.json new file mode 100644 index 000000000..b8afdd401 --- /dev/null +++ b/tools/batchConfig/config.json @@ -0,0 +1,30 @@ +{ + "jobs": [ + { + "name":"XX", + "file":"jt2.jxe", + "type":"device", + "num":"2", + "loc":"300,400", + "edge":"1", + "verb": true + + }, + { + "name":"XXX", + "file":"jt2.jxe", + "type":"fog", + "loc":"100,100", + "edge":"1", + "verb": true + }, + { + "name":"X", + "file":"jt2.jxe", + "type":"cloud", + "loc":"300,400", + "edge":"1" + + } + ] + } \ No newline at end of file diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs index c06844bd3..a3803311f 100644 --- a/tools/jambatch.mjs +++ b/tools/jambatch.mjs @@ -1,6 +1,8 @@ #!/usr/bin/env zx import {getBatchArgs} from './parser.mjs' import { spawnSync } from 'child_process'; + + import { body_1, header_1, @@ -91,10 +93,58 @@ try { error.message === "SHOW USAGE" ? null : console.log(error); process.exit(1); } +if(args.config){ + + const jsonString = fs.readFileSync(args.config); + const jobs = JSON.parse(jsonString).jobs; + let spawnPipe = 'inherit' + console.log(args.verb) + if(!args.verb){ + spawnPipe = ['ignore', 'ignore', 'inherit'] + + } + for(let i = 0 ; i < jobs.length ; i++){ + if(!jobs[i].name){ + console.log(`job number ${i+1} is missing name, it will be skipped`) + continue; + } + if(!jobs[i].file){ + console.log(`job number ${i+1} is missing file name, it will be skipped`) + continue; + } + if(!jobs[i].type){ + console.log(`job type missing, it will be skipped`) + continue; + } + + const exec = `jamrun.mjs ${jobs[i].file} --app=${jobs[i].name} --bg --log --${jobs[i].type}` + console.log(jobs.verb) + if(jobs.num) + exec + ` --num=${jobs.num}` + if(jobs.loc) + exec + ` --num=${jobs.loc}` + if(jobs.edge) + exec + ` --num=${jobs.edge}` + if(jobs.verb) + exec + ` --verb` + + + if(args.verb){ + console.log(`${body_sec(`Starting job number: ${i+1} - ${exec}`)}`) + } + spawnSync('zx', [exec], { + stdio: spawnPipe, + shell: true + }); + } + process.exit(0) +} for(let arg of args){ - + if(args.verb){ + console.log(`${body_sec(`Starting new job number: jamrun.mjs ${arg}`)}`) + } spawnSync('zx', ['jamrun.mjs'].concat(arg), { - stdio: 'inherit', + stdio: spawnPipe, shell: true }); } diff --git a/tools/parser.mjs b/tools/parser.mjs index 50592a018..96064f540 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -110,6 +110,9 @@ const jamBatchOptionDefinition = [ { name: "dEdge", type: String, defaultValue: undefined}, { name: "cEdge", type: String, defaultValue: undefined}, { name: "fEdge", type: String, defaultValue: undefined}, + { name: "config", type: String, defaultValue: undefined}, + {name: "verb", type:Boolean, defaultValur: false} + ]; @@ -638,11 +641,13 @@ export function getBatchArgs(argv){ const error = new Error("SHOW USAGE"); error.type = "ShowUsage"; throw error; + }; + if(options.config){ + return {"config":options.config , "verb" : options.verb} } let deviceJobs = []; let fogJobs = []; let cloudJobs = []; - if(!options.device && !options.fog && !options.cloud){ throw new Error("TYPE IS NOT DEFINED") } @@ -656,7 +661,7 @@ export function getBatchArgs(argv){ cloudJobs = getJobs(options.cloud, options.cFile,options.cLoc,options.cEdge,"cloud") } - return (deviceJobs.concat(fogJobs)).concat(cloudJobs); + return ((deviceJobs.concat(fogJobs)).concat(cloudJobs)).concat([options.verb]); } \ No newline at end of file From e8746c195d982750261f088367645717ad072c2b Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 30 Aug 2024 00:51:11 -0700 Subject: [PATCH 082/126] logging improved. minor bug fix --- tools/chalk.mjs | 3 ++ tools/cleanUp.mjs | 11 +++++- tools/fileDirectory.mjs | 4 -- tools/jambatch.mjs | 7 +++- tools/jamkill.mjs | 43 +++++++++++++------- tools/jamrun.mjs | 88 +++++++++++++++++++++++++++-------------- tools/jamterm.mjs | 13 +++--- tools/parser.mjs | 3 +- 8 files changed, 115 insertions(+), 57 deletions(-) diff --git a/tools/chalk.mjs b/tools/chalk.mjs index 84cc22b3a..a59403032 100644 --- a/tools/chalk.mjs +++ b/tools/chalk.mjs @@ -14,6 +14,9 @@ export function body_1(txt){ export function body_sec(txt){ return chalk.dim.italic(txt) } +export function body_sec_warning(txt){ + return chalk.dim.yellow.italic(txt) +} export function body_2(txt){ return chalk.dim(txt) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 2bd699e33..3c0915079 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -95,13 +95,18 @@ function cleanPort(removablePort,app,programName){ } function ArchiveLog(removablePort, appName, programName){ + const [jamfolder,appfolder,folder] = getPaths(programName,appName) + + + + if(fs.existsSync(`${folder}/${removablePort}`)){ - if(fs.existsSync(`${folder}/${removablePort}`)){ process.chdir(`${folder}/${removablePort}`); const logs = fs.readdirSync('.').filter( (entry) => entry.includes("log")) if(!logs || logs.length === 0 ){ + process.chdir(`..`); return } if(!fs.existsSync(`${folder}/log/${removablePort}`,{recursive: true})){ @@ -122,13 +127,17 @@ function ArchiveLog(removablePort, appName, programName){ } } + process.chdir(`..`); + + } } function cleanAppDir(removablePort,appName, programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName) if(fs.existsSync(`${folder}/${removablePort}`)){ + try { fs.rmSync(`${folder}/${removablePort}`, { recursive: true, force: true }); } catch (error) { diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index c79f72729..078c1aa42 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -132,12 +132,8 @@ export function fileDirectoryMqtt(folder, iport,jamfolder,app){ fs.appendFileSync(`${folder}/${iport}/mqtt.conf`, `listener ${iport}\n`); const dirName = folder.split("/").pop() if(fs.existsSync(`${jamfolder}/ports/${iport}`)){ - console.log("exists") const dirNames = fs.readFileSync(`${jamfolder}/ports/${iport}`).toString().trim().split("\n") if(!dirNames.includes(dirName)){ - console.log("append") - console.log("dirName",dirName ) - console.log("filePath",`${jamfolder}/ports/${iport}`) fs.appendFileSync(`${jamfolder}/ports/${iport}`, `\n${dirName}\n`) } diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs index a3803311f..ca26112b6 100644 --- a/tools/jambatch.mjs +++ b/tools/jambatch.mjs @@ -118,7 +118,6 @@ if(args.config){ } const exec = `jamrun.mjs ${jobs[i].file} --app=${jobs[i].name} --bg --log --${jobs[i].type}` - console.log(jobs.verb) if(jobs.num) exec + ` --num=${jobs.num}` if(jobs.loc) @@ -132,6 +131,10 @@ if(args.config){ if(args.verb){ console.log(`${body_sec(`Starting job number: ${i+1} - ${exec}`)}`) } + if(args.verb){ + console.log(`${body_sec(`Starting new job: ${exec}}`)}`) + } + spawnSync('zx', [exec], { stdio: spawnPipe, shell: true @@ -141,7 +144,7 @@ if(args.config){ } for(let arg of args){ if(args.verb){ - console.log(`${body_sec(`Starting new job number: jamrun.mjs ${arg}`)}`) + console.log(`${body_sec(`Starting new job: jamrun.mjs ${arg}`)}`) } spawnSync('zx', ['jamrun.mjs'].concat(arg), { stdio: spawnPipe, diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index 702e1a26d..b865f3210 100755 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -4,7 +4,7 @@ import { getAppFolder, getJamFolder } from "./fileDirectory.mjs"; import {getKilltArgs} from "./parser.mjs" import { cleanByPortNumber} from "./cleanUp.mjs"; import { Client } from 'ssh2'; -import { header_1,header_2 , body_1, body_sec, keyWord, body_2,body_2_bold } from "./chalk.mjs"; +import { header_1,header_2 , body_2_line , body_1, body_sec, keyWord, body_2,body_2_bold, body_sec_warning } from "./chalk.mjs"; let currIP; if (os.platform() === "win32") { @@ -221,8 +221,7 @@ async function killProcess(data){ function filter(data, filters){ - console.log("filter", filters) - console.log("data", data) + const filteredInfo =[]; for(let info of data){ let isPassing = true @@ -243,11 +242,15 @@ async function jamKill(args) { let root = args.root let jamData = killDataForAll(root) - console.log(jamData, "this is my jam data") let toKill; if(args.all){ toKill = jamData + + if(toKill.length != 0 && args.verb){ + console.log(`${body_sec_warning(`Warning: no filter specified `)}`) + } } + else{ let Filter ={} if(args.prog){ @@ -259,30 +262,40 @@ async function jamKill(args) if(args.port){ Filter["portNumber"] = args.port } - - toKill = filter(jamData,Filter ) + + toKill = filter(jamData,Filter) + if(args.verb){ + console.log(`${body_sec(`Filter: ${args.prog ? ` programName -- ${body_2_line(`${args.prog}.jxe`)}`: ""}${args.app ? ` appName -- ${body_2_line(args.app)}`: ""}${args.port ? ` port -- ${body_2_line(args.port)}` : ""}`)}`) + + } + } - console.log(toKill, "this is my to kill") - if(toKill.length === 0 ){ - if(args.all){ - console.log("no running app on local") + if(toKill.length === 0 && args.verb){ + if(args.all ){ + console.log(`${body_sec_warning(`Warning: no active local job available.`)}`) } else{ - console.log("no such running app on local") - } - + console.log(`${body_sec_warning(`Warning: no active local job available${args.port ? ` on port -- ${body_2_line(args.port)}` : ""}${args.prog ? ` with programName -- ${body_2_line(`${args.prog}.jxe`)}`: ""}${args.app ? ` and with appName -- ${body_2_line(args.app)}`: ""} `)}`) + } } for(let data of toKill){ + const appName = data.appName; const programName = data.programName const portNumber = data.portNumber + await killProcess(data); + if(args.verb){ + console.log(`${body_sec(`${body_2_line(appName)} executing ${body_2_line(programName)} on port ${body_2_line(portNumber)} successfully terminated.`)}`) + } cleanByPortNumber(programName,appName,portNumber) } - //keep this LOG - console.log("Jobs terminated."); + if(root){ + console.log("Jobs terminated."); + } + } async function jamKillBruteForce(){ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 4529f585e..0e7ada3eb 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -15,7 +15,7 @@ import { getJamFolder, getFileNoext, } from "./fileDirectory.mjs"; -const { spawn, spawnSync } = require("child_process"); +const { spawn } = require("child_process"); import { Client } from "ssh2"; import { body_1, @@ -26,7 +26,7 @@ import { bodyBold, body_2, body_2_bold, - body_2_line, + body_sec_warning, } from "./chalk.mjs"; let app, @@ -270,9 +270,9 @@ async function startmqtt(port, cFile) { await $`${MOSQUITTO_PUB} -p ${port} -t "test" -m "hello"`.quiet(); } catch (error) { if (!NOVERBOSE) { - console.log( - `MQTT is not running at ${port}\nAttempting to start MQTT at ${port}` - ); + console.log(`${body_sec( + `MQTT is not running at ${port}... Attempting to start MQTT at ${port}` + )}`); } const command = MOSQUITTO; const args = ["-c", cFile]; @@ -281,7 +281,11 @@ async function startmqtt(port, cFile) { detached: true, }; const mqttProcesse = spawn(command, args, options); - + if (!NOVERBOSE) { + console.log(`${body_sec( + `MQTT succesfully running on port ${port}` + )}`); + } fs.writeFileSync(`${jamfolder}/mqttpid/${port}`, `${mqttProcesse.pid}`); mqttProcesse.unref(); @@ -337,10 +341,16 @@ async function dojamout_p2_fg(pnum, floc, jappid, group = null) { }; let jargs = getJargs(argObject); + if (!NOVERBOSE) { + console.log(`${ body_sec( + `J Node arg:\n${jargs}` + )}`); + } const command = "node"; const args = ["jstart.js", ...jargs]; if (log) { + const options = { cwd: floc, stdio: ["pipe", "pipe", "pipe"], @@ -363,6 +373,7 @@ async function dojamout_p2_fg(pnum, floc, jappid, group = null) { process.kill(process.pid, "SIGTERM"); }); } else { + const options = { cwd: floc, stdio: "inherit", @@ -388,17 +399,27 @@ async function dojamout_p2_bg(pnum, floc, jappid, group = null) { "--type": Type, }; let jargs = getJargs(argObject); - const logFile = fs.openSync(`${floc}/${pnum}/log.j`, "a"); - console.log(tmux) + if (!NOVERBOSE) { + console.log(`${ body_sec( + `J Node arg:\n${jargs}` + )}`); + } await $`${TMUX} new-session -s ${tmux}-j -c ${floc} -d`; if (!log) { + await $`${TMUX} send-keys -t ${tmux}-j "node jstart.js ${jargs}" C-m`; } else { + await $`${TMUX} send-keys -t ${tmux}-j "script -a -t 1 ${floc}/${pnum}/log.j node jstart.js ${jargs}" C-m`; } - console.log("EXIT BG"); + if (root) { + body_sec( + `EXIT BG"` + ); + } + process.exit(0); } @@ -418,7 +439,11 @@ async function doaout(num, port, group, datap, myf, jappid) { "-o": datap, }; let cargs = getCargs(argObject); - + if (!NOVERBOSE) { + console.log(`${body_sec( + `C node args:\n${cargs}` + )}`); + } await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; if (!log) { if (valgrind) @@ -428,7 +453,6 @@ async function doaout(num, port, group, datap, myf, jappid) { } else { if (valgrind) await $`${TMUX} send-keys -t ${tmux}-${counter} ${valgrind} ./a.out ${cargs} -f log C-m`; - //TMUX DOES NOT WORK FOR DOCKER CONTAINER(SCRIPT IS THE ISSUE) else await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; } @@ -436,7 +460,7 @@ async function doaout(num, port, group, datap, myf, jappid) { tmuxIds.push(`${tmux}-${counter}`); counter++; } - if (!NOVERBOSE) console.log("Started a C node"); + } async function portavailable(folder, port) { @@ -495,13 +519,13 @@ async function waitforredis(port) { } } catch (error) {} if (!NOVERBOSE) { - console.log("Trying to find Redis server..."); + console.log(`${body_sec("Trying to find Redis server...")}`); } await sleep(1000); } if (!NOVERBOSE) { - console.log(`Redis running at port: ${port}`); + console.log(`${body_sec(`Redis running at port: ${port}`)}`); } } @@ -509,10 +533,6 @@ async function setupredis(port) { await $`cat ${REDISFUNCS} | redis-cli -p ${port} -x FUNCTION LOAD REPLACE > /dev/null`; await $`echo "set protected-mode no" | redis-cli -p ${port} > /dev/null`; await $`echo 'config set save "" protected-mode no' | redis-cli -p ${port} > /dev/null`; - //IMPORTANT: flushing redis - //USE FLUSH DB TO ONLY FLUSH THE CURRENT DB FOR THE APP - //DB NUMBER - //FOR NOW KEEP AS IT IS await $`redis-cli -p ${port} FLUSHALL`; } @@ -550,7 +570,7 @@ async function unpack(file, folder) { if (ntime > ontime) { try { if (!NOVERBOSE) - console.log("outdated, unzippping again"); + console.log(`${body_sec_warning(`warning: outdated, unzippping again`)}`); await $`cd ${folder} && unzip -oq ${file}`.quiet(); } catch (error) { throw new Error( @@ -569,7 +589,7 @@ async function unpack(file, folder) { } } else { if (!NOVERBOSE) { - console.log("WARNING: Unziped files might be outdated"); + console.log(`${body_sec_warning("WARNING: Unziped files might be outdated")}`); } isValidExecutable(); } @@ -636,9 +656,14 @@ async function main() { let ifile; let jdata; let client; + if(!NOVERBOSE){ + if(remote) + console.log(`${body_sec(`remote job on: ${remote}`)}`) + else{ + console.log(`${body_sec(`local job`)}`) + } - console.log("Remote ..", remote); - + } if (remote) { const config = { host: remote, @@ -657,12 +682,12 @@ async function main() { client.on("error", (error) => { reject(error); }); - - console.log("Initiating connection to ....", config); + if(!NOVERBOSE){ + console.log("Initiating connection to ....", config); + } client.connect(config); }); const remoteArgs = getRemoteArgs(jamrunParsArg(process.argv)); - // const pathExport ="export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin" const changeDir = "cd JAMScript/tools"; let currIP; if (os.platform() === "win32") { @@ -684,9 +709,9 @@ async function main() { client, `${changeDir} && jamrun.mjs ${remoteArgs} --root=${currIP}` ); - - console.log("IP ", currIP, " port ", myPort); - + if(!NOVERBOSE){ + console.log("IP ", currIP, " port ", myPort); + } const jamfolder = getJamFolder(); const fileNoext = getFileNoext(file); if (!fs.existsSync(`${jamfolder}/remote`)) { @@ -734,6 +759,9 @@ async function main() { process.chdir(folder); await unpack(ifile, folder); isValidExecutable(); + if(!NOVERBOSE){ + console.log(`${body_sec("JXE FILE SUCCESSFULLY UNZIPED")}`) + } jdata = await getjdata(folder); let isDevice; @@ -767,6 +795,7 @@ async function main() { iport++; } removablePort = iport; + break; case "device": @@ -783,6 +812,7 @@ async function main() { iport++; } removablePort = iport; + if (!local) { group = iport - 1882; } else group = 0; @@ -790,6 +820,7 @@ async function main() { if (jdata.toLowerCase() === "true") { dport = iport + 20000; + await resolvedata(`127.0.0.1:${dport}`); } @@ -799,7 +830,6 @@ async function main() { if (isDevice) await runDevice(iport, dport, group); else await runNoneDevice(iport); if(bg){ - console.log("got here") process.exit(0) } diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs index 7b2817be5..eae9e7074 100755 --- a/tools/jamterm.mjs +++ b/tools/jamterm.mjs @@ -180,6 +180,7 @@ function filter(data, filters){ } async function getTmuxSessions(filteredData){ const tmux_sesh = new Map() + for(let data of filteredData){ if(!fs.existsSync(`${data.path}/tmuxid`)){ continue; @@ -191,10 +192,11 @@ async function getTmuxSessions(filteredData){ continue; } const tmuxSessions = (p.stdout.toString().trim().split("\n")).map((entry) => entry.split(":")[0]) - + let counter = 1; for(let tmuxSession of tmuxSessions){ - const tag = data.prog+"_"+data.app+"_"+data.port+"_"+tmuxSession; + const tag = data.prog+"_"+data.app+"_"+data.port+"_"+(tmuxSession.includes("j") ? "J" : `C.${counter}`); tmux_sesh.set(tag, tmuxSession) + counter++ } } return tmux_sesh @@ -202,7 +204,7 @@ async function getTmuxSessions(filteredData){ async function split(number) { - console.log(number) + const targetSesh = `${MAIN_SESH_NAME}`; let counter=1; let splitDir = "-v" @@ -296,8 +298,9 @@ async function setUpTmux(sessionMap, number){ break; } - console.log("current pane Index:", counter) + await $`unset TMUX;${MYTMUX} select-pane -t ${MAIN_SESH_NAME}.${counter}`; + await $`${MYTMUX} select-pane -T ${tag}`; counter++; @@ -311,7 +314,7 @@ async function setUpTmux(sessionMap, number){ const tmuxID = sessionMap.get(tag) const myTag = `${tag}` - console.log(myTag) + await $`${MYTMUX} select-pane -t ${tmuxID}:0 -T ${myTag}`; counter++; diff --git a/tools/parser.mjs b/tools/parser.mjs index 96064f540..d00516499 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -69,6 +69,7 @@ const jamkillOptionDefinition = [ { name: "app", type: String, defaultValue: false }, { name: "prog", type: String, defaultValue: false }, { name: "port", type: String, defaultValue: false }, + { name: "verb", type: Boolean, defaultValue: false}, { name: "remote", type: Boolean, defaultValue: false }, //the IP ADDRESS YOU WANT TO CONNECT TO { name: "root", type: String, defaultValue: undefined }, //THE IP ADRRESS OF THE MACHINE making the remote call ]; @@ -367,7 +368,7 @@ export function getKilltArgs(argv) { } }) .join(""); - console.log(newOption); + options["app"] = newOption; } else { throw new Error("app argument missing '=' "); From ee64601a7fcebb95aeb60a16aea1e85a5bc23274 Mon Sep 17 00:00:00 2001 From: Mahesh Maheswaran Date: Fri, 30 Aug 2024 06:26:25 -0400 Subject: [PATCH 083/126] made jambatch.mjs exec --- tools/jambatch.mjs | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/jambatch.mjs diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs old mode 100644 new mode 100755 From 79504d12937001d9703226b2fcff2d32120920cf Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 30 Aug 2024 16:09:57 -0700 Subject: [PATCH 084/126] fixed jambatch --- tools/cleanUp.mjs | 6 +++++- tools/jambatch.mjs | 25 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 3c0915079..08f9d8e76 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -3,6 +3,10 @@ import {getJamFolder,getAppFolder, getPaths} from './fileDirectory.mjs' const { spawnSync } = require('child_process'); const p = spawnSync('which', ['tmux']); +import { + body_sec_warning, +} from "./chalk.mjs"; + const TMUX = p.stdout.toString().trim() function getTmuxIds(PortNumber,appName , programName){ @@ -71,7 +75,7 @@ function killMosquitto(removablePort){ spawnSync('kill', ['-9' ,pid]); } else{ - console.log("corrupted file directory ,pid can't be found ") + console.log(body_sec_warning(`corrupted file directory,${removablePort} does not exist.`)) } diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs index ca26112b6..690e8c182 100644 --- a/tools/jambatch.mjs +++ b/tools/jambatch.mjs @@ -9,6 +9,7 @@ import { header_2, body_sec, body_2, + body_sec_warning, body_2_bold, } from "./chalk.mjs"; let args; @@ -93,27 +94,33 @@ try { error.message === "SHOW USAGE" ? null : console.log(error); process.exit(1); } +let spawnPipe = 'inherit' if(args.config){ const jsonString = fs.readFileSync(args.config); const jobs = JSON.parse(jsonString).jobs; - let spawnPipe = 'inherit' - console.log(args.verb) + if(!args.verb){ spawnPipe = ['ignore', 'ignore', 'inherit'] } for(let i = 0 ; i < jobs.length ; i++){ if(!jobs[i].name){ - console.log(`job number ${i+1} is missing name, it will be skipped`) + if(args.verb){ + console.log(body_sec_warning(`Warning: job number ${i+1} is missing name, it will be skipped`)) + } continue; } if(!jobs[i].file){ - console.log(`job number ${i+1} is missing file name, it will be skipped`) + if(args.verb){ + console.log(body_sec_warning(`Warning: job number ${i+1} is missing file name, it will be skipped`)) + } continue; } if(!jobs[i].type){ - console.log(`job type missing, it will be skipped`) + if(args.verb){ + console.log(body_sec_warning(`Warning: job type missing, it will be skipped`)) + } continue; } @@ -131,9 +138,6 @@ if(args.config){ if(args.verb){ console.log(`${body_sec(`Starting job number: ${i+1} - ${exec}`)}`) } - if(args.verb){ - console.log(`${body_sec(`Starting new job: ${exec}}`)}`) - } spawnSync('zx', [exec], { stdio: spawnPipe, @@ -142,8 +146,11 @@ if(args.config){ } process.exit(0) } + +const verb = args.pop() + for(let arg of args){ - if(args.verb){ + if(verb){ console.log(`${body_sec(`Starting new job: jamrun.mjs ${arg}`)}`) } spawnSync('zx', ['jamrun.mjs'].concat(arg), { From 237a513e6158be706f887ac539df7a7039a547ff Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 30 Aug 2024 16:25:21 -0700 Subject: [PATCH 085/126] CleanUp --- tools/jamclean.mjs | 1 - tools/parser.mjs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index e76acd8ca..c2469de39 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -206,7 +206,6 @@ function cleanPorts(AppToRemove){ } else{ - console.log(`${newApps.join("\n")}\n`) fs.writeFileSync(`${jamFolder}/ports/${port}`, `${newApps.join("\n")}`) } diff --git a/tools/parser.mjs b/tools/parser.mjs index d00516499..5d08a4592 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -306,7 +306,7 @@ export function getJamListArgs(argv) { } filters["machType"] = deviceType; } else { - console.log(options[key], key, options); + if ( key === "prog" || key === "app" || @@ -445,7 +445,7 @@ export function getTermArgs(argv) { } }) .join(""); - console.log(newOption); + options["app"] = newOption; } else { throw new Error("app argument missing '=' "); @@ -487,7 +487,7 @@ export function getTermArgs(argv) { throw new Error("port argument missing '=' "); } } - console.log(options); + return options; } From ec4d62d8e5c153b6ea250984017915c3fc5e1936 Mon Sep 17 00:00:00 2001 From: Shahin Jowkardris Date: Fri, 13 Sep 2024 02:59:28 -0400 Subject: [PATCH 086/126] tmux fix and added on fly modification for workers --- tools/cleanUp.mjs | 8 +- tools/fileDirectory.mjs | 2 +- tools/jamclean.mjs | 10 +- tools/jamkill.mjs | 2 + tools/jamrun.mjs | 16 +- tools/jamworker.mjs | 351 ++++++++++++++++++++++++++++++++++++++++ tools/parser.mjs | 46 +++++- 7 files changed, 419 insertions(+), 16 deletions(-) create mode 100644 tools/jamworker.mjs diff --git a/tools/cleanUp.mjs b/tools/cleanUp.mjs index 08f9d8e76..267bffa5b 100644 --- a/tools/cleanUp.mjs +++ b/tools/cleanUp.mjs @@ -2,17 +2,16 @@ import {getJamFolder,getAppFolder, getPaths} from './fileDirectory.mjs' const { spawnSync } = require('child_process'); -const p = spawnSync('which', ['tmux']); +const p2 = spawnSync('which', ['tmux']); import { body_sec_warning, } from "./chalk.mjs"; -const TMUX = p.stdout.toString().trim() +const TMUX = p2.stdout.toString().trim() function getTmuxIds(PortNumber,appName , programName){ const [jamfolder,appfolder,folder] = getPaths(programName,appName); if(fs.existsSync(`${folder}/${PortNumber}/tmuxid`)){ - const tmuxID = fs.readFileSync(`${folder}/${PortNumber}/tmuxid`).toString().trim(); const p = spawnSync(TMUX, ['ls', '-F', '#S']); const runningTMUXS = p.stdout.toString().trim().split("\n"); @@ -30,6 +29,7 @@ function killtmux(PortNumber,appName , programName){ for(let id of tmuxIds){ spawnSync(TMUX, ['kill-session', '-t', id]); } + return tmuxIds } @@ -180,3 +180,5 @@ export function cleanByPortNumber(programName, appName, PortNumber, NOVERBOSE=tr } }; + +cleanByPortNumber("jt2", "shahin23",1885 ) diff --git a/tools/fileDirectory.mjs b/tools/fileDirectory.mjs index 078c1aa42..aaccc96f5 100644 --- a/tools/fileDirectory.mjs +++ b/tools/fileDirectory.mjs @@ -37,7 +37,7 @@ export function getPaths(file,app){ const jamfolder=`${HOME}/.jamruns` const appfolder=`${jamfolder}/apps`; - const filenoext = path.basename(file, path.extname(file)); + const filenoext = path.basename(file, path.extname(file)); const folder=`${appfolder}/${filenoext}_${app}` return [jamfolder,appfolder,folder] diff --git a/tools/jamclean.mjs b/tools/jamclean.mjs index c2469de39..06d80dc6b 100755 --- a/tools/jamclean.mjs +++ b/tools/jamclean.mjs @@ -8,7 +8,8 @@ import { fileURLToPath } from 'url'; import { Client } from 'ssh2'; - +const p1 = spawnSync('which', ['tmux']); +const TMUX = p1.stdout.toString().trim() const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename); const jamcKillPath = resolve(__dirname, 'jamkill.mjs'); @@ -169,21 +170,24 @@ async function getRunningCfiles(Dir,port){ if(await isCfileRunning(appDir,portNum,cfileNum)){ runningCfiles.push(`${cfileNum}`) } + } return runningCfiles; } function cleanCfiles(portDir, currCfile){ const oldCdevs = (fs.readdirSync(portDir)).filter((entry) => entry.includes("cdev")) + const genericTag = fs.readFileSync(`${portDir}/tmuxid`).toString().trim() if( (oldCdevs.length)*2 === currCfile.length){ return; } for(let oldCdev of oldCdevs){ const cNum = oldCdev.split(".")[1]; if(!currCfile.includes(cNum)){ + const id = genericTag+`-${cNum}` try{ fs.unlinkSync(`${portDir}/${oldCdev}`); - + spawnSync(TMUX, ['kill-session', '-t', id]); } catch(error){ @@ -251,7 +255,7 @@ async function clean(){ } } //It's running and files are uptodate, update Cnum and clean cdevs - if( (await isJfileRunning(dir,port)) && (await isDevice(dir,port))){ + if((await isJfileRunning(dir,port)) && (await isDevice(dir,port))){ const Cfiles = await getRunningCfiles(dir,port); const numCnodes = Cfiles.length if(!fs.existsSync(`${appFolder}/${dir}/${port}/numCnodes`)){ diff --git a/tools/jamkill.mjs b/tools/jamkill.mjs index b865f3210..2323f1bc6 100755 --- a/tools/jamkill.mjs +++ b/tools/jamkill.mjs @@ -202,6 +202,8 @@ async function killJFile(data){ const appfolder = getAppFolder() try{ const pid = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/processId`).toString().trim(); + const tmuxID = fs.readFileSync(`${appfolder}/${dirName}/${portNumber}/tmuxid`).toString().trim(); + spawnSync(TMUX, ['kill-session', '-t', `${tmuxID}-j`]); const p = await $`ps -p ${pid} | grep node | wc -l | tr -d '[:space:]'` const exists = Number(p.stdout.toString().trim()); if(exists){ diff --git a/tools/jamrun.mjs b/tools/jamrun.mjs index 0e7ada3eb..c45920875 100755 --- a/tools/jamrun.mjs +++ b/tools/jamrun.mjs @@ -49,7 +49,6 @@ let app, port, remote, root; -const tmuxIds = []; let removablePort; process.on("SIGINT", () => { @@ -299,7 +298,7 @@ async function dojamout(iport, folder, jappid) { } //tested.working -async function dojamout_p1(pnum, floc) { +async function dojamout_p1(pnum, floc, group=null) { await startmqtt(pnum, `${floc}/${pnum}/mqtt.conf`, data); if (data) { fs.writeFileSync(`${floc}/${pnum}/dataStore`, `${data}\n`); @@ -308,6 +307,11 @@ async function dojamout_p1(pnum, floc) { fs.writeFileSync(`${floc}/${pnum}/shellpid`, SHELLPID.toString() + "\n"); fs.writeFileSync(`${floc}/${pnum}/processId`, "new" + "\n"); fs.writeFileSync(`${floc}/${pnum}/startStamp`, `${Date.now()}` + "\n"); + if(group){ + fs.writeFileSync(`${floc}/${pnum}/group`, `${group}` + "\n"); + } + + if (Type === "device") { fs.writeFileSync(`${floc}/${pnum}/numCnodes`, `${num}`); @@ -423,7 +427,7 @@ async function dojamout_p2_bg(pnum, floc, jappid, group = null) { process.exit(0); } -async function doaout(num, port, group, datap, myf, jappid) { + export async function doaout(num, port, group, datap, myf, jappid) { let counter = 1; if (fs.existsSync("a.out")) { await $`cd ${myf} && chmod +x a.out`; @@ -441,7 +445,7 @@ async function doaout(num, port, group, datap, myf, jappid) { let cargs = getCargs(argObject); if (!NOVERBOSE) { console.log(`${body_sec( - `C node args:\n${cargs}` + `C node args: ${cargs}` )}`); } await $`${TMUX} new-session -s ${tmux}-${counter} -c ${myf} -d`; @@ -457,7 +461,6 @@ async function doaout(num, port, group, datap, myf, jappid) { await $`${TMUX} send-keys -t ${tmux}-${counter} "script -a -t 1 ${myf}/${port}/log.${counter} ./a.out" ${cargs} C-m`; } } - tmuxIds.push(`${tmux}-${counter}`); counter++; } @@ -614,7 +617,7 @@ async function runDevice(iport, dport, group) { const [jamfolder, appfolder, folder] = getPaths(file, app); fileDirectoryMqtt(folder, iport, jamfolder, app); const jappid = getappid(jamfolder, `${folder}/${iport}`, app, appfolder); - await dojamout_p1(iport, folder); + await dojamout_p1(iport, folder,group); setuptmux(`${folder}/${iport}`, appfolder); await doaout(num, iport, group, dport, folder, jappid); await dojamout_p2(iport, folder, jappid, group); @@ -816,6 +819,7 @@ async function main() { if (!local) { group = iport - 1882; } else group = 0; + } if (jdata.toLowerCase() === "true") { diff --git a/tools/jamworker.mjs b/tools/jamworker.mjs new file mode 100644 index 000000000..42cfd88d6 --- /dev/null +++ b/tools/jamworker.mjs @@ -0,0 +1,351 @@ +#!/usr/bin/env zx +import { jamrunParsArg, getWorkerArgs } from "./parser.mjs"; +import { fileURLToPath } from "url"; +import { cleanByPortNumber } from "./cleanUp.mjs"; +import { dirname, resolve } from "path"; +import { getCargs } from "./parser.mjs"; + +import { + fileDirectorySetUp, + isValidExecutable, + fileDirectoryMqtt, + getPaths, + getAppFolder, + getappid, + getFolder, + cleanExecutables, + getJamFolder, + getFileNoext, +} from "./fileDirectory.mjs"; +const { spawn } = require("child_process"); +import { Client } from "ssh2"; +import { + body_1, + header_1, + header_2, + body_sec, + keyWord, + bodyBold, + body_2, + body_2_bold, + body_sec_warning, +} from "./chalk.mjs"; + + +const { spawnSync } = require('child_process'); +const p = spawnSync('which', ['tmux']); +const TMUX = p.stdout.toString().trim() + +function show_usage(){ + const usageMessage = + ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`jamWorker`)}${body_1(` -- a tool to modify workers on the fly.`)} + + ${header_1(`SYNOPSIS`)} + + Usage: jamWorker + [--help] + [--remove=${body_sec(`tmuxTagToRemove`)}] + [--add=${body_sec(`numWorkerToAdd`)}] + [--removeBatch=${body_sec(`numWorkerToRemove`)}] + [--app=${body_sec(`appName`)}] + [--prog=${body_sec(`programName`)}] + [--port=${body_sec(`portNum`)}] + [--verb] + [--log] + + ${header_1(`DESCRIPTION`)} + + --- ${keyWord('jamWorker')} needs to have at least one of --add, --remove, --removeBatch. + + --- jamWorker --add=3 --app=X --prog=jt2 --port=1883 [--verb] [--log] + ${body_2(`The command above adds three workers to the running app with the given criteria.`)} + ${body_2_bold(`NOTE: + Using --add without any of --app, --prog, --port will cause a graceful termination with no modification to workers.`)} + + --- jamWorker --remove=tg-34583-2 [--verb] + ${body_2(`The command above removes the worker running on tmux with such tmuxID if it exists.`)} + + --- jamWorker --removeBatch=4 [--verb] + ${body_2(`The command above removes the last 4 added workers. If there are fewer than 4 workers running, they will all be removed.`)} + ${body_2_bold(`NOTE: + Using --removeBatch without any of --app, --prog, --port will cause a graceful termination with no modification to workers.`)} + + `; + + console.log(usageMessage) +} + +function isFileActive(args){ + const port = args.port; + const app = args.app; + const prog = args. prog; + const appFolder = getJamFolder(); + if(fs.existsSync(`${appFolder}/ports/${port}`)){ + const activeApps = fs.readFileSync(`${appFolder}/ports/${port}`).toString().trim().split('\n') + if(activeApps.includes(`${prog}_${app}`)){ + return true; + } + else{ + return false; + } + + + } + else{ + return false + } +} + + +function isFileDirectoryCorrupted(args){ + const appFolder = getFolder(args.prog , args.app); + if(!fs.existsSync(`${appFolder}/${port}`)){ + return true + } + return false + +} + +function isDevice(args){ + const appFolder = getFolder(args.prog , args.app) + const type = fs.readFileSync(`${appFolder}/${args.port}/machType`).toString().trim() + if(type === "device"){ + return true + } + else{ + return false + } +} + +// function getTmuxIds(portNum, appName , programName){ +// const [jamfolder,appfolder,folder] = getPaths(programName,appName); +// if(fs.existsSync(`${folder}/${portNum}/tmuxid`)){ +// const tmuxID = fs.readFileSync(`${folder}/${portNum}/tmuxid`).toString().trim(); +// const p = spawnSync(TMUX, ['ls', '-F', '#S']); +// const runningTMUXS = p.stdout.toString().trim().split("\n"); +// const currTmuxids = runningTMUXS.filter((entry) => entry.includes(tmuxID)); +// return currTmuxids; + +// } +// else{ +// console.log(`${body_sec_warning(`appName: ${appName}, programName: ${programName} on port ${portNum} has no tmux`)}`) +// } +// } + +async function getRunningTmux(args){ + const app = args.app; + const prog = args.prog; + const port = args.port; + const [jamfolder, appfolder, folder] = getPaths(prog,app); + if(fs.existsSync(`${folder}/${port}/tmuxid`)){ + const tmuxID = fs.readFileSync(`${folder}/${port}/tmuxid`).toString().trim(); + const process = await $`${TMUX} ls | grep ${tmuxID}` + const activeCfiles = ((process.stdout.toString().trim().split('\n'))).map((entry) => (entry.split(":")[0])).filter((entry) => !entry.includes(`${tmuxID}-j`)) + return activeCfiles; + } + else{ + if(args.verb){ + console.log(`${body_sec_warning(`appName: ${app}, programName: ${prog} on port ${port} has no tmux tag`)}`) + } + } + +} + +function getGenericTag(args){ + const appFolder = getFolder(args.prog, args.app); + if(fs.existsSync(`${appFolder}/${args.port}/tmuxid`)){ + return fs.readFileSync(`${appFolder}/${args.port}/tmuxid`).toString().trim(); + } + else{ + if(args.verb){ + console.log(`${body_sec_warning(`appName: ${args.app}, programName: ${args.prog} on port ${args.port} has no tmux tag`)}`) + console.log(`${body_sec_warning(`script is terminating. No worker modification applied.`)}`) + + } + process.exit(0) + } +} + +function getLastTagNum(args){ + const appFolder = getFolder(args.prog, args.app); + if(fs.existsSync(`${appFolder}/${args.port}`)){ + const cfilesNum = (((fs.readdirSync(`${appFolder}/${args.port}`)).filter((entry) => entry.includes("cdevProcessId"))).map((entry) => entry.split(".")[1])) + if(cfilesNum.length === 0 ){ + return 0; + } + return Math.max(...cfilesNum); + } + else{ + if(args.verb){ + console.log(`${body_sec_warning(`no cfile is running for appName: ${args.app}, programName: ${args.prog} on port ${args.port}`)}`) + console.log(`${body_sec_warning(`script is terminating. No worker modification applied.`)}`) + } + process.exit(0) + + } +} +function getLastTag(args){ + const genericTag = getGenericTag(args) + const lastNum = getLastTagNum(args) + return {genericTag: genericTag, lastNum: lastNum } +} +async function addWorker(args){ + const [jamfolder, appfolder, folder] = getPaths(args.prog, args.app); + const {genericTag,lastNum} = getLastTag(args) + console.log(lastNum, "lst num") + console.log("this is my generic tag", genericTag) + let workerNum = lastNum+1; + const toAdd = args.add; + const jappid = getappid(jamfolder, `${folder}/${args.port}`, args.app, appfolder); + const dataStorePort = args.port + 20000 + const group = fs.readFileSync(`${folder}/${args.port}/group`).toString().trim() + + if (fs.existsSync(`${folder}/a.out`)) { + await $`cd ${folder} && chmod +x a.out`; + } + else{ + if(args.verb){ + console.log(`${body_sec_warning(`a.out does not exist for appName: ${args.app}, programName: ${args.prog} on port ${args.port}`)}`) + console.log(`${body_sec_warning(`file directory is corrupted.`)}`) + console.log(`${body_sec_warning(`script terminated with no worker adjustment`)}`) + } + process.exit(0) + } + let counter = 0 + while (counter < toAdd) { + if (fs.existsSync(`${folder}/a.out`)) { + const argObject = { + "-a": jappid.toString(), + "-p": args.port, + "-n": workerNum, + "-g": group, + "-t": genericTag, + "-o": dataStorePort, + }; + let cargs = getCargs(argObject); + if (args.verb) { + console.log(`${body_sec( + `C node args: ${cargs}` + )}`); + } + await $`${TMUX} new-session -s ${genericTag}-${workerNum} -c ${folder} -d`; + if (!args.log) { + + await $`${TMUX} send-keys -t ${genericTag}-${workerNum} ./a.out ${cargs} C-m`; + } else { + + await $`${TMUX} send-keys -t ${genericTag}-${workerNum} "script -a -t 1 ${folder}/${args.port}/log.${workerNum} ./a.out" ${cargs} C-m`; + } + workerNum++ + counter++; + if(args.verb){ + console.log(`${body_sec(`new worker was, tmux id:${genericTag}-${workerNum}`)}`) + } + } + else{ + if(args.verb){ + console.log(`${body_sec_warning(`a.out removed mid operation`)}`) + console.log(`${body_sec_warning(`file directory is corrupted.`)}`) + console.log(`${body_sec_warning(`only ${counter} worker was added`)}`) + } + process.exit(1) + } + + } +} +async function removeWorker(args){ + const p = await $`${TMUX} ls` + const exists = (((p.stdout.toString().trim().split('\n'))).map((entry) => (entry.split(":")[0])).filter((entry) => entry === args.remove)).length === 0 ? false : true + if(!exists){ + if(args.verb){ + console.log(`${body_sec_warning(`there is no worker running on TMUXID : ${args.remove}`)}`) + } + process.exit(1) + } + spawnSync(TMUX, ['kill-session', '-t', args.remove]); + if(args.verb){ + console.log(`${body_sec(`worker removed. tmuxID: ${args.remove}`)}`) + } + +} + +async function removeWorkerBatch(args){ + const workersTmux = await getRunningTmux(args) + if(workersTmux.length === 0 ){ + console.log(`${body_sec_warning(`No running worker available`)}`) + process.exit(0); + + } + if(args.verb){ + if(workersTmux.length < args.removeBatch){ + console.log(`${body_sec_warning(`cant't remove ${args.removeBatch} workers. there is only ${workersTmux.length} active worker`)}`) + console.log(`${body_sec(`all workers will be removed`)}`) + } + else{ + console.log(`${body_sec(`${args.removeBatch} workers will be removed`)}`) + + } + } + const counter = workersTmux.length < args.removeBatch ? workersTmux.length:args.removeBatch + for(let i = 0; i + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamworker.mjs") + ); + let options; + + try { + options = commandLineArgs(jamWorkerOptionDefinition, { argv: args }); + } catch (error) {} + const rawMode = [options?.remove ? "remove" : undefined , options?.add ? "add" : undefined, options?.removeBatch ? "removeBatch" : undefined] + const mode = rawMode.filter((entry) => entry !== undefined) + if (options === undefined || options.help) { + throw new Error("SHOW USAGE"); + }; + if((!options?.app || !options?.prog || !options?.port) && mode[0] !=="remove"){ + throw new Error("appName, programName and portNumber should be defined"); + } + if(mode.length !== 1){ + throw new Error("the mode should be either one of remove, add, removeBatch"); + }; + options["mode"] = mode[0] + return options + + + } \ No newline at end of file From edc19940be8f3e11ec93459f68692118db9f22f6 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Wed, 6 Nov 2024 03:49:39 +0000 Subject: [PATCH 087/126] Modified app.js to include api calls --- tools/app.js | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 tools/app.js diff --git a/tools/app.js b/tools/app.js new file mode 100644 index 000000000..ce43b676e --- /dev/null +++ b/tools/app.js @@ -0,0 +1,97 @@ +const express = require('express'); +const { exec } = require('child_process'); +const app = express(); + +const port = 3000; +const host = '0.0.0.0'; + +// Middleware to parse JSON requests +app.use(express.json()); + +// Define a simple route +app.get('/api', (req, res) => { + res.json({ message: 'Welcome to the API' }); +}); + +// Define the /jamrun endpoint with dynamic command construction +app.post('/jamrun', (req, res) => { + const { + file = 'file.jxe', + app_name, + fog, + cloud, + device, + num, + data, + tags, + bg, + old, + log, + verb, + loc, + edge, + valgrind, + local, + remote, + } = req.body; + + // Check mandatory field `app_name` + if (!app_name) { + return res.status(400).json({ error: 'The "app_name" field is required.' }); + } + + // Construct the base command + let command = `zx jamrun.mjs ${file} --app=${app_name}`; + + // Optional flags based on request fields + if (fog) command += ' --fog'; + if (cloud) command += ' --cloud'; + if (device) command += ' --device'; + if (num) command += ` --num=${num}`; + if (data) command += ` --data=${data}`; + if (tags) command += ` --tags="${tags}"`; + if (bg) command += ' --bg'; + if (old) command += ' --old'; + if (log) command += ' --log'; + if (verb) command += ' --verb'; + if (loc) command += ` --loc=${loc}`; + if (edge) command += ` --edge=${edge}`; + if (valgrind) command += ' --valgrind'; + if (local) command += ' --local'; + if (remote) command += ` --remote=${remote}`; + + console.log(`Executing command: ${command}`); + + // Execute the constructed command + const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + + // Stream stdout data to the client + childProcess.stdout.on('data', (data) => { + res.write(data); // Send chunks of data as they are produced + }); + + // Stream stderr data to the client (for debugging or error messages) + childProcess.stderr.on('data', (data) => { + res.write(`Error: ${data}`); + }); + + // When the process completes, close the response + childProcess.on('close', (code) => { + res.end(`\nProcess completed with code ${code}`); + }); + + // Handle any execution errors + childProcess.on('error', (error) => { + res.end(`\nFailed to start process: ${error.message}`); + }); +}); + +// Start the server +app.listen(port, host, () => { + console.log(`Server is running on http://${host}:${port}`); +}); + From c3059a7bb6b372c631431c2f531e13d3a9b196e0 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:47:19 -0500 Subject: [PATCH 088/126] Done jam batch/log/list --- tools/app.js | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/tools/app.js b/tools/app.js index ce43b676e..acbc0cf21 100644 --- a/tools/app.js +++ b/tools/app.js @@ -68,7 +68,7 @@ app.post('/jamrun', (req, res) => { // Set headers to keep the connection open for streaming res.setHeader('Content-Type', 'text/plain'); res.setHeader('Transfer-Encoding', 'chunked'); - + // Stream stdout data to the client childProcess.stdout.on('data', (data) => { res.write(data); // Send chunks of data as they are produced @@ -90,6 +90,163 @@ app.post('/jamrun', (req, res) => { }); }); +// Define the /jambatch endpoint with dynamic command construction +app.get('/jambatch', (req, res) => { + const { + fog, + device, + cloud, + cFile, + fFile, + dFile, + num, + cLoc, + fLoc, + dLoc, + cEdge, + fEdge, + dEdge + } = req.body; + + + // Construct the base command + let command = `zx jambatch.mjs program.jxe`; + + // Optional flags based on request fields + if (fog) command += ` --fog=${fog}`; + if (device) command += ` --device=${device}`; + if (cloud) command += ` --cloud=${cloud}`; + if (cFile) command += `--cFile=${cFile}`; + if (fFile) command += `--fFile=${fFile}`; + if (dFile) command += `--dFile=${dFile}`; + if (num) command += `--num=${num}`; + if (cLoc) command += `--cLoc=${cLoc}`; + if (fLoc) command += `--fLoc=${fLoc}`; + if (dLoc) command += `--dLoc=${dLoc}`; + if(cEdge) command += `--cEdge=${cEdge}`; + if(fEdge) command += `--fEdge=${fEdge}`; + if(dEdge) command += `--dEdge=${dEdge}`; + + console.log(`Executing command: ${command}`); + + // Execute the constructed command + const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + +}); + +// Define the /jamlog endpoint with dynamic command construction +app.get('/jamlog', (req, res) => { + const { + program, + app, + port, + remote, + tail, + c, + j, + } = req.body; + + // Check mandatory field `remote` + if (!remote) { + return res.status(400).json({ error: 'The "remote" field is required.' }); + } + + // Check mandatory field `tail` + if (!tail) { + return res.status(400).json({ error: 'The "tail" field is required.' }); + } + + + // Construct the base command + let command = `zx jamlog.mjs --program=jt2 --app-xxx2, --port=1883`; + + // Optional flags based on request fields + if (remote) command += ` --remote=${remote}`; + if (tail) command += ` --tail=${tail}`; + + console.log(`Executing command: ${command}`); + + // Execute the constructed command + const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + +}); + +// Define the /jamlist endpoint with dynamic command construction +app.get('/jamlist', (req, res) => { + const { + monitor, + type, + dataStore, + tmuxid, + port, + app, + prog, + remote + } = req.body; + + // Check mandatory field `type` + if (!type) { + return res.status(400).json({ error: 'The "type" field is required.' }); + } + + // Check mandatory field `type` + if (!dataStore) { + return res.status(400).json({ error: 'The "dataStore" field is required.' }); + } + + // Check mandatory field `tmuxid` + if (!tmuxid) { + return res.status(400).json({ error: 'The "tmuxid" field is required.' }); + } + + // Check mandatory field `port` + if (!port) { + return res.status(400).json({ error: 'The "port" field is required.' }); + } + + // Check mandatory field `app` + if (!port) { + return res.status(400).json({ error: 'The "app" field is required.' }); + } + + // Check mandatory field `app` + if (!port) { + return res.status(400).json({ error: 'The "prog" field is required.' }); + } + + + // Construct the base command + let command = `zx jamlist.mjs`; + + // Optional flags based on request fields + if (type) command += ` --type=${type}`; + if (dataStore) command += ` --dataStore=${dataStore}`; + if (tmuxid) command += ` --tmuxid=${tmuxid}`; + if (port) command += ` --port=${port}`; + if (app) command += ` --app=${app}`; + if (prog) command += ` --prog=${prog}`; + + + console.log(`Executing command: ${command}`); + + // Execute the constructed command + const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + +}); + + // Start the server app.listen(port, host, () => { console.log(`Server is running on http://${host}:${port}`); From 4a6260ff9c252688a912599b044fd7c6637f5ec1 Mon Sep 17 00:00:00 2001 From: JasonBergeron Date: Sat, 9 Nov 2024 17:46:21 -0500 Subject: [PATCH 089/126] Done jam kill --- tools/app.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tools/app.js b/tools/app.js index acbc0cf21..a389e4f7d 100644 --- a/tools/app.js +++ b/tools/app.js @@ -247,6 +247,40 @@ app.get('/jamlist', (req, res) => { }); +//Define the /jamkill endpoint +app.post('/jamkill', (req, res) => { + const { + reset, + all, + remote, + app, + prog, + port + } = req.body; + +//No mandatory fields, by default kills local apps only + +//Construct base command +let command = 'zx jamkill.mjs'; + +//Optional flags +if (reset) command += ' --reset'; +if (all) command += ' --all' +if (remote) command += ' --remote'; +if (app) command += ' --app==${app}'; +if (prog) command += ' --prog==${prog}'; +if (port) command += ' --port=${port}'; + +console.log('Executing command: ${command}'); + +//Execute the command +const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/'}); + +//Set headers +res.setHeader('Content-Type', 'text/plain'); +res.setHeader('Transfer-Encoding', 'chunked'); +}); + // Start the server app.listen(port, host, () => { console.log(`Server is running on http://${host}:${port}`); From cc0874aae3be6b7ab0e3127cb3b084240d3e48c8 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sun, 10 Nov 2024 14:45:29 -0500 Subject: [PATCH 090/126] fix from get to post --- tools/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/app.js b/tools/app.js index a389e4f7d..2946f2028 100644 --- a/tools/app.js +++ b/tools/app.js @@ -91,7 +91,7 @@ app.post('/jamrun', (req, res) => { }); // Define the /jambatch endpoint with dynamic command construction -app.get('/jambatch', (req, res) => { +app.post('/jambatch', (req, res) => { const { fog, device, @@ -139,7 +139,7 @@ app.get('/jambatch', (req, res) => { }); // Define the /jamlog endpoint with dynamic command construction -app.get('/jamlog', (req, res) => { +app.post('/jamlog', (req, res) => { const { program, app, @@ -180,7 +180,7 @@ app.get('/jamlog', (req, res) => { }); // Define the /jamlist endpoint with dynamic command construction -app.get('/jamlist', (req, res) => { +app.post('/jamlist', (req, res) => { const { monitor, type, From c4ee252ca26522ee4d3e2568f65ed93d10e23e4b Mon Sep 17 00:00:00 2001 From: jininij <125915497+jininij@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:09:37 -0500 Subject: [PATCH 091/126] jamterm post API request and tmux running detached. --- tools/app.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ tools/jamterm.mjs | 3 ++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/tools/app.js b/tools/app.js index 2946f2028..285968120 100644 --- a/tools/app.js +++ b/tools/app.js @@ -281,6 +281,53 @@ res.setHeader('Content-Type', 'text/plain'); res.setHeader('Transfer-Encoding', 'chunked'); }); + +// Define the /jamterm endpoint with dynamic command construction +app.post ("/jamterm", (req, res)=>{ + const { all, app, prog, port, pane } = req.body; + + // Construct the base command + let command = `zx jamterm.mjs`; + + // Add optional flags + if (all) command += ' --all'; + if (app) command += ` --app=${app}`; + if (prog) command += ` --prog=${prog}`; + if (port) command += ` --port=${port}`; + if (pane) command += ` --pane=${pane}`; + + console.log(`Executing command: ${command}`); + + // Execute the constructed command + const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/', shell: true}); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + + // Stream stdout data to the client + childProcess.stdout.on('data', (data) => { + res.write(data); // Send chunks of data as they are produced + }); + + // Stream stderr data to the client (for debugging or error messages) + childProcess.stderr.on('data', (data) => { + res.write(`Error: ${data}`); + }); + + // When the process completes, close the response + childProcess.on('close', (code) => { + res.end(`\nProcess completed with code ${code}`); + }); + + // Handle any execution errors + childProcess.on('error', (error) => { + res.end(`\nFailed to start process: ${error.message}`); + }); +}) + + + // Start the server app.listen(port, host, () => { console.log(`Server is running on http://${host}:${port}`); diff --git a/tools/jamterm.mjs b/tools/jamterm.mjs index eae9e7074..913e499a6 100755 --- a/tools/jamterm.mjs +++ b/tools/jamterm.mjs @@ -361,7 +361,8 @@ async function main(){ const MAX_TMUX_NUM = args.pane > sessionMap.size ? sessionMap.size : args.pane; await creatMainSesh(); await setUpTmux(sessionMap,MAX_TMUX_NUM ); - await $`${MYTMUX} a -t ${MAIN_SESH_NAME}`; + // await $`${MYTMUX} a -t ${MAIN_SESH_NAME}`; + console.log(`Session '${MAIN_SESH_NAME}' created and running in detached mode.`); } (async()=>{main()})() From cface110de32588cd4ce44aaabecfbedaa440beb Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Thu, 14 Nov 2024 01:12:49 +0000 Subject: [PATCH 092/126] All endpoints work! --- Dockerfile | 87 ++++++++++ scripts/install/Dockerfile | 87 ---------- tools/app.js | 320 ++++++++++--------------------------- 3 files changed, 171 insertions(+), 323 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..776654369 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,87 @@ +FROM ubuntu + +# Install SSH and other dependencies +RUN apt update && apt install -y openssh-server +RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config + +# Install necessary tools and libraries +RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ + apt-get install -y -q wget \ + build-essential \ + python3 \ + unzip \ + libbsd-dev \ + git \ + sudo \ + vim \ + curl \ + make \ + clang \ + iproute2 \ + net-tools \ + unzip \ + iputils-ping \ + mosquitto \ + mosquitto-clients \ + libmosquitto-dev \ + redis-server \ + redis-tools \ + libhiredis-dev \ + libevent-dev \ + tmux \ + inotify-tools + +# Create an admin user with sudo privileges +RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo +RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers +USER admin + +# Set up Node.js +WORKDIR /home/admin +RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ + sudo apt-get install -y -q nodejs + +# Clone JAMScript repository and build dependencies +RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript + +WORKDIR /home/admin/JAMScript/deps +RUN git clone https://github.com/intel/tinycbor && \ + cd tinycbor && \ + make && sudo make install + +WORKDIR /home/admin/JAMScript/deps/mujs2 +RUN make && sudo make install + +# Install JAMScript dependencies and global npm package +WORKDIR /home/admin/JAMScript +RUN npm install +RUN sudo npm install zx -g + +# Additional setup for JAMScript +WORKDIR /home/admin/JAMScript/lib/cside +RUN make archive + +WORKDIR /home/admin +RUN mkdir -p .jamruns && \ + ln -s /home/admin/JAMScript/lib/cside .jamruns/clib && \ + ln -s /home/admin/JAMScript .jamruns/jamhome && \ + ln -s /home/admin/JAMScript/lib/jside .jamruns/node_modules + +# Configure npm global installation path +RUN mkdir .npm-global && mkdir .npm-global/bin +ENV PATH="$PATH:/home/admin/JAMScript/tools:/home/admin/.npm-global/bin" + +# Expose SSH port +EXPOSE 22 + +# Copy the code from the current directory to /home/admin/code in the container +WORKDIR /home/admin/code +COPY . /home/admin/code + +# Run npm install and install.sh as admin +RUN npm install +RUN sudo chmod +x /home/admin/code/install.sh && /home/admin/code/install.sh + +# Start SSH and keep the container running +ENTRYPOINT sudo service ssh start && tail -f /dev/null + diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 377548ebf..eab7d3501 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -75,90 +75,3 @@ ENV PATH="$PATH:/home/admin/JAMScript/tools:/home/admin/.npm-global/bin" EXPOSE 22 ENTRYPOINT sudo service ssh start && bash -# EXPOSE 22 -####################BROKEN REDIS -# FROM ubuntu - -# RUN apt update && apt install -y openssh-server -# RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config - -# RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ -# apt-get install -y -q wget \ -# build-essential \ -# python3 \ -# unzip \ -# libbsd-dev \ -# git \ -# sudo \ -# vim \ -# curl \ -# make \ -# clang \ -# iproute2 \ -# net-tools \ -# unzip \ -# iputils-ping - -# RUN apt-get install -y -q mosquitto \ -# mosquitto-clients \ -# libmosquitto-dev - -# RUN apt-get install -y -q redis-server \ -# redis-tools \ -# libhiredis-dev - -# RUN apt-get install -y -q libevent-dev \ -# tmux \ -# inotify-tools - -# RUN useradd -m admin && echo "admin:admin" | chpasswd && adduser admin sudo -# RUN echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers - -# # Switch to root user to modify system files -# USER root - -# # Add global npm bin directory to PATH for all users and sessions -# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/profile -# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /etc/bash.bashrc - -# # Switch back to admin user -# USER admin - -# WORKDIR /home/admin -# RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ -# sudo apt-get install -y -q nodejs - -# RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript - -# WORKDIR /home/admin/JAMScript/deps -# RUN git clone https://github.com/intel/tinycbor -# WORKDIR /home/admin/JAMScript/deps/tinycbor -# RUN make -# RUN sudo make install - -# WORKDIR /home/admin/JAMScript/deps/mujs2 -# RUN make -# RUN sudo make install - -# WORKDIR /home/admin/JAMScript -# RUN npm install - -# WORKDIR /home/admin/JAMScript/lib/cside -# RUN make archive - -# WORKDIR /home/admin -# RUN mkdir .jamruns -# WORKDIR /home/admin/.jamruns -# RUN ln -s /home/admin/JAMScript/lib/cside clib -# RUN ln -s /home/admin/JAMScript jamhome -# RUN ln -s /home/admin/JAMScript/lib/jside node_modules - -# WORKDIR /home/admin - -# # Add global npm bin directory to PATH for the admin user -# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.bashrc -# RUN echo 'export PATH=$PATH:/home/admin/JAMScript/node_modules/.bin' >> /home/admin/.profile - -# EXPOSE 22 -# ENTRYPOINT sudo service ssh start && bash -####################BROKEN REDIS \ No newline at end of file diff --git a/tools/app.js b/tools/app.js index 285968120..f177dda87 100644 --- a/tools/app.js +++ b/tools/app.js @@ -13,7 +13,45 @@ app.get('/api', (req, res) => { res.json({ message: 'Welcome to the API' }); }); -// Define the /jamrun endpoint with dynamic command construction +// Utility function to handle command execution and streaming response +function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { + console.log(`Executing command: ${command}`); + const childProcess = exec(command, { cwd }); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + + // Stream stdout data to the client + childProcess.stdout.on('data', (data) => { + res.write(data); + }); + + // Stream stderr data to the client (for debugging or error messages) + childProcess.stderr.on('data', (data) => { + res.write(`Error: ${data}`); + }); + + // When the process completes, close the response + childProcess.on('close', (code) => { + res.end(`\nProcess completed with code ${code}`); + }); + + // Handle any execution errors + childProcess.on('error', (error) => { + res.end(`\nFailed to start process: ${error.message}`); + }); + + // If the client disconnects, terminate the child process + req.on('close', () => { + if (childProcess.exitCode === null) { // If process is still running + console.log('Client disconnected, terminating process'); + childProcess.kill(); // Terminate the process + } + }); +} + +// Define the /jamrun endpoint app.post('/jamrun', (req, res) => { const { file = 'file.jxe', @@ -35,15 +73,11 @@ app.post('/jamrun', (req, res) => { remote, } = req.body; - // Check mandatory field `app_name` if (!app_name) { return res.status(400).json({ error: 'The "app_name" field is required.' }); } - // Construct the base command let command = `zx jamrun.mjs ${file} --app=${app_name}`; - - // Optional flags based on request fields if (fog) command += ' --fog'; if (cloud) command += ' --cloud'; if (device) command += ' --device'; @@ -60,273 +94,87 @@ app.post('/jamrun', (req, res) => { if (local) command += ' --local'; if (remote) command += ` --remote=${remote}`; - console.log(`Executing command: ${command}`); - - // Execute the constructed command - const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); - - // Set headers to keep the connection open for streaming - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Transfer-Encoding', 'chunked'); - - // Stream stdout data to the client - childProcess.stdout.on('data', (data) => { - res.write(data); // Send chunks of data as they are produced - }); - - // Stream stderr data to the client (for debugging or error messages) - childProcess.stderr.on('data', (data) => { - res.write(`Error: ${data}`); - }); - - // When the process completes, close the response - childProcess.on('close', (code) => { - res.end(`\nProcess completed with code ${code}`); - }); - - // Handle any execution errors - childProcess.on('error', (error) => { - res.end(`\nFailed to start process: ${error.message}`); - }); + executeCommand(req, res, command); }); -// Define the /jambatch endpoint with dynamic command construction +// Define the /jambatch endpoint app.post('/jambatch', (req, res) => { const { - fog, - device, - cloud, - cFile, - fFile, - dFile, - num, - cLoc, - fLoc, - dLoc, - cEdge, - fEdge, - dEdge + fog, device, cloud, cFile, fFile, dFile, num, cLoc, fLoc, dLoc, cEdge, fEdge, dEdge } = req.body; - - // Construct the base command let command = `zx jambatch.mjs program.jxe`; - - // Optional flags based on request fields if (fog) command += ` --fog=${fog}`; if (device) command += ` --device=${device}`; if (cloud) command += ` --cloud=${cloud}`; - if (cFile) command += `--cFile=${cFile}`; - if (fFile) command += `--fFile=${fFile}`; - if (dFile) command += `--dFile=${dFile}`; - if (num) command += `--num=${num}`; - if (cLoc) command += `--cLoc=${cLoc}`; - if (fLoc) command += `--fLoc=${fLoc}`; - if (dLoc) command += `--dLoc=${dLoc}`; - if(cEdge) command += `--cEdge=${cEdge}`; - if(fEdge) command += `--fEdge=${fEdge}`; - if(dEdge) command += `--dEdge=${dEdge}`; - - console.log(`Executing command: ${command}`); - - // Execute the constructed command - const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); - - // Set headers to keep the connection open for streaming - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Transfer-Encoding', 'chunked'); - + if (cFile) command += ` --cFile=${cFile}`; + if (fFile) command += ` --fFile=${fFile}`; + if (dFile) command += ` --dFile=${dFile}`; + if (num) command += ` --num=${num}`; + if (cLoc) command += ` --cLoc=${cLoc}`; + if (fLoc) command += ` --fLoc=${fLoc}`; + if (dLoc) command += ` --dLoc=${dLoc}`; + if (cEdge) command += ` --cEdge=${cEdge}`; + if (fEdge) command += ` --fEdge=${fEdge}`; + if (dEdge) command += ` --dEdge=${dEdge}`; + + executeCommand(req, res, command); }); -// Define the /jamlog endpoint with dynamic command construction +// Define the /jamlog endpoint app.post('/jamlog', (req, res) => { - const { - program, - app, - port, - remote, - tail, - c, - j, - } = req.body; - - // Check mandatory field `remote` - if (!remote) { - return res.status(400).json({ error: 'The "remote" field is required.' }); - } - - // Check mandatory field `tail` - if (!tail) { - return res.status(400).json({ error: 'The "tail" field is required.' }); + const { remote, tail } = req.body; + if (!remote || !tail) { + return res.status(400).json({ error: 'The "remote" and "tail" fields are required.' }); } - - // Construct the base command - let command = `zx jamlog.mjs --program=jt2 --app-xxx2, --port=1883`; - - // Optional flags based on request fields - if (remote) command += ` --remote=${remote}`; - if (tail) command += ` --tail=${tail}`; - - console.log(`Executing command: ${command}`); - - // Execute the constructed command - const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); - - // Set headers to keep the connection open for streaming - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Transfer-Encoding', 'chunked'); - + let command = `zx jamlog.mjs --program=jt2 --app-xxx2 --port=1883 --remote=${remote} --tail=${tail}`; + executeCommand(req, res, command); }); -// Define the /jamlist endpoint with dynamic command construction app.post('/jamlist', (req, res) => { - const { - monitor, - type, - dataStore, - tmuxid, - port, - app, - prog, - remote - } = req.body; - - // Check mandatory field `type` - if (!type) { - return res.status(400).json({ error: 'The "type" field is required.' }); - } - - // Check mandatory field `type` - if (!dataStore) { - return res.status(400).json({ error: 'The "dataStore" field is required.' }); - } - - // Check mandatory field `tmuxid` - if (!tmuxid) { - return res.status(400).json({ error: 'The "tmuxid" field is required.' }); - } - - // Check mandatory field `port` - if (!port) { - return res.status(400).json({ error: 'The "port" field is required.' }); - } - - // Check mandatory field `app` - if (!port) { - return res.status(400).json({ error: 'The "app" field is required.' }); - } - - // Check mandatory field `app` - if (!port) { - return res.status(400).json({ error: 'The "prog" field is required.' }); - } - + const { type, dataStore, tmuxid, port, app, prog } = req.body; - // Construct the base command + // Default command without arguments if none are specified let command = `zx jamlist.mjs`; - - // Optional flags based on request fields - if (type) command += ` --type=${type}`; - if (dataStore) command += ` --dataStore=${dataStore}`; - if (tmuxid) command += ` --tmuxid=${tmuxid}`; - if (port) command += ` --port=${port}`; - if (app) command += ` --app=${app}`; - if (prog) command += ` --prog=${prog}`; - - - console.log(`Executing command: ${command}`); - - // Execute the constructed command - const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/' }); - - // Set headers to keep the connection open for streaming - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Transfer-Encoding', 'chunked'); - + if (type) command += ` --type ${type}`; + if (dataStore) command += ` --dataStore ${dataStore}`; + if (tmuxid) command += ` --tmuxid ${tmuxid}`; + if (port) command += ` --port ${port}`; + if (app) command += ` --app ${app}`; + if (prog) command += ` --prog ${prog}`; + + executeCommand(req, res, command); }); - -//Define the /jamkill endpoint +// Define the /jamkill endpoint app.post('/jamkill', (req, res) => { - const { - reset, - all, - remote, - app, - prog, - port - } = req.body; - -//No mandatory fields, by default kills local apps only + const { reset, all, remote, app, prog, port } = req.body; -//Construct base command -let command = 'zx jamkill.mjs'; - -//Optional flags -if (reset) command += ' --reset'; -if (all) command += ' --all' -if (remote) command += ' --remote'; -if (app) command += ' --app==${app}'; -if (prog) command += ' --prog==${prog}'; -if (port) command += ' --port=${port}'; - -console.log('Executing command: ${command}'); - -//Execute the command -const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/'}); + let command = 'zx jamkill.mjs'; + if (reset) command += ' --reset'; + if (all) command += ' --all'; + if (remote) command += ` --remote=${remote}`; + if (app) command += ` --app=${app}`; + if (prog) command += ` --prog=${prog}`; + if (port) command += ` --port=${port}`; -//Set headers -res.setHeader('Content-Type', 'text/plain'); -res.setHeader('Transfer-Encoding', 'chunked'); + executeCommand(req, res, command); }); - -// Define the /jamterm endpoint with dynamic command construction -app.post ("/jamterm", (req, res)=>{ +// Define the /jamterm endpoint +app.post("/jamterm", (req, res) => { const { all, app, prog, port, pane } = req.body; - // Construct the base command let command = `zx jamterm.mjs`; - - // Add optional flags if (all) command += ' --all'; if (app) command += ` --app=${app}`; if (prog) command += ` --prog=${prog}`; if (port) command += ` --port=${port}`; if (pane) command += ` --pane=${pane}`; - console.log(`Executing command: ${command}`); - - // Execute the constructed command - const childProcess = exec(command, { cwd: '/root/capstone/JAMScript/tools/', shell: true}); - - // Set headers to keep the connection open for streaming - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Transfer-Encoding', 'chunked'); - - // Stream stdout data to the client - childProcess.stdout.on('data', (data) => { - res.write(data); // Send chunks of data as they are produced - }); - - // Stream stderr data to the client (for debugging or error messages) - childProcess.stderr.on('data', (data) => { - res.write(`Error: ${data}`); - }); - - // When the process completes, close the response - childProcess.on('close', (code) => { - res.end(`\nProcess completed with code ${code}`); - }); - - // Handle any execution errors - childProcess.on('error', (error) => { - res.end(`\nFailed to start process: ${error.message}`); - }); -}) - - + executeCommand(req, res, command); +}); // Start the server app.listen(port, host, () => { From c65705e477f26726f3b5a856275d2b1c55804431 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Sun, 24 Nov 2024 07:07:12 +0000 Subject: [PATCH 093/126] Fixed Dockerfile! --- scripts/install/Dockerfile | 27 +++++++++++++++++---------- tools/app.js | 18 +++++++++++------- tools/run_all.sh | 23 +++++++++++++++++++++++ 3 files changed, 51 insertions(+), 17 deletions(-) create mode 100755 tools/run_all.sh diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index eab7d3501..76d09325c 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -1,6 +1,8 @@ FROM ubuntu -RUN apt update && apt install -y openssh-server +# Install OpenSSH server and sudo +RUN apt update && apt install -y openssh-server sudo + RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config @@ -19,15 +21,15 @@ RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ iproute2 \ net-tools \ unzip \ - iputils-ping + iputils-ping RUN apt-get install -y -q mosquitto \ mosquitto-clients \ - libmosquitto-dev + libmosquitto-dev RUN apt-get install -y -q redis-server \ redis-tools \ - libhiredis-dev + libhiredis-dev RUN apt-get install -y -q libevent-dev \ tmux \ @@ -40,23 +42,23 @@ WORKDIR /home/admin RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ sudo apt-get install -y -q nodejs - RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript + RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript WORKDIR /home/admin/JAMScript/deps RUN git clone https://github.com/intel/tinycbor WORKDIR /home/admin/JAMScript/deps/tinycbor -RUN make -RUN sudo make install +RUN make +RUN sudo make install WORKDIR /home/admin/JAMScript/deps/mujs2 RUN make RUN sudo make install WORKDIR /home/admin/JAMScript -RUN npm install +RUN npm install RUN sudo npm install zx -g -WORKDIR /home/admin/JAMScript/lib/cside +WORKDIR /home/admin/JAMScript/lib/cside RUN make archive WORKDIR /home/admin @@ -72,6 +74,11 @@ RUN mkdir .npm-global/bin ENV PATH="$PATH:/home/admin/JAMScript/tools:/home/admin/.npm-global/bin" + + +# Expose the SSH port EXPOSE 22 -ENTRYPOINT sudo service ssh start && bash + +# Start SSH service and keep the container running +ENTRYPOINT ["bash", "-c", "sudo service ssh start && exec bash"] diff --git a/tools/app.js b/tools/app.js index f177dda87..caf2c8147 100644 --- a/tools/app.js +++ b/tools/app.js @@ -133,16 +133,20 @@ app.post('/jamlog', (req, res) => { }); app.post('/jamlist', (req, res) => { - const { type, dataStore, tmuxid, port, app, prog } = req.body; + const { help, all, monitor, type, dataStore, tmuxid, port, app, prog, remote } = req.body; // Default command without arguments if none are specified let command = `zx jamlist.mjs`; - if (type) command += ` --type ${type}`; - if (dataStore) command += ` --dataStore ${dataStore}`; - if (tmuxid) command += ` --tmuxid ${tmuxid}`; - if (port) command += ` --port ${port}`; - if (app) command += ` --app ${app}`; - if (prog) command += ` --prog ${prog}`; + if (help) command += ` --help`; + if (all) command += ` --all`; + if (monitor) command += ` --monitor`; + if (type) command += ` --type=${type}`; + if (dataStore) command += ` --dataStore=${dataStore}`; + if (tmuxid) command += ` --tmuxid=${tmuxid}`; + if (port) command += ` --port=${port}`; + if (app) command += ` --app=${app}`; + if (prog) command += ` --prog=${prog}`; + if (remote) command += ` --remote=${remote}`; executeCommand(req, res, command); }); diff --git a/tools/run_all.sh b/tools/run_all.sh new file mode 100755 index 000000000..056e191d9 --- /dev/null +++ b/tools/run_all.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Base command +COMMAND="zx jamrun.mjs jt1.jxe --bg" + +# Base app name +APP_PREFIX="DEMO" + +# Directory to execute the command (adjust this if necessary) +WORK_DIR="/root/capstone_team/JAMScript/tools" + +# Navigate to the working directory +cd "$WORK_DIR" || exit + +# Loop from DEMO1 to DEMO100 and execute the command +for i in {1..100}; do + APP_NAME="${APP_PREFIX}${i}" + echo "Running command: $COMMAND --app=$APP_NAME" + $COMMAND --app="$APP_NAME" +done + +echo "All commands executed." + From 101f9f811ca8d2359dd04bea3d0fe3cd5b5798b7 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Tue, 26 Nov 2024 01:29:14 +0000 Subject: [PATCH 094/126] Added executables for jt1.jxe and jt2.jxe --- scripts/install/Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index 76d09325c..c7bc87ad1 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -5,7 +5,6 @@ RUN apt update && apt install -y openssh-server sudo RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config - RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ apt-get install -y -q wget \ build-essential \ @@ -74,8 +73,6 @@ RUN mkdir .npm-global/bin ENV PATH="$PATH:/home/admin/JAMScript/tools:/home/admin/.npm-global/bin" - - # Expose the SSH port EXPOSE 22 From becc418ab748bb06ffd81205b1c7a7021c674089 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Tue, 26 Nov 2024 01:30:57 +0000 Subject: [PATCH 095/126] Added executables for jt1.jxe and jt2.jxe --- tools/jt1.jxe | Bin 0 -> 2417454 bytes tools/jt2.jxe | Bin 0 -> 2417809 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tools/jt1.jxe create mode 100644 tools/jt2.jxe diff --git a/tools/jt1.jxe b/tools/jt1.jxe new file mode 100644 index 0000000000000000000000000000000000000000..5db940babeb5de38b26ec94e1cf55284790d6422 GIT binary patch literal 2417454 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≤I34@Y^@e zwe#D_xT@l}LshI3@Y@|f{ZIJqrnjo(w=eY3_2*-+KM&s8&qtqFKFP|eEZa7~44a#a z%Zk@>6nXYB#bq~fVP#OHRDxLP_P33R5Ncg^eT3WF(^WNp^)wFi*Dbf5##pIUC4Y5B z^4Bqy`Rhjs_ObFW<*GbZ#^8U_v9f=|e}AkT8}Jv#O3|AqA1i}zP_&ZI$3`nxE@vaA3*z5nTS^vKvzkXGq*g0+a^^R9g zK6YZSRkU+H9~+$qWPs}?B{hW&YdJ_7v@!Ot#{|7X47E3Hk2iZuuD$`6b z{uF5Dw$=ZAnz@g06Xv(4tuJUj`Q$XS+M{S@A0HddyrbSAHuVLJwJP}S&)D&>`0ZL; zRq@;DD%J`3?S-rUC;T?yr7HRD>K?lOeC+ivG5Kv(_A12uW3`)5f;(#0)*P;pG35qL zt+ia<5-|iJHf@RG>xQ9(vgna3`UT#Ao-JFDVS6^c*-Ucg$=NNjP=>V=-$*grVj4T* z(KT%5a2s!HPyg9iJzF3O-Q>c|lx5BdxddVM%;m4!A!POptLP(!V%*u2^o!u^5eC@rTXM%l&?%RSrOs{*2?#fC(5QC5;`Y|4x$ zzevwc5F;qHJ<*G?GnC-+R?Ea0x9XTcOXIk|D`|enIwcBuZ%M&Ya!D_5j2WH1o+QJWcNS-xm{@W* z*TkS%$hw8n-}~FWwY*7G&gdJXvaU$a*-F>CRgrey0YJ=R)2j>rR4lT?WH)wf<3g1h?_KU61yXz(c9k`LaG6l;M1+ z5U^*F{Q724SLdL`fT2sK;2yD1eir@#+)yOp%OvKv@@uukTp__LRZPJgx-`g?wv{aI)lLwBi|yZL#) ziY~uSAvy^Q;+}nghYkY<9Rmz4R|!i-LrYb{2l;uwmAaJk)KWhnF;6jd3L{ybLUdvt zl9-1Er8^&*4;Tdb3@ucpmRbxg|ARK$P{z;u&7$8W4fD(Sf3%H@I&h71Ov`_`u^LQ_ z)eA^q^$`IF1Ox?a6|h0TDgnzfQ`R~2yR&BEWesQE)7bJ)D=mq2=Eq>7+!MVND?rsV zz266x9pRlMo4pTsAhvY&hRpn6l*jM5@kkS$z}Y zG6riWViN` zFV3OpAAXYR+J*cExzi1M_nOL_-EHUg=(rqA9itJUEoG&(uyA3YsHk8OwSgQ)3S2ia! z-dL7%3p_k<^c>kc{>6BF83ySv&+mf0urp}v{014qpIR~?F3Ol5&!p+iXxR%>ltbiY ziQ>GLEBHk7taUFbo8+ra5Pks~H5z>x&5-2yaY+*rZM~dNiDL~=8U;h{-}AHB@r`(3 zx^fX;dn-9+D-UFgDBVzwPgMNr5}(AACGiH1_mrmu(P)lo63AbP@|R!srgOYZaEaq3 ziL4sX@tpjm5PrccapcQ~zhcKY2`F(q&L`BKBU?&)I)>p>;utEyv}(Amj4nK9YSe$E zRum72NHdfe4R9a@+>aY99P z3gSg}#MU81UAc2K#(fsXPrSHklyTP6tlSYf_~~ywus1`(o9OY5lFB^{2Gt#EAx;&< zukDEQap+c=Qew7Bo<@AiLcCuP$J-ITlA||~^zXM2_i04O-Dc%36U0nAVlNZ%atpCG z7$oJi5D)DHv9TTTOcU`)v02osG-789u}}~v56qIu_IoNLl?D$g?N`nv=wz@5X6HV zdo~H+Fb-YRor}!Ic}OGLiu#Tq7T6JsOvG6h;u4McgH_b~1To)^IMGBLXCXEpr1~+5 zPl&pc1<_+iyw*g_v=A@Qh?iK1WxNz>G_oU}fkQV=yoGq4MohL4zZS&xS+>Uc35RZ+ ztqaY@acRUGEX47G_?8`Us)_iqg;<~w7h8y#f;iZYc)yAGh=tfxt&8f(+0IboG#125 z?TDA*&~?nP5XWf5XD!4H0T4@v+v<1-heoVxA^uw<&ax2S7R0aYh=nHN>IG)we5nzO zEyQ~TG0%=T!9;w`Li}7K&an{N2x1RAVowuspoO?xBd)O!4;mmgv?De#5ihn7mubY+ z7Gi-Qt{Y}+oQ*hi}6kQ-Zw>owvI z3-K*MoM%V;+CLL4B7kJ%ANn}{Usf5v;?KZ9we=k3OHr@n7vh%mwa2BsUtTb-hLcwdXEv*VsjE_fruH?aL zg(5yziBH!Rp=`w`5g*bhV-plSFPCM>UG=^qz;l=5OFkKxjGb^5-rnW8hk5>{n~vclC}o9n z+)X&g9*QP)XRfSiI5L*M+?oHF#FFJ_evvcZhr?IT4TjIr4Vb@VR1*wzdq2XzDA3ru z*z0J6cd$l&;i$)RQ!nIq)TpzvV~LYLgg7~=N#fjPsEgQ}^QLVVc8zrB6! zDC0}@mat=k88{nc0y|6K>jYZL+wl29zhmwh4P*gag}wH8o_4JfdVW~FoZ?8D3%!nt z$8NH`wa61^?yo4B{3W>Mn7sVOxk~1X!qnw+3?n*h2yzg_ujv(Iwzd_}ENSBo`!UCvM2B@->{9**<|w?O_IxqCYT@@U&W9NvKN>`lTq zzHds4nmHsd37+A}H?k8{a=TSp+rA|3=agzAKjf6K_qX6vIKS1-V2;ao&I5yUE_EGW<){eUB3#iE7}p`s*Y*#FVmy| zu(W%&!pHL4B~mbF-b*U=CLL5MS32{iDtGrdj=JYBapv7lTe^G=UAgn)g3dvc_{O`+ z@$V-7Dfg9)+~rESXqXXbi<=4st^i#s_5^^3oSr}w3O2GxBvh%a+gv`WQ0s7oup+%j zo>lOu+^x!dAFfRC@hbBQ+%(*9*;BBHUL)PRkS^#>(ylp_O8)k^zNGF^QP51NL!+Vw zxMzp_DEJchmqJfO_{1$cG4hudY%__zMvc{Y>~;yI_ubB}Y|#{Fwpf!{>u1i8^Ss#s zp6mOx-GjWv&;CyEy%9G`pkX)SK4Z@$Z_vix(kyF(6i+2rv!o zyV%XhUF347{Nl`$Lmp&(6X+gaS{x4?ImbVzvPkUd8`wIkyDy_PFJ83eZS3MQchS!3 zZvVWNqK%b(5H>zUEiCV=qp9^fdelN;*`e2{;pZfm!fRLmiiVhdwSeq)*z@;0UN)MM zUwcZLeXe@afbA8dty7*1I;@_?lD9c{*j%D{+jD!R+?`+I%x^@=GNX^W$1W86Z0>`< zWVSe(+2UYk%F*FBd%RmHMOGbl)%=c|$htf(GwE0sDr_Dpmm*?cPWigazgL3ZvCzwL zMqMT-k38){nG=W-OpxsptG!fZYKAJKB1)@7_4H-6j-^>@vfEhZ_IHfw?(?*cQwnQ; z<5-xW+H;ha3F)uP=NE|S4rvlefR`foI`bYv)h~CfayOTCukL9bmAk2?QiJ=OwELVs zfAq#E?|e1GIWyMK;j<+LXU6i0&q^l*k_Fr67)R8<$j97z4r4+MUahKc)xQFND?2WK zJ2Hb&(dBsj?TF%UKN3grw>A7w{4J891wL-fsD{^di1e3@<5}k_MrX8vm(>#@<DG0`_?H<70!j8U*QSQ-+0|A42r z{4PTlk$ac=zKpPs-Yy@ks1F>6x4g?2^EAQmb6w?2x&9PMAL%*mqej-UMzx$5@p#GFUT_*}R5nCw=2R~d)9gmX8(zh0z%eCNA;PNwUTX!VuN-Spc7 zGuoK@7bcH(d4I6DH0zLZqh2St^fXd*`>qIa>BI1BnDRv;H6$`cXCLow!>5}NwnHu- zsq|vZu)2iFb7ITPu-`7#Jie(E1A#?{e`1C&C7kYdg*bUA-)EA-`M$65vkQak!t!Ho zr>Lyx1=5#v_CKhBEWV!W!|9EZ>hQFv{_aQexyu{-5>gsY@ROJb7q&VDX$ zb|D<1XnI)AEai9^9p>`qPdO+fG=GwOO7bW3QAj0SMOKe8o~~U>-X0s-!N}v6S4A)$ z;U`np<1X(5lZ~@mN^h%li~&0Kuse~)V)2|ta={yoL+8H`*%g*i;#@uz z!R7lxN^fkGCpW#nr1RW?mY9>5z(cO4>b%aZW7=p(0K9Pga_NGQy6;+P>Xb~(S? zl*$!K5)S((gy+b&1hg%3Wbf+k>QBJ5vZs70#WI4Sb^OO6Nq!VmIBAcf!W{XOOk-uoP(iDqc(6t{)R!*G;PQVV2^n9n z;pkg=v8O{e%xf?h#sj~`!u;T5lvnXS6@H-M2D% zPJ*kZqlv^-)4t>uvTrHPD_2b`K5f^xb=d)smMe!ElRl^Ea`o|5Z!ne*k(9U)H5@X{E(A zo%v&MLM|`9FQaoH)%y@p#Le=jJtws|r1!c=COnhX-Z*bG(~;2AlX!W2sX)7 z@pWC?-G6o>r`BSF_uA!6BnW3-ca1VTjMA+FN}vn<=k}eMTpF(Y6GV09^{PQu@Yt7@ zp+ab$BMp=38xyOttxg&|-Ph9XtLf?xo6P{IxBTDK;*o*TV`{Ocb9HdVX034f9*Z;j zomY!Nl)W&bH=C*)cB9LrH!s1Vdh>{KtKM|x3A2st(b^$>z;{{ABm0xW(?ul|Ap3&A z%OsLqs=YoJuSS9KcxnAisJ|MyQm&)FTqzAye+8P5SMriTeLfKlkp(`=2hgPYa^4wMam@ zLoISgr51^=z(2$EUS<3Ii{j8ekC0@zeO?f+Mu98Xw!A(BHl{>IVAU(+xiwy%*T zR}WtXNu;dJV(G6IHSX$lTUu+HJN|XjHH~p=U)z4f035RQ;;Z*DsOsE>*YOTNd*nWT zsl1~W#pB}4%#-nAc6a7K#6w=jKO~9p41W%eN;CXm;_KIqkO5jT`;*2E_ysNn-eUfb*c139X z3Tw3KmyW;wdW`IkuV2#ZufD`l>#sii(E6p0HPJ8CVg_>NAEPp8u=`QbNFCFN=4$Cx z{lW+x)7$duD`xZ2_M+ZyhH~AeW6IZo%XMHs)WrpI(pD>=2J65XIcFNF_?;Pei4J^32YS)G7pyY_8|c7Wbl}wz_@f#4`^&XOh}7MBC5pUIw{GO8>ef4X z1dHmVy$c;|mzA|YHKVbr+HI2384!i>35i%k$y{H$WIfU}v>a(lma-hF-d!z6aLIDS zEJu5UVA3(ySieKzXH7 zG*y>QV(Rv;hoii(QaFm9S^X}!&!KA0++S!+WbHJxIL^EarAMAvujM@_4ByvPNp}sk zbhjFsGn(=80^TwW*CvLX*$tb3+A96zuh(%01vOs@yF$5a=6hr@M6CMwpTK;NZ0O`X zArB@N3Gcvc52kd~*+u=7K*{g{$1(dfAY^8`RbT>`$Unta4fC7Pa)C6adi4q=?;kqH z-y!MSPf8XIKPTY9Gb9Nvc8$q?e+C<@e3}HZB~bTkUn|Jk!?}nSj7d z|HUz=22u2(-18S`J>M?$e2cW6FX&2Qx$U^?k7nrk`i*jqyH1S~$I{h!_|P=$%0|)q zr*YpASg!EQMa2F{0_Ch%S9bgsIrGazaEacH@=&$R!JphMc6(ava;NMbo~BiaAtl}m z%T@m;?LwR2-6QLd-$-t>@^zJetF$J&!%DnvufoLYhe_uq9m(H%?-a)J98S@SPC3?9 zv^^$ygHkZE$J+L8#k9M=b?Qvp4Ra6e0O-vEb^vS~yRDv&EAVSp@CVd>z;~Io(BYM4 zhW7)OQMjxwZr;JIupf{ay&$vJ5gAVB{EIk>U%$tXs`O=}qZysTyFV2=t+Y9CT~Ecp z*6}G2c_*a*e?c+swmR@dxe8Wl27aRh&(wjhN#H><@Dm+)I8!CNu@`}5X5e!=@FyL( zO9Ewj)Olv>z)Nc}DBUlismps_6=KDkbkT*-xm{nweV5X#R-)a3v7#eR+AmA#+)bSz zu%g2;F435+G0xph$A``(bn-s3Grf!~DWL<9NWoq7N|#GRYEhA4y{WNfMp zy?DHNoOwvgn~c|f&@s=&%iQ<0?RMsYDmxip2yKQKGKFK2IgAh?S@rjeMW~VbOPL=; zpW~^uJFKfo1~H@ywCi(tNzvK^tw$W0BT9^A$5?}#*^uwy*BMfJ9jIC<7_VoH^HeT+ z+v7XpWWU8cu}C7zJh3z|jDq4bL;D2o!kNxyXngg@(I=+1_CRx3Mk+KeVn>X4?-0-9 z8^DIgug<(b>7?|p(txNcWJ75*6V`R#papJTLEc7PAp0MgDZe}ON{BBTADQUl$9pL( zm(zI3Hz_K6UH6n*k~U?n?CyI!sStgA(sD##Bx6zQ!`J1}+X&UZjGyuwrC4<-R`3;a zU$u-MT_&A=3QJ$3-^@~Goo|+K2bq{9{7IECdkVI+lA?pGQXG$h_ZQ{Q%KMqempAK> z-O2R*J6;X(ukHK@^Dm59-I9K*GH4YjILcgszJDOR%jPe`t)#YMGG*}$H_`Wdy!(tx zCn=`!s9OaE`4r4hG{$4|MnfHVs}9^IfuEa!e>|fw@1z`oQBYQ-emG*kkZEStE8!it zsSG=#>^40HU(%yBkwh3EUJ3ehg$|k}!&7b5&`Gx8xs8;n-e_D!h)rY*^S>(g8{Z;k z){qE!En>fMEa7^;u@h6TC8A+TtO{*vZ;AaG^wOOlT0{#ziL--t1|HMHFaxK#pZEjq zcnbT8AFCncsHIRt`-#JZr}+{)=RDpzEh>A(>F+BZ*eUV``-%n~CR3G}~rkDMdZbW}+uzGqEoDRo+Z2Em6`*#m&U8pR+a-R}m$s z%eW-nvxc|lN!yFO7s@y&-ed(l2?LcS2_Bpyt{>yB`np=XGp7MHi8AUu9|M(Yi zwEV-5F#oU}fC!8()BK}fW!Yy!jA9bAS;Lw8g?oI83;df6AY;MPNFm3bR31rPRoqYc z6ntayj3OQT67mjC2#-(m{^l?b*P%nL?bcmsi%-ZJAG9W)+k!kFTxi8grcGSnogKNT;}>fn-FXZa=B4z^FZ z#q9j*M_2CtPTm!z>-5EBb-#+6#qy4JtJ0O;6+CM%SIyGoR&=USLlvx9H}YO!HhE8# zd%I;i&?{ZYontOmmJmfwxV2Uh9PjH0Plh9u6f7o!;Uu&Qc~7zTllNEjVtaqR!`&JL z_p179OvV0sn&RmG`nI%+{z{YnYE)qL*N%h7>#r54nb4-hkf5!3J(A$8<{{l4s0C3eOfNgUDz2*bzpiK(ACm{WM zz&runmIGD_$Xo$fE8s33YYIHL3gBH0nEC_YlQn>)KLWO`1?)xl6sWTSaKT1E0|W4y zfGdN5mAe49?gbe80bLFPWGxkNvt|nXdKmB!a%d1;Mr<` zj%;WL4hqhwNfXO9*1IqwCmjePT05yI9G+zt&ay{Vu&48f-ng#*m1+3TusJkD~w-oSP z8Q`a*fcSF2UDc~c1>Rr*8(3Epu$oiuf$}rNDplbjRy8w@O2Tbq) zp6dyCy%%8G^?(^S0Cx8QB;5qa5HO}c;1vNs+zN=h6VQJk;Kf0JhwlS;9t2!C4A40X zaO()b#8H45j{<&v98hZvpygOVr(D3z`GC780EV(82;A=jy!b4ji1k8X=j(uycLCL= z0Wt+l`w&q5Q^3_T0RNr?Xj}+*W+9;VGC=+cz^0!7O*a9q*#dZLJ7DK;fP*^$`?0?t z*tH*ElmfOM2K;*pz^;JX-GIX$z(3h)3{1KK;Ohq%G!QU$2;i270Y3_8m<4Dp zz$IX~fTsogTfk}o<)Z*sJqE}g1DKu*2u=WucnT2xEZ|}R_Xv1fz_$V>J_lIvJfPr3 zz##!GUk1GSI$-^qfF@G_y#)9K6boqZHozm`9s%P7ye?qvRKNiN$KC_fdLPjCLqMmG z0o|tqwtWT|Isq z9U%WF!1B$2pn#YyfEEHe3g|0fn1HXg1Ii3Q^#Gv0fU^YL5ClB43();{z#oSJY2^T4 zbw^a7v?kz=x`2&wfRRlA4gUdn{airV1%SI+0Y1JG;7tXrP6IsD1+ZSgyBUDAOu(zx z0=5fCz8>&lAHczWfIII1JaIpuY&f9H2*7Ql0FOKhctJqF?0nMfWZW6GtJrnLT^6NJaMg;Od0ZjQEFn1PU&6j|EUjrU5 z1k@}7JSX6s`GB&8fUPBf@0P|y2%P#p1E&XjiI#7AU0IzJW+fm;8t=p)8T#t`9_Hj1 zM-SI)LH)Ks|Gvm}+Qc`95S2Zp-g5u{r)E((k9CjAYGQcDaO}E>iziF6Vtl!=2)f#u zj;YVAc)l&3D<2$RGX@lC<-{bG8ODOOu~A+zQc~Vz)RRr3@-}1*WR3DqvPsXG*YXHa zqOz`c`TIqqXmLfa8#a;y4Qb9?J^uThD|0{{BcC0u^BFEtLDW~!+u_BkFHAc0-kRTQyNM6n|lNC1Io$Y#NHUBH4B6%`ZT}Kf5S-s>x_#r+=DTnY>=9of+mecs|*7jDWeu0o5WxYXvZKPMWKo))v5wBk2& zmM1AoG69H256s7%aLKFCRKUO9Iql=z$hbZ@^ZzRGF}ZCdkvNDN-)s zPzh)G_e_$64F8va|EmJBh8jYC@&JO4h;A=B6Va6RDmK!s3u$$UZne=*?CvMpv>-&g zA4IzzM4O-7e2XnHkBBx=CtAcPbweddv9y%N-j8r6EO3|LYb36wwmqFcL`Env{XCEj z+q}qHr8sNjh1iY~5ZI&Pi8sD1B1i}BAlQ83Mjwp=#Eae(=Z7H2lBz_*+e#~>;dQto zflvc7_C858%=U@k{O}~PyP9Nk5dVZ2XU!;=~VBZH3jh0(UgnqKlQx@9@UzNsj0BqfCHm7KISlt7#E| z-ILG2lSwp2{wpIR&4FtRtdlvY9m#p>Amh&tw1xRdy-{ah8)nyv>XBEiOH|3#Fx#!j zg4vD%C`XFEVvg55TJFVid*WWZ(tWQwV8{PRx_cb{$$~55i+94xi=eb>^a2 zv^&Sd`V@$j_K*rd9EE^yfcWyS1`rWg%^0E3M14n@{RcXhZ^U@CPumZ%_CDya1jiPK z6^d)Qv8l2$EO%*z;IQDkcGphkyNzd|8WHT3s1uG}>#6<)1HIP%$waTWUa!&Xs?8PA zYme{#kLmTQuZ;BCAoKrYb!cd>Gc=1AB0}VaATqA^(nd*AuPQTa~-@+GFKSu z0PXLoPhwy0fH9JQ$=oybUf^2H{|44i&vVf@!DEX)Hhi=cG%1eD5?usY&9EJlsLZVL zZMiuYNLKj^37Zulku(P!k7ys83hA2Z2x9UX zvE^NLTY?0gNzo1D0=St)%s{SJjNLj%3Pwo579bd9#S@2?8N4>$i5`fA>Z6QL$aRj! zStxP#lq8`tVtHLoGs}B8{QjJE%na8|DM2Igfr;NO-a?S<7gN!&)pd|q-4tSV*qjfF zZfL_OV1nnDF{3-ijIQ0MD&Y)54Ws|W5DpiV|8<0_U~wUA=DetfU~F`n^(Zz|q{@73 zN-t&JbzOQY^Wu@0F+T;K{^}_m_ojMno_ebbiPGl7u1eeVpZMSE8RbI>lOBdZ##{L- zaw}*0w0W35Ev|L8xb1dVp*^n1jxzvtYADX5sHTmFXgRRtVDlKevv^nqvvGF_AF{iva$i&6!)ccTd?YO;B&0M#0LA)f zJSQv3r51NOPK;4>9nzbMG)ze{62FdLLC7}fWe_dKkAv%%wWe~fk$}%LHJdlnsk7)$ zzH<)#P;ZbI=I~!vN{(oGgc;P$>vaY-2W*I|mITp7a zs$IR~>zYOdOh)Di44kVM8mGYI zu&Q8KhH+pnd8RV&LGKh{@9cpo^Nz!lvg9Ws4(BOoJ~@bgPCP2bnmkpkAsy1@*CDqf zKuyJfIBYle0pL&mO!Ns{(8`}np=_ScM?S!^uXZBf%Qg6tmgi)AByPf6S~h)&iabt< z89r|oWX8m3+-VQ-$AuQcVC5T#&+0siO!R>f_T>={%g)Ntk)t?kVH93s=@sK5sdhW7 zFV~v5N)_?C5QN0<&WqhPngAe~Aa5xlKRFGM*FG*8-X#R6T|Q*N#}fgdlW|Kt0G*Ct zfG~ir+@J&cF8a{+%@2@?v&4$0Y|)(?lgofSv}xHO*c|Xb8|ao9U|SM@{cHrdx&|Hd zR(jwp!3kmUuM!%Op^-u~Qou~KjN3R!7b4K^do_Ai?L(3A&y7}`e*z*O_*T-wJfH{% z*9yh_JXx@UaOT7r@nHqD{FE#>w!mcfP{fo!UKy;mLrXB-aV?@!vQDL5n$q!n+C@-$ zY>B(mc3WM4q+soOs^7kbL{C*if)5UyZLc-)55+MRzfJ8SzN$@BY8|U@r7f`}4XF~g z;kyyf6KiC97T!0HN_|M}0q_4Pxf`nkiW;%PKz8N*`7`pWR{wPrwsUtnB<-M|u||aL z1Hd7Sr36V-_hJCn#BDaEM+vqCTeMIzdB^b2merG@>T&RGAO#IGy&eQs5?9ju0tOb=&I|A zLHi(%Ux(GiM^uh~K4}pU4UWGj$*~q3|2#N;vE=v%u(zbRip6p)7s?LPcqX`a>r^eDnckl#`WXo+riG4MXt4gAGiZboH=U zAWS2;AJs7@K)#6WC8@vGH_$hX1?rYzI^vPfpf-O`XV$z%`&Mq58a3~ z1t@5Qy5_1KP*vKm!twW3x_o>nM`DVyZ4v99(nFb7tz~y*UfrubeU>JBMmKkyX`GCF z^PW4GdY-2TrN^Lo)9q&FP6g(Mw)RLMkGLX>rZCMR1Re?d+ji86ciNxz(|vdSYSR=M0BhwZ7r9#;rC z*~0&CFA6xE*H}WV!T^Y3*?J}0IX-eLQIDa z0>F_Htm>MuvjEH6;b0m7Eh-_y! zObH9-U>zSxGvDtd4ktPGf`M)W16`ide7VX%aUxgR`BJiw2J0lV4I(_o*>Byk()>gQ zGW1J@Yb6h<7Y82l=l+1Nh?#sv%;Z`jmk4FV4vQ4=^e)Cm`m(Ut_@n^XkaH(Sq7TVU zXqos2t2h%d0`G4i0h1h@gzF`e5|5d+0<*F6A%cx@Ew(11agu`VD3iv{#?1k8G(aXO zZz3p@XGo?guzWsQ@R9{EY07x8#|bBB)} z*AXXG5)0BG*|Kb$56Kn$?8Y3OpQTHoc*JOvdK?&tT1;r&%nsVPQzxFZDKlTQ;r z!tTn)vfMGP4ZZ}=IwU*;tyjw69>;2*QPj$0v*S~UwqIxh7+ zg4+VEEZFG=)5Kt>D@I8kN@(jV!){lalyHvtyebA0&$uu# z*y8F}Andri9vbAJCHle%VL*UOpY|74NmNld$4N!l?%n+gbeME;n3y=9W2S>C-i4Bh zSFF2R!NBL^o_LID_2RH&ICaadEOodEdoTfBT|6p7!Srir*yO*IeRRaErI)+Y95^z6N80>`3y`<3wfS%;o zjSUR$ZPox(xXl{C6AbqjpqZwpaVH5CDR!DYLzR99H3rnT?DW4Up#MWak3<;({k7!g zVSvv5oq=ApFf7oAb9JDXQNL0G#>haHit}4y>RkyF;t_7sAOLID4Qy~M0QdFCVKc^v zIoFZwJVzu1Rs~j7n}!s78>&?aBUG~^YF20;reFXHsbQ1wE3m4-2mJ)N>tiko5U&<5 z_WcM?wHk)ui!FW}M{8X9bPlWozWQzf@!(THWfUDI-OrH_$H5OoS3)liWwerf6gFZp z4i;YRn=5u|{B#7W+C9(04K6Jr2dE2&4+1t~ej(Ij zC7bOZJ_Da-0ehb{ZmpdzMk3R90!i5A{4unXxpu2iIBo&Dv8oGM01oMb-crN_F0yq3 zhYNb9bU_EYENbJ9Ew%(8=x3L(WkB>OkEV%RiMs-`&L04zw?;(6=p%>mkZ~9m&j-@e zyCXn=cPwE6URtEY%9k(;GkZ93UU>hkSgxBKi1J)RA^UG5;nN z2W0w2D2s}N3|qnzTkvBjwr3&h zvzhHV%dtH*{|M)+2#CjO1@&0wAr!+f0@|qPbh*vbx+nTf%2-^ACs5&b{I9P)l&c2f zeJID;OTC}a_0<$|#Eq8TV7R~#VGXJvkJ}FV71krnTx&yyuId~mm zMmHS5G5{#Au{h2m>Z%51j&c>r99`0Pm}`sMX>lY*DbCyQ(&{*m&sOs2j|Ts&RyBPL zb*Nuj`EL<6p?A5Kiw7rjXb8Hodq%1LbtMy#vnm^}S_8ju86?&S-DD?2-Y9I+SM4_iJ{V{GnZm%Q~KJQy$A3sKtPmoaY&bbHfk{AIxnKytBh*~%3#}q z96V?|B*Ip3x)aCtpjZr*4_SzkC;7KP?vy;}@&Jn2zZign5tP2;t-=J~{-1b@6id;z z)pdyaibG#s91TDpksvX}*iUdIW}*{b7=9$?j5Z=M4lGY1@pk;G91^cY4cWF>*p|A% z%+Ok>M&+K)4KsknT{3fm^C-BTXz{D$Q;30&0E>?o8n74~x*7A(tt1{X8jXXP3J8yx z=*^2W0TJ{PZR`ax%yO;(muaqUMMr$}m5Jtz7&|HkG5Y95SrSDcAH>gO*D+X>kT&tv z?Re6@7Sjm%D$7hQv%9I$~Iv63&Q+MglYMB5Q|=nXmBEwN*vThj`FF78Bd3 zhM5;1$zftYXM-X_F6k799LK4fJ^G~^D(AqOX!=jZB(N#XDUiI}SB&D%VpUe@7~ zcRyl+_fm&?;gBJXcUjY@q)3XNf0fayJB3||zY*hFGb&OqmuT2N4rrJK=Qq%h^%CuH zt|IU2jHN@O4|-P{#fAgP7Rf>luIePnxGc|YhE@`mji5i_TN@UfPCo>KGbWXo7c?~D z#5ociaN-jDsvHxUj~Xf#MqbBQP_kxn8FrG+o5lhYAIk7c=Oh%1ooX!RXM~opE9Gh< zY$0iQ;P(U!;-7(XI^#hx&U6)z zLECCjS1go+lA*-J#8YTPpJf;ZU=Xnv8s_=_bakHJqLgVA#c;D;C22lJ4XRNCUnw4p z%?0sVrB2w9D0r-@UWbV(Ab9N0ak3Mlze|XosGs$#{X+}Y&my&+cQyt`5#;adb-17N zWC$b)Tn4GVitiyykQ(w8M#k}I<>c=m@~_1OtL3ja_-}Qc6OSWAGKuUDx^2N1JN({Q zgiIV#vi9)Q)w}jf$m8>)2tCrXiPgh`>8~iUF4i=8E6mLDkU|%H+S}8q6CYC8XOP&e zu7E=d_BiX*z6*8=a}MR*E4V-)tdMh8?C%yE31t3JdSss43A()bU442AAwb2+d?@N8$r8=>NO`X#YZ{TmKQ2fduTWfS)$6 z8R#1fQ_grO$E--lq@us?jQ13M9Y5U*5^tL%l;S#m2uFIsbZL409$myGAS z(k}ypf2 ze5w*20oW`cMc5I|pby9KJe%^uo*`TzGFRw(B~~mSAq6#;>LNFuK0xmZ`mC7iCc%O?V;hL5XU{E5fiWu8@Zar!6-?8S4dm6)PhO8-2zj+Pk=L7XCi0^6+2EmnQkox%2lbQJIU=vq93je9;xOdZ zIoAMXNb(x>xg@VU5KN$x7wwIbyiVh;_6o>L4A;qPfQh_9pZ8PwUzX&5WFr%~@9R4Q zDD1uI1`6wsc@WLVNmHa|F?^5cfz4EOJUYC^Fv#H)3T#Bv#Bj&hVX!Ob4&j&OioH$@ z1;)jms1y7PiaLsb3O`tCn4jQO_#1>*^npdKPJw9nxQcJmu&RSnq?v|paI2h#RYj5@ zg>yG(hAorq6?6zt+PcP5&Z16mlatE5h3M`jen@=?`*s+*Te-vl7wlZbnabO_d@~4; zBVr5MRqb4K0-U@84kli(>o{NRP>R*3A-Le55OfwZ?{AtnF->YgNN3XK4p4=A>yBK%!pnZ{s zV26f)GpnblCsqT9!Ruylvdc;bpOnAzd9y-a{xhZ|=$%+Z(^0P)#;L{i7Jy)-{ARL< zCE#31>Q*(GA{xlJ=0! z38)O`RLxw-2!G@KuwZ6?jLy|Vgs-9x(#2`b&LkP1wAadkRU`#`;tJ;*t6;4_8M*E} zoy(pCSS?ksW|Kt!qEassL)e>?Gx-7YoKoo8o4e;$MN^jik7Lh_SI z(uBeQOoU@smQxY5aZU{ABSI6F)iMUFRnhr40GR zF_rj986F^?^2T#om&8nl z50!!m@-aprh}+`?n=Vzsq!zpG$vznrwICADVG1h{cn0BZ2x6^8l6njDlLhdx&Lzf ztqX(*De4c!ugY!eiKwB&4&E;psI3JT{m%PKP;}&vEgD1*A_@IU@2{1BbI_Rr^Heg;Qx$lJ|3fH;D;}d0vc;#m0Fi* zZV;Pi=u#XgLaruc$%MzELo*I&JYxuGw8|7@cF#Lxc7rd%9(T;{`pq79TyukLNA zfSt6V)2@c|12{U{;ToJDxGpZG~X)?kdgpHj$5W7 zrVO=_mJMAgnNQMh-1Ue?k)DuZN8`d{#u121;ODYKKPW< z2+=|XIFNc62U6h~Aomd*a5zZ2H5mrwZ$ZDTFcQU>6vi-d-cYrzIG48c8(u$!lXSKa zA{zhXo3wZ^cjT*?MLOdR_fUx!i#rI>O>|>q?6+A7a`jTo4iu_vX=+z8 zB*;u#xVwrE;hxq;Lp+WG#Kl$=!ub4jSd55f zvw42ndcw|6zc87u#DStdV&Uwqj_L_ra#UQ;B^EnCysx+dS zpb}_{ycDkOL}3H#GL`r-bPho*Y@c_6F0Ae@VjTO@y)@2Z3a43wXP7ZMze?E{QYjHj z#Z&`6B1*qvV^&X!NSkBx{73`_x(skew11t3a$3{|`a!tV<1^Ib0@SVuGhYsrAdq0$ z85P0~iHZ0TZna*TJM7fG_Zqd20n@2KURp(W$+_@$VQk?vAm!Whx+Cs<|CdZRrLTnT zya_s|6=dlB0kwC@(cVPJInn& zy?3M+V0YuxM>rfqf!7bgT}^aMGc_5Xi0LQ*QQ+i47@`pSzF-8Lc7;X2l@RE)g>%%< zVN>exBW}jLXyhSgc@SeVmVYa}oh+=$N9;S?a5(!HU5Yh&Hv<2I&}$##N|c zT>GtL(VDTiZxI$a&NalWr^uR#D2NO(KhI*sY=1c{VyaHo5wpe6;UMa80ykquOb$nd zNW_eMz<`+RP{ZVJ<#23V99|#SxvPf?Pr@$<2s%O9x%L5y&Q6Yx5q%ugO1+P7M3%}N z+|B60^&gZYNDH43ODTW`xR*D^GkNiOKCQ_6;Xo)s{$qYxv2Uj?kdZw)$ao$#jAx&s zjwdIR$I~d}c&-mOo{J(HkN-@}-F+?N57uXE))wiI`S~frlae(Fq#)X2JV`Db2Z4VC zNb$u^>_85{JqXQ5j?aV>$l!@>$*LspkiKT*q}2i|CU9)|g=X;NL$c#n(8x&Yz+D-9 z%!fw-Ezwx+?cE=q7>}oz_kL-|&S&ogARq&F5&eahBiet)q}gMFPMSsVh>_(RQy9R^ zAAOaXId&NUE?^Y*;!S7kF${J?p zhI?QaSpo;Q-}QHZ^s;j(0kIARkCGruGje&5MfaHuZ(nC5@TR$WlMwc=Xe^q8nbK`Y z58%le)Yw$%CMfS<-p9gPF>mZWP{~aHetPSd#1z*M^NOXJB+vVO9jc&xfqo(x5<18*B4vZE|`Z8ZoHrH!v9@4GXy6P2;=YC{3#=Q zpF>ABa$|)^+7|N)Bb$k9m$Mp$F(7P{$`pvcjWBbl);l^LEj_D%vHF z-Wg1YRP)#D1Wi2!uQqLYyNR4;^8;^rVIVy52}4-T3}FbzUP~82cto5>^QvPnRi&jv z;tOs`4^~hedzz&9-rX2CZFqD6k|{ocxRs=xv&WT-Q;Nl81TBJe2H*t8x#LRxl;RQ3 zT0A4Fn)6IVLMWdQ%~6iRAFnr%2=g6~$8;2O^Z3M19rThZBg`^f_%Y*c?RcFsz;=F= zY$s5LJUkI0(@^qgFgVO7+E`;`&tA$jSZQiVKqaj?(LP#ji;03S=4OY^k{uw5exIo? zi8788WxRnB;C5JeMzeJ~LwF#=1YroqS{D$4K*b(3&y0o4{Dshq z`yA?XAu4LG6W@& z(aRSfGK33WG(i}GUjE3E^fDLCGre%HMtXUGn+roPDSg!OGH0oPUdYmcT&cegtN(lY zAEM0*1eB7+*>AvPejkRMY0aRhTo9YddJQ!zy@&^((zYUPmc`J&YDQrgyof0R9g@Sg zBKT#i;ihac2@Y?(q)BPP)x=tq5CoJv4of)3z5A)3F0#?X zQ-hvUM|tT?JdG$^U!P3lzJ3^I>g&gXpvv`Th@u(_h|pt`8Bj0nDj?glJCP5y@*T4w_2iehxfN2FrPmm>GzB7G|xx<5IDME zTOrnl?E^-_-_Fz|B7~cU4KIV}rKj_TOJI8UeMI6b-cVp<3SNlLaOe{`&SWHn6JcL^ zj|V+vOeBN;K0}h@E9inb1^QK->p>tTohvP&zk_PHM~R6`l;T?XK;c*JMVidAk7PJl zN@+71h^pb`U#kn5TQ;eubn|g!2Imtrl_+i|2OrL;_juEuKy{a9Wrm8P>}eW>{TiR@_Q%^}Hrc(5vYh5G%A}$8O|l zzQSIoacUxP#BWoa8xSD79EV7g6Sv6t*d6x7f^zp1ILSX-QiTtCl2m504~GwZ1L)$T zcX)p1jMnEjG`rdGqLC;YbfeiuHs@kL_!Fav^ytpVr+DI!_#ZTSLL`>fl!7p&tCNnQ z?Z1LqJ_I*6amx2mEN1XSBq5at-sVA{9Tmx-n_$qyBTu4vCQ4lX(FQ-n3~ogif+=Fx zOjEBz_9KDFRhTob76exM#+~dPX~G8y|);jUyY0epFfW?5`oesfHQR>3h;BLZl_F~X#l;% z&6b-m_m94B;7p`xiBC~t;7nmQ%Dq#0(5KQO8FWJonuy>iy3je(&lkp--ZFBgK|G9# zsL0k!=S=-kHFSKWfqrg&E(raszUtpeKM(NL_4S6PMluziF-H1Xe`|&G6ZK~>`uS!9 z=%)qT*#4c3>1PN^BB!63Z!rDL8xhH%iy(y({melZe=q$s-F3hhJFPiUjW6{|l7=p~4B3nXKP2`L@|KH>i0AOW ziQC0l<_hF(QXWr-{|g4{VdNR6167aU2VAqrw@im_a*M0k+?{Gz+yiRFSQ2sWZ=Fr) zeggI+goFs%YQYP#}Z^+`?1zCJ?+(&MR^Jzo0V<*f-3O3KD^aSzWlC8NQ zyiNu1FU^$xC7{U^R=WX`Ca8cnyQ9HTXJyf*R;v5!pEX3%Aq4Z6BbLt$(O~~d+Rv^W{}EH`Ck21@#5{z>#t zrcAgPKy2zdz}`~*y>*%`|4$gw{dxg1aMBL^P7_)Sds3UyT4+RTL3$jt)euFVWGO}Z z&E6IF*UsNxR*?SMhUt$&O@j8Pou>_=?_6o@hxMHeS4ybRA(2DX)6$cKPc7;Lo68a7<=@tsSmsK_JPpk6rNG-am@QkSOe48|hSl^r$zeIO4fsnDeF zY(ZdTIeq8##w=g_f7W-tb@Tk@4Atj1w7#?Jc_UHA-$1h+k-lRsQS}|VbV2Gnm#l`& z^86I0Mdv#x7IXO_5`E{)D?I2r5e>RE22G+$b@=_6D7DKD=W;7%Ny9)>GdlrTRoR(F zG^OS5i%4Fb_-GJ$^|ppgPyaf7=SvskbK#Sb5W%)*jYQC_T>xh?>pOkCCeEblJ535O z_i2+1oQdVtA5dc8Okwn$lP~k2YeY2YRv0u9K@?p4I%oPj^qpsT7$K?X!CQ3BBri3B zk-F)b;QYv-@AMiHgnll$?B7X0Pfg^h82fl6^z#AaaeZgo(WXNBslPuM{p?u@`neJQ zaR1K6^fLk_k<-tQ6L`>hk3}+Q@wB9$9CY#b(oY*6Mo9W;24PRz*^Km4PT%=%qpI)J zdx$8Iljs)2D89FlKrVF<>U7 zKJ~5i~`nN#|NycFTAJ#jUu&2%Y(Eis4GW+VWn$Xi4jAmI>tWn=7Sk+ZWVI)-JJ z)IV04UHD2@ncsjQW>HnbHdHLHJZ$1aGEvTG@DTIPY~C&<%#&Gme}Pv_3|asa-|(>qm?AaZ7=7%d1f&Lk{NJ5(=uV_&3=A} zM44$V$Jxa^&JYgn!H>{5VL!^!l^J&4>`y0X&0>Vvd9(R?EHc(-g!k)6^ci?=hw?l<%%_UXqI|Ir)G>sv`0ZN=cS^zw`H?@^NqZep zR*RJ)e;iXo(SS&(;mpHK4a|miiB9m}lMKQK^vMA$54`olufWKOimzs+3@U&E&5DkH zs5C?lLKz9yb|GkJFx=ckLmXK7DL+IK3FjTl(4FaTf-XcP+?5R75%DLQS0mxZf*xdw zi;uV^osI%hTuf;#iO6e34I_Wm_>bQ{N4NWC-ovEx9K?Nb>Lwx`{}sNel5Bn_0t%b3 zIY^cizUF|!nlXnTz%pizNbt3&LEnWBOIRU37{j>y<^dg-q0MxKgMkl!Si&V& z5v3GMN@>BALYMf`0nN%$3J3GbY?~MTrc#OwcfvIQoomhqrQF0Zsz}#{i4ZTyfK@ss z5XPRj^aX~l@O~3?GiB^wpnd=Ng9OihLGiHa`N5Y}N;xRfxFy{r7m$tdF_K=%Xib-$ zhPB7Ff<2DU{~-i{gsUW^NK8i5CDsCGleW3ibCSlNOS0e77m4wp7f@h_GmbO`(AIk$ z)D4TstBCIzdl`f!H!R9CZjIhyj=%&DHC#kM_k`hkXk1N0l*adqMJrD7J};#n+mWCK zA43lE7y4pX)<7ojfz-3R`h5I`OIs7=%J2aQkATrb4>%$-M~X^w=ui2ahJ0yNi_ttY zH{GYtOo*h0{Rc78K@LU|GMUxzon|P)v)r}nf#48zkanxLlO#R9{5Qq93X&t|;!a6i z56Lk%rFpJ;omPx~ofdpqoH^9B1CpbdyanW^I0OCGJZ&X z4D?qqq@wF6hO*DSVWCVL2$0lNf!1__n6l@k)+lL1zr?AL)Q}-KRS?ywh0yr>_;&7*0QF+d#n5Zam6=E479HllP$6zcLfyG_N z{d|nxtteby3j|PF(g*aI)*Fp>NlS5*`ck_g{S&VGzXFq#Z*b$ zhRTcyU_@~mqxV=p19}nKOLWKkr%5NdbO0jQK&z629T$C@#1Jsvo*)`D25BvWr8V5x zGc^~%H);a+0!mF+yEa|iW5Jcgr)Z6qVv%c2iT;~ambD9|KpjZt{<$C-2Rz+GGHXyQ z^7w%_w=g7ASHjdJBAB{Ds0O6s^0CCS4pVoO|BE)a!(v&gpJtNgOTZDwOOZ=bRN^?^ z*%1DiamAxv@OZoCs7w3XCwK7vhGUKCU<`AsV28nZUOV`|FSQp_z>^n70ko(FBjKsH71Hl|s4vU#$NGLMr zmovnB!xwx1ccg3Ll)#fXy^}-+0thh9C{o2vrS>OIb2n4XpbMiK8F`mp%-Z#GF@ua% zt|F8EB+n0o7lZP}ThB8lKfhDQWavWztL`&*eFw1bTDW=WV74k6BkIylHd3_=QP(YF;wvvP9 znXRBt9MM!s<*;~y8&e~`O`HW*D5jHpST>|vqUw9^B|7mZNYH!%ep+#yFBoC5d3xS# zzC79vDTN~@UDAZQOh!zu(IX~tmw?7t@rF;|IQ+r(#IO zvS%2^jkiYv<4K60H03|5ea*zAi41OGDq$sQzC-{AahP_Hp9R9T&(IGKMh*U$g5N49yjO=xgQ*CmQ^XT;bH( zU|b>kYjA}t5Nm4Y3iqQVGOqB^(+uDoTO>8 z!_N~C0OqNF{Z}fnB=pkvkA7!}QvQMc;}MupFMR*FXDB1`@!pXj(sieqQdV8^H&V*l z)xjub_ZOg)V{i+bDdl>^nMOt_X-_eL6K;zHz*&7HrDUM_V3g8|8>@&?F1yl9Df<3l z^e1cd;^!|_0Vazar;<(l<(kreh`+SK(f13dn&wY3QrlT0L26%!-5ixvk)F^Gu4!#Br>Y$`UC^m#}WyE!*LvlwxHXd2~IV~AE(ADqMBkU zh=t@YNhW{6Sy9+sXDoG3F=J7(j`2pH%Wi_*^c%V@GMy+6y6y48MAfD&n=Yq)e%n=S zydm2lyQKuo$V%p3d?4*NRx-8tgI}%DTV(pBS4ar*`yJS=Ksi|A@-1;kE$%2w9Vp&K z>~g3e#X2XxNn}O#7-jD8Db9W9*t9unhGtU0rS=gzhj+es@G+j>=X&b%8(PD9-DW1> z4fP}e&w|`gX|Z`WDru{MZpzub(nP?M@ERJ{`57SKGw?I}2{;WeM8}~lP-V@dc?qj! zjd_%Tbf-iDnJ6CUZX${hc9(G$Ggnwti|5Syw{V4}xxu)?(di)gJ&y%)g{$C~ z#}bH;D?IWL1DTc-36O6?f+eo-EV{TLu5fBF_g2%~TZnZ=^0LkqhQ?6e6?28RbINgr zH6H;9vSY%wmB1e0FHxq6`jCO2K8sC1=7tNcvLKSYMBCc@s;__T!?StXC z!UEJH^9tD}h%4x_WkvjfETGd7-l!R}4ju|EFBBN%1=uwzYZ5oe3$q*lf8q?+4`MRz z*2P2^AvnXskl~GHmrttmy!|gYgKEPed12<_V4Pv?G!Xr2c#O^RLJY!FBj*ga4P+qu zca8+e^d1D%Y0(c|To7mYV*vMdsFSI;5Nl0AZ#rkVvl{hXF=t3$RE{%z{yva26LFV* z&LH?95_zGG9BtQ#M*9%NbK(q%m=F_Z5dHmYoW+{*^1`o>Eop%p<%RF{T7GMm^oMBj z!gMK-`Z+^I{6Li#JU5x-h3($Z^1|Q972dw={}Wee^Z=9awYQi^I0RR)bu)8?SEK(% zt}uCiFs`uV9T5E7L4jQ1I7%Yt3LWleAX5?}0rK&#k}Gt5@B+C)-hJHLmX4<0LU09n zo@fWw0%;MqMuq1Jk7t+T3h%xRBu$1F+s_p?@IxeAp`jdYLPVqO4GEpN!qq^(i7RZl zHyl^UfovJb6{hL6LU4swq(tiH3Khr;91lbeOh^l`U`~FE%~3_-@%EBbE+y?AX>1fn zNBVU^sj?nJP5sh%n`cBdT#SwuTOp#{>KR!Twjo2x=5oom?6|evwaRcE{Cyn3J|af8 z5?}4YTDcqbFqXQqmFCqitd%~fhgRy#R<6V~<`)8y4fW7U1KCQ$nitlJ1@+KMbJ+@v z`H_w#Zmr#2H=b|&foMzntuJ=n?gp56ILfah?>R|?h_N`fM;Z^C;gfP+?rBsbKL;)! zirXfd(w*XA)$;tidHEN0FfIQO9Q6#OT4QRTTh7%)9#|;Zfl*vxlixjxN?J>z$6S?1 z+`;-fU0w6i8{iQ`;fE$3(GkVs8~KoR8psZBZ8+MO!HPD66~fCuqTSe)AAupfat?x@SD3BgG<{-0@lus5`**6g^IzA@RE2lBI>G#?CS1_ zx*CbDG`I=a;dKOEddgSVkrTnl$T?c-a) ze8OY!={p&N>FpxH;72!0430t|nN(_#g z1Pl&=$DJ^E7mCGa@*!&>9SaM~-o@<S|60GX{^I1O_wES*0uVOQ!r84q zvoi*NY8?p%xAM_%pZE@4s2JQ0qq8?TqONY0UD+b)>KSyUQ4X!*Z;%1Un}yCQjX@_W zX)TGLzE&~#EJ`H?Pq=}>9q>dG2Jb_$xC;J#JY;} zA8A$Esa0MKTjgo3O0rs|ci1Y4T9td%Dhx%7POFb(1#{xG1eCS>xyF_srS(nEk@pb2vUXC100uYYpku+~>a5PUuLuDrHsRK|S1?@GxM@HOER3Z&J(y9B4QI!tw&=3Yez@%OV#PU@YLyRbc2{4srGXA^xi5Uh@;YVoZ&Q+i zO9s%<3{wD)Ecv=DE>AZ7$>-p6^1{Izm&1P%xh~dPcwKI5rLW5z90a2((3%5|BKr6| zI-SuW%|D5A45c8Ik&4NQ^WZq7^FOzE_v2TkowVPhlAKxa9MOIj1;HYl{ZYGfkCHW& zoRXf-!zY3d-D{V|m7^5dI1VqwRFn`iYQ)HQO2Fl<5aj_ETY53j;u-_c2z6&XnNOzH z1H|eZu@imB>#r~-#aRvgdS^3Fj|9;}WS^atmyVBtV+6DV#8->R6D%z70Q9#1`~kYGI)uJ%fF2>(FtC7LhMPR zbWb?MzSxryJGo_8#Lm4=N9@b!LmpsIoL8Y!@2lKd7_5?6{vz35Gh=^<%aqiM^N6O1 z{v>p1bP$Y3Vjzl$xdUBRnpXRulGYfFBx@#N(;tW14zGdF6NA9WaTygWwY=E+s>Wc*XC@)Y?=@>-lsnMxGYd zPKK;O5=PKBZv}Cv#^*^s3#_D{C)vpXyi-w&t31qd|6!4;*9fqa8BP;C$bCuInhzD# zd_+n2P^zw0(qs<1*fIy%#pni*+i{WyKE+;EcTd>rljEBwDfMe83CZzz+5zV6i=DBd zK@_reHQ`iUHr(-5-<7ujx8{P(#*`kFFdCl}q zCdh_|3~s;RmND(d>6xgOl#x!Cy`4qxHqWCQU=_+<&>XO|J0%*Qi;2ol$);Vmq~4Tl zf)$a#qpZ;@lazV(C`Va~G@NH2hI1Xn6QVN8 zhNacbOZmm$jHmFCOb->P@HAhzw%NxJi!>wD0?E!nwPTi ziIT*O^v$5O&rlg-SDcTd-a=^47{UgWQ+9K2UzDNh(`wbH(=I~Qr%7JJl>r(``T>~&%Rb8 z%C)@Y2A)m-R61`YN#P7|xDd#Tnold$ow5jxT?b=vw4=zUd|O0^H_nlf!rgCvM;2S$-ErK`f;*6Ii)ptiBYo2|IEt2(uwHq2 zBU-Y#n>)_p?m0S_=s0^m8-Jpdg;2rSusu$1*Q6nOtAc@)C9pd=}(;hqkftwtqLx_FJi~)|)zF0luSVyzx5hxF@l4j`S zw1{{o?k&~GiE%_KIgrXJp?u&}>_T$(Wy%N3lAEu#B%a3s(fY*g6AN%a6sut+uq=BJ zo!(dHftD@U7S98n>ydLX5bkV}%_$X)n9dKW4~Ab5`)*-iPd7FI3oVb(Q(nt!6i4vx z7st5ywEu`%RNIJt{~K{if(l4JQ(&&izoIg z{8@4<=ov;EF=HWJ3s!yaLzjZy+PZPw9gdVItj5=G;xl~EqX#}1zk=j1{rEVA9alWn zv^@fiVoxGt;AA5M29Qum64Q$v53PR{f{?l%QRDRlO zgVL0r$@n-x`5}8>Q2botAH*sIM1u8O%MZejeqU^-3dS+(csbI5@-&Sc=EuKcx+(KIp0zkIq>g=x}nK7E1%ovXyVT_Dl zaTFc($4Mbs>vPn?9w`g;`$uSY#vd%@F;Uj4{{wu~*YQ!`h!0Oa#>Wua5d8QUEemfC ziVs|_L!y^2_P3l0QPTIYiV}j8jXN%X)sIjWc+uYI)&+IH`uE^xSY1DU{&-HKm-}R4 z82o&{v_kyca40l>Mxkm2`1u#DCxl56gT?h+)t`S>!%s(9*fS{o$dxg3iO%k{^`vc! zjSdD~Ov6#dxR|m)SMolef6;pCT$}MR82HG1M#D!dS=c)$KKzT~lf|J?Qllg^u{?!( zL5anG-_gGaKTQyf33?&?+&N6cPmC-KgP$>rLgQzjH#B~_qh7`M`4_FHziRr|Q{SgG z{0LcC(Rv!TFf?*jiJCytOYherls$c>KU$BvW!?rLTKZjx0trl_N{G zxO+%{ky5{^bQgK5AEflu=tuSpb%mX-2vR3Z zf-t_cnDe3%RdSid(IX}X{+OhUuKYsD`VpTjXa(TlGupQk%D(0_Y6z3N-(N8wf*TxY zsgGNukp*vFO-E^qv=UA*sLbmXJ)hl2r7co-lBp19kl;SbuSVV@3$z1q$M0k}DKoaG znEgjq*LHFtH6b^TYkf)V6tW7FUBixky_hZ7ytX5t0Ioo}-&$O2kZSE_vPa#y3x<3j zjv)7rCUgDXq>Pt**QPa4ok=xqt`nWwr1tWz1^`wc`IyKFRMTTA%qXihY6Ok%+uz8+ z1bfg9d@SW-e9|i#t@3B^FLi38IA2B!XgvDbw4SPmsaF-NBfkm*`V2Mn7#aeg?C&b) zAG4{zCCd^0SaPe?^HMZgf(g7Px6xR%;E~LIY>L)D%4-ilUQ!>%5|e+4fQJ!m(^z;i z`e4@Zy~1|dZa^5^S{OP(i9au=Y{EPt3!svB{#F`rEB^YaRR0o5m0Ft=G;VPXoQ|fdj01enp%vKBhLQh9$$AyT!<&6$$X|0< z^ur(y(KC$o6H2cIb`*{3_A2&YXt&R_pT}LdQv<>V`7S2&M=x8U6^I2+$L3&1UHo%7# z_rU4yI_$!^h+Q~6*o9N4q%PQy>agh@V{^B%55Wlv|(4w zfeUlRWK}_=L7+u4j7NY*js%zR`gV#VAZBl8a!OW`PiQ#FItVN#InJM#ty9bco_uMSsW`gJgrh!03@@OiA+jYU%Oxw+ zPkjp2>ZU$||6|}T0@mF58!Nc*a0-h03<#%N6(;DerI5g z;&>7(O2yaI@hZNiA;cp%zP@iM@ihith?D#f3BGQX!?lGU?(-1SHH&?UIyv>Iv(o0} z@nz1Bv2TNFwBH8rOn4N2P7QkMWk-cY;WmiMW)xn5R6%}%pQwO!kVn{=g&*Drx%bXj zz<$cH$8hruNT?N6QV;GT>~aVrIZjht&gAVT*+0sRLB)~y-ijRUH5$n{xMp0kmxdnrxNDC}G#vx+E3ssuC4Id|y z!@cuWBa|p_O>7VHaWOrXf-vx^6Ilm6u@muUNmX!3@)2fyREzJ2^7|)P&^{&oO9uvO zLVp4d1A#Zeyjou9KlxXaphEwR@F&S>gvZYpd+KYJ`*r*GUKIG>2l^)hbpRYr0u|t1 zQ`{F$S4@C52l40-Z~H3F*^r3#6VDh8FeQhTk`&19t?$9`;5UU*0;_U*p~cg04uxvI z4aW`i4jFd~Uyd(!Ajad&8T~MYM_3bgSe5QOw4ehAwd_&7(i8UJ$?EBZpo4J1%|ULj z=akmvuGEAgwEZhqg!}`-5+$H@$1GnwFo%}6OD?*6z6k|`A-!W3{l%Rd;`S?RN2Ndo zpfxrNyiC$)p2ekK7V54-3rzLC(|fUMc})mo#eNtkUI`&Yh8^F5UzHB!Y>Y~>2O84C zu@rWkhYmP$0qyds2XrRGn<+u_5fO)0urWy-A(mawwX3<|m7gVMC=enULxg@3EPkJ+ z%H~>QcdhW#=aL6#^?*JPBDgLzea<@*ls-?xL1U)R#b5ka>9Y&EHxB4R>GPXLhKUPK zpCvwu1u@cR0@)}`= z2(lNdn)8!uG2fD3E{DNNZss%ksr0xMCtwI4!RgU;GB`c1f^)?{kDtu=@6hA5=+{4t z3#CU-gNWuh4=3DpdW>0AAw4Fh2B*h|8U@nhM<|J$9(P_E(O4VvSbgF+8vlFgaWDo@ zF@wAvX(=P4M}$`K-F1{VWX)YFJzkF}NW#ZiVqknkA_ZapbV4F!4&^0P9MxE59)a|q zzg1{f!c8v->?M&+kC~{4*xWZ5`D{LS&$21_ zY%8*b%!kHG|GM7h>2yO_DRs3yZnaenH?FNX-Dsg4=@PRYi2nVHAXUjecZrtsaSr!QFqBH#Wt6OUQAuk_T>reP?ZIBg z+McKLjy|xB-Fq3+z4K`li}&P17Fq70%7+2#kNOPOp`#|SW=pUF)jS1YL7Nx*(S>>$ zRvGE-cXC(qs+9`l`<3Du^alAp+;;Ujp93Npinc57PXX+q2z~0?RpaMO?BOrc7fC?x z9&2C^`%x+~P(sULb41(KG9{w1o`rx++to%iuCs?x=&xi%rMIhYsHSdLheQ$vpt1); zf>OF;%y4AtI!aMV+ZE*tp-rxiUJEv|U|K;LvNdWzb`C_+!VDg`>$D@1&5aeMiQ@o*3pTF2Yi2LOrg6i`v zLJZGOA@m5RlIu8SpRDyc7>y-g*~X8S6V zPrV0%Z{-O)HR_c5(tH0M`Etf(NCQ-XzVz;srVXeo zgcsg`auL=^6s7A+J`VJZR9{MpY^-CBNV2*MVYT`O^mph>IWge~@|y+vR-)@m|Dt%N z);O7i4XYQV;(}gs7i%aQ%EI=+;^92ickMUsV+}2c18ELPL|nC)_lFDap2{fDVraGa4Bo#D@v|E_zWARE zwKjwnH-up454CQOV>;^8Z%@%cZz2mrfWCikaL}*$!vwl`(*$}@`Dy&YA{PI(`0BP4 zZ{CsO&AU;&xdkJ;nIez+C<(Us!Aip26nQ=^J_D7Mgc)k&`PcE&`FXAydA=w<2hS8~ z4vI{ck>(WKtwx%gBCBsGhG3{o7kaBNK1N(Ch?d4h@zB25juH;7ARt~-jvrnNXmJ1J zsGDOv{z*&U5jg4+SVv5w&U}NhuZ`M>{bV&Bm(L%JKUm190R^&4=%2@bLn9bG zYQHl$(;B{on3mkH9-G25ca-RDxpBov|EYmrYxCFVpFJOAVA}PK^q2m-AO7au{P4@d zQ1BOrfd5y5-@jiCoy;gGl}m29X}vN0|7H4h{1(Xh;^2ce(Qo!72B94NO8@tNncpqn z8iaE!fg_Ok-6>B1=P>cRK>fNDmNNwJCb=+wQ=>?nc6nm($L4a@=Rcl?_=7dxUP*8^ z$4@1})0Y2C?Z$sT=)-?z4(30zpW{Di8A?L>6pL$iF+wFQZYTfoIFG_+22W>>#gjtL z_iRhHPLL^c=F@}BzQE;{swp{?f5AS-=58z27ZJ6l#d-7SD>o{0_62)3z5JeEDp_CR zT}J1jz(ACe)dZnokVRkIMl^dh3Mi`4Rn(%`7ljejt8KY7>elGg=B^?~F+HC`2n(L! z{IB;PymHq{EKpL`xC-3$Y@`i&THEob-3He>=cGNYQ%P5zUxfl@o|479#6Z`GGv1#cUQIUiPf%6Yh{hzTrw(| zkPfrk@pd`B*l%BzYXeyUynxZWew1m-Ch( z$ltb~+Pr?mPG6quc;f1DI}%r?-DDZE+LF7IUL>R?bay8wRPz-ec5YM?YxK`a?v!e- zT*uCuj#X70WmT0dx}Mcbsak-ooP|xI+z8sNGW=phf_&bI_`-II|EN|gio->#CrFF; zELTyksMn&@7air=n(J+ffRPz3>ql9J)P2Pg{Yw|$PDep>NsObQN=a2mK~-1E4DJ$1 zT^yw`-IO=-PA`u_;s_<{4EpWX_E#jWzz>^e*mOCnv@xz++$oym`Xed#VEv@=dwg9f zmNX_=>4AOzs4co!$-JKfHULe3fY>lDvb~g_@JZ z9=DY<5dNlRAf%KjGz?lwWgwK!7#46B*8_yoNO88oquu>tjCDv;#H({slB?0JKXzuq z6dqEiX6$(}CSoj?{Lo0SzgXios3XW)gMi!08or%z=+^rhh3a}b59){o?uq>bf0kT{ zTu1FzQLxt=FVGY^!&6J`Ql^$GiXx$w&XCgC(24kUCJ!<8BUp2wVaWwNu`3}A$@OmW zj=`_MbrB|hTFFX5CE30hey?F+v_?5VeFeEJ#JlI@!f1pt@drPoJ{1wD%}z6@ZMQ@M z>Rluts|%y$U$V>3fN`<)lz(xkQMGbeXc-+=A@L%u4DV>3p9rR4BDYxYonIpv*8)hl z8u!p9;nWB4m)*$SdE|_Hc&P{F4-};pD|>7iQI8h%D6QLCe-qFjOwM}d%2dn+LdX;+ zWwZ6lY>1JK#C?+IWZGsk>`2f@5U^3v#IF`YxaHU{+H}QV)1-x0i`Sb-ZXL=6m4+2B zKO=Bk_A?o=@54(_Q>Rx!O}*i+_S><$;)QUb1j5oY5s}o|KY94uHU$o!c`c8?H2iZA zTTv=D8M~!)nI+(gL!}I5@T+(no5jX^lF;<>i3;Lbl#Ol2J;LxOp8f?<_ZMq)12GAFgll z$u|fm#JMy0m-yV-1bWGdcMs98XuejWf;@y)jsf_^7z40`DpGoaw=y9pB1sfqPLU@* zC+P%f6$3Ax2y#!w0IC`OuFw_YhU1L?JUfx3R>=%R4JYQj>I7gy8iV8g_>TpY( z*qZ&nbh#DwPc1Rlxlb@|ga62a;QOq>2%890!Wu&8S2J!p&KD|<&iDqmsay{(Rmn(^ zp;S{(1nq8#{giS+?-vRZPTD-9kqdgKExJs}`-e-thKA_`Zko(x(541wzXTu3HYgLVYf%QxQPQ#`4~kQ zn8qDqm^?q5V45jm3Je?icB5R_6J=bhGmj*~TeyX(R3m9V0j%w&>K(VdU$lVK%FFr< zQ~^Jgqw<8nH0ftz*FhfHiM582Vb9_!W|gX;92TMhATQB-anGCR&J87xmQrS4O;{ox z!FOUtHiE%&1kZ;b!CN?=1cqT4!KOEiBe+2u!8{tlfQWIhy@YXaWKCEcG$=QMyG$dv zR2#wdSUcWM5szSi9Ko>gBY6FnKpYglZp6U}2tzEg&Y}@q8OaDJ@8RzU7zGDcheg4~ zJOC_3%8kina0dq9-&i+u|2WEZHF$>i9G(JKV#S+lGQ=D?$D-G50E{-*wkV@hO<08K zvI&?3VvAwNU{db9-n zl7g_Hlf10WdL0$dFHmPo_7nCh0{v^qmOSg$N`p>4sG#4|O9lN=lo>%!M^c{@pt&=yULWarG{LpQoiMRQN;Yt`OzkgHp* zCPe@AwhH-W_}=JFlldh3_3gv=H{R8f^f6?8`y3IMu9c)HrKL59>XvmV^r=cK^H=`o4txRdErF!wnYx@>hja8mAC8ie-uEIT1=8^x z=Zh5wDK1d(npIxG`wlfNx=ET9JmlFekV@XQADYz{1^SIt!N%ZMc=g2^R|F-`8n;zb z@-|5YNmud;J}~#t*5AYX7uEv~KtVwo+0gE8V@IwC=R^>_-F4b~l!!mJy%W-9_H8VKSaA#c?A(9Z%M0dN2NZ8T0P&L8$IXeZugZ=zSEwlqEk=W^m`JBxPz& zl4F0(q{P$Rln?Tfo99^)&y1+kt#(^Af%M64S(w>&s3ThzXS%86+yrGZH9=vNl9d7C zU=bdfyf2q=p-ws{A|BueX0>6i&6!@zfPR-_02KNf0a9LH+n7hN`ovdiUz4e?LDYhl z$wAihYKAbGPS{2=F1ckMh6ya0ff7aUQ>0_Qjjz{0z7)9K9wRFZ;muKiU-oF^YCd2v zQ_yhqjOw%r#BH~_3P4(Rca*J84aNCBRdYXsYi#pCSclTy25t&$?$HhHu0QPw=j@)R z-iJ4tgqN;{c+O-|H zkitw<%Q(tXaqfa9Agb@79V-%|>b;$z8?eL#U5E>)UR)vBVInYyazC|{ROd0iwRIAbo=?ZxrR>2<(?AApF zV38YLGO$1q>g+NM12V`)wXbWbuL<0O|571BgkOa6vcV#Cl8XN`Qc;yOAL?o{9KaXt z<*0fXM`iQOmRuw7q|&1pm6WZ)2*l?OdZLW&1=3v?h{~K{MHPw4{y2UA-f|kyYXCftL{#v9A)8`o4-Io@k}3 zJoWko?Yy3`IQ6>S;9e*f;Xq@I+hTWL&NnjdqDq0y!sQj_a1c)AicwpbgkJthC!tx8 z2&ZGR0~FHPiSR6tQgKonF26oNa7Nw=YG8*l+P zP~34xalr*h*j0ppC?F~U1gZ(L%O;Tj`<}YD@9izO!{>b8JiousGehp}TXpK3I(6#Q z*(#?+u_%bywQHFQVh*p9dJ?TbGid*6%|&27M!?bHc0b<3m-TTI9C*^;C#TT374K9x z{otD=v~xgO`F|3OCw=CK@mF61x~7F14;ZNYQbM3Rv5$m%3NXjSQuzNhyjFI2aJiF$ z@h*2aK$zBSr#t-3tmVZ=4A&CfZ=d$7k+jJM=w@0;3%j2 z`2edYuzI4}g*RMhFHuEtVk33_k3!MxPi+)Uis7KI$Ta)ar3fyNTmJwTb?E@L>>?6a zZCc6R%-S)$^$#nq$mSYiU&=NFETt9&t zZ?0U2WeA`w5kQ`F5kMvCz7IhvP>>g{a7BZBSk>OZf%5cTw=_!gtuvSb++9&Q?uY#=-y(% z*C9&ir{1mxN@ubuCg-OseHK66j;4wEDe-<*y`iz6o%z0AXR-U)lcE2E{cQ4p#QRxK zBrBNv*?sutzj{A=t3()K=5&h@lI&-{eipl*HNWpay`LS|maHGWpB-p`{jBYew*73R zen@dY`*fLLyzoOujLSX+bYnl80~p7)pXF$H*V^GFmG<`mq`3ugKbr~r6@rKUp8f2r zbD{)EWIx*or*K4&$bOaqk9_L;*}$bj(Yz0A6itfZBq+Sx&xQenB}{DlS-SLA!G2b4 z4A9`VWbS7hzbAZYkzD>PeZ-PKmEOi`ki36>s=dmN%ymc zz>X|fhVCsEwDz;7r89^9>|xO~wSHvV&y4fk9d*et@E6_tCXf<;(da&L=ex^)=BXj- zd}p-3z--?>(mp4?{Z^cu;@b0Sq)>Gf577hIhw#I|0+@Bm)9b|duy~EVhlKtw-QTNb ze{Wj-&ATBEqux;?O3u!%WNX8kP&7P(nZlO>Nlfx{SiH-UtxmX3ggB4(!HWw%t* zxDGIL;B~v1XTYXV8yo49WC?Y)L#y@9Tb)04;Q?`EZVHFP1m!Ue#gW6a4xTt6Iz;18 zUF-FYu;QS%EmlP6)2H-W#-CrtLO-_4`^9&Ol=>ekj+kwZEt^2r5v`U95WmW5`|_e&J&7{gEHwG7$4 z?bQVQ)(mi2Quy?4gaR|ZOfL4*(w(f^k^~lINqeD z50uOk?AE_#!!D^lP!-rwA6Sd-6N#w;>C8bN7&a<~trFIoO2SV!R5SR={ZdkX8r35y zKW$j|f6q@h%@v9df7M3ur1p|0p+=h~4wL{=%WwZ1`DtZFVtzWjFqWS#hSNSZei~CO z*gg4*4ZEcLG~+GJPeF8_h@Z}v&K&sZl#z+}sYl>1)p9cMSl6fg^dVO_O0!ff;Wz$X z&HTMb;@^LN(P)23;@{_+zn>QWdt|>A?*ncl1%mqka{}5Rafi3>>?=>-eN`hoEkagh z-t9=x$h#%SUp}fIbi0YQkonvc{yXHTj2Pe!bu)5n=fY0s30;6v=1VITvy#)UT>S5h zK%lYm(fJ$_HMX0w`t_wnzf=tKI$V8`q;B9-#;G&)K21%VBlG&j%htTEM%)9HATi}d z*}>LAAr%!4`CW(9$%DaWCI*F_-;JJy1yKq@*UAg_pVMjwI~t!XfPw1=CVHud^=tsamEIUhOTSu|VlT>g>`Pe4G`OO0x5`1;P*iRu=$ z7!Zu$rOAf9Z<`t^olVr5BI**tvb#%Lj?HT21E9w8hz=0pThK02pCcLnT!q+6i+{en zGQvL**14g^e;Mlxoh2lFc#4grNm*y=Yj)PzaLa#;byl5}h;`Z@t&jVl;Kh!xPG@-4 z4bkVoI{vQ(&qx2Lyj&(XnXBDwdD`>2C*0BVf#8dV_HIqGoBkDt# zb1;6K{;EHb+b9heIKcrZe$w(%+e7%RNwv~kr;g!bkBY}M{HOZ-iTV^r)%TO6$44Nh zwpVSKmL2SXqjheT1Fn2tQ{)LAze7`*D13O|ber{GdOI`&r7{uGTV5f*cYgpsoB;CT!CS)`TGjGf9+U%~wEf zitVGk@jNAe&WnFC7u zKNpm0*--+8Ab2%a01>rkp8>3}ldEz-kdlfn{|saHcc^!yvx#gOsU<-tW0WIwB6L$N zkoJY|L(_!$yEcA6l{NJ!LLI>mdOI&q|A+g(gCD;9Oo;d0q*VCf52%smEYcNm_Dz2a zKU~x}jvv0+4}Q4mD;qz&A`hwX!xmhW2}kCEi8hof;)f={iu|wx5aRgZ1?kLzANEh_2aKzAZ^WB-$(j@ zPX8JGcz44@O3rhCf{mKM6CY7>Zjgsm^y8^B1kaD2w&7Wkl2ZbGl}gSuK!{UvdPrv# zDLGlUnmm+DKaSE*SoaVmwA8=G339%MLTb35W=GmqnDz8u$R1+=w?HOdQNONJJ1l_G|=6ACD{na(9KpfL^n-! zH=iLF@t8)l2@O&42Pf0q;H@RVr9A!7uCf4`mmN7^gbtnnrLQfLAafZH7eM~GC)C|k z`tXFn@C)RC>O>437!LN4v+37ps?Vme-h^QFgIUz{I5b@dIr?ZZI#6&m!lNop!C%nGpx_pj;W8-5G;vMAl{-N}51i$s;D>mvp3o1z zhrrLy6kPg&ptWvXDri*!TBP6_fG~7q<~@fSr37lA29=i*s7X+jO}t6LpL&6Uza~gA zb~Ko*M9!f|tK16zuavDijQm>DdDSO-Wza7%(ZiabmkT%tZD|Q`Ln=;TS|Sa6zsRi_VybIWyyTfzbpM3*UlP3D0w8d;qJUYVN#09R&W;4Uk+tt8QWf z<%Lh|!a*WuWtP82UN2Vz*==17u4v&pz8n50K@50H!yn$Z#asL@BzC}Hw=V8rXeWMg z2d?Pi4*2;euC2et9jtab@yZQMn}#DhkjoCdbQ z=#M0=VALmNvmtD_j(|HUi|RHr@ehH+t}>JVsu6F=0xT%BgbnJ&&XUig%@5N;vh=9n zg(mWMwfRacLQa1^v&JZ9GQ(~0S4>*yCZvV_Sy5W(VQ4tO2R*BeHLwT}ge?}f-|-$Y z=4AyLQyczrst+Ypz`XJx<~0ZOo_McdKD~0 zTIx}xrJe=MuLw0d!(IMuq>Pp>1}oO*$F=o&k#*r(ZU*i%L`u$Lkr*{y{yp5U3oc1> z`M90JK!W0F<}9efss^8Rz`MjL*RR8w%~d8Li(BMDlF>@E5RqXgD3NvcYl7va1vV^U#^mSm zuE+iXB3iCGyscrq1Bs!^UPTXP%C&A6lXATVs-dheTD&9H;~TU3M*O1=gB(i`p?c5f zr!vT|#zHYQ7AQTWe|eyoUXF8w^YUw<;k1i}ljIQA18_w2!Dq2mO$3z4QYriq;OMjH z9IgkE;t4&}k_w#oXL9_wF>zusGVZf87eTZx%5JgDo%s_p?mL(XRb70j|N8^_(EY2i zRgCGMgLhPl~{&QXt%65JvRq%b%c$66Z=8g@9e)IK%0?cRAZ=M_zqu(^W@js~FbekEk-|X)t z`ptXle_g-n+xCB3znQlsM!)$P>S{9mX7;&%pMLYyOTwG4J#6u268&Z|bYQK8nEFkP z?ti;}Q}t+#IQ?e+I_Nk5f>%AF-wc(9RP>t}Qv|*FqiyIV)o(Tz=%qIs-N)%Sw@XjS z^_%PeZ7e|QH+KJ_{e0mGz>y3SFXNxpWyq-kO1@HTo2D{wh+Al+>Sn}0`&b|BrZ7r& zbT&##bn0F}r(q!II zc&Dc82j90^L2^KN_X~n>RXf5^ka$js(au{x3I^1_sKbC^rZA-eXn24CbIgUDuktm# zryqzSaFXgUpN=7zb%t?ee-^{oN+Uc}@HJL~{+WfITOT5IkRZyOZkLbO!Gb>9*MdIY zmvy*aDYI6 z7H$fCQSx(hWE>LhM`cat=jua{4l=j^Dyt}ILqx~ep&CZDusftp8%7m0F>6Y{j#lyU zRmK^LM_eRVAZ7;lPN}UUH32t>a4AW&!a8c6y3cRZnOF zPdRW`0f=3+G(p2aabR(rZu=m#j@O;md&I|g6&)PIAXixAxpMQ1q@TRR0q&-Zvo~&T}psf8eV%lJRE~a zJ(;auvFVre#*^UM8&_IyBtLo zmXFY-wwU{fF=+_ui9bPIni#^AH)6T%zY4_t1a58;cLiRn{rbW8EWdG-NtqLcxR;Nz z5jQEacS8RL2~_rrhD^%qP&PnB%I;^_O+t~POKq)(5+)+$enX@bMYTvIQa&)6WCzxV zKR~O*`Pq~w-oSjQELnk7B2|v4XNK2I8=C{iDoRlNiUpr7l{<0+w=VVuO3Twbo!%&I zjFgn(9YCPxSQ^v3ycBAYH?S=?5SD`B&r%%Nc4G4?m1th;6S`! z2(0jCY&En0SD;HTx0P|6oPyDdVg4xKpC}&W$=u`ejm1N5V2u$U=nfw5_OHmR>&C56 z?#x}IVCmY`ZXaHCaXqszH`Ebj3yylv{B6V_OKPn|2ObX0UVH@A4QvB*2bSe#>@aF- z=hkt#{AU59I9W6gF-*|8B2Y%Y;3%8Gskwo*YSUA~Q~O5Pcq*}YYJR`DdJN`K*I!K5 zT5E04SVYXn^k%Me`DcQB;U3(^oTMbO^t>>?_R%A`GkPRRicO7!q8ritR7qw{vIK6} zO~3<%v~|j=J_n*Dc2)B@zf2$JSLJ3dE#R*#*X)_(cYisp7rI~|>|0{KNQm!L!FL@LFv{13JEJtL0{nJ_yxm&NW-Z(Ut!^@!d$ zKf&QMhw`RMm_~FdVfd_;V~e%8n9e760F~HF;qcjI+|H3(rxs?&<)6SQiH{a`GHiPS z%hbGaGEXaqS@V=UBXwUM=Lxb8Ne;VJhl}`hP==qMMOomdw1DEmoA_dv;(9E_Z&0Zy zyTx+uueEE}c9+j}XYL-ck9CSJMGM`tYPY=xm|!7#g5BQbYbipeQ+f%Q@>+PeBTQKb zKd5K$#t2n+uvY#Y5=6^}Mj@KSq*_l9Emxb+y~U8vL&DH^u|tKVGt;~Vwu;Mgc(Ajj zg%3bGD^%U$uSl} za3mNP)ye+M!%j4p$5wys!|n=3H^8?14m=!)&N3p#J_eqHCLB|+*E%%y20ONd4cO)D z$zGvBjkrw8!{ml;!-71JTSd9@i>Pi$k+XkdJN8z=?Aq&nGK{g}Dx-f&2lI8PTt089 zgut9CCvg7+{n!sb#d6B z{XD!&O#AC}h^PM*ZpSakgLo4hIIDE5AiC=|8=^@$tD)eE`WFVQ3kmBb_Fy`bEUJ40 zy2$5vXo|9b*22f&nWk8@&vSVh>>Iq*2-BPaM%Vl6F|A+Pb|UMygRy=;?nYU}#fwXA z!mj-3RK(=!pT=0c&en;zy3^sP#jAB(r^P$EP)Iy(u#Lp1BpttSKN%XmaQB{rg}Vcs zQ|X1f2aO^N_sC|0d49!PlX-Zd4eoA1;pbD}hv%tu4t`YwfN#k=2Xqj)@u!-oJNEvZzupayg~0qygd>oh`abB&fk zS(7!IK^%g&PQ|H*XI;0h!Z|HBnA0FP=xtiwYdTI-T@Y4%*j2EKO95_DgdW&0=!&bL zi70V*#t*r{hGNin=`$=<2us&MY@6d8&r=r?fl$5fx7hJdwh7(_)!Qva6|h0?&IK~+ zjkE9yMROum>LYqc{(aa;>HKXUegl71Zr(@gO&EHfdU~TV@BQ#DvD0@tT+p2RPWVFY zk%v^obY_9ze)+&uaKH0*z2dS18rJfCfVDrLJ;=7GrFC?|n!3PXf!Fb|<8;6Rqu!Jb z>wSK6DnnWWE!DW-6Z+|Hb>hFM0Urp{@D_U*a6FgO6JU16k({&vWVgy~PQlNHa`HGf z1#{J11Xp;ZD#ZQxM&;oRbY|Y);2`Y2d{oH)-GEeZ{bR5u{{lNe?tW^dbR%;RNgJcK zVn!N@rgGEyLK<0*D=d4O!+D_fJmWmj`9?qwp4{|=ip~T7;(a5>d>*j-Bdz?kztnsL zNQ#{vC8MSuuaCFg8FQC~+mZ7+N*ZG}$|@m^(QfvNml(12I7dAcIlvkTj3J%v7g~*F z1ckX2|6r;k35?{58e?S6n)J8ktQ1NITf|Gv%s~c!iV1hOy8jH#pG;${G=KgZjm!i% zj^v?rQT*9fRQ^uSF2SMo6}Z78OxXlKsC5z?no0)S>5mA47xha8!QMz50@|vrpNH1% zz9OtXm!IBBU5az{!y+C?od|34SQf>a^V(Xhc?X(0%J|&uVu-T)9%**;(WKMoF&8~q$W-)>sQstZw#-u;aOJN?%vTgb`mJJhMo9I(~p@Kr}_A=U7M8jClEEkxE#@@q(! zJ|y_AyD=4fs|dchKN{UzwveX`w%VZ{mCmd*>3Cbna45N?5e;)U2v0@l+ehk!WQjMD z*=#o=9ufr5m$7FDc9*Ajtw&D!Jug<;bU!9(^DsCirW}ZlaSrGzZt>+nxXLFzD0F+P zk3~0RJbqe|P~LnqAX?rWcbb+r3?QsDTX@mPE^q3tjgmL#XvSzZ3yjeY?&^rVNhf0r z#~Xt&C`A#x%n?JTl1&Vm%Cl9P`t$)oaN!N9AgKClc~gY$EqU`=MBdycok^-=a(UCE zjU{hxbCx#Y2L$ zHT*Gv%_N$~Bmx(xukMqXU((x}`Q##SJJP)k?F?t!L+YFsoJ19V8xx2fAoanck;_Mi zx7nLIf3+d;lvsbq<2Oh=&zE5A-teH4u@#*!ya`!N!W&S)Ebi+d^;X|2D2A^~1;si* zk>5t%r#^Jrwh+O1~pg%ye}nyFZAWnWgR$@6#eBCp=iXLSjdAU_(F)X zkjy8as%oo@;|R^7+7Es57ob%eIK#;sFXFWtE)Q~{paY3My+^PAYf~YSq8bVk6`^|} zQC{`3b7&nOF1^@xgouh^#;Ejdt&bwu6~b2lGq%dKTG_;fwVR0M+!77J0kV~hgywA8 zukHG(89zsV4SY3lMoWtHVO8^LQ$Ych;fcnu%F_?k5Dn#jQ)-+x>;Dz0;m;F(nbb2C zewlegwA47z{BM&QM}9~oHBS5tE8(ATY)4Ct{&J%5hpeN_yn}t2d8sHYGg{ZX)03Vkr6_o3D=}TqK|uP z52(ZqwT0Dd7($0JpXUFjJV+6jw7B14HjnH>7aso z2rv-ou$Vv@(PCVQQ*SRdgv1$SEbvmO)6(gn&GM0&HVyDvHPVFg{YdU~%#FNun9yeMl{VTW9d4i} zCv=M%01%RyoOe%nGQd>&?DQV=gm4W(Z0KUOVkpO8hUIG$xLkvxIh7)7UoGCZqN z!2o3Sa#Rxu@`zk>w@aFYj3yvx_;}E=f_$1E5X{e#au2vQSMhGG+|b!QyeFq+jhUs> zgZpp~S%Xz%55PS@5{qMtvHdAHwj@+!xe+QNccPO38MPP|ji z;Bg1TFt7^(XJ6iRkSp#gyIlE;@x~nq^XDy?xuI(3d&(Dsmu!A;Z=l#y97ZhelR9wa zTi&(fLGD7qM&u?p_tt6V@}G>x2_!+Vy8j4@>X`$J`yz!{ToD%gha3m)_$(&_E2#)8 zYo^GTD98B)$a(^C>CZ5(Vja;CvrQo(-XR^^&*0mYV3^8z30_4D-M1S0od_0OzYEFz zI9V^$>BaZ4c%Ff4n`>N-FRS!}?_;5`Q}FGH&e&ZG1=qk^{R<%irbMZQ5rnTw1qw7} zHT@178I#6rZM};9uQSdoZB8Iv_i64inWccYV3JD$dsLrqMVjO_L}(9)G44GOqY%Dk z*d@A2tMEpAj7{j#$gy{BRzWEo=tXkyEy>MX7JcxQRxaOrXjb-u3QAw_JCl7Kqtm{> zJrxvd0!6OGb?94E6%Ep#Nst$jxXOo)3{K*9D-JbpiDWVBXxoucaz&WBCao~Xma0O7$Mv)bk85d<*Ky_ZGc8KS;VQFP6uQjx#%CL;f$6V*|ZbA=MZ;F9yBp`7}Ov_tIl_ktP zYiKEAD+_34B|cRbEwRXOQ16fJbuYR5uj=e{2A=%WmEYW+6WTNAj(DSW!(wYot+_#Tz1a7w$LJV;P{ zzq=!fE1)$S$g4L21It7%`uiS>Cfqa?V3a{^G`voBco0P-DOO~RV$+WxBckY)dLoL% zC~qXE6}$xCh9Fw8z#xtSziMGrXBvoe2;O88XE|Q0PVlhf!7%eV5$BOx_5A19h?8`% zA77z`%Hsf`&p++U`jbeigLGpC6;hFn_TRRqI!lqjFjX{FHKQ6N5+#39$wLzoBbLYK zSs{rr@+D%AH&YLfswD_#)Yev0dD!r0L%cy9Qv^xB3Ywvesmo94Yd5%-)8JYTgX`1$ zA#^VcuJ%Z}xT?6`j8e(sS#MqfKaV{#&|cr!f}VoHLOm=8qb_!Ui~}ns&l4zOPZ>+R z!MZT1)Dw|P5wV2-Q2Kbf=zd;#&r-lm0;Cn|eu~N}}k{bG#+$?DQ+BFKT zB(=@Up{jBpTm=xqvMxVO_2I55ff}GejYtX9GXN!c%X&VfRvrfm)&sCu3T{9+@m$xG zx!Engb!Q%hX3)S$)8FS?;qo1i7G^i9wAdiuUm^uqW$ConLB3jW;*)%=ilVO2558Bx zaL^wd$QK$Qa;d9Fj{WsFc{(=Jms zeS&tNffk4esVaiFE>B;vvmr(gp_pDnGMfDL@UN~?*`zl9N}*Q}H!~)*YP!0CW)9b>U7!y2X)TVezO0KVWa%WU zyYgfiN^S`bX^J4byc@EE0~;X6F}DhozH^{Yc|zGOVI?~N_tKsyERD)>jlRz{& zZZ0=bIvPExxnCR7kx|xKS#16?q~lh&uPGhd;k7#ZW-SSR0&dP|4Zl&)8q+Zqv|jD1 zMdJeiVTi`r5RKtsDS@h{L8Yezs=a_hP6V@b)csWfFv5<7cLONbt)K3_uqcd<_N>SH z2%^tkVnY@VRqVa`9R{s~>#z@ZdZvYi^LiZoSwx*rd!>SH@eeeg_CWE53JFvT`NdxpBZraC<^KnT)p$NRF}n<5Vs9D3n;jg7 z@SP;L<1%VoIc}KaYefwq+Z;k44q<32Lr{%1_%rO_lNM+3U<9U=V=bsad5yGiBfzON z|29D*vnTb`=LQE?!CO&%I+Z;S4*n9}aIVa)T--7lbZC2!TZDUR!5ucm;@Tmh8LQ=-y5%06}b8F;H#YyTHSgI4SQZ-qhZor z>7I+V^u7`xWLKir?eecjsB`#L(Tre{-PMCV#yEJiNmi#Tm9jh}k5bR>Ar@#d+o{R> zW|IZFNr?(tO(I){Hra&D6qozVMyt>W!{uOA4|_WtxXi61DhT&dvt>gui zT2A15lw8PS;^X0<^;Co z1j5MqxC(J|zc&^>suRqK?d415I>RO++zAL2W}rfY? zn^GYIuT`0T@O1__XUTf@RYK`Y+uA6dbffQ&)F!e^2SflERoFh@31SrpTREgQpqZwZ zdiO&EDZ0kBnYaOw`T<^PBK0|5tHuUWQ^=T33Y6;oZ$awzb8Se0?UT9d0~d-Crv?Cs zQJK3dfRzZHrRwRnfG!sWn&H<)R#djGOt8K`yH8BBM#W zwQ_AiQv0y22CuFk#fa^9&Lm;-u8np--J#=c_klp3&^<8!R(R(~Tq!y_s&ay@%1(pb zBe0G>Vldrr>?PKkU0xdbtvvlEe2RE&`oHd=^tzRIO!m(SUX+u$H^Ha4`N0_nqCl$4r!9ynG1qVfQP&JY5v3ZP-eIyeJ6a)kh^ zZwHpt1Jjo9BJQFQdk{Kk@_k=XAtoE&#R4(`T%0nAXMjM_yyb)ip(l3(;ujsfMHpc5J!6aUKrO`j6Op z720;a8wDyBy9B1W@a2{akn7P|EVTJ@aZ)QQathmXoEiOzFm{$yaRBx)LA)tH*844pe>Tn|; zxmO87ZbrhA8)a=R*jO`jPet_;4BIb^-0IL<&~DI=9A3{vPduCJx?W?+LqXKQM^HjT zdf@Sy2pD{&uE7iJTZ5fZe(o|s`Ry~JP)?%$eRsA98TFbC-qVz#*RU5T#gd<{)wYOT zUT?!)s3sB-_!`~{o(Qar(? zey-Tm9Xzcu-i%Yg@&MG-8$4H7FdZzI8=4|gNb9(Ee)JB!xskT(kGRn?qCQ4WJVu*- zKsa$YFk2*yI3*kcBjyG)edEJJ)p6ZrI-0ezPX~jIqBfUqZ4B;%kosBq{{U$D0q@0Mm6rNl(MXtlvp4Xo8ukXOh?U7Cn&G7_@P)yTV{H6ba5>9X$){w= zLu8RTcn6k*|4Z)gNOa3Y-5f#wk?dsF7K!PzTgV)YE+JP8FVhPyybL$rRC?-HqLFl$8(5|CUb9J| zFYybH4)IbbM31^5g`UAzY6)JXCWTJWsGfFODyZf_DaZDzPDWsY39qHV>q>&j`625I zp@oQ~NEs{H_&0r1xYACsd0bz$`6jp;ko+hgLEG(;;*lEAW`2w6GI&B=HAb4KWlR zjHgO-#`|*F6Y*0wzGCBxiFi*XJDx8_q0pu|Ps8z*`UEdh;JS#XMl zILBbV%?@#59PgrkD4^gCu zM15-q`m-n&DVwxMSkob&0U`9Nmmbxiltwic+OatLak&3keTx!5C{U)YH_yP(ij~2s zgWgn(r`TDj*m^S_Ep*pv?n^e#ych2ibLLujpG{7=8egeq5^|b~-qin6nToqlNo6XY zZmFkY2)Z}n(Y~viNiR{;5vc&FIkOh3S+a>t$@^$ysn1E{@tIBxpFadk_3Os)RFbn; zl{OWQ^W}pJy#wJZMpZb3FT9OMOJR77=51_oxOWGo`zlnm5}Yq+nu6rRg;Pvip0gAN zSR8vU!d+D`;X*{sQ_aQDyt=FJ@o_VaGAbd&?z);(_Ki6k%vckQQ(<@H2iL5{nHh{g;o;A!{AC5cbFr|;s?Kkl?^ z#Al++Bdq!jSe_O^J=N!oX201jYpHXjW7vNKzv2E`qwkZ*Qt57#Z-O5{cxus3>Amb9 za*S@!C+nuZ^D3zC!80{#KmtRYR=g!Y5b9Uc4YaJIvlq!pF~!{xD28nO-DWoa z4zxqDs^;!sduFUO`N>H`rKe zS@F{2xFzT8Er9XS6F8yoy>Kw&*GR(b6#S;ng(n@$&-aZ`&`B4+8}WMxQ^;>>LmF#~8d!`}c?(JI z#xLqYz|gA>!@>w${(k~=_yz&#u(Pr>$6xIQYF#_jib#DHU>oL7n3{ytx1oj)>CB>x zF?5!Dp(-pS%|>R#DaSM9S%?FxVAV|g?1nc;Jq<5+q&ml|c&nD<4XMlh#aX{?sPSys z#75oZ{-2XMoBP!%m{qGnM;kyb%Mzis;387ZI0hKrNNxQyR2?}7e5izF%)I-6=xW>5 zSbJj_9)K^RW@73IjYL}-#(9L8frgIqCZ|a1%_3)iFP0Ew&Hnq0ec63HNH>Wf%E(SK+GIg*qNzZjEyAiN$cE{5?_5HK6jN(2lG7#~(6o-yT%(8cAOhu&IH2kEN;~n{5F0OZUqBYdGwrmuIYa;35X=X{6lMy(er3-fj2p1NMH*#zp zh08+q()mK*4;w}S)s`vjeBA%Gw)-aQ3l`H+%TJ6*76`nb)$u6RgVclYW-PlH>N<;+ zEofwjDU|1$GA(vjd)fnam`SwzVl}M;AQ2^ z1_;n_`FYg^L|kwbuFpli)b*&#IhBDUSv?USF*B=IdHNS~b+`u3f1XI4%e+TR!7?#SfX~EE6kkMz+&d-pl3{o*Fa8(;w-0~->?hvcQp_Nb%I_@^7`;e zkP-fGFe^CO+>XDaPd0N4Y$uzaB($ze?Y3rUT^H)S7od^u-HW2>*N>+~^&nVIU&h-Q zzd|maJ_2%a^aV7~9>jX}mviyX!ZR1|`J`CLsdQ!eIf8Ekmm|IxLR~i~p^ig*0aojD zA2zmwE`K55h8KYo5Qd^joU9lx^nEXEiUAGvh5AuYr)Vn23dOG*MRpx(w(9VYB*tHq zi(UY(NG^Ia7mSR%w}Xvj(}DDx3BgFK`+<;{tZiD?8Tbk$o_iNa+zg&`7_=k0R~`JO zdf_GMTt)D9qVuz73!SIcvtbM&NsJ*5W43{Bk+4G{`6@t|LXry^V{rM$L1u-YrjSXI z*e7YwXWKzzi%(4Ke*?5lw^id;Mu>eG09QopgqMc6(a7wNo6z_tqBfy3@iV4jn))1` z<_LWo;;s48kc^gud>&snGY16EuCh!kcf>7ZW8*w!)<7Y`<4^cuj2U|;tW?Xz)Ru9uzxg9{#AwIRhbXzU(8cMDP`y$+ncYsYaGV^w$# zuaC?qBk0vUhhMRr%F5q(4!=BL>d7(Z@RoN%THPs5^O$q^TX@OUl-fBw+**)6RLh1m zWdHQ|UGP+wr77_&7TKy?WsgEypZYUl9a8A9F3HEq;QsxZ&4r)AY7fUsnh?Ht}odUH~k&sZZY6MGI% zvo}sAbIMRx(Udtnhg-Js3ge5tJln8@URGdl7A#uxt7sz8^k(V5474*UYw`$`QluYL zUtHI?+>E%n7@J`>*VkrUn9m#7S)Tse=aD$RJ88)q%s9TAy#rBuLkIA!N2^Hi)?;0< zi>DUAXWdEf%~+G(}j8ZRkxU@2um}8 zVcLh(A!F;^kIjrzemm2&!A;+;AZZgZ{=BmB?dhSec01;vM|IimPVZIM2L+9<%#(#PfB4h78&|8oF# z^fUqHvI9f-AG?H+IYu#SM|hF&zmcfa6XBpjW*&kOv^Rs1e3d3_F&gRK)ole<_}@G7 zn&E%f4gz6Aa6E&S{-^O;mFNdE_1pp16Ev=;RkaaThyQ7GVbqB-M|3@ovS*8GhPgDt z|4s(fvP{xh&HpDUCwvtZ{%5F4I{pvpqbNx?LT<1g)_AK?viLuv3FH4hM5~17b4JRV z@xzDJ9Y<<_BuV0jMcf=i{4neF<^(S-YlTDR^E0@3L7pV>!x(Gi=koL+_?lvE5arGQ zT;SF>D_B1}^I*2CD~@ou0Q;aTe~L&S`(>0U_j?Jd{za!iI2r#KI}9;W>A>My8N&4^ zR2MI8T>OClF zqKZ!ycq__JLbkwXSu7rw{06+e)eYex85I{T;-*^a2^l;f;lnTn!(hPJ;YuI0BC*3q zIk47`7^+Jtc+llrLlF|{lyNi2>xGw`+Kb%ISVSQb#2ZTIsrsZ_)wjakg}puDvC;^B26aviYWzq38ozq#(H}ZWWi8=Cu1A8bjoZ^7LkCL&0(v1CTOe) zsgNM4sUYfNxB6zTXz&(a6e@s*Q5Mps1u(C)wBa?_x_cURzI?!tHU~u7FzpHS{jx9U zyAE#Y$XV%A{Gd*5Q5k8|ubB|}u0u8=Cq?=xBq34S+yM~QS*bIi8q(%?=`E48iDWDs zW%)(QjUI-y`SnDOz$~q0H|Ch(8{eUcc|MXWdCoCQr&8qwXE1!25W_scx^=`m+e-AifW_@9${Wm zQR&4hmsDW9WLiC%TkkVE6dmDgbPDS%*lI{0u+><2rv(}nh2!y?T8K9g*h3w0RdqF* zCm%=!&CW-8Zr-n&z~?V4B~W23#HuN)iZ^Oj6X6e1DY?mS+BYULWUc;aY#pK__B%U& z>;ZplQ%@pb68y0T{IN~=qxIV{{Bc;g2`*CN=)pmM&->`7;$XPery8 z`C~u27yb~acK(ofGz)T5Js?|c#4&$$X;b3Mo62i^jYY{Gay}Qkaz#k3tf~Wjw z^>vLjpb_Scx0RM2SEG^H8Aozvo^&RhaiNwRzpjStxcEBoMlPJ}fJDwX5x@PqT0M?8 z;Ef@W9Tj7#N*W4^>-VIBVpX6>-dKz7g*O1zxKyh;p4V&#=tt1uBE;c=5NV65wd6n8 zY)Is+FEn+c;$l=kl%OP;nA>BIhvEHiJ+2D;DC#RC{CZtWJ3kWTytoq^n>0!!Lz4__ zEl=P3I^*if^G@MLb0TPTUn9wx!?neU2dQ<$>0t)(c1FYak=o}iGfa*gLC?KLlot9pAKvjT(nH1GtkMFhb* zwg2Ix$ccFvWynyh&Kta^HTC))5-*J8;+X=oyMf+`8fJUvaA7OCSW;sC0?=bn-97Mw zZ)qTmeqg7?=*bNP&Gut0cL3Xf+i4)UVI~=WefS_WuM||v4&wPP8S!TqdYO)*k=dCi z@V)AL7ds2fT4s_xEd@N&=95i>m#ES3OXGJgXI_7-X5kr&d62ULUsdDSC>qBkCzOkj z)I?iYeR2B>xSj+z+eJbdDkW*46ZCL?)k#ru9(@~SB#8rs`zdJUI5q~&s)5pVy}TW^ zIY@lKc>YfroG#eM1A$t_dOQfGjVzLawa{mQ0KVb;)*Q|jI5iq2dk)}NA!~s_)>iPk z;{%fQ7yPCM;TdFQuA_s2;Jy07I)%xSp%@vBX>~CKy+nA2 z^Cjvg__{fXd-1J$MIIyv#$gh-)Ya>Mn{A8;8sHcqzG6=A%`ip^wcQ4+v4r)8^kAF7 z$dWM2Ogs&hP$sW8zOS^L=nn69_$(|YFVYF9GDsm8UA#)lzvpBwMsRacPKy$E=6(h@ zr>m=n9;M+z1YYZzaF~Hvev_dW67>6L8I`yAgO)BPiQaefIT1nJ($e00xPx2 z3_3^HE3pOB)f(JzO&Y%>4zbZoJaf!&H*Rw`;nR)Rpw4^S+`vvL%lZkvbDM<}9^*we z-cX~9JmufATu1TNs_sxeH&$dx##U;E{s33tLDLnuT>#Q%mL1p-^ez!sV4cYg(*ik5 zusX(F#NUIXmcXW;&8XxfJd~Kv3id$23Swv zTW`i8Q+F9h(OKoUEJWra#CN*-0VTvd<@3Fndq=$({#wjDI_E5)qlFgvr(rpv5ih2l zCjYWl-<`(^zl;uB{4xz(F;$jclo9(?B*PmPt{o6j{6hUU9Xy1}dEtwp+g7}&<}x-) zZ@!C-&9{>%%cDxnUe&tWba&V&W{P}i&M$(%t~$K$1VrId120uJUSLJ=1U_BHnhZ&*U4EMP%5d-vGr&c)N0)X3a*;s~tdg0wjkpDC zNV2XV_l&F111z!Io;NMA;2BtA!81^r$l+F`VR>mVXGz>!m?IoemCA=N))aK#+v14s za^{#rQRfJa`KqidCDI_dh!yk&|#fLVXdi-BASE)`5J>4Rwc6 z&oJZ30V4JioVf`u!I9Y6$mu9IGzdxbjH&H~69TtEh%Eb=B(6)|ff4w@n^9)osxtu% z-JypYFvkG{obD=k3ulJh&}B7kM;qsE%6QNSJ>1mj1}8ui$gO-g$S6jmhg;~>u7TWR zFcP}qr3_qRGR5IEmGlnX)SA{)SHY~~*k?Bo+o)-hVlRiK-92r!$LEwf97}i5x56ol z8%sa5%MD(HT`w0^-17S61Y4p?%kO#DV&{|0(5)y^W9CERB-^`@oMc0*#h%4cRdkjQCnjna)<2Z=|yi-(7}CwF#ITF1vW;xYbwXT0<})(@wT9x%n~g% zSM$1{ICasFRv3lZC(lsx1{i&=mz`0UTV~0Ik~Ej^32y5_oUTwf=4U#a30#g-m!K!r z1U_|ambW`1uliOIw1=&aLR-{<_yCm&TjaE$ZbSDL#BZpNr%OK~O(S+{Nz&hC7Hg_H zBZ3dN$EVTCad?t&wO`FllR-imcmXeUzD_Cq5!6`Aj%K#nHJ`=lddav+m2d5d`F4XiOIXV6Cxgg7~up_SwK zjLB)PN7*KNlu0J%N(@vpIg~ukPUuaH9Df@#REje~J!`JID+SP5pR;9mTC5+Z4@% zs;0*&I!T$XdQve98B=thbY3s;Yt$%{Owqd=ttmpz|Icdc>oP^iR+2^J1K`R}5pF%V zPZ6@Am#XzQMlj+O^(RINSJ45uo2@D8fbZ0WaOtNuMGqd9DSG0UDC85ZqK`IMQ{+eg z7RUuW`GDj6*Z;KqW-sE?B zj>g+IqEF#zHa_JfjloxH7v5o#=$NWljHvbpWs=-$94BcgQq|2#%7PQ$2D2_<{&9dk zC7LB3y~LdT^E;7dBI#D5V2a}qIZY&wdO`ryo3h$*sB?eAJaIRqerL?n(U&!B9tFd< z190UhY6yqRi88w8MD4%MLdiT2cjI^Q6IBo4*nAwu>;}2W3D&qTN&CHEkPDjzISEIz z0HAcPJ9D+Ga3codjT~R6!Yaqhjc~l$V6(V6_g;dA=%%hd1^*;ovt#I{2B;@gIB>ix z{|{J&3W|2Re81xlxwlT&@cEM;;f!rK<>=6hI07rI;S*b#*cU{{F=m_CsCyjg@sTYl zG@OIy+pWh$hvxSGBesXgqt`Ij%LH?Y}ICH zWOm4*yxmhegUHkQs)t~xGFH+Uo5-7sAWOicxLb`c)IZ=bhq&vX8+b!b4)J)ZfA19} z`>%9F(*Luye6B~w2B6^tbR2rIAA$_w0-3@jKUq5a-q0v;*<6A)$!V{?+9P9H@`K}; zcCCpBv@NDUJNrd!JjQW&KaPeDoDom_ztG4$`jGf-dPEbSj=u!N&p8mG$rn74`tj^Q z{1v+e(Tyt{5v>J8P1*H}1?VaQdIG&zrdp|GDzj}P{{2vBF<-K|oP;(N5dTs=rhhw+ zDQ|T=@ux!&n#3>08L`sDUw}q-;(vH`H1Xfy!Bg)ccFtccB{GHc3-E=i1rNFd@q6tO z;tyKxNc#T(E9Y-F8=S~L1XDm%6Rtv}LQsXjRr;|qhdcCGYO z`oPg2J|%fy#8;{h-hsR+C_Arg7fe20>WImzl@^uXjfQy!VO}Ra>FrMwT%Q_DN?$fL zGESlP?yad(`^XruN+v4XCiY+9{5}fY&hq*k4DD4zIvpP*TNhXt<{n z6>o`-f;kV3!k1%Ph1Ho-sZ!2unt@%u8_`1KAM(l^A1bV8LhF>+fVTLf zVD!o~*ErrWWjVRwVO|LjbJ_6{|E*oXE+6kp<4P@#@ipIYEWT!5ii|<`{tjNMnc7SB ztmS(yQul6x8_n-HOE?BCR)1}knW~Gv9Ne+(kjZZBb`gj3(5EnaxGE@o;juWJJ7|aV zVzXB@>~h^5Wd3w9X*AXj=OXnCyxjyuIaGxX=O6F_yqJQ+`9zK3zrJ2g&r}P;_Kh?+3blYVcLu%FZ4T!Tq1|!NB9yK`55b(3@m>+fcnj8Z z2z-Z(M;KAFP$}y^WW|6EK1ORXgs_h{Gz?`Na8gmOe0^bdca(PEU8#TK6C6}hsOuh= zMd0$!MPn=kv9s-FQN~pdAiOwHe)DYnVEZ!en^ba}M<`*$g2mP}6=CaTa%xP((X^!$ z#Sm}XL3aMGHjkIcD2;Ss9qhRT*6@SG$<(7w33X6{0A~?Rh$Pvf+-wP`WcF&=IGi&Hh05l4VW=UuE!lDrcMAx-# z3;kADuRR*s=$R@p1$FXW8Ij@WFjj zoHMUKn5;Z+ggew5>=$-dSud6x|uRxN#uD!&-^iYUT@Qzzp z75)p5F#u?E3=#vEU5~$F_juNLTB>iL_$fDY5f5(d%<`I2<0%7;Jc0Qdlp2+TsiKwr zV_?nF@5rEP4L+N)RrA@4c&$q1A@3Fl_7YhYNz*i2Z4!*zFNnf8NrvzB$Y27$t9E5r zM1dU;s@2QR!5^yhclKgNooREsmTqPxoTX4W$zgDAhI@d?jC!*P_{+@KhJHRr1owaL zzNf5vD2yO9;B$4j@2N39MR+`&*Z=+ZJzc#~CiUidQInb^a@2>MBV${Y`<~`M{v;@4K2w1qIkJKeKCL=5t2T@ zFlAyT?t7}Ift_LpmNfOf3*kiyKI8`?(YMg>55p>i#D8#(k+WUtZ6=bly-(enWfgp| z?t3a~3Bpc>yPSlT`<~Y62j5hRMn@r#v0ey!Ua^g^y5Iw8%V44Cf)7_i^~GCtCgw8! zzNa5bBf`KkAs|!@OW(Ab6;Tj zkGj<=|En5O#dUvq`rr|=Y<+9tqT(oMTM^lA>nu zb4c76`Y&HV`ZH07X%r0$$?Up3q^s~!ZZYkQ{pM~wRGQs7qLJ=h)#_}q+v&0malh&N zPq5qBaD$WG>f^P#OCD0mjQZ?1!E@1U8=jigG^(+zwiy~MS#35T7_2s#iVboqx2fBu zGf9KeT!SNM^tN-|1kGsVnp?Q-L~?GU>xD%4hu52S{eq|=eIBvupFI!vapW%25qWYs zLV;WpdMx*lzQ^^*4BnrHi-H`@C2%u7I^X`P{PYj_T_~ivM{6+g+ym`E_5D={J8YJX zut^zc!aTdYTHzy&O9i!jPBUdy`*2VE70Wyo-}&%Qw9sNuE$s*hR8zaNWSjk%43!BFI0${4^YVD)7r}1A*HPHLk(g&bhC)i7c^usvJTo@JGZ#uvQ9N@H zV#!Q4Xf;kVO!(R;Zi%%IMDfcBpG&By%xjHd5+&;LJx@sju}K;P@we;q-cWvaLG^Xz zOJGsxiaA>M-ODev%<&)#&SPFRYed>TtK-NQYk{-exE=Rm7g8`NF-d^+GZaW1S&PGNf12w{);VjcZW zJ$JFeHI{Olb_%$rXr1O7QEsckEf21ta_b;eJ$l49d>J+3BtrF}A{nvjiSDD6+p5xw z#W4(?iIy_Ef|_Zth{CUcZ=&=0k#d=3a*5uW~UhmJ0nygRt5|1q_uxvJzR_w4^>)NecW1zII1L-ST5(&$c(S2+7q?&dx z_-`rR>ciF8=HS0B@Uc^BeU8_vKtK4t5Xw2BwP2N?_0#83XeHsn1G6*_mH>qCpv#{P zkYQdBuTAzXn*yT!L| z2$|Zo8yF>t_xV=1d}(N*7ry%TB7>USpaSbX;NoVW=5F|vNzEVWW4-Vfc`!?pIWWn+ zKM6I*erBU4*cxeZiMN8cz9vDps7Cvt^bnFWMN0Vy!NxJIC#^?>a`vI z3Jyjp9eaP|5G-+k$|*(;r+L=hK!pt2Ee00eg;q!*%1(>UkFv>wztoE9*8cI+;Qwd$ zkFQqB+%5UUHg`!UZu^(A5)Afi`w*X;_mAEe7#wHqA1j)G zN8BuW#7Wj}M?GTI=;xUIW8M$Z3=_Y9eB{>*Q>p!9GGY{?_m5X^{r~g+apMYMuc04D zu~(A)WBknM{bSkvf6M-{x}Cv)*8Xv0I`}UQuJ*|O(M><3xPSPU3tE#tib5+156*-p z3gN3J07T{Yk7gRwS<#@9NLH@~Wh~I~_W|+0d;fU6twBv||ES*x)chFk?8yG{r+!Fr z|7c$#)O1g`QM01`WAJBs|LFWvg8gIbvdF?tzJL7qs9xKV{o@m>m3e55**{)2npCiV z^wJt7{XHn2>oJPw9#w_!=-rfcwne{oL!pDcqe;^f(y}w#y8OI87tcGI;5pb@irm5# zG@6!^P!0|xbOn8cyP_`-HNy20-(q@gl{sQnzxaYuF5fEZf3De*K9%DyLfT9*at-Yo zgR9^!d}C=1;Q`ccg4N6V(;B-U^?6~{V6<|q|A@Y!>b*E}V)Bf}88CKX<8)a4d9$oi zyL*2t;{En_Eb$J9d!mB$MBoa4bbUNrlcH3qs^%j!MgG04m)}s*oq{ z!np!wft{`b6kU!~$WmLr*MuI8mniGu4vwtFwus+AG4vxYew}WNWXS#vE z1%9B15q5fY!kHY4;mhW=xiH?nQWqOHw>OaG(>bfq1Rn)DOPB6b|s1~aVo z8@|)nKP7WYH-YMWhJpLT>{xJLRvWkvh7X7{Ztj(+gL-jxFG+ZGD$N8U^Y_fy~3 zxbFuD8}7R~r^8YLH(G-mX9t&vO<@KWV3-BOoaeWe2700$ zXwoHoi3wMh@MwW4wYlH~JQ4Ax;n!q;bdq7uED*ZB@rI4Ai4pzw-B?6xMIrhRBKo_? zW+$MhYM^cHK$9YRjR{u}edbOQ*Fl&$K@_n}U|)C9}t!QV}mKL_vB=kg!{ISyOPk$E!O`p%<0 zpQF`sUe)}TqZlf|XdI;kOjOgeo}zs)gWeaQ6vc!z!Zz5r3+{c-uO#XRbdRMpe)J>_Osd56uq)6+FT$g|+| zCLzzlYc)(B^6qqAQ=iNgLN0hUm9cJ_rVq4p(7l!$J18^1#4zas+@S_ZZzd&asg89V z_sla$Ss+Z{v=Y+w@LJi2mw5SIfw7s@BuzTauE9xVu&k^d3f7wQzq$B+34ZYh2075E?!Y#uIKPx4<+)#sRX$OTO4We_yLmeFo z(p^C5xj>3};UH!*pa@^zlJGFDH^@FU7aUgRmk25 z8Uk1saUsl2*1os!siMgYMg1S^OD#-`AWWH{W!3*NJHHs0pR@C}QBCaKvQ2nC)DnJn zob_2`;P#JYu3BOd}$oh-hc^v^W7gjkW-9SAMv zKa2b&_y@hR6j=%X^#m5E4POgy?wM@yW(f@YYysa(48x>LhC6m2n87!w>uw>ZDjj;z z6vrw!DB*Ux41dKQ>?;mENavA^o7z#;<0NDCG5Q;!5fHdr%j>172jPf4HQm6|ON z5_+H!^d~`3Rnyp|M`QQC#ttRqqKX7`8114jWVEZFPi3@+Ugr3=s1@j5oRvDfcAI)sdYKqu z9LwcshOG=AqIn1Cgx>`F#Kx=GRQP86=Q7%<&!#fkxl=UX zynybb_{Jl>RKz#!p|4Wrn0ynnf3Z9sJq-ohng)!x6<8_0J5&$UK{ayKRFZn?UF~Ve zz3d`4lJgN*QjTC2)cKz84(7Im(dwa=i1~-K-<=g$t@eFc9XwtNm`#o7$a!dhl^6Kg z_O5)rmVb%i-xPuW+>;o7u-+PX%JA>`8{p497{On|ACNlyeP8^~@$VIZ|J($@KYUs0 z_*V*kq=vgKUIBctpBvCgfGz%KM2+Lrh4`gAFbo7Q<=x3p+rik=5o?4p4pe{(en@i{ zZ~TW2fE&>#5(s7l+;&93?J{asQUzX;7$bF5C+PUMZxSSaNCs-O;>4rmqsSjaraUV(gorAGy&vap?YEN3sG&48!zBYQt zD#WdxH4Fmaap+!ZP;VTTJA)@;)q8vFYQjLhu4shwm{_^h@CL?q+XioO2Eiifvlolx z*-!O$n~vA&XZ_&2j^uFk9i61nI(vc*t;9x^YoL0YMwM0w5Wpc<${SCG10l@P($2s> z{7`6EG~N-|riro|ZPx75uEV;FShIP%fKFlbk4yh%*NND8=8OyJb1wbKnAlRqluSyH{2hm9PPQgCA9$`V( zDHWgjP5d#`>8)KL@5Ya9f;|U6s0>ut1i^hjP=-4)?!fnj#(5zdjg#U$>1i$8hXI5o z+?T=NQ8q-3HR;luX;8J9X}ke#nyvPDT@wi<`)~02R6aiaM#We{_I6@bYxK1XtG^TZpev6OWbD zv4zZZ2TKP1D_K^Ef z>d9D_DAD_~F8tI+GKnfIR~6TJHlh!>PxZ$>HE9p`sTQ(NmAdkK%08v5OCfsVGrdur z;e6#w91uU6<_2$Fi~}bWFV?U}DG(g^%hP9c()$(ExZh1RE@r=i;Uc#R_N(Sm`&A*H zaK8@f1VfiI?$=4YUxAYDj307?4Q0E!UT;^NOnc^Tu=<%8iMc?x0w#us9V_}f*|BD7 z^=BIYStK>^FvC=T7(Jh+vfhyua?Rt`3YiWA6+e$RP~}0dHTM~ss6M$GI~MCsRa&;L zMI*B(HS0L602*Z$;H|bw&G-YWe-pgI6s{joxVA%9dR*WO*H9OWEc8p4aud?{nYx+3tJ9`{Va`eETDF zpL1TX>vdiC^}4R>b#1SH#R(ThW!1swkg45{f~u1iN~%`IXJWH_aNa5H028X-BoVDS z!IY|xPSmJ+8(t%*nn|zn6UcDya<&6J5|}3pXOd=^GnWawc)SiC#J6Nl2v~!EaXai| zd&Vg2S`OY-dYok>?PE=Ey$tYDZ_UMD1=d?sk|~7(t*&S>!ppC>+Tlyk`1}#j_#VW& z{Rfh!_(D8~Pl$bMGVW&Vy8t<5=wI~XI4g+nc|+>0?*Ky6TiMVHYP8wpwZ=cEXp?E#e3^S2mB(8Z29w0Is8UGLN4e3pnW=b~|&ewoL_t6>b2fsf<_DZ3nXUc2r&tQE+-YQ?r*A1mVqaPjIdQ$-l zximUE;?5?gZwI+4PBXZR|7z}WxuAJ#PvM7>eQ39=TqD38F9UBzSQp~XhG`fK<)*Lx zgg4x@EN_hiu9%*)nPYdjO)oiWu-tg=^;Aln|LfE|uzd44>`HwFh#9OfbK^Y{w_ z#I(egHu13qS) zN2eKZ4wLRbYXWi5Suq0Bb3hdMs-1c$&{v%&(_9)_m{ASRlzB?yLF%~~IzB`B*am;b zSro32L`;#!XlQ>%J8MR$BR0?I&v3C3D*YKRdJX=JmXN^yGvc^;c)CJ=#&8nlMt{ca z2GTx!j<&@!yeGQr?8E<+FQY1!q4F^`oVg-j#$B_RiyDv7xG20Yqw_euWq3rq+X|Lp z3ot{01#L?V@>_h{f($_$PM9&vT>_xdk7KGKjMiBU$rhJnLl8)Q)L{relV+}k&%`qMV9}RxaVFz=qdA`S zoElM!;4OlvoB{R?j3n#6j0_3y{ZTr)hCSD>NGC9=RF6s`LSHLi#;Hq0T)#wDd>QBS zK;DXofBPjm`!d?$6JlIzzKj{D-+)ax?^P=}uS;Wg5+4JEW)tds8Oc0b1Ybtu)}R_$ zFt@0_jGMI~0Tztkmr+O^G)D1d?0=6It%Bibh?1nDhG#dzfK)9Q@?`|sBN6-=-wu-m zTq;#aWPb)ZJuJA!gS-JpS(O<58L0+;#XEfLOGqU#^{25QMo>EVSPq|> zV=*+eKjY%PQeX8We@1WCSKV~_>VM?R7>ZS>8}z^UGKRjxJ7nC;+71ct%a{k7R@F1) z%Mf@K-rui8woQq*Jd=9F9xf@hn{l26s-3Tm-BGymh)S55DK7*;+X}Bp>M~~8|`Xpe0 zs+sgEKO>c8*_W|nI>Yl0)4>bt%P2)4HD5+bGnSFp(3jEVj6rWHzKq9qfyPgx|E6DW zu`gpLJ|RL|^JVOv#)zLBY6bD~T+QwiM*u?8TLtiC43f~&^w2_YmbtGGQT4uzgH8Pw z7kn9aYrc%Cr)qbzKpd~nJT+dbyNwxPTxq4{eA-s zbyNRz#lDOTgD>M@UP%OBMjaTUYzZt?9Sk>WLjo)Tzc1rF%q$*6Egs32v11A$tbz$; z31qWnmdB&~zKo9y!-9PolT|q1u`k03S3y8O3B`V}^Z9dI0%a>)6eC}hEF4Wnf&V&4 z3Z(ZyWTEM9MH9&IWQw)D&NW7PUaXCWMJODjvqO;=_rid35xvJ&_9CdY1d;3i!TBs@f; zJ*6)o7t-z-It%L7?q209hc<8d_3Rl%F4SNZESH1hB2h~VIQa7F`P7weq+bU9fRYnu z$w0%KGSKig{-IZaK*QVguh=nJ%D+Jx!@muN=bsxLxn)Ms#)RL6oaFSqNQpBjme+9V zlZs^#{wlCyp{!Fmzi9CnD;9ahMsIu$#nN*tc6R^ia%Vq|&%{Fc;M__t#1zpJZ!)4$ z=7`oD&O4h?JP#P^&fW!W=6!*I#ecUE300n$En7-QB`mEDLaz9x3|8UJ5{JtX95b@_ zl&cy1l8)?9I|LKTHNb^F7521hh+Pod8qs?=>3svsK_2TE&SRBT>xYZQ<=|rQ#Ok?} zxKpyE>f|~@88Nu{tBmKm%@{NZbOGtCtRCaWCEk2+jngg}S`Z;rR`T@S+jV#tbKY zy100fbLG_r`FAELBCQDqQM;QWh7sUbf4dv?aPv2eO2A=}M&*SO`Ug|!E1MR&xvYePj-;$izWJ_C$ztMReVj>=5qJmyb zaEB^?>X>>3w@e*lud8|q_g@UH$OdFCLR2imd-Rn}L?U`%cyTr4#=7b(H}Xs1?-lr) z~F6Pepi~?wt^Gt_(Ibxq-w`)m#v&6 zkLy}FVZ6<`lf(t__%?CrC}l35;&8_*d@LI}J+cWr9*ZM`m{omfZa{rdPQ86k;rZDBD4H=E>CN|Djmb&Nk*LX4T8s zi(0yCfIn9kA22L@h2 z(K%EGcXYWRme&VQ`8&Eaqd>sb>MHv6ks?t%8JXA2mef_$w;r6d9kF9#Bkn3%8IgEv z!GIpGGoFL`>+p=!RrJl5Bq#L)1m+~0OY16HfhW^~0g!kB{r;k1LlY0FT}6ZYdnxu< zCAP;nv+>w7j0`uA=6av5Nyd7gj-(6IsorNL{dFbvKGdy%%)6Rc7zBPsk?K`ha#3b& zsM?+)bvJ`y8~bv^hpSkD!3LA6(HC>D3VBU@spYZZhn9xS5wEN)66Iy3MG;SqS0NxT+6rhmz6^qMK6><&~@(p(1Dtp|i!BEIl#^L%C5W|&~SSVwvGJ%=s-hLVr zg)d`j4cnSY#br!y-cS6blrbehAW`_Nk@qG16==CdE@Ntj5pr7b#$n|=b~iqgPL@MI zV~c!?@HB0a3iw!@l@CrQ5!16;O2V z_0QuN+V6b~(3aFNzN&DO?)t_TXopid(UOV~I3ymp0hJUFLjaB5k9&v1 zGaTXpVRNL8@p+T$&eCa-(fD2w4@$^fDLrFr#qM685__DFdXA`+Qe{%xLNu`8aGlX= z&d$nP6xN5jMZt9^pyXG@B7-Gi&1kHe+tQG{)=q>Jf8W9OOZe)?HR3=zv-#=XR@l5E zs_l7ybNWuFdx(YdnDl8bur~3yi<*6UzaU08-O&9c?3azO!!Yc7RO_RJi1v#=?xv?5 zvKVfZ0^4~`+g~^SsqC*w^nUPiJn;i_u)iKaES>h(2z)Gt%LivX9?X}!ER9LEu9tyS zVU~NepWI(-07B|$Cv_C^Mgdg8glaEr8Hu=Pv|mAr{I(LQce8=i)8i#ljqtJfSU#u+ zG|2*C>q8HWmG8f&6{IRENSy!(#qd}|r!({;Ju2SinKZ!>EC?nvkg|gWfrBwPDxL{3 zimOWh;v}7R$`Ef?zzJ*b8tj#AT%zm~O}etx>%Sqx7n4^(X2kR*QPPX(heH@8#5im% zD1(<0V!HVgNye?g`?}(U818x%Xth|`l0S(yWB8Ty>S5)TI8n0B+`*bW`!3=-L{1-< zMHu6o!a&8gL^8}kvVjYn3=@Y@a(YUJS+W=Wr-e?d(wFFrz6LD#JA%f37jz+fAu79w zDY?GKga>=P#t093+JNw4scK=-8$$k5o+T8|isv!CmJBl)JD-kG$3+F6Ok=~~WSHoB zirhlvv=hb!>m%LyN#&-aodUV(-E#hOR1Y#+yU^_n?a7r89ds!JE(by#jF~U;DqqS_ zVl5%(XTcJqUk@~~L+e}vz( zem5PSk&aJodK0R+{{u+}iWJk1Pg`E4$s!$}R>8W{AD<%iM@CXV?3qO!^ylyXHb39^ zFZ4)TbDbT%e|?2%x~Gedrf}eF3~BvF_0sdsBX?Xg-f6Tu6z}A&1n+bmqvM?q`N0bB z9307bp6RT^GZOE_a1s7taSRZGc;{`NEE4aGyElM${1fa%1BiasyXW>4O zfg>2ZF&z!qg=tm%ad#=MMq+w}<)}x3bQ;#=nG7tawBuF%+ZD)CrX-<37^Ja`A)i=h zKiRobJ^>Ds3s0&XLk<|Kkj^bBIi^3UyJyLW>H$YKDdX1YU&v(Xh|V0W06WUA9Mr?b z5sg5RzBt<7m_s=oDUCU{YmGVJ%eJ|ww@1)%hr(DU=0v&SOx@c%Xw(hw2}$gx$*%ok z+-;yS9qZDlhYK*oLQv>23=cT6MQ9U}O}CZEHX)m2n-FIL21$)7UPJm3oKu(#l(RYS zqPacswSE8x%|VFUorP~Gz`}mR{rJS1-BfEBBO2GCt+2t?%COQ4z=E=(tHKzX_wxzd4t&b!6Uuv+Nb)=BplSc6_ zYMhmI0#AJMhP9Xy3y`@EzSJY7R8gDjP7LeQr_VF?jKVd+Qw+&HYZ2xok6}gniEjS#&sz9E8l--tyk`>5;J-(P6<`C73Qd5r8nL288>=Uk!-j3vy_KLVYy(V9zMk zI^*8+Nwy`=q9=woC3@fB4#}RB8cK2ZTC4)aa;OhPvE1=UjSm3Ghz`Y?lYKcjb`5>k zd!A3;(m~;t7_7O#G=Yz zdH<`S_w7eyd?WeZvB~@4uL74FHNYSV43bdH*o=Md2Lz`wZ5Ov=qusUE<}8k%V%N7= zf?fZ`aQ%w>`~M(BwAhdDu>Xfa(9sD9;U_`@g@IH*Oyp3>B5Dnm`~OK(nsi6qxkvvtK14xy7p7~xp2@s0M zyBI)v%P=UDErwoPV&_1HcI0sbw8auy;4%D0K;w)`wvbMVl!``PIOi<~;04}KH(`)E zEd`R3Ht2U0>(D&bq4~(?0)#0#`8^+stTq?$$| zy^ecf2C|ux%>o#iC(8{ZWR9EP(3T~8^T~GfuNF(^8D=ZFb+2j@`1A3&uapv;Wp8KS zkW)lq3cl~LErKI@I|f^?i;wLXrQcNhwol0ZdWK(Rj3MJjnxa@!@h%D7eR-km{~&wq zEYb=?+H2kK`rq4YnLt9b*K+Y>#a^p%xjflxG?;W}a?Us!Nq_!7drcaI`bZU5=v@_i z?G5zjha{buY`XPVaTU1UUW+QH-$~cdUOSwt7l)zkwf7c6Bwj`|S=-x2d#yg_samnu zM)YHvxb3Di`J%NZ4%0BdxxH4E<~Fg{iW}_U0DJA?h4R4) z+iT~_fa=%EUdzu8w%5K~fOlOUk#Pt;X|J`D4;JmU8GRVpc`bFwhPBt$rAT}2V}Q6K zd#$#F*2D-cjJ?(s&{V?;$!_BP(t3`@rO#K#UYqulen$n{YmWJ#@FIkfjk`&+*AC!2 z>-O56&oaRqB^d}F#$N06n6%gGJx>H@4~W6MD44yr;28$}W1UrYU)<*6g+Iy%{Ib!W5^{z)3w&?&HWjH4(d3 z_S(a|uJHES{jh(H_F8Gfh>-T$g`4zb3$)jM=|!Yqkm2pMB_XFUvDe5HF|pUkM2Tdt z>HPZ?UwR^*JheGWerJ=@xN*k`$C_*R=w9Th?dHlH(Ft8FwGNg~`};qR%O;~py)s_8 zvzZ-f$?lWMoZ-e!TIwH_zV947Ia-FByu{3%g~rMSb@9_#q<>FlwpS7~W(yyloY{)@ zkec1Ow>akr`>`0`1O%(M7O8$syf5OQh5q+z<6-2*<$xVmKH!wX5DcME& zgm{Q&(LDXZ{@L2){#j~B+x7|fR(VK3ruT1is26PE8lv<=j7>}8 zmjv?cH%+FxE7r#DU7|I(L=wk+1bGyv%14pkU;TCr9F*)ArlUo|)7>cR{73vo9ibdL z@Qp9eR?SJqH>_{mw)+qU`kS=soyIG17iSNc=ah$}t*2;LKzLVZtl3Tv?WJxv2(NU3*;Ig?zw;lx-&FDfZ+r+iWSbT7&t zm#e&}w`sZbqG)Q}i>mfx@QZqZ6ReCcsu7~s0fbA!&%{7{ZtX=a?!xG2KNJ!D6I6zS z7nKtXZ!7Y+#6ZlFuuLKm{GxioG}Wz=U(^Q}7VIw8B;1=UPpEIqf08HJMM)A2NeU|k zBFK|*cqdW_4F1}?KxPz1W_tr;b?MBMeW6K2%1&!;WUQ^x8m*YI9)b8NumDKHpiq33 zgLd2cH$kbfx8S#w&#e~#d%J6^P%3Fo(T1#uz`QlS>eh*|e=#m1_A^kuPJA_x0{)s{ zB7u{}@Gwg-U&){a%YdS#3=+r$TA}=7jVUtd-k`=aFGGP&o=FNc3GtE!gsRQi zgmegkywftFMRA`*^{few?PJbI54E8>j2hoTC?A}PdC%+R6hm0et z;eeJ8vN00T-4Hk87*(dI#Q>FlZG@F{fMn`Ax5kvf?8ttQrih%;7jqY2j2X2(Dz$?4 zQjlV^6u}41S1|&ls1%3b+^%_~&_lH7{GdIf{$)c`)VHAc##qu`9?gFIZ+v_ia3fs? z=lU49+s7sN@juCa4%qp@iE1mB5DyZpsLyWQJX+nxP%f zwV3X1oXpUh_EkbzN~7w5Oc+Gz_u0}uCS#E66H34~Nr^s3mG#>B9ig?ipUu z?$)PFP@xixW4}q8sksk0J7BFYJK!Upp~xF!%S0u*>ZaCC$rxTX|4wYwBZpLnA=Uu_ zO4QNsQo5MDP@|NL*NQ*tsmf^!l)iu;0R!2#zBbYq?CGn~nD8RH0Z-%>JvZHtyOjL| z;(}P+l|ISttYjT^a7_o&88$jHP(UATbG63|92~3)$yaZ8ek&ZHM4`6eCMs@*xSmG( z7}CKQ#{Nq+&LAg{%<04mu`b{0l(@fb&P|Y*_Ka4=Q!?(|fqj{ZL(vKGbQw-}k}p}L zMCaMk#$t?2dHNH7IilguKB7xfK_kB8EH5bTCX0`(djAo}9(x&RB*&s|EDGr=*f|?h z$3lgFMZe?%5k#WtQX-{5Bs(Q;9c3HUg$>W9VRPr1p`*Qzkq-CBL#SKY+c_NWWNdPh za_L`jx()BGqV=`Ch4}t*X{Q*XoA)#(L8Z9m>3i|qc?c>_j=B}FDENY<+MJsqqvQ|8 zjIR`XfyBV~_?)zgCw}mB9G-tbz?cTm{`?SM3F^N|`=^7Hag7~Zr=AfRFphoIJg?**(KM1u|2`o&nk}jFvP3>^-xA#^+#8HZK!IE6E`GH<{rNnIx z+%7if-5A8vi9f&4@oWWrEYmwzOaUE>A=0k$>^aINXo(MqXX7j(IH5Ju@|`+5TB32c zbwgfJP!GV!b-?v{(r0zK&re7M5 z9}KwE%)s&~7s52vF(+-1<#sp%H;rGU>eQ994MMIdj7}gDdXxIR4Si&-9 zYf@2K$rPVfI_gJ`06@(=;d}u9QP=MemX1BXFPjMX74{1&#DDMyPPRA!bkj}%XT{+K zSQ^RdE%ZI?5KsL2H}OVnXc|wOnNq*Slk<h6ilwJSnG{7en0DGxafk8=u^xy$yJE z!=yIna3#)R@gYF)+ep15KLw`6j6LcZAi%Ti%Om2|Wf<%VO;|RDmZcI;y|Cdn7`2+& z?~7@P36VcZj?I)LWP7!O$pP0Pwc@aQh7`h?OsA{qia;%)G})aQSeJ9gQK~rVwJ|sm z$<9H(Z!;1NdX!0&cDI2k^U z%%%hfrXI<2iVwa@aPj~rP&w&EYsj29fkEm_!u6TLVPqvhgM!0emnRKmc>qtj-rY8*b`fz2tPc%c00UH7~7hO+Dx$`H4*Unp==;8Mol9{O9 z(aL*p%LU0vfa0aInQ9*z&If_}ZzU2V!|cD8^!u;xyrBKp-UI4PLMYt7|2E49i~H{; zMyhnpS~?1a-G8m>NNHFNFF?Qls_l-r{}#2<5pE3gj3T_${r3S(Mg9I;zl#qksn5DH zN5kn+`pHS;^r)v+Q?JGx{u=iYj{p!uOSkY(-Npp?_~oEZX??J;#d(#oIF3J#%}{q$ah4&O28ryjCz?~ z-nNC-%uz#H*sf3T&fKdh5K70%C5%vf_UqtBAELefJirg|g@{Ki9iBZ4m$#)SF=?mP zv_jhN?qQQzOvLoOU$GjSi*Cu1TecxjrVE1kH>+CiQUiS`)mZL7u=hjmSAD3-f1WRi zx*^)Mv0y)~>j22h{pKop4E^SI(vSRoG{;fvwkzy6Hw;4qymS{e8G(LVa}*gNy>!&A zw3!?4j3B>)TX_+Tm@GFU~p}mq!d&pe+JMRYn$#293z>to*TKVmv zq;J@+p8qK}6qw45>~8kbZ4_w?O^KwBp#^f95{!6%C&GbbezKPi{0NH+ZjCwHq{Qe6 ziO~%bqk4uxVpIXu{QF>B8lJ3440L_ax7=%sfk8{RkcIxmBTT`Sx0_P%KrP~ErBfbx z5ykE3AEdF)c)CyrM?uBmcM4DDFYtZ|zPTPeguKku4m?=&!U{Bp-+uA27vgFr;1pQ1 zx5FTbi&*#(2@B=w8tPpOwwyZ-Y`F#TYf@dc@tLTIs6B0|4Pa<ATa3v)q@Vw0#-i7Kqc(5cS6$4!gRS6`^N|MCgMSvt8 z4Roa>UWmU6EQz`0o?j9_G0Px{yGZidT_Eq!B%LIFglPN?J|P+_{rDu>VM|6%Kg>86 zwS;r6JEb&^!aLQZ@h>1U_v6bIb9pv3FGmKU9r`;~rc?7qIxbb_gY^k9)G$JCZK(ph zH-@MJyeB|~=*QRAKK3Yi8>v^!Q^;vV?h9UxFJ{DMw(^nuVsoA(K|^|sGM`}b+gy9- zlk|%?10BR)ydyA5{P_XZ6rbT^&=2$zHc~}8h+Q1fcH-qZ_*gu~4;;)E@(8qp{>fo$ zA3vb7oILthOm4t~-&N%@F zYJ-!K#DE}ABhn8m^DsOvleHd<=e3@>Rkzj@&tkdIz?zRrSg1-jIwN#E2ubn{l(U*& zVs{_p6cgS1`4%-d>ifytcm?mL#mrFe=czQjpMHq4``^z3ez5X>{%XoN-=N1i())>p zHIKI@&I5ws{mkQuOy18FSckL)uI&9J$+fnxYUTZmxZU`EmZAqvsQ07ZKS-RS-5^vF z6+9$Jq|*Rf=scKNh7I>YO{ywHeEl8}BB#Ml`W}&BPyD7acpJMAnx?n0iuS;*$N-?p z#^V8!pSOxzR^Q~Xj~buTj@d~6il-mqH}X;y4NFw)E+knN9Kd=jmR`pR(H|f_B*$D8Tt)RhS%BZcFdUiz+?1vK8#7!b&CVU%>Pd`y%;u2(>Dv zsFhGq^ApJz)Bac0FA`EvE>jIr5|rP+6KW%F8x6$wHj{|6puC-_z#GxzwfBqT*Z%S? zI>hBhly5#zP`+JFZp4=W!LSjl@kD{IH9%07%n!K{yC!r~lGaSwbZKK=@7hYb^}_6u ziw!ip@=?p9?iq5i-jj#TxC9E#d^aBS^ly@+z2YBm&od`LbL- zSd=fmhKy)gBcfsCOZ{8r4l9Wy1-*Q!zs_8~OlLrWjHs6{PFRj+^5u!?LGtD0S3rRg zoTRD9mmm1SihPNd*q6WA@S4M5|3FoV{f!{7LB9O(Aki=qYM)WdM~F_He7T%!UA}al z7D~R1841K+Yoe1ctN6i+d@0ULE`3Xk4)I9xrEwK0U&?~C2Kln`fl#;y$d~!l(J@%j z7eKyrWH67Uj#y2D}}jEy1}%gTwNrH^H$cUnWR6?^H10 z6Gp!LaEsA+xri%>!^jtd{a;42FW=6-0{imMw?eU9`4M2d;s}A0#F6$tKUlFZC)a24 zeq3HdJF@)`6PfJGcL2e_c6Oe~#J+5BASByawg2n!TF;cztu?&;kA)iS|DAY6A?$y> zeW~@6nUA6uP5z?|inK2&C{D6i@Xb)%I&diH(-{$RKex{02P;DI&-zncBwhPLa%%yEWCOY0ME!ch3due(ej&-i>r*u1@$$_FrpDgSb(k){m(kG$J0rAl zbonOZ&S*w(TH$2u&nGg(i*)vpwm)7+s-l(sQ6Gs?0q3t*hS2+$8L0C7HB(7PwRZm6 zdmrO^va|u$Fcw02;7a@B2terf$K6@x`(qdb3gi*Jee?{qm^AK>O_|pBM~o-b{^&9o z^l4IGw?9VlgO&ZU`d+5ZmK$}niL^idhM7y!{AWNg?2nN=Q6TOC`{UU?|8;*bosHAjxJ&M$DVS={c#(?v9v#w%YX(TOH*fT{re!id7N@;u}S}HlO@@^!P zRf`F=dCBjT&@CBmds=dU3v`8z9s2Z*cndIO`wy(y=9)&qzZNN;78I{AZTewMK%(xh z-U^H?dU%|#Ma%K0_GAo22r3{I^bm|rq7(#>w$m@I(s7CA#w=7u9$x0Yw9` zlcXu?{z;oOM@yF-taJzb9vd(yRhAs&TKWwbMO$)EXSXq!Ala9l9JgoaMDKJNWirW< z`}kT$cbuZi z8{;#%?bbbyZ8r&FaN2WpnZ4M|58PJL1hq;Mwc15>sD(|ad<^C|>8U%AV!(O|7hlp= zU&f>J8 zOqV&U1~2og!n$RK&6)kJB#UOTfI{msXSOatdS_YU-UlV9mU>Xo?otZ`x*+=zC}bWg zB>C)TkR*8fr$+<4@-wkDU7=1*KXn>E2kQKbATm*>3{j_fZ7J+3TUv739Za1mg{)9# zF^phnCgA}Hg*xvcbm(PIyJvJ@5-RfI6XSAF*`1SEeFNv9HZR#&%|UHWalkD|DD_4& zk0QO*w;>>l)qH}g1pW`20NJ76-A=gpRS4xOP!a>O`#E?pcZ;$qx&tcxeq4y(tHlR$ zNUA#ITMW_E4d-`qvGzqV2+54dwW*!rd9d{jRihHdjD9pK^(L`vcJZisYw<;?gp7&B z@hWh6%vwY|6L(VahivmybK&ChQCfd9BKqW;A$O)ka1-Y(3uzzMpvR< zsvSt6ui8yidP$Za;i{4ZKMtQU1heuZq7vOo=|E8p(p-n2JLr|j?u=@@?ceuR!F?Cs zCB#yWMp$LE0(I;wYJt;ONM8__(VWM-9KnSG=cug0Aay2D>@`K2eU49IfzY|&ReQ!m zq7EY2B+jPdb1{e?aJROppkHzuSk1Y9&b~=xLJ79*@+L;p`W!ilHuZ}jMSFj1TGS?0IS70-&V4Avu2e7}rD=e?z7P*4E z%~$Yv&cqAGsT%PvC3I*6C0yc=J(3B{-e~e1;X|$>24e&I6Uog}Of`WR9R}|D= z!Do8Z>mr6usQ0GT4B-bWs4uI`sIR+Viu#Et4fWLuursLq5W{$iNT@#pyOmL=l9Ym> zP7oB-%ZyY|-_P|X+FO4RA#_509j#^rKUhJ1#Vw5bhV!PV|KkH><*nx`z^Ld&yuwpN zLj5_|r;Pf2_KZy!2E2y`^XL_061OaS9{eD`_D1NXa^H;;qk2A=Ya|YDI z6vUmOiXE7*>lIk5QM4n*@(c#d{jEb~ztMr~6wIekk&kAtQ8HBmiVM<@mUaIuGj)>P zmteqUb|V8Wu|{$6)Zb*m$=42B%e~VVvvz^BfK0yY5ZWB)RV$99VLX*#EEEN7i zf^RO7B7ip*X-xaY>E-mKT+KKirx2)SRE^TbwguZEb1_0rEB+d)?2sw=OrC&8b-@|$ z7KFcPgS?85MOXRYTm?GAFfz&H`5=Zd{PMH`!!QAaO&1BL6XG*~-~fWnRRSQroh^ZC zAVDP>L4^rc^#LgCN2PvZ9@^w2dla4-{|oFfw7r*EyFNSw64bQPX&na1*~QFMiaX%O z2<(w>_+u({y0bILx(b19BJ2D3SQJ4to%Ru>h?$eM)lE#+j{oS$DsQKeVW_|Z|L_Y$ z*~8*-K;e2G+zYl3#m+S04q~+!LO{_nqy@~M6>Q186 zTM9AC6|et22zzbr(za#T#<$+T)61S0~jA|AF{G97V{@k){K@lw`D-H^*j`^cb= za(}s|`p7*;ua9 zebjRxn1BSQrjJfP1r~NA&`d1M`sf$=U{N2Hkr-AxVZbnqK1x9K5$U5_kStJeeKfla z6Z6~S22f%2(YAkps$U;f`tF+PqtY*Gl0nl)AG8Ho>sQd}qoMM_qCQ$unsLoNro%Oo zJ~|BJl=RU`Knc=E{duym`l!oFDH{Cxs7b)@gY{7@Wk^BwQCZ|}Prwe``aeqaKlJ{s5>EPNjEV81?U zio8=YK&+jQMi*xcCkX?FVf4{gFpo(exdEc!`lx~gRl^7>j6P}!P?|oP@Z~krN2B^` zl0nl)l^h`J#|T6dS^0c)P(E1HM|TxtvNk@fBWomm)By$bBpvR@n+(!NyNa@O;B!2M zz5~ujKQEP{!LN_z2mC%*AHA&%DX2aggCt2!AKm?Kus-^t^>wC?W)|T$@x?*yO@!A+ z8&Qd)>7()sLD*}fkBU93ah;}*K6(^fcQ0b&etk5MAFSx3#f2Hq>;pPHBk7}qDE20f zTMh_8`lugI7D*qqhlO}W`Y3*H2z@kft^Xcj8`s)&UfeDQINVEbAKUYkrk3N?V7WL8bXvWaD&wybVeH07x znDo(kfGD^=N|&If8bO88N8eEik^g*jZr(N1N5^_-l0nl)lUstUF^<-1nHwkd9twQqldnhqQS3^DhK>NSRWNvh7?pEokUio zrjO=N3D!qt?AMt-D(x!7&Yt;JWu^ z0;%-Z?d1n6`l#k*#gI|+jqeJkDUs2d-2@Q0gb>o8G3X_o#8(5t~DcBd@WWC_t z6ZEY`x7o5wOzU;OYqSop7LKCMM^g)R=FpR(7AkY@D1~v7@mFBfA#!BDB1Xt*#ob-; zE=VmD!e=s!vpWHt^d#c$WZ4|0FwQi7;N(%05YFz4jNQ@Q2JFJ9gffiX32_M1D=LBV zKq-0jn3&8ng%wP(_WXN3!@GZ$nd>Xi2|xF7{_c;W(T3??S=19O3(Fr{0@^Fs74 z*?OK)I<(V((sJS*#Mc9y|HXk4Wt`<nGSW0MA|$? zEsazKg((|(pTb`S6BxH+gq&8K@1U>>#e^s`!V{kv4_1lg{8F3iEM9|nMkbr~1NY}i zR^f!85S>2fpJnWR*lxh?lhARZKmH(m4vWQ@UeP-f6jnJZdhkpJy>p(kYGrmr8|ooR z0;4@fsPzQ~e$mxq$Q)D=znR%z_9$77tP1+?VNySjprOYFTY4VY1^KB(O!8AXWfbku zy=n*cvJ|9NBA1!3vn51~`82AHhIS_IZ1J_8J8fyyLql?CbtD;>bEuYn2|dn|>ojHv zmz)rfCCKIYC74=E$#q30LjTZdeurnbYVQy#EsSw~%kPQ=V+C|UbeahXwiNFqkRwec z7F zIgK4hVuYI$+o?Hm3o>(T>5|n=O&yjOzf!t3s;^jHoW$JvR$!_?;5tOWl5j)H3zJl1 zQflA)#aysvlg0&MZV>RIL#!MSLv8XVMHV z)Ci3J7~P%wq;|dL_8Ko2!D<1?6 ziy<;jH2eY|i$~>yb0+b=X{!7iCzysaH|S_6%cdn}fwtt2TZuJ%Vk)30wq#>K&3}+c zDw^?Z{uD|s-P9M})S-5iWFpLCS#d&?)&}UrOF*&pxmj`)*5&=#AT9#(mkjdaH<%cF z|I1n_G9Jcjrs4~vMEXS1d=eDe-7iVR1Dq1M5Pw;?`-QJ@+C+_wRf}UZ4OIJ1_+q-G zDPC5aYZ2Knp^Tf`VQE~6aq}d`L3a8r?ctvpZJ8VWr6j5Jm#MX_*)lAck})WpA>$lN zf(e^COm_{_G6+hvtayx>uGX(QrVCwz;6MR7gFB>FL1av&Pn08iTkKyd?`-6yd&L4b zS7bf>1V+fI#rPCuUp2*Nvc7X@eeA0*5v8VmRTCeJQ}V$XMI<%dR}UOz6q9~2MX^6j zU{y9XJB7cokqGD_Y%A{!vPDgS<>WK49Y5=Ug{|Sau*qm1Hkkt1Gz`E3$!98?UdAB5 zdD!AHg@(QHDV6$r;_KA|4WCEfOF}0FAB!*KgR_Puv`!vjw4yDcbqCPG>l7COLJ>?m zAuGH;($2P06_O^QOPg!g~|3Hw7_*Kt%-Hw>U6K(&Rx+EliTGK37nkz5Fa z{w0DI&0zE@!k?qau(rOdz&Z$6nmHLsKd{4dIT9N|Oxfcol!(3w>~kd|I+3*j>;kwt zJHCp;A9(=3k@hn*w^%cqJaVWh+u`sGS6n2vG(phl>ZbG*QVr4gUa5`byPh5HbGo~p z?e6s{vB#Afz?4#DQaj-`szv_WsIm;VQLPVkpR(%&;N{;Ar|aTZBG{XuuVFIFHLrh| znXN^R#%$rwtk0s7NEIb?;QC}DgpxCaOg9xu<1t8`Nqo^#-9s$c$(1tqUhJW5h-~v7 zBEf!(lA}tOE<)CtoUXbYVzge!HlP*e%sLTOLbQSU0EDuE4nq!l?Uq2DJjkG;ErGfN zpwt8Fe(|h_o_5GY=vNK|8l0q5T851H9G!sU6xqJF0*8f zS8(2ZiiRoY&DtXru@O(R!Znb74#&+k%sM!3X5|;MdotuTb;?CJ>dk~kd(KIPE`e&u zxQ{N<&0F>CzASs(ropFiQJu}X4ug0fv6RXYy;~>@bAWU=J1U;54Ti};)R`FOS9~ni z%LnHq`i-gCQua^g@7UEE)1dS?%#o@E%y>{nRPhqi94DcDFQ9na5vYtJmxdKsfLS<1 zzqp@Q_}VJn3Paljb8>lkx z52xc$;g=j;gb!XN)Y&7b@41X!N~e&7&1x&|uu zW4w@BJ_;o>Hs^f2c-R0FKE}UxPt2TJ<)W6ogumk|r^e%X7M}5EeFVcj^ye*f5pn5Z z_%ow~Ywgg=`2+AcTz=CFfA&zmNp0u;8K#gudgtIScF$v|vpbKDS*tK{vZv{7Xrw__ zs#e>VY_K4di-?omo0HS`;~-n!QL3EH)qo^S(A7MiJSMZ;G{Ip8m!SPrPCH9+3-T@i=*#fQmtSGsFR;Af%ZOHKR?Rjr#^zk9EhFV8k;uz=)*~Dfi!b zlY}osGCm>kKwAwQDc3C-GkD!1V-GL-{S{Ugyq z4kDM>2+0gi{4~m7&uH;^=7&w+8TeuU!0Uq_N;1BstNfrNUfAe-e3p?PMx|X9ei+vz zh#x+y4u1GzuZ|!7;s-1I&}bL)gZ+CQN|E@XZ>HpjhY_d`;)f$UE%3wEjDqt+*0%_y9KaT?#4C~y7j`i5N-fh7FDyUY2m5>l5&^JD;Ey>a28{Vn{GiMv zhBXf2hsC#nA3i{M+%F&Y@q-n9xJ#ncc&QGhNc_-Yh2)3(k!ujd54*PO_(3i>SU&s& z+pnPV;j6C={IL1?F#Pa8))z;%F+W`VPDi}3{BY}XqkQN#`aki56u)~#pN2vFu(B%n zVd8EbKWyR$EBsJVqEt(dQY3z8^`qp6YKZIy@x!{UI(`VJFBXq4I6r)}$iNTlo(sbd z|6}>EYYX#3{rQj6F(8RowmhEMkc9^0oFwGSEizDO48XVhNj!{>18*uN<%yy|? zYix(Z&0?8G6%_x4>CJ4%0Vc$MUk2M1xe~LrIGL^V7U|frx1Pdwr(p8Q7)!rOV7p=n zZxh??#>e7O`QV(-^f5dBys?SVn)#IhtuQyLu3RGdZU#UoeAf>ky^mM|6)Qp2w*=}b zfYLVZ1u=C5C|DZ60uBHD=q$O)Hgi>C^>y~R%R@?*EUWaDJmcJKbC$yhbs90Nu0pWt7^+56+K3bMw=qVUT*$_zeT&#!687rNI3KU(N_v=er*JT#LRt;#Ua``VNll&zzsf6<9k?&!~N z0!u!KxHqvRw*?u&53EQ`oEa;AWjr@5)Zr-ud=k~e0ql7E8$$K4$OZ%@KB2V*8N`!m zE{Wi_AWy$0d6B|()D|Rwe*(^*ZRQ#5iMM)&u_yk=_T}rpFwNfkT%%cdf5dXw$f_5C z&Kv&@`A_zQYF`$;SCLGbKO(a{*q{!A+J1Xt5IxdWjys;2AvYsD~4Z14)aHe(; zKm1Y_{BRor@_v5k$q!ceVeVQ+Y3XM=lp^uN_AezrdhX4yc{O2t6u z_!cMc()2@LzkbLo14f8Jyqp-}34AO%$_J-4hxfZVywU}8bt{deBi1dHI^ttMQFO#E z$ol;FKugTj1v?wVyt4k~sHniph@@SjVKhr0hR;i8rq*v!@pp&fpQ9fI^3Nk({{O%~ zg|qps#C)oID`72^MxX2X=j8!m_-9egQ2g`bjo_cH>va563GsL^lSTgN{1dPA`A>8! zjl@5%FOdAx3s9~i|NORwmJx}6vdD5{A9)!539wJT`p}?{%6Gax^wE*kOz(@cHF}4) zPi}>UuGdH1p1&&ksLvfBC1o&a_Q@M1!A27ia`x+^P5fX*A61kn)zYIBNguWPj9ADg zs;v#7kJhbXMxaPb!m_abuT+&6tlK9a%{1^s$qv^CKkUk4e#rmG3O|&F&8_DL$8%SO zAKJ$T@xwdC!4IReb^MUU4_5f0m_(_P9;Hb9&}gpY2U|`Ee)vAq0zZ5*xZwOS`8@+a z+|cg&;D>c9nICq4XoVmC{lv%*@qMofKeVhC#1FHJf*)Q)yxcDzzTyWf{BU*!qf}gv zQY3z$dLoh!K0pYvSLgF&Cid#ImkQ1gW8X3G!-XfW4}SQ5ITP>anO6AW*lZ&|-1qEN z;fIE|2JypJg~1Qq5%~7=!$LJ&W^%afV#gX_hD z^TVJS27Wm8#Pz`s^M7FC{qUZScwx`8f53d!>x)}^Ulo41vq}&@thxdG&>DenKR-<7 z2P^!r{d-19ysJYg5Ti`0U?MVUgyb7_+jV^1?PvJ(+vD@r1kZ|5AQBx;w^Yb zN4&87@GER$JwKH0c~$t~=39dJVSN<%p&0_-etsCs4_5dgXDOq!<82*Ek@(^42a+E) z074KyjO58o_~F_91?Pu0Qw;pDKjr%1hu4=d@!p%EBVJg3SPq+5&kz50zbgDtv|F^B2GmWe{ig^Ftecu)+^BzGjr>y`@7b5^ViPr}|Jo+UQ zugfGI@xt=MDA>e$epufAs_;X0nIL|!odrKoeA_P{>LIRgjUR@8!6;3bs6#0dKg^vf z`QbG{2;zskc`_4zi0NU0AN2PJ7c5lHgIEPteYlyi4#e+rO23r}ro50tUv z8`1SSS!e3$i0hv?TBh9TybS3mj%alK(3gh<7MSMR(dWR9lqy_qZO?evUaB!l?`^Kv zDK|###HO_^F|D1fwvg#s*Q3!jd}qEVVJ@pdvi)M}Qy?u>#-_DG$O|DrEM#aC?=U=| z>UAksz2dKFO4TcV$al@A#AQ<{K%7?EhP!4HFi6fUJU7xC%f@6}SVGsTqp;-EKj59O z5fpc4;Tz{#B@g2yK2aFRq)4>k=Zt8pHw=h|>DTn!TatSckXyjq!!%a&Fir^X0-8+g z(-&MCvb`J4fSw2_wl-eR61JZX@lWPBKmWLzhvA>9eXk?_**l-fdh&GxS;N%cmWO$* z@y}CFUK9Rtlnli`%T9rR1|x`Weo~!u-V(iSF?As@=;nzoRPo$`C^tkI##q_JBp{M+QpiTVlZMY@@=utc z@mcs_{``p=pIs0~AE&20UVmD1h!d;_(h40)2I3(wWFEN;GhUNZ2a9Q;+&l5HOcm>O z5`0z?@p;m5Hhe4`{J=J_NvhbCxs2nS@j4tMg>hHI8l_aR_W(f&ULe8M;;x^y^3;;-JYZi&Ah zS`dQ24$Yy-BJtN27?NtRKajsd-GQ#u_b*2VBan0M2P=lC@4u~wvA&<1mvVi73nU7e zi>9D{a@0qF@|U^z%a?DOf`iw)CQ?oHUIfTgR6U;n6%dzV8DpdpvdMO~r2 zhwx;fCVq|B^)bWGPcwyI7VtS&*?)m`Yd!q;RQP2;ZSN{P6-+!ofDsZs(eegBqWp;J z_)Ipp+kXUm=S2jnY46aznc^$?;G{-mNGOw(c4ZR5b6nK(0%V~3NOS35@%KlJW?^$Q zYfk`hrBeQ1z)%}V(WU9$ZJ4WIXf4AqNi{JrT0!d*d?wK60Q5j>fT<8XCYAmcNYYtCqF)(*yV({3s@=btE&K{(tl{vEEWn(z)>TO9Uj^gBDj1<~q4#oOxw(qr zGs%UX!{EYlb0im@q|NmdKcpfR)U1KeyC3NA0_)MbgIRA2>{epE&oQsUdTJx&W1<75 z(4WWxt{}2Mp)ejbLe^~M2>FZBUZ!q^_rA>b47^LKy?lEEzdh57vR=E%*DA_Gdt5&z zbK*=ESM5e=`#QYIJUpF+`6> z|CFs<(hhNC7`q8i*~%vEP{qWdy3~aPu8--E9s0UF*=HNobRPP`GYoZk5woU)>hhM8 z6w`|GCa`WBVpc33P?YyQjT*a#F!A4YZoZK>z00p-|48k1gl{lb80Q3~jt&ON1(Em& z9FL_!h$Yi3W-7^1XA+JJiflTEtu7B`75@Z>4Mp6XIBXxurls;ht;jR+9bI^b(JEyL zt^39hi{ZZNS;S%|2;_?ZsaE8ffSM#h&3f5D!NpP{2G%sLf~l;Q(t%6F4GExNSpW+Z z?4}en6y=pVuTW4c%G_m;C#?(0|$Am`2&(g-n`3T$TO(*K~f3Hw-tt z#xPE>8l#lJ0!Tvp`5ZS9Yc-^*xxPGQP%hO z?g3?YkJ=(?59AGQPd{3A_kbC-|4phvePk*veRu>Wv82* zb&E~m7g}kE_CnDJaJf7b;uv5!bTom5yrQh!pS06QHu+CGU71Owp9xI#fbV4V_; zQbrkJ%zy5Ad)kRWwUxZ=q5M-U_iInGQb7zxvo`?TA z1Ssc=>0XmseeO<8NOGP@ZOT2_9w~57Hfp#u+HXd8?`B@LNJ|pJJ&B3@?m&&m;X7OW zIMk>mE;TF?MaT$m%9R+?`%K7-^)%7+qZ+2ZbP7*q0x>khwnsJ ze1g*(x+9uZXns7A(fsB`D`;*_mAteN(=#tIRGUi;c^nsQc{)D7>B^1*Sfg2UWxdQ* zJzy+{3g|D8YNYIYwjEGG=$j}=?NAD0pHWoUl>X!@3)KO*BQ z(%xV+r@UYV&BcQye|RuG^9MuK^G5@oE->vQfIn`7mC7T-@W&H;w!g@R!GYZas_!1P zLzL{x9I|`Bj@_@;fQ4`X76LO#?bxftBqJe22y&MMDMTWlB6p8EAX;WH?K(WK(GExP zFox#KgN!V)tbUOwpy8!j<^rE3+vo%ct>nieg=sQojt8ai_+tlBI_CZc_Sid#ArW)j zg75y=A#O$N+*(M!_v?&eYJV#zPJcL?_ccy{33YXc^sh2W5S%o8g#0R z$|+of{!x62A?1lU^^hdf)0id1dC{+Lq!>N$4CQvP)bhnttj5_Ltx_@`{QdK?@bk1R zoE(=uyoJ$3Ois@(l#Euf$)1U_t8}(K{SdN$Hu$rDn%P`wv`p1iBiSSJzLLwS>1OIR zd`_cYp4~H3a@O7e3$G&#V0%V-H@8j8Nz5ox1iwv4 z&n%RXo>wd(?j*8*vYS`GoDz2`xDjYG;);y;-xesd%LO`xUhUA;pHl4%-vqvyi`chc z?OX=^1@+%l)J|md#XS=k^QQfDn1@Y|>yEM`GGQ7br$DcEUMJ2$r2V+~eLPKPB35!> z(D8a%tT>2ag5nu|evxAJ+g`*kEQ@?GC#w4S<@5RfV}6m#IX#Z4R$A&p;JZvejxM=aZ~hL~R#;}dKAa?!<@ z-`Gcod02j_gR&&zm!ilKV17~5kj5{c^K>TsGNX}R4MpIWx{y{<8HsdcEV@@q_2Y~A zsWNj+3rLue^E8fmxWE#IEm#7hDxW-Qq3}T=xP3E;{IyP|*sfb5r z^UBt_I$mjfuavBhhmtG{@Jox5A(?{}-&(*At>ih~mc^m<1P>}Rd zQH+IB@Zb|gA4Nu7{FcsGALy;a8hk=nv%kP_W-bb>iBI-mdgc?>M{ki-@#~{BOc<<> zXui<;sMmv%YAGaM>V%gsXdEU*Y@6=>qmMlGyj|%k87zUPp2#9uu4YOa({D~Mjeg;+ z+H92f=&jnKcdOdyDxG?Y?ANOw?bKuY8EjH(yiWb_sizM7UZ6LDg1pjSV1>M`LDDN^g9c1St;$WzaloBvPvL#}4X7$%&vhZVwo z+Q-Nrhwf6f&wu6*xtfD}_3B3Bk8`=;kKzc!`_&EeM@xKSjX&OajnSO>v=ua0J}dcS z2Bz1m8;w8Wc{&sRs8vs|ZX)pqDFVn3Mdg(3tekxON1i@6T_p~oBTvD!PTSE;xM#X+ zgbVLA83$`zFF&$tO4)f;jy!As&{T~6$a5$gym2(muVR!V&)o>VTT?MFjbaqXcC&)w zY*dPq?05y!YbwTg`U(A!`19;=ykVL!Z6|G+^pK{DE#2ET2c!R*eBEhBe@Tz&FevwxW2Vc&P;GB5y zRVH1_t{UmWYnOhoz4ejRd3VrF59j!vg96_wK}L)^8Lec&Zg^$gt0@)QwcF;bOE!up ze#;v0#zq8>>FSJgRN+t&Ux+e@k}JFsS%-?JUSR~E?P3MN@jWGPJdNp@Hvm&P4)dX= z7*D214NzK!Sp$3}r(mTK7F6WWpL9x4K8>NDlTYkxXW)lN%l;qoL(P#)u7;hhkgFq1 zYxNb95AE&PtH=-U?F_{a>sNsvGDipU!)1J8jUN(UW(3=HvV!37rzJl;j+BB>{BU*z zO=iLm`(cAw<%f%6OIyaI1N+wdUWsqr=94Y_zJOSI+~Oq z$?y+9r1mpMsmXBWgvUAD@}~owIQ*fG%-d1(HGPFM&*vCzxV}bk@IlkLHaxWB2uG{ z;ja`=3n-4gvb8v0v*vJTC1-izEc=QaQOXrc$?m_C)BnUxN>v=CD%)IlA+Jfxwn|RF zjM+*eOWWaTi9{>?rENj8Ib!!?GDqy6>RhcTyE~(S-O~w0GN>RZWPlg7GTsmI#-ZmX6Csman^DELn*4Z4 zaT^nCGc%K_??{Q;Fr-vs$s6pxRra`3gHI=cEuGX&Qk9Y@c1(8vB35oG3@$=kZyy)* zA>VB@eguAwS^<9EhrqFWmHZOD!Ck%Zov1pJncO+p(yhMTQyJrdPw6lYeSO(f*s5w$ zc0a(7N!eHy;M-h$31lG#X-aBfwm}>m!hp}TH3eJ+fSD}B3G&)h(V+^_`aGa}$09~q za9XEhlsYNXdV^^D8_^n-lQb0`I3l;&MIjxL;}7vbK6JtL}ZR%j-#F-yajAXx7oK(Isvuc=xvk8H8$@P$ajCq%7} zNf4P*Yt100*48$#YLO>~89 z$&w|NU3dm7b*{u1FXd`u8qu8BAccl8PfoqVtPU(&u8xBZ=fqHYQ=)`6%-_IXUgmdR zcP-!Fx6@GC*lYoQf_r{>^v^F5;!0p&u^r`T<^DA8n!lJw6F2hcZ|IibAp6m%FE%8& zwTvDT0twZ^T#hS3^*z5}fvMpQjWYmCH)*0siu zFEGl#rkJ99>Pd~(*?^&=^_6Ii783AN=73)YV5t*SN-wFPQaY5@@ctZ1Ydp9Z1S^A3 zx>0MS;1lawW8(8ntq&j5Q7f$0$b#WaTH_snxQbe%B(EWo);PzeVjfFwzt;GzKP^3! z+}CT32RH`R}3O5E74p>=)n zMjxj2%$BAouS(HqJsmLqqrRvh0oO1GoD9H5eKEeYO6gGgV%blj^hL2RL9jiD0~_^4 zRpg^u*B9NNWoivf(orj{zL*TFne@eT0C5%d#ja;)4UzOkE*psf`eL>=EW#;6+Lyul z;@PmH_4?v*25hP?8snIf;$EHXUZ3oSSL$@K`;vIzVfh|flbgr=>{88bgbG@R`-nUT z$~*K%;x|`vhu&8h=WuOK?c&I|J2|5f9fqP$+R_jp06|;Q4Js>b;~-I@T6?P2N%rAh z@guq$R8my;m;Pow!ySFMVkl)XKO+5R_ppD%QZ1linqC;k4u$7&Xm@1Pv1g20n&RFD z^B;9r$?hG#n7QZ5MI~o6L=ARI?R?v~j(oU(jPE`l+~4k7PvyM&O8`$wC)k_PQ%Bbd zCdY13onX#eFg)uiu zGQe32u-{%pKpnfwg)CzDQ{{sb-U`s$wG<9fq~6Y>e{x)l@DHY>`u|1rulTzsZ?(dY zXj^R&wi^9B*o}IpU2e6@0Kr?$=0xFAlo$33GUpl}BE>!@X5JC|BPyLAQEn5=Pco&hdOJzb1h*WE%ZK%q?Cd3Ow(v z2(M9recP2aUllgaRxv-bFimE6CvD`c&NxDpX75XgE&6x4(Sby zjHh^_2fw18%}tRUN5w!AebE^(pgVG%nY684&jYS^2X>|DmV{3rtsXN~sePU7uWOq-!$1hc|29JkWI*;@t{e>*Hhb9iEA*4yKPZmy>}aW#)J8bFEm z+m@@e&t;w-M_+s5@0|4(e|V-3SV_e`uX7b{G`LfMNrPzS66fCb!lsK1Zu zvgp+awwCP9==-Z2b!Y5L-5Gm9&H7Ti+C8Q3n^QI_;})gkSr@y96&N(|DiAK&)ATmG zZ-cQrqj|1^%{7Ur9&~$|g`Q{WUHHXMeMo!p;Tt%7mq7flHgGt113l&WF&N(r4q+Gq z=+8I^e+BB+!_ci8WPir(A^S5n#URaTe&l5di`UPp%+ z_esu|?PKi6*G_U|Ehu{JhP`#D$RSyrPi(eae?@aAvexg3p@ua*qRI0Yz0a0*m>7y1 z*0g~DNr^s3-Cj^7U{|XIa&$pa#2bTJUe%ysoRfpNr7xxsFe4+e8*PS;Kx;H`-)WD| zvZZZi31w$H&XyL(x}s?zYy%3gXdr{Ofg{$N9J|$#(JqREnqSbsv1ClfkI+6so?_M6R^ zYf{{YAjRl=vEBzeF$0DO5j5>f@PWg10KEZ!$6o=80Rhm&xJ<-96RYRSi;bfd1N02N zz4;gcTrjs-yM!`26zhg^da*r{Kf?An*_Ge4i-Mq{0V3@*aGg{G5>crcgAo-&J1~;t z8kr)wAfD9#qxTwMNEIwwUU_>mFxh1&ELFkhqKJfdvmPF-U7D5On1Qa12_(m2xc>KY zVd8(gM`4`w9EwBYutIj`YO&xu79V!^4n9--Nnd*6YtI6GHXWmj z=MH-59&XA76P;ge2qHbvo{7}6p^ivl7oFZzijXb%v*^h zAt~70cC-%WFz7odE>*QU-1}H>ErH#~8Zs5e7-`7qh7tOX7OK2*(h&C!9`z+g8RV6E z|6)k_(jS#N5#-CyWv{J#S#ae4Oup0w=>INXF0^H?D)oSlt3u0{x=jM*%ZnGUfqZ%H zn_&6!$NShnZzBASH!bDMZ}P#Se2I}r-r2wu$;aZrh*A=WY82?_qf=1$G#3FUzWcI`n-fNyHUP;flp{}Sd%X&+wh{JEiL*E zEE>!wE&{|=mM{Hy9TDV9he9A2SvIPCX=oS`O1{*fA!hQ$-%nUtFVs)?#(Oz?3;l$p z8u!JlIz(}m12C*ZSrvm}SgRHV8P;}>6^nvy1y)kJ92w==s%Su}tl)-qwz&HVev1#) z)mSgQVciYo^cw4Zcs79bnz6`NRolid4XoE)TE>odzl^I*3U>x}^jjrBIb>d22Tuxfi7!&tSEo;u!|mJ!LW{yj?Lqiz@) zDn2Le-}T&N?<_f6b81UkbizALaSzQ*UZI)62U5FI&$b#RsqgtucF#+&g!9->O7?GZ z`oGO>=|AExNA$rI_kM$a)aZ1~a>T-0348dYBLjwMw9R!h3{!Y>34l+mE};W(jsXnu z1K7g={)PA{5P-=5z<$2V=-QH!F)EW2RX+PuYQ(Mty8~I=PpTGoQ}%PI`(rjgS=k?i zTI@DQ#?8Dns>&?FV1xU9K-SiS*4}|uIoaGY0nE)FP&h)#*kW5dCuu4FOP-lSDa?*% z@736GDU<>^O#^C&t2Q8BJWO5_Fb@4dboz&s;?Rx!?$Q#$B=E@CTq`iUcK|(ET0(ER zgjDk-yi=dIgMJCy{?;$yc6A9A@tVDl;R&`sd)1R%Ymxn!nUH=EPN83s{g{2V(64oqm2FpToZGJ`FLWBx3_#tE%^4synTh18ts_#{MbEuoDuCAjLQ?=<^1#lxA( zsK*So`YQjk7$A|1C#fj*<|Bt#afsdkC{!h5&T0o*8JRx$3HwY+E z0z?wng)AP33J8iQDvBZmF9doEe$e$=eo+i^!B3i^Uh>9o?OI0+` zJby64-`wB8(%<}0TIUWfhQH~mCvZ{yP0HW@D}R%_xrF@9^Bq|Gvl{EPKf1s98u4hD zzX=?Gq7>WT{FBB_C}Z7(Yq$wG(?WB3{R~YgVSm$os?H`W{$|JPusI_->HN(i`C!xE zl$G3G*2q%ew_m5(WCt<~RGVBf{$|*xI^Gn2Q=WMH)FpXif3rtE*z`Boq;gN**3go- zhp?qd^*7BSKb5!G{LS3v=#yyvX3tp2Clf2sMt`#q zZ|wVMO1%N(@-LszbQpU zV)r*G7~kxvD@A_>&XJaR>$Eh=x-w;w=Uo3te+V zu}vw5w*{(7r4$1mdiah66Yf|i-9SH@=HezeVEP6phwN}R|^0z(nUrExdtEUHRMYTpo$8CsYXl8B%&fqc3 z%*~gJ4hQ_}hQcTsu7y?k7`+=cEG`sT}6;bTY=P0F} z-QlR$&anSp&3~qNSG~dDoakSRX6Ud83S)pR+#9jK@-Ld9!*0CRz&-X>jv-^AUwYh` z@etO-FY#83OU+KAO+N9b9itNINB%o$H4uy9K0I~yw{Fdg;=8R@1AVL9iF;M+&==N$ zY!K0ynyJt@!ZcD0G`^5D+E_2V(~6^k#y+w@H2(-1DNLgoj2-r4Iz|x^T>dT!A9;A{ zBc z+lDE(u^hg=LMI1P)c#dpZ)y_MCMf-w)ry;dX{4&?`9NPh#XQP=0#KI1CIOY6NU+0c z3<#gH`Fm`cQ75m-F2YCf`TZ#H*&1u+ zAwIvv2k|oAkoy`7y4HOD(u(=~vz8^FN3YcQTml;4Ge0wj`J|k+K>ecd*@IYN2St3| z^e*)&&fX}1ZE$2JOFn-e2|n+|8g_`!hQ#Mvctd<{M$l%>=jvOT&s~@6_%zk!@?e!h zz^x#`9*DV|fk}*g8PvUEG}jis!XtNIx_zg4mSs?YQOJSsbUD$IFWlh;^FwzdsO4_c zmD`}qwp?Z?#zEr-mD&-eRz_Ee?Hh;GXCe&7SjIJv~0u1D+nxl|5FQX0Ah;m zf9lING}E`i6ti8?3@y|hk0gC=!bS5xp8uNppGL!AuRg`{a>!n>|JjZ=WUuV`pN7p@ z{w*)Hlz$Iwp;!ISjkNgB3;t}eO3MFCcq^L!Nqz-<{z6%szkQR zcMVHE2O&;Y`Ro8$UIhR1&A4d(r`u5Qxf%=2AwJpv)KK`e=YQ^P#(X|jUB{=XE@xdX z{m(-n5!L^c$pLFF^|MQNaSTz5WsVimWf9P;9%HJGV zi98RMb8tk^gGuMM%H5$*CU3!>h0^Uk+C7jodiOF@^f! z6uKBG%qlvCiIPGSP;g`pp#g=)#{eUhHASY9Sr-+DXPVMxrzPe)5OAd!=moa(XvFGv z#nv}S`&UJ?3+9)yJ&S$s^IB27OCj?a@y%-1#uh`W#RYsI7i&W^$D)v0q4;(z*S0$Y zx=nYpK8uf7kHtu%*YmJ|tFUkl17H!;S-C}PJs^YpPafSyUXm&9 zx}JIMQ`ru$o*L2y_5=yGfuP+Pv>o1cG};(zi{h5+nBt*II*RZia`$L6o*gcvo2b{_9wK#XJYmg)_8;$ z?}*t3wwTRr%*?JYXNTD{m1WPa0tuDbh0hSP!$CRl1Kbf_i@~TfWv+Bin9QaLQEBD2 z$q0&PDSEGG&O9j2acN~3S}J@CHK@?QtD!9EQcJc`N}g+ERdVk-rs+^i_ESnOv@AJO zmRvJHY3=JM*(?W>$`rurx5`+Wjr)j}zslof4FWg0@5P6(Slu{E$C)nuqfA_&%<&?) z_e)Sntx2rP#NdYf`aj1==yYtQ_Zg_u87vNy9&N^Jk&G2}><6P`D=h%yX~-j^sGfDm;T-^Sax+*G*TmWq+V2Pj3Qdf$<}_T3*3%ktOO(@=SfcLVqVB;- zWEf#o#r`3zt?&e6Fd^6k-zN`z~`_c;Ww8Q%v1!_f5mTMZYWN#~NknB{6 zrafUX!-JQQWaZAn?PBsWHD;k(JTTlrL$Isxc|70>m^tif@YnbSDIRh)2yQ0jrq*8( zbyr~u3dx$qgi$>HM`b+!d^OeWPrm1AXwNTK)3_L4X#7uC{faYqqiiX(P@#5LF{5{v zGB9eQLW8l#og7T(CaM`C8GnHATx!ujiBuVDk+dWs{ZY5*Y(qeYhO!ntigJ_^@_hEyNA&?@nfa$)zztIBZH_L^pK^bzF-zMti`1Qsuca(R>2P#aEM=0dUG3iSE zm{jif#nAV;*;x1w&y>fitnpQ_k&Axkx3M)<)MvS#j??67o$-6tKTG4%kVt7bB7-h+g`$Kg`VsV-b&q?%!Sj-P> zcq~%wD@yL_7`dC8593UUWyX*?xg2TD9+7}71LaC_^;-J<F>=vw;1=F{bT2HhwwCL!sO{P215in`6Byqa2e!s9g44C`_Re45uZ7YM9SUtJkzVLWG!xf;R*y(vr-aiUNhZ4mGXxp`?*^gHiPUowu=dL zqK_)rtk2PXSb>EdT#vuP)!1q<&*$cX4OA`O7^Z0Q8>mPQjh}iPnmik)Ws)Yph}Ytb ze8^lZLoo|3TmOf-bf4F8i4m&Ik~WME2hk27`9*X;o0WQZxY7 zeJx4OVm#NT9->6aNl3e3TOk+wyniaTVhBd1C@vl~6rgDZU)YM>JxUQYDliwN%=4pl z_9Yp|)R28S6xF`m+Sg!T_8ROJ-dv297D zEznz(9|1Ye>6i@(2e#wMS|7Vg;*Z)QKAQHu6ZQ}VZx?wuktZbLEV?{~iPwaz19^Cg z8GKDqNb)9rc~LQGG|?$d+J}z-c{~3jkyjS4#no63C#}1K^uQ8%Pu5~FzkEt3=IAEv zLu^G?P1;~eFW{5{hxbhYFR%f!jhVB#Y(GeFV*3jUXH)S`a`syva8^;_>~*{rZuyWo z5yY%Hd*gEEY|2R;XX*aw(taKa3q2N|r%>vUm?WMwWnRyzzP5Ch2{DP~@ z3q3|6V$)}lZhpD_GL~uj2~DO2ruX+fgP5G}GG}lc6*F+I55kXP-29?k#tnlez8wOQ zN8J4K?nBU-wOCxH)j#d#mzr34S4KI4<3~AOj=bGQ^hjU^pE_=bK|eO61DWD6R3Gi8 zk1AZ5a??lXTJEr$Uryl=NW)DZA$5p;-U%7n6d%s-UW*grXusz=q%`9EZVt1yr23Ag z()rzczogMK)>^(Gx8gaM@9=y}fB7>S-ela_84))|S&`dckJ%kuKyg{M`0F`EpnLfpj^#^U)Dr?di!&%mpnu`DXoH1!a&(i?pVnNCsLlc% zcf=r2lUcp*PfBEGg9Ibn;e8k+_a#BP;ufw+nF1qa;_>J~#F)Ct)5JyKfLy|2b_oYX zoK}i|ubBZgm+as|rO0swqkAKU>8 z@Hbfu6C>b0 z7M7#Et|+9|BtCpr(V1ktmBW%r-JvtNHKoop#%obAfgbG4T-@bgmiipB!;0zTL1Hu=@EpDtS_&kT-5ms-Fz3%UTh7>(Zx@sfr$4z zrFh!J4M|1EUvPLXhdoB;WBRMmIf97JcX-ouvHcI9%2=ZlW?ws?`uHL3sQST}aUP1Q zV+%Mi|3@t~PL$C;mM)+Y8Yom#X6xzJ1wOP&YM$Rj^C%SftP1zk>;rasYQsNJKCmc_ z*iljYM;Vk{3++HyocPNRp#NW3BAHC>u$3w$lA%q*_nZ->PbN2M|@2MH}K@qlVT z853Ag>n5r7GgAANx*&4b${0{nML=l|dEW!gbP-R?_J1@AsWpj}Pbp{~h_^19?N8p? z4U#;K#b)vV-SJwq#_~4_@gwR_OCvSB5)1K-eFh<#%td~SkelWreITLCFzkj|-q)HC z-GXaU5G}hOt7u_}t|!A?26Z`RV!t?Bk(v-*P?^ePI}rFqu>-W<-EiJV1paqjbo~D^ z<=?>neV|e-{9hvRA29Umk5XOXCk+#G8xSq4N=EB-wZAPn{685D|IND+{;}X5hJUw{)HVDPaIV64-!SgzogdBNX-oYpr#2F`2VJ4@c(!O{sVUt{;|NV;U7!;G2p+v z#Qz?H5Y6y^K*2vqMB<-o3Wsqx{t+9i1G^CZ%UR-oj&1xSyOEfW^#A8V{=anb{Qu$) zqT&A>`+rnjLjJ!us1ytTWhMT18T!=>{|K4Y%OM&6(~FIN91uj>+ptX!vh?C*dDU z>S6fDn;7t4M&f^`9TrdQRqziIMZ>?O*3U@I4F8~}2^9GMs#y3}g}JhC1pbe^3IAAG z*6@$@^ce78TH=3)L5ODfM|92pA0#62&owFdmo1Ls|7B!p^#7%F_zx8{`2Qbl8<&4B+8O9ub zL^J#&x@P=?L?r&XCM*2Q$kK@a6PEa&W*h%2FFO8rj{P_AKO9twh5zFc|7#5WYKDL8 zHP_S?_@7jA`0o}C|BtmL{3Fve%>OI7r#9#Rk4gNmw!`9yjSBujqGI(e7S918jI~x9|EC)O(X2Z^HLUsCI5q-KVHP&43vLdoF&&ItTBx{dIUgCjNk zACC$Dha~=27=&nse?-@ee~^g8Ki6c1e;HXC@qf?~|5I$^f9XZX|FO(}1OKmsO0n>N zK;r*TL%*8g|1Z6|0{`Pn4*%|G_#b*J;UA0SVfe?J7~=o^690eLVe!N&1^*yXH2h0y z{fyMi@DFMR{QtLP@ZUKC|IKb8{2$ii|42;u-zV|^yFrL%_(ycj_y>td{BuoK_?MBT z5&wHF@&AEs{Qq{*@qcc_zk&aEK&4pt4@mqkHT0_){#WSL75E=la`<;e!~bi|3IA9m z55qs+#DISx@t=92ftc{W zN8&%%AVf3#Bf4h%gG40$xh5<8%gEA*|J|1Of7dqt7f9wkH2sYHzZ*IKuL%BJdJPES&t!|TxH_|+dKF@6(r{I261zeZF=hMUf_UJxkl z9JxT2U*_~|NBP@O-XxK4%`3$N^546-gAV>?=pYjySHnj8dEk>}n@*{E%I_&_aA2ANtvASQy#qHv$HrqxJA~Gn_#pnm8$#=w zBv#8rvjoXUV_SSUf0t;jkHiEGt&=HRuaPZkpYLR;%~@=anh9DrF4Id5_rHw=S}B{_ zF^|sg%G`}VeH%R6$|o&wjNO0-Rb--FsshMGoXbWDc{w*iSWg5bAiu_I@s)hAnUHs2 z2e(I#)_{_3*O&|fC_9Ei>7s`3y% zXZm8pXMRdFd_HhJRPH#IoQ?Qwj#Yj8_#Cp0`53*x4j013|7wTDS&Jm%Uk3>d@iFAjCrE0IjnqsK?*uhXpl8IG%womQsxZg3R?LBx zKi}kPNOJBrX%0Al{+xWUX%5v~xVR6=c1^*yXH2h0yjg8dI@DFO5K!N`eC4>J~ z5%_P>fbjpf9{=*eF8ui;a^f~Y@}v}e^Ao|3jDuVGWc&Afq!=$!v7jQ{^f&R{O3#j&ol_p4F8C( z8UIKRh{XR2JNTE8r4j#83mWi`Qa17br5XN9EPwvkW6|(m()shRgG#aRzg*&fhM`~0 z@Q?jT+Hw!@Kcv|BS5v;X+z<`_pVlJ$W7R$k|9BGv{{NKtpKgc6S>G%82Z^HLUs7vq zq-KVHP}2ko{AUyk|Ee&@T_1t}9+wmTSL*REAME1)4~hS;4MH@-KcZ{KKhgst@&CIH z|DiPaaQ`nOOC$cH7Bt`=rEKE=vx|=ZbAA2|{J#S##lrtGiT^JR{c47P>`&6v75IOy z?O*4RkR4F8~}2^9DrSTgu; z5`q7ImlFQ})Z<@1*u{UI#Q!vd5Y6z9=$i45^nghG=i0%)j4X}#k6O@xf0VL`|Bo*^ z{>$|KH}F5XS26LwMB@K5L%*8g|7*Rv0{;U_4*!j!;s4iagnulOhv6S@V!;1z68}@} zusG{01^*yXH2h0yjg8dI@DFMR{6AeX_-`12|G^Hz|582v<%3=PFP8ZK)F4DN{3E(% z{A1ZZ690?r;9o|TM*K%DXuv;8*~I_ki;n-wJ^l^+f7ZR2_+KdT|FNN8&G3)?Nt(I> z|4)`2{u86&Kd&<3AIsul_{W^(ayUIrEk@drUdLwpSRIYT71(MD<} zh@bYMUZ7`$c(_>pSrz7yT8cT)@^g-rh9qmF^T-@JpQzvRcy*ao9rR@3V;9F9Iis_%HbSW|a+znL~ z2gv7VaR*hMVCWzdAUB<)_cTYvz}~U>=Ql4ipjGkD@5MvMe#DY<2(9d&|G^vk{<)>( zqr*FP_;>;vnh34!kT{^BH3t8j`y)$j{dfa46SSUrUoW*Y;EQ}OWG>wDI;XZ~x@G!uNj`JP_Wj*9#qvElP@jcE8Rb)iz6 zNWdDq5uaW0#y&pBf5&`$_Ldz!^4^vBoB|R>!speJS}P+p6MXgnHEq;!MojE(7oR!R zBk;NA9E2sX&>X_&by!R%IoZo^AMh>9Y4|vUoJ{aJWrD=#iy#q!&jwtR1wO0x)f}c8 zKkuCx4cK~ou15e@Bz(@#ma@2r@$f-0q z_eoe6<9v8Eqo__?K|*1<^41o2ORnkLXQVp_KniJ!l%qL>3MeqMPBlH7oGXEFyIKi9?Dx_xud zdpZm8S-(MuCgxz=f2BEi5+owx=bBuTVh+sW=b#Me7~5+6yy3l*c` zztIW8KUUSl@Q*h!;QvdB|JUrWxb{s2{~%E`{7Y&bjMU8V4{Dk~f&aUUg@09;-(C`d z|4qjT|1ykNJQeFYf|uUmfsST0izNB({%U`6*S-< zrK01%TMFM0(FDa(e1AB7f8kbb7w%x5?U6$0ij6jWBXlSHfequ1%oO~Q;%SQw-FqDVZe14xFziQ^3eUlE|+!T5^Y>-tG^<-EtUL9y#fq-$T3Yr}5j;wN`G-RU`g_D( zhI_;n-d(;`F6@eTXV-97s_yW`W2}=?5Cu#eKS{;|~P7I(jcj8{Pt|=%-JF*v| zYuwqlaL>)b-`RDz@22BVT$=5S-{2Va3=5|-t|mU6;~2FDPcDCpEBR{TlLm1d*4>0I zFC}&*u5o8~i$m)(dZ#(&jUln6d6(kyn}r^_erY)_9bb}Ke{FhF?%+!8DmHTl7dVqv z4m#d0^F+oCf&N4|yKJvyGSHe>amNp7Vb7EYQ+lPyi+q~pM7+ecQhvIn&FS;cp?`Au za$&F)=gdvZp?`6;l~_8JLAlYZfiefT;8KamyJ*fK9p63@tf!@W!eNJ(Lu4uw7`*hElR1;pg2%kk!bghf- zaTnf@OxM87Sj+USPgtg(cyuzw<)z#O#tUKcd@!i;i}(OEI8i#in=mws&Meiy} zueqKcZXuL?7=8<3H;_~ni*6wt-w7@;>r4@@Od5+qYE5EtDa9o|kGC%0Z;<6*2O!HO zSYd|bybs~ExCHC>B*t@yF0IAb`C}I2gQG0PIC6|8#%`dY-VVF>G-QZa*#@yKA2G2* zBXz_~Wmp~bR7D~g-tB@eg}hH73uN8CH8I{n<@W7$WM-nMTC?aBUnUN3oxZeuzViBU ze1u$w?uT5T`Ha7jXz#*nF$2#e+O?(aaC>+Pa~rScHoAs3Mj)?h=o!#}X!A00@%>(h zcRk!~puZh@PT!Dx@rtDBAEA?Qbei9dCNp!0?#{-%BdM`C)DfidtVucKkh7jeJDj-r zF(ohwf4Oi8sbgN2^d)?eT8d{!`Lv`((wQuGCY>Q?($pEuaVF)lGfDTYb!7ITTF_3q z%5r6}G=daJGo33WWiGc5LO+e=UXplAycVseD#{GMYpu+~KV*r&@v0^FKX^5Xj{yxS zaopnxIRyU8#B7+^s*+wkJv~#`l>(A-ZGjw@rvn>Vr(bdEp6kFatgZZo_~C*goK+NX zz@GV&0|5wUGghZbI6vdHs3#?rIl`83`b=iw3>vNzj%j1x&ZNc$#nT|+@*N_j{|~4H z+H-UEi<(>+t4+#WLl~>OAv1U<@hCW$%{@UqkE`1^PNHTgC6xiNyukgmuIOSeTEIou z%c6PWL#-%QuTdy3-50>E@9Ej@e7;)kb(G>Fr;jVtp4N(l+9|0~K`zu?EtDt=<%wJM zg|sH-IYCD))c~c)Y|ufjEl?0b62T8btnunPZVNvmd2;zSFs%b!WCJN=`4emz?t@NI z;(K}j?^-@&CMY((AQA8$buz{DAL0)g(|<{kl;&%TZTdH8-h z2!FBDKQLYm$^lWjTezLW(;sqh&4rHAe{J3I`@_TXJ%%_GVR@b_aj6>Z--6N{%+dA5 z!Gz12t19H+L$0m8{jF&nV9d)j&oItb9gZ`L<+vIIYQ(+ zZsrgfcV_IXjK}8kvDpbQjKG-sG$L9yzNBcG@4)o=$qFG_rl=BpP_&#!|I(pW?@weD zfBmwC;ym2XO(ocL7_P!wK0*mYloPb7-a&vo6?mJY7QXa~Et>E3Bu}R0l_Peepp&k2hpO?k8zmURXcpJ!Wy~O9mEyl`O)D7+Bo*sx(xK zK!Obw$8`rNTHY_crj#jL_9!wHog}rMMruSx0_77)WhLb+X9oP`9XS@9MwL5@4hNOB2!a)>*KTv&(QCTWooh8v(Ch!@(z zDpK4*mS)sDpiGfQ+rTpX;$!m2gN_A$H`Yve=bAu_U-3VQhjmTi+4bh3@kta}(ZlVT8w z=u9S{mhLyv&%a;MVvOygUK?~LnYmH5!6cl=kXr(7{G~*0 zUJBeG&^-{SyaN}(+6ChsxQ@)aD4+x-^-d_FtblhiDCxZoqU?x;Z4%`X8h*ScA2Kho z#oZs{nY+J-7`QXRdT^-3`Z|!1L5X)b3GyS@M)JR}a%HSjA!ncN)4VXd;Qk15VI$aa zFQHhUf|4|?q>L;Op;Cb0_HE-rEh#c4SAQ!?&<)`=wE{X)bVIlrAe2&zOy=0a>PaaVYX?>J2Z&U{uHh<1>Cs&Bv_ zslFk3=zdJn^~4*O|IX6szEgZ&q%Unwx_=sh%IRBXm|Q#L^z1oBi1q9~<;=dt=^Hl9 zS?N}XcO+^^horQ*ulcng^=2oUtrDkxr|y7Nu9fb4xPmh~ZKliDp&CN_bbpm|6ka$| z^W5H@>He|^YUA9FR0O%f>>+<-cSHPkB$!a`y6U8+`EJ~|>^aX(b>dEQeZyRdzqzu9 zz(^>~p)0JM*~we3Mak@TwVb|R-(^eVor!F1GNyB0P$&4Z^T>a;-dz-@3c$?&7;zG3-}dEZH6 z*v>INmrij!;+V9cUH#L}q;7KtS3yu#v7$4$(3!Mw(22~Y>DefdnM!_JsZaDgs$iIA z%p``V{tXO!CP)llPX2m{e8|i}XIL{=K{8j{$Q%op;wPiOzWqgs;Y*Pw0O;jpB6>$7 zy&sate!vdBbl)N|ejLm5v*!%*G$EPy0^})gW#39euL?<|uj>QjL9$SBR&{1~%h$`( zkxA2VTvs}!&n^;`k5Cx2p2x9I;hVh2y6a|0wAnjMh79A~_#&ReGafQOMbBCb_4_xO z!^Hy)98Q%Q6CRfAex8K7N6cfA`!jRUB!_nsqK18~NysE((T8gsPc@{>C3TRNE(aJ? zZB`e=hirhVa~!f?+@LQLy4appD|BPES|~*_Ap7_@3Tj7a_T%x5GrPPq`_5`07u-ho zUCZYRq34wQx;j1kTRDAa#Q_X6GIKKS2ewOHjg`mj_Q3Wl4e{I5hV}d9rZ#LAAD`~e zXjlPZx_J0q!gOlGTF&ejD>OSH-dsj1wKbTqqA?XkG5Xa{Q}8R#;#NIVdN0CP<TPb*I5;lp3zisJthw5=aKmCnIZAr97zGvM`yl{N&>U-f4oFM@+Ct{ zs|FbIjF-fDB@N+uIB}J{5e_Xx`;^5<`B)jZQ_yyboZeR2)t^mCa7DU#!h<@tZ3VN4>*T?ie z34K4(Agnzaz2TDHI{cy#dLex1<|mXBaFbC1so(~%s)Ys^5oUBpg<^8YvT^DD7cuTW zk{*BBF{%N%ZOZAKGt8;;JoN#hT6|@&mwSD$4B?yObT4UOpdApO~hi#kXr*C@K^Y_vj8i4IgUv= zsrB=s#PXC0EKQl{x>vCiad;<(oN;SmCx*Tu?L>g$fO+yElV%&?vI-vuia5z)bv=ui z-KQZQO*9+hfaU{ zbCv@A7=OhkP)bdbRf|#qMW7GjofPOdt0B;9UzY++!)q}>K4eZLO|=y0H)EK^oF^<< z-1Q7}Mj2<$1r2qanNJ}=3mUNW<+`-dhcZ-g`%d!!=U&8^Wa|P)P=bd_rL;Tooip!oR;n7#`VP8V8AC$EcAc6E+UQ7LH|t0{c+aJj_MG zRC3(Fa*cW>SU!Dab>&CVu}m%qE7rWEo69tmVoS;E@%x*>V;zLlreHAosCKi&(%pT=Hxf^q8D5R8X{+`iJJbBC~A4I9Ri zq;NS*=L&9Bbk2nmj(Q_VyyRcQ^@lPIv}BiM*quWzrvSg!yPP1ooS?Wag|zBnxSZ4J z@!K4unuT1>`|NT~kr`NUu(Z?vx*Y#nxtwRH7<}2Pc521&WvJK#`chpF;4gc=Oy_nM zQXw^?BAD=WUDj4&)i?_6iVvaRL1B%*VCN&{YnEc+#KNX{ER*~6`A4-r&4Im`!>VqW zPkkQ&FI%+T=sEf>He82p%Esy_>+GehvpeB_+Qh80l~F?0EmrSPboLbbUan-nz5+UX z4vW5|v)k}mw8bhqb+s}Km3*2eS&Z~Bk8kz0Y(jbf>`e#BC$eJH|Jq}meQ2&rNb+u@y0J_s{Om}c8Dk`01X zJ6gaCn`T?y9L2~BZI@msPkbF-LS2MYXXf5li#$MX$aFnTiC6s(N{ym{4T1W6Yh!>~ zfcKhFk?`&ag|G*2L#R5L^ayTlqC!G-bLHqgySZoRuUNy?E2TMN7uU9yiHmED4`7c1 z;qYkIR=E0`XfcAjJ?&ww+p)}KGVAs@2{v9A#N}HR z<5d^$WT>}c8DQ2Hi{_;9W${{!k`I|}sh2H7y~V?s%{9F(**xUo6G7~H{(Qb>v)(3be*(ybBJt5Oey-%)RjC1NWIX!TO^WTvf+3*j<2gfti0I=H_4hN#a1<858sm>n z4@eVYG!@Wn8Gn4$N(~cAIR3aNRPn`#Kh9lh5`XN#hvLT{yN0qJoam|Pfl2&P=Mlx0 zgj{9!2I$z5jz8|*6cK-1nG0Qi1uN#E_+!3&uo-{EOCD=j^LT3?hA>B0l}2h1jxqjt z^JNz5M?EZsx&$$^G5#oXm0qYN6n_LaM8+R^zd@>vv20FK<@n=C`Cv2t`06EQ@|W(G zOm2Hflj@J45hecU&6ROjOVdIT@kbX5bq(>y_2DJLgj@sJEb!zo@A?GC`;U!Um^xc8xo6n=5g(JG*8>&USA{ zrLvPJAYBJbY!njH`i9R-bGBGzJA!{`mF-9RB98oCDsIHDhv}Uob03%Fp=NHo3TP1Y zZy;t;AHZZiSEQD@eRU~(I<>D9PYy?B#H>esg^k7+3*QT@ArtS{Gz6n@CIX!g3le_8 zZgDl8mezvKT}j9&2vBqoo*lmjb7?D(Xpoy)e_eXg5=v-H(z4^xYZFjNt&HXcg2)Sn zfDrsppp*F`J|hCpUkC&=#KOF90lrYS^FtILJc2jCMCKOiddorir_VE!Ki+3x(qzhE z9im)X4*CWpID;H?9o_(ZX<#r@^IJ*vH_==YOf?cTk!n8>R97HKs-OLb8Xy9%fn>~5 z%|;=$GLq^SYYb9-8lNH6mlr^)%U{+>wJSb|%199)sV;!VSxdFc5SHpg-RwwpWKSv8 z?jWH_^>0KE`?{k+m;YD^6ceuey;9t~M`}SO|6kan@;BMBM}2aOVvoLB zQCxd;dJrpB#jXaWGC|Ju*d4E$5JJw=SC9&nkUe^Kl>s@5J-Txqkn=Xy#Etf772epl zM>QprjqWipX=0B$B4j3eR1a(a8ggQ@N1r^$QvKm>13?q1uD#!Ak1ngtz$zJgRC}dC zs){{2{R^bp2J7%4sj@wK1#j%zqj>|F$rX1Qm^6{Q)sQ{Pn#uO)^(6*- z^ve-xkM3nk7WSwuf<%~cgFUKar(iif30PCZN0RM zED|io(<^4{v)w}J3|Hd!SnlY90d_E9B}yR&FC!iMcCwS(BfCgRZFo>gZ6J?@)CMta zVJQfN@)~eqZ)k3uGN6KRKPnleX9(p2-JUJn8adJNl@JXQcdill<75KE4o= z-J|%Z<_CnYUy#3*>-$xmQkpa;#A(xeNL>CKwxnMXmonnl<9Le8=t&ckk2Wz*OkR%? za@Np~zpSStqb!c~MnMp%i+|!WGSdBx)?Wvzp4JWHGO9x&@6M?Nu%AH8@@_`iIMMt# z8H!x_y(Yd->igc5@06Lh+3+U^v2qRX;Z4J9(F`l*FeZJiClg=jZ^_pWcky7EXA$W< zdUY0Y6N2b{Wq87^8ER275JH1x{Q_`eU1hNRIm#H~&8~Nm=}1h2GyIJKelWgzT)WHz z8P(CV%V_ZwJ-Z#NC!91^0ro5U{2T9fr+gu*ZdEF?KZH!^{is!>G$M!$gl#|$$dN%A z5+0kN-PV)pQQ+}46(noqLSvy(#yln1SL3T-qeS|h-%n#<3{Xvyr_h-~JVAo2a@whR zb@TkGI*7>83?Pxh!CuvL%GQXN-cCT-?u~ir?JAUz)r#(Uin3M3JDIO|EygZlBo?Yk z*-nzOE#?PaE|v_MW`|Xj+|@C1H&tebg)fFDcOicEh=ga9n8o2819G%nykF!z&I%{9 zOfZU84n=VLj&O>?w+P}m6uA#24Em<#@9EA*Kw>nK_z)?iAX1oc2XmHr5?!3?8@3vD zXwEl|xYX<>*btN+FC3#v!zjAut5YT}e;Rh$pPKI&O$P;Z_P4l^ciIp@anxkl{Z%_7+)pXE;Z$mKQ)P-ss0QB*k3T8YAjcCq|XeJfdF={h4!rz59`Ga(O z%%F7gw{GqXt}rGvMI2KAqOQbs?(EBX&L)9oUc%RjIiDHi(I5m$vOy6)BC9F4$@n;r z8tHg6MG2u%_5+$uW%bmM-&vgk%o39u^BxmUj2>dA9HvnZ3N!KZQcJJRQt33QnhJ3dVi$q=waba3OF222Pqy^jKy}*v@&nE45?7oub_-D1Crf`zha(iv zs>LMSMYMH-0=@U>qd)l+Mj4_bmbXJ2zDD4K@Zt>(dpO*)RI1#*%=7y82A)ln>I@=M zsG3*>6558ZilEAi%z5G^u5G;RA>JkG%y#E+=2CzS$rE%AB+c^n;yIQ>qNAY%`Fh_5 zncuA1o|Y)0ZW{TJCRn1{pOC-8xh(Kl^|Ad1lfB$O!Guz0tI=F>40r+N;-EPw~&MCkth5-B0MpLxC`s||S^Y&p6u@Erb%S@~L{kgS~=Hgy4wxkI}R z>rvhQChm@}zK8OmBlk#Oe1#nyVt}cC;--lA{@H?`jRJ`t}UQ;~UN=feP zkcj8XWFj+70>jLP?fyN4&{5SQiu4@yc)T?;estN^Nb^CPOE=3wPnB&`|B5(ItGJ9K zcj4jgF%Ar8nu6ar#MB7BPd$NA3NnN7TOJ=%`Ezyjy2x|BIpg zJbn3!8DOb6jNPG5S%`uKaa@^=&b&8e1n4*^!0 zp}cS9sD}Lnj%s-8sGi;s)s(@A6e}CZ8ys~KUfQ#`9Zx}!-+T@)q$Y-52MhH0cV>62 zKtuJi&g{0q0`!VD{mT7=@3b3A`R?@P>wZAvZG7jUzAQfnDjZy-ufHpHPtG}h$xVf*Qxm7=-2o1YJ)~Cmxa*Xn!;VyqiB`({Gr%wJBw<9id`ZnrzusLCn497#s zNZ)Xb6(yj^4#jx$IC?wU;PMlEPDC8;8l* zE}kp{`=WB1bs4mQMwqt+T=*;I=t!6G-RBo2?$q)XQO%t7qxRKqp6D0^QtbdDcQS~$a zSeSmQ`qkAra=&h^V;oB8)?QcrQw@(x$R($y(RO1x%xiEbr}bH8MwP<62KEsQc_|fV z3#gi+>}~N1juK_UZ7w?_s2&B=1@y02(Swzw;5JQ!1=tlxs>P~jNX#sif;nxuZEGv- z3cRBfb_I4RicZ{vLTXK-^G}Laki$iM2RAeBb7;k2tfo^p(V$bz;s^Gq7A&3X&MZ~Y zvjhoYh#Bk!)0dXx^rvCHJ8h10PBrwk+&h;xb1pq#fOpN{7S8N$IsDD( z$*JH=o0*#3x}xWF{THrvmQKs@EU1PZzNy*u#YQAJX66jJJ}{C>W}`yC6Z_%ZbI3Rv z9_x!4{M(Ek&>nGBO`5>Nc6U0>1IJz*9`uCEa~@l7Xs?bt{x}T+7wj$V^pB!EXn@mT zHy6mT68nb>aP}Q`%3$u6jvGPEKAhok21n~P%LyioKg{NnB&ttah7|bB7HeUIFp&pLAN$^7~m^w%!^7z;ybKQ4|+6?ih(jI8CsS2M5p(L>oFnhz||`W23G{ zN6^6mw+HUSUoe$#5NGnNJ8W~`h4YF2Ou=s1wE8&V4(Ai4R;-|&Pn3pb`Aq6-5ODd9 zi+O1F6@EQ6xstKT-J=+wWsu|GC8uuL;Re zYAFQ~02PcSrxDpTTS8N77k+@+P#TXmwbtWfXieiDQfqi>?MZ&HGqv{3z06%s3j=p1 zQ)}B1HPh7EPpF=k1NBpDk8w@f*d%Of?Y?q~s?gM$-hdkRW9a-T?d3_iiT$a%-)7?e zkUw?N9PR(gslMEmg_hl16PmeGosK9~b%o?q58zar5^$;~zEku-bE>_jKo72zxuepl z_TdLRPWAJ9n58*4>sTtxsjfp5O;aS_fI@^*?ZK5 zTYLX+=tKXzS$IR6>4aw*WKFu&s1JYRV4f1thut$H^x@IT(1)s6!Vd*mck_cCeVA|; zvox)#j-|r%As3M^>BEPh5TOs9xH1cUXo+CcQXll^m+|ucF&cqhfdokzc4I~#gSBA7 z2%&0*BXbgB0Yu*p@7wqz-QP0ZaRtu8Z9^lTO5#vUUW0V`%60aaY3&T=xqatcCpWti zaezoc`XzLhN&Sq$_`BIE*GWu7ZE(gf7&I91kurtOd+GhHOIuH&8z<2qOP)&q9BtBv z_3B}_Gzr>lRfBy&ftGw%MgBqqfwk{LNBeh` zI{FVqJk$AsbyPBJIspF1&D@sJb1QX}l0_re3L3PKI(ilq6dfH&!46HWxv~2H3D>6$ z67_Sm@{FEw6bvdhs{@BTsmgvr&L82$A)}p1>2|cIexoh>y>K3p z0@KBSSr>nq+g-stv_Lluar+jy76eMW)YCJT(Lot5Bo29YU{F%WUFiykcN_|b#@!)+ z+5qHl;;zoDqJ5ACk?NS0LRkRjb2J`=#|%iGqxlV|=pZvH#6uQ2dRl6^J@BkV<2X6? zScN0D7NvL!F!spD*dr&c{`&N!6*TsUS5t}8-~lp|BpflirLcC^mr!NjA_`Awt)(t~ zM9S;Cfa4~t4^xU+0VNWb#s^UwOZm!lw*@92>ck8WywC{4ZT$>vzCaQk+F5fN~*)Xy~0q@LsQZN}kLb9j1a zYnb3`Bd$gu&l4RR(|tR{1BXeD7u-Iaxd|VjED&eWeKoXc^!7k6`~?RPqssAcnLPlt zvi&rJ%CQshCs%$4D))q2r*cQok>WGFQB;nU2LoSbCGvcCvA-iTfBtG6^N7Ca=QNf# zs$4zZ9Dh=rMD?1=y&6)v54kdR`v$FxY3p=S<@~2LmFtLdGJh~k-)K(IV833tDvJH8 zSRn1!V8wntg*>fWzy?yNC|e*d!`z_F!{;I!v}~zw)JUBdv0=~_i&r~nc|ZA>K9GH5 zK=m)zt7c4@aTR9{u*fu1b_eSfnX(~8(yO*8B`qbHvVBtxdc}Dt{^YdN(5q@#Fb|os zOHfL5!5iq+qnJ>!FlBG2=~#tAMYmzg5qpvi`waDJ3Pm>)Qe1IRbU`ipnP*Zc-4PdU zadf0=z@9`Qb$umFpU5<%`rO#doR+7zU-j!pw_kawn5YRReEYYwUxO9<1qExlrXeZV zJVn7w4chO}ks=$kccp^GYS3spj10vUsVw;py{x-E^cVA1wM;ry04?DI`yt$9< z7$z;DoT?RTiGG(>>gkMFHL@ z+Gb(J8n@T+Y-+w9zD8-zTpd>9S4H2##@h?9 z$p!-}b^fLQCUsP$O}(7r^$e^T#;`=jgP)?UX9QE&*jKwsGxp|FFE=C3R=4@k)XN~8 zpHqyXHZVx>nHc&JG=PRN+SJSaZ=m}>=|G*WtY_@z2RlRU>m^Ici8_|#Foq0NJy zbcOB)x{5R7S|Bqnw#DDHW6Vw8)+M+TiStmiP98z78NITjo zxEVEY5OYFYGl}L#u(AZ4{Kl_oZsbO~7l_WwB<5z|wHU__9K2YFab0U2gQ(i{V2!Ha zk>>PwqiSVNzdcCFblGvJMbRH*gz)5ASk~IBbQUC=l3<_`w;X4%^e_~o)iZf$v3jmo zC#6u}k#mK_&x-v>zT99xE~{&9Ki)cdQSFCkwcdWDdHzTC|ie+K(+smb}#gZ>s$`gvyIxKVH;R zF|{Ax)zjOLV+9w@egtq#ZKVC!IU1s@iY4uk{kWSS?AVV9t#o26%ziAtQreHtP<4d; zxEr+;Za>=68Ij@k;|fEuNc&MyDP+rjoJU3^1fa$rYcDsqANTxoQSC?Pe7*gMfAxQ4 zKNhbjuKjrV7M*fLw;!{ybH`{uj{jZq_T$L-2>T&CQ2N?fh9{-x_~SwOVAFm~ZfVKe zCPcKV{rCoz7r}nC(o-?DAA^WcD4XDi%@@sneDQWP`!Q)0M7bQx*CG2+9SH!+aMmLJ zxW9!?jD^{c*RPQFqaUh{upiY?OX2n-h@dROer#;6FBWM(mMMj7*^ghV8tlhAmzvv; z8iy{b{kZfGz5V#@<^PfW82fv1?Z<65>y#t9{dl2Pxc&GMC;yam{PFF$2>UVPRVe)i ztY(MoM_nw~lLN6ge(BxJlDGE}(W>_2SyWyG`*EtNj*6-MxS0rr>_^7>i)KHbd^4K; z=sO&ud>yOIA^WkCAMC^*m+KiU%zkvaOxlme=&}g=vGOLpA&549nZGTH{g`Md7HL0T zQwo{e5A8g+6wK7TTv2LJS&U6F1=1A>2xe0tEB2BJp|fS>5p1+yTTX${#T7-G0=WhS zQ?+AY*W~K0$k68vR%AJT8ye$|Zc@xykmF35WWP`Zm6kPlF(^yPvNv5o*|~GrBTx`c9#dEu8T5?FMKLwDoSvavs?7@ zqf#}U(~tKU!1o^t0QhmTIsxD%yc7BILA50obHX*Oxx4dHwk5>3XwaN(37?2s3DnfN z5DO|_U$2uPYzfsBITx}UVYFsTnyl8_lJyw)1EX>-geb>67qXV84z^;#TKs3MW=rPt zYnltG_cBCz2j`DEywmVnc=>^Ci3NkdU#DYG+7ihlatREoQVKlMT*yXLt=N)ekdkvD zUetnEL~2;nxsbt#aMf6(EVq0>p6FsI23rz-x?8eRDnO^Zh2~$QtpCX4Ovs*Gi(E?b zNQylvUCG>@yt?~h+Y|pHy*;^U(ErGultVL$Z%?LNqf?dW_T+CzxIL+Z(|StWo?PaO zv?o`+01zZ&1v_Lz3u?}iz$=x>yeN}tn zLFGlTCzbV7OzlYrA{4SGV}8GA_GFkRnmrl!97Ops)|*52WEVf!u_xCx(221yd-4c2 zz*Bs38@epQp6t3xZy2JDb^b!o7GY0j7>Y%)CzF&?G1!yW&X;B_QsR@orOfTg*1s>d zJvslA-k!Yi`7PT z;@*qIO3n`NIvd&H#{3e_A8(Eyz{DeeJc)jx-!H`9FAaT9jQEcFk71(?m#$<||6lll ztpCWYX!U;|`o1CjduYF-;r_a_Vg!niKXuT&%CG9-PqcUKA*7(Jeav8tY8fV9UcwX3 zAFz>v!dKYgT&U0$b^|eQ14e=gNoXf06?{R{Nd791fnauR+Dj0>!7-{4C}_vQjOC{m zwK(NPxv}UC$}o5N4$CVg-;_^8$wk);b;F+B>KR?b_k~d6!*Y3f_S*EMTsqUbnVN{+ zE))B3t^=igbqKUR}>I7TF=TBU35szdr(<;2((-9X z4CU4E!6Bm5P$($nh`fcCA^RKiBK@9(owybY+GHn&;*vH*Q@j@A<%4?OlLcSvYBOKrw1KawBnDW#uz8<~%-0^V9V8Sx_$wx3_9cNy z;pdvPO$d=^?hHk+NpTfcCjxgc2m8hSVWq-$!#b5Bfo`Cq*}BO4xI^bX$q^UP$=K7PL?gwRQgk06oAx&xcAo}7B8DBb707$SnsA=lu+~`>+?KFBl zB3wekOpstCpv?~N3ZQl09d3UIngD%W?#@|?-8lq(ds#x|Dv6hIk?x%vTrZa=cM)z_$GKv(*Q&_piWOt8)y@R&z~jfY4m96ubvbVwk_LFY z=>98prwH-Dd#zxAaU_ni*J_NeH$9d+A8!jOE$vU}JcN}N=7HQw=6|HpF6;}X9f;NM zP{w!}Qra1KgJ~!_SRDmY8i$vzq~Pt3;&ZOdXyvd? z!R6b)8N=@`q2dKRuhh$+ZejPKh3pklX`kJxYhb1Q(?zoyBG< z?8e)nYSI7nbUNy)DVMTLzx_wkA#=<17vfFLawYsMMHF)4ZK$71;&eJ{Soy&Q9jYgF z$lC`xbUl{JLpsE#)Ah$2MTabm-pm@z?}DRt_}zhEmW881SqfWg z(&INceZAoJ?#0jbM}ej{#0lo^neyP%8Tg2UPa8Nrxuq$oUAwF^;_O2@`P8?{op{Eb zU4wUQzeB+_3?Qr=R%)+jL&&SO0mmph%hl;wvY=cQw% zLQ&aZ!o6SeNhu_1{VuTVvbW=d)N6Qu<7Zx%mB(KCr%+^>>z#&wNEXQ8p2q+B7P-+) z_f=!fdi=1aS<|o;oeI%GK*ohPA2y#mvxnutNPr!&3`gU*eK>?}JxLZR|ZJ(`i8-76n+ zCwZY>&AOIbb3pddENapHcms1S#o{#)3%4dkw&ot|*1T|>z;X!VXKZAW&G})L(i{)z zK-M`#nk&BtCkEtjs115a~_^>^H-afH-M} ze&$cE-wVcOKGvJ@3;qFZ4?c?cRh+>~f@o)khJ_$R>#E!(?t_+HG6>PG(pjPdmht7} zF*#}ler_)`@one>Co$w9M}tFefvIT1Sm=cni*g{{#?? zdFXWpC3)N27DDRRPlFDPDtF*DEGyV;*%R!puFiaU|G;Z;xx(aTLb@fB-77Pb{rBsb zGzI@y-spZvJPH!Z!F}C9a^DNo-J&X2#R#BLu(p1#h9>6`yFnjFVJR5ybB1(!z#Orr z6172BaE>$Ea7OQ93i?9uM$tD=lx}r=-%wKC>ZqR8EB65VP?V|7L=ieKFq;2z`PSg* z2NxXX%h-BD8baf9sdpmxFU5-m#Rv3faIrfHd#?w~bUW_Y?^>{nBBJzoxRm~+RX?jU zM=rmcrwG!0!*U#>f5ta^4#t(Z0bb0NxKZ_DbW^n(5b(D!I5H9ulchT;T%IKe=`XwnPJ4-w6A;(BM|@9Ei<*sXoRZVftp!kOJ|W-wvoCnm1#34A~ZgCA1;Me}ZA=q0S(V*@(v zj_y;wMf9r}8pVhonhDMEtq)uyy@rri>>rB4kxv_V81 z3jv{y%_6sfgVE7N>2SXe?^J4yEq^A4$d-&2mQwf%+kM#FPzDxz*1$KwY^d9_F5y<} zba*c#SJoU)F`IOnA_|%Ge6jv1CO_ zdAkhUO_CAf*04ae0Q<{n5HbfOoW6ZTGLw82jx>a?dW5Uexg5k6r*+3A-a|(|Qa6#K z8m>C3>%&Wtqsr42tD`UW6BpYjPL!c$hiK6W=>gSA$-|0vB3@)l+fgKJekj~uQGOHGV+8qMUCxKeMD&X;wPd4o&HDutk%S3nQnepTf3vY5?`|b}=0X z_e7C<))?|3Jl*gU{)!o7UKEl<#QTqsl4Hz6KpQ~S`jcOn|!lBJKtaAd7eR?t}>sT*<^N&&A0V>*AT7*k(zu z3g}730VisY=!|dzTF$DLHJ&^NEyW~&X^M`aZn#hCg+6E{$tM5>l}j;>yC9+uWoo8( z6<&+&@*#7AG(;BJG!12wTk4x^x;%aV9&WX`30=Z-F&VA)^&wG-zvI|2NXb&bjPWa* z6E$G|gHDbl3-lJ-&_m)YLkS*(hutdho>BzUH-Rb;h-OU+Ij;nVcVQBc&V79uH(`^z z*#bF0)MD??7)WuFyS%`hWvH!=@{a$z$rQw<hxhGa;-`P*yE?>2sxS>9Zjz2n}g5 zk#IDaFy=kPdr5}}cTJJ^nM!BdE>C(;+={;Db4$bVofe+$Mydfkhm)=-dlvU@L z&mEiX@L3jo5;*?`32k<_HnDgM8=7HqmnH!F*M65uKAdBc1xIKM}0=-fKMp=3xC1H zaQ=w>)6plP6bRAj=$H2(3Q7z@u?a9S-w906dF&K}JcoB;qED?$%P{7xmEj%5-uinVDx4Gqdj`(N{}E zGcy}FqJz~&sn1c$X8c0uk1Fym%580dQSVbpXC}E8SF1q4=TX6j7 z8cU9S2#{5K(+f0;W^Z;JV|vF{>*$%{@G_9p?9Brol(fCM?_Odf+}@nI10o$tiJk^~ zGZ$~{+nclhFrSre@pZD*AEVlv>0Fy?Jq%%uyyW5ognR~jGt^Kbn!R~ajS^$C zH|lt)({d?}v&wksWgagz9cJC9_rI0$jSC|Dm1=%Gq znED+T(gTN^S8BM(0otO>J;bkPWzh|$+P+6`41*~}%2^W;fzW{Jw!rWBD||p@dHmNq zD5Q+3uDzSEq8J|CZTjd>ex(iMdjt#2AxktAAH+>qch^}WiviYieAj)IQ7d#p zHXTTQx<*=}S3p9uM6|I_iF_JxZG{Z5YS6)x6vOmTBA+9CU%Xl(nkCw*29hW>kq20Y z`&QKR*5&-KF5byqD&EnGfRng6jQ*flyaO^o_?kqXZ;3?a2}Jv&*Ht? zU$ccPxGa3Uwazf!%E3qrbHNw`soAG(P!!`WP}YyP)@4b9)F;d!Vd#Y$x*el-qEtwa zM&AXy5?UaQVem!AKSqqJXmaNPkS~c~sMP^Rr|VBmaZCnZ&-_JNgN)_S;OpzRNuLeD zkRt9ZItW${z!u`KFq4$x*^VRP7s@2mJmq?-IPH2W#5H44N*RE?lTK99kOhJFoR98L zzUOve=2xVIl1+M;Y*HN7?g=idssH^JqfT+he&)LCAC_Fdh;UmCh|)m=Hi@?((fYn`_fWNOXjO{}VscSDJ2cB!KpaKbLpJhV0Zz{OLcWeM;SL zVxRWyqS^|vPZVDo?9*IBiD>rea}G%hxRg!%|izTyGT>>99WGg1J5xCx5J0ceRegJK&qczS`3!RV5{k~YID=>qDbjUF)mw-L;Qlyqh*VS zQ}nWee?kT|7=0GMKx|jHDYzWATmKW{_ilU@v+$Y>XggMD3+)o83YgzZtogk$SL3&o za{^|}GgP*smEffzsy30dU8e6%EHbzX=^Cv4jb2u)%3gex`7T{<0F&Qf)mW1z5q=au5CX4Bn|G2K zu~e&Tw{U;nK2OK4sao~oZA5!SOGuPA>uTg3-aV%=Y8gV&m{{{SRjSU7z>;bQugQ7c z#c$}F&YnIOj+zXDcvmYNx)z*_F{T-in8#bXRtzEEjZQ?a+|h_%*v!6}xQX@gtDklH7~PxXFW}fzH(^}W zLvIWd#&pW$xA4<4`(_LN3ddyO**9PRKla`PzNw=7A8y%X4=!bK1GK0pC@2CI5sED& znjng7B8m^PsVG8=prSyV))1nIfQX{Fptzu*f`EvHLJKI1?2AHK9+*&Mm9mrfd(PaO zyEHdRp*&CD-~ZwB(dOP{=FH4FbIzGFXF&_h2|z?l3zArhrI;e`z--pl$3DC{Pcj>d zjuOwvhx8S^*payDH(PnOzs!#~+g(sG8Tl4xEPJkMlQinuY3dh*Vo!S|<>WEB2hzqra&lwbbB`^a`L(VN|hH{{Mc-u+_sX*M;7bUlOMCCSlOp^++jA~Z|Zga#@ccaT&on3K$v0^sQ z0A6qi6bNtTNPJKTZ>vLykhpad6IY9$G~%+b2KPkZ5wiliJ7HIx4_~7<1*SzE^)>MZ zcE#C@Pes>hKS3)1BAs?jQz8$A=ZvO)eJ%Ud!=Cy9SI8vshv1zkkPj-)2|sDkd?U}; zF(=}TpI-pzilwE^pEMHb4jc=heud{qVBuVGmTh2oTW0IvSsEP9{7hhWumnFXS`McL z&eM3#JYp+IUPFu~TReZaf#620KB_^t z#h_`^T@O5HJSQ1YFM#Jz#HYq{yz80g$oN*hN3rUW^Ku3jjCjs-3eV|gXc3C%w4){p z&zXu=5$wNR5ucFkS?cht;)2Tmzyq+}cXBPyVvi#n4yqY(oqfXh7IB?i>5rGkwY_4o zfs;G~7C7cGoAG<=c+Ow8r`Nj?sk>Z-dE%Y zO35)cHw}V`jd)m+H+cby(+1*d3_!uPY@8k4bOQ%h^s|_oEiDcQ)L_fuc(D7PEF&!; zkCRQLkR`-{yfKTA;=$*Y9@Dy$Um>eX26{;Hwn9*RdAsK%+iu+D08c%&Wfb5EVHd49 zMU)wctWh%&)n^h(hdaPJA4^5v_j?|>Vi!+jkmGI<`mk1U`8$> zS}+Ez?|&AHrR-O*;beq@nt#Tec&zjf96^6_-EZIz#1RFqzd?V+r++Y$_;HrTB;Ek) z;h!7Nlv|)s10V7Vo4yw{hEYD2LL@e73U(5d5lJ-f1C{<9yupzu{8(I`)#55SoO=4< zpfDtX!|}{?%58@c$rCA?h>wa4WXd6^ID7be0A!+VVJ59JNNNIN#Zo81Xp@kGa?y2` zITMC28+--GZz|qTSE@!I8B{==>R)K8oOCydQH^Aupz*PM7);{1wCr6Q+-@4Kw+SFg zga&vo_TU9|@z7;Nm=Pu{Zd${O-)v^Y#eaMb07vYa6;xJ%W))}rkrGr)SFMrNtWIS4JAfho|WRgJJiMV2PGdxoPo0s zyB>3$w?6niP4^g`@Q>piO&8gZqnK{9)jVDMce?39AW7sxyckRv&&-y*y$x2Bc{>=d zobNC?<($pVBQ`CzsJqgX3u0+GzWzS4d4e?r-;b-zv=h1 z$XDPiF%~aqkq1RJ<+Uq$%DZRirfj*$Wie$Epnm~`6reOv_xmts_{&8Fu9pOt5*4_K zP?%K{5>#KYF-1<*-y8sONJyj2n(WR3{Vp=tSDgu4&E%_DK;+^!LlT+@y=36f!X?2@!KG*Mi3AFbx>N&1_Qmp-H~wKOc1v8wP++s z0CC-7`K`b%8KTKWM_TV@)dJR!tY*}@Kf`O$WR1l0cqk;1XE~yI^X!rGLr7@VpT9^-IQ6eG^|v0?(<5sg}c3wM8Z39zb%t zm0SVUP#In-i;>HD(&N6=P1;f<|M(q~lo&&h$tbIVx491&kf9PQAsTX@6C@vo+3-9B zv5fweAu`v!LOYWLxu13HjN>$~0W-xv%V;p%FlaJ_0H2BWV^t$%-pjHvx15NUWNZ9c zYsiL5&B~}6D!)WCZM59D6$VVheNAf|gvxtJDGbVn%Ki*?xD0ge#$XSLq-a{+p|mtX z@2&I^6S@y5eKPi$q31&vqcJz$=Kl@tLgnWmb(Cxu1yoLB8=_f=!Cl9iHtDD21?%t) zDNQy+oDA&pWKc*&b#T4m<@%h7l%*;Or;$V)5QF}32#zj8D!eW2dXT%rmlBVj_0dO# zdp3K+xzNz%d%k?K_a-%W##La8j$jgn3q#24z%3jKhU>@~daq$^m6`o8z&@D_ULb8QRZyfiI~H?lb~=ZoKHoRKb( zW(`0A?_N0hhvSFr*=E-7`k@i?L-1HJzn;PlAHiF=h(fLV@hb3$T`MFzY=PIJ-fxmB znn>vrVOo8c^0bCdGfZoSoR;~9b@JE584ig-0HI{OSq6>S|GVV85kQ??!l0@|1?mof zQs#~0%6{>}b6CNb0j$U?_!=6iJ&B?5$_nmY3r-ufWQ-#l1C2EvgbE zJp7RIOysGqUd&U?`y}F2%VMg^B8V;MUp2JtgWjEAhKN*d?(uJ2Q81c~&KP zvOOykJ)01_2JJ zGApIM)6*p0NfreRbyt$-RH8>DdbWsvp*`kTUdIw8){;D@k$nT#4zK|mzW1+wmr^E^ z2eajG5(B$6>lfye*tuheWX}rN*2xOvb;j2r@!;9$S&`&fllogxM~5&e+yHaNOB!R~tr>T8t|{B*f9p*hTL!_@Hh`%m!PpaW2A8!bEM_prDT2)m#*u*Az_GNv35#r*nKYYDpX+ARp7wR% zH+yV0!`&FErG>Ym6txx?~M-sd{FIhB05B7R;@F8Lar^1 z7bPLb+!-cq%V;V)!`y9|o$xt7QK}S`?ITa02$YYpjcP@|kn1gncf^+V9^{YzCi=p& z82X3y<136mro~F5P+R{g{Esdm7WwhxQw7v>W=HxW5C4N%va-FUd`T7SI9>%ZZ~c!I zW5mHWWnx7AR%MO(^l3Zc&h{9cs+^;wAf((I;=A{-#l2O=cBPGCOQ$V`xNN4zgM_t@ zJ_FVQ%bf1RHaF!47jM!Fl_+mE5#^CL^+cJ^Pe!85#k)e(!bHj5W<->q5`uk|O9zS4 z;j3JZ9!8#0$ujN@?xvK(Hx$$#H;Mt>X-`;9WVwpSGVTffMMWnz9%+0d7ZX7^5|-OW zji>$-R@gF$l7fVHQ&l27>`PoUpX{FaMBh4=}Ou z>JfNav^0v1@)M1k$S#|pPz~#rU!f8NeNudRv2g+}tFi-es~+VP%{6g`PN`-0y&8|Z0KVvoBVv^|Hr=z4 z^$2pldp6~32%Sp`he|sCofoz=+=A0-sz%XIQ%ISH>yGPj+a~6ulF!P}SX}KoV^7&e zm4Qi4e@G;sl^4lO7rU99&$W!cq^Zyz^Sw*lKsw4I(LJ1IRX^7xG;?|Tly`X>#3LD= zE&V;PDO}SmOZ*k=4WAB)=77$2ldh1D0x$+W1;GoD+4zAg7HWb%2`}w?2FZ?uSU+u` z&bkQl#AOos>f$oV=AMWS9D!Vy_qq7;2s9~=0i^o;l%N>OU4-znqjOogEB&6P++{(9 z3*ldS%SXhma1Nm;B6ctB(-V3uO<`0^+R5&1+89$4{LkQ>$%MWaCiDWugdXyUMY2x9 z5Z!8`^PmNb%`r9cEvd6|0iCC zv+wGb0alsN?ts^S$b4HA6oSgv*dI|}l;Vk!CdwX^v}$VlBwv61aA_O(?? z%OfW~4)?fsJUOUW(1w_?3Rr&7ch$Xiii6uLsZ(Biv3X%MktW$<>TcpYuTsuRm)YFg z>Evm4DacOz6^C*llRylf5_xr2&f(SBK2f(iFp5ed*pQJgA7n zPT-O)qGWUMcf(WUVYHRQ=n~a1hCv-)Sd*s-3Aw#12yfYVYvRa5nYENQu9F!L_ zgHFd=vJFaN%m5&ukBM=|d{%bc8Tf^`0e9*k!TynF*Kam2@~{cIMdtLX7F0OteWpU> z-4p{D2-2ex#5&v$6JFvxS^$L>4Q_yy`YOk)og^=O5nZm9h~+=>@V1UO4DYz*COI`3 z5a|3vS+ra@Ej53f#+#>YQ<+nWGUkF1Qk(e~;FI~-8{VsJG!33%h+D7H(-~vvIsR6~ z&}1EkTF%q|nAk;Y{8kLXYv5{dWLz!yffr-tJBG#h$8s?aK;;ETcftK`Q6bn%a2+6? z;T{=lCVZ&|)vmqugJz~N8Z8}=ue5CJc%WYPP}=TXFxuRtI;-so8_BlcT)V5piAI1@ z*sTuIU26Mc2yhm>BCS83w+yh>k;)2))_5-p#^OC&y4V6`P! zk8%&;R;A6;3L#g=?+x`zf;t7)lc)oZhon!?SK7srzLLCI-0b67rH`VSBGjcj=?LQx zEI@uAtRo;8nDuMUCRac|i>Mh$d#<4dPA)a1Qd$df3M8GVf!#M88V0LGrPvU%Isa<> z0*so5Nu~ju1$qSP`OtuqL+W3{Io!9ITghEpxFQpbY2xZxy!N-ft*t#OnOIcza3NBO z_YsG!zSWgCs@$FxnNJsBdnVvh(YEJh#MNng76>oS*t{u^LC!fK9FdAC0M+~lTuamb zqkM9rfFDx&fwJTTrSejEg5utpJUiD|!|bM!t^=wz38WWDafVkg}lg~tC?8%KA>XqUThi-^>-;D`Y)WR zTBrY=Qk}3})2@stTg2fiLF&KdyZ4X^Fnuu9KQYvQqj)f`gK`$6`^|X*g?zow0aPO8 z+b1zgIx$67y#T1mfZ7etJSPYDw)fmq#Hsd0Ai zU7$R7K}sbM>l)GhpFn^q(QMB5`J|y#hEf+c)}zvtc=KDv)<&hF%s2QH;UwemEOJpf6r5i`bEy6o zYjeNOXC*qM+P$5!aQ8UZ;n^IB`=Tw_B}mzp<{@&3OwQDC-AyiU4R*O*9Ey@>inos_ zluYZPv%=yq-xL5bM~nmB6j*PJ0xa41J9ht{DcSE-`ct@i2@%@+Uo%B~=91WQyA$HP3#A%fg zVFdRwgEJIA`RQTsa*l?iBkQBMUXtF;Bk>7>%^0z_7kMsLA2DD5}Lez^VJIQm%>|3pUdKA=s)rys4y9DUxlO82Put4=6u`o*zUy z6eW6c#E)MvmX>B}Sjw_I81I9=$vcxR99zZB57CMr_BXhYZQfYj=ID$V&aIajwmDn* zeJv*!fC?Y_Mz_t$$}fC)qe!+0=Am_;^91)~L^Hv1m>{IK*pBYCEl#yirDV(C&Xkj> zm1KJn+9xC;6O|K9E#(<$BBIwwBAP&)w{@(o&+>*Hn{U2*v$4nz_8gArnx4OK%NGz`r&faAuqcxNylrtQ8g;aE81AstX81aWN{P@vIxcn!Xl zUIvqnVN=|Lt7`2RbS7Y(Z!lhCXAFuw^Ld~0%vYotW55&y|5g@?;dK|XM|N> zTcs=xRn36)uo+tq75a=|JxsaJ;d{NvrUm!6fSX@Bx$)nm9~SceNmMu>k1_3WASLor zxBrBf`pHqzEcHm}vDmQWR}ZUSwnM*O!R5$2f<@yaKo=$&`nlK_3*?Y#?|vo~I-?Fa z0#dPkA*DF+Y4M1BNWX=cOT>f0_>Xzy(?&)!^4v^GBp(5UQW#_&hUw1&Kfswk{5cD! z8gY|^)+{P$-2hFoYQmzIYN z7#G&D-eIg`?lifMUy`k@;^+L3PU+PmucLD+uVar9(X8X^92c}hbO8uu9h(BAUoc0D zxQ#X3oXxDpr zmQ_JkM=MQx4QG!zBMuLhYuS|bjBPN4V)os;8O?@QL8eQk;1&85*=!gTRvh-Ezgo0W z>-Z#~DldO-(?*82u&~m}d&Mv$@IXqL6;`c2xS!y7zf2?0Lno6+-DZ72x7x z)Nk6|PXw*gZ?OGSAw!C$)sQe!w3@bON=X4leil-f*|;B@{`skrvC{phn8golM2%pz zIx(5&R^B)_3k~L0DB48mr9M`+xy}7$P;Z$*J%!a<-e+A8o14=>vZ}dMe%2_wpp~PKYc7YlVX;RT@G>-sgWDfi4d%X0%VFt3Y zSo-ha0isEmBdx*nRJBgiW1a$BMM~5@rI3jW@1$(_PJm3>;o6!c0$s9$A4@KVO&5hk z_a$loU$u`oJ&{+wPlv`dKxH&iMLGW*JQYoW`ju6J9i-xyDNxq* zYrK9yX493a9stXp3f~_kGB8en32FXu_sI{gqq?_4oSIM`f)Y?n_n%_9p;o+M!i_A(CgFV~KFbSoJ*J&gCX~ zPI$Hl;$m)R(^PUguH9h{GU#*u0Z*X|2JdZOrzmb$A_}eX7>mJo8&$G|b#$ z3p-z;t-C|Svm*d%l4_v!_Nk>~(Pvma?}s+}VgEm3pZfMKUg}?8h-RsGrs@UVjm`Ay z6+*Am*{9kaQuw@PpW3q>r1Ao8%!xqQKJ~qPh|)gw&zn5*vQdrvW{jMOBmfW!pD&ty zDnmkh_xWhnXlZw>`e_G6X z<21Y$&&Y=;?Ni^teH`I0zYK_GW;+JUb^Hk+ly$rlAfvZW-6x?v6cw}=0ZltS{LqA+ z^0e(OHRWAW#R6NiVI=0|4ex~a7uqVC$g~56*xIl7Rw`P}|HK++QwJ8IMie=!;X|bcRyfIYgka;hi!MTj_3;0xIr=fe$NcK(x z`@;{K)?9|JqrQDDhi(Be7rd#vSS^DuL=)V_D;KK~JlJ0L@O-`fqnYoF7kCc~$``6# ztWxDvd9m7%JJX!lG-n~zJ9V!KS%8wzNOmnI?o$L!BfOJ>#=Z%3vv7eoo}?26`4ZXppil$DgRa| zgrevqg*4m%3i$w+~x#gy(}STepu8doe}6zb4}jhYloBk?*wY>28I2T9wOwuZkRY zja3hDu8`+zugJ&VXm>&N>8>ENS)oWAcpa7}(CSDE{et}srIU_tF41=`r^O(G24QFM zU-AgPHH}fe^0rjsxIVlUNTc8tT2Qsfx6Mr~+)t@LA;80r zfaK(tqj&)G|D_uMb{7qx@b3DvACrkwo%Uo=T;FWq_gj=8XbSKhbcJl@ld%C{~UZy~$3R9h~O!K)kl}56~^<7g&S&b<5Bx zCuuavckza{SagNIw~XLP?(eCaq$NHpW1h54_W*>Zpi}`=wf+(BFc`{ru@cVu(ggIn!Us4;(i2ci1eUK0&(xxqADy)h~+(-41cdanC6w3CipAO z)b`ye#3}G>ai5`^EiM-+eP;_!-?=qhVk4Su-Bm7c)#S!|IQb^dVT>-bM>W;NtBm3B zIR&2A6wHv!WmO1cx*Nhg>`cke+|wl|oQXfo0dtdQ(q9q(8WZi^PiRCt6Z?;UZsdZG zL9Jzo=fMT(doigVXjesRW_@Ns$k_G^`t^5a#t{KJdnkW0oJa6OkBB4K+>1t_)@$J* z#9;{1Lm5aP#oUUnuc`z4{w5fLnF~f#MnA+3l(Q5SV7d)5!VJkMw*L-B(MaZIa1SCL zF<3sNPbFy;ak*!|%9G7`JmO^Y|HX`uXZb5&sEm+G#QB>67^Y@)z}^Q3?A75Muy5qK zp=8Pl(eO{*+$zbrm7=*lid$=D@&F^=l@IABu$+1%e^R=;Fsy_eyqjDK3(9oy?KLPIi z;-acC-bQflWYKVvms)l1q>OPWk=l$)r0SC@J3X5WA_6ieUOBqCbGo`2X8YiIEJ?`?l zVw{!AL%P}AwTQoj(uOMnx_&%`e#8ml6p~z*njP)RecrO2?!dbP3GMU}lRUu&v{93s3xV zKgoi=@*({}0L8YBFxfAM@MPzAjyTyJk7Ke*I{qI3L*AH>NP9OBDL-jPupiE5A{O*dZ`N>EMLrTl9Xo<;(@h%&fi`jC+?qGUjPM}^T z`dvhe&fO`DleUj)II*_q^rKKECKGZL`sx}Io9gbq5q1{rG04o$_*7(>Sr?5I3jAap zwiY>&SHU}Z@!`n^`K^#%qwWH1Ls12xDOhw0bdF%r={T5Y_;g3Z45yJ@rm$j=(T(uG zPdtI{74H%?_~wA9z&%Z%mJpPMyedw|E9BM*0}Oe7BAc+1&g*ZN+&Q#a^^&T9j5Q}j z``gJ_GZg2TBb;Yv8)2V~HTQ#+AUJ^}sCKhJa@&+$2SN%iut6a;nK%%RDqXP1;&4OR zJKJZF#phhGce2eycC{rDSa$;nBR-bIK@v%8Tp(^rWu{J=sdnz5^GQ0skUs+P8oy=( zja*f$7-)*eAC1I9P$%DiSVN>mpiEX5!XhV?RsvIO8D1AhTj_SnV9KhL`+}2riU+WGdLJk#cKOQ)Cf-tZ=0cWjGUervPRh}b?{F5 zv-ZxyUilCg%_M~?;I*Lpa^ljh2)PjhE^Zvi%iN?x#AWW*8Pk+bg`(jQnzAekGagLZ zzY%L|<^tiT6|~Eo7ay%wrZo*+$!Wd$E2fo;8*Q4_nTF;K9y)EP^Jtt8;ILoo-;3`wnUmJZ%cP!NU^c9#r{QTk@jkQ&6t#%bscp?M+jR=ThbhP z8PKEr6sYG#zc~ABnSo$cUtD=86boMhK{j5Fl@nDD!Sl)2a)JDE(h__*Ao%5xgZ$-3 z^2>MV%jbh%uE&?*{K-TbqH-v{@k+p_;Ku2+gq}q#VVHD~fyk5VK)s1Aw@5YJv!BwJ zu&oN3`e^)KYU-3)(GiQ|0Og|QWKm`{eVHA(sL5)Tw(q1JHC!qId7D!bP@!Qi>G5vV zYM8J{*1>>zf^*9_k&qL?KneB$f~1cOI^G&iZf?rKnO`b&wunfHJ$gOIgr4Hm2p!kJ z7KuG3KB90cD95|R<|~Qp_e-Uj;$I=qF#%h83QK2*JotYiJuFh^t5@)~Jywh^64IZbFMTcR%m=bt;WiyxNY?R7#us8Z-jIx$ z#)}Y1C;PQO4|{H{-w8|il-l(Jt^Q8h5+QiE=^<9-om0^~RxzO2t! zr>{wE@MEy;#J~ounj^3}HQ(;(G1KW8fP0GGSx}XmlVa{mp6Nsj>>wv=D$=>&x>&eW z+rERNH>_csZKE=H->R-Bbgu?#tj#wvdTUsr8<`L%)gP&=P*)UR#_$n<&)r*5!`Fp_ zw)uB#o0=(Q##H)KI5~_M*_%;0E?GmRb!M0!A7t*qKJ7A%A1cOUK8LA?Mx zL5?do;(7~P5X6YfHFVFHPf%Ty47%_=^2b1T#u0GVc^hr1;IDK)3FMJ|C79lq^5VKo z7mYt7papPXzioi5@X%Y4%DEkp8uh4LdIjP-0S4{6;Ng?bo~;?M%t}PVgW6{JjXFQO z_cFWpA*9;P4eShU?}0}bspEHGEUI!)5Qr1!Y$|{64_TS=G%e5CdENg9H7{{}#-2UeZ`mJ*x=)Bmt{mez7xP9-^D7dhpkK91a?Q7zWJUVXw z#8W)a7ZP>z49D%?Y$v&WA3!L??Jwuf!g2e+6><-$++MARP{>|L9DWq+M5HRc3E~z1 zZb7FL@b5s}S7(@t;1(F9pC_m5=x1n9)@E#x{JF@kffyfKY(7W(5ZVF>U!xA{ulE3* zy&~yzho0o+j%lr1Zdi7uWQDQJVA;I^nza=3WJP@XGCf({tS76-@K9u?Oxl9%U35d7 z9n&Zlo9IXK<2X2UXD51Aqk?Io=QvT^2!!Df#a+#Y zx>QyVs5}y>3rYGa>7L~EFucB58^7}=ueW=Wr{gwG*0+cDk=5SYBoAvVX4X>Tl*mAN z7(Nbz9^xpUv{|4lXY4VvyQ(RVj8uuLm&&f z>22nJ6`zV0R{nsbH1sPDEl|Wi1qMqps}F01sDXQJBD30fEgs_s7XNfjYqy@;R8*0L z`Znuc!`!CGx$Q7*r*&;G85niHM)yiA#7w3!@{#XMJ&_>YuFM_cUuUUmS5*?2|24FL zpuFP*N$3+vYQ+_#@561%GB5=qt)NWp0WA&QFy7Slc5kOFT(>~MoC%>yzYWCgFCada zgJn%=olM2Ap}w9S{D8yv5)$i#RVLZ4yprt7$&CxZs8WX`xmO|Jbf}52fKPVk1svES zngtvOjawoTtktm5E6^St_-HqW;1D=PkSY9~-_S z3M7pXq$BwW>sKgmg5<2SkN0ICOYWC_T!w}M=zz_XdY;(7?wKiUpJ+d!UP9;2el$OG(qopyfN;5K&OYq(F;7nlo% zX>gV^IE6`b%?d5YYwF8EF$riO$HQ_zv-HSiH+$ky;8lYEdX9;e$P$7ry}h}HJ^_CX zYQfUVfV&u|)C-$a4`i!3Dq6?T*52;#fGLKzc(5(en5X(-G{Uis`x9;FDn!|W-)4)u zd0Z1{9EtNJNN|gTTLJ5 zQQ{i1X=1*6t0O+f;W;eb97eF4gTWQA(5j>KC$&^>kD?1|kPh~ueHUK-C!1-@Zynk& z5-~%J6r7Gvi|q5I@I5+(>q>g^f2mF>NO<-2afy zS6dvE@F}UHG5h6Ri~(rZNKU*_%$TDf=30K8Ek5W>BUS?pf+$fvH+|(5tkB6)-H&E` zP>RNZs?&H7DH0(FG*JeF#sXKVc7gU$b;jZI5PBS*#k2(+@cvBO zjm)#xxGG(JF*upuiE;AV-O=FWZ|KPyPVP8Y7$+2SL^x@|IKeh~n+6@kM;`F82KdNI zuCv*Rl0(1;N+f036P67+o=nP7GXp-Zo2}rZj)ITMJX#|@j3(yOoF;+IlRQ2a<_XO9qh zS1DgtP)Cuq5TK_-yiQso>UChI+_aI#l&uX!T@k>fG3Cj~w!^+tpl*6;a zRd>Hy%3%U07f9e}}UbT>$ZYkvMXU=mKSLRNuYrzzf~+y4fMB5>__i z5X9LB8GaQbe2eNRcL2V2@BAX*YrrY783Uh(HT56FQ;`X?8yaCv$UUL=*E}~I7j5a3 z)|VW|9_FE{-T_dhRd*d31l5L>$pBNR4Nc6k`vUAEZp0B?;JW9VilqI_4>CZzg`oPU*CH*PMT_oSs!O?j(o(w zKz_YZ?6LE{IDU(^FRl4?jXU%LwA*2#-J{X+>kz&U#*_bjw2=|M06E%zxOP$3{d8bqMBqb5MKqN zNjt_@^3BoUt8YU+zP>z2_(Hsaa&4X&UcMUf6~a;@@x^-2ho779C{^vB0{h z{b|OZ`Ppj!#*ZmE`#0r&#;5znXz=+(eLX(?`!Cu4-TsLQpDWvh#pl9*{xkSo8_FIC zv3Zyh*2790q{dQ^XfpD7JD85Q$O#WOq8chCmvmTSR{c>m0HJ7T?N_!x#pDxNC zh$=e;qT0s_HYvyjS2-fk+JsG`R(JTQf=w#bXRAE|Vl5_=z1+Ot{`dTU+x}Bj{E|F< zMYT`p?M1jU+azv1jYCxlFc}?f$@{kS_1eC*HW}4}^NS`?`yzQyahr^KO;I+hYBG9+ z$EW&P@bOP?GP<8~LXvgDXfg`5U&Gk%rkpGp$mo49BV)+5(I8{e4SHm3-Cg|1*!aE) z8B1F*=d`ll&7s7Sg^^)lzboo~GXFlfwRH9+#{#`^3BQ05aG7lsCEK$55|t~=J7Dl} z`YPKTf#t!YBwt~=JS!Xs4{`Xump5kFuDZK%z3s&Rz1KJ@U1M{**`%~K<#Cv;u1eGN zV%sRXD-NC|G9IGe`Jy?yy6Wz9)cxJ%y(*rIHhxYGFT|#_f!#XKiyQ7?61wYZjf7xX zvasxQs-q{NcXtvA;RLe6zC3trf6p$pr@I$K-`YqSg7!*oH2AnCT$g=ZC4 z-diQkPNJ!vWfOhyWw;#OuRjyK6qcN1nYR`PSm-r|&>VemEM zP|3ho>RpVlj4PwT*YsL?eC;ZMZWmzH;^y1z%zCaoxd^fscPTW_%P} z9t}Qfa#TDSJjv1OF;wj=ZhUlp+k}r~9-rl5peb}<7L&%qzy<1`VemEJK*_+@-HjMu zZL39tuYL#>()it1n~EP_pTA|o*MvL5?w<_kdH)f7{j$Gg;LCkG<7;BoXz(@nDm}hV zZzz6z75Gf}`gg;y_}aMRKZLI;{*r;O4GkDydn-qSuksv!ukynO))zm%+Kw^d>uw&O zB|p4rdr|NehTjd}S2FOCd>iAVbERnTG4yi%{+YkF`0+7kv9`=i#;sIaiIA z#>Xj{a+h7e5`_wJ`Wa4BS%u7b6swjt6rY^2`D9t+3^b$2dPRqNL)Zja13k-Jb@LEh z=cU~!sZprj>LU`a@_QNs++q_eWi0qJ(yOMq&)=-Wc z%3aAZf^U%3jlAQUVIqDuBu2{SPIrXc;&}uI%0wK&W!r#{YM&5btq@_Faeg=+| zMD+>y^LT=LoIcHP+HSaw{uVCF@awQRVu2l=<03ar*>2C`9WBzF8<{=IacO}^E{~sM zkG_D)%G<34esA{63-3hSm!Z<4iicIG9Tljp!$WPXLZ$r3W~dRp0Uuz%w3=e`C}p}$ z6~MVSSWH(Y+MNrHkEdG>zt?*MCWW@o6`8-B`0En$mx%!I{{(+ISBH0Z)!2x;`z{2y zoA}GXWx(^r@|RcS2*$)j9KkFECb9Q#kiQ&4dYy~nFXwCX^le7q7W}0#!&mvsV8Fgq z{H5>f%7#<}k8f)wa3|Iod|q%E}jDJj5C&RY64?iFMp3uRq) z#^zDQl(5=`DQjteG@~eB(kwVl(KhN)^|#Ep7hgx0G|S|7pNWQ{?non4*0xibn9|oV z>0foOCh}X(NvuoBh@n|z71k^gO4Gihd^eEm^u2g#2{0cl6O*sXR?3*8@OUu4Y z6`jkP4!)#N;$`$#xUXgC6VK|P<8qdI#}+pU_PK~;*UmeqvjJRPyG%-fjcXyBo60`; z4@tq!US7%WEJ{-tAqi=3w2+e%M_y6r|6#l%hx@#1nEvIGkW^P4?j;%iu~MP`x*?!O zl&?t)n2aQ1s0z3d1I`hB3j@}>dURC*$KdxDAYVhqpLC;Wj1M;w<&)M9z4{0$01?hO zgsTQqeq_DcMER8cl5Xv~K*1NSmEP%IoqFdg0o;3Y`dRE|EJmb#rOVfAN&TCdhGnIq zTrL7eGzZ#SLw^ag<*sJ(t8rQ*KV*Do-vATs-HVuY8FB*RCxuICW;;BSr31fA1wVtp7oGZ_LVGzoacrnU{gj~v z2{Fa4noRwg7XXNYb8g6RlXWW;>c0-ZH*1&Sb=r1lAtxk;t5EOaciG}OGgPBXVhn7ME+$9bR<|zA-Sbf6ilf8 zl}E2+{9Cys>|Uzi-*}~3ME}Z`t4jtl%JO8ZR6iCCGMb;#Bje@y#gB|3gG|WieMMMg zbS4Ef>idH*_T(8WO9nntFXzpXaU>diOy>x7^?q&t+~UW_-hn23Y^W9%A32MQf)BI5 zmH9b(`F-%WODVs{D!u>r<#%TrlSkh}8hKdgt7DE6H9)DO`a!I(u0Tqj;C;gd%I}R; z8UDV5I{23Iy8?!w$?pgC;EPdy-~YTqqN=`nCy&t(9D zjiG7DM)^JCR|RS~`5isIpI>$<>3yow`+uL_`&4Fnd+C6V-a_lEA0S4_Nbg&JxOjTs zTZ!SH$k)NQr1x4Ff=2J%_27$<-a9_4P@YQfZFr29^nTYb3gumtzWUcQ3RIQef3Fyp z-hY9n#=9&Wy@%IVug)nMB6(K@rh#LAjRvgs)wsh%bgD@1GD}B-#iXxx?5|)#)mPi_ z_$;q@@A_H6L}Y!{EPwy^d};mVp^px&k3f=?_>Okpbro}KV#~CMNsSZV{SDIhltw^A zYI*UAeCV#jhCcsem&DF${YY#3#;V1aQeF&HdjIdsi>BpxueRH(?Ntl?=(z)CdGXZ@ z-DbT&{b){EhM)Uy9ehi9;m^m;4B9tt(}OQYd2wTJg6s(F`^-UlkZ|M%&=={csic7N&UE%bT$x!q=Z z|LU`gr}sH$8Gi1cI{23K?%$=S_uKT~i;>=MeB4CuSMV5hlxMupEKS)UFZzCGMt2jv ze{d!&z5Ag3U6lSar)0?6*{7KRa<*y&5JvyWBZ>>^Kgcl@v`-e3yuIl$1r0&{hsS5F z|9qpMAu9bRdj8XX_NC-Mhkum4|M&UNoRf0@Z`ROnA#V?CH}jucr|R&3f%3Mggx^jN z-;)3I#}G7m`}IdU@Wse~KJB8Apek?2oiK3%BmYT*+IjK(r=bc}mABWLp&I3F6%}eY zc^gLGAMkz2;6Ha4FafsRs1cww|LON9par2+gJ1NLl`Ok#ojC?D7KLbi% z^!mQeBJ{uf^Oqq1JlUr^F_YI9Svko?RxT@QM$Zc0*nlP=8|QBMK3#MOM}vWg^al7hK{z2~vr5kQF32*5PO9b4(B!arWCAv);z9z<&{wY3E zcu+bQGp8D{vBEaWh1e;FFPWlvvTUPpr2)U=;cMFa%G^O!Uc!`kvHz^*zjD;wO0{0< zZc|FVq;~^hB4<(9x+=D`TktDgZ51xI40{;HjgYSD_>u=(1s@u3>!Ug0x~RC*X8WSN zGIlN~)*#mDeL5ByYy|wq2R-fZCB-Yrw>DtH5BbV8z(gpnBFtPI3)Q)}>K?^hTy>AB zWovk`0@*IlIcLI|)KUK7 zZi$JC(n(;_a$tDmWsi}HZtXQtoGXelyE{BfMQa*95k3Wk$U*zrLv<%}qQ+1x)gdxR zS{L2otV0-p*z-5<@8c_@S(+LY@C3RNGU(!QsH;jVI;{H83K0Ob5p}VJ8ae(~^n)<^V$10z zLtiX=fYDq1cMZMP`eO67diMSDJM@%StoHgL4+5){>tEFud*{>mEYGW*DLJI2{~O&e zs`V%~`B!{y&UY0CKU47Il90cu_kPCDkQLG3XVMxyezqc4PI2RBqr-%srT(z^ne%=) z{FwEjF!-o4tz_V1gJ68@T^0>K%5#LfdcJyKZ1Llxt=)u=yLo(;`{gE5iY@nx86T0J z!{DpOrzHbl_4YBon!>k0jqbAMZxm0YorfpCS^W5#*w%zE_ujDkX9%T*{7>L(#>XWC zU#b6Qd}S<+24B;E)8lLZnBvFR-Xs&gHtY$DuN=|_qsCX5{d3*al7WwZ?`C`yWJiOK zng~kL_RnM9;>Snl`%U;r=J8qbyQa`UqsK=ierNt3_#^#7$*1|uhi3gE{O|9H_QGvgVQwZ;HnE1T^+xYxy2jlbSU!%e2Ux+Hw@L4A2%(C1|N1rGijT0bXxJ_Bcp{0AF11T8(Q5D z_3;%2ALjjJeh!1LDHBTuzItzEd<~f&4ZbF2>G8F7Wbxx`V}c1^OSgo@*Bt18(eIxS z_|e&KDo!ZO|H8%lZXI7TQ25DaM&S>0qe0;Yj`CJb1~o<$KMJpGZbD%x9-k!(Jmv|B z!cg(PX8c|3Gs{1^1jDsKuD{|tX8fD`H~xO>xJbV@xBuVsrH%La-}+wK^`)&+=zNE3 zVrT5KLERj|YBy954hbB~N4zFp>`2>nlI{%CcAr!)+TNjiGqoH|bY-udxT(WU@#J;P z2fzM7A6%UUEm%I3@Bjk5Ul z_K=sw&G~*U*Xdd1@~jf)?^Kv#UA(45hJUYRxn^~|+n%m4#Up&Yi!z@d#V6^rgf35M zV^2GE*p~JQEvj!AN_wo4d4H6uwx?zBp>g`+L+fU)h^Fc6fY6q{=vBZb(V%})Et^k(ZQ@x z8ZK0KBI0IYHCh4+20AM04#VPlwzxdPe+}3q=I1@IKCx9%h zvu4oo*69ITxx*o*aXAnCIKmW21r% z$*||6hLNfrDHK0_4X?tynTA!csJyg|-Ik*XoQ>p--h=aYh#Hp{Qz%Ins85v9BQh?($y2b;f+uSl#o{F?Oo* zxnw2N_=Xu8jazf|6C4w+(s)8D@pxTPFQflYk;`e_$Gm$JyaL4S4HfDR`v34St^I#q zSExIz|IekSmy&It-TE72I{)ivFkR()z5IS?Fg;yL`)teG6ojkx*#P69u@{4=SG$cd@Nnc z_}Dlt8ho7mT91!=1{6O&n$|PnqaKgX(zsRqrJ~>?xHT;5%fegUPKk}zsP$#rC@!u_ zec9@$FB>e9pj2R2>dTJSAMt+E9r38XEFJNvzU+^cHNWpr^<|^;{WjH?{qjQ3dN}C8 zL$p9F&Snx=_o+q#*7aqNBhE&rB|B)t6mns4oj;cO%Z9q$6yV@hWS{sO07vnOzZ&2fc2&Hi60;S|u#GbBG?X?5yd8i;`p*(w zhSEPOSJdd#d_IYeMvLcsLPQb2h^h1Lk2UJFKA&{qm~-`f@?Jj^Q5erBMaBi`9||ts ztfSyUJ)aEEVmh$WKb{|?;3Dk#gw7A4@X@-w)CVc&x)~qP2d`&+P+!RvC{*DUX{Wat6$yFD z+3SV!5BRR7l>Q(*SukV)J_ii~8S&6vLlz8iz;w*T6rtpj5qqAb zH@KoujKZ0JLfcEGa$`SXUj7Os^CDeeh(kZ|0Aln5uuLOxLvRdK_4#SQ*MKhuaIQ*1 zc=P{FL$NJnoFu!K#AN7Fd(m*ZT2rqDQ7j<2a(&mM+x zwz!yaR*PnwRD4Unp6^Q}x7Ll5eKUMz<4)`G-oP+U#B5&ZdZs)VVJ)>2mSS;t-wtT` zcLVF6U`P_{sW&;jjqToUaOsi~y*+-TaM$v4P6a6T`C}SnQLiFbiG*3qD;{`T;}zCN z{pa4*^NMe~(v$A0ArJAy{yt0!ZUL_ayT{FE^ISJ&eZbOF5P2T`b-;b(*O?4?&Ddxl zA4QCi#-*B=Ay%)R{pm5qK~b15&VG=2k+1o-$Pwr(g3f2=2GU% z%IaTI@?~YrU^;r&r_qsxrn>-~%b1_?^rQ49PsRsaV7{z!5`GOmd`m?)0YlL8Wxb*Y zUyS*(23J-{U(J{GuWx9L4C<}Eob}oM1Ui57;pZjoaK!F$e$m#GHK*MnEO~e)y6Hu*4H_ z0RFdV09;2_si%1}1`yoReO34k2>#e;;ol|UC+Xp1ONXwg*#|?=w)FH4I`C~7Jj#UM zNZ<$H$$W4OU)*mb%Lu9#DyEiKHW!IHTBEn7^X9TDs5yeNHqvpmC4OHtsQno#SF65N zh1!Xs=7?H_q0%`SPL}NGSW$&qugFjzLJPT!;>XLBxl##UJNybi{lYX?BO@8#O_^&Y z{9ZdDhrDl!bUwP&-v{}b<{I&GijjeNo zl)cO0IpeCkTcvESPz%cLVqdhk6dNQC+eZ1h>$ZxEL}%G`Rdh{ffDl>0n4TOS>>K#1 zuXlMBU-h3Q#giFCm-z{20C|_nC711?s^1=WcvjQ3e5p^F?5|AIuy3J*Hutc=!iAw~ zZ5{Fey*Wx{f+_iyYIEI82qfZxT%jZ`3Mc6bo!#4_>n*pD<%Wno@V^u%*Qp=M_{nLHEbv@J5-Ajgv zcJW6{vg=;gNY>g!d)%!j*=FtNDX&;VyzdIcN}5njv^VhhEM35^B&CjOr~;8&wT$pl0zX(-urfAOPa9Sr--bJhK|_x$6(o0rIP7JBf-Xg|KIK%qa?etZLu(b9f=rCp)Fi?Sd8a$JF`+K<1P zz*MiD1dN*a6li`-^+mTI|E8z+f|SSkP;x@#ces=!?^AmJ?~{DT@l0}0r|3v7bcrJm zf|iUVpWEW%Nq*fs41dpH9ehiYFGq1xL6W!Y!51URw?1Yf`8#-wmLy*Xnkp0DMUni9 zqb8D{H!dv6f0d*o`H=R_(EQzk-p{x$CB08kdjId!d#|^d-cnxF(OYPGfA1wTy>DuM z@$|lXEW`h2pbowzy>mQKklwrM!51UFcQ|aK_f|YcOL}hvwe#ZXed{3;y)S<&EWOW9 zj70C@_5G_KEE)Rct~Z$gjykB__HXlSrc+`!|r+#grAEGB$B)3#*b+;u9htz}1`&V51=urIH`&4e8-iO!Xtl`zHN$rsfGxYSe5UwDD7K zJvE;~@|{bRKkndmg{am141c}GL~WIyVHFfLChD;H8A>|6lJjAq{IPJ?a>iy+{@B)v zs}|*teZY5bY=|^sr=(Aq>Z&F4$F95R{IS{O8ui$4rj%!UL_;Y)4pvw7=+*H=DMuWh z&B0kH`D3$`{IMoCBu+89Nrtl_#ptR+p-t(OKNeEN>B*riBMbjj=ta#RJL6Roy%?`Q zK7=C4^l}8wOqTH?k?4i|Nd~J%V>K4g`(znAGRB13*-dIA<*(gyT2~piP@r`2WL}|^ zVPCz%`1-kfH2C`KDgDl_eWQE|I@B36ubAB|^_5{m#t`4f$l5MyY*WzG5HHAItsIZh zGOUR7OGeW2POc`j-; zn#*zV?9iOCeNU9Pr=3BMBj`ff_X>L4YM^?PJR>J+57GmiR?`E_p>}CGHRZVOpnwct z#Bs4J_G;A?8=6jvBXy9JG5XN;#4q;xuegv&$MM7p)c(ZLjj`ygfG2%Q@hjavB;=$e zQ|C$lehUqufG3?zts+gDFrCTWR+-c}nn}+`Ji9tbn)K=GB&K@-T9GkLjgY~D`x7yk zF;CZ}O!rV~r0M>3v%(p#MiVRlS>Epy+#KBRI>&RlvyOoqIDKugKa~pQN?N={5fzDs zwBr{9!!Lq6{&T!{`tC=MJ0f|Jd)DcE)OV>np5l^`N*xLW_I#qE^Q^%WJl~~zdf1_w z+|xgnT%hRg>4<|pCiD|qQqjX_V8mb-Xm` zw;|3WP;L*?u~iKnq4Nm#W-|^Q(JQwukHSVgN?=Oy)U&{rApLg5K;E0%I%pWlgJS?4 z5h($W#}F=c4uLwFovc+&^(iJaAB5O(3I=tTJ-TFIax@%~C;nlfCd3BS$}nFCC0 zLJAC2y9A7hI_#@4dvEx)Sw7kV!`#g&Ok^enOeOfB)Rj^kJP zA*PymFRc{5TWaf)Wvib&7XOW~)prj>EBxsx|8$UlTFXC;$iZ6A5+&$2NwLmJtAO_~S4OxiqO{ijoH3L!(4Rms*!tnt=yX(wq)4Dmb&V0a8>vVpk214gNI$VSqCPZ651lVFil6=lFFEF{!i==*(tG0V&{$>m|>g|lacclBVqkv zyZH0d(lJz9Xa^WVAZ|z*BIVS}rAYPc_hgG_KgSO?W51T~F2kNR+^gpk?w^xU07k$; zIqB$M9mg;718BY;CEE35+r7{z2A2=gn8P>2ipCUqX?Kg%IHs?IL_&7kth-X4BJ$d+ zlGp7jdC_;NdoXlSqq8M(UEy@+r6PG32zD>`mioQjTUsHlaq?sSXeb(ixED*?uryeX zN^*HbwduI2!jCVKaGLee?H>dEU~D1i=g?uNZPslmcQ}yly6$QspA`!EEOy1_x+?6W z?^~qiVdj!}?1&(d#B({)e>3JZ_y4r)%9u|6R-HaV#6e7T#6YGDF}-vdVj%>?vsK)R z{X&O6NdbX+|0-pR(P)79w~@Z?k-aGN_3FoZ`nnx$P4rdivnc87(T)y^l>LWBy72`) z4cF9Q>_x;}AZ~SRAuyj2oo^1t?n60FXX2#s+r4E|(ISwi#Ixaffd07?76=*Prh=Jy zHrPF5;>+Wc(~}-wjsK2`uZh3uSt+e;_0!|);Ipm%nD|EgcYJ(n{`*0E2mbq6d{6%S zP5eOq`(ykF{<|Q4EdHjQPPC=nhZJ&B%GrGj;t%7TJ3j{hYg{0*t_LPi?lLB(5&pAd z0B~3ZGf0omLSuSHj0`^?rZjYTriRE-nZ6Id_l}W2_sZ9H?*jh0=V02o*whA%*S0Rm ziM6HEmQ6cV-?r*H}+)sHPp*#;&o(C$=Zz#__ zmFG#ya|h*ly7Jswd7i60H&ULLDbID3=grDB$9Nb{@%&Bv8~pdP_(}ZtgZSzE zcYOR@{yQdq8UIa>-;BS6nmmxB?eg?^9G&oYOnesq9UniF|9%iZmH&PgKbHS~6F-9g z{un=y|1OB{iN8tIK?nI^OnhtkVSIce`Qd~3I`YG3@zvyqZ{lO*2kaftDw_WopN9{& zTd-eg-Do_@Gp{3_vy^9EXFShTo*55#o~k@|P}+}Go_i|KBb4WX{G1d&kbsR)9(vNl zSmmJuJxo;|TGPW!<)INhWGN4I=wXfWP>mk)_yJlAd%=75H_i&g9X?wX%e+HOng|_y z54nVTLjqqD&BZg;>(Lh03tPq zK-}Z_HOc$nmsjFT)+1_SjM+i{%c=?V99uf&(Y5=o>t3fO3t5PXt1uiWE#f3RK%t&+ z*QM>A#r6|h?VdmEbx%PBAPdBxB&V-z$Hul8m$#j-kNkj=OcR3Q4y>z?N*E-;YMc(}d4J7si7!{?6IkC|mOR6m{ zB^$4070ADNCZ_GX?!^N*e7w>=CZ!y|&UU%CrQGRQl#i~n1Fr{OcO?8a*p3kly3&P` zaEtci{bB-%S3|}*0*f%NmzL&NbAWv=@>h0@Jar;aK4#Dl%HU)V%WP>+Lru+};_xiP z7x>l50{qIB*`D5J0!IrvRfrKAcbAG0m*M zxc(&nNdC*;UoU_EQ?$Q7cn|mgRr3r_*4q2Ylat$jA=_{LmIuP^*9Y4_5^Qfi-!?~%6~*}V zOH=gaD_ea(oola)v86wV_O#WWt_79WvxKsTz}^_U2uHPC`>UbRF`UqbM?+FR|m`Z)9J5h_&A%R?z{K@ zWA0AiV>;Xa@y8Nki3wugLM^e2H9<7gG9f|jRXep)C9zW^!H7Xs?NxgfRTNFFi8a)| zuc6ixYpf*=`CZrbIWzY?=%df~`+dFs|Gr+&bDT4C-siqP=RWJqoT%GTt3vEQ^V>sg zkK~N`uHQlP{y`W1eGr{FQ=K7n;khIojnXCeTPtfqOS+)vTPRVyt`o=bnB9(c*#Ds& zwC3ZDC7(-MHrCSG!dHe;0iC+5hMc3H4AE+pJ7M4P>qaiLB|g}0uEt3LwA|3B2UsZ! zxg|aSbxZP~CB7eSNvO2s5ifq4O&);QK<{}hXL`t(AoST-1$`BfBJ|qG++;ZLneSOPpttb%s;Pk zjOH{~Cij8`zw^>jqPJ0{d)82;ztM-;{2sg|@}MPZ3cYG1(PXZf zy6L~Dx$i@xtht^RQ zH|DTqEz^>@36`jSwCuzJv`pTEf3R~MY%7bsSmT3>O%3G5244M%3O+?2V{^yK&voXO zI>WpjJ#P!@j(VLeonjr$5Mq~|3mrs5Y}e_S5<+_>V^K;Px5V@OCMv)Pl7`4u%2)Hz z;qkPSrekVIbm(!pkz6qoEuZfq$G?(UVhzu?XQ9;|8Y3T3CCV%*9yAMuBE5lUb#pB3 zWE(E~t)=14v2%et&AB;Qo;e52tnNiP??+i}xA?r$@qARP9A8h-MKzy9w5M;K&>{BM z>yAV0Sndqb?u~EANfN%75tcsn_&s-HY#zS%(I7s=-X%>)z>N^w7qN5?I3~nWkN%xR z4^O2R7vq3v-RAhrJlI~pxcTum-;bfc6kbyPB)tCJn|BVy!9~yWiD1zSjzjS(+9>HZ zl+iCcANcoBiw{Y~d>0?x0YDHP9{=wac zmztG!f6eUWiiFUOqjU{oEfZ$39+6Dv6m-O3wG17~w6FZUkF*y3BP2Qtolsb#JH}X| zevw1+$*_D)?CA@Jq_iATxzb-NpfK3RpxqN#$hdL1|Qw% zZaxk8fJ_JGxjZyxwUUiyMOC%Y%%uY}zx~|<^8q^JlU*p?F1l-EqE7$5wKs`BOs8`R zOVp+1#bxX#!lvJiy(NcMTOE%F-EC&@G9_whzV|oG(H-$Tu zbb$%4`KTH(CYClAUa|CSW4FXo)R_PJ@ca=$SOLbRjpotW;ygO%UP1e_bo5y}@6TTH zk*Xm^BGcpO{DHnOxrJ0cukr`0-s#W#0$DT0Oj-u*_Kx#HBlrllfXe%?E88VUC|;w| z6<%*p8PdLDm7Iqxz;UYLaw@YRKUmWYnV0-Em)n*m(nusd%!8Wufi7pv`&7zZ?f1cQ zkJV7+E~8~ox$7fociuXln_!7b%VpD-mj3&)3rgA2eL`(lj0{vZowl<~RnrLx74wP? zOmwgcSVmQsY{P#7P+sSv6Zn|bjizzYc3S?2i(cMbir!r5gGFDIODe46b+inuV{RI? zz!KGskIjW>nbhtNFSa}uTj#@z?JkQAY`m1ptW=!0j%7{k z-sP;RyD6p|G#?$J`5kiW<8i3%nvwd94$sGMz&vg&X~q%AZUcvBy2{|gbExf4In;iW zhKl8*&Yfr$M{kr_lQ8RXqw3qU(h)o~#(8+gQ(}wI?2gsW z3(oM?;kiD(|M2$pudf`R<;x$h={t_x36go=Zgs?FQ;C^X(XNj6cvLbQ7jFpc0MA;^3a$NDqG06<<%Av zOZz%`yX#RXhJQL_5B%{5>Z()eGw;aQaDU^J{3DFQm064-E#-wG^v1FDM(Ud^$?0P< zoj%fEQ#HEKlUw*_ocy%*SC)wJa+tznrfl+VI&i<;Ogeox&WA`#6U%8W4Y99)f9I`> z>MYz?`M8qKTa8fKBIsP@t+hNMzZ@^=8SDJXZesm^*O0wNGc=@&-jMf47FC%Km*z9p zxuM1$dRUJ0H>~{SHhIRoJmj38toolW^XTvTynC59osYFrC#`K`^BOuz+UWCdN;foK zF7O8O8|;CPzo)f!ws~4Nd6lnp__^eUH$8rnH>7&f-|@6w+duY|Hcey=^eU^Zf%g|a zm43?Z=n`FM8Rp*9cFhuXMUEa6_}d4~|NKDr$8zY9N2?!OZJrA-C7nDl2bcF3J${mp z6Z>hhQIl%r$`;X*XovlQtzdLxsmxwRtBlSI(YM~dVe?BRUaOCcNwkPy+XG%?OIqZ; z0It&T6Y4vj)!g6GE-+s9o_Nx`51mL#7oc6=aoW`rVWb4}@*OkDX~Cb^YdW3}f0rNp z$a_nJX2Iw6Z(YCemt6Tq<+b9dobTiFzOcDFUmEPE{p9U4*iVMF3bl`=KbLTxPO~i& z+SB`jBi_({Y8(H{UbXNC?gs`(T;m&p{96^rWr%sDd|rzFr-wcpJ?WY%;$_-lwTuq* zFFX+4_>}%h--{U|;XSib4)|j~hCkjtxVtsF0ey}j-(tVl#yCN5p(}eT=c=!)tuDn3 zPkO80!KhfPrNI&Yc1py{G{droXAH5)_W`k>dj;_Q7xPP-Z*YQbi!-j#uYrP7DWA>U zNoaF5-q1aEIvEMeOE)(&({~+sJ=zlZ$8NSgso5zv+S$JSm14Sq_x8lZ*=hOy=m);R zX1H<9cF*jnrfyLVg7#}@%-j35D*V$W=YB1m9ttF@ZbAd>%INo0;qt%LWogbIA7%{$cxwE$X^`RHC(n z?PLGR|8KXChV+9cY#+7hU*`7VNB?wgAEz6r?ISPV{r2{;f!>1cV^;~s_VIvz8U8=s zK4NKR*X<+Wh1x#u(%0Jlr`yNSR6a_4X#2QUUwY8v;x0YtAGVL2)L6BBw5F#6{a(BKKYN^$4~r> zNIro4)AoV$Yv=v1g1m0re?8_nwSK?{Qo8?j+u zr1w@Srh0Ge`_Gx$Q5|%q)^rwirgC&mFXz`oq<*)MYWdx<2le8`UMhh&G5ak2lP}MI;DBfdY$CU zi|3E6v?P^2~GKDlMU-7agFl8{PT&I?gXqyUD`o zd)#@cTO^jHvH$u6dl?-~6?U(eeA4w8BO;z}C+jm$4Hg|MINb z4b^7Xt9^eDsZKw+cbrvcZpb@2+=oh~v(Ll}?>VLZ;Bh~%RL9{NBWTl+J22^;mF@Y4 zDqB(?l|A6I>YEseT=1{Xs!M(>>#;@=m-YA$XVssTz`o6o!ZY`6Bl)blx||qZqVKz@ z6J-8qfd1AE9sTK^f4tnrIFw}W-kzAJ)IYh*p`TJazF|JcF-s0w&byxv$Y%re6IuGs z3q9poJ{6!HV(bk1)ZSK~zQ^L9ht@!}d%labZ?Jn#IYc|k5ry2ss>_#O=$<_7IOt<1 z`Wkfze-~zSar(jRfig(%* zMoabEZ4;$&2=6LVNoDH|;6^f7hNo&h|{EpIFfP z8h>8$xfuUn&|BM?TU*1?N8x!~FzqV$kf2Zc!caGY~ z--~K+oIV4wL@uYP_y{M&Ufw8>*RAfj9rA~QERlT2i?3Pw{zaRQ`~g4wi9P;V7VbWk zqJ7_o?>^z8?u33(my2e6-?a|!4&T1kNiE?=ZKhAV?q%f9*XV4(vc<#x>0c4a?t`C1 zyz&Wq5b>&Pn0v&l^5Jw7E|&JCbQMs(kX}kuHTtqrNa-Z4iinyti4I=J<+{?&cZKNY z5MKdMb$kyio`Lzx6lF|MQ)T-wCG3XzMp}%{TY4D`=Wr za|BMFO8eMA`Y4>Qt)|grW1Ni8*Vpa%i(xjo8}^>Mjr{>y(R6_1qUihlZ`}%Wle+I1 z=gAGW-RI?$q~-8M)qNv^2r~{ki>F_4(`kctQ5AO2+^asLgM!*c{>S?dJ~^a+kJ#tv z-~2sEtDV1laMkSJw@y=Epj9X7F zObWFRqk9+lQ;%`H`Xf^5-bFE*KRC@*z7wkMvC{3vVENlva>JJYvQ@+#x^>~`wph##{+K)XebvF~)ezel?%=iaYUM=v zQO61{eN`(U;^TkY!7tX()-|03$hP2mgEmiL3Z5_GUpP8=>#NeiC7}rkw9@IX^58*&@jSTt{p z73NT{vC$#zn*3#9es%$!uP(DuPj5+g$ep(!qv!?W8=6Ajitq8^?tZSi76JX%6WyJb z>+)e~_Cmawry7am2HPG*#!@rr`wp}y?(vU|Z%EO5JlzP=e;hjjr?PUTbc;K^^Z79E z+n@9Own`T1@3!6l+}~fH_^19}Ah*^*BDMZL|MCA1`uhNC_kY#jLvm^5{IB}^-KyHk zet&;2CBLxO`}-G{|5JZo8z%j|2<>sT{{H9Y|8;+_LtlS*x4*|sr2gKWJ}`If?@MUP zzw7UJs%R1XV}CE2AN~Cmx$o=mOGx<-{e9*w$El51qHBN0cdi|$zD96X`ttDU$NZZg zI>_L~ z^lK9SS=xU0JUn6y?vcjL7()}r1x|b@uQrlbNAL(Oss9pQiPbJ0;j_40x2y2aIX$n^ zz{uN&gAFfA=T_C8u3#><*bA$$`Zf>N4jN*~NH4a&g) z$)%b<{iRcTwOUZJKuOPv(bHLxyQX{u<#mnBypAHET%RDhghEO2lU$zDz*wr3U5`{Q zS1`kB8junQWeFx)plpM(iIomY8KEh2Fhd_GfB8#AT`=*)ACm4!C_`Aut&}R7@+oHU zg|Y$4%kfgt=TLG(v9NOd3ui759;%A6K#8UKsG@#Qc0(xy5hq4=@Oc@=~+|YpDW~qLTprWmnpSEI zlux1j4&`$wZJ{)0Wsp+rnz9DUcqmz*jDu1FN&zU|tdvnoBTe}NiWSPfDw0bxDCg*k zl=|-RvXaX|8W=a}yY}WeLmEvf0woWWub~u#(iLsVh_<+KTNWv0TcXP4!f46mCSjCr z0F)b`KZ4Sc=A`qNHZ(BWDJ5J}zJkPAaIVn@>$|}dZ`_sjE%>Q zi#jyp&Ij~C27cl6YPDqXCw*2$Ar$2oJMmeY{QT)My{Inld(ObQpS@aN+Uf7|z2xua zchY#7hX9-ViJP3F`yn3K+<&EkQTQ`D|Fs9U87}n(?U9(*l$My6)4&+h*%|YELj@Ew zN@gfb^HFJerL@3YP|`x_3#B_NHI&jyQwBr1LRYh-ob;12&&suJwY_vvM%9*vQjC?y z@^c0`P0Xe#<)AErG8M`^C=;O=zEaVjG%(gECH{`8=(a>(tt*sLBN+gu) zMWij4Xkc8BFaJv}FK(-fyrImZ`A7+a@(P83ZLal;ag7m*%IXqKg|P7au73Sb6lhv!bk;QU*$1nvW`)0_A9TQ5HhE zT1av^PXps8rR=|{a=D33W;V@7N_{AwVI2*GvI@!)R=O)?oTl(*NQac7SVwQlOGTk* zOC>11pmbrSkWy-DN;@dI(3Th|*`YkyAi0!;QiPRr?VY(iyP+z|0p&tBsc0~i&rV4L zH$k~oP;yD2f$@z})@jP&p{R)Fqg={Cv6D$<4u!HD%J-}^QA%%3nFysd+H$*`BC4d!or4-YYASf?SN?R5~X$a-XddZ~_l-#WB`plWjZ}$|fj3(|nYRH1rm9qCwmCJRx%~WkC z%|{j0gHixn<3cEV^NX^B21Zwln<)6P=SASfHrUuLe8T#n_FisETtOjpWUO*u3~ zf*gs8%0S6JPbO}ER|!^1Pfdx0a$&BtTwV^A#lG$&ZD|MPIgL?U(n84!#hsO5N|~i88=>rg zk^{<$0ix{vSUD>GC6}+zmWfcNK#5@Gp8UK(D)P{j zl28KBmWfa*L$N{$hEk7}6-wEipmMo}4KKN)v?T~io;gxcW+)y|(y-E5DWf%IK9sAo zMM*9t75zdcrF(d-X7LYf399!_byZPzFJn24y0YuUR?O%DDw3T~QTf zgW?ZmAQV3+&7m}aQim10QdVn9{2*!ks}53;FO7l&NO-duB^w5+EP-fA5 zw5G3@lw8)4Nx7U}Bf0FM+3B)kJ1c3FQdm=JLm7&;EQB%$%4{eTpp0T=8@|`iH&@SJ zR=K?RQWonEr45v-P})JM3#BG2;YyjQDeIx6d@dDvL3u`FR8f8?Zctw3BBi2ILNui> zl0wPF0nK_ zP)b6n17#4DI#6n`(m*NQG-Vu=3{b9pB)PajsSM?HPO0bx4UAOzDS%W|P*Z9`iT_N} zoeyO_jZwPKR!J_~p=@U5ccq-YpmKTEUuGB%r4^LHP_{rB1tpA?AxfE{DeIurgpv(P zbtuE3)Pz!nmGVkytSP;rylE#D#TS!Y{-QCes3w$GIV6`SG%)TobMEWXYf3RFyP!;f z(g-`i`cQ5`NnmA(Qg)tKxm?C>%|i3hUaB?}FDTid`~+nwE1xT6xTeg8a-Mcpq`W99 z63}DFfwpcFE-`4UA(=ow?jUrz*+}UnvP!XPN>3J*E@?Hz2g=#jqKt!bfyQV}7lU%lA{E8c!1zHa+s~+6F7}og zmO!ZqZ4azDgRiTt;iaelv3Z*xcldYu898k7rlUz2_z?h_z<(jg)m&`Dq z=A(*=L0Jgp^fIYv6qGPl>MEs^ri_Nt1Ipz>l1ncrv!T?4QiYYj=^OLr7LZp{sza#= zWj2&4*a5zT(h*7k8xZ|N(D^`f${^CwNS=F*}p_8Y6#_HR{pR$`-^cxRg?ir zLnu9=q=m8=iZ>KbR-%-$R8wMcgYVF%QjrgoYcxjtm&#B!XOUdi(ZKjvDIGLrB$QQ9 zF6Nh9_F>mG8p=T^yIFbF$XQWtO{ogSPV-T^v!G0e(h!Or%0yOvRm$<>Dwl`2sn!-s zQz-4Bct8n((two#N|~Z5tDqEv;sK>3l#PpJ9i?QJT%OawD5aG8n$iu*L)uwUMZ4*V zXtc-d-CWX54<#JRKvw>2=*;EKF;!7PD3xeFQbt2*2j%P!(v~_N}y8OYszpagP@$}&!_BxBazGMMbegQsOSP$ z^jCdnMc$fH8A?6mG80N5l>ShDfHIer4N5tBMCEcHH`Uysgg|kFQUOXQC~aBkr zvJy%>trc3+8KCUJI!eMiDg-4rDiP(UjA;sg@H;RVZFiszYfHr6nsZl`=?Era?K6HT^J` zR7B5C=U(>`{Usli9ISXMrHrOnp?nWz6_f=~wn90dLHh0q8W;!YiD%{(aPtq9OIj%1 zp>%`N8OmrVbD+#%WxP@rY07roR4WCgAe3xS>Og4&r5P)=l+sR9hC(?TBK_s8x8!n? z#wZszD7m0yW94~WXGJ+Qr4p3+P-Z}x17-ID*^W-TOD;!fVEm$#!-rHZcX2zcGnB?q zIzowr@-399tn^XJL`_)^r394pP%=Yl2&Dy-CaiplhWQ7#@( zvO~$t%9S8zF3AT~MR}pjg)$tpZKR8$a3Qz%WLG-4%-QhYU~A(WeqC6|>@uF@Fg;swPMN(NT; z$xjjF?C^TL%Eb-Jk5IZmSqkOkJjvy7I>}`p4UDgqvQSgD;&xbHDEXoEfieq9G?YkI z0+iB5Q^KJ5K{=gWa^W$ms120HP(EShX&vX9_RW89wQ|$luS_4vhuT1 z4joXr7`O!$2gM5I0F;Y!C71ZLl1m&7j9yBK)Rd)Arb9^!We${uP$oec$4XJ9)X|g< zP&z}|?j^Z=4y6;6hEP6cdUZ%d}bIivyFuqXA1Wj2C zCEND9#xSy zl;LPg7?iJ|41`h*N(ENFRmyrzIf`3Q0Z=MHsRE@ElxJ@wmj^U3LY2~2Qzk?CyMgo< zBdb*Ol*XvPJeei^fhw|WW$>lZ;40ojz)07}6p->h>=?|qClr2zxVP#i! zXD*j_sa%q=L#hg;J(S!~PJbi0^n=oal@Usrttp$JB-E31y`k)(F-mtL6dx%0SgE3v z=9)4PN;H(C9+Jx%DD9vmCQB~YX<$64=By~Qruae`0%bCkK~VBTSp{VYD?ch_?@pD= zb==7Ehf)uUAC${8B$r-Ly0Fq!DPuKdA(U5jC6|B$RzLADxj+gt8OL zAShS(Ics@P?+im!*Hw)5^j+ zhS;lpO#k*fNPjZKjgCYO{8I1bb^iSg`bDw5d1`RPey`wwb3;nijUH;$jc)TY;OyXA z!O=~VLZdU#uWzZv-s#i1ZAcUCewxlf?;Uy(m&Ot`HI#o`H!~VPpW8K45*baS^u6dE z&!v_vG%zmsITLxYRn_8+S|-taVpwUSl-`;$5z6mSZo5e?)1ml784G0? zEAC1urYS*C+Co_jr2~{?o8%G*r8+CS$~$wpyhY`bjGGC?p|pom8p?JkDNm%L=QJ=z zC}p;$Y=ZK*rsU!c9!e0Dkx+)P@}Qiv zqRg7&3uQQz$xyw4~jpOy^|%~myacv$22gyDrKyu zEQI0)CFPA&loBAhOoZ|ql=Z9>P>R2%w1Kjh=A%947ASF0tWbtR`I410Wu3V^*`zA+ zf?|U*2+9g5nW0pJQh}A}N?EHZhj1HU0F*LNdO|roNpg9XB)L4Gff1~fo|+N~r2>?j zuO*im!wCMOCk*nKczI)l>ShxP!6X^E+J56 zL-_^DDpu~5c2?w}DJ7wJLzxIA7nF8T214n@$_l0I-l%f9hD+}&H6-02CE?%0 z9!g18IxA(grp$-35=!#lQqfE(m!l+?`wu0TTQo58DW$rmw1Uze$|fisp)7*32Fh|) zPWd`>N!p+)$_Awblz~u+K7gkTpsay%Jy~*D1?6U>hkikwz(nHKjI`K~NS#=?Y~flpmoiW@TF`XD;X0 zt6W~-a;Hc*N}=?$ePl+LV#D`lpptcQ|VO>*&qa)ZVwmoiXFKq<^hMWuvjN?#~z zpd5N7xvYS4KSFZ3d0%q5LIWeQq_d(7no=Cf04R}A`axL-Wf_!(tSnPX>@O-8zMQAV zSAkLoN@Xa6pmc-sIV&BNGE!6KLP@SFxx9QS6}_Y}qANow3MD@)d6ZIBQ(8cYg|ZRK z4k*tiNG{jzNiG*?V4Nu7%;n)aRZ&(bQBe9r84qO(lpmnXWhGiEt2AXlE_Z{Wl!Q_r z%5W&1ptNPBfl|6@$~Y)lp)dxCX_-@aCt+ zQ^rd!m+wk0XJ}yju9UMst6ZMpLUj(5R#4_a*$HI>5D6<}vd{A<*a_1vwF6lL;7?f08Nl$=sqq5|Z9?JPd z$>jtMj3r9hxmM+J85hlKXg)ggs14;uDEr4rx^tk+VC8eA4A+#|P`-rn;<;2b5XxjI zZJ;z`C6`hvYf5t{)uF71QVL3AD7m0yW93*eXD;{GsERT}dE_S*^@Vbm#;Ct!g>u@E zT#nGduqkDwrtHP#>P9HVp)7-P^lQoGTPRam`9vvQG-WK5eozvgNiMyi%z)AYN)uLI z7j;&YUsL>{RDv=WN>L~+pk#-VnU&v^a(cDO=?-Nsl%`M`v2x4DnM+zt z@qtnn$~Y*#P})QBgpz@kAC$8FCzZ=ZTp}h_lw4{;c|c>7OF<}yZ%Z!wXkdJ%l%bk3 z3(96F&z?v{8=)kOkzAsoM6!}oDU~#(DU^{=)b3jAP~R!p@5FYD#q|v!Tp}@*R{_P#Qw{n3c^+Ir*c?B?%XI9icRb z(gsRjDDF_++$7~orA*b7)ldpU$qXeQlyXq^((H7HUN(s}HnNU85^5l_J)C)>gD6up<oi8|Xe5-^ z*QKHtG%!9^N(W6D31u~uiw`B2-=WlovK`81R$diwR+L*)szMnLWfqj_P~MD?Tt-0& zW93(+9AB<-d5BA)wosZv=>jDdN=+zLSQ(&{DVnkhiZ2uoC^eu=fb!~3$>j+R41WHf zxu)xDN;fE}Wn~@hejvGIfl?nz43rJ5{F&dWyji9yDhTBil+jRb&={?w3{Zwa8N|v0 zrNn5;SzHROfl?jHPAKuiCEe;!DzegADT6g-29$|VlI}}Iv!G0Y^8A|Q@{k6GMJeSp zr7@HaP*y`303`&C;3zACxgrGfERUS~z#nqpp- zZG$os$^j^?psa`T6Du2(a&(ExH-~4CP^>RMa2JwQ$L$ z43v*p@l;9~O|e3$3S||PN>G+UNxUMtT&IC?Ah$D@n?I;r(n5LZE4g%o@`T1HmmW}7 zL0Q7ec%>}Tl>20u78`lyZ2H%Ei1C$_1q{6bqF8P?kgao|QgInW!nt zartqsl%$&;$_W~ybSpsV4y6MtA1NhBQ#wJJ2W96S$z>*#q#=?^F(?ICx#I22CHZ?* zQC=wRp$v!83d%+(e_oPYF4Dl5qm)gWauOE~1))@ik{e1Gl*LfyvGS=>25QPwC}=vM9w@QyN0~0m@1!^Ps#OEV&ehl82RjIi0y&U#N0%gVGgB z7bu@Y*$U;#MaktX4UDgqvQSgD;*|d*DEXljhB6w;LMY#{5}=eeni2-(b_vPl^exHd zI*m~-b)b9>r4=hrb2uyV(v%8NRzsNvWhE3hDEXn}WaVe299p1qF>taz5Q-H_Unsl3 zl5{UzkX%mE!04rvNKIJ^r81PXP%1!)gfbV(H>?y@N*zt<0Odt-$z}UZ$>kA^Q7#Rk zw1v`~l}p*3xxAdOD#{JzHz-4)Y=GhcB{vicE8i()qoy3k3GxUim7olOa%hm`a^}3` za+C%}Go|#`lqpcELAiTFDyjr!DwJ7J?5t!`N=Z$r59Q@YlFM=^Ni;^eG=oerq%q2+4U}e3tgNh2O8i`v z%Wa&(#X@NaB_2v%DA}N7WaSH`Owg3YP-Z}JgE9=t#etH`k+YJ^ei|4>lu}z$+C%vm z%GN(6ms(I3LYWFBij@o5oVmQ1qbl--k`783l+>b%+f3rbHYji3avGD<0PHDwEwD?XA-ZYT*fM!n7# zN(LyYr%9=%lopyY2+B$*$FE8*KR~(LUvk+;v(p`dovb{{>Z~ZMrj&uw3(6EIU7)Om z5(#AtD?ce^|92{vn>gX|g;F1i50rsWK7mr3mF`Lzrzwk|7)2zPHwjV^k5Mj_prnQJ z_bE~eDW#^Sw1cu9N(_{ZP@eRYT;gbU%4I7n=dw6+c{WQ`lmp60D1)I4g|Z3CI4C1n z`9>-0H03Z(cFL?|_&RAQxoQv5Zg4U|eywm>Nl#R}!camnQo4U97$&Rm{+qbl-(^1Ptr zG6>338lzk?L)i>v9V^q7vQ|?L;Z$WClrm6$hjO^Lt>8UA^P{u>Kc~Np1 z2W1+RDp1O?l1?c;noSlSpYZ744-qgq;VZE5wewA*7!YD1~UN?bZ; zYenu*)1SJQQ5l{xR@+hsdqO6)y2FlAklFJk*FKCSSL)|48e<*&e{G^oq(JGgl zIOy(#QXk4TD6^sbbx3kaqJhy}DdRL{5tIlhZ%#`^W1+NzvIWX7tQ1m8O-*SBr6H6U zC=Ht6ICFV6MODNn6%>Idl)+H4K)Kvaa;XZXJS*QQWu2xR#zFT~Zb`Qs zls{;U=tWST9+X_})4*t=l-`;$5z4nvZl97|rb6igWh0a|thg(sn5G0lX$565l%`OM zLHPH*` z04P0K`B5o*C#zhp<3LvtNnyqWLMh5huu^(zN+gt=P;MTVT(Uyh0_Dzr$>kaijC4xz z(Udw+PUn<#7eQ$WWjK_TP<~)#$7^RU7bmJ*%!6(Lw51)CTu^F4`2tEOR)#5MmZogP z0qhFek^{;)8lyFx(n)eD4y6z)eoASoDgB}R0Ojy8$z=(YoltJ7P};N7St+A6Wj>TZ zD9J~qq8d=rL-B!cN-}nU`#VaySNBRT=V@S^`rDaHQlzRV z8L)Ot`D2t%XVa2YL)tVBIgGK?GkJ{o3B_EW=P&z_s!%8Ei^w5+EQ2xv= z%Jn0X%Vip){*o0+K`6OcNu!j)no=9eawrR-EQNBkgXD5)kK}Ti2FA8zXD;U>R4y;D zyYCC74U{jS%z!c<%D1e9D`lpptcOw_iWii!P+CCw3`z@DDk>#JQ~E-A>Ls}xIxM;H z80F#(B`=ihtR%j2R+K?gibL53B@)UOC}%&HT+Z#5T#nPgSf-TN2`ZNa?C!@xsRLyU zl(|r5Lz&J>N2QF^l(|qEKzaFxR1^fIJ(Si^nzE8dDOEM41r!e`8=<&EDG0?IiYF^4 zUOIDmI9^qh70MBdq}w0LSsJ5s6WU8Ir{W}+!!$6Wm9k1x_G9O`2uevPE1@igG80NP zD-D#=O;g4}83^UtA<3mTlx|Qyh0>Un)W4h+71WfPP%1&052Xr};!wPxWMbuarJNn7 za(RYb?BCfWmsU_xX^e8Y{h8!)ELL)fr-3m9h3u5vO$T1vI@#HD3e$zuaw4` z(i@5mO8h~|WgL{gP(q|Z+1#Wf6>6ODP^Um z?8R;^Ijgj#IFwg3#{H$OL8nw{>|Z)c^fQmmTN6Uvb+lJ5TflFLCFqg-O4On@?qm0M4pxun$;A1L2I z83$!5lnGGkLaE8h4@%iSTIF&PyOLH=YC`!GN_{A9P+n~(!!F6*G2r7_ASzO|$~7RoSIjy!SZa(9%f$OFnED7~S~ zhcX39Ae8E?Oj62nP1%hdQa32Ypmc%~0wraeRP>w%MqQS@~WmTSur|&SUf42E`xBCMX-B)Q1wtN?WCb zY069}qoF+6Efo!g5(Xt5l$75|$*z`O*xAVuN{=?P})EV zg0c|GcdWEl%3w{I0i`gMq+L=`5h!V)d=8}*D;A}c)0DIw zDwq4{>}S(Ux*<@`&=}=14a%9#lFLyV82ywoSyNU*`5sCJC<~!9hcXL_os|+wsi!Gj zp!9$eyF+s61SJQQmQX@ixq8=`OUe*cQGO^Tp^Su51j^~Al1mOKSy-8;lr5Ta8r}3x zI?1Iflp8cgxy*)gVw2=@hz3SWr3})PX;9WcdB`6J*#lQWX$NHn6dNm^N-3i$Rw#p@ ztb)=P$`jcS=E^CUr~-b8fEoiraQx3@_S zzeDK_We$`Xthg(sn5G0l84qPKlu=O1KxqS|87sRCXaBhTmFgeK=n9`eX%D3ql=~r) zP%bFhSQ(*|*_yHmN;)XsP*T!JF6*G2-YB^op@C6FDa|!yAe6l{ALVj%tK_l=${;A; zLYd0SgFDWOGHZ%2lxQfEp-h5O8A=N%O<4I+DSHR0T&|;&G=owPN-HQSO|U2Q`$f|>L$5tfx=_d>xM&_4rMYcXKp)l zdGe*I$P3DBD1)GQw-BW!l%`M`u`*pLYc=H%y2j;Cr7dNkG)7xe8cQyoP%^L*tdyRb z5(y;-+Hx~Sa>)#3CzQkMC6|3PFw!Z-M^oxRIhpFg{bdo9DmW1Md@OAl@slWnX<+QQ z<;>;cK$Xi&td75FM@dRMC_F~#-mN1_Ae8E?3{%Q1P1y)#50o5G_Cl!-W!oxg%O)Ba zeoASoDgB{Lg>v{e$;CVyd>ANg=?A3;EB9_XEAr5kl2FXE!HH1XqAf3>w1v`~l@(A* z(q3x!0OXRN_EOidI*LeJKCj!UZs){WM9IJQ7&9uQb8B6R$GEKVy_2PoO(?OJ!f$HJ~V&O2j*|h ze`LLG>$9H_V9AEM1D!j3$~~CutvmE zo9Y+O8yuY>*xocNx6j9VU^kcIcQAMd59z;MY7K@&y$sJ|wGT>TEqXR7*s`IzCGtCJ zyEQfL-c9THSC?raL+e`Y>)qVE+#GKS|C5XKF|N%)eNx6h7U_5Jo{!bBqJpfnydqZH zeru*TvN(FAJ|{$vZA^^|vE5DVPtC&^PfzSfqw1jm*sN(PEw~; z^;n}TSp(i!BI~5(B6ia|e5?T{!VNaPJP5pdwClU{IhqqSvCv)>u#CFwK9H?#j`oH?vf=gklk5aK*DvaOU7|9ACXMogIz5@m#s zqr5{hy>Tqh64i^|5^Qfs-J?Er5AJ$q=b?Vnio0HNcy8`27TyMbkv<>RCGiopJlO6{ zoou&%aCDdlb;>vDUEvn1?Ks|AEpacsmCkS3uVm8gLTquN(e*2}3#N`8wT0h6S;`ES zs98)$XYe~|#db`)_h4IWXwhrdC?m}GUIn$jLem@%&U8L0)UqLiC2~dzZ=vSZZBOku#I1?S_=S4_Zg^=i`9--6?ON7`PdNuGnDeF5lI&Vm= zg2gS7j0UIf4yFzm8gOXv9o|Sh>W&*;nl{%%yi_h%?GJ(-JGG#DwOso1Kh_eO>4Ix5 zUAbGmTTA$M&ZFqjuuWQa;n&oD%C*46nzPcn$==CaH*_EQ?Z&F5@H$kf6~0$oTZSbv zDf#X7L+$ua>qlGtu4^hRk6NZ$-nx66C<3+qWJhF)TuqC`9%|sX|7Md)9Kr3x?lW(q z#~bH}f8yV-og?iMAJPad&k~u)|KMF8S$r)I7=k=cq{MzW%IMz3({t_hx?T!ayq>f5>4G}s7GkPLrc_l8V`=U zl_Avr1$D?5A+|eyFX*d~yDz743$`7w+79^9wCl#nj%n$5urDb%?ty!7>b_80#o*{R z9>KP@9>Mmny@KsSy{vK9-Hiq9Y4zIv@_S({xtfNSL%lM@Rx31m7!BUsYZ+{_dL?F} z`a-Guhf?=XOredef!~W=LDURca4;6Ul_$v3jkdICnp?2o0~x8qxCI|*#OF;kxfbnd z(pYT`$>*c8I~AOP3OyL!hmX&+2M@IkqPl{-5@*tqs;04QiKlb93dtUH@|>$T4R$7w z(}2#agXpgZ2iwPb;OIK@n}4-#TXAQw2PV7{uOfR^Y9M<_^jCM~{Dn_HTG2UBbVF)b ztR?apA3UPRdRU`9#*Ou*^~k$zYO*EjHox+_>|<$lTer%;=w;w~u-5LT|=-N+oM_Mhf>{4NH+oj*9}-_FW-S=YuT`UIg3rh8Eo$n&~vQ_d7`; zmJOvWk-^j!>Hxt-&xJ(AhwqoIJRxjnV|&#AYbx#V6Oyc!4K>0qCuXEKjvGtoEzu40 zhV>5#h_gg}%yk^V5~G`WNgdXJHa?c9bQBJk8d-+_5&bD0X-`@r3-L(mA*+qXsTa{s zFgu<149aWqs-HctC3_G>6_%Y&Jt|ob)Xy$wN{M$#mu1ndDV$7M0~-2RBIhurMJSEn z(>fd*-Q0YFV`Q3ylre-J_Z(uM!tsVi9ja@YwI?)ccU{YOaSePfgwSRaoat$U$b+;? zzsRu^3G=s(r_&vao2AG&R(ST{sFNR@FZ?VimdIq9CGi~npH!|DoaTfzBF@Vi5FeJy z;+4kY73^inZl(WGid2tlMgN;lA-$oRI^O;3{tyP2`dZ6aS!t$rcfOx3?=n`ui`@;0-*C_QO6;y~7WJLwHJyrCq&p%cBq zSj4Z|1HZ!bY&?A=PoGHBaXv&h&)oCg&FU8ILH~GkB$HdTTR>b`-RN9pYtyCa_+C>88rQKY#YxI(9rGYM549{x!{9e;m=$fC4HdAS4+g{T8RcoOy zw6>boR@dBIwE9XjbKB&i6@->g(=zGWv7!1peG%ZSlrOodsIOeKqx3pWym3e6wv8t_ zddMOdZI#l@wpDb|#zEVxX#;d^fQ!~%X=ZNsc=K@f-pbJWX<89otL>s?Rhrp*e{|7q z`b(unHSGjXa#WhdMcYX)x%QB5F4}Bp=WeUqB6RIyxV{z!Db38Skc(!8W@jyX!0xb+ zXwPb*y~0-ilW0fHt-cs*-gW3Cz_>v(j zq-cK)zRZ)xoA3Y^_#nLmc-hT&;W0Wq8}N-=TKxi>`zb%y`WbfFPt_94v7fR+o2O~j zbj{60EB21|;+fuWlB-M6%{1)}Pjam3V`2KbIZZE_Z8O)+1{ZBDGn=2`8Y zr8MmqUCZL4EmWGB+aeb&4B8d$qGqLCb?xF1eJwOqnwi^YE?P-w-)dS;UHi#Jb5oj` zTTU14d{wD5Skw0LBu5V!?xJm^mt1@Au_trJD!-mxN^TdyDB)eM^v78cmt$g;RJGYiAm$TAT~YqFM0GjCLpqPu9#JkFCG z`+|#ud4)Kdxr1IpGv~agnTe0Joy-)#L;lq2*WpDja1SS3{XOsk9rgoUOoI#Sa5on? zixa+b_1$2b>G1i=62%d2fVsx@@gzqSC0*c+^b(?obimsFHk}TC4S2W)_t)XOU+Ect z=7h_>2i}sTWn2<)DGko4!|PmNHz#~D!Hhy{aeo~?;wMp@2OQHks2JN!}(p{@=iGQ;=3&_ufxgZrNyH(_zq8U^y7qqdd8>eB}6gP z(PC|1apS%g#S*|JHF%m1FLi-OIpM(fz;kri3b-i4=7Fx7z~+Ijr@)S@-eL^nKxZD^ z+X?14n@lbz^`GOVn%W(nnZ_OY%d_S4rwIi=M_r8f*cxAf3*Y1(67tD7BK9x8=fVYV^=o>+CtXMW_A(H zY-WsTj%J3kCe5tqXr^{@(m-!!e!z`1IHL}ac7dOjbilVyne}V%tJ`}0^j50>$r;t+ zbv(&&;0$ts7dYXl_rU9QxHsVMHMq47r+0ztIpN~(fqUw(1+Z0vQ%Yzpj_<>3%#m>- zy@ZVaIQecAg>-leD|XMPye`a@w@inpy1+A>@Zk5rr*3H(cLcmhgB$B`a~HUV6VCS@ z*rvnj0S9aF-WGf zZfa4q0Q>{P=F$6Ofz7j?g#tUy1vFMS_VgJGAV zZ{6So9YtH9_1CnNVp`EhT(m@b$yHnGqQ&v7cF$t0nQMBTXlBt1MRROT3s{q)ZO6=_ zwJy{`WOK*b8}JeC5hmPPhr77I^_*~!1J=^apu-lx!! z;;q-UzPW`JyXQv?o2zM=z~*W)dg`lb2E$lQ<~j68!5pipH?+rGj-!6j%x3;3nj_eH ztVytg-qXwqdNVD67iw^dk5>OE7dVk#0$kud@YO%{`dP7iHe%ROzrbewAG_AiFzPqY ztQQLAtRLEIUaF&h(aid@xiqsLYf^vM5t`wxBX)DWnHIpS7&e=kQiSU_n|bmJeKjT0 zOJ*~ z?GPtoR+>ZCK6cSk3%^}yeHZN$J7It3MbE^gI{$W+Audc0i(Q+xxTni&zvqdiH`EBzE&HchLeYx!KXvhQd=yJ+d4?fpaLmQ+xy)ab6Sg)8)u z>n7XRMcd4?+C4{V+EQKn%|)B8G;^JnanX7~tHheQ1860hxdWIenqvo8mo?b|e0h*& zc-7&KHW$##}2R;wAz~1O4qJ*)7MSiceIQyT0Uq~G%bU!t##3!=6ANuyg1u)S?`5^ z(CbubkQQMKPjW;!N;Jp1S;3mDn_UOqjc~BY=23qz;Cs9d%?LXS>^O$FG&6)@ms6bz zF3l_sZHcC3*R^ae+M9fDYsMwL=(F@X72Q_T_V6UfZsAH-eTA%lM_cBiO@`*ln%TX> zMKgQhTG1R4c4JKAz{aGuZ3`o5AK3*m1S=Cbu(KH~NpddK1AM z!JehpY2qkN+ryI_{r`GreKoCrN6X-%O@`*jnxp@VX0E0UqB&MmH`Zh|_22Vunw!pR zX;uV$nOCP{{p)bJ3!KRb7kLldM~BbmlKLkxY^J$~Cpqd5aIK$Sa@{wT5X_P0WN3j} zGs8tQ>-TVJW;fQP{@%OI`qR)lGB?vx=k)pk8{9d}W)>9KT8mLd!!EnfnSwc* z`KPxOy@)k4&7(ZY(die6=2%VJ=p{7sNZh;4Y@|1HGT>kh4%gw%E^s#|Jo-KG-)Hsu z0YBr_>8M{|v;L1<>u1=d{@(<1)}K@AU#)3Jd6HwLKk2Baxs6_O)rPoe-$LucnwjP} z(ae<|Cz>P80j$YNkB&9d)OMjI^rCA5&Z0H5l)z@uQ7+B&W*9{m!;8A$Teogi zS6BCBQmEO*+((<7O7Eo=a}y93^X%H-V$KoDcHi_i3%^LhcHK-6!gevMYsGwtgtcNm zsueSy)oLkfja9XiPpEZMBS`HwP3>YuVf0>#FWczjw8=4gg-~h`v`+}zM!%{Rb0i6CM!zYl(2!D?qHzU;D{ zi6o<)3enUK0_kPDTT}a%4)sSYQq&fxY9}98D`Z-b+L2vq6b@pw#}&1ns@e)ot!+Tf z?!7+N)T*;uMMbT&s+Ojyoj0VVw%T)=+GcQAnneL``)ws{a{SgyQ~M}Lt&XNPhSkO@ zYC}}D|7dED1gV|gsrsz}t2I&7?oidvKc?0~c#zsRn%a?Dgr#{D<+i0;X_I4Vrlz(U z$c_-(Zz-DETdcO7%4RpR@j}f`fYXJV)5u;VHIV=}e~$x-%<420%64XnVc`x`Ok22) zD%?vGzEujliV;4%LutK7B82@>N{P49CMPXa*MwICaf$DAgq42!4OMsw3(sB?aBQ*= zwwvC;zG^i+O~P7Q=q$vXv=GB;T@xXVNAo7o=&zUjec3>nnnVqgCP2ES&LOpu~e!VV5S{TMEBXjPTK|O7^P7 z!Y?SohAJGP311C&O1yu0aEaeig>$eg>c6TYyn;44uGsMi)tKYsg;IE;Bdm;M+pEIE zSU7VP3Sc*(enQwzi!+6=bIsa`gtfF-_@f#MwODNgso9}m2sJwtp4EzZHO#Sp+qbs; zN->uSWjhpduq*7Zr3kN}O^*F_HQ|L)IHefj=TzZgEWDLs(Jpa6RrpkI)v=wV@SVj7 z-=+#zW8sk`Y&*7;5VjrrwGeh3d#;Rhtlg3C*`hi&2ORb{P}Ek?Ca3+6*VGmUsm;{X zMzh*+3TNBs!9vZhrY@S%y-7{9*e2fuSCc7}?P{vU!lIox^{)z7(uA*;c7!)A4Hmw% zS!q}~*cJ9aq?C9CZF1^=cQ3V?7E0lX%WPp~Sg=?X9>&7IQ9E(sUkKaP^sW$gs;LtR zbNt&K(sM%085Y!Hwf9KPv0td!jvb;E^J*!_{%wx^N-=L&isecy!L=iSr;S5dq zYDq_U+t)J7G~!LG2s2MOENw1PG{_NNMArDe7HQ`QDc&;O?lz2y$(qgNz@VC?eZC8|1g$HQD=RzG< zbSy^rHB~qryTTPuD#D9tljDkeHR0J(`1h}DS12WpQ-ueza5)mTW2}b|wo^fVck;0l zV{J%Si?Omo%t-~+SS^E^jAOr0vtw+vP;+|hb0LoX?Taa9<|f6l>DU$azn};&rcI9h z<22#fQuy?jw*5+u8L0{nWZ|lca1T|uohIBy3cp#5a1&Ly0t;tSklU`fR2UH`aT!hc z1Q0j37R3mk!YiHRYQS$u#UD{X!gh^)AcXB2+uTj9F+T}&jn(3-iKRl!sj-2q_LZX6 zLsgrjskI4G8>OjLW3^`$wNk3uU`_4Zby+q$V?V5^<$%M|+ZDAHw8_bT%{8@!L2C3S ztiXihXjaRmre^zXu&P!@Q|le1wrPW^R-e@-D{8l^YCm^XYauM4X4isOQ#*W3SlUWa z`;j&|mVTtEeFvo1X@aKqCaayNMrB(%PE||N)LsZutE#EBXSGiiwMMF1J5BAbAhmt# zRlogxRan|zQ9DMP97`)|YTJQyOXq27pRihGMQw(vcBG413ljrscDy~Ssr6;G&C~*I zzjaX6mS}2C0&4cKsE(#qp4BFhnw1y|CYHR3Fe?&V)?Q>P_BTa2qklG)aY7`D-wSvU~OP^5Hk~B3} zklJ!hEsE8?Qq*oy)!J!lS1uK`beyKP3mld{tEgqrCfPzXwJ(Fz+G}cQtadx8*-@A% z)a)oc;-*?~qVP#l6QjPIkL_SlI?ihuN)$f8!W%yixbQY1YzNCnLf9ENlp$el;IL7M zIl*$MKo~t*QQJbB9HWyowN*g6+Eh(#I;%x1YGYNkcADDrL26wzwRWs_lG>%678~^` zZ1Xg=M_H|`q86{JjnmW`2dNFv)XK5iT1q>1=v}-(mfE40Ak>`DI}XI5*W)8Q^prex zw@|h(IF^!%KjL{3wkza)A#8_UMXi`V64vt6uj#4_2e4XgMXj5vcBGS9A*};ywhKSg z)T*%B{!apBE1{|_(bUfTU9@b&G_@>nSUO!%`<6C2!7@%$TM(qyR8t$pYF!kyL8@AU zrq(k^tzeDnxBFSGl%iH$Rl8GDD;=cvy{7idU&7MWly>Yo-AtPtOY>c7Evy96>vW=~ z_6DmBQ`E+&YO6K1Awg=LHMLk)tD~qjP}RJe+8se^w`yvC{wXXyxF}%h5!&Qf`lzP1 z6-c-Azz=FIEMm2{6t%ZhwR<(S@j+?}G_^jgW-4lNs@erpt%c|ywHGzDvaEKU+Ou7! z7tSk|Zq(F%1=1~TuBm-bhx#MFRn$IJ)n;gFGlSGZG_{vl?RiD*F;#7Vrq(e?E&F@5 z7HY6sO+~GOs@7OjyL7IorPDRF9pJEZ_rieR(rJ?uA)%Vu;vluYnwp2zURTtHscN|$ z)jI7Lq*hB)YsP9F6t!Ba+I&sT2vW;mt@`ccSz&32qV^MQax8sWQ_BR>BV?JTHiy+# zd>HWCWL2%Trj`_>Hd<5b%xW(xYAsZ?3YywIL2B(ZwQFaDrL`2b-)WO$>46SvE$ji( zEv=xbEn&623j&tTRn??O9drM7&xH-GkIhYHIaZ zZIGf?RaINAsg(>;+qz1vg#&*GOYcyI)f~cS>0Lu%dQ|HaV7_i&JZ13y^N<`IV~Q7P8u3 z?*}ZMuBv5dYGZ@c(lxc-toFI0)=pJ>LsM%Qq&8Jk3uCpX6t%zd6-)bTYDa-|OS@}o z-_fDCAF8N*tg6-5)ZPwKyIoUzfz^JT7x3Gos@m1|YAwVEsU2UT*1}z^Hc3${r>bqy z)Gq#B)Y7jswe8@rw3VXv18s65C39x5KZmzAhoudS`$|L zLQ$)!suOZ7q-3=wJ?j-sw--#s@m>$YMs6k zq&81ebFtdC_X2)yaT`4QzHjylQT8)nox75Msk37Y9#D!98hG5;-AaN zhxXLSJ1jg@5%#FUT{PigQngd(NejZa)cY(|wN%F=x8( z%yD6V?#zJNLE7Zh^wBnI-Q)o2YLzv$1*|ri)NF4~6KeKE)7L`H@#bh!6LXy3y=faA zib}E{b6B@j@utbb(TZ?0RXAA_t|f(^Dn@viDtzWwVgJDyff662O-}u{(1de#e9YQ`JUkYPAAtWnnD(tZiSZF1&n1 zSXy3DJ4u@yOHEDfCm_8-UenaRV6{wY5w_pvsA|O#%T7DyA)bt13K76AqEWor)2zr3!ETMcDtmQa7t< zlVg8t-F_fFEgW5}dUHIh)l}48RMjeIYJCH0cHO+MsYSEeGnCqFqwf}Kwl@zvM0MkM zvplH@Z+3sp_NEe$U4^pk&AkVO(GiO9M%v``1@krGWk4+amp52AL=_&-!mIq)&yJ=S zg|Hpz1B9^C7xX1ztuILbT=ix&tL;{bdACrr?Qg6VvplH@`^Oej%%MWrvHyUueK7xw!V;f=J(ss98`co`6vIJFqzPO9*D7H**k zzo-gV)P(y=;rojb4poKgu<);xYMu743jf?fZ3-b$c<1C`SFHL}@$uGu!WGjL;nlRs zam5@>_!A&@#i(M0hpNKKEF7Z!`wau<&upY1}}vfQvL6rsBLU3I5xgZYPMrn(Lc*L1>~X`BS~2Ue+7-%dw$Zn$Y9383BuFhvQ`@^o7`;?c+en+7 z_TNKOTLxs8&F+wY`&f11YpnL1qBcTRi_+Ad4O06=Q)|U)cPVQ1RJF4Ys=29ZKy4Cg z0yX)9rgnO_uyhw?MB8r%Xp>{7N%Vt*|2tH=<(N!cA4-9-45J6yEL$7M`jKpZ;0ce}Gag33v8I z9H323cvsbgvw^t8l|+d%kCpOlE@5A>wp4ZBVcjXDYx~tBbnWOq&`hnRVWg{dbk{yo zBgka6){0s)Rqb<4tyYlQN=@zZPr~NyirPuq&YG1HgnxZyGRWmiU z$w6xMHMRb%)`#-FUD2I|njJyagqjmUEl5p7(7K7i6@74_5<#U|_!tS>6>@%;V)TKg zYK0sIvW+gsS#hoqbLLG}(xLu{*^1gns@mt8+M5A2J9+id)P}IyAWE6G(T@l<+vrh3 z%`v(?sR^SuP6#$SOf@=^g)1t;*LIT8ws31r_;(-{9#)L-cONR=TuCbah#%4d-uy@i z+uJ+kFnXh+wvjeD86vl_S|Q7T^bE1% z1J#AEvD$pf#ddg)5NdW5&KGKq3!f!5;lk5nZ5Jv-hzUa38UM0yEv1-u3t`)Z1GHk6 zCt)qgw$+OH>vm!EUMi;T!d%+q7~NP?TLYx4U74>MJ(JbGqJF|wo206RYHCA+)K+S0 z9a-&JQnOvyRH)f5%#EfBaax=?jh2@ZJTam#vGYwwTrSQqHvNX0}kX>t>@+bLu9I)I{CfIy$&+uFoT@ z?Yil~!X6T~UD!ql+b;BK#e9H-H5Yy_#GE8siq%3DqtE@Q82zZGb_hsU8>OkOphNu; z`IP1CvMp5A?$y+$2dOpF)CRNK0!6L2s&=8FS|RO%)XvORgXMNs>!YZJscIWFwZFC$ zwe(9(?MHA}8lk9tN1L2rnW3qD9HcfxQya%>>&FHB_JXQ5KvR1(pk@yoYH4bXSZ$P| zc9*KwSW_z(r1r~us^5-n7M3f;)M^H)MQUmVIl|KJirR0q$+7fhO>HNTZfVZDs^30mwJ=h% z6TmE?=8Uq0nv(!hNlhexsv~efk*l8JLfK9L-C1}UyjCs<9C z%{JO4)NF4K5NeJ$A0##5%?ZiDMn5W)ZEu!j;bD|^ZQ-+7WV9`OuO|Ep5DWWKf`!Yg z!k?3hKjIEWc$O-h{{VT@DRHV4ey|wfHM7aHPW`j+rdRC}PVCu(e$3_Lp)=5>Xq^UIzQp?fQ3|6b`co07vd3B>w=SS~Xt0oVK>wLcO zp#H;=Q-!i!H7iKPAF-B-X$R9nRd|smJY5QRC`LF=74FBvcPql3RN*0-aC0gAOCr^| zUg8i{xD*TLj0}|c+y=!J^)=x`Kz6$-M);d|lqg+HD*lLMMR>L+q}6_*u_p^+~rvV-#f9E407A!d9W{ZVVbx zOX#{AhZkmeOJ80e5%MVgOtEh)%Q+Y`BkMQ-;kN{1C0xm{62n;p+e!E?!@oxhC%j4!i|*`mj%B!)VLyUcWog5w z7=F*NEkP`VwPAaP?=$=lL9A7_VI77O8I~c4<>WRj%kWu-dE)@F;@^g+J{C^s$nZyk zc*Mho+Zo=+a0$Uq5-wvH!SF4Doh6*f@a(I?2`L2K5{_iJi{YaL6C`|`;R=Q=33ie2 zVTN-U-c7Kpgi#E~FbpNwO~O(PpJaF(;hWx5!jp@H6WTG%BG^m9%?$5h_&LGe5`M`r zoS~oKBN9$$m_JH5VHm+a5+*U+#;_;BMKG<}SOe}5>P(2e2G1jkCamthlzs|b#h@Oy?;8NNqw zyoB#Fyfj=mVI08;5>8}zkm1t=CrbD%!?g_K2u_l)Bf}3F-b>IU;e8C#7?vZLDq#e} z!3_UEgr=uScy@tsLT84#1SdQ4;R=Qo8NNess)TbG{*@w}Fp8j8!Z8f@ zFnogGYZ5-ma5cj=1bq^=V>pjtErPF0cn`w~3`-OAOBl{@07DDmn?6m#{11c^IxyTq z@C^yKF|5b%D}vJ{T*|Nl!#4@ODd7x;XOe{zk_o;g;RuF18TKLgwuFx{T+Z+zf-@v+ z&2Touy9myduqMON3_}RMBVkE~{Tcp>@J*j3;feXe39$?}5u7by4#V0EKO;Ct!Y>$x zF?^liyAr;^@b@I)grNlAlQ5CtR)#$Y&Xuq?!><`OBREgO77X8JSe@Ye65hdZIKwN5 z(DeBdUVmTM*_YuVf*(kDlwm7|nFJR|xPf5}h9439P{L0bmS8xA;6e#sWB6O5aKiHh zKa%hzhS>}g2riPa8^gs68xj0i!X^x-F}#)FClXd=_zJ@dh|u&;CA>6GIH4EAeFQ&~ z@F2tH41XZ_xrA#O-p+77!Nn4O$ne@L!p=zqzmPDE;Sq)d34STzV20}%ngqX+urtGt z8QxEDiG&RpdKunA@M{SxGJKKYIYemsQVIW>E1b}k;ZFpYNw|k$V}>gUek0*(hE*88 zOYmC>=P@i8CY&&q;BpBkFg(EUDS|5`9KbN0VS9orCG5a(0mC{3S4mipVJgG21izE8 z0>kGRo7{g~6o<#Vjub1%mcZCz; z8Ez)HLBg#J>oWY3;6@3*W>}u#bb^~Ce4F9vmxU9O2xdt*oZ$|Jj}Xk3urI@J8O9LI zk+2oRSq$$axLLv)3}0nfhzL#JB4G)J{TLo2_@jis%@Iy$%WxyXtrBK4{13xV32u{c zF~c$peFV2lIE`W6OTq~+6U>$H6^1`D>`ripguNIpVc3-5P6?Yce2ZZY z%ZSkQpCr6CTiE$1!(RygEa4G`Eg5DI+%4gHhIcbuNN|sYA2SSPIGNyH3B3%DzbKqA zgy232Uu2lY&`of^gk2ea&affD0}?i7=x11o;6VwiFdWA4Z$xPNFA^5a5>DvJa4*3_ z5*}dqAj9to9+ohj;cX1xCwN4{1q`pgAncq-@Ti2T3=cDWmf$f7pJTX=VMl_$O4y0v zB8K-7JT75HpEBzRTA6o$DBdlS4S;iC+{Vc3G; zbqQNCe23v31Pdj+o8c&i*Ab!VxH)6bW`#0*g5gnu^e%3mE7&ajoCgFn&-(*;o zV7P?0F-&H72@#rJR>G@q2|N2RJV>ydgohbE#BeRa@)E9Nco)MD309DB5yKFMX#^uA zoXYUmLBa`x3Em>%3k)|g>`c&*unWV_7&agnDPc6j*BMqMSW&{t42LrO3lW-LNy3Y7 z3McenxQF1a67FZ%jNxj6l_gxmusXwe1gl8+0mCZ;g`E=!R+Z4h@DRfR1gl9nh+!tf z4g{-9=wkR0!+Hd7lkfqCQy5ktc)NrK!{-^EL4>B?A>sMy!U+iscM`l)!k-y7Vz`{( zT@tQhcq_x%1n-vcJ%$&a6;2pUu!e-=817@(pI}W1pJw<2!&rh*62>u{&#*SZS`yyN za1z5Xg8z}Q9K(SOe@BF-*Ou^)H-r;RhFb~VBVjJX`x$;su#SY^FuaA~+XU~G@EwNd z1_&n%Cs;kyiL5WHW)S`5cBEJ5%A2}?74is5ev z-}L$tTGNCR+B3{1*g(Q94C^plOt7JZUokApa2mlz628gs)HA{fuMmuuFqz?YhP?{M9d<@G!&m1e;5^ ziD4AOj|sMr@H2*`7K zRS340usXveh6RYw^oJ$9^186|5rzi{wvq4?+|c42Lj0jR;NeCgHi)gcIBhcM$9@;ZF=3GW?cc z4+&Q?ti*5@!JZPn%kc01!U?Yu>?Pq?hI<+IBlw7fPci(SVOxTaO4y#^`wag>u&;!5 z7*1qZhTvlomSy-X!#sp<`V$hK@(L$(WcVY&eiCkHcpt+h1p7<4j9~=Bw+KEZ;Y@~S z`w1tc5PVv~kqmb+e3alb5F!cq*MWOy9m zn?6XwlT(Eg+A+)`_?(2B8Q#P2bAp2<{E}ffLqEYG5>98B|AcVDFoMrZn8a`!!=40R zknje;`8B{Sux{6;9~PFqhyo33oAU!0;P_ zZ%DX;VMT`T5S%XI9EN{ADx5Hi;F}VTVYr9k69nIq@JWWN8MYz#wuJ2%&SO}M;0y`x zVK{+dX@WB)3}-lip@r~Ge@DW6k8nZrvw;JXrzV7QZEAA;{m_!z_G3?CvmSHji|XEVHu;5-RyG91k?gy8!UmSotU;jaka z^!XB=m?WGK%WxCH4hPVi$1?_fBb;T1$^`X>@zpD66?%kU7vPbECcuoc5hf}csa zfng1X9})aq!cQ2MU^s=~VhLYk_*-w`gy#um65vl%83{8GYh3>PzOMDQyKn=qWl z@K%CLB&^Et6^0iOq3K^scxi%gLNA8<2riZIAj9Sie;~L_!nF)kWHxhox@LDfn z=OlvPN|?s*2*ZH{mrFR9;d+K9!4(pAX819~`w6a;umM9a!&?ZhlCUDf7a5*Igrr-8I~oODPaYM&oMlO2u)un;hAy537r^jC%9h1oeb+U zTt;w%gv%L5GMq_pqlB{ojT*EFCnV%g?`q3^D4( z)wb{C1Du$Y#%b_Dy<$pZLs1Zk+XH6V#M23mIjmT1AM#V6(vr(~BSab$X zI!G;#zj8bk(u_Hu_#YErO4wi8nlYIv{qtzCj<&xy)1)GLbE%ZR3P!t@6~Yorn%;F} zLg4tM3|L0HxV$^arVhSRVI5kQGHBP$v@2EyM^j1ZE7k&wf|7msP>o9J6uFuS55=4_ zCiN&REHn$Z8ELoS!+OV`y-n|Lv3+76iR~TRtEV~fRQ2$X5SRCY>Am7wQ-B@uUmG)R zXL7vhEeB5(7@ozj(CzOOW_tISnP*Cx{wX073dbjSH@h-_FX{3xqi-(n`h=)_m-k{q z)R_cdn}qT$jkL2kE

8n2{0d$+#ZtDfo}^*1GU@6E26QbaKa>ORk&L9_x=|TZ)$O zZ4X2UURPsJs1F}gBE+tr!c1dDsDIc+&-K!Y=RE~AlmGA(+@D<9Q&2ypq*<8h_TLkF zplV3$gdb|tjgXM!7v0{A)@0-dM2_2g&J4{=9BTT_wWjCNT4OTZKy~?Bl`#vqyJ2)k@g`DG$(E#cRe2aL~Os<{;^N?Tko!S z4rPeWNZn}~@tJ(Oq&H2!KldV>@AYTUpRBZO{Gq~`S@Com8xGI1np`ds5^t=Cs~u%} zUqVc;5&L>Kncm-{b7H@v{jH%#;Ck;xxA(f~pGn;Mash2AkOoa@hzc{)GEyGO>yJu^ht;ZZ~Bh80%ncgi{7!+&|nBFYYdm5g`8g`d=-}52Q zhgbzzfn$0$MCLtC``@fQrZ*us-n+r&-D52&Al-s+9#-QF zTo+Lv(AUfH-Xo?jAvbUDRpI}4+5ZRN|EyTg(XjZKeX+*8%=ns@+%bES%Ey%p=aiQC zcYJD&k-8s831KuZm-okb)WU6#qTzT8+}@+6H$GR?$G6xEHDRRELP4sHX1E*1`%sh8~PvfSz9h%lU?Uc3XltYD(@J8%+q6Pk*05Wbx!5w%+RyQ*=A;588bT5T)oiOV72w3uK}gSi^p8wi6aUN4RgouroYr% z_`jW5FVpQqe!FP;E94~jn`XyuYF{^G6`j`QZC^9Nn-uQKY9C2Q#!eVr50(Bz?Qpj@ zu687T?yGiP)7!MRk#-8bLUcxcOVc-|c6I8uL#)W-$U?qWwF4&&80Pkoh7TIC#)|g! zOdo`(Dle5mdho?%S2tq{jMV2!^S8R<+aUW}3-N6ree;aTMn9KIvlK3Wsch4efilI_ zuI}=carwJcpz_r;v(}L*(K)U)^cVlF4fx-kR*+K7^bZR)qjsNl8A~5DQfH#c>Bp+E$Pj0jl%r&1O)KPAwojOGLnEVe@@tw-MYT0?z8ci>%U&0!ONkO5 z@*yK5fBv5LB8rE?Q<8$`^7`Sc`0#@G0Lx4td}@Z9X*tRFley75(cK2@F@259nCnLB z!{~j?!gazSF*{N$()15Q+x4UFLzMl~wzV~8WVzF}Az!wwdAXCnRU|qGv+QBY>2acv z4=0Ob^LJqr3T31vi;5r*hm(h^OAjabmymqkWVlfFU-_dQM|L#R0YXAhTW07c>COWp zW~`-0|D`)CnQ41%Cmv!a&aqv#8eXFR4(EsQmg(*^D`f)w?Jj%WIiHdC9CmT}J0Lvb z5FQkIcJLr>dQs?IPN_=4Vo)1gB4R%IsXSU1;qq5Tkgcoh@+D^@D6a?hN-<1tF7Mhb zZv%FvX91z#$d+#5_GTvd;?A~kA+XbET_5>U9AKo;0$vn2dZ)?lGbE&~%bSr9b;L}w zlI!L-2-H_XXs)a5-m?kD(lSQsbR;3UUkd7ClRIi#%0UXR%+r-8o*)b0EA-9hT{t^> z^s+f-+JyuoE}Il?F;Z#ptwgRo=ePN*UEZEG(flLPv$RmUeAAbFE)pWi4cxvi;Ry)C zd))pGk@3+x#dtEoSKZz6&e}#Q8R9Bj=R$}k#B5GHNsS~tcEZSdXs(;-tYmH=AGn;P z);7PT7SA`dC86v--Ik{*tYm%*_~i%kN7T0DZx!FA90}wp-N3xZ4u^(_>}1!?+2Fzk z&O&u4&y;+3er@F(M(WwiMe7IU_^0|&s$Z|E*Pk^ru(jx-v;=9Wk^p{BP3 z^u=`+tStj8b5e#-H%)EBI}Ap(jm)DlOw&+f1%|?{yT^-*0w4Z}m3Q>K;(%c#kbTC5 zbJx23;J>QaJ`@T5)}gG|gY-;O6eo!cAZJ zgmHCIkCe7iY9nnEk?%x~rLpE}@d=|77e))5E$wK;IK^(`UGB8KE+hVe%ex^VYC}TVpSZoBJnJ@=-ixt2%7OrJMeT8?Wv5^)jaGgr zIlYs=DaQCn_=nD##?s~~2lGzCYHB4)C%*3JX?Gf_rRhr{E=2L2o<#K}SHyU07(A3*5hIR9W>#E9F+j>YfaAp} ze!?MQ3}wc2sA;55AO*#9bZY$fl-(uLXl|9*B776(_IE3E`(GokCZuhSHD;_&NLz<7 zH3riA-2OYmU1k4_Pt8Fl-%sACfotQ5808qaQtejgO51tU15$S5a3hu09_EoBgr$ms zp*u`ZW~3RDog9G)1k4|pSuj91;s2!aMXlE#H2q)KcXI1MU85dEU9StOYtxg(Ed)tD zoO&%>rshrEhsKh2A?03W<9alU-(y8HOKyi|(FfL1v$*;qt_?g{74p-uLk{mSh<50Y z9jrq{{jHbs_Aa#jRocD@+j+c0!;^=%A%&Pm&ZS&5U6>7Rlz@Ps$-ZYr+h3uot1!pqJc@&Z)e{a}bzQ`4yMHZv5-J!&UwcBW)-(TU`E= zJarQ+NaINeRuh8uG{y}DT~R-}e0SCsaw{QMSf%@-h+?KTOz$qt=TOzT@Fa>o3*p_L znvt?KXdWbQ5N;LR^tv;k*gQ{MfSNfsy#Re_yEwP$J>*<5)kVR@Bo7tBdj1Xic2b;ve=+en}2# zqY+zkUqVc7U`8X`p3!)M4)>1D#q~4-h_OJ6hij+YlX-j$uBwW7jca3 z?JzM}fTU3JU$1Czu4a{8b#Yx~W=>0`mA?Y^}fvFn9(SOu0rQsx*qbMrgwSbp>Cc!@XBfJiCH-i0S>qae)fni(Sy!SSyc< z3g&rBo=+@N!HeDz6>J|%6+9Qm+T%r8zsejsYPiyJyMOpfIEp&~F?cVg6L^5@`+w;K z=+?dyL^N9CPT;wJ9YE++)J|X*4zw2G=5tV5#~9%zbGss?i-h#-uOb{$)(65N`-TZ= zR*o7D`*6?X9~06~92gjV!`i%1%J2WGV50Zha!eHL;5wyX#m}~f%2GLfO&d`%G5_w} z&wb4trz~_QA#Ve|{nvromL!TM$lC2tsd|E}j{PV>mK7Fg=}4XZzWla!B*p5X|0Qo1 z6itwC#)>weB*>pd%FePz92M<{=kbeeKLe>yGPzQj=HS?WZa+Jha)uo01UJnJ$@DNe z>|Y0XF&XkFNEKEYI`;-69Xm%p`H`KNsFNywr1LtKa3K09FPdI)V+Z$lD3Ra^%pAm?@Tr>;1Arzb?Cm_B9{q(vic471^d5HrMS@MDZB}>xn8<8ddwzK5o zHln8D=%xyHgVfxRB{71D?Si4s=Hto^G)4U_xK-*makt@>oBG1)bXd6H@wJ)@7O@LX z78$CH-6(Q_)f@6I@2S)b6beN{C>d$3aNhiq*lJxoB;t=GFk}z`S|oq}hTati*;Y~f zUB7Ys)#V<#$CCd~=I@pm^jg1RsT1-ySt2ib(EIy2LcM9L$W>Y57M&fa8FrxB1Imwn z5w)~@O`w)C5U6xqaG>tN)4_p2y)8}D*^LL3#pZ9Wynig1$lv9;V0WqoL;e;9>BHPu zSt{gj;@0?7QBEFo7Rlc+NGJb${&vwI8|A|gUW{)CwxTn^RoJi}x9zgUfU+tzHcUTt zMlqt*{3H=APg_m+uGf*~^ z5al$|M&s;x^rYT@-F;2Rk>dKw$sj{oinitsWRRDz3ullronZRZBgzhBdIFig4qM4| zTwVSP(@U}GRlZkDcl#G{d=||j%`-(rS_Zu9WDyikWRV>hsOPsKe^_7d7iok;Da-Vw z6z8I)FwMtnePFy0KvQo4|i_1U*aIEM7MP8+2`{3B=#mz6+`Df?ncK$)B z|Nk++Py>^}g;mbY5WQ~E+$850^5!b7)b4flo%70IY3WUyhZu~CoUv!GXeZVxC0L4Y zClRkMQ8fD-{pkusg_J<2aG# z7s`#NZ~u4a7mB9e6A#ikordb9-^P@w{H>EQ?QfOBv;T4r%0X2q2R)3f|33Xr*e#s$ z<_g6r#fR03AE+uh{l12C1f}0u$OZpf`uze&YU%g)W~6^uNxxo^q-X#)Dh{TX#gx3< zflMC)ZnekOf1iHSeio*`vs^L#hUs_J_aXwU={QBv^!o=^f7t0aT4;)%nkIgN({D{N z0(NSZQs`4Sng)OuaEHcjus0Y09>*XS zAbX8T(?r+Q-kzeN^<}2NX$>r@GrgBhtbQ~7lX#}qp2ZbwuW+Z?iP%dmc8-ln*kyWKJCXnk2D zvAhYBfo)T9FS9HTLXj|kYqe{_(sYCEJO)NQKsbb33D$F%TN0KVX*5M+eS+^;%Jjlb zt+oExDNMb-Ofz*6&q5U)7SzOK3^J2d0C_tuFB)lsa7MnY_&|uww5NsCPTg5)HjM|A zBAy!HxPOkP(1ri6#M2yq@$vK~7V`X4JZ0hmlAC&%;%Vv*;p90>H7DO-s_*-iT+L#} z+qyQAzx`i`r}K?iT92n`Z4gh@cH5TQ@ze+3|6M%I%N3@6^|fZ|4dN+x1)b)k^(o|w zi>Gcv?4RQ4;Yn-*<)=VAbwlRf^f29%MeoWw9b1iA_OzlW2Pbj}5 zc@Q?B9INn0dHu_ot|e%VK;RZ3xA*md4Wd6O`aL>hJ#K~~Rp37w@0-5TDd)I z(!r+TrdVlwY4~k<_uxnqYl$=SDqtzx#lr9qV^T%hCeBMbIAv1xylYf2+}_NzDwwS= z&~B6I2E7@2-JE!xEnLE7Up`N@a0$L)tp?WQlZEFDkC*qFBK9h3;km@pbklY)th@fG zv~D5}A?q4z)}2l2M=Skv(t7ye}t9m9uldc3l@o3pLH$~k`*6p_qD*E5 z))$zoX6Eg9{OwOZ+C*ztOk+tl2VX-odNaP|n%|}0p88eX--lDp=p6$4`qUHvlQo&A zvDU278Hd-~XIGrsLeh+ZfD(9<9mHs*?5#cJh-anYGEU8|>*H@#&{ zU&orJx5Rogs|@*_9zrQWDaEdT69cNOER3uQ^ZIqape&}g%ZvOoJ+CJY%-e=Wmgho( z$*Wx&{}e(lZ*^Jxv#}ih$)ME`TPolm{C+@4-Z}cG!Y%lx8vRqtz&{bFgS-O#qvkW` z{+ILo2rfsgXR!#u^zK7DXqYmZZr5j?u8GB7XT?I@=Uv`IF09Cu8`{QVaVGTJO=uMz zlHA#Dq*L3Z_gDuxOpYgtRNYjjRp29}#{#X|;1JO!a6DyD?Fz00XY ze4_k2@XQCU%+~D1CNWz`PkVSXtyCOr`j^vYm`snFg;>)^Tqx8`U$2ihRsSEqPR{sW z{r|BzTKNBaREzEZwgZawzZZ*h$p4{Y&;Q#0uVKQE{XYSpZ2za=qx66EtbqTY;Ju6b z|8FeBWB-@@#PNSLcKx6IUkV2o^?&5>fA9Yp$g1|!7dMH&*UlfPJXj8!2xCY1$L zJidv2q-VF)xD$a3UaJ-QbXxKica{EfeBuV5o*()b%@0l0MxEToDkF{-@p(rC35oo0 zq#woSUS8GKA8Q@5td}Yf)nhUf{Y{N#Vtm&Rf6}RIr#&tdl`O;pi;RaF3q-7=X5s72%N~S2v zAI4YasAp}d293?E^XtXRIi#SFk3>yBRm*As5v8X0$`rJQ&cVeHDQE*y5MLzY+T2b- zp*R?mD!dsBcMe%+#)<}@o?97v$o`1x8w--(w5z%=ZY%unRegszT2yr-^iOtG|NVGS zRZl8MG`OmpHW5{wh(GBM$f~X#M*}F1&l}e7_IaXyAGY4PMAv0Bs%w}sfYP+uoApS* zouAAzf!?fc?8K9HZx$1h+@$zAqXj+`p0exAY``TU_E4>_{Wgp{>xc!O}Ed| z@DL(03|w->s#!pPMUF7i{tz3rJYl3_;sypBR=sbeevFN34H&6QvBlbn1*32{#qr5- zI&4D%p4#Y*+OhhGX~ZlHPLr!7#GFVl+F=bC`dv(-AG6-Yds3{KfrCHC!FCije4=DX zeiYTOvbwe$#K19KWEtS`(ew?O@0lwULj}sNB13HnBRPa^p#F`tt{BT9OO0wILU$$p zD8FDcBvvf0O@&cB{+IEqu0NvNDOib9Xl=%jAMwN^i5sm@uu8#e+zVe`MDawe-a3Pi zc0A=;Z><&aL^{@P0Cf~Z*#x7Yq1Xj}MG6`_U&PbkTGnFhs-&P?nSvIP5}!z_qfVmKIDOw+pYeD=Syf1$J= zpB($~F<}21#eUv9$bRf%+dog*k6r(F`*Cn__K&%MNn@;R6>Yl7Ia&oyE4{VuNxQ%L zU&q7g4;_CT$0yq#`|wfvW6Tc$e`N69Mg7qiyRbi=o9p;vCU*Uw{V^B^YyPl?k1nQT zmi;m12RzM!jJoZ6DlH9`(8NS0>X-K_+!&ZcB7gP7u4u#EM?{3Iu8T$$eW5TC))dDS^t=SZk~F)7%Fq>8IMnP>Pf~&nR=>;V)LNsao$@x*-kxwt#(pRiT9k;(+ImN zPX6ywPe~jclzQGTHuVI&cf;#3c!By{jNnBcF6J`S^MT`qQTSwE2E2@qwik|A6=5O- zNXP2UdrL3am!YS>BQMZp=+!yG3%Cru54$Q}I3g49zqt&(h7oSyGRW!@G}>3&mva4i zb9>*0GS|8npKN=_;iI%S3dT704&=Ry+IxMKV{Zj%??c%2f3`OQ2P^h&3%cSXd-E=0 zqF?E6lrgZ#zcildDb@mA`8srR7$(FY>Ew(16H^}BW1W=p)@WL0 zO%J?;nf{KrwU(9A1h3Sf;iGx+uo;E9fo7es`T^tVrFdykCogn1mBc(4ramx!IBa!Z z6dIEM0R{`VeiasC)o+Et%HS3>woMJ8|ERp8JUp}5Fy#rJoy25J+;%Eaa%UPRh{+gx zL-oMLR-=&Q2gIrJNDXO0tl-~fRi*I>jd8B4`=fSzx?~ z97Qvw4O7OMxL2ErN6LM1hlM>aVQ`MIxc#jSPb^Jn1yg#;tu^GQCyW)98?B@N5Mr59I`Ad zEx<*CcBbTaCR~mjQ5vVoui@`>HZ!lpDtc_k+;s$lL0o5)@Ej|N`Nth*C|(Sc%cXLz zSGYbsr`p1Fl+Wmsffv5iHY&!|j--ET(yVD+`qU^rq!dQJ)nT1AfKr#gwOiPP)fm^U z1>-LiT658J$aN4_f2w7F>4qtM@20dB@hvvs$=14fu&;I_>tzHRx{bDad3u_jQ|KW6 zv>HB*b6~DG+@zUdiq3h$u^S?(@0b8_ejY*$_{Ct=a|(|Q+9OrdHy+QCk7!|qqtGs2 zbMf%&gK&z=hsRbivzy@SSUmyrs0seckqM!jaaNqD_1*A$bVg6S!lsAS1Qp)QlRWXG3*mejFwIy0(bS-T0&YBxk*5MXn!2b>NA|}&u z_hbrsLYm)?N~#)?;A>hNmrW@Zto2yx4Uurxam)>L+ zX1gvPaz&vtYWCHVFgW@ma@ZdW=qN1iXkz;CD1GJ;teL3X76E8A!FxdQCKJ<_6mEqr zq_JE}H(s4_CEfbm3DZl*r~t zD4mY9#2MfS7CO_dAx~) z0x_KK-9(}#g_x@rf6o7z7oTe+-a=)S!sEF~T}*#09?V9w@t1OmdMVkluIW9ox;h<& zd5X93KnX`!|Ml=j2pO>%<&W@w%r41>OQ^aKgZJR%^$(-y+@zM(<}_MK%=sJ}`P|D>CPF6E6e9 zvyU!%Mb?fyH;n1x>y;JWrDd<};lp?0^LE^R>Q%d-9p00*UA*Fpcw`qZ0By@^hg`bd zjYswix_I4Lk>WL4v@J`#C+vg#X}Z7RuHmAg;JqIO&RfH9Un2_%v1=p=;`L$pUK`J7 zIdY_ihVRXVeJEjXQ8E4sJzOzo6Kl{0cp`+pG&5szQ@ZBSB(T$;qvP5h-ql~BZKsy_ zFapcp@eEyta!}G1nBTUG&rQ2kZri1$dym*H1G_;k*%S>9D)2)b71?$Jp4Z<)o3>M- z_mC5uQtx3WVACE-U3mN2qz;sB=v`v;jFvL|;dpI3we^}8A_DifC$#<&Uqg(UxDO@9 zi!%Rr!<)qnV@2s{;Hk*d%V25S3t3@C+N~u~pU!P;dbS4LQto)V$s3;FkEPq#oAC`d zdFhTb-^LcxM*h+tioIY;F5h?M+t`=w+t`yK<@Q&p(voiUzDl>TpP)>ECS~IGT}ju( zOumhc+v1G?pq_ZEcoQ4m1vW8*wF-u}w{Ku}*6qpmQ@J;P>w)e<5`=&O%r>69Nd=odd50Sn53=igY$ScdlUPW(e z@1vXAdxwv}P3?LQ$(!0A;JkEGJ4U;yz1Q$0QyF6p(T#2VVmsb~HgOZ*wm&qysjzh) zZreXYJBj(Yz-{|3v`sM%tK=|jL%Hf#8balbr(3>8>Nv66nUZe*O1|%%k5jA{?(`l^ zsP|VYp4Oc!?1^aSuNvZR`SeI*l26oC{m)*cerGHSUYJseX0%M)I7XL&e#GUC$Et>o z=zX$`G-UUXF8&AFxF&8Cb$Ib`Lew=^)Zv7fYe}8)E+Kcl^T}`%-gZ&gJH%b@N^*IK z@EW|{cr^=N07ti}qj!qg6}?XL?m@3%tT>OO^UIP^LI$&g`fi0s^wkPe=#ecNDcmjk z;rH<;y$+1xUTZ;p8Y}FD_ng%YQ#SJcQM`XT?Jq9C#n|{2+TY*06vKN6-Xq0&F+6#f zI1`;P{ay*1Gu+H@4#9d7-p=r+1?VA9H$)Fv?|~xYgPv%ir=H^$ie*A}3;l{B*J+`4 z#5Nd15gVD{??e$>SA0Vox|CFw-tyx_Y>3!i-7RdF3r((2#1>G*-Zi2*MeJy5o%iD` z3CI$NSiD^j?{pB0OfDOqLKK8nr`*an-l^qs>%26)sjDyp=R?H)K|6Wr5%>zOi3PmS zWFNMv5nEtP+C-ahk_XhK8UE5|AH;gSk-bCc!Txp_UR^Gm)HHhMr{PBG5_s?N^=@nx z4XH3A&YR&mQZha|$5@er9d9!{m`|luJhzZEvL>w##oK>YVW}3_a**&~ez1`k( zQ;o;hyF5p((%XtA03bK^pmj5`-YxM)yM3nru}J8~8y)t=O|1cOY}|oD;FVB+V&e|) zmRQ=$v#utJ6f5@X6Kd}U720L$lOW z0&C>5MsA0xl?@l(2Nsi^ayTy)heqd6!HYDuhq&<^zg;we=sOVQSYm27wx;)q#*@X+ z!k_fU5>^9LuTP43-$N|Djt@@~Uvc}JKJ50_uP_)dne>cBua-I;Iuz~G>AcNm;Jopv zg}CW|7LBzRzKN%7@TC6{Tq%5s*XqXd!kaOVW0FM72Ho(vLF?{Msnih-r;5oO@j^m8 zF8C$Sho33(tX%hLs6Ou*D`yF=H`0z9sol|bTobQ`;;P5+JdH20qRSbHPZ!pQ@k?C1 zduxZ`B|E4Jy#6shQ+7c=3!@_Xjie+VWBNxRfFk;cZxzu|P#3h{@K8IT@?pE%7m7D} z;mQ?>-EN6{sn6YKOs3UWZhz?oO{i6mq*gsuG`Pa#W_E+4R&B-{#we8gAX=8A_CcNK z)on5R(V|6vgGZ_|e@7p5nOpQjqD6}nv(UaIXN?)%JfhBu7mtZGW}*WtId!7whdf)t z%)<5Vm_H2-;Y#u2eoy{x}JT!`Z`8p%?0?}-Q9zK0V0PZqj;Rb4R$l1jT`_9tb#efK7K zkJ>{JPGkoYf%XmmQur+8QFMRF58+N1GF=vD!NZ1UG+H)9600TPDmoL(mhDb8=72Hz z6=KLa@LO2^Z7AyS%GwYILx?USF|=;HSPa9v;*YY%Ec9LkpR=Ms-e*BjPpT$b*oVJj z_s%ekyR)5jL<<|pa5~?i>1?)172QfE#)2Jc!yN%ke(oqo&iYL&$H%Co4hd!p^wOG(C6ZgOKgzBpX2 zCw05Ql0{zBcL|I7TI-{_#QItnl6be;b9f8%)HLE)H+XI9XTr(9{#Rd*+L|suUWE)I9BBRi}j~Pm{^qv7#LwuM?EtyyuC+Q96ie*Imk!;$2flD?_ zL7=C-U^SseLh})H1GEl(p%+u~E5Bm0lAkv`SaF0g4(5+iGse|5R=8_NrRF4;H&*Ou zfmiNk818jbaUp|a%tG97agId^>OC0|;;L65em>CcT~`=MA{8NW%R{*8#5EzkR%}xU z-6X9`*M_E%?#7}(BONrZMP^bTY`|-8vB6!tVqA;tl>Rt&XIzVn@mo`K#znTsHVt?7 zRKq!ZQ&>RBU;0925sR5sDbHTQg{t`Jc`LrQ2*$lk2ZN>$gLzhc-k!nRhtc*#;ZUsK z%eD;AKvyL1pA=neY9@(jvzODh!?)rVo8B(=DmpG#7Ms4=K#t2PLl(E#bRaswe_m|b zqsU^@c4}OnO>Dx`q?lz9&uN%mqwRzfVQr_52sc)UR{~A#SQf#mE;`*x!CDiO5=ecm z@ka^PGkBX)G5*2y3Fap_UgwcF{iT=JcjEPR;od;J?s`g%*L$ld@j4x^&zJG)5xuz` zufyq!7O!oSQmEZOAwrK{cxT65Bx2`I3f_tc-dhp8#)`9u->&CH6tfP* zqeLuLY>}Db#__ulo^GRSW*j2lISehXk_fpj6hjC2x~L&sKF!R;o10^@jCmO~v(Xfl3vRyOfb}*aSDNG}OnW-CsJEb?JGZ(lnJsx_5~^^o#I>n00sw7RkkA7*lHF16>qMK0t-`cMPL>Z#*Z3 z&YI3+Ov3ykh2VjqWW((V{+>8jm7m48a;})obV-q8c#?RpFR|V9-HxG_7->6;&bQDA zWV10jLF{!`jr$Rm;<5tEHPPVk0%a`h!CMkV$H|@Q7Q;hhcASAaReq^C%V870mj^>p zI=6Uvc-}ZD;Uas(eX=ok6WX}woq!M8g*GmMaBm!by_{GrXnnjfc_u|Uy^Z^lF{M2A z%fsq^Xjd65v@uyhm#Zz5r7H&lKG!u4N~N*dmbD+r^-qqI{IBezl^ z=yHrNCMiB9;XyFbmN9ZO(#6OP6GCOZmp#YAVm6O`&PDgL=so+t1HVP#iHpTByv#dh z$JkDka78WG%NQPImKMW4+&`zu38bY>*6jmnwgQj(9mX8+ozaE)P1N~)>P#__minhC z0X^yvX!ps-yqD-CnPc`*O7PGd{LpwncF5cn(Y51e0>$Z0xBWaIWB(7Au z2ZSTNwmbhr9=Hc4b>5)|W#yy}HCIn}?3g!>wrkI0OgVZ5+xw#wJob_^8Bw%<7uw%n zx<`aan1c+NFqgwxYXL$KT}@M_kAW(`_?`;r-0v!y4^cDhm$7*0sUv2s#brmJ;=(*f z!eX+=mNHg`tru$(ME`^d*((AD%zyt}zk|HZ zxqNiLo$ip}wLMhH)@;3!_u`$4fl5A7q>^LBO$F=M?xLLZJ~Y0EfkzAI1cAZ^#)F~> zDD70n<3HE;4T>9M7uTuudPR$?Rk~f=ro|K&`eHnA<9H;0{zH8iEg;_qv}VuJD}5?f zplJToD%~#N+uejeF{2vrr+EW^`b($%hsKMKgd~@z3#m=wCq=$+)*B&(40JfUcutZ$ zd~JOV@s?b+^%oS62rU}B_Af7Zpt3=ex1}1wkCGxto27>o2{q7q3O2tJ`17 zDpw1&uy96XnnU907^-L_=)CffQ|ePZ3uh0H>8jWJGc9+a#l3&h8xx~5+NS=onu=h= z<=bp?m?1Nf&52R8%^AR1yH_S)ux9`b_s~vyoyT$evcC7NF zl$hV*dop;8z4gqRi1+a{6(;66FeUMzHYIV$@ObEiG5dor|MuI@8t%ii#4!DSOyX04 zZX36M61&IZY7eVpN*XIXG%$g&$q~3hs+jbdf%>~6T&cfj<~sF*I)VtoR{WBN+jNnGOq}u zGhfFY8!Y2@dH14Yuk~JNNJ7l@q+vIohMn~mjZ`8&P5d|0u$xCx4~X%Qc#o)eUxL>{ zVL!S%BE%|eiM!W^JLcCBJ}fgIG1(n+C2^wtnrktrKI*QApM}XZri{T?SIi+Jm2PUq zUf6&;g%iad1+n7x=yv89n7E8~*WE@3MDt0!W8$F8bG*RqA06hxS6WG3@A~jk(L3|2 zyF8n)?LM;T|c5&O6-Roe7v$!rQ9x<3G_E33#9P(pl8t>FtGd zr#0rhG5JjqH8*)D9bRuNmWcgrMZO`LVbst-Gt6*%$7bXC8@GS?D)H>V|3loHz(-YN z?Ze%WhJZi^B@mTp(5T=_)F2TW69{k{Iub<`#Dx(>+%S@E7Ex%(0&UyMjLOWo;x;a$ zh>D0TF(H@^s1QUE0U?UOZ6X>(!=~i_JXLjX-_8Pz^S$5X2Ysu~sr{Tfb*k!A6%;_) zHk(go_4Tng!f1&v6692hi-=G@6ycC3IIs#;(x+a@AQHH{<`Q>Copbg$&Z{yGJ7?Vt zhdbkdbM|!t@-Qyi9>Up923)fL;Csb&~vX?t*H}0nw{_VEGl2 z3??Ks<3z7lUEAFQP}!?JfpYzC+fcZ`CXqY0-x=S7i77@so^0t+A(GJVK`=6*FDEh* zq3~=H1qs4pNf*;sDI^9VP!3w5_%l?MV#JydX1O%&I!h(wETpB8Id1-p7~q&rw^-#z z2jR1fo2zB0T{kmSto-1(iB+6U&f-@@AlIl2p+18nsxk<9M)RWK;JKb%z$g%4-l5d?un@w2EDl>{Y;ewg z1GTAJ*&2#hKv)W?<<`K)0;o*L1O?B4c_aGJMvpV+a1jcTU0>57trS`&Y_El`f!=z^ z?HsTU6~JdZtliMH&=)3=|6pg+N`_^n14rc{?$HwE+bIX(v@b-ENH)PC*LlASI=@m6 zCKwHYfDWur#abXx?F7p4EK#&sg5?(t3j*KhBN4!upD2A-SRP{$s#fc9aN^{^SGZI> zYvP4kC_e=c+x>y^WCsrGRTOEkN%y!z)2ksm2wSdTz44r0#V&U7IPv`0! zA=B^_6JCcb3sjD>OxO(jb)3D$+|F@xVw9vX8~#Ant9qA zw71`tJfOYJ?(K?!w8GJmZbWO3uYO?y?RkA?j-<8mNSV+FOlY!5h%17T)@VSHQE!P~ zNc>cp(PuzL#gSa!^1BxFZ;xe)lY*`{;E4RgSyvBcb{&$P<26QyC5hTceZ4Id^o1s2*bTp6Q=5)aE@EpotyX z)$?q=_DDayeM?)U3fr?JOJyr~%HdJ-&0Lf^ZU%B#Hv}gd_FzUmGO`Fc8s*FV7$c@l z{|=ezZ!t(%1oi z!7$8?N2qWL3J(sN&t+xSTtfBUe9I55f%mX5pRdU2wlSy8Ht2#F0`~I-sPqBI%{u@( ziq`E@J~D|}0bf}3mU!&to;Ew!ddX)Z44$9E84@_eLZ2a?r73UZmORu7#~o5);bg)Q zhaiDUTESlOPzy0WZ|et(ppV&K<^4-IY>Hzs(8RL>pBbx8dd{{M6rj#b=i_1Y#7rS*{Pytl(s(;OMoJXJA$1y%#t{ zJMMW4^Te^87UIBBzxwa}R}nS>c_8aD)VF=>`K@gddX)v5g;Gjr4-51nw2g$GVu7|d zp?{2zru)m|M%dj3w4wa8+-Jp+g;xY{LPMpF=Zu!(;s=}l^5rBIc3o*9296K|#<;m2 zn!Hf?5`m^85D%zxFfoC53E(HO!0QAsjF~Gf>CgeN<+|5dh-(1kP~^WV#aXn2K4}dT zUxHbrO@Ho6b^{NFDrkS02praMP6@B#K=1uT>+w17!sPpWvNW}qslYWIO#894QcvIy zPvG`caL&CPjA1IH!G#2Ho=aQu`DgM^J1`c9KX5_y&;)EgihcJhHF1Ok$7(`-16tYc zmRid`;{2`{i}f$knHwu^hr*Aqn+E(_p@Y<%<-1zQj&=IYlgzUkC%=NTEJ(iQb?8Se zcV-wwB@HBz^%L*XH(T?{3m*b&@o-=>c#kCz#shgm; zfr3(jZeZ8n!9XHNnVG~pHVVSHgiO6%n-h8~mGU7f9;32Xi4jO}&>!-*vlN)>z0*la zQuyvPgzqJW@WpetlahQp(1-N&d%-AD8X=izCXm62nsaHj3#*D0>J@x%6_FOW@s^$; zf0etY0Ak{#nPM~I11MCwZ5{`TMXB?#WDoHU9t~{Pr=j7@(>XNOTB^knU8i>g3kKUi z1M7W0ka#H)dz@}6R!iq13EhSOlph`R3U-H?tJs#YB-;0@pu+y&Kn2d0slW7qKsWg< zMqUMu1U`&I?po+$p22e_v~VU2!FiBtQ=ADm_H=eE5YUdnBqBRL(OrC=>5Y#klpj|y zAkG%XN)bx-uQOXfYI!@YV6Vf8*K?77mcO6PcYV!x|1w6fc{BXWGKFJ?C%B9$;)q#E zU!IJOOJ(o5(VY>_A8Vwr9~BWPbgDVmfIVF!VP43~^u3egZA*FFkpt)A42*HggMP06 z3x4|rrWDj$jinsG$+e8|#OJhN0khZo6r|we>$IY;EOgMw^2M6>gTcPQ;brEyf>;c_%2y-h75Nf!WEV}izY*;)&y2`lF&O9^e=!$^6<0bREfA*Av7Xxz)w`%DSgJ$ zKVVknrfogPLCfRU(Pws#@eDSHR`l}}{|vj$+g^X^Tb`|U7ET3;^xyhG<#zS!jUgZN z6zErQ>9qjreI7wmp!uO}_tuZT1Z}BDAs{@nmzji7nWhr_%dF{1{feWiIUdWmbuk{7 z=5*6@+EmK%cqPZs!sv)9t9Y%wzvWYqOby@eN5nY_f+_#4xPy z9FJ4YZ4lpC^cR#DW6{{wR0oIIybgT|bZsbHr;dgRw!ehdI)wghGgitArsuZsIrQss zXA94~C9$O9d~7yEGKT^*CVJwa<&fS4&EJS^dEChWHCw2u3B@ROvq0e0n zhh(H@$C-@OjY2Z$*o>oJU~ml&uBUi~MQeP0m46!g$XVc~cH|~!pVI&lGgQoSgzSWO#O?0Nq)O_tf z=uekN8{@eB=_wc?MZ}xwJmY&CDOwOt)u$6IR<_}b6k{n36->Mw6U=fhVuV~ZIGKqd zW3eCA>3GoIaK3~KMGr#6%hjf6Z_o!-QwMOo)3QBeW@a8WUj6$S3@F4%PT+Spv{G|0 zcZc4N?Ie6YSNv@^X->u(qJ9`Fb#6P?& zYa}1jIbufkwH(zB}c&ZrOH$fZK&&KJCKw)YpjwFyE zouI*V5(7JP#Q3!3r`B>v(ocotD1hzr`JTX{RE|85TJbh7?B1SCiOKns5ex4|DBpp&5YEWvKB-V&w(;Ez;6z=u*(!5^vQj}*lp zHE3p`vgn6;3jRoG>j^ARrHEgN zLH{zf$_>9lM#}wvi~ch6$4!DC>bS6Cj+XklTLl+9Uf<4;53Ti;(1ibI@?qeZKSlrJ z$cGL-N&g2)f9O>pT{}ULhf>>t{_RMAF5RNN)8o*XivAZ1`p0*td`J-CmkT)|R&BWO zyjuTcfgm-un5g9nQs=@g=fjzB={wFNsc*&^1BwQc`Wm`HYDSWz{up6M>Q;KuZ-Ue$ zRxGI(>VnkoMJ%M&e<7(0S#Yub7ej9yNnp|%mql9)?8Z`WSSEt9`(LzK5PsetCgEG^ ztD(+`NjYbEJKfgquZ8}7Lft>ALUVlR64U>^sY%{x93Xx$CVZGEOYI2~9#|i2LVnf< z+;RdO&{@v?&ZO?qMvM@Q|B_p%l46XAOvBJ%_#+eKIMFI!@WH|<;DaNW(;jP_aG<3n zAMCqOjuS!-aGb~nKX8CRZgHk4ks?B}Mi8qZV2;<{63j6YbjCly9An^+Ge=TiuQ-Ry zk$GX1IWDIg%)v;KIbK2-GDi!2{C>e4q--p6Jh4kK$5Xp4%<(DA)1%~Qu)Yd?p-Fkr zd6Qs^8AnXEXsy4875D#{JV?Lk1i0Zp))$WE2|jq8H%jg=I<`FMghrKo5IJAU1Moq! z^5BCvO?iNo0YUNx@?gW+BzX>w5*YFzi|!bC@D9RAdEndEj69hCgCO}!J1r#N1apRF zd;I$CCej(4tEIcRxP8KY87x zH|;w))Hk5_4or6-|GP)&eGT0)^!^xOl>Gm>8G0}LUdn%-^)wcc^dFBw?@BQr*r;KL zF@ctN(Lq1$OJiN{>-=L#{O3+Y;+uC&b3QBOy)hp+L3uwM)-K1@`2M84?|h%2dnxu; z^pmhH2fBBK+-6gE#kk*<pSEi376$7qasL6Yd_l=FuEXX<^__b?&ojStlZ zQaw|oi#ji541MpJr23ubMyWoUZcv?(q+nl-Ff2+3{qenm>LgjLU|(7-sJ{F=3)O$w z1Hs-{o;OeLtS=0D?|$HaPw%nU|KHL3+`fBW6Vg7b-0_Zwmx}a;b^ZQk3J4x3JjG~<1i+)VKO$$6L z^fq)|PUp~opvQ7Cdy_gD1L>D`B`M!JD@w}wbc2+PB)e`0gps8DG9pMxYQ%Qk`mKVL zc2Lw5*jMbPzy@PBp|3Yd&*HTPJuk$T{(mzn|4Dj&aP9vEJ*VF(=-K@~&@=y`W7E@t z29)%?3!~(*=n1vBDSF;^8tJ(;B}&gKx?||s4`C!d&YAas&cO$dEsw86!%8~O#JG6E^0=KMdV}%z zz9bTTH;nxaEqe>yG4j}rFp}s_*hFH1rSbTCP%90O^%W>f$o_8 zI~`#pDYN<3+{{&tH`mxBHMHdn`s`4WAB*^0~xgUp-|hhg$vhPNe)=&|B{8VgIE0U6bS5LmatPkoeU*K;l}jAaS!xq6g7(lEk}C6(o*tOI3pc@2aBuT(>gdqW2>49oNKsJ0V0T*o$1YG>3 zg@8YPYb9V4^Pwj7sa|-6N$SU2Z~vdj<2&4cs=pp*ef#2D1Ti;_1u@UYoF2WaS^c;l zdV?h9sTlu`C694ulpw0;!ou1`=*K7Hg05iuM`6=%5Y09z0mkhP{~BeStlen@12Z<&NFcxEAj(VP|XEF3XzMPq0unJ1mUV z|KmN+xsCN_*e^A|-zn{vcI&>ue~R9Sj{PiQ$)xr>h1=NA>UWc%xBeH<`!dYwLGKIE zp(t8mv|T7>G+eYWL9^9eh$QWB{E4-0r7< zLr;GlYnj-WtbPE7jiB>FcuUZKKo4vze1n-;3AXLni7!Owx{#|X-GP;CMhmKU5(TGq zZwqn3$Q>1DEfMK@Q@byn1DC#}13Bx`#3*N-OSj5Vii;-^Mv99Yw+hZ8U&M-wqIH6^ zW>;A_YsEKKanY2#=c>A5C>Zn|wXB!f%LGH+{ey*}o*To^FkozIujB+)&cIK9a=q;A zfhWLGe^OuHHA?W++*`p{TQK1~mK=#g|CMrN{VAp#k^5uDNFX*tK!0%3b5BS^AHkkn zAq6LJi{oU)2@Uo|7Qp-?*uMKIQBLSeH#i}>FY*Y&NKVMzEI6U@zR0xC1t&bb*1`$z ze@z+F#C{ouov3Kxwt12`!~BP``{J(IffB(9W4<>z!KpuS3;Kps|Fl32t`ClGn&*T{ zj=zSg)&o2+jply2r%j!*H)?*r9A-FjzkIu%IN$`hp@IGHYwi^T= z%()qSumN*aL%uZX;aE3KKyOp}9|i`DC*9kc`W{CPPv9*fhq!qzM3C5{LyFYl7&3(t zD;FNJ1U{!2EI~Ymo$gDSjQ&hpvP2>dBN)R@8@kC7Kuh5;8DYp09dy?w$r6opiSeHb zmbm*f3ro!Z%HEhC4hnwY1$h{6g#9n1D6VjK2Y%B6f4E_NFa8qr@0Sav7+P&IMQeTf zO=OC4iU&TSSWsbQir0?M6ttJER{UU`SIBR6ya7S;g}v+n-I4XD_yN(u4+AXxAlwE& ztQ{fvVajOmL;2mu=7)>X=OjOTU~Fp^}JAqXSoN5V$IETnksNYZDu zU>4UJ3$x^JXj*>sMg^gsbi#Q=W6LGF-CnX(@W^@FOdfISH{N)RA>;(N+oK!2e|o=t zL%$Q?m_Iq5%o{HFCUX?{CWvV=I(oDFFKOtQl5b|V7krb{HVgOozMkTv2DRL4-Pyz}z zUphO%`3juiuh;RB=c$&bE`*!>m9%s&TzUtbHwm_%(=N(i577<&VkF65dmM%^TDU>* z7da%BzqV8e{`xj-;jdHHH^pD#eHIU`j)Vw;+I7S-F5S9Buvg_4lf7E&M{p9LnPrKb z(7#SV1U0mWHRO>PpJ1`k{P-l0(w@uL_XN1B!T2PjAIqMr-!+1-bZjNTo@V_gXhm4# z;Qbc>cs*~5I{LBNi#rfqJ1YgA>TapN2tjJj12mm|Tf};iAebAwbZfvM6A!`~S+`%` zB5Dhm{Sehs`u6^6KP!tX5HNF*;d$fGVDbUfQ2 z)T1JlU|)tBB127Y5Nd)5^@x#Hsth%zL8x32>UJa4Q88n1^luRAQW2`35o(hRmD(Uw zClM;i2=$%})v7_LIw$M+3oXxC`bT9b9Z+jaY!ab9GeV7%q1H4AwN!-qml2A_S!l1f z8iaaQgz_7qPD7}HIA71R%CMt4><)aE6ZjnQ9#Zkn=0TyaX<46m7eG0I2(Bi<(J!2K z7#P^(EbN7pJh+Au(m;myK&TBO+`HdV^bsQ-(=Lzjia_~Dr%`E>J2jL4lx*( z`YZ*m0;o}ei!4!vunsyFHjesSQ&Gij8>+6~u?2&UhZ{$|yQ!#7ORj=MLC28BQLkt! z>X+yxMl;4rs4EWIGV0LAQF}KP^=(VkY#B94MLjdh!;Z#Ly_1X_an%KL zjEG?mXS1WxHUiY3iM&@C(Ke#Kh_+Nla~AD~KN|Jr#!;O`Rg8igWwd~=R11t);tAv| z)B-uL55z-Prsk~$-cF(=b+CvZ{l<4&$ajefx8N#-kYnkW?QB8Vybt_Z{~34SnPXwY zIob)R zqk#8SYk|Ia>ub9{4W|pVVBb`ETD(@B7O&&boqh>JE=Hd?m)XnH;*Y`GMS5#yX#v-= zc%XugID$S>$0YvbVeL!7zcj@)&xc{NNuJjZ=XCozr_FYGKI{lbG1n6~5zzd3?foo& z^8E-S&i71!LmIw|i{p&rHIW6EqVhPe&CB9(8=wK_dF`tZrKYNZ{Zg)VrzOQ=pq`$? zp4;S3%P|hCu)dAXr(nHS5YIfH($sm=PjHZ^nNumJPz1=+rn}T>(}k8b+Q*F3rbSpO zedPk&4+IWFvv1eC72@#Ty&ihRshg(AY3}KaQPKhw$CEPdWmMF8_TJojZ0fupN(OrV z0{f7hZrk00o;l9!qon7IB(Dn%=k4ssb)h|+g0mnX{80Od>kbZFN|5Ss=pSvMgZHzhXZVmN8|7?86GgU+N&10(oMX# zNqnM-zo`j)&{21^9j_Ynb|^U5#n-XG^&5JRBmX4i_bXh?kN16y8zUst9DGW4gGlnc z^wZ_mC1Re(OL_o(a)$uq$MMUp2`H*B2^s7%ehZHwRny5 z!-4*DY&~r@mn{Wndb709h&fvD;VJ|MhVTvzKeaEY@h zz+9dqH1t$0j>pMd?wrb8JV?)*hKIv|<3nFKH;&|o3Y-`BPpx1C4r0LRoWJ2jbl;lc zy!;MFk~eVu7G2|f7EMN-doRQI@N{Erk_V@VxTm55IK(Q-f%~cDMV7iC1&)4$ZWe(T zbG|#$1tqZ9e_5_q67n!Ni2J+_c5%+eo;E7l{wE`>*_}hmp5p*hL|ar78$VO0>ky$Uk%qw0mD@p zGF)rT^a>v{V291}RheZu_iqN)W5Q;=V8D8FyD8*q^P%XT=ipO<#Sqm!k9-VSgy)JE zOYMS4ti&ngHXyA6C({;l7KX>Gxs02_YaFnadmT-paX+bbZU6Mw#2QNB8gmWBsed>K zboejU_G9#kKefJ}e!+jPKOTR5|L9dhe|#NVN&5clj=i3H!4hL#E^-KG)w#aUCH0mZGcATt$LgdLj5G?|s2H6Bk*u z($`l|7cE4-QlEsF--+2sU%T^3>)RftzL~2RUx^a^b-8i=R_d=rQpnYNHjzNH<&TZc^6#Tbb%W|RUw+kp zEaiXqc<~#Qzd;JQdR`L=G+X}I*eriq6VaP5zv@4h@{9W*k5&H$!t>+++eV^02x5 zS>)TBj4tJ&@uWwIpI6RfPGm1P9zLqWU1^kSxX*hDzY)yxEgJW@xoRyh0T1xv&DboH zC9-h)acIOr5G5B&kh^G|EjWSg+f;tysi&0>)dlvc994eLVk#Kb@TI+HQ}NY9P0{i~ z5sTa!6WP?~nu}jwhNqr>MgEj!W{ppaN#t1NuV0z5@}XZv4VZ$e!DdYUqBUqPKFi-A zf7al+n8<4Vpt_o`uUfT-E81Cl$henEb(iIWSK9k@&l|KvrJKi6Qa(4`U&G!=xc_R5+<{#6=K13po=^YcF@@?@;jFIlLn+CIJ_26C+mw zMz8qM>i$--W-IRWPQa_ruyZ~Tl*y#1WOOr`oWQ=j?Zfq5-R!v5;#Q zUcf}*9}&Lf{6%P;vH855(<_5LK*ZR5T<`0;MM7?skT^hYmXI6?!8U>Gb_wYtl5_mn zx-%l@r2_GQM4TlMu7}_&fei|?c1qARf`qg#)qm$Tk0Ff zt3=Gie%S6xClIevSlTRO{Umg^_9qd8=S8%cWs--5Q?yA&*`yYuxkuX*xnLJ_C^N%_ zxzK+g3H7P3W0Bn|udrVF!GU&IFU7!~yUNm zQS*Zu4|vr(FXm1`B6%{AwwxKLhdM%zAHXfx1Mysa5-MWXmqSeIf7iK;oLv1LHpQlC zFg~wBAidihpdP&un>&;7<6J!LI{hdv2E-MYGg{$h(%|$|{dp8b=OwRtb{t&waG{z@ z=q`9wH0(`Snbv2&Cfs@06w~jy7%T6=>D~4I??VfcbC0cXr{ z6agV>l_OJFe0Q*lSm%A7zMG^iUc;)Z}9ttj*lE02EmD;eEc6o-uT7oM%h z2BEWP9ozeFm!fH*J4^+`74Jv{9nQd(tgjxWukBs%1u(%lBLDj3%~^aQbwX!O-6J+MEbBFAfvDcfweQ4}USUJ$~hHJZERUa0$0 zm|XZu6Z`-x5Pg730*^I>^@__-m>%UcoZx#tqay=RM5Ot+O!IxTO36es%}p=I?&n0l zekq2YC|{pCbSX#uFG6ay7+Fqs>$qP@t?`%vR5oa;@IqaR_hf9y z6r{vnEJM?f@7BhMN+mxS~=(#Q=tbaGl27!@d^InCK^w)hT zGoJEF*Jf7OunzPwM+W^UOCEG>Co-5`$qz@@9!Eu}`Wd4mTM+_dM=<^03MnFvj;sRQ zs!tBb)pJRZom!~qAg{Fy6zTkgi)!&<$J4?CYx&jROrhjyzYH6Lun5aaft6S-jNC+U zyaNqG7R&Q;-*VFswl*WWBNDF4L=G`3qoCi?qewT>;sMM7gkSdWkSiNcDnOw96E+a~ zD;TyS@VV-p9LV9-Rj|c)PfRT{JvC4h-EBM1D4x_{51db+~Tepops7%_e`9G=5Xw{~Lk5R~MgGRl=xfTcapxMnZFp zr0Zv^JQgE3-r9*Q_*%pc8%=#{vM$6EMmY znByo|*Kg%O?9dPYQeTgEWSxa8hzuoOcph%yFR8yDsyctbm|`zl{{>Rf9lVO~IcuR0 zMWJSfrRoRB%&>rj5)Yo++9o5EAp&@R&t8-$*fLt~=)9rUs7ZpY79E2({o|Q>Fd7K5_?>omt8m8zuze z6LQ`6j2LzPiciTH1kh(ZOO9|o@~n`PX{l^OBUjmGu5W->9?7B)R{OtNmc4nX{@7f zvhm?kSZ%?S4M#Fs(=Zgu>?!)kCW5Apf!1kT+@V4B?xG6cJ$$B2HmoQpRjwoC-XWp5 zUYdgyb|2X0?pA?ESWvQ(Z)ES{X`q3!M$pJnsfW*E3nacIV3hcxt3=BknlDRGtLFX_@nX$6Q`u?z~=)4 zpNK2Ix%h`|T^DI64&qHT|Zs74R$%9H}tMKz<_f7NQN?@3NgsG>V zaXtbC;!+921q=0h4gj#RqjlRa&^8C+z3QHr1A2n(Qt!6c^n~A+Wx?kJ4&tS#ySZxf zL^q7U1*^K(oa4dRmmp%;a`lHK7;nx&9hGHZuq3kyV;6YL{j3w$7amL!`aJjvju4q=N)n5Nk z&@#F|fcw>(i+}WK(Z`;Ojo&#YzSK|fRBX_x1t-UYZ98ef8xqjn$)D9o0i3zxOmJRs zcyBG3pD99wTud7nald46coHxv3KNe~1M`lI(;b+e3e!Pio&v@b9H1e^Ts%57hO?s{ zYeg95S{CW#2@V~J+#NFf9ZV_YdgFBHG@brRyMFIDOErLbJCEYXzlo zFu@$`t192`yuTIxJI6V{ti*S40)B2t!OyKd_d91e;kY_M;${pZZV(ExWpj-n)-=HxBjWIy<4ay@Z&j8U^>=(7a|8ag5Lb!>W zt8n}pI0Y-7uWs6r(ngk3dgU3 zQ?O#lavSRMIKKu?!HO}N5IBAfoPrgnC>*~APQi+MDjdHCPQi*Z6^>s6r(ngo3dgU3 zQ?TMO3dgU3Q?TMZh2z)2DOj;z;rKOh3RXN<;rKOh3RXN{;rKOh3Rb*O;rKOh3RYaI zaQqrL1uL#nIDQSBf)!UQ9KQxm!HR1Yj$Z?(V8u3cNkKn+4V;1%Cny}h299p|9$s{O zJI;BYcXqdfz|9H0hSeS8@gI}~O6zmLoalL;yAalUjPpEh;G^ex{*BpbbLV-^WJsRp z>CEh-=XqL7Z_O;UM{CsAu@TeCan2czwfF)ym=eUXUIAAtU61^hq(#}K$g0T(JD<%;8d1^l-J&i2bL>7buQeObZhDmeXwKcnFD z6`X#;pHT3H3Qj-aK?N^WaQX=^Q1B`Rr=Rd?3SO7sNPCwzp6}+c{(@*$N1(S;J?eYh zEL8Kpv0la;Tv zv;ZEVgu;zIZrtZGa}|@~^Ux^9bi7xJVkE{EV;*MbQh&9`Vr0Iy(#YId_z14RW&u7% zcKk~in6}rXnO=w+GdM5f%{QT|Q?x+4R4rUa@+om`mCiBeBgFj@D?M!vYu(oHeBJd) z-f`~wPil6$Xa2Djn;nzRRZrD|@$fjR8OpbrVp%^4>zyb`O|n)Z%VkT^@CFeM?BQ9m zUu1&5cX&t-iE4pJO-Q+G3e6(@Y@R$Eqc6kNGEiw(VKG=NKX29}xNa@_1g_;-T(N9} zLwa~`WDuX`Gw)}tNk?N!eYL^)OYXj6-52kxeeDtF^~C#XsP*(D@2xCyw>=*9KA*be zksBF!X6-|deT}EhN>!h)SardGIf1o$??Y&N}&F?$0ALSUh4TQ}o z&&R>6AlV7DK6xuaWs@!zQ(UwB!RsoaD_{31bmdN!n!VGfT0vP0><$d{{SY~dm>AAl z;{VVD{0vW_1XzvhNZ=XW6KZfv0NV3@61azQ)JyzSdPLCVwbH|&_YcTqAxEaQX?aRq%j<(@(ffN!XbRPCwxZ3O-fA=_foz z!5>g?`U&r;;CCrF{e)*K_+J#9e!_DVe3XLIPxu%Gzed67Cp=HV-3m@W;eG|rQgHeS zpR3>*3Qj-a^A$Wz!RaS_p@R2NaQX=^Rq$>KPCwyQ3Vy1B(@%J{f_GGK`U$U9@HPrg zKjFqmW>;|f2{%TvLz@LV3xD*v$y2_iZt5?a4&;HKjXKidwTTnaJ0kA1L(N;L*$OBFAktj zU}^!35_iCX+_B0N!QMGvn;b47k)iOSwhj7pqNuZ_Pj`}yAp3L|>5+ZeCJdpR4-Ne0(Vb{`f}Hihj~?p@RRW;Pew- zs^EJSoPNTq6nv+G(@%J{f`6;v^b=mI;9n^?{e;^TuYIoI^b?+-;GZZs{e-6|_zDH5 zpYWav{(*wiPk5$+zpdc(6P~N!uPQkGgpX11=M=8Ap!Vp&m3;A9hNB9&{MOiO4#Uw{qkO+usB%Ll#b}hD7D8JosKAo$ zfyj1lv4&iQh+gwTbbT^c-`J5u{+!&c_`o78M$Ey8!1#J z`Yp9pm~0sOJ9)bs0(x(E*RQJi-aYeop~9b|g*x@5=1#mFc&@K($M%ly`H6FxT?5m8 zsOikR@G)~hTEB>Zo4!K84^gCba3DQu?~lVrbINXZ5AjcC}k zE$Dt&VqO7b4LxbWZyezQi1uGiDx11brP=x9>B!A{#j)p;2hi)pe6kJ>DFyD`Ye<1h z%noC{Mx|ty;F=K=W4LCcUrZz4M=~|btsMx$59e)yvxT;S-Jtu>>$wl4W$c@Dn;`*0 z^F;5;Sf4*EZFQsd^Cv5Xn6P(Ri)*4QM^a?iuUi{W&lu&wWb?_&@ye5g2?7?=4`utx zxtQ)}YlZ` z6>f|LM>lb$3YTZW(M?>H!uc&Yx{0e+xVaV_-Ne-@+#1Uc)L#eQc@^!eaXCaAOJNuV>K&ce^-DrmyM-2@^;jAyAI% zXLC@@8_&VME%veXS2>9g)>)$?ZWsbU>zFn}NU9g`DLEJ1hg%;mc_?8vOc*;>@AfT zY;4k(ATfQwd9*0;#x1nNIx*;al=x8k3ZOiD;c!FwGb#wFp-r_&*{>_Rxm9d-eh>OK!=T4Ep$-@qQUy+1$?07 z;?I1~kqe6PC$~V*ZM@bzbkQ>igH2p$q`dYARw>9M*z)S&g$HwrV1!g5{4N)Z6ZlF0 z_8ig5*;+U*6&Nm4dU&Mfdtsxhm%thTL^wy2CO_V;s7VVEbq@o?>z{*nXkqJ@$?p2R z9km0!SS0H#gcT^*>|0M@zf4$fe=3U#+mBCZ5#p@5Hz#->_!tGd3_)SylS`w%6 zk(4M$ygp83=b=T=D)xf-4T=W8sS1rwW#tCy@txz_#&eKQx999Ue{f`j5|w1MLpz0tqo^}RpBR!pp1xr42= zK!F&?0~lg?z1l71Qa{wfVthvqHVlww9QM2JKxOUXeku=KoTqIhcHfj`)?n{gF8F3Soeum992`)eYM z!_QCH;lqc2VMo5{x=*=K_PgN>JMv7_1m!~6XCuW5#~l3HjRF?k3O*OC%d=8o*J1lw zp*)HH`c}3QUfiiKon)1fqP|h1EMZSXVBGa7xB>l!MY&Y0lwbDWZ za9Xb1Su~q15h|F0@kSW4Bj5Da52Bl33iyQ{*dZiMPSFqEZXWx7cc{eAfIW_QGIls; zZAM&(1W(|5z4T2wy|g@nNs{074)%oXJ{)6l&4Vk`x%ev@wa2H`VOABVf1gb&Fr1T$ zF&;vVpWf37=M|=)sy}<#DUCQQ7a@flc~l zK4A~X_UGw?(1)T?0^!KgH!zZ$orL(|lmsD1kN2ffTE}2MtU_INQ-qPszkf%qg3F{r zU+---I)Z%}%yBK}7sPnN1A&kyt%KufQu^(CGOYw8v=j*ie!}QE21)r{87w?*XGJP# z`L6Imj{9!J0h2(5zT)2c`mBPZEqwP;EG2q^erAlG;ces2*yJp_8>5OAnwG1_y?{9u z@9|88iQfY}gz`7oJ!_$5xloMt&ecLa(5EA~2S<2#S@%U+cz}k)Y&f*A>#jN;eL=?0 z{-v%Sr_+!@doAN1%*4cSTdKNdiLg^=;O>V?^(2snEVJkfW2+1zH zL=eZv{Dd8g@Zn$B@t)~=OS!-f!9S0(N`Y_4Kl>&2HHmFO>`aN(HvwfGPjdBE_n^H=Bux@*6s{;7 zW$Js;?oSSZfmv_{Rw<5pTch)C&B6();Iy7vaCC2X#&%y@(@?M64SPy=NZ9vl^`BY} zIB0>*T93n^e(Uv#Hmy(Y6z8nDC>j)u2@4Z#IT-74X(6uF3mkO^zS7%%&34{{CKdxX zY-W|s=A<0^0r$+XvdzrtcEH_jTTaG-{K2@v9qD^dLJqFCurOCwpWx}SpL(L>BKVO~ z8V1kJ^$9TM1Q*dR{|m8+WtKg%6G9NdkNz733?c;+gZuSDu93SygNa_y;O#uCu!P>s z{wVD6{4;P6X1E%r12?2-_Vrp|SW?B{?vTYZG^!aba{~P=Ox^L$x_VJ@a{DPznlPZF zc!KdFi*BitF3Ri)Sd~J5tU8DiTo6+NF+K@;U57ymMevSv2iA)BijFW#9CAW4{;Iz^ zjvZ*M=vb{WNF|_SAaAr8ml7|azm+p#K$5fLfcT05-6dONZ&+<#-;#AJ%W;}4hsJWe ze7`BLoQnr{ht`&?1&4uG1}E{*QN5N?g*zt8vS6I1hcbpGXwLqz_hqX1 zDF}l9Fl59nZ-_q`H}WBk!AN5tJ}a3-0+Q&1Tx1ezexTxCAo6A!GXM3N&UqCmhV$<$ zGYdCTn?T;d!SPy;N+flI@UukgagM1HDXt_!%2!<8q!LZ{1czbSZZHz{q&hW>^Yd1^ zGgdqQURJn7&H-5B>%Urr@@`%VAqR4D z3F`*U_o+LS1(W15pCczwS#ycoxnjLm@XJ+!^>yEfV?63?_J-=5jLJ#Ax-W1DXhXFJ z!Lwtv6m4u~YDU@QEB3pc%d51Em7+!&s2GTVehh2gxubDRG5{k^xSzZo z?%+_kjUtC!_h8WolI8Av$c`G65l6%HXD0}ub819r4PRp@EeTUd2UhDdCF-ayP}_*A zlqg0V3#{rN(4SBOAt?v5L*Uq?V3-~#0NQqdAXp1fN)l|nBG{SaQv`{xNrc%c+Im0& zn-eTCpbV8;gN0LP(K#(C0k`Yf{F0aZ3`lSmo(;tYM54N`^%=Zvt{|GUTt$0 zVGbsS%&F>#gphEg@Lpz{v2Nli=*8A!02%8h`FQd?W9_6-k#87?HAf{N=Q7IFDe?ZO zOMg+9qRTlg3b}%Lg1&WluB`-CYicsG^j=UnKwI8++RUQ|>McK;k8;m? zfUx>X%|(NG=d4mu+4ftPu@N$~&}8J$exvYpMANcKRyqrwmZ25^?g`pGIOG;RV(iW+ zo#>!N!4yx(kvf^p0povXQ93h%NX$@GmL zjnuSD=r?q?!Z;Ds;xj&n6hJboj?~xVY*!po1rInvZ%BRWJS0OFhG+*5LdsUUdsKlG z+d&EsBuX5_`XSy@NkI$!yexuJAF3k}WItbM;++p*~u+1dR$kX*K8Dfq#&)aD(u69G9lL zq{bgH{^Pn3C@{ESxGgxr?`nySD7)_pXv}-C^Mc7aIUulE67SC8q=(~RSSiC$qAf&;T!UYG2rTZle~B< znWxlur55a?e@Rd9bp26&Gs=DarD`Q??)Kj;`0_@iP_oSA%d_qj>28$BsYHG(kQ`kd z68VutP9m}lNHG^E)pw8M*z0Fwke{Q&Ep#)Bew5{$hi*gtD66o_hh8Q1BM!GsX-66R zob#ZI)nd?0skF`~xgW}fN$OU824nc$D~4Y&#$N)c$W%<#ancW&mU%KtIrI)JEVF23 z*m3Gwqj{K!(DM+MikaKlABEgE`C{ZesfVh{UDU`B6k>-jzh(@>qooKvxDtwy8=so% z5kP~s01{yoEECFke~N9F7T7?kf=Mq$6puO8>9enaGQ`y!-t6Y?fr;T}PvEjhHhf5j zT1Ow0%Gtk?GjobEH3oi#1_tRjE#m0bB_}k5qwE*L*V>&?mXA4bsk1=NJ6&%I_?aH8 zG(=DIxiiYC7KEL}0i@*#C3nr^I5>^t;C>J^2M1!(-5818Ggorxa%Zf}zZywTJOu~+ z-8?@juj>G4(hzrjDKf+u$jJ@Q^<#X%xL9QBiWfN(;!>eFC9(|^@I z?|B+7crPeDNX_o&np0!ezk&C)v*H=3EruVl?1b(-b4vXCk9?5j8-Wxs)c`MDss%N0 z+7R${CdPpN2@7$0lZ#Xc9av{=``On(_<)7_W6lpn@>YCGuwwkQVjh z(dVg?NqPF~Z36kaL{#C@Rcgl0LT*p0T>{LJaqGi={fivVW^fP`XsOJ_Bzj(iDvlH-#*{HOU%A$Zc20Vi z+}$<@6EXNshEEG#3C5-lyUtm#i0On9_bg1B45ZjtLrIkFU|k|vADek?X|VpQ|| z&Jk>XP{B2I$6{QmV>6`G2crD#FBRpt%gIao3*pm((A2|9Q-55BiW8yQV15^)sh3Gj z{XR@w9=wM&6cZOd(ZIF7UNI9Fh`b^umJz0={*gTKt_Kh$z!JdcKB;<1-ABe4!FT8}dhqg^Jy zjn1`mhv-}_eu(K@i*98Xk^6((Z^1b4clCqFw)--n!JGq^=3IJbQeS7md!nV%zu+gZ zS--m%dL9}9XEEjEK&+YEf)zDmh{qb@9}taDX4ZC~GIK!R*uz*u{0s=G%)G=bLXK(t zV0|AS{)HVAOxJkjf--XloMFd3Ch9Kbf-*A;DONZN@M~8ko^`bpE04*VpI(ESyU1eV z`lh9~G}M2!;Nym}+lK=?ZrR}a4&>N17|OF!gjo$vS4v@VIMey}a8}_#4&_-;%ddg7 zsGW3XO%IqQX~C%iiWBD<2Qiv+QQ~W$C%1zP%=l%JgMtvDu0hY&3J$jrX9p1OuzxC6 z)4t~{@Z0EUt#5bBar!ACZq4<|;d-y@g{tLk#kq->msJJI_3svwKm(xrN7=>H=LCIk zd5`qP9L+TlE(jC-B1}GoMENJF8%t1-u@{43FGIW=aX@$CZV$N>>;OWNaf=AzSj11* z@diGUjIWul7nKWSd>+oQ;}sM2l5&BJ%OHj-9Lw=*XThGlTo$b8PS7&ST5^9%ECBKl zJ@%;{VGL){ObUQt@_q0{Ph@afKiVsI z#=?5kUK#HX-%LYg^Zg_kb6wtB*(V$C4;NLUID)!z3JV?6xwP6fk?$sHZGPff7=kVl z^FEp#@2Q!m+%+M;YcYfp>V(#Y1WtbuK1`_Gp$@vuF2vO=lg+^`LDwbO4~`67Q>h*tq8f4JFc>%ZZnO3xk=V_n{=X9%fx6!d8?r~b#pr=zUS z(YMj$nDC$^mr8ru6D`kRyvG$S5Z~isfy$xED1+~Z_x%!7WGDwK}L zaRm>KI$QAIwSY>I)g5)fz-Z?u?5G1=vcRvV>nG&`3)H|FcI-1zKP#6OaK*z};b?ImXt<}00 zuBP1!*71Y6SXRSh^;*Uh2%L?W*6!0X4&n1l&Bh zJAn17yx#6WFTT%{poLqp`L!^n!T1C-GjZXfF?X@bxD?hdl)ld)`Rh=M;ICiaG{{;h z@QxSx2|MQD!@scONz?V1a)GQtIKz&=nyAN>3uJvADONb%z^^^B07NwOwMOH+xIZ4BZs#m|jqsv+XW{d7gwm71&CvYh zqTK~Uu(K9&bw%Pp?ZpBxSF3)*RTXl%uI3G+8OlTu$J6|T9gpL~zpx`@x@IdEnxPQR zu;UREHAlJ73@;+Z3dc+M#e#aB{@{hOIz?OpmaAvY={pk`$A{Hb*9f=_efAkyt1o1& zl+qeGg(_+&J(~eT>4~CV2lQl7FK&LH0)*_f5fQ|(lAo~SLwsbtJ}_PHC>QGW7M$1@ zH&F|f3-wz4I_tFtzoz1P2dV@?@zo}wvfox6qqy3yQ|~RA`ubyx3-u)EdKfNF4y7(0 z`PV6;GLs1nrEAzLq86Te28opJ22|GMOcVy$9b~YuV=q3kCN-vOr*fet-@_Sp=q75H zazUcizs8!_0I)}J%E@fd`>NB`!goX|4=F?`J61~z``db$9^;i z<~~VT6*v`Q&w&iWw)qxsORUAYu>)ZkgM2fXvw$tWY%a)N)UsH{Q(yFSL?EmDybWpzEyDF#KmpN^=N_}?+_1$xZBXjQ++_GtKe}Ttd?rC#`t&w~Q z!pQpz;E<~C@7PV2r_QkQMdP{#&-TV6WX(6x0mrnTknbJScrVx=n#hm@tP#aw{VyLJ zorNiFf81B~U7XgkEpDk5k6mD)OJ6%n@G=%|d}nc?o&;H^k1yv+AGD_m{UWwx04Mv0 zCe(b0{yMW#NTO%jV!g97^c4Na94os=_pd0As3I3WffU@F1HrTj`yJTSnEf0;Fh=?= z7&S&}r*oMn)&R*_#5FQ^+3vWZp|~rs6)taxgEXFiQh?uJ9`!bw3)e?zLF^w7M-9J^ zBikI9N&5GJ)j_=e=`s#JeLMje?WxvO)-@kM-{LwWJ|)9Z7r8uhIx2*U{zD>n5qTYu zxLHlNNz~FZSSNis43&3!td(!HKM7l|6u;}P7dhzMh(R(JF1-&-oyCfW*vznKLzq)E zsSUkNIJKcy=m@2^rCx1lL&;gxhSEDAWps`0*a}6vh~}=)zw4~Vs-qZmznpIjS8vL& z1^k2^Q}E$m*fGg;LiyU}3oE0#hfl%txs& z6wJtL;p^j}J$3ME@+NPg%)eCf<{PYZ_;0L{Nk z*K<)2Y(#d#Js4>MvXPLCO>Sp4Y6^K}CiZ_lH1U;|Ww`n8 zs7hX6KJ2&pCXyga!-ie1r{ZSi^o5;h*iTc_JulFrn-?s16F_It%b>U4)e$~u1I6&5 zr9OM7lWl2txUrpFiSAS3co*@Ac@JOoGTaYYr!Qc~3c0?1A;GrPk3~6vo{^yJw*k^x zh){C`DA_&-)`u|1Kug5yuVC#OLofK|G=xO4&gLiJ=!8#&qX@a%D;zWMv5f|@7t4%{ z?gv1hiUoDQ>o($iTOzq6gK3^?(qlLUOwkuv;+}pF9^r=Y@peZ~(D$&v;QH(5IU502 zVXJYUo{p&&N!(W|@NAtpWPrmQm+BwM2=5^Ry4xuLt4KCPs&H&sfP%16IRCg^?<$)w z44_`M2(r60S~$`J3)_b)9G?J<>%$$ber}5c}X+y^R_j#hv>#OQSW4@;@vu*9raXC>t8vY_-~f9eGnU z=R4b|k6obW%bf2;&PJ9-fkz_O1_hpt+)&_K^u97$x-9TKfQ{Iqz{#S(BLR*U_@AO_ z9B=Mr+mbyWzZyGs0fdL*@C~d3;@6>(#|{#5{R~#?JXY(;sJs^EJvKtFZ~?p>pWivK z!|A7%WgK&Dhia;xCiKYtgQS4J5|_D|%`WM7iW-mTw&WYe}_+`1YG z3kA#U&?Tso5aJd%(CEF!dY^esvs;w6&GzB9ZV=kx1<-s8_F>iM)VBqP%1FPt5Qie#6qfewPnk zoAaqsd0%0L;|}=kX8ZeH*T>*9=eP!0<0JnS$R7_){Ite;*25^j-_@mI{MOd^V*7{s zZNXt!7JPvwuF~w4`DcO;&OrsGfbY4o6;8dQgFb>hBB$9&i7Fh!ZZk0%N)Otn%vpq0 z5-7rP9o;bVgkA7~O`dM0w1LF|(#fZh-uRx3FM>_R&S0q%7Km{*)3ng+Qt%{tLVN;` zWnxf6<9@2cQXRf;IOjk<&VuLAu#x%r@iq%iy3J%)c1)J*K1*Nz&qLiZU0a*F;au&P* zJQen`U2TViy7n3p?9>Z<HjllWaqR*}W2Q;cIb%m_VZ; zu!Fo>>-LQg3-L-;-ehpy^^3uEdFX%ozcU5b%^xBdX3a7%%zWe^xo!f^c7d7$B=Qa@ z<|S?*c@%ZHM2(lIHxVyuNiX08&!R)<10%aeX6P9dG@dOS* zor_$8HiERm)8L|22g4iTAZhZaWj^i+-Sz)Cdl&eqinH-QOD-gGIYGGuMGYF2C@N7< zB1BmTat`bQt+d*DsV$1vdLg@DD?(rs!s)uotM=7ewYIj_*1oU!YB8e51SAPqxhfa0 zfEP|&kpLRPMe_STGiUdlMf(4}zdwG=&Y78KF3&vk%rnnC^GsK$w#}%0n6W@Tt+qW} ziJ8iPuQO^NSFs&dqHm7bC8r?felEsr!oQH*11)c5ULUXm`@`ist4@QOHnY{$)bu4? zlQtZrXXUL7>tHq3@9@yWpU5QIkFhU+cQMXT#?x$w5|cHRab6CRM(1Gx5gzRDT0^LG zIaUM+qmV7!Ru!QaoM=qgFQEOxBp#Ibm&&8SC9_M_-aO%MNqE zU4@0o&^67mB4W@9#EJzf9v{X}C~&~ERmhCLG*aTr*T70}Ngr2VT{SCYF=!75<`&AI zqGr_uX2C`-km7S9O;^_nWvL5!Us;NhqKy#CkJFS?a+#u}k6(iBI)l*Ng_o*`2A%tD z$$euwcZW{=qfXo+iMOQ_x9Y?iow!XBZ%-$_t`l$4iEWbjOA^J#@Q*qvq?5jqq&rA* zY#rY@LAAS^%z!_DOFaW_SBb9);vqLD{CANIcYr=W?ibW(>2Z&#ig}6g!nt{vN}-Tk5!pYtBHHRs)8v0Ld{ z6aAWn36R6H?^N^6iiadU^lq_)xWg2BcZh_FB{WPz2>qdVN1CzaIoMi8*Cx@yh+XvI zvJJxDMfdk!A%6i8mEXJa7f79dee@G%p;3E1)7!GS3e~jpxJmJ8mlny2*_%ZbCK0mR z9JmuY)m^MW-tG;o6hXjm777Ad8nM^y3ch+NAIXzUR`6I0*P-C<&Cn|jfjZALYF=hk zUKM8ne4Y_G-%5;O{|T4r>@)MUO1r74t=lqT{pQ9U@-hvdv2EE1q)ldE9et|L8UqpV zOiiqF%*@<+J}{6C;2|s4d1;U<8wnBCe%x-_lRNSDvQnB=&#K83T5l}4mDaKTVQepw z;JERMF6QymAol#4wEB#8^|3zwrWhvI#{OkBeU=B?KZ`eYWCkj+?JNl)wne5ShMsB7 zUup6=DSrQ%@{1*R^i+jFo=oa={z5HsS>zFZt$0|HBX>-S*PJ<3^2Q4%*^lU8?S^R2 zNi8*JUPZk8W66MPWHo2IVw`s_CjM*QGwp93i}NE+{xE9zH|=<|P2F2hR7}_XKJjIy zRFJ}TzXy&AAR8o~I0k>mzmHrJ;`EXAR^9sgR_Wd1{rYY{E{pT5LhcOk$N4SuP|bj` zvOlm}@U}F*NK%mGh8ne#RqS_W)2_byvCs33+ACEYuOxh3tP~LO%62`8en!Il&*gZ& za?$W1Ok71VM@Fctx{=XV>`3A4f-nzoAtWYCf{DrPkV?I#oNYqahZi z%EWIF#kw>U+}{ony*dUIV00Th5Qwb@y$3E0zAp63qO=_aKp_uQbjr`{} zn28_I*muLCI33!R9D20ARUGHr-ITV6I||%wz-F;)r3FCbB`_=twV9usmEvDk{5YYd z$uu7sMeaw576ln)Qex=Elj7(Rg)hygTV}#UMuGI=p_K?Jl`9ca0+ZsQiwoPWz=KLi zK?Fact(r2BU1+C3&XiWSjFBB60hdHkaR|@nxY9@ZbqCJ(B`gZB#j_C85{fjI@|LP7@vR3MV17jPOI^^}^f*rP( zx8Qs2<-~jbTQbYito2%K`;s`MsQCRD#iu@cF+-ShZoXJ8)jfhLbv!=}TwZWz^CX@4 zwFaF+A~Pr}E589fEcDmroJ|JN-^FoWJNdgK=<9a2CD^1RM3${;`&Mt)U(n#!^3xDa zm%SU&>KOYKSAWBMJ70k5(8a7Ct0Ktn2QI1_aarTUb1E+ralTHA z^GBakv|p-PdLk`tKrnR&qe0C55)~U&Vs1aL8%u=RSmf;G&g0~noXEM19Y=mB@t~}! zL3LnZwXBdu^$oqIS~mNV<*cbIg!!m7^$=_7LllHgHu$>cl84TSjIx%`_K z8objAw3C}xc2)_09EZHv+Ropetz!`vTMPLcYAv?#sm3Z6-DZ^^Hfm1+G*o&fvXGXG zH>wEqyk>w%Y9SkraK8#-1)jW>zSZi!UC2)Z zRl5^^B@NI}IMEpzD)F82@J6m$V#K zJsN9i{HnjH)G!=PpDD7N%!~&pQmx@1I}hzY!dkwPF9uTev(0JPC6iw^N|An6`B&Vv z`ih6N6t#Tm1aDNZYS`a*Vw98|=7-jL%ap*|Hj}b+vgl-|ksbL-_?Uaj>Fsz+$`!et zdMZP53;DE|djXq%;GLg#9O?49Wz<$c%x%T|$)p#>epoGjA!;lzrjL>2(6}jC3~TsA z3#)ib8Unq+D(qCQlKaQm>^GX`3+Uu4?Z=6Z#l0a+Q z4dB7Q!h8NFuzywScI|qj_6Z6>gNp{FE~No^R-)n)5!0qHJ#$vcy}#O5hz!N+WNR)O zl^BW~Hq&Du6BRcpUfI;iwsVzI3diwkWSd3Jbw#qenO${5WDdyTereq>3GUwlkG@>4 z;+``$UxMV7>dC|v$eCJ&+x9k%V_J5MR5UR3S=M7L&0HEdPmCiI3Q9CpayxI6oSEf4 zE~JQF@e}b#?OtbpNfpuSAAhHaxU^grFJW@dPOr1F1EJSb}rbT}92q>sF$ z2AH%<82w00pC>DRdd1Z7Y=@#9xz?@yuxGekpTc9WCZA%8yV-un>HRwyu@R?kU=d36 zx>&WQVm?1LjTnX>u!pk8ILP^{>{iw3)h{`TbL!Cs(D=u7<5%(1P(cedn~I;KdiE~O zbbfXoxgS5GS66#2v5r{5IHyys-~Wsp6{5ISUSCi#eInCl%H4DX-p-rT&B9tw zg`-;mg8QmRofqv>)>wUS;Cv4KS#8I;`bj;c-XxL!NYN+Dfp)|BGEl21MMMd-N9wW3 z6<4z#LZGiEF?IfQvMu+z!|b<&$G8`SAvkGZ%9((&R>ZQw-lT|ZjWRtOU zOaM*Q`s9fKM7k}?HoI1E?J9ttf#_vP3>Ds%2`5Gf-A1U%vzwoWTB;E5Pv3GkCS!eM zxG+}4^oE&x83?M`!3x!KxoF*7>%zQX%jHG#X(i?kSyoJdY}a1TXfg(+Yi7n$&t>T56mT{_0X5!v-n^ygdV^3UxCHpWQw1*wKwC8^WHam$gBUVL>ZJ5wBHfY%KjDvy*Z2` z#TkTSd_)&H>vPpgHm>CCs|qU@-CV>hrKuAJT8VilBHJ?k{&s(Nj$6imqqfe@2#zNN zIaW(|3R6s~rxl-keaJ3{uOv|)&b>;xKO%6wAe77)>v5fD!WPI1rG3T*-|K|pSFx6> z(({iOj+GHb`Rx4JdvPjNIO{7Sj(0 zR()w!NV63)sEej)-$cOqg3N{kx0tW-S;-Yh3`i>8&Jnc3fPHobG^UMqz7mVB4U_Z@t* zXApDk%R}X#hhd+_*zZvA@hsNise~qC$;<$I8}>C-n5U3qQ7rLe$)KP zVtY}$D{@P)xx2iDo3<2?+gioSA&=MQIGnU4H9P z0-sM>)i-p z^I0^6UyXy8s5O+hUT^?$u*~jsmR!RkTz)vxpG<6q6b{~UzPvIkYg}{AX!=$06y-ZM z*~BRRbnzM}Q+(_e_(hB)5Gi}fdX7aE){Z(um0fmfJ#myin^IU}-BB5=h_}g;Q;-SF z(k&vbq(ZL!82r*1H%D60$mLMX6%rMj&QscoC!Zshvul~5Sofd+9C6NXyZdH5O+=QM z zZjvu7&iRKy-PVn8aQ-Hpg2;_9w#{uNr)cXa)1x^L+mGuFsz`*^lr_)5)BFTLU4 zr#q-b+MYUQI_tw3$V+>XO1P9b6z`|O$XHV2mE4SVXxuzp{%iH z73{>jg6sZfPbPQ{xN z=CzkZzomrgg;yreC&gZ!Ty9%&YW-AK(j+Sb19;-o!`uPlCiYMqD3aDN=)Y@xTU&Sis#>} zW>4Yf)e<&aYVsYlAE|IVrgW)rC$@q*oRhD9=QkA-zyia(zc>qf)t2fpR3QH{{L{jJ zpZupZqhI&xKWDpYHlDL2&` z--yb5IQo4RUvg@G?0d7Go++W|;6~(9TyVRGa&%IB?8`rba(dtfi}Q4_xq69UM=((7 z?w`bAY1@WPDf@1b<;5T(&Mpf!Z7;9_2d2dDUtdImWjwRWSTIvm zkgrVamM&=(WBKn(GGcP`@86cj{iiPFYs`$zgT`xLp)fP?s9+dWNpm>wOZHkU#}FKI z)AY!V%6;PY0_>rhLh+u*VK^5aygKqxC^3ke0sPPElPo&wyxKBeS}kstUJu#NORZ*)M-+f* zO9W)rFJv#@XBw~LaO?S2t9)JL-LehI_n1W~a#xN>gX(-)tou0ALh14nI=Ttm37WRK zkY*V*e}YL##^s!*Nz>#2Y(;qR#*lr@=E6w#Z~@LBrsT_sKmm|1w+#DDah93gorSAV zQ(?W5$cW({gIBlNG9jPR*j!F1bbpK7Ur{AX{1EqdnEN}@{T<`}n(nU{_)Gq)++VT9 zk?)(`-@Dx3d-QKzH3a7d7kNQh4BXhqyx`Mb@HsEI#0%DY!A39G>IK(%!7W~Jn-_Gv zV7nLW^n!Bo=(a513yLDejg^gr8!YyML%g6^>$w?ZQ{o24ctO((PW6IUdBN+w;LTp} zE-!eG7p(Szi@e}sFZh@jeA){>=LMH|!Fn&)=mlH7;5sk3#S3opf{qt#_kx{XP!4`w zl;pd?S4YaarT8c7mEl{j4BvWX_|_{d`VekyLKlAw2)K6vP2a&CxBmYK

2`iFNhrh`PpmJU$1$-(E-KKe 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

!q5GnUo~UFO$` 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

GEp|~EYsR#H5&rDX8YS6;bjV5V{J0z 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�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�App<48T}f4FfP%R?7g4mDMo-V`cRWz*t!W129(B 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

UHyLwh#(Ik}IMT5Zh8qGd_s&DKcP-QNj&8ZE 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

  • w@~*KfZQda0IvYKPtGb=jtE7j$OZ^J;R7g)gFAtFxFoN^rX##i?WMZT=)hyKVlDcqVh;ipf#< z*m$PNUGi=mFDEDL!{m?IaTMIfKTYn?ehKYWF6czbZNI{K{Q7ph;<^32p|1aCKbaVg z6DoUsbg91OgS|_AJC5nRew|C>DEOsyS@28y1mUO6pQPY++@tJonEo8ob=&x#jKKe! zc-{0cdFX!dJIU>SCM|R}GM=u8k6ka^LjL|%LRa z-!HpgiVAMm*|gwxzY)&w*RktwQgFMTI^@>R(;UYn^Vas)uFFx8&t*FQ?>gxggFkV` z!TA^aOY@!f)*m~6oq&H_Y(9s{t)DhOljIKDwevSE_@#MN+^=6>`)T&KF1gk3?s5Ix z@;BH&yVSRJBTjpV{BG(bg^r!4P6>az)3v>skD;@ecipJ-B6)(mCiybW|JOPdrM~sY z#yKvyjdN0P8|Sp(HqNRf{I~ix&W_-#{trLH!ruBB6+EeRyz35fmvONEr-l7K+N)CV zGfaEiuOzuco+AYPw6L#89v0jscT4-n(Z(k#_+7M5l3RZ+#jT8AXN+x^+}hi`O$z(@ zv{z;QI-giS1-E${6@0t(Q}A<||F3*=%A;KyPaEf`;5I&Sa@#K(2lXH5SZ@0p7To5E zEA(wXgayxi+m-zaL`ftwxlA_&9`<%-DINNre3V#1D#eqDk@Ud}FS+KX< z_E%ly=Qci3VSi~Hg}tpaD%-DP_Zv~c?S4aD?YFo4mZ;#D)&<9Jf1lkq3U1dORT1`K z#=)*rX>uEfOY558cAX7Z^6Ok$PdP4D$L=?h!rtyr; z{Watv!EYdseF^(}Xy1-JJQ2Je`5l^@=RLaf|F`GE_gecWU|*c)&ktyBzNZl9dKBls zv*Y4aM|>P|dmZYU*DUEz*!y4oW;tHJ$A$g#p1yugkKEc{x?ZmB*RkX43VS=gP7S}k z9mlBPcD&Mp+wpa4`gJaiqu_SmsA~D`?fx(5@ zT}lgX>ylH=uW##8nB1X1wk}15y{$`0!7tSxke#;el5*w@nBtUGG%+g?v?e=m(!J^%P#8ZW^cP{$EEHXow2xBaqyI^r#F;fd5Hyn^*CM{y5mYP1D}$*t~UUZ@JCeu;6X}C7!mwPGf(&c3j*>SB`U7 z@Q{}$`hE&|nEkTxPYZh+f5mnk+S@osg+DgVX~Aur-6nqjZJgtR+jy#LVDGYBTR-E? z{Qb4@bcKD|oqOUtHASef6d1O;C4RRdg9!Oe%UzK z`jZs>via%Ur7JE+q$G$qrcYP&QpgxN`HFLpE!A#+|FOs#;-Gm_71t#nXmbk z_J^-~_Sq`R{guo5{62Yd9` zTL+w*{rz3*`J>M>$>RziTThZ~H%xBpMw<4P+dAO1g?^Owhp8VYxAvv=0p^wBY40hScb6jb1m;5vR=au3X(f;I6CDo4AxE`Uo_s5m&AE*C$#d{84 zBoAeZdjB>-p-#7>zk9{|dsNUb6sSxo*OdBXg>z5aY#5`S@lJpMHNISH(~ z-U&Y=2cff-{B!c;X0*G5{1AC+BXo*#KUPv7I>JpIohkKhvnwi#)srd=&Xy za%YX-&pbUC&(Z$w9CQtW*pX*q!W{^j6!yfNt*1uLl{)l)#Z^@kl=$A`gwintB+=sZ` z!+Clmd0~-1cadlQfzDj&j3(H+s$p@2X-hjQ;nMWS4i}=i-{TlKxA4J{4@$K6O?M7BX-;UQ*aAkH%%jOGiT5SWAEu{vq#g^;_%7)kN^pNDH-!+@Za# zZ2SJd7SpDKlI&Yu($K8E_v!<=wC(q z-sB0^TYXvNea4ZiBe1`n{d$c&UKn+tG3|dKkCjBb6*-S`-wl7F?;`%KXkUlCiFgll zJM!k@{Z|9X1397p7We^KUM>UV{GSMpmd{}6mJbsi-zD*82x+~N1LY#x3`9@>t$?WRtJ0ch7@KBE== ztBmCFe_-E${v6X>|K5UfI@%cxp^LP42ccgv>bnD>AD)i**gP3X9>t3g^-cnxXUHQb zVE+U8b%Ut$Dg0?p9wraE$e(-Y=VbEaarkqD_N&QbOVHCK`7!cHLFm}`W0by+?M{S0 zcD}bHpL8qqDWiIkJB^{goPRNvJbfK>9;csgkOv-x&QRKaNgjS4_Sci2AdjzyepB+| zgW;!pe{PTL!#`8?$x~;c|1ItNk%!Xg(XZr_$)mXthvVd1to>RD*CD@1{(#t5R2Tw( zg8aUAMcQ9O{)|}PyOGZjb$d8@WB}T2M4ji!TL}C2$(>oS-$VPI42Mk zQTR>Rzerx2Ty;Rc{Z9TEc{$PF=gFht7=xPj@Nkd4j*yzqm#o%LOuqX;fnv z{E6KKe>&6u2g!r`!DBh`7jbeoAIAOtJm8;`hi-%LYW%gjNFMDBUV-{`?nk>x?jIKH>U10q9cM>jkJ#_sOd!wnL|)nb?f2Hc4EXQVaU#%pUexpJ z$%BXC{~Fp)B3HQ(pPJ;$$TNMx8*&_XlSezDU;6*`J|#z>T{RQ-_`M4K>pP{v)2Gqy zQR?)jed-kW3*-~Y18;)c?}45pcc-FVy*=0j9*kKA0u`}bc_=O6OK&*0`) z$;_vZ-q@J=mCgs{*1&2!d30RBBS**=k~>@%^!DES{7Al0&VMJ z3jMiaAKREbu_K>niKyydj3STly0t8IMw2^ypVf8b&ykOib&@>6aqmF;!{q5F&|f?5 zMMuKVUoqdo#zq2YG_~!xGdVMIKL~NAp<6W|4=wL)g~mugN!v_ro6~ zk8oYSiTVZgg_6lP^#$}lB)^V)mxx0*^7-O@xe@XtUO;UWz0Wh`iNnyh@kx@WxsRQS zVN;d##?tr`AAo+@ePBQGmEw1H9w*P#^~e8Z@@OUS5{&aU@)Y;03&>lHM!T8w@O%a9 z|9#|vN5DI?UvFFc2jS=S)Y(TKZ;k%i`CfYr^pA=8(w0290e&(JY7lw+S?KIzyK(aL zK}7Oh^6liR9&~oopVQ<4^V7KcGlTYx#=@V}A@oZRhxfUQJlqbvBKgzgQJw?X_3k~Z z^9$@hp#4emcn0yQ&b)OV=lFhyepRLYt(Nop>l^wXBM*Lqex+!?oIG*_?VhFmZ`S^6 zaGmzvr|c7GH}DhMwckJOPyVcUfBsnVVLz+P#(bi^-ENxIH&GX6?B@ zyvrjry4IiE<^CU|pnp-1Je~*oJ##|m3-U|>_+#tj5%S0e*f(LjS5HE_ zfe&E6lyU1y9{LAyc#igC$y1;*x!h7F7h|X6ZEGXbvBcy zxK5QKKSLgP9sb*San)4zi`VH@s6T)_xDEEbsI%DGbHDm!9{j}t%l|@uH_^VrH0bvh z+>#hcN};t z>g3Z4hp|sgMx1+)SGPP0dtL6lPk-`dV%|MY9_2bag!b=R-UWV^B|l2uM(k(uKLvlB zp|H1cXhDkoOYzkDemW=(}3x^Cj)qkOz2QW)^wj7}|~2E8>yy%(qVD@hNDxAMMAG zXWF3B;$P|a43kIjLmuil?RS&kE3Q*6kgLDo=b`-g2X&r-Kj9$aP@XzH$+>qm0MI&&}EJxiWhiTI4A{k5|h zXP%3ep#A;iHN^g58o5&i`EZ=}+sISA4|0zB=gA}EF^*Mf@8|{2#3#k`?K{Xjkq7WY zIqC_dg&Iko{3_sC4yXP?@~Yx|ay5D6ING)E?Fr~YVcL!H{tl{v{{02=49`h^qCZ2e zy;zT)Cr^BVIJBleKamF$7?=C;hk9ZT+kFxpD#U&*B2Rsdamk|nHga_q{2gr2W(6ImPb^y+NKB27g@I|45!{3I7k%pL+A) zXW%M~*8$qMBfm}P44D1=&FC`x->d88C#dfRH{up_3 z2>cvR-tZ-k`wH~;LGruFqkkfk=aauep3DJ%BILWtGYkBF)_WQHDc0p7&NF??xUy0e_0IUmM8dlh7|)2lkSyClP0Rc~Bt^{mkdksZD*CTsg3}dA@}_ zIskcS-;dOE0d&GE(5`OI``k{R6!%}ok!N^LwTSi$$=wVR`8x6yBg4_J|ImI0x$`CB^E$_CtJS#((2e#bbw|v& zPZYlk86;0{Kzv%T-GStherVUuuNCC+w(zq6?SHm9E#Qx>OEq*yOuLc()S*97^1!NG zoPWWABeQvwS()eV6Tq$qZ#`|0%aAbDsv`t=(7Tlp>c6W}@a zX4>~BPcMeOo<81Zg0(-7e%X2P7I~6!EKJP^GU^YgiK6RFm$1W80NE6n{?c~X3@TWB6+~ghjsrtj-&X>OA z&k29VkSEVV$FA=e$b+9E0F@d41qtZKPB9Mjr@1c3UY)-a?S4vs29X~V*EJK!0}ElF zoBFHB-Ko%T%s8aTqsQQnOZ)Sd*DmH+K1TbB@4+93@8_&R{uFua0kr!q`3K}#;{44=9P%xPKkthBm{rMDLHN^`I_=3r;yUFX^7I_o=b`;P@(lOSSCg+J5A%n)iqM~{ zR=}S$&xMZD{!Vfy3;jAo914n3oCwY?h-^-AXwf5YA+jEa? zBA#A*cX<4;0=F8^Y= z)wu)lu{ztxV^P?bqrLMf{B-JoKh1m|M;;UV(k0}{YcRe=n4f2?ePiehp-%PBpdYUQ zUY7QQ$)k->AAX=e^T{L4VLzMpo5%z2Ai{&FUu-q>GkIaJr?dCDg*?rDAhJlQd&$F3 zfY|G-r>)NK(6Q$pjg!#-UaV_f$YW0<&h~!OZ{(S)p=0ZI&o$5q?SlXI`Jc(;f%>rT z%zm9DKOoNEimrvu7?D4<$zwcMv3b~?JSd*OeTrP|LAy3SpOCxElbgI~Ds_Q8%=z^c z{jB^s{OKh2hb_q!_tn=@XF7R?d2Z*|2jmf+M~$NWPvohu;33PW%36nZ6IJ1VZTd5w z+|7@?nnIn|$YUw!)Xj;%*hilE5<0eS*I5t!Nafs~;Z@Y>PTpJWlOG}v_Qbrf=R9wa zyY0}f?eCA|fxB{f%G2|sff`?+-5~eRb{xBrJGG&|iT!<_+#Lv=Kk4Ur@<0&wub>+$ z`%CCMe7|=E+TTDPVBNTb{84gOTpztep62rpGiblo@P!0=d4hGR0r@B7@#XOUCGu_LY9I8QlNb6L?Y0ru5jDsYyuW{(_F?ik z?^Bc@pFkdX1bJffDnYJzeN>P3o5_=WPU!-9j&I zD|`okVyq|j-0W8J_(T+>8nl0ayuVo2W|F)79#&b}ziD-NAM;)2!%lL=b5!ep&J_Gf zg^GC!t*O(HJTw*a!oEL$5_zI6?1$0*J@R1Aq8_n)KY8>Q*mt6R_V;KvES{I^OrGR< zf}N*Pa);kjXiA+$6+ zVn4wj=Py*Y#q@Ioc|_c2Urg>EgZ^>$_Xv4rA?Ec0^5Q>3Kg{)|0l7bwm9?RyeFCXXJ3KON|QhTMGyi8-45@vR)+EwDdHo+MB5cP&q{-5lFsAK^U0 zzf!6mdGHM4X4l8D4{+SKm11#uf?}${~LL7JM8Uw;D3Ih zJ@3PIrJwhbCmKV?#%C${Qn5e(ocw|~CrMi!e%~;Q`gwPtU5D$1t$U5g1EVl5#q;4G z+)bY1_hIe)eU3cH=MAP)e--%xvETcN+~t0?3FDK!6aK6f=bX*R-3y3Ad)gl)Un1@o z=h_9GIO{_d`cs2E!27c<`EBH7#C*J;{2%c=$u#mP_X%aFvz*-FeS~%7C&^P>-%F8~ z+6_N50}o=?6)jQhvr?}__0Ka0WG@`GYr){`f8ApY;u{-D*T|8~5J9Y(w9^05Di{>&zi@VWYXsPjH~rYrpU zoA&vR(Epj>b=luKmQMt~jykuJCwQOkdGZIyliT5sT^~Opk4%P6Gur<`zD(4^Kggr| zF}^krZ~hg2#wNqT_vrt8^7uxy+cggwI8Pp32Kx!Lzx60|GT*|Vv-D>Kd1>L#O!Dv- z(6RfpP2@ww`TS99Uk-V4CMO!Gcns}E)N^2|p?JWG4u z@Fnu_ap*sg8$u_^m8cs9PN3Z+>x^ATI+3Ti52-|d9w85MKURZ$9(j!CQU4)dM;_wy zr8CLTkteDZ^T>3@vvUUi#6B(Taa*=tAWyK)+xKFfBzMGf#aHPGV(OA&ovFrlZz7M6 zMgH_7zmNQ0v93)dA1BUL7LZ4IE@#)BZ!Paq)Kj)`%YO>~q?Tj6o?*K+$rH!GH!yEE zl1KhVKI_W|?{l8Kp2&wXzq7v!(JrT{I=3^Y7YCQmb)(lxxz?UH-n%kS7Lr#K*Mmv& z1i!}=qCZE--9O>yCi1eU;g9Ybt7*o;y;|ccn9cHUOh#g=Jy@+ z<%9P*M*fA+$$tj^1m{7gI`eHZd6egY)}K$v)0>c=Z_@rGdFThk`9}7urY>|Q-`ov| z@E-cp!E#<#)+3LQzbeiZpCaEZ_Q|i4Cu_lN@yY zkmLRtd1fj4Rg(Jq$h+8yNPf}Ub6;xXR`neGc~RV#Y(<{v0sj{z^E#ryzVQ$7?!yvNP=MbM@bm2l##SZPYnUu6~FA zx;gK2!+Gduczscsd>DEB548I&`BL%}?~lx491dE0)?pj}tN((2oci{&SPJhyOzUY$xw{5$y(tAW!y@KS-Xw2zy&k3h2Ab z-a0iH@xPn)w~)tfgMC-V|4nPpeL?}+e?=bQdBu(7zgeA=(9!APeIhx~Zg4;Nv*f$U z&xrYZfjq?T1=w~QXFp&{)bCU<#% zOsf`EYWV@0+sYGKW0P?+biR`;FwzBIq;Pyd8Oj@9h~xod?NN%MhPNw10y+sy_KknI=Q<<;PuQ2_8k?kh`z_@3V?`FHv1tmOk zC;1sqCrbrS`{R>U3jIw?MtsIIaJ9)*OYBTqFduFt-}9>9&w-koeuW14`}M5Hvy}6f zzugavj(OMM24v1)`l<961dL9wnO~=h<|coVCDE@E7#>xRJoY8P4fMYqb;>pO>pY~n z8ArwQz|w5@IqFOh@vnI*r)M8})8F5X)L-iQ^;hbRrO|h*VFbg}&!G>vjQ@dg{(P>g zdGVZCs@qwAeA<$SF8KKn>V#Yrs=nMfP9RtL!R>wjm&j8+{q3&x^!0cN{||dSOGU*z zif=^R!X**sPK}n)t zbvFMAd0#P)4jQiG9PWq$S)cYb^nfYz1wh!dIO2xaEX9Vy^o(j;9@w(gY>#{UAaY)QW z+{*G_U8A|l!|)k@9uA;=AcFb3h3!7(*=H-~W`CY6pnc?O%=BAm{{ih+&3@Z!(e4LQ zv`^gyf5y?Dn>WG#m7)$m-4px{k+&J6W9I44x(4abHjaDgEc7=f`de3X)8G7}uHH%e zP-VnFoBj_YPoMFRON=@lMBRRu_DPW^KUv<)Uk`I!rTeA*k7Oeew3+v*thpJl@Sms~ zb%0fUkMsYz?2lVDH}hqKi1R?|lz7XZx6{ehZx}Coe`l$ulck1=dA*VLkpQZSeO%z6 zXRp_5vCihphX0v|P@k`%uMT;vp+64e$0N@Ni}~1E+nau+Zt~~b5W_F)zx~h0ssE1H zpM0$YYv!XImj$#>5Al!h7V`LqetyBUtMezf828G0<9(%i``TCB4_t$FvmWRBk~Z)s zQVjY3A5M(sTF2ezA5vwk7u8)@{79tgw;9kpVv!0KXqPBfVYn_aPN{w zeno#rGY?N!h5!9U{_L{$`~30A=U}`dVqZ~TbCb`@Mg70caGn1#-j5hgf2L4puF(0^ z@>~4*u%A3B){A@<(QZ28_p_nqCeEuwe8L{jR_Db2d>nPo3;!3ByZ0f_ZBBlqxyiQ} z?}OO=&v(XN_cy%;`}SV!Z=b`6^QU5+%3BHktC~oVG9348^59Y^e?XmU$TOp`p4#j2 zo|+fWSx!a1L_XB8?f!sv&0f%uBl@#>hMVFuQ`o4tPpkk zn6cOKiSoS!F8fuWvf=;z$J~0`aLP^8a&fZ~U((>eWH=R9%04D_jNk$pcuC_2sAcsie8-*HRJZ z5&DZoCV!TQad~+HxcUL(?$XZ=)Okq6VL018Ds)~Tccx-}vF8a%>g*Twe=qGT3!Mh< zA!5+qNZ#Q0{|?#-GP*S{kf z;B~Rhx9+r0KZ?2$r2T(hf&Y$!{a$m%VFc|1qtRdcSoyvk$cHT=KgXDMbzYSd`OxwN z^iy51j^tdO(3kpS|3zoZcd)M{@_DYY*L5tw^Tw;$ z_ByufKH`tVQSwv5pCUD(llUG9@+5WIYHs4(Th#yI#{RN?+W$PHF9b{-bBbaG>UPW?e5Pwp6l`Sp=l7uHiJ@fha&we)i{bsQ0g)3jIp z{p0mTWyEu?xW35N>z(OWrak77y}$G0%kXEF*jH3#9mwQ?{yj|VYmAPLr{ewe7WDI8 z>IZv6|3!}D7;;DWdE-p9yH3PmG418LTzweq-Rq&BWV`FNy&1=*;@so$AmR}E4fR$Z zgL|LD)DJI1zI{xc{B;nY@5OwnX}IohWIpySi)nuc?E{4|URB9QkjLv{o_1s$CX=TJ z`p4^a@@vI<@gsSLFUD?9{Ue&2{?-ut-XeA3zY^>3%W=dZJ_h~O$M4=JNc+G@_+Ov; z9m%JQI6SJkX?LzTx1UdYXBNgqmuv5{iuP%-UL2r(BoB6;FVdf*ybfw1;&6uc>U)3O z%GblVIB#N~jK5W?wc$F?qZi;$C-&zhaxQZ?XMtM;`5i0y7xlR&TUG+~$dOv!Av%`uTW2U6+FV-b7{o-7D1jL)8D(nwz+VM1Jle-yyCq8h(O) zeIxpnN8g7sI_Jbbs+Q)){{-L5jjYzci$osWj(lrHKX0@AA%A{8NG|VlRnv9A%p+Of zW@~$UO?_E-RLg;wU*VsS52N^(i;cbZ|0S_M*<{+)@l5l6SsmKvX$0=_zMj2au57sW zCv`jYuj4$rjyzZtbtz7ryEQj;Mv1yT(c@XFgV=}1$&U#?Kl}-CaAu+oJWc)eY&WzG zao$0`nLM)#^Y?ewz5V2=@reI}MSq)qi~i0L`bVe}+TzcjVojhkSIn>5?m<3$Ao4krAN(`XuZGmgEzf^6 zM~@g_{&D&^bmH|<-|Ttm6P|rBb+5Qi`Ag;U@;S8@^`r;$XFlztF|?AKb@)yC^NFZ? z_f1255+XiZspE+IZtrrxcTx2B$K~+VGVJUh^z zTIBANSdVlXd!MG{iHE_f(!L$}4l%w%G&gapA>ua6>KyT}%b$4mb5r1r_o>=55jI(648NKMf7nadY^+=B3nMtbg#ryB_T6-xr-J4jx&LeS*FI z8cLlYpZBXyou}EZ^RPe8?~|v~+(*&AzMg=l-J)XO`;E3YaqBJW$?qQ5=jx)KPd~-^ zcrEnnalFbjLmWzo{Y)#5(}~Oe7)<++xIeXU68u~*uE)pIKKu*n#)H&)PII&FM8$RJ za@r^UhJ6Rt|1ZhYV*h!}@*e(p7H^JmjIPD?Q7-Cqmy1IZExb45_NT_ z{sOOw|3DF+Wz>&+1N~v_SIb4PcN-y3CUL(1VC*l8qy5i=9@qDO>%fs~IWB*B{$#7R zBA>JM{?n}Qfdi;xrI^nRH8=i`5%uJD+BXt)xWPr_!xT|hM|t+vyZ`^^_5}L%ipaxf zs4w@!E6EeL=naDzm&8`g zJN^uS%6C1+J;d*2V-%EXXt=hI-w#Lha^rnEXl~+GMa1p#a?l?no|_s@oxoQZ&HeO$ zw5OA;65_ftPW$L0e|{d^hd7K8b$fOm##!)nTE|@PgqLE#?e$}(8SHb3{A|z?{c0-i z7x(mdaaBV+cQHnD6Q9g8sN1))UsDa&?M7N5-|ThA*Xz)3JSWD{ey?N=?Ni)m&ZAEL zH(@_^4c2Q;J9UcfCLRT``^FMCARk7G>-uXnH-4teBmSp3j;+X3-@qSxz2Ad6=frv1 z6x!z(ar-KUaeq(j$KIrUc(H#Rf6&~Fi`y0Z>RRk?E>}P2p#J+ghk}|L|J#dor?$uW zk1zY9CGDf1B9otEJ-L&7sqlXkdGZgxp9?fMc|J(&)7E-CTgAmW-Vy2q#q(E1ZbUxB zCZO(Nwkp-wa5FBs{pXzB$<>%5UaxF?22e+hh0aav^L*N`l-G%xoB1B(_n44HN>$hb z9?OOJ>_+qIC+h4Jb?<`arp`EG-MOk2{0~j^$L%KaPet8(K%aLRf8=@Ey|mve>gq)D z;92O~>zdce7YqFj7#<*%#T*zR0$U4N@Se=u>A=PJ3zfQP?Fg3qBp zsx|uM)JC1R_mRtMZu&Jvtk>;mALV^*>=KnKeguAY74zjTPbXWA6zl8^>c_;o@PX!L zzN?+cXIsY(P$w$tOo2A=Keor8S9J~7Iw5{e(=4PIT#Xfd4d0TO={xWq=h$AU`H86x$7iB${~d=)!#VDII8T{}-Hg4CXL2** za|{3JTbi43oFc~Yd$ybY#vg~^UC5I`VjTaVy*t`(pVbcf2~p4gZULRl6PTgJxleGl zy{VI5iTZpW`5tj@JdOMZF}?}%__NqA-Om0dH8f!}p`Uq*h%&9}Xl~+}5bJeUk7ud$WxmUPkYYrA$f2MW&t1X zQya)5B2SJzhB)6TuKP~VKKwECS1@nOv`4=(Z-MK_0K89g%}u`|VjO#WTwj-oIy{a# z2{Dgu?~iy+7yIWoY2Q$c?>7fwzgh4U?NfYC+pZ)1Cc?hD$j^^gAP%t%b|&_@?gP|m zBmBv)FKkU7I^vvp#4hNRm32}dWSMo-b+8UrW89ijC(;n-8v*7|dvbRg>V{q4@6p`E zxx2`p@#L+kQHU#Wf;=!pKt#JNX3&5b`x#q%m%X`d9&F^(bc zDeCHC@`O0AOHqHM$g7hc&r+X=yqfbF=i>-WxE`F>r8`}@UqQ{yd{2sb-NV@HdgzQq zJ?uiAMV?ME)kEaNm*nxIr~`H#-%Y+t?1yu9M%>PceOh(ROL@W@Uy%N3068qIbv>z(wMVD;o&k^-}L|KfZ{QkvMPhWq3M4U4$BcCGfpKfBiBSgD* z@SHsJF!H1`*TIvXPL?_?{4af*>FF-c+eX-c%*=nn(V?SA))qa2erhQ6` zdsbKUEB2TFe5r}%rrjE%-9EH`RqPWMmPb70_ev&GCn5H45niWcI-^~Czj!I_+!3)!JiC&zW~uzs^lr~)EF!v9hlEew7sb(!JWunUS6w8i(p?s ztb-k`eJ{U1BgkipJXx%{dA@h#7g%9yFrN<%$f+EarQ$!>l^1{U19g=6e&t2-$bR_0 zlO0RzLg&@PzSu`C!?aP(?WSG*{J+SPn>07}i7!#F__GbFFYPm8A3K-4yS$H2-c+nR zzfj*5`^F4;>Q~gm(~LvDJK$$RT%Xp|-1w<(M4at?y;h!mmRct2&%Lxy{*1ub`(;m% zr-I=6F)i;ii#)Ii6VdY4-!gx$hkYH|zrl7BVqQG+1?)c*>-9$JcNY0`g8UXSk4oH$ zdDmFve+$jM@hb1n^M14+Dg60BpC_C8CeNiiM8Q87emeR=R%0J(W> zt$uGa+pQw@1DnW?iTy@KbK}2L+wXtb?ilyEVx4NPxi{`#`{&nP9%s^A_QyC+M}L1- zJ0h=sG2A@45XW^5%YgdT)7O0+fp#x&+{^Yr9HQUA(#GLB&5fTU#lE@+xibhl zqq(k4B!6Gz!)xTRn(&9qg8JBSy$*)>euif3^H$BxyiSXA;{rXwU9s<7@gByvz3{W1 zw!hMPeH(QWVn6(dXJ1Uo?|IGf?6XuvGc`AH3yFI59(i}s-)$b(`yA1)cgDj1`C`BH z$v?MsPq|BU+Yh`ilLen8Blym!H$Kw0eb+pxbCH8=a2wqhUBg7)#h5l?%a-j6&e zz909P<_-K(EfFCZaG$S<4;(e!z`kG`Yptv zI=ZJ;k%vCSy5E%X*`|3#y)T-w9{V4MyhIrKGem!{(cHu*7Q}k=FzxT5ePLl==n0I= zjbh$SF*-VL!+c)-5!UCo$y4IFoxftxiSv8YcAnnfg5xXVoT5K334eYkA0w_)Douob z@GL6-?ZExyZSgfbHABX+7VjlIQe&RmlKSoWd@7ltj z_e6brhW3FL*k|g;mb}j*&CNa`Il{kB__P&tnu$6#WdeAhA^KZ`b>^RvxNcf4@^JPG z(4Q;z)t}Ly-~_CjH5s?>$XzjxXUG$LzHT(f{ie>?KPP@dzn-U#qtDqK{`cj7w9wq- zk34_tLms`xKd&c}zap+Hmuhb2Q9|UycJgv!-BEYzIG8%03-gG}rn*6M<4?fBbwPE; zvm1GAB)EP5Mxk?vzxoE(-Fi9mK0|0PzyE&vS;T*qi2o#Gul)%;4u85aNN;Iw@-Qj# zaI43&R0}aLa^8bDL`40srn%|YQ(}I#BTv;rN9}!t0iKTjKEj;0Jx}aaRh0ILER2ht z@2}B5DbD3K(mtkOZ{LT1hTQFmcJ24$TFpazx`_Cknt?dKAjZAGy^Pyztk+{1x1iy= zzri#9I?#^xQSN6t(*Eu+^tX!n@+QxFzZ2(a=XJuHd3s9lnASIW*i_W>e)XaMqNtxM zX&)5%xtIQjR-vBgV?FPae*pRwWn$(h&(hq~|3RYux2AnAQ8(@-kMu$OuVUVg)7<1+ zTd}WLLOxPFukrhsv6J`=49k=gn-lv*Ehk*F@ev zpt;H03!-k!rM+6|-*2oYcN(H!_Wr^)@^lpZdFIuoB8YQPtox^EA8m~lvoPyzzWd;3 z@3_Dz`Ttz@M}69-c|Uq7<8YYIOUECAKP)$DZk%x|2;Kr^LbaeyK#WUo&CT~) z-4{_0DX&J;ev`xkW-eC+YdI>i6{f%c&fadlZ6=DZ(_c${SE%O7tmijziQL|c~O@-lZV7P!x+s?p8P1**|%t)EaYFWx6yur zsE7a1KJzlh_i6U`>LKv|U6G$JzruKai2b&Ge(wftZ~Qqe{CR*n;S#uhnN9ttX@6Lp zZ>*%f!*h}`9N=x_hs5~)MII}Qaa_*4EjQHoldV>Xb+EbSX5NJc!ykLUuZL%^?^lZJ zyYaMdF0RWKQh$o5!%CkAntCYDGyCW|Y`Cod>)CD#asK}++l`9zlfTKw2!E;#L%-zr z8Cz&>;?TXV|M|>5w9oK;4sUT>MjNi{s>AmKw;-QQ``8nRTV3*P+=n}LFd?4g{C$l& zF}`Q1Htm0T%s`NVAbq1opL#XqYwl{g05$k?-1pQ6&c?Ni;)UD*P zu^7kesNb7BI1?T1$N64O*D*7{WW9Y*+nei)fc`)8sYIP+)QO1mitU;kKa;}Ge`p{6 z4*Bo|b&8IF{b7+;ukn6RxIV^3KaTEw8qz)_?pt;Dc$UhDb^kGIFV3lQ@*Lnkv0lvA z_GVtR5%pmWx!VEj&J_CJ>q*3|wzw|d;@Q*avOjiHCwd<7wBx>p&oloi_J_Y|dmHo1 zWK@9%kk89Re;a6S{LhH*t+%5624O#dytml5Pos{TK_1@E#wQ;_fA13US?Jkc?jinr zHT4&Zd3SIt*1_ad=yzZq9%j3-(VSmgza|vLIe=n;96|fM52C-Zda$?kr-J4t56g*j z?`E`@@5k$DxXyDoiR-V@YN4gYdte<|c2`;<=zd6yi2m=-*EJ z0V1AL$m8PsjPH`WzoP!!#Q1zco|%RGvCj|hB2VQ+{jtxb{K#{m%->jl!_+xr?aQG) z%wvBG>w=FKX~;hwYKMNs529UrUozXXFQ!U~b?^rAeWJg84cFt6I)&?_TGXFK`^0KjgFwdzlr+%y|LGEi}Cx#m1&=Q zB>c>X?_1R*k3Ns*&G;I3)r>sG@AVYmI@O6hE#99qfZXkc1ktw%yw4cTO`HdbI=tB9 z`Z+PNK5nE=xIM=RnizN_I{ zCvy^cHH3Vv=El#~Vq6YT=LK-JkD*=XJnH`)^uH>3<`MW~>sWKm zO}mXn9uA^?_;vq2_9@z55Z6=g!|-RbSod$}fcV4$$e&{s(c#t94`%!8=OOAx#J;-S zX6OgzA;9)`g$n2e!o)Lh1o6Cs@hrF-_Nn9k>)AEEz{3wg=ULjfp-yBJbU2Lae$CB# zcTU{bzN#zoUp~+CjM35a@jFpZ-Xl+oeckwX*snc)KljjHo*(Aa7oJ96ey^dN=4Kp^ ziR;$uX)oWy)1SP9Sf?g>oI$zlk2%!;QRK;QQxS*E3-G@+>+@Rb$HaBSNweN*|K<9% zkM?2l-q*lb^sBq*R}0Ne9HQcT0bz1Syl=VlUc`C4Sns;&3koluTT#!yW!)Rr6?q$3 zjJk9a>+lq#uk$U;_s>sbjP~dQQq!*;Vtsjs{=~1xJgUR}&wBEJ_&!wGqli!7D>P{D z;~%BHysuP5U*{VC11k{!s*Hav^7M7cWPAR0ljbH*N{RWqegyoVD9(i*qK?}I{@dpw zrjbXhq0Y2qy9+#iS>o_Nm(xD-oxh%JC70Lfdvn7dSM1wQXnQjs!(tsQ{RH|oLF7qu z%}soA$Z-#0d{rLoBJSk4^rC%cjNi|DFJfHcuOpuJeM;lJcJ+CVIB$8?=;%C&?nXjQ zWgIqAKPdK%zmqFb&x`7Pqw!zv8yk_!=Zm_N%lH26%pji59{BIlpZjSacoMuggz-kpFCpSX+XRVv^M(FFF;h?6ftc5P%thTm`*vcUPT+jG zS;XNkZEwc0hIs$aH0mr9=csR!yFdH=+)N(35A$8$7V$p68E)3!saQ81U{!NGcr<|V zvfoD=V7TsAe3V~*DtUS%;t-|&3!fl=qQkLIm`wdwXrEiuht-;!{su+f9`(3>u3qdb zicEk%k;y1v)u~@wbEA_I&vOp&c$Qi$>SyX2_?bBlop!8;&r>He(0|UkitWb5`dBd+ z#yxrz0{XF4@3Yd5b> z+)o}7-(Mc0?>iLN&)G)*!3n3scAxX~_5BfX-|7SEIO2B!_ANskI*NVNHrgl3V%}|M zoQw8F{N?jG8QRBoV13uGzwkaeCNU5BUX2wA+&H=AMjk+%NWN4K+9OE+h7z z{mH|_{PS_Lr=!33Hw0I3-2SM1l@Mq79_IHw9XfH@A6bPkj%~#_{$lKP-AHZ0`gkM% zO^zw>^I5Skt!%idGvfKoWKrm6c%ERNZ*M`J5u#4^*WBcJZn008Li?CFCs{%MAF+S< zfjq*x{TTh8J0l_Pid`{Un&JUJVAUWWO3o8dYRQGO3dZ)3dA zS$$4o){B%lCz(Z^^zEqI_POh~G&gZrDz1yaqkf3r??cs6>Ns`eKEFphv@5^=m}eUL z8xrr=s!yI*#4|)L-|zI0=El$EqTVj1eJmd`vnlJq_HUV=S>O)iR#fjBO?>1&`D5xN zcOcG7aG9#U_uAFZ{fhj*K>KqduPRK3pCd*6tX>W6%J(GSpzXc$fBx<*R(YkK)ZCk= z;(LP6lXnntTSeYktb^OhV|?JNG2@WY+{8hNbJXH9&~ATmo^!Z8=2uvJkF1Gj&*Z!8 zj}DrfIvElBsNu%m%=hnb{_q|D%{bY}eILsB z6BG9BG&gaU_ow=M_ImB&`{A3?&jt4(ZvS;(p3iSY8X({7{gg?bj=paz=GRj4n5Yk% z$@hzW>ED_gKh>XD$0yLAA~V4gTamZ+9JmI#eBW$G!%h9`RmV0^3;=l zK58KHAu94=C+#z5{Pw@{z5220;P#v<$J3ZEb>upwx#@3!&+}V9TWv$TBgMYuL@SJo ze1FB=)E^`CCmDWOzS{qs=h^Fhvbe7Nf;=Ynfyc>LiRbRt?}4B3XZ>}%SPcEj5_Mzj zbl7hb>tj&cd;3q3w|7vdq_~gp73^|5OZyMSKBTRK z_{-n3sPGK>8_kCiyn*$nq2{KZKP1jMZ>N2n4>IdxaPKpg_8r9jcB#j+)gbX4#U|>c zMq-6+&o2K;9&UztbTjq;G+fV%^cY;f*yk>S&%*!UdW_>;^#5k^lVX1|SaZ{_w&J{f ze|6}nZ&85eWvqy>}Vn6n|=S) zENg!n>x(@Pe3LvW-ru;1JTBf>vrls~E`!9p%ljPXqlj}IkL&9-aerjfB#e8wKk`K1 zhVVYKc>a(o1V3*i@1b=}{JV+$$yn+S67{yz^BBh|Vty?$Iy#<#w=urgqgi!E7YehV zk@w5iu-)hu|9Yf~;C^@LIG)G8NS%YUPx4%=9eF|RkMTcT6gnmFhpI;IUc@{a&xNW9 zx%B@I@`yOE9&2?z#160u=iTaJh;ybs@}WHA`2y`jQ8@A-^CwBZK*a5Uwaq}Q$?y7`7&o_B1?+fhJ_NHG!(XYJo;OBX<|Cw?a@qAv4S54Z> z=j8VdhJ8F2#!GMSy-#0bulpJY z;n`=Yb)x>4dBL=+f5$|uBR6X9%}4Rv_yF>I_QHRAe{(ds{65QzNe@e`wgL+<@IETc1-%I;&HRSUJj{DCQkq?u^{$Vz+cjR-+N2wF&g#DGxlj1KS z4vob)HrCvXSLj!)7oW2Z%;)!F(%+!&O`|_;X&*j{bFFu1-eE1nzz(nTyQcH7_x2wdy`q=$w zS3WP=*|XQr>x%na4^ZcrJfHE}r4yI^@x{OJjK{VA;{Al>UxEMfcc2=Q$HepGk939q z^1T_owY}-@J))jWqfUg+McChGTtuEaihaBNe(pQu&RXQNeShZHj737J>{q<)Xd3Xi5 z-H%=H^mUyP?;)wR68@*ezN_z9aQU9kste&ydJtTur zDF&qwCWR19l*&gMTcYT9?)!P}@6|k?@8|u8$EWcpMw0sf6$IAIlgon2zos?bcE5n zcFangaG)v5`K9CynD6*`Wn1#kao<7*%Grx}T*lL3#M1>B6lQrrF#iSczenuq9?~c8 zho3){{O1#o$UdTPi03+@zW8qtZ1H$gw98G@LyyVOe|{b8RZxBms7>^#Wt?~`BW z=&ikSYs&r7x8Fd|HKbiOSe)$ISL5eD$tQLW`mfhd^=DAu2~w{XA#V5diu{)u9?CNS z<6~6@h(jIj>NOE@k8Brr+(aDME*J9|5b=r34UJ(4*+R{;OYxeFTDq;>Kw>Z zYKVAy7ww@oalNNv{QJ;z_dfh_$E;7!}G&~%y zMV_U^(-MDfCZFxX=WxqgIzDq`9@?JsP|ag>Gx7gdgzv-kId1dDJ(Ee<}L}z9wFf{nGz-g}v$hpL zPsw<9i{VZWTg6XKCti~Cp36f%7GKG@_9yA{|AArpI3YcNcK#JK?BnXXb5U;Urt)#E zfvr0@ed@Z&CiXkM@2iXPas6e4*zIt~-`Qac_<<$t7t`&*3&;OL$(zj}ef~Y<6a2lM zONl410G|hG&)W=le6kW(SF~}**6_n#e!$9N7DyJ&*o3gVZFoOcs1 z@IHKhZgDzs9q$&0IECKpr|>`UAIT>v@B37l2Yp6)&JLqS5S-$0t5@b%w4?7w7ZERt z{oHPN*k1-g&z^n~>0>gFewlcj?@_L!Uv0e@eBvEZZWE5PD?|FdD#|}@Hr%yKQpT5q zUPQfui_pHulfLagu-n+NknmLUZ|dl+zQu;XQ>5Q%_V4PY_TSa$9UdDBjrsZxB%h?z z_d()undiP?xU=)6GERMD9nJAyDtV!=Lq7klhrh@_&-XE#lH|x7_^*(D6gS-Uqr^Dq zr#9&ie-Y)D4n~dqe$H!*-pP}e{RX2QpZ^vom=xj`2TEM@67k2yPku_ga8bFv?Is?T z{b{vcLVInIc|ix_Mako}2kWI1pj zmwplA|E-8$NS_fs)OZ>4>pSCZ40rZ0U*hV^Nk2fw$MM7?zm)siuJ3?f zkaigs;fQDib_BF%y6f-K=zaWOS~lK^-g^i^~&%*oYt)G(PyDu zs!3jDkfS&LF`lnKk*3=6I>@8N#fo-@wyU6 z6&)Y5pMd-SN3mWFUWc5yE*QAZCjT=GclAn3y@tMmc8Rw`#~RWfCwX}mmHX`%N#9BO z<0qs~iu`{X?$&qWD-gN){bR>l!q(Ym>H>JG9n5z%Bd+g#Jk}lURp7n_zs^$gG2r`1 z9C(583F{@}^>FepOhDjB^ht?h=e~t@De(OufA3j^ zMYQv$U3{OSg3{0XrjcIHaV!k^M}ovd$diyw@QZDDaN}L-)pGy*)hgKA_2S3g zBL67&&7Mg{>xe%q`KTI<6W$g*>>~Z=!hicNl$$sT^-7X|)FzTnKj|mYzIEANJuU{l z-dEh~THtzr)ViO5$0wk^c1?8nbteDf^{|I-EVn=L6yHtr+M8&&vxi|~55*49=N+rCk>$?(dNuOap)~{=SI~(#u#E)GV(zCF= zeuf(E#>cqaPcqXSl(Ul`Wc}!2mK&9KH|7)HDfx}HK2Kcz?OVjJ5tt9U< zv}=!Y-w{97ne_P;i2CYL*5S=TAJm0^^Lh9r>C=+`8B6>j;Xj9XVk^c4TYd_^s$ZjC z?@7OVmGr*}en$fI`aa8Aqj!2Ji5~t5@tQ$Y;^{(hJN4mbOZ zyaM~I#Bt|A!(F_Q>j8Pjv)s2ypBxJO1>*l9|19TOX#F6VYOxM>|2wXC^ppB-iog!ri9OsJ^0#*trQM&K4movyRF{>& z?~s0%C7-;kBh>GUa#KqXpI1ZJ6uf8j&hI@b{dCeA@Q)r=K3@M!`n1fuk9`k((%fI_ z^>8NfSPS?upSQe>cy3F1{4;{MzJD>paMv#aiRa(oeHVYo`0^(CBxL{a_r!k^`+w+M z)K}lh+J8Cfm3bF>t4e#QWw^74lH`SYl776j`%NLe$uH|ES>i=$_xB8U_F0mA$T#Gl z(eqP0|K45d^=rt#W{{A6efSEim-GM3bNW1RD~DUTo5b%u(+BpGmVF4FY{AsYnUwYG zB>7|{ZyEg(^{OHKC)5T0A8E(2lrzx{@u8n5&LjVMV*j7`a@UlPn>&c>cv0o6Hswqnj&jdq`z|D&*@|($9oz9^ z;!&CX~>HQ&+OJ;@DH<@X_cN%}y}?Y?RY=&qlp3+3(jJ=-f-hzS zcls>IIC$_UkUx;TQ&Yno{aW!?eMldXcg-f;h4$5Z2_}#}CHKKT;cDL4MbMimHYrVwwy&~jq`8tV{Uz~_` z(evGRk$+Uii)Xz&a$jQeTVYp0W%v_bhZnp}dd-_{AYNcR;LnX7^r^{X@lSCN#;@9} zS7*aRJxIG>?{K5n`x$zVLA~_8n!CuSa7MY`n{BxBR|&}vr1!@@jm2VDHw*`Vy|3~u z@{dUV|7YSEY4>ldKyRhK@F!jmN3DiD&BTAk4R?AdaX*!%eZsHJCE#X+|?^H zwS3%PcplHiTn0OTllFWu=?je@k6-V&&f(5}xGr-I#0>5yz0R9*hC6wBN4(Xaj)^09fM0*ahhdBT7UOyuZcjMGl$zwc5KJ&!?yc^P6eoWT0 zQs+a@Bi_c26hAI+B>$+4g9qCD)agyl-O0=_LpMRMmp8gm8=xX+_F~pO%miys3 zhC4m9l>M*S;0SKCdSJujCV^5YNg!rENQ) z&nJY>0@9BZJKsROFc==m(vsn~op@?GT52cp!`4C0jO-_DYPi!+O7>Co3UQ0O#DDJW z!hO^Spj{@zOoK7xA6-yxS5K3FMDqWq)I)s>zn~wL*uEc=Pw{1Vss{9jTgYdG@HzAw z$lqJ$%S{Y-?NXBUpbJUgS=PmFC4FAvoF_<>XIEUbHpw_=)iIH?e)MAf9F%;`{IIW)F_P+Tq=#4_2Zd`TWC+hC4e? zh@F4y>7~E#bhz_B&A^A|5Ul+drvn6Uy%G}GCGuby!5GqH6z)m>KNFA0JJ;WSv~QS?icdv65G8%p?;U^JA0_^| zh2gHf0-hUcM*2>q&qzGhE)IRBm%y(4dEranfc@mp1@70iuXFsZ9iz7({%J@*Gh-3> z#ARR8Se}1ObDzVtwA*Qvr=`pv-!k0Sk)nq`Uy*(V@4F+LV2_i>>Z|)?q8owhKHJd` zqh9@GeD6s568B^KeQ4Ji?%FXfe&DQ`sIQ){pGf-7;(z87pCk6LiRA{L!9VzU{b8HX zzA?$OH8I@PH*p){_SRI=sV_nv-RIvvC`JZ+VdP`mW{6 z#6Oid;dA1V$Kgr5oD);t&Y}MyG_2oQ?vpYfsj(UL%6@_RdO7c`4*dre;RpOV_Zu9& z)l1*anQXZ8V>vmGGmrF@KvGMS`^*@j^x)c2UdckY94&wOey2&ErTt7@ObYrujPb+ShC9F1K>GFIkdN8b+vRzKbDBZ^ zrc!Q`BYs?o0G_Yfy9$9lmCGd?;T$od}4gB?R8e=bJ9mEqjnuRZhmKYt^clW z@E7TGGF}|L7456z;2+}D=V3pgU&mw} z?Nq~EJI<1M^d-cP6F+==$jA17%J}#g`A3ES%RDEZV_t417(bsZ}@#3HGYPkKa~7@8{%EWZ(MG;^TR7-o_+`MwGszDO+3fE z6U7WZC;!-MkY_soqWR6}cX!FWX}hDh`sObJ{hid$5!~O>LhPaLcGRo1KkU38hlkUN z7ka?YRHS~!4nsTY`(?dIpXPf;K3@IwH^}*(*yr_jAkK}O$;Pk;OTUNTK=R4S{*%eX ze~@wNvqq4obT{~PWqlVJz3X>Hv7d$gQ0~2w&-{_}ZN*<5ViUTs9c6z}Yr|c?i%EXz zQsV7J&!dPJhr`}}WPKlSxV2ZI4#x2tDE~&%rzCHD@Gp=jDf>EN#4Ac(>$5LW-(pYr zlczD91l>tLN6u@sSq}OR5}yw|9@CfXrCF`|-{G+0`FG(NNg1xmT zeaZ8e^XXNs!@6<{qsqs}6N&3RLY;{hPk}x7I5X*R({qaZb+4nI?;(Az1@v<=<(Wl1 znSf(!MSQ;DQU2S#e+s0JR>8P1g@3t?cu%w9vcs*u#Vznx4XL-w40ru5DtXA;$VbnA%_hED;=@Qw z$dmqs_Cx;flV11pEVc=?v$tpg`s`2o>eqvhzF+(u`RG2A1A3z$<#?}ke~yoTkv=YY z*JJ;HKC4Ll+=+OO`@X!LTtK|=6zt0H4_Va(`Re3u$nX9C^L#HO`8@30?~A*ReDWQU zznVfjzvV5|SI-@cG-Kzr*=JTCk0#u1M`3;H3XpBwV85v<^SVt$={ZHU(l zA~LS+3UPa{MBQRrFkBYn=%o8Hnr;BUFjF&KU(=##b4->;)T z*}(I^3nc!0mwcv3ytGRB+`Tlza@zR@UFF(%S zZn(3bni7va8o|DubPx2e%e*~@^hX4RcWZUEyzr>)UD{TFvYehah1uM6>D9s1oe@*ilpt5;jeQ%!R8R&Iv(r;Q=~ z2jr8J_2{38>-oWd7eUVCaA?54lYZt|u!mPzf~qfIjs-+@C`}c7KlKH)`xbeJ4o0S`#lwz4{T?cNIqwzh3;_ z6U5VbILMFbnErD$;<{1`G+;d%?;_GCm{ zv9`a(>9d;Te>xfN`dxlB1gt{)+4>apnUi}0uOhwflNlZIw>*Qy?XwMccAlahynpU_ zJNWB+mrKZJ#C>%_4a}h)zGb=k4)|{3rT4(OGwrt8K2|U57s0ofX!>=BR>adcz^@J? z|63hya_Tz~GYt>@hUo3h5V!oc#4Sbg(R2Fy+P-?nU+>{O%5cX&BmCQw{zRGo9zP9w z)BDw1wgz5N#*xYq=s%x8q-t!#?^^QLeg5|mFY+Dj zKj(GC^?l3-J-xhJF`sx&&XFxR1@`c#%)8$wy}nobqv1~eg5+Im?T>a$wu0aG@0T@q zxY>i=mpGF2PfFZ7i+Ei2DZN9yxzPV$xRWO?`SywyS3A3k^By5T-ZdnisD`-cG3xmo z!yTWBl3yB2`qane`H<Go=4ku*8egTP%%!L@ynj z>Ts)9p)KsnpO5Ql^HXPsI=`NOGVpi->tcTW{Tl8^Eu4Y&YQp}W{22CJ=m-Ai67O#1 zy8c@d`EL$!yXQyxMPy9~bEmkf9MX(n;V_qI;z+C|q-Kl~MX zPM?N2?Ibi$@CEt5De+;we?i|^{NXOrr~ATtd{32Et_1tZJc)TNzj zQxf0yln(a&W@@7i~T*ynAO zCnEmpG2;3z?NZ{`$oTt@#V6r7BJs)3q>u4F|I;Yv&z7eR=_OBF;b7=T-zV+C`N&gZ zS1la9=^A$Ck^mb2$#4T4F?(|ct z4gP+m7wx`6{9$ky z>a{@DRT~-ZPj zvbRXD@BFSM9=jF&(dQ4h8SeUfAor~9Z~GaXT_q*IeWKy6zNw+$}Q5?>hdIWAZr_WX_KBj*8!as4Y_6Z}); z^E>HN%P?;Gclr*i3V9}p|2fs+u3z)~`-kN7Jn7@-AU?5SBK+Pq-05MZ)b|(i2|h%< z29eK^hl75%{ag3&uakQP6-ihLrKFz$EY zxIcd&-Cwo4!Z+4-_ zxz1v055MniLzgQz_X+I0Kk+X}AAcNn(v$dOCDb>``QypNw}A(Do4V87E656 z$#7S0p85RSIG*+<{*;W%qeDLS4xsp@*@nAuEzWTbtrG+b$Y;IynXeolyKkYT+_$i= zoeOaC+$`%0wTb6tK7Q3;*iYeiw3JOh!>|v=-u=t+dZ7cHqL%|4)8Obx0i0eI;m5zoy*(=KZ=gEdU|C19xpCG@GUREPV}9EBQ4(; z>R9JACwM=sDFD@;{GoGw4hDn9O(XG(7Yh za&B%R>8Hwg`gMrc4Duq+KF5O3Z!%B3r_H`Wy`WmqnR-O;2!i8{KD0yG4{#>=6y(0R zfy7H!p&kAHgf#J^C13Zr=Oc0T3gYXeUH&AVZUg@QJ&s!3AGk{9Uk4sXJMRd8QiuMb z%|hru%XfCttamF%Z}$I)*!d;oldgsFVhHJPCmtUI|I>l^9P%kKq1%a$V-N2;JxJ=c znDnWo<@2l}@dDQweLnWU;~{5diO)|WUOXJ}%sTd??!@y=fP4ENZn*Q4BV=5DZ8-Gv zgp4E8Js+Mg_IwsI@04E$dwvRGO|X*uw_HEqLwvE&KjGvt{~7#=c87HZ z!51OD#Zj4gp(Xf!v~MkxyFmKmJB*{!VIvxgesJom`j zkS902yxm9N1^FvWzi8*^P0yJ(q31g&&sByyyUob_eG>V{WPj-*;+btI*Y~4M#C3nj z0d*kfGMT@(vVp1UzE;;59SP;BNBWrLS9=-mJt%*B!(F>1<$l5>>5CGl-Az3558{)K)Y}Z=xu?;O-XQ*p#}}5%IdUq> z{YU)mkB_3gzLN3!Yx22L@Lh&Gds`s=;y9bAx_*@W6`m?id3L`E{(7(VK+?xgf*lSZ z{dmJ2|E%PT<~e%PTly2!%jXGKkx%AJ^k1J(IJmy!W9Qjretojxj?Vy@k8~rRX3Hi*B_+%{cL&V><FJ`&PcID&F55)6we&MhNkpCf( zzqR46zVpT3_91Q6`PhC@X~!3c=cK-C$fwBty?&o_k$9RL5WM~Dcaq6tb{psY znLeI8)o^Er6-7UNL)_krmwERCj*rzVChHVSLi%Ha?7!H5$Z7@elm29h1Kclpmi?hWoR3-oOz-g}z-b9a~fpN|}Fc9>{}am4$LlShKj5b?LW$mes3hoj8f zr)Au%8H2s$W#0YXHQ=A(`dWS3|C4>ujzz|Ayk06e)A)q;!*eATmW1EM#M9CrM-xx{ zj1Cl`LC+wbI}zg@rv<^Q#AC95axL)`&m;SB_9x;c*`E+O1$J9a<~7X>ck;KFcJD>{ zHR8`lgt+BHq@PYFpBUexJc)XHf%F*}cRnHi-qIg`As>A=;p@lIE6;1_?O_L_o2PT za?>0KJClC3$7Nk(56f*N<81v?U48%iJ14|V9>y)_bGmYk;ZFYEB7dKO&}Us4kEW1M zUgm2{JpX>k!!)3QUh*31tM92@J{SC>d!Wyo*j}gK4f^~PFtBub__h5C^qr)iu4K8H zzfkKm>-7!s^j7qvVeCi08}7!n*c&L&$5&OF!A^qF<$k6W@wX&T)z|PU=EtTkN1Wi} zkh??N_UDK_KTkd{$hiLr@uIvhT(JN>=zY19DnNeShxrG~Ey=vBhb4SmeXkY2TH`d- zH@O-0-9tThFx=TgTKe4p(#N-;eJfL+!$=>I@osjATi!#)-?zypdI#FQ8{7RW;%|za z`!uJVjMMx)y^-NA9+)8epw1_KVKn-k-{;n!c;rCHZ^skDuYUyk(RJZq5GPD@`y9=!*z4(XT6 zc-N7*zB_Q4!_8k6xn6ud)Dx6G0)M?Xd#uqrI|*dGcs0b${-wTOk$%3|)&4C}uXIz) zyZ!oF)&Gx|&$CV=ex0mu4kBKhTAn9)fOuB?RkbCkm%it-nt76PW#To|pz4v><)39{Jk?N#A=V^rr6)Txs;KUTY-J zJkD^p?;<-K^DG~4WW78**LE5CzeYU%4aUJMssFc$=jGhl55x($I~C+B|B-!FFbrk_hCP8b!^R|%qD;bc0^JeW&=qWAwlMm~Y$|CbTh`Pw(ckCpb_ zO}unF+RLvO9CJG4j7yvx4{=szg_R zcCP!h|Cx+-KT_)TCHZH0kHMAX^IIs7y;~&f&c}B`y>i@t+m!UDJP7`=Wr!0lr=36l z7jQjC-`4mzJq(b1#V!3I|GN?wwc+{JOhfRmME*0nfWGi0=9T9W?;G;Bbv;=J8AJKg zGOo>~JflROPf4GZJkM70&&v8&zCTi+vt`=~U=py6CN7^iIzinZN9F7Ua}-GoyFoWhgua@tC zew*ZDXOVwY=FxAFPfq;p55%K~A-<|f``;bnto&X-RXU@+DvF&qH{9tV|3|sszBHt_ z{pYgp?mqHKOZ@*D`MfOg{K`vE-{?8uZ{bt;eNFm;l)KM4kTW6t8yOysJG?inE!(Aa zNN@g1?sL1G^pVEMGx)sFP|xQF=*|0$p>_|RYe&7WukQDdKhJmBEL;!2(e@7={lOBq z+)sH*vd;Sw%gr-BLFqy8CGi=;XSbL07Q{BGz$KQ>!{V{HCCjBXP-<{*H_wr4oJo&lM|D#Bk2h)kG z-_8+FU4w?LNChn;9=`^9SV(*W@p@u!6}mzXrQzlARg`!_@;0XtkIA^!#pA=^vG=gt zUc{3F5l8v^a%=Aoz3F-3aR&g`^R_n_ALmaxi``BMal5ZT{OYWWq32g5kMtJ#6lHzn z=?W}Y&Vz6E^2!ViKXen?^C09_Me`GhMGzIcjCv2-ah#f`q?dhc-TY0)7)n@ ziFSVEx!_-T9rk|=ICW)sg%gZ+1BxeM&RGS|QK zUbQ7g@ATh5^tp+Ag0;|(&(j`e{>temkaL}pK#B z{651K=Ru!YvHxR@-s!op0s3cm4_bRZ=K{C%Y4}~Z1AO$}vx`Wt@AcelxT|km>O0%f zoBrd+fqxU~KOfTDdXVIKHadEfGqo9U%hw1WgI_{=dlyf}ok#-oW5u7JM*K9H7hFm_ zeGmLw1J-vW@nArCobart|FRrk?dfHI*FLu4*6BIg5d5o?|35a~IXo-l-Sdrr>wbnE zzTA1xn+*ry*KR5J?=SP;Eq97Pzi8!bK z3FP8Yf#RcR)1bX<9_3CPPIIod@aXsnZ7dxLE(wm=@e)lTrO@eQ{DpDE)-#}|R;--DjnZGsP3ZVic_OJTWWy4TMkJ)!5sDA-$u zf7i<4W^a1V{Zir?nJ3<1xYJKo=6w_GK$GiV>3WdUugkwiK654Ip46TjV$_*$9wO?imrc0o@(mG&^+=$(E_ThNX+9E4x| zD%3X;MSbhj{&TZ|N8bVN-}`u+N^ zzT@mi*Od;x2zJt0&g-=Z@tVOp@kIAf7l=zRv$E^#LdY0><`o*a4VG<9wCLX)K+#W6`o}UGL9r;fn zo;?%oJB@PAG(4Oa$bPnWNME`Kam&Yb&@i8qK9F|5>_c`p}$APWqqyHu!Lj15F z<@tyF39U zBoA{*h}*rjGT%%SPYV9H;ZDzgNPcoqb+lt5Uhd!Wq)!fmoqK=vMaaKq@Vn&C|MK*= zqrdq6Uhy)N8*dN$98CXH#c*ezdBy`7r1^plhC9DhkUU-=@=4x_c5Kgn9ryZ|eQ0CJ zzbJXa+wKGZ%f!#m3F&SBxx_Oc5Z_PQW$qmCxl`uLe^bsV?+5eaOSBK#cct*3cLel5 zPUPtv(%bnRk-s;c;G&)@R7s^h<`i7;U-Ve1M=KLd2TS=_1~ouFa35S>NQgO z%PjH_WdHC|;_1I&P;uJTH{_p{yz8#I(0?827q4Ff{9`G1-@cG@owQ>;!<`;dOVE$1 zvD|MrLjHcjKTi6fKMeUF>YLpvgDHlG z{z2Bi7LY#0{*Kk~Ab4mGzG&ao~w1zj^|v!`R^daw?{Gn z`kMR)h<&Dyg?_4vf9UcQ+PAs1<33kH4{b%xhK7fBF8PF>A-&y0CH|^YFO-{Gj($;_ zetQi0-z($Dv*e$94&#WAuU3$Lf!OCyEVm^4${O8{dNmWjTH`9ztFzRrjo}!f_HL~p z=oaGEzOop+jJrfn}I z9vfU9&(!OOc8T!*{4T6UOX9CfyI*9u^S6sd4nQlWBf-C6HlE9`+1u6{d+yyOW(JB!O@%F z%gh2FKVBdCAoP~!eRTU#4=LR{bP>rOm&ChYc2w)^$O z3;SUld64qlPCW7zG<+NV_B7&pkLAxzptmv7UT3`rJk|p3)r93f$?;n6Cx6qI%lO~V z@9L+Z&woY#n@Jz73;RTL8U%CNfnN8m9ds@9_Pg+DY`F7>jU+zoLHYvs!TNQgn@PV` z=pQA%LdM@k;jRwS%lE*lYctZT@jfRKu%q_62{iN`l$}z_P z^wCElzt1ylCH)8)*9Nvgzj#*c@Nio=h@$Fc|6Oi*OQ(mDEuZEH}eMLWX&>jpS2N z@+U9ffcA>lMgF-J?X%JisBaCihepJc5+7bje2(C^8t(LydkFs7_xCLE%=+?vcj&p$ zkFKXLC4E8O%iBggEBmsde0SzY8L$5(ee?#juU}^$P=$6V_eLHvnDVzlBNsVpAL4rn$UiRMANvq8A0hx* zz<{qk`Q%T6{j^|wQt?{IpC1ZBAJ6nAePKK7xiS7(aNYkX_YT8dyF{d2=915y((Ydo z*F4of#PuHO=Db&5-?^(c1o}yz3Om_Fy`5xuXeW}l=}!9WM8t1r(oXt>^tNw7<|Ap+ z>w7L)(r=OZ;M=5+uP%=RzYg*LZm+5Z*kNKA6zt#2{+awci61_EDC!%%8T==a<*CH= zd|5Z*IoUrv!f+SA-7EZOl0IDnc0P=bW0~ax!?;57gbPWZ>5ut%l=@sne2 zSJusEo&Y`QJv`Y^p8sy&7eaZ=uEb7OQ~vn9NJQ}(lwbqtBN7kqKOFkeeIWITf2#Q| z!(IE15I*UbA%9^v?5#b=8E{<4UEexCTl@5m=E`R9r^p`5ktZ5|r-z-QhZN_PIzPRT^B_G3boD>r zukVG`dmMOb2|Eh?YIoL4@7Eeac~*#?9}jUm_bPGtd*l<3puaa~eZL}J+=1~T%W}6m z+{WwlRK&5hX_Cj@3_a_+&p+{9iR32etqu8~PWtGb@RNtIzjQI&^{-`?x7!2+JX%E zkC1YgkWX6j%nf-TY3kYXb}y2DAp3SIjD(!|F&Ix9vR(c>A9?A-zi7wq)c+Br*Lz6T z)82~P(Ow6V{xs4@7J*M4uBV*oaI=Rj---6+K0^BFCGbCU7+{UuME`a#>gDr|PkH{G zfq#SIgGI!Xe6JH$8U)`EFY;c^p3JvzH{97zZ^?UCy#@Nw_aaX*-1XmK(k_>fzBCzv zTu*%tcevFz$^6C*#HWXRtleeb=_2w;oq~EDM18I%ev$Z}inl_ZL!|$nX1KG%pfVJH zDGlp<;=0da0Qp2DKR=OpLHf~h>(_4lRX;HJV8nYxnUB2U$~8U2vxwVkQxARCfKMx_ z*E-5s{1fBybG{)*pg-Pf~R9n!3cuMwPT@m7Tf2`DZJn=Px&okVu zi$!@(xiQOKXSl0ZVFc=RF7e$LpdSSX!O%WF27gg)G~|!b9uTDjK`X?`OkF%pXLd5?$5f0oSCPg{j?Azlr3<FE_LSN9oi zC4Q~MCx_d5lj|?K-c-LT%GGxb&I;+-*n9n4PCoG~G2ZRw-`(PHvyA#H(clAy5hnz1_&d$WscfxP@b6ZzB z+~iO3T?yYECx-lOABgm?mqNT|&`;vb2cC!g#ZIt%f1kA$m6Y|bcEl5M9(GFw+Jn45*q`(n*`IvB;m%HC(yyC*2R>`0 ze=Q-OlH5nSm3U-T`Ml}Sv5^0F(SMA1!22A0{v=MkAny83gZz;s zde#WWhcA#m&wWiNv5l7+?(AWUjQd+jpVfTbIMC;0|7{b)-MA3>26=wpFB+LccH?7k z2Ie((ygmG`B%c8iuZ}m|^~Xq4^t%QeuV)YsIDd~*{`sz4M=$GBpOHRW6aCA}vyA8R z;=h9NIpn|F)64pJtvex4YzO4IjpcSEo*jj8Z8rH_V7RlZM&f^dI}LK`JxC)%K4iMr z&lK{HUW{^wk^hVTgZ>=8cUC+F?S87~WfKIapCMw0=TD^GQsw!Lk6G^FGEZ#V7wx!K z?C>X}clHy=y6|B(PB}a+e&$p+emOg-3;*xirJv!h-SuARUmk&+@e!ari1u?g>6b}A zeU^Ai_934(1M(++M19|-em)|7@=D;AJ`KN%Dxq9`2XGVVb^QI6_dRYF{Zt%}dL^fz zT{^KHck=#(*f}Wobe4OZqc{Cz?}mPwP|ohe6QhBTB0k=5r{}D!Q_N+#!9%c5A73pZ zo)bGS63@(sJpTQiT_Jzlk1Bq${sfd8k^J@(E1|bcfcVPHKKwcxy=&hT_tW}ue4ydZ zK2w8HuZP*b_j~#w@Fz`K-^aspEnby4?KX}_si#n`-1i=XoH#yUC{w}{2^5;jRef_!GuB1=ChX$`gL+@|6^A9~G4q5dD_!Msg z;eph{c+Y2P`S|iY@vPiyR3M&{`#>sQ1p7Z*>~j<4iAtPV=^nK20I{oz=X1Z-P|Rm1 zGLUU(^oUrfVE(joxU=V9q0hR+?v zmO-D92hfgW7yKR4mx&(!&&r+XU*|}?bi{p-KO*uk7z_UUNxAJpdfV3|`HKFAJG;{T z*bfm;9$X%W+|v{M@0WI8Nd6hVD}hziAow}NYX%WnFU};;A7d5KI(A$r{HorMdUX@O z-8954KOp_OZ42l}?-lHA^sZh>xwmAH#~Z_*Thrd|BOZMK{%RfZSBU53+`(6dyZfMa z%6(A3dp_@hj~_3NoCJCFJY5^&kyg-y-c?WzJJ${rZj?h z?wxW!JcIm8+z(bGihuBi=fevI&ZQn!6VJ-Mpg{)p%J4onpC71exRZae^owqe-u!A| z4(6@iPOc_>ApLG)$e)$j>*p}ecTN;P*>@i7VXMqHpC$jLVppp}{w9ya6@L@Y@?K?M zuc{9~{@`3VfF6{oox{!EVzTakt>I1&ZKa=1CjAl8j<1LGHqVvu2A2wTYeol_;~VG;>Byr?KZU@?VA>VIEVCc$s4aEuJ?FsCtgUE^KbnU z`qvimZ#Abt&g}AX`nch)zImBfUPby8@5yY#_PUvPu24RXPjYh>ZK<4xeNOS}JI1Wx~JWn8QDFzOpj z#ysLfjxW_>;G_4hA8qt5o-h54a((>P!f?lbi|j9Yz}{zc^sh?)y_n@@{(@)o`&wuI z2L5-8{`-->zwjBx`yWb@=Nw1+g7k}}&A?ypbIwuzsgkGqf_zd(z@PYh&QHWkvcIv4 z&1XaZ_7dvVjP2W$c;eOaesK};wA`n9EAfb&uY8ht=C*P^D?FdNh(m5-JC=y+{CfYX zXs?*;OFYqVXXn8#*!kV$lXSSXqrPi1j(BQKxjgwx(C)dPV7Gq1)AOX)`^Ubzlk`WT z|9%DY3O+J==ZB|=AKo6~w(mvq5>=-`PCd664Ui|fP3)&B>5rH3vAf~Uo_AhTzK?5I zh}R5~BG2kEkUw)R;`4pkA0HzB3O%GGuB%Ht{S4&nNIkbEp5r}8K3{zS@j@2#Poa5&fy9&Y&c(gN6TF|?`-l04 zyLQ|td9$xb-$eR*<>}T>%?=A6B7X4iM07k0{a5duYh(1Ty|QA@eGCuBO`f0f{bCI9 zq}an9+y{8D;Lnjh`&hZ2KO>%#JnG+uyZRO-uB$f#^2B97{CO==FTEeTyQ4QfB*tO9 z!>rtn`S5;*Vk>Caj|=yZe^m0-FBVVTjv#e2FJ}8t&R9yA5__ZYul+l21z7@jl`cIB%j`3g(kf>9X>6nP>5y8+Y`b z$}fDmn-NF(d31$YkSEd`@_4)_?9&hANvaYNgs*-AGZy(VZM$J zXrIk`)tC)?j)~uEPkg?#Z_04jzQz9K?Na<0@;@*AYX<343(MoZ*FB$O;15fjU@RjZ z5k5Z<*LOJ&%|idZ<$OwW!$Uj#2R*AR_0!pK=YL9aK6EhmBON4ucqIAcBz`-c`JCJa z^wSRHKf{+h3b?=T`VGUK-xwj|!nYxA{!QZN3XehleMArSh<`2ljq`{n#G|s` zeiHGdtb;FdxalW74sim!lU?&d`kdrL>RgL<*Yhj~Jx;rleM(IXckL2A9Rt)F+F`el z-txLKZ@QWE@r|%IpHG-UJl7d~{65tR?I4fdU!4p2+q{qSeOhDi75V5pHNO#0A6lOO zsqqBrH9_X-ryK6-6+abz<}QxEmlD_eE5;H3LDqjq*!;!yQ=K2p3+ZWOd;P2=pFHD6 zub&YwfKOMk=U+&lXa+yok@}zXE$*vHt%m>qo{qT6ldfL>{hjP^vy*r)SjhP#sdXXB z)q8Blt^ywCJ1>pVJ%aAW$MuUr;(vyR_;Ep8?BNmOBV@kwhT*PXr!IiqZlXN9NZ(uN zk9!L3m6LanPa&@7k$VtNOWb}t@yJH_nah|Lec0h9PwpnjQ z`Ilr|=+O-0i@tY!>@z5Lv5ZHj8}7!<1u|}4Mf%hu=%Kr)&ouF1MESVW%f@}zUo_r$ zhWrcC?(c_q&7iLMr8AENpFGbo`SVu4kbb4~_iA&{F5?7mVR+~VW<#IN*}oFRGm|mj z9M1N-fqe2}50go+_j}9_>23ZZdEn1TpObx+dx$4x{HpUT^uI#%bEd;>ec>HhU$`Ws zuNgFuJl=T2U40|<%IBx^h-Z>;gsrHDWe#`a%UJjsKOZ^bIq=bYp<5d6+BYxz1kNXY zUgp=sNuT09+jKKQr8~e!_u)(=pNQl?Um~8n9~{ig!tWEF3oeX6eSKW<0qN(6oo^>T zTF$LUo`)W?J>Wl=(;iN9xYbwRIl7p5R_5c)dCy@3@$+|(zBmQ>A6Q)wY^lZmBJV+G zJiY8|n(J_DuZX;(T_k<_bHvFFsh_`yuaI%=__?T8iuV%xeGV;%XXHMIKE(Asvf11p z6`hQ6_B56|+UT7>X&~n-pCg~-^JvGN)bj_#&z1RU4XcQ=H+>Iu59tH(|MhL0b^iQ! z@rM^0?%MGNX_s_}Q;5BOrjbt|e(CKHx4205+iW8qm;PJX^8ZerDKa0wbrk$_H;E@( z8oiS&T-OmpcvJ=yT;`&J7Q{Pzrhf}G(_o~-!EXFrBKL&Z+kl7DOr z+AB?d+e1EWh%SbTH^oq&+ks9=jR!@_wcRalNPUa>Jed#6{0zNFUiyK0eNK zxbtHZ%j4t&EdX=&lQ|jkc)xd>ZIEzyd?EPMrGmaNJ}z#Fa$hC>l~p>2dZl>&+Ryur zx(s}>Vplaiz2q%B8Xo3bWWEzT2R_?n9+5J7*IpB3Jep1ZMOg=_HW_?!ozNd|X1%^- zeIFBhdz*Y_%e;GiSg!3ml6l-^3G_$3hjyQrAm>iW!<=k*I3Dr-mT|P7{ATcZMe2JF z>5Fon>qdvW_HBo8>M`364)wg!4B}m-KfXm=@2UHi{3pmh zoC>c%&H>skA#U-W>;uWIN4v}u`42e|dEH~gKX*4iPJX>-YzXmqJJ{h)>VHCrQ;B>1 zv>AkQ_1yX#@(HG(9qaMm^yT{|zlc4rApHVq->t+`5?558@APASM)c74YqVoUi62@U zeb`>tmB+nTBzf|U4tIX33*wWrsE0#eh5Rcd zZa>X%Cudsfdlm8IA(%%jBcI{KqZJWHRb`z20sTpe_a65m{Y=tlXQ4m(^_NA&GrR}p zSkk}v9@;n874`Lb=1+aOl~JzmzZ>$Pk2HjT?n?daGWxLJ$@t#g=D99TPBKo8vfNdi zN355AUFS9M`APVEY2%t37j(Q!7`@YHiuqW7YfZJGpx5)NN7%(*j?Yf9pCJPwXIA9A zk^FNXL-Au1Oc$TM2Tqc_Rt7qP3&hKKV$@f(rXQQt<= zkB&YT{C|^rolN=|-=p{K*oSyV;3fSkY)+sZZxsGt8GUpwz574zyU_Gw^-Ao6eleJT zvH4EuP4@%0HhL$2_9iGGP5O(8mmWYreVy%I>n8Bg^Q5b2Z|BQ+x??`%|61DdlXbw0 zFQb2X|1*H)CQ6Y19!w{Kp@utsj?+8_@wmjvZxUZCH0g)S`1Sb(-1qex^t^%# zEngeGtM3}AZ>uqoQ_oZUL;lI(sL=@Ot@;~AZ}t$`7y9f$c`h;B$)7*B+#ep&5$%$G z81=fJdf3_!cyccAH^^rQ`Q+q$=y>80*|)r~FXY#IAXgm)Jku8P`1{AYai9Mz>F*C2 zf9E&ylJ|Jsm-{#B>-*_);(6v7{CM#K_Z#0X?XsEl#ZQp!v}abrZ@1^ebwHa&gDq@>xbc$=A!{kS&HgyKN+K=@CnyhhTL1I{R|o z8xYNdzonzYud&fP`^-q((j(+!`>tg^awF-JgQ2C%sJL5*$I|GJXH))(HH^TnUrktC}rzm_Xz4?E)S2e?(-By%!&lVxQ`I8UJ^?50AeP41+$j8QH@ng;E zqrGz7U|027-x=hi?_I9&IQz>i+H*_G6Nd9s$yk4f5k6CV9_QC!VmTTwH#Qu-Bc+%-%r|6-b;jX?hxi9)c;zj9SBR#$N!)YP^ zD#0qbUuX&Gb8?R6Qm$)XEaP&K^cwg6Nj&o#Q zO|--DhC4lslQ?G{@!w^<{?_p^{pkIfpY=g|>AldoPl1KC!n$K9;u>|FDsG zM)D!YybC$At&kt^d94b3Ip(J|Xe&$~ffI_hIiMedH&^C${}5{ALr6u7w5? z?C^P(8(zzy8ztTwLi{r6FO$h9E_v72NIyvY&nD7mZbtt9E|&W%@mvY*_%88^Hebe!j{tv; zak$yl2-#n>hWW!U#jlP$8g`Xx2+gO+=S<_{`cZ-Vayt^g+u^34Qm$M-^N8#G{o4xQ zKU3njWu&hse)0$6!KW}-9@7eTJKW^SE`=XEk@D1D4tY9ATz977P7gVWKd&c!>Q3mh z8{?2WL!3xqPS0$TwJO49Z{7<70xBc_dA1^lC z=~?ILQ%^&G>@V~5TS=dmch>qm!+2u=^ERx&EXtFV@%=;cDe?TW&%>;BxamJJ7y9?> zp%vdpy=n@dlMHwAr{vw7UZh_s_CMIxM_fFk>o0>dkpFNQ2k#>P2Xw>AO95m{dwW@`TliL;`|0Hp`ZBQ=trlp>=PbEd+C1Q{zmWo*Z}e8cRM~#|6L)c zA1|(E9w2rZEOt8OoJ{)kF3|h_@;GrlN4$u5MDhloc>I3opY9~MiRadzl{n!~(tjv^ z{>YCYf1dlI8&l54hC4r*lsF*~;x;dndHP`T=_upNEaLgsV4wg0o><~~f7&OGzsnC# zofozU!;N5*!%dzVB2T4{fyV`p8SdI8(;1ra_pqHE;(Hky|M=Qn@Jn&#&wampaDUjt zlajCNPX6fZ|X;ZMJdWjSCtN#K|Wk{bGROq5t7~XXmgg4~O(M zgM!Ro7CU<5Ut8qdKs-Mb@$L2G^Aq_r5z!a{uIN;<5M2Go8`j z{kXnoGNlqcI@kVFjk!kP)7ckCj z)dcMoITE-{>%#8}qjz#fq+jgE{9f)U(ErAIb-o9D4iG!(a3kua_uP&P`PU4h5`Vr( zIdwk%x;YBh?_QJn!fMjzrN94ac$Bj3{d4$g_6zPy?83jSL;O{d|Blrt_cMvpI*~pr zdDH=hJG~XBz;AmQzWN1xf?BYj_SADaq^}ty#BV=N{w40ef)xcp+b_T;+7bP$C)=_5 z7tnL=58%FEu43$xO&wLI?Md@IK!PC z#%2FiC*pdq-2kr3x0LzOP|_FPK|Iiw`nfwS*Y25-`N(|3UA;;lAkJwN)-DK&A-&y8 zAo{Fe33JyjHDtVA*c;<_l5&-Af_=8bS6wj1&!sKW~XXXFmzaUu__L#TB6U^N~7NKo7~eh+~_x-48T- z4*hlqjxig%;G|NrxP#M9yr`x@@- zp{2}=$A$F&UEgOydRs4}AM@*;dGZf+k=(s7Vy0$FY%eg1BYYd*iRhx{`w zvA#2c^e29adX12{;-jYEKkd8nyhmr!2OG=n|60SHo+n6NG!x=AgQ=p2*T`qLj4x}5 z7ki?nPcv`%&9{)}A&Jv|WVu<%?;ZLT>ZSKp)*;?W?B}}Hu&adR`8$z5#eIpVQEyio z?(8JW`;^Wneh2B(XQN#6Z;Z8qmML$p21saaeYVpq>hV*7Xk|)_g{t3Bf=Gd>< zf0vcFO9$ea$%tdy(t!H#p6b)3+zE`w^c|BPCOSce@i9O6Fp1c$Oxn3T* z2cTfM>o1*TpTKX#*NXjAUk828k$Wdv8SeV&wc_Xd5zq6YKHtCYbGZ52pd#Y%g_QFH z(tjp)@*l%pI~HVI=#xS_#_mVEU%@!x%*x20L}Y$f#r(FD^9-4{c5=AM6Wa;@-;Z`R z&Tv<5XYsesk&pWSdShXqdN1O#kdNK#C3ZFRSJ0m%^6a2Iaqbg9R1*XTT7PuywNl2r ze`|qHW)C$?Jv0vKZT>F%y?Yz(^l+rad$%~;^q~3PEX!>q@y1f}QU9=!^etr`RB1iR zEo{R$cp%%o74iMV&s;=Y@A0^axW1S42yxvfxqx^?&TFqT-0Aa4(dT|e$eEUS??mG9 z5%AAVX(#Q7XXTvW4a8GP_<=t7XF-~H;rjA<)5FAzyhqfJJ8u~7>~MwbyN;ZRc291H z!}jYzHGgBj=!Wsg=aat+`PlodQs3PyH(v=Qp2&8ovH|*8EcDF{clMK&eboJk$IpiW z9?!UL1o_mJb)3gS+~NeO*HX{_LGXulN5{{|@r& zJ*drzkCpi3Lc^W@bK(calRn=9?d$JlnnFAx{`s|#kIgT{uYMcS)0p=9*-bu$O&DK% zoLuL7$e-tXc5SGKZ%>6D(pzBIpuj^6pVAK-7#W*K*oPf_CJ=ZVK8p8tsWD4`#5 z1j;=`{Ma_5cl|3P_EUW$~9bpi7Li^Lud-vs$%f5JYyQvVGNck*nJxc5ThEoDFR2=d9v zz4yO83VrIm5ceB>t$k|*@uiqwMA?q>$tN%Sioa&LD$6@zmlDs&y2jn)KUK!NMZ{~0ANY=Zl5dsAQI#xTS2_Pl#5EuF3~@aNanil;t5?dn`621AmpuHBhCBI_qKBGW zU?+JQmq*dw28+FQGJ03vCDQK(6MtCZu1v_^&Tq>2`zp)rEqS>w9Ut=#Ny_j0<4*Fw zKpU`ndOOhg&=9JK#4Eze?Koe&R>TJTXVSjnIGUaBIg%Q}}sK+2^F9B%b0nC{$nCiQ&yPpDVGb@N8V59Yb5*{}G)6R2-&f3(yQ z}T= z+Sq5t5=XefN8%t0sWBiH0csdF4Kv{HU*g_~xN%=*ch{IYJ(HPnc5Jkh{q|LjGe6S(8d5v<8Ct8@Xh+&S3lX^m+#m1mS-RP6qVCH#~c4u>W_Io^UQcu#U6p@t03~UDo@$ zckgW-?L<$$$g>ZBHMb)_*OSw}PRDttXAgNv+n>|8_ZvE&AJq0o-v0h;ZGTeh%si$2 ze~a3&uGc%K+zxYE!=S@7}x1gQY`%RvF zvaI=rPmKkC%zZ{L>o||TL&n+A`TQic6Z}73=JOBrfc>`i_v<=70lNX6>z21KYuf&# z)_*Yi!n4}$+Zn!A+aGv(_un<+|9SV^{WEQUv@CS;3-rAFthO(`P2{n62)Jv%sqL?P zqdU%@`k<`$l|L_V_-UmND`;nagq5fF!g=ZJ~CT;iYCH|1Mzu)Ws)7t*B7q{~V z)K2I0o=p66bYH&cx8(djsdd=itL@+VIZ_AasPdue7AW#39U4D1*-X zQ-=bF|4PSs8spQtUj47dFktvss_jpC_KNS+_L>)8{iE9cNaHSyz4X_#{VP2%t zSbiC)H2 z`uAD--FNCZ|JtKhGact;FQ4>()b>XnefWU3zvR`W{1wyg;s2lfU77zwj}QKY=D)o9 z=R~gl2A%(xqyJ~=@Ai*pc^vq!J-^|%pq=0__T;qh)Am<9eeM6!an3yc_(fkY`0U@m z^PA{T_&nCUAtPu0r@trPt^Js^e4WDiNouG4{ZTnzY6h$Aqy6pBXJ7q*=(B6OxVet= z(%Xcu89MeqX!~nFCK&teI{rV@cEA4l#~#W&UtJY=ev9Ja&+&KPQTruNFZ<8_qs;%Q z&yepLJHx#@GR|}Nh3-vsoOSdkdi6D){CuqAyyVF(e}VgdM(ss!zy25QZ||)9{^tfl zH(r0Q(38KfUEZ(bzwFuHKJW8op5Nu^q5nYffBeS<|G!P)_S-z4chtV$J4YY>3s_eT z_Uezgc7{*;kih5Ve<$Mzm8hZKjkLeCBKwjExNCE@E55!d{Sg++|GpCa>0G~h{@MJu zK($uuX#10%T>Wj_j{WlLlFdQ42@id~@B=!Z*MG{TV?U+i)V%%ruzvRkz52bM{`-Qr zV~x*wNv2=>TC~%?zr*AEe+%tTY9IT@59m0r{es9>d;0L#sU7pLZ3-X!65W@N{jk92 zb?-cW3EKHwdw6w3?Koer{fwMDL(iXhUf}bxcaQUhj`R90`EFh1pYPQ6m;Scw*LUbV zzYp!SU!Q+l{Fr9Hp7==}-;2-r`y0~!F`k_HFLeAzzvk}CN3{L9ZWo0nQ8kIUi`y*wf(ifBK+%5>p1`JQ)E6* zJ|*LSuC{;hE99KM?A?$2k9C~qzDe}8-&A-updb_8zUt+5{y6#*UOnTT#~*!O<%eC_ z*>BZxe#^}B{lf45rJk?1{ei&ei#_?Uj&|C|N1opFF75xQFNE#Wb)4t5{fWQq?#qij z4)WJL`{66v|D_+0d9Esa{uTFsd+q1-9t0(ywLhT#z}uHsq@!!EvkueQJL#o7J{j}JS)C+GYew_{&C zd)mh%KAFDj*H!)kZTI7r?`r$&bHOWhlhnTdI|Lv6I{(k3Kke639zFc)I!^63+;zQ= z`=jozC(nGQ#wWk-)p>Xg{hu_zwSN99z0c*fN3xH9MfdS9HU$r#P=CF#lYB_$^XiYv zy56PzpZH@k|3Br~y@wx=_4@fBJLpgN@FM<4|30jEIQW2k_uZcU``5JpYriG^pVN*1 zX==y5y!77+-rm%;{kG2MNpF8Y^JByw()tO(OoKmPhIWGgU-RMzzVf?e{(gPYk7%CA zb80s;_QMXwq4_-d*&_M8rt^8pwEwbv_ekOPL)!kFC+GhgZr7KsAFpfw+L_G!8}-@8 zAu*rk-}2V`h1&k2*S?E(q5Rh1`1Q|nJNSziKk)U`j=g&I7X|*Nj{W!R_)A`#@Q+uF z|8I5tr#%1Z$Nwh+x2L?kyp``2`1|z|Z-1Ax`}Y@op^o#K$2a%TPVhPN=;4t2yD*@? z{yQCK{M`a2!LC~ETiWv7f9lyWnl}V*AAMK^qJ16mZ|Zk{&$HLPPurh)kH|$&D*peX ze)mPyJB&R1Hsq@kUio#HKU>?EZpgkE`TVA~`}wW^rSjQt^yYu6{eQ%>6Mj3j(;0mr z<3FS8dcXF6@y7(8e^3w7r%nVukLn^h{JyU1-@<-Qe9*VU|E!MlQy%|%`^U+5U;jzb zBM$YuUqS8qyZxiZ?TG91`1=&?#7BCb{Qq~f{}V5WK(wlZ{qNfToXQ)b?V{eVY46Lq zRj*t;={O(M{(ilt55HgV>Up)EetINL->$7erH+h6`&EVkHL?|@|$P(_(HT3+@8w> zK1S+$iu*%P^zh_d`}_X55B+;t@2j68-!=UA-TK{6^zi)qwEf7V13yjUW8as4Ug+DF z!tFD0?>Wu$l^+m!dqcoli?#i=pA-Bvappg+c=ADye%>?vJ-h2A+KC>vJioyAeNfi* zOJ3aOU)FKP8W*ADw)Q^L?&-fD0$ru?eY*OK+TXuN^-th_Rf;!Q()j1w3Wpf&yk8#? zy0oe7x6w}L`bAG~9ccfTe_rUnxxexm7+7dNKj-1qyLFt;_xuI#)p1@?d!xQq`(f?> zn#WHk-zDQ8dFS+JwEypUTJZMEbpAi4`JNx| z!TFu&Py6+xH=l2$aj>r1*9-r8Ug`GVG3|d<@Z8wPzU!Oiy!-e0{xj|W`qM7meqGxi z{k%v}cXXb=k9LCF*Lv|GpMiKzn&+9v@3zoR^Yr69JKF#M^yvAz(cfPdPHpaiZGEiF z|2-Zb`DPvm{K%Wn_i+2$YoFlNnfX8TyT9bY^W8rwc=+m92t4-{p1+{|mpuRSul%y~ zf8uY*Jhco^?c<-2_5O-SH@*n%1fM57Iku(kuXucas^dK8@%Nv2pXkxA|Do*5M`XIS zzpnisssG|@bie)qkN=L^>mJ_zOKpG2!`uI;<1Bf4_b1^VE86#(XHQ#3JMXU-hd=&& zfzOj3K7Y0L_wU2{R&9UPqlYh>@qb6;78AGdGp7INh~4Jhy58SHJI(V~J^AF5P?(YF zo_8LX&`$Gz&a1=ow6?$eK7n&x$NxHN2j6*WUC!?>Y5Vu^_^>m3-~9l$;~qT^e}4WK z1)u$Rq+dpVqPI_+%lJkw_?S2Gv|U(oUYi5F+}CqG5z|AfcC8fd3|e2-V3yshm|eYNm4BX10}{fUXl33pWf z`37yj=gDc`4gHKGVK8=p-_Uknum2u1{?`dSjlJ|o&`$XI9#78s_uButUl2V1 zQicC}VCbXo)_z?$+KRS+=eJ4wYj=hIe73fK!V7xtJ|yk;wEgX$D&PIPp53Xz?TB0U z=yo6N1kaa$*X0ZE{hww0C%#<9|2)P2Z`zmredV)co?outt+l(8S#)DmOOnoUmdrY* zwP|OV&9WELNzxq+2BTrp&yKsjbbO;b9#h9>pWTn5B+0wQ%X^*6=LV;3KoA16D- zX9BaSVeZq}{N&_Dx7JH1>1j5dVcN4n((R9i=@g6Vjgr&;=(y8Qdb81Fnsnw5YgpE} zpJGlomcl)flWdqJoynwgnWV$naBU@7 zY20W7W;eQLY4<$ok2<}i)9WQsa=7tK?ZzaX%_o4b*DRfBVXvp=@m zyBOQ)o=>n59$TCJvEAOq*xG*5$@<0G*JNmJEV|mQ`7EN9U|-Yh!2__q8HP1A`*U`C z7ZcHTZ)`v*G`2STW4pbJv7PSuDgmX?*xKxm?e;Fl*7g#tY3MSn^VWP81k}8>7}hj< z@BoxH!?31if6i`iYj7FG8yipxjjhf8*lzD)Y^Qs^Nyu8oCVY zyfvQ%0X1(ehBeI|JOI6|Fs!NBpR?QB8eB&4#s-u^V{5ZNw%fZH+v%RK5>N__t0#jvK?g9l-17}nJ6&)My54KAa2 zV*^T|v9;MB+wEP9?R3vq2`Gie)@FZfw|6nNwwGW{LziKlx8}281TObA%^o}ey_>Bd zUQ@F_XSa7TXKnY!29!c$YqLML+q)Rs>7K6=PzsH$&HmVK?_z9iFTt9IF2g!+&1XSC z&0C9MO|u6NKxr)qYP9+@cKTW)^AO&+fKXsuY4yi-`WEBbo%7WJI)QPe)gRaCTZ}8s zCHP|4GI&j6{(SW}O6EylGw=W7FC z0^>@nKd#fa7+0E0u*I-t*qX-t`vgVPSPZGH9t;4lC=LRbn*G_jy{)lj6mM(*Cp5M; z`(wMki?N;V`5FPB(Ae7SkL~s@#@6-{oN4GXp!3#z76jA0wHVekd+;FW)x)qxvp;9I zw>7wo;*CvE3XHAI{@8BsVr-{-zDj~pU~Fyn$98)cV{3aE))+bfYtx#~f`MvUi(yT( z2M>Z?BMfUa`*U`CTZ79e-q-}Cz}VXCkL~s@#&){rt0X7|#@1$kY`1qYwzijHjiCdu zHm&(A7^tST7}hj<@F3_dhhdFof6i`iYj7FG8=IgM7+ahDvEAOq*iQF+l?0{0*xKxm z?e;Fl*7h>2F?0adrZt}h1J$$^!)i0zn_xW~bvv*afL&J=lkh&U`MNOknN{^sOHZ`2%-{53*sed3eXQN=Ef|b~^0zH%G%+`f%24-MMJ( zx0jM=?I!Guurc=d?W0MD06Izgv(9lpy-`3mj+^x94cd^S%W=AwO$VJ>_iVW}$%eD$ z#f>OheKYR~AWk~xX@c$So(GoJD4r&>zJY|8KSQ8s4CcwnXrcyE^eVk3FyLG2)4_J@X4l8Eb3FBEZ&1PwGk#>Q(&gbK$-sP|} z$hu-*)io$80gmaUn~uq#TLweC{?2*UJ>MjY>-K1JcQ_tpQ&@w0hp-QihRwkM)7k~j z%qG*>guAsaT3t-H9VhbW!GxxjjW97h@(^UzGJQ)QGvpGPyx;h1(Ojnp!*%&{4f}Jm z0YPauil^Pq@I)=*t&8j!vu_dnFFLT+W8cV*kB)JK{RR3Zr|AsO`g0%;4m~aQm2>ozpBmwY^yHwV+xv)<&2NlT|@U-pD?`i;N0isLmK^|!N!8^fMC zWLPbh87CPJ-5@0HWfOQ?`Z&;T8~JED+!kZ*o$)yBC2s$gPq`h)V_blU7hfJg25((! zgmztEzoK7XY1s3%TCEv3ycy^3_+N~d>>ZOiuQX)Vfk7(fT``K8dBj^d9`*YtSDqm5 z)D#M-IP<1o9Dq!Ru+-Tn>7*y*VQ(@?yUBwI{_Bi^Dh5;Z!KCLsSkB+*jFUlUOgI!b zEdG!T(pjh1nRWCjj`Z3dIP>|=^zLvv9}@#hd+<^+9aQR+BOCz^hovj~3&>44CaEewYEFR$8KIlw_5d3JYdc4`kS43XhO9!LLC3v(7TP#@_ z_PjCMeAwB543_EFjOZG#?Bv{pB*vWrmQ(nfqvZ#kDZ7*L<&pBCc&&J6lbzc3TfCTE zyN}3#PM_ewz_!IBgC`akm_%n!7$U;chzj`+TV>^j)GLCVuUIlZSTh=`)vn)Qe< zIs9ZaPKgKunR%~Qte5)O>lv{qLEUBRQSpRvW57F^0Qs< z6tRAPV@3~egZK5*2{3lQ{%4XU5XEeGF*;A*z)O++5-&rJTzMUFo%JDraXRgsrpfXA zBpJ+cxSYAiOQl}Wc-$_HP#5fyt3AY#bd&km!5!BAEz{|}38nB7()Vc8cR#dZ1o)jH z1lO#Gouz}`>SU896HFTy;)duVfxZL!C!36*j527Vh#^N3s<*%KvJ84F9j244+a$H_ zX=VYF=HNKX2&2sA?nXi+WtaeLqZL{$Q6Z)(&@g$U^Y;lmjEsCcJ3Ry1Hldyp2IYNL zX^5>%P$X}SB8HUev(5|A+QD#l^k6r=Nc*gic4nz4E7se*d^`Z5bw3x^fyiCxK?L^` z=)1}Ea&SC?V(H*@R5vOX({GFqlF%%$Xb#N}GvP)Ce<&!C5V~UWYV!lf) zFhVGdw>o2QDRInkNU~|W*>L`_wbKNCVY<9V9KN91ygtCkM_uqeEcD@w^%2!HiOhvm z%sQ+by+kV zAi`81LXx5Bg1d!?;>un+IZY+{%8chkYelQ_PrErQ$$iLOf<_RZ0Yl)JM#!n-F`am1J}+*eMEG*A6-3f7lV*(#U(n?%DKg{ z$r$9k9@p*1_p;9Rdto{e2rG~Qn-6D`4v%`+8J?!o zT^v4;?@ND7NM|5kptgGuyYI1`X@|^t%lujs|2*ys>XlQs>wWVre^Ts=RmU=4eO$-t z59dP?r3DCP)z_H;R11Hpi@%$rL>#G^P&Zl0WYdZhWrE~dpPjAUtuHYX!9I{VQ7qLg zQt2UJq;X$~SKL=@v<`KTz3z0xz=uO!SKY2OaWJ6nSz6Iw6iRpU+&?gQJ(olT?>5YG z59YIj6A?yPSap$qH?9|e8O_=7YLRyrG|N0_;N$UnfAk>f6T25UL#rI(H%P++wTAeg zZTN3kfw+FaZoFK~ae&ZR4PPD3`y#u!vy9dzQ*gy>fPF|GcGI*+@)eG;6I^VOOXu~t zE_|HM?KT2M=aUqMBocl|yl6*Bb_|UO)`IzjSPq!?d^lrL<_@DW+}?ax8mM(Ks2Icp zQq(w2W+RC12`TR?B|4wkjbrFOU9i6dR_j!;3FhU{CPl~D5FF*|o~wJ?w@0IM=5o*0 z?U3uF(|vvp3s=&ebf#y_pwngqJhdAvSocX9ssi;2=t^^V0ar)2i9<(na2b$xr`2?L zkxfR!#l7nNlzRBEBr3KsIh|rR`J-YHEDsgMLgaQirh9c~3Z?EMZD!5Y^VTFi$sU$p zA#ns;a146Fyi(57GONR&)w9h&e)edOnYRpg}6y}cKdBM zp677&ml|)tY&q=h&j-g4Ww21ZeR+0ve9W4I`>nXn{-G0qMG!yNl>;zbfzk_4l)SMy z>ZQ#J2Y@%DxZ%IJKN7bV2I#Ui+IJ!p=amo~=nvZp8&E1&y(FYG7l*xdM*O%(wt_B% z{5}*>3~CbwY}Tn|LvY@Y8#^V2zCYRo1>bp=DSiv^8&4y6>pNhhG8B;4+6ks) zSM9_Kv}$nVW=57sZ<2Au>a!ZDU;!mJKeVH)wS57v6d+=M4q*u6*;)EvH0k&7Rj`+< zz8y7=i6)RACp*PFLMXZft#85OnBDFZVGOFZx(6Yy+g#R5WC<|~@4$^iO2h=tCROn(UwE24@q+I8hnbJI?y#d^ zzv4}BI;crV@)`{{Nis~~W03VmF^h_zM9Fb_%1HQD#sJ#9*)g`}gRz;FSl-_7L{`V$ zx3CO;`-%l1x9=3TPm9oW&!EJUZ)HLlj&PvyXqF?6M^l#hDFeto08w=GV8nLGz0R1} zvx_NlyeVHf;E!z4H}*-+*}aTb>T8YsC*F)BDF2C8sFQHdaeLsEhG%Wx7qgi%xDLcOC z{bdMR{Jz@Z2#o&0bR(#)`eMlf5Fm=tnwd76S7fPyerurqye~FxFmxbo!&a1BIldYGOD&5;{O2V9$_ftN|7Rj`b(|k}NBEft^$0vQ^U_zvg z@>JDe5CHNOZ$@j@vUL^#I@~zlN>4iTK6!r-lH-7l?dlMDCRczBZiZH8GEKK3n}J)T zJIrC|_(TdLX>qg^vD)+KgU;mKvZ{L^ikJ5Ic{`uZ5!^CsTj>B2c^_tCQV`)ff>X#o zQh9H317%ms0V~r7*~tuqLxxRG0*DPS{^r>T?o9A5w%-+VVgq@!>iIPgKh}(+^WEKh zdqr1O6bqT#0>y;A(>Z$jpr`{|Cg8&qAg~2vfB#ZAK6#ky*vX=$j4&|f$cv0|2jDv= zu(GfUiEu+~mKS4q9}*Un5eYR6M;bN}2n1g;KAZeG*tbLnv03;CZYT3;_tx+t#ri9Nc1mNXF8`P&D?gWRlT_x8#fuO6D2rh?OGOcG# zTR$VSY)J`)0h`(p8b>i#WU8^!u?j0*!-~`ioDnco;K@Jxr&dche^H?Ic>F zeu9;>=)7+%{!36r9w^sL{m9&SDI_x&zAFJ>yfr#ZA$dZ!g*0j{#r|ZpzH>SR3(q$y z?QI@I%4RlK?A0a-sNI?NE%zXY;{@&^irYez<0XA9I1>0Wk0c8$e<=c>pm`!#T0cT- zQ52U0n$xKqY|$D{?m0Mywbc$>SLC_V7J)+YTef#h0Jo;R_7)!>Qb2%i`DS>kst2k% z^wKU6AFP2C7N~|tXDLLTes9qL^J7|NFY6Q`;Rv`qWJQdn09TkSj3Gkh5MT%qpY`ZF z`-tY`;Tl^Qt`7SmEqgcePdqhN9&~=Ae7?DP>HOYUgN17{ZxR>sUBPK6T0websG_Ox z_3f_RrDa1iz0iTqV4H*@`Vn5qLd|PwCj784ZfketP4B~Ye zjALTR^sq6VLh&Hg-W@Zp2fE16gUZ2|WpFZ6ou(6;)$QbyUA{+w$IYe&(#NKkj18gU zDB%cuWtz_98#4ZWdJ0M2yy(t5@&>GegATQoT};x!^@gfk_KHlaeFi~>9XmInWcH@+ z#6YmT=L*fL8AdW{<$%$$^=R>?gU%CH-JBz|HXGg@f`&tH14VSF2)kkNh)1lNTU`c3 zHp3LB?vM+YyxFl7Y3}WAFxa3EwIDbm_awD2JT{LPFI4BXjbxeGW@kDx8w&?Oj(|}J zv-FISK~1BE7)`AiAkL5@kGOsDEEKm0AXzt?K@I`~BEM8ITpX95RzX~1Amb&0xlTj( zvKW!9GCV~4 z5rjLiIXDy<%_0%Oa4rJ{R>*sy3pDX3HYqQb8aG1Es|OZlgK|w7j1v}PTH2gXC=~wg z&BNOL&H%n;6id1R*W`^zejs5If64DiYNaR0>!Tk?Iinvd@?%wgtfBr9tasDdjU>6x z&d%gM!lDznakAl!=bx8eNG_&Vqb2>R-$EuVMY!A;uq_;MK%;#SX^v1oJ2QE4nMz&-pjIr3KX`lz7YB9_fRXo*1{r)$_5>BNMuVgWIYfKw{x{ac zZxvso=>dYeDnhP>lcVlZmkZwI)7hDRPH{6ry#PYH_{v4yCPaRu#RDJ5yx+%@EypWmimM-bHZ9q7f6so{%YF245Y{EsY!ea?ua&=-L^)F^D(E z(gx4ZW?zg9k}=Fs_%k%=E}NN?G0N4!!lDJ^5W<7$C0Q2^kq}DDJ2W~08L9JKWFg!(gnnC!P6940#&;!A4qwdG@u2K zaZ(mMr3F?Gji&^L1wG(8U+}c*T>>pnzDD5(uq+d+tj#)8q|??0ms3Q&B4-&Xwi(!r z_>F3_;}JYo^t?OL*jxVfWRe25(nyn`-zE~C$IlU&M0^*_Ql8z1)&=fcgY^^Xz&9js zm|tQm3GAVkX)geDnFj)V$f;4AJvd99BPTprnlTpDH-xW#kP^e^eR4Vw{hRjFbc~vY zl8Sqy)9*|MNF1G>Pl0+_9|CzwYSpip+)w_`ZSr7wKoWe9zDskAu76Hf8hgX(pF0!BEXI1xf<=|bcj$H z{;ijtoJ?zo21lw{09O>d;nPJtJ8kL0Uf{oMV`qyKppk!eAw@Ue5H#Z5tbsZqj1n+3 zn3w;CkPbW{Vz_;{vDZwR`&$X(Ke$9ef+tROOw>$4Z8kqbA&R%s;WUNAkb>69X$aSZ zH0-dZzATQmjS1QU|8FP%kYfJ@9bGIEzA(-D=n-oG4+&n7E5P&DPNKx4d8>_8Y!b5Vq0>QT0R?LKANnY7N zwktW-N;6&TNV5RGp6^_=1U!~)q2H57#9gVv7>!DBDxES)4&!hc`kCM-b@|jN=v(T#y7da5B7t z+p~r`GJ6oH5K(k6WakeMfpbcIIOH+4`|#9&t|F+HQ^qW?MoUGW3XXtD`e1h|u$n{k z;7CPP7EV{OEXIbk#1us(t_;gDPJVY7<@5l?4X1+=mGZXkOj|(i)^@ zGiW}_=32CFg}t%|MHYZ52vgdpF!HWQFmVv5bP_tfn;cfoN1l!pP=xc-4M^${Q`=EG zg~64)knn5+qR=SFC4_wo(RYi2#u0BTkyHy*h2xJYy0vj&Tbwb@j`Sv#)A0G4>jsZF zKS}a(LsL;Vp%<1~f?l+?3#l|EEXxn)j)6hU^8*38OX&c)a|-9MUN67anoT%@cuPvr zEM&FOS`+mICTW`s3UIcwg659lb~bEcpeF-{MHJ8r3ss5~61MKLS0?T8VsZ}+qp(XX zLIkD^o#mZrt1~-mr%3T9=Gp`y@M0gLhHRX$)yZXCr=)3VgJqj+QRMC;1lvAlwi?V` zYJxEuBI5~odN_i7hMu*`b6T_f<~j+8Ehyp9Wr@kaSPqqN6P6b|G8{fzbg0gbL!6+H z4$CqpuqG@M+=qa9A5V*yS?r_`4&YE7k>`!%KCy24*&_pi)CXWxtu7LfNN!aoR3?Q1~>tfDwt^k0x;XeWgV!mk;yr{hflVA?} zGVqA3HVM(oqULTEFEyJDl+o`AB$oI^2^e8g;LboE!*M)G*Ka~Zf>Zru)Mz0L1OOv4 z53a|da74XZ8l3ITtrStX4E&}FQe>g6$H@#5vyq%vmY3^qT6C_f%-g=4_E9_yz+y-l zrb#&#kXDuLSfsL&;QI%TYEvQjNKRby{w1N(lKjPj!W)aP5y96wK29)A>F`@S6%mzE z_d%^(gO0YK=|Jiic8H zumojqO7$fqb{cksNSG!VxJ)mnwB$Wc!pYl0X?-f5>%8Wq7TPjKdVG|NNUEnEQ+X?< zc0|Aq@8H+NJE&@NvrNgNHDc7cBzQnMES%w2-bG6ki6U0&+Ia*BqUXvl)G4MOIhX8f znnv*nGDBM&2cv)SsqfK3G zfp%5AP1yrU*z2$V_(wgAGE;Ln3kPX2rD1?z-wm&); z2j#E0TK>ZFA*C)BzZ~_8PD&%+PkJ4^6v17|t^K=6^R}9xZf_mZ8ja{649wR(WmW)SB=Lc5+^0je70Th|3rsOxI~LT3EAl?* z`z)c*q4tXLcsmNq5otlR70lC{Ft;`Xr#UXt*V&4hTxMyXi?i57KR?D=1lONi5w#J^w!|%i3c|)%>bFMv2MJptc8rh^ zll3D;H4`66%sO6Yg?5jR%iSr(7LlzAy5+$Gq=(qTPR?9O0o^29?+#pcC^9z7@Ydnc z8{2>8gDZt)L>xJbg_@A%X^X9%!3`vXEusrNj!Gs4*p@G7y7p@Yv!{(G!;Ag2zzQm7 z?~fTdvUm54Wp8YgJwh>lg>D2i?(}v?!_$_)f`dC<<=-|`u^KN#F@QL>ya#QGdl$tyC&td*O)_zY9%x1&8On+{v5K}h(hi~BvN_~ zBJY*Sap`7*NI4}F=6Q@L7^>i zn9WMg5^alFZl9>j@kH?-%Aev)+imzbnV{~trKsvwwJKvHwB+WXg>Vrc3uwy=oiwaH z5AH+wg8Ga)5DQq53NH&^)upp(@s4`8O04HVH@u2&h4L!xf-f!2C#BVHOZ+ zusN00TS)sB4F;SDS&bY98$6{%=){#{u&3IX8n1Gc9rUVc)QVuQSPrWdJi( zn|BW{g^D*H&kqi&n_J&Fi7E{<#YTmKDG@HXrtau= zit4RW3sU6(5_aTu%ij>AB`_0qP2NUb6L6rNcv)O_){!w*huuLvT3U{P{aOu$79J-n zLT>}+hc^w?XnAXb=tj66kXv%u1==nKG3~sEb~bpG3{zrHSs-ZSI6WWYpfp>n^BMg9 zgVaK&x)$2jkllg}TlV4WYA;GqJ{q;P%8Oft;0Lxmg{**bIwW^X%DPG4h{7VLb2!M^ z!EU3TT8j>;UIx#~3UjkFpLj*m7?tv1GmETkI6c_DOmduU-?jFlQ1#+9 zqGLEMECSxVr1ftjNSMrD5HVQ5(hZD}Xi5gJ797hsN4d;frt(+rWI>f+ln^dr=u5N$ za>yA*6x+mQ@Jf^RJN3n#;7!bnjNp8pntUrOOAP7w|@lzAEz{m!c%e=*FTN#_mHsR@{`Y-8Z z=VU)6^KaM=3N!YwH$mJy!fPrJDQdVy56CSJ=LF$Sph$v+La~ITpehLhZV@g_zD57G zBD?#lL^$k05*Dhsv$ZqDLMZt;Kdel)mw}O_1E_#T_C+uBCbk}1E>afS?-)dq#L=h@ zbmIKJdz?oapn2sDh(HDs(}}j)Wi;Y%#1A>hz` zh=7y+Z`1E<5^$fEIzesS=@_vUdE|$)NL<*Ii?OrG5V=>>6R2ZLIt5FBn4B|rA_#>r z$(8UXGfF10$lK$ar$Q(?8kkJgk6b7>^(_2V5qNHYKirg6v^;vS~;V6RX}V-9ms0 zRMK8RuD18)8vBJh$p}Vb$d}@Zs*XXf{d$-Z@ z(rs;TP=J$ItS?$FxFk!ZOzuO5*)Wk`mDtp6A_^S$ZOBz5LhTg!K2X$}S_QiB4cgnD zD@tIEz7wq=EwJKNesQSRm^CnAvhPB6NqJSPT(Nc6?>w@liDt&d4sa^+bkQ%hm-cOPbu?U8| zaj;`w#06xheKeWs`aI#IY;|$t!;V^Kp=YOuOP$CHS7!au^3&L99H%Y5Og5dsh#~M%f>Q_@#&b~~VDNvxO%H?x`EOR+nMD8?yjfE{Jsq8+=5e-TI1 zQtbB82*Qr?B4kOS5}h?TR1OKfgH%;sd$cA-2ad6oz>ulLLFAYoyw0aYs-oB)g88C* z4;}pOQwj?8^dAR}0=(U3N-IY8*|G`{mS$pIEfF-y;*65_ss&)!+@_caag=~jwW{Q; z8Ajz)9tYMemQ*W0uwI(BDG^9Mkc#^aO7GZ7Ti|hoEA<`tlu^Ip0_7m5GqR6^8sydp zvg`tNN&{WNXoyhc@pBy90aE8Ug-h-&*R~incBT@8ujc(S^?qT4e6VM#tZn=J6 zMk0#`Ye=*qcD9+p9`TbDNJz$E&aP8JRu{=hB3w-&7@~^CW>-+@5+OFhDDbuQ=e^X@ z8LXHU5oIfth*f42wh@rC#oDGWXBxi z`?&E?SUbOVR$ui+vd`RXP*6SaUE#d9gJ~`Ow6|^S|A#@pBL9;M#+HWB>GvJ z1gaDxdXAhU<1=`aZaBMRMti z=n#Y#_Bsm^LH_F0q+O*ePpu_ zR@ty!Z!j^x4KtCN;Bl*KXE>xvrnC8kD~0(>%N4%dT;%M{0w%?3cp&M_<531smftRS zW|ldUr6#8FF}vcM$s>=T$6l1F zO^gH@;rSHWD>48ZeBsY2(N8P*6~#4SvVv}wU+wAOf-U((%SBiig&I#dO^Jh!H&FwL z_O1M-U_OFw>_;ytv~Wi;%p3X95X+x{#LNOoUn4N03?<2N69t1D;kOQ-un#L|I5W*M zv2>Dmh9)Tg0brNU3$gSvs0z~uI2-w-6`-C1>#}|*RaCv^n3ISdN=T>N$j60KWl7x~ zsJ-a=J8Wdn2?SKmvIOm(t)ZQgozuv=M)dWhQG?r^Q)6Ihxs_JmEWSLh+vwZc!dH zX5|I0~PJLmph*s20NRAN(yd?6Ht&nnYg9iglASC=0 zK}RRh4(Vusv@%IhViT>gD8&LM>VS91n{@4f4xdBNjc!7c;j2DCT_U(^;oif5R0+iS ztQ{FjIY3;4OYEXzpLAo;nZM|i8)CUa?bWT*4d9L{LIVKkjo zV%q|tBA2V`$oD5YtVi1uDsoJ(tRA5s5AvZxMFnw1`H@h*M^5%~7N75$9y+r5nEMFc zuuk?kEOp3a!g<6|hslfZ*+$NS_CYi+lfK9Cc@*0rp%N%Sh|6URn8C&(a3F4&0xM9y z33>>dMDl(*<<=bv#qi>ug8-3>tE(hn9|b)HSJDNh@x+e&YCuk< zAIl#Z^btFhkFPQd&c;@qi)8zV0;xC)2IMwkq~ZGopwo2Pz*GG8I*HyI>1J>rSf+`#hmx&Rd~SXNctjmJWLz zs$B~RvrWWtS~lUlzsE`S%NX2fe*|Mu{m0&<9xf$C^J$O`@0#?_Y8M3Hm>J*fc=kL4LM z0E+`a@3Ew<6$z7keQ8g#JUuq#PJ&plfSEq)=nN<=z_uj`1SltJUSINcKN(Y{8!-H> z6gmPMo+h_+xRFo>jK5dn|k&`mtLdTVpbyLqcb%jIl*DCa9yM(HvS3s|iqe56G zZPeUf*4mb9BtvVlxe|hTI;b177{aS8f}l3x0u6~qFf5G9h{+ky&|&s5@<+5w-AX<& zt|tmv;JY$3i8E;A$yvrno#id!colL<9MjdXhbc<7A|437Uf7iRGVrnmY<;solDox3 z12dpg-ll$UK2XLD@dlIz9W7ETV-ZG5*cK+aFnI=igid}~E2=-!!}7XMPgv@M6V=NI zt6Ldi;m^Rl5Tfjl$#J`iD$ATxYBV7x?kE?=*Kv5}j~rj?4ck#4_6XQS2GFH(DTq~W z_;Hv3bgfY~MVdC3Cc>r#%4jy&6-k#}D@ma$j(i5q&bb2b8t{s3C;@80l!?NVkUUPJ zhK{5IS-}+bLzFh8nTZm(NRlN|#RUn_sy7hxgzG@aeCp;j5RFD+ENM|j5b$&q zKAvVg7Kh-C(?Y2|_UVxe`4nE?bb>6V>;hR$Me$Q_+0>u&bD(d6A9Gqd3oB8nCTjSI zK$WYmaRkXIpy$Q>!Mj6tWr1^qSeh0oaAq6FIV5l)vFkqYm}wn;Gb)?5vESZlPP?5k zu2%+~8zP>b^6|ub3X6M*>BY#C!ZnJyr<|%_prXx~l4m7$J}-=6L`gbbm02j_{n+cE zu=mwI0Wpzri4u|nY!-y7Y2-!p@-ysn?tm(yC{jAMw=>S<#0XO7Y9Zt76)W$Je512LcbfZKN(B-&U=jGOhEv?$DNjn@|061$$u?^aCqh0# zhQRPVcL`7|O){h)H~@%NZ1JDMV#3lt5yC4iGsya48&b@dcB+Ai}HE25<_5g6RO zf@DYLel}grEqvi<*0lrpABm^Yo1{KbWJxNDFAS|{2D6dz_;QP6I!5FP?nOyE1TMog z>daosrg)OsLO!wvy4p9U=N>)`$kdO5?1Q)bk(%P$A+b+^E6yPf$ZjBu156QiV&;pW z#+^XPO5ep}xlb#>$)Q{df@Kk+0ybmunm3W`f`ZBm&BsA#w&|8>DPSEUje+1!+@npW z5rC%>41{|ia>Z4khRd*A5UD3GJ!L_C*c&4fW(IFvrFcYi)JZ2|VlSaAyCAE%Fi87I zm%hPl>K44S;px(6sq^8|yVbkn9w>~8Kqh%u#+a}Sh8qmvooS#cpi;ZO!)S#v;Xs^? zI0MO~eD0&dPXs*g^-;5!py`%5iq;wDO}Z>h!;p!9aL(*2+-Zk*qPm`{Q@#VUEcPw% z9$+e-g+@;e?mczfgvI%!N=r_yP@*e&o*bbFs+m>P5-nSlBK7>6Q#XM?EC*1zBCLJo z4a!q&bhZ@7!A=>Y0GkLomB~2H!GmX2x|aDKWFq@^2jYE!Lh>;g4b8QoN>Ir4Y1X4= zL}U^WL5EXJ;+ox^1==sLs`259)hWuNvs``BrkE{n_ndKqo&gjcBF9<_)qFS}B;<2n z+3Sq8dUURO4GxVWNb`x}4g9|f@Szgi6ztuk8;%g{-MZt%drR{K)-;Xw#(foJP`1x< z&T1gR=T%ym3fSfNmO=W(+Q@ns+hsinlp)JTKerB104*C(ki_m{qK};AuM-gT;&8}L z?2$xS=W7yNVW@@Lf$SNIvkvbvj>tmbIK(N>Rip15^PM zyPgDJfjVsKG-x;OevaAqiec#7>}M??tW@{%X8qV*^UR#8i# zZ<$1vt-?)Q-HSK@n{zdR2$g^x7>B46Z+wMCFd~Nv({rA!DedNt>1s6Wr@o*N0vkj* z4uhnNlwf$CQym%>6uh|guKkU@oy`&)Ln#S(gW2CwlHf$(B)ououC0uMf`?Km=boL` zEP*EhT5Q+w%udJPas%9pguoHvv*8bM+=Zv3t=_x`WqW+a#P1C!ajYS=8u1G-PYt*% zvgT+g62x=^LfJ;`Sc2e#BNJCJX&)%{CS!zQ;YGGQl#C;xP#`BEey3)Zdm%7e1Oz#ede1+adyQ7A9MUa4y5d{;wXv5zy&54#KY$T-vwm^eiWTt}+ zFQ5gw6t&Zr5?BQ1kosmhN14v;!*oGba=OA3k`9H7m3hM|iCQ~Du0SRIn97*S8vbEv zKw<$OCKYCni2EC)?UbQH(Iqq7F=v$Z%FsI#+*Bz(txz_i-!g>#32 zMvaMa-+>DvGtzJb(dI#HhO;T;^N|q{N`QpnIy7&BMYyX`x%sc?2jf`s4$qI_1R7otmg~j+jJ->1XlxUVe2yES)j$!0dpw6 zuNIo!UIwNCHH#t^^vyyA!AETxnF~q~C38WEwLeYPKG-_EmyLjVY_9MP5%*y-Dm(7u zr7c*l$aEsAr9(_~o`qOhM5uYp-F8Ld;Ed-fi)tjpKQViSH!{+)6j%6c2R{P>JafSfhO(=?#u;4c$7?jC*n zSQoij6W$;5h9_M(=QUdHN(}H+#Wdk61|7-d=4jM6FA=gyoDrUC+Y#4L;Wl784%mxH z@V++Ec?)JczoU@59h~LSMLTzKA1@uCGP^|F88`voyC*S-jfC!2m&`^`mS`1BLjE#w za5NCq9OxmQZdYtS+3U*1@D~u#%Y~-2WmCPSjcNtMo~F!KF+OO!#0+ALzI)Py)`m3KF{=2OM>1;-#L`!0wL0(A?=qQ0s7!%8*Kp}FN3cHBV) zBe{iIZlAVR4f{00429-JYm7nihx%qhVp%E446DROo#{bh%*2rsNd`xbB9Pd(7aGhi zNm9z8maG8h43rtV72OI0`gs6L_-?`G@FJVQ9S|UyYhY$H$)Nkoqc^VeB93;ZN0WKF z-J#3bho^?@c+}LE00QI^T#n60YUhKi2a$4%L{F&}Y*-JMNkt8wKIBa?Z-et}Um!M0 ziMBX2$dVUWd|~RD4~<);Btb%NR?|8eVsO7WDA6MM+75>)q!12R*uYt1N!0}LmOhpX zZ!iS$gbn@1wF4Sg1MEE4m^|uI$(sU!DWHNp2n(~CMv;g20c?_kXv-PJ0^)@RCo|1D z0#}YxQ?^2Ogq>t;DzN98<3+AwnRC;4dNk=F%7~+*z@5tE-mY2`!7fBut2=%*NyBsF z2%>&2ClkvPVY56ea^k_dwD5pM$m`kR=5pbp_WwpGqu9X+2he#Guo= z$fo463IsO#@luV#$I!yZAl*Zj2XM)+zO7Y?K|=kK|p zeSm=t{6hGI!YpEyGgS1Z>wFevHeos~fFKvHbFdHouMFl~1cVf=JX#!EBtMtBbIEQ2 zCLf%m(HMymH|0t+1oJbdSFSf89*|4$u-y*P0t;182pFcTVvnS|C%u$Jw)py&E_L-!A0V5j-BbpJ?XXLaf!#Rar?`*3l@31#6y5UsSZo6;KR2x}sJzf@f@ zVEJgU9s_q9on|+A#`PQK8B1k0hdP;*oOE}5G-{0=q?3aaROAXkAYM+AInHl_@X`c9 zFC9d-kj*lgzQAEB;eCX4FrYM{&LUlFLk^(U1jR*B4KrMCHRfwEIaXi8v0ZXySciKm z0%ef>E8|PJ8j67Xs8myR3;)4Hjw*7l^Yegs%tPsT6X4P(Fu+?M><;t?_Nmp#A|Kv<~0G&M6gRh?WnA_+x@v z_Pgvh4YS8J6I=!&Nd8yoa&U?Djz8fyXAU%SY zVGnoLQJ@IWClJ|UnNujzk_zMo*k^%9;D;!oma{S&8*`BHzIZm|{2`cSApgp8FH$AA zJc*ELpE<>aW{w;HiZe9FQ4B}d5KAM}29ub7u=60V9b0-D zg>s7;8JLCwb2rU^-g!NH|r zVTr?zcwdu9FG;heu(2URz1d%oV zL_-I65vM1xi+@DfO;Nb~yIf1_5WAvE$(t&aQc;ZBkPy%)f-I3J6g`tDLozG-qEJ;) zQ8P}g7pC%&wAclLgq_utPHuEPZ=|>)`Jl7^2r9gYZ@X_?dh@ik0>GdwVb>e%7S}2R za|N)uj*D8#Fl{zhP$7ZQBoxe2r<>lr%iVAjlU@3?3eypC7or6*hp2r?WVg}nBQ zEf#K;m}j^!vspWuTm~joMI1vI<6R;aFF`3Abf~~fI~{^;4Pb@lumhO%I0?nAYVDo0 zH*cWDahDr*2O&f3I-jH|Nf|i8Ys^OByy3WEHSN$9>vT`m0mp!$4QQQjP+sOzhh0SXvCzzZJ#XrTAPfQ*ntC)y z2T3+fkQg9^)=P4Iv`%4Rc`IIK2Jbs-ho;by-Nw9Mxb#baoc{D(>_>o zG^EU&A6I+Ab&9%6S#QDHO1}ga`{lsQO~euU-w*I$bF0%{WKrGN!wW z399TyJt_R|9LlGacEofViX3NGGV?YB_Du0M2aX4KoLDT^PH@osG1z=Sg@)5P+#99} zAtN)**)KX+W(Wv0q6_?Bnmz$L6xBUHOBC9NaswqA?s!j^NCp-6DcGwefBIxK5Ze&d zHEe%0Fl9*SVZV*|tLx{eWA^{hK z#xR4o$ih(G7Y-BhN=8uMVI-enX-J2pi@kPGT2>3r^2H`i`(hJ&(gjMBlZeBn&8eg0 zP7ThqH^dLpY~>0tn?LO6T#ZRbILR(TcBg@01-f`?<9IsiBR{gJf@V)JKaMoNa@@Xk zCBuN@>BySv?n|*mQY!*CXO#+3tZEGhkYk66cn6Mc7D%g~^`~?>V?wAS0(-Rw3nHeQ zP_sgAbCm;GUcdl^AEs9Kh9q@~bhwxM{Xh5<(?o`&*#N!l?#P?;{QWyTjwPVKV^it5pcDT{ef2ROAVNLoRZ0zr!wdm_O4vwm}l+f<&cSz(OM ziIA%{)KT>+fT)f>utvG7T>Aq~Q>xNjwa!qGTj5ZLvke(&bdwricuOI^E&9J;$aggn zy6>4iU7Vq7cxR|0FwTZtI)I{Z&e?udK2{;A&I!hdmSJ+^WI|Ivk0r^HvVm4A2?q@I z3hJ$K$%^ji!q&ao9Tf1n5Z#L>DKPS&5hmUV0*jWL>c{!o4ZYq zMi(0cAwA&lq1&dQ;&^!}YtW{=;?K^B3*p=ww*7N%lx_RxGZlz}kj-=^P<6Sv%6LxS zIJTU3r0a=WX`J^7yR6jlYEm zh>$|QU?u}k_|uVDac0YJK*xy6*B9Hp95S)!EU}~e@d)Y^iVKEJ7A90_Tq7eB8R%f# z1A0Q)Kt>6)P)0soVT>F|G6Iw`>aNR3JRuV~+EwWq zumM?N(Fu9Hm=pGouO{sch&Ql58>-?ev=LJ9S$Kx1>XM(LAWwV?DMKa7ZVJQS9Zpb; z;&h0>A-P&1Kz!NnupqpWvm1|bUiaW|KrXGZw3#_mi2=VdT-h55Nrdb|`=hNi9YY@B zkQ)|Q%s4A-NwVbLYRcx^nR$W|;T(g6Evu+^Sb~r6U#SZyX?C@LWhTmDQ6 z(iCa%J0~0M&7B=EYVSlDRY*)`64eE&=#?=jPtzyS>l-I9?@CG|B3Nu}&(A&~d$~A3 zFiaoSLQ!SO%?-Z-2mp~A{{`Yt^ESI^r%bB10o6syDoLXn$;%mcXMB2nhDBX>8s=z5BRm=+JclHb^*DPZhM=@3I+-8BkeBE&Kz72wy zL+BXWwL@oy@suG^bAi?Nm=`*y>o;1Wg4pkjKjSUwexRFb)xX(em7B4YY+xhotvHAR3G?pu67cix*L zG_iuS#dqYti%N9}x;i;cXX6L3|I(Y7FbwWo!Sxb%wBVwGF$(o085D^mzt#|5+FBy} znb6IFcaJs??(QEoYco{F8qH_Z z1bf{>WN2+XV=P6%&tZ@1mmo0esav}{H#d{`M*Rjk9*aUrqX~JR&M?R0OHvsLQF5yu z!Z8b5o_|dVnZI!j10`=FTe#n66!RgpBoLaU5665QOz4OdFW~cV2UtDjhwfP`A1OFG zxE{lVINv1^oh3PsyuGm1&yGi(NsrxWSbKL46dBISsE>LRoYRbr8o(-mRX|TJzzE&A zd+r12gi|Td%DRh0H&dmi!FWW4$Gp9T#OFaG7D#{wWyjs3jCOf)tFqb6ckU)oRChP- zg@QLN(-o@c5G2U3HknVe3j|C}XPk`F$WvV=2nOjZP4*`i)p?7?`2XI;N~2k$J3ABF zRUZU|<|*CcI7mZ#ov#oVTy^7masl)o(q)j=nb0GZQc6}bog>V4a#;;igU6Exz_s(v zY{s~H4tz<5ey&phU?Q&-e zCv)#$i}uV#6#_;to2-D4xDOC1HyaI(K@coB&)Ewt)rnRgJU7rXmn*5VFxjN~d4MzB4XkK}zY&4!^BRX=mKHq~qWWwOvDI!Rz|`$MFbC@D zk)kMOe8GlixPqfRTGW_kc>mVDWN)L@JUm2?1SfVlN{HlB&VjqffiFlj@)VSmsWH-? zgBRZDskym(XM4AO^X@i%$=UlPd0>EpM-^C+j8G&SCp z$LZ8R?SNdKpm~vqG45vId?(py!ZtqYjf+O)xSjGnFLe4ytU`V86RP5tjHGy{|2>?d z`RpO_wlcb{DFf~HkPkvAJVTl-2c9t}^=1x|Bt~c-4@LCC9(Sh?PbPz;U)ui@Sw*M& z{5-?C8eAqY2?8u9z(ue*f6jE?FpuP7kT5$d&D@R|L)JSL1A@BVpe@Jqik-@-!{w9+p?8qM#`zOqHTySr4i;bik{ z;X;(4{KD*%GAl+y`k)?-!dhU}heYU6cZkbZfHkjDS zIU`g+VCHFgOOz`CRX5u2+TR4O1{guatmZ+NL>%d1PXSQ_Hs3nhJ51U~2d!pp&>caW zNl6M1P&)&U!Se}WOAm@*3c)wrIhRzR;&Ja$P;`t|Eg=e#ke!4Is#R?msf(m5(wdF( zDLG6~rJYdlsBwS`fyPq)71A!Nw;@nf$gZbzXf!Ij2H>mO>x0gijwaPt2#u{AA0%Lq z%DNUnRp^D$C4CAN>q%@w_uNYMcAjY-CQl#k95s{8t?;)61t9x895aEhV4c{+ixaRD z0Np;E&`YMQ#94@ds7V}vpk`NOmjh?z%DSk&i?kOC?-BlABKX2tnJYW{Jst8_TtW`+ zkU-fbK?t%9ZA@|ks|BEbbk8&JRpsvpnCx?aOM!CE(%#vw()w1%Y$%}f42m8W-rz%Q zLV+u@H6gHgl?g0_KjhQ6)XC>Xy3?#PJPnQV*}%jN4QcjIo=#e4;&NsbwAUA#Zd_XI zWc+ZFo=%CdXl1d|3sFSjLt3VECu`c}=bSyVh$smJD$-lHQdVoy3*gfU=?Bh8a2jG) zOEWP{ztw7CkJ`^Lts}X()H7Pv1)YF-9;+Z!f$Wx`!V(VQq@xzhP}&j1eTt;i?pbny z+5ihxgYB)Y=636F53_O>Wq~Kj)eN4w&%wkB0PH>`n+c7>r%(iIQe2W%w@u)Mv+$sE zIZY~9r=ipsw})Y;HB`Vv*^Fd{`zjJiQmmeFr%Ps*MrgXR8ZFe&1b#W8eTn3B`@lE%Fwz7=qG4RqDV>!Hf(PY#x$nV#Sx) zK#(Os-o?N;>jHkHtP0YFx6V+ja33MUNFzm<=K>@#mXiXYSegR@2wJE2S>~)jZFCp= z&j|}#{`0_Ac@>Q}usJsQSh%g58fawGu?8rGP;A0iVV(};$ zJs9H1on==kJz~2G81rH+Np~2?2ZL-@4yX^Jjab|;A*PlhQrS`ql&Q_M^0a%JTz8Z0fufhr%+z>Ts0h$0~ z=@bi1T3?5TNOB`dbQK2{6C=5*d>}2WAf?{A!4kqN$$diB2PEo`wT?MHE!U(5m+cF_Uop1~|n zGxP$8+{_oUBN`{73pdOX(%fuxd^wyCj$s)Ie$EI&a_4~3CI6(au?h<4Ll?4y6la^z z1-GS!L8^yBw7d}$m>xiao|#Fr|(39eIB8#_lEn@2nBhV-!@x3(H3#xfZ8 z=44e1n~s*5aKJ4MGcC~wO^yImD<}#Ht|W8<2+lkU8`S>hZu6NdaK3%Cu@_R@)aANO z&O2O9rh1e!7u9x%15ImO2nUbJ{=_N_innAGN^EHPX0(`6%J+*)TQ7mC0XPg73F z2FnWK8N7F4?koa{u3ISM5<1N;?d}nrbd*7?Ref zNigMFM4_&hMdZ*yqPQ@6SM^2{J3WIwKQZwMuztW+0dx8ZYIr%I&F5QKEsf2$bAsD+ zVe+kp5yB!618}L9hrs&sL18N-{iQrq?#6E4xw+Ro+9+>UZvQKSQ4oo8uzho5AND^Z z#gm1KjPWN~H<$nG5LTTtWl`#rG2&MYc(6qQFKDcDQ=&~i&V4vZb`Li15Zzw1+>`DQ zTB1kWIpT+`$708I%`X(LlXbHhIXqOyHx?K&O_Qn#^uN;f?wL}nR-Ysf4O)5x4!3Wx zVet0W&H)AeBzKy)LZ*3iw6lLJ;CGr$repT;xKvUh$C|a+*B8SJwg16_t^g`L=xm>_ zpx7AT6!8E6BO6Cux?OcaCrY9kULU^Oa^W_QC;e=YRi5q~`%i$K#!%>NiQ&6AMnyCb zG1cNP#1ygpv=Wn{fv`?kI$KCC5!c=pd9U``w~h{*?c0R9&K%4M8qhV;M(!YMAO?hm zIrnQ2c3tt!DtF!^lSzzq7YGzeIqS|%<@m|9kkz>L^qZK)1I^IGZ!8x(I`2CG|wyX zW~kNNKopy`4#%_QN)6NPg>VCiI8x}UPScQ&dj-`xV04DK(9V<6Tck9j?ikd5DviKL zlOuwWFNJo-CNZQ@mZ^qaaj}}Ie*7~^%H;77%xDo@a zMFd06Wdc!0~vFOM- zmJ(VMxsJ|V9j2wB_2vCh$Y_`ni376-XKC8U6vR{N+vOusL@*{~NGz02Vt|hu*-fs` zDt-4cq>n_aFlF_{ci5VYu)-8X3>DG|I zwmgT1iAT3;-oz-^0p%V?{4PSC$K?B*;+i((MRFx=GX8ppVtvb8PQ4;hJ`M(s-s;wt zCS}-Dy4GmH!BZ2Vm?;*~l{{=|!C=`biXd0XQU3Rg2-GK1-uz+n`aP~>24=-TXRjr2w$KrKU0oet9VZg z?a$BQiW7mshn!eY$fia$6+#QmrN%;YtoRt2@&|0huUv*6xzKkEE<)H-+5%9^Du!XE0_<*gakR+Vqc_+NLy@&`x|@go^yr(0v2Z9AYl=H z3s*PSlB6zSHe_Pjg(;a!PDrHKrN9e#TqzdUyK~6Zd5m;{`68kMy6oW&g($fwCMKAZ zkeF*CGORF{!{)|Ta&T({;)%gTEEy&&%3Dp2#XRLcixO1|1R7wXW%^KO%qO!QUA{^p7~(n?Av1YseVCJt zdyFgL{C0d1Jcb>Y4pz|_23OD!G^774o8qNbnzb_6X>!K*fgAqnB)I~!Dkxfh(ACq1 z`BfZr#}-Ho+1v9-?D*pQr4x~dK^Ud;RezHso*$8BYPaKp!I~?pf+<{zCtFx(Fy6z2|^%~F&V8Y zfJ3}RvThb32F519&{@Dx&RBR9G}=eY8vR6ZfrS@33{oHr=!BdxzlU`c@O=V%vE~vj z#cW7T>OqKwrUNT#GDeV-3o}n7vtx|w^`b82J{G$%>>V&1!SOc4T?l^$DNI}mCn}Yh z4^N)<4T0Aj$q|@*fy%_$uCjJ6a;qw=IB-%vSF!EbL(!Ba>!%t&3U6@5NX)bGY^4F7 zZDeLd)R2|DM3UkNJ551k!}LJ{ZJCKHC3E?5a$T)2qHVS|_e{{@?T!8YChBk3)C-x6 z=f~uV4=aq~v?Qc}=t3VWe<=?Go6iR0hiZ)Fg9{rUtOQCu$U?Aa>-sRJ!-LY(l$bd* z`UVUEh<*SPhTk>h8`Fd0z!F~Q6Q&yl2G5USFk3v@^m2fZ?Qqz$h)=9v2LPcgRLqWd zZ*Jb+-$k!QQv&g@$U+5zxH%yLSrDe_S*M2-nx#5EQSl}KqehtEEb?OmZazDOR?3bB z4hQIsJ3}b4y%P=G80(x$q<=~SMFJPUV5UqnY zIgULhP+u0=HBX_QW)ERsK#8$a`=XmrxRHZamX8Dr$`f*2+$(I(Rqql%M9 zheu*vWyp}B8=x)Zps`g}mC9mW^j@dC_rjqBSlu0-4-vE_Hes&>LKH}IzY3vnEFpka zBNG{u@>CZ`CGZ?blx%Rcv)8=2A(4ho_$?yLP7rJcYt85c8Hczzd20MW-bS0yZH*7! z-rW$#Oa%!d4RCSzhU%GuQvT^vb3R$4&k0hCze1efpRN@H!g>)xh6~%IUVMXr7qKSe z>=$tqu6dB{(uay`QdOB--31p(C*&s(`yxra{_HHRjWVqE5AN=Og!$d_gm_;$Bg=6; z3^^-e4`g|;qzF(m^IJ4mDn(r zwY7$QN4+?Gu9`aXRRq!Ue=ZOcNx^{giygQU^i`>1xbVZ*^KZ=RoL>!z<7izJ9LVB5 z&L(4)m=_eU3rQ6jJ)d11pgfXasma8Y z3}+4Eky_ab#8eJJ!R+rW>U-1vmEyW`dGxIuxtpWiLLVC%u>>Pv2l9 z7~oY$7)^^A5m3iPh+f0P27MyR;5jv|8WGB7NtasgTr!SWdDWp{VC?k#d_Z3ymJt4S z{Ra1)@`-;VpoipVT$7@ya8M^E9tcz7XDZeokyg|wVMXeX&}FXx)?AURW^umu{!Osj z=sWXqr9I^RGTspiwxSbQbYc#D9In}q;0h*@#^ZD}nZFiVQ@F5L2-f@a{IrBku|oNa zbATJa^bQgnye_tcc}$DS<--JUx>6*1w%d8nehqTNsI98yg;UFB5H`XB6nU1L>0?V& zHoPuoGuC3ec$OmX&GMEdI_C1GTv{!&c=X=pPc#XJercBD4cVp7H7|GvTl3K6cy`CVXqCaH-4I!k%5T^NZwVTg=kxmvBuP8># zEa36`=&IvDAOdHUe1H$djqdFnce=(yN{`tFv*) zt(r)FfCR2Q$E=u?=?HaMm@4j6Q^aipv*iTaLbIC5&T$)oXM}`uTf|1Pi99LYac9Uq zPb!4gN}EmB+3KhZ3+OH?dJb8>sj`pwnuB2mt{hI*2DYw68ZdJbmXp3C*@~SoRe_jY z&C#+2=k`D@6v`9E=vfFTr9j{$iB^S`3M?I-AS3|4c$)lLa=`&{m|Q~uIdYsarE@mu zO^*v#VND!59xP%z#!p=v9-V7yza04{4F=9oA!|C1E zb3kCvuTIZsc9Vg3KM1Qg08*RX7bp*bj?ObLN#4B?V0us+-2Q9uZ@e+m2DjX%OQ>B# z#Dt67_7w2-2z4eSGs7>VANIuLC65@SG{jv=X7l>)n|PIx_^n#Vg%Zk^!sAyDOw98E z$-f}6w24SOB>fysx^WG0Lw#@AfGrPbO$U?&8hL(j1c9mAivmDNvS@MoB4k}a*$T25xsEoQ>k+qefZogZ>SJc1y0}VC z`{30&jK7VBK69>L^uq=x5&f9f1M-us4z$+t{s^dUzaz1CM$SD}5-Q}0S<2F};VQXN z#f-;s)tii$Xoix{-YR_L^cY6Bm_)J`5O&NmIIyV1m6hfs_WUIt$x}M66khnJY<``N z8m<}W3>c0sDXic3dn)6$at&AS)Q{l6yFe_uN1Qf1lk}XEN{#%M1(J;U!^ZUkxB})lBhK4S2MCY@1Sy3xC!_`hKPSL;FKv_4-fc_(v z5Wb;InptGYSH-5QEEGWL4_~!%Q0cyKM+Y<=6GLK{_6SLkE&SA$lneIH&owb=E0{-7 zedMWOoXH~!&l%TuEg`L}Npv#A6XdVVuMc^tczb1df}kMB`HJEwl%ZAYsmuaE@u364 zomE#iC9JEhEnnf|d4+uzd}_2=J?vqH%SAADMGdkT%A{mzjMiOjH#shp963?4tMkd3 zNH`*aZH(rmyNWezNNZzp+REaQKP=Q=9vgpGHU-4zPrvpgWYLHS32x>;!J94)0i*m?ivMUrVac6v6vc=kfEV%DQM#HRk5DlQz|@)hRA_8bVugqxc9~ zwEBU0g+@2P%{)v!tD^z*)Dd1hN+|jOjBJ$FPaLlgS6g-_B$P}9+uW4}Kx{z2lgsI@ zY5V>A44$N%@U|ng_c-5n^QZl4zismTBe5P2fC=LsPY*O-Pp9dmWoA%=yv%182P4c{ z?r&3sgJ3X~nQqy1rPay9)~)ejPQ>MA4Wik_Sm?p3^2yN~)3Z1xO-GPsQ;*O-H_hXjz7YHc@F|A4(J255FZ{T?_oR9bKKyc36V;@L=}CVC4i zOiyEMz)Ly2wJXQLS^zKiQ$p&g7v*X{P@ycIg}QaAmTE4&2_YApKcCeg2{B87>M=kJ z=ZU1^G$0kzC>bq~GBOb#JtF{Pl>&CIahFbaZ}W*Dj30lFxwmob{1^QCjso9^h(a4` z5qF0RIz1E{&Gx_3jrBMgJe%vhR049bg5YzECqK{TS!o&5!|42(S zTh;{D8E%QhtRg*dgL9esQ2!f$@fir+w!5^SElSgN3-I{Wr)tJOO8RRpb4iY7&NWQ< zYd(FMyc;{<<$Q}>K+b~EBQ+?Rl@+d}KX-MV>5tzYk(fjOl*JEZ17f2Py*4;XcM5)} z&s1Rp*{ZTF)dnzLzj7NkVnF{djrzNjExP(42M$V$fUB`hQksZLl)TBlAfrqMhge#q zC>H^!latzZJu?hZ$iFV^)IuCyhbnn z*}->$q~LKs0HKLmIo@%zw|4T%80lLA82)?kMam!#VB>gl>mB;9E zL6<5OnZ>LcLL{jx7=ml;8U+UFn~(=o0DCk(#872S&=ROf;*}I+>Q7+tV$yH$`iAJM zj5XbW9tiCiUNFF9Mlq!Q^1S!un*=&4@tFkop`sU6DG)hLZ8??LE3z{IbTIxDq4~2-~ zR|alnbov<1L&<@6U^{RXddch^%-yaH*vbmogCm7@)n#e;1#h@kTBRmP-~+EhUkTZa zN;JoMQxM$Y5{^Hs2>PF`HEv3$qzmeo-qCJwGL=^~VU_YIZTVHd@l5n0tMR8f&NsF; zuM&cX&tJ&CK)#`=u|khSu-{X%gyjTy#ObJ4K2 zv*F-EvQt*x0|LfrzVk`aNDJN3cHPId=xXpUE`j*5o{bM+O=JQ+hiSe$j}>@0LdP<+ z2f=x+##csu|;#X_>yZf8z9`J2LKp{(@}y zuXq~(#EbSoYilWol^<$D~uApY}t!*V?>cCvwjIQrMba8b%#I@tV2ululiyOfF z)tbIpxG)Qr< zP(M^wgg(3w{bOty&RlOZwZ*jaiY+LzshKk+`TmRZGt2k4NJ-K8P4RJ6i^RygLkdma zJegd$cP+{w9z87I=(zg@-FgVTL+WNadclct;Fh(0UML1L5`YvVXVdLEdVPU^3scJw zp?5^RzRaJ*#mFH*@$~4QS=KDk61&AR&xukw1r}SL@WUkty03>9;~%_3z(eF^BpNW! zo!R#H@PJw`RNuewdENePQ78QBq)_fwIt?`Mk5bh9zOVxgoZ@n$*%&8CBBL%cbA_Fx z1uT`Z0`5>^p86OV{aK|fui@t2FtYhOT-_QwYBHfmxc){n3r`bC?#q%@#?Jc^>vQmq zJmwaot^+XX3Jk_zGXtcw`e{twur-YZ0?R~Xa5DE@qZ_DMqjM!ku3coPpQqULTEO?^ z*WLE&obZ2yBrD~K-eE%6AT7AAeOOy96wdmS;g9+H%CR*{1dbR#ZpK1dq2P`*aDC!U zcq~L~hGlTUjRK19eN0GG7@c#?xUp~l0+DxaR$N7aR#{)RbYbEKP+w*GkIRn|=fN9? z%Oz}|_b7dNW6e@D2bUZHLY3!oMc-Vg=eS$i*yrcn4vwDPX7#K84BQPI0bOo&m_MGM zCqKq_3gG zmicf1r8%csUNah@1IuWwrI>9iEs@)IQpymEr8dBFDLBbc(F7b$((k>6lR(OtZW&|| zeaoM4$pK@_Nxby%KMpQkn3`QvxvQ9_D%7lWU6k`;h}y+7b}ar5Momw6maec5T+L^U zpKdAlXvlgmL#W^tt&sJ(G=RnCU6sVV3Fv3!2xme*4EfHri3jA31&oHI~fX#YK{WyNFBCpF)|WJC3QFe4fq@vW9eyG$hC+3h4@ z+~(D2f8P2;XE+T?DU%n7&6xCCbUl1bG&VuzMPdove{5(RAN7t_@9}Fi{;ReRH`8Y} z&u#639y+K~2!s{%S7BCuVG$)$ng8}+?zhk-N@+5GAtJpya>tUv9!<}T^3^_V_AiQ6~pp(bppNaxGvDbmE^|Al+^ zQ*+sIcJcGwQYoq@03gWJ66<2|N=N7s@0LI zS+9Ypb2kd%xM|f0^A948c5TC>p9RwaO`zWI+uqzHZn-1sI~786IVOpN=Ne?Wm>(c? z`OR)Io_9Shv8_;ziriz&YvoC%ec7vO(jzbC-F}CVl*1UrtB;@iQ=}$GEp0K9p48e_ z9Oi6?xzqCE{GP=J3c85Ch^F)FcM?+vz8wMM=M{lT`01u{j}MHv!{}(J0=C1BZTho@ zI!`x+LVtMF>|y&^KS}v!OL1Osn>;(Fwn|l;todu{chtScy=*;_5}+0{VFdxL$E<75 z3Uw8}%F4L~Aw0gd=rc^^A&ZoGBe~Ky{l<6~0hFl!I+rY0tYso(AoMMl7rCI0f$F+X z_&97VVlX}+zh?@4L-Esw+qJoxulPiob{x~rVH{?eTI@)?b zvfEMLJ}xB0kbG&Xj5{q&F6>^C?gw2*U@`yMuV(o=CQOjp*zcP#gGXbAf|rOzf?%ZZ z+DCs=Po;a%Spzn?9Y_{Y?nISM2GMJ8^H`iX)Vpm7s0{S1qW#@?B%5f}+E* zGAby(oxK8-mtI!i0By!PRtAmHX%S3$sl68_(30{qrlyXcFEg5*5=NavipE5%5VF^W zfo3Tk2DG!Z&Ft%<0qBHP#M>q;Mcz?;guC5)$Jc+md-$7$0d-r04PT#Vh9s)NL z|LB6?`;f^v{ho^nJ4(}=)4$Gyg)`O}PY+brCB_vQnDSDS?PAi3Qu^U>m_DTO z=O-al&sW+G6;>G{9C~w#6ued$rc1^Y|*~GD6@p`U8YU`DZ>7F{sQY+5w?+0*DdI6|sL%K0Ymi}DNjc2Zw6cND~+~KxQP7Y=rf}Evz3g)U4;g{lf)qq?(AR4 z8s_B}y}x^Z|4mn}cHl^W5GyW&Os4Ew8%c$xGU4l7(#Ofi7%tH=v;S{Sn{P7N`$o8?B#WGw*E={*) z=JW6mCIsYYtDRUO?4igp61@N!?SX-y+6hkcG~ZE{ch=j^>+0okw|OaNM?Rt&Y0?L= z+&y41O9T!ywA}>0k4~XG8r0Lmz$;Y1$Z<~yQ!4L|-k`dq9bWf3j{(xreWUCXsdXXE ztsGvl$nuq!gwhh&~NLy9Ocewx`Rwqa%Lfk}U2tE2&T*^C@< z4zwO0gnsV{27?

    1#{bs0%ZBdENe6#G@)q-jvjNqqSXO{6Zzwvsb_?rXgG%=0JCl zrTQ*(r38mmeF})3o-~nrPXRzLgg2e+>3cDtMv`{i(S*iy^9?2f_4?Dvm+ABP6+Ask zEi2c>?s4t6NzuH798t8rsS&^Xok>#N3(+rHn^Ex(!7*c-Qf|a#C;N6Vs9Ynk0(E4#oR0uElkiky@PtQMPnoL;Y~C#l zGd($?!t(SDOh!r7yeze98ya_j3BHE?$Uhf=HO(VgoD&rQno3)a}( zZtlQJ)2RL-eOa3 z67IR1=qO)YM3g#R*|Hdk_H&ZFc|mUWweibXxId#8xy!e!2yOZ6#r#RT%9YPJLr7s8 zU-y8VOZR%G3-5>-jfN@F0H+@>r#o>Oc@K6a)a>ld)mjLnME5xSy<+Ai@ItY;wL{#= zI+lHuucwz7^%|Aomw#87YolROlE;VO5j~BYqp*AIxz-_f34$)y%|XfARN=k00(hG= zO#m5O>vITcX26~#Ovi1VoBES;RNApr%GCk1k436G6Ps+o?~C*P-SzeP;JcLpM5iQ7 z8iRYjwxzJ#YR`pOTc{lhL-FGFoxkv&G+&6a1P2BVs=Fb+NQ;GT5nXl4|P72SXw%E$i_Qz(HCN9W?`94`;nePbhtn^AF>Wf>kYC5w=D%` z%aR*Bly83Hwng+RRqf6NoPK4Q*q~^r$g>?a;4Y29D{W>F&7K{}pcemS2U7G3aS(gP zYa_Y&<&YFTu4d_QgGR=;gTX!ABZ{S>;<7wiRUbV9Q9&t~Ilu=x$NQ!8M(C2IP0lcZ zX8A6z2q~B#5Dtg3n^GN!_n*#LI7B+T68u;r*YHhg{@A*(u0D)?@K-fh*?COHq_wxZF~=@}#z%Fw$mwgq5mW(ucD78{8tI<%~FKw61%T z!o{^gc(?2U zTP|Ut$}~OkE)og^4XZPeh|aN?>n0~F8_^=f7zBpG3&vYU%+XMT>5xBYi5~QF!DJ*6 zLZw#)`^8-R@`L`HGsMX>-pSfvs=i#!@DUO;*4M+BKQjfh@`0~#WTXQDhMLX><(tZn zHGD%CMp_(sCJ~}b4FsNc69bYR?2ZV(7mfBWeUFwl;fhaIutV;OYZ!&Fz6-jIgqdnQ z8L#2Fm8EH7-?y`+VaYt?fs!_KS&Njh)Cirs7(hBN^?W>*Bo}noX?oOIi|xKD>f^P7 zP+-}Og?;QFvMaQU23Gb9myfu%QlX^nL{<)6-AciJ^FetZlZdcB^dR58ZFnEuz?S|^ zGl2iYf5S49xP<}dRLflWhA$uXF9&VBQGTN~Bp8w3ZtX}sT{piL10X}%`%ir)@j;5- zFOn&R?$q+}Wj~pI=#!J%Z-nsF>@>lDtTYp@z5ZMO>suWC&y9((CPy~b)xT$=`smV$ z&Z9>eN-oYk@z*)JTZXi2Sb(yM(idWW&4Gr}hcp@2T=J-$6>U=X0ceE43EFp~#;dT= z#xwd>y9#>K>oa1go^B=jJ}x=LHQ;N}k43YahB=iHtc;5>DtWc9fTv8%i^T~!6#V@3f- zw5nD5q^>_qGieK<&bZA=S zD7A=weUj!qABq%hEok`F-)T;e|tc_>J69k_0AQ*d};Xw z;2ShG)~l&-+2!*{YLgM*;d)C1{Cf3vO>zWBWq_b3M%lIjnWg0Y*+Hz-C=@oeLTe<{ zRC%R&3`KG;=(m`R@@VW&n}UJ)3ir%u`_t6)LMovXBn3MifrU$oPx`~)jnSgH{w2lT zu2YskX2 z`XFu7Y~Cn4GbT;lwrmTB!SO(v5qT{N60~!HKD;zADy?isqwQfKJ(o3_o)WXpl#w~5 zWXf&(r{?Z3TmSrxgn)vE7kjX6iYe37IXs@}9Jjo9EP;h0f&K%3Uzoe!*qA)SMBty` zK$9C<-j<=QJgx0B&@SNd`3dLfH64o)j?6;V(%nEwBGQww3%6JHJY3pZ^`WgSVvoBg zT$4iLsKO}iaVCbjn;K<^+~m&)Mv(GtjY~9#;0S<9;25JvJ^YQX7H`Er&`=0wyEoe5M9|%?o9<#qjG4=+9u&C; z?HkXU1%*gbpM2u8uWiunhpK!~e+qJ?`eXA-Y3 zLK4uM|3coNDnu92zt;Ux&Xv1ccy-17LD}Id&f5Wc&$?~HzSTT7!jLF7 z@h(Cw@T`X|EVfupo_pLyl~FNBMu<%|LyMALph3J>?)1X#6HbmBwe}U7XTf$>M&aAk z1ewTggY8Lo#gX3un-joL{y?G-&EW&M%%n9z?Z zJmQajNh%dDx!ul?)pnB}7ftboR1x|@1dAeLHQFf;MMy^J?uzID-CPzMr^VbA98gGQ zpzd|^w3T|a@+kcYDyL&5p0BY$y%-!4h|zKdvCYbgHsl)NDN;2B+H1I~KIl%dZ)qcl z9gS&iIO@DnY+W~ z2aYe&jXBjoyE&|^o7Ym;?Hv0k{iYfV9?MLZ5Lm`{MbpzjuD8kQ8`KH%2fL0teMpr| zvI7K(w{EE>Ra+RZehn{ZlH6_Ev;A7)M)kM_6oaFxD1)*7Rv%Ca!HiB1OwEH?gAG&| zzUhk4w=Jb}bF0KyGpR=eZglX_+H+P&{U-*s+Pl5T9Ey(xxdmKBSdrBIc)l8dRR94Z z7A9R!$3M>4O#Ax^6~x)q1j}Od3%@&*D|RQ(NACJ3Hr2w0jx7nyxM5^mFQ0p4rG{il#AMq)$9K0mpg0fmhKkal=$u*MJQ-5WX+k2rqt6bzrX8` zNCKziA~KZy8rdb^g_xBdxJi)3usmsRFYsyOUy8hMoJ2kb_)d90csF`R2!qixIaPs~ zMhAdN4tMlj(xm!fGJV)TNsn#44psJ^cS$pywVNd3ktEX*+oEo?yHh5b_4#tT8{p7f zEf@!uikYsZv*6Rs@1SWUpBdQf6qJnn<<=kLG!C=V?hA)5Fz$2Ui{SO}dIDVfMR zpR9BfmhJ(p^gAi?udEJFDdED17BvVj`Lgb^P|XUh=dYjxDt33WdZqibi)#lfiVB*o z_Pb%jGz*#RkC?JGP=?>@5(SeH#K1B?L*w=0hxm2(!NvEPm_5l0Eg-8fu%|U}R1Kbl z#>;}R=@j1&9eAAyplkM9zgm7_QHW5u7fxdTQt2vS3L6ARn`C5YA39-!F-3PLLoxn# z!HM(+mw#SeGb&X&wVE-ovtWr?#Taqc$Y{Nx1WrPFb(P$$Sm{vveL$2Rhh7%*ErPVH z>1Ox%Y{?84Z1fI;ZuV7lA!JEbx|W7QW>tTAxlf2o29oo{_*Fq-}ZhqhMEi zr@)sVpeiw`Fl|_b-k;CMPoBp#HJaWR5S?aZkZKZrS-kg%OQvA;{8jyNyB4f_MTUX5 zzkG%BhBC?Job{RrgrmdM;x{RPU#%HYG}2H;j0vO#+UPF6#z{jb@@bl_P3MEN0ek*! zxp2~zN^x6V4(~4R&xFK5&l#u(lvgS>U2U;qq?4`b{S@a}Y{qXObuX#`U?Vi|t^qQF zkV*}nkKFab5d3TJe|u+)u*QpsLk`Xf9OL@dba>zfhm;Q7Il~@hdv&oPwYH>4x|hZ2AHG z2|-yXbfsXV?Ua;QjD(qFx)aypD@f+b&jr?#A2}8Sr|R@PTYS15bsI@vrb0RUnqGyh ze)@On`#7D~rr?zgNNnNq3H?4@!$?VI)B_8OBA3|9{97M!rzz)GwS8jS@@-Ee?#u)nZpVb17$brZaieO}I2B%${c zoIl2FqrXDPaDk{X{=p=hY4}ZGYQ>!i639|W`V;*L0T2wNUh$9p)3guMbpzM26=?-o zX&GRBx5w$bRG(B2$6yV@6&8zESYK5+j~v&BLMc`vlphu5OpOSoVs7!e5M=)_+;3Sc zH=Q`qUgMm)ChgA0Q=n&;+KeJP3LpV6BWnp%^b1xfxhR{z9o+t=xxz~Yn${L;PA>nc z4K?1KAX(w^1!Y*j(?snPdvQ@*imrkr^sZ*rH-K&bOl6#w4GR3TVgPWVECnNd*A)xQ zbQy~o?$@wQ@ZVO;GmQX%j?ew<%df%yW!gj2-ss{GLW`@W*ZZbT_lv3~VsW(4peUn` z-Vme~yZnHvyh3nZ4oFTHIjB^O4_jiIUl_#ZCN3qMN%{jYNk#!>yW^MWG+; zX!Mh|zrNe;ei45T0xRbQKS#9;D6&8M>n{az#{+f&E_dz)Fttw@iZTglIuu;9UPEH^ z3dm(&P*)3+F8B10sZ1=r9AU7+@}_7?jt~Op1ch$_n2tNJUtkd!odHZQ*2PlOXkhU^ z%SGb;7fB7FUclxrWaaB}h6gF9TC(lEYbjo~cP&$^s{v!aV<)i9Xlmx)2sIk(PZ4<& z?l^`5-?>oA%L;W}>Bn=3$ftoe=V9oyprdXaFs!>3m9%0a3{z8m0KdSc9Tv&;k4)DV zk#D$Y@JrKQU;~jw6F+X-2*yiX8J=D>2zO+@*TGvSD@$lav$CQzHW-uCm&6*2!qK1+ z)WHDMYEGh)F9{yXP4D+340y3n6TL1p?5K+re!!ebcwjwLg38riHzBlig0%UwZ#P$8 zKEFEtF4ZpV?elmuEs8{Kno`LeSTi_auIMq6e{geyKjeXksU{l@_?O>Q~Y8^e6aX@7aZ zvvzx`@D}GY5N&f;%dP9>ipLOM5KPUxr~bIn_Uxr~kNgf41io63SjSYhZd$Fwk4B;Y z?K6tzMxZ(zt!5x)!sTQ8Zt{X^MDM5z9g>_W0OBx2gd;;(tP0Dodo<|kS&&kY<%hFk zm=}RNq12bw-$S1Yf1MW&ofj~24brM=BcbjdNKsx1Q%G!`Wqfw#iiml9s!2lGZ*U3^(`qpZ!3y*M(!K^% zc)o3n7-+Wwz(RJwMTH*#>-1dd8Q~fVLC0mC{mmi)vwjNSP&%4g>k5bOxj6r`HyGRv zU~WswFie?lNq)PTuP;!B%B!7V%`mX&`+oIoMF0rFqTrdxG}8LyCqStkqm&1uSy`{k zWr$v4UKHA9IeNi-Rf)NBec*C_V|3n5SdWvr*!^wxvfn-@zf0~NiyzAs5{LN+s+Xhd zyKe`>*UFwAPupL{fQgWQ7oLcUzkom0TvwA6jAR&`QOFoL&$;$Q2u98(+F`Qr43~H$ z4447wgyrp1byp^{gYQkjYmR!qbuFnXEso3?xd{v{UW z;TOT7sRTI}jo~-KXPN*vRPOM?4Ao4Qp zcRcT+fnmvfb*8)Cb-Sq7ot$fFjfTr$kCg}WKb_BdvSGsoMmmvL>H4?8E%6m;{OId} z31A#a&$euS8XaZqu>aK^7i9tBc!X_l(_>;`l$bCYhocP642uzAxC*Ir@HL$SU|FBV zXtaCT3PXa^;>w0<>R7dcB0Zq9k%Sa>)5&o9M3(dp*{$&pLq%fx5F>@7)j@IG7{NV+ zH5n<&-c?E+YtYO((Z{QV&DY-Mm<|`a1wxrLf|2jX$hWna8UW-HQ;XIDUsJA|co6t6 zcbX^|w7v$~NlA=V^kUnC_{+u=1i40Q2dvqRRKwH-W~$Jkse11e{0#AXpPCq7i6P)I zL3`Fm*~&O&hM6uZa(G}b#*6%g6czg;ztVpn?CIiDcP4lQ55^1+$Ma+ zo%-r&iR*ml)7=vPu|aLeH#D%OA;}SesIx(U6c-xFB4!rG;1aZ(aPfziXSWr@tyvFl zO@JksXp^=_(#E)u2E$|}dfK%-^m4JFTX4=gKKH2NXbHr+`7Hjk_3k;aLh#2$c%3vI>EOjpwNk@& ztM`jif#~hia^v~>851m-Q@-6^fjH&tTJ9BXwg^^u{j}jx7_D#!N|jy5L%WO^qPHss zp!2b~jxNmapgdf{a2p%^hkx9*hqf4~lAPtL5|Q5F9-wD7zf>{yxD?|b-X5%FnOpO zgX&_9271d9@e)@ayGp!N&ne3*^t{-R`C=Eh+3HE_nNr)?1cj%|J)0Bc z+G4%NcsS^t>9B4nnMJG|1}|Z&=6q9_!@-^9HddSZHGNqk+m=Kd9cE>M9AR7lRG6h6 zVl%LGNFXHHW1jCXgVptJ|2Rb}icAXxG!si82uDTCKK0Q^t}7NdJ(l$&nIfc{P|Z^N zifMIN*!^d;TE6fSPXIYm+bCaqLdlzQ>(^Bj-aTB;vTpj_D%HsA@jP?wi{$RmBv(Bt zoGcaYh%Sp=Tr79Uu1g5Mu;Qf@ePP2XUm2Jz9lNZ)zuBW|@N|Zw?;2y(pzsk`urWCT zC*%jd!|H>cC+S|%IM&Rk+_NReyl_uqhp~J`D?vuROs-z$k1WGVM&5y)7PP-ytrq)O z5%MbwjHVS1#fldPr$&t5MB9d2^BEvCE??WOs}Z5P%`0f;dpJeeOd^wf)&HwMxEfx| z%`+N@>!OwaIhOGAnS{RL#4+>j8m>ZVs0s@|sq6{-LhUlL#ml%k88_9*13F$l0vG}% z@!KnU7tR}&9$EQ~c2aUNqtOhRcnpCKt#rJP{xSfHAKbZGHmBHzs z2gWa%IE1SmGfhC0Js~Mlq%FZY(U_E0;b4K=Nwm$^!-LucPAZ4oU?S{uD68&AFs?>< zPat(qU*-(s08-sX#p;m#6rBfhU*X7_OR(rrh_Dd!aNVio=BSZ&p0K0icD2zusrF~q z%Jn6=go+mU?a}@wpvf$!U0N>h%DGHRVe{y&5LXK~ajnoP?0^3zzb)inklcg`FTB>> z(2-8B_Vo6zK-G-2X;3veZQYF1N2w-J*6sCWtQb`wiNQ65WXeV#7_Qi1&46KyE;U#ev3hp+eVYUq|BUFSpoo;=fx=MKSHY6* zcRzvl;5gde=hUBofdfx!i|5kIyv4&65~A|(eK1#H8J4ge?xNQWq(M-uAMp&*xQD*p zG-`9<4rnAh*N)UTh}OG_DKua7R{h@X5eGy3bmwE!*{l`%y*YeW_MhQ&gVGL|AV zz1^dm@#e>V?J>=pd&EJ0lh@Dt1D*GOjJJc;YNw@#mMTnkjB_V(1s#Jgk#x$HRkx`> zK8wIJ8q<@&=QwjEWFMoS!SgSqLJTth^?dmCi#yJ0A{A9|a9^awfN;)b7uGoUuTTGd zKlpleOYCVPWJ{A?umYn$NSc&U$9y?cK@q%F!YV^>;xLu9(By{I#_dQsU~BWMBpjL@&=ily#5pH@Z=Bf0M!Pss zVF~=ov$1Z04wbW3!$?_{ubGvt=U>_R7!`cjU?^Y3JiU%`VCfOn1+B88B3IyUYD5^ zVK+g9cx}uMz0YTcmUePTWR(j?I<0f`jd6MGE0;OaRQFKYp$S@@9qN3S(cbVq7dTo7 zNOnF0RBBVHTQME~4M01608%i=p4fK(&@hG-e3As+_JE+!9PA(N65vS5WzQOz7m|h$br@sA$MOpJ zA@6?7Sw|gjX#iH)H4?TNGJRUU1EtIDclO&d2bdPq29-i-u~Dp(K%%fVX+H%OaTMh~OBht++c4<0Yk zupkp?)dM*1eRm!}B0T`S+$nLY94)I2(YTJYI=qfLglK7*z2;$>)UdT=Ub4}J>5AI{ zR=j^Y094VlVJX3gyJ1CG_e7WN)@&HQbWRpz3bKmg2b~=(Mhl`ZMs|*45a}#S{q7mv zVQwqkU+{#oj9!e=TM$xI*d$(hzu^{HwpUxdXU463g;dQ=H-zdo-EFM}s%S0@zZmR8 z?asw`%p7G?`YpHll=hI@q#y>f73S9aa7A=5yHZ1JIc&J$)qi?IngqQ=T{rDmu5>Yi z@$9Y-GRyPRd-gN0?s#P6@JbFe+J26%qb;OOd=SSmAzZ9|q7jU-I2aY%x@mVW`%!>( z4Gp@BZMgJVI%JIyam0nm`oNF6(Upbq`pJ1o5VkDn0&A#N``lfgqPP_!)8WHLxXO~* z2mG+2cR-qN9ue(}AMkZC**bSR4r(;SiDX!#JjYbBkUGlmch}!;+&wVWUlkND{ZbaJ zsuSv^;beX4>K<%ixA%j8qtL)HQ#_-_8`Ejge6z3>iI~-kN|jskuSnH- zAKS+`3!nGv`{Hx(?c?-lK3rY%bqJfdec1k(uSajsfER3uHE@BTRJ;n8!HzR`JYIB{ z^a`9jsE|XQYbM_t<;80I&wdW#5PCbK$Cv4NxsUp*wauTWmt&}*B+5eY(!#kg0-Cw} zlo>O`CSIY*>FQX!5_FLPf`%>BT<5fsdiXD5d<6h%P~unfuf(grx^Qh1qaDWqVssUi z!xzEEr5S|!Q}}Z@H({||Stx!YT0e=0qVER9ztPW4@9p*%fID*Sb1vCE?r(SB?%Bon zKlgujb*t*F`i+)yF}&`gC`Y z^4G=3R_M^n&0i6Mzh`B8GO1?ld>Br5stMmfYJ4^6{k?d{bdaB`G<5m4d_&G-bUEE! z_5aW1+1cp$e~!F-WM@S3aZO-caOCsF_{UTNVW=g7mS1hJmi|XF;V4Z8z$AA~|@rSL84PyNq7kiecDKI8#TsjuuYTFrrWI9VhA^S`!_83!BHflE;Ja zAkcArbOu?9-bf#N`;41?!MYf~8hF)Czg*GHz{?BUzu7~+7C+jIftk8-H^*oU3bWy< zE*45LSgxd^od(GpSv{qF3&dozgm*EbdCz;-4$WIxNVCE?5+YKL!sPuBnno2^=H=74 zAq5isY!e&_aR`Sfi`Rd_$MB-(KomTm{USI0E^k&D$vH5cfxhtSLD1Pq?OfXw*$Za8 ze4L7>X^@5B1<*}*nd2DrLSaeG|!+>R3H9ou?FlS+4C6p=y?j@ zPOZW&&EL$_9&&`?=GMGpv$@l;S#>e=(lUT}B(cdZ#_DLc4+sIi^UI61GRn>=<7{Kx zims7lzk;aY_GLOsveI(+a zIL5)u#aWP<;z%=UrzjKd^`9%zNw1t5YG~6J=hGwuC=py(!tJ{EoinajQyz;!EBg9_ zkRKIe{K`8-!4TQ*;S|JLB|{8wV?cZ%UgEmtq^)q2gtHD* z((i$IFK5R)S`7P0!~y445V%*G;Dm}+8Gp-;E}JR9sHe<+snH#X0ZdoNK+0gu5dw~C z8w zrPc@=OzQ8fIFOAVhg#X!VW=V+NG!X|?sIVQvE8kcXLmkbGTWp@o?Bpthka!}Y--?c z;5s#}G5QM#%SbLJTDBaovhXY08i+w2vxWs3IQ%f3NEqL&$N@yKyA>i6_R7$K4RCQ; zMDU0_37K?0O7{SZ_Q&Jl3O5P5RA=-MLXg{qi=b!eHYml1>#Z$)-wmed0G3m06iEn{ z*a~vn_Q=9P-{Sdd)pSu;wfLPpjlK_nPA8ePzn9I6zjiJHxvmlRC_dsqLP6HJY0(!= z6-xp4Afyn*@>NtKBn=MbVg!U*temPFw>#rAta`=o!asEEgx(bv+s2M_)^khT+uCX1{d&C>r8sThp4n>f0kQV~YpAB^n>iAoho*Hk-w45@q;4 z{=uJ#5y0gh=}wo;cT6fI1*oVP{t_NVaag)?p*CS`J|5QuNIv()>Ybvu9tdUUlTenj#jPoW!;Uu%2F7WflFG?f)2HZ=t^7Tzf`X1zd`?DhqA-T6!kl8I;q7C z5L8gyPyPbjrG@8FC_+|1k>iqV@n_mfikhPR>hL*``*8n>2cno_wX9-O+1_&)P@* znvs2yfb7lP@L!`2VzrqqIXQayp?U(Yy%H-Z`4FgKW>b9Fc{o9wC7KXDMx!Y!se>Mbww*JDK;g?__A%@ObQHz< zx+;l^-G4z$6ndA}5WzmUMhYuLUgRu%g6R-a>}U%%T!9P|9CxE%dLv~f1?U82Uus9i zS;R3^olagD#x_T{ICZj+SmC=c3tJ(eE9^fNIJfD85N1T9&YbRr{KW64~7__Ksj-2r$QrlR`$IY1Z=QwVrSZ&dbF-!1A6Q$A> z!z1rcHj%qQ!#UV(K-f&puIMFB&9vlcyhP0u)1>97dODj3Wx41%Ja(`D$Wx~BRjpbE zZO5UgKiz2e*Ev%zwDmW4@&f-+jRqZoNQJ=Os!B~q!H%YzVIQV^P38E z%Lkkt(o)Psw!|9fqz0h_d0iJBE+U$=?}n31#uCpL=b&;!;Spc!t}ieqU@;T5Lkyjp z(xqfOpB0sVwG?JU#SVAgTXzx-SHwyb1UeUMGAlL1urH3m4h#cqWL8ShW`jdpu0*nql5UHu_Fi)A-jyz9xnB7C~XeEJRpW zHa%Xg$Zz!;GU*JakoN0z!W_O)aew$myuEnu>GRdL3|DO9Tvi}&pfDC;ib^&13S8>+TkmOC%Vmf>s6>=BRZt0^q+rAIfGe*(E=g zY7Y?y_b{T--oHjnNEAf&@e5X)ggncM?l%=wswwZ^Z9yBfi8<5LH8O)kkL~j6;ub{+ z^*T8-Uq$q*xo^_h>uc}dXGMkvf9#>-;^XKQQJc;5pZXcxNDV0~reU=`Ub=pc^WG9a z&_)RzEa~B;O6fqll1i73!=s^atcdtT=SR3a?ic$P_PDsjuX6zeM1>H~ zCB8Md#i%v^C$3RCDhJrVxVpoEbN45}!lZAG5m2pawOxbjX)4oAmD|GR?m9>q5;eRz zJezYBpjoI5;*&&|*1;d92ngA3ID3Q~QMbMwjn{x@j)2w{$FBK+-;wr*x)s^v1JojB zJD_7O}xpYv$RJaKE?it5E z0yCh8qA(+K0pD=7p-`xN>1wFmq)Oo9>L;hOamt`DzCn)}$;NH!{P<)3^n8PIoMoH) zW;C7o25@jn?s$Yd`qx)@zxJBKy<-jrIA7sk85bf>zE-I)K@Ev8W(8QBVe`eEliHo4 zP*g>u(g8EPjKvff2+)>lEA<8lLNl z;=a&aNp(gvL+GN!dm_1T*Na4wkO`dPht*Gz`jI09D6&*sBaf*sE~VB8~JIVnz0G1GGALO!!|-qfB3*#Cb)p6UP-NgG8Gu5{wxC z0vpNOn1;3c=_RM=pHb|MOIMlS}YdP z>~Um|%VA*`>E&m~Td_saaLPTh1l?2ore2IahNGfxwoYNWOko0=_=^*BeB=jGORd zS+#VT@mY;Y>qC(>a5rZmiMcub3oRt&RCV7Ba?&VZD=fYLfby}HN1*`>*~L=BSa^>? z?!voX`DOY=-?ak|#o7Di^og-s8Z74BeyiLF5zsBmT-#3cAB>0!WsWV08Mza|?7*2K zS(B7PMvFQkGStz!#>-7NNbwQ{iKta*cAiMXLTX1pZsrs38YVjN87Txb-Uc1(2XU%Y zj?t=r(EH?Yza>Uty6JpGz-7OfBA}qZ5rURz8ig&Bl;`21H$|TxDW9!qH6#ILbqxst z+h1yf@K%}}ZkjibKN7`6{!D0B&|;Ye)4TeLwU3649SNerF}!pvTV+&c0`MiRxEgP2 z8Efy&@LAkbC442o2(;}6Il%UDgOoEq6@5#lKu^!Uq(FKgFekJ;9Yu zEX-=d7A=Y%_kZq6VA2~%)EENDC5`hy8=@~2)|IFJ#5ZBBJx#2VFlwc{QBko-+fjM)J8dztaknimmZe;#Jw~Hj@}?E zrXJ*8&=i@lqy6NrS{Av#?A>ul(Hrq!8pm>o_4M~}k42(Xo;EuaLfK1QOf^j9psr|y za-WR^b89wXHcALwTAW6M50s>iAoqJi>v5Lo4kMx~Psn@=j7HB6JXYDCUem;%7Yo1? z@JUobkY2wv`(e#c#Mi?~3LS$Jn;1-sXz`|uZj_`ahDLA~AdotEg45P-IM zZ`DeyqJm*+pW5x1vW0Rd^RtV+$R5PrSN9iZ1JT)vGB{>}{6*Cq0Q*g2aq!_(N7OrK zh{pNdu?oty1Mxw`1X#GNhkH8y_iXKY`Z}JY%iYUVebWJ(CL>X?KoTC_Vf@x$FCn?W zy=HvidrY}FPVZ$cz+fV@mB}a?iwIo1Q^w>G1Hp^M># zWmCMMTKCKmP68^w#$>lBYnAA0FDtb>LLBSy$2|iW=%*^&U@$)`ux(;Ik&x%WH!$&1 zn7kQhDQmRy1Eh5k_#H2`0x;W5Dh{{LTa01(KsNRC3v_$Oe)fD%G-yazH-Wkm<`AEp zVitG6mI3noYX~Dhe(BBoud@4~3dz#xZG$1S?ENp6E3U7eIdN8{ZwM{vDO=IIAlcLJ z4bF@JDw?^^hLUQ=b`4U^aUDh{X;S%~ zhpcp`Y|#+?yeR)#qAmZqJrR{c%Ql?#t}lJ2>QIZh84-$baZh{ z$P*yoP}!Evs$*&SS6C5*`yIX`nR~~|vKI5n93q`H8JtLp5rzkqbuo%3ed#B~Fx>5T zcQY4^D1$r2&h3}2;lkwQT|uFa<8^T9X(UofM^1c>uD8e~)XH%f8ixZ;NI2Lt@NQQmdfPU-Rk9 zB))G1B9+e*U5-nz)sKa`+(loh2Oqv{0#+wh&@UK9C<-!o)sJ{l+d<$E(TTF!dP#~& zxfIhUoT_Mw3q3={O>Ptdz%*hl)Jj}qQ3ruxw^ZEXHRkg*mUC~vO;8e;u=Ee`N zn!kx*G!-bS%cQF(5_V2Kuz>-@n`tTZh!FpxyV^hmvApco#dlV=4I#=5t~V-?=^lf) zdUq&2<>$)6lS)eo-@aDB;Qh0kk<>0gI;gBa+FL3ebk$WcZv=u2T~kZ z&Z18Es_X5#K!H+#Tz8J>&hhYf0HNyW@Ja1j#nDBxXK?j6{h>UrT}qp!q?dwSjHI70 zt*+n>gGHfIvR0*4E%7<9h@^wSI5is7tcs5}?AN$GO!I@;hw7P?w@`gU17>WJO&vxo z3=D(=mTF}?g4C!;`Nrk-)t9qT_kT2oTG26{lkLl^XzS`)`Gg_X3J*mFJx7RrzFVH* z63&ioZ4fbD;QbvcQh?Af3mS;yX-RucAUHAMYRs6Mjpl_vYC3f$Beiy4!IkG0Xbpq_bj{Q89Wm84lFKMJ zaI+_~g8*=?c(*mX)~D)S21Yz@myDKJVJ=V?!Vr8I2qTmcF`j17bxjfG>DUz`6h4;g z^~cNU?i&!;2d>(ImPMj&i^4cG6pJ)3?y4+j-eMsxyPdX+*s-eNp-_T`9!XZ(<34e& zX$Ypg!fN|@J~RENq1Xp>KEOo~T!~2GWQ$W~ckLW|cUHLH7c5(8*xltV=?ZCx&jPR& z1@jVujpY5GdmVEvze_8bhz4`X8Jrl>YbEDopkZQLREYCoiyNu{hs^fk&(Ks9hOv8$9m0|+UKE7A zN7^7NghrGY;>${_HJcqBKNc#O!M{bUg>MuXPDSX5-Adh>&{lhPAce4mTH^cSs*XkFR6#|Z1J3;0uliUj~}2#6;om-=i~G0ErUzhI?1lL1goHMMMKG+ntbhq zI9t_3i!aj{1B>QJxLPM6n3n9FtOE93VL6RRoS66e4US^F6gdMn2F26-*Yd-SFrOEN zn(i*>KxOA507I`EYF5-79-#fVqElocoF5NOl+1)I_BA)HiGY(mc|Pp>Jy{a1Ew4F7 zuw1eDMx(dA($2u=bJ6LpaG(OmByJk(!Wp0Wbhm5@T1ww)#D^sT{2CxA;GNpXe}6L= zp_#^k3>sFg+Gp7H%Tn~#?s>C%ql(0lOlMIAheZL%ZylS6fHVo&oMv95`bmgeXVYRnV^&uaP4_-7$52C+^(^VU}ZOzulQEa~TYh9~9X@oXHv* z*+xV4p6yDTy2T8eC~tY*jqb?AF>B!>D?e;P(gyK(rgF^qFhKb={+rq(hKQBlz*RXz z36Z1+psRaRG>KP2Lzr$hz``V(kNy^usIF%~a=*+#Pw&41{GC9a3MYr37t5cf+G{L4 z*;sA|eP>J-X2C;P=$v+sqO)jD;)>RA*jm}qautax?tnYw#VuMV{Fla`EBF$qfbZ>H zn55~zdW;NB`fgXeFQY22k}Kl%s0rN1Uq(2_V?M%&{KoRi=?nF?pk1-7U;$?y)0Y*! z)E)--eapPOm*Dn6LEoCNr3)r_o#U#xRP_ zTg|i%hy2PTS@;7FzR-6oKV!PFoW2R%U!IE=!?6n&gsS&1UTzxzbhvpsDM|Fn<#cy5 z{(1U>ex<*GMdW?IO|SjBpqDr90Xq^6SJX&2eQ-GEo6p^|g@HxEFol_VbG39ml53y& z;XJ0w?@|3pw0rdnI6nz~gmU7MNR-E#!uWcQ?8TKJ(4zZTxhHJ?nyA~MFYt3*KPUre zR}vf|sP+n*E^U#$d|6SqBFQ`OOB`wNrD2(4MGFHKw*wzv3GT392fQAj=}N$g8OhHO zL=YoLEeMc*y?tQDoi6?Y&bhlxw@ida7P?*Os8o)ab~>;YcN+~7_xcL9 zDtyBa+A=ix?o!wRORp*LiYx`g{wlE;DNh3E7mYW506vChRmDBqM-J=_q;Yg37+YJ8{H^1ly@a(~FQY9-v^1>1{yfJhsxOZ&JfqObQJdNVTL;VY_?V zh|>A&+`%l>QMUdZ=_efk2D1J#{11e#tC&tm(<)E`5P2>45)P^e$J3A0?Fs~pWsqtz z0m+(nyW+=)th063`f8_wRQ%SK;7zz#q2hHKHga+H2%{^T3X}3&%SWMP^IaX0PTc9` zus66my{7tBBeOX8a|@T2G8nA8Xu@n?GC|vw497Lzi=UBmz>q+ z7E8gQM!N@p&zH&(P>`{Gd%NC`q+T*rF5A}XV<^ld`2^q3lMuS4%!$ze%m({N0HfQ2 z9*PGVY+tv-N3SS|g-L$(!Fb>aoEk*2_>zX%#9&t4MIjm$P}%DzCIzMb8;Q^+FYT*h z{!f#cPNnkxPozLDR-3-sBHnJ(M;wqyaPa3>r)PumwsbfHxsa5f&>IPM94vGZOC9-Y zH18jk*L*0+P|)p9d%X{RmJ}%+T&}L}Kz2}d&)*FNlSI)(GDQ_@!HA{yzG_o1h7k}M zX1)VpU`Nf$4eq49R+LgA#LozCT|F(4bOut2Gy8N6dU&+r!Ooo{DED93)Pm%(tW2mLrs+yp1p>`H8gB{DeX0Z|Bc25P%Yi@vqt)>QqtSt*TrIFV$l}4O71$v>l#`|j zWCRB?ci^|fJ+mkb1tY9!f+_KqEeK8GIcm+Z3Qzj;cE;Wa#m}kim4}Ppi}I>d|7YR( zoNC&?Z}0yY-SlowzstE=7>Ai|7rT+8D?fgfZ|alF;dZ((cCZtQbQW9jez@9i9;eql z907rppB?M(@5J0}`J>N024?T!U2;AZ8%GyZa;1@oiRKWbL8YmMmnXfY)I`d;{){?@ z=#?3S1T6|3e@;9&-=m~H=pZ9ff5-)AWU<3l>wGw!{Jr1qhScIA4DDe+(`qlo;|Fwb zf-`K3B^6ynXX{r~lI4MMvu%t9=3~o!>`wP`x^q_?g(Jn{a#u}JrOFz!xETv2708fR zcwMu?=|k(hfUh#oqtRUc##z=nkTiMVSad_jq%j5HYDSSwgR$^Z6HlXFP^`$i# zddG{I6^mB1tx_0*O-!N(rs^$^hya+_t6Ow*R5(vXxPH_wuf(EYZ;iY!XLZ4$B8K*y z-O%8HYB#j}4D#KaV%JX3i1a$-{4PPN=o8Ub9p{;rr4GXmEY1?a)=(W<=WBg8rR95z zp>sGVp;BU)rt<+nBUa}j&5R3STagUm--!JM^k~tLUQJ1IX*r+IEeMTY^p~(tKi7ol zq#Hpk-pBNLEU1LFwLNR$bLz&L$DMsI)z>pM!hj_IAD^!QNRR$)C#WxJhID!i-mW{1+hmN z0!6%y2rj5breo)#8pUX}g3A+v*;uy10yvF-CeL(1x?>OtK7&?he>e*n65Atu`5TE+i9*zGf<5iZ@& zTWU024~$H&z&0%uDewyr61#XAKasg6S?8{W-BYG^*6num`PAAtRNv_3Cq2GQ`R#;Y z+?nZ$id6~k@|8!#6D%&j#(xCQyaqd5VO|DI(@HK}%pRYYND=GxDLt^9`Or-3j5Df? z2wF|XwbWirUL@Ah^x_)g0H1H&mD8e=_$%3`K_eJc1OQCrTftO63%>%X=N-yYoM^J zrMC3uuC^djpD)n-+h9tm#wt>n=%6r&-8%I|m_`Kx)(ycAaX%LR-mDsPgdje75}Oj` z0ZGrhnt_2HL!rTmmYfAa?si;wd9yBvZ&etR%)^j?Ur5!L?t8lqs_#RDINLSfUrB3v zrGGhP7_s+$U<3@YYS?HdKouo(vf${e$VEkGIh1SS6 z2GS53w`^ZE-lc`}vRywC49^2&z9LMzyw3h{Zn`iQl-XCuNDtkV+s8ex&~i+G_op)u z{+|mF-r!0CJB`(IU>0TV9%|MKHL-J7Z?YC%6#AUa6#@FC z>`FBrA1NqQV=f_WNwKh*-Rb7(JHv*9Q-G9)($y*wo@yLCT?N2+ZU}W|9DgS#P!)tw zcKEb?stwj0oizi)vjJET7=}rOV9v{8#|>sjR_M`pw8|TCL$Du=fYn6^y6~a|-2n#< z?#K@*Dvze^i)OuBbKIoj(*D8-L9j@spTHjuHW|iRRt{CO5K&?ilj&@X%rQzkqrpTvh>8}Udq`Ctp$7A;tJ&7{!Xm3>~>K@j32D#9tA{|Atc%IJ*2ywapi z6*ZQ3bN{Wy225TWJt^-BcZ}d2`7Doh-V^;>~r#(sfX;;O{!0IV5K=kddK^@21v#t^NbSi7v>VlsUn{^c!L z9MYDgx}N1ckQ9uo(h7CV6ZUX$ECDRLmCm`kI6u1{D63c?K0k5WVxYM`1PKKS#OTcn z!qzAbZ!7|c;%Y^bqM0f!ysMJoA40R)Z?Q1rBTf|w5S?l4S}{b5KNa=|Hc|j%Ys112 z%FV9RbT>igSohhZi;Hx+Xww*p7NthXrz1+CIFIc|`v*37iUp_&wZa6_kL+IH8}a9f#YBvlcS2Wt|xp1w}T$=J2$2&PoAQec-; zk0yQs<0&!l1keS&aVsrN?d2~p3iS?F8aKitp0YF3QBdVe7&O4#Am0I7pjF8(Ttpyd zfWT2t8`c8-S%5Y&A76m1qgQZW6jsd~c8o^K$2_oQ62zqNccJ=*xByG~=dZSOokiS! zqj3=iVReepibv6{+MaTuC*y0y#tPX0#fjqvEjZIBUxbJ)jHSGn!?*txe2*fwX!_os z4Nm_&yE*6LwQb8*pP@wb`R4!(uOkbU$NGu?(g3D!=NA874rdHVpv)*Z(R_1d5BQh4 z6c{fc48HFRu5H-K`{)Js59C=S20`3IMU)&hzUB}QvZ#7gNT?Wu$hk7ZKd-Junw8<& z-fWe&^ii)ywf*TzGaeVadJPHbb7BL}>UZ5uGjM}8is))WKc7Mk5Rcn!Ki^C@Ptyw! zj6gn$V2?~i7&9(wkDZ3-(1Tqe*P^Ybq{rY{kuFSDR8Ol(Jw|$8$f_-zH@n1HH+}(a zDV8a)C9dOlV>^WI8oX=BwP_?ecx^}K?n&PsagU85|zaa;wVRehqkH>yP#PO zc}4x8$WVA(C$UAa0hZIBxDIksQovrZkw6>|2EbR{>rt3&5;Yk$N+}bM8hU58GrVXTMVf> zjUM1|A)rB}#*UKdDBXg}!g+c{?0B?=kn&>^wB?74W$1SsZN3al0El~HUnLSoaM5XE z+S=I*BWg3_xHL+sSz!>mj6A&>3`=pnJ9_j}wKcu5D;83ac<0v+8&Vr?_$;#zMt!hJ|tN6M+xu+YNNH-3eMER?vGkKqa3k_PfalM*Ww_7sy~ z$p2)g!wHxt+j?1YeWaI{F!`@4POEiK=l@XM?y=HqPJ{Xhf6LE z%ogXRPS2nR84pGtiFzy^nxZZ@HS1_%~LZ6t9sd6d4cH2S>$Ag%F)W?C?PQxeaC zQ;HF80$oOmux#4|ug~b`kn`tT+=VFU=3aFoUTK~2Jd#0RRzOm@EHkgNk@33&Z1-b6JgLtQ2PqxrjXIcB0Z_BASF&7_q zxL9A+8`{sD_c2v2+ec9IkSeDzc8vi0X5ScnBD$^%th&-3VOYBRHaL^wqL$Ud&iXB4 z3Qc6cbNmY1=RN3#g*vS8Zhv0jy-3LJV-_kFlysLRWjhJC*I$18Ij`!k)KJ`*tO#iAleBP3>6*ktuT@%s--5gJJunIczQ7#+YyRfv3~Y<>O9!uU*Lm?T^j*3)_z zuSP1R5R&<*QSR=B{1UkKA**pe@ca_Vo^!`Gu294>WU8x$4=y??-*lm<@ypxz*LHMV zS3jXiX)6xX>wf(OPYbSj$YFnaE|TS1eO~Ce`-Khknqu}Q zvDU=Hi&|!@7|;#HDjG(BGUe*LzrOx{(_FlRx*LV+3ia`4`FFwLwurKcG)kl5@}{ui zYRPG&&w-E18Oi1{;<>rof<~yn8(|Pi!4TO68&K-kJ7fZ5oiWXvE`KlL3`AQ zCyu+22xwLz}S(EB0}xHHjOMH$C(WDrlqlMfH9WQ^|g!#ScD za!d#frPbynkCMCboNTwqY>FLsOl-&eE2`e1L|G{C1N!2T5YkQ7s&I=kuGE zsgK@Jt&TAHYBsAyioGxds-&hb(mjHPLB7hJS8*74c|;)ZM;nn?(@i`asHb2EoJ0|D z@AeN!Phqf`0%^2^c|ls1A2gdcdt6GGApR~6 zOZaK+8)XXRjE5T%6GiVcuN5}H;aa0#FHl{`R1K1vc%|AxNX&=OopYx>5VM4DF@1A< zITa{h^qt`3(bLjz^4eny$+%-sl~plZN&N}TLwI2_4U$Xa5E}Tf`iY3rnah3SO7a_&V1>6mbkweZ|Cv9_Gp`p{2j_&5bfjE5OriahYCLZ7-w`gTXz#;BO6flM0XI|x;6`u@ zFZoY&X*j~=efvaK?7nR$oV(ziXR*4lq zGb308mgIoQs9S*U$A62LN;ynEf%Egvm($%q@ZEw^?HmQfkS2(SDJ&5@I`+e!KVs;t z_Sc^)U?-3vuXOkdtovDE(UKn2hM`-LQYEX+$(ia0~`S!o`_**z{E5di=pMV*df6 zMg^^<*Ax4v?;ohO4*{xM-6SI^pwpBV#SVHw98v)toX>~lq>{L&xC89l1ftmKe)Y(l7qf)svWE-1K=({65jX0Tta4*GlhZ|HBy5}l6A%CD@9nJhGTeG zWGNtF)h#@MiY)y+H3F@-rF4cKcY^JEKKOqB?>^p^3%sKO7g)1AU`{~y_#4u#Gk6q} zFVpAoD>!Y`A7FA9tPo(}IJq{4#X*eWs8Dm{!gINL#ik8Tzi`4&3tC&A6eAFJq|-{% z4Tl;nYRQOFL?Sr;H|q3DVsKc}=q&0=V7p|f`~o!jR=dQ1zS<6d;f}rdV>({Df(0S8 z5)5R(X0%zYSYi2uv&9e<^ljn!IDBVun6^D4aO@#92?`5i*Fmb;r02nSi;7+$Gl;hq zVrA|+l($xO)$FYTTDUY#!PiL&-yo#+Jb9^riI)vU3>~O9hmd57;{{_NT&+UJ9 zJGStIaHC2y%(Y@!<5HHww$W%*gLmZ`h~FX*$nh3n1+-S&N(1)TU7J1u|Kaa2*$iTm zF?Ik~Q{A)xkH$<-%)mS8Uik=5cDWk$?*6>(Au7Xge!8DN4snbvU%8`)9rEMo#*>*a zua64!>~Ab%a&dk$yu1@|MceX%mq7fH+I`;ZK~xl!7rV^b!g2~|**>o}rSev5`Z(So z-}{f=)gvhew+X&U-UDGo&)D6>A}kgzCmBQXs52vu)UBXB!Fe$HXV1=~hxYLHZM=5H zB2hTeRqbi5**#a7K<^^VI~gS6Cl$VvV@;abgySZ5KM)balyg8 z;eqp0zG^2Tqy)t&QE057!_DWN_PQK76 zLxw>rm$U1Q0-}bzd+$(j*L3GqIB=VkuuKXCY9Fa1DJV+ZW}}r|g}tp3l3D?bZ>POw z7|^iJ@BY%n2Fli~%IJ<$d24JK%2%lz>5%>f4pR){jrBMqBd{E5!ET|AQ!E>J024H} ze-3IWBZUe~Cp3pzOn4dIQ8`)JP!xYt;70Fu)WPg)8Nr>4^7R~>n`Yzg`KO#-^nS?4 zvNH8A+gd;gqCP+Av3W9V*l^A?c}SlZ8aW4^3vR?Iof`axzCfen2!U^rd@p&%VYt01FfF(DGHZF!nNhnS;!Db+d zyq$VGVeHtcZSYaH^&8?P`9R}vXq}N(2=L>E<&#M z0*ZEe*Ts^ZqwSbIt6k|rVU+52!(xG6uDHAWK5)c=75m@} z7DB>Bm#Cvtv9x^oQ?7F8X$-C@IuLF4EhwXkP79xT%9kx+jVtrw;xt1y#_#v=EUgiv z=G9=F91ZKy$Nb$P3C3j)JMHZLAe5)6I;_alBgh}ud-?Z+jEN3godXE%5G@8JJe7=$ zgO#+>VKbZMr!hI}5cz6R6g`eBix-|a=C4H22gLr!pX|G$DbV2arPG3Tw!{;#y1krzvE!zh3r)MBeCJf4gxo7c=4@X~SxUrOwJi3%N+u!G# z-G2OXs$r6Xh(6vweVxN!pZ{XV`O2K|3zvy(;YrtH+{X$i%F62=kgVZdH~M{e^MO6$ zWp{@V&lV6GGIG@4264`3yg@Sxq??sgA)Wd$Yo$6s!>re=6#l8`1uILB#${UvpNV3Z ziB4Mnnkc%VYkrn1TLL1pt6|u@g>q}|IsPE?dk2gl$R@vg_dnZT3lu2f|3UR3|Nm_N zCSqT|`ycQkPXBLfXBQ%66~^)7j?=D|){=^1uCKHgOX7yiLgs_d(})Za%-QA~&Mc{24+6Q{Uww+BXL|Lkx& zIIO>}zH4{@PFRC&A8zSk)Pv#!Pd<&5F!Zo2ZrCoaWB~B$2P;oqVYKC{#6}CcUFObw z>b=VyAi11P2k`3__$hw5{bJ=(U*E{!Vb=WPLDqv6X0z;ZEQ<*~@ipq@e)$}aIjHjy z{C+}MhbjJ{VK|5&d7dtRPTxSAC0Fbk$uc>NB^UGz0C37Hl8~1jyibC{KVrgq5WxO^0oKWkeYPr zipdrGvpKFrd1{$r01+m{TB6*?_Q_zsa*jpMUJ0(A>u2> zQ~%!Cp7FrAY`hrp#nTIX7j+&DP2>6hWIVT@t0_-SevsKUQqm~;(ga?`f_$=hk#DEI zU-8xHmpJ|(=n46;%gR%GTj*I`aNX!|5(R0?nd4i(=$=LGrJ-re-$lEusqHn695uFQ zo%#Um{D8l0@u}R;Vd4`x>c41x7MbyQ-h4 zkYuYaHU5OP*Pa+}>g;^pVf~yp-K+;MbKx+@cP#N;HPcg@PSezDcc$iCx5Zx_wUgf* zwZq&eYLD@enY(ZC-+D;PEJyooP52E3J##K8&~j$JzX`wXjPl>h1`1NP=3LqMc>eV( zdgU?sY5=21o_f^ytd(fvOr0i&PJ+o(6HSS)s+!roXwf7~|HsU0} z<5rIn=jNcD`@WL;I`!QOU-*1swl|J1?`~NO<&Xc|=?lL_KvZ?bLTlSd`LmCU*E*fg zg;^~N++07-(T?5k-njaBom?YHenwpfulO2o&+D(fy)~_VP%TDee$CY_uV84BWtNR3 z=e)h8{dgcM-8&j%pDe5AayX+)=3*(j6mL<6^~coY{EkQeU~ZDL!L~jR%0DJFL$Gk> f`NjZII=RrfQi>rK3wgf_=Uv{l!+YypS=j#ocdO=e literal 0 HcmV?d00001 diff --git a/tools/jt2.jxe b/tools/jt2.jxe new file mode 100644 index 0000000000000000000000000000000000000000..94696d54a8fe7070c0288174b07e9679f8f8cb9d GIT binary patch literal 2417809 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 rnO|f8C#&^S7X@TDp%(LVm*)f0CgTP? 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�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¥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

    FS%3?Y&?eFl0HzImJFmZ42uU=fGNRZA= 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%0DQ< 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
    EKtk@{@ZOyuKYC!CLC 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 go@ZJCqV)SJ=L!iz9L#6@E}U^0*8}U57iD1o1^ Date: Mon, 23 Dec 2024 23:23:42 -0500 Subject: [PATCH 096/126] start of wrapper --- tools/parser.mjs | 432 +++++++++++++++++++++++++++++++++++++++++++++- tools/wrapper.mjs | 67 +++++++ 2 files changed, 497 insertions(+), 2 deletions(-) create mode 100644 tools/wrapper.mjs diff --git a/tools/parser.mjs b/tools/parser.mjs index 8dbca8d02..529cda746 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -112,7 +112,7 @@ const jamBatchOptionDefinition = [ { name: "cEdge", type: String, defaultValue: undefined}, { name: "fEdge", type: String, defaultValue: undefined}, { name: "config", type: String, defaultValue: undefined}, - {name: "verb", type:Boolean, defaultValur: false} + {name: "verb", type:Boolean, defaultValue: false} ]; //no extention for the prog name ex) jt2 const jamWorkerOptionDefinition = [ @@ -700,9 +700,437 @@ export function getWorkerArgs(argv){ }; options["mode"] = mode[0] return options + +} + +/// Wrapper Parser.mjs /// +export function getJamrunArgsWrapper(argv){ + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamrun") + ); + let options; + + try { + options = commandLineArgs(jamrunOptionDefinitions, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + }; + + let command = '{ "file": "jt1.jxe", ' + if(options.app) + { + command += ` "app_name": "${options.app}"`; + } + + if(options.fog) + { + command += ','; + command += ` "fog": "${options.fog}"`; + } + + if(options.cloud) + { + command += ','; + command += ` "cloud": "${options.cloud}"`; + } + + if(options.device) + { + command += ','; + command += ` "device": "${options.device}"`; + } + + if(options.num) + { + command += ','; + command += ` "num": "${options.num}"`; + } + + if(options.data) + { + command += ','; + command += ` "data": "${options.data}"`; + } + + if(options.tags) + { + command += ','; + command += ` "tags": "${options.tags}"`; + } + if(options.bg) + { + command += ','; + command += ` "bg": "${options.bg}"`; + } + + if(options.old) + { + command += ','; + command += ` "old": "${options.old}"`; + } + + if(options.log) + { + command += ','; + command += ` "log": "${options.log}"`; + } + + if(options.verb) + { + command += ','; + command += ` "verb": "${options.verb}"`; + } + + if(options.loc) + { + command += ','; + command += ` "loc": "${options.loc}"`; + } + + if(options.edge) + { + command += ','; + command += ` "edge": "${options.edge}"`; + } + + if(options.valgrind) + { + command += ','; + command += ` "valgrind": "${options.valgrind}"`; + } + + if(options.local) + { + command += ','; + command += ` "local": "${options.local}"`; + } + + if(options.remote) + { + command += ','; + command += ` "remote": "${options.remote}"`; + } - + command += ' }'; + + return command; +} + +export function getBatchArgsWrapper(argv){ + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jambatch.mjs") + ); + let options; + + try { + options = commandLineArgs(jamBatchOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + }; + + let command = '{ "file": "jt1.jxe" ' + if(options.fog) + { + command += ','; + command += ` "fog": "${options.fog}"`; + } + + if(options.device) + { + command += ','; + command += ` "device": "${options.device}"`; + } + if(options.cloud) + { + command += ','; + command += ` "cloud": "${options.cloud}"`; + } + + if(options.cFile) + { + command += ','; + command += ` "cFile": "${options.cFile}"`; + } + + if(options.fFile) + { + command += ','; + command += ` "fFile": "${options.fFile}"`; + } + + if(options.dFile) + { + command += ','; + command += ` "dFile": "${options.dFile}"`; + } + if(options.num) + { + command += ','; + command += ` "num": "${options.num}"`; + } + if(options.cLoc) + { + command += ','; + command += ` "cLoc": "${options.cLoc}"`; + } + + if(options.fLoc) + { + command += ','; + command += ` "fLoc": "${options.fLoc}"`; + } + + if(options.dLoc) + { + command += ','; + command += ` "dLoc": "${options.dLoc}"`; + } + + if(options.cEdge) + { + command += ','; + command += ` "cEdge": "${options.cEdge}"`; + } + + if(options.fEdge) + { + command += ','; + command += ` "fEdge": "${options.fEdge}"`; + } + + if(options.fEdge) + { + command += ','; + command += ` "dEdge": "${options.dEdge}"`; + } + + command += ' }'; + + return command; +} + +export function getLogArgsWrapper(argv){ + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamlog") + ); + let options; + + try { + options = commandLineArgs(jamclogOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + }; + + let command = `{ "remote": "${options.remote}", "tail": "${options.remote}" } ` + + return command; +} + +export function getJamListArgsWrapper(argv){ + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamlist.mjs") + ); + let options; + + try { + options = commandLineArgs(jamlistOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + }; + + let command = '{' + if(options.help) + { + command += ` "help": "${options.help}"`; + } + + if(options.all) + { + command += ','; + command += ` "all": "${options.all}"`; + } + if(options.monitor) + { + command += ','; + command += ` "monitor": "${options.monitor}"`; + } + + if(options.type) + { + command += ','; + command += ` "type": "${options.type}"`; + } + + if(options.dataStore) + { + command += ','; + command += ` "dataStore": "${options.dataStore}"`; + } + + if(options.tmuxid) + { + command += ','; + command += ` "tmuxid": "${options.tmuxid}"`; + } + if(options.port) + { + command += ','; + command += ` "port": "${options.port}"`; + } + if(options.app) + { + command += ','; + command += ` "app": "${options.app}"`; + } + + if(options.remote) + { + command += ','; + command += ` "remote": "${options.remote}"`; + } + + command += ' }'; + + return command; +} + +export function getJamKillArgsWrapper(argv){ + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamkill") + ); + let options; + + try { + options = commandLineArgs(jamkillOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + }; + + let command = '{' + if(options.reset) + { + command += ` "reset": "${options.reset}"`; + } + + if(options.all) + { + command += ','; + command += ` "all": "${options.all}"`; + } + if(options.remote) + { + command += ','; + command += ` "remote": "${options.remote}"`; + } + + if(options.app) + { + command += ','; + command += ` "app": "${options.app}"`; + } + + if(options.prog) + { + command += ','; + command += ` "prog": "${options.prog}"`; + } + + if(options.port) + { + command += ','; + command += ` "port": "${options.port}"`; + } + + command += ' }'; + + return command; +} + +export function getJamTermArgsWrapper(argv){ + const args = argv.filter( + (entry) => + !entry.includes("node") && + !entry.includes("zx") && + !entry.includes("jamterm") + ); + let options; + + try { + options = commandLineArgs(jamtermOptionDefinition, { argv: args }); + } catch (error) {} + + if (options === undefined || options.help) { + const error = new Error("SHOW USAGE"); + error.type = "ShowUsage"; + throw error; + }; + + let command = '{' + if(options.all) + { + command += ` "all": "${options.all}"`; + } + + if(options.app) + { + command += ','; + command += ` "app": "${options.app}"`; + } + if(options.prog) + { + command += ','; + command += ` "prog": "${options.prog}"`; + } + + if(options.port) + { + command += ','; + command += ` "port": "${options.port}"`; + } + + if(options.pane) + { + command += ','; + command += ` "pane": "${options.pane}"`; + } + command += ' }'; + return command; } \ No newline at end of file diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs new file mode 100644 index 000000000..10e8e8a35 --- /dev/null +++ b/tools/wrapper.mjs @@ -0,0 +1,67 @@ +#!/usr/bin/env zx + +import {getBatchArgsWrapper, getJamrunArgsWrapper, getLogArgsWrapper, getJamListArgsWrapper, getJamKillArgsWrapper, getJamTermArgsWrapper} from './parser.mjs' +import { spawnSync } from 'child_process'; + + +endpoint = process.argv; + +if (endpoint[0] == "jamrun"){ + command = getJamrunArgsWrapper(process.argv); + curlCommand = `curl -X POST http://url:3000/jamrun -H "Content-Type: application/json" -d ${command}`; + + spawnSync([curlCommand], { + stdio: spawnPipe, + shell: true + }); +} + +if (endpoint[0] == "jambatch.mjs"){ + command = getBatchArgsWrapper(process.argv); + curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; + + spawnSync([curlCommand], { + stdio: spawnPipe, + shell: true + }); +} + +if (endpoint[0] == "jamlog.mjs"){ + command = getLogArgsWrapper(process.argv); + curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; + + spawnSync([curlCommand], { + stdio: spawnPipe, + shell: true + }); +} + +if (endpoint[0] == "jamlist.mjs"){ + command = getJamListArgsWrapper(process.argv); + curlCommand = `curl -X POST http://url:3000/jamlist -H "Content-Type: application/json" -d ${command}`; + + spawnSync([curlCommand], { + stdio: spawnPipe, + shell: true + }); +} + +if (endpoint[0] == "jamkill.mjs"){ + command = getJamKillArgsWrapper(process.argv); + curlCommand = `curl -X POST http://url:3000/jamkill -H "Content-Type: application/json" -d ${command}`; + + spawnSync([curlCommand], { + stdio: spawnPipe, + shell: true + }); +} + +if (endpoint[0] == "jamterm.mjs"){ + command = getJamTermArgsWrapper(process.argv); + curlCommand = `curl -X POST http://url:3000/jamterm -H "Content-Type: application/json" -d ${command}`; + + spawnSync([curlCommand], { + stdio: spawnPipe, + shell: true + }); +} \ No newline at end of file From 61cc706769466914152dd2eb84e38ac970558a47 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:53:01 -0500 Subject: [PATCH 097/126] finish wrapper --- tools/parser.mjs | 33 +++++++++++-------- tools/wrapper.mjs | 80 +++++++++++++++++++++-------------------------- 2 files changed, 56 insertions(+), 57 deletions(-) diff --git a/tools/parser.mjs b/tools/parser.mjs index 529cda746..31f6c6cd7 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -716,6 +716,7 @@ export function getJamrunArgsWrapper(argv){ try { options = commandLineArgs(jamrunOptionDefinitions, { argv: args }); + console.log(options); } catch (error) {} if (options === undefined || options.help) { @@ -934,7 +935,9 @@ export function getLogArgsWrapper(argv){ let options; try { + console.log(argv); options = commandLineArgs(jamclogOptionDefinition, { argv: args }); + console.log(options); } catch (error) {} if (options === undefined || options.help) { @@ -943,7 +946,18 @@ export function getLogArgsWrapper(argv){ throw error; }; - let command = `{ "remote": "${options.remote}", "tail": "${options.remote}" } ` + let command = `{ "program": "${options.program}", "app": "${options.app}", "port": "${options.port} `; + + if(options.remote){ + command += ','; + command += ` "remote": "${options.remote}"`; + } + + if(options.tail){ + command += ','; + command += ` "tail": "${options.tail}"`; + } + command += ` } `; return command; } @@ -975,18 +989,15 @@ export function getJamListArgsWrapper(argv){ if(options.all) { - command += ','; command += ` "all": "${options.all}"`; } if(options.monitor) { - command += ','; command += ` "monitor": "${options.monitor}"`; } if(options.type) { - command += ','; command += ` "type": "${options.type}"`; } @@ -1050,30 +1061,25 @@ export function getJamKillArgsWrapper(argv){ if(options.all) { - command += ','; command += ` "all": "${options.all}"`; } if(options.remote) { - command += ','; command += ` "remote": "${options.remote}"`; } if(options.app) { - command += ','; command += ` "app": "${options.app}"`; } if(options.prog) { - command += ','; command += ` "prog": "${options.prog}"`; } if(options.port) { - command += ','; command += ` "port": "${options.port}"`; } @@ -1102,6 +1108,11 @@ export function getJamTermArgsWrapper(argv){ }; let command = '{' + + if(options.help) + { + command += ` "help": "${options.help}"`; + } if(options.all) { command += ` "all": "${options.all}"`; @@ -1109,24 +1120,20 @@ export function getJamTermArgsWrapper(argv){ if(options.app) { - command += ','; command += ` "app": "${options.app}"`; } if(options.prog) { - command += ','; command += ` "prog": "${options.prog}"`; } if(options.port) { - command += ','; command += ` "port": "${options.port}"`; } if(options.pane) { - command += ','; command += ` "pane": "${options.pane}"`; } diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index 10e8e8a35..eeb8f0ade 100644 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -1,67 +1,59 @@ #!/usr/bin/env zx +import commandLineArgs from 'command-line-args'; import {getBatchArgsWrapper, getJamrunArgsWrapper, getLogArgsWrapper, getJamListArgsWrapper, getJamKillArgsWrapper, getJamTermArgsWrapper} from './parser.mjs' import { spawnSync } from 'child_process'; +const { exec } = require('child_process'); -endpoint = process.argv; +let endpoint = process.argv; -if (endpoint[0] == "jamrun"){ - command = getJamrunArgsWrapper(process.argv); - curlCommand = `curl -X POST http://url:3000/jamrun -H "Content-Type: application/json" -d ${command}`; +if (endpoint[3] == "jamrun"){ + let command = getJamrunArgsWrapper(endpoint.slice(4)); + let curlCommand = `curl -X POST http://url:3000/jamrun -H "Content-Type: application/json" -d ${command}`; - spawnSync([curlCommand], { - stdio: spawnPipe, - shell: true - }); + let cwd = '/root/capstone/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }); } -if (endpoint[0] == "jambatch.mjs"){ - command = getBatchArgsWrapper(process.argv); - curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; +if (endpoint[3] == "jambatch.mjs"){ + let command = getBatchArgsWrapper(endpoint.slice(4)); + let curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; - spawnSync([curlCommand], { - stdio: spawnPipe, - shell: true - }); -} + let cwd = '/root/capstone/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }); -if (endpoint[0] == "jamlog.mjs"){ - command = getLogArgsWrapper(process.argv); - curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; +} - spawnSync([curlCommand], { - stdio: spawnPipe, - shell: true - }); +if (endpoint[3] == "jamlog"){ + let command = getLogArgsWrapper(endpoint.slice(4)); + let curlCommand = `curl -X POST http://url:3000/jamlog -H "Content-Type: application/json" -d ${command}`; + + let cwd = '/root/capstone/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }); } -if (endpoint[0] == "jamlist.mjs"){ - command = getJamListArgsWrapper(process.argv); - curlCommand = `curl -X POST http://url:3000/jamlist -H "Content-Type: application/json" -d ${command}`; +if (endpoint[3] == "jamlist"){ + let command = getJamListArgsWrapper(endpoint.slice(4)); + let curlCommand = `curl -X POST http://url:3000/jamlist -H "Content-Type: application/json" -d ${command}`; - spawnSync([curlCommand], { - stdio: spawnPipe, - shell: true - }); + let cwd = '/root/capstone/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }); } -if (endpoint[0] == "jamkill.mjs"){ - command = getJamKillArgsWrapper(process.argv); - curlCommand = `curl -X POST http://url:3000/jamkill -H "Content-Type: application/json" -d ${command}`; +if (endpoint[3] == "jamkill"){ + let command = getJamKillArgsWrapper(endpoint.slice(4)); + let curlCommand = `curl -X POST http://url:3000/jamkill -H "Content-Type: application/json" -d ${command}`; + + let cwd = '/root/capstone/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }); - spawnSync([curlCommand], { - stdio: spawnPipe, - shell: true - }); } -if (endpoint[0] == "jamterm.mjs"){ - command = getJamTermArgsWrapper(process.argv); - curlCommand = `curl -X POST http://url:3000/jamterm -H "Content-Type: application/json" -d ${command}`; +if (endpoint[3] == "jamterm"){ + let command = getJamTermArgsWrapper(endpoint.slice(4)); + let curlCommand = `curl -X POST http://url:3000/jamterm -H "Content-Type: application/json" -d ${command}`; - spawnSync([curlCommand], { - stdio: spawnPipe, - shell: true - }); + let cwd = '/root/capstone/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }); } \ No newline at end of file From fc25e2d0f3fc55a29d30b3925e98577b0f048526 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:30:40 -0500 Subject: [PATCH 098/126] clean --- tools/wrapper.mjs | 61 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index eeb8f0ade..6099e4fc4 100644 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -6,18 +6,53 @@ import { spawnSync } from 'child_process'; const { exec } = require('child_process'); -let endpoint = process.argv; +import { + body_1, + header_1, + header_2, + body_sec, + body_2, + body_sec_warning, + body_2_bold, +} from "./chalk.mjs"; +let args; -if (endpoint[3] == "jamrun"){ - let command = getJamrunArgsWrapper(endpoint.slice(4)); +function show_usage() { + const usageMessage = ` + ${header_1(`JAMTools 2.0`)} + + ${header_2(`wrapper`)}${body_1( + ` -- a tool to run curl commands in a friendly way` + )} + + ${header_1(`SYNOPSIS`)} + + Usage: wrapper + + + --- wrapper.mjs endpoint [arguments to pass] + + `; + + console.log(usageMessage); +} + +//capture the endpoints arguments +let endpoint_args = process.argv; + +// for jamrun, no need to provide the file name, jt1.jxe is used. +// ex: zx wrapper.mjs jamrun --app="DEMO" +if (endpoint_args[3] == "jamrun"){ + // here we will work with the arguments + let command = getJamrunArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamrun -H "Content-Type: application/json" -d ${command}`; let cwd = '/root/capstone/JAMScript/tools/'; const childProcess = exec(curlCommand, { cwd }); } -if (endpoint[3] == "jambatch.mjs"){ - let command = getBatchArgsWrapper(endpoint.slice(4)); +if (endpoint_args[3] == "jambatch.mjs"){ + let command = getBatchArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; let cwd = '/root/capstone/JAMScript/tools/'; @@ -25,24 +60,24 @@ if (endpoint[3] == "jambatch.mjs"){ } -if (endpoint[3] == "jamlog"){ - let command = getLogArgsWrapper(endpoint.slice(4)); +if (endpoint_args[3] == "jamlog"){ + let command = getLogArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamlog -H "Content-Type: application/json" -d ${command}`; let cwd = '/root/capstone/JAMScript/tools/'; const childProcess = exec(curlCommand, { cwd }); } -if (endpoint[3] == "jamlist"){ - let command = getJamListArgsWrapper(endpoint.slice(4)); +if (endpoint_args[3] == "jamlist"){ + let command = getJamListArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamlist -H "Content-Type: application/json" -d ${command}`; let cwd = '/root/capstone/JAMScript/tools/'; const childProcess = exec(curlCommand, { cwd }); } -if (endpoint[3] == "jamkill"){ - let command = getJamKillArgsWrapper(endpoint.slice(4)); +if (endpoint_args[3] == "jamkill"){ + let command = getJamKillArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamkill -H "Content-Type: application/json" -d ${command}`; let cwd = '/root/capstone/JAMScript/tools/'; @@ -50,8 +85,8 @@ if (endpoint[3] == "jamkill"){ } -if (endpoint[3] == "jamterm"){ - let command = getJamTermArgsWrapper(endpoint.slice(4)); +if (endpoint_args[3] == "jamterm"){ + let command = getJamTermArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamterm -H "Content-Type: application/json" -d ${command}`; let cwd = '/root/capstone/JAMScript/tools/'; From 7c8f053497aa50abdb3ff10a44bbdd086693af08 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Fri, 27 Dec 2024 21:18:18 -0500 Subject: [PATCH 099/126] added for exec --- tools/wrapper.mjs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index 6099e4fc4..ec3785d7a 100644 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -45,10 +45,20 @@ let endpoint_args = process.argv; if (endpoint_args[3] == "jamrun"){ // here we will work with the arguments let command = getJamrunArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://url:3000/jamrun -H "Content-Type: application/json" -d ${command}`; + let curlCommand = `curl -X POST http://localhost:3000/jamrun -H "Content-Type: application/json" -d '${command}'`; + //console.log(curlCommand); + + let cwd = '/Users/andreisandor/Desktop/McGill/Capstone/code/JAMScript/tools/'; + const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + console.log(`stdout: ${stdout}`); + console.error(`stderr: ${stderr}`); + }); - let cwd = '/root/capstone/JAMScript/tools/'; - const childProcess = exec(curlCommand, { cwd }); + } if (endpoint_args[3] == "jambatch.mjs"){ From b50f7ba7aec0df4931bae79ff7b094dcb3b69ccf Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sat, 28 Dec 2024 10:14:43 -0500 Subject: [PATCH 100/126] Update wrapper.mjs --- tools/wrapper.mjs | 57 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index ec3785d7a..8dcd7cd25 100644 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -48,7 +48,7 @@ if (endpoint_args[3] == "jamrun"){ let curlCommand = `curl -X POST http://localhost:3000/jamrun -H "Content-Type: application/json" -d '${command}'`; //console.log(curlCommand); - let cwd = '/Users/andreisandor/Desktop/McGill/Capstone/code/JAMScript/tools/'; + let cwd = '/Users/andreisandor/Desktop/McGill/Capstone/code/JAMScript/tools/'; //To change const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); @@ -65,8 +65,15 @@ if (endpoint_args[3] == "jambatch.mjs"){ let command = getBatchArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; - let cwd = '/root/capstone/JAMScript/tools/'; - const childProcess = exec(curlCommand, { cwd }); + let cwd = '/root/capstone/JAMScript/tools/'; //To change + const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + console.log(`stdout: ${stdout}`); + console.error(`stderr: ${stderr}`); + }); } @@ -74,24 +81,45 @@ if (endpoint_args[3] == "jamlog"){ let command = getLogArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamlog -H "Content-Type: application/json" -d ${command}`; - let cwd = '/root/capstone/JAMScript/tools/'; - const childProcess = exec(curlCommand, { cwd }); + let cwd = '/root/capstone/JAMScript/tools/'; //To change + const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + console.log(`stdout: ${stdout}`); + console.error(`stderr: ${stderr}`); + }); } if (endpoint_args[3] == "jamlist"){ let command = getJamListArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamlist -H "Content-Type: application/json" -d ${command}`; - let cwd = '/root/capstone/JAMScript/tools/'; - const childProcess = exec(curlCommand, { cwd }); + let cwd = '/root/capstone/JAMScript/tools/'; //To change + const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + console.log(`stdout: ${stdout}`); + console.error(`stderr: ${stderr}`); + }); } if (endpoint_args[3] == "jamkill"){ let command = getJamKillArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamkill -H "Content-Type: application/json" -d ${command}`; - let cwd = '/root/capstone/JAMScript/tools/'; - const childProcess = exec(curlCommand, { cwd }); + let cwd = '/root/capstone/JAMScript/tools/'; //To change + const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + console.log(`stdout: ${stdout}`); + console.error(`stderr: ${stderr}`); + }); } @@ -99,6 +127,13 @@ if (endpoint_args[3] == "jamterm"){ let command = getJamTermArgsWrapper(endpoint_args.slice(4)); let curlCommand = `curl -X POST http://url:3000/jamterm -H "Content-Type: application/json" -d ${command}`; - let cwd = '/root/capstone/JAMScript/tools/'; - const childProcess = exec(curlCommand, { cwd }); + let cwd = '/root/capstone/JAMScript/tools/'; //To change + const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + console.log(`stdout: ${stdout}`); + console.error(`stderr: ${stderr}`); + }); } \ No newline at end of file From b40a8e6a45fb3cdc8ef275c54b2f2fcc66882c79 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sat, 4 Jan 2025 16:21:44 -0500 Subject: [PATCH 101/126] Finish the wrapper --- tools/app.js | 33 ++- tools/parser.mjs | 440 ----------------------------------- tools/wrapper.mjs | 577 +++++++++++++++++++++++++++++++++++++--------- 3 files changed, 487 insertions(+), 563 deletions(-) diff --git a/tools/app.js b/tools/app.js index caf2c8147..5b56d2d22 100644 --- a/tools/app.js +++ b/tools/app.js @@ -17,7 +17,7 @@ app.get('/api', (req, res) => { function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); - + // Set headers to keep the connection open for streaming res.setHeader('Content-Type', 'text/plain'); res.setHeader('Transfer-Encoding', 'chunked'); @@ -43,12 +43,12 @@ function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools }); // If the client disconnects, terminate the child process - req.on('close', () => { - if (childProcess.exitCode === null) { // If process is still running - console.log('Client disconnected, terminating process'); - childProcess.kill(); // Terminate the process - } - }); + // req.on('close', () => { + // if (childProcess.exitCode === null) { // If process is still running + // console.log('Client disconnected, terminating process'); + // childProcess.kill(); // Terminate the process + // } + // }); } // Define the /jamrun endpoint @@ -123,13 +123,22 @@ app.post('/jambatch', (req, res) => { // Define the /jamlog endpoint app.post('/jamlog', (req, res) => { - const { remote, tail } = req.body; - if (!remote || !tail) { - return res.status(400).json({ error: 'The "remote" and "tail" fields are required.' }); - } + const { help, program, app, port, remote, tail, c, j } = req.body; + + // Default command without arguments if none are specified + let command = `zx jamlog.mjs`; + if (help) command += ` --help`; + if (program) command += ` --program=${program}`; + if (app) command += ` --app=${app}`; + if (port) command += ` --port=${port}`; + if (remote) command += ` --remote=${remote}`; + if (tail) command += ` --tail=${tail}`; + + if (c) command += ` --c`; + if (c) command += ` --j`; - let command = `zx jamlog.mjs --program=jt2 --app-xxx2 --port=1883 --remote=${remote} --tail=${tail}`; executeCommand(req, res, command); + }); app.post('/jamlist', (req, res) => { diff --git a/tools/parser.mjs b/tools/parser.mjs index 31f6c6cd7..872cd1d2b 100644 --- a/tools/parser.mjs +++ b/tools/parser.mjs @@ -700,444 +700,4 @@ export function getWorkerArgs(argv){ }; options["mode"] = mode[0] return options - - -} - -/// Wrapper Parser.mjs /// -export function getJamrunArgsWrapper(argv){ - const args = argv.filter( - (entry) => - !entry.includes("node") && - !entry.includes("zx") && - !entry.includes("jamrun") - ); - let options; - - try { - options = commandLineArgs(jamrunOptionDefinitions, { argv: args }); - console.log(options); - } catch (error) {} - - if (options === undefined || options.help) { - const error = new Error("SHOW USAGE"); - error.type = "ShowUsage"; - throw error; - }; - - let command = '{ "file": "jt1.jxe", ' - if(options.app) - { - command += ` "app_name": "${options.app}"`; - } - - if(options.fog) - { - command += ','; - command += ` "fog": "${options.fog}"`; - } - - if(options.cloud) - { - command += ','; - command += ` "cloud": "${options.cloud}"`; - } - - if(options.device) - { - command += ','; - command += ` "device": "${options.device}"`; - } - - if(options.num) - { - command += ','; - command += ` "num": "${options.num}"`; - } - - if(options.data) - { - command += ','; - command += ` "data": "${options.data}"`; - } - - if(options.tags) - { - command += ','; - command += ` "tags": "${options.tags}"`; - } - if(options.bg) - { - command += ','; - command += ` "bg": "${options.bg}"`; - } - - if(options.old) - { - command += ','; - command += ` "old": "${options.old}"`; - } - - if(options.log) - { - command += ','; - command += ` "log": "${options.log}"`; - } - - if(options.verb) - { - command += ','; - command += ` "verb": "${options.verb}"`; - } - - if(options.loc) - { - command += ','; - command += ` "loc": "${options.loc}"`; - } - - if(options.edge) - { - command += ','; - command += ` "edge": "${options.edge}"`; - } - - if(options.valgrind) - { - command += ','; - command += ` "valgrind": "${options.valgrind}"`; - } - - if(options.local) - { - command += ','; - command += ` "local": "${options.local}"`; - } - - if(options.remote) - { - command += ','; - command += ` "remote": "${options.remote}"`; - } - - command += ' }'; - - return command; -} - -export function getBatchArgsWrapper(argv){ - const args = argv.filter( - (entry) => - !entry.includes("node") && - !entry.includes("zx") && - !entry.includes("jambatch.mjs") - ); - let options; - - try { - options = commandLineArgs(jamBatchOptionDefinition, { argv: args }); - } catch (error) {} - - if (options === undefined || options.help) { - const error = new Error("SHOW USAGE"); - error.type = "ShowUsage"; - throw error; - }; - - let command = '{ "file": "jt1.jxe" ' - if(options.fog) - { - command += ','; - command += ` "fog": "${options.fog}"`; - } - - if(options.device) - { - command += ','; - command += ` "device": "${options.device}"`; - } - if(options.cloud) - { - command += ','; - command += ` "cloud": "${options.cloud}"`; - } - - if(options.cFile) - { - command += ','; - command += ` "cFile": "${options.cFile}"`; - } - - if(options.fFile) - { - command += ','; - command += ` "fFile": "${options.fFile}"`; - } - - if(options.dFile) - { - command += ','; - command += ` "dFile": "${options.dFile}"`; - } - if(options.num) - { - command += ','; - command += ` "num": "${options.num}"`; - } - if(options.cLoc) - { - command += ','; - command += ` "cLoc": "${options.cLoc}"`; - } - - if(options.fLoc) - { - command += ','; - command += ` "fLoc": "${options.fLoc}"`; - } - - if(options.dLoc) - { - command += ','; - command += ` "dLoc": "${options.dLoc}"`; - } - - if(options.cEdge) - { - command += ','; - command += ` "cEdge": "${options.cEdge}"`; - } - - if(options.fEdge) - { - command += ','; - command += ` "fEdge": "${options.fEdge}"`; - } - - if(options.fEdge) - { - command += ','; - command += ` "dEdge": "${options.dEdge}"`; - } - - command += ' }'; - - return command; -} - -export function getLogArgsWrapper(argv){ - const args = argv.filter( - (entry) => - !entry.includes("node") && - !entry.includes("zx") && - !entry.includes("jamlog") - ); - let options; - - try { - console.log(argv); - options = commandLineArgs(jamclogOptionDefinition, { argv: args }); - console.log(options); - } catch (error) {} - - if (options === undefined || options.help) { - const error = new Error("SHOW USAGE"); - error.type = "ShowUsage"; - throw error; - }; - - let command = `{ "program": "${options.program}", "app": "${options.app}", "port": "${options.port} `; - - if(options.remote){ - command += ','; - command += ` "remote": "${options.remote}"`; - } - - if(options.tail){ - command += ','; - command += ` "tail": "${options.tail}"`; - } - command += ` } `; - - return command; -} - -export function getJamListArgsWrapper(argv){ - const args = argv.filter( - (entry) => - !entry.includes("node") && - !entry.includes("zx") && - !entry.includes("jamlist.mjs") - ); - let options; - - try { - options = commandLineArgs(jamlistOptionDefinition, { argv: args }); - } catch (error) {} - - if (options === undefined || options.help) { - const error = new Error("SHOW USAGE"); - error.type = "ShowUsage"; - throw error; - }; - - let command = '{' - if(options.help) - { - command += ` "help": "${options.help}"`; - } - - if(options.all) - { - command += ` "all": "${options.all}"`; - } - if(options.monitor) - { - command += ` "monitor": "${options.monitor}"`; - } - - if(options.type) - { - command += ` "type": "${options.type}"`; - } - - if(options.dataStore) - { - command += ','; - command += ` "dataStore": "${options.dataStore}"`; - } - - if(options.tmuxid) - { - command += ','; - command += ` "tmuxid": "${options.tmuxid}"`; - } - if(options.port) - { - command += ','; - command += ` "port": "${options.port}"`; - } - if(options.app) - { - command += ','; - command += ` "app": "${options.app}"`; - } - - if(options.remote) - { - command += ','; - command += ` "remote": "${options.remote}"`; - } - - command += ' }'; - - return command; -} - -export function getJamKillArgsWrapper(argv){ - const args = argv.filter( - (entry) => - !entry.includes("node") && - !entry.includes("zx") && - !entry.includes("jamkill") - ); - let options; - - try { - options = commandLineArgs(jamkillOptionDefinition, { argv: args }); - } catch (error) {} - - if (options === undefined || options.help) { - const error = new Error("SHOW USAGE"); - error.type = "ShowUsage"; - throw error; - }; - - let command = '{' - if(options.reset) - { - command += ` "reset": "${options.reset}"`; - } - - if(options.all) - { - command += ` "all": "${options.all}"`; - } - if(options.remote) - { - command += ` "remote": "${options.remote}"`; - } - - if(options.app) - { - command += ` "app": "${options.app}"`; - } - - if(options.prog) - { - command += ` "prog": "${options.prog}"`; - } - - if(options.port) - { - command += ` "port": "${options.port}"`; - } - - command += ' }'; - - return command; -} - -export function getJamTermArgsWrapper(argv){ - const args = argv.filter( - (entry) => - !entry.includes("node") && - !entry.includes("zx") && - !entry.includes("jamterm") - ); - let options; - - try { - options = commandLineArgs(jamtermOptionDefinition, { argv: args }); - } catch (error) {} - - if (options === undefined || options.help) { - const error = new Error("SHOW USAGE"); - error.type = "ShowUsage"; - throw error; - }; - - let command = '{' - - if(options.help) - { - command += ` "help": "${options.help}"`; - } - if(options.all) - { - command += ` "all": "${options.all}"`; - } - - if(options.app) - { - command += ` "app": "${options.app}"`; - } - if(options.prog) - { - command += ` "prog": "${options.prog}"`; - } - - if(options.port) - { - command += ` "port": "${options.port}"`; - } - - if(options.pane) - { - command += ` "pane": "${options.pane}"`; - } - - command += ' }'; - - return command; } \ No newline at end of file diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index 8dcd7cd25..67f4c8877 100644 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -1,139 +1,494 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; -import {getBatchArgsWrapper, getJamrunArgsWrapper, getLogArgsWrapper, getJamListArgsWrapper, getJamKillArgsWrapper, getJamTermArgsWrapper} from './parser.mjs' -import { spawnSync } from 'child_process'; -const { exec } = require('child_process'); +import fetch from "node-fetch" +// Get the command-line arguments +const endpointArgs = process.argv.slice(3); -import { - body_1, - header_1, - header_2, - body_sec, - body_2, - body_sec_warning, - body_2_bold, -} from "./chalk.mjs"; -let args; +// ex: zx wrapper.mjs jamrun jt1.jxe --app="DEMO" +// Validate and process the arguments +if (endpointArgs[0] === "jamrun") { + const fileName = endpointArgs[1]; -function show_usage() { - const usageMessage = ` - ${header_1(`JAMTools 2.0`)} + //Index of parameters without value + const fogArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fog")); + const cloudArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cloud")); + const deviceArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--device")); + const bgArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--bg")); + const oldArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--old")); + const logArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--log")); + const verbArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--verb")); + const valgrindArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--valgrind")); + const localArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--local")); - ${header_2(`wrapper`)}${body_1( - ` -- a tool to run curl commands in a friendly way` - )} - ${header_1(`SYNOPSIS`)} + // Index of parameters with value + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); + const numArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--num=")); + const dataArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--data=")); + const tagsArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--tags=")); + const locArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--loc=")); + const edgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--edge=")); + const remoteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote=")); - Usage: wrapper + if (!fileName || appArgIndex === -1) { + console.error( + "Error: Missing required arguments. Usage: zx wrapper.mjs jamrun --app=" + ); + process.exit(1); + } - --- wrapper.mjs endpoint [arguments to pass] + // Extract mandatory argument + const appName = endpointArgs[appArgIndex].split("=")[1]; // Extract app name - `; - - console.log(usageMessage); -} + let numName, dataName, tagsName, locName, edgeName, remoteName, fogName, cloudName, deviceName, bgName,oldName, logName, verbName, valgrindName, localName ; -//capture the endpoints arguments -let endpoint_args = process.argv; - -// for jamrun, no need to provide the file name, jt1.jxe is used. -// ex: zx wrapper.mjs jamrun --app="DEMO" -if (endpoint_args[3] == "jamrun"){ - // here we will work with the arguments - let command = getJamrunArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://localhost:3000/jamrun -H "Content-Type: application/json" -d '${command}'`; - //console.log(curlCommand); - - let cwd = '/Users/andreisandor/Desktop/McGill/Capstone/code/JAMScript/tools/'; //To change - const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { - if (error) { - console.error(`exec error: ${error}`); - return; - } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); - }); - - -} + // Extract arguments with value if present + if(numArgIndex === 1) {numName = endpointArgs[numArgIndex].split("=")[1];} // Extract num name + if(dataArgIndex === 1) {dataName = endpointArgs[dataArgIndex].split("=")[1];} // Extract data name + if(tagsArgIndex === 1) {tagsName = endpointArgs[tagsArgIndex].split("=")[1];} // Extract tag name + if(locArgIndex === 1) {locName = endpointArgs[locArgIndex].split("=")[1];} // Extract loc name + if(edgeArgIndex === 1) {edgeName = endpointArgs[edgeArgIndex].split("=")[1];} // Extract edge name + if(remoteArgIndex === 1) {remoteName = endpointArgs[remoteArgIndex].split("=")[1];} // Extract remote name + + + // Use arguments without value if present + if(fogArgIndex === 1) {fogName = "fog"}; //fog + if(cloudArgIndex === 1) {cloudName = "cloud"}; //cloud + if(deviceArgIndex === 1) {deviceName = "device"}; //device + if(bgArgIndex === 1) {bgName = "bg"}; //bg + if(oldArgIndex === 1) {oldName = "old"}; //old + if(logArgIndex === 1) {logName = "log"}; //log + if(verbArgIndex === 1) {verbName = "verb"}; //verb + if(valgrindArgIndex === 1) {valgrindName = "valgrind"}; //valgrind + if(localArgIndex === 1) {localName = "local"}; //local + + + // Construct the JSON payload + const payload = { + file: fileName, + app_name: appName, + }; -if (endpoint_args[3] == "jambatch.mjs"){ - let command = getBatchArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://url:3000/jambatch -H "Content-Type: application/json" -d ${command}`; - - let cwd = '/root/capstone/JAMScript/tools/'; //To change - const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { - if (error) { - console.error(`exec error: ${error}`); - return; - } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); + // Add the relevent non mandatory arguments for the payload + if (numName) payload.num = numName; + if (dataName) payload.data = dataName; + if (tagsName) payload.tags = tagsName; + if (locName) payload.loc = locName; + if (edgeName) payload.edge = edgeName; + if (remoteName) payload.remote = remoteName; + + if (fogName) payload.fog = fogName; + if (cloudName) payload.cloud = cloudName; + if (deviceName) payload.device = deviceName; + if (bgName) payload.bg = bgName; + if (oldName) payload.old = oldName; + if (logName) payload.log = logName; + if (verbName) payload.verb = verbName; + if (valgrindName) payload.valgrind = valgrindName; + if (localName) payload.local = locName; + + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jamrun"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); + }); + response.body.on("end", () => { + console.log("\nStream finished."); }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); +} -} -if (endpoint_args[3] == "jamlog"){ - let command = getLogArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://url:3000/jamlog -H "Content-Type: application/json" -d ${command}`; - - let cwd = '/root/capstone/JAMScript/tools/'; //To change - const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { - if (error) { - console.error(`exec error: ${error}`); - return; - } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); +// ex: zx wrapper.mjs jambatch jt1.jxe ... +// Validate and process the arguments +if (endpointArgs[0] === "jambatch") { + const fileName = endpointArgs[1]; + + // Index of parameters + const fogArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fog=")); + const deviceArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--device=")); + const cloudArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cloud=")); + const cFileArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cFile=")); + const fFileArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fFile=")); + const dFileArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dFile=")); + const numArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--num=")); + const cLocArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cLoc=")); + const fLocArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fLoc=")); + const dLocArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dLoc=")); + const cEdgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cEdge=")); + const fEdgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fEdge=")); + const dEdgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dEdge=")); + + + if (!fileName) { + console.error( + "Error: Missing required argument. Usage: zx wrapper.mjs jambatch " + ); + process.exit(1); + } + + + let fogName, deviceName, cloudName, cFileName, fFileName, dFileName, numName, cLocName, fLocName, dLocName, cEdgeName, fEdgeName, dEdgeName; + + // Extract the paramters if they are present + if (fogArgIndex != -1) {fogName = endpointArgs[fogArgIndex].split("=")[1];} // Extract fog + if (deviceArgIndex != -1) {deviceName = endpointArgs[deviceArgIndex].split("=")[1];} // Extract device + if (cloudArgIndex != -1) {cloudName = endpointArgs[cloudArgIndex].split("=")[1];} // Extract cloud + if (cFileArgIndex != -1) {cFileName = endpointArgs[cFileArgIndex].split("=")[1];} // Extract cFile + if (fFileArgIndex != -1) {fFileName = endpointArgs[fFileArgIndex].split("=")[1];} // Extract fFile + if (dFileArgIndex != -1) {dFileName = endpointArgs[dFileArgIndex].split("=")[1];} // Extract dFile + if (numArgIndex != -1) {numName = endpointArgs[numArgIndex].split("=")[1];} // Extract num + if (cLocArgIndex != -1) {cLocName = endpointArgs[cLocArgIndex].split("=")[1];} // Extract cLoc + if (fLocArgIndex != -1) {fLocName = endpointArgs[fLocArgIndex].split("=")[1];} // Extract fLoc + if (dLocArgIndex != -1) {dLocName = endpointArgs[dLocArgIndex].split("=")[1];} // Extract dLoc + if (cEdgeArgIndex != -1) {cEdgeName = endpointArgs[cEdgeArgIndex].split("=")[1];} // Extract cEdge + if (fEdgeArgIndex != -1) {fEdgeName = endpointArgs[fEdgeArgIndex].split("=")[1];} // Extract fEdge + if (dEdgeArgIndex != -1) {dEdgeName = endpointArgs[dEdgeArgIndex].split("=")[1];} // Extract dEdge + + // Construct the JSON payload + const payload = { + file: fileName + }; + + // Add to payload if necessary + if (fogName) payload.fog = fogName; + if (deviceName) paylog.device = deviceName; + if (cloudName) payload.cloud = cloudName; + if (cFileName) payload.cFile = cFileName; + if (fFileName) payload.fFile = fFileName; + if (dFileName) payload.dFile = dFileName; + if (numName) payload.num = numName; + if (cLocName) payload.cLoc = cLocName; + if (fLocName) payload.fLoc = fLocName; + if (dLocName) payload.dLoc = dLocName; + if (cEdgeName) payload.cEdge = cEdgeName; + if (fEdgeName) payload.fEdge = fEdgeName; + if (dEdgeName) payload.dEdge = dEdgeName; + + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jambatch"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); }); + response.body.on("end", () => { + console.log("\nStream finished."); + }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); } -if (endpoint_args[3] == "jamlist"){ - let command = getJamListArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://url:3000/jamlist -H "Content-Type: application/json" -d ${command}`; - - let cwd = '/root/capstone/JAMScript/tools/'; //To change - const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { - if (error) { - console.error(`exec error: ${error}`); - return; - } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); + +// ex: zx wrapper.mjs jamlog --program=jt1.jxe --app="DEMO" --port=1883 +// Validate and process the arguments +if (endpointArgs[0] === "jamlog") { + // Get index of parameters + const programArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--program=")); + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); + + const remoteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote=")); + const tailArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--tail=")); + const cArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--c")); + const jArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--j")); + + + if (programArgIndex === -1 || appArgIndex === -1 || portArgIndex === -1) { + console.error( + "Error: Missing required arguments. Usage: zx wrapper.mjs jamlog --program= --app= --port=" + ); + process.exit(1); + } + + let programName, appName, portName, remoteName, tailName, cName, jName; + + // If the parameter is present, extract the relevent information + programName = endpointArgs[programArgIndex].split("=")[1]; // Extract program name + appName = endpointArgs[appArgIndex].split("=")[1]; // Extract app name + portName = endpointArgs[portArgIndex].split("=")[1]; // Extract port name + if (remoteArgIndex === 1) {remoteName = endpointArgs[remoteArgIndex].split("=")[1];} // Extract remote name + if (tailArgIndex === 1) {tailName = endpointArgs[tailArgIndex].split("=")[1];} // Extract tail name + + if(cArgIndex === 1) {cName = "c"}; //c + if(jArgIndex === 1) {jName = "j"}; //j + + + // Construct the JSON payload + const payload = { + program: programName, + app: appName, + port: portName + }; + + // Add the non-mandatory parameters needed for the endpoint + if (remoteName) payload.remote = remoteName; + if (tailName) payload.tail = tailName; + if (cName) payload.c = cName; + if (jName) payload.j = jName; + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jamlog"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); }); -} + response.body.on("end", () => { + console.log("\nStream finished."); + }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); +} + +// ex: zx wrapper.mjs jamlist +// Validate and process the arguments +if (endpointArgs[0] === "jamlist") { -if (endpoint_args[3] == "jamkill"){ - let command = getJamKillArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://url:3000/jamkill -H "Content-Type: application/json" -d ${command}`; - - let cwd = '/root/capstone/JAMScript/tools/'; //To change - const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { - if (error) { - console.error(`exec error: ${error}`); - return; - } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); + //Get parameters without value associated with it + const helpArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--help")); + const allArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--all")); + const monitorArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--monitor")); + + // Get index of parameters with a value associated with it + const typeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--type=")); + const dataStoreArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dataStore=")); + const tmuxidIndex = endpointArgs.findIndex((arg) => arg.startsWith("--tmuxid=")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); + const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog=")); + const remomteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote=")); + + + let helpName, allName, monitorName, typeName,dataStoreName,tmuxName, portName, appName, programName, remoteName; + + // Use non-argument if present + if(helpArgIndex === 1) {helpName = "help"}; //Help + if(allArgIndex === 1) {allName = "all"}; //All + if(monitorArgIndex === 1) {monitorName = "monitor"}; //Monitor + + // If the parameter with value is present, extract the value + if (typeArgIndex != -1) {typeName = endpointArgs[typeArgIndex].split("=")[1];} // Extract type + if (dataStoreArgIndex != -1) {dataStoreName = endpointArgs[dataStoreArgIndex].split("=")[1];} // Extract dataStore + if (tmuxidIndex != -1) {tmuxName = endpointArgs[tmuxidIndex].split("=")[1];} // Extract tmux + if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("=")[1];} // Extract port + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app + if (progArgIndex != -1) {programName = endpointArgs[progArgIndex].split("=")[1];} // Extract prog + if (remomteArgIndex != -1) {remoteName = endpointArgs[remomteArgIndex].split("=")[1];} // Extract remote + + // Construct the JSON payload + let payload = { + }; + + if (helpName) payload.help = helpName; + if (allName) payload.all = allName; + if (monitorName) payload.monitor = monitorName; + if (typeName) payload.type = typeName; + if (dataStoreName) payload.dataStore = dataStoreName; + if (tmuxName) payload.tmuxid = tmuxName; + if (portName) payload.port = portName; + if (appName) payload.app = appName; + if (programName) payload.prog = programName; + + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jamlist"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); }); + response.body.on("end", () => { + console.log("\nStream finished."); + }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); +} + +// ex: zx wrapper.mjs jamkill +// Validate and process the arguments +if (endpointArgs[0] === "jamkill") { + + // Get the parameters without value. + const helpArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--help")); + const allArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--all")); + const remoteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote")); + + // Get index of parameter with value if present + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); + const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog=")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); + + + let helpName, allName, remoteName, typeName,dataStoreName,tmuxName, portName, appName, programName; + + // If parameter without value is present + if(helpArgIndex === 1) {helpName = "help"}; //Help + if(allArgIndex === 1) {allName = "all"}; //All + if(remoteArgIndex === 1) {remoteName = "remote"}; //Remote + + // Extract values of parameters with values if present + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app + if (progArgIndex != -1) {programName = endpointArgs[progArgIndex].split("=")[1];} // Extract prog + if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("=")[1];} // Extract port + // Construct the JSON payload + let payload = { + }; + + if (helpName) payload.help = helpName; + if (allName) payload.all = allName; + if (remoteName) payload.remote = remoteName; + if (appName) payload.app = appName; + if (programName) payload.prog = programName; + if (portName) payload.port = portName; + + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jamkill"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); + }); + response.body.on("end", () => { + console.log("\nStream finished."); + }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); } -if (endpoint_args[3] == "jamterm"){ - let command = getJamTermArgsWrapper(endpoint_args.slice(4)); - let curlCommand = `curl -X POST http://url:3000/jamterm -H "Content-Type: application/json" -d ${command}`; - - let cwd = '/root/capstone/JAMScript/tools/'; //To change - const childProcess = exec(curlCommand, { cwd }, (error, stdout, stderr) => { - if (error) { - console.error(`exec error: ${error}`); - return; - } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); +// ex: zx wrapper.mjs jamterm +// Validate and process the arguments +if (endpointArgs[0] === "jamterm") { + //Get if the index of all + const allArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--all")); + + // Get the index of a parameter with a value + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); + const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog=")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); + const paneArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--pane=")); + + let allName, appName, progName, portName, paneName; + + // Use all if present + if(allArgIndex === 1) {allName = "all"}; //All + + // Extract the value of argument if present + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app + if (progArgIndex != -1) {progName = endpointArgs[progArgIndex].split("=")[1];} // Extract prog + if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("=")[1];} // Extract port + if (paneArgIndex != -1) {paneName = endpointArgs[paneArgIndex].split("=")[1];} // Extract pane + + + // Construct the JSON payload + let payload = { + }; + + if (allName) payload.all = allName; + if (appName) payload.app = appName; + if (progName) payload.prog = progName; + if (paneName) payload.pane = paneName; + + + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jamterm"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); + }); + response.body.on("end", () => { + console.log("\nStream finished."); }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); } \ No newline at end of file From 2fd370d7ec1e4c2c4f9c41136c7c82f807fed80e Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sat, 4 Jan 2025 18:54:43 -0500 Subject: [PATCH 102/126] fix index issue --- tools/app.js | 6 ++--- tools/jambatch.mjs | 7 +++--- tools/wrapper.mjs | 55 +++++++++++++++++++++++----------------------- 3 files changed, 34 insertions(+), 34 deletions(-) mode change 100644 => 100755 tools/wrapper.mjs diff --git a/tools/app.js b/tools/app.js index 5b56d2d22..6bc23a052 100644 --- a/tools/app.js +++ b/tools/app.js @@ -14,10 +14,10 @@ app.get('/api', (req, res) => { }); // Utility function to handle command execution and streaming response -function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { +function executeCommand(req, res, command, cwd = '/Users/andreisandor/Desktop/McGill/Capstone/code/JAMScript/tools') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); - + // Set headers to keep the connection open for streaming res.setHeader('Content-Type', 'text/plain'); res.setHeader('Transfer-Encoding', 'chunked'); @@ -103,7 +103,7 @@ app.post('/jambatch', (req, res) => { fog, device, cloud, cFile, fFile, dFile, num, cLoc, fLoc, dLoc, cEdge, fEdge, dEdge } = req.body; - let command = `zx jambatch.mjs program.jxe`; + let command = `zx jambatch.mjs`; if (fog) command += ` --fog=${fog}`; if (device) command += ` --device=${device}`; if (cloud) command += ` --cloud=${cloud}`; diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs index 690e8c182..fa651222c 100755 --- a/tools/jambatch.mjs +++ b/tools/jambatch.mjs @@ -96,7 +96,6 @@ try { } let spawnPipe = 'inherit' if(args.config){ - const jsonString = fs.readFileSync(args.config); const jobs = JSON.parse(jsonString).jobs; @@ -124,7 +123,7 @@ if(args.config){ continue; } - const exec = `jamrun.mjs ${jobs[i].file} --app=${jobs[i].name} --bg --log --${jobs[i].type}` + const exec = ` wrapper.mjs jamrun ${jobs[i].file} --app=${jobs[i].name} --bg --log --${jobs[i].type}` if(jobs.num) exec + ` --num=${jobs.num}` if(jobs.loc) @@ -139,6 +138,7 @@ if(args.config){ console.log(`${body_sec(`Starting job number: ${i+1} - ${exec}`)}`) } + spawnSync('zx', [exec], { stdio: spawnPipe, shell: true @@ -150,10 +150,11 @@ if(args.config){ const verb = args.pop() for(let arg of args){ + console.log(arg); if(verb){ console.log(`${body_sec(`Starting new job: jamrun.mjs ${arg}`)}`) } - spawnSync('zx', ['jamrun.mjs'].concat(arg), { + spawnSync('zx wrapper.mjs', ['jamrun'].concat(arg), { stdio: spawnPipe, shell: true }); diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs old mode 100644 new mode 100755 index 67f4c8877..e2cce9dbc --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -46,26 +46,25 @@ if (endpointArgs[0] === "jamrun") { let numName, dataName, tagsName, locName, edgeName, remoteName, fogName, cloudName, deviceName, bgName,oldName, logName, verbName, valgrindName, localName ; // Extract arguments with value if present - if(numArgIndex === 1) {numName = endpointArgs[numArgIndex].split("=")[1];} // Extract num name - if(dataArgIndex === 1) {dataName = endpointArgs[dataArgIndex].split("=")[1];} // Extract data name - if(tagsArgIndex === 1) {tagsName = endpointArgs[tagsArgIndex].split("=")[1];} // Extract tag name - if(locArgIndex === 1) {locName = endpointArgs[locArgIndex].split("=")[1];} // Extract loc name - if(edgeArgIndex === 1) {edgeName = endpointArgs[edgeArgIndex].split("=")[1];} // Extract edge name - if(remoteArgIndex === 1) {remoteName = endpointArgs[remoteArgIndex].split("=")[1];} // Extract remote name + if(numArgIndex != -1) {numName = endpointArgs[numArgIndex].split("=")[1];} // Extract num name + if(dataArgIndex != -1) {dataName = endpointArgs[dataArgIndex].split("=")[1];} // Extract data name + if(tagsArgIndex != -1) {tagsName = endpointArgs[tagsArgIndex].split("=")[1];} // Extract tag name + if(locArgIndex != -1) {locName = endpointArgs[locArgIndex].split("=")[1];} // Extract loc name + if(edgeArgIndex != -1) {edgeName = endpointArgs[edgeArgIndex].split("=")[1];} // Extract edge name + if(remoteArgIndex != -1) {remoteName = endpointArgs[remoteArgIndex].split("=")[1];} // Extract remote name // Use arguments without value if present - if(fogArgIndex === 1) {fogName = "fog"}; //fog - if(cloudArgIndex === 1) {cloudName = "cloud"}; //cloud - if(deviceArgIndex === 1) {deviceName = "device"}; //device - if(bgArgIndex === 1) {bgName = "bg"}; //bg - if(oldArgIndex === 1) {oldName = "old"}; //old - if(logArgIndex === 1) {logName = "log"}; //log - if(verbArgIndex === 1) {verbName = "verb"}; //verb - if(valgrindArgIndex === 1) {valgrindName = "valgrind"}; //valgrind - if(localArgIndex === 1) {localName = "local"}; //local + if(fogArgIndex != -1) {fogName = "fog"}; //fog + if(cloudArgIndex != -1) {cloudName = "cloud"}; //cloud + if(deviceArgIndex != -1) {deviceName = "device"}; //device + if(bgArgIndex != -1) {bgName = "bg"}; //bg + if(oldArgIndex != -1) {oldName = "old"}; //old + if(logArgIndex != -1) {logName = "log"}; //log + if(verbArgIndex != -1) {verbName = "verb"}; //verb + if(valgrindArgIndex != -1) {valgrindName = "valgrind"}; //valgrind + if(localArgIndex != -1) {localName = "local"}; //local - // Construct the JSON payload const payload = { file: fileName, @@ -172,7 +171,7 @@ if (endpointArgs[0] === "jambatch") { // Add to payload if necessary if (fogName) payload.fog = fogName; - if (deviceName) paylog.device = deviceName; + if (deviceName) payload.device = deviceName; if (cloudName) payload.cloud = cloudName; if (cFileName) payload.cFile = cFileName; if (fFileName) payload.fFile = fFileName; @@ -241,11 +240,11 @@ if (endpointArgs[0] === "jamlog") { programName = endpointArgs[programArgIndex].split("=")[1]; // Extract program name appName = endpointArgs[appArgIndex].split("=")[1]; // Extract app name portName = endpointArgs[portArgIndex].split("=")[1]; // Extract port name - if (remoteArgIndex === 1) {remoteName = endpointArgs[remoteArgIndex].split("=")[1];} // Extract remote name - if (tailArgIndex === 1) {tailName = endpointArgs[tailArgIndex].split("=")[1];} // Extract tail name + if (remoteArgIndex != -1) {remoteName = endpointArgs[remoteArgIndex].split("=")[1];} // Extract remote name + if (tailArgIndex != -1) {tailName = endpointArgs[tailArgIndex].split("=")[1];} // Extract tail name - if(cArgIndex === 1) {cName = "c"}; //c - if(jArgIndex === 1) {jName = "j"}; //j + if(cArgIndex != -1) {cName = "c"}; //c + if(jArgIndex != -1) {jName = "j"}; //j // Construct the JSON payload @@ -310,9 +309,9 @@ if (endpointArgs[0] === "jamlist") { let helpName, allName, monitorName, typeName,dataStoreName,tmuxName, portName, appName, programName, remoteName; // Use non-argument if present - if(helpArgIndex === 1) {helpName = "help"}; //Help - if(allArgIndex === 1) {allName = "all"}; //All - if(monitorArgIndex === 1) {monitorName = "monitor"}; //Monitor + if(helpArgIndex != -1) {helpName = "help"}; //Help + if(allArgIndex != -1) {allName = "all"}; //All + if(monitorArgIndex != -1) {monitorName = "monitor"}; //Monitor // If the parameter with value is present, extract the value if (typeArgIndex != -1) {typeName = endpointArgs[typeArgIndex].split("=")[1];} // Extract type @@ -383,9 +382,9 @@ if (endpointArgs[0] === "jamkill") { let helpName, allName, remoteName, typeName,dataStoreName,tmuxName, portName, appName, programName; // If parameter without value is present - if(helpArgIndex === 1) {helpName = "help"}; //Help - if(allArgIndex === 1) {allName = "all"}; //All - if(remoteArgIndex === 1) {remoteName = "remote"}; //Remote + if(helpArgIndex != -1) {helpName = "help"}; //Help + if(allArgIndex != -1) {allName = "all"}; //All + if(remoteArgIndex != -1) {remoteName = "remote"}; //Remote // Extract values of parameters with values if present if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app @@ -446,7 +445,7 @@ if (endpointArgs[0] === "jamterm") { let allName, appName, progName, portName, paneName; // Use all if present - if(allArgIndex === 1) {allName = "all"}; //All + if(allArgIndex != -1) {allName = "all"}; //All // Extract the value of argument if present if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app From 04a59d1a182bc490c5667e4e77ac42f7db295898 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:48:26 -0500 Subject: [PATCH 103/126] jambatch works --- tools/wrapper.mjs | 200 +++++++++++++++++++++++++--------------------- 1 file changed, 110 insertions(+), 90 deletions(-) diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index e2cce9dbc..fc1bf6144 100755 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -1,7 +1,10 @@ #!/usr/bin/env zx import commandLineArgs from 'command-line-args'; -import fetch from "node-fetch" +import fetch from "node-fetch"; +import {getBatchArgs} from './parser.mjs'; + + // Get the command-line arguments const endpointArgs = process.argv.slice(3); @@ -119,97 +122,114 @@ if (endpointArgs[0] === "jamrun") { // ex: zx wrapper.mjs jambatch jt1.jxe ... -// Validate and process the arguments +// Validate and process the arguments. jambatch is just a collection of jamrun if (endpointArgs[0] === "jambatch") { - const fileName = endpointArgs[1]; - - // Index of parameters - const fogArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fog=")); - const deviceArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--device=")); - const cloudArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cloud=")); - const cFileArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cFile=")); - const fFileArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fFile=")); - const dFileArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dFile=")); - const numArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--num=")); - const cLocArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cLoc=")); - const fLocArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fLoc=")); - const dLocArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dLoc=")); - const cEdgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--cEdge=")); - const fEdgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--fEdge=")); - const dEdgeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dEdge=")); - - - if (!fileName) { - console.error( - "Error: Missing required argument. Usage: zx wrapper.mjs jambatch " - ); - process.exit(1); - } - - - let fogName, deviceName, cloudName, cFileName, fFileName, dFileName, numName, cLocName, fLocName, dLocName, cEdgeName, fEdgeName, dEdgeName; - - // Extract the paramters if they are present - if (fogArgIndex != -1) {fogName = endpointArgs[fogArgIndex].split("=")[1];} // Extract fog - if (deviceArgIndex != -1) {deviceName = endpointArgs[deviceArgIndex].split("=")[1];} // Extract device - if (cloudArgIndex != -1) {cloudName = endpointArgs[cloudArgIndex].split("=")[1];} // Extract cloud - if (cFileArgIndex != -1) {cFileName = endpointArgs[cFileArgIndex].split("=")[1];} // Extract cFile - if (fFileArgIndex != -1) {fFileName = endpointArgs[fFileArgIndex].split("=")[1];} // Extract fFile - if (dFileArgIndex != -1) {dFileName = endpointArgs[dFileArgIndex].split("=")[1];} // Extract dFile - if (numArgIndex != -1) {numName = endpointArgs[numArgIndex].split("=")[1];} // Extract num - if (cLocArgIndex != -1) {cLocName = endpointArgs[cLocArgIndex].split("=")[1];} // Extract cLoc - if (fLocArgIndex != -1) {fLocName = endpointArgs[fLocArgIndex].split("=")[1];} // Extract fLoc - if (dLocArgIndex != -1) {dLocName = endpointArgs[dLocArgIndex].split("=")[1];} // Extract dLoc - if (cEdgeArgIndex != -1) {cEdgeName = endpointArgs[cEdgeArgIndex].split("=")[1];} // Extract cEdge - if (fEdgeArgIndex != -1) {fEdgeName = endpointArgs[fEdgeArgIndex].split("=")[1];} // Extract fEdge - if (dEdgeArgIndex != -1) {dEdgeName = endpointArgs[dEdgeArgIndex].split("=")[1];} // Extract dEdge - - // Construct the JSON payload - const payload = { - file: fileName - }; - - // Add to payload if necessary - if (fogName) payload.fog = fogName; - if (deviceName) payload.device = deviceName; - if (cloudName) payload.cloud = cloudName; - if (cFileName) payload.cFile = cFileName; - if (fFileName) payload.fFile = fFileName; - if (dFileName) payload.dFile = dFileName; - if (numName) payload.num = numName; - if (cLocName) payload.cLoc = cLocName; - if (fLocName) payload.fLoc = fLocName; - if (dLocName) payload.dLoc = dLocName; - if (cEdgeName) payload.cEdge = cEdgeName; - if (fEdgeName) payload.fEdge = fEdgeName; - if (dEdgeName) payload.dEdge = dEdgeName; - - - // Send the POST request to the server - const endpoint = "http://localhost:3000/jambatch"; - fetch(endpoint, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(payload), - }) - .then((response) => { - // Ensure response status is OK - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } - - // Handle streaming response with Node.js readable stream - console.log("Streaming response:"); - response.body.on("data", (chunk) => { - process.stdout.write(chunk.toString()); - }); - response.body.on("end", () => { - console.log("\nStream finished."); - }); + + + let argsBatchParsed = getBatchArgs(endpointArgs.slice(1)); + + // For each batch + for(let i = 0; i < argsBatchParsed.length - 1; i++) + { + let setArgs = argsBatchParsed[i]; + + const fileName = setArgs[0]; + + //Index of parameters without value + const fogArgIndex = setArgs.findIndex((arg) => arg.startsWith("--fog")); + const cloudArgIndex = setArgs.findIndex((arg) => arg.startsWith("--cloud")); + const deviceArgIndex = setArgs.findIndex((arg) => arg.startsWith("--device")); + const bgArgIndex = setArgs.findIndex((arg) => arg.startsWith("--bg")); + const oldArgIndex = setArgs.findIndex((arg) => arg.startsWith("--old")); + const logArgIndex = setArgs.findIndex((arg) => arg.startsWith("--log")); + const verbArgIndex = setArgs.findIndex((arg) => arg.startsWith("--verb")); + const valgrindArgIndex = setArgs.findIndex((arg) => arg.startsWith("--valgrind")); + const localArgIndex = setArgs.findIndex((arg) => arg.startsWith("--local")); + + + // Index of parameters with value + const appArgIndex = setArgs.findIndex((arg) => arg.startsWith("--app=")); + const numArgIndex = setArgs.findIndex((arg) => arg.startsWith("--num=")); + const dataArgIndex = setArgs.findIndex((arg) => arg.startsWith("--data=")); + const tagsArgIndex = setArgs.findIndex((arg) => arg.startsWith("--tags=")); + const locArgIndex = setArgs.findIndex((arg) => arg.startsWith("--loc=")); + const edgeArgIndex = setArgs.findIndex((arg) => arg.startsWith("--edge=")); + const remoteArgIndex = setArgs.findIndex((arg) => arg.startsWith("--remote=")); + + + let appName, numName, dataName, tagsName, locName, edgeName, remoteName, fogName, cloudName, deviceName, bgName,oldName, logName, verbName, valgrindName, localName ; + + // Extract arguments with value if present + if(appArgIndex != -1) {appName = setArgs[appArgIndex].split("=")[1];} // Extract app name + if(numArgIndex != -1) {numName = setArgs[numArgIndex].split("=")[1];} // Extract num name + if(dataArgIndex != -1) {dataName = setArgs[dataArgIndex].split("=")[1];} // Extract data name + if(tagsArgIndex != -1) {tagsName = setArgs[tagsArgIndex].split("=")[1];} // Extract tag name + if(locArgIndex != -1) {locName = setArgs[locArgIndex].split("=")[1];} // Extract loc name + if(edgeArgIndex != -1) {edgeName = setArgs[edgeArgIndex].split("=")[1];} // Extract edge name + if(remoteArgIndex != -1) {remoteName = setArgs[remoteArgIndex].split("=")[1];} // Extract remote name + + + // Use arguments without value if present + if(fogArgIndex != -1) {fogName = "fog"}; //fog + if(cloudArgIndex != -1) {cloudName = "cloud"}; //cloud + if(deviceArgIndex != -1) {deviceName = "device"}; //device + if(bgArgIndex != -1) {bgName = "bg"}; //bg + if(oldArgIndex != -1) {oldName = "old"}; //old + if(logArgIndex != -1) {logName = "log"}; //log + if(verbArgIndex != -1) {verbName = "verb"}; //verb + if(valgrindArgIndex != -1) {valgrindName = "valgrind"}; //valgrind + if(localArgIndex != -1) {localName = "local"}; //local + + // Construct the JSON payload + const payload = { + file: fileName, + app_name: appName + }; + + // Add to payload if necessary + if (numName) payload.num = numName; + if (dataName) payload.data = dataName; + if (tagsName) payload.tags = tagsName; + if (locName) payload.loc = locName; + if (edgeName) payload.edge = edgeName; + if (remoteName) payload.remote = remoteName; + + if (fogName) payload.fog = fogName; + if (cloudName) payload.cloud = cloudName; + if (deviceName) payload.device = deviceName; + if (bgName) payload.bg = bgName; + if (oldName) payload.old = oldName; + if (logName) payload.log = logName; + if (verbName) payload.verb = verbName; + if (valgrindName) payload.valgrind = valgrindName; + if (localName) payload.local = locName; + + // Send the POST request to the server + const endpoint = "http://localhost:3000/jamrun"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), }) - .catch((error) => { - console.error("Error sending request:", error.message); - }); + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); + }); + response.body.on("end", () => { + console.log("\nStream finished."); + }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); + } } From b7922a39ef58debd8d0222bded014f69a4638321 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:52:20 -0500 Subject: [PATCH 104/126] all endpoints do work --- tools/app.js | 2 +- tools/jambatch.mjs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/app.js b/tools/app.js index 6bc23a052..ce8a68c22 100644 --- a/tools/app.js +++ b/tools/app.js @@ -14,7 +14,7 @@ app.get('/api', (req, res) => { }); // Utility function to handle command execution and streaming response -function executeCommand(req, res, command, cwd = '/Users/andreisandor/Desktop/McGill/Capstone/code/JAMScript/tools') { +function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); diff --git a/tools/jambatch.mjs b/tools/jambatch.mjs index fa651222c..1ac045404 100755 --- a/tools/jambatch.mjs +++ b/tools/jambatch.mjs @@ -123,7 +123,7 @@ if(args.config){ continue; } - const exec = ` wrapper.mjs jamrun ${jobs[i].file} --app=${jobs[i].name} --bg --log --${jobs[i].type}` + const exec = `jamrun.mjs ${jobs[i].file} --app=${jobs[i].name} --bg --log --${jobs[i].type}` if(jobs.num) exec + ` --num=${jobs.num}` if(jobs.loc) @@ -138,7 +138,6 @@ if(args.config){ console.log(`${body_sec(`Starting job number: ${i+1} - ${exec}`)}`) } - spawnSync('zx', [exec], { stdio: spawnPipe, shell: true @@ -150,11 +149,10 @@ if(args.config){ const verb = args.pop() for(let arg of args){ - console.log(arg); if(verb){ console.log(`${body_sec(`Starting new job: jamrun.mjs ${arg}`)}`) } - spawnSync('zx wrapper.mjs', ['jamrun'].concat(arg), { + spawnSync('zx', ['jamrun.mjs'].concat(arg), { stdio: spawnPipe, shell: true }); From 58f45ea91d90c2ed871ac10665a09ef8aa8d961e Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sat, 4 Jan 2025 23:33:46 -0500 Subject: [PATCH 105/126] fix == issues --- tools/app.js | 28 +++++++++++----------- tools/wrapper.mjs | 59 ++++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/tools/app.js b/tools/app.js index ce8a68c22..e41819f25 100644 --- a/tools/app.js +++ b/tools/app.js @@ -135,7 +135,7 @@ app.post('/jamlog', (req, res) => { if (tail) command += ` --tail=${tail}`; if (c) command += ` --c`; - if (c) command += ` --j`; + if (j) command += ` --j`; executeCommand(req, res, command); @@ -149,13 +149,13 @@ app.post('/jamlist', (req, res) => { if (help) command += ` --help`; if (all) command += ` --all`; if (monitor) command += ` --monitor`; - if (type) command += ` --type=${type}`; - if (dataStore) command += ` --dataStore=${dataStore}`; - if (tmuxid) command += ` --tmuxid=${tmuxid}`; - if (port) command += ` --port=${port}`; - if (app) command += ` --app=${app}`; - if (prog) command += ` --prog=${prog}`; - if (remote) command += ` --remote=${remote}`; + if (type) command += ` --type==${type}`; + if (dataStore) command += ` --dataStore==${dataStore}`; + if (tmuxid) command += ` --tmuxid==${tmuxid}`; + if (port) command += ` --port==${port}`; + if (app) command += ` --app==${app}`; + if (prog) command += ` --prog==${prog}`; + if (remote) command += ` --remote`; executeCommand(req, res, command); }); @@ -168,9 +168,9 @@ app.post('/jamkill', (req, res) => { if (reset) command += ' --reset'; if (all) command += ' --all'; if (remote) command += ` --remote=${remote}`; - if (app) command += ` --app=${app}`; - if (prog) command += ` --prog=${prog}`; - if (port) command += ` --port=${port}`; + if (app) command += ` --app==${app}`; + if (prog) command += ` --prog==${prog}`; + if (port) command += ` --port==${port}`; executeCommand(req, res, command); }); @@ -181,9 +181,9 @@ app.post("/jamterm", (req, res) => { let command = `zx jamterm.mjs`; if (all) command += ' --all'; - if (app) command += ` --app=${app}`; - if (prog) command += ` --prog=${prog}`; - if (port) command += ` --port=${port}`; + if (app) command += ` --app==${app}`; + if (prog) command += ` --prog==${prog}`; + if (port) command += ` --port==${port}`; if (pane) command += ` --pane=${pane}`; executeCommand(req, res, command); diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index fc1bf6144..0c18544b0 100755 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -92,7 +92,6 @@ if (endpointArgs[0] === "jamrun") { if (valgrindName) payload.valgrind = valgrindName; if (localName) payload.local = locName; - // Send the POST request to the server const endpoint = "http://localhost:3000/jamrun"; fetch(endpoint, { @@ -317,13 +316,13 @@ if (endpointArgs[0] === "jamlist") { const monitorArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--monitor")); // Get index of parameters with a value associated with it - const typeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--type=")); - const dataStoreArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dataStore=")); - const tmuxidIndex = endpointArgs.findIndex((arg) => arg.startsWith("--tmuxid=")); - const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); - const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); - const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog=")); - const remomteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote=")); + const typeArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--type==")); + const dataStoreArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--dataStore==")); + const tmuxidIndex = endpointArgs.findIndex((arg) => arg.startsWith("--tmuxid==")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port==")); + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app==")); + const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog==")); + const remomteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote==")); let helpName, allName, monitorName, typeName,dataStoreName,tmuxName, portName, appName, programName, remoteName; @@ -334,13 +333,13 @@ if (endpointArgs[0] === "jamlist") { if(monitorArgIndex != -1) {monitorName = "monitor"}; //Monitor // If the parameter with value is present, extract the value - if (typeArgIndex != -1) {typeName = endpointArgs[typeArgIndex].split("=")[1];} // Extract type - if (dataStoreArgIndex != -1) {dataStoreName = endpointArgs[dataStoreArgIndex].split("=")[1];} // Extract dataStore - if (tmuxidIndex != -1) {tmuxName = endpointArgs[tmuxidIndex].split("=")[1];} // Extract tmux - if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("=")[1];} // Extract port - if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app - if (progArgIndex != -1) {programName = endpointArgs[progArgIndex].split("=")[1];} // Extract prog - if (remomteArgIndex != -1) {remoteName = endpointArgs[remomteArgIndex].split("=")[1];} // Extract remote + if (typeArgIndex != -1) {typeName = endpointArgs[typeArgIndex].split("==")[1];} // Extract type + if (dataStoreArgIndex != -1) {dataStoreName = endpointArgs[dataStoreArgIndex].split("==")[1];} // Extract dataStore + if (tmuxidIndex != -1) {tmuxName = endpointArgs[tmuxidIndex].split("==")[1];} // Extract tmux + if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("==")[1];} // Extract port + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("==")[1];} // Extract app + if (progArgIndex != -1) {programName = endpointArgs[progArgIndex].split("==")[1];} // Extract prog + if (remomteArgIndex != -1) {remoteName = endpointArgs[remomteArgIndex].split("==")[1];} // Extract remote // Construct the JSON payload let payload = { @@ -355,8 +354,7 @@ if (endpointArgs[0] === "jamlist") { if (portName) payload.port = portName; if (appName) payload.app = appName; if (programName) payload.prog = programName; - - + // Send the POST request to the server const endpoint = "http://localhost:3000/jamlist"; fetch(endpoint, { @@ -394,9 +392,9 @@ if (endpointArgs[0] === "jamkill") { const remoteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote")); // Get index of parameter with value if present - const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); - const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog=")); - const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app==")); + const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog==")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port==")); let helpName, allName, remoteName, typeName,dataStoreName,tmuxName, portName, appName, programName; @@ -407,9 +405,9 @@ if (endpointArgs[0] === "jamkill") { if(remoteArgIndex != -1) {remoteName = "remote"}; //Remote // Extract values of parameters with values if present - if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app - if (progArgIndex != -1) {programName = endpointArgs[progArgIndex].split("=")[1];} // Extract prog - if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("=")[1];} // Extract port + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("==")[1];} // Extract app + if (progArgIndex != -1) {programName = endpointArgs[progArgIndex].split("==")[1];} // Extract prog + if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("==")[1];} // Extract port // Construct the JSON payload let payload = { @@ -457,9 +455,9 @@ if (endpointArgs[0] === "jamterm") { const allArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--all")); // Get the index of a parameter with a value - const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); - const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog=")); - const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port=")); + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app==")); + const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog==")); + const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port==")); const paneArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--pane=")); let allName, appName, progName, portName, paneName; @@ -468,9 +466,9 @@ if (endpointArgs[0] === "jamterm") { if(allArgIndex != -1) {allName = "all"}; //All // Extract the value of argument if present - if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app - if (progArgIndex != -1) {progName = endpointArgs[progArgIndex].split("=")[1];} // Extract prog - if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("=")[1];} // Extract port + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("==")[1];} // Extract app + if (progArgIndex != -1) {progName = endpointArgs[progArgIndex].split("==")[1];} // Extract prog + if (portArgIndex != -1) {portName = endpointArgs[portArgIndex].split("==")[1];} // Extract port if (paneArgIndex != -1) {paneName = endpointArgs[paneArgIndex].split("=")[1];} // Extract pane @@ -481,10 +479,9 @@ if (endpointArgs[0] === "jamterm") { if (allName) payload.all = allName; if (appName) payload.app = appName; if (progName) payload.prog = progName; + if (portName) payload.port = portName; if (paneName) payload.pane = paneName; - - // Send the POST request to the server const endpoint = "http://localhost:3000/jamterm"; fetch(endpoint, { From 9eddcd55760de9d75e6c43a44a71091b1b8106b2 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Sun, 12 Jan 2025 00:07:19 +0000 Subject: [PATCH 106/126] Added docker files --- mainCompiler.js | 2 +- tools/README.md | 10 + tools/crun | 212 ++++++ tools/djam | 98 +++ tools/djambuild | 41 ++ tools/djamcompile | 70 ++ tools/djamexec | 220 +++++++ tools/djaminit | 178 +++++ tools/djamload | 127 ++++ tools/djamlog | 149 +++++ tools/djampull | 42 ++ tools/djamrun | 574 ++++++++++++++++ tools/djamterm | 141 ++++ tools/djamtest | 121 ++++ tools/inc/docker_tools.sh | 1 + tools/inc/mach_tools.sh | 162 +++++ tools/inc/misc_tools.sh | 268 ++++++++ tools/inc/pumba_tools.sh | 84 +++ tools/jam | 57 ++ tools/jamclean | 77 +++ tools/jamclose | 84 +++ tools/jamexec | 425 ++++++++++++ tools/jaminstall | 133 ++++ tools/jamkill | 162 +++++ tools/jamlist | 225 +++++++ tools/jamlog | 125 ++++ tools/jamrun | 750 +++++++++++++++++++++ tools/jamrun_epm | 401 ++++++++++++ tools/jamterm | 97 +++ tools/jamtoast | 1159 +++++++++++++++++++++++++++++++++ tools/jamvis | 71 ++ tools/jamvis_internal/serv.js | 303 +++++++++ tools/jamvis_internal/view.js | 603 +++++++++++++++++ tools/jrun | 388 +++++++++++ tools/testjs.js | 8 + tools/testsh.sh | 4 + 36 files changed, 7571 insertions(+), 1 deletion(-) create mode 100644 tools/README.md create mode 100755 tools/crun create mode 100755 tools/djam create mode 100755 tools/djambuild create mode 100755 tools/djamcompile create mode 100755 tools/djamexec create mode 100755 tools/djaminit create mode 100755 tools/djamload create mode 100755 tools/djamlog create mode 100755 tools/djampull create mode 100755 tools/djamrun create mode 100755 tools/djamterm create mode 100755 tools/djamtest create mode 100644 tools/inc/docker_tools.sh create mode 100644 tools/inc/mach_tools.sh create mode 100644 tools/inc/misc_tools.sh create mode 100644 tools/inc/pumba_tools.sh create mode 100755 tools/jam create mode 100755 tools/jamclean create mode 100755 tools/jamclose create mode 100755 tools/jamexec create mode 100755 tools/jaminstall create mode 100755 tools/jamkill create mode 100755 tools/jamlist create mode 100755 tools/jamlog create mode 100755 tools/jamrun create mode 100755 tools/jamrun_epm create mode 100755 tools/jamterm create mode 100755 tools/jamtoast create mode 100755 tools/jamvis create mode 100644 tools/jamvis_internal/serv.js create mode 100644 tools/jamvis_internal/view.js create mode 100755 tools/jrun create mode 100644 tools/testjs.js create mode 100755 tools/testsh.sh diff --git a/mainCompiler.js b/mainCompiler.js index a66b5e1e5..b6c2976ce 100755 --- a/mainCompiler.js +++ b/mainCompiler.js @@ -331,4 +331,4 @@ function deleteFolderRecursive(path) { }); fs.rmdirSync(path); } -} \ No newline at end of file +} diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 000000000..0f2b4583f --- /dev/null +++ b/tools/README.md @@ -0,0 +1,10 @@ +# JAMTools + + +A collection of tools to compile and run JAMScript programs. These tools are best used with the docker version of JAMScript. + +*Before you use these tools, you need to setup your account so that docker can run without sudo*. Check the Ubuntu or the particular Linux distribution's documentation to find out how you can setup your system. + +Clone this repository into a local directory like $HOME/JAMTools. Add this location to your $PATH. Check whether a command like djam is in your path and is picked up from this repository. Once you have got djam in your path, you are all set! + +Type djam to see the options that are available to you. diff --git a/tools/crun b/tools/crun new file mode 100755 index 000000000..e287ec8ac --- /dev/null +++ b/tools/crun @@ -0,0 +1,212 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Usage: runc file.jxe -a appl_name -n number -g group_name + +The runc command runs the C component of the file.jxe (JAM executable). +The -g group_name needs to specified to connect the C node to the proper +group (J node). Otherwise, it will connect the C node to the 'default' +group. +EOF +} + + +getappid() { + local mainf=$1 + local localf=$2 + local appid=$3 + + if [ -e $mainf/counter ]; then + local count=`cat $mainf/counter` + ((count++)) + echo $count > $mainf/counter + else + local count=1 + echo $count > $mainf/counter + fi + + if [[ $appid == app-* ]]; then + if [ ! -e $localf/appid ]; then + echo "app-"$count > $localf/appid + fi + else + echo $appid > $localf/appid + fi + + jappid=`cat $localf/appid` +} + + +# Initialize all the option variables. +app=testapp +num=1 +group="default" +port= +tags= + +file=$1 +shift +fext="${file##*.}" + +if [ -z $file ] || [ $file = "-h" ]; then + show_usage + exit 1 +fi + +if [ "$fext" != "jxe" ]; then + die "file extension is not .jxe" +fi + +# Set the global variable 'port' based on the +# group name. +getgroupport() { + local gname=$1 + if [ $gname == "default" ]; then + port=1883 + fi + + for dir in */; do + if [ -e $dir/group ]; then + local grp=`cat $dir/group` + if [ $grp == $gname ]; then + port=$dir + break; + fi + fi + done +} + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + -n|--num) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + num=$2 + shift + else + die 'ERROR: "--num" requires a non-empty option argument.' + fi + ;; + --num=?*) + num=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --num=) # Handle the case of an empty + die 'ERROR: "--num" requires a non-empty option argument.' + ;; + -g|--group) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + group=$2 + shift + else + die 'ERROR: "--group" requires a non-empty option argument.' + fi + ;; + --group=?*) + group=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --group=) # Handle the case of an empty + die 'ERROR: "--group" requires a non-empty option argument.' + ;; + -t|--tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + + +echo "Don't use jrun and crun! Use jamrun instead of them." +echo "Exiting." +exit + + +if [ -e "$file" ]; then + + # Check whether the global .jamruns folder is there + jamfolder="$HOME/.jamruns" + wait_missingdir $HOME $jamfolder + + appfolder=$jamfolder/apps + wait_missingdir $jamfolder $appfolder + + # Get the folder + filenoext="${file%.*}" + folder=$HOME"/.jamruns/apps/"$filenoext"_"$app + wait_missingdir $appfolder $folder + + cd $folder + while :; do + getgroupport $group + if [ -n $port ]; then break; fi + inotifywait -r -e create $folder + done + + # Note: you need to use --num=value to point to the correct + # device sequence number. + # with two devices; 1, 2 are the numbers + # + + if [ -e a.out ]; then + + # execute the program.. we are in the folder.. + chmod +x a.out + if [ -z $tags ]; then + ./a.out -a $app -n $num -p $port + else + ./a.out -a $app -n $num -t $tags -p $port + fi + else + die "$file is not a valid JAMScript executable" + fi + +else + die "JAMScript executable: $file not found" +fi diff --git a/tools/djam b/tools/djam new file mode 100755 index 000000000..ec47bd777 --- /dev/null +++ b/tools/djam @@ -0,0 +1,98 @@ +#!/bin/bash + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF + +Runs JAMScript instances in docker containers. +The docker version of the normal 'jam' commands + +djam help - Prints this help. +djam build - Rebuilds another docker image. +djam clean - Cleans up the mess left behind by old runs. + Use this command if errors occur due to incomplete runs. +djam close - Close all tmux terminals opened by the 'term' command. +djam comp - Compile the JAMScript program in the container. + Executable file is copied back to the original folder. +djam exec - Execute the given program in an existing (running) configuration. +djam init - Initializes the delay values for the docker topology. + Saves zones information and starts pumba (net emulator). +djam kill - Kill a particular application or all active applications. +djam list - Lists all the JAMScript programs running in the system. +djam load - Loads the given file into each node in the current topology. + New file goes into the /jamfiles folder. +djam log - Shows the logs written by the C nodes. A good way to + see the debug messages from the C side. +djam pull - Pull the given docker image and make it the default +djam run - Start a device, fog, or cloud +djam term - Reattach to a tmux terminal of a running JAMScript instance + Use the 'list' command to find out the ID to connect. +djam test - Configures a test topology based on the parameter provided in 'init'. +djam stat - Get the configuration status of djam installation. + +Type 'djam cmd --help' for more help on the specific command. + +EOF +} + +if [ -z $1 ] || [ $1 == "help" ]; then + show_usage + exit 0 +fi + +jcmd=$1 +shift 1 +params=$@ + + +case $jcmd in + list) + jamlist $params + ;; + build) + djambuild $params + ;; + init) + djaminit $params + ;; + term) + djamterm $params + ;; + test) + djamtest $params + ;; + kill) + jamkill $params + ;; + clean) + jamclean $params + ;; + log) + djamlog $params + ;; + run) + djamrun $params + ;; + close) + jamclose $params + ;; + pull) + djampull $params + ;; + comp) + djamcompile $params + ;; + compile) + djamcompile $params + ;; + exec) + djamexec $params + ;; + stat) + djamstat $params + ;; +esac diff --git a/tools/djambuild b/tools/djambuild new file mode 100755 index 000000000..2c76e09b6 --- /dev/null +++ b/tools/djambuild @@ -0,0 +1,41 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +show_usage() { + cat << EOF +Builds a new docker image using the current JAMScript version in the github repo +at https://github.com/citelab/JAMScript. + +Usage: djambuild [repo] + +djambuild -h +djambuild --help +Prints this help message. + +djambuild repository +Builds a new jamscript docker image and uploads to the given repository. + +EOF +} + + +if [ -z $JAMHOME ]; then + echo "$JAMHOME not set. $JAMHOME needs to point towards a JAMScript source directory." + die +fi + +if [ -z $1 ]; then + docker build --no-cache -t jamscript $JAMHOME/scripts/install + docker tag jamscript mahes25/jamscript + docker push mahes25/jamscript +elif [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit +else + docker build --no-cache -t jamscript $JAMHOME/scripts/install + docker tag jamscript $1 + docker push $1 +fi diff --git a/tools/djamcompile b/tools/djamcompile new file mode 100755 index 000000000..bcbbd04f2 --- /dev/null +++ b/tools/djamcompile @@ -0,0 +1,70 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + + +# Spin up the build container if it is not there. +# No need to spin up if the container is already there + +# Copy the files into the container +# Run the jamc compiler in the container using 'docker exec..' +# Get the results back - copy the .jxe file back to the original folder +# + + +show_usage() { + cat << EOF + +djamcompile or djamcompile -h or djamcompile --help prints this help +information. + +djamcompile f1.jxe f2.c +compiles f1.js and f2.c to obtain f1.jxe. Here, the source files are +copied into the docker container and the compiler is run in the container. +The resulting file f1.jxe is copied back to the host. + +EOF +} + +make_container() { + local type=$1 + local contname=$2 + + local dockerImage=`cat $jamfolder/dockerImage` + + create_missingdir $jamfolder/type + create_missingdir $jamfolder/type/contname + + # Just kill the older container and recreate a new one. + docker kill $contname + docker rm $contname + + local dockerSer=`docker run -it -d --privileged --name $contname $dockerImage` + local dockerSer=${dockerSer:0:12} + echo $dockerSer > $jamfolder/type/contname/dockerId + echo "1" > $jamfolder/type/contname/refCount +} + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder "JAMScript not setup in the system." +exit_missingfile $jamfolder/dockerImage "Run djam pull repository" + +dbuildc="dbuildctnr-"$UID +make_container test $dbuildc + +efile= +for f in $@; do + if [ $f != "-d" ]; then + docker cp $f $dbuildc:/home/admin/temp/$f + efile+=" /home/admin/temp/$f" + else + efile+=" -d" + fi +done + +docker exec -it $dbuildc jamc $efile +filename=$1 +jxefile="${filename%.*}.jxe" +docker cp $dbuildc:/home/admin/temp/$jxefile $jxefile diff --git a/tools/djamexec b/tools/djamexec new file mode 100755 index 000000000..327652135 --- /dev/null +++ b/tools/djamexec @@ -0,0 +1,220 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +This command executes the given command in the docker containers that are +already executing the target program under the given application ID. + +If the program and application ID are not specified, we use the containers +executing the last launched (active) program. + +Usage: djamexec [--program=program --app=appl_name --type=node_type] command + +NOTE: djamexec differs from the rest because the command is at the end. + +The "command" could be JAMScript executable (file.jxe) or some +arbitrary Linux command (e.g., ls) with arguments. + +If no running instance is found, an error message will be printed. + +EOF +} + +if [ -z $1 ]; then + show_usage + exit 0 +fi + + +checkdocker() { + + if [ -e $1/dockerId ]; then + local didp=`cat $1/dockerId` + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + running="docker" + else + running="none" + fi + fi +} + + +app= +program= +type=device +xapp= + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + -x|--xapp) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + xapp=$2 + shift + else + die 'ERROR: "--xapp" requires a non-empty option argument.' + fi + ;; + --xapp=?*) + xapp=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --xapp=) # Handle the case of an empty + die 'ERROR: "--xapp" requires a non-empty option argument.' + ;; + -p|--program) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + program=$2 + shift + else + die 'ERROR: "--program" requires a non-empty option argument.' + fi + ;; + --program=?*) + program=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --program=) # Handle the case of an empty + die 'ERROR: "--program" requires a non-empty option argument.' + ;; + -t|--type) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + type=$2 + shift + else + die 'ERROR: "--type" requires a non-empty option argument.' + fi + ;; + --type=?*) + type=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --type=) # Handle the case of an empty + die 'ERROR: "--type" requires a non-empty option argument.' + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +file=$1 +shift +rest=$* + +# Check folder +appsfolder=$HOME"/.jamruns/apps" +exit_missingdir $appsfolder "ERROR! No running instance found. " + +if [ -z $program ]; then + if [ -e $appsfolder/program ]; then + program=`cat $appsfolder/program` + else + die "Cannot execute with empty program name" + fi +fi + +if [ -z $app ]; then + if [ -e $appsfolder/app ]; then + app=`cat $appsfolder/app` + else + die "Cannot execute with empty application ID" + fi +fi + + +tname="${program%.*}" +tname=$tname"_"$app +fext="${file##*.}" + +xyapp=$xapp +if [ ! -z $xapp ]; then + xapp="--app=$xapp" +fi + + +if [ "$(ls -A $appsfolder)" ]; then + + olddir=`pwd` + cd $appsfolder + + if [ ! -d $tname ]; then + die "No folder $tname found." + fi + + for jruns in `ls $appsfolder/$tname`; do + dir=$appsfolder/$tname/$jruns + echo "Directory: " $dir + if [ -d $dir ]; then + checkdocker $dir + if [ $running == "docker" ]; then + mtype=`cat $dir/machType` + if [ -z $type ] || [ $type == $mtype ]; then + data=`cat $dir/dataStore` + runon=`cat $dir/dockerId` + present=`docker exec -it $runon jamlist | wc -l | tr -d '[:space:]'` + if [ $present != "0" ]; then + # go back to the old directory and run these command otherwise $file won't be found + cd $olddir + case $mtype in + cloud) + if [ $fext == "jxe" ]; then + djamrun $file "$xapp" --cloud --data=$data --runon=$runon --bg + else + docker exec -it $runon $file $rest + fi + ;; + fog) + if [ $fext == "jxe" ]; then + djamrun $file "$xapp" --fog --data=$data --runon=$runon --bg + else + docker exec -it $runon $file $rest + fi + ;; + device) + if [ $fext == "jxe" ]; then + djamrun $file "$xapp" --data=$data --runon=$runon --num=`cat $dir/cdevs` --bg + else + docker exec -it $runon $file $rest + fi + ;; + esac + fi + fi + fi + fi + done +fi diff --git a/tools/djaminit b/tools/djaminit new file mode 100755 index 000000000..a25733889 --- /dev/null +++ b/tools/djaminit @@ -0,0 +1,178 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/pumba_tools.sh" +source "$IDIR/inc/misc_tools.sh" + + + +show_usage() { + cat << EOF + +djaminit --ideal +The inter-container delays are not manipulated. They are set at the natural values +to get a packet transmitted from container A to container B. No other option +should be specified with this one. + +djaminit --zones=num_of_zones --indelay=delay:jitter --outdelay=delay:jitter +Inside a zone we have small delays and between zones we have large delays. +The '--indelay' option tells the delay and jitter within a zone and '--outdelay' +tells the delay and jitter between zones. + +djaminit --cldelay=delay:jitter +Is the delay and jitter to the cloud from the zones. + +The pumba is started if the option is not '--ideal'. + +All delay and jitter values are in milliseconds. IMPORTANT: Just numbers should +be specified - no units. + +EOF +} + +# Show the usage +if [ -z $1 ]; then + show_usage + exit +fi + + +# Check the .jamruns folder +jamfolder=$HOME"/.jamruns" +create_missingdir $jamfolder + + +ideal= +zones=1 +cldelay=0:0 +indelay=0:0 +outdelay=0:0 + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -c|--cldelay) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + cldelay=$2 + shift + else + die 'ERROR: "--cldelay" requires a non-empty option argument.' + fi + ;; + --cldelay=?*) + cldelay=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --cldelay=) # Handle the case of an empty + die 'ERROR: "--cldelay" requires a non-empty option argument.' + ;; + -i|--indelay) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + indelay=$2 + shift + else + die 'ERROR: "--indelay" requires a non-empty option argument.' + fi + ;; + --indelay=?*) + indelay=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --indelay=) # Handle the case of an empty + die 'ERROR: "--indelay" requires a non-empty option argument.' + ;; + -o|--outdelay) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + outdelay=$2 + shift + else + die 'ERROR: "--outdelay" requires a non-empty option argument.' + fi + ;; + --outdelay=?*) + outdelay=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --outdelay=) # Handle the case of an empty + die 'ERROR: "--outdelay" requires a non-empty option argument.' + ;; + -z|--zones) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + zones=$2 + shift + else + die 'ERROR: "--zones" requires a non-empty option argument.' + fi + ;; + --zones=?*) + zones=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --zones=) # Handle the case of an empty + die 'ERROR: "--zones" requires a non-empty option argument.' + ;; + -d|--ideal) + ideal=1 + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +create_missingdir $jamfolder/pumba + +if [ ! -z $ideal ]; then + echo "off" > $jamfolder/pumba/status + create_missingdir $jamfolder/zones + echo "1" > $jamfolder/zones/count + killrouterpumba + killcloudpumba + killfogpumba + exit +fi + +check_prog pumba "Pumba not installed. Download it from https://github.com/gaia-adm/pumba/releases" + +pversion=`pumba -v | cut -d ' ' -f 3 | cut -d '.' -f 1,2` +if (( $(echo "$pversion < 0.5" | bc -l) )); then + echo "Pumba version 0.5 or new is needed. Exiting." + exit +fi + + +# We are using pumba - validate parameters + +clddelay="${cldelay%:*}" +cldjitter="${cldelay##*:}" + +inpdelay="${indelay%:*}" +inpjitter="${indelay##*:}" + +outpdelay="${outdelay%:*}" +outpjitter="${outdelay##*:}" + +save "on" $jamfolder/pumba/status + +# Set delay between cloud and fogs +# we are setting for 1 hour recurrent delay. There is one minute every 1hr where the delay is not in effect +save "pumba -l fatal --interval 1h netem --duration 59m delay -t $clddelay -j $cldjitter " $jamfolder/pumba/cloud_cmd + +# Set delay inside fog zones +save "pumba -l fatal --interval 1h netem --duration 59m delay -t $inpdelay -j $inpjitter " $jamfolder/pumba/infog_cmd + +# Set delay between fog zones +save "pumba -l fatal --interval 1h netem --duration 59m delay -t $outpdelay -j $outpjitter " $jamfolder/pumba/outfog_cmd + +# Write the number of num_of_zones +create_missingdir $jamfolder/zones + +save $zones $jamfolder/zones/count diff --git a/tools/djamload b/tools/djamload new file mode 100755 index 000000000..96d00eb31 --- /dev/null +++ b/tools/djamload @@ -0,0 +1,127 @@ +#!/bin/bash + +# djam load file --target=prog --app=app_name + +# We load the given file into the containers that are used by the target program +# and application. + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF + +djamload file.jxe --target=program --app=appl_name + +This command will load the file.jxe in the docker containers that are already +running the target program under the given application name (appl_name). + +If no running instance is found, an error message will be printed. + +EOF +} + +if [ -z $1 ]; then + show_usage + exit 0 +fi + + +checkdocker() { + + if [ -e $1/dockerId ]; then + local didp=`cat $1/dockerId` + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + running="docker" + else + running="none" + fi + fi +} + + +app= +target= +file=$1 +shift + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + + -t|--target) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + target=$2 + shift + else + die 'ERROR: "--target" requires a non-empty option argument.' + fi + ;; + --target=?*) + target=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --target=) # Handle the case of an empty + die 'ERROR: "--target" requires a non-empty option argument.' + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +# Check folder +jamfolder=$HOME"/.jamruns" +if [ ! -d $jamfolder ]; then + die "ERROR! No running instance found. " +fi + +if [ -z $target ]; then + die "Target not specified.. cannot locate the running application." +fi + +tname="${target%.*}" +tname=$tname"_"$app + +if [ "$(ls -A $jamfolder)" ]; then + + cd $jamfolder + + for jruns in `ls $jamfolder/$tname`; do + dir=$jamfolder/$tname/$jruns + if [ -d $dir ]; then + checkdocker $dir + if [ $running == "docker" ]; then + runon=`cat $dir/dockerId` + docker cp $file $dbuildc:$file + fi + fi + done +fi diff --git a/tools/djamlog b/tools/djamlog new file mode 100755 index 000000000..ea9cec85b --- /dev/null +++ b/tools/djamlog @@ -0,0 +1,149 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Extracts the logs written by the C nodes and displays them in the terminal. + +Usage: djamlog [--program=pgm --app=app_name] + +djamlog +Extracts the logs from the last program that was run or is running. + +djamlog --program=stringlog --app=q5 +Extracts the logs from the execution of stringlog under the application ID q5 +if logs from such a run exists. + +This is the docker version of jamlog. + +EOF +} + + +checkdocker() { + + if [ -e $1/dockerId ]; then + local didp=`cat $1/dockerId` + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + running="docker" + else + running="none" + fi + fi +} + + +### +# Main script execution begins here... +# + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" + +appsfolder=$jamfolder/apps +exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" + +cd $appsfolder + +j= + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + + -p|--program) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + program=$2 + shift + else + die 'ERROR: "--program" requires a non-empty option argument.' + fi + ;; + --program=?*) + program=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --program=) # Handle the case of an empty + die 'ERROR: "--program" requires a non-empty option argument.' + ;; + -j|--j) + j=1 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + shift +done + + +if [ -z $app ] && [ -z $program ]; then + # no args specified.. get it from previous runs + lprogram=`cat $appsfolder/program` + lapp=`cat $appsfolder/app` +else + lprogram=$program + lapp=$app +fi + +if [ -e $appsfolder/$lprogram"_"$lapp ]; then + cd $appsfolder + + for jruns in `ls $appsfolder/$lprogram"_"$lapp`; do + dir=$appsfolder/$lprogram"_"$lapp/$jruns + if [ -d $dir ]; then + checkdocker $dir + echo "Running " $running + + if [ $running == "docker" ]; then + runon=`cat $dir/dockerId` + if [ -z $app ] && [ -z $program ]; then + if [ -z $j ]; then + docker exec -it $runon jamlog + else + docker exec -it $runon jamlog --j + fi + else + if [ -z $j ]; then + docker exec -it $runon jamlog --program=$program --app=$app + else + docker exec -it $runon jamlog --program=$program --app=$app --j + fi + fi + fi + fi + + done +fi + + +# for jruns in */; do +# if [ -d $jruns ] && [ -e $jruns/dockerId ]; then +# dockerId=`cat $jruns/dockerId` +# docker exec -it $dockerId jamlog --program=$program --app=$app +# fi +# done diff --git a/tools/djampull b/tools/djampull new file mode 100755 index 000000000..76a62bcd1 --- /dev/null +++ b/tools/djampull @@ -0,0 +1,42 @@ +#!/bin/bash + + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF + +djampull [repository] +Pulls the latest image from the repository. If no repository is provided, +it pulls the last one. + +EOF +} + +jamfolder=$HOME"/.jamruns" +if [ ! -d $jamfolder ]; then + mkdir $jamfolder +fi + +if [ -z $1 ]; then + if [ -e $jamfolder/dockerImage ]; then + docker pull `cat $jamfolder/dockerImage` + else + echo "ERROR! Need to provide for the first use" + fi + exit +fi + +if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit +fi + +# Now we pull a given image +echo $1 > $jamfolder/dockerImage +docker pull $1 diff --git a/tools/djamrun b/tools/djamrun new file mode 100755 index 000000000..8f53f837f --- /dev/null +++ b/tools/djamrun @@ -0,0 +1,574 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +#source "$IDIR/inc/pumba_tools.sh" +source "$IDIR/inc/mach_tools.sh" +source "$IDIR/inc/misc_tools.sh" +source "$IDIR/inc/docker_tools.sh" + + + +show_usage() { + cat << EOF +Runs the JAMScript executable (.jxe) in a Docker container. + +djamrun program.jxe +Runs J and C node, one each, of a device with program.jxe +under the application name 'app-N'. To run under a different +app name X, use the --app=X option. + +djamrun program.jxe --fog +Runs a fog node (only J node) with program.jxe. Similarly, the --cloud +flag runs a cloud node. + +By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the +data store. The Redis server needs to be started before launching the +application. To use a different Redis server use the --data option. + +djamrun program.jxe --data=127.0.0.1:7000 +Runs program.jxe and connects it to an already running Redis server at +port 7000 of the local host. Redis server can run outside the +local host (Redis needs to the configured to accept outside +connections). + +To start more than one C node at a device use the following command. +djamrun program.jxe --num=4 + +To provide a set of tags to the program, use the following command. +djamrun program.jxe --tags="param1, param2" + +Use the --bg option to run a command in the backgroud. + +Usage: djamrun file.jxe [--app=appl_name] [--fog|--cloud] [--num=num_c_devs] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--bg] + [--runon=container_to_run] + [--log] + [--loc] + [--link=random|near|best] + [--publish=dport:hport] + + +The djamrun command creates a run state in the $HOME/__jamrun folder. +EOF +} + + + +# runatcloud $dockid $file $jappid $data $tags +runatcloud() { + local dockid=$1 + local file=$2 + local appid=$3 + local data=$4 + local tags=$5 + + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + if [ ! -z $log ]; then + argstr="$argstr --log" + fi + + buildjargs $argstr + + if [ -z $bg ]; then + echo "-" > $thisappfolder/$dockid/tmuxid + docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + else + echo $dockid > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + fi + +} + +# runatfog $dockid $file $jappid $data $tags +runatfog() { + local dockid=$1 + local file=$2 + local appid=$3 + local data=$4 + local tags=$5 + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + if [ ! -z $log ]; then + argstr="$argstr --log" + fi + + buildjargs $argstr + + if [ -z $bg ]; then + echo "-" > $thisappfolder/$dockid/tmuxid + docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + else + echo $dockid > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + fi + +} + +# runatdevice $dockid $file $jappid $data $num $tags +runatdevice() { + local dockid=$1 + local file=$2 + local appid=$3 + local data=$4 + local num=$5 + local tags=$6 + + echo $num > $thisappfolder/$dockid/cdevs + echo "$dockid-c" > $thisappfolder/$dockid/tmuxid_c + + # save for short cut use + echo "$dockid-c" > $appfolder/tmuxid + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + if [ ! -z $log ]; then + argstr="$argstr --log" + fi + + buildjargs $argstr + if [ -z $bg ]; then + echo "-" > $thisappfolder/$dockid/tmuxid + docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + else + echo $dockid"-j" > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + fi + echo ">>> Device started in container $dockid" +} + + +dojamrun() { + local type=$1 + local dockid=$2 + local file=$3 + local num=$4 + + save $type $thisappfolder/$dockid/machType + save $data $thisappfolder/$dockid/dataStore + save $dockerSer $thisappfolder/$dockid/dockerId + save "docker" $thisappfolder/$dockid/class + + case $type in + cloud) + runatcloud $dockid $file $jappid $data $tags + ;; + fog) + runatfog $dockid $file $jappid $data $tags + ;; + device) + runatdevice $dockid $file $jappid $data $num $tags + ;; + esac +} + + +# we generate a new app-XX only if the +# input is app-n, otherwise the jappid (output) is +# the input argument ($1) +getappid() { + local appid=$1 + local docki=$2 + + inc_counter $jamfolder/counter + count=$result + + if [ $appid == "app-n" ]; then + save_no_overwrite "app-"$count $thisappfolder/$docki/appid + else + save $appid $thisappfolder/$docki/appid + fi + + jappid=`cat $thisappfolder/$docki/appid` + + # save for short cut use + save "$jappid" $appfolder/appid +} + + +getdockerid() { + local rundock=$1 + + inc_counter $jamfolder/counter + local count=$result + dockerid="u-"$UID"-${type:0:3}-"$count + + if [ -z $rundock ] || [ `docker ps --filter id=$rundock | grep $rundock | wc -l | tr -d '[:space:]'` == "0" ]; then + result="new" + else + dockerSer=$rundock + result="old" + fi + +} + + +make_container() { + local type=$1 + local contname=$2 + + create_missingdir $jamfolder/$type + create_missingdir $jamfolder/$type/$contname + + if [ $type == "cloud" ]; then + startglobalmach $contname jamnet `cat $jamfolder/network` $dport $hport +# restartcloudpumba $contname + else + exit_missingfile $jamfolder/zones/count + local zcount=`cat $jamfolder/zones/count` + if [ -z $zcount ]; then + die "Zone count is undefined.. run djaminit again." + fi + local zone=$(( 1 + $RANDOM % $zcount )) + + startzonemach $zone $contname jamnet `cat $jamfolder/network` $dport $hport +# if [ $type == "fog" ]; then +# restartfogpumba $contname +# fi + fi + + save $result $jamfolder/$type/$contname/dockerId + save "1" $jamfolder/$type/$contname/refCount +} + +reuse_container() { + local type=$1 + local contname=$2 + + create_missingdir $jamfolder/$type + create_missingdir $jamfolder/$type/$contname + + inc_counter $jamfolder/$type/$contname/refCount +} + +createzonerouters() { + exit_missingfile $jamfolder/zones/count + + local zcount=`cat $jamfolder/zones/count` + + for i in `seq 1 $zcount`; do + startzonerouter $i "u-$UID-router-$i" jamnet `cat $jamfolder/network` +# restartrouterpumba "u-$UID-router-$i" + done +} + + +killdocker() { + local dock_id=$1 + + if [ -e $jamfolder/$type/$dock_id ]; then + dec_counter $jamfolder/$type/$dock_id/refCount + if [ $result == 0 ]; then + docker kill `cat $jamfolder/$type/$dock_id/dockerId` + docker rm $dock_id + fi + fi +} + + +removetmux() { + local tmid=$1 + + tmux has-session -t $tmid 2>/dev/null + local res=$? + if [ $res == "0" ]; then + tmux kill-session -t $tmid + fi +} + +removedockermach() { + + local tmid=`cat $thisappfolder/$dockerid/tmuxid` + removetmux $tmid + + if [ -e $thisappfolder/$dockerid/cdevs ]; then + local num=`cat $thisappfolder/$dockerid/cdevs` + for i in `seq 1 $num`; do + removetmux $tmid"-"$i + done + fi + + killdocker $dockerid + +} + + +processjxe() { + result="ok" +} + + +getportinfo() { + local pinfo=$1 + + dport="${pinfo%:*}" + hport="${pinfo##*:}" +} + + + +# Initialize all the option variables. +app=app-n +type=device +data=docker:6379 +tags= +num=1 +bg= +log= +runon= +link= +loc= +dport= +hport= +mount= + +file=$1 +shift +fext="${file##*.}" + +if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then + show_usage + exit 1 +fi + +if [ "$fext" != "jxe" ]; then + die "Extension on $file is not .jxe" +fi + + +while :; do + case $1 in + --help) + show_usage # Display a usage synopsis. + exit + ;; + --app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + --runon) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + runon=$2 + shift + else + die 'ERROR: "--runon" requires a non-empty option argument.' + fi + ;; + --runon=?*) + runon=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --runon=) # Handle the case of an empty + die 'ERROR: "--runon" requires a non-empty option argument.' + ;; + --tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + --num) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + num=$2 + shift + else + die 'ERROR: "--num" requires a non-empty option argument.' + fi + ;; + --num=?*) + num=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --num=) # Handle the case of an empty + die 'ERROR: "--num" requires a non-empty option argument.' + ;; + --data) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + data=$2 + shift + else + die 'ERROR: "--data" requires a non-empty option argument.' + fi + ;; + --data=?*) + data=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --data=) # Handle the case of an empty + die 'ERROR: "--data" requires a non-empty option argument.' + ;; + --loc) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + loc=$2 + shift + else + die 'ERROR: "--loc" requires longitude and lattitude specification' + fi + ;; + --loc=?*) + loc=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --loc=) # Handle the case of an empty + die 'ERROR: "--loc" requires longitude and lattitude specification' + ;; + --link) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + link=$2 + shift + else + die 'ERROR: "--link" requires a non-empty option argument.' + fi + ;; + --link=?*) + link=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --link=) # Handle the case of an empty + die 'ERROR: "--link" requires a non-empty option argument.' + ;; + --publish) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + getportinfo $2 + shift + else + die 'ERROR: "--publish" requires docker and port information' + fi + ;; + --publish=?*) + publish=${1#*=} # Delete everything up to "=" and assign the remainder. + getlonglat $publish + ;; + --publish=) # Handle the case of an empty + die 'ERROR: "--publish" requires docker and port information' + ;; + --fog) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="fog" + num= + fi + ;; + --cloud) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="cloud" + num= + fi + ;; + --bg) + bg=1 + ;; + --log) + log=1 + ;; + --mount) + mount=1 + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +# Check necessary parameters and set defaults + +if [ "$type" != "device" ] && [ -n "$num" ]; then + die "number of devices can't be speciied for fog/cloud" +fi + +if [ ! -z $mount ]; then + if [ -z ${JAMDATA} ]; then + echo "JAMDATA is not set. Set JAMDATA to the directory containing the datasets" + exit 1 + fi +fi + +# If docker is not installed, we fail here +check_prog docker "Docker not installed. Exiting." +#check_prog pumba "Pumba not installed. Download it from https://github.com/gaia-adm/pumba/releases" +check_prog tmux "tmux not installed. Exiting." + +# Check whether the global .jamruns folder is there +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder "__jamdir directory not found. Run djam pull first. " +exit_missingdir $jamfolder/zones "zones not setup. Run djam init first" +exit_missingfile $jamfolder/dockerImage "DockerImage not setup. Run djam pull first." + +#pumbastatus=`cat $jamfolder/pumba/status` + +appfolder=$jamfolder/apps +create_missingdir $appfolder + +if [ -e "$file" ]; then + + # Get the folder + filenoext="${file%.*}" + thisappfolder=$appfolder"/"$filenoext"_"$app + create_missingdir $thisappfolder + + # save for short cut use + save "$filenoext" $appfolder/program + save "$app" $appfolder/app + + # process the .jxe file + file=`pwd`/$file + processjxe $file + if [ $result != "ok" ]; then + die "Problem with JAMScript executable" + fi + + + dockerImage=`cat $jamfolder/dockerImage` + createzonerouters + createnetwork jamnet 10 $jamfolder + # cd into the $thisappfolder + cd $thisappfolder + + getdockerid $runon + docktype=$result + + create_missingdir $thisappfolder/$dockerid + getappid $app $dockerid + + if [ $docktype == "new" ]; then + # We are also putting resources such as redis on the container + make_container $type $dockerid + else + # Automatically inherit the redis.. no checking?? + reuse_container $type $dockerid + fi + + docker cp $file $dockerSer:/home/admin/temp/`basename $file` + dojamrun $type $dockerid `basename $file` $num + if [ -z $bg ] && [ $docktype == "new" ]; then + removedockermach + fi +else + die "File: $file not found" +fi diff --git a/tools/djamterm b/tools/djamterm new file mode 100755 index 000000000..d055fba66 --- /dev/null +++ b/tools/djamterm @@ -0,0 +1,141 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +# Edit the following locations to provide the +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Shows the background terminals of with the given tmux-id and terminal-num +running in the docker machines. + +Usage: djamterm [tmux-id] [-t terminal-num] + +This is the docker version of the jamterm command. + +djamterm +Shows the first C terminal of the program that was last started. + +djamterm -t 2 +Shows the second C terminal of the program that was last started. + +djamterm u-600-dev-2331-c -t 2 +Shows the second C terminal of the program running under u-600-dev-2331. + +djamterm u-600-dev-2331-c +Shows the first C terminal of the program running under u-600-dev-2331. + +djamterm u-600-dev-2331-j +Shows the J terminal of the program running under u-600-dev-2331. + +EOF +} + + +localtmux() { + local tmuxapp=$1 + local termno=$2 + + $TMUX has-session -t $tmuxapp 2>/dev/null + res=$? + if [ $res == "0" ]; then + if [ -z $termno ]; then + $TMUX attach -t $tmuxapp + else + $TMUX attach -t $tmuxapp-$termno + fi + fi +} + + +dockertmux() { + local tmuxapp=$1 + local termno=$2 + + appsfolder=$HOME"/.jamruns/apps" + cd $appsfolder + + for jruns in */; do + if [ $jruns != "*/" ]; then + for jexs in `ls $appsfolder/$jruns`; do + dir=$appsfolder/$jruns$jexs + if [ -d $dir ] && [ -e $dir/class ]; then + local dcl=`cat $dir/class | tr -d '[:space:]'` + + if [ $dcl == "docker" ]; then + if [ -e $dir/tmuxid_c ]; then + local dtm=`cat $dir/tmuxid_c | tr -d '[:space:]'` + if [ $dtm == $tmuxapp ]; then + docker exec -ti `cat $dir/dockerId` script -q -c "/usr/bin/tmux attach -t $tmuxapp-$termno" /dev/null + break + fi + fi + fi + fi + done + fi + done +} + + +### +# Main script execution begins here... +# + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" + +appsfolder=$jamfolder/apps +exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" + +cd $appsfolder + + +if [ -z $1 ]; then + if [ -e tmuxid ]; then + tmuxid=`cat tmuxid` + dockertmux $tmuxid 1 + exit # this improves the readability of the script later - not needed! + fi +else + # Show help + if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit # readability improver! + elif [ $1 == "-t" ]; then + if [ -e tmuxid ]; then + tmuxid=`cat tmuxid` + dockertmux $tmuxid $2 + fi + exit # readability improver! + else + if [ -z $2 ]; then + txid=$1 + if [ ${txid: -1} == "c" ]; then + # Connect to the docker to display the C panes + dockertmux $txid 1 + else + localtmux $txid + fi + exit # readability improver! + else + if [ -n $3 ] && [ $2 == "-t" ]; then + termid=$3 + dockertmux $1 $termid + fi + fi + fi +fi diff --git a/tools/djamtest b/tools/djamtest new file mode 100755 index 000000000..816a73310 --- /dev/null +++ b/tools/djamtest @@ -0,0 +1,121 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/pumba_tools.sh" +source "$IDIR/inc/mach_tools.sh" +source "$IDIR/inc/misc_tools.sh" + + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF + +djam test +Creates a test configuration of containers. Does not run JAMScript. One cloud node +(u-UID-test-cloud), two fog nodes (u-UID-test-fog-1) and (u-UID-test-fog-2). The fog +nodes are in different zones. It also creates two device nodes (u-UID-test-dev-1) and +(u-UID-test-dev-2). + +You can login into the different nodes and ping each other to test the inter-container +latency. + +All machines are detached. You need to attach to them again using: + +docker attach node-name + +To stop the test, run + +djam test stop + +EOF +} + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder "JAMScript emulation is not yet initialized. Run djaminit first." + + +if [ ! -z $1 ]; then + if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit + fi +fi + +if [ -z $1 ]; then + + exit_missingfile $jamfolder/dockerImage "Run djam pull to setup the docker image" + + exit_missingfile $jamfolder/pumba/cloud_cmd "Run 'djam init' before running the 'djam test'. " + exit_missingfile $jamfolder/pumba/infog_cmd "Run 'djam init' before running the 'djam test'. " + exit_missingfile $jamfolder/pumba/outfog_cmd "Run 'djam init' before running the 'djam test'. " + + # Image + dockerImage=`cat $jamfolder/dockerImage` + + createnetwork jamtest 54 + + # These containers are not created in the proper way + # This is for testing purposes.. so this is OK. + + # Start a cloud machine + startglobalmach "u-$UID-cloud-test" jamtest 54 + + startzonerouter 1 "u-$UID-router-test-1" jamtest 54 + startzonerouter 2 "u-$UID-router-test-2" jamtest 54 + + # Start two fog machines + + startzonemach 1 "u-$UID-fog-test-1" jamtest 54 + startzonemach 1 "u-$UID-dev-test-1" jamtest 54 + + + startzonemach 2 "u-$UID-fog-test-2" jamtest 54 + startzonemach 2 "u-$UID-dev-test-2" jamtest 54 + + restartcloudpumba "u-$UID-cloud-test" + restartrouterpumba "u-$UID-router-test-1" + restartrouterpumba "u-$UID-router-test-2" + restartfogpumba "u-$UID-fog-test-1" + restartfogpumba "u-$UID-fog-test-2" + + # Print a message + echo "Done. Configured the test topology." + +elif [ $1 == "stop" ]; then + + killfogpumba "test" + killrouterpumba "test" + killcloudpumba "test" + + resarr=$(docker ps -a -q --filter name=cloud-test) + for res in $resarr; do + docker kill $res + docker rm $res + done + + resarr=$(docker ps -a -q --filter name=fog-test) + for res in $resarr; do + docker kill $res + docker rm $res + done + + resarr=$(docker ps -a -q --filter name=dev-test) + for res in $resarr; do + docker kill $res + docker rm $res + done + + resarr=$(docker ps -a -q --filter name=router-test) + for res in $resarr; do + docker kill $res + docker rm $res + done + +fi diff --git a/tools/inc/docker_tools.sh b/tools/inc/docker_tools.sh new file mode 100644 index 000000000..25d35dd0a --- /dev/null +++ b/tools/inc/docker_tools.sh @@ -0,0 +1 @@ +# Docker tools go here.. diff --git a/tools/inc/mach_tools.sh b/tools/inc/mach_tools.sh new file mode 100644 index 000000000..7841817a9 --- /dev/null +++ b/tools/inc/mach_tools.sh @@ -0,0 +1,162 @@ + +# Call..like the following +# createnetwork jamtest 54 +# +createnetwork() { + local netname=$1 + local subnet=$2 + local folder=$3 + + while : ; do + local present=`docker network ls | grep $netname | wc -l | tr -d '[:space:]'` + if [ $present == "0" ]; then + docker network create --driver=bridge --subnet=10.$subnet.0.0/16 --ip-range=10.$subnet.0.0/16 $netname + if [ $? != 0 ]; then + # Could not create the network.. check with another subnet + subnet=$(( $subnet + 1 )) + else + present=1 + if [ ! -z $folder ]; then + echo $subnet > $folder/network + fi + fi + else + subnet=`docker network inspect $netname | grep IPRange | awk '{split($0,a, "\""); print a[4]}' | awk '{split($0,a, "."); print a[2]}'` + echo $subnet > $folder/network + fi + + if [ $present == 1 ]; then + break + fi + done +} + + + +# for example, call like +# startzonerouter zonenum jamtest 54 +# TODO: See whether this can actually fail due to address reuse problem.. +# If so, we need to use another address... and save it in the jamrun state. +# +startzonerouter() { + local zonenum=$1 + local machname=$2 + local netname=$3 + local subnet=$4 + + local present=`docker ps -a --filter name=$machname | grep $machname | wc -l` + + if [ $present == "0" ]; then + # Create the machine + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.254 $dockerImage` + dockerSer=${dockerSer:0:12} + result=$dockerSer + fi + +} + + +# for example, call like +# startzonemach zonenum + +startzonemach() { + local zonenum=$1 + local machname=$2 + local netname=$3 + local subnet=$4 + + local dport=$5 + local hport=$6 + + local present + + create_missingdir $jamfolder/zones/$zonenum + while : ; do + inc_counter $jamfolder/zones/$zonenum/count + local count=$result + newcount=$(( $count % 254 )) + if [ $newcount != $count ]; then + count=$(( $newcount + 1 )) + fi + + echo "Machine: " $machname " starting with IP: " 10.$subnet.$zonenum.$count + + # Create the machine + if [ -z $dport ] && [ -z $hport ]; then + if [ -z $mount ]; then + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules $dockerImage` + else + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` + fi + else + if [ -z $mount ]; then + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules $dockerImage` + else + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.$zonenum.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` + fi + fi + if [ $? != 0 ]; then + present=0 + docker rm $machname + else + present=1 + fi + dockerSer=${dockerSer:0:12} + result=$dockerSer + if [ $present == 1 ]; then break; fi + done + + # Setup the routes + docker exec -d $machname ip route del 10.$subnet/16 + docker exec -d $machname ip route add 10.$subnet.0/24 dev eth0 + docker exec -d $machname ip route add 10.$subnet.$zonenum/24 dev eth0 + docker exec -d $machname ip route add 10.$subnet/16 via 10.$subnet.$zonenum.254 + +} + +startglobalmach() { + local machname=$1 + local netname=$2 + local subnet=$3 + local dport=$4 + local hport=$5 + + local present + + create_missingdir $jamfolder/global + set_counter 10 $jamfolder/global/count + while : ; do + # Above command runs if the counter is not already set + inc_counter $jamfolder/global/count + local count=$result + newcount=$(( $count % 254 )) + if [ $newcount != $count ]; then + count=$(( $newcount + 1 )) + fi + + # Create the machine + if [ -z $dport ] && [ -z $hport ]; then + if [ -z $mount ]; then + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules $dockerImage` + else + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` + fi + else + if [ -z $mount ]; then + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules $dockerImage` + else + dockerSer=`docker run -it -d --name $machname --network=$netname --ip=10.$subnet.0.$count --cap-add=NET_ADMIN --privileged --publish=0.0.0.0:$hport:$dport -v $HOME/node_modules:/node_modules -v $JAMDATA:/data $dockerImage` + fi + fi + if [ $? != 0 ]; then + present=0 + docker rm $machname + else + present=1 + fi + dockerSer=${dockerSer:0:12} + result=$dockerSer + if [ $present == 1 ]; then break; fi + done + +} diff --git a/tools/inc/misc_tools.sh b/tools/inc/misc_tools.sh new file mode 100644 index 000000000..faa06a696 --- /dev/null +++ b/tools/inc/misc_tools.sh @@ -0,0 +1,268 @@ + +# Utils used in the bash scripts + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + + +# We use the global variable 'result' to pass parameter values back +# + +# +# Call like the following +# inc_counter counter_name +# the counter_name is a file location +# +inc_counter() { + local counter=$1 + local value + + if [ -e $counter ]; then + value=`cat $counter` + ((value++)) + result=$value + else + value=1 + result=1 + fi + echo $value > $counter +} + +inc_counter_sync() { + local counter=$1 + local value + + if [ -e $counter ]; then + value=`cat $counter` + ((value++)) + result=$value + else + value=1 + result=1 + fi + echo $value > $counter + sync +} + + +# set_counter 10 $jamfolder/global/count +set_counter() { + local value=$1 + local counter=$2 + + if [ ! -e $counter ]; then + echo $value > $counter + fi +} + +set_counter_sync() { + local value=$1 + local counter=$2 + + if [ ! -e $counter ]; then + echo $value > $counter + fi + sync +} + + + +# dec_counter counter_name +# +dec_counter() { + local counter=$1 + + if [ ! -e $counter ]; then + die "Trying to decrement a non-existent counter $counter" + fi + + local value=`cat $counter` + if [ ! -z $value ]; then + ((value--)) + echo $value > $counter + fi + result=$value +} + +dec_counter_sync() { + local counter=$1 + + if [ ! -e $counter ]; then + die "Trying to decrement a non-existent counter $counter" + fi + + local value=`cat $counter` + if [ ! -z $value ]; then + ((value--)) + echo $value > $counter + fi + result=$value + sync +} + +# save_no_overwrite value location +# +save_no_overwrite() { + local value=$1 + local location=$2 + + if [ ! -e $location ]; then + echo $value > $location + else + local x=`cat $location` + if [ -z $x ]; then + echo $value > $location + fi + fi +} + + +save_no_overwrite_sync() { + local value=$1 + local location=$2 + + if [ ! -e $location ]; then + echo $value > $location + else + local x=`cat $location` + if [ -z $x ]; then + echo $value > $location + fi + fi + sync +} + + +# save value location +# with overwrite +save() { + local value=$1 + local location=$2 + + echo $value > $location +} + + +save_sync() { + local value=$1 + local location=$2 + + echo $value > $location + sync +} + + +create_missingdir() { + local dirn=$1 + + if [ ! -e $dirn ]; then + mkdir $dirn + fi +} + +exit_missingdir() { + local dirn=$1 + local emsg=$2 + if [ ! -d $dirn ]; then + echo $emsg + exit 0 + fi +} + +wait_missingdir() { + local rootdir=$1 + local watchdir=$2 + + if [ ! -d $watchdir ]; then + while :; do + inotifywait -e create -t 1 $rootdir + if [ -d $watchdir ]; then break; fi + done + fi +} + + +exit_missingfile() { + local file=$1 + local emsg=$2 + + if [ ! -e $file ]; then + echo $emsg + exit 0 + fi +} + +create_conffile() { + local file=$1 + local contents=$2 + + echo "#" | cat > $1 + echo "allow_anonymous true" | cat >> $1 + echo "#" | cat >> $1 + echo "listener ${2}" | cat >> $1 +} + +check_prog() { + local prog=$1 + local msg=$2 + + local present=`which $prog` + if [ -z $present ]; then + echo $msg + exit 0 + fi +} + +# Check the Program +# If the program is not there.. check the alt. +# Print error and exit if the alt is missing as well +# +check_set_check_prog() { + prog=$1 + local msg=$2 + altprog=$3 + + local present=`which $prog` + if [ -z $present ]; then + prog=$altprog + local present=`which $prog` + if [ -z $present ]; then + echo $msg + exit 0 + fi + fi +} + +buildjargs() { + local str= + for x in $@; do + str+=" " + local xtail="${x##*=}" + local xhead="${x%=*}" + + if [ ! -z $xtail ]; then + str+=$x + fi + done + + str+=" --$type" + + results=$str +} + +buildcargs() { + local str= + for x in $@; do + str+=" " + local xtail="${x##*=}" + local xhead="${x%=*}" + + if [ ! -z $xtail ]; then + str+="$xhead $xtail" + fi + done + + results=$str +} diff --git a/tools/inc/pumba_tools.sh b/tools/inc/pumba_tools.sh new file mode 100644 index 000000000..050817b71 --- /dev/null +++ b/tools/inc/pumba_tools.sh @@ -0,0 +1,84 @@ + + +killrouterpumba() { + + if [ -z $1 ]; then + local pid=`ps axw | grep pumba | grep router | awk '{split($0,a, " "); print a[1]}'` + else + local pid=`ps axw | grep pumba | grep router | grep $1 | awk '{split($0,a, " "); print a[1]}'` + fi + + for p in $pid; do + kill $p + done +} + +startrouterpumba() { + + if [ $pumbastatus == "on" ]; then + local routercmd=`cat $jamfolder/pumba/outfog_cmd` + $routercmd $@ & + fi +} + +restartrouterpumba() { + + killrouterpumba $@ + startrouterpumba $@ +} + + +killfogpumba() { + + if [ -z $1 ]; then + local pid=`ps axw | grep pumba | grep fog | awk '{split($0,a, " "); print a[1]}'` + else + local pid=`ps axw | grep pumba | grep fog | grep $1 | awk '{split($0,a, " "); print a[1]}'` + fi + + for p in $pid; do + kill $p + done +} + +startfogpumba() { + + if [ $pumbastatus == "on" ]; then + local fogcmd=`cat $jamfolder/pumba/infog_cmd` + $fogcmd $@ & + fi +} + +restartfogpumba() { + + killfogpumba $@ + startfogpumba $@ +} + + +killcloudpumba() { + + if [ -z $1 ]; then + local pid=`ps axw | grep pumba | grep cloud | awk '{split($0,a, " "); print a[1]}'` + else + local pid=`ps axw | grep pumba | grep cloud | grep $1 | awk '{split($0,a, " "); print a[1]}'` + fi + + if [ ! -z $pid ]; then + kill $pid + fi +} + +startcloudpumba() { + + if [ $pumbastatus == "on" ]; then + local cloudcmd=`cat $jamfolder/pumba/cloud_cmd` + $cloudcmd $@ & + fi +} + +restartcloudpumba() { + + killcloudpumba $@ + startcloudpumba $@ +} diff --git a/tools/jam b/tools/jam new file mode 100755 index 000000000..6255a16d8 --- /dev/null +++ b/tools/jam @@ -0,0 +1,57 @@ +#!/bin/bash + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF + +Runs a collection of jam machine commands. + +jam help - prints this help +jam clean - clean the setup left behind by old runs +jam close - close all terminaled opened by the 'term' command +jam install - install the JAMScript from source. +jam kill - kill a node +jam list - lists all the JAMScript programs running in the system +jam run - start a device, fog, or cloud +jam term - show the tmux terminals of the running nodes + + +Type 'jam cmd --help' for more help on the specific command. + +EOF +} + +if [ -z $1 ] || [ $1 == "help" ]; then + show_usage + exit 0 +fi + +jcmd=$1 +shift 1 +params=$@ + + +case $jcmd in + list) + jamlist $params + ;; + term) + jamterm $params + ;; + kill) + jamkill $params + ;; + clean) + jamclean $params + ;; + run) + jamrun $params + ;; + install) + jaminstall $params + ;; +esac diff --git a/tools/jamclean b/tools/jamclean new file mode 100755 index 000000000..89688e047 --- /dev/null +++ b/tools/jamclean @@ -0,0 +1,77 @@ +#!/bin/bash + +# Edit the following locations to provide the correct location if needed +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Usage: jamclean + +Purges inactive JAMScript programs from the listing. + +EOF +} + + +checkrunning() { + local folder=$1 + local runf=$2 + local runflag="false" + for q in `ls $folder/$runf`; do + local dir=$folder/$runf$q + if [ -d $dir ]; then + if [ -e $1$q/processId ]; then + local pid=`cat $1$q/processId` + local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + runflag="true" + fi + elif [ -e $1$q/dockerId ]; then + local didp=`cat $1$q/dockerId` + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + runflag="true" + fi + fi + fi + done + running=$runflag +} + +if [ ! -z $1 ]; then + if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit + fi +fi + +jamfolder=$HOME"/.jamruns" +if [ ! -d $jamfolder ]; then + exit 0 +fi + +if [ "$(ls -A $jamfolder)" ]; then + + cd $jamfolder + + for jruns in */; do + if [ $jruns != "*/" ]; then + if [[ $jruns =~ .*$app.* ]]; then + checkrunning $jamfolder/$jruns + if [ $running == "false" ]; then + rm -rf $jamfolder/$jruns + fi + fi + fi + done +fi diff --git a/tools/jamclose b/tools/jamclose new file mode 100755 index 000000000..40a0ed24d --- /dev/null +++ b/tools/jamclose @@ -0,0 +1,84 @@ +#!/bin/bash + +# Edit the following locations to provide the +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + + +closeterm() { + local tmuxapp=$1 + + $TMUX has-session -t $tmuxapp 2>/dev/null + local res=$? + + if [ $res == "0" ]; then + $TMUX detach-client -s $tmuxapp + fi +} + +closeall() { + + if [ "$(ls -A $jamfolder)" ]; then + + cd $jamfolder + + for jruns in */; do + if [ $jruns != "*/" ]; then + for jport in `ls $jamfolder/$jruns`; do + dir=$jamfolder/$jruns$jport + if [ -d $dir ]; then + if [ -e $dir/tmuxid ]; then + local tmuxid=`cat $dir/tmuxid` + closeterm $tmuxid + fi + fi + done + fi + done + fi +} + + +show_usage() { + cat << EOF + +jamclose tmux-id +Closes the given terminal. + +jamclose +Closes all open terminal (tmux terminals showing running JAMScript devices). + +EOF +} + +jamfolder=$HOME"/.jamruns" + +if [ -z $1 ]; then + if [ ! -d $jamfolder ]; then + echo "No running instances of JAMScript." + exit 0 + fi + closeall + exit +fi + +if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit +fi + +if [ ! -d $jamfolder ]; then + echo "No running instances of JAMScript." + exit 0 +fi + +closeterm $1 diff --git a/tools/jamexec b/tools/jamexec new file mode 100755 index 000000000..17a72d8d6 --- /dev/null +++ b/tools/jamexec @@ -0,0 +1,425 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +SHELLPID=$$ +trap cleanup SIGTERM SIGINT +TMUX=`which tmux` + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Stripped down version of jamrun for use by the shell. Unlike jamrun, jamexec +assumes all resources except tmux terminals are available and reuses them. + +Usage: jamexec file.jxe [--app=appl_name] [--fog|--cloud] [--num=num_c_devs] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--bg] + [--iflow=flow_name] + [--oflow=flow_name] + [--log] +EOF +} + +dojamout() { + dojamout_p1 $1 $2 $3 + dojamout_p2 $1 $2 $3 +} + +dojamout_p1() { + local type=$1 + local pnum=$2 + local floc=$3 + + echo "$data" > $floc/$pnum/dataStore + echo "process" > $floc/$pnum/class + echo "$SHELLPID" > $floc/$pnum/shellpid + echo "new" > $floc/$pnum/processId +} + +dojamout_p2() { + + if [ -z $bg ]; then + dojamout_p2_fg $1 $2 $3 + else + dojamout_p2_bg $1 $2 $3 + fi +} + +cleanup() { + reset + cleanuptmux + exit 1 +} + +dojamout_p2_fg() { + local type=$1 + local pnum=$2 + local floc=$3 + + buildjargs "--app=$jappid" "--port=$pnum" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" + local args=$results + + case $type in + cloud) + node jamout.js $args + ;; + fog) + node jamout.js $args + ;; + device) + node jamout.js $args + ;; + esac + echo ">>> Started the J node at port $pnum" +} + +dojamout_p2_bg() { + local type=$1 + local pnum=$2 + local floc=$3 + + buildjargs "--app=$jappid" "--port=$pnum" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" + node jamout.js $results & + jpid=$! +} + +doaout() { + local counter=1 + local num=$1 + local port=$2 + + if [ -e a.out ]; then + chmod +x a.out + fi + + while [ $counter -le $num ]; do + if [ -e a.out ]; then + # execute the program.. we are in the folder.. + buildcargs "-a=$jappid" "-p=$port" "-n=$counter" "-t=$tags" + local cargs=$results + if [ -z $log ]; then + $TMUX new-session -s $tmuxapp-$counter -d "./a.out $cargs" + else + if [ `uname` == "Linux" ]; then + $TMUX new-session -s $tmuxapp-$counter -d script -a -c "./a.out $cargs" -f log + else + $TMUX new-session -s $tmuxapp-$counter -d "script -a -t 1 log ./a.out $cargs" + fi + fi + fi + ((counter++)) + done +} + +setuptmux() { + + if [ -z $tmuxid ]; then + tmuxapp="tg-$RANDOM" + else + tmuxapp=$tmuxid + fi + + echo "$tmuxapp" > $1/tmuxid + save "$tmuxapp" $appfolder/tmuxid + + trap cleanuptmux SIGINT +} + +getappid() { + local mainf=$1 + local localf=$2 + local appid=$3 + + if [ $appid == "app-n" ]; then + inc_counter $mainf/counter + save "app-$result" $localf/appid + else + save "$appid" $localf/appid + fi + + jappid=`cat $localf/appid` +} + +cleanuptmux() { + if [ ! -z $tmuxapp ]; then + $TMUX kill-session -t $tmuxapp + fi + exit +} + +# We are already in the correct foldler +# We should find MANIFEST if there is a previous version in the current folder +# We unzip to the current folder if needed. +unpack() { + local file=$1 + + if [ -z $old ]; then + if [ ! -e MANIFEST.txt ]; then + # there is no old file. unpack + unzip -oq $file + if [ $? -ne 0 ]; then + die "Problem reading file: $file" + fi + else + ntime=`zipgrep CREATE $file | awk '{split($0,a, " "); print a[3]}'` + otime=`grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` + if (( $ntime > $otime )); then + # newer file so unpack it + unzip -oq $file + if [ $? -ne 0 ]; then + die "Problem reading file: $file" + fi + fi + fi + fi +} + + +### +# Main script execution begins here... +# + +# Initialize all the option variables. +app=app-n +type=device +data=127.0.0.1:6379 +iport=1883 +num=1 +tags= +bg= +old= +tmuxid= +log= +iflow= +oflow= + +file=$1 +shift +fext="${file##*.}" + +if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then + show_usage + exit 1 +fi + +if [ "$fext" != "jxe" ]; then + die "Extension on $file is not .jxe" +fi + + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--args" requires a non-empty option argument.' + ;; + -p|--port) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + iport=$2 + shift + else + die 'ERROR: "--port" requires a non-empty option argument.' + fi + ;; + --port=?*) + iport=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --port=) # Handle the case of an empty + die 'ERROR: "--port" requires a non-empty option argument.' + ;; + -t|--tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + -m|--tmux) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tmuxid=$2 + shift + else + die 'ERROR: "--tmux" requires a non-empty option argument.' + fi + ;; + --tmux=?*) + tmuxid=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tmux=) # Handle the case of an empty + die 'ERROR: "--tmux" requires a non-empty option argument.' + ;; + -n|--num) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + num=$2 + shift + else + die 'ERROR: "--num" requires a non-empty option argument.' + fi + ;; + --num=?*) + num=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --num=) # Handle the case of an empty + die 'ERROR: "--num" requires a non-empty option argument.' + ;; + -u|--oflow) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + oflow=$2 + shift + else + die 'ERROR: "--oflow" requires a non-empty option argument.' + fi + ;; + --oflow=?*) + oflow=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --oflow=) # Handle the case of an empty + die 'ERROR: "--oflow" requires a non-empty option argument.' + ;; + -i|--iflow) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + iflow=$2 + shift + else + die 'ERROR: "--iflow" requires a non-empty option argument.' + fi + ;; + --iflow=?*) + iflow=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --iflow=) # Handle the case of an empty + die 'ERROR: "--iflow" requires a non-empty option argument.' + ;; + -d|--data) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + data=$2 + shift + else + die 'ERROR: "--data" requires a non-empty option argument.' + fi + ;; + --data=?*) + data=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --data=) # Handle the case of an empty + die 'ERROR: "--data" requires a non-empty option argument.' + ;; + -f|--fog) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="fog" + num= + fi + ;; + -c|--cloud) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="cloud" + num= + fi + ;; + -b|--bg) + bg=1 + ;; + -l|--log) + log=1 + ;; + -o|--old) + old=1 + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + + + +if [ -e "$file" ]; then + + jamfolder=$HOME"/.jamruns" + appfolder=$jamfolder/apps + + # Get the folder + filenoext="${file%.*}" + filenoext="${filenoext##*/}" + folder=$appfolder/$filenoext"_"$app + create_missingdir $folder + + #save handle to file + ifile="$(cd "$(dirname "$file")"; pwd)/$(basename "$file")" + cd $folder + unpack $ifile # We are already in $folder + + if [ -e jamout.js ]; then + + # execute the program.. we are in the folder.. + case $type in + cloud) + create_missingdir $folder/$iport + getappid $jamfolder $folder/$iport $app + dojamout $type $iport $folder + ;; + fog) + create_missingdir $folder/$iport + getappid $jamfolder $folder/$iport $app + dojamout $type $iport $folder + ;; + device) + create_missingdir $folder/$iport + getappid $jamfolder $folder/$iport $app + dojamout_p1 $type $iport $folder + setuptmux $folder/$iport + doaout $num $iport + dojamout_p2 $type $iport $folder + if [ -z $bg ]; then + cleanuptmux + fi + ;; + esac + else + die "File: $file is not a valid JAMScript executable" + fi + +else + die "File: $file not found" +fi diff --git a/tools/jaminstall b/tools/jaminstall new file mode 100755 index 000000000..21309a8e7 --- /dev/null +++ b/tools/jaminstall @@ -0,0 +1,133 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +# Edit the following locations to provide the +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +jamkill --all +kills all running instances + +jamkill app-id +kills all running instances that are from application app-id + +Usage: jamkill --all|app-id + +EOF +} + +killtmux() { + local tmid=$1 + + tmux has-session -t $tmid 2>/dev/null + local res=$? + if [ $res == "0" ]; then + tmux kill-session -t $tmid + fi +} + +killprocess() { + + if [ -e $1/shellpid ]; then + local pid=`cat $1/shellpid` + local present=`ps -p $pid | grep jamrun | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + kill $pid + fi + fi + + if [ -e $1/processId ]; then + local pid=`cat $1/processId` + local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + kill -9 $pid + fi + elif [ -e $1/dockerId ]; then + local didp=`cat $1/dockerId` + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + docker kill $didp + docker rm $didp + fi + fi +} + + +killjob() { + local jobid=$1 + + for jruns in */; do + if [ $jruns != "*/" ]; then + for jexs in `ls $appsfolder/$jruns`; do + dir=$appsfolder/$jruns$jexs + if [ -d $dir ]; then + local appid=`cat $dir/appid` + if [ $appid == $jobid ]; then + echo "Killing application running at " $jexs + killprocess $dir + if [ -e $dir/tmuxid ]; then + killtmux `cat $dir/tmuxid` + fi + fi + fi + done + fi + done +} + +killalljobs() { + + for jruns in */; do + if [ $jruns != "*/" ]; then + for jexs in `ls $appsfolder/$jruns`; do + dir=$appsfolder/$jruns$jexs + if [ -d $dir ]; then + echo "Killing application running at " $jexs + killprocess $dir + if [ -e $dir/tmuxid ]; then + killtmux `cat $dir/tmuxid` + fi + fi + done + fi + done + +} + + +if [ -z $1 ] || [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit +fi + + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder "No running instances of JAMScript." + +appsfolder=$jamfolder/apps + +if [ "$(ls -A $appsfolder)" ]; then + + cd $appsfolder + + if [ $1 == "--all" ]; then + killalljobs + exit + fi + + killjob $1 +fi diff --git a/tools/jamkill b/tools/jamkill new file mode 100755 index 000000000..b85b2f02e --- /dev/null +++ b/tools/jamkill @@ -0,0 +1,162 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +# Edit the following locations to provide the +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Kill running instances of the application. + +Usage: jamkill [--all|app-id|--help] + +jamkill +kill the program started last among the currently running ones + +jamkill --help +displays this help messages + +jamkill --all +kills all running instances + +jamkill app-id +kills all running instances that were started under app-id + +EOF +} + + +killtmux() { + + for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do + tmux kill-session -t $q + done +} + +# called with two args.. +# dir port +killprocess() { + + if [ -e $1/shellpid ]; then + local pid=`cat $1/shellpid` + local present=`ps -p $pid | grep jamrun | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + echo "Killing process $pid" + kill $pid + fi + fi + + if [ -e $1/processId ]; then + local pid=`cat $1/processId` + local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + echo "Killing process $pid" + kill -9 $pid + fi + + if [ `uname` == "Linux" ]; then + local spid=`ps ax | grep node | grep $2 | cut -d ' ' -f 2 | tr -d '[:space:]'` + if [ ! -z $spid ]; then + echo "Killing process $pid" + kill -9 $spid + fi + fi + + elif [ -e $1/dockerId ]; then + local didp=`cat $1/dockerId` + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + docker exec -it $didp jamkill `cat $1/appid` + echo "-" > $1/dockerId + local count=`docker exec -it $didp jamlist | wc -l | tr -d '[:space:]'` + if (( $count <= 2 )); then + echo "Killing docker $didp" + docker kill $didp + docker rm $didp + fi + fi + fi +} + + +killjob() { + local jobid=$1 + + for jruns in */; do + if [ $jruns != "*/" ]; then + for jexs in `ls $appsfolder/$jruns`; do + dir=$appsfolder/$jruns$jexs + if [ -d $dir ]; then + if [ -e $dir/appid ]; then + local appid=`cat $dir/appid` + + if [ $appid == $jobid ]; then + killprocess $dir $jexs + if [ -e $dir/tmuxid ]; then + killtmux `cat $dir/tmuxid` + fi + fi + fi + fi + done + fi + done +} + +killalljobs() { + + for jruns in */; do + if [ $jruns != "*/" ]; then + for jexs in `ls $appsfolder/$jruns`; do + dir=$appsfolder/$jruns$jexs + if [ -d $dir ]; then + killprocess $dir $jexs + if [ -e $dir/tmuxid ]; then + killtmux `cat $dir/tmuxid` + fi + fi + done + fi + done + +} + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" + +appsfolder=$jamfolder/apps +exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" + +cd $appsfolder + +if [ -z $1 ]; then + # kill the job that is under the file 'appid' + # this is the job that was started last + if [ -e appid ]; then + appid=`cat appid` + killjob $appid + fi +else + # Show help + if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit + elif [ $1 == "--all" ]; then + killalljobs + else + killjob $1 + fi +fi diff --git a/tools/jamlist b/tools/jamlist new file mode 100755 index 000000000..f8c1e13f6 --- /dev/null +++ b/tools/jamlist @@ -0,0 +1,225 @@ +#!/bin/bash + +# Edit the following locations to provide the correct location if needed +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Usage: jamlist [--app=appl_name] + +Lists details about all activated instances of JAMScript programs. Use the --app=X +option to limit the listing to programs that match the given name (i.e., X). + +EOF +} + +checkprocess() { + + if [ -e $1/processId ]; then + local pid=`cat $1/processId` + if [ $pid == "new" ]; then + running="new" + else + local present=`ps -p $pid | grep node | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + running="ps" + else + running="none" + fi + fi + elif [ -e $1/dockerId ]; then + local didp=`cat $1/dockerId` + local appid=`cat $1/appid` + if [ -z $didp ] || [ $didp == "-" ]; then + running="none" + else + local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + local present=`docker exec -it $didp jamlist | grep $appid | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + running="docker" + else + running="none" + fi + else + running="none" + fi + fi + else + running="none" + fi +} + + +# save information in global varibales +# appl= +# prog= +saveapplinfo() { + + prog=`echo $1 | awk '{split($0,a,"_"); print a[1]}'` + appl=`echo $1 | awk '{split($0,a,"_"); split(a[2],b, "/"); print b[1]}'` +} + +printnodeinfo() { + local port=$1 + if [ -e $2/machType ]; then + local mtype=`cat $2/machType` + else + local mtype="-" + fi + if [ -e $2/appid ]; then + local appid=`cat $2/appid` + else + local appid="-" + fi + if [ -e $2/dataStore ]; then + local dstore=`cat $2/dataStore` + else + local dstore="-" + fi + if [ -e $2/tmuxid ]; then + local tmuxid=`cat $2/tmuxid` + else + local tmuxid="-" + fi + if [ -e $2/parentId ]; then + local parid=`cat $2/parentId` + else + local parid='-' + fi + + if [ $mtype == "device" ]; then + local cdevs=0 + for pidf in `ls $2/cdevProcessId.*`; do + local pid=`cat $pidf` + local pidok=`ps -p $pid | grep a.out | wc -l | tr -d '[:space:]'` + if [ $pidok == 1 ]; then + ((cdevs++)) + fi + done + printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "Local:$port" "$parid" "$dstore" "$mtype" "$cdevs" "$tmuxid" + else + printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "Local:$port" "$parid" "$dstore" "$mtype" "--" "$tmuxid" + fi +} + + +printdockerinfo() { + local port=$1 + local mtype=`cat $2/machType` + local appid=`cat $2/appid` + local dstore=`cat $2/dataStore` + if [ -e $2/tmuxid ]; then + local tmuxid=`cat $2/tmuxid` + else + local tmuxid="-" + fi + if [ -e $2/tmuxid_c ]; then + local tmuxid_c=`cat $2/tmuxid_c` + else + local tmuxid_c="-" + fi + + + local dockerid=`cat $2/dockerId` + + tmux has-session -t $tmuxid 2>/dev/null + local res=$? + if [ $res == "1" ]; then + tmuxid="-" + fi + + if [ $mtype == "device" ]; then +# local cdevs=`docker exec $dockerid jamquery $appid cdevs` + cdevs=`cat $2/cdevs` + printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "$dockerid" "" "$dstore" "$mtype" "$cdevs" "$tmuxid,$tmuxid_c" + else + printf "%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "$appid" "$appl" "$prog" "$dockerid" "" "$dstore" "$mtype" "--" "$tmuxid" + fi +} + + + +printheader() { + printf "\n%6s %12s %12s %12s %12s %15s %10s %7s %10s\n" "ID" "NAME" "PROGRAM" "HOST" "PARENT" "D-STORE" "TYPE" "C-NODES" "TMUX-ID" +} + +app= + + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + + +appsfolder=$HOME"/.jamruns/apps" +if [ ! -d $appsfolder ]; then + echo "No running instances of JAMScript." + exit 0 +fi + +if [ "$(ls -A $appsfolder)" ]; then + + cd $appsfolder + + printheader + for jruns in */; do + if [ $jruns != "*/" ]; then + saveapplinfo $jruns + for jexs in `ls $appsfolder/$jruns`; do + dir=$appsfolder/$jruns$jexs + if [ -d $dir ]; then + checkprocess $dir + if [ $running == "ps" ] || [ $running == "new" ]; then + printnodeinfo $jexs $dir + elif [ $running == "docker" ]; then + printdockerinfo $jexs $dir + fi + fi + done + fi + done +else + echo "No running instances of JAMScript." + exit 0 +fi diff --git a/tools/jamlog b/tools/jamlog new file mode 100755 index 000000000..7039c69ae --- /dev/null +++ b/tools/jamlog @@ -0,0 +1,125 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Extracts the logs written by the C nodes and displays them in the terminal. + +Usage: jamlog [--program=pgm --app=app_name] [--msg] [--j] + +jamlog +Extracts the logs from the last program that was run or is running. + +jamlog --program=stringlog --app=q5 +Extracts the logs from the execution of stringlog under the application ID q5 +if logs from such a run exists. + +jamlog --msg +Puts a message line in the log file to indicate that the log was displayed +up to that point. + +jamlog --j +Extracts the logs created by the J node. + +EOF +} + + +### +# Main script execution begins here... +# + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" + +appsfolder=$jamfolder/apps +exit_missingdir $appsfolder "No logs to show!" + +cd $appsfolder + +j= + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + + -p|--program) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + program=$2 + shift + else + die 'ERROR: "--program" requires a non-empty option argument.' + fi + ;; + --program=?*) + program=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --program=) # Handle the case of an empty + die 'ERROR: "--program" requires a non-empty option argument.' + ;; + -m|--msg) + msg=1 + ;; + -j|--j) + j=1 + ;; + + *) # Default case: No more options, so break out of the loop. + break + esac + shift +done + + +if [ -z $app ] && [ -z $program ]; then + # no args specified.. get it from previous runs + program=`cat $appsfolder/program` + app=`cat $appsfolder/app` +fi + +echo $appsfolder/$program"_"$app + +if [ -e $appsfolder/$program"_"$app/log ]; then + if [ -z $j ]; then + cat $appsfolder/$program"_"$app/log + + if [ ! -z $msg ]; then + echo >> $appsfolder/$program"_"$app/log + echo "========================= >> log displayed >> " `date` >> $appsfolder/$program"_"$app/log + echo >> $appsfolder/$program"_"$app/log + fi + else + cat $appsfolder/$program"_"$app/log.j + + if [ ! -z $msg ]; then + echo >> $appsfolder/$program"_"$app/log.j + echo "========================= >> log displayed >> " `date` >> $appsfolder/$program"_"$app/log.j + echo >> $appsfolder/$program"_"$app/log.j + fi + fi +fi diff --git a/tools/jamrun b/tools/jamrun new file mode 100755 index 000000000..0f9035872 --- /dev/null +++ b/tools/jamrun @@ -0,0 +1,750 @@ +#!/bin/bash +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" +REDISFUNCS=`realpath "$IDIR/../deps/lua/jredlib.lua"` + +SHELLPID=$$ +trap cleanup SIGTERM SIGINT SIGKILL + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +# Determine the platform we are running on +unameOut="$(uname -s)" +case "${unameOut}" in + Linux*) machine=Linux;; + Darwin*) machine=Mac;; + *) machine="UNKNOWN:${unameOut}" +esac + +VALGRIND_OPTS='valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=log_valgrind -s' + +MOSQUITTO=`which mosquitto` +MOSQUITTO_PUB=`which mosquitto_pub` +TMUX=`which tmux` +NOVERBOSE=1 + +if [ -z $MOSQUITTO ]; then + die "mosquitto (MQTT broker) not installed. Quitting." +fi +if [ -z $MOSQUITTO_PUB ]; then + die "mosquitto_pub (MQTT tools) not installed. Quitting." +fi +if [ -z $TMUX ]; then + die "tmux not installed. Quitting." +fi + + +show_usage() { + cat << EOF +jamrun program.jxe +Runs J and C node, one each, of a device with program.jxe +under a default application name 'app-N'. To run under a different +app name X, use the --app=X option. + +jamrun program.jxe --fog +Runs a fog node (only J node) with program.jxe. Similarly, the --cloud +flag runs a cloud node. + +By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the +data store. The Redis server needs to be started before launching the +application. To use a different Redis server use the --data option. + +jamrun program.jxe --data=127.0.0.1:7000 +Runs program.jxe and connects it to an already running Redis server at +port 7000 of the local host. Redis server can run outside the +local host (Redis needs to the configured to accept outside +connections). + +To start more than one C node at a device use the following command. +jamrun program.jxe --num=4 + +To provide a set of tags to the program, use the following command. +jamrun program.jxe --tag="param1, param2" + +Use the --bg option to run a command in the backgroud. + +Use the --old option to run the previous version in .jamruns folder. +You can edit that version and rerun a custom version of a file. + +Use the --log option to turn on logging. This is useful for programs where +the C side is crashing at the startup. The tmux console would not run when +the program crash at startup. So the --log option allows us to see the +program error messages. + +Use the --verb option to turn on verbose messaging. + +Use --valgrind to run the cside with valgrind for leak checking. + +Use --local to disable multicast discovery of the J node. The C node assumes that the J node in the local loopback. + +Usage: jamrun file.jxe + [--app=appl_name] + [--fog|--cloud] + [--num=num_c_devs] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--bg] + [--old] + [--iflow=flow_name] + [--oflow=flow_name] + [--log] + [--verb] + [--loc=long,lat] + [--edge=num_edge_connections] + [--valgrind] + [--local] + + +The jamrun command creates a run state in the $HOME/.jamruns folder. +EOF +} + + +startmqtt() { + local port=$1 + local cfile=$2 + + # Check whether the MQTT server is running.. if not start it + $MOSQUITTO_PUB -p $port -t "test" -m "hello" 2> /dev/null + + if [ $? -ne 0 ]; then + if [ -z $NOVERBOSE ]; then + echo "MQTT is not running at $port" + echo "Attempting to start MQTT at $port" + fi + if [ $machine = Mac ]; then + open -n -a $MOSQUITTO --stdout /dev/null --args -c $cfile + #$MOSQUITTO -c $cfile &>/dev/null & MOSQUITTO_PID=$! + #MOSQUITTO_PID=$! # Currently Broken + elif [ $machine = Linux ]; then + nohup $MOSQUITTO -c $cfile &>/dev/null & MOSQUITTO_PID=$! + fi + fi +} + + +dojamout() { + dojamout_p1 $1 $2 $3 + dojamout_p2 $1 $2 $3 +} + + +dojamout_p1() { + local type=$1 + local pnum=$2 + local floc=$3 + + startmqtt $pnum "${floc}/${pnum}/mqtt.conf" + echo "$data" > $floc/$pnum/dataStore + echo "process" > $floc/$pnum/class + echo "$SHELLPID" > $floc/$pnum/shellpid + echo "new" > $floc/$pnum/processId +} + + +dojamout_p2() { + + if [ -z $bg ]; then + dojamout_p2_fg $1 $2 $3 $4 + else + dojamout_p2_bg $1 $2 $3 $4 + fi +} + +cleanup() { + if [ $killbroker == "1" ]; then + echo Killing broker with PID: $MOSQUITTO_PID + kill -9 $MOSQUITTO_PID + fi + #echo ${AOUT_PIDS[@]} + #kill -9 ${AOUT_PIDS[@]} + + #reset + cleanuptmux + exit 1 +} + + +dojamout_p2_fg() { + local type=$1 + local pnum=$2 + local floc=$3 + local group=$4 + + buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" "--localregistryhost=$localregistryhost" + local args=$results + echo $args + case $type in + cloud) + node jstart.js $args + ;; + fog) + node jstart.js $args + ;; + device) + node jstart.js $args + ;; + esac + + cleanup +} + + +dojamout_p2_bg() { + local type=$1 + local pnum=$2 + local floc=$3 + local group=$4 + + buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" + local args=$results + + if [ `uname` == "Linux" ]; then + script -a -c "node jstart.js $args" -f log.j > /dev/null & + else + script -a -t 1 log.j node jstart.js $args > /dev/null & + fi + + if [ -z $NOVERBOSE ]; then + echo ">>> Started the J node in background" + fi +} + + +doaout() { + local counter=1 + local num=$1 + local port=$2 + local group=$3 + local datap=$4 + + if [ -e a.out ]; then + chmod +x a.out + fi + + while [ $counter -le $num ]; do + if [ -e a.out ]; then + # execute the program.. we are in the folder.. + buildcargs "-a=$jappid" "-p=$port" "-n=$counter" "-g=$group" "-t=$tags" "-o=$datap" + local cargs=$results + + if [ -z $DISABLE_STDOUT_REDIRECT ]; then + if [ -z $log ]; then + $TMUX new-session -s $tmuxapp-$counter -d "$VALGRIND ./a.out $cargs" + else + if [ `uname` == "Linux" ]; then + $TMUX new-session -s $tmuxapp-$counter -d script -a -c "$VALGRIND ./a.out $cargs" -f log + else + $TMUX new-session -s $tmuxapp-$counter -d "script -a -t 1 log ./a.out $cargs" + fi + fi + else + # As simple as can be + ./a.out $cargs & + echo This worked correctly + fi + fi + ((counter++)) + if [ -z $NOVERBOSE ]; then + echo ">>> Started a C node" + fi + done +} + +# This is always scanning for a command with 'node' +portavailable() { + local folder=$1 + local port=$2 + + if [ -d $folder/$port ]; then + if [ -e $folder/$port/processId ]; then + local pid=`cat $folder/$port/processId` + if [ $pid == "new" ]; then + porttaken=1 + elif [ ! -z $pid ]; then + porttaken=`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` + else + porttaken=0 + fi + else + porttaken=0 + fi + else + porttaken=0 + fi + + if [ $porttaken -eq 0 ]; then + porttaken=`netstat -an -p tcp 2>/dev/null | grep $port | wc -l` + fi +} + +setuptmux() { + + if [ -z $tmuxid ]; then + tmuxapp="tg-$RANDOM" + else + tmuxapp=$tmuxid + fi + + echo "$tmuxapp" > $1/tmuxid + save "$tmuxapp" $appfolder/tmuxid + + trap cleanuptmux SIGINT +} + +getappid() { + local mainf=$1 + local localf=$2 + local appid=$3 + + if [ $appid == "app-n" ]; then + inc_counter $mainf/counter + save "app-$result" $localf/appid + else + save "$appid" $localf/appid + fi + + jappid=`cat $localf/appid` + # save for short cut use + save "$jappid" $appfolder/appid +} + +killtmux() { + for q in `tmux ls | grep $1 | cut -d ':' -f 1`; do + echo $q + tmux kill-session -t $q + done +} + +cleanuptmux() { + #if [ ! -z $tmuxapp ]; then + #killtmux $tmuxapp + #fi + exit +} + +startredis() { + local port=$1 + redis-server --port $port - 1> /dev/null & +} + +waitforredis() { + local port=$1 + + while : ; do + local resp=`redis-cli -p $port -c PING 2>/dev/null` + if [[ $resp == "PONG" ]]; then + break + fi + if [ -z $NOVERBOSE ]; then + echo Trying to find redis server... + fi + sleep 1 + done + if [ -z $NOVERBOSE ]; then + echo ">>> Redis running at port: $port" + fi +} + +setupredis() { + local port=$1 + + cat $REDISFUNCS | redis-cli -p $port -x FUNCTION LOAD REPLACE > /dev/null + echo "set protected-mode no" | redis-cli -p $port > /dev/null + echo 'config set save ""protected-mode no' | redis-cli -p $port > /dev/null +} + + +resolvedata() { + local name=$1 + + local host="${name%:*}" + local port="${name##*:}" + + startredis $port + waitforredis $port + setupredis $port + + if [ $host == "docker" ]; then + local ipaddr=`hostname -I` + name=$ipaddr:$port + fi + # trim space left behind by hostname -I + data=$(echo $name | tr -d '[:space:]') +} + + +# We are already in the correct foldler +# We should find MANIFEST if there is a previous version in the current folder +# We unzip to the current folder if needed. +unpack() { + local file=$1 + + if [ -z $old ]; then + if [ ! -e MANIFEST.txt ]; then + # there is no old file. unpack + unzip -oq $file + if [ $? -ne 0 ]; then + die "Problem reading file: $file" + fi + else + # get new time - by just peaking into the ZIP file + ntime=`zipgrep CREATE $file | awk 'NR==1{split($0,a, " "); print a[3]}'` + # get the old one by reading the previous MANIFEST.txt + otime=`grep CREATE MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` + if (( $ntime > $otime )); then + # newer file so unpack it + unzip -oq $file + if [ $? -ne 0 ]; then + die "Problem reading file: $file" + fi + fi + fi + fi +} + +getheight() { + height=`grep MAX-HEIGHT MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` +} + +getjdata() { + jdata=`grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` +} + +# set the global longitude and lattitude variables +# +getlonglat() { + local loc=$1 + + long="${loc%,*}" + lat="${loc##*,}" +} + +# for now, just roam the north-eastern part... +generatelonglat() { + a=$(( $RANDOM % 180 )) + b=$(( $RANDOM % 10000 )) + long=$a.$b + c=$(( $RANDOM % 90 )) + d=$(( $RANDOM % 10000 )) + lat=$c.$d +} + +### +# Main script execution begins here... +# + +# Initialize all the option variables. +app=app-n +type=device +data=127.0.0.1:6379 +num=1 +tags= +bg= +old= +local= +porttaken=0 +tmuxid= +log= +edge=1 +localregistryhost=0 +killbroker=0 + +# generate the random longitude and lattitude values +# use the --loc option to override these values +generatelonglat + +file=$1 +shift +fext="${file##*.}" + +if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then + show_usage + exit 1 +fi + +if [ "$fext" != "jxe" ]; then + die "Extension on $file is not .jxe" +fi + + +while :; do + case $1 in + --help) + show_usage # Display a usage synopsis. + exit + ;; + --app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--args" requires a non-empty option argument.' + ;; + + --tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + --tmux) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tmuxid=$2 + shift + else + die 'ERROR: "--tmux" requires a non-empty option argument.' + fi + ;; + --tmux=?*) + tmuxid=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tmux=) # Handle the case of an empty + die 'ERROR: "--tmux" requires a non-empty option argument.' + ;; + --num) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + num=$2 + shift + else + die 'ERROR: "--num" requires a non-empty option argument.' + fi + ;; + --num=?*) + num=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --num=) # Handle the case of an empty + die 'ERROR: "--num" requires a non-empty option argument.' + ;; + --loc) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + getlonglat $2 + shift + else + die 'ERROR: "--loc" requires longitude and lattitude specification' + fi + ;; + --loc=?*) + loc=${1#*=} # Delete everything up to "=" and assign the remainder. + getlonglat $loc + ;; + --loc=) # Handle the case of an empty + die 'ERROR: "--loc" requires longitude and lattitude specification' + ;; + --edge) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + edge=$2 + shift + else + die 'ERROR: "--edge" requires a non-empty option argument.' + fi + ;; + --edge=?*) + edge=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --edge=) # Handle the case of an empty + die 'ERROR: "--edge" requires a non-empty option argument.' + ;; + --data) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + data=$2 + shift + else + die 'ERROR: "--data" requires a non-empty option argument.' + fi + ;; + --data=?*) + data=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --data=) # Handle the case of an empty + die 'ERROR: "--data" requires a non-empty option argument.' + ;; + --fog) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="fog" + num= + fi + ;; + --cloud) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="cloud" + num= + fi + ;; + --device) + ;; + --local_registry) + localregistryhost=1 + ;; + --temp_broker) + killbroker=1 + ;; + --bg) + bg=1 + ;; + --verb) + NOVERBOSE= + ;; + --log) + log=1 + ;; + --old) + old=1 + ;; + --local) + local=1 + ;; + --valgrind) + VALGRIND="$VALGRIND_OPTS" + ;; + --disable-stdout-redirect) + DISABLE_STDOUT_REDIRECT=1 + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +# Check necessary parameters and set defaults + +if [ "$type" != "device" ]; then + edge= + if [ -n "$num" ]; then + die "number of devices can't be speciied for fog/cloud" + fi + if [ -n "$edge" ]; then + die "number of edge connections can't be specified for fog/cloud" + fi +fi + + +if [ -e "$file" ]; then + + # Check whether the global .jamruns folder is there + jamfolder=$HOME"/.jamruns" + create_missingdir $jamfolder + + # Check whether the app folder is there + appfolder=$jamfolder/apps + create_missingdir $appfolder + + # Get the folder + filenoext="${file%.*}" + filenoext="${filenoext##*/}" + folder=$appfolder/$filenoext"_"$app + create_missingdir $folder + + #save handle to file + ifile="$(cd "$(dirname "$file")"; pwd)/$(basename "$file")" + cd $folder + unpack $ifile # We are already in $folder + # find the machine height + getheight + getjdata + + if [ -e jstart.js ]; then + # save the current program information for short cut use + save "$filenoext" $appfolder/program + save "$app" $appfolder/app + + # execute the program.. we are in the folder.. + case $type in + cloud) + iport=9883 + while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) + done + if [ "$jdata" = true ]; then + dport=$((iport + 20000)) + resolvedata "127.0.0.1:$dport" + fi + create_missingdir $folder/$iport + create_conffile "${folder}/${iport}/mqtt.conf" $iport + getappid $jamfolder $folder/$iport $app + dojamout $type $iport $folder + ;; + fog) + iport=5883 + while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) + done + if [ "$jdata" = true ]; then + dport=$((iport + 20000)) + resolvedata "127.0.0.1:$dport" + fi + create_missingdir $folder/$iport + create_conffile "${folder}/${iport}/mqtt.conf" $iport + getappid $jamfolder $folder/$iport $app + dojamout $type $iport $folder + ;; + device) + iport=1883 + while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) + done + if [ -z $local ]; then + group="$((iport-1882))" + else + group=0 + fi + if [ "$jdata" = true ]; then + dport=$((iport + 20000)) + resolvedata "127.0.0.1:$dport" + fi + create_missingdir $folder/$iport + create_conffile "${folder}/${iport}/mqtt.conf" $iport + getappid $jamfolder $folder/$iport $app + dojamout_p1 $type $iport $folder + setuptmux $folder/$iport + doaout $num $iport $group $dport + dojamout_p2 $type $iport $folder $group + if [ -z $bg ]; then + cleanuptmux + fi + ;; + esac + else + die "File: $file is not a valid JAMScript executable" + fi + +else + die "File: $file not found" +fi diff --git a/tools/jamrun_epm b/tools/jamrun_epm new file mode 100755 index 000000000..f9acff3b2 --- /dev/null +++ b/tools/jamrun_epm @@ -0,0 +1,401 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" +REDISFUNCS=`realpath "$IDIR/../deps/lua/jredlib.lua"` + +SHELLPID=$$ +trap cleanup SIGTERM SIGINT + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +cleanup() { + exit 1 +} + +# Determine the platform we are running on +unameOut="$(uname -s)" +case "${unameOut}" in + Linux*) machine=Linux;; + Darwin*) machine=Mac;; + *) machine="UNKNOWN:${unameOut}" +esac + +MOSQUITTO=`which mosquitto` +MOSQUITTO_PUB=`which mosquitto_pub` + + +startmqtt() { + local port=$1 + local cfile=$2 + + # Check whether the MQTT server is running.. if not start it + $MOSQUITTO_PUB -p $port -t "test" -m "hello" + if [ $? -ne 0 ]; then + echo "MQTT is not running at $port" + echo "Attempting to start MQTT at $port" + if [ $machine = Mac ]; then + open -n -a $MOSQUITTO --stdout /dev/null --args -c $cfile + elif [ $machine = Linux ]; then + nohup $MOSQUITTO -c $cfile &>/dev/null & + fi + fi +} + +dojamout() { + dojamout_p1 $1 $2 $3 + dojamout_p2 $1 $2 $3 +} + + +dojamout_p1() { + local type=$1 + local pnum=$2 + local floc=$3 + + startmqtt $pnum "${floc}/${pnum}/mqtt.conf" + echo "$data" > $floc/$pnum/dataStore + echo "process" > $floc/$pnum/class + echo "$SHELLPID" > $floc/$pnum/shellpid + echo "new" > $floc/$pnum/processId +} + + +dojamout_p2() { + + if [ -z $bg ]; then + dojamout_p2_fg $1 $2 $3 $4 + else + dojamout_p2_bg $1 $2 $3 $4 + fi +} + + +dojamout_p2_fg() { + local type=$1 + local pnum=$2 + local floc=$3 + local group=$4 + + buildjargs "--app=$app" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" + local args=$results + case $type in + cloud) + node jstart.js $args + ;; + fog) + node jstart.js $args + ;; + device) + node jstart.js $args + ;; + esac +} + + +dojamout_p2_bg() { + local type=$1 + local pnum=$2 + local floc=$3 + local group=$4 + + buildjargs "--app=$jappid" "--port=$pnum" "--group=$group" "--data=$data" "--tags=$tags" "--iflow=$iflow" "--oflow=$oflow" "--edge=$edge" "--long=$long" "--lat=$lat" + local args=$results + + if [ `uname` == "Linux" ]; then + script -a -c "node jstart.js $args" -f log.j > /dev/null & + else + script -a -t 1 log.j node jstart.js $args > /dev/null & + fi + + echo ">>> Started the J node in background" +} + + +# This is always scanning for a command with 'node' +portavailable() { + local folder=$1 + local port=$2 + + if [ -d $folder/$port ]; then + if [ -e $folder/$port/processId ]; then + local pid=`cat $folder/$port/processId` + if [ $pid == "new" ]; then + porttaken=1 + elif [ ! -z $pid ]; then + porttaken=`ps -o pid= -p $pid | wc -l | tr -d '[:space:]'` + else + porttaken=0 + fi + else + porttaken=0 + fi + else + porttaken=0 + fi +} + + +startredis() { + local port=$1 + + # Start redis with no protected-mode and at the port + echo -e "port $1\nprotected-mode no" | redis-server --port $port - 1> /dev/null & +} + +waitforredis() { + local port=$1 + + while : ; do + local present=`ps auwwx | grep redis-server | grep $port | wc -l | tr -d '[:space:]'` + if [ $present == "1" ]; then + break + fi + sleep 1 + done + echo ">>> Redis running at port: $port" + cat $REDISFUNCS | redis-cli -p $port -x FUNCTION LOAD REPLACE > /dev/null +} + +resolvedata() { + local name=$1 + + local host="${name%:*}" + local port="${name##*:}" + + startredis $port + waitforredis $port + + if [ $host == "docker" ]; then + local ipaddr=`hostname -I` + name=$ipaddr:$port + fi + # trim space left behind by hostname -I + data=$(echo $name | tr -d '[:space:]') +} + +getjdata() { + jdata=`grep JDATA MANIFEST.txt | awk '{split($0,a, " "); print a[3]}'` +} + +# set the global longitude and lattitude variables +# +getlonglat() { + local loc=$1 + + long="${loc%,*}" + lat="${loc##*,}" +} + +# for now, just roam the north-eastern part... +generatelonglat() { + a=$(( $RANDOM % 180 )) + b=$(( $RANDOM % 10000 )) + long=$a.$b + c=$(( $RANDOM % 90 )) + d=$(( $RANDOM % 10000 )) + lat=$c.$d +} + +### +# Main script execution begins here... +# + +# Initialize all the option variables. +app=app-n +type=fog +data=127.0.0.1:6379 +num= +tags= +bg= +old= +porttaken=0 +tmuxid= +log= +edge=1 +folder=`pwd` + +# generate the random longitude and lattitude values +# use the --loc option to override these values +generatelonglat + + +while :; do + case $1 in + --help) + show_usage # Display a usage synopsis. + exit + ;; + --app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--args" requires a non-empty option argument.' + ;; + + --tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + --tmux) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tmuxid=$2 + shift + else + die 'ERROR: "--tmux" requires a non-empty option argument.' + fi + ;; + --tmux=?*) + tmuxid=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tmux=) # Handle the case of an empty + die 'ERROR: "--tmux" requires a non-empty option argument.' + ;; + --num) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + num=$2 + shift + else + die 'ERROR: "--num" requires a non-empty option argument.' + fi + ;; + --num=?*) + num=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --num=) # Handle the case of an empty + die 'ERROR: "--num" requires a non-empty option argument.' + ;; + --loc) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + getlonglat $2 + shift + else + die 'ERROR: "--loc" requires longitude and lattitude specification' + fi + ;; + --loc=?*) + loc=${1#*=} # Delete everything up to "=" and assign the remainder. + getlonglat $loc + ;; + --loc=) # Handle the case of an empty + die 'ERROR: "--loc" requires longitude and lattitude specification' + ;; + --edge) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + edge=$2 + shift + else + die 'ERROR: "--edge" requires a non-empty option argument.' + fi + ;; + --edge=?*) + edge=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --edge=) # Handle the case of an empty + die 'ERROR: "--edge" requires a non-empty option argument.' + ;; + --data) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + data=$2 + shift + else + die 'ERROR: "--data" requires a non-empty option argument.' + fi + ;; + --data=?*) + data=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --data=) # Handle the case of an empty + die 'ERROR: "--data" requires a non-empty option argument.' + ;; + --fog) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="fog" + num= + fi + ;; + --cloud) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="cloud" + num= + fi + ;; + --device) + ;; + --bg) + bg=1 + ;; + --log) + log=1 + ;; + --old) + old=1 + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +# Check necessary parameters and set defaults + +if [ "$type" != "device" ]; then + edge= + if [ -n "$num" ]; then + die "number of devices can't be speciied for fog/cloud" + fi + if [ -n "$edge" ]; then + die "number of edge connections can't be specified for fog/cloud" + fi +fi + +# find the machine height + +getjdata +if [ "$jdata" = true ]; then + resolvedata $data +fi + +iport=2883 +while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) +done +create_missingdir $folder/$iport +create_conffile "${folder}/${iport}/mqtt.conf" $iport +dojamout $type $iport $folder diff --git a/tools/jamterm b/tools/jamterm new file mode 100755 index 000000000..7f7a0a509 --- /dev/null +++ b/tools/jamterm @@ -0,0 +1,97 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +# Edit the following locations to provide the +TMUX=`which tmux` +if [ -z $TMUX ]; then + TMUX=/usr/local/bin/tmux +fi + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +Shows the background terminals with the given tmux-id and terminal-num. + +Usage: jamterm [tmux-id] [-t terminal-num] + +jamterm +Shows the first C terminal of the program that was last started. + +jamterm -t 2 + + +jamterm u-600-dev-2331 -t 2 +Shows the second C terminal of the program running under u-600-dev-2331. + +jamterm u-600-dev-2331 +Shows the first C terminal of the program running under u-600-dev-2331. + +EOF +} + +localtmux() { + local tmuxapp=$1 + local termno=$2 + + $TMUX has-session -t $tmuxapp-$termno 2>/dev/null + res=$? + if [ $res == "0" ]; then + if [ -z $termno ]; then + $TMUX attach -t $tmuxapp + else + $TMUX attach -t $tmuxapp-$termno + fi + fi +} + + +### +# Main script execution begins here... +# + +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder ".jamruns folder missing. JAMScript tools not setup?" + +appsfolder=$jamfolder/apps +exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not setup?" + +cd $appsfolder + +if [ -z $1 ]; then + if [ -e tmuxid ]; then + tmuxid=`cat tmuxid` + localtmux $tmuxid 1 + exit + fi +else + # Show help + if [ $1 == "-h" ] || [ $1 == "--help" ]; then + show_usage + exit + elif [ $1 == "-t" ]; then + if [ -e tmuxid ]; then + tmuxid=`cat tmuxid` + localtmux $tmuxid $2 + exit + fi + exit + else + if [ -z $2 ]; then + termid=1 + else + if [ -n $3 ] && [ $2 == "-t" ]; then + termid=$3 + fi + fi + localtmux $1 $termid + fi +fi diff --git a/tools/jamtoast b/tools/jamtoast new file mode 100755 index 000000000..de6d3a39a --- /dev/null +++ b/tools/jamtoast @@ -0,0 +1,1159 @@ +#!/usr/bin/env node + +/******************************* + * JAMSCRIPT TESTING FRAMEWORK * + *******************************/ + +const fs = require('fs'), + os = require('os'), + path = require('path'), + process = require('process'), + assert = require('assert'), + child_process = require('child_process'), + toml = require('toml'); + + +const USAGE = ` +jamtoast [options] file +Toaster is a testing framework for JAMScript that wraps over jamrun. +Individual test files and test directories are both accepted inputs. If a +directory is provided, toaster will recursively search for tests. Currently, +a test is defined as one javascript file and one C file in the same directory +with the same name. To specify an indidivudal test provide the path to the test +without the .js or .c extension. + + +Command Line Options: +-t [duration] --timeout [duration] sets the maximum amount of time for a test to run. +-nt --no-timeout disables timeout +-i --ignore-error ignore runtime errors +-v --verbose verbose (shows stdout of running programs) +-l --local runs jamrun with --local + +Keywords: +Toaster provides two keywords that can be used inside of tests (both jside and cside). + +assert(condition); -- this functions as a regular assert but hooks into the toaster error logging system +coverage(); -- For a test to pass it must execute every coverage function in the test at least once. + +For coverage markers, by default the test will exit once every coverage marker has been reached. To prevent this, +you can use the RunToTimeout option in the Toaster Config. + +Toaster Config: +For tests that must run on multiple nodes at once, the toaster config is a way of +describing basic network structure. This is all done through comments within one of your test files. + +You start the configuration with the @ToasterConfig annotation. + +// @ToasterConfig +// Fogs: [number of fogs] +// Devices: [number of devices] +// Workers: [number of workers for each device] +// Cloud: [true/false run a cloud] +// NetworkDescriptor: [path to a network descriptor] +// RunToTimeout: [true/false ignore early exit from coverage markers] + +Network Descriptor: +This is an alternative to the Toaster Config's Fogs/Devices/Workers/Cloud options. They cannot be both used for the same test. The following example network descriptor demonstrates all possible options for each node type. + +appname="YOUR_NAME" + +[[device]] +tags="YOUR_DEVICE" +data="127.0.0.1:6379" +loc={long=30, lat=30} +edge=4 + +[[fog]] +tags="YOUR_FOG" +data="127.0.0.1:6380" +loc={long=30, lat=30} +host-local-registry=true + +[cloud] +tags="YOUR_CLOUD" +data="127.0.0.1:6381" + +`; + +// Feature TODO: +// - Seperate Node Logs (filename should be nodeid perhaps) DONE +// - Final Report should highlight offending Node DONE +// - Add an option to display all log file urls. + + + + +const TEST_RESULT_DIR_NAME = "toast-results"; +const DEFAULT_TEST_DIR = "toaster" + +const JAMRUNS_DIR = `${os.homedir()}/.jamruns`; + +const TOASTER_JS_HOOKS = + `jtask function assert(cond){if(!(cond)){let _err = new Error(); console.log("\\n@ToasterAssert#{"+_err.stack+"}#");}} +jtask function coverage(_id){console.log("\\n@ToasterCoverage#{"+_id+"}#");}\n`; +const TOASTER_C_HOOKS = + `#undef assert +#define assert(cond, line) {if(!(cond)){printf("\\n@ToasterAssert#{%d, %s}#\\n", line, #cond);fflush(stdout);}} +#define coverage(_id){printf("\\n@ToasterCoverage#{%d}#\\n", _id);fflush(stdout);}\n`; + + +// Just while the compiler is broken: + +const TOASTER_JS_HOOK_ASSERT_L = "if(!("; +const TOASTER_JS_HOOK_ASSERT_R = `)){let _err = new Error(); console.log("@ToasterAssert#{"+_err.stack+"}#");}`; + +const TOASTER_JS_HOOK_COVERAGE_L = `console.log("@ToasterCoverage#{`; +const TOASTER_JS_HOOK_COVERAGE_R = `}#");` + + +const TOASTER_ASSERT_KEYWORD = "@ToasterAssert"; +const TOASTER_COVERAGE_KEYWORD = "@ToasterCoverage"; + +const MAGIC_ANSI_REMOVAL_REGEX = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; + +function ansiiGreen(text) { + return `\x1b[32m${text}\x1b[0m`; +} + +function ansiiYellow(text) { + return `\x1b[33m${text}\x1b[0m`; +} + +function ansiiRed(text) { + return `\x1b[31m${text}\x1b[0m`; +} + +const TestState = { + COMPILING: 0, + STARTING: 1, + RUNNING: 2, + PASSED: 3, + FAILED: 4, + COMPILE_FAILED: 5, +}; + +const FailDetails = { + TEST_FAILED: 0, + LAUNCH_FAILED: 1, + RUNTIME_FAILED: 2, + CRASH_FAILED: 3, +} + +const NODETYPE_DEVICE = "device"; +const NODETYPE_FOG = "fog"; +const NODETYPE_CLOUD = "cloud"; + +Toaster.prototype.writeLog = function(text) { + process.stdout.write(text); + if(this.logFile) { + let prunedText = text.replace(MAGIC_ANSI_REMOVAL_REGEX,""); + fs.writeSync(this.logFile, prunedText); + } +} + +Toaster.prototype.log = function(text) { + this.writeLog(text+"\n"); +} + +Toaster.prototype.updateTestState = function (test) { + let completeStr = `${this.currentTest}`; + let totalStr = `${this.tests.length}`; + + // Magic characters clear line + let prefix = `\x1b[2K\r(${completeStr}/${totalStr}) `; + let padding = totalStr.length - completeStr.length; + prefix += " ".repeat(padding); + if(test.state==TestState.COMPILING) { + this.writeLog(`${prefix}${ansiiYellow(test.testName)} ${ansiiYellow("Compiling")} `); + } else if (test.state == TestState.STARTING) { + let beginning = `${ansiiYellow(test.testName)} ${ansiiGreen("Compiled")}`; + this.writeLog(`${prefix}${beginning} Starting...`) + } else if (test.state == TestState.RUNNING) { + let beginning = `${ansiiYellow(test.testName)} ${ansiiGreen("Compiled")}`; + let coverageStatus = ""; + if(test.coverageMarkers.length) { + coverageStatus = `(${test.completedCoverageMarkers}/${test.coverageMarkers.length})`; + } + this.writeLog(`${prefix}${beginning} ${ansiiYellow("Running")} ${coverageStatus}`) + } else if (test.state == TestState.PASSED) { + this.writeLog(`${prefix}${ansiiGreen(test.testName + " Passed")}`) + } else if (test.state == TestState.FAILED) { + if(test.compilerWarnings != "") { + this.writeLog(`${prefix}${test.compilerWarnings}`); + } + + if (test.failDetails == FailDetails.TEST_FAILED || + test.failDetails == FailDetails.RUNTIME_FAILED || + test.failDetails == FailDetails.CRASH_FAILED) { + // Provide some context as to why + let reason = ""; + if(test.completedCoverageMarkers != test.coverageMarkers.length) { + reason += `${test.completedCoverageMarkers}/${test.coverageMarkers.length} Coverage Markers` + } + if(test.assertMessage) { + if(reason!="") { + reason += ", "; + } + reason += "Failed Assert"; + } + if(test.failDetails == FailDetails.RUNTIME_FAILED) { + if(reason!="") { + reason += ", "; + } + reason += "JAMScript Runtime Error"; + } else if (test.failDetails == FailDetails.CRASH_FAILED) { + if(reason!="") { + reason += ", "; + } + reason += "Test Crashed"; + } + + if(reason == "") { + reason = "!INTERNAL!"; + console.trace(); + } + + this.writeLog(`${prefix}${ansiiRed(test.testName + " Failed")} (${reason}) `) + } else if (test.failDetails == FailDetails.COMPILE_FAILED) { + this.writeLog(`${prefix}${ansiiRed(test.testName + " Failed to compile")}`); + } else if (test.failDetails == FailDetails.LAUNCH_FAILED) { + this.writeLog(`${prefix}${ansiiRed(test.testName + " Failed to start test")} `); + } else { + console.error("Mistakes were made while programming this."); + console.trace(); + } + } +} + +Toaster.prototype.setTestState = function(test, state) { + test.state = state; + this.updateTestState(test); +} + +function Toaster(conf) { + this.conf = conf; + + if(conf.testDirectory == undefined) { + if(fs.existsSync(DEFAULT_TEST_DIR)) { + this.log("Using default test directory " + DEFAULT_TEST_DIR); + this.testDirectory = DEFAULT_TEST_DIR; + } else { + this.log("Must provide a test folder."); + process.exit(); + } + } else { + this.testDirectory = conf.testDirectory; + } + + this.timeoutAmount = conf.timeoutAmount || 10000; + + this.testDirectoryName = path.basename(this.testDirectory); + this.currentTest = 0; + this.testProcesses = new Set(); + + this.logFile = undefined; + + let that = this; + process.on("SIGINT", ()=>that.exitHook()); + //process.on("exit", ()=>that.exitHook()); +} + + +Toaster.prototype.exitHook = function() { + let endTime = Date.now(); + this.finalReport(endTime-this.startTime); + process.exit(); +} + + +Toaster.prototype.setupTestingEnvironment = function () { + if (!fs.existsSync(TEST_RESULT_DIR_NAME)) { + fs.mkdirSync(TEST_RESULT_DIR_NAME); + } + this.resultDirectory = `${TEST_RESULT_DIR_NAME}/${this.testDirectoryName}-${new Date().toISOString()}` + fs.mkdirSync(this.resultDirectory); + + this.logFile = fs.openSync(`${this.resultDirectory}/log.txt`, 'w'); +} + +Toaster.prototype.walkTestDir = function (folder) { + let that = this; + var tests = []; + for(let file of fs.readdirSync(folder)) { + let completePath = `${folder}/${file}`; + + if(fs.lstatSync(completePath).isDirectory()) { + tests.push(...that.walkTestDir(completePath)); + } + + let extension = path.extname(file); + if(extension === ".c") { + let baseName = file.substring(0, file.length-2); + if(fs.existsSync(`${folder}/${baseName}.js`)){ + let testName = `${folder}/${baseName}`.substring(this.testDirectory.length+1); + tests.push({ + testName: testName, + baseName: baseName, + appName: baseName, + testFolder: folder, + cFile: `${folder}/${baseName}.c`, + jsFile: `${folder}/${baseName}.js`, + testResultDirectory: `${that.resultDirectory}/${testName}`, + logFile: `${that.resultDirectory}/${testName}/jlog.txt`, + logFiles: new Map(), + state: TestState.COMPILING, + completedCoverageMarkers: 0, + compilationDuration: 0, + compilerWarnings: "", + runDuration: 0, + assertMessage: undefined, + failDetails: undefined, + offendingNodes: [], + networkConfig: { + devices: 1, + workers: 1, + cloud: false, + fogs: 0, + netDescPath: undefined, + netDesc: undefined + }}); + } + } + } + return tests; +} + + +Toaster.prototype.scanTests = function () { + if(this.conf.singleTest) { + let basename = path.basename(this.testDirectory); + let folder = basename.substring(0, basename.lastIndexOf('/')); + this.tests = []; + this.tests.push({ + testName: basename, + baseName: basename, + appName: basename, + testFolder: folder, + cFile: `${this.testDirectory}.c`, + jsFile: `${this.testDirectory}.js`, + testResultDirectory: `${this.resultDirectory}/${basename}`, + logFile: `${this.resultDirectory}/${basename}/jlog.txt`, + logFiles: new Map(), + state: TestState.COMPILING, + completedCoverageMarkers: 0, + compilationDuration: 0, + compilerWarnings: "", + runDuration: 0, + assertMessage: undefined, + failDetails: undefined, + offendingNodes: [], + networkConfig: { + devices: 1, + workers: 1, + cloud: false, + fogs: 0, + netDescPath: undefined, + netDesc: undefined + } + }); + } else { + this.tests = this.walkTestDir(this.testDirectory); + } + this.log(`Found ${this.tests.length} tests.`); +} + +const ASSERT_IDENTIFIER = "assert("; +const COVERAGE_IDENTIFIER = "coverage("; + +function findMatchingParens(text, start) { + var end = -1; + var lastIndex = start; + var depth = 0; + + while(true) { + let nextOpen = text.indexOf('(', lastIndex); + let nextClose = text.indexOf(')', lastIndex); + + if(nextOpen == -1 && nextClose == -1) { + console.error(`Error: was unable to find matching closing paren for '${text}'`); + process.exit(); + } + + if(nextOpen == -1 || nextClose < nextOpen) { + depth--; + assert(lastIndex != start); + lastIndex = nextClose + 1; + + if(depth == 0) { + end = nextClose; + break; + } + } + + if(nextOpen != -1 && nextOpen < nextClose) { + depth++; + lastIndex = nextOpen + 1; + } + } + return end; +} + +const FOGS_KEYWORD = "fogs:"; +const DEVICES_KEYWORD = "devices:"; +const CLOUD_KEYWORD = "cloud:"; +const WORKERS_KEYWORD = "workers:"; +const NET_DESC_KEYWORD = "networkdescriptor:"; +const TIMEOUT_KEYWORD = "runtotimeout:"; + +Toaster.prototype.scanForToasterConfig = function(test, line, lineIter) { + const keywords = [FOGS_KEYWORD, DEVICES_KEYWORD, WORKERS_KEYWORD, NET_DESC_KEYWORD, TIMEOUT_KEYWORD]; + if(line.includes("@ToasterConfig")) { + let lineResult; + while(!(lineResult = lineIter.next()).done) { + line = lineResult.value.toLowerCase(); + + let keywordFound = false; + for(let keyword of keywords) { + if(line.includes(keyword)) { + keywordFound = true; + let start = line.indexOf(keyword) + keyword.length; + let value = line.substring(start).trim(); + + if(keyword == FOGS_KEYWORD) { + test.networkConfig.fogs = parseInt(value); + } else if (keyword == DEVICES_KEYWORD) { + test.networkConfig.devices = parseInt(value); + } else if (keyword == WORKERS_KEYWORD) { + test.networkConfig.workers = parseInt(value); + } else if (keyword == CLOUD_KEYWORD){ + test.networkConfig.cloud = value.toLowerCase().includes('true'); + } else if (keyword == TIMEOUT_KEYWORD) { + test.runToTimeout = value.toLowerCase().includes('true'); + } else if (keyword == NET_DESC_KEYWORD) { + if(test.networkConfig.netDescPath != undefined) { + this.log("ERROR: More than one network descriptor provided!"); + } + test.networkConfig.netDescPath = value; + } + } + } + + if(!keywordFound) { + break; + } + } + + // Check valid config + if(test.networkConfig.netDescPath && (test.networkConfig.fogs != 0 || test.networkConfig.devices != 1 || test.networkConfig.cloud)) { + this.log("ERROR: Toaster config has both network descriptor and manual network configuration."); + } + + if(test.networkConfig.netDescPath) { + let netDescToml = fs.readFileSync(test.testFolder + "/" + test.networkConfig.netDescPath); + test.networkConfig.netDesc = toml.parse(netDescToml); + + if('appname' in test.networkConfig.netDesc) { + test.appName = test.networkConfig.netDesc['appname']; + } + } + } +} + +Toaster.prototype.compileTest = async function(test) { + const buildEnv = `${JAMRUNS_DIR}/_toaster_build_env`; + if(!fs.existsSync(buildEnv)) { + fs.mkdirSync(buildEnv); + } + + this.updateTestState(test); + + let cTestPath = `${buildEnv}/${test.baseName}.c`; + let jsTestPath = `${buildEnv}/${test.baseName}.js`; + + let cFileContents = fs.readFileSync(test.cFile, 'utf-8'); + let cTestOutput = fs.openSync(cTestPath, 'w'); + + let jsFileContents = fs.readFileSync(test.jsFile, 'utf-8'); + let jsTestOutput = fs.openSync(jsTestPath, 'w'); + + let coverageMarkers = []; + var coverageUID = 0; + var lineCount = 0; + + + // Roll c-side and j-side processing into one single processor... + + // Process c-side + fs.writeSync(cTestOutput, TOASTER_C_HOOKS); + + let lines = cFileContents.split(/\r?\n/); + let lineIter = lines[Symbol.iterator](); + + var lineResult; + while(!(lineResult = lineIter.next()).done) { + let line = lineResult.value; + + lineCount++; + let regularLine = true; + + this.scanForToasterConfig(test, line, lineIter); + + let commentStart = Number.MAX_SAFE_INTEGER; + if(line.includes("//")) { + commentStart = line.indexOf("//"); + } + + if(line.toLowerCase().includes("error")) { + test.compilerWarnings +=`WARNING: Printing 'Error' to standard out will mark the test as failed! (${lineCount})\n`; + test.compilerWarnings += `--> ${line}\n`; + } + + if(line.includes(ASSERT_IDENTIFIER)) { + regularLine = false; + let start = line.indexOf(ASSERT_IDENTIFIER); + if(start < commentStart) { + let end = findMatchingParens(line, start); + fs.writeSync(cTestOutput, line.substring(0, end)); + fs.writeSync(cTestOutput, `,${lineCount}`); + fs.writeSync(cTestOutput, line.substring(end) + "\n"); + } + } + if(line.includes(COVERAGE_IDENTIFIER)) { + regularLine = false; + let start = line.indexOf(COVERAGE_IDENTIFIER); + + if(start < commentStart) { + let end = findMatchingParens(line, start); + + let currentCoverageID = coverageUID++; + + fs.writeSync(cTestOutput, line.substring(0, end)); + fs.writeSync(cTestOutput, `${currentCoverageID}`); + fs.writeSync(cTestOutput, line.substring(end)+"\n"); + + coverageMarkers.push({ + id: currentCoverageID, + line: lineCount, + covered: false + }); + } + } + if(regularLine) { + fs.writeSync(cTestOutput, line+"\n"); + } + } + + // Process c-side + lineCount = 0; + + lines = jsFileContents.split(/\r?\n/); + lineIter = lines[Symbol.iterator](); + while(!(lineResult = lineIter.next()).done) { + let line = lineResult.value; + + lineCount++; + let regularLine = true; + + this.scanForToasterConfig(test, line, lineIter); + + if(line.toLowerCase().includes("error")) { + test.compilerWarnings +=`WARNING: Printing 'Error' to standard out will mark the test as failed! (${lineCount})\n`; + test.compilerWarnings += `--> ${line}\n`; + } + + let commentStart = Number.MAX_SAFE_INTEGER; + if(line.includes("//")) { + commentStart = line.indexOf("//"); + } + + // TODO: remove this when compiler bug is fixed + if(line.includes(ASSERT_IDENTIFIER)) { + regularLine = false; + let start = line.indexOf(ASSERT_IDENTIFIER); + if(start < commentStart) { + let end = findMatchingParens(line, start); + + let condition = line.substring(start + ASSERT_IDENTIFIER.length, end); + if(condition=="") { + this.log(`\nAssert is missing condition! \\/ (${lineCount})\n--> ${line}`); + } + fs.writeSync(jsTestOutput, line.substring(0, start)); + fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_ASSERT_L); + fs.writeSync(jsTestOutput, condition); + fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_ASSERT_R); + fs.writeSync(jsTestOutput, line.substring(end+2)+"\n"); + } + } + + if(line.includes(COVERAGE_IDENTIFIER)) { + regularLine = false; + let start = line.indexOf(COVERAGE_IDENTIFIER); + if(start < commentStart) { + let end = findMatchingParens(line, start); + + let currentCoverageID = coverageUID++; + + fs.writeSync(jsTestOutput, line.substring(0, start)); + fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_COVERAGE_L); + fs.writeSync(jsTestOutput, `${currentCoverageID}`); + fs.writeSync(jsTestOutput, TOASTER_JS_HOOK_COVERAGE_R); + fs.writeSync(jsTestOutput, line.substring(end+2)+"\n"); + + coverageMarkers.push({ + id: currentCoverageID, + line: lineCount, + covered: false + }); + } + } + if(regularLine) { + fs.writeSync(jsTestOutput, line+"\n"); + } + } + + fs.closeSync(jsTestOutput); + fs.closeSync(cTestOutput); + + test.coverageMarkers = coverageMarkers; + + const compilationStart = Date.now(); + + // Forward preprocessed files into JamC + + let command = 'jamc'; + let args = [ + '-d', + cTestPath, + jsTestPath, + '-o', + `${test.testResultDirectory}/test`]; + + // We should log compiler output in the event of a compiler error. + + //this.writeLog("Compiling... "); + var proc = undefined; + let stdoutLog = ""; + let stderrLog = ""; + + try { + proc = child_process.spawn(command,args, {detached: true});//, {stdio: [0,test.output,test.output]}); + proc.stderr.setEncoding('utf-8'); + proc.stdout.setEncoding('utf-8'); + + + + proc.stdout.on('data', (data)=> { + stdoutLog += data; + }); + + let shouldFail = false; + proc.stderr.on('data', (data)=> { + stderrLog += data; + if(data.toLowerCase().includes("error")) { + shouldFail = true; + } + }); + + await new Promise((resolve)=>{ + proc.stderr.on('close', ()=>{resolve()}); + }); + + if(!fs.existsSync(`${test.testResultDirectory}/test.jxe`) || + shouldFail) { + throw new Error(); + } + + const compilationEnd = Date.now(); + test.compilationDuration = compilationEnd-compilationStart; + + this.setTestState(test,TestState.STARTING); + + test.output.write(stdoutLog); + test.output.write("Stderr Follows: \n"); + test.output.write(stderrLog); + + return true; + } catch(err) { + + test.failDetails = FailDetails.COMPILE_FAILED; + this.setTestState(test,TestState.FAILED); + /*this.log("Failed!");*/ + + test.output.write(stdoutLog); + test.output.write("Stderr Follows: \n"); + test.output.write(stderrLog); + test.output.close(); + //this.log(` Full log can be found at ${test.logFile}`); + + return false; + } + +} + +// NOTE: this a bit hacky at the moment, we are killing the group of the same pid +// as our initial process. Works well consistently so far... Should come back and +// figure out a cleaner way of getting this done. +function killGroup(pgid) { + try { + child_process.execSync(`kill -- -${pgid}`, {stdio:'ignore'}); + } catch (err) { + console.log("Failed to terminate test process."); + } +} + +// Loop through process ID files (use this) +Toaster.prototype.killWorkerTmuxSessions = function() { + + const searchDir = `${os.homedir()}/.jamruns/apps/test_${this.testDirectory}`; + + for(let file of fs.readdirSync(searchDir)) { + let completePath = `${searchDir}/${file}`; + if(fs.lstatSync(completePath).isDirectory()) { + let tmuxid = fs.readFileSync(`${completePath}/tmuxid`, 'utf-8'); + child_process.execSync(`tmux kill-session -t ${tmuxid}`); + } + } +} + +function extractOutputKeywordData(text){ + let start = text.indexOf("#{")+2; + let end = text.indexOf("}#"); + return text.substring(start, end); +} + +Toaster.prototype.processOutput = function (test, data, log, pid) { + if(test.state == TestState.STARTING) { + this.setTestState(test, TestState.RUNNING); + } + + if(typeof data != 'string') { + return; + } + + for(let line of data.split('\n')) { + if (test.state == TestState.PASSED || + test.state == TestState.FAILED) { + return false; + } + + log.write(line+ '\n'); + + // Try to pick up any spurrious errors we may have missed otherwise. + if(line.toLowerCase().includes("error")) { + if(this.conf.ignoreError) { + continue; + } + // NOTE: this is super hacky edge case handling for an already hacky + // way of detecting errors! + if(line.includes("error: 0")) { + continue; + } + test.offendingNodes.push(pid); + test.failDetails = FailDetails.RUNTIME_FAILED; + this.setTestState(test, TestState.FAILED); + return true; + } + + if(line.includes('@')) { + + if(line.includes(TOASTER_ASSERT_KEYWORD)) { + test.assertMessage = extractOutputKeywordData(line); + test.failDetails = FailDetails.TEST_FAILED; + this.setTestState(test, TestState.FAILED); + test.offendingNodes.push(pid); + return true + } else if (line.includes(TOASTER_COVERAGE_KEYWORD)) { + let coverageId = extractOutputKeywordData(line); + for(let marker of test.coverageMarkers) { + if(marker.id == coverageId && + marker.covered == false) { + test.completedCoverageMarkers++; + marker.covered = true; + this.updateTestState(test); + } + } + } + // Test is complete + if(test.completedCoverageMarkers == test.coverageMarkers.length) { + if(!test.runToTimeout) { + this.setTestState(test,TestState.PASSED); + return true; + } + } + } + } + return false; +} + +Toaster.prototype.cleanupResidualTests = function() { + for(let pid of this.testProcesses) { + killGroup(pid); + } + this.testProcesses.clear(); +} + +Toaster.prototype.executeTest = async function(test, + machType, + tags=undefined, + data=undefined, + shouldHost=undefined, + loc=undefined, + edge=undefined) { + let command = `jamrun` + let args = [ + `${test.testResultDirectory}/test.jxe`, + `--app=${test.appName}`, + //"--log", + "--disable-stdout-redirect"]; + + if(machType==NODETYPE_FOG) { + args.push("--fog"); + } else if (machType==NODETYPE_DEVICE) { + args.push(`--num=${test.networkConfig.workers}`); + } else if (machType==NODETYPE_CLOUD) { + args.push("--cloud"); + } + + if(tags) { + args.push("--tags="+tags); + } + if(data) { + args.push("--data="+data); + } + if(shouldHost && machType==NODETYPE_FOG) { + args.push("--local_registry"); + } + if(loc) { + args.push(`--loc=${loc.long},${loc.lat}`) + } + if(edge) { + args.push("--edge="+edge); + } + if(this.conf.local) { + args.push("--local"); + } + + if(this.conf.valgrind) { + args.push("--valgrind"); + } + + let that = this; + var timeout; + + function cleanup() { + // In the case where timeout is never set + if(!that.conf.noTimeout) { + clearTimeout(timeout); + } + + const testEndTime = Date.now(); + test.runDuration = testEndTime-testStartTime; + try { + if(test.failDetails != FailDetails.CRASH_FAILED || + test.failDetails != FailDetails.LAUNCH_FAILED) { + killGroup(testProcess.pid); // Not entirely sure why this works... + } + test.logFiles.get(testProcess.pid).close(); + that.testProcesses.delete(testProcess.pid); + } catch(e){ that.log(e); } + } + + const testStartTime = Date.now(); + + // We should log compiler output in the event of a compiler error. + let testProcess = child_process.spawn(command, args, {shell: false, detached: true}); + let pid = testProcess.pid; + this.testProcesses.add(pid); + //let log = fs.openSync(`${test.testResultDirectory}/${testProcess.pid}.txt`, 'w'); + let log = fs.createWriteStream(`${test.testResultDirectory}/${machType}_${testProcess.pid}.txt`); + test.logFiles.set(pid, log); + + if(!this.conf.noTimeout) { + var timeout = setTimeout(()=>{ + if(test.state == TestState.STARTING) { + test.failDetails = FailDetails.LAUNCH_FAILED; + that.setTestState(test, TestState.FAILED); + test.offendingNodes.push(pid); + this.testProcesses.delete(pid); + cleanup(); + } + if(test.state == TestState.RUNNING) { + if(test.coverageMarkers.length != test.completedCoverageMarkers) { + test.failDetails = FailDetails.TEST_FAILED; + that.setTestState(test, TestState.FAILED); + test.offendingNodes.push(pid); + } else { + that.setTestState(test, TestState.PASSED); + } + cleanup(); + } + }, this.timeoutAmount); + } + + testProcess.stdout.setEncoding('utf-8'); + testProcess.stderr.setEncoding('utf-8'); + + testProcess.stdout.on('data', (data) => { + if(that.conf.verbose) { + process.stdout.write(data); + } + if(that.processOutput(test, data, log, pid)) { + cleanup(); + } + }); + + testProcess.stderr.on('data', (data) => { + if(test.state == TestState.RUNNING) { + log.write(`STDERR: ${data}`); + if(that.processOutput(test, data, log, pid)) { + cleanup(); + } + } + }); + + await new Promise((resolve) => { + testProcess.on('close', () => { + + if(test.state == TestState.RUNNING) { + // Crash + test.failDetails = FailDetails.CRASH_FAILED; + that.setTestState(test, TestState.FAILED); + that.testProcesses.delete(pid); + test.offendingNodes.push(pid); + } else if(test.state == TestState.STARTING) { + test.failDetails = FailDetails.LAUNCH_FAILED + that.setTestState(test, TestState.FAILED); + test.offendingNodes.push(pid); + } + if(this.testProcesses.size) { + let report = that.generateReport(test); + test.output.write(`\n\n\n${report}`); + } + resolve(); + }); + }); +} + +Toaster.prototype.generateReport = function(test) { + var reportMessage = ""; + if(test.state == TestState.PASSED) { + reportMessage = `Test: ${test.testName} Completed Succesfully\n`+ + `Time to Compile: ${test.compilationDuration/1000.0}s\n` + + `Time to Run Test: ${test.runDuration/1000.0}s\n`; + } else if (test.state == TestState.FAILED) { + reportMessage = `Test: ${test.testName} Failed\n`+ + `Time to Compile: ${test.compilationDuration/1000.0}s\n` + + `Time to Run Test: ${test.runDuration/1000.0}s\n` + + `Reached ${test.completedCoverageMarkers} coverage markers out of ${test.coverageMarkers.length}\n`; + if(test.completedCoverageMarkers != test.coverageMarkers.length) { + for(let marker of test.coverageMarkers) { + if(!marker.covered) { + reportMessage += ` Missed coverage marker on line ${marker.line}\n` + } + } + } + } + return reportMessage; +} + +Toaster.prototype.testAll = async function () { + this.startTime = Date.now(); + + for(let test of this.tests) { + this.currentTest++; + + await this.runTest(test); + } + + let endTime = Date.now(); + this.finalReport(endTime-this.startTime); + process.exit(1); +} + +Toaster.prototype.runTest = async function (test) { + this.writeLog('\n'); + + fs.mkdirSync(test.testResultDirectory, {recursive: true}); + + test.output = fs.createWriteStream(`${test.testResultDirectory}/jlog.txt`); + + // The directory could be included in the test object, that would make more sense + if(!await this.compileTest(test)) { + return; + } + + //console.log(test.networkConfig); + + let sleep = 750; + + // Resume as soon as one of these exits. + await new Promise( async (resolve) => { + if(test.networkConfig.netDesc) { + let netDesc = test.networkConfig.netDesc; + if('cloud' in netDesc) { + this.executeTest(test, + NODETYPE_CLOUD, + netDesc['cloud']['tags'], + netDesc['cloud']['data'] + ).then(()=>{resolve()}); + await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); + } + + if('fog' in netDesc) { + for (let fog of netDesc['fog']) { + this.executeTest(test, + NODETYPE_FOG, + fog['tags'], + fog['data'], + fog['hostLocalRegistry'], + fog['loc'] + ).then(()=>{resolve()}); + await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); + } + } + + if('device' in netDesc) { + for (let device of netDesc['device']) { + this.executeTest(test, + NODETYPE_DEVICE, + device['tags'], + device['data'], + false, + device['loc'], + device['edge'] + ).then(()=>{resolve()}); + await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); + } + } + } else { + if(test.networkConfig.cloud) { + this.executeTest(test, NODETYPE_CLOUD).then(()=>{resolve()}); + await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); + } + for(let _ = 0; _ < test.networkConfig.fogs; _++){ + this.executeTest(test, NODETYPE_FOG).then(()=>{resolve()}); + await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); + } + + for(let _ = 0; _ < test.networkConfig.devices; _++){ + this.executeTest(test, NODETYPE_DEVICE).then(()=>{resolve()}); + await new Promise((resolve2)=>{setTimeout(()=>{resolve2();}, sleep)}); + } + } + + }); + + this.cleanupResidualTests(); + + test.output.close(); +} + +Toaster.prototype.finalReport = function(duration) { + const total = this.tests.length; + let passed = 0; + + let allTestsFinished = true; + + for(let test of this.tests) { + if(test.state == TestState.PASSED) { + passed++; + } + // COMPILING is the initial state. + // Could refactor to make that more clear to be honest. + if(test.state == TestState.COMPILING) { + allTestsFinished = false; + } + } + + let exitText = `\n\n${allTestsFinished ? "All Tests Finished" : "Not All Tests Finished"} (${passed}/${total}) in ${duration/1000}s`; + + if(passed == total) { + exitText = ansiiGreen(exitText); + } else if (!passed) { + // oopsies... + exitText = ansiiRed(exitText); + } + + this.log(exitText); + + this.log(`Toaster Log: ${this.resultDirectory}/log.txt`); + + if(passed != total) { + this.log("Logs of Failed Tests:"); + for(let test of this.tests) { + if(test.state == TestState.FAILED) { + this.log(`${ansiiRed(test.testName)} ${" ".repeat(Math.max(0,20-test.testName.length))} ${test.logFile}`); + for(let node of test.offendingNodes) { + this.log(`${" ".repeat(20)} ${test.logFiles.get(node).path}`); + } + } + } + } + + if(this.logFile) { + fs.close(this.logFile); + this.logFile = undefined; + } +} + +function processArgs() { + let args = process.argv.slice(2); + let conf = { + testDirectory: undefined, + singleTest: false, + timeoutAmount: undefined, + noTimeout: false, + verbose: false, + local: false, + valgrind: false + }; + + for (var i = 0; i < args.length; i++) { + if (args[i].charAt(0) === "-") { + if (args[i] === "-t" || args[i] === "--timeout") { + conf.timeoutAmount = parseInt(args[i+1]); + if(Number.isNaN(conf.timeoutAmount)) { + console.error("Unable to parse timeout duration: "+args[i+1]); + conf.timeoutAmount = undefined; + } + i++; + } else if (args[i] === "-h" || args[i] === "--help") { + console.log(USAGE); + process.exit(); + } else if (args[i] === "-v" || args[i] === "--verbose") { + conf.verbose = true; + } else if (args[i] === "-nt" || args[i] === "--no-timeout") { + conf.noTimeout = true; + } else if (args[i] === "-l" || args[i] === "--local") { + conf.local = true; + } else if (args[i] === "-i" || args[i] === "--ignore-error") { + conf.ignoreError = true; + } else if (args[i] === "-va" || args[i] === "--valgrind") { + conf.valgrind = true; + } + } else { + let inputPath = args[i]; + if(conf.testDirectory != undefined) { + console.log("Can only provide one test folder!"); + process.exit(); + } + + if(fs.existsSync(inputPath)) { + conf.testDirectory = inputPath; + } else if (fs.existsSync(inputPath + ".js")){ + conf.testDirectory = inputPath; + conf.singleTest = true; + } else { + console.log(`Folder/Test '${inputPath}' Doesn't Exist.`); + } + } + } + + return conf; +} + +let toaster = new Toaster(processArgs()); +toaster.setupTestingEnvironment(); +toaster.scanTests(); +toaster.testAll(); diff --git a/tools/jamvis b/tools/jamvis new file mode 100755 index 000000000..ef107d24e --- /dev/null +++ b/tools/jamvis @@ -0,0 +1,71 @@ +#!/bin/bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +JAMVis, a visualizer for JAMScript Networks. + +JAMVis works by running starting a webserver on the same machine that the global registry runs on. It recursively scans all brokers by looking through all registries advertised accross the network. All network state is passively monitered and visualized. + +Comand Line Options: +--help Shows this message +--app={appname} Selects which app JAMVis should target (REQUIRED) +--batch Batches JAMScript command events to reduce websocket traffic. +--remote={host} Starts JAMVis webserver on remote host through ssh remote command execution and tunneling. Remote host must have JAMScript installed. + +Web interface: +By default the port the website gets hosted on is :8580. + +click and drag to look. +scroll to zoom. + +'h' toggles visibility of text on screen +'c' toggles visibility of device-fog connections +'l' toggles visibility of local registry connections + +EOF +} +batch=false +while :; do + case $1 in + --help) + show_usage + exit + ;; + --batch) + batch=true + ;; + --app=?*) + app=${1#*=} + ;; + --remote=) + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + --remote=?*) + remote=${1#*=} + ;; + --remote=) + die 'ERROR: "--remote" requires a non-empty option argument.' + ;; + *) + break + esac + shift +done + +if [ -z "$remote" ]; then + node $SCRIPT_DIR/jamvis_internal/serv.js $app $batch + #open "localhost:8580" +else + echo "Connecting to remote." + #(sleep 3 && open "http://localhost:8580") & + ssh -t -t -L 8580:localhost:8580 -L 8681:localhost:8681 $remote ". ~/.bashrc && jamvis --app=$app" +fi + + diff --git a/tools/jamvis_internal/serv.js b/tools/jamvis_internal/serv.js new file mode 100644 index 000000000..d293e3495 --- /dev/null +++ b/tools/jamvis_internal/serv.js @@ -0,0 +1,303 @@ +#!/usr/bin/env node + +const express = require('express'), + child_process = require('child_process'), + fs = require('fs'), + ws = require('ws'), + process = require('process'), + merc = require('mercator-projection'), + cbor = require('cbor-x'), + mqtt = require('mqtt'); + +const app = express(); + +const port = 8580; +var app_name = 'jt1'; +var batch = false; + +///////////////////// +// MQTT Management // +///////////////////// + +/// Try to conenct to local host +const global_broker = connect_global_broker(); + +///var brokers = []; +var node_map = new Map(); + +function connect_global_broker() { + const global_broker = mqtt.connect("mqtt://127.0.0.1:18830"); + + global_broker.on('error', (error) => { + if (error.code == 'ECONNREFUSED') { + console.log("Couldn't establish a connection to the global registry."); + global_broker.end(); + process.exit(); + } else { + console.log(error); + } + }); + + global_broker.on("connect", () => { + global_broker.subscribe(`${app_name}/local_registry/#`, (error) => { + if(error) { + console.log("Error doing Subscription for global registry: "+error.toString()); + } + }); + }); + + global_broker.on("message", (topic, message) => { + mqtt_message_handler(topic, message); + }); + + return global_broker; +} + +function connect_broker(url, port) { + const broker = mqtt.connect(`mqtt://${url}:${port}`); + + broker.on('error', (error) => { + console.log(error); + }); + + broker.on('connect', () => { + // EVERYTHING!!!! + broker.subscribe(`#`, (error) => { + if(error) { + console.log("Error doing Subscription for global registry: "+error.toString()); + } + }); + }); + + broker.on('message', mqtt_message_handler); + return broker; +} + +function register_broker(online_message, node_id, mach_type) { + console.log("Tracking New Node: "+node_id); + let internal_mach_type = mach_type; + let local_registry = false; + + console.log(mach_type); + if(mach_type == 'local_registry') { + internal_mach_type = 'fog'; + local_registry = true; + } + + let entry = { + broker: connect_broker(online_message.ip, online_message.port), + node_id: String(node_id), + loc: online_message.loc, + mach_type: internal_mach_type, + local_registry: local_registry, + connections: [] + }; + + node_map.set(node_id, entry); + update_node_view(entry); +} + +function handle_message_transport(message_data) { + let data = cbor.decode(message_data); + // receiver/sender is not consistently correct at the moment. + + update_transport_view({ + receiver: String(data.nodeid), + sender: String(data.oldid), + task_id: String(data.taskid) + }); +} + +function mqtt_message_handler(topic, message_text) { + let topic_levels = topic.split('/'); + let mach_type = topic_levels[1]; + let node_id = topic_levels[2]; + let message_type = topic_levels[3]; + + // For now... + if(topic.charAt(0) == '/') { + handle_message_transport(message_text); + return; + } + + if(message_text == "") + return; + + try { + + var message = JSON.parse(message_text); + } catch(e) { + console.log("Failed to parse message..."); + return; + } + + // TODO: handle local registry unhost + if(message_type == 'status') { + if(message.payload == 'offline') { + if(mach_type == 'local_registry') { + let node = node_map.get(node_id); + if(!node) + return; + node.local_registry = false; + } else { + node_map.delete(node_id); + } + + } else if (!node_map.has(node_id)) { + register_broker(message.payload, node_id, mach_type); + } + } else if (message_type == 'curLoc') { + let node = node_map.get(node_id); + if(node == undefined) + return; + node.loc['long'] = message.payload['long']; + node.loc['lat'] = message.payload['lat']; + update_node_view(node); + } else if (message_type == '_debug_selfHost') { // TODO: this seems useless now + let node = node_map.get(node_id); + if(node == undefined) + return; + + node.local_registry = message.payload; + + } else if (message_type == '_debug_conns') { + let node = node_map.get(node_id); + if(node == undefined) + return; + node.connections = message.payload; + update_node_view(node); + } +} + +function transform_coords(loc) { + let xy = merc.fromLatLngToPoint({lat: loc['lat'], lng: loc['long']}); + let adjusted_xy = {x: xy.x/256.0, y: (xy.y/256.0)+0.5}; + return adjusted_xy; +} + +function update_node_view(node) { + let xy = merc.fromLatLngToPoint({lat: node.loc['lat'], lng: node.loc['long']}); + let adjusted_xy = {x: xy.x/256.0, y: (xy.y/256.0)+0.5}; + + let relevant_info = { + node_id: node.node_id, + loc_proj: adjusted_xy, + loc: node.loc, + mach_type: node.mach_type, + local_registry: node.local_registry, + connections: node.connections + }; + + let pack = { + type: 'state', + data: relevant_info + }; + websocketSend(JSON.stringify(pack)); +} + +var transport_update_queue = [] + +// for now, TODO: add more information from here +function update_transport_view(event_data) { + let pack = { + type: 'event', + data: event_data + }; + if(batch) { + transport_update_queue.push(event_data); + } else { + websocketSend(JSON.stringify(pack)); + } +} + +function dump_transport_view_batch() { + let pack = { + type: 'event-batch', + data: transport_update_queue + } + websocketSend(JSON.stringify(pack)); + transport_update_queue = [] +} + +////////////////////////// +// Websocket Management // +////////////////////////// + +const websocket_server = new ws.WebSocketServer({port:8681 }); + +var websockets = []; + +function location_average() { + + var acc = {x: 0, y: 0}; + for(var node_entry of node_map) { + var node = node_entry[1]; + var pos = transform_coords(node.loc); + acc = { + x: acc.x + pos.x, + y: acc.y + pos.y + }; + } + return {x: acc.x/node_map.size, + y: acc.y/node_map.size}; +} + +function websocketSend(message) { + for(var websocket of websockets) { + websocket.send(message); + } +} + +websocket_server.on('error', (err)=>{console.error("WS: "); console.error(err)}); +websocket_server.on('connection', function(websocket) { + console.log("Someone Connected to the websocket."); + websockets.push(websocket); + + let pack = { + type: 'viewport', + data: location_average() + }; + websocket.send(JSON.stringify(pack)); + + // Bring websocket up to date + for(var node_entry of node_map) { + var node = node_entry[1]; + update_node_view(node); + } +}); + + +//////////////////// +// Initialization // +//////////////////// + +let args = process.argv.slice(2); +app_name = args[0]; +batch = args[1] == 'true'; +if(batch) { + console.log("Sending Batched Message Transport Packets."); + setInterval(()=>{dump_transport_view_batch()}, 500) +} + + +///////////////////// +// Website Hosting // +///////////////////// + +const raw_html = ` + + +`; + +app.get('/', (req, res) => { + res.send(raw_html); +}); + +app.get('/sketch.js', (req, res) => { + let sketch = fs.readFileSync(`${__dirname}/view.js`, {encoding: 'utf8', flag: 'r' }); + res.send(sketch); +}); + +app.listen(port, () => { + console.log(`JAMVis Webserver listening on port ${port}`); +}); diff --git a/tools/jamvis_internal/view.js b/tools/jamvis_internal/view.js new file mode 100644 index 000000000..59add156b --- /dev/null +++ b/tools/jamvis_internal/view.js @@ -0,0 +1,603 @@ + +let node_map = new Map(); +let fogs = []; +let devices = []; +var view_scale = 750; +var viewport_pos = {x:0,y:0}; +var view_offset = {x:0,y:0}; + +let app, graphics; + +let dragging = false; +let drag_start = {x:0,y:0}; +var view_offset_drag_start = {x:0,y:0}; + +var remote_calls_observed = 0; + +var remote_calls_last_sec = 0; +var remote_calls_this_sec = 0; + +var bounding_boxes = []; +var selected_node = undefined; + +var hide_text = false; +var show_lr_conn = false; +var show_conn = true; +var show_trails = false; +var trail_mode = 0; + + +const DEFAULT_LINE_COLOUR = {r:100, g:50, b:50}; +const SIGNAL_LINE_COLOUR = {r:255, g:50, b:50}; +const SELECTED_LINE_COLOUR = {r: 150, g: 150, b: 150}; +const SELECTED_SIGNAL_LINE_COLOUR = {r: 255, g: 255, b: 255}; +const LR_LINE_COLOUR = {r: 50, g: 100, b: 70}; +const LR_SIGNAL_LINE_COLOUR = {r: 50, g: 255, b: 255}; + +const FOG_COLOUR = {r: 14,g:149,b:148}; +const DEVICE_COLOUR = {r: 245,g:84,b:45}; +const LR_COLOUR = {r: 255,g:255,b:255}; + +const TRAIL_COLOUR = {r: 150,g:150,b:150}; + +const TRAIL_MAX = 40; + +const TRAIL_LEN1 = 5; +const TRAIL_LEN2 = 15; + + +const style_large = new PIXI.TextStyle({ + fontFamily: 'Times New Roman', + fontSize: 36, + fill: "White" +}); + +const style_medium = new PIXI.TextStyle({ + fontFamily: 'Times New Roman', + fontSize: 24, + fill: "White" +}); + +function scalarAddition(vec2, scale) { + return {x: vec2.x+scale, y: vec2.y+scale}; +} + +var ui_cache = new Map(); +function render_text(app, desc, text_content, offset) { + let text = undefined; + if(ui_cache.has(desc)) { + text = ui_cache.get(desc); + } else { + text = new PIXI.Text(text_content, style_medium); + text.should_visible = true; + ui_cache.set(desc,text); + text.x = 40; + app.stage.addChild(text); + } + + if(hide_text) { + text.visible = false; + } else { + text.visible = text.should_visible; + } + + if(!text.visible) + return offset; + + text.text = text_content; + text.y = offset; + + return offset + 35; +} + +function text_visible(app, desc, state) { + if(!ui_cache.has(desc)) { + console.log("Couldn't find text with descriptor: "+desc); + return; + } + var text = ui_cache.get(desc); + text.should_visible = state; + if(hide_text) { + text.visible = false; + } else { + text.visible = text.should_visible; + } +} + +function init_ui(app) { + + var y = 40; + + var text = new PIXI.Text("JAMVis", style_large); + text.x = 40; + text.y = y; + + app.stage.addChild(text); +} + + +function update_ui() { + y = 90 + if(selected_node) { + y = render_text(app, 'selected_node', `Selected Node: ${selected_node.data.node_id}`, y); + y = render_text(app, 'selected_node_lat', `Latitude: ${selected_node.data.loc['lat']}`, y); + y = render_text(app, 'selected_node_long', `Longitude: ${selected_node.data.loc['long']}`, y); + } + y = render_text(app, 'remote_commands_ps', `Commands Per Second: ${remote_calls_last_sec}`, y); + y = render_text(app, 'remote_commands', `Total Commands: ${remote_calls_observed}`, y); + y = render_text(app, 'devices', `Devices: ${devices.length}`, y); + y = render_text(app, 'fogs', `Fogs: ${fogs.length}`, y); +} + +function setup() { + let Application = PIXI.Application; + let Sprite = PIXI.Sprite; + let Assets = PIXI.Assets; + let Ticker = PIXI.Ticker; + + app = new Application({width: window.innerWidth, + height: window.innerHeight, + resolution: 1, + antialias:true}); + document.body.appendChild(app.view); + graphics = new PIXI.Graphics(); + app.stage.addChild(graphics); + + init_ui(app); + + const socket = new WebSocket(`ws://localhost:8681`); + socket.addEventListener('message', (event) => websocket_receive(event)); + + // Event Handlers + window.addEventListener("resize", function() { + resize(app); + }); + + document.addEventListener("wheel", (event) => { + let delta = event.deltaY/8*view_scale*0.001; + view_scale -= delta; + }); + + + document.addEventListener("keydown", (event) => { + handle_key(event); + }); + + + document.addEventListener("mousedown", (event) => { + if(handle_click(app, event)) { + dragging = true; + drag_start = {x: event.screenX, y: event.screenY}; + view_offset_drag_start = viewport_pos; + } + }); + + document.addEventListener("mouseup", (event) => { + dragging = false; + }); + + document.addEventListener("mouseleave", (event) => { + dragging = false; + }); + + document.addEventListener("mousemove", (event) => { + if(!dragging) + return; + + let current_delta = {x: drag_start.x - event.screenX, + y: drag_start.y - event.screenY}; + + viewport_pos = {x: view_offset_drag_start.x + current_delta.x/view_scale, + y: view_offset_drag_start.y + current_delta.y/view_scale}; + }); + + let shared_ticker = Ticker.shared; + shared_ticker.add((delta) => update(delta)); +} + +function handle_key(event) { + console.log(event); + if(event.key == 'h') { + hide_text = !hide_text; + } else if(event.key == 'l') { + show_lr_conn = !show_lr_conn; + } else if(event.key == 'c') { + show_conn = !show_conn; + } else if(event.key == 't') { + trail_mode++; + trail_mode = trail_mode % 4; + } +} + + +// returns true if its a drag event +function handle_click(app, event) { + for(var box of bounding_boxes) { + if(box.left < event.clientX && + event.clientX < box.right && + box.top < event.clientY && + event.clientY < box.bottom) { + + selected_node = box.node; + text_visible(app, 'selected_node', true); + text_visible(app, 'selected_node_long', true); + text_visible(app, 'selected_node_lat', true); + + return false; + } + } + if(selected_node) { + text_visible(app, 'selected_node', false); + text_visible(app, 'selected_node_long', false); + text_visible(app, 'selected_node_lat', false); + console.log("bro"); + } + selected_node = undefined; + + return true; +} + +let resizeTimer = undefined; +function resize(app) { + if(resizeTimer) { + clearTimeout(resizeTimer); + } + resizeTimer = setTimeout(()=>{ + app.renderer.resize(window.innerWidth, window.innerHeight); + resizeTimer = undefined; + },100); +} + +function websocket_receive(event) { + let pack = JSON.parse(event.data); + if (pack.type === 'event') { + handle_transport_event(pack.data); + } else if (pack.type === 'event-batch') { + for(var item of pack.data) { + handle_transport_event(item); + } + } else if (pack.type === 'state') { + handle_mqtt(pack.data); + } else if (pack.type === 'viewport') { + handle_viewport_update(pack.data); + } +} + +function handle_viewport_update(data) { + console.log(data); + viewport_pos = data; +} + +function handle_transport_event(data) { + remote_calls_observed++; + remote_calls_this_sec++; + + let task_id = data.task_id; + + var device = undefined; + var other = undefined + let sender = node_map.get(data.sender); + let receiver = node_map.get(data.receiver); + + if(sender == undefined || receiver == undefined) { + return; + } + + if(sender.data.mach_type == 'device') { + device = sender; + other = receiver + } + + if(receiver.data.mach_type == 'device') { + if(device) { + console.log("Invalid Thing????!?!?!?!"); + return; + } + device = receiver; + other = sender; + } + + if(device == undefined) + return; + + device.graphics.signals[other.data.node_id] = 1; +} + +function handle_mqtt(message) { + + if(!node_map.has(message.node_id)) { + switch(message.mach_type) { + case 'device': + devices.push(message.node_id); + break; + case 'fog': + fogs.push(message.node_id); + break; + } + + node_map.set(message.node_id, { + graphics: { + pos: { + x: message.loc_proj.x, + y: message.loc_proj.y + }, + locs: new Array(TRAIL_MAX), + loc_off: 0, + signals: {} + }, + data: message + }); + } + + let node = node_map.get(message.node_id); + + // Unfortunate hack for now... + if(node.data.loc_proj.x !== message.loc_proj.x || + node.data.loc_proj.y !== message.loc_proj.y){ + node.graphics.locs[node.graphics.loc_off % TRAIL_MAX] = node.data.loc_proj; + node.graphics.loc_off++; + } + + node.data = message; +} + +function transform_pos(pos) { + return {x: (pos.x - viewport_pos.x)*view_scale + window.innerWidth/2, + y: (pos.y - viewport_pos.y)*view_scale + window.innerHeight/2}; +// return {x: pos.x*view_scale+view_offset.x, +// y: pos.y*view_scale+view_offset.y}; +} + +function corner_from_center(pos, size) { + return {x: pos.x - size/2, + y: pos.y - size/2}; +} + +function center_of_square(pos, size) { + return {x: pos.x + size/2, + y: pos.y + size/2}; +} + +function lerp(v0, v1, a) { + return v0 + a * (v1 - v0); +} + +function lerp_colour(col1, col2, a) { + return {r: lerp(col1.r, col2.r, a), + g: lerp(col1.g, col2.g, a), + b: lerp(col1.b, col2.b, a)}; +} + +function get_past_loc(node, index) { + return node.graphics.locs[(node.graphics.loc_off+index) % TRAIL_MAX]; +} + +const rect_size = 20 + +function render_trace() { + // Trace Pass + + + let default_line_style = { + width: 5, + color: TRAIL_COLOUR + }; + let len = 0; + switch(trail_mode) { + case 1: + len = TRAIL_LEN1; + break; + case 2: + len = TRAIL_LEN2; + break; + case 3: + len = TRAIL_MAX; + break; + } + + + graphics.lineStyle(default_line_style); + +// let diff = TRAIL_MAX-len; + + for(var device of devices) { + var node = node_map.get(device); + for(var i = 0; i < len; i++) { + var loc = get_past_loc(node,i-len); // a bit of a hack + + if(i!=(len-1)) { + var next_loc = get_past_loc(node,i-len+1); + } else { + var next_loc = node.data.loc_proj; + } + + if(loc === undefined || next_loc === undefined) + continue; + + var pos = transform_pos(loc); + var next_pos = transform_pos(next_loc); + + graphics.moveTo(pos.x, pos.y); + graphics.lineTo(next_pos.x, next_pos.y); + + } + + } +} + +function render(delta) { + graphics.clear(); + + let default_line_colour = DEFAULT_LINE_COLOUR; + let default_line_style = { + width: 2, + color: default_line_colour + }; + + let signal_line_colour = SIGNAL_LINE_COLOUR; + + graphics.lineStyle(default_line_style); + var width = 2; + + // Connection Pass + for(var device of devices) { + var node = node_map.get(device); + var pos = transform_pos(node.graphics.pos); + + for(var node_id of node.data.connections) { + var conn_node = node_map.get(node_id); + if(conn_node == undefined) + continue; + + if(conn_node.data.local_registry) { + if(show_lr_conn) { + var reset = true; + default_line_colour = LR_LINE_COLOUR + signal_line_colour = LR_SIGNAL_LINE_COLOUR + graphics.lineStyle({ + width: 2, + color: default_line_colour + }); + } else { + continue; + } + } else if(!show_conn) { + // This might be a little weird as the reset never gets hit. + + // Im thinking that it shouldn't matter though + continue; + } + + if(conn_node == selected_node || + node == selected_node) { + var reset = true; + default_line_colour = SELECTED_LINE_COLOUR + signal_line_colour = SELECTED_SIGNAL_LINE_COLOUR + width = 3; + graphics.lineStyle({ + width: width, + color: default_line_colour + }) + } + + let signal = node.graphics.signals[node_id]; + if(signal) { + var reset = true; + graphics.lineStyle({ + width: width, + + color: lerp_colour(default_line_colour, signal_line_colour, Math.pow(signal, 0.5)) + }) + } + + var conn_pos = transform_pos(conn_node.graphics.pos); + + graphics.moveTo(pos.x, pos.y); + graphics.lineTo(conn_pos.x, conn_pos.y); + + if(reset) { + default_line_colour = DEFAULT_LINE_COLOUR; + signal_line_colour = SIGNAL_LINE_COLOUR; + graphics.lineStyle(default_line_style); + width = 2; + + } + } + } + + + if(trail_mode) + render_trace(); + + graphics.lineStyle({ + width: 0, + color: 0 + }); + + + // Local Registry Pass + graphics.beginFill(LR_COLOUR); + + for(var fog of fogs) { + var node = node_map.get(fog); + if(!node.data.local_registry) { + continue; + } + + let pos = corner_from_center(transform_pos(node.graphics.pos), rect_size); + + graphics.drawRect(pos.x-2, pos.y-2, rect_size+4, rect_size+4); + } + graphics.endFill(); + + // Fog Pass + graphics.beginFill(FOG_COLOUR); + for(var fog of fogs) { + var node = node_map.get(fog); + + let pos = corner_from_center(transform_pos(node.graphics.pos), rect_size); + + graphics.drawRect(pos.x, pos.y, rect_size, rect_size); + } + graphics.endFill(); + + // Device Pass + graphics.beginFill(DEVICE_COLOUR); + for(var device of devices) { + var node = node_map.get(device); + + let pos = corner_from_center(transform_pos(node.graphics.pos), rect_size); + + graphics.drawRect(pos.x, pos.y, rect_size, rect_size); + } + graphics.endFill(); + +} + +var last_sec = Date.now(); + +function update(delta) { + + if(last_sec + 1000 <= Date.now()) { + last_sec = Date.now(); + remote_calls_last_sec = remote_calls_this_sec; + remote_calls_this_sec = 0; + } + + var new_bounding_boxes = []; + + // Animate Location Changes + for(var node_entry of node_map) { + var node = node_entry[1]; + + var dx = node.data.loc_proj.x - node.graphics.pos.x; + var dy = node.data.loc_proj.y - node.graphics.pos.y; + + node.graphics.pos.x += dx * 0.25 * delta; + node.graphics.pos.y += dy * 0.25 * delta; + + var screen_pos = transform_pos(node.graphics.pos); + + new_bounding_boxes.push({ + node: node, + top: screen_pos.y-10, + bottom: screen_pos.y+10, + left: screen_pos.x-10, + right: screen_pos.x+10, + }); + + for(var signal_node_id in node.graphics.signals) { + node.graphics.signals[signal_node_id] -= 0.05 * delta; + if(node.graphics.signals[signal_node_id] <= 0) { + delete(node.graphics.signals[signal_node_id]); + } + } + } + bounding_boxes = new_bounding_boxes; +// console.log(bounding_boxes); + + update_ui(); + render(); +} + +setup(); diff --git a/tools/jrun b/tools/jrun new file mode 100755 index 000000000..367b06abd --- /dev/null +++ b/tools/jrun @@ -0,0 +1,388 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +# Edit the following locations to provide the +MOSQUITTO=`which mosquitto` +if [ -z $MOSQUITTO ]; then + MOSQUITTO=/usr/local/sbin/mosquitto +fi +MOSQUITTO_PUB=`which mosquitto_pub` +if [ -z $MOSQUITTO_PUB ]; then + MOSQUITTO_PUB=/usr/local/bin/mosquitto_pub +fi + + +# No need to edit below this line unless you find a bug! + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +jrun program.jxe +Runs only the J node of a device with program.jxe +under the application name 'testapp'. To run under a different +app name X, use the --app=X option. Use the --fog option to run at the +J node at the fog level or --cloud option to run at the cloud level. + +By default, jrun uses a Redis server running at 127.0.0.1:6379 as the +data store. The Redis server needs to be started before launching the +application. To use a different Redis server use the --data option like +the following command using a Redis at local port 7000. + +jrun program.jxe --data=127.0.0.1:7000 + +To provide a set of tags to the program, use the following command. +jrun program.jxe --tag="param1, param2" + +Usage: runj file.jxe [--app=appl_name] [--fog|--cloud] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--group=group_name] + +The jrun command creates a run state in the $HOME/__jamrun folder. +EOF +} + + +writegroup() { + + local port=$1 + local gname=$2 + + if [ ! -e $port ]; then + mkdir $port + fi + echo $gname > $port/group +} + +checkmosquitto() { + + # Check the required commands.. + if [ ! -e $MOSQUITTO ]; then + die "Mosquitto MQTT broker $MOSQUITTO not found. Set new location." + fi + if [ ! -e $MOSQUITTO_PUB ]; then + die "Mosquitto tools $MOSQUITTO_PUB not found. Set new location." + fi + if [ ! -e $TMUX ]; then + die "terminal multiplexor $TMUX not found. Set new location." + fi +} + +startmqtt() { + local port=$1 + + # Check whether the MQTT server is running.. if not start it + $MOSQUITTO_PUB -p $port -t "test" -m "hello" + if [ $? -ne 0 ]; then + echo "MQTT is not running at $port" + echo "Attempting to start MQTT at $port" + $MOSQUITTO -p $port & + fi +} + +startredis() { + + # Start redis with no protected-mode and at the port + echo -e "port $1\nprotected-mode no" | redis-server - & +} + +waitforredis() { + local port=$1 + + while : ; do + local present=`ps ax | grep redis-server | grep $port | wc -l` + if [ $present == "1" ]; then + break + fi + sleep 1 + done +} + + +resolvedocker() { + local name=$1 + + local host="${name%:*}" + local port="${name##*:}" + + startredis $port + waitforredis $port + + if [ $host == "docker" ]; then + local ipaddr=`hostname -I` + name=$ipaddr:$port + fi + # trim space left behind by hostname -I + data=$(echo $name | tr -d '[:space:]') +} + + +dojamout() { + dojamout_p1 $1 $2 $3 + dojamout_p2 $1 $2 $3 +} + + +dojamout_p1() { + local type=$1 + local pnum=$2 + local floc=$3 + + startmqtt $pnum + echo $data > $floc/$pnum/dataStore + echo "process" > $floc/$pnum/class + echo $SHELLPID > $floc/$pnum/shellpid + echo "new" > $floc/$pnum/processId +} + + + +dojamout_p2() { + local type=$1 + local pnum=$2 + local floc=$3 + + case $type in + cloud) + if [ -z "$tags" ]; then + node jamout.js --app=$app --cloud --port=$pnum --data=$data + else + node jamout.js --app=$app --cloud --port=$pnum --data=$data --tags=$tags + fi + ;; + fog) + if [ -z "$tags" ]; then + node jamout.js --app=$app --fog --port=$pnum --data=$data + else + node jamout.js --app=$app --fog --port=$pnum --data=$data --tags=$tags + fi + ;; + device) + if [ -z "$tags" ]; then + node jamout.js --app=$app --port=$pnum --data=$data + else + node jamout.js --app=$app --port=$pnum --data=$data --tags=$tags + fi + ;; + esac +} + + +# This is always scanning for a command with 'node' +portavailable() { + local folder=$1 + local port=$2 + + if [ -d $folder/$port ]; then + if [ -e $folder/$port/processId ]; then + local pid=`cat $folder/$port/processId` + if [ ! -z $pid ]; then + porttaken=`ps -p $pid | grep node | wc -l` + else + porttaken=0 + fi + else + porttaken=0 + fi + else + porttaken=0 + fi +} + +# Initialize all the option variables. +app=testapp +type=device +data=127.0.0.1:6379 +tags= +group="default" + +file=$1 +shift +fext="${file##*.}" + +if [ -z $file ] || [ $file = "-h" ]; then + show_usage + exit 1 +fi + +if [ "$fext" != "jxe" ]; then + die "Extension on $file is not .jxe" +fi + +# Check whether mosquitto tools are there +checkmosquitto + + +while :; do + case $1 in + -h|-\?|--help) + show_usage # Display a usage synopsis. + exit + ;; + -a|--app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + -t|--tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + -d|--data) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + data=$2 + shift + else + die 'ERROR: "--data" requires a non-empty option argument.' + fi + ;; + --data=?*) + data=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --data=) # Handle the case of an empty + die 'ERROR: "--data" requires a non-empty option argument.' + ;; + -g|--group) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + group=$2 + shift + else + die 'ERROR: "--group" requires a non-empty option argument.' + fi + ;; + --group=?*) + group=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --group=) # Handle the case of an empty + die 'ERROR: "--group" requires a non-empty option argument.' + ;; + -f|--fog) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="fog" + fi + ;; + -c|--cloud) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="cloud" + fi + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +echo "Don't use jrun and crun! Use jamrun instead of them." +echo "Exiting." +exit + +if [ "$type" != "device" ] && [ -n "$num" ]; then + die "number of devices can't be speciied for fog/cloud" +fi + + +resolvedocker $data + +if [ -e "$file" ]; then + + # Check whether the global .jamruns folder is there + jamfolder=$HOME"/.jamruns" + create_missingdir $jamfolder + + appfolder=$jamfolder/apps + create_missingdir $appfolder + + # Get the folder + filenoext="${file%.*}" + folder=$appfolder/$filenoext"_"$app + create_missingdir $folder + + # unzip the executable in the folder and run it.. + # We are unzipping the copying the files no matter what! + unzip -oq $file -d $folder + if [ $? -ne 0 ]; then + die "Problem reading file: $file" + fi + + cd $folder + + if [ -e jamout.js ]; then + # execute the program.. we are in the folder.. + case $type in + cloud) + iport=9883 + while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) + done + create_missingdir $folder/$iport + dojamout $type $iport $folder + ;; + fog) + iport=5883 + while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) + done + create_missingdir $folder/$iport + dojamout $type $iport $folder + ;; + device) + iport=1883 + while [ : ]; do + portavailable $folder $iport + [[ $porttaken == 1 ]] || break + ((iport++)) + done + create_missingdir $folder/$iport + writegroup $iport $group + dojamout $type $iport $folder + ;; + esac + else + die "Not a valid .jxe file" + fi + +else + die ".jxe file not found" +fi diff --git a/tools/testjs.js b/tools/testjs.js new file mode 100644 index 000000000..24c2bd4f7 --- /dev/null +++ b/tools/testjs.js @@ -0,0 +1,8 @@ + +process.on('message', function(x) { + console.log("received message ", x); +}); + +setInterval(()=> { + console.log("hi.."); +}, 100); diff --git a/tools/testsh.sh b/tools/testsh.sh new file mode 100755 index 000000000..88adbb6d8 --- /dev/null +++ b/tools/testsh.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +echo "hello..." +node /Users/maheswar/Programs/JAMScript/tools/testjs.js From d79da98b34dd703a6d67db235b509df97b1fe689 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Tue, 14 Jan 2025 01:03:25 +0000 Subject: [PATCH 107/126] Fixed JAMRun --- tools/djamrun | 5 +++-- tools/jt2.jxe | Bin 2417809 -> 0 bytes 2 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 tools/jt2.jxe diff --git a/tools/djamrun b/tools/djamrun index 8f53f837f..02ab1b296 100755 --- a/tools/djamrun +++ b/tools/djamrun @@ -564,10 +564,11 @@ if [ -e "$file" ]; then reuse_container $type $dockerid fi + docker exec $dockerSer mkdir /home/admin/temp docker cp $file $dockerSer:/home/admin/temp/`basename $file` - dojamrun $type $dockerid `basename $file` $num + dojamrun $type $dockerid /home/admin/temp/`basename $file` $num if [ -z $bg ] && [ $docktype == "new" ]; then - removedockermach + removedockermach fi else die "File: $file not found" diff --git a/tools/jt2.jxe b/tools/jt2.jxe deleted file mode 100644 index 94696d54a8fe7070c0288174b07e9679f8f8cb9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2417809 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 rnO|f8C#&^S7X@TDp%(LVm*)f0CgTP? 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�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¥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

    FS%3?Y&?eFl0HzImJFmZ42uU=fGNRZA= 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%0DQ< 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
    EKtk@{@ZOyuKYC!CLC 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 go@ZJCqV)SJ=L!iz9L#6@E}U^0*8}U57iD1o1^ Date: Wed, 15 Jan 2025 19:37:08 -0500 Subject: [PATCH 108/126] docker works --- tools/djam | 2 +- tools/djamlist | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ tools/djamrun | 3 ++- 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100755 tools/djamlist diff --git a/tools/djam b/tools/djam index ec47bd777..bdef6fc39 100755 --- a/tools/djam +++ b/tools/djam @@ -51,7 +51,7 @@ params=$@ case $jcmd in list) - jamlist $params + djamlist $params ;; build) djambuild $params diff --git a/tools/djamlist b/tools/djamlist new file mode 100755 index 000000000..3a0198654 --- /dev/null +++ b/tools/djamlist @@ -0,0 +1,50 @@ +#!/bin/bash + + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +A tool to display the active programs and their attributes. +Usage: djamlist + +djam list [--help] + +djam list [--all] + +djam list [--monitor] + +djam list [--remote] + +djam list [--type==fog] + +djam list [--dataStore==127.0.0.1:21883] + +djam list [--tmuxid==tg-25165] + +djam list [--port=3] + +djam list [--app==XX3] + +djam list [--prog==X] + + +This is the docker version of jamlist. + +EOF +} + +runjamist(){ + local didp=`docker ps | awk 'NR > 1 {print $1; exit}'` + echo $didp + docker exec -it $didp jamlist +} +runjamist + diff --git a/tools/djamrun b/tools/djamrun index 02ab1b296..5918574a6 100755 --- a/tools/djamrun +++ b/tools/djamrun @@ -1,5 +1,6 @@ #!/bin/bash + IDIR="${BASH_SOURCE%/*}" if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi #source "$IDIR/inc/pumba_tools.sh" @@ -568,7 +569,7 @@ if [ -e "$file" ]; then docker cp $file $dockerSer:/home/admin/temp/`basename $file` dojamrun $type $dockerid /home/admin/temp/`basename $file` $num if [ -z $bg ] && [ $docktype == "new" ]; then - removedockermach + removedockermach fi else die "File: $file not found" From 1d9a4a012ecade22a22c6efd1335652d2fd67c12 Mon Sep 17 00:00:00 2001 From: JeanKa25 Date: Thu, 16 Jan 2025 00:44:42 +0000 Subject: [PATCH 109/126] Added app-docker --- tools/app-docker.js | 196 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 tools/app-docker.js diff --git a/tools/app-docker.js b/tools/app-docker.js new file mode 100644 index 000000000..e41819f25 --- /dev/null +++ b/tools/app-docker.js @@ -0,0 +1,196 @@ +const express = require('express'); +const { exec } = require('child_process'); +const app = express(); + +const port = 3000; +const host = '0.0.0.0'; + +// Middleware to parse JSON requests +app.use(express.json()); + +// Define a simple route +app.get('/api', (req, res) => { + res.json({ message: 'Welcome to the API' }); +}); + +// Utility function to handle command execution and streaming response +function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { + console.log(`Executing command: ${command}`); + const childProcess = exec(command, { cwd }); + + // Set headers to keep the connection open for streaming + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + + // Stream stdout data to the client + childProcess.stdout.on('data', (data) => { + res.write(data); + }); + + // Stream stderr data to the client (for debugging or error messages) + childProcess.stderr.on('data', (data) => { + res.write(`Error: ${data}`); + }); + + // When the process completes, close the response + childProcess.on('close', (code) => { + res.end(`\nProcess completed with code ${code}`); + }); + + // Handle any execution errors + childProcess.on('error', (error) => { + res.end(`\nFailed to start process: ${error.message}`); + }); + + // If the client disconnects, terminate the child process + // req.on('close', () => { + // if (childProcess.exitCode === null) { // If process is still running + // console.log('Client disconnected, terminating process'); + // childProcess.kill(); // Terminate the process + // } + // }); +} + +// Define the /jamrun endpoint +app.post('/jamrun', (req, res) => { + const { + file = 'file.jxe', + app_name, + fog, + cloud, + device, + num, + data, + tags, + bg, + old, + log, + verb, + loc, + edge, + valgrind, + local, + remote, + } = req.body; + + if (!app_name) { + return res.status(400).json({ error: 'The "app_name" field is required.' }); + } + + let command = `zx jamrun.mjs ${file} --app=${app_name}`; + if (fog) command += ' --fog'; + if (cloud) command += ' --cloud'; + if (device) command += ' --device'; + if (num) command += ` --num=${num}`; + if (data) command += ` --data=${data}`; + if (tags) command += ` --tags="${tags}"`; + if (bg) command += ' --bg'; + if (old) command += ' --old'; + if (log) command += ' --log'; + if (verb) command += ' --verb'; + if (loc) command += ` --loc=${loc}`; + if (edge) command += ` --edge=${edge}`; + if (valgrind) command += ' --valgrind'; + if (local) command += ' --local'; + if (remote) command += ` --remote=${remote}`; + + executeCommand(req, res, command); +}); + +// Define the /jambatch endpoint +app.post('/jambatch', (req, res) => { + const { + fog, device, cloud, cFile, fFile, dFile, num, cLoc, fLoc, dLoc, cEdge, fEdge, dEdge + } = req.body; + + let command = `zx jambatch.mjs`; + if (fog) command += ` --fog=${fog}`; + if (device) command += ` --device=${device}`; + if (cloud) command += ` --cloud=${cloud}`; + if (cFile) command += ` --cFile=${cFile}`; + if (fFile) command += ` --fFile=${fFile}`; + if (dFile) command += ` --dFile=${dFile}`; + if (num) command += ` --num=${num}`; + if (cLoc) command += ` --cLoc=${cLoc}`; + if (fLoc) command += ` --fLoc=${fLoc}`; + if (dLoc) command += ` --dLoc=${dLoc}`; + if (cEdge) command += ` --cEdge=${cEdge}`; + if (fEdge) command += ` --fEdge=${fEdge}`; + if (dEdge) command += ` --dEdge=${dEdge}`; + + executeCommand(req, res, command); +}); + +// Define the /jamlog endpoint +app.post('/jamlog', (req, res) => { + const { help, program, app, port, remote, tail, c, j } = req.body; + + // Default command without arguments if none are specified + let command = `zx jamlog.mjs`; + if (help) command += ` --help`; + if (program) command += ` --program=${program}`; + if (app) command += ` --app=${app}`; + if (port) command += ` --port=${port}`; + if (remote) command += ` --remote=${remote}`; + if (tail) command += ` --tail=${tail}`; + + if (c) command += ` --c`; + if (j) command += ` --j`; + + executeCommand(req, res, command); + +}); + +app.post('/jamlist', (req, res) => { + const { help, all, monitor, type, dataStore, tmuxid, port, app, prog, remote } = req.body; + + // Default command without arguments if none are specified + let command = `zx jamlist.mjs`; + if (help) command += ` --help`; + if (all) command += ` --all`; + if (monitor) command += ` --monitor`; + if (type) command += ` --type==${type}`; + if (dataStore) command += ` --dataStore==${dataStore}`; + if (tmuxid) command += ` --tmuxid==${tmuxid}`; + if (port) command += ` --port==${port}`; + if (app) command += ` --app==${app}`; + if (prog) command += ` --prog==${prog}`; + if (remote) command += ` --remote`; + + executeCommand(req, res, command); +}); + +// Define the /jamkill endpoint +app.post('/jamkill', (req, res) => { + const { reset, all, remote, app, prog, port } = req.body; + + let command = 'zx jamkill.mjs'; + if (reset) command += ' --reset'; + if (all) command += ' --all'; + if (remote) command += ` --remote=${remote}`; + if (app) command += ` --app==${app}`; + if (prog) command += ` --prog==${prog}`; + if (port) command += ` --port==${port}`; + + executeCommand(req, res, command); +}); + +// Define the /jamterm endpoint +app.post("/jamterm", (req, res) => { + const { all, app, prog, port, pane } = req.body; + + let command = `zx jamterm.mjs`; + if (all) command += ' --all'; + if (app) command += ` --app==${app}`; + if (prog) command += ` --prog==${prog}`; + if (port) command += ` --port==${port}`; + if (pane) command += ` --pane=${pane}`; + + executeCommand(req, res, command); +}); + +// Start the server +app.listen(port, host, () => { + console.log(`Server is running on http://${host}:${port}`); +}); + From af97b299c5389ab099fc3be3afd176d4a5b73735 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:35:12 -0500 Subject: [PATCH 110/126] done app-docker --- tools/app-docker.js | 72 ++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/tools/app-docker.js b/tools/app-docker.js index e41819f25..7854d8ff8 100644 --- a/tools/app-docker.js +++ b/tools/app-docker.js @@ -5,6 +5,24 @@ const app = express(); const port = 3000; const host = '0.0.0.0'; + +/// TO UPDATE IN FUNCTION OF WHERE THE TOOLS ARE ON YOUR LOCAL COPY /// +let cwd = '/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/tools'; +const childProcessExport1 = exec('export JAM_HOME=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript', + {cwd} ); + +const childProcessExport2 = exec('export JAMHOME=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript', + {cwd}); +const childProcessExport3 = exec('export PATH=$JAM_HOME/tools:$PATH', + {cwd}); +const childProcessExport4 = exec('export JAMDATA=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/data', {cwd}); + + +const childProcess1 = exec('djam init --ideal', {cwd} ); +const childProcess2 = exec('djam pull mahes25/jamscript', {cwd}); +//////////////////////////////////////////////////////////////////////////// + + // Middleware to parse JSON requests app.use(express.json()); @@ -77,7 +95,7 @@ app.post('/jamrun', (req, res) => { return res.status(400).json({ error: 'The "app_name" field is required.' }); } - let command = `zx jamrun.mjs ${file} --app=${app_name}`; + let command = `djam run ${file} --app=${app_name}`; if (fog) command += ' --fog'; if (cloud) command += ' --cloud'; if (device) command += ' --device'; @@ -98,35 +116,35 @@ app.post('/jamrun', (req, res) => { }); // Define the /jambatch endpoint -app.post('/jambatch', (req, res) => { - const { - fog, device, cloud, cFile, fFile, dFile, num, cLoc, fLoc, dLoc, cEdge, fEdge, dEdge - } = req.body; - - let command = `zx jambatch.mjs`; - if (fog) command += ` --fog=${fog}`; - if (device) command += ` --device=${device}`; - if (cloud) command += ` --cloud=${cloud}`; - if (cFile) command += ` --cFile=${cFile}`; - if (fFile) command += ` --fFile=${fFile}`; - if (dFile) command += ` --dFile=${dFile}`; - if (num) command += ` --num=${num}`; - if (cLoc) command += ` --cLoc=${cLoc}`; - if (fLoc) command += ` --fLoc=${fLoc}`; - if (dLoc) command += ` --dLoc=${dLoc}`; - if (cEdge) command += ` --cEdge=${cEdge}`; - if (fEdge) command += ` --fEdge=${fEdge}`; - if (dEdge) command += ` --dEdge=${dEdge}`; - - executeCommand(req, res, command); -}); +// app.post('/jambatch', (req, res) => { +// const { +// fog, device, cloud, cFile, fFile, dFile, num, cLoc, fLoc, dLoc, cEdge, fEdge, dEdge +// } = req.body; + +// let command = `zx jambatch.mjs`; +// if (fog) command += ` --fog=${fog}`; +// if (device) command += ` --device=${device}`; +// if (cloud) command += ` --cloud=${cloud}`; +// if (cFile) command += ` --cFile=${cFile}`; +// if (fFile) command += ` --fFile=${fFile}`; +// if (dFile) command += ` --dFile=${dFile}`; +// if (num) command += ` --num=${num}`; +// if (cLoc) command += ` --cLoc=${cLoc}`; +// if (fLoc) command += ` --fLoc=${fLoc}`; +// if (dLoc) command += ` --dLoc=${dLoc}`; +// if (cEdge) command += ` --cEdge=${cEdge}`; +// if (fEdge) command += ` --fEdge=${fEdge}`; +// if (dEdge) command += ` --dEdge=${dEdge}`; + +// executeCommand(req, res, command); +// }); // Define the /jamlog endpoint app.post('/jamlog', (req, res) => { const { help, program, app, port, remote, tail, c, j } = req.body; // Default command without arguments if none are specified - let command = `zx jamlog.mjs`; + let command = `djam log`; if (help) command += ` --help`; if (program) command += ` --program=${program}`; if (app) command += ` --app=${app}`; @@ -145,7 +163,7 @@ app.post('/jamlist', (req, res) => { const { help, all, monitor, type, dataStore, tmuxid, port, app, prog, remote } = req.body; // Default command without arguments if none are specified - let command = `zx jamlist.mjs`; + let command = `djam list`; if (help) command += ` --help`; if (all) command += ` --all`; if (monitor) command += ` --monitor`; @@ -164,7 +182,7 @@ app.post('/jamlist', (req, res) => { app.post('/jamkill', (req, res) => { const { reset, all, remote, app, prog, port } = req.body; - let command = 'zx jamkill.mjs'; + let command = 'djam kill'; if (reset) command += ' --reset'; if (all) command += ' --all'; if (remote) command += ` --remote=${remote}`; @@ -179,7 +197,7 @@ app.post('/jamkill', (req, res) => { app.post("/jamterm", (req, res) => { const { all, app, prog, port, pane } = req.body; - let command = `zx jamterm.mjs`; + let command = `djam term`; if (all) command += ' --all'; if (app) command += ` --app==${app}`; if (prog) command += ` --prog==${prog}`; From fd1f17e287ca87081a29674ae785db89dbcbcb47 Mon Sep 17 00:00:00 2001 From: andrei-sandor <97865484+andrei-sandor@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:26:13 -0500 Subject: [PATCH 111/126] Finish djam server --- tools/app-docker.js | 5 ++--- tools/djamlist | 2 +- tools/djamlog | 8 ++++---- tools/djamrun | 12 ++++++------ tools/djamterm | 2 +- tools/jamkill | 4 ++-- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/tools/app-docker.js b/tools/app-docker.js index 7854d8ff8..e1e1839ad 100644 --- a/tools/app-docker.js +++ b/tools/app-docker.js @@ -17,7 +17,6 @@ const childProcessExport3 = exec('export PATH=$JAM_HOME/tools:$PATH', {cwd}); const childProcessExport4 = exec('export JAMDATA=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/data', {cwd}); - const childProcess1 = exec('djam init --ideal', {cwd} ); const childProcess2 = exec('djam pull mahes25/jamscript', {cwd}); //////////////////////////////////////////////////////////////////////////// @@ -31,8 +30,8 @@ app.get('/api', (req, res) => { res.json({ message: 'Welcome to the API' }); }); -// Utility function to handle command execution and streaming response -function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { +// Utility function to handle command execution and streaming response. **** UPDATE CWD **** +function executeCommand(req, res, command, cwd = '/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/tools') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); diff --git a/tools/djamlist b/tools/djamlist index 3a0198654..8ba86718f 100755 --- a/tools/djamlist +++ b/tools/djamlist @@ -44,7 +44,7 @@ EOF runjamist(){ local didp=`docker ps | awk 'NR > 1 {print $1; exit}'` echo $didp - docker exec -it $didp jamlist + docker exec -t $didp jamlist } runjamist diff --git a/tools/djamlog b/tools/djamlog index ea9cec85b..ddeb6fe08 100755 --- a/tools/djamlog +++ b/tools/djamlog @@ -123,15 +123,15 @@ if [ -e $appsfolder/$lprogram"_"$lapp ]; then runon=`cat $dir/dockerId` if [ -z $app ] && [ -z $program ]; then if [ -z $j ]; then - docker exec -it $runon jamlog + docker exec -t $runon jamlog else - docker exec -it $runon jamlog --j + docker exec -t $runon jamlog --j fi else if [ -z $j ]; then - docker exec -it $runon jamlog --program=$program --app=$app + docker exec -t $runon jamlog --program=$program --app=$app else - docker exec -it $runon jamlog --program=$program --app=$app --j + docker exec -t $runon jamlog --program=$program --app=$app --j fi fi fi diff --git a/tools/djamrun b/tools/djamrun index 5918574a6..56819222b 100755 --- a/tools/djamrun +++ b/tools/djamrun @@ -76,10 +76,10 @@ runatcloud() { if [ -z $bg ]; then echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results else echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results fi } @@ -101,10 +101,10 @@ runatfog() { if [ -z $bg ]; then echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results else echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results fi } @@ -132,10 +132,10 @@ runatdevice() { buildjargs $argstr if [ -z $bg ]; then echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results else echo $dockid"-j" > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results fi echo ">>> Device started in container $dockid" } diff --git a/tools/djamterm b/tools/djamterm index d055fba66..565de0a5c 100755 --- a/tools/djamterm +++ b/tools/djamterm @@ -79,7 +79,7 @@ dockertmux() { if [ -e $dir/tmuxid_c ]; then local dtm=`cat $dir/tmuxid_c | tr -d '[:space:]'` if [ $dtm == $tmuxapp ]; then - docker exec -ti `cat $dir/dockerId` script -q -c "/usr/bin/tmux attach -t $tmuxapp-$termno" /dev/null + docker exec -t `cat $dir/dockerId` script -q -c "/usr/bin/tmux attach -t $tmuxapp-$termno" /dev/null break fi fi diff --git a/tools/jamkill b/tools/jamkill index b85b2f02e..221aa4c49 100755 --- a/tools/jamkill +++ b/tools/jamkill @@ -79,9 +79,9 @@ killprocess() { local didp=`cat $1/dockerId` local present=`docker ps --filter id=$didp | grep $didp | wc -l | tr -d '[:space:]'` if [ $present == "1" ]; then - docker exec -it $didp jamkill `cat $1/appid` + docker exec -t $didp jamkill `cat $1/appid` echo "-" > $1/dockerId - local count=`docker exec -it $didp jamlist | wc -l | tr -d '[:space:]'` + local count=`docker exec -t $didp jamlist | wc -l | tr -d '[:space:]'` if (( $count <= 2 )); then echo "Killing docker $didp" docker kill $didp From d7ab1268c62247d60b09374a63d353d401fc664a Mon Sep 17 00:00:00 2001 From: Jean Kaznji Date: Mon, 20 Jan 2025 23:47:58 +0000 Subject: [PATCH 112/126] ansible setup script --- tools/setup_jamscript.yml | 105 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 tools/setup_jamscript.yml diff --git a/tools/setup_jamscript.yml b/tools/setup_jamscript.yml new file mode 100644 index 000000000..8fb97b94b --- /dev/null +++ b/tools/setup_jamscript.yml @@ -0,0 +1,105 @@ +--- +- name: Setup JAMScript tools and run Node.js server + hosts: all + become: true + tasks: + # Update and install basic dependencies + - name: Update and upgrade the system + apt: + update_cache: yes + upgrade: dist + cache_valid_time: 3600 + + - name: Install basic dependencies + apt: + name: + - build-essential + - curl + - git + - wget + - unzip + - python3 + - python3-pip + state: present + + # Install Node.js and npm + - name: Add NodeSource repository + shell: curl -fsSL https://deb.nodesource.com/setup_18.x | bash - + args: + executable: /bin/bash + + - name: Install Node.js + apt: + name: nodejs + state: present + + - name: Verify Node.js and npm installation + shell: | + node -v + npm -v + + # Install PM2 for process management + - name: Install PM2 globally + npm: + name: pm2 + global: yes + + # Install zx for script execution + - name: Install zx globally + npm: + name: zx + global: yes + + # Install Mosquitto MQTT Broker + - name: Install Mosquitto MQTT Broker + apt: + name: + - mosquitto + - mosquitto-clients + state: present + + - name: Enable and start Mosquitto service + service: + name: mosquitto + enabled: yes + state: started + + # Clone the JAMScript repository + - name: Clone JAMScript repository + git: + repo: https://github.com/JeanKa25/JAMScript.git + dest: /root/JAMScript + version: docker_implementation + + # Run install.sh script + - name: Run install.sh script + shell: sudo ./install.sh + args: + chdir: /root/JAMScript + + # Run npm install + - name: Run npm install + npm: + path: /root/JAMScript + state: present + + # Ensure permissions for required files + - name: Ensure all .mjs files have execute permissions + file: + path: /root/JAMScript/tools + recurse: yes + state: directory + mode: '0755' + + - name: Ensure jt1.jxe has execute permissions + file: + path: /root/JAMScript/tools/jt1.jxe + state: file + mode: '0755' + + # Run the Node.js server + - name: Start Node.js server + shell: node /root/JAMScript/tools/app.js & + args: + executable: /bin/bash + From 5eab45fdfcd9deab5eaa4a30990b8a429b03d400 Mon Sep 17 00:00:00 2001 From: Jean Kaznji <57154931+JeanKa25@users.noreply.github.com> Date: Tue, 21 Jan 2025 23:42:28 -0500 Subject: [PATCH 113/126] Update app.js path --- tools/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/app.js b/tools/app.js index e41819f25..df0e67247 100644 --- a/tools/app.js +++ b/tools/app.js @@ -14,7 +14,7 @@ app.get('/api', (req, res) => { }); // Utility function to handle command execution and streaming response -function executeCommand(req, res, command, cwd = '/root/capstone/JAMScript/tools/') { +function executeCommand(req, res, command, cwd = '/root/JAMScript/tools/') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); From 0c9187357be40804170ba14047587e2b5301be86 Mon Sep 17 00:00:00 2001 From: Jean Kaznji Date: Wed, 22 Jan 2025 05:04:55 +0000 Subject: [PATCH 114/126] Fixed Ansible --- tools/inventory.ini | 3 +++ tools/setup_jamscript.yml | 38 ++++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 tools/inventory.ini diff --git a/tools/inventory.ini b/tools/inventory.ini new file mode 100644 index 000000000..0315f9f94 --- /dev/null +++ b/tools/inventory.ini @@ -0,0 +1,3 @@ +[all] +45.33.96.28 ansible_user=root + diff --git a/tools/setup_jamscript.yml b/tools/setup_jamscript.yml index 8fb97b94b..c19857ce6 100644 --- a/tools/setup_jamscript.yml +++ b/tools/setup_jamscript.yml @@ -12,7 +12,7 @@ - name: Install basic dependencies apt: - name: + name: - build-essential - curl - git @@ -22,6 +22,25 @@ - python3-pip state: present + # Install Docker + - name: Install Docker + apt: + name: + - docker.io + state: present + + - name: Enable and start Docker service + service: + name: docker + enabled: yes + state: started + + - name: Add user to the Docker group + user: + name: "{{ ansible_user }}" + groups: docker + append: yes + # Install Node.js and npm - name: Add NodeSource repository shell: curl -fsSL https://deb.nodesource.com/setup_18.x | bash - @@ -38,12 +57,6 @@ node -v npm -v - # Install PM2 for process management - - name: Install PM2 globally - npm: - name: pm2 - global: yes - # Install zx for script execution - name: Install zx globally npm: @@ -53,7 +66,7 @@ # Install Mosquitto MQTT Broker - name: Install Mosquitto MQTT Broker apt: - name: + name: - mosquitto - mosquitto-clients state: present @@ -69,7 +82,8 @@ git: repo: https://github.com/JeanKa25/JAMScript.git dest: /root/JAMScript - version: docker_implementation + version: ansible-setup + recursive: no # Run install.sh script - name: Run install.sh script @@ -97,9 +111,9 @@ state: file mode: '0755' - # Run the Node.js server - - name: Start Node.js server - shell: node /root/JAMScript/tools/app.js & + # Start the Node.js server using node + - name: Start the Node.js server in the background + shell: nohup node /root/JAMScript/tools/app.js > /root/JAMScript/server.log 2>&1 & args: executable: /bin/bash From 9123a5861b598bce9dbabedeea3f8e06c8f0ddc8 Mon Sep 17 00:00:00 2001 From: Woojin Date: Sun, 2 Mar 2025 13:02:57 -0500 Subject: [PATCH 115/126] djamrun djamterm(partially done) and playbook commits --- package.json | 3 +- scripts/install/Dockerfile | 4 +- tools/app-docker.js | 62 ++-- tools/app.js | 2 +- tools/djam | 2 +- tools/djambatch | 583 ++++++++++++++++++++++++++++++++++++ tools/djamkill | 86 ++++++ tools/djamlist | 58 +++- tools/djamrun | 20 +- tools/djamterm | 38 ++- tools/inventory.ini | 8 +- tools/jambatch-playbook.yml | 13 + tools/jamkill-playbook.mjs | 13 + tools/jamkill-playbook.yml | 13 + tools/jamkill.yml | 13 + tools/jamlist-playbook.yml | 13 + tools/jamlist.yml | 13 + tools/jamlog.yml | 13 + tools/jamrun-playbook.yml | 29 ++ tools/jamrun.yml | 24 ++ tools/jamterm-playbook.yml | 30 ++ tools/jamterm.yml | 13 + tools/wrapper.mjs | 76 ++++- 23 files changed, 1037 insertions(+), 92 deletions(-) create mode 100755 tools/djambatch create mode 100755 tools/djamkill create mode 100644 tools/jambatch-playbook.yml create mode 100644 tools/jamkill-playbook.mjs create mode 100644 tools/jamkill-playbook.yml create mode 100644 tools/jamkill.yml create mode 100644 tools/jamlist-playbook.yml create mode 100644 tools/jamlist.yml create mode 100644 tools/jamlog.yml create mode 100644 tools/jamrun-playbook.yml create mode 100644 tools/jamrun.yml create mode 100644 tools/jamterm-playbook.yml create mode 100644 tools/jamterm.yml diff --git a/package.json b/package.json index 35f7b00e8..e8e4669a3 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "lodash": "^4.17.21", "mercator-projection": "^0.0.2", "mqtt": "=4.3.7", + "node-fetch": "^3.3.2", "node-localstorage": ">= 1.3.0", "node-ssh": "^13.1.0", "ohm-js": "^17.1.0", @@ -42,7 +43,7 @@ "redis": "^2.8.0", "toml": "3.0.0", "ws": "^8.13.0", - "zx": "^8.0.2" + "zx": "^8.3.0" }, "engines": { "node": ">= 12.22", diff --git a/scripts/install/Dockerfile b/scripts/install/Dockerfile index c7bc87ad1..3eb17d486 100644 --- a/scripts/install/Dockerfile +++ b/scripts/install/Dockerfile @@ -41,7 +41,8 @@ WORKDIR /home/admin RUN wget https://deb.nodesource.com/setup_20.x && chmod +x ./setup_20.x && echo admin | sudo -S ./setup_20.x && \ sudo apt-get install -y -q nodejs - RUN git clone --branch shahin/migration https://github.com/citelab/JAMScript +RUN git clone --branch master https://github.com/JeanKa25/JAMScript && cd JAMScript/tools && chmod 777 * + WORKDIR /home/admin/JAMScript/deps RUN git clone https://github.com/intel/tinycbor @@ -78,4 +79,3 @@ EXPOSE 22 # Start SSH service and keep the container running ENTRYPOINT ["bash", "-c", "sudo service ssh start && exec bash"] - diff --git a/tools/app-docker.js b/tools/app-docker.js index e1e1839ad..e7d49f406 100644 --- a/tools/app-docker.js +++ b/tools/app-docker.js @@ -7,18 +7,18 @@ const host = '0.0.0.0'; /// TO UPDATE IN FUNCTION OF WHERE THE TOOLS ARE ON YOUR LOCAL COPY /// -let cwd = '/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/tools'; -const childProcessExport1 = exec('export JAM_HOME=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript', +let cwd = '/home/jamtools/JAMScript/tools'; +const childProcessExport1 = exec('export JAM_HOME=/home/jamtools/JAMScript/', {cwd} ); -const childProcessExport2 = exec('export JAMHOME=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript', +const childProcessExport2 = exec('export JAMHOME=/home/jamtools/JAMScript/', {cwd}); -const childProcessExport3 = exec('export PATH=$JAM_HOME/tools:$PATH', +const childProcessExport3 = exec('export PATH=$JAM_HOME/tools:$PATH', {cwd}); -const childProcessExport4 = exec('export JAMDATA=/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/data', {cwd}); +const childProcessExport4 = exec('export JAMDATA=/home/jamtools/JAMScript/data', {cwd}); const childProcess1 = exec('djam init --ideal', {cwd} ); -const childProcess2 = exec('djam pull mahes25/jamscript', {cwd}); +const childProcess2 = exec('echo test', {cwd}); //////////////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ app.get('/api', (req, res) => { }); // Utility function to handle command execution and streaming response. **** UPDATE CWD **** -function executeCommand(req, res, command, cwd = '/Users/andreisandor/Desktop/McGill/Capstone/newServer/JAMScript/tools') { +function executeCommand(req, res, command, cwd = '/home/jamtools/JAMScript/tools') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); @@ -115,28 +115,15 @@ app.post('/jamrun', (req, res) => { }); // Define the /jambatch endpoint -// app.post('/jambatch', (req, res) => { -// const { -// fog, device, cloud, cFile, fFile, dFile, num, cLoc, fLoc, dLoc, cEdge, fEdge, dEdge -// } = req.body; - -// let command = `zx jambatch.mjs`; -// if (fog) command += ` --fog=${fog}`; -// if (device) command += ` --device=${device}`; -// if (cloud) command += ` --cloud=${cloud}`; -// if (cFile) command += ` --cFile=${cFile}`; -// if (fFile) command += ` --fFile=${fFile}`; -// if (dFile) command += ` --dFile=${dFile}`; -// if (num) command += ` --num=${num}`; -// if (cLoc) command += ` --cLoc=${cLoc}`; -// if (fLoc) command += ` --fLoc=${fLoc}`; -// if (dLoc) command += ` --dLoc=${dLoc}`; -// if (cEdge) command += ` --cEdge=${cEdge}`; -// if (fEdge) command += ` --fEdge=${fEdge}`; -// if (dEdge) command += ` --dEdge=${dEdge}`; - -// executeCommand(req, res, command); -// }); + app.post('/jambatch', (req, res) => { + const { + file = 'jt1.jxe', device_num,app + } = req.body; + + let command = `djambatch ${file} --device_num=${device_num} --app=${app} --bg `; + + executeCommand(req, res, command); + }); // Define the /jamlog endpoint app.post('/jamlog', (req, res) => { @@ -155,7 +142,7 @@ app.post('/jamlog', (req, res) => { if (j) command += ` --j`; executeCommand(req, res, command); - + }); app.post('/jamlist', (req, res) => { @@ -193,15 +180,15 @@ app.post('/jamkill', (req, res) => { }); // Define the /jamterm endpoint -app.post("/jamterm", (req, res) => { - const { all, app, prog, port, pane } = req.body; +app.post('/jamterm', (req, res) => { + const { tmux_id, terminal_number } = req.body; + console.log (req.body) let command = `djam term`; - if (all) command += ' --all'; - if (app) command += ` --app==${app}`; - if (prog) command += ` --prog==${prog}`; - if (port) command += ` --port==${port}`; - if (pane) command += ` --pane=${pane}`; + console.log(`tmux_id entered : ${tmux_id}`) + if (tmux_id) command += ` ${tmux_id}`; + console.log(`terminal_number entered : ${terminal_number}`) + if (terminal_number) command += ` -t ${terminal_number}`; executeCommand(req, res, command); }); @@ -210,4 +197,3 @@ app.post("/jamterm", (req, res) => { app.listen(port, host, () => { console.log(`Server is running on http://${host}:${port}`); }); - diff --git a/tools/app.js b/tools/app.js index df0e67247..ba80c8476 100644 --- a/tools/app.js +++ b/tools/app.js @@ -14,7 +14,7 @@ app.get('/api', (req, res) => { }); // Utility function to handle command execution and streaming response -function executeCommand(req, res, command, cwd = '/root/JAMScript/tools/') { +function executeCommand(req, res, command, cwd = '/home/jamtools/JAMScript/tools/') { console.log(`Executing command: ${command}`); const childProcess = exec(command, { cwd }); diff --git a/tools/djam b/tools/djam index bdef6fc39..7a82e4081 100755 --- a/tools/djam +++ b/tools/djam @@ -66,7 +66,7 @@ case $jcmd in djamtest $params ;; kill) - jamkill $params + djamkill $params ;; clean) jamclean $params diff --git a/tools/djambatch b/tools/djambatch new file mode 100755 index 000000000..b655905d2 --- /dev/null +++ b/tools/djambatch @@ -0,0 +1,583 @@ +#!/bin/bash + + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +#source "$IDIR/inc/pumba_tools.sh" +source "$IDIR/inc/mach_tools.sh" +source "$IDIR/inc/misc_tools.sh" +source "$IDIR/inc/docker_tools.sh" + + + +show_usage() { + cat << EOF +Runs the JAMScript executable (.jxe) in a Docker container. + +djamrun program.jxe +Runs J and C node, one each, of a device with program.jxe +under the application name 'app-N'. To run under a different +app name X, use the --app=X option. + +djamrun program.jxe --fog +Runs a fog node (only J node) with program.jxe. Similarly, the --cloud +flag runs a cloud node. + +By default, jamrun uses a Redis server running at 127.0.0.1:6379 as the +data store. The Redis server needs to be started before launching the +application. To use a different Redis server use the --data option. + +djamrun program.jxe --data=127.0.0.1:7000 +Runs program.jxe and connects it to an already running Redis server at +port 7000 of the local host. Redis server can run outside the +local host (Redis needs to the configured to accept outside +connections). + +To start more than one C node at a device use the following command. +djamrun program.jxe --num=4 + +To provide a set of tags to the program, use the following command. +djamrun program.jxe --tags="param1, param2" + +Use the --bg option to run a command in the backgroud. + +Usage: djamrun file.jxe [--app=appl_name] [--fog|--cloud] [--num=num_c_devs] + [--data=data-url] + [--tags=quoted_list_of_tags] + [--bg] + [--runon=container_to_run] + [--log] + [--loc] + [--link=random|near|best] + [--publish=dport:hport] + + +The djamrun command creates a run state in the $HOME/__jamrun folder. +EOF +} + + + +# runatcloud $dockid $file $jappid $data $tags +runatcloud() { + local dockid=$1 + local file=$2 + local appid=$3 + local data=$4 + local tags=$5 + + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + if [ ! -z $log ]; then + argstr="$argstr --log" + fi + + buildjargs $argstr + + if [ -z $bg ]; then + echo "-" > $thisappfolder/$dockid/tmuxid + docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + else + echo $dockid > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + fi + +} + +# runatfog $dockid $file $jappid $data $tags +runatfog() { + local dockid=$1 + local file=$2 + local appid=$3 + local data=$4 + local tags=$5 + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + if [ ! -z $log ]; then + argstr="$argstr --log" + fi + + buildjargs $argstr + + if [ -z $bg ]; then + echo "-" > $thisappfolder/$dockid/tmuxid + docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + else + echo $dockid > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + fi + +} + +# runatdevice $dockid $file $jappid $data $num $tags +runatdevice() { + local dockid=$1 + local file=$2 + local appid=$3 + local data=$4 + local num=$5 + local tags=$6 + + echo $num > $thisappfolder/$dockid/cdevs + echo "$dockid-c" > $thisappfolder/$dockid/tmuxid_c + + # save for short cut use + echo "$dockid-c" > $appfolder/tmuxid + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + if [ ! -z $log ]; then + argstr="$argstr --log" + fi + + buildjargs $argstr + if [ -z $bg ]; then + echo "-" > $thisappfolder/$dockid/tmuxid + docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + else + echo $dockid"-j" > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + fi + echo ">>> Device started in container $dockid" +} + + +dojamrun() { + local type=$1 + local dockid=$2 + local file=$3 + local num=$4 + + save $type $thisappfolder/$dockid/machType + save $data $thisappfolder/$dockid/dataStore + save $dockerSer $thisappfolder/$dockid/dockerId + save "docker" $thisappfolder/$dockid/class + + case $type in + cloud) + runatcloud $dockid $file $jappid $data $tags + ;; + fog) + runatfog $dockid $file $jappid $data $tags + ;; + device) + runatdevice $dockid $file $jappid $data $num $tags + ;; + esac +} + + +# we generate a new app-XX only if the +# input is app-n, otherwise the jappid (output) is +# the input argument ($1) +getappid() { + local appid=$1 + local docki=$2 + + inc_counter $jamfolder/counter + count=$result + + if [ $appid == "app-n" ]; then + save_no_overwrite "app-"$count $thisappfolder/$docki/appid + else + save $appid $thisappfolder/$docki/appid + fi + + jappid=`cat $thisappfolder/$docki/appid` + + # save for short cut use + save "$jappid" $appfolder/appid +} + + +getdockerid() { + local rundock=$1 + + inc_counter $jamfolder/counter + local count=$result + dockerid="u-"$UID"-${type:0:3}-"$count + + if [ -z $rundock ] || [ `docker ps --filter id=$rundock | grep $rundock | wc -l | tr -d '[:space:]'` == "0" ]; then + result="new" + else + dockerSer=$rundock + result="old" + fi + +} + + +make_container() { + local type=$1 + local contname=$2 + + create_missingdir $jamfolder/$type + create_missingdir $jamfolder/$type/$contname + + if [ $type == "cloud" ]; then + startglobalmach $contname jamnet `cat $jamfolder/network` $dport $hport +# restartcloudpumba $contname + else + exit_missingfile $jamfolder/zones/count + local zcount=`cat $jamfolder/zones/count` + if [ -z $zcount ]; then + die "Zone count is undefined.. run djaminit again." + fi + local zone=$(( 1 + $RANDOM % $zcount )) + + startzonemach $zone $contname jamnet `cat $jamfolder/network` $dport $hport +# if [ $type == "fog" ]; then +# restartfogpumba $contname +# fi + fi + + save $result $jamfolder/$type/$contname/dockerId + save "1" $jamfolder/$type/$contname/refCount +} + +reuse_container() { + local type=$1 + local contname=$2 + + create_missingdir $jamfolder/$type + create_missingdir $jamfolder/$type/$contname + + inc_counter $jamfolder/$type/$contname/refCount +} + +createzonerouters() { + exit_missingfile $jamfolder/zones/count + + local zcount=`cat $jamfolder/zones/count` + + for i in `seq 1 $zcount`; do + startzonerouter $i "u-$UID-router-$i" jamnet `cat $jamfolder/network` +# restartrouterpumba "u-$UID-router-$i" + done +} + + +killdocker() { + local dock_id=$1 + + if [ -e $jamfolder/$type/$dock_id ]; then + dec_counter $jamfolder/$type/$dock_id/refCount + if [ $result == 0 ]; then + docker kill `cat $jamfolder/$type/$dock_id/dockerId` + docker rm $dock_id + fi + fi +} + + +removetmux() { + local tmid=$1 + + tmux has-session -t $tmid 2>/dev/null + local res=$? + if [ $res == "0" ]; then + tmux kill-session -t $tmid + fi +} + +removedockermach() { + + local tmid=`cat $thisappfolder/$dockerid/tmuxid` + removetmux $tmid + + if [ -e $thisappfolder/$dockerid/cdevs ]; then + local num=`cat $thisappfolder/$dockerid/cdevs` + for i in `seq 1 $num`; do + removetmux $tmid"-"$i + done + fi + + killdocker $dockerid + +} + + +processjxe() { + result="ok" +} + + +getportinfo() { + local pinfo=$1 + + dport="${pinfo%:*}" + hport="${pinfo##*:}" +} + + + +# Initialize all the option variables. +app=app-n +type=device +data=docker:6379 +tags= +num=1 +bg= +log= +runon= +link= +loc= +dport= +hport= +mount= + +file=$1 +shift +fext="${file##*.}" + +if [ -z $file ] || [ $file = "-h" ] || [ $file = "--help" ]; then + show_usage + exit 1 +fi + +if [ "$fext" != "jxe" ]; then + die "Extension on $file is not .jxe" +fi + + +while :; do + case $1 in + --help) + show_usage # Display a usage synopsis. + exit + ;; + --device_num=*) + device_num="${1#*=}" + shift + ;; + --app) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + app=$2 + shift + else + die 'ERROR: "--app" requires a non-empty option argument.' + fi + ;; + --app=?*) + app=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --app=) # Handle the case of an empty + die 'ERROR: "--app" requires a non-empty option argument.' + ;; + --runon) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + runon=$2 + shift + else + die 'ERROR: "--runon" requires a non-empty option argument.' + fi + ;; + --runon=?*) + runon=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --runon=) # Handle the case of an empty + die 'ERROR: "--runon" requires a non-empty option argument.' + ;; + --tags) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + tags=$2 + shift + else + die 'ERROR: "--tags" requires a non-empty option argument.' + fi + ;; + --tags=?*) + tags=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --tags=) # Handle the case of an empty + die 'ERROR: "--tags" requires a non-empty option argument.' + ;; + --num) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + num=$2 + shift + else + die 'ERROR: "--num" requires a non-empty option argument.' + fi + ;; + --num=?*) + num=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --num=) # Handle the case of an empty + die 'ERROR: "--num" requires a non-empty option argument.' + ;; + --data) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + data=$2 + shift + else + die 'ERROR: "--data" requires a non-empty option argument.' + fi + ;; + --data=?*) + data=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --data=) # Handle the case of an empty + die 'ERROR: "--data" requires a non-empty option argument.' + ;; + --loc) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + loc=$2 + shift + else + die 'ERROR: "--loc" requires longitude and lattitude specification' + fi + ;; + --loc=?*) + loc=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --loc=) # Handle the case of an empty + die 'ERROR: "--loc" requires longitude and lattitude specification' + ;; + --link) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + link=$2 + shift + else + die 'ERROR: "--link" requires a non-empty option argument.' + fi + ;; + --link=?*) + link=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + --link=) # Handle the case of an empty + die 'ERROR: "--link" requires a non-empty option argument.' + ;; + --publish) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + getportinfo $2 + shift + else + die 'ERROR: "--publish" requires docker and port information' + fi + ;; + --publish=?*) + publish=${1#*=} # Delete everything up to "=" and assign the remainder. + getlonglat $publish + ;; + --publish=) # Handle the case of an empty + die 'ERROR: "--publish" requires docker and port information' + ;; + --fog) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="fog" + num= + fi + ;; + --cloud) + if [ "$type" != "device" ]; then + die 'ERROR: "type" cannot be reassigned.' + else + type="cloud" + num= + fi + ;; + --log) + log=1 + ;; + --bg) + bg=1 + ;; + --mount) + mount=1 + ;; + --) # End of all options. + shift + break + ;; + -?*) + printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 + ;; + *) # Default case: No more options, so break out of the loop. + break + esac + + shift +done + +# Check necessary parameters and set defaults + +if [ "$type" != "device" ] && [ -n "$num" ]; then + die "number of devices can't be speciied for fog/cloud" +fi + +if [ ! -z $mount ]; then + if [ -z ${JAMDATA} ]; then + echo "JAMDATA is not set. Set JAMDATA to the directory containing the datasets" + exit 1 + fi +fi + +# If docker is not installed, we fail here +check_prog docker "Docker not installed. Exiting." +#check_prog pumba "Pumba not installed. Download it from https://github.com/gaia-adm/pumba/releases" +check_prog tmux "tmux not installed. Exiting." + +# Check whether the global .jamruns folder is there +jamfolder=$HOME"/.jamruns" +exit_missingdir $jamfolder "__jamdir directory not found. Run djam pull first. " +exit_missingdir $jamfolder/zones "zones not setup. Run djam init first" +exit_missingfile $jamfolder/dockerImage "DockerImage not setup. Run djam pull first." + +#pumbastatus=`cat $jamfolder/pumba/status` + +appfolder=$jamfolder/apps +create_missingdir $appfolder + +if [ -e "$file" ]; then + + # Get the folder + filenoext="${file%.*}" + thisappfolder=$appfolder"/"$filenoext"_"$app + create_missingdir $thisappfolder + + # save for short cut use + save "$filenoext" $appfolder/program + save "$app" $appfolder/app + + # process the .jxe file + file=`pwd`/$file + processjxe $file + if [ $result != "ok" ]; then + die "Problem with JAMScript executable" + fi + + + dockerImage=`cat $jamfolder/dockerImage` + createzonerouters + createnetwork jamnet 10 $jamfolder + # cd into the $thisappfolder + cd $thisappfolder + + getdockerid $runon + docktype=$result + + create_missingdir $thisappfolder/$dockerid + getappid $app $dockerid + + if [ $docktype == "new" ]; then + # We are also putting resources such as redis on the container + make_container $type $dockerid + else + # Automatically inherit the redis.. no checking?? + reuse_container $type $dockerid + fi + docker exec $dockerSer mkdir /home/admin/temp + docker cp $file $dockerSer:/home/admin/temp/`basename $file` + + for ((i=1; i<=device_num; i++)); do + docker exec -t $dockerid jamrun /home/admin/temp/`basename $file` --bg $num + done + + if [ -z $bg ] && [ $docktype == "new" ]; then + removedockermach + fi +else + die "File: $file not found" +fi diff --git a/tools/djamkill b/tools/djamkill new file mode 100755 index 000000000..c9b322240 --- /dev/null +++ b/tools/djamkill @@ -0,0 +1,86 @@ +#!/bin/bash + +IDIR="${BASH_SOURCE%/*}" +if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi +source "$IDIR/inc/misc_tools.sh" + +die() { + printf '%s\n' "$1" >&2 + exit 1 +} + +show_usage() { + cat << EOF +A tool to display the active programs and their attributes. +Usage: djamlist + +djam list [--help] + +djam list [--all] + +djam list [--monitor] + +djam list [--remote] + +djam list [--type==fog] + +djam list [--dataStore==127.0.0.1:21883] + +djam list [--tmuxid==tg-25165] + +djam list [--port=3] + +djam list [--app==XX3] + +djam list [--prog==X] + +This is the docker version of jamlist. + +EOF +} + +run_djamkill() { + # Get a list of all running container IDs + local containers + containers=$(docker ps -q) + + if [[ -z "$containers" ]]; then + echo "No running Docker containers found." + exit 1 + fi + + for container in $containers; do + # Run djamlist in the container and capture its output. + # This assumes that "djamlist" when executed via docker exec returns the status only for that container. + jamlist_output=$(djamlist 2>/dev/null) + + # If the output might be aggregated, extract only the block for this container. + # The following awk command grabs lines after the "ContainerID: $container" line + # until the next "ContainerID:" header or the end of the output. + container_block=$(echo "$jamlist_output" | awk "/ContainerID: $container/{flag=1; next} /^ContainerID:/{flag=0} flag") + + # If the block shows no running instances, skip this container. + if echo "$container_block" | grep -q "No running instances of JAMScript."; then + continue + fi + + echo + echo "ContainerID: $container" + + # Run jamkill and capture its output. + output=$(docker exec -t "$container" jamkill 2>/dev/null) + + # Process each line, filtering out unwanted error messages. + while IFS= read -r line; do + if echo "$line" | grep -q -E "cannot access|no server running|\.jamruns/apps folder missing"; then + continue + fi + echo "$line" + done <<< "$output" + + docker stop "$container" + docker rm "$container" + done +} + +run_djamkill diff --git a/tools/djamlist b/tools/djamlist index 8ba86718f..a5cd4f409 100755 --- a/tools/djamlist +++ b/tools/djamlist @@ -1,6 +1,5 @@ #!/bin/bash - IDIR="${BASH_SOURCE%/*}" if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi source "$IDIR/inc/misc_tools.sh" @@ -13,12 +12,12 @@ die() { show_usage() { cat << EOF A tool to display the active programs and their attributes. -Usage: djamlist +Usage: djamlist djam list [--help] djam list [--all] - + djam list [--monitor] djam list [--remote] @@ -30,21 +29,58 @@ djam list [--dataStore==127.0.0.1:21883] djam list [--tmuxid==tg-25165] djam list [--port=3] - + djam list [--app==XX3] djam list [--prog==X] - This is the docker version of jamlist. EOF } - -runjamist(){ - local didp=`docker ps | awk 'NR > 1 {print $1; exit}'` - echo $didp - docker exec -t $didp jamlist + +run_djamlist() { + # Get a list of all running container IDs + local containers + containers=$(docker ps -q) + + # If no containers are running, exit + if [[ -z "$containers" ]]; then + echo "No running Docker containers found." + exit 1 + fi + + # Count the number of containers (each on its own line) + local num_containers + num_containers=$(echo "$containers" | wc -l | tr -d ' ') + + # If 1 or fewer containers, assume no JAMScript instances are running. + if (( num_containers <= 0 )); then + echo "No running instances of JAMScript on this server." + exit 0 + fi + + # Loop through each container and run djamlist inside it + for container in $containers; do + output=$(docker exec -t "$container" jamlist 2>/dev/null) + # Remove blank lines for an accurate comparison + trimmed=$(echo "$output" | sed '/^$/d') + # If the output is exactly "No running instances of JAMScript.", skip this container. + if [[ "$trimmed" == "No running instances of JAMScript." ]]; then + continue + fi + + echo "ContainerID: $container" + # Print output line by line, filtering out unwanted error messages + while IFS= read -r line; do + if echo "$line" | grep -q "cannot access"; then + continue + fi + echo "$line" + done <<< "$output" + echo + done } -runjamist + +run_djamlist diff --git a/tools/djamrun b/tools/djamrun index 56819222b..239802911 100755 --- a/tools/djamrun +++ b/tools/djamrun @@ -1,6 +1,5 @@ #!/bin/bash - IDIR="${BASH_SOURCE%/*}" if [[ ! -d "$IDIR" ]]; then IDIR="$PWD"; fi #source "$IDIR/inc/pumba_tools.sh" @@ -76,10 +75,10 @@ runatcloud() { if [ -z $bg ]; then echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results else echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results fi } @@ -101,10 +100,10 @@ runatfog() { if [ -z $bg ]; then echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results else echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results fi } @@ -132,10 +131,10 @@ runatdevice() { buildjargs $argstr if [ -z $bg ]; then echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results else - echo $dockid"-j" > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -t --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + echo $dockid"-c" > $thisappfolder/$dockid/tmuxid + tmux new-session -s $dockid"-c" -d docker exec -it $dockerSer tmux new-session -d -s $dockid"-c" "jamrun $file $results" fi echo ">>> Device started in container $dockid" } @@ -564,12 +563,11 @@ if [ -e "$file" ]; then # Automatically inherit the redis.. no checking?? reuse_container $type $dockerid fi - - docker exec $dockerSer mkdir /home/admin/temp + docker exec $dockerSer mkdir -p /home/admin/temp docker cp $file $dockerSer:/home/admin/temp/`basename $file` dojamrun $type $dockerid /home/admin/temp/`basename $file` $num if [ -z $bg ] && [ $docktype == "new" ]; then - removedockermach + removedockermach fi else die "File: $file not found" diff --git a/tools/djamterm b/tools/djamterm index 565de0a5c..35917da0a 100755 --- a/tools/djamterm +++ b/tools/djamterm @@ -44,7 +44,6 @@ Shows the J terminal of the program running under u-600-dev-2331. EOF } - localtmux() { local tmuxapp=$1 local termno=$2 @@ -60,7 +59,6 @@ localtmux() { fi } - dockertmux() { local tmuxapp=$1 local termno=$2 @@ -68,6 +66,8 @@ dockertmux() { appsfolder=$HOME"/.jamruns/apps" cd $appsfolder + # echo "Searching for tmux-id: $tmuxapp" + for jruns in */; do if [ $jruns != "*/" ]; then for jexs in `ls $appsfolder/$jruns`; do @@ -78,9 +78,18 @@ dockertmux() { if [ $dcl == "docker" ]; then if [ -e $dir/tmuxid_c ]; then local dtm=`cat $dir/tmuxid_c | tr -d '[:space:]'` - if [ $dtm == $tmuxapp ]; then - docker exec -t `cat $dir/dockerId` script -q -c "/usr/bin/tmux attach -t $tmuxapp-$termno" /dev/null - break + if [ "$dtm" == "$tmuxapp" ]; then + docker_id=$(cat "$dir/dockerId") + # echo "Found tmux session '$tmuxapp' inside container '$docker_id'" + + if [[ -t 1 ]]; then + docker exec -it $docker_id tmux attach -t $tmuxapp + else + echo "Tmux session '$tmuxapp' is running inside the container '$docker_id'." + echo "You can attach it manually using:" + echo "docker exec -it $docker_id tmux attach -t $tmuxapp" + fi + return 0 fi fi fi @@ -88,8 +97,10 @@ dockertmux() { done fi done -} + echo "No matching tmux session found for tmux-id: $tmuxapp" # Debug: Print if no match is found + return 1 +} ### # Main script execution begins here... @@ -103,34 +114,31 @@ exit_missingdir $appsfolder ".jamruns/apps folder missing. JAMScript tools not s cd $appsfolder - if [ -z $1 ]; then if [ -e tmuxid ]; then tmuxid=`cat tmuxid` - dockertmux $tmuxid 1 - exit # this improves the readability of the script later - not needed! + dockertmux $tmuxid + exit fi else - # Show help if [ $1 == "-h" ] || [ $1 == "--help" ]; then show_usage - exit # readability improver! + exit elif [ $1 == "-t" ]; then if [ -e tmuxid ]; then tmuxid=`cat tmuxid` dockertmux $tmuxid $2 fi - exit # readability improver! + exit else if [ -z $2 ]; then txid=$1 if [ ${txid: -1} == "c" ]; then - # Connect to the docker to display the C panes dockertmux $txid 1 else localtmux $txid fi - exit # readability improver! + exit else if [ -n $3 ] && [ $2 == "-t" ]; then termid=$3 @@ -138,4 +146,4 @@ else fi fi fi -fi +fi \ No newline at end of file diff --git a/tools/inventory.ini b/tools/inventory.ini index 0315f9f94..beb80df7d 100644 --- a/tools/inventory.ini +++ b/tools/inventory.ini @@ -1,3 +1,7 @@ -[all] -45.33.96.28 ansible_user=root +[servers] +server2 ansible_host=10.140.16.106 ansible_user=jamtools +server3 ansible_host=10.140.16.107 ansible_user=jamtools +server4 ansible_host=10.140.16.108 ansible_user=jamtools +[all:vars] +ansible_python_interpreter=/usr/bin/python3 diff --git a/tools/jambatch-playbook.yml b/tools/jambatch-playbook.yml new file mode 100644 index 000000000..c6c7bb374 --- /dev/null +++ b/tools/jambatch-playbook.yml @@ -0,0 +1,13 @@ +- name: Run JamBatch command + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run batch command and store logs + shell: zx wrapper.mjs djambatch "{{ file }}" "{{ deviceNb }}" "{{ app }}" --bg > jambatch.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamkill-playbook.mjs b/tools/jamkill-playbook.mjs new file mode 100644 index 000000000..24a7daecd --- /dev/null +++ b/tools/jamkill-playbook.mjs @@ -0,0 +1,13 @@ +- name: Run JAMKill command + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run kill command and store logs + shell: zx wrapper.mjs jamkill > jamkill.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamkill-playbook.yml b/tools/jamkill-playbook.yml new file mode 100644 index 000000000..24a7daecd --- /dev/null +++ b/tools/jamkill-playbook.yml @@ -0,0 +1,13 @@ +- name: Run JAMKill command + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run kill command and store logs + shell: zx wrapper.mjs jamkill > jamkill.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamkill.yml b/tools/jamkill.yml new file mode 100644 index 000000000..4f8e14bad --- /dev/null +++ b/tools/jamkill.yml @@ -0,0 +1,13 @@ +- name: Run JAMkill + hosts: servers + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run JAMKill + shell: zx wrapper.mjs jamkill + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamlist-playbook.yml b/tools/jamlist-playbook.yml new file mode 100644 index 000000000..e922b386a --- /dev/null +++ b/tools/jamlist-playbook.yml @@ -0,0 +1,13 @@ +- name: Run JAMList Command + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run JAMRun command and store logs + shell: zx wrapper.mjs jamlist > jamlist.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamlist.yml b/tools/jamlist.yml new file mode 100644 index 000000000..de91e5b61 --- /dev/null +++ b/tools/jamlist.yml @@ -0,0 +1,13 @@ +- name: Run JAMList + hosts: servers + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run JAMList command + shell: zx wrapper.mjs jamlist > jamlist.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamlog.yml b/tools/jamlog.yml new file mode 100644 index 000000000..970886ccb --- /dev/null +++ b/tools/jamlog.yml @@ -0,0 +1,13 @@ +- name: Run JAMLog Command + hosts: '{{ server }}' + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run JAMLog and store logs + shell: zx wrapper.mjs jamlog --program=jt1.jxe --app=DEMO --port=1883 > jamlog.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamrun-playbook.yml b/tools/jamrun-playbook.yml new file mode 100644 index 000000000..5cd6b8992 --- /dev/null +++ b/tools/jamrun-playbook.yml @@ -0,0 +1,29 @@ +- name: Start JAMScript Server and Run JAMRun Command + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Start the server (Express API) in the background + shell: nohup node app-docker.js > server.log 2>&1 & + args: + chdir: /home/jamtools/JAMScript/tools + async: 10 + poll: 0 + + - name: Wait for the server to initialize + pause: + seconds: 5 + + - name: Run JAMRun command and store logs + shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg > jamrun.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools + + # - name: Run JAMKill + # shell: zx wrapper.mjs jamkill + # args: + # chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamrun.yml b/tools/jamrun.yml new file mode 100644 index 000000000..74c6d2e52 --- /dev/null +++ b/tools/jamrun.yml @@ -0,0 +1,24 @@ +- name: Start JAMScript Server and Run JAMRun Command + hosts: servers + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Start the server (Express API) in the background + shell: nohup node app-docker.js > server.log 2>&1 & + args: + chdir: /home/jamtools/JAMScript/tools + async: 10 + poll: 0 + + - name: Wait for the server to initialize + pause: + seconds: 5 + + - name: Run JAMRun command and store logs + shell: zx wrapper.mjs jamrun jt1.jxe --app=DEMO --bg > jamrun.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamterm-playbook.yml b/tools/jamterm-playbook.yml new file mode 100644 index 000000000..b806a4347 --- /dev/null +++ b/tools/jamterm-playbook.yml @@ -0,0 +1,30 @@ +- name: Run JamTerm command + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Start the server (Express API) in the background + shell: nohup node app-docker.js > server.log 2>&1 & + args: + chdir: /home/jamtools/JAMScript/tools + async: 10 + poll: 0 + + - name: Wait for the server to initialize + pause: + seconds: 5 + + - name: Run JAMRun command and store logs + shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg > jamrun.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run term command and store logs + shell: zx wrapper.mjs jamterm > jamterm.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools + diff --git a/tools/jamterm.yml b/tools/jamterm.yml new file mode 100644 index 000000000..e80829013 --- /dev/null +++ b/tools/jamterm.yml @@ -0,0 +1,13 @@ +- name: Run JAMTerm Command + hosts: '{{ server }}' + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Run JAMTerm command and store logs + shell: zx wrapper.mjs jamterm > jamterm.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index 0c18544b0..127f6e071 100755 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -5,7 +5,6 @@ import fetch from "node-fetch"; import {getBatchArgs} from './parser.mjs'; - // Get the command-line arguments const endpointArgs = process.argv.slice(3); @@ -93,7 +92,7 @@ if (endpointArgs[0] === "jamrun") { if (localName) payload.local = locName; // Send the POST request to the server - const endpoint = "http://localhost:3000/jamrun"; + const endpoint = "http://0.0.0.0:3000/jamrun"; fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -204,7 +203,7 @@ if (endpointArgs[0] === "jambatch") { if (localName) payload.local = locName; // Send the POST request to the server - const endpoint = "http://localhost:3000/jamrun"; + const endpoint = "http://0.0.0.0:3000/jamrun"; fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -280,7 +279,7 @@ if (endpointArgs[0] === "jamlog") { if (jName) payload.j = jName; // Send the POST request to the server - const endpoint = "http://localhost:3000/jamlog"; + const endpoint = "http://0.0.0.0:3000/jamlog"; fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -324,7 +323,6 @@ if (endpointArgs[0] === "jamlist") { const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog==")); const remomteArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--remote==")); - let helpName, allName, monitorName, typeName,dataStoreName,tmuxName, portName, appName, programName, remoteName; // Use non-argument if present @@ -356,7 +354,7 @@ if (endpointArgs[0] === "jamlist") { if (programName) payload.prog = programName; // Send the POST request to the server - const endpoint = "http://localhost:3000/jamlist"; + const endpoint = "http://0.0.0.0:3000/jamlist"; fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -422,7 +420,7 @@ if (endpointArgs[0] === "jamkill") { // Send the POST request to the server - const endpoint = "http://localhost:3000/jamkill"; + const endpoint = "http://0.0.0.0:3000/jamkill"; fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -451,6 +449,9 @@ if (endpointArgs[0] === "jamkill") { // ex: zx wrapper.mjs jamterm // Validate and process the arguments if (endpointArgs[0] === "jamterm") { + + const tmuxIdArg = endpointArgs[1] + //Get if the index of all const allArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--all")); @@ -459,8 +460,9 @@ if (endpointArgs[0] === "jamterm") { const progArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--prog==")); const portArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--port==")); const paneArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--pane=")); + const tmerArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("-t ")) - let allName, appName, progName, portName, paneName; + let allName, appName, progName, portName, paneName, termNum; // Use all if present if(allArgIndex != -1) {allName = "all"}; //All @@ -482,8 +484,62 @@ if (endpointArgs[0] === "jamterm") { if (portName) payload.port = portName; if (paneName) payload.pane = paneName; + if (tmuxIdArg) payload.tmux_id = tmuxIdArg; + if (termNum) payload.terminal_number = termNum; + + // Send the POST request to the server + const endpoint = "http://0.0.0.0:3000/jamterm"; + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then((response) => { + // Ensure response status is OK + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Handle streaming response with Node.js readable stream + console.log("Streaming response:"); + response.body.on("data", (chunk) => { + process.stdout.write(chunk.toString()); + }); + response.body.on("end", () => { + console.log("\nStream finished."); + }); + }) + .catch((error) => { + console.error("Error sending request:", error.message); + }); +} + + +// ex: zx wrapper.mjs djambatch jt1.jxe --device_num=5 --app=DEMO2 --bg +// Validate and process the arguments +if (endpointArgs[0] === "djambatch") { + + // Get index of parameters with a value associated with it + const deviceNumArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--device_num=")); + const appArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--app=")); + + + let deviceNumName, appName; + + + // If the parameter with value is present, extract the value + if (deviceNumArgIndex != -1) {deviceNumName = endpointArgs[deviceNumArgIndex].split("=")[1];} // Extract device_num + if (appArgIndex != -1) {appName = endpointArgs[appArgIndex].split("=")[1];} // Extract app + + + // Construct the JSON payload + let payload = { + device_num: deviceNumName, + app: appName + }; + // Send the POST request to the server - const endpoint = "http://localhost:3000/jamterm"; + const endpoint = "http://0.0.0.0:3000/jambatch"; fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -507,4 +563,4 @@ if (endpointArgs[0] === "jamterm") { .catch((error) => { console.error("Error sending request:", error.message); }); -} \ No newline at end of file +} From 92d1163287c30b7fbbe729c301c2f453e2e3bba4 Mon Sep 17 00:00:00 2001 From: Woojin Date: Thu, 6 Mar 2025 15:36:21 -0500 Subject: [PATCH 116/126] setting relative path to absolute path for ansible adhoc command for different servers --- tools/app-docker.js | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/tools/app-docker.js b/tools/app-docker.js index e7d49f406..1fd97b085 100644 --- a/tools/app-docker.js +++ b/tools/app-docker.js @@ -5,22 +5,15 @@ const app = express(); const port = 3000; const host = '0.0.0.0'; +/// SET WORKING DIRECTORY FOR JAMTOOLS /// +const JAM_HOME = '/home/jamtools/JAMScript'; +const TOOLS_DIR = `${JAM_HOME}/tools`; -/// TO UPDATE IN FUNCTION OF WHERE THE TOOLS ARE ON YOUR LOCAL COPY /// -let cwd = '/home/jamtools/JAMScript/tools'; -const childProcessExport1 = exec('export JAM_HOME=/home/jamtools/JAMScript/', - {cwd} ); - -const childProcessExport2 = exec('export JAMHOME=/home/jamtools/JAMScript/', - {cwd}); -const childProcessExport3 = exec('export PATH=$JAM_HOME/tools:$PATH', - {cwd}); -const childProcessExport4 = exec('export JAMDATA=/home/jamtools/JAMScript/data', {cwd}); - -const childProcess1 = exec('djam init --ideal', {cwd} ); -const childProcess2 = exec('echo test', {cwd}); -//////////////////////////////////////////////////////////////////////////// - +// Update PATH for all commands to ensure JAMTools are available +process.env.PATH = `${TOOLS_DIR}:${process.env.PATH}`; +process.env.JAM_HOME = JAM_HOME; +process.env.JAMHOME = JAM_HOME; +process.env.JAMDATA = `${JAM_HOME}/data`; // Middleware to parse JSON requests app.use(express.json()); @@ -33,7 +26,10 @@ app.get('/api', (req, res) => { // Utility function to handle command execution and streaming response. **** UPDATE CWD **** function executeCommand(req, res, command, cwd = '/home/jamtools/JAMScript/tools') { console.log(`Executing command: ${command}`); - const childProcess = exec(command, { cwd }); + const childProcess = exec(command, { + cwd: TOOLS_DIR, // Set correct working directory + env: process.env, // Use modified environment with updated PATH + }); // Set headers to keep the connection open for streaming res.setHeader('Content-Type', 'text/plain'); @@ -94,7 +90,7 @@ app.post('/jamrun', (req, res) => { return res.status(400).json({ error: 'The "app_name" field is required.' }); } - let command = `djam run ${file} --app=${app_name}`; + let command = `${TOOLS_DIR}/djam run ${file} --app=${app_name}`; if (fog) command += ' --fog'; if (cloud) command += ' --cloud'; if (device) command += ' --device'; @@ -120,7 +116,7 @@ app.post('/jamrun', (req, res) => { file = 'jt1.jxe', device_num,app } = req.body; - let command = `djambatch ${file} --device_num=${device_num} --app=${app} --bg `; + let command = `${TOOLS_DIR}/djambatch ${file} --device_num=${device_num} --app=${app} --bg `; executeCommand(req, res, command); }); @@ -130,7 +126,7 @@ app.post('/jamlog', (req, res) => { const { help, program, app, port, remote, tail, c, j } = req.body; // Default command without arguments if none are specified - let command = `djam log`; + let command = `${TOOLS_DIR}/djam log`; if (help) command += ` --help`; if (program) command += ` --program=${program}`; if (app) command += ` --app=${app}`; @@ -149,7 +145,7 @@ app.post('/jamlist', (req, res) => { const { help, all, monitor, type, dataStore, tmuxid, port, app, prog, remote } = req.body; // Default command without arguments if none are specified - let command = `djam list`; + let command = `${TOOLS_DIR}/djam list`; if (help) command += ` --help`; if (all) command += ` --all`; if (monitor) command += ` --monitor`; @@ -168,7 +164,7 @@ app.post('/jamlist', (req, res) => { app.post('/jamkill', (req, res) => { const { reset, all, remote, app, prog, port } = req.body; - let command = 'djam kill'; + let command = `${TOOLS_DIR}/djam kill`; if (reset) command += ' --reset'; if (all) command += ' --all'; if (remote) command += ` --remote=${remote}`; @@ -184,7 +180,7 @@ app.post('/jamterm', (req, res) => { const { tmux_id, terminal_number } = req.body; console.log (req.body) - let command = `djam term`; + let command = `${TOOLS_DIR}/djam term`; console.log(`tmux_id entered : ${tmux_id}`) if (tmux_id) command += ` ${tmux_id}`; console.log(`terminal_number entered : ${terminal_number}`) From 949e390cf1aa19cb76ccddcaf0c45ececa6817ba Mon Sep 17 00:00:00 2001 From: Woojin Date: Wed, 12 Mar 2025 20:58:02 -0400 Subject: [PATCH 117/126] updated djam run, term, and list for fog and cloud --- tools/djamlist | 76 ++++++++++++++++++++++++++++++--------------- tools/djamrun | 57 +++++++++++++++++++--------------- tools/djamterm | 84 ++++++++++++++++++++++++++++++-------------------- 3 files changed, 135 insertions(+), 82 deletions(-) diff --git a/tools/djamlist b/tools/djamlist index a5cd4f409..d0cf14f6a 100755 --- a/tools/djamlist +++ b/tools/djamlist @@ -39,8 +39,35 @@ This is the docker version of jamlist. EOF } +build_tmux_map() { + local appsfolder="$HOME/.jamruns/apps" + declare -gA TMUX_MAP + + for appdir in "$appsfolder"/*/; do + for instance in "$appdir"*/; do + if [ -d "$instance" ]; then + if [[ -f "$instance/class" && "$(tr -d '[:space:]' < "$instance/class")" == "docker" ]]; then + docker_id=$(tr -d '[:space:]' < "$instance/dockerId") + + if [ -f "$instance/tmuxid_c" ]; then + tmuxid=$(tr -d '[:space:]' < "$instance/tmuxid_c") + elif [ -f "$instance/tmuxid" ]; then + tmuxid=$(tr -d '[:space:]' < "$instance/tmuxid") + else + tmuxid="-" + fi + + TMUX_MAP["$docker_id"]="$tmuxid" + fi + fi + done + done +} + run_djamlist() { - # Get a list of all running container IDs + build_tmux_map # Build tmuxid map first + + # Get a list of running containers local containers containers=$(docker ps -q) @@ -50,35 +77,36 @@ run_djamlist() { exit 1 fi - # Count the number of containers (each on its own line) - local num_containers - num_containers=$(echo "$containers" | wc -l | tr -d ' ') - - # If 1 or fewer containers, assume no JAMScript instances are running. - if (( num_containers <= 0 )); then - echo "No running instances of JAMScript on this server." - exit 0 - fi + # Optional: Print headers if needed + printf "%-12s %-10s %-15s %-12s %-12s %-15s %-8s %-10s %-20s %-s\n" \ + "ID" "NAME" "PROGRAM" "HOST" "PARENT" "D-STORE" "TYPE" "C-NODES" "TMUX-ID" "CONTAINER-ID" + printf '%*s\n' 136 '' | tr ' ' '-' - # Loop through each container and run djamlist inside it + # Process each container for container in $containers; do output=$(docker exec -t "$container" jamlist 2>/dev/null) - # Remove blank lines for an accurate comparison - trimmed=$(echo "$output" | sed '/^$/d') - # If the output is exactly "No running instances of JAMScript.", skip this container. - if [[ "$trimmed" == "No running instances of JAMScript." ]]; then + + # Clean output: + # 1. Remove blank lines + # 2. Remove internal headers + # 3. Remove separator lines + # 4. Capture last meaningful line only + last_line=$(echo "$output" | sed '/^$/d' | grep -v "^ID[[:space:]]\+NAME[[:space:]]\+PROGRAM" | grep -v '^-*$' | tail -n 1) + + # Skip if empty + if [[ -z "$last_line" ]]; then continue fi - echo "ContainerID: $container" - # Print output line by line, filtering out unwanted error messages - while IFS= read -r line; do - if echo "$line" | grep -q "cannot access"; then - continue - fi - echo "$line" - done <<< "$output" - echo + # Get mapped TMUX-ID (default to "-") + tmuxid="${TMUX_MAP[$container]:--}" + + # Extract columns + read -r ID NAME PROGRAM HOST PARENT DSTORE TYPE CNODES _ <<< "$last_line" + + # Final aligned output + printf "%-12s %-10s %-15s %-12s %-12s %-15s %-8s %-10s %-20s %-s\n" \ + "$ID" "$NAME" "$PROGRAM" "$HOST" "$PARENT" "$DSTORE" "$TYPE" "$CNODES" "$tmuxid" "$container" done } diff --git a/tools/djamrun b/tools/djamrun index 239802911..eeebdc752 100755 --- a/tools/djamrun +++ b/tools/djamrun @@ -65,21 +65,21 @@ runatcloud() { local data=$4 local tags=$5 + echo "$dockid-j" > $thisappfolder/$dockid/tmuxid + echo "$dockid-j" > $appfolder/tmuxid - argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-j --tags=$tags --link=$link --loc=$loc " if [ ! -z $log ]; then argstr="$argstr --log" fi buildjargs $argstr - if [ -z $bg ]; then - echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -it $dockerSer tmux new-session -d -s "$dockid-j" "jamrun $file $results" else - echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -it $dockerSer tmux new-session -d -s $dockid"-j" "jamrun $file $results" fi + echo ">>> Cloud started in container $dockid-j" } @@ -91,20 +91,21 @@ runatfog() { local data=$4 local tags=$5 - argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " + echo "$dockid-j" > $thisappfolder/$dockid/tmuxid + echo "$dockid-j" > $appfolder/tmuxid + + argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-j --tags=$tags --link=$link --loc=$loc " if [ ! -z $log ]; then argstr="$argstr --log" fi buildjargs $argstr - if [ -z $bg ]; then - echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + docker exec -it $dockerSer tmux new-session -d -s "$dockid-j" "jamrun $file $results" else - echo $dockid > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-j" -d docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + tmux new-session -s $dockid"-j" -d docker exec -it $dockerSer tmux new-session -d -s $dockid"-j" "jamrun $file $results" fi + echo ">>> Fog started in container $dockid-j" } @@ -117,11 +118,9 @@ runatdevice() { local num=$5 local tags=$6 - echo $num > $thisappfolder/$dockid/cdevs - echo "$dockid-c" > $thisappfolder/$dockid/tmuxid_c - - # save for short cut use - echo "$dockid-c" > $appfolder/tmuxid + echo $num > $thisappfolder/$dockid/cdevs + echo "$dockid-c" > $thisappfolder/$dockid/tmuxid_c + echo "$dockid-c" > $appfolder/tmuxid argstr=" --app=$appid --data=$data --num=$num --tmux=$dockid-c --tags=$tags --link=$link --loc=$loc " if [ ! -z $log ]; then @@ -129,14 +128,25 @@ runatdevice() { fi buildjargs $argstr - if [ -z $bg ]; then - echo "-" > $thisappfolder/$dockid/tmuxid - docker exec -it --env NODE_PATH=/usr/local/lib/node_modules:/node_modules $dockerSer jamrun $file $results + if [ "$num" -gt 1 ]; then + # multiple C nodes + for i in $(seq 1 $num); do + if [ -z $bg ]; then + docker exec -it $dockerSer tmux new-session -d -s "$dockid-c-$i" "jamrun $file $results" + else + tmux new-session -s "$dockid-c-$i" -d docker exec -it $dockerSer tmux new-session -d -s "$dockid-c-$i" "jamrun $file $results" + fi + done else - echo $dockid"-c" > $thisappfolder/$dockid/tmuxid - tmux new-session -s $dockid"-c" -d docker exec -it $dockerSer tmux new-session -d -s $dockid"-c" "jamrun $file $results" + # Single C node case + if [ -z $bg ]; then + docker exec -it $dockerSer tmux new-session -d -s "$dockid-c" "jamrun $file $results" + else + tmux new-session -s "$dockid-c" -d docker exec -it $dockerSer tmux new-session -d -s "$dockid-c" "jamrun $file $results" + fi fi - echo ">>> Device started in container $dockid" + echo ">>> Device started in container $dockid-c" + } @@ -204,7 +214,6 @@ getdockerid() { } - make_container() { local type=$1 local contname=$2 diff --git a/tools/djamterm b/tools/djamterm index 35917da0a..087c3db9a 100755 --- a/tools/djamterm +++ b/tools/djamterm @@ -62,46 +62,62 @@ localtmux() { dockertmux() { local tmuxapp=$1 local termno=$2 + local appsfolder="$HOME/.jamruns/apps" + + for appdir in "$appsfolder"/*/; do + for instance in "$appdir"*/; do + if [[ -f "$instance/class" && "$(tr -d '[:space:]' < "$instance/class")" == "docker" ]]; then + local docker_id + docker_id=$(tr -d '[:space:]' < "$instance/dockerId") + + # Check tmuxid_c (device C nodes) + if [[ -f "$instance/tmuxid_c" ]]; then + local dtm_c + dtm_c=$(tr -d '[:space:]' < "$instance/tmuxid_c") + if [[ "$dtm_c" == "$tmuxapp" ]]; then + # echo "Match found (Device). Attaching to $tmuxapp in $docker_id" + attach_tmux_in_docker "$docker_id" "$tmuxapp" "$termno" + return 0 + fi + fi - appsfolder=$HOME"/.jamruns/apps" - cd $appsfolder - - # echo "Searching for tmux-id: $tmuxapp" - - for jruns in */; do - if [ $jruns != "*/" ]; then - for jexs in `ls $appsfolder/$jruns`; do - dir=$appsfolder/$jruns$jexs - if [ -d $dir ] && [ -e $dir/class ]; then - local dcl=`cat $dir/class | tr -d '[:space:]'` - - if [ $dcl == "docker" ]; then - if [ -e $dir/tmuxid_c ]; then - local dtm=`cat $dir/tmuxid_c | tr -d '[:space:]'` - if [ "$dtm" == "$tmuxapp" ]; then - docker_id=$(cat "$dir/dockerId") - # echo "Found tmux session '$tmuxapp' inside container '$docker_id'" - - if [[ -t 1 ]]; then - docker exec -it $docker_id tmux attach -t $tmuxapp - else - echo "Tmux session '$tmuxapp' is running inside the container '$docker_id'." - echo "You can attach it manually using:" - echo "docker exec -it $docker_id tmux attach -t $tmuxapp" - fi - return 0 - fi - fi + # Check tmuxid (cloud/fog J nodes) + if [[ -f "$instance/tmuxid" ]]; then + local dtm_j + dtm_j=$(tr -d '[:space:]' < "$instance/tmuxid") + if [[ "$dtm_j" == "$tmuxapp" ]]; then + # echo "Match found (Cloud/Fog). Attaching to $tmuxapp in $docker_id" + attach_tmux_in_docker "$docker_id" "$tmuxapp" "$termno" + return 0 fi fi - done - fi + fi + done done - echo "No matching tmux session found for tmux-id: $tmuxapp" # Debug: Print if no match is found + # echo "No matching tmux session found for tmux-id: $tmuxapp" return 1 } + +attach_tmux_in_docker() { + local docker_id=$1 + local tmuxapp=$2 + local termno=$3 + + if [[ -t 1 ]]; then + if [ -z "$termno" ]; then + docker exec -it $docker_id tmux attach -t $tmuxapp + else + docker exec -it $docker_id tmux attach -t "$tmuxapp-$termno" + fi + else + echo "Tmux session '$tmuxapp' is running inside the container '$docker_id'." + echo "You can attach manually using:" + echo "docker exec -it $docker_id tmux attach -t $tmuxapp" + fi +} + ### # Main script execution begins here... # @@ -133,8 +149,8 @@ else else if [ -z $2 ]; then txid=$1 - if [ ${txid: -1} == "c" ]; then - dockertmux $txid 1 + if [[ ${txid: -1} == "c" || ${txid: -1} == "j" ]]; then + dockertmux $txid else localtmux $txid fi From fb529b8408095174a135bf1f9a881a89179568fd Mon Sep 17 00:00:00 2001 From: Woojin Date: Wed, 12 Mar 2025 21:05:05 -0400 Subject: [PATCH 118/126] Remove redundant ID column duplicated by NAME in djamlist output --- tools/djamlist | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/djamlist b/tools/djamlist index d0cf14f6a..ae6151375 100755 --- a/tools/djamlist +++ b/tools/djamlist @@ -78,9 +78,10 @@ run_djamlist() { fi # Optional: Print headers if needed - printf "%-12s %-10s %-15s %-12s %-12s %-15s %-8s %-10s %-20s %-s\n" \ - "ID" "NAME" "PROGRAM" "HOST" "PARENT" "D-STORE" "TYPE" "C-NODES" "TMUX-ID" "CONTAINER-ID" - printf '%*s\n' 136 '' | tr ' ' '-' + echo + printf "%-15s %-10s %-15s %-12s %-12s %-15s %-8s %-10s %-20s %-s\n" \ + "CONTAINER-ID" "NAME" "PROGRAM" "HOST" "PARENT" "D-STORE" "TYPE" "C-NODES" "TMUX-ID" + printf '%*s\n' 125 '' | tr ' ' '-' # Process each container for container in $containers; do @@ -105,8 +106,8 @@ run_djamlist() { read -r ID NAME PROGRAM HOST PARENT DSTORE TYPE CNODES _ <<< "$last_line" # Final aligned output - printf "%-12s %-10s %-15s %-12s %-12s %-15s %-8s %-10s %-20s %-s\n" \ - "$ID" "$NAME" "$PROGRAM" "$HOST" "$PARENT" "$DSTORE" "$TYPE" "$CNODES" "$tmuxid" "$container" + printf "%-15s %-10s %-15s %-12s %-12s %-15s %-8s %-10s %-20s %-s\n" \ + "$container" "$NAME" "$PROGRAM" "$HOST" "$PARENT" "$DSTORE" "$TYPE" "$CNODES" "$tmuxid" done } From a93cd085439f301d09744d0d693bd4207f2e4df0 Mon Sep 17 00:00:00 2001 From: Woojin Date: Thu, 13 Mar 2025 12:46:48 -0400 Subject: [PATCH 119/126] ssh for app.js --- tools/app.js | 42 ++++++++++++++++++++++++++++++++++++++++++ tools/ke1.pub | 1 + 2 files changed, 43 insertions(+) create mode 100644 tools/ke1.pub diff --git a/tools/app.js b/tools/app.js index ba80c8476..fe3dac5dd 100644 --- a/tools/app.js +++ b/tools/app.js @@ -1,10 +1,52 @@ const express = require('express'); const { exec } = require('child_process'); +const { Client } = require('ssh2'); + const app = express(); const port = 3000; const host = '0.0.0.0'; +//Start ssh authentication + +const fs = require('fs'); + + +// List of authorized SSH public keys +const authorizedKeys = fs + .readFileSync('/home/jamtools/.ssh/authorized_keys', 'utf8') + .split('\n') // Split file into individual keys + .map(key => key.trim()) // Trim spaces and newlines + .filter(key => key.length > 0); // Remove empty lines + + +function checkSSHKey(req, res, next) { + const clientIp = req.connection.remoteAddress; + + // Allow local requests without SSH key verification + if (clientIp === '127.0.0.1' || clientIp === '::1') { + return next(); // Skip SSH key check for local requests + } + + // Get the SSH key from headers or request body (depending on your client setup) + const sshPublicKey = req.headers['x-ssh-public-key']; // Assuming SSH key sent in a header + console.log(sshPublicKey); + if (!sshPublicKey) { + return res.status(401).json({ error: 'No SSH public key provided' }); + } + + // Check if the provided SSH key matches any authorized keys + if (authorizedKeys.includes(sshPublicKey)) { + return next(); // Allow the request if key matches + } else { + return res.status(403).json({ error: 'SSH key not authorized' }); + } +}; + +app.use(checkSSHKey); +/////////////////// end ssh key authentication + + // Middleware to parse JSON requests app.use(express.json()); diff --git a/tools/ke1.pub b/tools/ke1.pub new file mode 100644 index 000000000..ce0136250 --- /dev/null +++ b/tools/ke1.pub @@ -0,0 +1 @@ +hello From ea4975b01e2908daf5d434d76e0edc78aa105346 Mon Sep 17 00:00:00 2001 From: Woojin Date: Thu, 13 Mar 2025 12:47:33 -0400 Subject: [PATCH 120/126] ssh for app.js --- tools/ke1.pub | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tools/ke1.pub diff --git a/tools/ke1.pub b/tools/ke1.pub deleted file mode 100644 index ce0136250..000000000 --- a/tools/ke1.pub +++ /dev/null @@ -1 +0,0 @@ -hello From 66e4d38760e30723b7e16c2d910e576f1524f60c Mon Sep 17 00:00:00 2001 From: Woojin Date: Wed, 26 Mar 2025 16:03:14 -0400 Subject: [PATCH 121/126] wrapper update to have serverIP input --- tools/app-docker.js | 41 +++++++++++++++++ tools/app.js | 10 ++-- tools/jambatch-playbook.yml | 2 +- tools/jamkill-playbook.mjs | 2 +- tools/jamkill-playbook.yml | 2 +- tools/jamlist-playbook.yml | 2 +- tools/jamrun-playbook.yml | 15 ++++-- tools/jamterm-playbook.yml | 2 +- tools/run_all.sh | 1 - tools/wrapper.mjs | 92 ++++++++++++++++++++++++++----------- 10 files changed, 126 insertions(+), 43 deletions(-) diff --git a/tools/app-docker.js b/tools/app-docker.js index 1fd97b085..fa8a220d8 100644 --- a/tools/app-docker.js +++ b/tools/app-docker.js @@ -1,9 +1,50 @@ const express = require('express'); const { exec } = require('child_process'); +const { Client } = require('ssh2'); + const app = express(); const port = 3000; const host = '0.0.0.0'; +const hostIp = '10.140.16.105'; + +//Start ssh authentication +const fs = require('fs'); + + +// List of authorized SSH public keys +const authorizedKeys = fs + .readFileSync('/home/jamtools/.ssh/authorized_keys', 'utf8') + .split('\n') // Split file into individual keys + .map(key => key.trim()) // Trim spaces and newlines + .filter(key => key.length > 0); // Remove empty lines + + +function checkSSHKey(req, res, next) { + const clientIp = req.connection.remoteAddress; + // Allow local requests without SSH key verification + if (clientIp === '127.0.0.1' || clientIp === '::1' || clientIp === hostIp) { + return next(); // Skip SSH key check for local requests + } + + // Get the SSH key from headers or request body (depending on your client setup) + const sshPublicKey = req.headers['x-ssh-public-key']; // SSH key sent in a header + if (!sshPublicKey) { + console.log('Access Denied: No SSH Key'); + return res.status(401).json({ error: 'No SSH public key provided' }); + } + + // Check if the provided SSH key matches any authorized keys + if (authorizedKeys.includes(sshPublicKey)) { + return next(); // Allow the request if key matches + } else { + console.log('Access Denied: SSH Key not authorized'); + return res.status(403).json({ error: 'SSH key not authorized' }); + } +}; + +app.use(checkSSHKey); +/////////////////// end ssh key authentication /// SET WORKING DIRECTORY FOR JAMTOOLS /// const JAM_HOME = '/home/jamtools/JAMScript'; diff --git a/tools/app.js b/tools/app.js index fe3dac5dd..dc9c5896b 100644 --- a/tools/app.js +++ b/tools/app.js @@ -6,9 +6,9 @@ const app = express(); const port = 3000; const host = '0.0.0.0'; +const hostIp = '10.140.16.105'; //Start ssh authentication - const fs = require('fs'); @@ -22,16 +22,15 @@ const authorizedKeys = fs function checkSSHKey(req, res, next) { const clientIp = req.connection.remoteAddress; - // Allow local requests without SSH key verification - if (clientIp === '127.0.0.1' || clientIp === '::1') { + if (clientIp === '127.0.0.1' || clientIp === '::1' || clientIp === hostIp) { return next(); // Skip SSH key check for local requests } // Get the SSH key from headers or request body (depending on your client setup) - const sshPublicKey = req.headers['x-ssh-public-key']; // Assuming SSH key sent in a header - console.log(sshPublicKey); + const sshPublicKey = req.headers['x-ssh-public-key']; // SSH key sent in a header if (!sshPublicKey) { + console.log('Access Denied: No SSH Key'); return res.status(401).json({ error: 'No SSH public key provided' }); } @@ -39,6 +38,7 @@ function checkSSHKey(req, res, next) { if (authorizedKeys.includes(sshPublicKey)) { return next(); // Allow the request if key matches } else { + console.log('Access Denied: SSH Key not authorized'); return res.status(403).json({ error: 'SSH key not authorized' }); } }; diff --git a/tools/jambatch-playbook.yml b/tools/jambatch-playbook.yml index c6c7bb374..e9131008e 100644 --- a/tools/jambatch-playbook.yml +++ b/tools/jambatch-playbook.yml @@ -8,6 +8,6 @@ chdir: /home/jamtools/JAMScript/tools - name: Run batch command and store logs - shell: zx wrapper.mjs djambatch "{{ file }}" "{{ deviceNb }}" "{{ app }}" --bg > jambatch.log 2>&1 + shell: zx wrapper.mjs djambatch "{{ file }}" "{{ deviceNb }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jambatch.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamkill-playbook.mjs b/tools/jamkill-playbook.mjs index 24a7daecd..edc094ed3 100644 --- a/tools/jamkill-playbook.mjs +++ b/tools/jamkill-playbook.mjs @@ -8,6 +8,6 @@ chdir: /home/jamtools/JAMScript/tools - name: Run kill command and store logs - shell: zx wrapper.mjs jamkill > jamkill.log 2>&1 + shell: zx wrapper.mjs jamkill --serverIP={{ ansible_host }} > jamkill.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamkill-playbook.yml b/tools/jamkill-playbook.yml index 24a7daecd..edc094ed3 100644 --- a/tools/jamkill-playbook.yml +++ b/tools/jamkill-playbook.yml @@ -8,6 +8,6 @@ chdir: /home/jamtools/JAMScript/tools - name: Run kill command and store logs - shell: zx wrapper.mjs jamkill > jamkill.log 2>&1 + shell: zx wrapper.mjs jamkill --serverIP={{ ansible_host }} > jamkill.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamlist-playbook.yml b/tools/jamlist-playbook.yml index e922b386a..8846e7ecf 100644 --- a/tools/jamlist-playbook.yml +++ b/tools/jamlist-playbook.yml @@ -8,6 +8,6 @@ chdir: /home/jamtools/JAMScript/tools - name: Run JAMRun command and store logs - shell: zx wrapper.mjs jamlist > jamlist.log 2>&1 + shell: zx wrapper.mjs jamlist --serverIP={{ ansible_host }} > jamlist.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamrun-playbook.yml b/tools/jamrun-playbook.yml index 5cd6b8992..49b835755 100644 --- a/tools/jamrun-playbook.yml +++ b/tools/jamrun-playbook.yml @@ -14,12 +14,19 @@ async: 10 poll: 0 - - name: Wait for the server to initialize - pause: - seconds: 5 + - name: Wait until the server port is open + wait_for: + host: "{{ ansible_host }}" + port: 3000 + delay: 3 + timeout: 30 + + - name: Debug the final JAMRun command + debug: + msg: 'zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1' - name: Run JAMRun command and store logs - shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg > jamrun.log 2>&1 + shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools diff --git a/tools/jamterm-playbook.yml b/tools/jamterm-playbook.yml index b806a4347..6715dccb8 100644 --- a/tools/jamterm-playbook.yml +++ b/tools/jamterm-playbook.yml @@ -19,7 +19,7 @@ seconds: 5 - name: Run JAMRun command and store logs - shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg > jamrun.log 2>&1 + shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools diff --git a/tools/run_all.sh b/tools/run_all.sh index 056e191d9..ba8a6cedb 100755 --- a/tools/run_all.sh +++ b/tools/run_all.sh @@ -20,4 +20,3 @@ for i in {1..100}; do done echo "All commands executed." - diff --git a/tools/wrapper.mjs b/tools/wrapper.mjs index 127f6e071..13fc518fe 100755 --- a/tools/wrapper.mjs +++ b/tools/wrapper.mjs @@ -4,10 +4,25 @@ import commandLineArgs from 'command-line-args'; import fetch from "node-fetch"; import {getBatchArgs} from './parser.mjs'; +//Define default server IP +let serverIP = "10.140.16.105"; + +// Read SSH key from client +const sshPublicKey = fs.readFileSync('/home/jamtools/.ssh/id_rsa.pub', 'utf8').trim(); // Get the command-line arguments const endpointArgs = process.argv.slice(3); +// Check if a custom server IP is provided via --serverIP= +const serverArgIndex = endpointArgs.findIndex((arg) => arg.startsWith("--serverIP=")); +if (serverArgIndex !== -1) { + serverIP = endpointArgs[serverArgIndex].split("=")[1]; + console.log(serverIP) + // Remove the serverIP argument so it doesn't interfere with other processing + endpointArgs.splice(serverArgIndex, 1); +} + + // ex: zx wrapper.mjs jamrun jt1.jxe --app="DEMO" // Validate and process the arguments if (endpointArgs[0] === "jamrun") { @@ -92,16 +107,19 @@ if (endpointArgs[0] === "jamrun") { if (localName) payload.local = locName; // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jamrun"; + const endpoint = `http://${serverIP}:3000/jamrun`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream @@ -203,16 +221,19 @@ if (endpointArgs[0] === "jambatch") { if (localName) payload.local = locName; // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jamrun"; + const endpoint = `http://${serverIP}:3000/jamrun`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream @@ -279,16 +300,19 @@ if (endpointArgs[0] === "jamlog") { if (jName) payload.j = jName; // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jamlog"; + const endpoint = `http://${serverIP}:3000/jamlog`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream @@ -354,16 +378,19 @@ if (endpointArgs[0] === "jamlist") { if (programName) payload.prog = programName; // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jamlist"; + const endpoint = `http://${serverIP}:3000/jamlist`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream @@ -420,16 +447,19 @@ if (endpointArgs[0] === "jamkill") { // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jamkill"; + const endpoint = `http://${serverIP}:3000/jamkill`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream @@ -488,16 +518,19 @@ if (endpointArgs[0] === "jamterm") { if (termNum) payload.terminal_number = termNum; // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jamterm"; + const endpoint = `http://${serverIP}:3000/jamterm`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream @@ -539,16 +572,19 @@ if (endpointArgs[0] === "djambatch") { }; // Send the POST request to the server - const endpoint = "http://0.0.0.0:3000/jambatch"; + const endpoint = `http://${serverIP}:3000/jambatch`; fetch(endpoint, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/json", + "x-ssh-public-key": sshPublicKey, + }, body: JSON.stringify(payload), }) - .then((response) => { + .then(async (response) => { // Ensure response status is OK if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + const errorText = await response.text(); // Read error message from server + throw new Error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); } // Handle streaming response with Node.js readable stream From df50a62f3f597275bcd84bfed6f827deee9b7305 Mon Sep 17 00:00:00 2001 From: Woojin Date: Wed, 26 Mar 2025 20:04:31 -0400 Subject: [PATCH 122/126] Add performance test scripts (jamrun and jamlist) and resource monitor for JAMScript server --- tools/jamrun-playbook.yml | 4 -- tools/monitor.sh | 62 +++++++++++++++++++++++++++++++ tools/req-jamlist-test.mjs | 61 +++++++++++++++++++++++++++++++ tools/req-jamrun-test.mjs | 63 ++++++++++++++++++++++++++++++++ tools/server_resource_alerts.log | 41 +++++++++++++++++++++ 5 files changed, 227 insertions(+), 4 deletions(-) create mode 100755 tools/monitor.sh create mode 100644 tools/req-jamlist-test.mjs create mode 100644 tools/req-jamrun-test.mjs create mode 100644 tools/server_resource_alerts.log diff --git a/tools/jamrun-playbook.yml b/tools/jamrun-playbook.yml index 49b835755..966bf6da3 100644 --- a/tools/jamrun-playbook.yml +++ b/tools/jamrun-playbook.yml @@ -20,10 +20,6 @@ port: 3000 delay: 3 timeout: 30 - - - name: Debug the final JAMRun command - debug: - msg: 'zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1' - name: Run JAMRun command and store logs shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1 diff --git a/tools/monitor.sh b/tools/monitor.sh new file mode 100755 index 000000000..a415f5ab6 --- /dev/null +++ b/tools/monitor.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# Configuration +THRESHOLD_CPU=80 # % CPU usage for app-docker.js +THRESHOLD_MEM=400 # MB process memory usage +TOTAL_MEM_THRESHOLD=6000 # System-wide memory usage threshold in MB +LOG_FILE="server_resource_alerts.log" +CHECK_INTERVAL=2 # seconds between checks +PROCESS_NAME="app-docker.js" +STRESS_TEST_SCRIPT="req-jamlist-test.mjs" # change the test script name here... +AUTO_KILL=true + +echo "Monitoring $PROCESS_NAME and system memory usage..." +echo "Thresholds:" +echo "- CPU > ${THRESHOLD_CPU}%" +echo "- Process MEM > ${THRESHOLD_MEM}MB" +echo "- System MEM > ${TOTAL_MEM_THRESHOLD}MB" +echo "Logging alerts to: $LOG_FILE" +echo "Auto-kill enabled: $AUTO_KILL" +echo "----------------------------------------------" + +while true; do + SERVER_PID=$(pgrep -f "$PROCESS_NAME") + STRESS_PID=$(pgrep -f "$STRESS_TEST_SCRIPT") + + if [[ -z "$SERVER_PID" ]]; then + echo "[$(date "+%Y-%m-%d %H:%M:%S")] $PROCESS_NAME not running." | tee -a "$LOG_FILE" + sleep $CHECK_INTERVAL + continue + fi + + MEM_USED_MB=$(free -m | awk '/Mem:/ {print $3}') + read CPU_K MEM_K <<< $(ps -p $SERVER_PID -o %cpu=,rss=) + CPU=$(printf "%.0f" "$CPU_K") + MEM_MB=$((MEM_K / 1024)) + + if [[ "$CPU" -ge "$THRESHOLD_CPU" || "$MEM_MB" -ge "$THRESHOLD_MEM" || "$MEM_USED_MB" -ge "$TOTAL_MEM_THRESHOLD" ]]; then + TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") + echo "[$TIMESTAMP] ALERT: PID $SERVER_PID CPU=${CPU}% MEM=${MEM_MB}MB | System MEM=${MEM_USED_MB}MB" | tee -a "$LOG_FILE" + + if [[ "$AUTO_KILL" = true ]]; then + echo "[$TIMESTAMP] 🔪 Killing $PROCESS_NAME (PID $SERVER_PID)" | tee -a "$LOG_FILE" + kill -9 "$SERVER_PID" && echo "[$TIMESTAMP] $PROCESS_NAME killed." | tee -a "$LOG_FILE" + + if [[ ! -z "$STRESS_PID" ]]; then + echo "[$TIMESTAMP] 🔪 Killing stress script (PID $STRESS_PID)" | tee -a "$LOG_FILE" + kill -9 "$STRESS_PID" && echo "[$TIMESTAMP] Stress script killed." | tee -a "$LOG_FILE" + else + echo "[$TIMESTAMP] ℹ️ No stress script running." | tee -a "$LOG_FILE" + fi + else + echo "[$TIMESTAMP] AUTO_KILL is disabled — not killing processes." | tee -a "$LOG_FILE" + fi + fi + + if [[ "$MEM_USED_MB" -ge "$TOTAL_MEM_THRESHOLD" ]]; then + TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") + echo "[$TIMESTAMP] SYSTEM ALERT: Total memory usage = ${MEM_USED_MB}MB" | tee -a "$LOG_FILE" + fi + + sleep $CHECK_INTERVAL +done diff --git a/tools/req-jamlist-test.mjs b/tools/req-jamlist-test.mjs new file mode 100644 index 000000000..b52f1ebad --- /dev/null +++ b/tools/req-jamlist-test.mjs @@ -0,0 +1,61 @@ +#!/usr/bin/env zx +import fetch from 'node-fetch'; + +const TOTAL_REQUESTS = 500; +const CONCURRENCY = 20; +const endpoint = 'http://0.0.0.0:3000/jamlist'; + +const payload = { + all: "all" +}; + +let active = 0; +let completed = 0; +let failed = 0; + +const sendRequest = async (i) => { + try { + active++; + const res = await fetch(endpoint, { + method: 'POST', + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + + if (!res.ok) { + console.error(`[${i}] Failed: ${res.status}`); + failed++; + } else { + console.log(`[${i}] Success`); + } + } catch (err) { + console.error(`[${i}] Failed: ${res.status}`); + failed++; + } finally { + completed++; + active--; + } +}; + +const runLoadTest = async () => { + console.time('Test Duration'); + let queue = []; + + for (let i = 0; i < TOTAL_REQUESTS; i++) { + const task = sendRequest(i); + queue.push(task); + + if (queue.length >= CONCURRENCY) { + await Promise.all(queue); + queue = []; + } + } + + // Await any remaining requests + await Promise.all(queue); + + console.timeEnd('Test Duration'); + console.log(`\nResults: ${completed} completed, ${failed} failed.`); +}; + +await runLoadTest(); \ No newline at end of file diff --git a/tools/req-jamrun-test.mjs b/tools/req-jamrun-test.mjs new file mode 100644 index 000000000..f698d4d26 --- /dev/null +++ b/tools/req-jamrun-test.mjs @@ -0,0 +1,63 @@ +#!/usr/bin/env zx +import fetch from 'node-fetch'; + +const TOTAL_REQUESTS = 100; // start small to be safe! +const CONCURRENCY = 5; +const endpoint = 'http://0.0.0.0:3000/jamrun'; + +const payload = { + file: "jt1.jxe", + app_name: "DEMO", + bg: "bg" +}; + +let active = 0; +let completed = 0; +let failed = 0; + +const sendRequest = async (i) => { + try { + active++; + const res = await fetch(endpoint, { + method: 'POST', + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + + if (!res.ok) { + console.error(`[${i}] Failed: ${res.status}`); + failed++; + } else { + console.log(`[${i}] Success`); + } + } catch (err) { + console.error(`[${i}] Error: ${err.message}`); + failed++; + } finally { + completed++; + active--; + } +}; + +const runLoadTest = async () => { + console.time('Test Duration'); + let queue = []; + + for (let i = 0; i < TOTAL_REQUESTS; i++) { + const task = sendRequest(i); + queue.push(task); + + if (queue.length >= CONCURRENCY) { + await Promise.all(queue); + queue = []; + } + } + + // Await any remaining requests + await Promise.all(queue); + + console.timeEnd('Test Duration'); + console.log(`\nResults: ${completed} completed, ${failed} failed.`); +}; + +await runLoadTest(); diff --git a/tools/server_resource_alerts.log b/tools/server_resource_alerts.log new file mode 100644 index 000000000..24144db5a --- /dev/null +++ b/tools/server_resource_alerts.log @@ -0,0 +1,41 @@ +[2025-03-26 19:19:55] app-docker.js not running. +[2025-03-26 19:19:57] app-docker.js not running. +[2025-03-26 19:19:59] app-docker.js not running. +[2025-03-26 19:21:40] ALERT: PID 2293772 CPU=1% MEM=50MB | System MEM=6036MB +[2025-03-26 19:21:40] 🔪 Killing app-docker.js (PID 2293772) +[2025-03-26 19:21:40] app-docker.js killed. +[2025-03-26 19:21:40] 🔪 Killing stress script (PID 2296600) +[2025-03-26 19:21:40] Stress script killed. +[2025-03-26 19:21:40] SYSTEM ALERT: Total memory usage = 6036MB +[2025-03-26 19:21:42] app-docker.js not running. +[2025-03-26 19:21:44] app-docker.js not running. +[2025-03-26 19:21:46] app-docker.js not running. +[2025-03-26 19:21:48] app-docker.js not running. +[2025-03-26 19:21:50] app-docker.js not running. +[2025-03-26 19:21:52] app-docker.js not running. +[2025-03-26 19:21:54] app-docker.js not running. +[2025-03-26 19:21:56] app-docker.js not running. +[2025-03-26 19:21:59] app-docker.js not running. +[2025-03-26 19:22:01] app-docker.js not running. +[2025-03-26 19:22:03] app-docker.js not running. +[2025-03-26 19:22:05] app-docker.js not running. +[2025-03-26 19:22:07] app-docker.js not running. +[2025-03-26 19:22:09] app-docker.js not running. +[2025-03-26 19:22:11] app-docker.js not running. +[2025-03-26 19:22:13] app-docker.js not running. +[2025-03-26 19:22:15] app-docker.js not running. +[2025-03-26 19:22:17] app-docker.js not running. +[2025-03-26 19:22:19] app-docker.js not running. +[2025-03-26 19:22:21] app-docker.js not running. +[2025-03-26 19:22:23] app-docker.js not running. +[2025-03-26 19:22:25] app-docker.js not running. +[2025-03-26 19:22:27] app-docker.js not running. +[2025-03-26 19:22:29] app-docker.js not running. +[2025-03-26 19:22:32] app-docker.js not running. +[2025-03-26 19:22:34] app-docker.js not running. +[2025-03-26 19:22:36] app-docker.js not running. +[2025-03-26 19:22:38] app-docker.js not running. +[2025-03-26 19:22:40] app-docker.js not running. +[2025-03-26 19:26:02] app-docker.js not running. +[2025-03-26 19:26:04] app-docker.js not running. +[2025-03-26 20:02:51] app-docker.js not running. From 29e0028fcf8ab15c341c6c30b108ebe110870c78 Mon Sep 17 00:00:00 2001 From: Woojin Date: Mon, 7 Apr 2025 19:09:32 -0400 Subject: [PATCH 123/126] updating ansible playbooks and adding performance test scripts --- tools/file-jamrun-test.mjs | 78 + tools/file-monitor.sh | 40 + tools/filetest_monitor_alerts.log | 29 + tools/inc/mach_tools.sh | 6 + tools/jamkill-playbook.yml | 2 +- tools/jamrun-playbook.yml | 23 +- tools/jamterm-playbook.yml | 24 +- tools/req-jamrun-test.mjs | 48 +- tools/server_resource_alerts.log | 3330 +++++++++++++++++++++++++++++ tools/serverkill-playbook.yml | 22 + tools/serverrun-playbook.yml | 22 + 11 files changed, 3575 insertions(+), 49 deletions(-) create mode 100644 tools/file-jamrun-test.mjs create mode 100755 tools/file-monitor.sh create mode 100644 tools/filetest_monitor_alerts.log create mode 100644 tools/serverkill-playbook.yml create mode 100644 tools/serverrun-playbook.yml diff --git a/tools/file-jamrun-test.mjs b/tools/file-jamrun-test.mjs new file mode 100644 index 000000000..61696034b --- /dev/null +++ b/tools/file-jamrun-test.mjs @@ -0,0 +1,78 @@ +#!/usr/bin/env zx +import os from 'os'; +import process from 'process'; + +const TOTAL_REQUESTS = 75; +const CONCURRENCY = 5; +const FILE = 'jt1.jxe'; +const APP = 'DEMO'; +const BG = true; + +let active = 0; +let completed = 0; +let failed = 0; +let queue = []; +const checkpoints = []; +const requestDurations = []; + +console.time('Test Duration'); + +const runJamrun = async (i) => { + const args = ['jamrun.mjs', FILE, `--app=${APP}`]; + if (BG) args.push('--bg'); + + const start = Date.now(); + try { + await $`zx ${args}`; + const duration = Date.now() - start; + requestDurations[i] = duration; + console.log(`[${i}] Success`); + } catch (err) { + console.error(`[${i}] Failed: ${err.message}`); + failed++; + } finally { + completed++; + + if (completed % 10 === 0) { + const avgDuration = requestDurations + .slice(completed - 10, completed) + .reduce((a, b) => a + b, 0) / 10; + + const mem = process.memoryUsage(); + const cpu = os.loadavg()[0]; + + checkpoints.push({ + requests: completed, + avgDurationMs: avgDuration.toFixed(2), + memoryMB: (mem.rss / 1024 / 1024).toFixed(2), + cpuLoad: cpu.toFixed(2), + }); + } + } +}; + +const runTest = async () => { + for (let i = 0; i < TOTAL_REQUESTS; i++) { + const task = runJamrun(i); + queue.push(task); + + if (queue.length >= CONCURRENCY) { + await Promise.all(queue); + queue = []; + } + } + + await Promise.all(queue); // Finish remaining +}; + +await runTest(); +console.timeEnd('Test Duration'); + +console.log(`\nResults: ${completed} completed, ${failed} failed.`); + +// Output checkpoint table +console.log('\nCheckpoint Summary (Every 10 Requests)'); +console.log('Reqs\tAvg Time (ms)\tMemory (MB)\tCPU Load'); +checkpoints.forEach(cp => { + console.log(`${cp.requests}\t${cp.avgDurationMs}\t\t${cp.memoryMB}\t\t${cp.cpuLoad}`); +}); diff --git a/tools/file-monitor.sh b/tools/file-monitor.sh new file mode 100755 index 000000000..a3884378b --- /dev/null +++ b/tools/file-monitor.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# CONFIGURATION +TOTAL_MEM_THRESHOLD=6000 # Total system memory in MB +CHECK_INTERVAL=2 # Time between checks (in seconds) +LOG_FILE="filetest_monitor_alerts.log" +TEST_SCRIPT_NAME="file-jamrun-test.mjs" +AUTO_KILL=true + +echo "🛡️ Monitoring system memory during file-based JAMScript test..." +echo "Kill threshold: ${TOTAL_MEM_THRESHOLD}MB total system memory" +echo "Logging alerts to: $LOG_FILE" +echo "Auto-kill enabled: $AUTO_KILL" +echo "----------------------------------------------" + +while true; do + TEST_PID=$(pgrep -f "$TEST_SCRIPT_NAME") + + if [[ -z "$TEST_PID" ]]; then + echo "[$(date "+%Y-%m-%d %H:%M:%S")] $TEST_SCRIPT_NAME not running. Waiting..." | tee -a "$LOG_FILE" + sleep $CHECK_INTERVAL + continue + fi + + MEM_USED_MB=$(free -m | awk '/Mem:/ {print $3}') + + if [[ "$MEM_USED_MB" -ge "$TOTAL_MEM_THRESHOLD" ]]; then + TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") + echo "[$TIMESTAMP] SYSTEM MEMORY ALERT: ${MEM_USED_MB}MB used." | tee -a "$LOG_FILE" + + if [[ "$AUTO_KILL" = true ]]; then + echo "[$TIMESTAMP] Killing test script (PID $TEST_PID)" | tee -a "$LOG_FILE" + kill -9 "$TEST_PID" && echo "[$TIMESTAMP] $TEST_SCRIPT_NAME killed." | tee -a "$LOG_FILE" + else + echo "[$TIMESTAMP] AUTO_KILL is disabled — not killing test." | tee -a "$LOG_FILE" + fi + fi + + sleep $CHECK_INTERVAL +done diff --git a/tools/filetest_monitor_alerts.log b/tools/filetest_monitor_alerts.log new file mode 100644 index 000000000..873fd55ee --- /dev/null +++ b/tools/filetest_monitor_alerts.log @@ -0,0 +1,29 @@ +[2025-03-30 12:36:41] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:36:43] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:36:45] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:36:47] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:36:49] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:36:51] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:40] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:42] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:44] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:46] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:48] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:50] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:52] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:54] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:56] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:37:58] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:01] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:03] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:05] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:07] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:09] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:11] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:13] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:15] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:17] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:19] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:21] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:23] file-jamrun-test.mjs not running. Waiting... +[2025-03-30 12:38:25] file-jamrun-test.mjs not running. Waiting... diff --git a/tools/inc/mach_tools.sh b/tools/inc/mach_tools.sh index 7841817a9..165d4a7c0 100644 --- a/tools/inc/mach_tools.sh +++ b/tools/inc/mach_tools.sh @@ -79,6 +79,9 @@ startzonemach() { count=$(( $newcount + 1 )) fi + # Remove existing container with same name if it exists + docker rm -f $machname 2>/dev/null + echo "Machine: " $machname " starting with IP: " 10.$subnet.$zonenum.$count # Create the machine @@ -134,6 +137,9 @@ startglobalmach() { count=$(( $newcount + 1 )) fi + # Remove existing container with same name if it exists + docker rm -f $machname 2>/dev/null + # Create the machine if [ -z $dport ] && [ -z $hport ]; then if [ -z $mount ]; then diff --git a/tools/jamkill-playbook.yml b/tools/jamkill-playbook.yml index edc094ed3..0a7a78ff5 100644 --- a/tools/jamkill-playbook.yml +++ b/tools/jamkill-playbook.yml @@ -10,4 +10,4 @@ - name: Run kill command and store logs shell: zx wrapper.mjs jamkill --serverIP={{ ansible_host }} > jamkill.log 2>&1 args: - chdir: /home/jamtools/JAMScript/tools + chdir: /home/jamtools/JAMScript/tools \ No newline at end of file diff --git a/tools/jamrun-playbook.yml b/tools/jamrun-playbook.yml index 966bf6da3..a31c2d65f 100644 --- a/tools/jamrun-playbook.yml +++ b/tools/jamrun-playbook.yml @@ -1,4 +1,4 @@ -- name: Start JAMScript Server and Run JAMRun Command +- name: Run JAMRun Command hosts: "{{ server }}" gather_facts: no tasks: @@ -7,26 +7,7 @@ args: chdir: /home/jamtools/JAMScript/tools - - name: Start the server (Express API) in the background - shell: nohup node app-docker.js > server.log 2>&1 & - args: - chdir: /home/jamtools/JAMScript/tools - async: 10 - poll: 0 - - - name: Wait until the server port is open - wait_for: - host: "{{ ansible_host }}" - port: 3000 - delay: 3 - timeout: 30 - - name: Run JAMRun command and store logs shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1 args: - chdir: /home/jamtools/JAMScript/tools - - # - name: Run JAMKill - # shell: zx wrapper.mjs jamkill - # args: - # chdir: /home/jamtools/JAMScript/tools + chdir: /home/jamtools/JAMScript/tools \ No newline at end of file diff --git a/tools/jamterm-playbook.yml b/tools/jamterm-playbook.yml index 6715dccb8..c99fd462f 100644 --- a/tools/jamterm-playbook.yml +++ b/tools/jamterm-playbook.yml @@ -7,24 +7,10 @@ args: chdir: /home/jamtools/JAMScript/tools - - name: Start the server (Express API) in the background - shell: nohup node app-docker.js > server.log 2>&1 & + - name: Run JAMTerm with or without tmux param, and log output + shell: > + { + {{ 'zx wrapper.mjs jamterm ' ~ tmux if tmux is defined else 'zx wrapper.mjs jamterm' }} + } > jamterm.log 2>&1 args: chdir: /home/jamtools/JAMScript/tools - async: 10 - poll: 0 - - - name: Wait for the server to initialize - pause: - seconds: 5 - - - name: Run JAMRun command and store logs - shell: zx wrapper.mjs jamrun "{{ file }}" "{{ app }}" --bg --serverIP={{ ansible_host }} > jamrun.log 2>&1 - args: - chdir: /home/jamtools/JAMScript/tools - - - name: Run term command and store logs - shell: zx wrapper.mjs jamterm > jamterm.log 2>&1 - args: - chdir: /home/jamtools/JAMScript/tools - diff --git a/tools/req-jamrun-test.mjs b/tools/req-jamrun-test.mjs index f698d4d26..ad0f00f7a 100644 --- a/tools/req-jamrun-test.mjs +++ b/tools/req-jamrun-test.mjs @@ -1,7 +1,9 @@ #!/usr/bin/env zx import fetch from 'node-fetch'; +import os from 'os'; +import process from 'process'; -const TOTAL_REQUESTS = 100; // start small to be safe! +const TOTAL_REQUESTS = 100; const CONCURRENCY = 5; const endpoint = 'http://0.0.0.0:3000/jamrun'; @@ -14,8 +16,14 @@ const payload = { let active = 0; let completed = 0; let failed = 0; +let queue = []; +const checkpoints = []; +const requestDurations = []; + +console.time('Test Duration'); const sendRequest = async (i) => { + const start = Date.now(); try { active++; const res = await fetch(endpoint, { @@ -24,6 +32,9 @@ const sendRequest = async (i) => { body: JSON.stringify(payload), }); + const duration = Date.now() - start; + requestDurations[i] = duration; + if (!res.ok) { console.error(`[${i}] Failed: ${res.status}`); failed++; @@ -36,13 +47,27 @@ const sendRequest = async (i) => { } finally { completed++; active--; + + // Record checkpoint every 10 completed requests + if (completed % 10 === 0) { + const avgDuration = requestDurations + .slice(completed - 10, completed) + .reduce((a, b) => a + b, 0) / 10; + + const mem = process.memoryUsage(); + const cpu = os.loadavg()[0]; + + checkpoints.push({ + requests: completed, + avgDurationMs: avgDuration.toFixed(2), + memoryMB: (mem.rss / 1024 / 1024).toFixed(2), + cpuLoad: cpu.toFixed(2), + }); + } } }; const runLoadTest = async () => { - console.time('Test Duration'); - let queue = []; - for (let i = 0; i < TOTAL_REQUESTS; i++) { const task = sendRequest(i); queue.push(task); @@ -53,11 +78,18 @@ const runLoadTest = async () => { } } - // Await any remaining requests + // Await remaining requests await Promise.all(queue); - - console.timeEnd('Test Duration'); - console.log(`\nResults: ${completed} completed, ${failed} failed.`); }; await runLoadTest(); +console.timeEnd('Test Duration'); + +console.log(`\nResults: ${completed} completed, ${failed} failed.`); + +// Print summary +console.log('\nCheckpoint Summary (Every 10 Requests)'); +console.log('Reqs\tAvg Time (ms)\tMemory (MB)\tCPU Load'); +checkpoints.forEach(cp => { + console.log(`${cp.requests}\t${cp.avgDurationMs}\t\t${cp.memoryMB}\t\t${cp.cpuLoad}`); +}); diff --git a/tools/server_resource_alerts.log b/tools/server_resource_alerts.log index 24144db5a..dcd3eead8 100644 --- a/tools/server_resource_alerts.log +++ b/tools/server_resource_alerts.log @@ -39,3 +39,3333 @@ [2025-03-26 19:26:02] app-docker.js not running. [2025-03-26 19:26:04] app-docker.js not running. [2025-03-26 20:02:51] app-docker.js not running. +[2025-03-30 11:48:21] app-docker.js not running. +[2025-03-30 11:48:23] app-docker.js not running. +[2025-03-30 11:48:25] app-docker.js not running. +[2025-03-30 11:48:27] app-docker.js not running. +[2025-03-30 11:48:29] app-docker.js not running. +[2025-03-30 11:48:31] app-docker.js not running. +[2025-03-30 11:48:33] app-docker.js not running. +[2025-03-30 11:48:35] app-docker.js not running. +[2025-03-30 11:48:37] app-docker.js not running. +[2025-03-30 11:48:39] app-docker.js not running. +[2025-03-30 11:49:35] ALERT: PID 74290 CPU=1% MEM=42MB | System MEM=6206MB +[2025-03-30 11:49:35] 🔪 Killing app-docker.js (PID 74290) +[2025-03-30 11:49:35] app-docker.js killed. +[2025-03-30 11:49:35] ℹ️ No stress script running. +[2025-03-30 11:49:35] SYSTEM ALERT: Total memory usage = 6206MB +[2025-03-30 11:49:37] app-docker.js not running. +[2025-03-30 11:49:39] app-docker.js not running. +[2025-03-30 11:49:41] app-docker.js not running. +[2025-03-30 11:49:43] app-docker.js not running. +[2025-03-30 11:49:45] app-docker.js not running. +[2025-03-30 11:49:47] app-docker.js not running. +[2025-03-30 11:49:49] app-docker.js not running. +[2025-03-30 11:49:51] app-docker.js not running. +[2025-03-30 11:49:53] app-docker.js not running. +[2025-03-30 11:49:55] app-docker.js not running. +[2025-03-30 11:49:58] app-docker.js not running. +[2025-03-30 11:50:00] app-docker.js not running. +[2025-03-30 11:50:02] app-docker.js not running. +[2025-03-30 11:50:04] app-docker.js not running. +[2025-03-30 11:50:06] app-docker.js not running. +[2025-03-30 11:50:08] app-docker.js not running. +[2025-03-30 11:50:10] app-docker.js not running. +[2025-03-30 11:50:12] app-docker.js not running. +[2025-03-30 11:50:14] app-docker.js not running. +[2025-03-30 11:50:16] app-docker.js not running. +[2025-03-30 11:50:18] app-docker.js not running. +[2025-03-30 11:50:20] app-docker.js not running. +[2025-03-30 11:50:22] app-docker.js not running. +[2025-03-30 11:50:24] app-docker.js not running. +[2025-03-30 11:50:26] app-docker.js not running. +[2025-03-30 11:50:28] app-docker.js not running. +[2025-03-30 11:50:30] app-docker.js not running. +[2025-03-30 11:50:32] app-docker.js not running. +[2025-03-30 11:50:34] app-docker.js not running. +[2025-03-30 11:50:36] app-docker.js not running. +[2025-03-30 11:50:38] app-docker.js not running. +[2025-03-30 11:50:40] app-docker.js not running. +[2025-03-30 11:50:42] app-docker.js not running. +[2025-03-30 11:50:44] app-docker.js not running. +[2025-03-30 11:50:46] app-docker.js not running. +[2025-03-30 11:50:48] app-docker.js not running. +[2025-03-30 11:50:50] app-docker.js not running. +[2025-03-30 11:50:52] app-docker.js not running. +[2025-03-30 11:50:55] app-docker.js not running. +[2025-03-30 11:50:57] app-docker.js not running. +[2025-03-30 11:50:59] app-docker.js not running. +[2025-03-30 11:51:01] app-docker.js not running. +[2025-03-30 11:51:03] app-docker.js not running. +[2025-03-30 11:51:05] app-docker.js not running. +[2025-03-30 11:51:07] app-docker.js not running. +[2025-03-30 11:51:09] app-docker.js not running. +[2025-03-30 11:51:11] app-docker.js not running. +[2025-03-30 11:51:13] app-docker.js not running. +[2025-03-30 11:51:15] app-docker.js not running. +[2025-03-30 11:51:17] app-docker.js not running. +[2025-03-30 11:51:19] app-docker.js not running. +[2025-03-30 11:51:21] app-docker.js not running. +[2025-03-30 11:51:23] app-docker.js not running. +[2025-03-30 11:51:25] app-docker.js not running. +[2025-03-30 11:51:27] app-docker.js not running. +[2025-03-30 11:51:29] app-docker.js not running. +[2025-03-30 11:51:31] app-docker.js not running. +[2025-03-30 11:51:33] app-docker.js not running. +[2025-03-30 11:51:35] app-docker.js not running. +[2025-03-30 11:51:37] app-docker.js not running. +[2025-03-30 11:51:39] app-docker.js not running. +[2025-03-30 11:51:41] app-docker.js not running. +[2025-03-30 11:51:43] app-docker.js not running. +[2025-03-30 11:51:45] app-docker.js not running. +[2025-03-30 11:51:47] app-docker.js not running. +[2025-03-30 11:51:49] app-docker.js not running. +[2025-03-30 11:51:51] app-docker.js not running. +[2025-03-30 11:51:53] app-docker.js not running. +[2025-03-30 11:51:55] app-docker.js not running. +[2025-03-30 11:51:57] app-docker.js not running. +[2025-03-30 11:51:59] app-docker.js not running. +[2025-03-30 11:52:01] app-docker.js not running. +[2025-03-30 11:52:04] app-docker.js not running. +[2025-03-30 11:52:06] app-docker.js not running. +[2025-03-30 11:52:08] app-docker.js not running. +[2025-03-30 11:52:10] app-docker.js not running. +[2025-03-30 11:52:12] app-docker.js not running. +[2025-03-30 11:52:14] app-docker.js not running. +[2025-03-30 11:52:16] app-docker.js not running. +[2025-03-30 11:52:18] app-docker.js not running. +[2025-03-30 11:52:20] app-docker.js not running. +[2025-03-30 11:52:22] app-docker.js not running. +[2025-03-30 11:52:24] app-docker.js not running. +[2025-03-30 11:52:26] app-docker.js not running. +[2025-03-30 11:52:28] app-docker.js not running. +[2025-03-30 11:52:30] app-docker.js not running. +[2025-03-30 11:52:32] app-docker.js not running. +[2025-03-30 11:52:34] app-docker.js not running. +[2025-03-30 11:52:36] app-docker.js not running. +[2025-03-30 11:52:38] app-docker.js not running. +[2025-03-30 11:52:40] app-docker.js not running. +[2025-03-30 11:52:42] app-docker.js not running. +[2025-03-30 11:52:44] app-docker.js not running. +[2025-03-30 11:52:46] app-docker.js not running. +[2025-03-30 11:52:48] app-docker.js not running. +[2025-03-30 11:52:50] app-docker.js not running. +[2025-03-30 11:52:52] app-docker.js not running. +[2025-03-30 11:52:54] app-docker.js not running. +[2025-03-30 11:52:56] app-docker.js not running. +[2025-03-30 11:52:58] app-docker.js not running. +[2025-03-30 11:53:00] app-docker.js not running. +[2025-03-30 11:53:02] app-docker.js not running. +[2025-03-30 11:53:04] app-docker.js not running. +[2025-03-30 11:53:06] app-docker.js not running. +[2025-03-30 11:53:08] app-docker.js not running. +[2025-03-30 11:53:10] app-docker.js not running. +[2025-03-30 11:53:12] app-docker.js not running. +[2025-03-30 11:53:15] app-docker.js not running. +[2025-03-30 11:53:17] app-docker.js not running. +[2025-03-30 11:53:19] app-docker.js not running. +[2025-03-30 11:53:21] app-docker.js not running. +[2025-03-30 11:53:23] app-docker.js not running. +[2025-03-30 11:54:26] ALERT: PID 142708 CPU=1% MEM=61MB | System MEM=6265MB +[2025-03-30 11:54:26] 🔪 Killing app-docker.js (PID 142708) +[2025-03-30 11:54:26] app-docker.js killed. +[2025-03-30 11:54:26] ℹ️ No stress script running. +[2025-03-30 11:54:27] SYSTEM ALERT: Total memory usage = 6265MB +[2025-03-30 11:54:29] app-docker.js not running. +[2025-03-30 11:54:31] app-docker.js not running. +[2025-03-30 11:54:33] app-docker.js not running. +[2025-03-30 11:54:35] app-docker.js not running. +[2025-03-30 11:54:37] app-docker.js not running. +[2025-03-30 11:54:39] app-docker.js not running. +[2025-03-30 11:54:41] app-docker.js not running. +[2025-03-30 11:54:43] app-docker.js not running. +[2025-03-30 11:54:45] app-docker.js not running. +[2025-03-30 11:54:47] app-docker.js not running. +[2025-03-30 11:54:49] app-docker.js not running. +[2025-03-30 11:54:51] app-docker.js not running. +[2025-03-30 11:54:53] app-docker.js not running. +[2025-03-30 11:54:55] app-docker.js not running. +[2025-03-30 11:54:57] app-docker.js not running. +[2025-03-30 11:54:59] app-docker.js not running. +[2025-03-30 11:55:01] app-docker.js not running. +[2025-03-30 11:55:03] app-docker.js not running. +[2025-03-30 11:55:05] app-docker.js not running. +[2025-03-30 11:55:07] app-docker.js not running. +[2025-03-30 11:55:09] app-docker.js not running. +[2025-03-30 11:55:11] app-docker.js not running. +[2025-03-30 11:55:13] app-docker.js not running. +[2025-03-30 11:55:15] app-docker.js not running. +[2025-03-30 11:55:17] app-docker.js not running. +[2025-03-30 11:55:19] app-docker.js not running. +[2025-03-30 11:55:21] app-docker.js not running. +[2025-03-30 11:55:23] app-docker.js not running. +[2025-03-30 11:55:25] app-docker.js not running. +[2025-03-30 11:55:28] app-docker.js not running. +[2025-03-30 11:55:30] app-docker.js not running. +[2025-03-30 11:55:32] app-docker.js not running. +[2025-03-30 11:55:34] app-docker.js not running. +[2025-03-30 11:55:36] app-docker.js not running. +[2025-03-30 11:55:38] app-docker.js not running. +[2025-03-30 11:55:40] app-docker.js not running. +[2025-03-30 11:55:42] app-docker.js not running. +[2025-03-30 11:55:44] app-docker.js not running. +[2025-03-30 11:55:46] app-docker.js not running. +[2025-03-30 11:55:48] app-docker.js not running. +[2025-03-30 11:55:50] app-docker.js not running. +[2025-03-30 11:55:52] app-docker.js not running. +[2025-03-30 11:55:54] app-docker.js not running. +[2025-03-30 11:55:56] app-docker.js not running. +[2025-03-30 11:55:58] app-docker.js not running. +[2025-03-30 11:56:00] app-docker.js not running. +[2025-03-30 11:56:02] app-docker.js not running. +[2025-03-30 11:56:04] app-docker.js not running. +[2025-03-30 11:56:06] app-docker.js not running. +[2025-03-30 11:56:08] app-docker.js not running. +[2025-03-30 11:56:10] app-docker.js not running. +[2025-03-30 11:56:12] app-docker.js not running. +[2025-03-30 11:56:14] app-docker.js not running. +[2025-03-30 11:56:16] app-docker.js not running. +[2025-03-30 11:56:18] app-docker.js not running. +[2025-03-30 11:56:20] app-docker.js not running. +[2025-03-30 11:56:22] app-docker.js not running. +[2025-03-30 11:56:24] app-docker.js not running. +[2025-03-30 11:56:26] app-docker.js not running. +[2025-03-30 11:56:28] app-docker.js not running. +[2025-03-30 11:56:30] app-docker.js not running. +[2025-03-30 11:56:33] app-docker.js not running. +[2025-03-30 11:56:35] app-docker.js not running. +[2025-03-30 11:56:37] app-docker.js not running. +[2025-03-30 11:56:39] app-docker.js not running. +[2025-03-30 11:56:41] app-docker.js not running. +[2025-03-30 11:56:43] app-docker.js not running. +[2025-03-30 11:56:45] app-docker.js not running. +[2025-03-30 11:56:47] app-docker.js not running. +[2025-03-30 11:56:49] app-docker.js not running. +[2025-03-30 11:56:51] app-docker.js not running. +[2025-03-30 11:56:53] app-docker.js not running. +[2025-03-30 11:56:55] app-docker.js not running. +[2025-03-30 11:56:57] app-docker.js not running. +[2025-03-30 11:56:59] app-docker.js not running. +[2025-03-30 11:57:01] app-docker.js not running. +[2025-03-30 11:57:03] app-docker.js not running. +[2025-03-30 11:57:05] app-docker.js not running. +[2025-03-30 11:57:07] app-docker.js not running. +[2025-03-30 11:57:09] app-docker.js not running. +[2025-03-30 11:57:11] app-docker.js not running. +[2025-03-30 11:57:13] app-docker.js not running. +[2025-03-30 11:57:15] app-docker.js not running. +[2025-03-30 11:57:17] app-docker.js not running. +[2025-03-30 11:57:19] app-docker.js not running. +[2025-03-30 11:57:21] app-docker.js not running. +[2025-03-30 11:57:23] app-docker.js not running. +[2025-03-30 11:57:25] app-docker.js not running. +[2025-03-30 11:57:27] app-docker.js not running. +[2025-03-30 11:57:29] app-docker.js not running. +[2025-03-30 11:57:31] app-docker.js not running. +[2025-03-30 11:57:33] app-docker.js not running. +[2025-03-30 11:57:35] app-docker.js not running. +[2025-03-30 11:57:37] app-docker.js not running. +[2025-03-30 11:57:40] app-docker.js not running. +[2025-03-30 11:57:42] app-docker.js not running. +[2025-03-30 11:57:44] app-docker.js not running. +[2025-03-30 11:57:46] app-docker.js not running. +[2025-03-30 11:57:48] app-docker.js not running. +[2025-03-30 11:57:50] app-docker.js not running. +[2025-03-30 11:57:52] app-docker.js not running. +[2025-03-30 11:57:54] app-docker.js not running. +[2025-03-30 11:57:56] app-docker.js not running. +[2025-03-30 11:57:58] app-docker.js not running. +[2025-03-30 11:58:00] app-docker.js not running. +[2025-03-30 11:58:02] app-docker.js not running. +[2025-03-30 11:58:04] app-docker.js not running. +[2025-03-30 11:58:06] app-docker.js not running. +[2025-03-30 11:58:08] app-docker.js not running. +[2025-03-30 11:58:10] app-docker.js not running. +[2025-03-30 11:58:12] app-docker.js not running. +[2025-03-30 11:58:14] app-docker.js not running. +[2025-03-30 11:58:16] app-docker.js not running. +[2025-03-30 11:58:18] app-docker.js not running. +[2025-03-30 11:58:20] app-docker.js not running. +[2025-03-30 11:58:22] app-docker.js not running. +[2025-03-30 11:58:24] app-docker.js not running. +[2025-03-30 11:58:26] app-docker.js not running. +[2025-03-30 11:58:28] app-docker.js not running. +[2025-03-30 11:58:30] app-docker.js not running. +[2025-03-30 11:58:32] app-docker.js not running. +[2025-03-30 11:58:34] app-docker.js not running. +[2025-03-30 11:58:36] app-docker.js not running. +[2025-03-30 11:58:38] app-docker.js not running. +[2025-03-30 11:58:40] app-docker.js not running. +[2025-03-30 11:58:42] app-docker.js not running. +[2025-03-30 11:58:45] app-docker.js not running. +[2025-03-30 11:58:47] app-docker.js not running. +[2025-03-30 11:58:49] app-docker.js not running. +[2025-03-30 11:58:51] app-docker.js not running. +[2025-03-30 11:58:53] app-docker.js not running. +[2025-03-30 11:58:55] app-docker.js not running. +[2025-03-30 11:58:57] app-docker.js not running. +[2025-03-30 11:58:59] app-docker.js not running. +[2025-03-30 11:59:01] app-docker.js not running. +[2025-03-30 11:59:03] app-docker.js not running. +[2025-03-30 11:59:05] app-docker.js not running. +[2025-03-30 11:59:07] app-docker.js not running. +[2025-03-30 11:59:09] app-docker.js not running. +[2025-03-30 11:59:11] app-docker.js not running. +[2025-03-30 11:59:13] app-docker.js not running. +[2025-03-30 11:59:15] app-docker.js not running. +[2025-03-30 11:59:17] app-docker.js not running. +[2025-03-30 11:59:19] app-docker.js not running. +[2025-03-30 11:59:21] app-docker.js not running. +[2025-03-30 11:59:23] app-docker.js not running. +[2025-03-30 11:59:25] app-docker.js not running. +[2025-03-30 11:59:27] app-docker.js not running. +[2025-03-30 11:59:29] app-docker.js not running. +[2025-03-30 11:59:31] app-docker.js not running. +[2025-03-30 11:59:33] app-docker.js not running. +[2025-03-30 11:59:35] app-docker.js not running. +[2025-03-30 11:59:37] app-docker.js not running. +[2025-03-30 11:59:39] app-docker.js not running. +[2025-03-30 11:59:41] app-docker.js not running. +[2025-03-30 11:59:43] app-docker.js not running. +[2025-03-30 11:59:45] app-docker.js not running. +[2025-03-30 11:59:47] app-docker.js not running. +[2025-03-30 11:59:49] app-docker.js not running. +[2025-03-30 11:59:52] app-docker.js not running. +[2025-03-30 11:59:54] app-docker.js not running. +[2025-03-30 11:59:56] app-docker.js not running. +[2025-03-30 11:59:58] app-docker.js not running. +[2025-03-30 12:00:00] app-docker.js not running. +[2025-03-30 12:00:02] app-docker.js not running. +[2025-03-30 12:00:04] app-docker.js not running. +[2025-03-30 12:00:06] app-docker.js not running. +[2025-03-30 12:00:08] app-docker.js not running. +[2025-03-30 12:00:10] app-docker.js not running. +[2025-03-30 12:00:12] app-docker.js not running. +[2025-03-30 12:00:14] app-docker.js not running. +[2025-03-30 12:00:16] app-docker.js not running. +[2025-03-30 12:00:18] app-docker.js not running. +[2025-03-30 12:00:20] app-docker.js not running. +[2025-03-30 12:00:22] app-docker.js not running. +[2025-03-30 12:00:24] app-docker.js not running. +[2025-03-30 12:00:26] app-docker.js not running. +[2025-03-30 12:00:28] app-docker.js not running. +[2025-03-30 12:00:30] app-docker.js not running. +[2025-03-30 12:00:32] app-docker.js not running. +[2025-03-30 12:00:34] app-docker.js not running. +[2025-03-30 12:00:36] app-docker.js not running. +[2025-03-30 12:00:38] app-docker.js not running. +[2025-03-30 12:00:40] app-docker.js not running. +[2025-03-30 12:00:42] app-docker.js not running. +[2025-03-30 12:00:44] app-docker.js not running. +[2025-03-30 12:00:46] app-docker.js not running. +[2025-03-30 12:00:48] app-docker.js not running. +[2025-03-30 12:00:50] app-docker.js not running. +[2025-03-30 12:00:52] app-docker.js not running. +[2025-03-30 12:00:54] app-docker.js not running. +[2025-03-30 12:00:56] app-docker.js not running. +[2025-03-30 12:00:58] app-docker.js not running. +[2025-03-30 12:01:00] app-docker.js not running. +[2025-03-30 12:01:03] app-docker.js not running. +[2025-03-30 12:01:05] app-docker.js not running. +[2025-03-30 12:01:07] app-docker.js not running. +[2025-03-30 12:01:09] app-docker.js not running. +[2025-03-30 12:01:11] app-docker.js not running. +[2025-03-30 12:01:13] app-docker.js not running. +[2025-03-30 12:01:15] app-docker.js not running. +[2025-03-30 12:01:17] app-docker.js not running. +[2025-03-30 12:01:19] app-docker.js not running. +[2025-03-30 12:01:21] app-docker.js not running. +[2025-03-30 12:01:23] app-docker.js not running. +[2025-03-30 12:01:25] app-docker.js not running. +[2025-03-30 12:01:27] app-docker.js not running. +[2025-03-30 12:01:29] app-docker.js not running. +[2025-03-30 12:01:31] app-docker.js not running. +[2025-03-30 12:01:33] app-docker.js not running. +[2025-03-30 12:01:35] app-docker.js not running. +[2025-03-30 12:01:37] app-docker.js not running. +[2025-03-30 12:01:39] app-docker.js not running. +[2025-03-30 12:01:41] app-docker.js not running. +[2025-03-30 12:01:43] app-docker.js not running. +[2025-03-30 12:01:45] app-docker.js not running. +[2025-03-30 12:01:47] app-docker.js not running. +[2025-03-30 12:01:49] app-docker.js not running. +[2025-03-30 12:01:51] app-docker.js not running. +[2025-03-30 12:01:53] app-docker.js not running. +[2025-03-30 12:01:55] app-docker.js not running. +[2025-03-30 12:01:57] app-docker.js not running. +[2025-03-30 12:01:59] app-docker.js not running. +[2025-03-30 12:02:01] app-docker.js not running. +[2025-03-30 12:02:03] app-docker.js not running. +[2025-03-30 12:02:05] app-docker.js not running. +[2025-03-30 12:02:07] app-docker.js not running. +[2025-03-30 12:02:09] app-docker.js not running. +[2025-03-30 12:02:11] app-docker.js not running. +[2025-03-30 12:02:13] app-docker.js not running. +[2025-03-30 12:02:15] app-docker.js not running. +[2025-03-30 12:02:17] app-docker.js not running. +[2025-03-30 12:02:20] app-docker.js not running. +[2025-03-30 12:02:22] app-docker.js not running. +[2025-03-30 12:02:24] app-docker.js not running. +[2025-03-30 12:02:26] app-docker.js not running. +[2025-03-30 12:02:28] app-docker.js not running. +[2025-03-30 12:02:30] app-docker.js not running. +[2025-03-30 12:02:32] app-docker.js not running. +[2025-03-30 12:02:34] app-docker.js not running. +[2025-03-30 12:02:36] app-docker.js not running. +[2025-03-30 12:02:38] app-docker.js not running. +[2025-03-30 12:02:40] app-docker.js not running. +[2025-03-30 12:02:42] app-docker.js not running. +[2025-03-30 12:02:44] app-docker.js not running. +[2025-03-30 12:02:46] app-docker.js not running. +[2025-03-30 12:02:48] app-docker.js not running. +[2025-03-30 12:02:50] app-docker.js not running. +[2025-03-30 12:02:52] app-docker.js not running. +[2025-03-30 12:02:54] app-docker.js not running. +[2025-03-30 12:02:56] app-docker.js not running. +[2025-03-30 12:02:58] app-docker.js not running. +[2025-03-30 12:03:00] app-docker.js not running. +[2025-03-30 12:03:02] app-docker.js not running. +[2025-03-30 12:03:04] app-docker.js not running. +[2025-03-30 12:03:06] app-docker.js not running. +[2025-03-30 12:03:08] app-docker.js not running. +[2025-03-30 12:03:10] app-docker.js not running. +[2025-03-30 12:03:12] app-docker.js not running. +[2025-03-30 12:03:14] app-docker.js not running. +[2025-03-30 12:03:16] app-docker.js not running. +[2025-03-30 12:03:18] app-docker.js not running. +[2025-03-30 12:03:20] app-docker.js not running. +[2025-03-30 12:03:22] app-docker.js not running. +[2025-03-30 12:03:24] app-docker.js not running. +[2025-03-30 12:03:26] app-docker.js not running. +[2025-03-30 12:03:28] app-docker.js not running. +[2025-03-30 12:03:30] app-docker.js not running. +[2025-03-30 12:03:32] app-docker.js not running. +[2025-03-30 12:03:34] app-docker.js not running. +[2025-03-30 12:03:37] app-docker.js not running. +[2025-03-30 12:03:39] app-docker.js not running. +[2025-03-30 12:03:41] app-docker.js not running. +[2025-03-30 12:03:43] app-docker.js not running. +[2025-03-30 12:03:45] app-docker.js not running. +[2025-03-30 12:03:47] app-docker.js not running. +[2025-03-30 12:03:49] app-docker.js not running. +[2025-03-30 12:03:51] app-docker.js not running. +[2025-03-30 12:03:53] app-docker.js not running. +[2025-03-30 12:03:55] app-docker.js not running. +[2025-03-30 12:03:57] app-docker.js not running. +[2025-03-30 12:03:59] app-docker.js not running. +[2025-03-30 12:04:01] app-docker.js not running. +[2025-03-30 12:04:03] app-docker.js not running. +[2025-03-30 12:04:05] app-docker.js not running. +[2025-03-30 12:04:07] app-docker.js not running. +[2025-03-30 12:04:09] app-docker.js not running. +[2025-03-30 12:04:11] app-docker.js not running. +[2025-03-30 12:04:13] app-docker.js not running. +[2025-03-30 12:04:15] app-docker.js not running. +[2025-03-30 12:04:17] app-docker.js not running. +[2025-03-30 12:04:19] app-docker.js not running. +[2025-03-30 12:04:21] app-docker.js not running. +[2025-03-30 12:04:23] app-docker.js not running. +[2025-03-30 12:04:25] app-docker.js not running. +[2025-03-30 12:04:27] app-docker.js not running. +[2025-03-30 12:04:29] app-docker.js not running. +[2025-03-30 12:04:31] app-docker.js not running. +[2025-03-30 12:04:33] app-docker.js not running. +[2025-03-30 12:04:35] app-docker.js not running. +[2025-03-30 12:04:37] app-docker.js not running. +[2025-03-30 12:04:39] app-docker.js not running. +[2025-03-30 12:04:41] app-docker.js not running. +[2025-03-30 12:04:43] app-docker.js not running. +[2025-03-30 12:04:45] app-docker.js not running. +[2025-03-30 12:04:47] app-docker.js not running. +[2025-03-30 12:04:49] app-docker.js not running. +[2025-03-30 12:04:51] app-docker.js not running. +[2025-03-30 12:04:53] app-docker.js not running. +[2025-03-30 12:04:56] app-docker.js not running. +[2025-03-30 12:04:58] app-docker.js not running. +[2025-03-30 12:05:00] app-docker.js not running. +[2025-03-30 12:05:02] app-docker.js not running. +[2025-03-30 12:05:04] app-docker.js not running. +[2025-03-30 12:05:06] app-docker.js not running. +[2025-03-30 12:05:08] app-docker.js not running. +[2025-03-30 12:05:10] app-docker.js not running. +[2025-03-30 12:05:12] app-docker.js not running. +[2025-03-30 12:05:14] app-docker.js not running. +[2025-03-30 12:05:16] app-docker.js not running. +[2025-03-30 12:05:18] app-docker.js not running. +[2025-03-30 12:05:20] app-docker.js not running. +[2025-03-30 12:05:22] app-docker.js not running. +[2025-03-30 12:05:24] app-docker.js not running. +[2025-03-30 12:05:26] app-docker.js not running. +[2025-03-30 12:05:28] app-docker.js not running. +[2025-03-30 12:05:30] app-docker.js not running. +[2025-03-30 12:05:32] app-docker.js not running. +[2025-03-30 12:05:34] app-docker.js not running. +[2025-03-30 12:05:36] app-docker.js not running. +[2025-03-30 12:05:38] app-docker.js not running. +[2025-03-30 12:05:40] app-docker.js not running. +[2025-03-30 12:05:42] app-docker.js not running. +[2025-03-30 12:05:44] app-docker.js not running. +[2025-03-30 12:05:46] app-docker.js not running. +[2025-03-30 12:05:48] app-docker.js not running. +[2025-03-30 12:05:50] app-docker.js not running. +[2025-03-30 12:05:52] app-docker.js not running. +[2025-03-30 12:05:54] app-docker.js not running. +[2025-03-30 12:05:56] app-docker.js not running. +[2025-03-30 12:05:58] app-docker.js not running. +[2025-03-30 12:06:00] app-docker.js not running. +[2025-03-30 12:06:02] app-docker.js not running. +[2025-03-30 12:06:04] app-docker.js not running. +[2025-03-30 12:06:06] app-docker.js not running. +[2025-03-30 12:06:08] app-docker.js not running. +[2025-03-30 12:06:10] app-docker.js not running. +[2025-03-30 12:06:13] app-docker.js not running. +[2025-03-30 12:06:15] app-docker.js not running. +[2025-03-30 12:06:17] app-docker.js not running. +[2025-03-30 12:06:19] app-docker.js not running. +[2025-03-30 12:06:21] app-docker.js not running. +[2025-03-30 12:06:23] app-docker.js not running. +[2025-03-30 12:06:25] app-docker.js not running. +[2025-03-30 12:06:27] app-docker.js not running. +[2025-03-30 12:06:29] app-docker.js not running. +[2025-03-30 12:06:31] app-docker.js not running. +[2025-03-30 12:06:33] app-docker.js not running. +[2025-03-30 12:06:35] app-docker.js not running. +[2025-03-30 12:06:37] app-docker.js not running. +[2025-03-30 12:06:39] app-docker.js not running. +[2025-03-30 12:06:41] app-docker.js not running. +[2025-03-30 12:06:43] app-docker.js not running. +[2025-03-30 12:06:45] app-docker.js not running. +[2025-03-30 12:06:47] app-docker.js not running. +[2025-03-30 12:06:49] app-docker.js not running. +[2025-03-30 12:06:51] app-docker.js not running. +[2025-03-30 12:06:53] app-docker.js not running. +[2025-03-30 12:06:55] app-docker.js not running. +[2025-03-30 12:06:57] app-docker.js not running. +[2025-03-30 12:06:59] app-docker.js not running. +[2025-03-30 12:07:01] app-docker.js not running. +[2025-03-30 12:07:03] app-docker.js not running. +[2025-03-30 12:07:05] app-docker.js not running. +[2025-03-30 12:07:07] app-docker.js not running. +[2025-03-30 12:07:09] app-docker.js not running. +[2025-03-30 12:07:11] app-docker.js not running. +[2025-03-30 12:07:13] app-docker.js not running. +[2025-03-30 12:07:15] app-docker.js not running. +[2025-03-30 12:07:17] app-docker.js not running. +[2025-03-30 12:07:19] app-docker.js not running. +[2025-03-30 12:07:21] app-docker.js not running. +[2025-03-30 12:07:23] app-docker.js not running. +[2025-03-30 12:07:25] app-docker.js not running. +[2025-03-30 12:07:27] app-docker.js not running. +[2025-03-30 12:07:30] app-docker.js not running. +[2025-03-30 12:07:32] app-docker.js not running. +[2025-03-30 12:07:34] app-docker.js not running. +[2025-03-30 12:07:36] app-docker.js not running. +[2025-03-30 12:07:38] app-docker.js not running. +[2025-03-30 12:07:40] app-docker.js not running. +[2025-03-30 12:07:42] app-docker.js not running. +[2025-03-30 12:07:44] app-docker.js not running. +[2025-03-30 12:07:46] app-docker.js not running. +[2025-03-30 12:07:48] app-docker.js not running. +[2025-03-30 12:07:50] app-docker.js not running. +[2025-03-30 12:07:52] app-docker.js not running. +[2025-03-30 12:07:54] app-docker.js not running. +[2025-03-30 12:07:56] app-docker.js not running. +[2025-03-30 12:07:58] app-docker.js not running. +[2025-03-30 12:08:00] app-docker.js not running. +[2025-03-30 12:08:02] app-docker.js not running. +[2025-03-30 12:08:04] app-docker.js not running. +[2025-03-30 12:08:06] app-docker.js not running. +[2025-03-30 12:08:08] app-docker.js not running. +[2025-03-30 12:08:10] app-docker.js not running. +[2025-03-30 12:08:12] app-docker.js not running. +[2025-03-30 12:08:14] app-docker.js not running. +[2025-03-30 12:08:16] app-docker.js not running. +[2025-03-30 12:08:18] app-docker.js not running. +[2025-03-30 12:08:20] app-docker.js not running. +[2025-03-30 12:08:22] app-docker.js not running. +[2025-03-30 12:08:24] app-docker.js not running. +[2025-03-30 12:08:26] app-docker.js not running. +[2025-03-30 12:08:28] app-docker.js not running. +[2025-03-30 12:08:30] app-docker.js not running. +[2025-03-30 12:08:32] app-docker.js not running. +[2025-03-30 12:08:34] app-docker.js not running. +[2025-03-30 12:08:36] app-docker.js not running. +[2025-03-30 12:08:38] app-docker.js not running. +[2025-03-30 12:08:40] app-docker.js not running. +[2025-03-30 12:08:42] app-docker.js not running. +[2025-03-30 12:08:45] app-docker.js not running. +[2025-03-30 12:08:47] app-docker.js not running. +[2025-03-30 12:08:49] app-docker.js not running. +[2025-03-30 12:08:51] app-docker.js not running. +[2025-03-30 12:08:53] app-docker.js not running. +[2025-03-30 12:08:55] app-docker.js not running. +[2025-03-30 12:08:57] app-docker.js not running. +[2025-03-30 12:08:59] app-docker.js not running. +[2025-03-30 12:09:01] app-docker.js not running. +[2025-03-30 12:09:03] app-docker.js not running. +[2025-03-30 12:09:05] app-docker.js not running. +[2025-03-30 12:09:07] app-docker.js not running. +[2025-03-30 12:09:09] app-docker.js not running. +[2025-03-30 12:09:11] app-docker.js not running. +[2025-03-30 12:09:13] app-docker.js not running. +[2025-03-30 12:09:15] app-docker.js not running. +[2025-03-30 12:09:17] app-docker.js not running. +[2025-03-30 12:09:19] app-docker.js not running. +[2025-03-30 12:09:21] app-docker.js not running. +[2025-03-30 12:09:23] app-docker.js not running. +[2025-03-30 12:09:25] app-docker.js not running. +[2025-03-30 12:09:27] app-docker.js not running. +[2025-03-30 12:09:29] app-docker.js not running. +[2025-03-30 12:09:31] app-docker.js not running. +[2025-03-30 12:09:33] app-docker.js not running. +[2025-03-30 12:09:35] app-docker.js not running. +[2025-03-30 12:09:37] app-docker.js not running. +[2025-03-30 12:09:39] app-docker.js not running. +[2025-03-30 12:09:41] app-docker.js not running. +[2025-03-30 12:09:43] app-docker.js not running. +[2025-03-30 12:09:45] app-docker.js not running. +[2025-03-30 12:09:47] app-docker.js not running. +[2025-03-30 12:09:49] app-docker.js not running. +[2025-03-30 12:09:51] app-docker.js not running. +[2025-03-30 12:09:53] app-docker.js not running. +[2025-03-30 12:09:55] app-docker.js not running. +[2025-03-30 12:09:57] app-docker.js not running. +[2025-03-30 12:09:59] app-docker.js not running. +[2025-03-30 12:10:02] app-docker.js not running. +[2025-03-30 12:10:04] app-docker.js not running. +[2025-03-30 12:10:06] app-docker.js not running. +[2025-03-30 12:10:08] app-docker.js not running. +[2025-03-30 12:10:10] app-docker.js not running. +[2025-03-30 12:10:12] app-docker.js not running. +[2025-03-30 12:10:14] app-docker.js not running. +[2025-03-30 12:10:16] app-docker.js not running. +[2025-03-30 12:10:18] app-docker.js not running. +[2025-03-30 12:10:20] app-docker.js not running. +[2025-03-30 12:10:22] app-docker.js not running. +[2025-03-30 12:10:24] app-docker.js not running. +[2025-03-30 12:10:26] app-docker.js not running. +[2025-03-30 12:10:28] app-docker.js not running. +[2025-03-30 12:10:30] app-docker.js not running. +[2025-03-30 12:10:32] app-docker.js not running. +[2025-03-30 12:10:34] app-docker.js not running. +[2025-03-30 12:10:36] app-docker.js not running. +[2025-03-30 12:10:38] app-docker.js not running. +[2025-03-30 12:10:40] app-docker.js not running. +[2025-03-30 12:10:42] app-docker.js not running. +[2025-03-30 12:10:44] app-docker.js not running. +[2025-03-30 12:10:46] app-docker.js not running. +[2025-03-30 12:10:48] app-docker.js not running. +[2025-03-30 12:10:50] app-docker.js not running. +[2025-03-30 12:10:52] app-docker.js not running. +[2025-03-30 12:10:54] app-docker.js not running. +[2025-03-30 12:10:56] app-docker.js not running. +[2025-03-30 12:10:58] app-docker.js not running. +[2025-03-30 12:11:00] app-docker.js not running. +[2025-03-30 12:11:02] app-docker.js not running. +[2025-03-30 12:11:04] app-docker.js not running. +[2025-03-30 12:11:06] app-docker.js not running. +[2025-03-30 12:11:08] app-docker.js not running. +[2025-03-30 12:11:10] app-docker.js not running. +[2025-03-30 12:11:12] app-docker.js not running. +[2025-03-30 12:11:14] app-docker.js not running. +[2025-03-30 12:11:17] app-docker.js not running. +[2025-03-30 12:11:19] app-docker.js not running. +[2025-03-30 12:11:21] app-docker.js not running. +[2025-03-30 12:11:23] app-docker.js not running. +[2025-03-30 12:11:25] app-docker.js not running. +[2025-03-30 12:11:27] app-docker.js not running. +[2025-03-30 12:11:29] app-docker.js not running. +[2025-03-30 12:11:31] app-docker.js not running. +[2025-03-30 12:11:33] app-docker.js not running. +[2025-03-30 12:11:35] app-docker.js not running. +[2025-03-30 12:11:37] app-docker.js not running. +[2025-03-30 12:11:39] app-docker.js not running. +[2025-03-30 12:11:41] app-docker.js not running. +[2025-03-30 12:11:43] app-docker.js not running. +[2025-03-30 12:11:45] app-docker.js not running. +[2025-03-30 12:11:47] app-docker.js not running. +[2025-03-30 12:11:49] app-docker.js not running. +[2025-03-30 12:11:51] app-docker.js not running. +[2025-03-30 12:11:53] app-docker.js not running. +[2025-03-30 12:11:55] app-docker.js not running. +[2025-03-30 12:11:57] app-docker.js not running. +[2025-03-30 12:11:59] app-docker.js not running. +[2025-03-30 12:12:01] app-docker.js not running. +[2025-03-30 12:12:03] app-docker.js not running. +[2025-03-30 12:12:05] app-docker.js not running. +[2025-03-30 12:12:07] app-docker.js not running. +[2025-03-30 12:12:09] app-docker.js not running. +[2025-03-30 12:12:11] app-docker.js not running. +[2025-03-30 12:12:13] app-docker.js not running. +[2025-03-30 12:12:15] app-docker.js not running. +[2025-03-30 12:12:17] app-docker.js not running. +[2025-03-30 12:12:19] app-docker.js not running. +[2025-03-30 12:12:21] app-docker.js not running. +[2025-03-30 12:12:23] app-docker.js not running. +[2025-03-30 12:12:25] app-docker.js not running. +[2025-03-30 12:12:27] app-docker.js not running. +[2025-03-30 12:12:29] app-docker.js not running. +[2025-03-30 12:12:32] app-docker.js not running. +[2025-03-30 12:12:34] app-docker.js not running. +[2025-03-30 12:12:36] app-docker.js not running. +[2025-03-30 12:12:38] app-docker.js not running. +[2025-03-30 12:12:40] app-docker.js not running. +[2025-03-30 12:12:42] app-docker.js not running. +[2025-03-30 12:12:44] app-docker.js not running. +[2025-03-30 12:12:46] app-docker.js not running. +[2025-03-30 12:12:48] app-docker.js not running. +[2025-03-30 12:12:50] app-docker.js not running. +[2025-03-30 12:12:52] app-docker.js not running. +[2025-03-30 12:12:54] app-docker.js not running. +[2025-03-30 12:12:56] app-docker.js not running. +[2025-03-30 12:12:58] app-docker.js not running. +[2025-03-30 12:13:00] app-docker.js not running. +[2025-03-30 12:13:02] app-docker.js not running. +[2025-03-30 12:13:04] app-docker.js not running. +[2025-03-30 12:13:06] app-docker.js not running. +[2025-03-30 12:13:08] app-docker.js not running. +[2025-03-30 12:13:10] app-docker.js not running. +[2025-03-30 12:13:12] app-docker.js not running. +[2025-03-30 12:13:14] app-docker.js not running. +[2025-03-30 12:13:16] app-docker.js not running. +[2025-03-30 12:13:18] app-docker.js not running. +[2025-03-30 12:13:20] app-docker.js not running. +[2025-03-30 12:13:22] app-docker.js not running. +[2025-03-30 12:13:24] app-docker.js not running. +[2025-03-30 12:13:26] app-docker.js not running. +[2025-03-30 12:13:28] app-docker.js not running. +[2025-03-30 12:13:30] app-docker.js not running. +[2025-03-30 12:13:32] app-docker.js not running. +[2025-03-30 12:13:34] app-docker.js not running. +[2025-03-30 12:13:36] app-docker.js not running. +[2025-03-30 12:13:38] app-docker.js not running. +[2025-03-30 12:13:40] app-docker.js not running. +[2025-03-30 12:13:42] app-docker.js not running. +[2025-03-30 12:13:44] app-docker.js not running. +[2025-03-30 12:13:46] app-docker.js not running. +[2025-03-30 12:13:48] app-docker.js not running. +[2025-03-30 12:13:51] app-docker.js not running. +[2025-03-30 12:13:53] app-docker.js not running. +[2025-03-30 12:13:55] app-docker.js not running. +[2025-03-30 12:13:57] app-docker.js not running. +[2025-03-30 12:13:59] app-docker.js not running. +[2025-03-30 12:14:01] app-docker.js not running. +[2025-03-30 12:14:03] app-docker.js not running. +[2025-03-30 12:14:05] app-docker.js not running. +[2025-03-30 12:14:07] app-docker.js not running. +[2025-03-30 12:14:09] app-docker.js not running. +[2025-03-30 12:14:11] app-docker.js not running. +[2025-03-30 12:14:13] app-docker.js not running. +[2025-03-30 12:14:15] app-docker.js not running. +[2025-03-30 12:14:17] app-docker.js not running. +[2025-03-30 12:14:19] app-docker.js not running. +[2025-03-30 12:14:21] app-docker.js not running. +[2025-03-30 12:14:23] app-docker.js not running. +[2025-03-30 12:14:25] app-docker.js not running. +[2025-03-30 12:14:27] app-docker.js not running. +[2025-03-30 12:14:29] app-docker.js not running. +[2025-03-30 12:14:31] app-docker.js not running. +[2025-03-30 12:14:33] app-docker.js not running. +[2025-03-30 12:14:35] app-docker.js not running. +[2025-03-30 12:14:37] app-docker.js not running. +[2025-03-30 12:14:39] app-docker.js not running. +[2025-03-30 12:14:41] app-docker.js not running. +[2025-03-30 12:14:43] app-docker.js not running. +[2025-03-30 12:14:45] app-docker.js not running. +[2025-03-30 12:14:47] app-docker.js not running. +[2025-03-30 12:14:49] app-docker.js not running. +[2025-03-30 12:14:51] app-docker.js not running. +[2025-03-30 12:14:53] app-docker.js not running. +[2025-03-30 12:14:55] app-docker.js not running. +[2025-03-30 12:14:57] app-docker.js not running. +[2025-03-30 12:14:59] app-docker.js not running. +[2025-03-30 12:15:01] app-docker.js not running. +[2025-03-30 12:15:03] app-docker.js not running. +[2025-03-30 12:15:06] app-docker.js not running. +[2025-03-30 12:15:08] app-docker.js not running. +[2025-03-30 12:15:10] app-docker.js not running. +[2025-03-30 12:15:12] app-docker.js not running. +[2025-03-30 12:15:14] app-docker.js not running. +[2025-03-30 12:15:16] app-docker.js not running. +[2025-03-30 12:15:18] app-docker.js not running. +[2025-03-30 12:15:20] app-docker.js not running. +[2025-03-30 12:15:22] app-docker.js not running. +[2025-03-30 12:15:24] app-docker.js not running. +[2025-03-30 12:15:26] app-docker.js not running. +[2025-03-30 12:15:28] app-docker.js not running. +[2025-03-30 12:15:30] app-docker.js not running. +[2025-03-30 12:15:32] app-docker.js not running. +[2025-03-30 12:15:34] app-docker.js not running. +[2025-03-30 12:15:36] app-docker.js not running. +[2025-03-30 12:15:38] app-docker.js not running. +[2025-03-30 12:15:40] app-docker.js not running. +[2025-03-30 12:15:42] app-docker.js not running. +[2025-03-30 12:15:44] app-docker.js not running. +[2025-03-30 12:15:46] app-docker.js not running. +[2025-03-30 12:15:48] app-docker.js not running. +[2025-03-30 12:15:50] app-docker.js not running. +[2025-03-30 12:15:52] app-docker.js not running. +[2025-03-30 12:15:54] app-docker.js not running. +[2025-03-30 12:15:56] app-docker.js not running. +[2025-03-30 12:15:58] app-docker.js not running. +[2025-03-30 12:16:00] app-docker.js not running. +[2025-03-30 12:16:02] app-docker.js not running. +[2025-03-30 12:16:04] app-docker.js not running. +[2025-03-30 12:16:06] app-docker.js not running. +[2025-03-30 12:16:08] app-docker.js not running. +[2025-03-30 12:16:10] app-docker.js not running. +[2025-03-30 12:16:12] app-docker.js not running. +[2025-03-30 12:16:14] app-docker.js not running. +[2025-03-30 12:16:16] app-docker.js not running. +[2025-03-30 12:16:18] app-docker.js not running. +[2025-03-30 12:16:20] app-docker.js not running. +[2025-03-30 12:16:23] app-docker.js not running. +[2025-03-30 12:16:25] app-docker.js not running. +[2025-03-30 12:16:27] app-docker.js not running. +[2025-03-30 12:16:29] app-docker.js not running. +[2025-03-30 12:16:31] app-docker.js not running. +[2025-03-30 12:16:33] app-docker.js not running. +[2025-03-30 12:16:35] app-docker.js not running. +[2025-03-30 12:16:37] app-docker.js not running. +[2025-03-30 12:16:39] app-docker.js not running. +[2025-03-30 12:16:41] app-docker.js not running. +[2025-03-30 12:16:43] app-docker.js not running. +[2025-03-30 12:16:45] app-docker.js not running. +[2025-03-30 12:16:47] app-docker.js not running. +[2025-03-30 12:16:49] app-docker.js not running. +[2025-03-30 12:16:51] app-docker.js not running. +[2025-03-30 12:16:53] app-docker.js not running. +[2025-03-30 12:16:55] app-docker.js not running. +[2025-03-30 12:16:57] app-docker.js not running. +[2025-03-30 12:16:59] app-docker.js not running. +[2025-03-30 12:17:01] app-docker.js not running. +[2025-03-30 12:17:03] app-docker.js not running. +[2025-03-30 12:17:05] app-docker.js not running. +[2025-03-30 12:17:07] app-docker.js not running. +[2025-03-30 12:17:09] app-docker.js not running. +[2025-03-30 12:17:11] app-docker.js not running. +[2025-03-30 12:17:13] app-docker.js not running. +[2025-03-30 12:17:15] app-docker.js not running. +[2025-03-30 12:17:17] app-docker.js not running. +[2025-03-30 12:17:19] app-docker.js not running. +[2025-03-30 12:17:21] app-docker.js not running. +[2025-03-30 12:17:23] app-docker.js not running. +[2025-03-30 12:17:25] app-docker.js not running. +[2025-03-30 12:17:27] app-docker.js not running. +[2025-03-30 12:17:29] app-docker.js not running. +[2025-03-30 12:17:31] app-docker.js not running. +[2025-03-30 12:17:33] app-docker.js not running. +[2025-03-30 12:17:35] app-docker.js not running. +[2025-03-30 12:17:37] app-docker.js not running. +[2025-03-30 12:17:40] app-docker.js not running. +[2025-03-30 12:17:42] app-docker.js not running. +[2025-03-30 12:17:44] app-docker.js not running. +[2025-03-30 12:17:46] app-docker.js not running. +[2025-03-30 12:17:48] app-docker.js not running. +[2025-03-30 12:17:50] app-docker.js not running. +[2025-03-30 12:17:52] app-docker.js not running. +[2025-03-30 12:17:54] app-docker.js not running. +[2025-03-30 12:17:56] app-docker.js not running. +[2025-03-30 12:17:58] app-docker.js not running. +[2025-03-30 12:18:00] app-docker.js not running. +[2025-03-30 12:18:02] app-docker.js not running. +[2025-03-30 12:18:04] app-docker.js not running. +[2025-03-30 12:18:06] app-docker.js not running. +[2025-03-30 12:18:08] app-docker.js not running. +[2025-03-30 12:18:10] app-docker.js not running. +[2025-03-30 12:18:12] app-docker.js not running. +[2025-03-30 12:18:14] app-docker.js not running. +[2025-03-30 12:18:16] app-docker.js not running. +[2025-03-30 12:18:18] app-docker.js not running. +[2025-03-30 12:18:20] app-docker.js not running. +[2025-03-30 12:18:22] app-docker.js not running. +[2025-03-30 12:18:24] app-docker.js not running. +[2025-03-30 12:18:26] app-docker.js not running. +[2025-03-30 12:18:28] app-docker.js not running. +[2025-03-30 12:18:30] app-docker.js not running. +[2025-03-30 12:18:32] app-docker.js not running. +[2025-03-30 12:18:34] app-docker.js not running. +[2025-03-30 12:18:36] app-docker.js not running. +[2025-03-30 12:18:38] app-docker.js not running. +[2025-03-30 12:18:40] app-docker.js not running. +[2025-03-30 12:18:42] app-docker.js not running. +[2025-03-30 12:18:44] app-docker.js not running. +[2025-03-30 12:18:46] app-docker.js not running. +[2025-03-30 12:18:48] app-docker.js not running. +[2025-03-30 12:18:50] app-docker.js not running. +[2025-03-30 12:18:52] app-docker.js not running. +[2025-03-30 12:18:55] app-docker.js not running. +[2025-03-30 12:18:57] app-docker.js not running. +[2025-03-30 12:18:59] app-docker.js not running. +[2025-03-30 12:19:01] app-docker.js not running. +[2025-03-30 12:19:03] app-docker.js not running. +[2025-03-30 12:19:05] app-docker.js not running. +[2025-03-30 12:19:07] app-docker.js not running. +[2025-03-30 12:19:09] app-docker.js not running. +[2025-03-30 12:19:11] app-docker.js not running. +[2025-03-30 12:19:13] app-docker.js not running. +[2025-03-30 12:19:15] app-docker.js not running. +[2025-03-30 12:19:17] app-docker.js not running. +[2025-03-30 12:19:19] app-docker.js not running. +[2025-03-30 12:19:21] app-docker.js not running. +[2025-03-30 12:19:23] app-docker.js not running. +[2025-03-30 12:19:25] app-docker.js not running. +[2025-03-30 12:19:27] app-docker.js not running. +[2025-03-30 12:19:29] app-docker.js not running. +[2025-03-30 12:19:31] app-docker.js not running. +[2025-03-30 12:19:33] app-docker.js not running. +[2025-03-30 12:19:35] app-docker.js not running. +[2025-03-30 12:19:37] app-docker.js not running. +[2025-03-30 12:19:39] app-docker.js not running. +[2025-03-30 12:19:41] app-docker.js not running. +[2025-03-30 12:19:43] app-docker.js not running. +[2025-03-30 12:19:45] app-docker.js not running. +[2025-03-30 12:19:47] app-docker.js not running. +[2025-03-30 12:19:49] app-docker.js not running. +[2025-03-30 12:19:51] app-docker.js not running. +[2025-03-30 12:19:53] app-docker.js not running. +[2025-03-30 12:19:55] app-docker.js not running. +[2025-03-30 12:19:57] app-docker.js not running. +[2025-03-30 12:19:59] app-docker.js not running. +[2025-03-30 12:20:01] app-docker.js not running. +[2025-03-30 12:20:03] app-docker.js not running. +[2025-03-30 12:20:05] app-docker.js not running. +[2025-03-30 12:20:08] app-docker.js not running. +[2025-03-30 12:20:10] app-docker.js not running. +[2025-03-30 12:20:12] app-docker.js not running. +[2025-03-30 12:20:14] app-docker.js not running. +[2025-03-30 12:20:16] app-docker.js not running. +[2025-03-30 12:20:18] app-docker.js not running. +[2025-03-30 12:20:20] app-docker.js not running. +[2025-03-30 12:20:22] app-docker.js not running. +[2025-03-30 12:20:24] app-docker.js not running. +[2025-03-30 12:20:26] app-docker.js not running. +[2025-03-30 12:20:28] app-docker.js not running. +[2025-03-30 12:20:30] app-docker.js not running. +[2025-03-30 12:20:32] app-docker.js not running. +[2025-03-30 12:20:34] app-docker.js not running. +[2025-03-30 12:20:36] app-docker.js not running. +[2025-03-30 12:20:38] app-docker.js not running. +[2025-03-30 12:20:40] app-docker.js not running. +[2025-03-30 12:20:42] app-docker.js not running. +[2025-03-30 12:20:44] app-docker.js not running. +[2025-03-30 12:20:46] app-docker.js not running. +[2025-03-30 12:20:48] app-docker.js not running. +[2025-03-30 12:20:50] app-docker.js not running. +[2025-03-30 12:20:52] app-docker.js not running. +[2025-03-30 12:20:54] app-docker.js not running. +[2025-03-30 12:20:56] app-docker.js not running. +[2025-03-30 12:20:58] app-docker.js not running. +[2025-03-30 12:21:00] app-docker.js not running. +[2025-03-30 12:21:02] app-docker.js not running. +[2025-03-30 12:21:04] app-docker.js not running. +[2025-03-30 12:21:06] app-docker.js not running. +[2025-03-30 12:21:08] app-docker.js not running. +[2025-03-30 12:21:10] app-docker.js not running. +[2025-03-30 12:21:12] app-docker.js not running. +[2025-03-30 12:21:14] app-docker.js not running. +[2025-03-30 12:21:16] app-docker.js not running. +[2025-03-30 12:21:18] app-docker.js not running. +[2025-03-30 12:21:21] app-docker.js not running. +[2025-03-30 12:21:23] app-docker.js not running. +[2025-03-30 12:21:25] app-docker.js not running. +[2025-03-30 12:21:27] app-docker.js not running. +[2025-03-30 12:21:29] app-docker.js not running. +[2025-03-30 12:21:31] app-docker.js not running. +[2025-03-30 12:21:33] app-docker.js not running. +[2025-03-30 12:21:35] app-docker.js not running. +[2025-03-30 12:21:37] app-docker.js not running. +[2025-03-30 12:21:39] app-docker.js not running. +[2025-03-30 12:21:41] app-docker.js not running. +[2025-03-30 12:21:43] app-docker.js not running. +[2025-03-30 12:21:45] app-docker.js not running. +[2025-03-30 12:21:47] app-docker.js not running. +[2025-03-30 12:21:49] app-docker.js not running. +[2025-03-30 14:58:11] ALERT: PID 322668 CPU=0% MEM=62MB | System MEM=6004MB +[2025-03-30 14:58:11] 🔪 Killing app-docker.js (PID 322668) +[2025-03-30 14:58:11] app-docker.js killed. +[2025-03-30 14:58:11] ℹ️ No stress script running. +[2025-03-30 14:58:11] SYSTEM ALERT: Total memory usage = 6004MB +[2025-03-30 14:58:13] app-docker.js not running. +[2025-03-30 14:58:15] app-docker.js not running. +[2025-03-30 14:58:18] app-docker.js not running. +[2025-03-30 14:58:20] app-docker.js not running. +[2025-03-30 14:58:22] app-docker.js not running. +[2025-03-30 14:58:24] app-docker.js not running. +[2025-03-30 14:58:26] app-docker.js not running. +[2025-03-30 14:58:28] app-docker.js not running. +[2025-03-30 14:58:30] app-docker.js not running. +[2025-03-30 14:58:32] app-docker.js not running. +[2025-03-30 14:58:34] app-docker.js not running. +[2025-03-30 14:58:36] app-docker.js not running. +[2025-03-30 14:58:38] app-docker.js not running. +[2025-03-30 14:58:40] app-docker.js not running. +[2025-03-30 14:58:42] app-docker.js not running. +[2025-03-30 14:58:44] app-docker.js not running. +[2025-03-30 14:58:46] app-docker.js not running. +[2025-03-30 14:58:48] app-docker.js not running. +[2025-03-30 14:58:50] app-docker.js not running. +[2025-03-30 14:58:52] app-docker.js not running. +[2025-03-30 14:58:54] app-docker.js not running. +[2025-03-30 14:58:56] app-docker.js not running. +[2025-03-30 14:58:58] app-docker.js not running. +[2025-03-30 14:59:00] app-docker.js not running. +[2025-03-30 14:59:02] app-docker.js not running. +[2025-03-30 14:59:04] app-docker.js not running. +[2025-03-30 14:59:06] app-docker.js not running. +[2025-03-30 14:59:08] app-docker.js not running. +[2025-03-30 14:59:10] app-docker.js not running. +[2025-03-30 14:59:12] app-docker.js not running. +[2025-03-30 14:59:14] app-docker.js not running. +[2025-03-30 14:59:16] app-docker.js not running. +[2025-03-30 14:59:18] app-docker.js not running. +[2025-03-30 14:59:20] app-docker.js not running. +[2025-03-30 14:59:22] app-docker.js not running. +[2025-03-30 14:59:25] app-docker.js not running. +[2025-03-30 14:59:27] app-docker.js not running. +[2025-03-30 14:59:29] app-docker.js not running. +[2025-03-30 14:59:31] app-docker.js not running. +[2025-03-30 14:59:33] app-docker.js not running. +[2025-03-30 14:59:35] app-docker.js not running. +[2025-03-30 14:59:37] app-docker.js not running. +[2025-03-30 14:59:39] app-docker.js not running. +[2025-03-30 14:59:41] app-docker.js not running. +[2025-03-30 14:59:43] app-docker.js not running. +[2025-03-30 14:59:45] app-docker.js not running. +[2025-03-30 14:59:47] app-docker.js not running. +[2025-03-30 14:59:49] app-docker.js not running. +[2025-03-30 14:59:51] app-docker.js not running. +[2025-03-30 14:59:53] app-docker.js not running. +[2025-03-30 14:59:55] app-docker.js not running. +[2025-03-30 14:59:57] app-docker.js not running. +[2025-03-30 14:59:59] app-docker.js not running. +[2025-03-30 15:00:01] app-docker.js not running. +[2025-03-30 15:00:03] app-docker.js not running. +[2025-03-30 15:00:05] app-docker.js not running. +[2025-03-30 15:00:07] app-docker.js not running. +[2025-03-30 15:00:09] app-docker.js not running. +[2025-03-30 15:00:11] app-docker.js not running. +[2025-03-30 15:00:13] app-docker.js not running. +[2025-03-30 15:00:15] app-docker.js not running. +[2025-03-30 15:00:17] app-docker.js not running. +[2025-03-30 15:00:19] app-docker.js not running. +[2025-03-30 15:00:21] app-docker.js not running. +[2025-03-30 15:00:23] app-docker.js not running. +[2025-03-30 15:00:25] app-docker.js not running. +[2025-03-30 15:00:27] app-docker.js not running. +[2025-03-30 15:00:29] app-docker.js not running. +[2025-03-30 15:00:31] app-docker.js not running. +[2025-03-30 15:00:34] app-docker.js not running. +[2025-03-30 15:00:36] app-docker.js not running. +[2025-03-30 15:00:38] app-docker.js not running. +[2025-03-30 15:00:40] app-docker.js not running. +[2025-03-30 15:00:42] app-docker.js not running. +[2025-03-30 15:00:44] app-docker.js not running. +[2025-03-30 15:00:46] app-docker.js not running. +[2025-03-30 15:00:48] app-docker.js not running. +[2025-03-30 15:00:50] app-docker.js not running. +[2025-03-30 15:00:52] app-docker.js not running. +[2025-03-30 15:00:54] app-docker.js not running. +[2025-03-30 15:00:56] app-docker.js not running. +[2025-03-30 15:00:58] app-docker.js not running. +[2025-03-30 15:01:00] app-docker.js not running. +[2025-03-30 15:01:02] app-docker.js not running. +[2025-03-30 15:01:04] app-docker.js not running. +[2025-03-30 15:01:06] app-docker.js not running. +[2025-03-30 15:01:08] app-docker.js not running. +[2025-03-30 15:01:10] app-docker.js not running. +[2025-03-30 15:01:12] app-docker.js not running. +[2025-03-30 15:01:14] app-docker.js not running. +[2025-03-30 15:01:16] app-docker.js not running. +[2025-03-30 15:01:18] app-docker.js not running. +[2025-03-30 15:01:20] app-docker.js not running. +[2025-03-30 15:01:22] app-docker.js not running. +[2025-03-30 15:01:24] app-docker.js not running. +[2025-03-30 15:01:26] app-docker.js not running. +[2025-03-30 15:01:28] app-docker.js not running. +[2025-03-30 15:01:30] app-docker.js not running. +[2025-03-30 15:01:32] app-docker.js not running. +[2025-03-30 15:01:34] app-docker.js not running. +[2025-03-30 15:01:36] app-docker.js not running. +[2025-03-30 15:01:38] app-docker.js not running. +[2025-03-30 15:01:40] app-docker.js not running. +[2025-03-30 15:01:42] app-docker.js not running. +[2025-03-30 15:01:44] app-docker.js not running. +[2025-03-30 15:01:47] app-docker.js not running. +[2025-03-30 15:01:49] app-docker.js not running. +[2025-03-30 15:01:51] app-docker.js not running. +[2025-03-30 15:01:53] app-docker.js not running. +[2025-03-30 15:01:55] app-docker.js not running. +[2025-03-30 15:01:57] app-docker.js not running. +[2025-03-30 15:01:59] app-docker.js not running. +[2025-03-30 15:02:01] app-docker.js not running. +[2025-03-30 15:02:03] app-docker.js not running. +[2025-03-30 15:02:05] app-docker.js not running. +[2025-03-30 15:02:07] app-docker.js not running. +[2025-03-30 15:02:09] app-docker.js not running. +[2025-03-30 15:02:11] app-docker.js not running. +[2025-03-30 15:02:13] app-docker.js not running. +[2025-03-30 15:02:15] app-docker.js not running. +[2025-03-30 15:02:17] app-docker.js not running. +[2025-03-30 15:02:19] app-docker.js not running. +[2025-03-30 15:02:21] app-docker.js not running. +[2025-03-30 15:02:23] app-docker.js not running. +[2025-03-30 15:02:25] app-docker.js not running. +[2025-03-30 15:02:27] app-docker.js not running. +[2025-03-30 15:02:29] app-docker.js not running. +[2025-03-30 15:02:31] app-docker.js not running. +[2025-03-30 15:02:33] app-docker.js not running. +[2025-03-30 15:02:35] app-docker.js not running. +[2025-03-30 15:02:37] app-docker.js not running. +[2025-03-30 15:02:39] app-docker.js not running. +[2025-03-30 15:02:41] app-docker.js not running. +[2025-03-30 15:02:43] app-docker.js not running. +[2025-03-30 15:02:45] app-docker.js not running. +[2025-03-30 15:02:47] app-docker.js not running. +[2025-03-30 15:02:50] app-docker.js not running. +[2025-03-30 15:02:52] app-docker.js not running. +[2025-03-30 15:02:54] app-docker.js not running. +[2025-03-30 15:02:56] app-docker.js not running. +[2025-03-30 15:02:58] app-docker.js not running. +[2025-03-30 15:03:00] app-docker.js not running. +[2025-03-30 15:03:02] app-docker.js not running. +[2025-03-30 15:03:04] app-docker.js not running. +[2025-03-30 15:03:06] app-docker.js not running. +[2025-03-30 15:03:08] app-docker.js not running. +[2025-03-30 15:03:10] app-docker.js not running. +[2025-03-30 15:03:12] app-docker.js not running. +[2025-03-30 15:03:14] app-docker.js not running. +[2025-03-30 15:03:16] app-docker.js not running. +[2025-03-30 15:03:18] app-docker.js not running. +[2025-03-30 15:03:20] app-docker.js not running. +[2025-03-30 15:03:22] app-docker.js not running. +[2025-03-30 15:03:24] app-docker.js not running. +[2025-03-30 15:03:26] app-docker.js not running. +[2025-03-30 15:03:28] app-docker.js not running. +[2025-03-30 15:03:30] app-docker.js not running. +[2025-03-30 15:03:32] app-docker.js not running. +[2025-03-30 15:03:34] app-docker.js not running. +[2025-03-30 15:03:36] app-docker.js not running. +[2025-03-30 15:03:38] app-docker.js not running. +[2025-03-30 15:03:40] app-docker.js not running. +[2025-03-30 15:03:42] app-docker.js not running. +[2025-03-30 15:03:44] app-docker.js not running. +[2025-03-30 15:03:46] app-docker.js not running. +[2025-03-30 15:03:48] app-docker.js not running. +[2025-03-30 15:03:50] app-docker.js not running. +[2025-03-30 15:03:52] app-docker.js not running. +[2025-03-30 15:03:54] app-docker.js not running. +[2025-03-30 15:03:56] app-docker.js not running. +[2025-03-30 15:03:59] app-docker.js not running. +[2025-03-30 15:04:01] app-docker.js not running. +[2025-03-30 15:04:03] app-docker.js not running. +[2025-03-30 15:04:05] app-docker.js not running. +[2025-03-30 15:04:07] app-docker.js not running. +[2025-03-30 15:04:09] app-docker.js not running. +[2025-03-30 15:04:11] app-docker.js not running. +[2025-03-30 15:04:13] app-docker.js not running. +[2025-03-30 15:04:15] app-docker.js not running. +[2025-03-30 15:04:17] app-docker.js not running. +[2025-03-30 15:04:19] app-docker.js not running. +[2025-03-30 15:04:21] app-docker.js not running. +[2025-03-30 15:04:23] app-docker.js not running. +[2025-03-30 15:04:25] app-docker.js not running. +[2025-03-30 15:04:27] app-docker.js not running. +[2025-03-30 15:04:29] app-docker.js not running. +[2025-03-30 15:04:31] app-docker.js not running. +[2025-03-30 15:04:33] app-docker.js not running. +[2025-03-30 15:04:35] app-docker.js not running. +[2025-03-30 15:04:37] app-docker.js not running. +[2025-03-30 15:04:39] app-docker.js not running. +[2025-03-30 15:04:41] app-docker.js not running. +[2025-03-30 15:04:43] app-docker.js not running. +[2025-03-30 15:04:45] app-docker.js not running. +[2025-03-30 15:04:47] app-docker.js not running. +[2025-03-30 15:04:49] app-docker.js not running. +[2025-03-30 15:04:51] app-docker.js not running. +[2025-03-30 15:04:53] app-docker.js not running. +[2025-03-30 15:04:55] app-docker.js not running. +[2025-03-30 15:04:57] app-docker.js not running. +[2025-03-30 15:04:59] app-docker.js not running. +[2025-03-30 15:05:01] app-docker.js not running. +[2025-03-30 15:05:03] app-docker.js not running. +[2025-03-30 15:05:05] app-docker.js not running. +[2025-03-30 15:05:08] app-docker.js not running. +[2025-03-30 15:05:10] app-docker.js not running. +[2025-03-30 15:05:12] app-docker.js not running. +[2025-03-30 15:05:14] app-docker.js not running. +[2025-03-30 15:05:16] app-docker.js not running. +[2025-03-30 15:05:18] app-docker.js not running. +[2025-03-30 15:05:20] app-docker.js not running. +[2025-03-30 15:05:22] app-docker.js not running. +[2025-03-30 15:05:24] app-docker.js not running. +[2025-03-30 15:05:26] app-docker.js not running. +[2025-03-30 15:05:28] app-docker.js not running. +[2025-03-30 15:05:30] app-docker.js not running. +[2025-03-30 15:05:32] app-docker.js not running. +[2025-03-30 15:05:34] app-docker.js not running. +[2025-03-30 15:05:36] app-docker.js not running. +[2025-03-30 15:05:38] app-docker.js not running. +[2025-03-30 15:05:40] app-docker.js not running. +[2025-03-30 15:05:42] app-docker.js not running. +[2025-03-30 15:05:44] app-docker.js not running. +[2025-03-30 15:05:46] app-docker.js not running. +[2025-03-30 15:05:48] app-docker.js not running. +[2025-03-30 15:05:50] app-docker.js not running. +[2025-03-30 15:05:52] app-docker.js not running. +[2025-03-30 15:05:54] app-docker.js not running. +[2025-03-30 15:05:56] app-docker.js not running. +[2025-03-30 15:05:58] app-docker.js not running. +[2025-03-30 15:06:00] app-docker.js not running. +[2025-03-30 15:06:02] app-docker.js not running. +[2025-03-30 15:06:04] app-docker.js not running. +[2025-03-30 15:06:06] app-docker.js not running. +[2025-03-30 15:06:08] app-docker.js not running. +[2025-03-30 15:06:10] app-docker.js not running. +[2025-03-30 15:06:13] app-docker.js not running. +[2025-03-30 15:06:15] app-docker.js not running. +[2025-03-30 15:06:17] app-docker.js not running. +[2025-03-30 15:06:19] app-docker.js not running. +[2025-03-30 15:06:21] app-docker.js not running. +[2025-03-30 15:06:23] app-docker.js not running. +[2025-03-30 15:06:25] app-docker.js not running. +[2025-03-30 15:06:27] app-docker.js not running. +[2025-03-30 15:06:29] app-docker.js not running. +[2025-03-30 15:06:31] app-docker.js not running. +[2025-03-30 15:06:33] app-docker.js not running. +[2025-03-30 15:06:35] app-docker.js not running. +[2025-03-30 15:06:37] app-docker.js not running. +[2025-03-30 15:06:39] app-docker.js not running. +[2025-03-30 15:06:41] app-docker.js not running. +[2025-03-30 15:06:43] app-docker.js not running. +[2025-03-30 15:06:45] app-docker.js not running. +[2025-03-30 15:06:47] app-docker.js not running. +[2025-03-30 15:06:49] app-docker.js not running. +[2025-03-30 15:06:51] app-docker.js not running. +[2025-03-30 15:06:53] app-docker.js not running. +[2025-03-30 15:06:55] app-docker.js not running. +[2025-03-30 15:06:57] app-docker.js not running. +[2025-03-30 15:06:59] app-docker.js not running. +[2025-03-30 15:07:01] app-docker.js not running. +[2025-03-30 15:07:03] app-docker.js not running. +[2025-03-30 15:07:05] app-docker.js not running. +[2025-03-30 15:07:07] app-docker.js not running. +[2025-03-30 15:07:09] app-docker.js not running. +[2025-03-30 15:07:11] app-docker.js not running. +[2025-03-30 15:07:13] app-docker.js not running. +[2025-03-30 15:07:15] app-docker.js not running. +[2025-03-30 15:07:17] app-docker.js not running. +[2025-03-30 15:07:19] app-docker.js not running. +[2025-03-30 15:07:21] app-docker.js not running. +[2025-03-30 15:07:24] app-docker.js not running. +[2025-03-30 15:07:26] app-docker.js not running. +[2025-03-30 15:07:28] app-docker.js not running. +[2025-03-30 15:07:30] app-docker.js not running. +[2025-03-30 15:07:32] app-docker.js not running. +[2025-03-30 15:07:34] app-docker.js not running. +[2025-03-30 15:07:36] app-docker.js not running. +[2025-03-30 15:07:38] app-docker.js not running. +[2025-03-30 15:07:40] app-docker.js not running. +[2025-03-30 15:07:42] app-docker.js not running. +[2025-03-30 15:07:44] app-docker.js not running. +[2025-03-30 15:07:46] app-docker.js not running. +[2025-03-30 15:07:48] app-docker.js not running. +[2025-03-30 15:07:50] app-docker.js not running. +[2025-03-30 15:07:52] app-docker.js not running. +[2025-03-30 15:07:54] app-docker.js not running. +[2025-03-30 15:07:56] app-docker.js not running. +[2025-03-30 15:07:58] app-docker.js not running. +[2025-03-30 15:08:00] app-docker.js not running. +[2025-03-30 15:08:02] app-docker.js not running. +[2025-03-30 15:08:04] app-docker.js not running. +[2025-03-30 15:08:06] app-docker.js not running. +[2025-03-30 15:08:08] app-docker.js not running. +[2025-03-30 15:08:10] app-docker.js not running. +[2025-03-30 15:08:12] app-docker.js not running. +[2025-03-30 15:08:14] app-docker.js not running. +[2025-03-30 15:08:16] app-docker.js not running. +[2025-03-30 15:08:18] app-docker.js not running. +[2025-03-30 15:08:20] app-docker.js not running. +[2025-03-30 15:08:22] app-docker.js not running. +[2025-03-30 15:08:24] app-docker.js not running. +[2025-03-30 15:08:26] app-docker.js not running. +[2025-03-30 15:08:28] app-docker.js not running. +[2025-03-30 15:08:30] app-docker.js not running. +[2025-03-30 15:08:33] app-docker.js not running. +[2025-03-30 15:08:35] app-docker.js not running. +[2025-03-30 15:08:37] app-docker.js not running. +[2025-03-30 15:08:39] app-docker.js not running. +[2025-03-30 15:08:41] app-docker.js not running. +[2025-03-30 15:08:43] app-docker.js not running. +[2025-03-30 15:08:45] app-docker.js not running. +[2025-03-30 15:08:47] app-docker.js not running. +[2025-03-30 15:08:49] app-docker.js not running. +[2025-03-30 15:08:51] app-docker.js not running. +[2025-03-30 15:08:53] app-docker.js not running. +[2025-03-30 15:08:55] app-docker.js not running. +[2025-03-30 15:08:57] app-docker.js not running. +[2025-03-30 15:08:59] app-docker.js not running. +[2025-03-30 15:09:01] app-docker.js not running. +[2025-03-30 15:09:03] app-docker.js not running. +[2025-03-30 15:09:05] app-docker.js not running. +[2025-03-30 15:09:07] app-docker.js not running. +[2025-03-30 15:09:09] app-docker.js not running. +[2025-03-30 15:09:11] app-docker.js not running. +[2025-03-30 15:09:13] app-docker.js not running. +[2025-03-30 15:09:15] app-docker.js not running. +[2025-03-30 15:09:17] app-docker.js not running. +[2025-03-30 15:09:19] app-docker.js not running. +[2025-03-30 15:09:21] app-docker.js not running. +[2025-03-30 15:09:23] app-docker.js not running. +[2025-03-30 15:09:25] app-docker.js not running. +[2025-03-30 15:09:27] app-docker.js not running. +[2025-03-30 15:09:29] app-docker.js not running. +[2025-03-30 15:09:31] app-docker.js not running. +[2025-03-30 15:09:33] app-docker.js not running. +[2025-03-30 15:09:35] app-docker.js not running. +[2025-03-30 15:09:37] app-docker.js not running. +[2025-03-30 15:09:39] app-docker.js not running. +[2025-03-30 15:09:42] app-docker.js not running. +[2025-03-30 15:09:44] app-docker.js not running. +[2025-03-30 15:09:46] app-docker.js not running. +[2025-03-30 15:09:48] app-docker.js not running. +[2025-03-30 15:09:50] app-docker.js not running. +[2025-03-30 15:09:52] app-docker.js not running. +[2025-03-30 15:09:54] app-docker.js not running. +[2025-03-30 15:09:56] app-docker.js not running. +[2025-03-30 15:09:58] app-docker.js not running. +[2025-03-30 15:10:00] app-docker.js not running. +[2025-03-30 15:10:02] app-docker.js not running. +[2025-03-30 15:10:04] app-docker.js not running. +[2025-03-30 15:10:06] app-docker.js not running. +[2025-03-30 15:10:08] app-docker.js not running. +[2025-03-30 15:10:10] app-docker.js not running. +[2025-03-30 15:10:12] app-docker.js not running. +[2025-03-30 15:10:14] app-docker.js not running. +[2025-03-30 15:10:16] app-docker.js not running. +[2025-03-30 15:10:18] app-docker.js not running. +[2025-03-30 15:10:20] app-docker.js not running. +[2025-03-30 15:10:22] app-docker.js not running. +[2025-03-30 15:10:24] app-docker.js not running. +[2025-03-30 15:10:26] app-docker.js not running. +[2025-03-30 15:10:28] app-docker.js not running. +[2025-03-30 15:10:30] app-docker.js not running. +[2025-03-30 15:10:32] app-docker.js not running. +[2025-03-30 15:10:34] app-docker.js not running. +[2025-03-30 15:10:36] app-docker.js not running. +[2025-03-30 15:10:38] app-docker.js not running. +[2025-03-30 15:10:40] app-docker.js not running. +[2025-03-30 15:10:42] app-docker.js not running. +[2025-03-30 15:10:44] app-docker.js not running. +[2025-03-30 15:10:46] app-docker.js not running. +[2025-03-30 15:10:48] app-docker.js not running. +[2025-03-30 15:10:51] app-docker.js not running. +[2025-03-30 15:10:53] app-docker.js not running. +[2025-03-30 15:10:55] app-docker.js not running. +[2025-03-30 15:10:57] app-docker.js not running. +[2025-03-30 15:10:59] app-docker.js not running. +[2025-03-30 15:11:01] app-docker.js not running. +[2025-03-30 15:11:03] app-docker.js not running. +[2025-03-30 15:11:05] app-docker.js not running. +[2025-03-30 15:11:07] app-docker.js not running. +[2025-03-30 15:11:09] app-docker.js not running. +[2025-03-30 15:11:11] app-docker.js not running. +[2025-03-30 15:11:13] app-docker.js not running. +[2025-03-30 15:11:15] app-docker.js not running. +[2025-03-30 15:11:17] app-docker.js not running. +[2025-03-30 15:11:19] app-docker.js not running. +[2025-03-30 15:11:21] app-docker.js not running. +[2025-03-30 15:11:23] app-docker.js not running. +[2025-03-30 15:11:25] app-docker.js not running. +[2025-03-30 15:11:27] app-docker.js not running. +[2025-03-30 15:11:29] app-docker.js not running. +[2025-03-30 15:11:31] app-docker.js not running. +[2025-03-30 15:11:33] app-docker.js not running. +[2025-03-30 15:11:35] app-docker.js not running. +[2025-03-30 15:11:37] app-docker.js not running. +[2025-03-30 15:11:39] app-docker.js not running. +[2025-03-30 15:11:41] app-docker.js not running. +[2025-03-30 15:11:43] app-docker.js not running. +[2025-03-30 15:11:45] app-docker.js not running. +[2025-03-30 15:11:47] app-docker.js not running. +[2025-03-30 15:11:49] app-docker.js not running. +[2025-03-30 15:11:51] app-docker.js not running. +[2025-03-30 15:11:53] app-docker.js not running. +[2025-03-30 15:11:56] app-docker.js not running. +[2025-03-30 15:11:58] app-docker.js not running. +[2025-03-30 15:12:00] app-docker.js not running. +[2025-03-30 15:12:02] app-docker.js not running. +[2025-03-30 15:12:04] app-docker.js not running. +[2025-03-30 15:12:06] app-docker.js not running. +[2025-03-30 15:12:08] app-docker.js not running. +[2025-03-30 15:12:10] app-docker.js not running. +[2025-03-30 15:12:12] app-docker.js not running. +[2025-03-30 15:12:14] app-docker.js not running. +[2025-03-30 15:12:16] app-docker.js not running. +[2025-03-30 15:12:18] app-docker.js not running. +[2025-03-30 15:12:20] app-docker.js not running. +[2025-03-30 15:12:22] app-docker.js not running. +[2025-03-30 15:12:24] app-docker.js not running. +[2025-03-30 15:12:26] app-docker.js not running. +[2025-03-30 15:12:28] app-docker.js not running. +[2025-03-30 15:12:30] app-docker.js not running. +[2025-03-30 15:12:32] app-docker.js not running. +[2025-03-30 15:12:34] app-docker.js not running. +[2025-03-30 15:12:36] app-docker.js not running. +[2025-03-30 15:12:38] app-docker.js not running. +[2025-03-30 15:12:40] app-docker.js not running. +[2025-03-30 15:12:42] app-docker.js not running. +[2025-03-30 15:12:44] app-docker.js not running. +[2025-03-30 15:12:46] app-docker.js not running. +[2025-03-30 15:12:48] app-docker.js not running. +[2025-03-30 15:12:50] app-docker.js not running. +[2025-03-30 15:12:52] app-docker.js not running. +[2025-03-30 15:12:54] app-docker.js not running. +[2025-03-30 15:12:56] app-docker.js not running. +[2025-03-30 15:12:58] app-docker.js not running. +[2025-03-30 15:13:00] app-docker.js not running. +[2025-03-30 15:13:02] app-docker.js not running. +[2025-03-30 15:13:04] app-docker.js not running. +[2025-03-30 15:13:07] app-docker.js not running. +[2025-03-30 15:13:09] app-docker.js not running. +[2025-03-30 15:13:11] app-docker.js not running. +[2025-03-30 15:13:13] app-docker.js not running. +[2025-03-30 15:13:15] app-docker.js not running. +[2025-03-30 15:13:17] app-docker.js not running. +[2025-03-30 15:13:19] app-docker.js not running. +[2025-03-30 15:13:21] app-docker.js not running. +[2025-03-30 15:13:23] app-docker.js not running. +[2025-03-30 15:13:25] app-docker.js not running. +[2025-03-30 15:13:27] app-docker.js not running. +[2025-03-30 15:13:29] app-docker.js not running. +[2025-03-30 15:13:31] app-docker.js not running. +[2025-03-30 15:13:33] app-docker.js not running. +[2025-03-30 15:13:35] app-docker.js not running. +[2025-03-30 15:13:37] app-docker.js not running. +[2025-03-30 15:13:39] app-docker.js not running. +[2025-03-30 15:13:41] app-docker.js not running. +[2025-03-30 15:13:43] app-docker.js not running. +[2025-03-30 15:13:45] app-docker.js not running. +[2025-03-30 15:13:47] app-docker.js not running. +[2025-03-30 15:13:49] app-docker.js not running. +[2025-03-30 15:13:51] app-docker.js not running. +[2025-03-30 15:13:53] app-docker.js not running. +[2025-03-30 15:13:55] app-docker.js not running. +[2025-03-30 15:13:57] app-docker.js not running. +[2025-03-30 15:13:59] app-docker.js not running. +[2025-03-30 15:14:01] app-docker.js not running. +[2025-03-30 15:14:03] app-docker.js not running. +[2025-03-30 15:14:05] app-docker.js not running. +[2025-03-30 15:14:07] app-docker.js not running. +[2025-03-30 15:14:09] app-docker.js not running. +[2025-03-30 15:14:11] app-docker.js not running. +[2025-03-30 15:14:14] app-docker.js not running. +[2025-03-30 15:14:16] app-docker.js not running. +[2025-03-30 15:14:18] app-docker.js not running. +[2025-03-30 15:14:20] app-docker.js not running. +[2025-03-30 15:14:22] app-docker.js not running. +[2025-03-30 15:14:24] app-docker.js not running. +[2025-03-30 15:14:26] app-docker.js not running. +[2025-03-30 15:14:28] app-docker.js not running. +[2025-03-30 15:14:30] app-docker.js not running. +[2025-03-30 15:14:32] app-docker.js not running. +[2025-03-30 15:14:34] app-docker.js not running. +[2025-03-30 15:14:36] app-docker.js not running. +[2025-03-30 15:14:38] app-docker.js not running. +[2025-03-30 15:14:40] app-docker.js not running. +[2025-03-30 15:14:42] app-docker.js not running. +[2025-03-30 15:14:44] app-docker.js not running. +[2025-03-30 15:14:46] app-docker.js not running. +[2025-03-30 15:14:48] app-docker.js not running. +[2025-03-30 15:14:50] app-docker.js not running. +[2025-03-30 15:14:52] app-docker.js not running. +[2025-03-30 15:14:54] app-docker.js not running. +[2025-03-30 15:14:56] app-docker.js not running. +[2025-03-30 15:14:58] app-docker.js not running. +[2025-03-30 15:15:00] app-docker.js not running. +[2025-03-30 15:15:02] app-docker.js not running. +[2025-03-30 15:15:04] app-docker.js not running. +[2025-03-30 15:15:06] app-docker.js not running. +[2025-03-30 15:15:08] app-docker.js not running. +[2025-03-30 15:15:10] app-docker.js not running. +[2025-03-30 15:15:12] app-docker.js not running. +[2025-03-30 15:15:14] app-docker.js not running. +[2025-03-30 15:15:16] app-docker.js not running. +[2025-03-30 15:15:18] app-docker.js not running. +[2025-03-30 15:15:20] app-docker.js not running. +[2025-03-30 15:15:22] app-docker.js not running. +[2025-03-30 15:15:25] app-docker.js not running. +[2025-03-30 15:15:27] app-docker.js not running. +[2025-03-30 15:15:29] app-docker.js not running. +[2025-03-30 15:15:31] app-docker.js not running. +[2025-03-30 15:15:33] app-docker.js not running. +[2025-03-30 15:15:35] app-docker.js not running. +[2025-03-30 15:15:37] app-docker.js not running. +[2025-03-30 15:15:39] app-docker.js not running. +[2025-03-30 15:15:41] app-docker.js not running. +[2025-03-30 15:15:43] app-docker.js not running. +[2025-03-30 15:15:45] app-docker.js not running. +[2025-03-30 15:15:47] app-docker.js not running. +[2025-03-30 15:15:49] app-docker.js not running. +[2025-03-30 15:15:51] app-docker.js not running. +[2025-03-30 15:15:53] app-docker.js not running. +[2025-03-30 15:15:55] app-docker.js not running. +[2025-03-30 15:15:57] app-docker.js not running. +[2025-03-30 15:15:59] app-docker.js not running. +[2025-03-30 15:16:01] app-docker.js not running. +[2025-03-30 15:16:03] app-docker.js not running. +[2025-03-30 15:16:05] app-docker.js not running. +[2025-03-30 15:16:07] app-docker.js not running. +[2025-03-30 15:16:09] app-docker.js not running. +[2025-03-30 15:16:11] app-docker.js not running. +[2025-03-30 15:16:13] app-docker.js not running. +[2025-03-30 15:16:15] app-docker.js not running. +[2025-03-30 15:16:17] app-docker.js not running. +[2025-03-30 15:16:19] app-docker.js not running. +[2025-03-30 15:16:21] app-docker.js not running. +[2025-03-30 15:16:23] app-docker.js not running. +[2025-03-30 15:16:25] app-docker.js not running. +[2025-03-30 15:16:27] app-docker.js not running. +[2025-03-30 15:16:29] app-docker.js not running. +[2025-03-30 15:16:31] app-docker.js not running. +[2025-03-30 15:16:34] app-docker.js not running. +[2025-03-30 15:16:36] app-docker.js not running. +[2025-03-30 15:16:38] app-docker.js not running. +[2025-03-30 15:16:40] app-docker.js not running. +[2025-03-30 15:16:42] app-docker.js not running. +[2025-03-30 15:16:44] app-docker.js not running. +[2025-03-30 15:16:46] app-docker.js not running. +[2025-03-30 15:16:48] app-docker.js not running. +[2025-03-30 15:16:50] app-docker.js not running. +[2025-03-30 15:16:52] app-docker.js not running. +[2025-03-30 15:16:54] app-docker.js not running. +[2025-03-30 15:16:56] app-docker.js not running. +[2025-03-30 15:16:58] app-docker.js not running. +[2025-03-30 15:17:00] app-docker.js not running. +[2025-03-30 15:17:02] app-docker.js not running. +[2025-03-30 15:17:04] app-docker.js not running. +[2025-03-30 15:17:06] app-docker.js not running. +[2025-03-30 15:17:08] app-docker.js not running. +[2025-03-30 15:17:10] app-docker.js not running. +[2025-03-30 15:17:12] app-docker.js not running. +[2025-03-30 15:17:14] app-docker.js not running. +[2025-03-30 15:17:16] app-docker.js not running. +[2025-03-30 15:17:18] app-docker.js not running. +[2025-03-30 15:17:20] app-docker.js not running. +[2025-03-30 15:17:22] app-docker.js not running. +[2025-03-30 15:17:24] app-docker.js not running. +[2025-03-30 15:17:26] app-docker.js not running. +[2025-03-30 15:17:28] app-docker.js not running. +[2025-03-30 15:17:30] app-docker.js not running. +[2025-03-30 15:17:32] app-docker.js not running. +[2025-03-30 15:17:34] app-docker.js not running. +[2025-03-30 15:17:36] app-docker.js not running. +[2025-03-30 15:17:38] app-docker.js not running. +[2025-03-30 15:17:40] app-docker.js not running. +[2025-03-30 15:17:42] app-docker.js not running. +[2025-03-30 15:17:45] app-docker.js not running. +[2025-03-30 15:17:47] app-docker.js not running. +[2025-03-30 15:17:49] app-docker.js not running. +[2025-03-30 15:17:51] app-docker.js not running. +[2025-03-30 15:17:53] app-docker.js not running. +[2025-03-30 15:17:55] app-docker.js not running. +[2025-03-30 15:17:57] app-docker.js not running. +[2025-03-30 15:17:59] app-docker.js not running. +[2025-03-30 15:18:01] app-docker.js not running. +[2025-03-30 15:18:03] app-docker.js not running. +[2025-03-30 15:18:05] app-docker.js not running. +[2025-03-30 15:18:07] app-docker.js not running. +[2025-03-30 15:18:09] app-docker.js not running. +[2025-03-30 15:18:11] app-docker.js not running. +[2025-03-30 15:18:13] app-docker.js not running. +[2025-03-30 15:18:15] app-docker.js not running. +[2025-03-30 15:18:17] app-docker.js not running. +[2025-03-30 15:18:19] app-docker.js not running. +[2025-03-30 15:18:21] app-docker.js not running. +[2025-03-30 15:18:23] app-docker.js not running. +[2025-03-30 15:18:25] app-docker.js not running. +[2025-03-30 15:18:27] app-docker.js not running. +[2025-03-30 15:18:29] app-docker.js not running. +[2025-03-30 15:18:31] app-docker.js not running. +[2025-03-30 15:18:33] app-docker.js not running. +[2025-03-30 15:18:35] app-docker.js not running. +[2025-03-30 15:18:37] app-docker.js not running. +[2025-03-30 15:18:39] app-docker.js not running. +[2025-03-30 15:18:41] app-docker.js not running. +[2025-03-30 15:18:43] app-docker.js not running. +[2025-03-30 15:18:45] app-docker.js not running. +[2025-03-30 15:18:47] app-docker.js not running. +[2025-03-30 15:18:50] app-docker.js not running. +[2025-03-30 15:18:52] app-docker.js not running. +[2025-03-30 15:18:54] app-docker.js not running. +[2025-03-30 15:18:56] app-docker.js not running. +[2025-03-30 15:18:58] app-docker.js not running. +[2025-03-30 15:19:00] app-docker.js not running. +[2025-03-30 15:19:02] app-docker.js not running. +[2025-03-30 15:19:04] app-docker.js not running. +[2025-03-30 15:19:06] app-docker.js not running. +[2025-03-30 15:19:08] app-docker.js not running. +[2025-03-30 15:19:10] app-docker.js not running. +[2025-03-30 15:19:12] app-docker.js not running. +[2025-03-30 15:19:14] app-docker.js not running. +[2025-03-30 15:19:16] app-docker.js not running. +[2025-03-30 15:19:18] app-docker.js not running. +[2025-03-30 15:19:20] app-docker.js not running. +[2025-03-30 15:19:22] app-docker.js not running. +[2025-03-30 15:19:24] app-docker.js not running. +[2025-03-30 15:19:26] app-docker.js not running. +[2025-03-30 15:19:28] app-docker.js not running. +[2025-03-30 15:19:30] app-docker.js not running. +[2025-03-30 15:19:32] app-docker.js not running. +[2025-03-30 15:19:34] app-docker.js not running. +[2025-03-30 15:19:36] app-docker.js not running. +[2025-03-30 15:19:38] app-docker.js not running. +[2025-03-30 15:19:40] app-docker.js not running. +[2025-03-30 15:19:42] app-docker.js not running. +[2025-03-30 15:19:44] app-docker.js not running. +[2025-03-30 15:19:46] app-docker.js not running. +[2025-03-30 15:19:48] app-docker.js not running. +[2025-03-30 15:19:50] app-docker.js not running. +[2025-03-30 15:19:52] app-docker.js not running. +[2025-03-30 15:19:54] app-docker.js not running. +[2025-03-30 15:19:56] app-docker.js not running. +[2025-03-30 15:19:59] app-docker.js not running. +[2025-03-30 15:20:01] app-docker.js not running. +[2025-03-30 15:20:03] app-docker.js not running. +[2025-03-30 15:20:05] app-docker.js not running. +[2025-03-30 15:20:07] app-docker.js not running. +[2025-03-30 15:20:09] app-docker.js not running. +[2025-03-30 15:20:11] app-docker.js not running. +[2025-03-30 15:20:13] app-docker.js not running. +[2025-03-30 15:20:15] app-docker.js not running. +[2025-03-30 15:20:17] app-docker.js not running. +[2025-03-30 15:20:19] app-docker.js not running. +[2025-03-30 15:20:21] app-docker.js not running. +[2025-03-30 15:20:23] app-docker.js not running. +[2025-03-30 15:20:25] app-docker.js not running. +[2025-03-30 15:20:27] app-docker.js not running. +[2025-03-30 15:20:29] app-docker.js not running. +[2025-03-30 15:20:31] app-docker.js not running. +[2025-03-30 15:20:33] app-docker.js not running. +[2025-03-30 15:20:35] app-docker.js not running. +[2025-03-30 15:20:37] app-docker.js not running. +[2025-03-30 15:20:39] app-docker.js not running. +[2025-03-30 15:20:41] app-docker.js not running. +[2025-03-30 15:20:43] app-docker.js not running. +[2025-03-30 15:20:45] app-docker.js not running. +[2025-03-30 15:20:47] app-docker.js not running. +[2025-03-30 15:20:49] app-docker.js not running. +[2025-03-30 15:20:51] app-docker.js not running. +[2025-03-30 15:20:53] app-docker.js not running. +[2025-03-30 15:20:55] app-docker.js not running. +[2025-03-30 15:20:57] app-docker.js not running. +[2025-03-30 15:20:59] app-docker.js not running. +[2025-03-30 15:21:01] app-docker.js not running. +[2025-03-30 15:21:03] app-docker.js not running. +[2025-03-30 15:21:05] app-docker.js not running. +[2025-03-30 15:21:07] app-docker.js not running. +[2025-03-30 15:21:09] app-docker.js not running. +[2025-03-30 15:21:12] app-docker.js not running. +[2025-03-30 15:21:14] app-docker.js not running. +[2025-03-30 15:21:16] app-docker.js not running. +[2025-03-30 15:21:18] app-docker.js not running. +[2025-03-30 15:21:20] app-docker.js not running. +[2025-03-30 15:21:22] app-docker.js not running. +[2025-03-30 15:21:24] app-docker.js not running. +[2025-03-30 15:21:26] app-docker.js not running. +[2025-03-30 15:21:28] app-docker.js not running. +[2025-03-30 15:21:30] app-docker.js not running. +[2025-03-30 15:21:32] app-docker.js not running. +[2025-03-30 15:21:34] app-docker.js not running. +[2025-03-30 15:21:36] app-docker.js not running. +[2025-03-30 15:21:38] app-docker.js not running. +[2025-03-30 15:21:40] app-docker.js not running. +[2025-03-30 15:21:42] app-docker.js not running. +[2025-03-30 15:21:44] app-docker.js not running. +[2025-03-30 15:21:46] app-docker.js not running. +[2025-03-30 15:21:48] app-docker.js not running. +[2025-03-30 15:21:50] app-docker.js not running. +[2025-03-30 15:21:52] app-docker.js not running. +[2025-03-30 15:21:54] app-docker.js not running. +[2025-03-30 15:21:56] app-docker.js not running. +[2025-03-30 15:21:58] app-docker.js not running. +[2025-03-30 15:22:00] app-docker.js not running. +[2025-03-30 15:22:02] app-docker.js not running. +[2025-03-30 15:22:04] app-docker.js not running. +[2025-03-30 15:22:06] app-docker.js not running. +[2025-03-30 15:22:08] app-docker.js not running. +[2025-03-30 15:22:10] app-docker.js not running. +[2025-03-30 15:22:12] app-docker.js not running. +[2025-03-30 15:22:14] app-docker.js not running. +[2025-03-30 15:22:16] app-docker.js not running. +[2025-03-30 15:22:18] app-docker.js not running. +[2025-03-30 15:22:21] app-docker.js not running. +[2025-03-30 15:22:23] app-docker.js not running. +[2025-03-30 15:22:25] app-docker.js not running. +[2025-03-30 15:22:27] app-docker.js not running. +[2025-03-30 15:22:29] app-docker.js not running. +[2025-03-30 15:22:31] app-docker.js not running. +[2025-03-30 15:22:33] app-docker.js not running. +[2025-03-30 15:22:35] app-docker.js not running. +[2025-03-30 15:22:37] app-docker.js not running. +[2025-03-30 15:22:39] app-docker.js not running. +[2025-03-30 15:22:41] app-docker.js not running. +[2025-03-30 15:22:43] app-docker.js not running. +[2025-03-30 15:22:45] app-docker.js not running. +[2025-03-30 15:22:47] app-docker.js not running. +[2025-03-30 15:22:49] app-docker.js not running. +[2025-03-30 15:22:51] app-docker.js not running. +[2025-03-30 15:22:53] app-docker.js not running. +[2025-03-30 15:22:55] app-docker.js not running. +[2025-03-30 15:22:57] app-docker.js not running. +[2025-03-30 15:22:59] app-docker.js not running. +[2025-03-30 15:23:01] app-docker.js not running. +[2025-03-30 15:23:03] app-docker.js not running. +[2025-03-30 15:23:05] app-docker.js not running. +[2025-03-30 15:23:07] app-docker.js not running. +[2025-03-30 15:23:09] app-docker.js not running. +[2025-03-30 15:23:11] app-docker.js not running. +[2025-03-30 15:23:13] app-docker.js not running. +[2025-03-30 15:23:15] app-docker.js not running. +[2025-03-30 15:23:17] app-docker.js not running. +[2025-03-30 15:23:19] app-docker.js not running. +[2025-03-30 15:23:21] app-docker.js not running. +[2025-03-30 15:23:23] app-docker.js not running. +[2025-03-30 15:23:25] app-docker.js not running. +[2025-03-30 15:23:27] app-docker.js not running. +[2025-03-30 15:23:29] app-docker.js not running. +[2025-03-30 15:23:32] app-docker.js not running. +[2025-03-30 15:23:34] app-docker.js not running. +[2025-03-30 15:23:36] app-docker.js not running. +[2025-03-30 15:23:38] app-docker.js not running. +[2025-03-30 15:23:40] app-docker.js not running. +[2025-03-30 15:23:42] app-docker.js not running. +[2025-03-30 15:23:44] app-docker.js not running. +[2025-03-30 15:23:46] app-docker.js not running. +[2025-03-30 15:23:48] app-docker.js not running. +[2025-03-30 15:23:50] app-docker.js not running. +[2025-03-30 15:23:52] app-docker.js not running. +[2025-03-30 15:23:54] app-docker.js not running. +[2025-03-30 15:23:56] app-docker.js not running. +[2025-03-30 15:23:58] app-docker.js not running. +[2025-03-30 15:24:00] app-docker.js not running. +[2025-03-30 15:24:02] app-docker.js not running. +[2025-03-30 15:24:04] app-docker.js not running. +[2025-03-30 15:24:06] app-docker.js not running. +[2025-03-30 15:24:08] app-docker.js not running. +[2025-03-30 15:24:10] app-docker.js not running. +[2025-03-30 15:24:12] app-docker.js not running. +[2025-03-30 15:24:14] app-docker.js not running. +[2025-03-30 15:24:16] app-docker.js not running. +[2025-03-30 15:24:18] app-docker.js not running. +[2025-03-30 15:24:20] app-docker.js not running. +[2025-03-30 15:24:22] app-docker.js not running. +[2025-03-30 15:24:24] app-docker.js not running. +[2025-03-30 15:24:26] app-docker.js not running. +[2025-03-30 15:24:28] app-docker.js not running. +[2025-03-30 15:24:30] app-docker.js not running. +[2025-03-30 15:24:32] app-docker.js not running. +[2025-03-30 15:24:34] app-docker.js not running. +[2025-03-30 15:24:36] app-docker.js not running. +[2025-03-30 15:24:38] app-docker.js not running. +[2025-03-30 15:24:41] app-docker.js not running. +[2025-03-30 15:24:43] app-docker.js not running. +[2025-03-30 15:24:45] app-docker.js not running. +[2025-03-30 15:24:47] app-docker.js not running. +[2025-03-30 15:24:49] app-docker.js not running. +[2025-03-30 15:24:51] app-docker.js not running. +[2025-03-30 15:24:53] app-docker.js not running. +[2025-03-30 15:24:55] app-docker.js not running. +[2025-03-30 15:24:57] app-docker.js not running. +[2025-03-30 15:24:59] app-docker.js not running. +[2025-03-30 15:25:01] app-docker.js not running. +[2025-03-30 15:25:03] app-docker.js not running. +[2025-03-30 15:25:05] app-docker.js not running. +[2025-03-30 15:25:07] app-docker.js not running. +[2025-03-30 15:25:09] app-docker.js not running. +[2025-03-30 15:25:11] app-docker.js not running. +[2025-03-30 15:25:13] app-docker.js not running. +[2025-03-30 15:25:15] app-docker.js not running. +[2025-03-30 15:25:17] app-docker.js not running. +[2025-03-30 15:25:19] app-docker.js not running. +[2025-03-30 15:25:21] app-docker.js not running. +[2025-03-30 15:25:23] app-docker.js not running. +[2025-03-30 15:25:25] app-docker.js not running. +[2025-03-30 15:25:27] app-docker.js not running. +[2025-03-30 15:25:29] app-docker.js not running. +[2025-03-30 15:25:31] app-docker.js not running. +[2025-03-30 15:25:33] app-docker.js not running. +[2025-03-30 15:25:35] app-docker.js not running. +[2025-03-30 15:25:37] app-docker.js not running. +[2025-03-30 15:25:39] app-docker.js not running. +[2025-03-30 15:25:41] app-docker.js not running. +[2025-03-30 15:25:43] app-docker.js not running. +[2025-03-30 15:25:45] app-docker.js not running. +[2025-03-30 15:25:47] app-docker.js not running. +[2025-03-30 15:25:50] app-docker.js not running. +[2025-03-30 15:25:52] app-docker.js not running. +[2025-03-30 15:25:54] app-docker.js not running. +[2025-03-30 15:25:56] app-docker.js not running. +[2025-03-30 15:25:58] app-docker.js not running. +[2025-03-30 15:26:00] app-docker.js not running. +[2025-03-30 15:26:02] app-docker.js not running. +[2025-03-30 15:26:04] app-docker.js not running. +[2025-03-30 15:26:06] app-docker.js not running. +[2025-03-30 15:26:08] app-docker.js not running. +[2025-03-30 15:26:10] app-docker.js not running. +[2025-03-30 15:26:12] app-docker.js not running. +[2025-03-30 15:26:14] app-docker.js not running. +[2025-03-30 15:26:16] app-docker.js not running. +[2025-03-30 15:26:18] app-docker.js not running. +[2025-03-30 15:26:20] app-docker.js not running. +[2025-03-30 15:26:22] app-docker.js not running. +[2025-03-30 15:26:24] app-docker.js not running. +[2025-03-30 15:26:26] app-docker.js not running. +[2025-03-30 15:26:28] app-docker.js not running. +[2025-03-30 15:26:30] app-docker.js not running. +[2025-03-30 15:26:32] app-docker.js not running. +[2025-03-30 15:26:34] app-docker.js not running. +[2025-03-30 15:26:36] app-docker.js not running. +[2025-03-30 15:26:38] app-docker.js not running. +[2025-03-30 15:26:40] app-docker.js not running. +[2025-03-30 15:26:42] app-docker.js not running. +[2025-03-30 15:26:44] app-docker.js not running. +[2025-03-30 15:26:46] app-docker.js not running. +[2025-03-30 15:26:48] app-docker.js not running. +[2025-03-30 15:26:50] app-docker.js not running. +[2025-03-30 15:26:52] app-docker.js not running. +[2025-03-30 15:26:54] app-docker.js not running. +[2025-03-30 15:26:56] app-docker.js not running. +[2025-03-30 15:26:59] app-docker.js not running. +[2025-03-30 15:27:01] app-docker.js not running. +[2025-03-30 15:27:03] app-docker.js not running. +[2025-03-30 15:27:05] app-docker.js not running. +[2025-03-30 15:27:07] app-docker.js not running. +[2025-03-30 15:27:09] app-docker.js not running. +[2025-03-30 15:27:11] app-docker.js not running. +[2025-03-30 15:27:13] app-docker.js not running. +[2025-03-30 15:27:15] app-docker.js not running. +[2025-03-30 15:27:17] app-docker.js not running. +[2025-03-30 15:27:19] app-docker.js not running. +[2025-03-30 15:27:21] app-docker.js not running. +[2025-03-30 15:27:23] app-docker.js not running. +[2025-03-30 15:27:26] app-docker.js not running. +[2025-03-30 15:32:29] app-docker.js not running. +[2025-03-30 15:32:31] app-docker.js not running. +[2025-03-30 15:32:33] app-docker.js not running. +[2025-03-30 15:32:35] app-docker.js not running. +[2025-03-30 15:32:37] app-docker.js not running. +[2025-03-30 15:32:39] app-docker.js not running. +[2025-03-30 15:32:41] app-docker.js not running. +[2025-03-30 15:32:43] app-docker.js not running. +[2025-03-30 15:32:45] app-docker.js not running. +[2025-03-30 15:32:47] app-docker.js not running. +[2025-03-30 15:32:50] app-docker.js not running. +[2025-03-30 15:32:52] app-docker.js not running. +[2025-03-30 15:32:54] app-docker.js not running. +[2025-03-30 15:32:56] app-docker.js not running. +[2025-03-30 15:32:58] app-docker.js not running. +[2025-03-30 15:33:00] app-docker.js not running. +[2025-03-30 15:33:02] app-docker.js not running. +[2025-03-30 15:33:04] app-docker.js not running. +[2025-03-30 15:33:06] app-docker.js not running. +[2025-03-30 15:33:08] app-docker.js not running. +[2025-03-30 15:33:10] app-docker.js not running. +[2025-03-30 15:33:12] app-docker.js not running. +[2025-03-30 15:33:14] app-docker.js not running. +[2025-03-30 15:33:16] app-docker.js not running. +[2025-03-30 15:33:18] app-docker.js not running. +[2025-03-30 15:33:20] app-docker.js not running. +[2025-03-30 15:33:22] app-docker.js not running. +[2025-03-30 15:33:24] app-docker.js not running. +[2025-03-30 15:33:26] app-docker.js not running. +[2025-03-30 15:33:28] app-docker.js not running. +[2025-03-30 15:33:31] app-docker.js not running. +[2025-03-30 15:33:33] app-docker.js not running. +[2025-03-30 15:33:35] app-docker.js not running. +[2025-03-30 15:33:37] app-docker.js not running. +[2025-03-30 15:33:39] app-docker.js not running. +[2025-03-30 15:33:41] app-docker.js not running. +[2025-03-30 15:33:43] app-docker.js not running. +[2025-03-30 15:33:45] app-docker.js not running. +[2025-03-30 15:33:47] app-docker.js not running. +[2025-03-30 15:33:49] app-docker.js not running. +[2025-03-30 15:33:51] app-docker.js not running. +[2025-03-30 15:33:53] app-docker.js not running. +[2025-03-30 15:33:55] app-docker.js not running. +[2025-03-30 15:33:57] app-docker.js not running. +[2025-03-30 15:33:59] app-docker.js not running. +[2025-03-30 15:34:01] app-docker.js not running. +[2025-03-30 15:34:03] app-docker.js not running. +[2025-03-30 15:34:05] app-docker.js not running. +[2025-03-30 15:34:07] app-docker.js not running. +[2025-03-30 15:34:09] app-docker.js not running. +[2025-03-30 15:34:11] app-docker.js not running. +[2025-03-30 15:34:13] app-docker.js not running. +[2025-03-30 15:34:16] app-docker.js not running. +[2025-03-30 15:34:18] app-docker.js not running. +[2025-03-30 15:34:20] app-docker.js not running. +[2025-03-30 15:34:22] app-docker.js not running. +[2025-03-30 15:34:24] app-docker.js not running. +[2025-03-30 15:34:26] app-docker.js not running. +[2025-03-30 15:34:28] app-docker.js not running. +[2025-03-30 15:34:30] app-docker.js not running. +[2025-03-30 15:34:32] app-docker.js not running. +[2025-03-30 15:34:35] app-docker.js not running. +[2025-03-30 15:34:37] app-docker.js not running. +[2025-03-30 15:34:39] app-docker.js not running. +[2025-03-30 15:34:41] app-docker.js not running. +[2025-03-30 15:34:44] app-docker.js not running. +[2025-03-30 15:34:47] app-docker.js not running. +[2025-03-30 15:50:39] app-docker.js not running. +[2025-03-30 16:26:35] app-docker.js not running. +[2025-03-30 16:26:37] app-docker.js not running. +[2025-03-30 16:26:39] app-docker.js not running. +[2025-03-30 16:26:41] app-docker.js not running. +[2025-03-30 16:26:43] app-docker.js not running. +[2025-03-30 16:26:45] app-docker.js not running. +[2025-03-30 16:26:47] app-docker.js not running. +[2025-03-30 16:26:49] app-docker.js not running. +[2025-03-30 16:26:51] app-docker.js not running. +[2025-03-30 16:26:53] app-docker.js not running. +[2025-03-30 16:26:55] app-docker.js not running. +[2025-03-30 16:26:57] app-docker.js not running. +[2025-03-30 16:26:59] app-docker.js not running. +[2025-03-30 16:27:01] app-docker.js not running. +[2025-03-30 16:27:03] app-docker.js not running. +[2025-03-30 16:27:06] app-docker.js not running. +[2025-03-30 16:27:08] app-docker.js not running. +[2025-03-30 16:27:10] app-docker.js not running. +[2025-03-30 16:27:12] app-docker.js not running. +[2025-03-30 16:27:15] app-docker.js not running. +[2025-03-30 16:27:19] app-docker.js not running. +[2025-03-30 16:27:22] app-docker.js not running. +[2025-03-30 16:29:30] app-docker.js not running. +[2025-03-30 16:40:08] app-docker.js not running. +[2025-03-30 16:40:15] app-docker.js not running. +[2025-03-30 16:42:08] app-docker.js not running. +[2025-03-30 16:42:14] app-docker.js not running. +[2025-03-30 16:42:27] app-docker.js not running. +[2025-03-30 16:42:40] app-docker.js not running. +[2025-03-30 16:45:05] app-docker.js not running. +[2025-03-30 16:45:16] app-docker.js not running. +[2025-03-30 16:49:33] app-docker.js not running. +[2025-03-30 16:52:21] app-docker.js not running. +[2025-03-30 16:52:57] app-docker.js not running. +[2025-03-30 17:18:50] app-docker.js not running. +[2025-03-30 19:27:58] app-docker.js not running. +[2025-03-30 20:33:26] app-docker.js not running. +[2025-03-30 20:33:28] app-docker.js not running. +[2025-03-30 20:33:30] app-docker.js not running. +[2025-03-30 20:33:32] app-docker.js not running. +[2025-03-30 20:33:34] app-docker.js not running. +[2025-03-30 20:33:36] app-docker.js not running. +[2025-03-30 20:33:38] app-docker.js not running. +[2025-03-30 20:33:40] app-docker.js not running. +[2025-03-30 20:33:42] app-docker.js not running. +[2025-03-30 20:33:45] app-docker.js not running. +[2025-03-30 20:33:47] app-docker.js not running. +[2025-03-30 20:33:49] app-docker.js not running. +[2025-03-30 20:33:51] app-docker.js not running. +[2025-03-30 20:33:53] app-docker.js not running. +[2025-03-30 20:33:55] app-docker.js not running. +[2025-03-30 20:33:57] app-docker.js not running. +[2025-03-30 20:33:59] app-docker.js not running. +[2025-03-30 20:34:01] app-docker.js not running. +[2025-03-30 20:34:03] app-docker.js not running. +[2025-03-30 20:34:05] app-docker.js not running. +[2025-03-30 20:34:07] app-docker.js not running. +[2025-03-30 20:34:09] app-docker.js not running. +[2025-03-30 20:34:11] app-docker.js not running. +[2025-03-30 20:34:13] app-docker.js not running. +[2025-03-30 20:34:15] app-docker.js not running. +[2025-03-30 20:34:17] app-docker.js not running. +[2025-03-30 20:34:19] app-docker.js not running. +[2025-03-30 20:34:21] app-docker.js not running. +[2025-03-30 20:34:23] app-docker.js not running. +[2025-03-30 20:34:25] app-docker.js not running. +[2025-03-30 20:34:27] app-docker.js not running. +[2025-03-30 20:34:29] app-docker.js not running. +[2025-03-30 20:34:31] app-docker.js not running. +[2025-03-30 20:34:33] app-docker.js not running. +[2025-03-30 20:34:35] app-docker.js not running. +[2025-03-30 20:34:37] app-docker.js not running. +[2025-03-30 20:34:39] app-docker.js not running. +[2025-03-30 20:34:41] app-docker.js not running. +[2025-03-30 20:34:43] app-docker.js not running. +[2025-03-30 20:34:45] app-docker.js not running. +[2025-03-30 20:34:47] app-docker.js not running. +[2025-03-30 20:34:49] app-docker.js not running. +[2025-03-30 20:34:52] app-docker.js not running. +[2025-03-30 20:34:54] app-docker.js not running. +[2025-03-30 20:34:56] app-docker.js not running. +[2025-03-30 20:34:58] app-docker.js not running. +[2025-03-30 20:35:00] app-docker.js not running. +[2025-03-30 20:35:02] app-docker.js not running. +[2025-03-30 20:35:04] app-docker.js not running. +[2025-03-30 20:35:06] app-docker.js not running. +[2025-03-30 20:35:08] app-docker.js not running. +[2025-03-30 20:35:10] app-docker.js not running. +[2025-03-30 20:35:12] app-docker.js not running. +[2025-03-30 20:35:14] app-docker.js not running. +[2025-03-30 20:35:16] app-docker.js not running. +[2025-03-30 20:35:18] app-docker.js not running. +[2025-03-30 20:35:20] app-docker.js not running. +[2025-03-30 20:35:22] app-docker.js not running. +[2025-03-30 20:35:24] app-docker.js not running. +[2025-03-30 20:35:26] app-docker.js not running. +[2025-03-30 20:35:28] app-docker.js not running. +[2025-03-30 20:35:30] app-docker.js not running. +[2025-03-30 20:35:32] app-docker.js not running. +[2025-03-30 20:35:34] app-docker.js not running. +[2025-03-30 20:35:36] app-docker.js not running. +[2025-03-30 20:35:38] app-docker.js not running. +[2025-03-30 20:35:40] app-docker.js not running. +[2025-03-30 20:35:42] app-docker.js not running. +[2025-03-30 20:35:44] app-docker.js not running. +[2025-03-30 20:35:46] app-docker.js not running. +[2025-03-30 20:35:48] app-docker.js not running. +[2025-03-30 20:35:50] app-docker.js not running. +[2025-03-30 20:35:52] app-docker.js not running. +[2025-03-30 20:35:54] app-docker.js not running. +[2025-03-30 20:35:56] app-docker.js not running. +[2025-03-30 20:35:58] app-docker.js not running. +[2025-03-30 20:36:01] app-docker.js not running. +[2025-03-30 20:36:03] app-docker.js not running. +[2025-03-30 20:36:05] app-docker.js not running. +[2025-03-30 20:36:07] app-docker.js not running. +[2025-03-30 20:36:09] app-docker.js not running. +[2025-03-30 20:36:11] app-docker.js not running. +[2025-03-30 20:36:13] app-docker.js not running. +[2025-03-30 20:36:15] app-docker.js not running. +[2025-03-30 20:36:17] app-docker.js not running. +[2025-03-30 20:36:19] app-docker.js not running. +[2025-03-30 20:36:21] app-docker.js not running. +[2025-03-30 20:36:23] app-docker.js not running. +[2025-03-30 20:36:25] app-docker.js not running. +[2025-03-30 20:36:27] app-docker.js not running. +[2025-03-30 20:36:29] app-docker.js not running. +[2025-03-30 20:36:31] app-docker.js not running. +[2025-03-30 20:36:33] app-docker.js not running. +[2025-03-30 20:36:35] app-docker.js not running. +[2025-03-30 20:36:37] app-docker.js not running. +[2025-03-30 20:36:39] app-docker.js not running. +[2025-03-30 20:36:41] app-docker.js not running. +[2025-03-30 20:36:43] app-docker.js not running. +[2025-03-30 20:36:45] app-docker.js not running. +[2025-03-30 20:36:47] app-docker.js not running. +[2025-03-30 20:36:49] app-docker.js not running. +[2025-03-30 20:36:51] app-docker.js not running. +[2025-03-30 20:36:53] app-docker.js not running. +[2025-03-30 20:36:55] app-docker.js not running. +[2025-03-30 20:36:57] app-docker.js not running. +[2025-03-30 20:36:59] app-docker.js not running. +[2025-03-30 20:37:01] app-docker.js not running. +[2025-03-30 20:37:03] app-docker.js not running. +[2025-03-30 20:37:06] app-docker.js not running. +[2025-03-30 20:37:08] app-docker.js not running. +[2025-03-30 20:37:10] app-docker.js not running. +[2025-03-30 20:37:12] app-docker.js not running. +[2025-03-30 20:37:14] app-docker.js not running. +[2025-03-30 20:37:16] app-docker.js not running. +[2025-03-30 20:37:18] app-docker.js not running. +[2025-03-30 20:37:20] app-docker.js not running. +[2025-03-30 20:37:22] app-docker.js not running. +[2025-03-30 20:37:24] app-docker.js not running. +[2025-03-30 20:37:26] app-docker.js not running. +[2025-03-30 20:37:28] app-docker.js not running. +[2025-03-30 20:37:30] app-docker.js not running. +[2025-03-30 20:37:32] app-docker.js not running. +[2025-03-30 20:37:34] app-docker.js not running. +[2025-03-30 20:37:36] app-docker.js not running. +[2025-03-30 20:37:38] app-docker.js not running. +[2025-03-30 20:37:40] app-docker.js not running. +[2025-03-30 20:37:42] app-docker.js not running. +[2025-03-30 20:37:44] app-docker.js not running. +[2025-03-30 20:37:46] app-docker.js not running. +[2025-03-30 20:37:48] app-docker.js not running. +[2025-03-30 20:37:50] app-docker.js not running. +[2025-03-30 20:37:52] app-docker.js not running. +[2025-03-30 20:37:54] app-docker.js not running. +[2025-03-30 20:37:56] app-docker.js not running. +[2025-03-30 20:37:58] app-docker.js not running. +[2025-03-30 20:38:00] app-docker.js not running. +[2025-03-30 20:38:02] app-docker.js not running. +[2025-03-30 20:38:04] app-docker.js not running. +[2025-03-30 20:38:06] app-docker.js not running. +[2025-03-30 20:38:08] app-docker.js not running. +[2025-03-30 20:38:10] app-docker.js not running. +[2025-03-30 20:38:12] app-docker.js not running. +[2025-03-30 20:38:14] app-docker.js not running. +[2025-03-30 20:38:17] app-docker.js not running. +[2025-03-30 20:38:19] app-docker.js not running. +[2025-03-30 20:38:21] app-docker.js not running. +[2025-03-30 20:38:23] app-docker.js not running. +[2025-03-30 20:38:25] app-docker.js not running. +[2025-03-30 20:38:27] app-docker.js not running. +[2025-03-30 20:38:29] app-docker.js not running. +[2025-03-30 20:38:31] app-docker.js not running. +[2025-03-30 20:38:33] app-docker.js not running. +[2025-03-30 20:38:35] app-docker.js not running. +[2025-03-30 20:38:37] app-docker.js not running. +[2025-03-30 20:38:39] app-docker.js not running. +[2025-03-30 20:38:41] app-docker.js not running. +[2025-03-30 20:38:43] app-docker.js not running. +[2025-03-30 20:38:45] app-docker.js not running. +[2025-03-30 20:38:47] app-docker.js not running. +[2025-03-30 20:38:49] app-docker.js not running. +[2025-03-30 20:38:51] app-docker.js not running. +[2025-03-30 20:38:53] app-docker.js not running. +[2025-03-30 20:38:55] app-docker.js not running. +[2025-03-30 20:38:57] app-docker.js not running. +[2025-03-30 20:38:59] app-docker.js not running. +[2025-03-30 20:39:01] app-docker.js not running. +[2025-03-30 20:39:03] app-docker.js not running. +[2025-03-30 20:39:05] app-docker.js not running. +[2025-03-30 20:39:07] app-docker.js not running. +[2025-03-30 20:39:09] app-docker.js not running. +[2025-03-30 20:39:11] app-docker.js not running. +[2025-03-30 20:39:13] app-docker.js not running. +[2025-03-30 20:39:15] app-docker.js not running. +[2025-03-30 20:39:17] app-docker.js not running. +[2025-03-30 20:39:19] app-docker.js not running. +[2025-03-30 20:39:22] app-docker.js not running. +[2025-03-30 20:39:24] app-docker.js not running. +[2025-03-30 20:39:26] app-docker.js not running. +[2025-03-30 20:39:28] app-docker.js not running. +[2025-03-30 20:39:30] app-docker.js not running. +[2025-03-30 20:39:32] app-docker.js not running. +[2025-03-30 20:39:34] app-docker.js not running. +[2025-03-30 20:39:36] app-docker.js not running. +[2025-03-30 20:39:38] app-docker.js not running. +[2025-03-30 20:39:40] app-docker.js not running. +[2025-03-30 20:39:42] app-docker.js not running. +[2025-03-30 20:39:44] app-docker.js not running. +[2025-03-30 20:39:46] app-docker.js not running. +[2025-03-30 20:39:48] app-docker.js not running. +[2025-03-30 20:39:50] app-docker.js not running. +[2025-03-30 20:39:52] app-docker.js not running. +[2025-03-30 20:39:54] app-docker.js not running. +[2025-03-30 20:39:56] app-docker.js not running. +[2025-03-30 20:39:58] app-docker.js not running. +[2025-03-30 20:40:00] app-docker.js not running. +[2025-03-30 20:40:02] app-docker.js not running. +[2025-03-30 20:40:04] app-docker.js not running. +[2025-03-30 20:40:06] app-docker.js not running. +[2025-03-30 20:40:08] app-docker.js not running. +[2025-03-30 20:40:10] app-docker.js not running. +[2025-03-30 20:40:12] app-docker.js not running. +[2025-03-30 20:40:14] app-docker.js not running. +[2025-03-30 20:40:16] app-docker.js not running. +[2025-03-30 20:40:18] app-docker.js not running. +[2025-03-30 20:40:20] app-docker.js not running. +[2025-03-30 20:40:22] app-docker.js not running. +[2025-03-30 20:40:24] app-docker.js not running. +[2025-03-30 20:40:26] app-docker.js not running. +[2025-03-30 20:40:28] app-docker.js not running. +[2025-03-30 20:40:31] app-docker.js not running. +[2025-03-30 20:40:33] app-docker.js not running. +[2025-03-30 20:40:35] app-docker.js not running. +[2025-03-30 20:40:37] app-docker.js not running. +[2025-03-30 20:40:39] app-docker.js not running. +[2025-03-30 20:40:41] app-docker.js not running. +[2025-03-30 20:40:43] app-docker.js not running. +[2025-03-30 20:40:45] app-docker.js not running. +[2025-03-30 20:40:47] app-docker.js not running. +[2025-03-30 20:40:49] app-docker.js not running. +[2025-03-30 20:40:51] app-docker.js not running. +[2025-03-30 20:40:53] app-docker.js not running. +[2025-03-30 20:40:55] app-docker.js not running. +[2025-03-30 20:40:57] app-docker.js not running. +[2025-03-30 20:40:59] app-docker.js not running. +[2025-03-30 20:41:01] app-docker.js not running. +[2025-03-30 20:41:03] app-docker.js not running. +[2025-03-30 20:41:05] app-docker.js not running. +[2025-03-30 20:41:07] app-docker.js not running. +[2025-03-30 20:41:09] app-docker.js not running. +[2025-03-30 20:41:11] app-docker.js not running. +[2025-03-30 20:41:13] app-docker.js not running. +[2025-03-30 20:41:15] app-docker.js not running. +[2025-03-30 20:41:17] app-docker.js not running. +[2025-03-30 20:41:19] app-docker.js not running. +[2025-03-30 20:41:21] app-docker.js not running. +[2025-03-30 20:41:23] app-docker.js not running. +[2025-03-30 20:41:25] app-docker.js not running. +[2025-03-30 20:41:27] app-docker.js not running. +[2025-03-30 20:41:29] app-docker.js not running. +[2025-03-30 20:41:31] app-docker.js not running. +[2025-03-30 20:41:33] app-docker.js not running. +[2025-03-30 20:41:35] app-docker.js not running. +[2025-03-30 20:41:37] app-docker.js not running. +[2025-03-30 20:41:40] app-docker.js not running. +[2025-03-30 20:41:42] app-docker.js not running. +[2025-03-30 20:41:44] app-docker.js not running. +[2025-03-30 20:41:46] app-docker.js not running. +[2025-03-30 20:41:48] app-docker.js not running. +[2025-03-30 20:41:50] app-docker.js not running. +[2025-03-30 20:41:52] app-docker.js not running. +[2025-03-30 20:41:54] app-docker.js not running. +[2025-03-30 20:41:56] app-docker.js not running. +[2025-03-30 20:41:58] app-docker.js not running. +[2025-03-30 20:42:00] app-docker.js not running. +[2025-03-30 20:42:02] app-docker.js not running. +[2025-03-30 20:42:04] app-docker.js not running. +[2025-03-30 20:42:06] app-docker.js not running. +[2025-03-30 20:42:08] app-docker.js not running. +[2025-03-30 20:42:10] app-docker.js not running. +[2025-03-30 20:42:12] app-docker.js not running. +[2025-03-30 20:42:14] app-docker.js not running. +[2025-03-30 20:42:16] app-docker.js not running. +[2025-03-30 20:42:18] app-docker.js not running. +[2025-03-30 20:42:20] app-docker.js not running. +[2025-03-30 20:42:22] app-docker.js not running. +[2025-03-30 20:42:24] app-docker.js not running. +[2025-03-30 20:42:26] app-docker.js not running. +[2025-03-30 20:42:28] app-docker.js not running. +[2025-03-30 20:42:30] app-docker.js not running. +[2025-03-30 20:42:32] app-docker.js not running. +[2025-03-30 20:42:34] app-docker.js not running. +[2025-03-30 20:42:36] app-docker.js not running. +[2025-03-30 20:42:38] app-docker.js not running. +[2025-03-30 20:42:40] app-docker.js not running. +[2025-03-30 20:42:42] app-docker.js not running. +[2025-03-30 20:42:44] app-docker.js not running. +[2025-03-30 20:42:46] app-docker.js not running. +[2025-03-30 20:42:49] app-docker.js not running. +[2025-03-30 20:42:51] app-docker.js not running. +[2025-03-30 20:42:53] app-docker.js not running. +[2025-03-30 20:42:55] app-docker.js not running. +[2025-03-30 20:42:57] app-docker.js not running. +[2025-03-30 20:42:59] app-docker.js not running. +[2025-03-30 20:43:01] app-docker.js not running. +[2025-03-30 20:43:03] app-docker.js not running. +[2025-03-30 20:43:05] app-docker.js not running. +[2025-03-30 20:43:07] app-docker.js not running. +[2025-03-30 20:43:09] app-docker.js not running. +[2025-03-30 20:43:11] app-docker.js not running. +[2025-03-30 20:43:13] app-docker.js not running. +[2025-03-30 20:43:15] app-docker.js not running. +[2025-03-30 20:43:17] app-docker.js not running. +[2025-03-30 20:43:19] app-docker.js not running. +[2025-03-30 20:43:21] app-docker.js not running. +[2025-03-30 20:43:23] app-docker.js not running. +[2025-03-30 20:43:25] app-docker.js not running. +[2025-03-30 20:43:27] app-docker.js not running. +[2025-03-30 20:43:29] app-docker.js not running. +[2025-03-30 20:43:31] app-docker.js not running. +[2025-03-30 20:43:33] app-docker.js not running. +[2025-03-30 20:43:35] app-docker.js not running. +[2025-03-30 20:43:37] app-docker.js not running. +[2025-03-30 20:43:39] app-docker.js not running. +[2025-03-30 20:43:41] app-docker.js not running. +[2025-03-30 20:43:43] app-docker.js not running. +[2025-03-30 20:43:45] app-docker.js not running. +[2025-03-30 20:43:47] app-docker.js not running. +[2025-03-30 20:43:49] app-docker.js not running. +[2025-03-30 20:43:51] app-docker.js not running. +[2025-03-30 20:43:53] app-docker.js not running. +[2025-03-30 20:43:55] app-docker.js not running. +[2025-03-30 20:43:57] app-docker.js not running. +[2025-03-30 20:44:00] app-docker.js not running. +[2025-03-30 20:44:02] app-docker.js not running. +[2025-03-30 20:44:04] app-docker.js not running. +[2025-03-30 20:44:06] app-docker.js not running. +[2025-03-30 20:44:08] app-docker.js not running. +[2025-03-30 20:44:10] app-docker.js not running. +[2025-03-30 20:44:12] app-docker.js not running. +[2025-03-30 20:44:14] app-docker.js not running. +[2025-03-30 20:44:16] app-docker.js not running. +[2025-03-30 20:44:18] app-docker.js not running. +[2025-03-30 20:44:20] app-docker.js not running. +[2025-03-30 20:44:22] app-docker.js not running. +[2025-03-30 20:44:24] app-docker.js not running. +[2025-03-30 20:44:26] app-docker.js not running. +[2025-03-30 20:44:28] app-docker.js not running. +[2025-03-30 20:44:30] app-docker.js not running. +[2025-03-30 20:44:32] app-docker.js not running. +[2025-03-30 20:44:34] app-docker.js not running. +[2025-03-30 20:44:36] app-docker.js not running. +[2025-03-30 20:44:38] app-docker.js not running. +[2025-03-30 20:44:40] app-docker.js not running. +[2025-03-30 20:44:42] app-docker.js not running. +[2025-03-30 20:44:44] app-docker.js not running. +[2025-03-30 20:44:46] app-docker.js not running. +[2025-03-30 20:44:48] app-docker.js not running. +[2025-03-30 20:44:50] app-docker.js not running. +[2025-03-30 20:44:52] app-docker.js not running. +[2025-03-30 20:44:54] app-docker.js not running. +[2025-03-30 20:44:56] app-docker.js not running. +[2025-03-30 20:44:58] app-docker.js not running. +[2025-03-30 20:45:00] app-docker.js not running. +[2025-03-30 20:45:02] app-docker.js not running. +[2025-03-30 20:45:04] app-docker.js not running. +[2025-03-30 20:45:07] app-docker.js not running. +[2025-03-30 20:45:09] app-docker.js not running. +[2025-03-30 20:45:11] app-docker.js not running. +[2025-03-30 20:45:13] app-docker.js not running. +[2025-03-30 20:45:15] app-docker.js not running. +[2025-03-30 20:45:17] app-docker.js not running. +[2025-03-30 20:45:19] app-docker.js not running. +[2025-03-30 20:45:21] app-docker.js not running. +[2025-03-30 20:45:23] app-docker.js not running. +[2025-03-30 20:45:25] app-docker.js not running. +[2025-03-30 20:45:27] app-docker.js not running. +[2025-03-30 20:45:29] app-docker.js not running. +[2025-03-30 20:45:31] app-docker.js not running. +[2025-03-30 20:45:33] app-docker.js not running. +[2025-03-30 20:45:35] app-docker.js not running. +[2025-03-30 20:45:37] app-docker.js not running. +[2025-03-30 20:45:39] app-docker.js not running. +[2025-03-30 20:45:41] app-docker.js not running. +[2025-03-30 20:45:43] app-docker.js not running. +[2025-03-30 20:45:45] app-docker.js not running. +[2025-03-30 20:45:47] app-docker.js not running. +[2025-03-30 20:45:49] app-docker.js not running. +[2025-03-30 20:45:51] app-docker.js not running. +[2025-03-30 20:45:53] app-docker.js not running. +[2025-03-30 20:45:55] app-docker.js not running. +[2025-03-30 20:45:57] app-docker.js not running. +[2025-03-30 20:45:59] app-docker.js not running. +[2025-03-30 20:46:01] app-docker.js not running. +[2025-03-30 20:46:03] app-docker.js not running. +[2025-03-30 20:46:05] app-docker.js not running. +[2025-03-30 20:46:07] app-docker.js not running. +[2025-03-30 20:46:09] app-docker.js not running. +[2025-03-30 20:46:11] app-docker.js not running. +[2025-03-30 20:46:13] app-docker.js not running. +[2025-03-30 20:46:15] app-docker.js not running. +[2025-03-30 20:46:18] app-docker.js not running. +[2025-03-30 20:46:20] app-docker.js not running. +[2025-03-30 20:46:22] app-docker.js not running. +[2025-03-30 20:46:24] app-docker.js not running. +[2025-03-30 20:46:26] app-docker.js not running. +[2025-03-30 20:46:28] app-docker.js not running. +[2025-03-30 20:46:30] app-docker.js not running. +[2025-03-30 20:46:32] app-docker.js not running. +[2025-03-30 20:46:34] app-docker.js not running. +[2025-03-30 20:46:36] app-docker.js not running. +[2025-03-30 20:46:38] app-docker.js not running. +[2025-03-30 20:46:40] app-docker.js not running. +[2025-03-30 20:46:42] app-docker.js not running. +[2025-03-30 20:46:44] app-docker.js not running. +[2025-03-30 20:46:46] app-docker.js not running. +[2025-03-30 20:46:48] app-docker.js not running. +[2025-03-30 20:46:50] app-docker.js not running. +[2025-03-30 20:46:52] app-docker.js not running. +[2025-03-30 20:46:54] app-docker.js not running. +[2025-03-30 20:46:56] app-docker.js not running. +[2025-03-30 20:46:58] app-docker.js not running. +[2025-03-30 20:47:00] app-docker.js not running. +[2025-03-30 20:47:02] app-docker.js not running. +[2025-03-30 20:47:04] app-docker.js not running. +[2025-03-30 20:47:06] app-docker.js not running. +[2025-03-30 20:47:08] app-docker.js not running. +[2025-03-30 20:47:10] app-docker.js not running. +[2025-03-30 20:47:12] app-docker.js not running. +[2025-03-30 20:47:14] app-docker.js not running. +[2025-03-30 20:47:16] app-docker.js not running. +[2025-03-30 20:47:18] app-docker.js not running. +[2025-03-30 20:47:20] app-docker.js not running. +[2025-03-30 20:47:22] app-docker.js not running. +[2025-03-30 20:47:24] app-docker.js not running. +[2025-03-30 20:47:26] app-docker.js not running. +[2025-03-30 20:47:29] app-docker.js not running. +[2025-03-30 20:47:31] app-docker.js not running. +[2025-03-30 20:47:33] app-docker.js not running. +[2025-03-30 20:47:35] app-docker.js not running. +[2025-03-30 20:47:37] app-docker.js not running. +[2025-03-30 20:47:39] app-docker.js not running. +[2025-03-30 20:47:41] app-docker.js not running. +[2025-03-30 20:47:43] app-docker.js not running. +[2025-03-30 20:47:45] app-docker.js not running. +[2025-03-30 20:47:47] app-docker.js not running. +[2025-03-30 20:47:49] app-docker.js not running. +[2025-03-30 20:47:51] app-docker.js not running. +[2025-03-30 20:47:53] app-docker.js not running. +[2025-03-30 20:47:55] app-docker.js not running. +[2025-03-30 20:47:57] app-docker.js not running. +[2025-03-30 20:47:59] app-docker.js not running. +[2025-03-30 20:48:01] app-docker.js not running. +[2025-03-30 20:48:03] app-docker.js not running. +[2025-03-30 20:48:05] app-docker.js not running. +[2025-03-30 20:48:07] app-docker.js not running. +[2025-03-30 20:48:09] app-docker.js not running. +[2025-03-30 20:48:11] app-docker.js not running. +[2025-03-30 20:48:13] app-docker.js not running. +[2025-03-30 20:48:15] app-docker.js not running. +[2025-03-30 20:48:17] app-docker.js not running. +[2025-03-30 20:48:19] app-docker.js not running. +[2025-03-30 20:48:21] app-docker.js not running. +[2025-03-30 20:48:23] app-docker.js not running. +[2025-03-30 20:48:25] app-docker.js not running. +[2025-03-30 20:48:27] app-docker.js not running. +[2025-03-30 20:48:29] app-docker.js not running. +[2025-03-30 20:48:31] app-docker.js not running. +[2025-03-30 20:48:33] app-docker.js not running. +[2025-03-30 20:48:35] app-docker.js not running. +[2025-03-30 20:48:38] app-docker.js not running. +[2025-03-30 20:48:40] app-docker.js not running. +[2025-03-30 20:48:42] app-docker.js not running. +[2025-03-30 20:48:44] app-docker.js not running. +[2025-03-30 20:48:46] app-docker.js not running. +[2025-03-30 20:48:48] app-docker.js not running. +[2025-03-30 20:48:50] app-docker.js not running. +[2025-03-30 20:48:52] app-docker.js not running. +[2025-03-30 20:48:54] app-docker.js not running. +[2025-03-30 20:48:56] app-docker.js not running. +[2025-03-30 20:48:58] app-docker.js not running. +[2025-03-30 20:49:00] app-docker.js not running. +[2025-03-30 20:49:02] app-docker.js not running. +[2025-03-30 20:49:04] app-docker.js not running. +[2025-03-30 20:49:06] app-docker.js not running. +[2025-03-30 20:49:08] app-docker.js not running. +[2025-03-30 20:49:10] app-docker.js not running. +[2025-03-30 20:49:12] app-docker.js not running. +[2025-03-30 20:49:14] app-docker.js not running. +[2025-03-30 20:49:16] app-docker.js not running. +[2025-03-30 20:49:18] app-docker.js not running. +[2025-03-30 20:49:20] app-docker.js not running. +[2025-03-30 20:49:22] app-docker.js not running. +[2025-03-30 20:49:24] app-docker.js not running. +[2025-03-30 20:49:26] app-docker.js not running. +[2025-03-30 20:49:28] app-docker.js not running. +[2025-03-30 20:49:30] app-docker.js not running. +[2025-03-30 20:49:32] app-docker.js not running. +[2025-03-30 20:49:34] app-docker.js not running. +[2025-03-30 20:49:36] app-docker.js not running. +[2025-03-30 20:49:38] app-docker.js not running. +[2025-03-30 20:49:40] app-docker.js not running. +[2025-03-30 20:49:42] app-docker.js not running. +[2025-03-30 20:49:44] app-docker.js not running. +[2025-03-30 20:49:46] app-docker.js not running. +[2025-03-30 20:49:49] app-docker.js not running. +[2025-03-30 20:49:51] app-docker.js not running. +[2025-03-30 20:49:53] app-docker.js not running. +[2025-03-30 20:49:55] app-docker.js not running. +[2025-03-30 20:49:57] app-docker.js not running. +[2025-03-30 20:49:59] app-docker.js not running. +[2025-03-30 20:50:01] app-docker.js not running. +[2025-03-30 20:50:03] app-docker.js not running. +[2025-03-30 20:50:05] app-docker.js not running. +[2025-03-30 20:50:07] app-docker.js not running. +[2025-03-30 20:50:09] app-docker.js not running. +[2025-03-30 20:50:11] app-docker.js not running. +[2025-03-30 20:50:13] app-docker.js not running. +[2025-03-30 20:50:15] app-docker.js not running. +[2025-03-30 20:50:17] app-docker.js not running. +[2025-03-30 20:50:19] app-docker.js not running. +[2025-03-30 20:50:21] app-docker.js not running. +[2025-03-30 20:50:23] app-docker.js not running. +[2025-03-30 20:50:25] app-docker.js not running. +[2025-03-30 20:50:27] app-docker.js not running. +[2025-03-30 20:50:29] app-docker.js not running. +[2025-03-30 20:50:31] app-docker.js not running. +[2025-03-30 20:50:33] app-docker.js not running. +[2025-03-30 20:50:35] app-docker.js not running. +[2025-03-30 20:50:37] app-docker.js not running. +[2025-03-30 20:50:39] app-docker.js not running. +[2025-03-30 20:50:41] app-docker.js not running. +[2025-03-30 20:50:43] app-docker.js not running. +[2025-03-30 20:50:45] app-docker.js not running. +[2025-03-30 20:50:47] app-docker.js not running. +[2025-03-30 20:50:49] app-docker.js not running. +[2025-03-30 20:50:51] app-docker.js not running. +[2025-03-30 20:50:53] app-docker.js not running. +[2025-03-30 20:50:55] app-docker.js not running. +[2025-03-30 20:50:58] app-docker.js not running. +[2025-03-30 20:51:00] app-docker.js not running. +[2025-03-30 20:51:02] app-docker.js not running. +[2025-03-30 20:51:04] app-docker.js not running. +[2025-03-30 20:51:06] app-docker.js not running. +[2025-03-30 20:51:08] app-docker.js not running. +[2025-03-30 20:51:10] app-docker.js not running. +[2025-03-30 20:51:12] app-docker.js not running. +[2025-03-30 20:51:14] app-docker.js not running. +[2025-03-30 20:51:16] app-docker.js not running. +[2025-03-30 20:51:18] app-docker.js not running. +[2025-03-30 20:51:20] app-docker.js not running. +[2025-03-30 20:51:22] app-docker.js not running. +[2025-03-30 20:51:24] app-docker.js not running. +[2025-03-30 20:51:26] app-docker.js not running. +[2025-03-30 20:51:28] app-docker.js not running. +[2025-03-30 20:51:30] app-docker.js not running. +[2025-03-30 20:51:32] app-docker.js not running. +[2025-03-30 20:51:34] app-docker.js not running. +[2025-03-30 20:51:36] app-docker.js not running. +[2025-03-30 20:51:38] app-docker.js not running. +[2025-03-30 20:51:40] app-docker.js not running. +[2025-03-30 20:51:42] app-docker.js not running. +[2025-03-30 20:51:44] app-docker.js not running. +[2025-03-30 20:51:46] app-docker.js not running. +[2025-03-30 20:51:48] app-docker.js not running. +[2025-03-30 20:51:50] app-docker.js not running. +[2025-03-30 20:51:52] app-docker.js not running. +[2025-03-30 20:51:54] app-docker.js not running. +[2025-03-30 20:51:56] app-docker.js not running. +[2025-03-30 20:51:58] app-docker.js not running. +[2025-03-30 20:52:00] app-docker.js not running. +[2025-03-30 20:52:02] app-docker.js not running. +[2025-03-30 20:52:04] app-docker.js not running. +[2025-03-30 20:52:07] app-docker.js not running. +[2025-03-30 20:52:09] app-docker.js not running. +[2025-03-30 20:52:11] app-docker.js not running. +[2025-03-30 20:52:13] app-docker.js not running. +[2025-03-30 20:52:15] app-docker.js not running. +[2025-03-30 20:52:17] app-docker.js not running. +[2025-03-30 20:52:19] app-docker.js not running. +[2025-03-30 20:52:21] app-docker.js not running. +[2025-03-30 20:52:23] app-docker.js not running. +[2025-03-30 20:52:25] app-docker.js not running. +[2025-03-30 20:52:27] app-docker.js not running. +[2025-03-30 20:52:29] app-docker.js not running. +[2025-03-30 20:52:31] app-docker.js not running. +[2025-03-30 20:52:33] app-docker.js not running. +[2025-03-30 20:52:35] app-docker.js not running. +[2025-03-30 20:52:37] app-docker.js not running. +[2025-03-30 20:52:39] app-docker.js not running. +[2025-03-30 20:52:41] app-docker.js not running. +[2025-03-30 20:52:43] app-docker.js not running. +[2025-03-30 20:52:45] app-docker.js not running. +[2025-03-30 20:52:47] app-docker.js not running. +[2025-03-30 20:52:49] app-docker.js not running. +[2025-03-30 20:52:51] app-docker.js not running. +[2025-03-30 20:52:53] app-docker.js not running. +[2025-03-30 20:52:55] app-docker.js not running. +[2025-03-30 20:52:57] app-docker.js not running. +[2025-03-30 20:52:59] app-docker.js not running. +[2025-03-30 20:53:01] app-docker.js not running. +[2025-03-30 20:53:03] app-docker.js not running. +[2025-03-30 20:53:05] app-docker.js not running. +[2025-03-30 20:53:07] app-docker.js not running. +[2025-03-30 20:53:09] app-docker.js not running. +[2025-03-30 20:53:11] app-docker.js not running. +[2025-03-30 20:53:13] app-docker.js not running. +[2025-03-30 20:53:15] app-docker.js not running. +[2025-03-30 20:53:18] app-docker.js not running. +[2025-03-30 20:53:20] app-docker.js not running. +[2025-03-30 20:53:22] app-docker.js not running. +[2025-03-30 20:53:24] app-docker.js not running. +[2025-03-30 20:53:26] app-docker.js not running. +[2025-03-30 20:53:28] app-docker.js not running. +[2025-03-30 20:53:30] app-docker.js not running. +[2025-03-30 20:53:32] app-docker.js not running. +[2025-03-30 20:53:34] app-docker.js not running. +[2025-03-30 20:53:36] app-docker.js not running. +[2025-03-30 20:53:38] app-docker.js not running. +[2025-03-30 20:53:40] app-docker.js not running. +[2025-03-30 20:53:42] app-docker.js not running. +[2025-03-30 20:53:44] app-docker.js not running. +[2025-03-30 20:53:46] app-docker.js not running. +[2025-03-30 20:53:48] app-docker.js not running. +[2025-03-30 20:53:50] app-docker.js not running. +[2025-03-30 20:53:52] app-docker.js not running. +[2025-03-30 20:53:54] app-docker.js not running. +[2025-03-30 20:53:56] app-docker.js not running. +[2025-03-30 20:53:58] app-docker.js not running. +[2025-03-30 20:54:00] app-docker.js not running. +[2025-03-30 20:54:02] app-docker.js not running. +[2025-03-30 20:54:04] app-docker.js not running. +[2025-03-30 20:54:06] app-docker.js not running. +[2025-03-30 20:54:08] app-docker.js not running. +[2025-03-30 20:54:10] app-docker.js not running. +[2025-03-30 20:54:12] app-docker.js not running. +[2025-03-30 20:54:14] app-docker.js not running. +[2025-03-30 20:54:16] app-docker.js not running. +[2025-03-30 20:54:18] app-docker.js not running. +[2025-03-30 20:54:20] app-docker.js not running. +[2025-03-30 20:54:23] app-docker.js not running. +[2025-03-30 20:54:25] app-docker.js not running. +[2025-03-30 20:54:27] app-docker.js not running. +[2025-03-30 20:54:29] app-docker.js not running. +[2025-03-30 20:54:31] app-docker.js not running. +[2025-03-30 20:54:33] app-docker.js not running. +[2025-03-30 20:54:35] app-docker.js not running. +[2025-03-30 20:54:37] app-docker.js not running. +[2025-03-30 20:54:39] app-docker.js not running. +[2025-03-30 20:54:41] app-docker.js not running. +[2025-03-30 20:54:43] app-docker.js not running. +[2025-03-30 20:54:45] app-docker.js not running. +[2025-03-30 20:54:47] app-docker.js not running. +[2025-03-30 20:54:49] app-docker.js not running. +[2025-03-30 20:54:51] app-docker.js not running. +[2025-03-30 20:54:53] app-docker.js not running. +[2025-03-30 20:54:55] app-docker.js not running. +[2025-03-30 20:54:57] app-docker.js not running. +[2025-03-30 20:54:59] app-docker.js not running. +[2025-03-30 20:55:01] app-docker.js not running. +[2025-03-30 20:55:03] app-docker.js not running. +[2025-03-30 20:55:05] app-docker.js not running. +[2025-03-30 20:55:07] app-docker.js not running. +[2025-03-30 20:55:09] app-docker.js not running. +[2025-03-30 20:55:11] app-docker.js not running. +[2025-03-30 20:55:13] app-docker.js not running. +[2025-03-30 20:55:15] app-docker.js not running. +[2025-03-30 20:55:17] app-docker.js not running. +[2025-03-30 20:55:19] app-docker.js not running. +[2025-03-30 20:55:21] app-docker.js not running. +[2025-03-30 20:55:23] app-docker.js not running. +[2025-03-30 20:55:25] app-docker.js not running. +[2025-03-30 20:55:27] app-docker.js not running. +[2025-03-30 20:55:30] app-docker.js not running. +[2025-03-30 20:55:32] app-docker.js not running. +[2025-03-30 20:55:34] app-docker.js not running. +[2025-03-30 20:55:36] app-docker.js not running. +[2025-03-30 20:55:38] app-docker.js not running. +[2025-03-30 20:55:40] app-docker.js not running. +[2025-03-30 20:55:42] app-docker.js not running. +[2025-03-30 20:55:44] app-docker.js not running. +[2025-03-30 20:55:46] app-docker.js not running. +[2025-03-30 20:55:48] app-docker.js not running. +[2025-03-30 20:55:50] app-docker.js not running. +[2025-03-30 20:55:52] app-docker.js not running. +[2025-03-30 20:55:54] app-docker.js not running. +[2025-03-30 20:55:56] app-docker.js not running. +[2025-03-30 20:55:58] app-docker.js not running. +[2025-03-30 20:56:00] app-docker.js not running. +[2025-03-30 20:56:02] app-docker.js not running. +[2025-03-30 20:56:04] app-docker.js not running. +[2025-03-30 20:56:06] app-docker.js not running. +[2025-03-30 20:56:08] app-docker.js not running. +[2025-03-30 20:56:10] app-docker.js not running. +[2025-03-30 20:56:12] app-docker.js not running. +[2025-03-30 20:56:14] app-docker.js not running. +[2025-03-30 20:56:16] app-docker.js not running. +[2025-03-30 20:56:18] app-docker.js not running. +[2025-03-30 20:56:20] app-docker.js not running. +[2025-03-30 20:56:22] app-docker.js not running. +[2025-03-30 20:56:24] app-docker.js not running. +[2025-03-30 20:56:26] app-docker.js not running. +[2025-03-30 20:56:28] app-docker.js not running. +[2025-03-30 20:56:30] app-docker.js not running. +[2025-03-30 20:56:32] app-docker.js not running. +[2025-03-30 20:56:34] app-docker.js not running. +[2025-03-30 20:56:36] app-docker.js not running. +[2025-03-30 20:56:38] app-docker.js not running. +[2025-03-30 20:56:41] app-docker.js not running. +[2025-03-30 20:56:43] app-docker.js not running. +[2025-03-30 20:56:45] app-docker.js not running. +[2025-03-30 20:56:47] app-docker.js not running. +[2025-03-30 20:56:49] app-docker.js not running. +[2025-03-30 20:56:51] app-docker.js not running. +[2025-03-30 20:56:53] app-docker.js not running. +[2025-03-30 20:56:55] app-docker.js not running. +[2025-03-30 20:56:57] app-docker.js not running. +[2025-03-30 20:56:59] app-docker.js not running. +[2025-03-30 20:57:01] app-docker.js not running. +[2025-03-30 20:57:03] app-docker.js not running. +[2025-03-30 20:57:05] app-docker.js not running. +[2025-03-30 20:57:07] app-docker.js not running. +[2025-03-30 20:57:09] app-docker.js not running. +[2025-03-30 20:57:11] app-docker.js not running. +[2025-03-30 20:57:13] app-docker.js not running. +[2025-03-30 20:57:15] app-docker.js not running. +[2025-03-30 20:57:17] app-docker.js not running. +[2025-03-30 20:57:19] app-docker.js not running. +[2025-03-30 20:57:21] app-docker.js not running. +[2025-03-30 20:57:23] app-docker.js not running. +[2025-03-30 20:57:25] app-docker.js not running. +[2025-03-30 20:57:27] app-docker.js not running. +[2025-03-30 20:57:29] app-docker.js not running. +[2025-03-30 20:57:31] app-docker.js not running. +[2025-03-30 20:57:34] app-docker.js not running. +[2025-03-30 20:57:36] app-docker.js not running. +[2025-03-30 20:57:38] app-docker.js not running. +[2025-03-30 20:57:40] app-docker.js not running. +[2025-03-30 20:57:42] app-docker.js not running. +[2025-03-30 20:57:44] app-docker.js not running. +[2025-03-30 20:57:46] app-docker.js not running. +[2025-03-30 20:57:48] app-docker.js not running. +[2025-03-30 20:57:50] app-docker.js not running. +[2025-03-30 20:57:52] app-docker.js not running. +[2025-03-30 20:57:54] app-docker.js not running. +[2025-03-30 20:57:56] app-docker.js not running. +[2025-03-30 20:57:58] app-docker.js not running. +[2025-03-30 20:58:00] app-docker.js not running. +[2025-03-30 20:58:02] app-docker.js not running. +[2025-03-30 20:58:04] app-docker.js not running. +[2025-03-30 20:58:06] app-docker.js not running. +[2025-03-30 20:58:08] app-docker.js not running. +[2025-03-30 20:58:10] app-docker.js not running. +[2025-03-30 20:58:13] app-docker.js not running. +[2025-03-30 20:58:15] app-docker.js not running. +[2025-03-30 20:58:17] app-docker.js not running. +[2025-03-30 20:58:19] app-docker.js not running. +[2025-03-30 20:58:21] app-docker.js not running. +[2025-03-30 20:58:23] app-docker.js not running. +[2025-03-30 20:58:25] app-docker.js not running. +[2025-03-30 20:58:27] app-docker.js not running. +[2025-03-30 20:58:29] app-docker.js not running. +[2025-03-30 20:58:31] app-docker.js not running. +[2025-03-30 20:58:33] app-docker.js not running. +[2025-03-30 20:58:35] app-docker.js not running. +[2025-03-30 20:58:37] app-docker.js not running. +[2025-03-30 20:58:39] app-docker.js not running. +[2025-03-30 20:58:41] app-docker.js not running. +[2025-03-30 20:58:43] app-docker.js not running. +[2025-03-30 20:58:45] app-docker.js not running. +[2025-03-30 20:58:47] app-docker.js not running. +[2025-03-30 20:58:49] app-docker.js not running. +[2025-03-30 20:58:51] app-docker.js not running. +[2025-03-30 20:58:53] app-docker.js not running. +[2025-03-30 20:58:55] app-docker.js not running. +[2025-03-30 20:58:57] app-docker.js not running. +[2025-03-30 20:58:59] app-docker.js not running. +[2025-03-30 20:59:01] app-docker.js not running. +[2025-03-30 20:59:03] app-docker.js not running. +[2025-03-30 20:59:05] app-docker.js not running. +[2025-03-30 20:59:07] app-docker.js not running. +[2025-03-30 20:59:09] app-docker.js not running. +[2025-03-30 20:59:11] app-docker.js not running. +[2025-03-30 20:59:13] app-docker.js not running. +[2025-03-30 20:59:15] app-docker.js not running. +[2025-03-30 20:59:17] app-docker.js not running. +[2025-03-30 20:59:19] app-docker.js not running. +[2025-03-30 20:59:22] app-docker.js not running. +[2025-03-30 20:59:24] app-docker.js not running. +[2025-03-30 20:59:26] app-docker.js not running. +[2025-03-30 20:59:28] app-docker.js not running. +[2025-03-30 20:59:30] app-docker.js not running. +[2025-03-30 20:59:32] app-docker.js not running. +[2025-03-30 20:59:34] app-docker.js not running. +[2025-03-30 20:59:36] app-docker.js not running. +[2025-03-30 20:59:38] app-docker.js not running. +[2025-03-30 20:59:40] app-docker.js not running. +[2025-03-30 20:59:42] app-docker.js not running. +[2025-03-30 20:59:44] app-docker.js not running. +[2025-03-30 20:59:46] app-docker.js not running. +[2025-03-30 20:59:48] app-docker.js not running. +[2025-03-30 20:59:50] app-docker.js not running. +[2025-03-30 20:59:52] app-docker.js not running. +[2025-03-30 20:59:54] app-docker.js not running. +[2025-03-30 20:59:56] app-docker.js not running. +[2025-03-30 20:59:58] app-docker.js not running. +[2025-03-30 21:00:00] app-docker.js not running. +[2025-03-30 21:00:02] app-docker.js not running. +[2025-03-30 21:00:04] app-docker.js not running. +[2025-03-30 21:00:06] app-docker.js not running. +[2025-03-30 21:00:08] app-docker.js not running. +[2025-03-30 21:00:10] app-docker.js not running. +[2025-03-30 21:00:12] app-docker.js not running. +[2025-03-30 21:00:14] app-docker.js not running. +[2025-03-30 21:00:16] app-docker.js not running. +[2025-03-30 21:00:18] app-docker.js not running. +[2025-03-30 21:00:20] app-docker.js not running. +[2025-03-30 21:00:22] app-docker.js not running. +[2025-03-30 21:00:24] app-docker.js not running. +[2025-03-30 21:00:26] app-docker.js not running. +[2025-03-30 21:00:28] app-docker.js not running. +[2025-03-30 21:00:30] app-docker.js not running. +[2025-03-30 21:00:32] app-docker.js not running. +[2025-03-30 21:00:35] app-docker.js not running. +[2025-03-30 21:00:37] app-docker.js not running. +[2025-03-30 21:00:39] app-docker.js not running. +[2025-03-30 21:00:41] app-docker.js not running. +[2025-03-30 21:00:43] app-docker.js not running. +[2025-03-30 21:00:45] app-docker.js not running. +[2025-03-30 21:00:47] app-docker.js not running. +[2025-03-30 21:00:49] app-docker.js not running. +[2025-03-30 21:00:51] app-docker.js not running. +[2025-03-30 21:00:53] app-docker.js not running. +[2025-03-30 21:00:55] app-docker.js not running. +[2025-03-30 21:00:57] app-docker.js not running. +[2025-03-30 21:00:59] app-docker.js not running. +[2025-03-30 21:01:01] app-docker.js not running. +[2025-03-30 21:01:03] app-docker.js not running. +[2025-03-30 21:01:05] app-docker.js not running. +[2025-03-30 21:01:07] app-docker.js not running. +[2025-03-30 21:01:09] app-docker.js not running. +[2025-03-30 21:01:11] app-docker.js not running. +[2025-03-30 21:01:13] app-docker.js not running. +[2025-03-30 21:01:15] app-docker.js not running. +[2025-03-30 21:01:17] app-docker.js not running. +[2025-03-30 21:01:19] app-docker.js not running. +[2025-03-30 21:01:21] app-docker.js not running. +[2025-03-30 21:01:23] app-docker.js not running. +[2025-03-30 21:01:25] app-docker.js not running. +[2025-03-30 21:01:27] app-docker.js not running. +[2025-03-30 21:01:29] app-docker.js not running. +[2025-03-30 21:01:31] app-docker.js not running. +[2025-03-30 21:01:33] app-docker.js not running. +[2025-03-30 21:01:35] app-docker.js not running. +[2025-03-30 21:01:37] app-docker.js not running. +[2025-03-30 21:01:39] app-docker.js not running. +[2025-03-30 21:01:41] app-docker.js not running. +[2025-03-30 21:01:43] app-docker.js not running. +[2025-03-30 21:01:46] app-docker.js not running. +[2025-03-30 21:01:48] app-docker.js not running. +[2025-03-30 21:01:50] app-docker.js not running. +[2025-03-30 21:01:52] app-docker.js not running. +[2025-03-30 21:01:54] app-docker.js not running. +[2025-03-30 21:01:56] app-docker.js not running. +[2025-03-30 21:01:58] app-docker.js not running. +[2025-03-30 21:02:00] app-docker.js not running. +[2025-03-30 21:02:02] app-docker.js not running. +[2025-03-30 21:02:04] app-docker.js not running. +[2025-03-30 21:02:06] app-docker.js not running. +[2025-03-30 21:02:08] app-docker.js not running. +[2025-03-30 21:02:10] app-docker.js not running. +[2025-03-30 21:02:12] app-docker.js not running. +[2025-03-30 21:02:14] app-docker.js not running. +[2025-03-30 21:02:16] app-docker.js not running. +[2025-03-30 21:02:18] app-docker.js not running. +[2025-03-30 21:02:20] app-docker.js not running. +[2025-03-30 21:02:22] app-docker.js not running. +[2025-03-30 21:02:24] app-docker.js not running. +[2025-03-30 21:02:26] app-docker.js not running. +[2025-03-30 21:02:28] app-docker.js not running. +[2025-03-30 21:02:30] app-docker.js not running. +[2025-03-30 21:02:32] app-docker.js not running. +[2025-03-30 21:02:34] app-docker.js not running. +[2025-03-30 21:02:36] app-docker.js not running. +[2025-03-30 21:02:38] app-docker.js not running. +[2025-03-30 21:02:40] app-docker.js not running. +[2025-03-30 21:02:42] app-docker.js not running. +[2025-03-30 21:02:44] app-docker.js not running. +[2025-03-30 21:02:46] app-docker.js not running. +[2025-03-30 21:02:48] app-docker.js not running. +[2025-03-30 21:02:50] app-docker.js not running. +[2025-03-30 21:02:52] app-docker.js not running. +[2025-03-30 21:02:55] app-docker.js not running. +[2025-03-30 21:02:57] app-docker.js not running. +[2025-03-30 21:02:59] app-docker.js not running. +[2025-03-30 21:03:01] app-docker.js not running. +[2025-03-30 21:03:03] app-docker.js not running. +[2025-03-30 21:03:05] app-docker.js not running. +[2025-03-30 21:03:07] app-docker.js not running. +[2025-03-30 21:03:09] app-docker.js not running. +[2025-03-30 21:03:11] app-docker.js not running. +[2025-03-30 21:03:13] app-docker.js not running. +[2025-03-30 21:03:15] app-docker.js not running. +[2025-03-30 21:03:17] app-docker.js not running. +[2025-03-30 21:03:19] app-docker.js not running. +[2025-03-30 21:03:21] app-docker.js not running. +[2025-03-30 21:03:23] app-docker.js not running. +[2025-03-30 21:03:25] app-docker.js not running. +[2025-03-30 21:03:27] app-docker.js not running. +[2025-03-30 21:03:29] app-docker.js not running. +[2025-03-30 21:03:31] app-docker.js not running. +[2025-03-30 21:03:33] app-docker.js not running. +[2025-03-30 21:03:35] app-docker.js not running. +[2025-03-30 21:03:37] app-docker.js not running. +[2025-03-30 21:03:39] app-docker.js not running. +[2025-03-30 21:03:41] app-docker.js not running. +[2025-03-30 21:03:43] app-docker.js not running. +[2025-03-30 21:03:45] app-docker.js not running. +[2025-03-30 21:03:47] app-docker.js not running. +[2025-03-30 21:03:49] app-docker.js not running. +[2025-03-30 21:03:51] app-docker.js not running. +[2025-03-30 21:03:53] app-docker.js not running. +[2025-03-30 21:03:55] app-docker.js not running. +[2025-03-30 21:03:57] app-docker.js not running. +[2025-03-30 21:03:59] app-docker.js not running. +[2025-03-30 21:04:01] app-docker.js not running. +[2025-03-30 21:04:03] app-docker.js not running. +[2025-03-30 21:04:05] app-docker.js not running. +[2025-03-30 21:04:08] app-docker.js not running. +[2025-03-30 21:04:10] app-docker.js not running. +[2025-03-30 21:04:12] app-docker.js not running. +[2025-03-30 21:04:14] app-docker.js not running. +[2025-03-30 21:04:16] app-docker.js not running. +[2025-03-30 21:04:18] app-docker.js not running. +[2025-03-30 21:04:20] app-docker.js not running. +[2025-03-30 21:04:22] app-docker.js not running. +[2025-03-30 21:04:24] app-docker.js not running. +[2025-03-30 21:04:26] app-docker.js not running. +[2025-03-30 21:04:28] app-docker.js not running. +[2025-03-30 21:04:30] app-docker.js not running. +[2025-03-30 21:04:32] app-docker.js not running. +[2025-03-30 21:04:34] app-docker.js not running. +[2025-03-30 21:04:36] app-docker.js not running. +[2025-03-30 21:04:38] app-docker.js not running. +[2025-03-30 21:04:40] app-docker.js not running. +[2025-03-30 21:04:42] app-docker.js not running. +[2025-03-30 21:04:44] app-docker.js not running. +[2025-03-30 21:04:46] app-docker.js not running. +[2025-03-30 21:04:48] app-docker.js not running. +[2025-03-30 21:04:50] app-docker.js not running. +[2025-03-30 21:04:52] app-docker.js not running. +[2025-03-30 21:04:54] app-docker.js not running. +[2025-03-30 21:04:56] app-docker.js not running. +[2025-03-30 21:04:58] app-docker.js not running. +[2025-03-30 21:05:00] app-docker.js not running. +[2025-03-30 21:05:02] app-docker.js not running. +[2025-03-30 21:05:04] app-docker.js not running. +[2025-03-30 21:05:06] app-docker.js not running. +[2025-03-30 21:05:08] app-docker.js not running. +[2025-03-30 21:05:10] app-docker.js not running. +[2025-03-30 21:05:12] app-docker.js not running. +[2025-03-30 21:05:14] app-docker.js not running. +[2025-03-30 21:05:16] app-docker.js not running. +[2025-03-30 21:05:19] app-docker.js not running. +[2025-03-30 21:05:21] app-docker.js not running. +[2025-03-30 21:05:23] app-docker.js not running. +[2025-03-30 21:05:25] app-docker.js not running. +[2025-03-30 21:05:27] app-docker.js not running. +[2025-03-30 21:05:29] app-docker.js not running. +[2025-03-30 21:05:31] app-docker.js not running. +[2025-03-30 21:05:33] app-docker.js not running. +[2025-03-30 21:05:35] app-docker.js not running. +[2025-03-30 21:05:37] app-docker.js not running. +[2025-03-30 21:05:39] app-docker.js not running. +[2025-03-30 21:05:41] app-docker.js not running. +[2025-03-30 21:05:43] app-docker.js not running. +[2025-03-30 21:05:45] app-docker.js not running. +[2025-03-30 21:05:47] app-docker.js not running. +[2025-03-30 21:05:49] app-docker.js not running. +[2025-03-30 21:05:51] app-docker.js not running. +[2025-03-30 21:05:53] app-docker.js not running. +[2025-03-30 21:05:55] app-docker.js not running. +[2025-03-30 21:05:57] app-docker.js not running. +[2025-03-30 21:05:59] app-docker.js not running. +[2025-03-30 21:06:01] app-docker.js not running. +[2025-03-30 21:06:03] app-docker.js not running. +[2025-03-30 21:06:05] app-docker.js not running. +[2025-03-30 21:06:07] app-docker.js not running. +[2025-03-30 21:06:09] app-docker.js not running. +[2025-03-30 21:06:11] app-docker.js not running. +[2025-03-30 21:06:13] app-docker.js not running. +[2025-03-30 21:06:15] app-docker.js not running. +[2025-03-30 21:06:17] app-docker.js not running. +[2025-03-30 21:06:19] app-docker.js not running. +[2025-03-30 21:06:21] app-docker.js not running. +[2025-03-30 21:06:23] app-docker.js not running. +[2025-03-30 21:06:25] app-docker.js not running. +[2025-03-30 21:06:28] app-docker.js not running. +[2025-03-30 21:06:30] app-docker.js not running. +[2025-03-30 21:06:32] app-docker.js not running. +[2025-03-30 21:06:34] app-docker.js not running. +[2025-03-30 21:06:36] app-docker.js not running. +[2025-03-30 21:06:38] app-docker.js not running. +[2025-03-30 21:06:40] app-docker.js not running. +[2025-03-30 21:06:42] app-docker.js not running. +[2025-03-30 21:06:44] app-docker.js not running. +[2025-03-30 21:06:46] app-docker.js not running. +[2025-03-30 21:06:48] app-docker.js not running. +[2025-03-30 21:06:50] app-docker.js not running. +[2025-03-30 21:06:52] app-docker.js not running. +[2025-03-30 21:06:54] app-docker.js not running. +[2025-03-30 21:06:56] app-docker.js not running. +[2025-03-30 21:06:58] app-docker.js not running. +[2025-03-30 21:07:00] app-docker.js not running. +[2025-03-30 21:07:02] app-docker.js not running. +[2025-03-30 21:07:04] app-docker.js not running. +[2025-03-30 21:07:06] app-docker.js not running. +[2025-03-30 21:07:08] app-docker.js not running. +[2025-03-30 21:07:10] app-docker.js not running. +[2025-03-30 21:07:12] app-docker.js not running. +[2025-03-30 21:07:14] app-docker.js not running. +[2025-03-30 21:07:16] app-docker.js not running. +[2025-03-30 21:07:18] app-docker.js not running. +[2025-03-30 21:07:20] app-docker.js not running. +[2025-03-30 21:07:22] app-docker.js not running. +[2025-03-30 21:07:24] app-docker.js not running. +[2025-03-30 21:07:26] app-docker.js not running. +[2025-03-30 21:07:28] app-docker.js not running. +[2025-03-30 21:07:30] app-docker.js not running. +[2025-03-30 21:07:32] app-docker.js not running. +[2025-03-30 21:07:34] app-docker.js not running. +[2025-03-30 21:07:37] app-docker.js not running. +[2025-03-30 21:07:39] app-docker.js not running. +[2025-03-30 21:07:41] app-docker.js not running. +[2025-03-30 21:07:43] app-docker.js not running. +[2025-03-30 21:07:45] app-docker.js not running. +[2025-03-30 21:07:47] app-docker.js not running. +[2025-03-30 21:07:49] app-docker.js not running. +[2025-03-30 21:07:51] app-docker.js not running. +[2025-03-30 21:07:53] app-docker.js not running. +[2025-03-30 21:07:55] app-docker.js not running. +[2025-03-30 21:07:57] app-docker.js not running. +[2025-03-30 21:07:59] app-docker.js not running. +[2025-03-30 21:08:01] app-docker.js not running. +[2025-03-30 21:08:03] app-docker.js not running. +[2025-03-30 21:08:05] app-docker.js not running. +[2025-03-30 21:08:07] app-docker.js not running. +[2025-03-30 21:08:09] app-docker.js not running. +[2025-03-30 21:08:11] app-docker.js not running. +[2025-03-30 21:08:13] app-docker.js not running. +[2025-03-30 21:08:15] app-docker.js not running. +[2025-03-30 21:08:17] app-docker.js not running. +[2025-03-30 21:08:19] app-docker.js not running. +[2025-03-30 21:08:21] app-docker.js not running. +[2025-03-30 21:08:23] app-docker.js not running. +[2025-03-30 21:08:25] app-docker.js not running. +[2025-03-30 21:08:27] app-docker.js not running. +[2025-03-30 21:08:29] app-docker.js not running. +[2025-03-30 21:08:31] app-docker.js not running. +[2025-03-30 21:08:33] app-docker.js not running. +[2025-03-30 21:08:35] app-docker.js not running. +[2025-03-30 21:08:37] app-docker.js not running. +[2025-03-30 21:08:39] app-docker.js not running. +[2025-03-30 21:08:41] app-docker.js not running. +[2025-03-30 21:08:44] app-docker.js not running. +[2025-03-30 21:08:46] app-docker.js not running. +[2025-03-30 21:08:48] app-docker.js not running. +[2025-03-30 21:08:50] app-docker.js not running. +[2025-03-30 21:08:52] app-docker.js not running. +[2025-03-30 21:08:54] app-docker.js not running. +[2025-03-30 21:08:56] app-docker.js not running. +[2025-03-30 21:08:58] app-docker.js not running. +[2025-03-30 21:09:00] app-docker.js not running. +[2025-03-30 21:09:02] app-docker.js not running. +[2025-03-30 21:09:04] app-docker.js not running. +[2025-03-30 21:09:06] app-docker.js not running. +[2025-03-30 21:09:08] app-docker.js not running. +[2025-03-30 21:09:10] app-docker.js not running. +[2025-03-30 21:09:12] app-docker.js not running. +[2025-03-30 21:09:14] app-docker.js not running. +[2025-03-30 21:09:16] app-docker.js not running. +[2025-03-30 21:09:18] app-docker.js not running. +[2025-03-30 21:09:20] app-docker.js not running. +[2025-03-30 21:09:22] app-docker.js not running. +[2025-03-30 21:09:24] app-docker.js not running. +[2025-03-30 21:09:26] app-docker.js not running. +[2025-03-30 21:09:28] app-docker.js not running. +[2025-03-30 21:09:30] app-docker.js not running. +[2025-03-30 21:09:32] app-docker.js not running. +[2025-03-30 21:09:34] app-docker.js not running. +[2025-03-30 21:09:36] app-docker.js not running. +[2025-03-30 21:09:38] app-docker.js not running. +[2025-03-30 21:09:40] app-docker.js not running. +[2025-03-30 21:09:42] app-docker.js not running. +[2025-03-30 21:09:44] app-docker.js not running. +[2025-03-30 21:09:46] app-docker.js not running. +[2025-03-30 21:09:48] app-docker.js not running. +[2025-03-30 21:09:50] app-docker.js not running. +[2025-03-30 21:09:52] app-docker.js not running. +[2025-03-30 21:09:55] app-docker.js not running. +[2025-03-30 21:09:57] app-docker.js not running. +[2025-03-30 21:09:59] app-docker.js not running. +[2025-03-30 21:10:01] app-docker.js not running. +[2025-03-30 21:10:03] app-docker.js not running. +[2025-03-30 21:10:05] app-docker.js not running. +[2025-03-30 21:10:07] app-docker.js not running. +[2025-03-30 21:10:09] app-docker.js not running. +[2025-03-30 21:10:11] app-docker.js not running. +[2025-03-30 21:10:13] app-docker.js not running. +[2025-03-30 21:10:15] app-docker.js not running. +[2025-03-30 21:10:17] app-docker.js not running. +[2025-03-30 21:10:19] app-docker.js not running. +[2025-03-30 21:10:21] app-docker.js not running. +[2025-03-30 21:10:23] app-docker.js not running. +[2025-03-30 21:10:25] app-docker.js not running. +[2025-03-30 21:10:27] app-docker.js not running. +[2025-03-30 21:10:29] app-docker.js not running. +[2025-03-30 21:10:31] app-docker.js not running. +[2025-03-30 21:10:33] app-docker.js not running. +[2025-03-30 21:10:35] app-docker.js not running. +[2025-03-30 21:10:37] app-docker.js not running. +[2025-03-30 21:10:39] app-docker.js not running. +[2025-03-30 21:10:41] app-docker.js not running. +[2025-03-30 21:10:43] app-docker.js not running. +[2025-03-30 21:10:45] app-docker.js not running. +[2025-03-30 21:10:47] app-docker.js not running. +[2025-03-30 21:10:49] app-docker.js not running. +[2025-03-30 21:10:51] app-docker.js not running. +[2025-03-30 21:10:53] app-docker.js not running. +[2025-03-30 21:10:55] app-docker.js not running. +[2025-03-30 21:10:57] app-docker.js not running. +[2025-03-30 21:10:59] app-docker.js not running. +[2025-03-30 21:11:01] app-docker.js not running. +[2025-03-30 21:11:04] app-docker.js not running. +[2025-03-30 21:11:06] app-docker.js not running. +[2025-03-30 21:11:08] app-docker.js not running. +[2025-03-30 21:11:10] app-docker.js not running. +[2025-03-30 21:11:12] app-docker.js not running. +[2025-03-30 21:11:14] app-docker.js not running. +[2025-03-30 21:11:16] app-docker.js not running. +[2025-03-30 21:11:18] app-docker.js not running. +[2025-03-30 21:11:20] app-docker.js not running. +[2025-03-30 21:11:22] app-docker.js not running. +[2025-03-30 21:11:24] app-docker.js not running. +[2025-03-30 21:11:26] app-docker.js not running. +[2025-03-30 21:11:28] app-docker.js not running. +[2025-03-30 21:11:30] app-docker.js not running. +[2025-03-30 21:11:32] app-docker.js not running. +[2025-03-30 21:11:34] app-docker.js not running. +[2025-03-30 21:11:36] app-docker.js not running. +[2025-03-30 21:11:38] app-docker.js not running. +[2025-03-30 21:11:40] app-docker.js not running. +[2025-03-30 21:11:42] app-docker.js not running. +[2025-03-30 21:11:44] app-docker.js not running. +[2025-03-30 21:11:46] app-docker.js not running. +[2025-03-30 21:11:48] app-docker.js not running. +[2025-03-30 21:11:50] app-docker.js not running. +[2025-03-30 21:11:52] app-docker.js not running. +[2025-03-30 21:11:54] app-docker.js not running. +[2025-03-30 21:11:56] app-docker.js not running. +[2025-03-30 21:11:58] app-docker.js not running. +[2025-03-30 21:12:00] app-docker.js not running. +[2025-03-30 21:12:02] app-docker.js not running. +[2025-03-30 21:12:04] app-docker.js not running. +[2025-03-30 21:12:06] app-docker.js not running. +[2025-03-30 21:12:08] app-docker.js not running. +[2025-03-30 21:12:10] app-docker.js not running. +[2025-03-30 21:12:12] app-docker.js not running. +[2025-03-30 21:12:14] app-docker.js not running. +[2025-03-30 21:12:17] app-docker.js not running. +[2025-03-30 21:12:19] app-docker.js not running. +[2025-03-30 21:12:21] app-docker.js not running. +[2025-03-30 21:12:23] app-docker.js not running. +[2025-03-30 21:12:25] app-docker.js not running. +[2025-03-30 21:12:27] app-docker.js not running. +[2025-03-30 21:12:29] app-docker.js not running. +[2025-03-30 21:12:31] app-docker.js not running. +[2025-03-30 21:12:33] app-docker.js not running. +[2025-03-30 21:12:35] app-docker.js not running. +[2025-03-30 21:12:37] app-docker.js not running. +[2025-03-30 21:12:39] app-docker.js not running. +[2025-03-30 21:12:41] app-docker.js not running. +[2025-03-30 21:12:43] app-docker.js not running. +[2025-03-30 21:12:45] app-docker.js not running. +[2025-03-30 21:12:47] app-docker.js not running. +[2025-03-30 21:12:49] app-docker.js not running. +[2025-03-30 21:12:51] app-docker.js not running. +[2025-03-30 21:12:53] app-docker.js not running. +[2025-03-30 21:12:55] app-docker.js not running. +[2025-03-30 21:12:57] app-docker.js not running. +[2025-03-30 21:12:59] app-docker.js not running. +[2025-03-30 21:13:01] app-docker.js not running. +[2025-03-30 21:13:03] app-docker.js not running. +[2025-03-30 21:13:05] app-docker.js not running. +[2025-03-30 21:13:07] app-docker.js not running. +[2025-03-30 21:13:09] app-docker.js not running. +[2025-03-30 21:13:11] app-docker.js not running. +[2025-03-30 21:13:13] app-docker.js not running. +[2025-03-30 21:13:15] app-docker.js not running. +[2025-03-30 21:13:17] app-docker.js not running. +[2025-03-30 21:13:19] app-docker.js not running. +[2025-03-30 21:13:21] app-docker.js not running. +[2025-03-30 21:13:23] app-docker.js not running. +[2025-03-30 21:13:25] app-docker.js not running. +[2025-03-30 21:13:27] app-docker.js not running. +[2025-03-30 21:13:30] app-docker.js not running. +[2025-03-30 21:13:32] app-docker.js not running. +[2025-03-30 21:13:34] app-docker.js not running. +[2025-03-30 21:13:36] app-docker.js not running. +[2025-03-30 21:13:38] app-docker.js not running. +[2025-03-30 21:13:40] app-docker.js not running. +[2025-03-30 21:13:42] app-docker.js not running. +[2025-03-30 21:13:44] app-docker.js not running. +[2025-03-30 21:13:46] app-docker.js not running. +[2025-03-30 21:13:48] app-docker.js not running. +[2025-03-30 21:13:50] app-docker.js not running. +[2025-03-30 21:13:52] app-docker.js not running. +[2025-03-30 21:13:54] app-docker.js not running. +[2025-03-30 21:13:56] app-docker.js not running. +[2025-03-30 21:13:58] app-docker.js not running. +[2025-03-30 21:14:00] app-docker.js not running. +[2025-03-30 21:14:02] app-docker.js not running. +[2025-03-30 21:14:04] app-docker.js not running. +[2025-03-30 21:14:06] app-docker.js not running. +[2025-03-30 21:14:08] app-docker.js not running. +[2025-03-30 21:14:10] app-docker.js not running. +[2025-03-30 21:14:12] app-docker.js not running. +[2025-03-30 21:14:14] app-docker.js not running. +[2025-03-30 21:14:16] app-docker.js not running. +[2025-03-30 21:14:18] app-docker.js not running. +[2025-03-30 21:14:20] app-docker.js not running. +[2025-03-30 21:14:22] app-docker.js not running. +[2025-03-30 21:14:24] app-docker.js not running. +[2025-03-30 21:14:26] app-docker.js not running. +[2025-03-30 21:14:28] app-docker.js not running. +[2025-03-30 21:14:30] app-docker.js not running. +[2025-03-30 21:14:32] app-docker.js not running. +[2025-03-30 21:14:34] app-docker.js not running. +[2025-03-30 21:14:36] app-docker.js not running. +[2025-03-30 21:14:38] app-docker.js not running. +[2025-03-30 21:14:40] app-docker.js not running. +[2025-03-30 21:14:43] app-docker.js not running. +[2025-03-30 21:14:45] app-docker.js not running. +[2025-03-30 21:14:47] app-docker.js not running. +[2025-03-30 21:14:49] app-docker.js not running. +[2025-03-30 21:14:51] app-docker.js not running. +[2025-03-30 21:14:53] app-docker.js not running. +[2025-03-30 21:14:55] app-docker.js not running. +[2025-03-30 21:14:57] app-docker.js not running. +[2025-03-30 21:14:59] app-docker.js not running. +[2025-03-30 21:15:01] app-docker.js not running. +[2025-03-30 21:15:03] app-docker.js not running. +[2025-03-30 21:15:05] app-docker.js not running. +[2025-03-30 21:15:07] app-docker.js not running. +[2025-03-30 21:15:09] app-docker.js not running. +[2025-03-30 21:15:11] app-docker.js not running. +[2025-03-30 21:15:13] app-docker.js not running. +[2025-03-30 21:15:15] app-docker.js not running. +[2025-03-30 21:15:17] app-docker.js not running. +[2025-03-30 21:15:19] app-docker.js not running. +[2025-03-30 21:15:21] app-docker.js not running. +[2025-03-30 21:15:23] app-docker.js not running. +[2025-03-30 21:15:25] app-docker.js not running. +[2025-03-30 21:15:27] app-docker.js not running. +[2025-03-30 21:15:29] app-docker.js not running. +[2025-03-30 21:15:31] app-docker.js not running. +[2025-03-30 21:15:33] app-docker.js not running. +[2025-03-30 21:15:35] app-docker.js not running. +[2025-03-30 21:15:37] app-docker.js not running. +[2025-03-30 21:15:39] app-docker.js not running. +[2025-03-30 21:15:41] app-docker.js not running. +[2025-03-30 21:15:43] app-docker.js not running. +[2025-03-30 21:15:45] app-docker.js not running. +[2025-03-30 21:15:47] app-docker.js not running. +[2025-03-30 21:15:49] app-docker.js not running. +[2025-03-30 21:15:52] app-docker.js not running. +[2025-03-30 21:15:54] app-docker.js not running. +[2025-03-30 21:15:56] app-docker.js not running. +[2025-03-30 21:15:58] app-docker.js not running. +[2025-03-30 21:16:00] app-docker.js not running. +[2025-03-30 21:16:02] app-docker.js not running. +[2025-03-30 21:16:04] app-docker.js not running. +[2025-03-30 21:16:06] app-docker.js not running. +[2025-03-30 21:16:08] app-docker.js not running. +[2025-03-30 21:16:10] app-docker.js not running. +[2025-03-30 21:16:12] app-docker.js not running. +[2025-03-30 21:16:14] app-docker.js not running. +[2025-03-30 21:16:16] app-docker.js not running. +[2025-03-30 21:16:18] app-docker.js not running. +[2025-03-30 21:16:20] app-docker.js not running. +[2025-03-30 21:16:22] app-docker.js not running. +[2025-03-30 21:16:24] app-docker.js not running. +[2025-03-30 21:16:26] app-docker.js not running. +[2025-03-30 21:16:28] app-docker.js not running. +[2025-03-30 21:16:30] app-docker.js not running. +[2025-03-30 21:16:32] app-docker.js not running. +[2025-03-30 21:16:34] app-docker.js not running. +[2025-03-30 21:16:36] app-docker.js not running. +[2025-03-30 21:16:38] app-docker.js not running. +[2025-03-30 21:16:40] app-docker.js not running. +[2025-03-30 21:16:42] app-docker.js not running. +[2025-03-30 21:16:44] app-docker.js not running. +[2025-03-30 21:16:46] app-docker.js not running. +[2025-03-30 21:16:48] app-docker.js not running. +[2025-03-30 21:16:50] app-docker.js not running. +[2025-03-30 21:16:52] app-docker.js not running. +[2025-03-30 21:16:54] app-docker.js not running. +[2025-03-30 21:16:56] app-docker.js not running. +[2025-03-30 21:16:58] app-docker.js not running. +[2025-03-30 21:17:00] app-docker.js not running. +[2025-03-30 21:17:02] app-docker.js not running. +[2025-03-30 21:17:04] app-docker.js not running. +[2025-03-30 21:17:07] app-docker.js not running. +[2025-03-30 21:17:09] app-docker.js not running. +[2025-03-30 21:17:11] app-docker.js not running. +[2025-03-30 21:17:13] app-docker.js not running. +[2025-03-30 21:17:15] app-docker.js not running. +[2025-03-30 21:17:17] app-docker.js not running. +[2025-03-30 21:17:19] app-docker.js not running. +[2025-03-30 21:17:21] app-docker.js not running. +[2025-03-30 21:17:23] app-docker.js not running. +[2025-03-30 21:17:25] app-docker.js not running. +[2025-03-30 21:17:27] app-docker.js not running. +[2025-03-30 21:17:29] app-docker.js not running. +[2025-03-30 21:17:31] app-docker.js not running. +[2025-03-30 21:17:33] app-docker.js not running. +[2025-03-30 21:17:35] app-docker.js not running. +[2025-03-30 21:17:37] app-docker.js not running. +[2025-03-30 21:17:39] app-docker.js not running. +[2025-03-30 21:17:41] app-docker.js not running. +[2025-03-30 21:17:43] app-docker.js not running. +[2025-03-30 21:17:45] app-docker.js not running. +[2025-03-30 21:17:47] app-docker.js not running. +[2025-03-30 21:17:49] app-docker.js not running. +[2025-03-30 21:17:51] app-docker.js not running. +[2025-03-30 21:17:53] app-docker.js not running. +[2025-03-30 21:17:55] app-docker.js not running. +[2025-03-30 21:17:57] app-docker.js not running. +[2025-03-30 21:17:59] app-docker.js not running. +[2025-03-30 21:18:01] app-docker.js not running. +[2025-03-30 21:18:03] app-docker.js not running. +[2025-03-30 21:18:05] app-docker.js not running. +[2025-03-30 21:18:07] app-docker.js not running. +[2025-03-30 21:18:09] app-docker.js not running. +[2025-03-30 21:18:11] app-docker.js not running. +[2025-03-30 21:18:13] app-docker.js not running. +[2025-03-30 21:18:15] app-docker.js not running. +[2025-03-30 21:18:17] app-docker.js not running. +[2025-03-30 21:18:20] app-docker.js not running. +[2025-03-30 21:18:22] app-docker.js not running. +[2025-03-30 21:18:24] app-docker.js not running. +[2025-03-30 21:18:26] app-docker.js not running. +[2025-03-30 21:18:28] app-docker.js not running. +[2025-03-30 21:18:30] app-docker.js not running. +[2025-03-30 21:18:32] app-docker.js not running. +[2025-03-30 21:18:34] app-docker.js not running. +[2025-03-30 21:18:36] app-docker.js not running. +[2025-03-30 21:18:38] app-docker.js not running. +[2025-03-30 21:18:40] app-docker.js not running. +[2025-03-30 21:18:42] app-docker.js not running. +[2025-03-30 21:18:44] app-docker.js not running. +[2025-03-30 21:18:46] app-docker.js not running. +[2025-03-30 21:18:48] app-docker.js not running. +[2025-03-30 21:18:50] app-docker.js not running. +[2025-03-30 21:18:52] app-docker.js not running. +[2025-03-30 21:18:54] app-docker.js not running. +[2025-03-30 21:18:56] app-docker.js not running. +[2025-03-30 21:18:58] app-docker.js not running. +[2025-03-30 21:19:00] app-docker.js not running. +[2025-03-30 21:19:02] app-docker.js not running. +[2025-03-30 21:19:04] app-docker.js not running. +[2025-03-30 21:19:06] app-docker.js not running. +[2025-03-30 21:19:08] app-docker.js not running. +[2025-03-30 21:19:10] app-docker.js not running. +[2025-03-30 21:19:12] app-docker.js not running. +[2025-03-30 21:19:14] app-docker.js not running. +[2025-03-30 21:19:16] app-docker.js not running. +[2025-03-30 21:19:18] app-docker.js not running. +[2025-03-30 21:19:20] app-docker.js not running. +[2025-03-30 21:19:22] app-docker.js not running. +[2025-03-30 21:19:24] app-docker.js not running. +[2025-03-30 21:19:26] app-docker.js not running. +[2025-03-30 21:19:28] app-docker.js not running. +[2025-03-30 21:19:31] app-docker.js not running. +[2025-03-30 21:19:33] app-docker.js not running. +[2025-03-30 21:19:35] app-docker.js not running. +[2025-03-30 21:19:37] app-docker.js not running. +[2025-03-30 21:19:39] app-docker.js not running. +[2025-03-30 21:19:41] app-docker.js not running. +[2025-03-30 21:19:43] app-docker.js not running. +[2025-03-30 21:19:45] app-docker.js not running. +[2025-03-30 21:19:47] app-docker.js not running. +[2025-03-30 21:19:49] app-docker.js not running. +[2025-03-30 21:19:51] app-docker.js not running. +[2025-03-30 21:19:53] app-docker.js not running. +[2025-03-30 21:19:55] app-docker.js not running. +[2025-03-30 21:19:57] app-docker.js not running. +[2025-03-30 21:19:59] app-docker.js not running. +[2025-03-30 21:20:01] app-docker.js not running. +[2025-03-30 21:20:03] app-docker.js not running. +[2025-03-30 21:20:05] app-docker.js not running. +[2025-03-30 21:20:07] app-docker.js not running. +[2025-03-30 21:20:09] app-docker.js not running. +[2025-03-30 21:20:11] app-docker.js not running. +[2025-03-30 21:20:13] app-docker.js not running. +[2025-03-30 21:20:15] app-docker.js not running. +[2025-03-30 21:20:17] app-docker.js not running. +[2025-03-30 21:20:19] app-docker.js not running. +[2025-03-30 21:20:21] app-docker.js not running. +[2025-03-30 21:20:23] app-docker.js not running. +[2025-03-30 21:20:25] app-docker.js not running. +[2025-03-30 21:20:27] app-docker.js not running. +[2025-03-30 21:20:29] app-docker.js not running. +[2025-03-30 21:20:31] app-docker.js not running. +[2025-03-30 21:20:33] app-docker.js not running. +[2025-03-30 21:20:35] app-docker.js not running. +[2025-03-30 21:20:37] app-docker.js not running. +[2025-03-30 21:20:39] app-docker.js not running. +[2025-03-30 21:20:41] app-docker.js not running. +[2025-03-30 21:20:44] app-docker.js not running. +[2025-03-30 21:20:46] app-docker.js not running. +[2025-03-30 21:20:48] app-docker.js not running. +[2025-03-30 21:20:50] app-docker.js not running. +[2025-03-30 21:20:52] app-docker.js not running. +[2025-03-30 21:20:54] app-docker.js not running. +[2025-03-30 21:20:56] app-docker.js not running. +[2025-03-30 21:20:58] app-docker.js not running. +[2025-03-30 21:21:00] app-docker.js not running. +[2025-03-30 21:21:02] app-docker.js not running. +[2025-03-30 21:21:04] app-docker.js not running. +[2025-03-30 21:21:06] app-docker.js not running. +[2025-03-30 21:21:08] app-docker.js not running. +[2025-03-30 21:21:10] app-docker.js not running. +[2025-03-30 21:21:12] app-docker.js not running. +[2025-03-30 21:21:14] app-docker.js not running. +[2025-03-30 21:21:16] app-docker.js not running. diff --git a/tools/serverkill-playbook.yml b/tools/serverkill-playbook.yml new file mode 100644 index 000000000..5dfe05ddc --- /dev/null +++ b/tools/serverkill-playbook.yml @@ -0,0 +1,22 @@ +- name: Kill JAMScript Server on Port 3000 + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Kill server process running on port 3000 and log result + shell: | + { + PID=$(lsof -ti:3000) + if [ -n "$PID" ]; then + kill -9 $PID + echo "$(date) - Killed server on port 3000 (PID $PID)" + else + echo "$(date) - No server process found on port 3000" + fi + } > serverkill.log 2>&1 + args: + chdir: /home/jamtools/JAMScript/tools diff --git a/tools/serverrun-playbook.yml b/tools/serverrun-playbook.yml new file mode 100644 index 000000000..7cd50a17a --- /dev/null +++ b/tools/serverrun-playbook.yml @@ -0,0 +1,22 @@ +- name: Start JAMScript Tools Server + hosts: "{{ server }}" + gather_facts: no + tasks: + - name: Ensure the working directory is correct + shell: pwd + args: + chdir: /home/jamtools/JAMScript/tools + + - name: Start the server (Express API) in the background + shell: nohup node app-docker.js > server.log 2>&1 & + args: + chdir: /home/jamtools/JAMScript/tools + async: 10 + poll: 0 + + - name: Wait until the server port is open + wait_for: + host: "{{ ansible_host }}" + port: 3000 + delay: 3 + timeout: 30 From ae7ffb2d16f48b5b1bd9568d64949278bf1a1b20 Mon Sep 17 00:00:00 2001 From: Jean Kaznji <57154931+JeanKa25@users.noreply.github.com> Date: Tue, 8 Apr 2025 23:13:02 -0400 Subject: [PATCH 124/126] Update README.md --- README.md | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 65e8aa00a..9c3a8ab28 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,131 @@ -[![Build Status](https://travis-ci.org/citelab/JAMScript.svg?branch=master)](https://travis-ci.org/citelab/JAMScript) +# Redesigning JAMScript Tools for High-Performance and Scalability +This repository is part of an ongoing effort to redesign the JAMScript tools with a focus on high-performance execution and scalable infrastructure. +To achieve this, we've restructured the architecture around a client-server model that separates the responsibilities of coordination and computation. -# A Programming Language and Middleware for Cloud of Moving Things +## 🔧 Getting Started -This project is currently under development. You can see the documentation and install instructions at https://citelab.github.io/JAMScript. +### 1. Clone the Repository + +Start by cloning the repository and switching to the appropriate branch: + +```bash +git clone https://github.com/JeanKa25/JAMScript.git +cd JAMScript +git checkout new-jamtools-main +``` + +Then run the install.sh to install all the dependencies: + + +### 2. Set Environment Variables +Export the following global variables: + +```bash +export JAM_HOME=~/JAMScript +export JAMHOME=~/JAMScript +export PATH=$JAM_HOME/tools:$PATH +export JAMDATA=~/JAMScript/data +``` + +To make these changes permanent, add them to your .bashrc: + +```bash +echo 'export JAM_HOME=~/JAMScript' >> ~/.bashrc +echo 'export JAMHOME=~/JAMScript' >> ~/.bashrc +echo 'export PATH=$JAM_HOME/tools:$PATH' >> ~/.bashrc +echo 'export JAMDATA=~/JAMScript/data' >> ~/.bashrc +source ~/.bashrc +``` + + +## ⚙️ Installing Dependenceis with Ansible + +You can set up your environment using Ansible with the provided playbook: + +### 1. Install Ansible (if not already installed) + +```bash +sudo apt update +sudo apt install ansible -y +``` + +### 2. Run the setup playbook + +```bash +ansible-playbook setup_jamscript.yml -i localhost, +``` + +> This playbook installs required dependencies, clones the repo, and configures environment variables as needed for JAMScript tools. + +--- + +## 🌐 Running the Server + +To start the JAMScript server, navigate to the tools directory and run the server file: + +```bash +cd ~/JAMScript/tools +node app-docker.js +``` + +### 🔧 Path and IP Configuration + +Before running the server, make sure to update the following files: + +#### `app-docker.js` +- Set the `serverip` parameter to the IP address of the server. + +#### `Wrapper.mjs` +- Update the following: + - `serverip`: match the IP set in `app-docker.js`. + - Path to JAMScript tools directory. + - Path to your SSH `authorized_keys` file (used for key-based SSH access). + +> These updates ensure that the tools can communicate correctly and execute remote tasks securely. + +--- + +### 🚀 Available Ansible Playbooks + +#### Server Run Playbook + +```bash +ansible-playbook serverrun-playbook.yml --extra-vars "server=server2" +``` + +#### JamRun Playbook + +```bash +ansible-playbook jamrun-playbook.yml --extra-vars "server=server2 file=jt1.jxe app='--app=DEMO'" +``` + +#### JamList Playbook + +```bash +ansible-playbook jamlist-playbook.yml --extra-vars "server=server2" +``` + +#### JamTerm Playbook (Without tmux session) + +```bash +ansible-playbook jamterm-playbook.yml --extra-vars "server=server2" +``` + +#### JamTerm Playbook (With tmux session) + +```bash +ansible-playbook jamterm-playbook.yml --extra-vars "server=server2 tmux=u-1001-dev-112-c" +``` + +#### JamKill Playbook + +```bash +ansible-playbook jamkill-playbook.yml --extra-vars "server=server2" +``` + +#### Server Kill Playbook + +```bash +ansible-playbook serverkill-playbook.yml --extra-vars "server=server2" -Programs written in JAMScript have worked in Linux (Arch, Ubuntu, Raspbian) and Mac OS. From ca244356cb4fbf88050e34ceb1cd1bb3e96ae0e9 Mon Sep 17 00:00:00 2001 From: Jean Kaznji <57154931+JeanKa25@users.noreply.github.com> Date: Tue, 8 Apr 2025 23:14:44 -0400 Subject: [PATCH 125/126] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c3a8ab28..ac31a748c 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ source ~/.bashrc ``` -## ⚙️ Installing Dependenceis with Ansible +## ⚙️ Installing Dependencies with Ansible You can set up your environment using Ansible with the provided playbook: From 2bd180774bbfacb1cd30904a3b346e308d5a9c0b Mon Sep 17 00:00:00 2001 From: Jean Kaznji <57154931+JeanKa25@users.noreply.github.com> Date: Wed, 9 Apr 2025 21:02:16 -0400 Subject: [PATCH 126/126] Update README.md --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index ac31a748c..6379fd328 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,6 @@ Start by cloning the repository and switching to the appropriate branch: ```bash git clone https://github.com/JeanKa25/JAMScript.git -cd JAMScript -git checkout new-jamtools-main ``` Then run the install.sh to install all the dependencies: @@ -22,7 +20,6 @@ Then run the install.sh to install all the dependencies: Export the following global variables: ```bash -export JAM_HOME=~/JAMScript export JAMHOME=~/JAMScript export PATH=$JAM_HOME/tools:$PATH export JAMDATA=~/JAMScript/data @@ -31,7 +28,6 @@ export JAMDATA=~/JAMScript/data To make these changes permanent, add them to your .bashrc: ```bash -echo 'export JAM_HOME=~/JAMScript' >> ~/.bashrc echo 'export JAMHOME=~/JAMScript' >> ~/.bashrc echo 'export PATH=$JAM_HOME/tools:$PATH' >> ~/.bashrc echo 'export JAMDATA=~/JAMScript/data' >> ~/.bashrc

    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