c3d 0.3.0 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6de051d34428c13ea6c90d39d7addce37f80172
4
- data.tar.gz: 753534010b413309538c3e119e8af08bf3b5f9f1
3
+ metadata.gz: 201a408f2b1225395095cf724407ff44421d53fc
4
+ data.tar.gz: 678e8aebd10af7dfbe8a16335247202f40dcc1c9
5
5
  SHA512:
6
- metadata.gz: 0d37975203c97db0df3629a054e1dc641418345ca67f2507e0a7b14585f3e2d52385f5a244a6f58db32ef9864de5afd328f838e7c773701449da3765d96712e9
7
- data.tar.gz: 0d4dc7cab886f9aaf84aa2d24ed56b543ae358dbd53aabb0d74993c77213f897d4144ae136585f71e6d21216eb2db9a30228b111a9a32d118a67f530c4db94cd
6
+ metadata.gz: da221566c106410d2a1d6c7dd1e0902cc096f3fee448354bcc3f79bcd9364b0322e9bb2c71572052e1d4b512d51bfc6c35ee3c63dc9fcdc5ca138bde967b7caa
7
+ data.tar.gz: 578d967c0d82ee1e8f41fce0b9a71523bb0598ee7b1146316889341df882e122368f903486a8865a012d0baf727a4d4fb083ba1c528e0186bb0f24babbbef206
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- c3d (0.2.0)
4
+ c3d (0.3.0)
5
5
  bencode (~> 0.8)
6
6
  celluloid (~> 0.15)
7
7
  celluloid-zmq (~> 0.15)
data/Rakefile CHANGED
@@ -1,9 +1,2 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
- require './lib/system-setup'
4
-
5
- desc 'installs components'
6
- task :install do
7
- system "bundle install"
8
- # system "sudo npm install -g bower"
9
- end
data/lib/c3d.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  require 'digest/sha1'
5
5
  require 'json'
6
6
  require 'yaml'
7
+ require 'base64'
7
8
 
8
9
  # Gem Dependencies
9
10
  require 'httparty'
@@ -11,45 +12,24 @@ require 'bencode'
11
12
  require 'celluloid/autostart'
12
13
 
13
14
  # This Gem
14
- require File.join(File.dirname(__FILE__), 'c3d', 'version')
15
- require File.join(File.dirname(__FILE__), 'c3d', 'connect_ethereum')
16
- require File.join(File.dirname(__FILE__), 'c3d', 'connect_torrent')
17
- require File.join(File.dirname(__FILE__), 'c3d', 'connect_ui')
18
- require File.join(File.dirname(__FILE__), 'c3d', 'publish')
19
- require File.join(File.dirname(__FILE__), 'c3d', 'subscribe')
20
- require File.join(File.dirname(__FILE__), 'c3d', 'get')
21
-
22
- # todo - load these variables from a config file in ~/.epm
23
- SWARM_DIR = File.join(ENV['HOME'], '.cache', 'c3d')
24
- TORRENTS_DIR = File.join(SWARM_DIR, 'torrents')
25
- BLOBS_DIR = File.join(SWARM_DIR, 'blobs')
26
- TORRENT_RPC = 'http://127.0.0.1:9091/transmission/rpc'
27
- TORRENT_USER = 'username'
28
- TORRENT_PASS = 'password'
29
- ETH_ADDRESS = 'tcp://127.0.0.1:31315'
30
- UI_ADDRESS = 'tcp://127.0.0.1:31314'
31
- WATCH_FILE = File.join(SWARM_DIR, 'watchers.json')
32
- IGNORE_FILE = File.join(SWARM_DIR, 'ignored.json')
33
-
34
- # todo - check that torrent manager is running
35
- # todo - torrentapis use a 'fairly std' rpc framework, but with different
36
- # endpoints. need to test these though
37
- # todo - check dependencies are installed: zmq ... transmission
38
- # todo - add foreman
39
-
40
- swarm_puller = TorrentAPI.new(
41
- username: TORRENT_USER,
42
- password: TORRENT_PASS,
43
- url: TORRENT_RPC,
44
- debug_mode: true
45
- )
46
- eth = ConnectEth.new
15
+ Dir[File.dirname(__FILE__) + '/c3d/*.rb'].each {|file| require file }
16
+
17
+ SetupC3D.new
18
+
19
+ TransmissionRunner.new.start_transmission
20
+ sleep 5
21
+
22
+ TorrentAPI.supervise_as :puller, {
23
+ username: ENV['TORRENT_USER'],
24
+ password: ENV['TORRENT_PASS'],
25
+ url: ENV['TORRENT_RPC'] }
26
+ @swarm_puller = Celluloid::Actor[:puller]
27
+
28
+ @eth = ConnectEthZMQ.new
29
+ # @ui = ConnectUI.new
30
+ # @ui.async.run
47
31
 
48
32
  if __FILE__==$0
