forked from coolaj86/telebit.js
		
	node-based install launcher tested on macOS
This commit is contained in:
		
							parent
							
								
									d85682ff7f
								
							
						
					
					
						commit
						5eb4cdefb7
					
				| @ -408,6 +408,7 @@ function serveControlsHelper() { | |||||||
|   // mask is so that processes owned by other users
 |   // mask is so that processes owned by other users
 | ||||||
|   // can speak to this process, which is probably root-owned
 |   // can speak to this process, which is probably root-owned
 | ||||||
|   var oldUmask = process.umask(0x0000); |   var oldUmask = process.umask(0x0000); | ||||||
|  |   require('mkdirp').sync(path.resolve(state._ipc.path, '..')); | ||||||
|   controlServer.listen({ |   controlServer.listen({ | ||||||
|     path: state._ipc.path |     path: state._ipc.path | ||||||
|   , writableAll: true |   , writableAll: true | ||||||
|  | |||||||
| @ -17,9 +17,9 @@ | |||||||
| 		<key>TELEBIT_PATH</key> | 		<key>TELEBIT_PATH</key> | ||||||
| 		<string>{TELEBIT_PATH}</string> | 		<string>{TELEBIT_PATH}</string> | ||||||
| 		<key>NODE_PATH</key> | 		<key>NODE_PATH</key> | ||||||
| 		<string>{TELEBIT_PATH}/lib/node_modules</string> | 		<string>{NODE_PATH}</string> | ||||||
| 		<key>NPM_CONFIG_PREFIX</key> | 		<key>NPM_CONFIG_PREFIX</key> | ||||||
| 		<string>{TELEBIT_PATH}</string> | 		<string>{NPM_CONFIG_PREFIX}</string> | ||||||
| 	</dict> | 	</dict> | ||||||
| 
 | 
 | ||||||
| 	<key>UserName</key> | 	<key>UserName</key> | ||||||
|  | |||||||
| @ -19,9 +19,9 @@ | |||||||
| 		<key>TELEBIT_PATH</key> | 		<key>TELEBIT_PATH</key> | ||||||
| 		<string>{TELEBIT_PATH}</string> | 		<string>{TELEBIT_PATH}</string> | ||||||
| 		<key>NODE_PATH</key> | 		<key>NODE_PATH</key> | ||||||
| 		<string>{TELEBIT_PATH}/lib/node_modules</string> | 		<string>{NODE_PATH}</string> | ||||||
| 		<key>NPM_CONFIG_PREFIX</key> | 		<key>NPM_CONFIG_PREFIX</key> | ||||||
| 		<string>{TELEBIT_PATH}</string> | 		<string>{NPM_CONFIG_PREFIX}</string> | ||||||
| 	</dict> | 	</dict> | ||||||
| 
 | 
 | ||||||
| 	<!-- | 	<!-- | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ module.exports.install = function (things) { | |||||||
|   things = things || {}; |   things = things || {}; | ||||||
|   // in some future version we can take this file out
 |   // in some future version we can take this file out
 | ||||||
|   // and accept process.env from things
 |   // and accept process.env from things
 | ||||||
|   var installLauncher = require('./install-launcher'); |   var installLauncher = require('./template-launcher'); | ||||||
| 
 | 
 | ||||||
|   // Right now this is just for npm install -g and npx
 |   // Right now this is just for npm install -g and npx
 | ||||||
|   if (things.env) { |   if (things.env) { | ||||||
| @ -19,7 +19,7 @@ module.exports.install = function (things) { | |||||||
|   var execOpts = { windowsHide: true, env: things.env || process.env }; |   var execOpts = { windowsHide: true, env: things.env || process.env }; | ||||||
|   var userspace = (!things.telebitUser || (things.telebitUser === os.userInfo().username)) ? true : false; |   var userspace = (!things.telebitUser || (things.telebitUser === os.userInfo().username)) ? true : false; | ||||||
|   var telebitRoot = path.join(__dirname, '../..'); |   var telebitRoot = path.join(__dirname, '../..'); | ||||||
|   var telebitBinTpl = path.join(telebitRoot, 'dist/bin/telebit.tpl'); |   var telebitBinTpl = path.join(telebitRoot, 'usr/share/dist/bin/telebit.tpl'); | ||||||
|   var vars = { |   var vars = { | ||||||
|     telebitPath: telebitRoot |     telebitPath: telebitRoot | ||||||
|   , telebitUser: os.userInfo().username |   , telebitUser: os.userInfo().username | ||||||
| @ -28,54 +28,62 @@ module.exports.install = function (things) { | |||||||
|       path.resolve(__dirname, '../..') |       path.resolve(__dirname, '../..') | ||||||
|     , path.join(os.homedir(), '.config/telebit') |     , path.join(os.homedir(), '.config/telebit') | ||||||
|     , path.join(os.homedir(), '.local/share/telebit') |     , path.join(os.homedir(), '.local/share/telebit') | ||||||
|     ].join(' ') |     ] | ||||||
|   , telebitNode: path.join(telebitRoot, 'bin/node') |   , telebitNode: (process.argv[0]||'').replace(/\.exe/i, '') // path.join(telebitRoot, 'bin/node')
 | ||||||
|   , telebitNpm: path.join(telebitRoot, 'bin/npm') |  | ||||||
|   , telebitBin: path.join(telebitRoot, 'bin/telebit') |   , telebitBin: path.join(telebitRoot, 'bin/telebit') | ||||||
|   , telebitdBin: path.join(telebitRoot, 'bin/telebitd') |   , telebitdBin: path.join(telebitRoot, 'bin/telebitd') | ||||||
|   , telebitBinJs: path.join(telebitRoot, 'bin/telebit.js') |   , telebitJs: path.join(telebitRoot, 'bin/telebit.js') | ||||||
|   , telebitdBinJs: path.join(telebitRoot, 'bin/telebitd.js') |   , telebitdJs: path.join(telebitRoot, 'bin/telebitd.js') | ||||||
|   , telebitConfig: path.join(os.homedir(), '.config/telebit/telebit.yml') |   , telebitConfig: path.join(os.homedir(), '.config/telebit/telebit.yml') | ||||||
|   , telebitdConfig: path.join(os.homedir(), '.config/telebit/telebitd.yml') |   , telebitdConfig: path.join(os.homedir(), '.config/telebit/telebitd.yml') | ||||||
|   }; |   }; | ||||||
|  |   vars.telebitNpm = path.resolve(vars.telebitNode, '../npm'); | ||||||
|  |   vars.nodePath = path.resolve(vars.telebitNode, '../lib/node_modules'); | ||||||
|  |   vars.npmConfigPrefix = path.resolve(vars.telebitNode, '..'); | ||||||
|  |   if (-1 === vars.telebitRwDirs.indexOf(vars.npmConfigPrefix)) { | ||||||
|  |     vars.telebitRwDirs.push(vars.npmConfigPrefix); | ||||||
|  |   } | ||||||
|  |   vars.telebitRwDirs = vars.telebitRwDirs.join(' '); | ||||||
|   var launchers = { |   var launchers = { | ||||||
|     'launchctl': function () { |     'launchctl': function () { | ||||||
|       var launcher = path.join(os.homedir(), 'Library/LaunchAgents/cloud.telebit.remote.plist'); |       var launcher = path.join(os.homedir(), 'Library/LaunchAgents/cloud.telebit.remote.plist'); | ||||||
|       try { |       try { | ||||||
|         mkdirp.sync(path.join(os.homedir(), 'Library/LaunchAgents')); |         mkdirp.sync(path.join(os.homedir(), 'Library/LaunchAgents')); | ||||||
|         mkdirp.sync(path.join(telebitRoot, 'bin')); |         mkdirp.sync(path.join(telebitRoot, 'bin')); | ||||||
|         installLauncher({ |         installLauncher.sync({ | ||||||
|           file: { |           file: { | ||||||
|             tpl: telebitBinTpl |             tpl: telebitBinTpl | ||||||
|           , launcher: path.join(telebitRoot, 'bin/telebit') |           , launcher: path.join(telebitRoot, 'bin/telebit') | ||||||
|           } |           } | ||||||
|         , vars: vars |         , vars: vars | ||||||
|         }, function (err) { |         }); | ||||||
|           if (err) { console.error(err); } |  | ||||||
|         installLauncher({ |         installLauncher({ | ||||||
|           file: { |           file: { | ||||||
|               tpl: path.join(__dirname, 'dist/etc/skel/Library/LaunchAgents/cloud.telebit.remote.plist.tpl') |             tpl: path.join(telebitRoot, 'usr/share/dist/etc/skel/Library/LaunchAgents/cloud.telebit.remote.plist.tpl') | ||||||
|           , launcher: launcher |           , launcher: launcher | ||||||
|           } |           } | ||||||
|         , vars: vars |         , vars: vars | ||||||
|           }, function (err) { |         }); | ||||||
|             if (err) { console.error(err); } |         var launcherstr = (userspace ? "" : "sudo ") + "launchctl "; | ||||||
|             var launcherstr = (userspace ? "sudo " : "") + "launchctl "; |  | ||||||
|         exec(launcherstr + "unload -w " + launcher, execOpts, function (err, stdout, stderr) { |         exec(launcherstr + "unload -w " + launcher, execOpts, function (err, stdout, stderr) { | ||||||
|               console.log(stdout); |           if (err) { console.error(err); } | ||||||
|  | 				  console.log((stdout||'').trim()); | ||||||
|           if (stderr) { |           if (stderr) { | ||||||
|             console.error(stderr); |             console.error(stderr); | ||||||
|           } |           } | ||||||
|  |           console.log('unload worked?'); | ||||||
|           exec(launcherstr + "load -w " + launcher, execOpts, function (err, stdout, stderr) { |           exec(launcherstr + "load -w " + launcher, execOpts, function (err, stdout, stderr) { | ||||||
|                 console.log(stdout); |             if (err) { console.error(err); } | ||||||
|  | 				    console.log((stdout||'').trim()); | ||||||
|             if (stderr) { |             if (stderr) { | ||||||
|               console.error(stderr); |               console.error(stderr); | ||||||
|             } |             } | ||||||
|               }); |             console.log('load worked?'); | ||||||
|             }); |  | ||||||
|           }); |           }); | ||||||
|         }); |         }); | ||||||
|       } catch(e) { |       } catch(e) { | ||||||
|  |         console.error("'" + launcher + "' error:"); | ||||||
|  |         console.error(e); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   , 'systemctl': function () { |   , 'systemctl': function () { | ||||||
| @ -84,26 +92,31 @@ module.exports.install = function (things) { | |||||||
|         mkdirp.sync(path.join(os.homedir(), '.config/systemd/user')); |         mkdirp.sync(path.join(os.homedir(), '.config/systemd/user')); | ||||||
|         installLauncher({ |         installLauncher({ | ||||||
|           file: { |           file: { | ||||||
|             tpl: path.join(__dirname, 'dist/etc/skel/.config/systemd/user/telebit.service.tpl') |             tpl: path.join(telebitRoot, 'usr/share/dist/etc/skel/.config/systemd/user/telebit.service.tpl') | ||||||
|           , launcher: launcher |           , launcher: launcher | ||||||
|           } |           } | ||||||
|         , vars: vars |         , vars: vars | ||||||
|         }, function () { |         }, function () { | ||||||
|           var launcherstr = "systemctl " + (userspace ? "--user " : ""); |           var launcherstr = (userspace ? "" : "sudo ") + "systemctl " + (userspace ? "--user " : ""); | ||||||
|           exec(launcherstr + "daemon-reload", execOpts, function (err, stdout, stderr) { |           exec(launcherstr + "daemon-reload", execOpts, function (err, stdout, stderr) { | ||||||
|             console.log(stdout); |             if (err) { console.error(err); } | ||||||
|  | 				    console.log((stdout||'').trim()); | ||||||
|             if (stderr) { console.error(stderr); } |             if (stderr) { console.error(stderr); } | ||||||
|             exec(launcherstr + "enable " + launcher, execOpts, function (err, stdout, stderr) { |             exec(launcherstr + "enable " + launcher, execOpts, function (err, stdout, stderr) { | ||||||
|               console.log(stdout); |               if (err) { console.error(err); } | ||||||
|  | 				      console.log((stdout||'').trim()); | ||||||
|               if (stderr) { console.error(stderr); } |               if (stderr) { console.error(stderr); } | ||||||
|               exec(launcherstr + "restart " + launcher, execOpts, function (err, stdout, stderr) { |               exec(launcherstr + "restart " + launcher, execOpts, function (err, stdout, stderr) { | ||||||
|                 console.log(stdout); |                 if (err) { console.error(err); } | ||||||
|  | 				        console.log((stdout||'').trim()); | ||||||
|                 if (stderr) { console.error(stderr); } |                 if (stderr) { console.error(stderr); } | ||||||
|               }); |               }); | ||||||
|             }); |             }); | ||||||
|           }); |           }); | ||||||
|         }); |         }); | ||||||
|       } catch(e) { |       } catch(e) { | ||||||
|  |         console.error("'" + launcher + "' error:"); | ||||||
|  |         console.error(e); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   , 'reg.exe': function () { |   , 'reg.exe': function () { | ||||||
| @ -119,7 +132,7 @@ module.exports.install = function (things) { | |||||||
|         + '" /F' |         + '" /F' | ||||||
|         ; |         ; | ||||||
| 			exec(cmd, execOpts, function (err, stdout, stderr) { | 			exec(cmd, execOpts, function (err, stdout, stderr) { | ||||||
| 				console.log(stdout); | 				console.log((stdout||'').trim()); | ||||||
|         if (stderr) { |         if (stderr) { | ||||||
|           console.error(stderr); |           console.error(stderr); | ||||||
|         } |         } | ||||||
| @ -131,33 +144,37 @@ module.exports.install = function (things) { | |||||||
|   function run(err, launcher) { |   function run(err, launcher) { | ||||||
|     if (err) { |     if (err) { | ||||||
|       console.error("No luck with '" + launcher + "'"); |       console.error("No luck with '" + launcher + "'"); | ||||||
|  |       console.error(err); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!launchers[launcher]) { |     if (launchers[launcher]) { | ||||||
|  |       console.log('Launching with launcher ' + launcher); | ||||||
|       launchers[launcher](); |       launchers[launcher](); | ||||||
|       return; |       return; | ||||||
|  |     } else { | ||||||
|  |       console.error("No launcher handler for '" + launcher+ "'"); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // could have used "command-exists" but I'm trying to stay low-dependency
 |   // could have used "command-exists" but I'm trying to stay low-dependency
 | ||||||
|   // os.platform(), os.type()
 |   // os.platform(), os.type()
 | ||||||
|   if (!/^win/i.test(os.platform())) { |   if (!/^win/i.test(os.platform())) { | ||||||
|     if (!/^darwin/i.test(os.platform())) { |     if (/^darwin/i.test(os.platform())) { | ||||||
| 			exec('type -p launchctl', execOpts, function (err, stdout, stderr) { | 			exec('type -p launchctl', execOpts, function (err, stdout, stderr) { | ||||||
| 				console.log(stdout); | 				console.log((stdout||'').trim()); | ||||||
|         if (stderr) { |         if (stderr) { | ||||||
|           console.error(stderr); |           console.error(stderr); | ||||||
|         } |         } | ||||||
|         run(err, 'launchctl'); |         run(err, 'launchctl'); | ||||||
| 			}); | 			}); | ||||||
|     } else { |     } else { | ||||||
| 			exec('type -p systemctlctl', execOpts, function (err, stdout, stderr) { | 			exec('type -p systemctl', execOpts, function (err, stdout, stderr) { | ||||||
| 				console.log(stdout); | 				console.log((stdout||'').trim()); | ||||||
|         if (stderr) { |         if (stderr) { | ||||||
|           console.error(stderr); |           console.error(stderr); | ||||||
|         } |         } | ||||||
|         run(err, 'launchctl'); |         run(err, 'systemctl'); | ||||||
| 			}); | 			}); | ||||||
|     } |     } | ||||||
|   } else { |   } else { | ||||||
| @ -170,7 +187,7 @@ module.exports.install = function (things) { | |||||||
|     // utils.elevate
 |     // utils.elevate
 | ||||||
|     // https://github.com/CatalystCode/windows-registry-node
 |     // https://github.com/CatalystCode/windows-registry-node
 | ||||||
|     exec('where reg.exe', execOpts, function (err, stdout, stderr) { |     exec('where reg.exe', execOpts, function (err, stdout, stderr) { | ||||||
|       console.log(stdout); | 			console.log((stdout||'').trim()); | ||||||
|       if (stderr) { |       if (stderr) { | ||||||
|         console.error(stderr); |         console.error(stderr); | ||||||
|       } |       } | ||||||
| @ -178,3 +195,7 @@ module.exports.install = function (things) { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | if (module === require.main) { | ||||||
|  |   module.exports.install({}); | ||||||
|  | } | ||||||
|  | |||||||
| @ -300,6 +300,8 @@ export TELEBIT_BIN=$TELEBIT_REAL_PATH/bin/telebit | |||||||
| export TELEBITD_BIN=$TELEBIT_REAL_PATH/bin/telebitd | export TELEBITD_BIN=$TELEBIT_REAL_PATH/bin/telebitd | ||||||
| export TELEBIT_JS=$TELEBIT_REAL_PATH/bin/telebit.js | export TELEBIT_JS=$TELEBIT_REAL_PATH/bin/telebit.js | ||||||
| export TELEBITD_JS=$TELEBIT_REAL_PATH/bin/telebitd.js | export TELEBITD_JS=$TELEBIT_REAL_PATH/bin/telebitd.js | ||||||
|  | export NODE_PATH="$TELEBIT_REAL_PATH/lib/node_modules" | ||||||
|  | export NPM_CONFIG_PREFIX="$TELEBIT_REAL_PATH" | ||||||
| 
 | 
 | ||||||
| $my_node $TELEBIT_TMP/usr/share/template-launcher.js | $my_node $TELEBIT_TMP/usr/share/template-launcher.js | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,6 +20,8 @@ module.exports.sync = function (opts) { | |||||||
|   var text = fs.readFileSync(f.tpl, 'utf8') |   var text = fs.readFileSync(f.tpl, 'utf8') | ||||||
|     .replace(/{TELEBIT_PATH}/g, vars.telebitPath || '{TELEBIT_PATH}') |     .replace(/{TELEBIT_PATH}/g, vars.telebitPath || '{TELEBIT_PATH}') | ||||||
|     .replace(/{TELEBIT_NODE}/g, vars.telebitNode || '{TELEBIT_NODE}') |     .replace(/{TELEBIT_NODE}/g, vars.telebitNode || '{TELEBIT_NODE}') | ||||||
|  |     .replace(/{NODE_PATH}/g, vars.nodePath || '{NODE_PATH}') | ||||||
|  |     .replace(/{NPM_CONFIG_PREFIX}/g, vars.npmConfigPrefix || '{NPM_CONFIG_PREFIX}') | ||||||
|     .replace(/{TELEBIT_NPM}/g, vars.telebitNpm || '{TELEBIT_NPM}') |     .replace(/{TELEBIT_NPM}/g, vars.telebitNpm || '{TELEBIT_NPM}') | ||||||
|     .replace(/{TELEBIT_BIN}/g, vars.telebitBin || '{TELEBIT_BIN}') |     .replace(/{TELEBIT_BIN}/g, vars.telebitBin || '{TELEBIT_BIN}') | ||||||
|     .replace(/{TELEBITD_BIN}/g, vars.telebitdBin || '{TELEBITD_BIN}') |     .replace(/{TELEBITD_BIN}/g, vars.telebitdBin || '{TELEBITD_BIN}') | ||||||
| @ -54,8 +56,7 @@ function run() { | |||||||
|     var telebitRoot = path.resolve(__dirname, '../..'); |     var telebitRoot = path.resolve(__dirname, '../..'); | ||||||
|     var vars = { |     var vars = { | ||||||
|       telebitPath: process.env.TELEBIT_PATH || telebitRoot |       telebitPath: process.env.TELEBIT_PATH || telebitRoot | ||||||
|     , telebitNode: process.env.TELEBIT_NODE || path.resolve(telebitRoot, 'bin/node') |     , telebitNode: process.env.TELEBIT_NODE || process.argv[0] || path.resolve(telebitRoot, 'bin/node') | ||||||
|     , telebitNpm: process.env.TELEBIT_NPM || path.resolve(telebitRoot, 'bin/npm') |  | ||||||
|     , telebitBin: process.env.TELEBIT_BIN || path.resolve(telebitRoot, 'bin/telebit') |     , telebitBin: process.env.TELEBIT_BIN || path.resolve(telebitRoot, 'bin/telebit') | ||||||
|     , telebitdBin: process.env.TELEBITD_BIN || path.resolve(telebitRoot, 'bin/telebitd') |     , telebitdBin: process.env.TELEBITD_BIN || path.resolve(telebitRoot, 'bin/telebitd') | ||||||
|     , telebitJs: process.env.TELEBIT_JS || path.resolve(telebitRoot, 'bin/telebit.js') |     , telebitJs: process.env.TELEBIT_JS || path.resolve(telebitRoot, 'bin/telebit.js') | ||||||
| @ -64,12 +65,19 @@ function run() { | |||||||
|         (process.env.TELEBIT_PATH || path.resolve(__dirname, '../..')) |         (process.env.TELEBIT_PATH || path.resolve(__dirname, '../..')) | ||||||
|       , path.join(os.homedir(), '.config/telebit') |       , path.join(os.homedir(), '.config/telebit') | ||||||
|       , path.join(os.homedir(), '.local/share/telebit') |       , path.join(os.homedir(), '.local/share/telebit') | ||||||
|       ].join(' ') |       ] | ||||||
|     , telebitUser: process.env.TELEBIT_USER || os.userInfo().username |     , telebitUser: process.env.TELEBIT_USER || os.userInfo().username | ||||||
|     , telebitGroup: process.env.TELEBIT_GROUP || ('darwin' === os.platform() ? 'staff' : os.userInfo().username) |     , telebitGroup: process.env.TELEBIT_GROUP || ('darwin' === os.platform() ? 'staff' : os.userInfo().username) | ||||||
|     , telebitConfig: process.env.TELEBIT_CONFIG || path.join(os.homedir(), '.config/telebit/telebit.yml') |     , telebitConfig: process.env.TELEBIT_CONFIG || path.join(os.homedir(), '.config/telebit/telebit.yml') | ||||||
|     , telebitdConfig: process.env.TELEBITD_CONFIG || path.join(os.homedir(), '.config/telebit/telebitd.yml') |     , telebitdConfig: process.env.TELEBITD_CONFIG || path.join(os.homedir(), '.config/telebit/telebitd.yml') | ||||||
|     }; |     }; | ||||||
|  |     vars.telebitNpm = process.env.TELEBIT_NPM || path.resolve(vars.telebitNode, '../npm'); | ||||||
|  |     vars.nodePath = process.env.NODE_PATH || path.resolve(vars.telebitNode, '../lib/node_modules'); | ||||||
|  |     vars.npmConfigPrefix = process.env.NPM_CONFIG_PREFIX || path.resolve(vars.telebitNode, '..'); | ||||||
|  |     if (-1 === vars.telebitRwDirs.indexOf(vars.npmConfigPrefix)) { | ||||||
|  |       vars.telebitRwDirs.push(vars.npmConfigPrefix); | ||||||
|  |     } | ||||||
|  |     vars.telebitRwDirs = vars.telebitRwDirs.join(' '); | ||||||
|     module.exports({ |     module.exports({ | ||||||
|       file: f |       file: f | ||||||
|     , vars: vars |     , vars: vars | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user