server.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #! /usr/bin/env node
  2. var fs = require('fs')
  3. var path = require('path')
  4. var SecretStack = require('secret-stack')
  5. var caps = require('ssb-caps')
  6. var SSB = require('ssb-db')
  7. var Client = require('ssb-client')
  8. var cmdAliases = require('./ssb/cli-cmd-aliases')
  9. var ProgressBar = require('./ssb/progress')
  10. var packageJson = require('../package.json')
  11. var Config = require('ssb-config/inject')
  12. var minimist = require('minimist')
  13. var muxrpcli = require('muxrpcli')
  14. var argv = process.argv.slice(2)
  15. var i = argv.indexOf('--')
  16. var conf = argv.slice(i+1)
  17. argv = ~i ? argv.slice(0, i) : argv
  18. var config = Config("ssb", minimist(conf))
  19. var config = Config("ssb", {"replicationScheduler": {"autostart": true, "partialReplication": null} ,"pub": true, "local": true, "friends": { "dunbar": 300, "hops":3}, "gossip":{ "connections": 10, "local": true, "friends": true, "seed": false, "global": false}, "connections": {"incoming": {"net": [{"scope": "public","transform": "shs","port": 8008},{"scope": "device","transform": "shs","port": 8008}],"tunnel": [{"scope": "public", "portal": "@1wOEiCjJJ0nEs1OABUIV20valZ1LHUsfHJY/ivBoM8Y=.ed25519", "transform": "shs"}],"onion": [{"scope": "public","transform": "shs"}],"ws": [{"scope": "public","transform": "shs"}]},"outgoing": {"net": [{"transform": "shs"}],"ws": [{"transform": "shs"}],"tunnel": [{"transform": "shs"}]}}})
  20. var manifestFile = path.join(config.path, 'manifest.json')
  21. // generate initial info
  22. if (argv[0] == 'start') {
  23. console.log(packageJson.name, "[version: "+ packageJson.version+ "]", "[dataPath: "+ config.path+ "]", "["+'logging.level:'+config.logging.level+"]")
  24. console.log('my key ID:', config.keys.public)
  25. // add ssb server required plugins
  26. var tribes = require('ssb-tribes')
  27. var conn = require('ssb-conn')
  28. var legacy_conn = require('ssb-legacy-conn')
  29. var db2 = require('ssb-db2')
  30. var replication_scheduler = ('ssb-replication-scheduler')
  31. var friends = require('ssb-friends')
  32. var ebt = require('ssb-ebt')
  33. var box = require('ssb-box')
  34. var threads = require('ssb-threads')
  35. var invite = require('ssb-invite')
  36. var conn_db = require('ssb-conn-db')
  37. var search2 = require('ssb-search2')
  38. var friend_pub = require('ssb-friend-pub')
  39. var invite_client = require('ssb-invite-client')
  40. var tunnel = require('ssb-tunnel')
  41. var config = require('ssb-config')
  42. var conn_query = require('ssb-conn-query')
  43. var conn_hub = require('ssb-conn-hub')
  44. var conn_staging = require('ssb-conn-staging')
  45. var device_address = require('ssb-device-address')
  46. var poll = require('scuttle-poll')
  47. var gossip = require('ssb-gossip')
  48. var master = require('ssb-master')
  49. var logging = require('ssb-logging')
  50. var partial_replication = require('ssb-partial-replication')
  51. var about = require('ssb-about')
  52. var onion = require('ssb-onion')
  53. var unix = require('ssb-unix-socket')
  54. var auth = require('ssb-no-auth')
  55. var backlinks = require('ssb-backlinks')
  56. var links = require('ssb-links')
  57. // create ssb server
  58. function createSsbServer () {
  59. return SecretStack({ caps }).use(SSB, gossip, tribes, conn, db2, master, ebt, box, threads, invite, conn_db, search2, friend_pub, invite_client, tunnel, config, conn_query, conn_hub, conn_staging, device_address, poll, friends, logging, replication_scheduler, partial_replication, about, onion, unix, auth, backlinks, links)
  60. }
  61. // add other required plugins (+flotilla) by SNH-Oasis (client) (plugin order is required!)
  62. var Server = createSsbServer()
  63. .use(require('ssb-master'))
  64. .use(require('ssb-gossip'))
  65. .use(require('ssb-ebt'))
  66. .use(require('ssb-friends'))
  67. .use(require('ssb-blobs'))
  68. .use(require('ssb-lan'))
  69. .use(require('ssb-meme'))
  70. .use(require('ssb-ooo'))
  71. .use(require('ssb-plugins'))
  72. .use(require('ssb-conn'))
  73. .use(require('ssb-box'))
  74. .use(require('ssb-search'))
  75. .use(require('ssb-friend-pub'))
  76. .use(require('ssb-invite-client'))
  77. .use(require('ssb-logging'))
  78. .use(require('ssb-replication-scheduler'))
  79. .use(require('ssb-partial-replication'))
  80. .use(require("ssb-room/tunnel/client"))
  81. .use(require('ssb-about'))
  82. .use(require('ssb-onion'))
  83. .use(require('ssb-unix-socket'))
  84. .use(require('ssb-no-auth'))
  85. .use(require('ssb-backlinks'))
  86. .use(require("ssb-tangle"))
  87. .use(require('ssb-links'))
  88. .use(require('ssb-query'))
  89. // add third-party plugins (loaded from ~/.ssb/config)
  90. require('ssb-plugins').loadUserPlugins(Server, config)
  91. // load config into ssb & start it
  92. var server = Server(config)
  93. // generate manifest
  94. fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
  95. // show server progress
  96. if(process.stdout.isTTY && (config.logging.level != 'info'))
  97. ProgressBar(server.progress)
  98. } else {
  99. var manifest
  100. try {
  101. manifest = JSON.parse(fs.readFileSync(manifestFile))
  102. } catch (err) {
  103. throw explain(err,
  104. 'no manifest file'
  105. + '- should be generated first time server is run'
  106. )
  107. }
  108. var opts = {
  109. manifest: manifest,
  110. port: config.port,
  111. host: 'localhost',
  112. caps: config.caps,
  113. key: config.key || config.keys.id
  114. }
  115. Client(config.keys, opts, function (err, rpc) {
  116. if(err) {
  117. if (/could not connect/.test(err.message)) {
  118. console.error('Error: Could not connect to ssb-server ' + opts.host + ':' + opts.port)
  119. console.error('Use the "start" command to start it.')
  120. console.error('Use --verbose option to see full error')
  121. if(config.verbose) throw err
  122. process.exit(1)
  123. }
  124. throw err
  125. }
  126. for (var k in cmdAliases) {
  127. rpc[k] = rpc[cmdAliases[k]]
  128. manifest[k] = manifest[cmdAliases[k]]
  129. }
  130. manifest.config = 'sync'
  131. rpc.config = function (cb) {
  132. console.log(JSON.stringify(config, null, 2))
  133. cb()
  134. }
  135. if (process.argv[2] === 'blobs.add') {
  136. var filename = process.argv[3]
  137. var source =
  138. filename ? File(process.argv[3])
  139. : !process.stdin.isTTY ? toPull.source(process.stdin)
  140. : (function () {
  141. console.error('USAGE:')
  142. console.error(' blobs.add <filename> # add a file')
  143. console.error(' source | blobs.add # read from stdin')
  144. process.exit(1)
  145. })()
  146. pull(
  147. source,
  148. rpc.blobs.add(null, function (err, hash) {
  149. if (err)
  150. throw err
  151. console.log(hash)
  152. process.exit()
  153. })
  154. )
  155. return
  156. }
  157. muxrpcli(argv, manifest, rpc, config.verbose)
  158. })
  159. }