49
- if ARGV[0]
50
- blob1 = File.read(ARGV[0]) + "\n#{Time.now}"
51
- PublishBlob.new blob1, swarm_puller, eth, false, false, false
52
- blob2 = 'as;dlfkajfbdposdituy2q-034956712840918734uytgqklerjdnga,.fxsnvbmaz x.,c'
53
- PublishBlob.new blob2, swarm_puller, eth, false, false, false
54
- end
33
+ blob1 = File.read(ARGV[0]) + "\n#{Time.now}"
34
+ Publish.new @swarm_puller, @eth, blob1, 'a6cb63ec28c12929bee2d3567bf98f374a0b7167', '97d1f086800920e8fd2344be52fb22d7bf6036d2', '0x2E737671893D33BF53A5F00EDE9E839F9D86E3A391387CA9189CA79729D00000'
55
35
  end
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Transactions:
4
+ # * `add-blob-to-g`: add blob to group (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
5
+ # * `rm-blob-from-g`: remove blob from contract (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
6
+
7
+ require 'socket'
8
+ require 'json'
9
+
10
+ class ConnectEthRPC
11
+ include Celluloid
12
+
13
+ def initialize client, host=ENV['ETH_HOST'], port=ENV['ETH_PORT']
14
+ @client = client
15
+ @question_socket = TCPSocket.new host, port
16
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] c3D->eth via RPC on port >>\t#{ENV['ETH_PORT']}"
17
+ end
18
+
19
+ def get_storage_at address, storage_location
20
+ address = guard_addresses address
21
+ storage_location = guard_addresses storage_location
22
+
23
+ case @client
24
+ when :go
25
+ request = {
26
+ id: 1,
27
+ method: "EthereumApi.GetStorageAt",
28
+ params: [{
29
+ address: address,
30
+ key: storage_location
31
+ }]
32
+ }
33
+ when :cpp
34
+ request = {
35
+ id: 1,
36
+ method: "storageAt",
37
+ params: [{
38
+ a: address,
39
+ x: storage_location
40
+ }]
41
+ }
42
+ end
43
+
44
+ send_command request
45
+ end
46
+
47
+ def transact recipient, key='', data='', value=0, gas=10000, gas_price=100000
48
+ recipient = guard_addresses recipient
49
+
50
+ case @client
51
+ when :go
52
+ request = {
53
+ id: 1,
54
+ method: "EthereumApi.Transact",
55
+ params: [{
56
+ recipient: recipient,
57
+ value: value,
58
+ gas: gas,
59
+ gasprice: gas_price
60
+ }]
61
+ }
62
+ when :cpp
63
+ request = {
64
+ id: 1,
65
+ method: 'transact',
66
+ params: [{
67
+ sec: '',#todo: key,
68
+ xValue: value,
69
+ aDest: recipient,
70
+ bData: '',#todo: build_data data,
71
+ xGas: gas,
72
+ xGasPrice: gas_price
73
+ }]
74
+ }
75
+ end
76
+
77
+ send_command request
78
+ end
79
+
80
+ def create body_file, endowment=0, key='', gas=10000, gas_price=100000
81
+ body_content = File.read(body_file)
82
+
83
+ case @client
84
+ when :go
85
+ request = {
86
+ id: 1,
87
+ method: "EthereumApi.Create",
88
+ params: [{
89
+ init: '',
90
+ body: body_content,
91
+ value: endowment,
92
+ gas: gas,
93
+ gasprice: gas_price
94
+ }]
95
+ }
96
+ when :cpp
97
+ request = {
98
+ id: 1,
99
+ method: "create",
100
+ params: [{
101
+ sec: '',#todo: key,
102
+ xEndowment: endowment,
103
+ bCode: body_content,
104
+ xGas: gas,
105
+ xGasPrice: gas_price
106
+ }]
107
+ }
108
+ end
109
+
110
+ send_command request
111
+ end
112
+
113
+ private
114
+
115
+ def guard_addresses address
116
+ unless address[0..1] == "0x"
117
+ address = "0x" + address
118
+ end
119
+ end
120
+
121
+ def build_data data
122
+ if data.class == Array
123
+ slots = data[0].to_i
124
+ data.each do |piece|
125
+ #todo, encode the pieces...
126
+ end
127
+ else
128
+ return data
129
+ end
130
+ end
131
+
132
+ def send_command request
133
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Sending Question >>\t#{request}"
134
+ @question_socket.puts request.to_json
135
+ handle_response JSON.parse(@question_socket.gets)
136
+ end
137
+
138
+ def handle_response response
139
+ unless response["error"]
140
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Received Answer >>\tanswer:#{response['result']}"
141
+ return JSON.parse(response["result"])
142
+ else
143
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Received Answer >>\tERROR!"
144
+ return nil
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Transactions:
4
+ # * `add-blob-to-g`: add blob to group (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
5
+ # * `rm-blob-from-g`: remove blob from contract (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
6
+
7
+ require 'json'
8
+ require 'celluloid/zmq'
9
+
10
+ Celluloid::ZMQ.init
11
+
12
+ class ConnectEthZMQ
13
+ include Celluloid::ZMQ
14
+
15
+ def initialize
16
+ @question_socket = ReqSocket.new
17
+ begin
18
+ @question_socket.connect ENV['ETH_ZMQ_ADDR']
19
+ rescue IOError
20
+ @question_socket.close
21
+ end
22
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] c3D->eth via ZMQ and JS Socket on port >>\t#{ENV['ETH_ZMQ_ADDR'].split(':').last}"
23
+ end
24
+
25
+ def get_storage_at address, storage_location
26
+ address = guard_addresses address
27
+ storage_location = guard_addresses storage_location
28
+
29
+ request = {
30
+ method: 'getStorageAt',
31
+ params: [
32
+ address,
33
+ storage_location
34
+ ]
35
+ }
36
+
37
+ send_message request
38
+ end
39
+
40
+ def transact recipient, key='', data='', value=0, gas=10000
41
+ recipient = guard_addresses recipient
42
+ #todo -- add variable gas_price
43
+
44
+ request = {
45
+ method: 'transact',
46
+ params: [
47
+ key, #todo -- fix this -- especially in the socket listeners.
48
+ value,
49
+ recipient,
50
+ gas,
51
+ data #todo -- audit this
52
+ ].flatten
53
+ }
54
+
55
+ send_message request
56
+ end
57
+
58
+ def create body_file, endowment=0, key='', gas=10000
59
+ body = File.read(body_file)
60
+ #todo -- add variable gas_price
61
+
62
+ request = {
63
+ method: 'create',
64
+ params: [
65
+ key, #todo -- fix this -- especially in the socket listeners.
66
+ endowment,
67
+ body,
68
+ gas
69
+ ]
70
+ }
71
+
72
+ send_message request
73
+ end
74
+
75
+ private
76
+
77
+ def guard_addresses address
78
+ unless address[0..1] == "0x"
79
+ address = "0x" + address
80
+ end
81
+ end
82
+
83
+ def send_message request
84
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Sending Question >>\t#{request}"
85
+ @question_socket.send request.to_json
86
+ handle_response JSON.load(@question_socket.read)
87
+ end
88
+
89
+ def handle_response response
90
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Received Answer >>\tsuccess:#{response['success']}\tanswer:#{response['answer']}"
91
+ return response['answer']
92
+ end
93
+ end
94
+
95
+ if __FILE__==$0
96
+ ENV['ETH_ZMQ_ADDR'] = 'tcp://127.0.0.1:31315'
97
+
98
+ message = {}
99
+ message['method'] = 'transact'
100
+ message['params'] = [
101
+ 'a6cb63ec28c12929bee2d3567bf98f374a0b7167', #senderaddr
102
+ '', #value
103
+ '61363f0d19cfe71a5c130642016e37649610294b', #recipientaddr
104
+ '10000', #gas
105
+ '3', #dataslots
106
+ 'newp', #....data
107
+ '0x76A46EAB30845C1FA2C0E08243890CDFBF73D6421CFA5BF9169FFB98A3300000',
108
+ '0x1d822cb2e4c60c3a8a85546304072b14fb9de94e2c0c608c4120b5d529590c9d'
109
+ ]
110
+ questions_for_eth = ConnectEth.new
111
+ questions_for_eth.write JSON.dump message
112
+
113
+ message = {}
114
+ message['method'] = 'getStorageAt'
115
+ message['params'] = [
116
+ '61363f0d19cfe71a5c130642016e37649610294b',
117
+ '0x76A46EAB30845C1FA2C0E08243890CDFBF73D6421CFA5BF9169FFB98A3300003'
118
+ ]
119
+
120
+ questions_for_eth.write JSON.dump message
121
+ sleep
122
+ end
@@ -59,7 +59,7 @@ class TorrentAPI
59
59
  :method => "torrent-add",
