@ -24,7 +24,6 @@ module.exports = () => {
const yaml = require ( 'js-yaml' )
const _ = require ( 'lodash' )
const cfgHelper = require ( './helpers/config' )
const filesize = require ( 'filesize.js' )
const crypto = Promise . promisifyAll ( require ( 'crypto' ) )
// ----------------------------------------
@ -76,174 +75,6 @@ module.exports = () => {
} )
} )
/ * *
* Perform basic system checks
* /
app . post ( '/syscheck' , ( req , res ) => {
WIKI . telemetry . enabled = ( req . body . telemetry === true )
WIKI . telemetry . sendEvent ( 'setup' , 'start' )
Promise . mapSeries ( [
( ) => {
const semver = require ( 'semver' )
if ( ! semver . satisfies ( semver . clean ( process . version ) , '>=8.9.0' ) ) {
throw new Error ( 'Node.js version is too old. Minimum is 8.9.0.' )
}
return {
title : 'Node.js ' + process . version + ' detected.' ,
subtitle : ' Minimum is 8.9.0.'
}
} ,
( ) => {
return Promise . try ( ( ) => {
require ( 'crypto' )
} ) . catch ( err => {
throw new Error ( 'Crypto Node.js module is not available.' )
} ) . return ( {
title : 'Node.js Crypto module is available.' ,
subtitle : 'Crypto module is required.'
} )
} ,
( ) => {
const exec = require ( 'child_process' ) . exec
const semver = require ( 'semver' )
return new Promise ( ( resolve , reject ) => {
exec ( 'git --version' , ( err , stdout , stderr ) => {
if ( err || stdout . length < 3 ) {
reject ( new Error ( 'Git is not installed or not reachable from PATH.' ) )
}
let gitver = _ . head ( stdout . match ( /[\d]+\.[\d]+(\.[\d]+)?/gi ) )
if ( ! gitver || ! semver . satisfies ( semver . clean ( gitver ) , '>=2.7.4' ) ) {
reject ( new Error ( 'Git version is too old. Minimum is 2.7.4.' ) )
}
resolve ( {
title : 'Git ' + gitver + ' detected.' ,
subtitle : 'Minimum is 2.7.4.'
} )
} )
} )
} ,
( ) => {
const os = require ( 'os' )
if ( os . totalmem ( ) < 1000 * 1000 * 768 ) {
throw new Error ( 'Not enough memory. Minimum is 768 MB.' )
}
return {
title : filesize ( os . totalmem ( ) ) + ' of system memory available.' ,
subtitle : 'Minimum is 768 MB.'
}
} ,
( ) => {
let fs = require ( 'fs' )
return Promise . try ( ( ) => {
fs . accessSync ( path . join ( WIKI . ROOTPATH , 'config.yml' ) , ( fs . constants || fs ) . W _OK )
} ) . catch ( err => {
throw new Error ( 'config.yml file is not writable by Node.js process or was not created properly.' )
} ) . return ( {
title : 'config.yml is writable by the setup process.' ,
subtitle : 'Setup will write to this file.'
} )
}
] , test => test ( ) ) . then ( results => {
res . json ( { ok : true , results } )
} ) . catch ( err => {
res . json ( { ok : false , error : err . message } )
} )
} )
/ * *
* Check the Git connection
* /
app . post ( '/gitcheck' , ( req , res ) => {
WIKI . telemetry . sendEvent ( 'setup' , 'gitcheck' )
const exec = require ( 'execa' )
const url = require ( 'url' )
const dataDir = path . resolve ( WIKI . ROOTPATH , cfgHelper . parseConfigValue ( req . body . pathData ) )
const gitDir = path . resolve ( WIKI . ROOTPATH , cfgHelper . parseConfigValue ( req . body . pathRepo ) )
let gitRemoteUrl = ''
if ( req . body . gitUseRemote === true ) {
let urlObj = url . parse ( cfgHelper . parseConfigValue ( req . body . gitUrl ) )
if ( req . body . gitAuthType === 'basic' ) {
urlObj . auth = req . body . gitAuthUser + ':' + req . body . gitAuthPass
}
gitRemoteUrl = url . format ( urlObj )
}
Promise . mapSeries ( [
( ) => {
return fs . ensureDir ( dataDir ) . then ( ( ) => 'Data directory path is valid.' )
} ,
( ) => {
return fs . ensureDir ( gitDir ) . then ( ( ) => 'Git directory path is valid.' )
} ,
( ) => {
return exec . stdout ( 'git' , [ 'init' ] , { cwd : gitDir } ) . then ( result => {
return 'Local git repository has been initialized.'
} )
} ,
( ) => {
if ( req . body . gitUseRemote === false ) { return false }
return exec . stdout ( 'git' , [ 'config' , '--local' , 'user.name' , 'Wiki' ] , { cwd : gitDir } ) . then ( result => {
return 'Git Signature Name has been set successfully.'
} )
} ,
( ) => {
if ( req . body . gitUseRemote === false ) { return false }
return exec . stdout ( 'git' , [ 'config' , '--local' , 'user.email' , req . body . gitServerEmail ] , { cwd : gitDir } ) . then ( result => {
return 'Git Signature Name has been set successfully.'
} )
} ,
( ) => {
if ( req . body . gitUseRemote === false ) { return false }
return exec . stdout ( 'git' , [ 'config' , '--local' , '--bool' , 'http.sslVerify' , req . body . gitAuthSSL ] , { cwd : gitDir } ) . then ( result => {
return 'Git SSL Verify flag has been set successfully.'
} )
} ,
( ) => {
if ( req . body . gitUseRemote === false ) { return false }
if ( _ . includes ( [ 'sshenv' , 'sshdb' ] , req . body . gitAuthType ) ) {
req . body . gitAuthSSHKey = path . join ( dataDir , 'ssh/key.pem' )
}
if ( _ . startsWith ( req . body . gitAuthType , 'ssh' ) ) {
return exec . stdout ( 'git' , [ 'config' , '--local' , 'core.sshCommand' , 'ssh -i "' + req . body . gitAuthSSHKey + '" -o StrictHostKeyChecking=no' ] , { cwd : gitDir } ) . then ( result => {
return 'Git SSH Private Key path has been set successfully.'
} )
} else {
return false
}
} ,
( ) => {
if ( req . body . gitUseRemote === false ) { return false }
return exec . stdout ( 'git' , [ 'remote' , 'rm' , 'origin' ] , { cwd : gitDir } ) . catch ( err => {
if ( _ . includes ( err . message , 'No such remote' ) || _ . includes ( err . message , 'Could not remove' ) ) {
return true
} else {
throw err
}
} ) . then ( ( ) => {
return exec . stdout ( 'git' , [ 'remote' , 'add' , 'origin' , gitRemoteUrl ] , { cwd : gitDir } ) . then ( result => {
return 'Git Remote was added successfully.'
} )
} )
} ,
( ) => {
if ( req . body . gitUseRemote === false ) { return false }
return exec . stdout ( 'git' , [ 'pull' , 'origin' , req . body . gitBranch ] , { cwd : gitDir } ) . then ( result => {
return 'Git Pull operation successful.'
} )
}
] , step => { return step ( ) } ) . then ( results => {
return res . json ( { ok : true , results : _ . without ( results , false ) } )
} ) . catch ( err => {
let errMsg = ( err . stderr ) ? err . stderr . replace ( /(error:|warning:|fatal:)/gi , '' ) . replace ( / \s+/g , ' ' ) : err . message
res . json ( { ok : false , error : errMsg } )
} )
} )
/ * *
* Finalize
* /
@ -263,13 +94,6 @@ module.exports = () => {
let confRaw = await fs . readFileAsync ( path . join ( WIKI . ROOTPATH , 'config.yml' ) , 'utf8' )
let conf = yaml . safeLoad ( confRaw )
conf . port = req . body . port
conf . paths . data = req . body . pathData
conf . paths . content = req . body . pathContent
confRaw = yaml . safeDump ( conf )
await fs . writeFileAsync ( path . join ( WIKI . ROOTPATH , 'config.yml' ) , confRaw )
// Create directory structure
await fs . ensureDir ( conf . paths . data )
await fs . ensureDir ( path . join ( conf . paths . data , 'cache' ) )
@ -283,16 +107,13 @@ module.exports = () => {
_ . set ( WIKI . config , 'lang.autoUpdate' , true )
_ . set ( WIKI . config , 'lang.namespacing' , false )
_ . set ( WIKI . config , 'lang.namespaces' , [ ] )
_ . set ( WIKI . config , 'paths.content' , req . body . pathContent )
_ . set ( WIKI . config , 'paths.data' , req . body . pathData )
_ . set ( WIKI . config , 'port' , req . body . port )
_ . set ( WIKI . config , 'public' , req . body . public === 'true' )
_ . set ( WIKI . config , 'public' , false )
_ . set ( WIKI . config , 'sessionSecret' , ( await crypto . randomBytesAsync ( 32 ) ) . toString ( 'hex' ) )
_ . set ( WIKI . config , 'telemetry.isEnabled' , req . body . telemetry === 'true' )
_ . set ( WIKI . config , 'telemetry.clientId' , WIKI . telemetry . cid )
_ . set ( WIKI . config , 'theming.theme' , 'default' )
_ . set ( WIKI . config , 'theming.darkMode' , false )
_ . set ( WIKI . config , 'title' , req . body . title )
_ . set ( WIKI . config , 'title' , 'Wiki.js' )
// Save config to DB
WIKI . logger . info ( 'Persisting config to DB...' )
@ -325,6 +146,9 @@ module.exports = () => {
await WIKI . models . editors . refreshEditorsFromDisk ( )
await WIKI . models . editors . query ( ) . patch ( { isEnabled : true } ) . where ( 'key' , 'markdown' )
// Load renderers
await WIKI . models . renderers . refreshRenderersFromDisk ( )
// Load storage targets
await WIKI . models . storage . refreshTargetsFromDisk ( )
@ -367,7 +191,7 @@ module.exports = () => {
WIKI . logger . info ( 'Setup is complete!' )
res . json ( {
ok : true ,
redirectPath : WIKI . config . site . path ,
redirectPath : '/' ,
redirectPort : WIKI . config . port
} ) . end ( )