From 20f9d9f94afc82ba0ec83953882e76cbf8a5489c Mon Sep 17 00:00:00 2001 From: James Allen Date: Sat, 22 Feb 2014 12:08:03 +0000 Subject: [PATCH] Add in check task to check that redis and latexmk are installed correctly --- server-ce/Gruntfile.coffee | 132 +++++++++++++++++++++++++++---------- server-ce/README.md | 5 ++ server-ce/package.json | 3 +- 3 files changed, 105 insertions(+), 35 deletions(-) diff --git a/server-ce/Gruntfile.coffee b/server-ce/Gruntfile.coffee index 0d12257428..275c356db4 100644 --- a/server-ce/Gruntfile.coffee +++ b/server-ce/Gruntfile.coffee @@ -1,7 +1,9 @@ fs = require "fs" spawn = require("child_process").spawn +exec = require("child_process").exec rimraf = require "rimraf" Path = require "path" +semver = require "semver" SERVICES = [{ name: "web" @@ -61,6 +63,7 @@ module.exports = (grunt) -> "Install tasks": ("install:#{service.name}" for service in SERVICES).concat(["install:all", "install"]) "Update tasks": ("update:#{service.name}" for service in SERVICES).concat(["update:all", "update"]) "Config tasks": ["install:config"] + "Checks": ["check", "check:redis", "check:latexmk"] for service in SERVICES do (service) -> @@ -82,48 +85,109 @@ module.exports = (grunt) -> grunt.registerTask 'help', 'Display this help list', 'availabletasks' grunt.registerTask 'default', 'run' -Helpers = - installService: (repo_src, dir, callback = (error) ->) -> - Helpers.cloneGitRepo repo_src, dir, (error) -> - return callback(error) if error? - Helpers.installNpmModules dir, (error) -> - return callback(error) if error? - Helpers.runGruntInstall dir, (error) -> - return callback(error) if error? - callback() + grunt.registerTask "check:redis", "Check that redis is installed and running", () -> + Helpers.checkRedis @async() + grunt.registerTask "check:latexmk", "Check that latexmk is installed", () -> + Helpers.checkLatexmk @async() + grunt.registerTask "check", "Check that you have the required dependencies installed", ["check:redis", "check:latexmk"] - updateService: (dir, callback = (error) ->) -> - Helpers.updateGitRepo dir, (error) -> - return callback(error) if error? - Helpers.installNpmModules dir, (error) -> + Helpers = + installService: (repo_src, dir, callback = (error) ->) -> + Helpers.cloneGitRepo repo_src, dir, (error) -> return callback(error) if error? - Helpers.runGruntInstall dir, (error) -> + Helpers.installNpmModules dir, (error) -> return callback(error) if error? - callback() + Helpers.runGruntInstall dir, (error) -> + return callback(error) if error? + callback() - cloneGitRepo: (repo_src, dir, callback = (error) ->) -> - if !fs.existsSync(dir) - proc = spawn "git", ["clone", repo_src, dir], stdio: "inherit" - proc.on "close", () -> + updateService: (dir, callback = (error) ->) -> + Helpers.updateGitRepo dir, (error) -> + return callback(error) if error? + Helpers.installNpmModules dir, (error) -> + return callback(error) if error? + Helpers.runGruntInstall dir, (error) -> + return callback(error) if error? + callback() + + cloneGitRepo: (repo_src, dir, callback = (error) ->) -> + if !fs.existsSync(dir) + proc = spawn "git", ["clone", repo_src, dir], stdio: "inherit" + proc.on "close", () -> + callback() + else + console.log "#{dir} already installed, skipping." callback() - else - console.log "#{dir} already installed, skipping." - callback() - updateGitRepo: (dir, callback = (error) ->) -> - proc = spawn "git", ["checkout", "master"], cwd: dir, stdio: "inherit" - proc.on "close", () -> - proc = spawn "git", ["pull"], cwd: dir, stdio: "inherit" + updateGitRepo: (dir, callback = (error) ->) -> + proc = spawn "git", ["checkout", "master"], cwd: dir, stdio: "inherit" + proc.on "close", () -> + proc = spawn "git", ["pull"], cwd: dir, stdio: "inherit" + proc.on "close", () -> + callback() + + installNpmModules: (dir, callback = (error) ->) -> + proc = spawn "npm", ["install"], stdio: "inherit", cwd: dir proc.on "close", () -> callback() - installNpmModules: (dir, callback = (error) ->) -> - proc = spawn "npm", ["install"], stdio: "inherit", cwd: dir - proc.on "close", () -> - callback() + runGruntInstall: (dir, callback = (error) ->) -> + proc = spawn "grunt", ["install"], stdio: "inherit", cwd: dir + proc.on "close", () -> + callback() + + checkRedis: (callback = (error) ->) -> + grunt.log.write "Checking Redis is running... " + exec "redis-cli info", (error, stdout, stderr) -> + if error? and error.message.match("Could not connect") + grunt.log.error "FAIL. Redis is not running" + return + else if error? + return callback(error) + else + m = stdout.match(/redis_version:(.*)/) + if !m? + grunt.log.error "FAIL." + grunt.log.error "Unknown redis version" + else + version = m[1] + if semver.gt(version, "2.6.0") + grunt.log.writeln "OK." + grunt.log.writeln "Running Redis version #{version}" + else + grunt.log.error "FAIL." + grunt.log.error "Redis version is too old (#{version}). Must be 2.6.0 or greater." + callback() + + checkLatexmk: (callback = (error) ->) -> + grunt.log.write "Checking latexmk is installed... " + exec "latexmk -version", (error, stdout, stderr) -> + if error? and error.message.match("command not found") + grunt.log.error "FAIL." + grunt.log.errorlns """ + Either latexmk is not installed or is not in your PATH. + + latexmk comes with TexLive 2013, and must be a version from 2013 or later. + This is a not a fatal error, but compiling will not work without latexmk + """ + else if error? + return callback(error) + else + m = stdout.match(/Version (.*)/) + if !m? + grunt.log.error "FAIL." + grunt.log.error "Unknown latexmk version" + else + version = m[1] + if semver.gt(version + ".0", "4.39.0") + grunt.log.writeln "OK." + grunt.log.writeln "Running latexmk version #{version}" + else + grunt.log.error "FAIL." + grunt.log.errorlns """ + latexmk version is too old (#{version}). Must be 4.39 or greater. + This is a not a fatal error, but compiling will not work without latexmk + """ + callback() - runGruntInstall: (dir, callback = (error) ->) -> - proc = spawn "grunt", ["install"], stdio: "inherit", cwd: dir - proc.on "close", () -> - callback() diff --git a/server-ce/README.md b/server-ce/README.md index a3b1750657..46259d0151 100644 --- a/server-ce/README.md +++ b/server-ce/README.md @@ -28,6 +28,11 @@ Next install all the node modules and ShareLaTeX services: $ npm install $ grunt install +Now check that your system is set up correctly to run ShareLaTeX (checks that you have +the required dependencies installed.) Watch out for any failures. + + $ grunt check + When that has finished, run ShareLaTeX with $ grunt run diff --git a/server-ce/package.json b/server-ce/package.json index ca6cb7b4f5..6b75122473 100644 --- a/server-ce/package.json +++ b/server-ce/package.json @@ -10,6 +10,7 @@ "grunt-bunyan": "~0.5.0", "grunt-execute": "~0.1.5", "grunt-available-tasks": "~0.4.1", - "grunt-concurrent": "~0.4.3" + "grunt-concurrent": "~0.4.3", + "semver": "~2.2.1" } }