60
60
  :arguments => {
61
61
  :filename => filename,
62
- :'download-dir' => BLOBS_DIR,
62
+ :'download-dir' => ENV['BLOBS_DIR'],
63
63
  :'peer-limit' => 99
64
64
  }
65
65
  )
@@ -144,22 +144,4 @@ class TorrentAPI
144
144
  log headers
145
145
  log "------------------"
146
146
  end
147
- end
148
-
149
- # added = swarm_puller.create("#{t.magnet_link}")
150
-
151
- # [{"addedDate"=>1400177739,
152
- # "files"=>
153
- # [{"bytesCompleted"=>31752192,
154
- # "length"=>591396864,
155
- # "name"=>"ubuntu-14.04-server-amd64.iso"}],
156
- # "id"=>1,
157
- # "isFinished"=>false,
158
- # "name"=>"ubuntu-14.04-server-amd64.iso",
159
- # "percentDone"=>0.0536,
160
- # "rateDownload"=>706000,
161
- # "rateUpload"=>3000,
162
- # "totalSize"=>591396864}]
163
-
164
- # swarm_puller.destroy(1)
165
- # torrent = swarm_puller.find(1)
147
+ end
@@ -4,17 +4,40 @@ require 'json'
4
4
  require 'celluloid/zmq'
5
5
 
6
6
  # commands - sent over ZMQ but using a standard JSONRPC structure.
7
- # * `make-blob`: make blob (params: filename: "FILENAME" || filecontents: "CONTENTS") (returns success: BLOB_ID or error)
8
- # * `destroy-blob`: destroy blob (params: blob: "BLOB_ID") (returns success: true or error)
9
- # * `add-blob-to-g`: add blob to group (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
10
- # * `rm-blob-from-g`: remove blob from contract (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
11
- # * `subscribe-k`: add a contract's blobs to the subscribed list (params: contract: "CONTRACT_ADDRESS") (returns success: true or error)
12
- # * `subscribe-g`: add a group's blobs to the subscribed list (params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
13
- # * `unsubscribe-k` remove a contract's blobs from the subscribed list (params: contract: "CONTRACT_ADDRESS") (returns success: true or error)
14
- # * `unsubscribe-g` remove a group's blobs from the subscribed list (params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
15
- # * `ignore-g` add a group to the ignore list (params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
16
- # * `publish`: sugar for make blob + add to k + (opt) add to g (params: filename: "FILENAME" || filecontents: "CONTENTS", contract: "CONTRACT_ADDRESS", [optional] group: ["GROUP1_ID", "GROUP2_ID", ...]) (returns success: BLOB_ID or error)
17
- # * `get`: add a magnet link to the cache (params: id: "BLOB_ID") (returns success: true or error)
7
+ # * `makeBlob`: make blob
8
+ # params: filename: "FILENAME" || filecontents: "CONTENTS"
9
+ # returns success: BLOB_ID or error
10
+ # * `destroyBlob`: destroy blob
11
+ # params: blob: "BLOB_ID"
12
+ # returns success: true or error
13
+ # * `addBlobToG`: add blob to group
14
+ # params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID"
15
+ # returns success: true or error
16
+ # * `rmBlobFromG`: remove blob from contract
17
+ # params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID"
18
+ # returns success: true or error
19
+ # * `subscribeK`: add a contract's blobs to the subscribed list
20
+ # params: contract: "CONTRACT_ADDRESS"
21
+ # returns success: true or error
22
+ # * `subscribeG`: add a group's blobs to the subscribed list
23
+ # params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID"
24
+ # returns success: true or error
25
+ # * `unsubscribeK` remove a contract's blobs from the subscribed list
26
+ # params: contract: "CONTRACT_ADDRESS"
27
+ # returns success: true or error
28
+ # * `unsubscribeG` remove a group's blobs from the subscribed list
29
+ # params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID"
30
+ # returns success: true or error
31
+ # * `ignoreG` add a group to the ignore list
32
+ # params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID"
33
+ # returns success: true or error
34
+ # * `publish`: sugar for make blob + add to g
35
+ # params: filename: "FILENAME" || filecontents: "CONTENTS",
36
+ # contract: "CONTRACT_ADDRESS", [group]: ["GROUP1_ID", "GROUP2_ID", ...]
37
+ # returns success: BLOB_ID or error)
38
+ # * `get`: add a magnet link to the cache
39
+ # params: id: "BLOB_ID"
40
+ # returns success: true or error
18
41
 
19
42
  Celluloid::ZMQ.init
