| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var winston = require('winston'), | 
					
						
							|  |  |  | 	async = require('async'), | 
					
						
							|  |  |  | 	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; | 
					
						
							| 
									
										
										
										
											2015-02-23 14:57:22 -05:00
										 |  |  | 				if (isActive) { | 
					
						
							|  |  |  | 					db.sortedSetRemove('plugins:active', id, next); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					db.sortedSetCard('plugins:active', function(err, count) { | 
					
						
							|  |  |  | 						if (err) { | 
					
						
							|  |  |  | 							return next(err); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						db.sortedSetAdd('plugins:active', count, id, next);	 | 
					
						
							|  |  |  | 					});				 | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-12-26 19:17:37 -05:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			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); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-01-15 12:34:11 -05:00
										 |  |  | 			var type = installed ? 'uninstall' : 'install'; | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 			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) { | 
					
						
							| 
									
										
										
										
											2015-02-23 16:08:22 -05:00
										 |  |  | 					require('npm').load({}, next); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 				function(res, next) { | 
					
						
							| 
									
										
										
										
											2015-02-23 16:08:22 -05:00
										 |  |  | 					require('npm').commands[type](installed ? id : [id + '@' + (version || 'latest')], next); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			], function(err) { | 
					
						
							| 
									
										
										
										
											2015-01-15 12:34:11 -05:00
										 |  |  | 				if (err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-01-15 13:53:17 -05:00
										 |  |  | 				Plugins.fireHook('action:plugin.' + type, id); | 
					
						
							| 
									
										
										
										
											2015-01-15 12:34:11 -05:00
										 |  |  | 				callback(null, {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) { | 
					
						
							| 
									
										
										
										
											2015-02-23 16:08:22 -05:00
										 |  |  | 				require('npm').load({}, next); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(res, next) { | 
					
						
							| 
									
										
										
										
											2015-02-23 16:08:22 -05:00
										 |  |  | 				require('npm').commands.install([id + '@' + (version || 'latest')], next); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		], 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) { | 
					
						
							| 
									
										
										
										
											2015-02-23 14:57:22 -05:00
										 |  |  | 		db.isSortedSetMember('plugins:active', id, callback); | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-02-23 15:55:35 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Plugins.getActive = function(callback) { | 
					
						
							|  |  |  | 		db.getSortedSetRange('plugins:active', 0, -1, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-12-26 18:54:20 -05:00
										 |  |  | }; |