git ssb

2+

ev / minsbot



Tree: b8ff6fb46136a9a34fe3c3c6dd957cd1eb36a267

Files: b8ff6fb46136a9a34fe3c3c6dd957cd1eb36a267 / bin.js

5312 bytesRaw
1#! /usr/bin/env node
2
3var fs = require('fs')
4var path = require('path')
5var pull = require('pull-stream')
6var toPull = require('stream-to-pull-stream')
7var File = require('pull-file')
8var explain = require('explain-error')
9var ssbKeys = require('ssb-keys')
10var stringify = require('pull-stringify')
11var createHash = require('multiblob/util').createHash
12var minimist = require('minimist')
13var muxrpcli = require('muxrpcli')
14var cmdAliases = require('./lib/cli-cmd-aliases')
15var ProgressBar = require('./lib/progress')
16var packageJson = require('./package.json')
17
18//get config as cli options after --, options before that are
19//options to the command.
20var argv = process.argv.slice(2)
21var i = argv.indexOf('--')
22var conf = argv.slice(i+1)
23argv = ~i ? argv.slice(0, i) : argv
24
25var config = require('ssb-config/inject')(process.env.ssb_appname, minimist(conf))
26
27var keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret'))
28if(keys.curve === 'k256')
29 throw new Error('k256 curves are no longer supported,'+
30 'please delete' + path.join(config.path, 'secret'))
31
32var manifestFile = path.join(config.path, 'manifest.json')
33
34if (argv[0] == 'server') {
35 console.log(packageJson.name, packageJson.version, config.path, 'logging.level:'+config.logging.level)
36 console.log('my key ID:', keys.public)
37
38 // special server command:
39 // import sbot and start the server
40
41 var createSbot = require('./')
42 .use(require('./plugins/plugins'))
43 .use(require('./plugins/master'))
44 .use(require('./plugins/gossip'))
45 .use(require('./plugins/replicate'))
46 .use(require('ssb-friends'))
47 .use(require('ssb-blobs'))
48 .use(require('./plugins/invite'))
49 .use(require('./plugins/local'))
50 .use(require('./plugins/logging'))
51 .use(require('./query'))
52 .use(require('ssb-links'))
53 .use(require('ssb-search'))
54 .use(require('ssb-backlinks'))
55 .use(require('./decent-ws'))
56 .use(require('ssb-ebt'))
57 .use({
58 name: 'serve',
59 version: '1.0.0',
60 init: function (sbot) {
61 sbot.ws.use(function (req, res, next) {
62 res.setHeader('Access-Control-Allow-Origin', '*')
63 var send = config
64 delete send.keys // very important to keep this, as it removes the server keys from the config before broadcast
65 send.address = sbot.ws.getAddress()
66 sbot.invite.create({modern: true}, function (err, cb) {
67 send.invite = cb
68 })
69 //if(req.url == '/')
70 // res.end(mvdClient)
71 if(req.url == '/get-config')
72 res.end(JSON.stringify(send))
73 else next()
74 })
75 }
76 })
77
78
79 // add third-party plugins
80 //require('./plugins/plugins').loadUserPlugins(createSbot, config)
81
82 // start server
83
84 config.keys = keys
85 var server = createSbot(config)
86
87 // write RPC manifest to ~/.ssb/manifest.json
88 fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
89
90 if(process.stdout.isTTY && (config.logging.level != 'info'))
91 ProgressBar(server.progress)
92} else {
93
94 // normal command:
95 // create a client connection to the server
96
97 // read manifest.json
98 var manifest
99 try {
100 manifest = JSON.parse(fs.readFileSync(manifestFile))
101 } catch (err) {
102 throw explain(err,
103 'no manifest file'
104 + '- should be generated first time server is run'
105 )
106 }
107
108 // connect
109 require('ssb-client')(keys, {
110 manifest: manifest,
111 port: config.port,
112 host: config.host||'localhost',
113 caps: config.caps,
114 key: config.key || keys.id
115 }, function (err, rpc) {
116 if(err) {
117 if (/could not connect/.test(err.message)) {
118 console.log('Error: Could not connect to the scuttlebot server.')
119 console.log('Use the "server" command to start it.')
120 if(config.verbose) throw err
121 process.exit(1)
122 }
123 throw err
124 }
125
126 // add aliases
127 for (var k in cmdAliases) {
128 rpc[k] = rpc[cmdAliases[k]]
129 manifest[k] = manifest[cmdAliases[k]]
130 }
131
132 // add some extra commands
133 manifest.version = 'async'
134 manifest.config = 'sync'
135 rpc.version = function (cb) {
136 console.log(require('./package.json').version)
137 cb()
138 }
139 rpc.config = function (cb) {
140 console.log(JSON.stringify(config, null, 2))
141 cb()
142 }
143
144 // HACK
145 // we need to output the hash of blobs that are added via blobs.add
146 // because muxrpc doesnt support the `sink` callback yet, we need this manual override
147 // -prf
148 if (process.argv[2] === 'blobs.add') {
149 var filename = process.argv[3]
150 var source =
151 filename ? File(process.argv[3])
152 : !process.stdin.isTTY ? toPull.source(process.stdin)
153 : (function () {
154 console.error('USAGE:')
155 console.error(' blobs.add <filename> # add a file')
156 console.error(' source | blobs.add # read from stdin')
157 process.exit(1)
158 })()
159 var hasher = createHash('sha256')
160 pull(
161 source,
162 hasher,
163 rpc.blobs.add(function (err) {
164 if (err)
165 throw err
166 console.log('&'+hasher.digest)
167 process.exit()
168 })
169 )
170 return
171 }
172
173 // run commandline flow
174 muxrpcli(argv, manifest, rpc, config.verbose)
175 })
176}
177
178
179
180
181

Built with git-ssb-web