cardano-up 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +22 -5
- data/bin/cardano-up +263 -42
- data/lib/cardano-up/{install.rb → bins.rb} +22 -55
- data/lib/cardano-up/configs.rb +39 -0
- data/lib/cardano-up/err.rb +51 -2
- data/lib/cardano-up/launcher.rb +263 -0
- data/lib/cardano-up/ping.rb +52 -0
- data/lib/cardano-up/session.rb +153 -0
- data/lib/cardano-up/utils.rb +42 -31
- data/lib/cardano-up/version.rb +1 -1
- data/lib/cardano-up.rb +18 -14
- metadata +20 -17
- data/lib/cardano-up/start.rb +0 -248
data/lib/cardano-up/err.rb
CHANGED
@@ -1,6 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module CardanoUp
|
4
|
+
# Thrown when service not exists in session
|
5
|
+
class SessionServiceNotUpError < StandardError
|
6
|
+
def initialize(session_name, env, service)
|
7
|
+
super("Service '#{service}' is not running on '#{env}' in session '#{session_name}'!")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Thrown when env not exists in session
|
12
|
+
class SessionEnvNotUpError < StandardError
|
13
|
+
def initialize(session_name, env)
|
14
|
+
super("Nothing is running on '#{env}' in session '#{session_name}'!")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Thrown when session not exists
|
19
|
+
class SessionNotExistsError < StandardError
|
20
|
+
def initialize(session_name)
|
21
|
+
super("Session '#{session_name}' does not exist!")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Thrown when there is already a node running in the session
|
26
|
+
class SessionHasNodeError < StandardError
|
27
|
+
def initialize(session_name, network)
|
28
|
+
super("Session '#{session_name}' already has node running on '#{network}'!")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Thrown when there is already a wallet running in the session
|
33
|
+
class SessionHasWalletError < StandardError
|
34
|
+
def initialize(session_name, network)
|
35
|
+
super("Session '#{session_name}' already has wallet running on '#{network}'!")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
4
39
|
# Thrown when env is not supported
|
5
40
|
class EnvNotSupportedError < StandardError
|
6
41
|
def initialize(env)
|
@@ -22,11 +57,25 @@ module CardanoUp
|
|
22
57
|
end
|
23
58
|
end
|
24
59
|
|
60
|
+
# Thrown when wallet port is not set
|
61
|
+
class WalletPortUsedError < StandardError
|
62
|
+
def initialize(port)
|
63
|
+
super("The port #{port} is already in use!")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
25
67
|
# Thrown when version of bundle to download is not supported
|
26
68
|
class VersionNotSupportedError < StandardError
|
27
69
|
def initialize(ver)
|
28
|
-
super(["Not supported version: #{ver}. Supported are: 'latest'
|
29
|
-
"tag (e.g. 'v2022-08-16')
|
70
|
+
super(["Not supported version: #{ver}. Supported are: 'latest' or",
|
71
|
+
"tag (e.g. 'v2022-08-16')"].join(' '))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Thrown when there is no screen on the system
|
76
|
+
class NoScreenError < StandardError
|
77
|
+
def initialize
|
78
|
+
super('There is no screen tool on the system!')
|
30
79
|
end
|
31
80
|
end
|
32
81
|
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CardanoUp
|
4
|
+
##
|
5
|
+
# Start/stop cardano-node and cardano-wallet on your system.
|
6
|
+
#
|
7
|
+
# For Linux and MacOS it will attempt to start separate screen sessions for
|
8
|
+
# wallet and node respectively, therefore 'screen' tool is required on your system.
|
9
|
+
# @see https://www.gnu.org/software/screen/
|
10
|
+
# If screen is not present you can install it using your package manager for instance:
|
11
|
+
# # MacOS:
|
12
|
+
# brew install screen
|
13
|
+
# # Linux:
|
14
|
+
# sudo apt-get install screen
|
15
|
+
#
|
16
|
+
# For Windows it will attepmt to install cardano-node and cardano-wallet as Windows services
|
17
|
+
# using 'nssm' tool.
|
18
|
+
# @see https://nssm.cc/
|
19
|
+
# Nssm can be installed via choco package manager:
|
20
|
+
# choco install nssm
|
21
|
+
module Launcher
|
22
|
+
# Create common set of variables for getting node and wallet up
|
23
|
+
# @param env [Hash] provide env and wallet_port,
|
24
|
+
# e.g. { env: 'mainnet', wallet_port: '8090', session_name: '0' }
|
25
|
+
# @raise CardanoUp::EnvNotSupportedError
|
26
|
+
# @raise CardanoUp::WalletPortError
|
27
|
+
def self.setup(opt = { env: 'mainnet', wallet_port: '8090', session_name: '0' })
|
28
|
+
env = opt[:env]
|
29
|
+
raise CardanoUp::EnvNotSupportedError, env unless CardanoUp::ENVS.include? env
|
30
|
+
|
31
|
+
wallet_port = opt[:wallet_port]
|
32
|
+
raise CardanoUp::WalletPortError if wallet_port.nil? || wallet_port.empty?
|
33
|
+
|
34
|
+
session_name = opt[:session_name] || '0'
|
35
|
+
|
36
|
+
token_metadata_server = env == 'mainnet' ? CardanoUp::MAINNET_TOKEN_SERVER : CardanoUp::TESTNET_TOKEN_SERVER
|
37
|
+
|
38
|
+
CardanoUp.configure_default unless CardanoUp.configured?
|
39
|
+
configs = CardanoUp.config
|
40
|
+
bin_dir = configs[:bin_dir]
|
41
|
+
config_dir = File.join(configs[:config_dir], env)
|
42
|
+
log_dir = File.join(configs[:log_dir], session_name, env)
|
43
|
+
state_dir = File.join(configs[:state_dir], session_name, env)
|
44
|
+
wallet_db_dir = File.join(state_dir, 'wallet-db')
|
45
|
+
node_db_dir = File.join(state_dir, 'node-db')
|
46
|
+
[bin_dir, config_dir, log_dir, state_dir, wallet_db_dir, node_db_dir].each do |dir|
|
47
|
+
FileUtils.mkdir_p(dir)
|
48
|
+
end
|
49
|
+
|
50
|
+
node_socket = if CardanoUp::Utils.win?
|
51
|
+
"\\\\.\\pipe\\cardano-node-#{env}-#{session_name}"
|
52
|
+
else
|
53
|
+
File.join(state_dir, 'node.socket')
|
54
|
+
end
|
55
|
+
network = env == 'mainnet' ? '--mainnet' : "--testnet #{File.join(config_dir, 'byron-genesis.json')}"
|
56
|
+
|
57
|
+
{
|
58
|
+
env: env,
|
59
|
+
wallet_port: wallet_port,
|
60
|
+
token_metadata_server: token_metadata_server,
|
61
|
+
bin_dir: bin_dir,
|
62
|
+
config_dir: config_dir,
|
63
|
+
log_dir: log_dir,
|
64
|
+
state_dir: state_dir,
|
65
|
+
wallet_db_dir: wallet_db_dir,
|
66
|
+
node_db_dir: node_db_dir,
|
67
|
+
node_socket: node_socket,
|
68
|
+
network: network,
|
69
|
+
session_name: session_name
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
# @param configuration [Hash] output of setup
|
74
|
+
# @raise CardanoUp::SessionHasNodeError
|
75
|
+
# @raise CardanoUp::SessionHasWalletError
|
76
|
+
# @raise CardanoUp::NoScreenError
|
77
|
+
def self.node_up(configuration)
|
78
|
+
env = configuration[:env]
|
79
|
+
bin_dir = configuration[:bin_dir]
|
80
|
+
config_dir = configuration[:config_dir]
|
81
|
+
log_dir = configuration[:log_dir]
|
82
|
+
node_db_dir = configuration[:node_db_dir]
|
83
|
+
node_socket = configuration[:node_socket]
|
84
|
+
session_name = configuration[:session_name]
|
85
|
+
|
86
|
+
raise CardanoUp::NoScreenError if !CardanoUp::Utils.win? && !CardanoUp::Utils.screen?
|
87
|
+
|
88
|
+
exe = CardanoUp::Utils.win? ? '.exe' : ''
|
89
|
+
cardano_node = "#{File.join(bin_dir, 'cardano-node')}#{exe}"
|
90
|
+
version = CardanoUp::Utils.cmd "#{cardano_node} version"
|
91
|
+
node_cmd = ["#{cardano_node} run",
|
92
|
+
"--config #{File.join(config_dir, 'config.json')}",
|
93
|
+
"--topology #{File.join(config_dir, 'topology.json')}",
|
94
|
+
"--database-path #{node_db_dir}",
|
95
|
+
"--socket-path #{node_socket}"].join(' ')
|
96
|
+
node_service = if CardanoUp::Utils.win?
|
97
|
+
"cardano-node-#{env}-#{session_name}"
|
98
|
+
else
|
99
|
+
"NODE_#{env}_#{session_name}"
|
100
|
+
end
|
101
|
+
logfile = File.join(log_dir, 'node.log')
|
102
|
+
service_details = {
|
103
|
+
network: env,
|
104
|
+
node: {
|
105
|
+
service: node_service,
|
106
|
+
version: version,
|
107
|
+
log: logfile,
|
108
|
+
db_dir: node_db_dir,
|
109
|
+
socket_path: node_socket,
|
110
|
+
protocol_magic: get_protocol_magic(config_dir),
|
111
|
+
bin: node_cmd.split.first,
|
112
|
+
cmd: node_cmd
|
113
|
+
}
|
114
|
+
}
|
115
|
+
CardanoUp::Session.create_or_update(session_name, service_details)
|
116
|
+
if CardanoUp::Utils.win?
|
117
|
+
# Turn off p2p for Windows
|
118
|
+
# TODO: remove after https://github.com/input-output-hk/ouroboros-network/issues/3968 released
|
119
|
+
config_win = CardanoUp::Utils.from_json("#{config_dir}/config.json")
|
120
|
+
config_win[:EnableP2P] = false
|
121
|
+
CardanoUp::Utils.to_json("#{config_dir}/config.json", config_win)
|
122
|
+
topology = {
|
123
|
+
Producers: [
|
124
|
+
{
|
125
|
+
addr: "#{env}-node.world.dev.cardano.org",
|
126
|
+
port: 30_002,
|
127
|
+
valency: 2
|
128
|
+
}
|
129
|
+
]
|
130
|
+
}
|
131
|
+
CardanoUp::Utils.to_json("#{config_dir}/topology.json", topology)
|
132
|
+
|
133
|
+
# create cardano-node.bat file
|
134
|
+
File.write("#{bin_dir}/cardano-node.bat", node_cmd)
|
135
|
+
install_node = "nssm install #{node_service} #{bin_dir}/cardano-node.bat"
|
136
|
+
log_stdout_node = "nssm set #{node_service} AppStdout #{logfile}"
|
137
|
+
log_stderr_node = "nssm set #{node_service} AppStderr #{logfile}"
|
138
|
+
start_node = "nssm start #{node_service}"
|
139
|
+
|
140
|
+
CardanoUp::Utils.cmd install_node
|
141
|
+
CardanoUp::Utils.cmd log_stdout_node
|
142
|
+
CardanoUp::Utils.cmd log_stderr_node
|
143
|
+
CardanoUp::Utils.cmd start_node
|
144
|
+
else
|
145
|
+
screen_cmd = "screen -dmS #{node_service} -L -Logfile #{logfile} #{node_cmd}"
|
146
|
+
CardanoUp::Utils.cmd screen_cmd
|
147
|
+
end
|
148
|
+
service_details
|
149
|
+
end
|
150
|
+
|
151
|
+
# @param configuration [Hash] output of setup
|
152
|
+
# @raise CardanoUp::NoScreenError
|
153
|
+
# @raise CardanoUp::WalletPortUsedError
|
154
|
+
def self.wallet_up(configuration)
|
155
|
+
if CardanoUp::Utils.port_used?(configuration[:wallet_port].to_i)
|
156
|
+
raise CardanoUp::WalletPortUsedError, configuration[:wallet_port]
|
157
|
+
end
|
158
|
+
|
159
|
+
raise CardanoUp::NoScreenError if !CardanoUp::Utils.win? && !CardanoUp::Utils.screen?
|
160
|
+
|
161
|
+
env = configuration[:env]
|
162
|
+
wallet_port = configuration[:wallet_port]
|
163
|
+
token_metadata_server = configuration[:token_metadata_server]
|
164
|
+
bin_dir = configuration[:bin_dir]
|
165
|
+
log_dir = configuration[:log_dir]
|
166
|
+
wallet_db_dir = configuration[:wallet_db_dir]
|
167
|
+
node_socket = configuration[:node_socket]
|
168
|
+
network = configuration[:network]
|
169
|
+
session_name = configuration[:session_name]
|
170
|
+
|
171
|
+
exe = CardanoUp::Utils.win? ? '.exe' : ''
|
172
|
+
cardano_wallet = "#{File.join(bin_dir, 'cardano-wallet')}#{exe}"
|
173
|
+
wallet_cmd = ["#{cardano_wallet} serve",
|
174
|
+
"--port #{wallet_port}",
|
175
|
+
"--node-socket #{node_socket}",
|
176
|
+
network.to_s,
|
177
|
+
"--database #{wallet_db_dir}",
|
178
|
+
"--token-metadata-server #{token_metadata_server}"].join(' ')
|
179
|
+
version = CardanoUp::Utils.cmd "#{bin_dir}/cardano-wallet#{exe} version"
|
180
|
+
wallet_service = if CardanoUp::Utils.win?
|
181
|
+
"cardano-wallet-#{env}-#{session_name}"
|
182
|
+
else
|
183
|
+
"WALLET_#{env}_#{session_name}"
|
184
|
+
end
|
185
|
+
logfile = File.join(log_dir, 'wallet.log')
|
186
|
+
service_details = {
|
187
|
+
network: env,
|
188
|
+
wallet: {
|
189
|
+
service: wallet_service,
|
190
|
+
version: version,
|
191
|
+
log: logfile,
|
192
|
+
db_dir: wallet_db_dir,
|
193
|
+
port: wallet_port.to_i,
|
194
|
+
url: "http://localhost:#{wallet_port}/v2",
|
195
|
+
bin: wallet_cmd.split.first,
|
196
|
+
cmd: wallet_cmd
|
197
|
+
}
|
198
|
+
}
|
199
|
+
|
200
|
+
CardanoUp::Session.create_or_update(session_name, service_details)
|
201
|
+
if CardanoUp::Utils.win?
|
202
|
+
# create cardano-wallet.bat file
|
203
|
+
File.write("#{bin_dir}/cardano-wallet.bat", wallet_cmd)
|
204
|
+
install_wallet = "nssm install #{wallet_service} #{bin_dir}/cardano-wallet.bat"
|
205
|
+
log_stdout_wallet = "nssm set #{wallet_service} AppStdout #{logfile}"
|
206
|
+
log_stderr_wallet = "nssm set #{wallet_service} AppStderr #{logfile}"
|
207
|
+
start_wallet = "nssm start #{wallet_service}"
|
208
|
+
|
209
|
+
CardanoUp::Utils.cmd install_wallet
|
210
|
+
CardanoUp::Utils.cmd log_stdout_wallet
|
211
|
+
CardanoUp::Utils.cmd log_stderr_wallet
|
212
|
+
CardanoUp::Utils.cmd start_wallet
|
213
|
+
else
|
214
|
+
CardanoUp::Utils.cmd "screen -dmS #{wallet_service} -L -Logfile #{logfile} #{wallet_cmd}"
|
215
|
+
end
|
216
|
+
|
217
|
+
service_details
|
218
|
+
end
|
219
|
+
|
220
|
+
# @raise CardanoUp::EnvNotSupportedError
|
221
|
+
# @raise CardanoUp::NoScreenError
|
222
|
+
def self.node_down(env, session_name = '0')
|
223
|
+
raise CardanoUp::EnvNotSupportedError, env unless CardanoUp::ENVS.include? env
|
224
|
+
|
225
|
+
raise CardanoUp::NoScreenError if !CardanoUp::Utils.win? && !CardanoUp::Utils.screen?
|
226
|
+
|
227
|
+
if CardanoUp::Utils.win?
|
228
|
+
CardanoUp::Utils.cmd "nssm stop cardano-node-#{env}-#{session_name}"
|
229
|
+
CardanoUp::Utils.cmd "nssm remove cardano-node-#{env}-#{session_name} confirm"
|
230
|
+
else
|
231
|
+
CardanoUp::Utils.cmd "screen -S NODE_#{env}_#{session_name} -X at '0' stuff '^C'"
|
232
|
+
CardanoUp::Utils.cmd "screen -XS NODE_#{env}_#{session_name} quit"
|
233
|
+
end
|
234
|
+
CardanoUp::Session.remove(session_name, { network: env, service: 'node' })
|
235
|
+
end
|
236
|
+
|
237
|
+
# @raise CardanoUp::EnvNotSupportedError
|
238
|
+
# @raise CardanoUp::NoScreenError
|
239
|
+
def self.wallet_down(env, session_name = '0')
|
240
|
+
raise CardanoUp::EnvNotSupportedError, env unless CardanoUp::ENVS.include? env
|
241
|
+
|
242
|
+
raise CardanoUp::NoScreenError if !CardanoUp::Utils.win? && !CardanoUp::Utils.screen?
|
243
|
+
|
244
|
+
if CardanoUp::Utils.win?
|
245
|
+
CardanoUp::Utils.cmd "nssm stop cardano-wallet-#{env}-#{session_name}"
|
246
|
+
CardanoUp::Utils.cmd "nssm remove cardano-wallet-#{env}-#{session_name} confirm"
|
247
|
+
else
|
248
|
+
CardanoUp::Utils.cmd "screen -S WALLET_#{env}_#{session_name} -X at '0' stuff '^C'"
|
249
|
+
CardanoUp::Utils.cmd "screen -XS WALLET_#{env}_#{session_name} quit"
|
250
|
+
end
|
251
|
+
CardanoUp::Session.remove(session_name, { network: env, service: 'wallet' })
|
252
|
+
end
|
253
|
+
|
254
|
+
##
|
255
|
+
# Get protocol magic from config's byron-genesis.json
|
256
|
+
def get_protocol_magic(config)
|
257
|
+
byron_genesis = CardanoUp::Utils.from_json(File.join(config, 'byron-genesis.json'))
|
258
|
+
byron_genesis[:protocolConsts][:protocolMagic].to_i
|
259
|
+
end
|
260
|
+
module_function :get_protocol_magic
|
261
|
+
private_class_method :get_protocol_magic
|
262
|
+
end
|
263
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CardanoUp
|
4
|
+
# Check status (ping) of running node and wallet services
|
5
|
+
module Ping
|
6
|
+
# @param session_name [String]
|
7
|
+
# @param env [String]
|
8
|
+
# @raise CardanoUp::EnvNotSupportedError
|
9
|
+
# @raise CardanoUp::SessionNotExistsError
|
10
|
+
# @raise CardanoUp::SessionServiceNotUpError
|
11
|
+
# @raise CardanoUp::SessionEnvNotUpError
|
12
|
+
def self.wallet(session_name, env)
|
13
|
+
CardanoUp::Configs.exist?(env)
|
14
|
+
CardanoUp::Session.network_or_raise?(session_name, env.to_sym)
|
15
|
+
CardanoUp::Session.wallet_or_raise?(session_name, env.to_sym)
|
16
|
+
session = CardanoUp::Session.get(session_name)
|
17
|
+
|
18
|
+
url = session[env.to_sym][:wallet][:url]
|
19
|
+
r = HTTParty.get("#{url}/network/information")
|
20
|
+
[r.parsed_response, r.code]
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param session_name [String]
|
24
|
+
# @param env [String]
|
25
|
+
# @raise CardanoUp::EnvNotSupportedError
|
26
|
+
# @raise CardanoUp::SessionNotExistsError
|
27
|
+
# @raise CardanoUp::SessionServiceNotUpError
|
28
|
+
# @raise CardanoUp::SessionEnvNotUpError
|
29
|
+
def self.node(session_name, env)
|
30
|
+
CardanoUp::Configs.exist?(env)
|
31
|
+
CardanoUp::Session.network_or_raise?(session_name, env.to_sym)
|
32
|
+
CardanoUp::Session.node_or_raise?(session_name, env.to_sym)
|
33
|
+
session = CardanoUp::Session.get(session_name)
|
34
|
+
bin_dir = CardanoUp.config[:bin_dir]
|
35
|
+
|
36
|
+
ENV['CARDANO_NODE_SOCKET_PATH'] = session[env.to_sym][:node][:socket_path]
|
37
|
+
protocol_magic = session[env.to_sym][:node][:protocol_magic]
|
38
|
+
network_arg = env == 'mainnet' ? '--mainnet' : "--testnet-magic #{protocol_magic}"
|
39
|
+
exe = CardanoUp::Utils.win? ? '.exe' : ''
|
40
|
+
cmd = "#{File.join(bin_dir, 'cardano-cli')}#{exe} query tip #{network_arg}"
|
41
|
+
res = CardanoUp::Utils.cmd cmd
|
42
|
+
begin
|
43
|
+
r = JSON.parse(res)
|
44
|
+
c = 200
|
45
|
+
rescue JSON::ParserError
|
46
|
+
r = 'Not responding.'
|
47
|
+
c = 404
|
48
|
+
end
|
49
|
+
[r, c]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CardanoUp
|
4
|
+
# Basic sessions management
|
5
|
+
module Session
|
6
|
+
# Check session file exists
|
7
|
+
def self.exists?(session_name)
|
8
|
+
CardanoUp.configure_default unless CardanoUp.configured?
|
9
|
+
File.exist?(session_file_path(session_name))
|
10
|
+
end
|
11
|
+
|
12
|
+
# get session contents
|
13
|
+
def self.get(session_name)
|
14
|
+
raise CardanoUp::SessionNotExistsError, session_name unless exists?(session_name)
|
15
|
+
|
16
|
+
CardanoUp.configure_default unless CardanoUp.configured?
|
17
|
+
session = session_file_path(session_name)
|
18
|
+
CardanoUp::Utils.from_json(session)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.destroy!(session_name)
|
22
|
+
path = session_file_path(session_name)
|
23
|
+
FileUtils.rm_f(path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.destroy_all!
|
27
|
+
list_all.each do |path|
|
28
|
+
FileUtils.rm_f(path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.list_all
|
33
|
+
Dir[File.join(CardanoUp.base_dir, '.session*')]
|
34
|
+
end
|
35
|
+
|
36
|
+
# create or update session with details of launched service
|
37
|
+
# @param session_name [String] session name
|
38
|
+
# @param service_details [Hash] service details
|
39
|
+
# @raise ArgumentError
|
40
|
+
# @raise CardanoUp::SessionHasNodeError
|
41
|
+
# @raise CardanoUp::SessionHasWalletError
|
42
|
+
def self.create_or_update(session_name, service_details)
|
43
|
+
raise ArgumentError, 'service_details should be Hash' unless service_details.is_a?(Hash)
|
44
|
+
raise ArgumentError, 'service_details shoud have :network' if service_details[:network].nil?
|
45
|
+
|
46
|
+
service_network = service_details[:network].to_sym || :unknown
|
47
|
+
|
48
|
+
if !exists?(session_name) || empty?(session_name)
|
49
|
+
# if session is not set then just create new with just service_details
|
50
|
+
content = { service_network => service_details }
|
51
|
+
put_content(session_name, content)
|
52
|
+
elsif !network?(session_name, service_network)
|
53
|
+
# if session exists but has no network, add new network
|
54
|
+
existing_services = get(session_name)
|
55
|
+
new_service = { service_network => service_details }
|
56
|
+
put_content(session_name, existing_services.merge(new_service))
|
57
|
+
else
|
58
|
+
# if session has network and node already, you can add only wallet
|
59
|
+
if service_details.key?(:node) && node?(session_name, service_network)
|
60
|
+
raise CardanoUp::SessionHasNodeError.new(session_name, service_network)
|
61
|
+
end
|
62
|
+
|
63
|
+
# if session has network and wallet already, you can add only node
|
64
|
+
if service_details.key?(:wallet) && wallet?(session_name, service_network)
|
65
|
+
raise CardanoUp::SessionHasWalletError.new(session_name,
|
66
|
+
service_network)
|
67
|
+
end
|
68
|
+
|
69
|
+
existing_services = get(session_name)
|
70
|
+
updated_network = existing_services[service_network].merge(service_details)
|
71
|
+
existing_services[service_network] = updated_network
|
72
|
+
put_content(session_name, existing_services)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.node_or_raise?(session_name, env)
|
77
|
+
raise CardanoUp::SessionServiceNotUpError.new(session_name, env, :node) unless node?(session_name, env)
|
78
|
+
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.wallet_or_raise?(session_name, env)
|
83
|
+
raise CardanoUp::SessionServiceNotUpError.new(session_name, env, :wallet) unless wallet?(session_name, env)
|
84
|
+
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.network_or_raise?(session_name, env)
|
89
|
+
raise CardanoUp::SessionEnvNotUpError.new(session_name, env) unless network?(session_name, env)
|
90
|
+
|
91
|
+
true
|
92
|
+
end
|
93
|
+
|
94
|
+
# remove entry from session
|
95
|
+
# @param session_name [String] session name
|
96
|
+
# @param service_details [Hash] service details ({ network: 'preprod', service: 'wallet' })
|
97
|
+
def self.remove(session_name, service_details)
|
98
|
+
existing_services = get(session_name)
|
99
|
+
service = service_details[:service].to_sym
|
100
|
+
network = service_details[:network].to_sym
|
101
|
+
if existing_services && existing_services[network]
|
102
|
+
existing_services[network].delete(service)
|
103
|
+
|
104
|
+
unless existing_services[network].key?(:node) || existing_services[network].key?(:wallet)
|
105
|
+
existing_services.delete(network)
|
106
|
+
end
|
107
|
+
put_content(session_name, existing_services)
|
108
|
+
end
|
109
|
+
|
110
|
+
destroy!(session_name) if empty?(session_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
def session_file_path(session_name)
|
114
|
+
File.join(CardanoUp.base_dir, ".session-#{session_name}.json")
|
115
|
+
end
|
116
|
+
module_function :session_file_path
|
117
|
+
private_class_method :session_file_path
|
118
|
+
|
119
|
+
def put_content(session_name, contents)
|
120
|
+
raise ArgumentError, 'contents should be Hash' unless contents.is_a?(Hash)
|
121
|
+
|
122
|
+
path = session_file_path(session_name)
|
123
|
+
File.write(path, JSON.pretty_generate(contents))
|
124
|
+
path
|
125
|
+
end
|
126
|
+
module_function :put_content
|
127
|
+
private_class_method :put_content
|
128
|
+
|
129
|
+
def empty?(session_name)
|
130
|
+
get(session_name) == {}
|
131
|
+
end
|
132
|
+
module_function :empty?
|
133
|
+
private_class_method :empty?
|
134
|
+
|
135
|
+
def network?(session_name, env)
|
136
|
+
get(session_name).key?(env.to_sym)
|
137
|
+
end
|
138
|
+
module_function :network?
|
139
|
+
private_class_method :network?
|
140
|
+
|
141
|
+
def node?(session_name, env)
|
142
|
+
get(session_name)[env.to_sym].key?(:node)
|
143
|
+
end
|
144
|
+
module_function :node?
|
145
|
+
private_class_method :node?
|
146
|
+
|
147
|
+
def wallet?(session_name, env)
|
148
|
+
get(session_name)[env.to_sym].key?(:wallet)
|
149
|
+
end
|
150
|
+
module_function :wallet?
|
151
|
+
private_class_method :wallet?
|
152
|
+
end
|
153
|
+
end
|
data/lib/cardano-up/utils.rb
CHANGED
@@ -8,7 +8,12 @@ module CardanoUp
|
|
8
8
|
res = `#{cmd}`
|
9
9
|
puts cmd if display_result
|
10
10
|
puts res if display_result
|
11
|
-
res.gsub("\n", '')
|
11
|
+
res.gsub("\n", ' ').strip
|
12
|
+
end
|
13
|
+
|
14
|
+
# Check if screen command is available
|
15
|
+
def self.screen?
|
16
|
+
cmd('which screen').chomp.length.positive?
|
12
17
|
end
|
13
18
|
|
14
19
|
def self.wget(url, file = nil)
|
@@ -17,6 +22,31 @@ module CardanoUp
|
|
17
22
|
File.binwrite(file, resp.body)
|
18
23
|
end
|
19
24
|
|
25
|
+
# Check if port is already used
|
26
|
+
def self.port_used?(port)
|
27
|
+
begin
|
28
|
+
Timeout.timeout(1) do
|
29
|
+
s = TCPSocket.new('localhost', port)
|
30
|
+
s.close
|
31
|
+
return true
|
32
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
rescue Timeout::Error
|
36
|
+
# do nothing
|
37
|
+
end
|
38
|
+
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.from_json(file)
|
43
|
+
JSON.parse(File.read(file), { symbolize_names: true })
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.to_json(file, hash)
|
47
|
+
File.write(file, JSON.pretty_generate(hash))
|
48
|
+
end
|
49
|
+
|
20
50
|
def self.win?
|
21
51
|
RUBY_PLATFORM =~ /cygwin|mswin|mingw|bccwin|wince|emx/
|
22
52
|
end
|
@@ -36,40 +66,21 @@ module CardanoUp
|
|
36
66
|
|
37
67
|
##
|
38
68
|
# Latest binary url for latest release or particular tag, from master or pr num.
|
39
|
-
# @param release [String] - 'latest' | /^v20.{2}-.{2}-.{2}/
|
69
|
+
# @param release [String] - 'latest' | /^v20.{2}-.{2}-.{2}/
|
40
70
|
# @raise CardanoUp::VersionNotSupportedError
|
41
71
|
def self.get_binary_url(release = 'latest')
|
42
|
-
|
43
|
-
raise CardanoUp::VersionNotSupportedError, release
|
44
|
-
end
|
72
|
+
raise CardanoUp::VersionNotSupportedError, release unless release == 'latest' || release =~ /^v20.{2}-.{2}-.{2}/
|
45
73
|
|
46
|
-
|
47
|
-
if
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
elsif win?
|
54
|
-
file = "cardano-wallet-#{tag}-win64.zip"
|
55
|
-
end
|
56
|
-
url = "#{CardanoUp::BINS_BASE_URL}/releases/download/#{tag}/#{file}"
|
57
|
-
else
|
58
|
-
if linux?
|
59
|
-
os = 'linux.musl.cardano-wallet-linux64'
|
60
|
-
elsif mac?
|
61
|
-
os = 'macos.intel.cardano-wallet-macos-intel'
|
62
|
-
elsif win?
|
63
|
-
os = 'linux.windows.cardano-wallet-win64'
|
64
|
-
end
|
65
|
-
|
66
|
-
url = if release == 'master'
|
67
|
-
"#{CardanoUp::HYDRA_BASE_URL}/#{os}/latest/download-by-type/file/binary-dist"
|
68
|
-
else
|
69
|
-
"#{CardanoUp::HYDRA_BASE_URL}-pr-#{release}/#{os}/latest/download-by-type/file/binary-dist"
|
70
|
-
end
|
74
|
+
tag = release == 'latest' ? latest_tag : release
|
75
|
+
if linux?
|
76
|
+
file = "cardano-wallet-#{tag}-linux64.tar.gz"
|
77
|
+
elsif mac?
|
78
|
+
file = "cardano-wallet-#{tag}-macos-intel.tar.gz"
|
79
|
+
elsif win?
|
80
|
+
file = "cardano-wallet-#{tag}-win64.zip"
|
71
81
|
end
|
72
|
-
|
82
|
+
|
83
|
+
"#{CardanoUp::BINS_BASE_URL}/releases/download/#{tag}/#{file}"
|
73
84
|
end
|
74
85
|
|
75
86
|
##
|
data/lib/cardano-up/version.rb
CHANGED