Refactored install + handle long code lines + fuse skip ace

This commit is contained in:
NGPixel 2017-04-08 16:16:13 -04:00
parent f6e8e91f7e
commit 3c63718328
5 changed files with 177 additions and 121 deletions

View File

@ -1,7 +1,20 @@
.has-mkcontent {
width:100%;
overflow:hidden;
.columns, .column {
width: 100%;
overflow: hidden;
}
}
.mkcontent {
font-size: 14px;
color: mc('grey', '700');
padding: 0 0 20px 0;
width: 100%;
overflow: hidden;
h1, h2, h3 {
font-weight: 400;
@ -243,6 +256,7 @@
padding: 20px 20px 20px 13px;
font-family: $core-font-monospace;
white-space: pre;
overflow-x: scroll;
> code {
border-radius: 5px;

View File

@ -66,7 +66,7 @@ router.post('/login', bruteforce.prevent, function (req, res, next) {
req.brute.reset(function () {
return res.redirect('/')
})
})
}) || true
}).catch(err => {
// LOGIN FAIL
if (err.message === 'INVALID_LOGIN') {

View File

@ -70,6 +70,11 @@ console.info(colors.white('└── ') + colors.green('Running global tasks...'
let globalTasks = Promise.mapSeries([
() => {
fs.accessAsync('./assets/js/ace').then(() => {
console.info(colors.white(' └── ') + colors.magenta('ACE modes directory already exists. Task aborted.'))
return true
}).catch(err => {
if (err.code === 'ENOENT') {
console.info(colors.white(' └── ') + colors.green('Copy + Minify ACE modes to assets...'))
return fs.ensureDirAsync('./assets/js/ace').then(() => {
return fs.readdirAsync('./node_modules/brace/mode').then(modeList => {
@ -80,6 +85,10 @@ let globalTasks = Promise.mapSeries([
})
})
})
} else {
throw err
}
})
}
], f => { return f() })

View File

@ -1,60 +1,68 @@
'use strict'
// =====================================================
// Wiki.js
// Installation Script
// =====================================================
const Promise = require('bluebird')
const _ = require('lodash')
const colors = require('colors/safe')
const exec = require('execa')
const fs = Promise.promisifyAll(require('fs-extra'))
const https = require('follow-redirects').https
const inquirer = require('inquirer')
const os = require('os')
const path = require('path')
const pm2 = Promise.promisifyAll(require('pm2'))
const tar = require('tar')
const zlib = require('zlib')
const inquirer = require('inquirer')
const colors = require('colors/safe')
const _ = require('lodash')
const os = require('os')
let installDir = path.resolve(__dirname, '../..')
const installDir = path.resolve(__dirname, '../..')
console.info(colors.yellow(
' __ __ _ _ _ _ \n' +
'/ / /\\ \\ (_) | _(_) (_)___ \n' +
'\\ \\/ \\/ / | |/ / | | / __| \n' +
' \\ /\\ /| | <| |_ | \\__ \\ \n' +
' \\/ \\/ |_|_|\\_\\_(_)/ |___/ \n' +
' |__/\n'))
// =====================================================
// INSTALLATION TASKS
// =====================================================
var ora = require('ora')({ text: 'Initializing...', spinner: 'dots12' }).start()
ora.text = 'Looking for running instances...'
pm2.connectAsync().then(() => {
const tasks = {
/**
* Stop and delete existing instances
*/
stopAndDeleteInstances () {
ora.text = 'Looking for running instances...'
return pm2.connectAsync().then(() => {
return pm2.describeAsync('wiki').then(() => {
ora.text = 'Stopping and deleting process from pm2...'
return pm2.deleteAsync('wiki')
}).catch(err => { // eslint-disable-line handle-callback-err
return true
}).finally(() => {
pm2.disconnect()
})
}).then(() => {
})
},
/**
* Check for sufficient memory
*/
checkRequirements () {
ora.text = 'Checking system requirements...'
if (os.totalmem() < 1024 * 1024 * 768) {
throw new Error('Not enough memory to install dependencies. Minimum is 768 MB.')
return Promise.reject(new Error('Not enough memory to install dependencies. Minimum is 768 MB.'))
} else {
return Promise.resolve(true)
}
return true
}).then(() => {
},
/**
* Install via local tarball if present
*/
let skipHttp = true
installFromLocal () {
let hasTarball = true
let tbPath = path.join(installDir, 'wiki-js.tar.gz')
return fs.accessAsync(tbPath)
.catch(err => { // eslint-disable-line handle-callback-err
skipHttp = false
hasTarball = false
}).then(() => {
if (skipHttp) {
if (hasTarball) {
ora.text = 'Local tarball found. Extracting...'
return new Promise((resolve, reject) => {
@ -70,34 +78,26 @@ pm2.connectAsync().then(() => {
return false
}
})
}).then((skipHttp) => {
},
/**
* Install via remote tarball
*/
if (skipHttp) { return true }
/**
* Fetch version from npm package
* Install from GitHub release download
*/
installFromRemote () {
// Fetch version from npm package
return fs.readJsonAsync('package.json').then((packageObj) => {
let versionGet = _.chain(packageObj.version).split('.').take(4).join('.')
let remoteURL = _.replace('https://github.com/Requarks/wiki/releases/download/v{0}/wiki-js.tar.gz', '{0}', versionGet)
return new Promise((resolve, reject) => {
/**
* Fetch tarball
*/
// Fetch tarball
ora.text = 'Looking for latest release...'
https.get(remoteURL, resp => {
if (resp.statusCode !== 200) {
return reject(new Error('Remote file not found'))
}
ora.text = 'Install tarball found. Downloading...'
ora.text = 'Remote wiki.js tarball found. Downloading...'
/**
* Extract tarball
*/
// Extract tarball
resp.pipe(zlib.createGunzip())
.pipe(tar.Extract({ path: installDir }))
.on('error', err => reject(err))
@ -108,7 +108,11 @@ pm2.connectAsync().then(() => {
})
})
})
}).then(() => {
},
/**
* Install npm dependencies
*/
installDependencies () {
ora.text = 'Installing Wiki.js npm dependencies...'
return exec.stdout('npm', ['install', '--only=production', '--no-optional'], {
cwd: installDir
@ -116,20 +120,20 @@ pm2.connectAsync().then(() => {
ora.text = 'Wiki.js npm dependencies installed successfully.'
return true
})
}).then(() => {
fs.accessAsync(path.join(installDir, 'config.yml')).then(() => {
},
/**
* Upgrade mode
* Create default config.yml file if new installation
*/
ensureConfigFile () {
return fs.accessAsync(path.join(installDir, 'config.yml')).then(() => {
// Is Upgrade
ora.succeed('Upgrade completed.')
console.info(colors.yellow('\n!!! IMPORTANT !!!'))
console.info(colors.yellow('Running the configuration wizard is optional but recommended after an upgrade to ensure your config file is using the latest available settings.'))
console.info(colors.yellow('Note that the contents of your config file will be displayed during the configuration wizard. It is therefor highly recommended to run the wizard on a non-publicly accessible port or skip this step completely.\n'))
return false
return true
}).catch(err => {
/**
* Install mode
*/
// Is New Install
if (err.code === 'ENOENT') {
ora.text = 'First-time install, creating a new config.yml...'
return fs.copyAsync(path.join(installDir, 'config.sample.yml'), path.join(installDir, 'config.yml')).then(() => {
@ -139,7 +143,9 @@ pm2.connectAsync().then(() => {
} else {
return err
}
}).then((isNewInstall) => {
})
},
startConfigurationWizard () {
if (process.stdout.isTTY) {
inquirer.prompt([{
type: 'list',
@ -192,9 +198,36 @@ pm2.connectAsync().then(() => {
} else {
console.info(colors.cyan('[WARNING] Non-interactive terminal detected. You must manually start the configuration wizard using the command: node wiki configure'))
}
}
}
// =====================================================
// INSTALL SEQUENCE
// =====================================================
console.info(colors.yellow(
' __ __ _ _ _ _ \n' +
'/ / /\\ \\ (_) | _(_) (_)___ \n' +
'\\ \\/ \\/ / | |/ / | | / __| \n' +
' \\ /\\ /| | <| |_ | \\__ \\ \n' +
' \\/ \\/ |_|_|\\_\\_(_)/ |___/ \n' +
' |__/\n'))
let ora = require('ora')({ text: 'Initializing...', spinner: 'dots12' }).start()
Promise.join(
tasks.stopAndDeleteInstances(),
tasks.checkRequirements()
).then(() => {
return tasks.installFromLocal().then(succeeded => {
return (!succeeded) ? tasks.installFromRemote() : true
})
}).then(() => {
return tasks.installDependencies()
}).then(() => {
return tasks.ensureConfigFile()
}).then(() => {
return tasks.startConfigurationWizard()
}).catch(err => {
ora.fail(err)
}).finally(() => {
pm2.disconnect()
})

View File

@ -29,7 +29,7 @@ block rootNavRight
block content
#page-type-view(data-entrypath=pageData.meta.path)
.container.is-fluid
.container.is-fluid.has-mkcontent
.columns.is-gapless
.column.is-narrow.is-hidden-touch.sidebar