20
43
 
@@ -25,13 +48,13 @@ class ConnectUI
25
48
  @answer_socket = RepSocket.new
26
49
 
27
50
  begin
28
- @answer_socket.bind UI_ADDRESS
51
+ @answer_socket.bind ENV['UI_ADDRESS']
29
52
  rescue IOError
30
53
  @answer_socket.close
31
54
  raise
32
55
  end
33
56
 
34
- puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] c3D<-ui on port >>\t#{UI_ADDRESS.split(':').last}"
57
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] c3D<-ui on port >>\t#{ENV['UI_ADDRESS'].split(':').last}"
35
58
  end
36
59
 
37
60
  def run
@@ -41,12 +64,39 @@ class ConnectUI
41
64
 
42
65
  def handle_message message
43
66
  message = JSON.load message
44
- @answer_socket.send(JSON.dump(message))
67
+ puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Received Question >>\tcommand:#{message['command']}\tparams:#{message['params']}"
68
+ case message['command']
69
+ when 'get'
70
+ # todo
71
+ when 'makeBlob'
72
+ blob = message['params'][0]
73
+ PublishBlob.new blob, nil
74
+ when 'destroyBlob'
75
+ #todo
76
+ when 'addBlobToG'
77
+ sending_addr = message['params'][0]
78
+ contract_id = message['params'][1]
79
+ group_id = message['params'][2]
80
+ PublishBlob.new nil, sending_addr, contract_id, group_id
81
+ when 'rmBlobFromG'
82
+ #todo
83
+ when 'subscribeK'
84
+ #todo
85
+ when 'subscribeG'
86
+ #todo
87
+ when 'unsubscribeK'
88
+ #todo
89
+ when 'unsubscribeG'
90
+ #todo
91
+ when 'ignoreG'
92
+ #todo
93
+ when 'publish'
94
+ sending_addr = message['params'][0]
95
+ contract_id = message['params'][1]
96
+ group_id = message['params'][2]
97
+ blob = message['params'][3]
98
+ PublishBlob.new blob, sending_addr, contract_id, group_id
99
+ end
100
+ @answer_socket.send JSON.dump message
45
101
  end
46
- end
47
-
48
- if __FILE__==$0
49
- UI_ADDRESS = 'tcp://127.0.0.1:31314'
50
- answers_for_eth = ConnectUI.new
51
- answers_for_eth.async.run
52
- end
102
+ end
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ class TransmissionRunner
4
+ def start_transmission
5
+ unless is_trans_running?
6
+ pid = spawn "transmission-daemon -f --no-incomplete-dir -o -C -p #{ENV['TORRENT_RPC'].split(':').last[0..3]} -w #{ENV['BLOBS_DIR']} -g #{File.join(ENV['HOME'], '.epm')}"
7
+ at_exit { Process.kill("INT", pid) }
8
+ end
9
+ end
10
+
11
+ def is_trans_running?
12
+ a = `ps ux`.split("\n").select{|e| e[/transmission-daemon/]}
13
+ return (! a.empty?)
14
+ end
15
+ end
16
+
17
+ class EthZmqRunner
18
+ def start_ethereum_zmq_bridge
19
+ unless is_bridge_running?
20
+ c3d_node = File.join(File.dirname(__FILE__), '..', '..', 'node_modules', 'c3d', 'connect_aleth.js')
21
+ pid = spawn "node #{c3d_node}"
22
+ at_exit { Process.kill("INT", pid) }
23
+ end
24
+ end
25
+
26
+ def is_bridge_running?
27
+ a = `ps ux`.split("\n").select{|e| e[/node.*connect_aleth.js$/]}
28
+ return (! a.empty?)
29
+ end
30
+ end
31
+
32
+ class EthRunner
33
+ def start_ethereum
34
+ unless is_eth_running?
35
+ pid = spawn #{todo}""
36
+ at_exit { Process.kill("INT", pid) }
37
+ end
38
+ end
39
+
40
+ def is_eth_running?
41
+ a = `ps ux`.split("\n").select{|e| e[/eth/]} #todo cleanup
42
+ return (! a.empty?)
43
+ end
44
+ end
data/lib/c3d/publish.rb CHANGED
@@ -1,28 +1,33 @@
1
1
  #!/usr/bin/env ruby
2
2
  # based off of work by @mukaibot here: https://github.com/mukaibot/mktorrent/blob/master/lib/mktorrent.rb
3
3
  # and work by @Burgestrand here: https://gist.github.com/Burgestrand/1733611
4
- # note `rhash` dependency
5
4
 
6
- class PublishBlob
5
+ class Publish
7
6
  include Celluloid
8
7
  attr_accessor :tor_file, :blob_file, :sha1_trun
9
8
 
10
- def initialize blob, swarm_puller, eth_connector, sending_addr, contract_id, thread_id
9
+ def initialize puller, eth, blob, sending_addr, contract_id='', group_id=''
10
+ @swarm_puller = puller
11
+ @eth = eth
11
12
  @piecelength = 32 * 1024
12
- @eth = eth_connector
13
- prepare blob
14
- build
15
- write_torrent
16
- publish_torrent swarm_puller
17
- publish_ethereum sending_addr, contract_id, thread_id
13
+
14
+ unless blob == nil
15
+ prepare blob
16
+ build
17
+ write_torrent
18
+ publish_torrent
19
+ end
20
+ unless sending_addr == nil
21
+ publish_ethereum sending_addr, contract_id, group_id
22
+ end
18
23
  end
19
24
 
20
25
  private
21
26
  def prepare blob
22
27
  sha1_full = Digest::SHA1.hexdigest blob
23
28
  @sha1_trun = sha1_full[0..23]
24
- @tor_file = File.join(TORRENTS_DIR, "#{sha1_trun}.torrent")
25
- @blob_file = File.join(BLOBS_DIR, sha1_trun)
29
+ @tor_file = File.join(ENV['TORRENTS_DIR'], "#{sha1_trun}.torrent")
30
+ @blob_file = File.join(ENV['BLOBS_DIR'], sha1_trun)
26
31
  File.open(@blob_file, 'w'){|f| f.write(blob)}
