| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var winston = require('winston'), | 
					
						
							|  |  |  | 	async = require('async'), | 
					
						
							|  |  |  | 	npm = require('npm'), | 
					
						
							|  |  |  | 	path = require('path'), | 
					
						
							|  |  |  | 	fs = require('fs'), | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 	nconf = require('nconf'), | 
					
						
							|  |  |  | 	os = require('os'), | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	db = require('../database'), | 
					
						
							|  |  |  | 	meta = require('../meta'), | 
					
						
							|  |  |  | 	pubsub = require('../pubsub'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = function(Plugins) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 	if (nconf.get('isPrimary') === 'true') { | 
					
						
							|  |  |  | 		pubsub.on('plugins:toggleInstall', function(data) { | 
					
						
							|  |  |  | 			if (data.hostname !== os.hostname()) { | 
					
						
							|  |  |  | 				toggleInstall(data.id, data.version); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		pubsub.on('plugins:upgrade', function(data) { | 
					
						
							|  |  |  | 			if (data.hostname !== os.hostname()) { | 
					
						
							|  |  |  | 				upgrade(data.id, data.version); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 	Plugins.toggleActive = function(id, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-26 19:17:37 -05:00
										 |  |  | 		callback = callback || function() {}; | 
					
						
							|  |  |  | 		var isActive; | 
					
						
							|  |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				Plugins.isActive(id, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(_isActive, next) { | 
					
						
							|  |  |  | 				isActive = _isActive; | 
					
						
							|  |  |  | 				db[isActive ? 'setRemove' : 'setAdd']('plugins:active', id, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				meta.reloadRequired = true; | 
					
						
							|  |  |  | 				Plugins.fireHook(isActive ? 'action:plugin.deactivate' : 'action:plugin.activate', id); | 
					
						
							|  |  |  | 				next(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], function(err) { | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				winston.warn('[plugins] Could not toggle active state on plugin \'' + id + '\''); | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-12-26 19:17:37 -05:00
										 |  |  | 			callback(null, {id: id, active: !isActive}); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Plugins.toggleInstall = function(id, version, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 		pubsub.publish('plugins:toggleInstall', {hostname: os.hostname(), id: id, version: version}); | 
					
						
							|  |  |  | 		toggleInstall(id, version, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function toggleInstall(id, version, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 		Plugins.isInstalled(id, function(err, installed) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			async.waterfall([ | 
					
						
							|  |  |  | 				function(next) { | 
					
						
							|  |  |  | 					Plugins.isActive(id, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(active, next) { | 
					
						
							|  |  |  | 					if (active) { | 
					
						
							|  |  |  | 						Plugins.toggleActive(id, function(err, status) { | 
					
						
							|  |  |  | 							next(err); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					next(); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(next) { | 
					
						
							|  |  |  | 					npm.load({}, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(res, next) { | 
					
						
							|  |  |  | 					npm.commands[installed ? 'uninstall' : 'install'](installed ? id : [id + '@' + (version || 'latest')], next); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			], function(err) { | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 				callback(err, {id: id, installed: !installed}); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Plugins.upgrade = function(id, version, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 		pubsub.publish('plugins:upgrade', {hostname: os.hostname(), id: id, version: version}); | 
					
						
							|  |  |  | 		upgrade(id, version, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function upgrade(id, version, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				npm.load({}, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(res, next) { | 
					
						
							|  |  |  | 				npm.commands.install([id + '@' + (version || 'latest')], next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Plugins.isInstalled = function(id, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-26 20:18:05 -05:00
										 |  |  | 		var pluginDir = path.join(__dirname, '../../node_modules', id); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		fs.stat(pluginDir, function(err, stats) { | 
					
						
							|  |  |  | 			callback(null, err ? false : stats.isDirectory()); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Plugins.isActive = function(id, callback) { | 
					
						
							|  |  |  | 		db.isSetMember('plugins:active', id, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; |