boidcmd-cluster-pi
Version:
<a href="https://www.boid.com/"><img src="https://raw.githubusercontent.com/Boid-John/eos-airdrops/master/logos/BoidLogo-lg.png" title="Boid" alt="Boid"></a>
384 lines (350 loc) • 11.2 kB
JavaScript
var cmd = require('node-cmd')
var convert = require('xml-js')
var fs = require('fs')
var client = require("./api.js")
const minimist = require('minimist')
const ora = require('ora')
const spinner = ora()
const readline = require('readline')
const { spawn } = require('child_process')
var boidEmail = process.env.BOID_EMAIL
var boidPassword = process.env.BOID_PASSWORD
var form = {
email: '',
password: '',
invitedById: null,
device: null
}
var projectObject = {
deviceId: '',
wcgid: ''
}
module.exports = () => {
const args = minimist(process.argv.slice(2))
var boidcmd = args._[0]
var value = args._[1]
if(args.version || args.v) {
boidcmd = 'version'
}
if(args.help || args.h || args._[0] == undefined) {
boidcmd = 'help'
}
switch (boidcmd) {
case 'setCPU':
setCPU(value)
break
case 'setup':
setupBoid()
break
case 'install':
installBoid()
break
case 'run':
runBoid()
break
case 'quit':
quitBoid()
break
case 'resume':
resume()
break
case 'suspend':
suspend()
break
case 'status':
status()
break
case 'help':
require('./help')
break
case 'version':
require('./version')
break
default:
console.error(`"${boidcmd}" is not a valid command!`)
break
}
}
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
async function setupBoid(){
var form = {}
rl.stdoutMuted = false
if(boidEmail != undefined && boidPassword != undefined){
form.email = boidEmail
form.password = boidPassword
client.send(form,client.endPoint.authenticateUser,function(response){
response = JSON.parse(response)
if (response.invalid){
console.log()
console.log(response.invalid)
return setupBoid()
}
client.setUserData(response)
rl.close()
setupBoinc()
})
}else {
rl.question('Boid Account Email:', (email) => {
form.email = email
rl.question('Boid Account Password: ', (password) => {
form.password = password
client.send(form,client.endPoint.authenticateUser,function(response){
response = JSON.parse(response)
if (response.invalid){
console.log()
console.log(response.invalid)
return setupBoid()
}
client.setUserData(response)
rl.close()
setupBoinc()
})
})
rl.stdoutMuted = true
// rl.history = rl.history.slice(1)
})
rl._writeToOutput = function _writeToOutput(stringToWrite) {
if (rl.stdoutMuted)
rl.output.write("*")
else
rl.output.write(stringToWrite)
}
}
}
function runBoid(){
const subprocess = spawn('boinc',['--dir', '/var/lib/boinc-client/', '--daemon', '--allow_remote_gui_rpc'], {
detached: true,
stdio: 'ignore'
});
subprocess.unref();
}
function quitBoid(){
cmd.get(
`
boinccmd kill
`,
function(err, data, stderr){
if (!err) {
} else {
console.log('error', err)
}
}
);
}
function installBoid() {
cmd.get(
`
sudo apt-get install boinc-client -y
boinccmd --project_attach http://www.worldcommunitygrid.org/ 1061556_a0c611b081f8692b7ef0c11d39e6105c
`,
function(err, data, stderr){
if (!err) {
console.log("waiting for project information")
spinner.start()
setTimeout(projectCheck,3000)
} else {
console.log('error', err)
}
}
);
}
function projectCheck(){
fs.readFile( '/var/lib/boinc-client/client_state.xml', function(err, data) {
var result1 = convert.xml2json(data, {compact: true, spaces: 4});
var object = JSON.parse(result1);
var hostInfo = object.client_state.host_info
var project = object.client_state.project
var name = hostInfo.domain_name._text
var cpid = hostInfo.host_cpid._text
var threads = hostInfo.p_ncpus._text
var model = hostInfo.p_model._text
var wcgid = project.hostid._text
if(wcgid == "0"){
setTimeout(projectCheck,3000)
}else{
spinner.stop()
console.log("Success!")
}
});
}
function valBetween(v, min, max) {
return Math.min(max, Math.max(min, v))
}
function setCPU(value){
fs.readFile( '/var/lib/boinc-client/global_prefs_override.xml', function(err, data) {
var cpuPercent = valBetween(value * 1 + 15, 70, 100)
console.log(cpuPercent)
var result1 = convert.xml2json(data, {compact: true, spaces: 4});
var object = JSON.parse(result1);
object.global_preferences.cpu_usage_limit = cpuPercent
var options = {compact:true, ignoreComment:true, spaces:4};
var xmlResult = convert.json2xml(object,options);
console.log(object)
console.log(xmlResult)
fs.writeFile('/var/lib/boinc-client/global_prefs_override.xml',xmlResult,function(err){
if (err) throw err;
readGlobalPrefsOverride()
})
});
}
function readGlobalPrefsOverride(){
spinner.start()
cmd.get(
`
boinccmd --read_global_prefs_override
`,
function(err, data, stderr){
if (!err) {
console.log("Sucessfully set cpu limit")
spinner.stop()
} else {
console.log('error', err)
}
}
);
}
function setupBoinc(){
cmd.get(
`
sudo apt-get install boinc-client -y
boinccmd --project_attach http://www.worldcommunitygrid.org/ 1061556_a0c611b081f8692b7ef0c11d39e6105c
`,
function(err, data, stderr){
if (!err) {
console.log("waiting for project information")
spinner.start()
setTimeout(readFiles,3000)
} else {
// if (error.search(''))
console.log('error', err)
setTimeout(readFiles,3000)
}
}
);
}
function resume() {
cmd.get(
`
boinccmd --project http://www.worldcommunitygrid.org/ resume
`,
function(err, data, stderr){
if (!err) {
console.log(data)
console.log(stderr)
process.exit(0);
} else {
console.log('error', err)
}
}
);
}
function suspend() {
cmd.get(
`
boinccmd --project http://www.worldcommunitygrid.org/ suspend
`,
function(err, data, stderr){
if (!err) {
console.log(data)
console.log(stderr)
process.exit(0);
} else {
console.log('error', err)
}
}
);
}
function status() {
cmd.get(
`
boinccmd --get_simple_gui_info
`,
function(err, data, stderr){
if (!err) {
console.log(data)
console.log(stderr)
process.exit(0);
} else {
console.log('error', err)
}
}
);
}
function readFiles(callback) {
fs.readFile( '/var/lib/boinc-client/client_state.xml', function(err, data) {
var result1 = convert.xml2json(data, {compact: true, spaces: 4});
var object = JSON.parse(result1);
var hostInfo = object.client_state.host_info
var project = object.client_state.project
var name = hostInfo.domain_name._text
var cpid = hostInfo.host_cpid._text
var threads = hostInfo.p_ncpus._text
var model = hostInfo.p_model._text
var wcgid = project.hostid._text
if(wcgid == "0"){
setTimeout(readFiles,3000)
}else{
spinner.stop()
projectObject.wcgid = wcgid
var device = {
cpid:cpid,
//cpid:makeid(),
name:name,
type:"LINUX"
}
console.log("Adding device to boid account")
client.send(device,client.endPoint.addDevice,function(obj){
var json = JSON.parse(obj)
if(json.error != undefined) {
console.log("error adding Device")
}else{
console.log("Added device to boid account")
console.log(json)
var deviceId = json.id
client.send({"id":deviceId},client.endPoint.getDevice,function(obj){
var json = JSON.parse(obj)
projectObject.deviceId = json.id
client.send(projectObject,client.endPoint.updateDevice,function(obj){
var json = JSON.parse(obj)
console.log(json)
console.log("Setting up project")
if (json.error == undefined) {
//console.log(json.error)
}else{
client.send({"id":projectObject.deviceId},client.endPoint.getDevice,function(obj){
var json = JSON.parse(obj)
if(json.wcgid != null){
if(projectObject.wcgid == json.wcgid){
console.log("Success!")
}else {
console(" Device is using a difference wcgid wcgid:"+json.wcgid)
}
}else{
//some other issue caused a problem
}
console.log('Setup complete. Run "boidcmd status" to view project status')
process.exit(0);
})
}
})
})
}
})
}
});
}
// sudo aptitude install boinc-client
// sudo aptitude purge boinc-client
//
//
//fake cpid
/*function makeid() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 7; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}*/