tooltwist
Version:
Tooltwist Command Line Interface
404 lines (347 loc) • 14.4 kB
JavaScript
/*
* Run the Tooltwist server.
* This prepares all the config files, then uses Gradle to do the actual build and run.
*/
var Git = require('git-wrapper');
var Log = require('./log'),
Config = require('./config'),
Templates = require("./templates"),
fs = require('fs'),
mkdirp = require('mkdirp'),
gradle = require('./gradle'),
Controller = require('./controller');
/*
* Run the server.
* If 'launchpad' is provided it will be used as a controller to generate and install.
*/
exports.phase1 = function(project) {
var wdproj = project;
if (Config.IS_CONTROLLER) {
Log.log('***************************************************************************')
Log.log('*** ***')
Log.log("*** PHASE 1 - Prepare and run the Designer ***")
Log.log('*** ***')
Log.log('***************************************************************************')
}
Log.info();
Log.info("Build the server for " + wdproj + '.')
/*
* Clone the webdesign project from git
*/
/*
* Parse the project file in the webdesign project, to find out other project dependencies
*/
var projectFile = Config.WEBDESIGN_DIR + "/" + wdproj + "/project.json";
var projects;
try {
projects = JSON.parse(fs.readFileSync(projectFile, 'utf8'));
} catch (err) {
Log.error('Error parsing ' + projectFile + ': ' + err)
process.exit(1)
}
var newProjects = [ ];
for (var n in projects) {
var v = projects[n]
if (typeof(v) == "string") {
// See if it is a gradle definition, e.g. "com.tooltwist:tooltwist:8.2-SNAPSHOT"
var parts = v.split(':');
if (parts.length == 3) {
newProjects.push({
project_name: n,
type: 'extension',
location: 'repo',
group: parts[0],
name: parts[1],
version: parts[2],
// use by templates
"extension_project?": true
});
} else {
Log.error("Cannot interpret definition for '" + n + "': " + v);
}
} else if (typeof(v) == "object") {
// Check the name is set
v.project_name = n;
if ( !v.name) {
v.name = n;
}
v['extension_project?'] = true;
newProjects.push(v);
} else {
Log.error("Not sure of type: " + n)
}
}
// Override the version numbers of the Tooltwist jars
for (var i = 0; i < newProjects.length; i++) {
var project = newProjects[i];
if (
project.type === 'extension'
&&
project.group === 'com.tooltwist'
&&
(
project.name === 'tooltwist' || project.name === 'ttWbd' || project.name === 'ttStd'
)
) {
project.version = Config.TOOLTWIST_VERSION
Log.info(' Override ' + project.group + ':' + project.name + ' to version ' + project.version);
}
}
// Display the projects
Log.info();
Log.info("Including the following extension projects:");
for (var i = 0; i < newProjects.length; i++) {
var p = newProjects[i]
Log.info(' ' + p.name)
}
// Create directories
Log.info();
Log.info("Creating directories and config files.");
mkdirp.sync(Config.HIDDEN_DIR + '/PHASE1');
mkdirp.sync(Config.HIDDEN_DIR + '/do_generate');
mkdirp.sync(Config.HIDDEN_DIR + '/PHASE2');
mkdirp.sync(Config.HIDDEN_DIR + '/do_install');
// mkdirp.sync(Config.HIDDEN_DIR + '/scripts');
mkdirp.sync(Config.TOOLTWIST_HOME + '/conf');
mkdirp.sync(Config.TOOLTWIST_HOME + '/bin');
mkdirp.sync(Config.WEBDESIGN_DIR + '/config/wbd');
mkdirp.sync(Config.EXTENSIONS_DIR + '/webdesign/config/wbd');
mkdirp.sync(Config.BUILD_DIR + '/src/main/webapp/WEB-INF');
mkdirp.sync(Config.BUILD_DIR + '/src/main/webapp/thumbnails');
mkdirp.sync(Config.BUILD_DIR + '/build/classes/main');
/*
* Choose credentials for the gradle repo.
* If a value is defined with the prefix 'property.', then we will
* interpret it as the name of a Gradle property to be used in
* build.gradle. If not then we'll make it a string.
*/
var RESOLVE_CONTEXTURL = 'http://repo.tooltwist.com/artifactory/';
var RESOLVE_REPO = 'tooltwist-all-in-one';
var REPO_USER = '""';
var REPO_PASSWORD = '""';
var config = Config.getConfig();
var prefix = 'property.';
if (config['designer']) {
var resolve_contextUrl = config['designer'].resolve_contextUrl;
if (resolve_contextUrl) {
if (resolve_contextUrl.indexOf(prefix) == 0) {
RESOLVE_CONTEXTURL = resolve_contextUrl.substring(prefix.length);
} else {
RESOLVE_CONTEXTURL = '"' + resolve_contextUrl + '"';
}
}
var resolve_repo = config['designer'].resolve_repo;
if (resolve_repo) {
if (resolve_repo.indexOf(prefix) == 0) {
RESOLVE_REPO = resolve_repo.substring(prefix.length);
} else {
RESOLVE_REPO = '"' + resolve_repo + '"';
}
}
var repository_user = config['designer'].repository_user;
if (repository_user) {
if (repository_user.indexOf(prefix) == 0) {
REPO_USER = repository_user.substring(prefix.length);
} else {
REPO_USER = '"' + repository_user + '"';
}
}
var repository_password = config['designer'].repository_password;
if (repository_password) {
if (repository_password.indexOf(prefix) == 0) {
REPO_PASSWORD = repository_password.substring(prefix.length);
} else {
REPO_PASSWORD = '"' + repository_password + '"';
}
}
Log.info();
Log.info(" RESOLVE_CONTEXTURL=" + RESOLVE_CONTEXTURL)
Log.info(" RESOLVE_REPO=" + RESOLVE_REPO)
Log.info(" REPO_USER=" + REPO_USER)
} else {
// Cannot proceed without this section
Log.fatal('Missing config.designer in tooltwist.js')
}
/*
* Overlay standard variables onto the config object,
* so they can be used by Mustache.
*/
var config = Config.getConfig();
// Standard variables
config.PROJECT_NAME = Config.PROJECT_NAME;
config.PROJECT_ROOT = Config.PROJECT_ROOT;
config.HIDDEN_DIR = Config.HIDDEN_DIR;
config.TOOLTWIST_HOME = Config.TOOLTWIST_HOME;
config.WEBDESIGN_DIR = Config.WEBDESIGN_DIR;
config.EXTENSIONS_DIR = Config.EXTENSIONS_DIR;
config.TEMPLATE_OVERRIDE_DIR = Config.TEMPLATE_OVERRIDE_DIR;
config.BUILD_DIR = Config.BUILD_DIR;
config.IS_CONTROLLER = Config.IS_CONTROLLER;
config.DEPLOY_FROM_LAUNCHPAD = (Config.getConfig().mode === 'controller');
config.TOOLTWIST_VERSION = Config.TOOLTWIST_VERSION;
// Other variables
config.WORK_DIR = Config.PROJECT_ROOT;
config.DESIGNER_DIR = Config.HIDDEN_DIR;
config.cmd_directory = Config.RESOURCES_DIR;
config.cmd_file = __filename;
config.projects = newProjects;
config.webdesign_project = wdproj;
// config.TTC_DEPLOY = process.env.TTC_DEPLOY;
// config.TTC_CONFIG = process.env.TTC_CONFIG;
config.LAUNCHPAD = Controller.LAUNCHPAD_NAME;
// config.launchpad = Controller.LAUNCHPAD_NAME;
config.IMAGEMAGICK_HOME = Config.IMAGEMAGICK_HOME;
config.HTTP_PORT = Config.HTTP_PORT;
config.STOP_PORT = Config.STOP_PORT;
config.AJP_PORT = Config.AJP_PORT;
config.RESOLVE_CONTEXTURL = RESOLVE_CONTEXTURL;
config.RESOLVE_REPO = RESOLVE_REPO;
config.REPO_USER = REPO_USER;
config.REPO_PASSWORD = REPO_PASSWORD;
config.FIP_SOURCE_UUID = Config.FIP_SOURCE_UUID;
config.FIP_DESTINATION_UUID = Config.FIP_DESTINATION_UUID;
config.FIP_DESTINATION_PASSPHRASE = Config.FIP_DESTINATION_PASSPHRASE;
// Some of these are from environment variables used by v8.1 scripts
// "GENERATOR_DESCRIPTION" = Controller.GENERATOR_DESCRIPTION;
// "GENERATOR_HTTP_PORT" = Controller.GENERATOR_HTTP_PORT;
// "GENERATOR_HTTPS_PORT" = Controller.GENERATOR_HTTPS_PORT;
// "GENERATOR_SERVER_PORT" = Controller.GENERATOR_SERVER_PORT;
// "GENERATOR_AJP_PORT" = Controller.GENERATOR_AJP_PORT;
// "GENERATOR_DISABLE" = Controller.GENERATOR_DISABLE;
// "GENERATOR_INSTALL_TOMCAT" = Controller.GENERATOR_INSTALL_TOMCAT;
// "GENERATOR_IMAGEMAGICK_HOME" = Controller.GENERATOR_IMAGEMAGICK_HOME;
// "PRODUCTION_DESCRIPTION" = Controller.PRODUCTION_DESCRIPTION;
// "PRODUCTION_IS_GROUP" = Controller.PRODUCTION_IS_GROUP;
// "PRODUCTION_SERVER_HOME" = Controller.PRODUCTION_SERVER_HOME;
// "PRODUCTION_WEBAPP_NAME" = Controller.PRODUCTION_WEBAPP_NAME;
// "PRODUCTION_HTTP_PORT" = Controller.PRODUCTION_HTTP_PORT;
// "PRODUCTION_HTTPS_PORT" = Controller.PRODUCTION_HTTPS_PORT;
// "PRODUCTION_SERVER_PORT" = Controller.PRODUCTION_SERVER_PORT;
// "PRODUCTION_AJP_PORT" = Controller.PRODUCTION_AJP_PORT;
// "PRODUCTION_WEBAPPS_DIR" = Controller.PRODUCTION_WEBAPPS_DIR;
// "PRODUCTION_TOMCAT_HOME" = Controller.PRODUCTION_TOMCAT_HOME;
// "PRODUCTION_INSTALL_CMD" = Controller.PRODUCTION_INSTALL_CMD;
// "PRODUCTION_INSTALL_METHOD" = Controller.PRODUCTION_INSTALL_METHOD;
// "PRODUCTION_SERVER" = Controller.PRODUCTION_SERVER;
// "PRODUCTION_USERNAME" = Controller.PRODUCTION_USERNAME;
// "PRODUCTION_PASSWORD" = Controller.PRODUCTION_PASSWORD;
// "PRODUCTION_INSTALL_TOMCAT" = Controller.PRODUCTION_INSTALL_TOMCAT;
// "PRODUCTION_IMAGEMAGICK_HOME" = Controller.PRODUCTION_IMAGEMAGICK_HOME;
// "PRODUCTION_SSH_PORT" = Controller.PRODUCTION_SSH_PORT;
// "PRODUCTION_FIP_PORT" = Controller.PRODUCTION_FIP_PORT;
// "WEBDESIGN_PAYLOAD" = WEBDESIGN_PAYLOAD;
// "WEBDESIGN_VERSION" = WEBDESIGN_VERSION;
// "WEBDESIGN_REMOTEURL = WEBDESIGN_REMOTEURL;
// Pass debug, info and quiet parameters on to the generator
if (Log.getLevel() == Log.DEBUG){
config.GENERATE_OPTIONS = " -d";
} else if (Log.getLevel() == Log.INFO){
config.GENERATE_OPTIONS = " -i";
} else if (Log.getLevel() == Log.QUIET){
config.GENERATE_OPTIONS = " -q";
}
Log.log();
Log.log('Creating build and config files.')
//
var defaultTemplateDir = Config.RESOURCES_DIR + '/templates';
Templates.copyTemplate(defaultTemplateDir, 'template.build.gradle', 'PHASE1/ttsvr/build.gradle', config)
Templates.copyTemplate(defaultTemplateDir, 'template.web.xml', 'PHASE1/ttsvr/src/main/webapp/WEB-INF/web.xml', config)
// Config files
Templates.copyTemplate(defaultTemplateDir, 'template.filemap.xml', 'site-conf/conf/filemap.xml', config)
Templates.copyTemplate(defaultTemplateDir, 'template.logback.xml', 'site-conf/conf/logback.xml', config)
Templates.copyTemplate(defaultTemplateDir, 'template.tooltwist.xml', 'site-conf/conf/tooltwist.xml', config)
Templates.copyTemplate(defaultTemplateDir, 'template.wbd.conf', 'site-conf/conf/wbd.conf', config)
/*
// Files used by Grunt
Templates.copyTemplate(defaultTemplateDir, 'PHASE2/'+Config.MODE+'-package.json', 'PHASE2/package.json', config)
Templates.copyTemplate(defaultTemplateDir, 'PHASE2/'+Config.MODE+'-Gruntfile.js', 'PHASE2/Gruntfile.js', config)
// InstallerUtil
// Save the configuration as JSON into the install directory, for use by InstallerUtil.
Templates.copyTemplate(defaultTemplateDir, 'install/template.build.gradle', 'do_install/build.gradle', config)
Templates.copyTemplate(defaultTemplateDir, 'install/template.rules', 'do_install/rules', config)
var configJson = JSON.stringify(Config.getConfig(), null, 2);
fs.writeFileSync(Config.HIDDEN_DIR + '/do_install/tooltwistJsAsJson.json', configJson)
*/
// Ruby files (ARE THESE USED?) ZZZZZ
/*
Templates.copyTemplate(defaultTemplateDir, 'scripts/generate.sh', 'scripts/generate.sh', config)
Templates.copyTemplate(defaultTemplateDir, 'scripts/generate.rb', 'scripts/generate.rb', config)
Templates.copyTemplate(defaultTemplateDir, 'scripts/lib_trollop.rb', 'scripts/lib_trollop.rb', config)
Templates.copyTemplate(defaultTemplateDir, 'scripts/controller_mail.rb', 'scripts/controller_mail.rb', config)
Templates.copyTemplate(defaultTemplateDir, 'scripts/controller_misc.rb', 'scripts/controller_misc.rb', config)
Templates.copyTemplate(defaultTemplateDir, 'scripts/controller_phase.rb', 'scripts/controller_phase.rb', config)
Templates.copyTemplate(defaultTemplateDir, 'scripts/controller_launchpad.rb', 'scripts/controller_launchpad.rb', config)
*/
// @Deprecated
//copyTemplate(defaultTemplateDir, 'template.wbd.conf', 'extension-projects/webdesign/config/wbd/wbd.conf', config)
// Controller-specific files
if (Config.getConfig().mode === 'controller' || Config.getConfig().mode === 'deploy') {
mkdirp.sync(Config.HIDDEN_DIR + '/do_generate/work');
mkdirp.sync(Config.HIDDEN_DIR + '/do_generate/logs');
mkdirp.sync(Controller.IMAGE_DIR);
mkdirp.sync(Controller.IMAGE_DIR + '/webdesign-projects/config');
fs.writeFileSync(Controller.IMAGE_DIR + '/webdesign-projects/config/_empty', '')
// Templates.copyTemplate(defaultTemplateDir, 'image/template.fip-source', Controller.IMAGE_DIR + '/.fip-source', config)
}
// Let the plugin do something
Config.plugin.beforePhase2();
// Start gradle
// Within this function it will call functions in the plugin for this mode.
gradle.runGradle(
/*
function(status){
/ *
* We get here once the Tomcat server has been started.
* /
// Display a nice message for Designer users.
if ( !Config.IS_CONTROLLER){
//Log.log();
Log.log(' (Server can be stopped with Control-C)');
Log.log();
Log.log();
Log.log();
Log.log('\t\t THE SERVER IS NOW RUNNING.')
Log.log();
Log.log('\t\t http://localhost:' + Config.HTTP_PORT + '/ttsvr/login');
Log.log();
Log.log();
Log.log();
}
Log.log(' Default log file is ' + Config.HIDDEN_DIR + '/tooltwist.log')
},
function(status) {
/*
* Gradle Finished callback.
* /
Log.debug("GRADLE FINISHED (" + status + ")")
// Check that the Gradle operations completed.
if (status !== 0) {
// Display a message and bomb out.
Log.fatalError("Gradle finished with exit status " + status);
} else {
// Clean exit
console.log(' ')
console.log(' ### # # ')
console.log(' # # # # ')
console.log(' # # # # ')
console.log(' # # ### ')
console.log(' # # # # ')
console.log(' # # # # ')
console.log(' ### # # ')
console.log(' ')
}
//return finishedCallback(status);
if (Config.IS_CONTROLLER) {
// We're in Controller mode.
// - Run Grunt to copy files to the image/tomcat/webapps/ttsvr
// - Run InstallerUtil to copy files to the remote server
// Controller.runGrunt(function() {
// Controller.transfer(function() {
// Log.info('Transfer complete')
process.exit(0)
// });
// })
}
}*/
);
};