| @@ -0,0 +1 @@ | |||
| [VI]Version: {version} - built on {date}[/VI] Your local downloads for this instance | |||
| @@ -43,7 +43,7 @@ function nodeShellExec() { | |||
| // console.dir(args[2]) | |||
| console.log('nodeshellexec ::: ') | |||
| console.log(`${args[0]} ${args[1].join(' ') }`) | |||
| console.log(`${args[0]} ${args[1].join(' ') } ${args[args.length-1].cwd}`) | |||
| const child = spawn(...args); | |||
| var p = new Promise(function(resolve, reject){ | |||
| @@ -60,8 +60,8 @@ function nodeShellExec() { | |||
| process.stdout.write( chunk ) | |||
| }); | |||
| child.on('error', (chunk) => { success = false; messages.push(chunk); /* console.error('e: ' + chunk) */ | |||
| console.log('Error exit not handled.') | |||
| } ); | |||
| console.error('Error exit not handled.') | |||
| }); | |||
| child.stderr.on('data', (chunk) => { | |||
| if(messages.join('').indexOf('fatal: not a git repository') > -1) opts.haserrors = true; | |||
| messages.push(chunk); | |||
| @@ -1682,7 +1682,7 @@ var op = { | |||
| // }).then(Tasq.then).catch(Tasq.catch) | |||
| // }) | |||
| var bowerRepos = [{ repo : 'client'}]; | |||
| var bowerRepos = [{ repo : 'elixir-client'}]; | |||
| var bowertasks = []; | |||
| bowerRepos.forEach(repodef => { | |||
| bowertasks.push(() => { | |||
| @@ -1374,7 +1374,7 @@ var op = { | |||
| // }).then(Tasq.then).catch(Tasq.catch) | |||
| // }) | |||
| var bowerRepos = [{ repo : 'client'}]; | |||
| var bowerRepos = [{ repo : 'elixir-client'}]; | |||
| var bowertasks = []; | |||
| bowerRepos.forEach(repodef => { | |||
| bowertasks.push(() => { | |||
| @@ -0,0 +1,53 @@ | |||
| // models\api\v1 | |||
| const fs = require('fs') | |||
| var path = require('path'); | |||
| const { readdir } = require("fs").promises | |||
| var verse = require('../serververse'); | |||
| const fswalk = verse.fs.walk | |||
| var path = require('path'); | |||
| const Rx = require('rxjs'); | |||
| const cliargs = verse.cliargs; | |||
| const processedArgs = cliargs(process.argv.slice(2)); | |||
| // console.dir(processedArgs) | |||
| // console.dir(Rx) | |||
| // https://github.com/coolaj86/node-walk | |||
| // PB : TODO -- convert to an input json config. | |||
| var outputfile = processedArgs._[0]; // ../elixir-client/physio/linkclient.bat | |||
| var startdir = processedArgs._[1]; // ../elixir-client/physio-1/app/models/api/v1 | |||
| var inprefix = processedArgs._[2]; // '../../../../../elixir-client/client/' | |||
| if(!inprefix) inprefix = '..\\client\\' | |||
| var unprefix = processedArgs._[3]; // ../elixir-client/physio-1/ | |||
| if(!unprefix) unprefix = '../elixir-client/physio-1/' | |||
| var outprefix = processedArgs._[4]; // '../../../../../elixir-client/physio/' | |||
| if(!outprefix) outprefix = '' | |||
| var fswalkoptions = {} // all files recurscively | |||
| // var fswalkoptions = { includerootdir : true, includedirectories : true, expand : true } // example walk and output everything. | |||
| // (unprefix, outprefix) | |||
| // console.log(path.normalize(unprefix)) | |||
| const writeStream = ( fs.createWriteStream(outputfile) ) | |||
| fswalk.call( fswalkoptions, startdir ).then( s => { | |||
| s.subscribe( entry => { | |||
| // var matches = /.*?data.*/.exec(utils.fs.direntToFullname(entry)) | |||
| // if(matches) console.dir( matches[0] ) // Filters can be done on the stream itself.. | |||
| var i = entry | |||
| var pathnodes = i.path.replace( path.normalize(unprefix), '' ).split('\\') | |||
| var relative = Array(pathnodes.length) | |||
| writeStream.write( '\nmklink ' + (entry.isDirectory() ? ' /D ' : ' ') + i.path.replace( path.normalize(unprefix), outprefix ) + ' ' | |||
| + relative.join('..\\') + inprefix + i.path.replace( path.normalize(unprefix), outprefix ) | |||
| ) | |||
| // console.dir( entry ) | |||
| } | |||
| ) | |||
| // ; s.unsubscribe() | |||
| }) | |||
| @@ -16983,7 +16983,7 @@ var utils = { | |||
| p_round: p_round, | |||
| g_round: g_round, | |||
| escapeRegExp(string) { | |||
| return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string | |||
| return string.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); // $& means the whole matched string | |||
| } | |||
| , getTZOffsetMilliseconds : (()=>{ | |||
| @@ -28185,7 +28185,7 @@ var op = { | |||
| // }).then(Tasq.then).catch(Tasq.catch) | |||
| // }) | |||
| var bowerRepos = [{ repo : 'client'}]; | |||
| var bowerRepos = [{ repo : 'elixir-client'}]; | |||
| var bowertasks = []; | |||
| bowerRepos.forEach(repodef => { | |||
| bowertasks.push(() => { | |||
| @@ -952,25 +952,32 @@ function __main( selectedinstance ){ | |||
| var downloadtasks = []; | |||
| var installtasks = []; | |||
| // var prereqfilter = ['nvm'] | |||
| var prereqfilter = ['*'] | |||
| prerequisites.forEach(function(preq) { | |||
| WScript.Echo(all) | |||
| if(!all && preq.optional) return | |||
| var p = preq.exists().then(function(exists) { | |||
| if (exists && !preq.forceinstall) console.log( preq.shellcmd + ' exists'); | |||
| else { | |||
| console.log('----------------------------') | |||
| console.log(exists) // PB : ??? Boolean true becomes -1 ??? | |||
| console.log('----------------------------') | |||
| if(!exists) console.log(preq.shellcmd + ' is not installed'); | |||
| else console.log(preq.shellcmd + ' is installed but forceinstall was specifed so re-installing'); | |||
| return preq.preinstallsteps().then(function(){ | |||
| // console.log(' task.install : ' + preq.install) | |||
| installtasks.push( function(){ return preq.install() } ); | |||
| // WScript.Echo('FFFFFFFFFFFFF : ' + preq.shellcmd) | |||
| for(var p=0; p < prereqfilter.length; p++) { | |||
| if( preq.shellcmd === prereqfilter[p] || prereqfilter[p] === '*' ) { | |||
| WScript.Echo(all) | |||
| if(!all && preq.optional) return | |||
| var p = preq.exists().then(function(exists) { | |||
| if (exists && !preq.forceinstall) console.log( preq.shellcmd + ' exists'); | |||
| else { | |||
| console.log('----------------------------') | |||
| console.log(exists) // PB : ??? Boolean true becomes -1 ??? | |||
| console.log('----------------------------') | |||
| if(!exists) console.log(preq.shellcmd + ' is not installed'); | |||
| else console.log(preq.shellcmd + ' is installed but forceinstall was specifed so re-installing'); | |||
| return preq.preinstallsteps().then(function(){ | |||
| // console.log(' task.install : ' + preq.install) | |||
| installtasks.push( function(){ return preq.install() } ); | |||
| }) | |||
| } | |||
| }) | |||
| // .then(function(res){ console.log( 'preinstallsteps ' + res)}); | |||
| downloadtasks.push( p ) | |||
| } | |||
| }) | |||
| // .then(function(res){ console.log( 'preinstallsteps ' + res)}); | |||
| downloadtasks.push( p ) | |||
| } | |||
| }); | |||
| // console.log('downloadtasks') | |||
| // console.dir(downloadtasks[0]) | |||
| @@ -1376,6 +1383,40 @@ function __main( selectedinstance ){ | |||
| // return any([any(steps), any(prompts)]) | |||
| } | |||
| } | |||
| , { | |||
| shellcmd: 'nvm', | |||
| url: 'https://github.com/coreybutler/nvm-windows/releases/download/1.1.11/nvm-setup.exe' | |||
| , installer: 'nvm-setup.exe' | |||
| , installcmd: ['cmd', ['/c', 'start', | |||
| '/WAIT', downloadsdir + '/' + 'nvm-setup.exe' | |||
| , '/VERYSILENT' | |||
| // , '/MERGETASKS=!runcode' // This is required only for vscode... | |||
| ]] | |||
| , install : install | |||
| , exists : exists | |||
| , preinstallsteps: function() { | |||
| var self = this; | |||
| console.log('Node preinstall steps') | |||
| // console.log(this.installcmd) | |||
| // console.log(path.normalize(downloadsdir + '/' + 'node-v14.17.3-x64.msi')) | |||
| var steps = []; | |||
| steps.push( | |||
| function(){ | |||
| if (!existsSync(downloadsdir + '/' + self.installer)) { | |||
| return nodeShellExec(selectedinstance.root + '/.elxr/run-' + runtimestamp + '/download.bat', ['"' + self.url + '"', downloadsdir + '/' + self.installer] | |||
| , { waitmsg : 'downloading '+ self.shellcmd +' please wait' }) | |||
| } | |||
| else { | |||
| console.log(self.installer + ' Already exits Download skipped.') | |||
| return Promise.resolve(true) | |||
| } | |||
| } | |||
| ) | |||
| return any(steps) | |||
| // return any([any(steps), any(prompts)]) | |||
| } | |||
| } | |||
| , { | |||
| shellcmd: 'python' | |||
| , optional : true | |||
| @@ -1721,4 +1762,11 @@ function __main( selectedinstance ){ | |||
| promises.push(verifyAndInstallPrerequisites()) | |||
| startPromises(); | |||
| } | |||
| } | |||
| // Open JDK | |||
| // https://objects.githubusercontent.com/github-production-release-asset-2e65be/602574963/cd0ac1ad-740d-4616-aa96-157ac2e79a60?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20240117%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240117T055737Z&X-Amz-Expires=300&X-Amz-Signature=4c0ce9303027a065fed291a107ff0a5f7d7782a828f077873bd5111c8e6fa0f0&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=602574963&response-content-disposition=attachment%3B%20filename%3DOpenJDK21U-jdk_x64_windows_hotspot_21.0.1_12.msi&response-content-type=application%2Foctet-stream | |||
| // JRE for runtime | |||
| // https://my.visualstudio.com/Downloads?q=Visual%20Studio%202022 | |||
| @@ -1395,7 +1395,7 @@ var op = { | |||
| // }).then(Tasq.then).catch(Tasq.catch) | |||
| // }) | |||
| var bowerRepos = [{ repo : 'client'}] | |||
| var bowerRepos = [{ repo : 'elixir-client'}]; | |||
| var bowertasks = [] | |||
| bowerRepos.forEach(repodef => { | |||
| bowertasks.push(() => { | |||
| @@ -0,0 +1,7 @@ | |||
| @echo off | |||
| echo %PATH% | |||
| set PATH=%PATH%;C:\Program Files\Git\cmd | |||
| set PATH=%PATH%;C:\Program Files\nodejs\ | |||
| set PATH=%PATH%;C:\Users\Pradeep\AppData\Local\Programs\Microsoft VS Code\bin | |||
| set PATH=%PATH%;C:\Python27 | |||
| SET LAUNCHEDWITHENV=YES && cscript D:\chess\elixir\dev\elxr\i.win.js /all:true | |||
| @@ -14,8 +14,8 @@ | |||
| "author": "", | |||
| "license": "ISC", | |||
| "dependencies": { | |||
| "bbhverse": "git+http://git.bbh.org.in/chess/bbhverse", | |||
| "serververse": "git+http://git.bbh.org.in/chess/bbhverse", | |||
| "bbhverse": "file:../bbhverse", | |||
| "serververse": "file:../serververse", | |||
| "chalk": "^4.1.0", | |||
| "crossfilter2": "^1.5.4", | |||
| "glob": "^7.1.2", | |||
| @@ -32,7 +32,7 @@ ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpass | |||
| #xrdp | |||
| #----------------------- | |||
| sudo apt install xrdp | |||
| nano /etc/xrdp/startwm.sh | |||
| sudo nano /etc/xrdp/startwm.sh | |||
| Add in the very top: | |||
| unset DBUS_SESSION_BUS_ADDRESS | |||
| @@ -25,6 +25,7 @@ var __isElevated = null; | |||
| var shell_verse = { | |||
| // getCommonTask is agnostic of whether we are running in an elevated shell or not. It runs in either case. | |||
| init( o ){ Object.assign(this, o) } | |||
| , downloadsdir : '../Downloads' | |||
| , getCommonTask( taskToRun ){ return ()=>{ return shell_verse.runTask(taskToRun) }} | |||
| , runTask : ( taskToRun ) => { | |||
| @@ -35,7 +36,7 @@ var shell_verse = { | |||
| , elevatedRunner( taskToRun, inBatch ){ | |||
| // PB : TODO -- Should be called only when we are in an elevated shell that was already requested from an unelevated shell with a batch of tasks. | |||
| try { | |||
| var runlogjson = `${selectedinstance.root}/.elxr/run-${taskToRun.runtimestamp}/run.log` | |||
| var runlogjson = `${taskToRun.selectedinstance.root}/.elxr/run-${taskToRun.runtimestamp}/run.log` | |||
| var __runasresult = null; | |||
| return taskToRun().then((r)=>{ | |||
| // PB : TODO -- Every elevation should have its own messaging file. Async writes from multiple processes are a problem here... | |||
| @@ -183,7 +184,7 @@ var shell_verse = { | |||
| , requestElevation(elevatedRunner, taskToRun) { | |||
| // PB : TODO -- Multiple parallel request elevations should be queued into a batch and serialized as a single promise. | |||
| var processedArgs = taskToRun.processedArgs, selectedinstance = taskToRun.selectedinstance , statuslog = taskToRun.statuslog | |||
| var processedArgs = taskToRun.processedArgs, statuslog = taskToRun.statuslog | |||
| // Wait for the runas to complete before we read it. | |||
| try { | |||
| fs.unlinkSync('run.done') // Need a unique file for aech elevated run. | |||
| @@ -192,15 +193,40 @@ var shell_verse = { | |||
| // Find node path to send to hta. | |||
| return nodeShellExec('where', ['node']).then(r => { | |||
| var namedArgs = []; | |||
| console.log('result : ' + JSON.stringify(r)) | |||
| Object.keys(processedArgs).forEach((v) => { v != '_' ? namedArgs.push('--' + v + '=' + processedArgs[v]) : null; }) | |||
| // PB : TODO -- Convert all the cli args back to string. | |||
| var args = [ path.normalize(`${selectedinstance.root}/.elxr/run-${taskToRun.runtimestamp}/windowselevate.hta`) ].concat(processedArgs._) | |||
| namedArgs.length > 0 ? args = args.concat(namedArgs.join(' ')) : null; | |||
| var args = taskToRun.args | |||
| var options = taskToRun.args ? taskToRun.args.pop() : { | |||
| inherit: true | |||
| , shell: true | |||
| , env: taskToRun.ENV | |||
| , runas: 'self' | |||
| , title: `runas` | |||
| } | |||
| options.env = Object.assign({}, taskToRun.ENV, { wd : options.cwd }) | |||
| var spawntimestamp = (new Date()).getTime() | |||
| if(!args) { | |||
| var namedArgs = []; | |||
| console.log('result : ' + JSON.stringify(r)) | |||
| Object.keys(processedArgs).forEach((v) => { v != '_' ? namedArgs.push('--' + v + '=' + processedArgs[v]) : null; }) | |||
| // PB : TODO -- Convert all the cli args back to string. | |||
| args = [].concat(processedArgs._) | |||
| namedArgs.length > 0 ? args = args.concat(namedArgs.join(' ')) : null; | |||
| } | |||
| else { | |||
| // args = args.splice(-1) -- Already popped | |||
| args.push(`--root=${selectedinstance.root}`); | |||
| } | |||
| args.splice(0,0, path.normalize(`${taskToRun.selectedinstance.root}/.elxr/run-${taskToRun.runtimestamp}/windowselevate.hta`)) | |||
| args.push('--runas=self'); | |||
| var elevatedruntimestamp = (new Date()).getTime() | |||
| args.push(`--runtimestamp=${elevatedruntimestamp}`); | |||
| // args.debug = true | |||
| if(args.debug) args.push(`--debug=${args.debug}`); | |||
| args.push(`--runtimestamp=${spawntimestamp}`); | |||
| // args.push(`--wd=${options.cwd}`); | |||
| // args.push('--nodepath=' + r.messages[r.messages.length - 1]) | |||
| // if (!processedArgs.node_env) args.push('--node_env=' + ENV.NODE_ENV) | |||
| @@ -210,19 +236,11 @@ var shell_verse = { | |||
| console.dir(args) | |||
| // throw 'test' | |||
| return nodeShellExec('MSHTA', [`"${args.join('" "')}"`] | |||
| , { | |||
| inherit: true | |||
| , shell: true | |||
| , env: taskToRun.ENV | |||
| , runas: 'self' | |||
| , title: `runas` | |||
| } | |||
| ).then(() => { | |||
| return nodeShellExec('MSHTA', [`"${args.join('" "')}"`], options ).then(() => { | |||
| // runas returned. | |||
| try { | |||
| // PB : TODO -- Log is comma prefixed. Needs to be proper JSON. | |||
| var runlogjson = `${selectedinstance.root}/.elxr/run-${elevatedruntimestamp}/run.log` | |||
| var runlogjson = `${taskToRun.selectedinstance.root}/.elxr/run-${spawntimestamp}/run.log` | |||
| var runaslog = JSON.parse('[' + fs.readFileSync(runlogjson, { flags: 'a+' }) + ']'); | |||
| try { fs.unlinkSync(runlogjson) } catch(e){ } // PB : TODO -- Have a unique file for each elevated run. | |||
| // console.log( "runaslog : " + runaslog.length ) | |||
| @@ -238,7 +256,7 @@ var shell_verse = { | |||
| console.error('Run log error probably was not created by runas : ' + e) | |||
| } | |||
| }) | |||
| .catch(err => console.error('Elevation failed : ' + err)); | |||
| .catch(err => console.error('Elevation failed : ' + JSON.stringify(err))); | |||
| }) | |||
| } | |||
| , launchui() { | |||