From e3c0200f73d919d3a5db8a54c0624dd6aaa4a874 Mon Sep 17 00:00:00 2001 From: kirrg001 <katharina.irrgang@googlemail.com> Date: Tue, 13 Sep 2016 17:05:52 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A5=20=20remove=20startup=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs #6982 - we will execute the startup checks in Ghost-CLI [ci skip] --- core/server/utils/startup-check.js | 276 ----------------------------- 1 file changed, 276 deletions(-) delete mode 100644 core/server/utils/startup-check.js diff --git a/core/server/utils/startup-check.js b/core/server/utils/startup-check.js deleted file mode 100644 index a24009a01d..0000000000 --- a/core/server/utils/startup-check.js +++ /dev/null @@ -1,276 +0,0 @@ -var packages = require('../../../package.json'), - path = require('path'), - crypto = require('crypto'), - fs = require('fs'), - mode = process.env.NODE_ENV === undefined ? 'development' : process.env.NODE_ENV, - appRoot = path.resolve(__dirname, '../../../'), - configFilePath = process.env.GHOST_CONFIG || path.join(appRoot, 'config.js'), - checks, - exitCodes = { - NODE_VERSION_UNSUPPORTED: 231, - NODE_ENV_CONFIG_MISSING: 232, - DEPENDENCIES_MISSING: 233, - CONTENT_PATH_NOT_ACCESSIBLE: 234, - CONTENT_PATH_NOT_WRITABLE: 235, - SQLITE_DB_NOT_WRITABLE: 236, - BUILT_FILES_DO_NOT_EXIST: 237 - }; - -checks = { - check: function check() { - this.nodeVersion(); - this.nodeEnv(); - this.packages(); - this.contentPath(); - this.mail(); - this.sqlite(); - this.builtFilesExist(); - }, - - // Make sure the node version is supported - nodeVersion: function checkNodeVersion() { - // Tell users if their node version is not supported, and exit - var semver = require('semver'); - - if (process.env.GHOST_NODE_VERSION_CHECK !== 'false' && - !semver.satisfies(process.versions.node, packages.engines.node)) { - console.error('\x1B[31mERROR: Unsupported version of Node'); - console.error('\x1B[31mGhost needs Node version ' + packages.engines.node + - ' you are using version ' + process.versions.node + '\033[0m\n'); - console.error('\x1B[32mPlease see http://support.ghost.org/supported-node-versions/ for more information\033[0m'); - - process.exit(exitCodes.NODE_VERSION_UNSUPPORTED); - } - }, - - nodeEnv: function checkNodeEnvState() { - // Check if config path resolves, if not check for NODE_ENV in config.example.js prior to copy - var fd, - configFile, - config; - - try { - fd = fs.openSync(configFilePath, 'r'); - fs.closeSync(fd); - } catch (e) { - configFilePath = path.join(appRoot, 'config.example.js'); - } - - configFile = require(configFilePath); - config = configFile[mode]; - - if (!config) { - console.error('\x1B[31mERROR: Cannot find the configuration for the current NODE_ENV: ' + - process.env.NODE_ENV + '\033[0m\n'); - console.error('\x1B[32mEnsure your config.js has a section for the current NODE_ENV value' + - ' and is formatted properly.\033[0m'); - - process.exit(exitCodes.NODE_ENV_CONFIG_MISSING); - } - }, - - // Make sure package.json dependencies have been installed. - packages: function checkPackages() { - if (mode !== 'production' && mode !== 'development') { - return; - } - - var errors = []; - - Object.keys(packages.dependencies).forEach(function (p) { - try { - require.resolve(p); - } catch (e) { - errors.push(e.message); - } - }); - - if (!errors.length) { - return; - } - - errors = errors.join('\n '); - - console.error('\x1B[31mERROR: Ghost is unable to start due to missing dependencies:\033[0m\n ' + errors); - console.error('\x1B[32m\nPlease run `npm install --production` and try starting Ghost again.'); - console.error('\x1B[32mHelp and documentation can be found at http://support.ghost.org.\033[0m\n'); - - process.exit(exitCodes.DEPENDENCIES_MISSING); - }, - - // Check content path permissions - contentPath: function checkContentPaths() { - if (mode !== 'production' && mode !== 'development') { - return; - } - - var configFile, - config, - contentPath, - contentSubPaths = ['apps', 'data', 'images', 'themes'], - fd, - errorHeader = '\x1B[31mERROR: Unable to access Ghost\'s content path:\033[0m', - errorHelp = '\x1B[32mCheck that the content path exists and file system permissions are correct.' + - '\nHelp and documentation can be found at http://support.ghost.org.\033[0m'; - - // Get the content path to test. If it's defined in config.js use that, if not use the default - try { - configFile = require(configFilePath); - config = configFile[mode]; - - if (config && config.paths && config.paths.contentPath) { - contentPath = config.paths.contentPath; - } else { - contentPath = path.join(appRoot, 'content'); - } - } catch (e) { - // If config.js doesn't exist yet, check the default content path location - contentPath = path.join(appRoot, 'content'); - } - - // Use all sync io calls so that we stay in this function until all checks are complete - - // Check the root content path - try { - fd = fs.openSync(contentPath, 'r'); - fs.closeSync(fd); - } catch (e) { - console.error(errorHeader); - console.error(' ' + e.message); - console.error('\n' + errorHelp); - - process.exit(exitCodes.CONTENT_PATH_NOT_ACCESSIBLE); - } - - // Check each of the content path subdirectories - try { - contentSubPaths.forEach(function (sub) { - var dir = path.join(contentPath, sub), - randomFile = path.join(dir, crypto.randomBytes(8).toString('hex')); - - fd = fs.openSync(dir, 'r'); - fs.closeSync(fd); - - // Check write access to directory by attempting to create a random file - fd = fs.openSync(randomFile, 'wx+'); - fs.closeSync(fd); - fs.unlinkSync(randomFile); - }); - } catch (e) { - console.error(errorHeader); - console.error(' ' + e.message); - console.error('\n' + errorHelp); - - process.exit(exitCodes.CONTENT_PATH_NOT_WRITABLE); - } - }, - - // Make sure sqlite3 database is available for read/write - sqlite: function checkSqlite() { - if (mode !== 'production' && mode !== 'development') { - return; - } - - var configFile, - config, - appRoot = path.resolve(__dirname, '../../../'), - dbPath, - fd; - - try { - configFile = require(configFilePath); - config = configFile[mode]; - - // Abort check if database type is not sqlite3 - if (config && config.database && config.database.client !== 'sqlite3') { - return; - } - - if (config && config.database && config.database.connection) { - dbPath = config.database.connection.filename; - } - } catch (e) { - // If config.js doesn't exist, use the default path - dbPath = path.join(appRoot, 'content', 'data', mode === 'production' ? 'ghost.db' : 'ghost-dev.db'); - } - - // Check for read/write access on sqlite db file - try { - fd = fs.openSync(dbPath, 'r+'); - fs.closeSync(fd); - } catch (e) { - // Database file not existing is not an error as sqlite will create it. - if (e.code === 'ENOENT') { - return; - } - - console.error('\x1B[31mERROR: Unable to open sqlite3 database file for read/write\033[0m'); - console.error(' ' + e.message); - console.error('\n\x1B[32mCheck that the sqlite3 database file permissions allow read and write access.'); - console.error('Help and documentation can be found at http://support.ghost.org.\033[0m'); - - process.exit(exitCodes.SQLITE_DB_NOT_WRITABLE); - } - }, - - mail: function checkMail() { - var configFile, - config; - - try { - configFile = require(configFilePath); - config = configFile[mode]; - } catch (e) { - configFilePath = path.join(appRoot, 'config.example.js'); - } - - if (!config.mail || !config.mail.transport) { - console.error('\x1B[31mWARNING: Ghost is attempting to use a direct method to send email. \nIt is recommended that you explicitly configure an email service.\033[0m'); - console.error('\x1B[32mHelp and documentation can be found at http://support.ghost.org/mail.\033[0m\n'); - } - }, - - builtFilesExist: function builtFilesExist() { - var configFile, - config, - location, - fileNames = ['ghost.js', 'vendor.js', 'ghost.css', 'vendor.css']; - - try { - configFile = require(configFilePath); - config = configFile[mode]; - - if (config.paths && config.paths.clientAssets) { - location = config.paths.clientAssets; - } else { - location = path.join(appRoot, '/core/built/assets/'); - } - } catch (e) { - location = path.join(appRoot, '/core/built/assets/'); - } - - if (process.env.NODE_ENV === 'production') { - // Production uses `.min` files - fileNames = fileNames.map(function (file) { - return file.replace('.', '.min.'); - }); - } - - function checkExist(fileName) { - try { - fs.statSync(fileName); - } catch (e) { - console.error('\x1B[31mERROR: Javascript files have not been built.\033[0m'); - console.error('\n\x1B[32mPlease read the getting started instructions at:'); - console.error('https://github.com/TryGhost/Ghost#getting-started\033[0m'); - process.exit(exitCodes.BUILT_FILES_DO_NOT_EXIST); - } - } - - fileNames.forEach(function (fileName) { - checkExist(location + fileName); - }); - } -}; - -module.exports = checks;