git ssb

1+

mixmix / scuttle-shell



Tree: 2bccd6311eaa538c1dcb6a4d796fe73d159ea6ad

Files: 2bccd6311eaa538c1dcb6a4d796fe73d159ea6ad / server.js

4593 bytesRaw
1#! /usr/bin/env node
2
3const fs = require('fs')
4const path = require('path')
5const ssbKeys = require('ssb-keys')
6const minimist = require('minimist')
7const notifier = require('node-notifier')
8const SysTray = require('forked-systray').default
9let tray = {}
10
11function start(customConfig) {
12 customConfig = customConfig || {}
13 let appname = customConfig.appname || false
14 let customPluginPaths = customConfig.plugins || false
15 let argv = process.argv.slice(2)
16 let i = argv.indexOf('--')
17 let conf = argv.slice(i + 1)
18 argv = ~i ? argv.slice(0, i) : argv
19 let ssbAppName = appname || process.env.ssb_appname
20
21 const config = require('ssb-config/inject')(ssbAppName, minimist(conf))
22
23 const keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret'))
24 if (keys.curve === 'k256') {
25 throw new Error('k256 curves are no longer supported,' +
26 'please delete' + path.join(config.path, 'secret'))
27 }
28
29 const manifestFile = path.join(config.path, 'manifest.json')
30
31 const createSbot = require('scuttlebot')
32 .use(require('scuttlebot/plugins/master'))
33 .use(require('scuttlebot/plugins/gossip'))
34 .use(require('scuttlebot/plugins/replicate'))
35 .use(require('scuttlebot/plugins/invite'))
36 .use(require('scuttlebot/plugins/local'))
37 .use(require('scuttlebot/plugins/logging'))
38 .use(require('ssb-about'))
39 .use(require('ssb-backlinks'))
40 .use(require('ssb-blobs'))
41 .use(require('ssb-chess-db'))
42 .use(require('ssb-ebt'))
43 .use(require('ssb-friends'))
44 .use(require('ssb-links')) // needed by patchfoo
45 .use(require('ssb-names'))
46 .use(require('ssb-meme'))
47 .use(require('ssb-ooo'))
48 .use(require('ssb-private'))
49 .use(require('ssb-query'))
50 .use(require('ssb-search'))
51 .use(require('ssb-talequery')) // only tale:net
52 .use(require('ssb-unread'))
53 .use(require('ssb-ws'))
54
55 // load user plugins (from $HOME/.ssb/node_modules using $HOME/.ssb/config plugins {name:true})
56 require('scuttlebot/plugins/plugins').loadUserPlugins(createSbot, config)
57
58 // Custom plugins from json
59 let appManifestFile = path.resolve('scuttleshell.json')
60 if (fs.existsSync(appManifestFile)) {
61 let manifest = JSON.parse(fs.readFileSync(appManifestFile))
62 if (manifest.hasOwnProperty('plugins') && Array.isArray(manifest.plugins)) {
63 console.log('loading custom plugins: ', manifest.plugins.join(', '))
64 manifest.plugins.forEach(plugin => createSbot.use(require(plugin)))
65 }
66 }
67
68 if (Array.isArray(customPluginPaths)) {
69 console.log('loading custom plugins: ', customPluginPaths.join(', '))
70 customPluginPaths.forEach(plugin => createSbot.use(require(plugin)))
71 }
72
73 // start server
74
75 config.keys = keys
76 console.log('config:', config)
77 const server = createSbot(config)
78
79 // write RPC manifest to ~/.ssb/manifest.json
80 fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
81
82 const icon = fs.readFileSync(path.join(__dirname, `icon.${process.platform === 'win32' ? 'ico' : 'png'}`))
83 tray = new SysTray({
84 menu: {
85 icon: icon.toString('base64'),
86 title: 'Scuttle-Shell',
87 tooltip: 'Secure Scuttlebutt',
88 items: [
89 {
90 title: 'Quit',
91 tooltip: 'Stop sbot and quit tray application',
92 checked: false,
93 enabled: true
94 }
95 ]
96 },
97 debug: false,
98 copyDir: true
99 })
100
101 tray.onClick(action => {
102 console.log('got action:', action)
103 switch (action.seq_id) {
104 case 0:
105 console.log('### EXITING IN TWO SECONDS ###')
106
107 notifier.notify({
108 title: 'Secure Scuttlebutt',
109 message: `Secure Scuttlebutt will exit in two seconds...`,
110 icon: path.join(__dirname, 'icon.png'),
111 wait: true,
112 id: 0
113 })
114
115 tray.kill()
116 }
117 })
118
119 tray.onExit((code, signal) => {
120 console.log('got exit:', code)
121 setTimeout(() =>
122 process.exit(0), 2000)
123 })
124}
125
126function stop() {
127 tray.kill()
128}
129
130const getConfig = () => {
131 try {
132 let secret = fs.readFileSync(pathToSecret, 'utf8')
133 let keys = JSON.parse(secret.replace(/#[^\n]*/g, ''))
134 let manifest = JSON.parse(fs.readFileSync(path.join(config.path, 'manifest.json')))
135 let remote = 'ws://localhost:8989~shs:' + keys.id.substring(1, keys.id.indexOf('.'))
136 return { type: 'config', keys: keys, manifest: manifest, remote: remote, secret: secret }
137 } catch (n) {
138 return { type: 'error', msg: n.message }
139 }
140}
141
142module.exports = { start, stop, getConfig }
143
144if (require.main === module) {
145 var errorLevel = start()
146 console.log('exited with:', errorLevel)
147}
148

Built with git-ssb-web