Prepare customAutoLoad install functions for UI+

install-with-shinobicctv-user-instead-of-root
Moe 2020-08-08 12:21:38 -07:00
parent f70cfcfe19
commit f5c2b936fc
1 changed files with 209 additions and 176 deletions

View File

@ -1,8 +1,208 @@
var fs = require('fs')
var express = require('express')
var spawn = require('child_process').spawn
module.exports = function(s,config,lang,app,io){
const modulesBasePath = s.mainDirectory + '/libs/customAutoLoad/'
const initializeModules = () => {
const searchText = function(searchFor,searchIn){
return searchIn.indexOf(searchFor) > -1
}
const extractNameFromPackage = (filePath) => {
const filePathParts = filePath.split('/')
const packageName = filePathParts[filePathParts.length - 1].split('.')[0]
return packageName
}
const getModulePath = (name) => {
return modulesBasePath + name + '/'
}
const getModules = () => {
const foundModules = {}
fs.readdirSync(modulesBasePath).forEach((moduleName) => {
const modulePath = getModulePath(moduleName)
const isDirectory = fs.lstatSync(modulePath).isDirectory()
foundModules[moduleName] = {
moduleName: moduleName,
path: modulePath,
isDirectory: isDirectory,
}
if(isDirectory){
if(!fs.existsSync(modulePath + 'index.js')){
foundModules[moduleName].noIndex = true
}
if(!fs.existsSync(modulePath + 'package.json')){
foundModules[moduleName].properties = getModuleProperties(moduleName)
}
}else{
foundModules[moduleName].isIgnitor = (moduleName.indexOf('.js') > -1)
foundModules[moduleName].properties = {
name: moduleName
}
}
})
return foundModules
}
const downloadModule = (downloadUrl,packageRoot,packageName) => {
return fetch(downloadUrl).pipe(fs.createWriteStream(modulesBasePath + (packageName ? packageName : extractNameFromPackage(downloadUrl))))
}
const getModuleProperties = (name) => {
const modulePath = getModulePath(name)
const propertiesPath = modulePath + 'package.json'
const properties = fs.existsSync(propertiesPath) ? s.parseJSON(fs.readFileSync(propertiesPath)) : {
name: name
}
return properties
}
const installModule = async (name) => {
//depending on module this may only work for Ubuntu
const modulePath = getModulePath(name)
const properties = getModuleProperties(name);
const installerPath = modulePath + `INSTALL.sh`
const propertiesPath = modulePath + 'package.json'
// check for INSTALL.sh (ubuntu only)
if(fs.existsSync(installerPath)){
const installProcess = spawn(`sh`,installerPath)
installProcess.stderr.on('data',(data) => {
console.log(data.toString())
})
installProcess.stdout.on('data',(data) => {
console.log(data.toString())
})
}else if(fs.existsSync(propertiesPath)){
// no INSTALL.sh found, check for package.json and do `npm install --unsafe-perm`
const installProcess = spawn(`npm`,['install','--unsafe-perm'])
installProcess.stderr.on('data',(data) => {
console.log(data.toString())
})
installProcess.stdout.on('data',(data) => {
console.log(data.toString())
})
}
}
const loadModule = (module) => {
const moduleName = module.name
s.customAutoLoadModules[moduleName] = {}
var customModulePath = modulesBasePath + '/' + moduleName
if(module.isIgnitor){
s.customAutoLoadModules[moduleName].type = 'file'
try{
require(customModulePath)(s,config,lang,app,io)
}catch(err){
s.systemLog('Failed to Load Module : ' + moduleName)
s.systemLog(err)
}
}else if(module.isDirectory){
s.customAutoLoadModules[moduleName].type = 'folder'
try{
require(customModulePath)(s,config,lang,app,io)
fs.readdir(customModulePath,function(err,folderContents){
folderContents.forEach(function(name){
switch(name){
case'web':
var webFolder = s.checkCorrectPathEnding(customModulePath) + 'web/'
fs.readdir(webFolder,function(err,webFolderContents){
webFolderContents.forEach(function(name){
switch(name){
case'libs':
case'pages':
if(name === 'libs'){
if(config.webPaths.home !== '/'){
app.use('/libs',express.static(webFolder + '/libs'))
}
app.use(s.checkCorrectPathEnding(config.webPaths.home)+'libs',express.static(webFolder + '/libs'))
app.use(s.checkCorrectPathEnding(config.webPaths.admin)+'libs',express.static(webFolder + '/libs'))
app.use(s.checkCorrectPathEnding(config.webPaths.super)+'libs',express.static(webFolder + '/libs'))
}
var libFolder = webFolder + name + '/'
fs.readdir(libFolder,function(err,webFolderContents){
webFolderContents.forEach(function(libName){
var thirdLevelName = libFolder + libName
switch(libName){
case'js':
case'css':
case'blocks':
fs.readdir(thirdLevelName,function(err,webFolderContents){
webFolderContents.forEach(function(filename){
var fullPath = thirdLevelName + '/' + filename
var blockPrefix = ''
switch(true){
case searchText('super.',filename):
blockPrefix = 'super'
break;
case searchText('admin.',filename):
blockPrefix = 'admin'
break;
}
switch(libName){
case'js':
s.customAutoLoadTree[blockPrefix + 'LibsJs'].push(filename)
break;
case'css':
s.customAutoLoadTree[blockPrefix + 'LibsCss'].push(filename)
break;
case'blocks':
s.customAutoLoadTree[blockPrefix + 'PageBlocks'].push(fullPath)
break;
}
})
})
break;
default:
if(libName.indexOf('.ejs') > -1){
s.customAutoLoadTree.pages.push(thirdLevelName)
}
break;
}
})
})
break;
}
})
})
break;
case'languages':
var languagesFolder = s.checkCorrectPathEnding(customModulePath) + 'languages/'
fs.readdir(languagesFolder,function(err,files){
if(err)return console.log(err);
files.forEach(function(filename){
var fileData = require(languagesFolder + filename)
var rule = filename.replace('.json','')
if(config.language === rule){
lang = Object.assign(lang,fileData)
}
if(s.loadedLanguages[rule]){
s.loadedLanguages[rule] = Object.assign(s.loadedLanguages[rule],fileData)
}else{
s.loadedLanguages[rule] = Object.assign(s.copySystemDefaultLanguage(),fileData)
}
})
})
break;
case'definitions':
var definitionsFolder = s.checkCorrectPathEnding(customModulePath) + 'definitions/'
fs.readdir(definitionsFolder,function(err,files){
if(err)return console.log(err);
files.forEach(function(filename){
var fileData = require(definitionsFolder + filename)
var rule = filename.replace('.json','').replace('.js','')
if(config.language === rule){
s.definitions = s.mergeDeep(s.definitions,fileData)
}
if(s.loadedDefinitons[rule]){
s.loadedDefinitons[rule] = s.mergeDeep(s.loadedDefinitons[rule],fileData)
}else{
s.loadedDefinitons[rule] = s.mergeDeep(s.copySystemDefaultDefinitions(),fileData)
}
})
})
break;
}
})
})
}catch(err){
s.systemLog('Failed to Load Module : ' + moduleName)
s.systemLog(err)
}
}
}
const initializeAllModules = async () => {
s.customAutoLoadModules = {}
s.customAutoLoadTree = {
pages: [],
@ -16,186 +216,19 @@ module.exports = function(s,config,lang,app,io){
superLibsJs: [],
superLibsCss: []
}
var search = function(searchFor,searchIn){return searchIn.indexOf(searchFor) > -1}
fs.readdir(modulesBasePath,function(err,folderContents){
if(!err && folderContents){
folderContents.forEach(function(filename){
s.customAutoLoadModules[filename] = {}
var customModulePath = modulesBasePath + '/' + filename
if(filename.indexOf('.js') > -1){
s.customAutoLoadModules[filename].type = 'file'
try{
require(customModulePath)(s,config,lang,app,io)
}catch(err){
console.log('Failed to Load Module : ' + filename)
console.log(err)
}
}else{
if(fs.lstatSync(customModulePath).isDirectory()){
s.customAutoLoadModules[filename].type = 'folder'
try{
require(customModulePath)(s,config,lang,app,io)
fs.readdir(customModulePath,function(err,folderContents){
folderContents.forEach(function(name){
switch(name){
case'web':
var webFolder = s.checkCorrectPathEnding(customModulePath) + 'web/'
fs.readdir(webFolder,function(err,webFolderContents){
webFolderContents.forEach(function(name){
switch(name){
case'libs':
case'pages':
if(name === 'libs'){
if(config.webPaths.home !== '/'){
app.use('/libs',express.static(webFolder + '/libs'))
}
app.use(s.checkCorrectPathEnding(config.webPaths.home)+'libs',express.static(webFolder + '/libs'))
app.use(s.checkCorrectPathEnding(config.webPaths.admin)+'libs',express.static(webFolder + '/libs'))
app.use(s.checkCorrectPathEnding(config.webPaths.super)+'libs',express.static(webFolder + '/libs'))
}
var libFolder = webFolder + name + '/'
fs.readdir(libFolder,function(err,webFolderContents){
webFolderContents.forEach(function(libName){
var thirdLevelName = libFolder + libName
switch(libName){
case'js':
case'css':
case'blocks':
fs.readdir(thirdLevelName,function(err,webFolderContents){
webFolderContents.forEach(function(filename){
var fullPath = thirdLevelName + '/' + filename
var blockPrefix = ''
switch(true){
case search('super.',filename):
blockPrefix = 'super'
break;
case search('admin.',filename):
blockPrefix = 'admin'
break;
}
switch(libName){
case'js':
s.customAutoLoadTree[blockPrefix + 'LibsJs'].push(filename)
break;
case'css':
s.customAutoLoadTree[blockPrefix + 'LibsCss'].push(filename)
break;
case'blocks':
s.customAutoLoadTree[blockPrefix + 'PageBlocks'].push(fullPath)
break;
}
})
})
break;
default:
if(libName.indexOf('.ejs') > -1){
s.customAutoLoadTree.pages.push(thirdLevelName)
}
break;
}
})
})
break;
}
})
})
break;
case'languages':
var languagesFolder = s.checkCorrectPathEnding(customModulePath) + 'languages/'
fs.readdir(languagesFolder,function(err,files){
if(err)return console.log(err);
files.forEach(function(filename){
var fileData = require(languagesFolder + filename)
var rule = filename.replace('.json','')
if(config.language === rule){
lang = Object.assign(lang,fileData)
}
if(s.loadedLanguages[rule]){
s.loadedLanguages[rule] = Object.assign(s.loadedLanguages[rule],fileData)
}else{
s.loadedLanguages[rule] = Object.assign(s.copySystemDefaultLanguage(),fileData)
}
})
})
break;
case'definitions':
var definitionsFolder = s.checkCorrectPathEnding(customModulePath) + 'definitions/'
fs.readdir(definitionsFolder,function(err,files){
if(err)return console.log(err);
files.forEach(function(filename){
var fileData = require(definitionsFolder + filename)
var rule = filename.replace('.json','').replace('.js','')
if(config.language === rule){
s.definitions = s.mergeDeep(s.definitions,fileData)
}
if(s.loadedDefinitons[rule]){
s.loadedDefinitons[rule] = s.mergeDeep(s.loadedDefinitons[rule],fileData)
}else{
s.loadedDefinitons[rule] = s.mergeDeep(s.copySystemDefaultDefinitions(),fileData)
}
})
})
break;
}
})
})
}catch(err){
console.log('Failed to Load Module : ' + filename)
console.log(err)
}
}
if(!err && folderContents.length > 0){
getModules().forEach((module) => {
if(module.properties.disabled){
return;
}
loadModule(module)
})
}else{
fs.mkdirSync(modulesBasePath)
}
})
}
const extractNameFromPackage = (filePath) => {
const filePathParts = filePath.split('/')
const packageName = filePathParts[filePathParts.length - 1].split('.')[0]
return packageName
}
const getModulePath = (name) => {
return modulesBasePath + name + '/'
}
const getModules = async (showInstalledOnly) => {
const foundModules = {}
fs.readdirSync(modulesBasePath).forEach((moduleName) => {
const modulePath = getModulePath(moduleName)
const isDirectory = fs.statSync(modulePath).isDirectory()
foundModules[moduleName] = {
moduleName: moduleName,
path: modulePath,
isDirectory: isDirectory,
}
if(isDirectory){
if(!fs.existsSync(modulePath + 'index.js')){
foundModules[moduleName].noIndex = true
}
// is folder
}else{
// is igniter
}
})
return foundModules
}
const downloadModule = (downloadUrl,packageRoot,packageName) => {
return fetch(downloadUrl).pipe(fs.createWriteStream(modulesBasePath + packageName ? packageName : extractNameFromPackage(downloadUrl)))
}
const getModuleProperties = async (name) => {
const modulePath = getModulePath(name)
const propertiesPath = modulePath + 'package.json'
return properties = fs.existsSync(propertiesPath) ? s.parseJSON(fs.readFileSync(propertiesPath)) : {
"name": name
}
}
const installModule = async (name) => {
//depending on module this may only work for Ubuntu
const properties = await getModuleProperties(name);
// check for INSTALL.js (dynamic installer)
// check for INSTALL.sh (ubuntu only)
}
initializeModules();
initializeAllModules();
}