|
|
|
|
|
|
|
|
var chalk = require('chalk'); |
|
|
var chalk = require('chalk'); |
|
|
const homedir = require('os').homedir(); |
|
|
const homedir = require('os').homedir(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var ENV = Object.assign({}, process.env); // Shallow clone it. |
|
|
|
|
|
|
|
|
// singleton one time lazy |
|
|
// singleton one time lazy |
|
|
var getCredentials = function(){ |
|
|
var getCredentials = function(){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var creds = fs.readFileSync(path.normalize(`${homedir}/.elxrcredentials`), { encoding: 'utf8' }); |
|
|
var creds = fs.readFileSync(path.normalize(`${homedir}/.elxrcredentials`), { encoding: 'utf8' }); |
|
|
var creds = creds.split('\n').map( c => c.trim() && new URL(c)); |
|
|
var creds = creds.split('\n').map( c => c.trim() && new URL(c)); |
|
|
console.log(creds); |
|
|
console.log(creds); |
|
|
|
|
|
creds.forEach(cred => {console.log( cred.hostname ); console.log( cred.username );} ); |
|
|
|
|
|
|
|
|
// Subsequent calls |
|
|
// Subsequent calls |
|
|
getCredentials = ()=>{ return creds }; |
|
|
getCredentials = ()=>{ return creds }; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
require('glob').sync; |
|
|
require('glob').sync; |
|
|
|
|
|
|
|
|
var ENV = Object.assign({}, process.env); // Shallow clone it. |
|
|
|
|
|
|
|
|
|
|
|
const { readdir } = require("fs").promises; |
|
|
const { readdir } = require("fs").promises; |
|
|
|
|
|
|
|
|
// Directory shallow walk and do perform on each dir. |
|
|
// Directory shallow walk and do perform on each dir. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return any(tasks).then(() => { |
|
|
return any(tasks).then(() => { |
|
|
|
|
|
|
|
|
gitRepos.push('chess-server-lib/server'); |
|
|
|
|
|
|
|
|
gitRepos.push({ repo : 'chess-server-lib/server'}); |
|
|
gitRepos = gitRepos.concat(elevatedRunasRepos); |
|
|
gitRepos = gitRepos.concat(elevatedRunasRepos); |
|
|
|
|
|
// console.dir(gitRepos) |
|
|
|
|
|
// throw "" |
|
|
|
|
|
|
|
|
// gitRepos = [ |
|
|
// gitRepos = [ |
|
|
// // 'bbhverse', 'serververse', 'elixir-server', |
|
|
// // 'bbhverse', 'serververse', 'elixir-server', |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// NODE_ENV=development DEBUG=loopback:connector:mssql node --tls-min-v1.0 --inspect elixir/server.js |
|
|
// PB : NOTE -- npm i for client does not complete when NODE_ENV=production |
|
|
// PB : NOTE -- npm i for client does not complete when NODE_ENV=production |
|
|
// therefore bower doesn't get installed !!! which then fails installing the bower dependenciew !!! |
|
|
// therefore bower doesn't get installed !!! which then fails installing the bower dependenciew !!! |
|
|
// We work around this by running npm i for client without any NODE_ENV which probably defualts to development. |
|
|
// We work around this by running npm i for client without any NODE_ENV which probably defualts to development. |
|
|
|
|
|
|
|
|
// }) |
|
|
// }) |
|
|
|
|
|
|
|
|
var bowerRepos = [{ repo : 'client'}]; |
|
|
var bowerRepos = [{ repo : 'client'}]; |
|
|
|
|
|
var bowertasks = []; |
|
|
bowerRepos.forEach(repodef => { |
|
|
bowerRepos.forEach(repodef => { |
|
|
repotasks.push(() => { |
|
|
|
|
|
|
|
|
bowertasks.push(() => { |
|
|
console.log(instanceroot + '/' + repodef.repo + '/node_modules/bower/bin/bower'); |
|
|
console.log(instanceroot + '/' + repodef.repo + '/node_modules/bower/bin/bower'); |
|
|
// var p = nodeShellExec('node_modules/bower/bin/bower', ['install'], { |
|
|
// var p = nodeShellExec('node_modules/bower/bin/bower', ['install'], { |
|
|
var p = nodeShellExec(`"${gitbash}"`, ['-c', '"node_modules/bower/bin/bower i"'], { |
|
|
var p = nodeShellExec(`"${gitbash}"`, ['-c', '"node_modules/bower/bin/bower i"'], { |
|
|
|
|
|
|
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
// console.log('rmtasks.length : ' + rmtasks.length) |
|
|
// console.log('rmtasks.length : ' + rmtasks.length) |
|
|
return Promise.all(rmtasks).then(() => any(repotasks)); |
|
|
|
|
|
|
|
|
return Promise.all(rmtasks).then(() => any(repotasks)).then(()=>any(bowertasks)); |
|
|
}).catch(e => { |
|
|
}).catch(e => { |
|
|
console.error(e); |
|
|
console.error(e); |
|
|
}).finally(statuslog.finally) |
|
|
}).finally(statuslog.finally) |
|
|
|
|
|
|
|
|
var promise = new Promise((resolve, reject)=>{ |
|
|
var promise = new Promise((resolve, reject)=>{ |
|
|
existslink('config', function(err, data){ |
|
|
existslink('config', function(err, data){ |
|
|
if(data) { |
|
|
if(data) { |
|
|
var p = nodeShellExec('rmdir', ['config'], { inherit: true, shell: true, env: process.env } |
|
|
|
|
|
).catch((err) => { console.log('Ignoring benign error : ' + err); return true; }); |
|
|
|
|
|
return resolve(p); |
|
|
|
|
|
|
|
|
nodeShellExec('rmdir', ['config'], { inherit: true, shell: true, env: process.env }) |
|
|
|
|
|
.then(()=>{resolve(true);}) |
|
|
|
|
|
.catch((err) => { console.log('Ignoring benign error : ' + err); return resolve(true); }); |
|
|
} |
|
|
} |
|
|
else resolve(false); |
|
|
else resolve(false); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
var promise = new Promise((resolve, reject)=>{ |
|
|
var promise = new Promise((resolve, reject)=>{ |
|
|
existslink('data', function(err, data){ |
|
|
existslink('data', function(err, data){ |
|
|
if(data) { |
|
|
if(data) { |
|
|
var p = nodeShellExec('rmdir', ['data'], { inherit: true, shell: true, env: process.env } |
|
|
|
|
|
).catch((err) => { console.log('Ignoring benign error : ' + err); return true; }); |
|
|
|
|
|
return resolve(p); |
|
|
|
|
|
|
|
|
nodeShellExec('rmdir', ['data'], { inherit: true, shell: true, env: process.env }) |
|
|
|
|
|
.then(()=>{resolve(true);}) |
|
|
|
|
|
.catch((err) => { console.log('Ignoring benign error : ' + err); return resolve(true); }); |
|
|
} |
|
|
} |
|
|
else resolve(false); |
|
|
else resolve(false); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
tasks = tasks.concat( |
|
|
tasks = tasks.concat( |
|
|
[ |
|
|
[ |
|
|
() => { |
|
|
() => { |
|
|
var p = nodeShellExec('mklink', ['/J', 'data', runconfig.use + '-data'], { |
|
|
|
|
|
|
|
|
var dataToLink = runconfig.use + '-data' + '-' + process.env.NODE_ENV; |
|
|
|
|
|
if(!existsSync(dataToLink)) dataToLink = runconfig.use + '-data'; |
|
|
|
|
|
var p = nodeShellExec('mklink', ['/J', 'data', dataToLink], { |
|
|
inherit: true, shell: true |
|
|
inherit: true, shell: true |
|
|
, cwd : instanceroot |
|
|
, cwd : instanceroot |
|
|
, env: process.env |
|
|
, env: process.env |
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
clusterNodeInstance(selected) { var clusternodename = 'node01'; |
|
|
clusterNodeInstance(selected) { var clusternodename = 'node01'; |
|
|
return __acquireData(selected, selected.username, clusternodename |
|
|
return __acquireData(selected, selected.username, clusternodename |
|
|
, selected.instanceName + '-config-' + selected.node_env + `-${clusternodename}` |
|
|
|
|
|
|
|
|
, selected.instanceName + '-data-' + selected.node_env + `-${clusternodename}` |
|
|
, function(e){ console.info('Customized node level config not found. This is not an Error. Will attempt with owner level config.'); |
|
|
, function(e){ console.info('Customized node level config not found. This is not an Error. Will attempt with owner level config.'); |
|
|
return e; } |
|
|
return e; } |
|
|
) |
|
|
) |
|
|
} |
|
|
} |
|
|
, ownerInstnace(selected) { return __acquireData(selected, selected.username, null, null |
|
|
|
|
|
|
|
|
, ownerInstnace(selected) { return __acquireData(selected, selected.username, null |
|
|
|
|
|
, selected.instanceName + '-data-' + selected.node_env |
|
|
, function(e){ console.info('Customized user level config not found. This is not an Error. Will attempt global common instance config.'); |
|
|
, function(e){ console.info('Customized user level config not found. This is not an Error. Will attempt global common instance config.'); |
|
|
return e } |
|
|
return e } |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
var successHandler = () => { |
|
|
var successHandler = () => { |
|
|
|
|
|
|
|
|
var manifestpath = path.normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest'); |
|
|
var manifestpath = path.normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest'); |
|
|
selectedinstance = require(manifestpath)( null, selectedinstance); |
|
|
|
|
|
|
|
|
utils.assign_strict(selectedinstance, require(manifestpath)( null, selectedinstance)); |
|
|
|
|
|
console.dir(selectedinstance.repos); |
|
|
// Config from server always override merges into selection except for the current selection. |
|
|
// Config from server always override merges into selection except for the current selection. |
|
|
// PB : TODO -- utils.assign Array merges are non-distinct... |
|
|
// PB : TODO -- utils.assign Array merges are non-distinct... |
|
|
if(!selectedinstance.repos[0].repo) { |
|
|
if(!selectedinstance.repos[0].repo) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var __acquireData = function (selected, owner, clusternodename, datarepo, errHandler) { |
|
|
var __acquireData = function (selected, owner, clusternodename, datarepo, errHandler) { |
|
|
|
|
|
|
|
|
datarepo = datarepo || selected.instanceName + '-config-' + selected.node_env; |
|
|
|
|
|
|
|
|
datarepo = datarepo || selected.instanceName + '-data'; |
|
|
|
|
|
|
|
|
var errorHandler = (e) => { |
|
|
var errorHandler = (e) => { |
|
|
if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${owner}/${datarepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){ |
|
|
if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${owner}/${datarepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${owner}/${datarepo}.git/' not found`))){ |
|
|
if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${owner}/${datarepo}.git/' not found`))){ |
|
|
var choices = { |
|
|
var choices = { |
|
|
t : `install a new temporary local instance with this name ( will not persist ). |
|
|
|
|
|
Use your own username for additional options. You can request for a username at chess@bbh.org.in )` |
|
|
|
|
|
|
|
|
t : `install a temporary local data folder. |
|
|
|
|
|
For more options. Request and use a personal username at chess@bbh.org.in )` |
|
|
, e : 'exit' }; |
|
|
, e : 'exit' }; |
|
|
|
|
|
|
|
|
if(selectedinstance.username !== 'guest' && selectedinstance.username !== 'demo') { |
|
|
if(selectedinstance.username !== 'guest' && selectedinstance.username !== 'demo') { |
|
|
|
|
|
|
|
|
return GIT |
|
|
return GIT |
|
|
})(); |
|
|
})(); |
|
|
|
|
|
|
|
|
|
|
|
function createInstanceData(target, source) { |
|
|
|
|
|
|
|
|
|
|
|
var sourceinstance = source || target; |
|
|
|
|
|
console.dir(sourceinstance); |
|
|
|
|
|
var args = { |
|
|
|
|
|
remotebase : sourceinstance.reposerver + '/chess/' |
|
|
|
|
|
, sourcerepo : sourceinstance.repo || 'chess-data' |
|
|
|
|
|
, targetrepo : `${target.instanceName}-data-${target.instanceType}${target.nodeName ? ('-' + target.nodeName) : ''}` |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
if(sourceinstance.local) { |
|
|
|
|
|
|
|
|
|
|
|
var options = { |
|
|
|
|
|
inherit: true, shell: true, |
|
|
|
|
|
env: process.env |
|
|
|
|
|
, cwd : instanceroot |
|
|
|
|
|
, runas: processedArgs.runas |
|
|
|
|
|
}; |
|
|
|
|
|
var cmdseq = [ |
|
|
|
|
|
['git', ['clone', `${args.remotebase}${args.sourcerepo}`, `${args.targetrepo}`], options] |
|
|
|
|
|
]; |
|
|
|
|
|
return any(cmdseq.map(getshelltask)).then(() => { return true }) |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
// http://try.gitea.io/api/v1/org/{org}/repos |
|
|
|
|
|
|
|
|
|
|
|
if(source.reposerver !== target.reposerver && source.username !== target.username) { |
|
|
|
|
|
throw 'createInstanceData is possible only within the same repository server.' |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var server = new URL(target.reposerver); |
|
|
|
|
|
return GITEA.repository.fork( { hostname : server.host, protocol : server.protocol |
|
|
|
|
|
, username : target.username, password : target.password |
|
|
|
|
|
} |
|
|
|
|
|
// , { repo : `${selectedinstance.instanceName}-config-${selectedinstance.instanceType}`} |
|
|
|
|
|
, { repo : `${args.sourcerepo}`, owner : `${target.username}` }, {}, function( repository ){ |
|
|
|
|
|
return GITEA.repository.updateattributes( { |
|
|
|
|
|
hostname : server.host, protocol : server.protocol |
|
|
|
|
|
, username : target.username, password : target.password |
|
|
|
|
|
} |
|
|
|
|
|
, { repo : `${args.sourcerepo}`, owner : `${target.username}` } |
|
|
|
|
|
, { name : `${args.targetrepo}`} |
|
|
|
|
|
) |
|
|
|
|
|
} |
|
|
|
|
|
) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// GITEA.repository.updateattributes( { |
|
|
|
|
|
// hostname : server.host, protocol : server.protocol |
|
|
|
|
|
// , username : selectedinstance.username, password : selectedinstance.password |
|
|
|
|
|
// } |
|
|
|
|
|
// , { repo : `chess-config`, owner : selectedinstance.username } |
|
|
|
|
|
// , { name : `${selectedinstance.instanceName}-config-${selectedinstance.instanceType}${selectedinstance.nodeName ? '-' + selectedinstance.nodeName : ''}`} |
|
|
|
|
|
// ) |
|
|
|
|
|
|
|
|
|
|
|
// return selectedinstance |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function createInstance(target, source) { |
|
|
function createInstance(target, source) { |
|
|
|
|
|
|
|
|
var sourceinstance = source || target; |
|
|
var sourceinstance = source || target; |