2017-02-14 20:27:08 +00:00
'use strict'
2017-02-19 21:13:51 +00:00
const ora = require ( 'ora' ) ( { text : 'Initializing...' , spinner : 'dots12' } ) . start ( )
2017-02-14 20:27:08 +00:00
const Promise = require ( 'bluebird' )
2017-02-15 01:48:39 +00:00
const exec = require ( 'child_process' ) . exec
2017-02-14 20:27:08 +00:00
const fs = Promise . promisifyAll ( require ( 'fs-extra' ) )
const https = require ( 'follow-redirects' ) . https
const path = require ( 'path' )
const pm2 = Promise . promisifyAll ( require ( 'pm2' ) )
const tar = require ( 'tar' )
const zlib = require ( 'zlib' )
const _ = require ( 'lodash' )
let installDir = path . resolve ( _ _dirname , '../..' )
2017-02-16 17:49:56 +00:00
ora . text = 'Looking for running instances...'
pm2 . connectAsync ( ) . then ( ( ) => {
return pm2 . describeAsync ( 'wiki' ) . then ( ( ) => {
2017-02-19 21:13:51 +00:00
ora . text = 'Stopping and deleting process from pm2...'
2017-02-16 17:49:56 +00:00
return pm2 . deleteAsync ( 'wiki' )
} ) . catch ( err => { // eslint-disable-line handle-callback-err
return true
} )
} ) . then ( ( ) => {
/ * *
* 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 )
2017-02-14 20:27:08 +00:00
2017-02-16 17:49:56 +00:00
return new Promise ( ( resolve , reject ) => {
2017-02-14 20:27:08 +00:00
/ * *
2017-02-16 17:49:56 +00:00
* Fetch tarball
2017-02-14 20:27:08 +00:00
* /
2017-02-16 17:49:56 +00:00
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...'
/ * *
* Extract tarball
* /
resp . pipe ( zlib . createGunzip ( ) )
. pipe ( tar . Extract ( { path : installDir } ) )
. on ( 'error' , err => reject ( err ) )
. on ( 'end' , ( ) => {
ora . text = 'Tarball extracted successfully.'
resolve ( true )
} )
2017-02-14 20:27:08 +00:00
} )
} )
} )
2017-02-15 01:48:39 +00:00
} ) . then ( ( ) => {
return new Promise ( ( resolve , reject ) => {
ora . text = 'Installing Wiki.js npm dependencies...'
2017-03-12 04:38:47 +00:00
let npmInstallProc = exec ( 'npm install --only=production --no-optional' , {
2017-02-15 01:48:39 +00:00
cwd : installDir
} )
npmInstallProc . stdout . pipe ( process . stdout )
npmInstallProc . on ( 'error' , err => {
reject ( err )
} )
. on ( 'exit' , ( ) => {
ora . text = 'Wiki.js npm dependencies installed successfully.'
resolve ( true )
} )
} )
2017-02-14 20:27:08 +00:00
} ) . then ( ( ) => {
fs . accessAsync ( path . join ( installDir , 'config.yml' ) ) . then ( ( ) => {
/ * *
* Upgrade mode
* /
2017-02-16 17:49:56 +00:00
return new Promise ( ( resolve , reject ) => {
ora . text = 'Upgrade succeeded. Starting Wiki.js...'
2017-02-19 21:36:51 +00:00
let npmInstallProc = exec ( 'node wiki start' , {
2017-02-16 17:49:56 +00:00
cwd : installDir
} )
npmInstallProc . stdout . pipe ( process . stdout )
npmInstallProc . on ( 'error' , err => {
reject ( err )
} )
. on ( 'exit' , ( ) => {
ora . succeed ( 'Wiki.js has started. Upgrade completed.' )
resolve ( true )
2017-02-15 01:48:39 +00:00
} )
2017-02-14 20:27:08 +00:00
} )
} ) . catch ( err => {
/ * *
* Install mode
* /
if ( err . code === 'ENOENT' ) {
2017-02-15 01:48:39 +00:00
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 ( ( ) => {
ora . succeed ( 'Installation succeeded. You can now continue with the configuration steps. Check out https://docs.wiki.requarks.io/install for more info.' )
} )
2017-02-14 20:27:08 +00:00
} else {
return err
}
} )
} ) . catch ( err => {
ora . fail ( err )
2017-02-16 17:49:56 +00:00
} ) . finally ( ( ) => {
pm2 . disconnect ( )
2017-02-14 20:27:08 +00:00
} )