apxtrib/api/models/Setup.js

322 lines
11 KiB
JavaScript
Raw Normal View History

2023-04-17 10:03:56 +00:00
const fs = require("fs-extra");
const path = require("path");
const dnsSync = require("dns-sync");
const mustache = require("mustache");
const readlineSync = require("readline-sync");
2023-04-27 04:17:20 +00:00
2023-04-17 10:03:56 +00:00
/**
* This Setup is run at the first installation
* This is not an exportable module
*
*
*
*/
2023-01-22 09:53:09 +00:00
const Setup = {};
2023-04-17 10:03:56 +00:00
//const nationsync = require('./Nations').updateChains();
2023-01-22 09:53:09 +00:00
2023-04-17 10:03:56 +00:00
Setup.check = () => {
if ("testinternet" != "testinternet") {
console.log(
"\x1b[31m Check your internet access, to setup this town we need to update the Nations. It seems we cannot do it"
);
process.exit();
}
if (!fs.existsSync("/etc/nginx/nginx.conf")) {
console.log(
"\x1b[31m Check documentation, nginx have to be installed on this server first, no /etc/nginx/nginx.conf available"
);
process.exit();
}
2023-04-27 04:17:20 +00:00
if (fs.existsSync("./nationchains/tribes/conf.json")) {
2023-04-17 10:03:56 +00:00
console.log(
"\x1b[31m Be carefull you already have a town set in ./nationchains/tribes/index.conf.json, check and remove it if you want to setup this town."
);
process.exit();
}
return true;
};
2023-04-13 05:46:35 +00:00
2023-04-27 04:17:20 +00:00
Setup.init = async () => {
2023-04-17 10:03:56 +00:00
// Get standard conf and current data
const townconf = fs.readJsonSync("./nationchains/www/adminapx/townconf.json");
2023-04-27 04:17:20 +00:00
const apxnations = fs.readJsonSync(
`./nationchains/nations/idx/nationId_all.json`
);
const apxtowns = fs.readJsonSync(`./nationchains/towns/idx/townId_all.json`);
let apxpagans={}
if (fs.existsSync(`./nationchains/pagans/idx/alias_all.json`)){
apxpagans = fs.readJsonSync(
`./nationchains/pagans/idx/alias_all.json`
);
}
if (!Object.keys(apxnations).includes(townconf.nationId)) {
console.log(
`Sorry nationId ${townconf.nationId} does not exist, please change with an existing nation `
);
process.exit();
}
if (Object.keys(apxtowns).includes(townconf.townId)) {
console.log(
`Sorry townId ${townconf.townId} already exist, please change it`
);
process.exit();
}
/*
if (Object.keys(apxpagans).includes(townconf.mayorId)) {
console.log(
`Sorry paganId ${townconf.maorId} already exist ti create a town you need a new identity, please change it`
);
process.exit();
}
*/
2023-04-17 10:03:56 +00:00
townconf.sudoerUser = process.env.USER;
townconf.dirname = path.resolve(`${__dirname}/../../`);
// nginx allow to set a new website space
2023-04-27 04:17:20 +00:00
townconf.nginx.include.push(
`${townconf.dirname}/nationchains/**/nginx_*.conf`
);
2023-04-17 10:03:56 +00:00
townconf.nginx.logs = `${townconf.dirname}/nationchains/logs/nginx`;
2023-04-27 04:17:20 +00:00
townconf.nginx.website = "adminapx";
2023-04-17 10:03:56 +00:00
townconf.nginx.fswww = "nationchains/"; //for a local tribe nationchains/tribes/tribeid
townconf.nginx.tribeid = "town";
2023-04-27 04:17:20 +00:00
townconf.nginx.pageindex = "index_en.html";
2023-04-13 05:46:35 +00:00
2023-04-17 10:03:56 +00:00
console.log(townconf);
if (
!readlineSync.keyInYN(
2023-04-27 04:17:20 +00:00
`\x1b[42mThis is the first install from ./nationchains/www/adminapx/townconf.json (check it if you want) \nthis will change your nginx config in /etc/nginx and run nginx from sudoer user ${townconf.sudoerUser} (Yes/no)? \nno if you want to change parameter and run yarn setup again \x1b[0m`
2023-04-17 10:03:56 +00:00
)
)
process.exit();
2023-04-27 04:17:20 +00:00
2023-04-17 10:03:56 +00:00
// saved and change nginx conf
if (!fs.existsSync("/etc/nginx/nginxconf.saved")) {
fs.moveSync("/etc/nginx/nginx.conf", "/etc/nginx/nginxconf.saved");
2023-04-27 04:17:20 +00:00
console.log(
"your previous /etc/nginx/nginx.conf was backup in /etc/nginx/nginxconf.saved"
);
2023-04-17 10:03:56 +00:00
}
const tplnginxconf = fs.readFileSync(
"./nationchains/www/adminapx/nginx/nginx.conf.mustache",
"utf8"
);
fs.outputFileSync(
"/etc/nginx/nginx.conf",
mustache.render(tplnginxconf, townconf),
"utf8"
);
const tplnginxwww = fs.readFileSync(
"./nationchains/www/adminapx/nginx/modelwebsite.conf.mustache",
"utf8"
);
fs.outputFileSync(
`./${townconf.nginx.fswww}www/nginx_${townconf.nginx.website}.conf`,
mustache.render(tplnginxwww, townconf),
"utf8"
);
2023-04-27 04:17:20 +00:00
fs.outputJsonSync("./nationchains/tribes/conf.json", townconf, {
2023-04-17 10:03:56 +00:00
spaces: 2,
});
2023-04-27 04:17:20 +00:00
//CREATE A TOWN setup local voir utiliser towns.create
townconf.town = {
townId: townconf.townId,
nationId: townconf.nationId,
url: `http://${townconf.dns[0]}`,
IP: townconf.IP,
mayorid: townconf.mayorId,
status: "unchain",
};
apxtowns[townconf.townId]=townconf.town;
fs.outputJsonSync(`./nationchains/towns/idx/townId_all.json`,apxtowns);
fs.outputJsonSync(`./nationchains/towns/itm/${townconf.townId}.json`,townconf.town,{spaces:2});
// Create tribe id voir a utiliser tribes.create()
townconf.tribe = {
tribeId: townconf.tribeId,
dns: [],
status: "unchain",
nationId: townconf.nationId,
townId: townconf.townId,
};
//tribe does not exist in a new town
apxtribes={}
apxtribes[townconf.tribeId]=townconf.tribe;
fs.outputJsonSync(`./nationchains/tribes/idx/tribeId_all.json`,apxtribes);
fs.outputJsonSync(`./nationchains/tribes/itm/${townconf.tribeId}.json`,townconf.tribe,{spaces:2});
fs.ensureDirSync(`./nationchains/tribes/${townconf.tribeId}/logs`);
//CREATE a mayorId pagans if it does not exist
if (!apxpagans[townconf.mayorId]){
const Pagans=require('./Pagans');
const createPagans=await Pagans.createId(townconf.mayorId,townconf.passphrase);
if (createPagans.status==200){
fs.outputFileSync(`./${townconf.mayorId}_PrivateKey.txt`,createPagans.data.privateKey,"utf8");
fs.outputFileSync(`./${townconf.mayorId}_PublicKey.txt`,createPagans.data.publicKey,"utf8");
console.log(`\x1b[43mCut paste your keys /${townconf.mayorId}_PrivateKey.txt /${townconf.mayorId}_PublicKey.txt \x1b[0m`)
}else{
console.log('Error at Pagan creation ');
console.log(createPagans);
process.exit();
}
}
//restart nginx
2023-04-17 10:03:56 +00:00
const { exec } = require("child_process");
exec(townconf.nginx.restart, (error, stdout, stderr) => {
if (error) {
console.log("\x1b[42m", error, stdout, stderr, "x1b[0m");
} else {
console.log(
2023-04-27 04:17:20 +00:00
`\x1b[42m###########################################################################################\x1b[0m\n\x1b[42mWellcome into apxtrib, you can now 'yarn dev' for dev or 'yarn startpm2' for prod or \n'yarn unittest' for testing purpose. Access to your town here \x1b[0m\x1b[32mhttp://${townconf.dns}\x1b[0m \x1b[42m \nto finish your town set up. Check README's project to learn more. \x1b[0m\n\x1b[42m###########################################################################################\x1b[0m`
2023-04-17 10:03:56 +00:00
);
}
});
};
2023-01-22 09:53:09 +00:00
2023-04-17 10:03:56 +00:00
Setup.Checkjson = (conf) => {
var rep = "";
const nation_town = fs.readJsonSync(
"./nationchains/socialworld/objects/towns/searchindex/towns_nation_uuid.json"
);
2023-04-27 04:17:20 +00:00
if (!ObjectKeys(nation_town).includes(conf.nationId)) {
rep += `your nationId ${conf.nationId} does not exist you have to choose an existing one`;
2023-04-17 10:03:56 +00:00
}
2023-04-27 04:17:20 +00:00
if (nation_town[conf.nationId].includes(conf.townId)) {
rep += `This conf.townId already exist you have to find a unique town name per nation`;
2023-04-17 10:03:56 +00:00
}
const getnation = Odmdb.get(
"./nationchains/socialworld/objects",
"towns",
2023-04-27 04:17:20 +00:00
[conf.NationId],
2023-04-17 10:03:56 +00:00
[nationId]
);
//if getnation.data.notfound
conf.language.forEach((l) => {
if (!["fr", "en", "it", "de", "sp"].includes(l)) {
rep += l + " Only fr,en,it,de,sp are available \n";
}
});
if (!fs.existsSync(`/home/${conf.sudoerUser}`)) {
rep += `/home/${conf.sudoerUser} does not exist, user has to be create with a /home on this server\n`;
}
try {
if (
"true" ==
execSync('timeout 2 sudo id && sudo="true" || sudo="false";echo "$sudo"')
.toString()
.trim()
.split(/\r?\n/)
.slice(-1)
) {
rep += `${sudoerUser} is not sudoer please change this `;
}
} catch (err) {
console.log(err);
rep += " Check your user it seems to not be a sudoer";
}
if (conf.jwtsecret.length < 32) {
rep += "Your jwtsecretkey must have at least 32 characters";
}
if (
conf.dns != "unchain" &&
2023-04-27 04:17:20 +00:00
!dnsSync.resolve(`${conf.townId}.${conf.nationId}.${conf.dns}`)
2023-04-17 10:03:56 +00:00
) {
2023-04-27 04:17:20 +00:00
rep += `\nresolving $${conf.townId}.${conf.nationId}.${conf.dns} will not responding valid IP, please setup domain redirection IP before runing this script`;
2023-04-17 10:03:56 +00:00
}
return rep;
2023-01-22 09:53:09 +00:00
};
2023-03-27 05:52:21 +00:00
2023-04-17 10:03:56 +00:00
Setup.config = (townSetup) => {
// Init this instance with a .config.js
Setup.configjs(townSetup);
// Create tribeid space + a user admin + webspace withe apxtrib webapp install
Setup.druidid(townSetup);
2023-01-22 09:53:09 +00:00
};
2023-04-17 10:03:56 +00:00
Setup.configjs = (townSetup) => {
// Set /config.js
let confapxtrib = fs.readFileSync("./setup/config.mustache", "utf-8");
fs.writeFileSync(
"./config.js",
Mustache.render(confapxtrib, townSetup),
"utf-8"
);
if (fs.existsSync("./config.js")) {
console.log("config.js successfully created.");
} else {
console.log(
"config.js not created, check what's wrong in tpl:",
confapxtrib
);
console.log("for data :", townSetup);
process.exit();
}
2023-01-22 09:53:09 +00:00
};
2023-04-17 10:03:56 +00:00
Setup.druidid = (townSetup) => {
// create a tribeid with a user that will admin this instance into /tribes/tribeid /users
const config = require("../config.js");
// Need to do it on setup this is also done again in models/Tribes.js
console.log(`${config.tribes}/${townSetup.druidid}`);
fs.ensureDirSync(`${config.tribes}/${townSetup.druidid}`);
["users", "www", "referentials", "nationchains"].forEach((r) => {
fs.copySync(
`${__base}/setup/tribes/apxtrib/${r}`,
`${config.tribes}/${townSetup.druidid}/${r}`
);
});
/* const confcli = JSON.parse( Mustache.render( fs.readFileSync( `${__base}/setup/tribes/apxtrib/clientconf.mustache`, 'utf8' ), townSetup ) );
2023-03-27 05:52:21 +00:00
fs.outputJsonSync( `${config.tribes}/${townSetup.druidid}/clientconf.json`, confcli );
2023-01-22 09:53:09 +00:00
// Create a new tribeid + admin user for this tribeid
// with access to {druidid}:webapp as admin
2023-03-27 05:52:21 +00:00
*/
2023-04-17 10:03:56 +00:00
const Tribes = require("./Tribes.js");
const access = { app: {}, data: {} };
access.app[`${townSetup.druidid}:webapp`] = "admin";
access.data[townSetup.druidid] = {
users: "CRUDO",
referentials: "CRUDO",
www: "CRUDO",
};
const createclient = Tribes.create({
tribeid: townSetup.druidid,
genericpsw: townSetup.genericpsw,
lanquageReferential: townSetup.language,
useradmin: {
LOGIN: townSetup.login,
xlang: townSetup.language[0],
ACCESSRIGHTS: access,
},
});
if (createclient.status == 200) {
console.log(
`Your tribeid domain was created with login : ${townSetup.login} and password: ${townSetup.genericpsw}, change it after the 1st login on https://${townSetup.subdomain}.${townSetup.domain}`
);
// Create nginx conf for a first install
const confnginx = fs.readFileSync(
"./setup/nginx/nginx.conf.mustache",
"utf8"
);
fs.outputFileSync(
"/etc/nginx/nginx.conf",
Mustache.render(confnginx, townSetup),
"utf-8"
);
// Create a spacedev for webapp of apxtrib
// that will be accesible in prod from https://subdomain.domain/ and in dev http://webapp.local.fr
const addspaceweb = Tribes.addspaceweb({
setup: true,
dnsname: [`${townSetup.subdomain}.${townSetup.domain}`],
mode: townSetup.mode,
tribeid: townSetup.druidid,
website: "webapp",
pageindex: "app_index_fr.html",
});
if (addspaceweb.status == 200) {
console.log(`WELL DONE run yarn dev to test then yarn startpm2 `);
}
} else {
console.log("Issue ", createclient);
}
};
2023-01-22 09:53:09 +00:00
2023-04-17 10:03:56 +00:00
if (Setup.check()) Setup.init();