27
32
  @files = [{ path: @blob_file.split('/'), length: File::open(@blob_file).size }]
28
33
  end
@@ -69,8 +74,9 @@ class PublishBlob
69
74
  puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Torrent Link >> \t" + "#{@tor_file}"
70
75
  end
71
76
 
72
- def publish_torrent swarm_puller
73
- torrent = swarm_puller.create @tor_file
77
+ def publish_torrent
78
+ p "#{@swarm_puller}"
79
+ torrent = @swarm_puller.create @tor_file
74
80
  begin
75
81
  @btih = torrent["torrent-added"]['hashString']
76
82
  rescue
@@ -80,23 +86,16 @@ class PublishBlob
80
86
  puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Magnet Link >> \t" + mag_link
81
87
  end
82
88
 
83
- def publish_ethereum sending_addr, contract_id, thread_id
89
+ def publish_ethereum sending_addr, contract_id, group_id
84
90
  message = {}
85
- sending_addr ||= 'a6cb63ec28c12929bee2d3567bf98f374a0b7167'
86
- contract_id ||= 'd00383d79aaede0ed34fab69e932a878e00a8938'
87
- thread_id ||= '0x2A519DE3379D1192150778F9A6B1F1FFD8EF0EDAC9C91FA7E6F1853700600000'
88
- post_id ||= "0x#{@btih}#{@sha1_trun}"
89
- message['command'] = 'c3dRequestsAddBlob'
90
- message['params'] = [
91
- sending_addr, #senderaddr
92
- '', #value
93
- contract_id, #recipientaddr
94
- '10000', #gas
95
- '3', #dataslots
96
- 'newp', #....data
97
- thread_id,
91
+ post_id = "0x#{@btih}#{@sha1_trun}"
92
+ data = [
93
+ '3', #data_slots
94
+ 'newp', #....data
95
+ group_id,
98
96
  post_id
99
97
  ]
100
- @eth.write JSON.dump message
98
+ @eth.transact contract_id, sending_addr, data
101
99
  end
102
100
  end
101
+
data/lib/c3d/setup.rb ADDED
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby
2
+ require 'celluloid/autostart'
3
+ require 'fileutils'
4
+
5
+ class SetupC3D
6
+ include Celluloid
7
+
8
+ def initialize
9
+ set_deps
10
+ config = get_config
11
+ set_the_env config
12
+ set_trans_config config
13
+ set_c3d_config config
14
+ end
15
+
16
+ def set_deps
17
+ dep_exist? 'transmission-daemon', 'sudo apt-get install transmission-daemon'
18
+ dep_exist? 'node', 'sudo apt-get install nodejs'
19
+ unless File.directory? File.join(File.dirname(__FILE__), '..', '..', 'node_modules', 'c3d')
20
+ `cd #{File.join(File.dirname(__FILE__), '..', '..')} && npm install c3d`
21
+ end
22
+ end
23
+
24
+ def get_config
25
+ dir_exist? File.join(ENV['HOME'], '.epm')
26
+ config_file = File.join(ENV['HOME'], '.epm', 'c3d-config.json')
27
+ config_example = File.join(File.dirname(__FILE__), '..', '..', 'settings', 'c3d-config.json')
28
+ unless File.exists? config_file
29
+ FileUtils.cp config_example, config_file
30
+ end
31
+ return JSON.load(File.read(config_file))
32
+ end
33
+
34
+ def set_the_env config
35
+ ENV['SWARM_DIR'] = config['swarm_dir']
36
+ ENV['TORRENTS_DIR'] = config['torrents_dir']
37
+ ENV['BLOBS_DIR'] = config['blobs_dir']
38
+ ENV['WATCH_FILE'] = config['watch_file']
39
+ ENV['IGNORE_FILE'] = config['ignore_file']
40
+ ENV['TORRENT_RPC'] = config['torrent_rpc']
41
+ ENV['TORRENT_USER'] = config['torrent_user']
42
+ ENV['TORRENT_PASS'] = config['torrent_pass']
43
+ ENV['UI_ADDRESS'] = config['ui_address']
44
+ ENV['ETH_ZMQ_ADDR'] = config['eth_zmq_addr']
45
+ ENV['ETH_HOST'] = config['eth_host']
46
+ ENV['ETH_PORT'] = config['eth_port']
47
+ end
48
+
49
+ def set_trans_config config
50
+ trans_file = File.join(ENV['HOME'], '.epm', 'settings.json')
51
+ trans_example = File.join(File.dirname(__FILE__), '..', '..', 'settings', 'transmission.json')
52
+ unless File.exists? trans_file
53
+ FileUtils.cp trans_example, trans_file
54
+ end
55
+ trans_config = JSON.load(File.read(trans_file))
56
+ trans_config["incomplete-dir"] = config['download_dir']
57
+ trans_config["download-queue-size"] = config['download-queue-size'].to_i
58
+ trans_config["queue-stalled-minutes"] = config['queue-stalled-minutes'].to_i
59
+ trans_config["seed-queue-size"] = config['seed-queue-size'].to_i
60
+ File.open(trans_file, 'w'){|f| f.write(JSON.pretty_generate(trans_config))}
61
+ end
62
+
63
+ def set_c3d_config config
64
+ dir_exist? ENV['SWARM_DIR']
65
+ dir_exist? ENV['TORRENTS_DIR']
66
+ dir_exist? ENV['BLOBS_DIR']
67
+ dir_exist? config['download_dir']
68
+ file_exist? ENV['WATCH_FILE']
69
+ file_exist? ENV['IGNORE_FILE']
70
+ end
71
+
72
+ def dir_exist? directry
73
+ unless File.directory? directry
74
+ Dir.mkdir directry
75
+ end
76
+ end
77
+
78
+ def file_exist? fil
79
+ unless File.exists? fil
80
+ File.open(fil, "w") {}
81
+ end
82
+ end
83
+
84
+ def dep_exist? dependency, fixer
85
+ unless which dependency
86
+ `#{fixer}`
87
+ end
88
+ end
89
+
90
+ def which cmd
91
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
92
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
93
+ exts.each { |ext|
94
+ exe = File.join(path, "#{cmd}#{ext}")
95
+ return exe if File.executable? exe
96
+ }
97
+ end
98
+ return nil
99
+ end
100
+ end
101
+
102
+ if __FILE__==$0
103
+ require 'json'
104
+ SetupC3D.new
105
+ end
data/lib/c3d/subscribe.rb CHANGED
@@ -7,28 +7,72 @@
7
7
  # * `unsubscribe-g` remove a group's blobs from the subscribed list (params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
8
8
  # * `ignore-g` add a group to the ignore list (params: contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
9
9
 
10
- class Subscriber
10
+ require 'json'
11
+ require 'celluloid/autostart'
12
+ require 'base64'
13
+
14
+ class Subscribe
11
15
  include Celluloid
12
16
  attr_accessor :tor_file, :blob_file, :sha1_trun
13
17
 
14
- def initialize action
18
+ def initialize action, eth
19
+ @eth = eth
15
20
  case action
16
- when 'subscribe-k'
21
+ when 'subscribeK'
17
22
  subscribe_k
18
- when 'subscribe-g'
23
+ when 'subscribeG'
19
24
  subscribe_g
20
- when 'unsubscribe-k'
25
+ when 'unsubscribeK'
21
26
  unsubscribe_k
22
- when 'unsubscribe-g'
27
+ when 'unsubscribeG'
23
28
  unsubscribe_g
24
- when 'ignore-g'
29
+ when 'ignoreG'
25
30
  ignore_g
26
- when 'assemble-calls'
31
+ when 'assembleQueries'
27
32
  assemble_queries
28
33
  end
29
34
  end
30
35
 
31
36
  def assemble_queries
37
+ # watched, ignored = load_library
38
+ # watched[contract] = [group1,group2] || watched[contract]=[] <=all
39
+ watched = {"97d1f086800920e8fd2344be52fb22d7bf6036d2" => []}
40
+ watched.each_key do |contract|
41
+ # todo - build
42
+ latest_group = send_query contract, '0x18'
43
+ latest_group_author = send_query contract, latest_group
44
+ step = iterate latest_group
45
+ prev_group = send_query contract, step # prev_group == '0x16' => first_group
46
+ step = iterate step
47
+ next_group = send_query contract, step # next_group == '0x' => last_group
48
+ step = iterate step
49
+ title1 = send_query contract, step
50
+ step = iterate step
51
+ title2 = send_query contract, step
52
+ title = eth_strings title1
53
+ title << eth_strings(title2) unless title2 == '0x'
54
+ step = iterate step
55
+ posts_in_group = (send_query contract, step).to_i(16)
56
+ step = iterate step
57
+ latest_blob = send_query contract, step
58
+ p latest_group
59
+ p latest_group_author
60
+ p next_group
61
+ p prev_group
62
+ p title
63
+ p posts_in_group
64
+ p latest_blob
65
+ next_blob = ''
66
+ until next_blob == '0x'
67
+ next_blob = send_query contract, latest_blob
68
+ latest_blob_author = send_query contract, latest_blob.next
69
+ blob_id = send_query contract, latest_blob.next.next
70
+ p next_blob
71
+ p latest_blob_author
72
+ get_the_blob blob_id unless do_i_have_it? blob_id
73
+ latest_blob = next_blob
74
+ end
75
+ end
32
76
  #read watcher file && build hash
33
77
  #read igored file && delete from hash
34
78
  #for each watched contract
@@ -40,4 +84,55 @@ class Subscriber
40
84
  #if that number has changed, loop through the posts and check that each
41
85
  end
42
86
 
87
+ private
88
+
89
+ def load_library
90
+ watched = JSON.load File.read ENV['WATCH_FILE']
91
+ ignored = JSON.load File.read ENV['IGNORE_FILE']
92
+ [watched, ignored]
93
+ end
94
+
95
+ def send_query contract, storage
96
+ @eth.get_storage_at contract, storage
97
+ end
98
+
99
+ def eth_strings input
100
+ input.scan(/../).map{|x| x.hex }.reject{|c| c == 0}.pack('c*')
101
+ end
102
+
103
+ def iterate input
104
+ last_place = input[-1]
105
+ input[-1] = last_place.next
106
+ input
107
+ end
108
+
109
+ def do_i_have_it? blob
110
+ dn = blob[42..-1]
111
+ p 'dont have this'
112
+ File.exists?(File.join(ENV['BLOBS_DIR'], dn))
113
+ end
114
+
115
+ def get_the_blob blob
116
+ btih = blob[2..41]
117
+ dn = blob[42..-1]
118
+ link = "magnet:?xt=urn:btih:" + btih + "&dn=" + dn
119
+ p 'getting_link'
120
+ torrent = @@swarm_puller.create link
121
+ p torrent
122
+ end
123
+ end
124
+
125
+ if __FILE__==$0
126
+ require './connect_ethereum.rb'
127
+ require './connect_torrent'
128
+ require 'yaml'
129
+ require 'httparty'
130
+ @@swarm_puller = TorrentAPI.new(
131
+ username: ENV['TORRENT_USER'],
132
+ password: ENV['TORRENT_PASS'],
133
+ url: ENV['TORRENT_RPC'],
134
+ debug_mode: true
135
+ )
136
+ questions_for_eth = ConnectEth.new :zmq, :cpp
137
+ Subscribe.new 'assembleQueries', questions_for_eth
43
138
  end
data/lib/c3d/util.rb ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # based off of work by @mukaibot here: https://github.com/mukaibot/mktorrent/blob/master/lib/mktorrent.rb
3
+ # and work by @Burgestrand here: https://gist.github.com/Burgestrand/1733611
4
+ # note `rhash` dependency
5
+
6
+ module Utility
7
+ def self.add_group_to_ethereum sending_addr, contract_id, title, eth
8
+ message = {}
9
+ message['command'] = 'transact'
10
+ message['params'] = [
11
+ sending_addr, #sender_addr
12
+ '', #value
13
+ contract_id, #recipient_addr
14
+ '10000', #gas
15
+ '2', #data_slots
16
+ 'newt', #....data
17
+ title
18
+ ]
19
+ eth.write JSON.dump message
20
+ ### somehow this is not currently working.
21
+ end
22
+ end
data/lib/c3d/version.rb CHANGED
@@ -1 +1 @@
1
- VERSION = "0.3.0"
1
+ VERSION = "0.3.5"
@@ -0,0 +1,17 @@
1
+ {
2
+ "swarm_dir": "/home/coda/.cache/c3d",
3
+ "torrents_dir": "/home/coda/.cache/c3d/torrents",
4
+ "blobs_dir": "/home/coda/.cache/c3d/blobs",
5
+ "watch_file": "/home/coda/.cache/c3d/watchers.json",
6
+ "torrent_rpc": "http://127.0.0.1:9091/transmission/rpc",
7
+ "torrent_user": "username",
8
+ "torrent_pass": "password",
9
+ "ui_address": "tcp://127.0.0.1:31314",
10
+ "eth_zmq_addr": "tcp://127.0.0.1:31315",
11
+ "eth_host": "localhost",
12
+ "eth_port": "9090",
13
+ "ignore_file": "/home/coda/.cache/c3d/ignored.json",
14
+ "download_dir": "/home/coda/.cache/c3d/downloading",
15
+ "download-queue-size": "50",
16
+ "queue-stalled-minutes": "98"
17
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "alt-speed-down": 50,
3
+ "alt-speed-enabled": false,
4
+ "alt-speed-time-begin": 540,
5
+ "alt-speed-time-day": 127,
6
+ "alt-speed-time-enabled": false,
7
+ "alt-speed-time-end": 1020,
8
+ "alt-speed-up": 50,
9
+ "bind-address-ipv4": "0.0.0.0",
10
+ "bind-address-ipv6": "::",
11
+ "blocklist-enabled": false,
12
+ "blocklist-url": "http://www.example.com/blocklist",
13
+ "cache-size-mb": 4,
14
+ "dht-enabled": true,
15
+ "download-dir": "/home/coda/.cache/c3d/blobs",
16
+ "download-queue-enabled": true,
17
+ "download-queue-size": 50,
18
+ "encryption": 2,
19
+ "idle-seeding-limit": 30,
20
+ "idle-seeding-limit-enabled": false,
21
+ "incomplete-dir": "/home/coda/.cache/c3d/downloading",
22
+ "incomplete-dir-enabled": false,
23
+ "lpd-enabled": false,
24
+ "message-level": 2,
25
+ "peer-congestion-algorithm": "",
26
+ "peer-id-ttl-hours": 6,
27
+ "peer-limit-global": 200,
28
+ "peer-limit-per-torrent": 50,
29
+ "peer-port": 51413,
30
+ "peer-port-random-high": 65535,
31
+ "peer-port-random-low": 49152,
32
+ "peer-port-random-on-start": false,
33
+ "peer-socket-tos": "default",
34
+ "pex-enabled": true,
35
+ "port-forwarding-enabled": true,
36
+ "preallocation": 1,
37
+ "prefetch-enabled": 1,
38
+ "queue-stalled-enabled": true,
39
+ "queue-stalled-minutes": 98,
40
+ "ratio-limit": 2,
41
+ "ratio-limit-enabled": false,
42
+ "rename-partial-files": true,
43
+ "rpc-authentication-required": false,
44
+ "rpc-bind-address": "0.0.0.0",
45
+ "rpc-enabled": true,
46
+ "rpc-password": "{e2f58ad4b908bfce4bc698c730b5b49e2cceea26.21gDuIy",
47
+ "rpc-port": 9091,
48
+ "rpc-url": "/transmission/",
49
+ "rpc-username": "",
50
+ "rpc-whitelist": "127.0.0.1",
51
+ "rpc-whitelist-enabled": true,
52
+ "scrape-paused-torrents-enabled": true,
53
+ "script-torrent-done-enabled": false,
54
+ "script-torrent-done-filename": "",
55
+ "seed-queue-enabled": false,
56
+ "seed-queue-size": 0,
57
+ "speed-limit-down": 100,
58
+ "speed-limit-down-enabled": false,
59
+ "speed-limit-up": 100,
60
+ "speed-limit-up-enabled": false,
61
+ "start-added-torrents": true,
62
+ "trash-original-torrent-files": false,
63
+ "umask": 18,
64
+ "upload-slots-per-torrent": 14,
65
+ "utp-enabled": true,
66
+ "watch-dir-enabled": false
67
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c3d
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Casey Kuhlman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-20 00:00:00.000000000 Z
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -82,16 +82,20 @@ files:
82
82
  - README.md
83
83
  - Rakefile
84
84
  - c3d.gemspec
85
- - ethereum_bridge.js
86
85
  - lib/c3d.rb
87
- - lib/c3d/connect_ethereum.rb
86
+ - lib/c3d/connect_ethereum_rpc.rb
87
+ - lib/c3d/connect_ethereum_socket.rb
88
88
  - lib/c3d/connect_torrent.rb
89
89
  - lib/c3d/connect_ui.rb
90
90
  - lib/c3d/get.rb
91
+ - lib/c3d/processes.rb
91
92
  - lib/c3d/publish.rb
93
+ - lib/c3d/setup.rb
92
94
  - lib/c3d/subscribe.rb
95
+ - lib/c3d/util.rb
93
96
  - lib/c3d/version.rb
94
- - lib/system-setup.rb
97
+ - settings/c3d-config.json
98
+ - settings/transmission.json
95
99
  - spec/checker.rb
96
100
  - spec/checker2.rb
97
101
  - spec/tmp
data/ethereum_bridge.js DELETED
@@ -1,61 +0,0 @@
1
- var strftime = require('strftime');
2
-
3
- var c3dAddress = 'tcp://127.0.0.1:31315';
4
-
5
- var zeromq = require('zmq');
6
- var c3dSocket = zeromq.socket('rep');
7
- c3dSocket.identity = 'uiResponder' + process.pid;
8
-
9
- var ethBridge = require('socket.io').listen(31313);
10
-
11
- if (!Array.prototype.last){
12
- Array.prototype.last = function(){
13
- return this[this.length - 1];
14
- };
15
- };
16
-
17
- console.log( "[C3D-EPM::" + strftime('%F %T', new Date()) + "] eth<-c3d on port >>\t" + c3dAddress.split(':').last() );
18
-
19
- c3dSocket.bind(c3dAddress, function(err) {
20
- if (err) throw err;
21
- ethBridge.sockets.on('connection', function(ethBridgeSocket) {
22
-
23
- c3dSocket.on('message', function(data) {
24
-
25
- var self = this;
26
- var question = JSON.parse(data.toString());
27
- console.log( "[C3D-EPM::" + strftime('%F %T', new Date()) + "] Question asked >>\t" + question.command );
28
-
29
- if ( question.command == 'c3dRequestsAddBlob') {
30
- ethBridgeSocket.emit('transact', question.params);
31
-
32
- ethBridgeSocket.on('transact', function(response) {
33
- respond(response,c3dSocket);
34
- });
35
- } else if ( question.command == 'c3dRequestsAddresses' ) {
36
- ethBridgeSocket.emit('getAddresses');
37
-
38
- ethBridgeSocket.on('getAddresses', function(response) {
39
- respond(response,c3dSocket);
40
- });
41
- } else if ( question.command == 'c3dRequestsStorage') {
42
- ethBridgeSocket.emit('getStorageAt', question.params);
43
-
44
- ethBridgeSocket.on('getStorageAt', function(response) {
45
- respond(response, c3dSocket);
46
- });
47
- };
48
- });
49
- });
50
- });
51
-
52
- respond = function(response, c3dSocket) {
53
- answer = {success: 'true', answer: response};
54
- console.log( "[C3D-EPM::" + strftime('%F %T', new Date()) + "] Sending answer >>\t" + answer.success );
55
- c3dSocket.send(JSON.stringify(answer));
56
- };
57
-
58
- process.on('SIGINT', function() {
59
- c3dSocket.close();
60
- ethBridge.socket.close();
61
- });
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Transactions:
4
- # * `add-blob-to-g`: add blob to group (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
5
- # * `rm-blob-from-g`: remove blob from contract (params: blob: "BLOB_ID", contract: "CONTRACT_ADDRESS", group: "GROUP_ID") (returns success: true or error)
6
-
7
- require 'json'
8
- require 'celluloid/zmq'
9
-
10
- Celluloid::ZMQ.init
11
-
12
- class ConnectEth
13
- include Celluloid::ZMQ
14
-
15
- def initialize
16
- @question_socket = ReqSocket.new
17
- begin
18
- @question_socket.connect ETH_ADDRESS
19
- rescue IOError
20
- @question_socket.close
21
- end
22
- puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] c3D->eth on port >>\t#{ETH_ADDRESS.split(':').last}"
23
- end
24
-
25
- def write message
26
- puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Sending Question >>\t#{message}"
27
- @question_socket.send message
28
- handle_response JSON.load(@question_socket.read)
29
- end
30
-
31
- def handle_response response
32
- puts "[C3D-EPM::#{Time.now.strftime( "%F %T" )}] Received Answer >>\tsuccess:#{response['success']}\tanswer:#{response['answer']}"
33
- end
34
- end
35
-
36
- if __FILE__==$0
37
- ETH_ADDRESS = 'tcp://127.0.0.1:31315'
38
-
39
- message = {}
40
- message['command'] = 'c3dRequestsAddBlob'
41
- message['params'] = [
42
- 'a6cb63ec28c12929bee2d3567bf98f374a0b7167', #senderaddr
43
- '', #value
44
- 'd00383d79aaede0ed34fab69e932a878e00a8938', #recipientaddr
45
- '10000', #gas
46
- '3', #dataslots
47
- 'newp', #....data
48
- '0x2A519DE3379D1192150778F9A6B1F1FFD8EF0EDAC9C91FA7E6F1853700600000',
49
- '0x1d822cb2e4c60c3a8a85546304072b14fb9de94e2c0c608c4120b5d529590c9d'
50
- ]
51
- questions_for_eth = ConnectEth.new
52
- questions_for_eth.write JSON.dump message
53
-
54
- message = {}
55
- message['command'] = 'c3dRequestsAddresses'
56
- questions_for_eth.write JSON.dump message
57
-
58
- message = {}
59
- message['command'] = 'c3dRequestsStorage'
60
- message['params'] = [
61
- 'd00383d79aaede0ed34fab69e932a878e00a8938',
62
- '0x2A519DE3379D1192150778F9A6B1F1FFD8EF0EDAC9C91FA7E6F1853700600003'
63
- ]
64
- questions_for_eth.write JSON.dump message
65
-
66
- sleep
67
- end
data/lib/system-setup.rb DELETED
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- def check_system
4
-
5
- # Check for the SWARM_DIR Directory
6
- unless File.directory?(SWARM_DIR)
7
- Dir.mkdir SWARM_DIR
8
- end
9
-
10
- # Check for the TORRENTS_DIR Directory
11
- unless File.directory?(TORRENTS_DIR)
12
- Dir.mkdir TORRENTS_DIR
13
- end
14
-
15
- # Check for the BLOBS_DIR Directory
16
- unless File.directory?(BLOBS_DIR)
17
- Dir.mkdir BLOBS_DIR
18
- end
19
-
20
- # Check Ruby Bundled Assets & Set Asset Paths
21
- unless system 'bundle check > /dev/null'
22
- p 'Bundle is not installed. Installing now....'
23
- system 'rake install'
24
- p 'I have installed everything, but I need you to restart me'
25
- return false
26
- end
27
-
28
- p "System all setup and Ready."
29
- end
30
-
31
- def which cmd
32
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
33
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
34
- exts.each { |ext|
35
- exe = File.join(path, "#{cmd}#{ext}")
36
- return exe if File.executable? exe
37
- }
38
- end
39
- return nil
40
- end