MuranoCLI 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/Gemfile +3 -2
- data/MuranoCLI.gemspec +2 -2
- data/README.markdown +107 -10
- data/lib/MrMurano/Product-Resources.rb +10 -0
- data/lib/MrMurano/ProjectFile.rb +7 -0
- data/lib/MrMurano/Solution-Endpoint.rb +24 -12
- data/lib/MrMurano/Solution-File.rb +17 -5
- data/lib/MrMurano/Solution-ServiceConfig.rb +7 -5
- data/lib/MrMurano/Solution-Services.rb +61 -31
- data/lib/MrMurano/SyncUpDown.rb +200 -49
- data/lib/MrMurano/commands/gb.rb +4 -3
- data/lib/MrMurano/commands/init.rb +55 -3
- data/lib/MrMurano/commands/login.rb +20 -0
- data/lib/MrMurano/commands/password.rb +12 -9
- data/lib/MrMurano/commands/status.rb +5 -1
- data/lib/MrMurano/commands.rb +1 -1
- data/lib/MrMurano/version.rb +1 -1
- data/spec/Account_spec.rb +8 -0
- data/spec/ConfigMigrate_spec.rb +3 -0
- data/spec/Config_spec.rb +16 -1
- data/spec/Solution-Endpoint_spec.rb +28 -20
- data/spec/Solution-ServiceEventHandler_spec.rb +27 -21
- data/spec/Solution-ServiceModules_spec.rb +42 -43
- data/spec/SyncUpDown_spec.rb +75 -68
- data/spec/cmd_init_spec.rb +303 -9
- data/spec/cmd_status_spec.rb +14 -12
- data/spec/spec_helper.rb +4 -1
- metadata +7 -6
data/lib/MrMurano/commands/gb.rb
CHANGED
@@ -2,8 +2,8 @@ require 'pp'
|
|
2
2
|
|
3
3
|
# You don't need this.
|
4
4
|
# To use this:
|
5
|
-
# - mkdir -p ~/.
|
6
|
-
# - ln gb.rb ~/.
|
5
|
+
# - mkdir -p ~/.murano/plugins
|
6
|
+
# - ln gb.rb ~/.murano/plugins
|
7
7
|
|
8
8
|
command :_gb do |c|
|
9
9
|
c.syntax = %{murano _gb <class> <method> (<args>)}
|
@@ -18,7 +18,8 @@ command :_gb do |c|
|
|
18
18
|
begin
|
19
19
|
gb = Object::const_get("MrMurano::#{cls}").new
|
20
20
|
if gb.respond_to? meth then
|
21
|
-
|
21
|
+
ret = gb.__send__(meth, *args)
|
22
|
+
gb.outf(ret) {|o,i| pp o}
|
22
23
|
else
|
23
24
|
say_error "'#{cls}' doesn't '#{meth}'"
|
24
25
|
end
|
@@ -42,6 +42,9 @@ command :init do |c|
|
|
42
42
|
say "You are only part of one business; using #{bizid[:name]}"
|
43
43
|
$cfg.set('businesses.id', bizid[:bizid], :project)
|
44
44
|
|
45
|
+
elsif bizz.count == 0 then
|
46
|
+
acc.warning "You don't have any businesses; Log into the webUI and create one."
|
47
|
+
exit 3
|
45
48
|
else
|
46
49
|
choose do |menu|
|
47
50
|
menu.prompt = "Select which Business to use:"
|
@@ -65,6 +68,29 @@ command :init do |c|
|
|
65
68
|
sol = solz.first
|
66
69
|
say "You only have one solution; using #{sol[:domain]}"
|
67
70
|
$cfg.set('solution.id', sol[:apiId], :project)
|
71
|
+
|
72
|
+
elsif solz.count == 0 then
|
73
|
+
say "You don't have any solutions; lets create one"
|
74
|
+
solname = ask("Solution Name? ")
|
75
|
+
ret = acc.new_solution(solname)
|
76
|
+
if ret.nil? then
|
77
|
+
acc.error "Create Solution failed"
|
78
|
+
exit 5
|
79
|
+
end
|
80
|
+
if not ret.kind_of?(Hash) and not ret.empty? then
|
81
|
+
acc.error "Create Solution failed: #{ret.to_s}"
|
82
|
+
exit 2
|
83
|
+
end
|
84
|
+
|
85
|
+
# create doesn't return anything, so we need to go look for it.
|
86
|
+
ret = acc.solutions.select{|i| i[:domain] =~ /#{solname}\./}
|
87
|
+
sid = ret.first[:apiId]
|
88
|
+
if sid.nil? or sid.empty? then
|
89
|
+
acc.error "Solution didn't find an apiId!!!! #{ret}"
|
90
|
+
exit 3
|
91
|
+
end
|
92
|
+
$cfg.set('solution.id', sid, :project)
|
93
|
+
|
68
94
|
else
|
69
95
|
choose do |menu|
|
70
96
|
menu.prompt = "Select which Solution to use:"
|
@@ -88,6 +114,29 @@ command :init do |c|
|
|
88
114
|
prd = podz.first
|
89
115
|
say "You only have one product; using #{prd[:label]}"
|
90
116
|
$cfg.set('product.id', prd[:modelId], :project)
|
117
|
+
|
118
|
+
elsif podz.count == 0 then
|
119
|
+
say "You don't have any products; lets create one"
|
120
|
+
podname = ask("Product Name? ")
|
121
|
+
ret = acc.new_product(podname)
|
122
|
+
if ret.nil? then
|
123
|
+
acc.error "Create Product failed"
|
124
|
+
exit 5
|
125
|
+
end
|
126
|
+
if not ret.kind_of?(Hash) and not ret.empty? then
|
127
|
+
acc.error "Create Product failed: #{ret.to_s}"
|
128
|
+
exit 2
|
129
|
+
end
|
130
|
+
|
131
|
+
# create doesn't return anything, so we need to go look for it.
|
132
|
+
ret = acc.products.select{|i| i[:label] == podname}
|
133
|
+
pid = ret.first[:modelId]
|
134
|
+
if pid.nil? or pid.empty? then
|
135
|
+
acc.error "Product didn't find an apiId!!!! #{ret}"
|
136
|
+
exit 3
|
137
|
+
end
|
138
|
+
$cfg.set('product.id', pid, :project)
|
139
|
+
|
91
140
|
else
|
92
141
|
choose do |menu|
|
93
142
|
menu.prompt = "Select which Product to use:"
|
@@ -104,8 +153,8 @@ command :init do |c|
|
|
104
153
|
puts ''
|
105
154
|
say "Ok, In business ID: #{$cfg['business.id']} using Solution ID: #{$cfg['solution.id']} with Product ID: #{$cfg['product.id']}"
|
106
155
|
|
107
|
-
# If no ProjectFile
|
108
|
-
if $project.
|
156
|
+
# If no ProjectFile, then write a ProjectFile
|
157
|
+
if not $project.usingProjectfile then
|
109
158
|
tmpl = File.read(File.join(File.dirname(__FILE__),'..','template','projectFile.murano.erb'))
|
110
159
|
tmpl = ERB.new(tmpl)
|
111
160
|
res = tmpl.result($project.data_binding)
|
@@ -127,7 +176,10 @@ command :init do |c|
|
|
127
176
|
path = $cfg[cfgi]
|
128
177
|
path = Pathname.new(path) unless path.kind_of? Pathname
|
129
178
|
path = base + path
|
130
|
-
|
179
|
+
unless path.exist? then
|
180
|
+
path = path.dirname unless path.extname.empty?
|
181
|
+
path.mkpath
|
182
|
+
end
|
131
183
|
end
|
132
184
|
say "Default directories created"
|
133
185
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'MrMurano/Account'
|
2
|
+
|
3
|
+
command 'login' do |c|
|
4
|
+
c.syntax = %{murano login}
|
5
|
+
c.summary = %{Log into Murano}
|
6
|
+
c.description = %{Log into Murano
|
7
|
+
|
8
|
+
If you are having trouble logging in, try deleting the saved password first.
|
9
|
+
`murano password delete <username>`
|
10
|
+
}
|
11
|
+
c.option '--show-token', %{Shows the API token}
|
12
|
+
|
13
|
+
c.action do |args, options|
|
14
|
+
acc = MrMurano::Account.new
|
15
|
+
ret = acc.token
|
16
|
+
say ret if options.show_token
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# vim: set ai et sw=2 ts=2 :
|
@@ -11,10 +11,6 @@ end
|
|
11
11
|
|
12
12
|
alias_command 'password current', :config, 'user.name'
|
13
13
|
|
14
|
-
class Outter
|
15
|
-
include MrMurano::Verbose
|
16
|
-
end
|
17
|
-
|
18
14
|
command 'password list' do |c|
|
19
15
|
c.syntax = %{murano password list}
|
20
16
|
c.summary = %{List the usernames with saved passwords}
|
@@ -24,19 +20,16 @@ command 'password list' do |c|
|
|
24
20
|
psd.load
|
25
21
|
|
26
22
|
ret = psd.list
|
27
|
-
|
28
|
-
outter.outf(ret) do |dd, ios|
|
23
|
+
psd.outf(ret) do |dd, ios|
|
29
24
|
rows=[]
|
30
25
|
dd.each_pair do |key, value|
|
31
26
|
value.each{|v| rows << [key, v] }
|
32
27
|
end
|
33
|
-
|
28
|
+
psd.tabularize({
|
34
29
|
:rows=>rows, :headers => [:Host, :Username]
|
35
30
|
}, ios)
|
36
31
|
end
|
37
|
-
|
38
32
|
end
|
39
|
-
|
40
33
|
end
|
41
34
|
|
42
35
|
command 'password set' do |c|
|
@@ -50,6 +43,11 @@ command 'password set' do |c|
|
|
50
43
|
psd = MrMurano::Passwords.new
|
51
44
|
psd.load
|
52
45
|
|
46
|
+
if args.count < 1 then
|
47
|
+
psd.error "Missing username"
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
|
53
51
|
username = args.shift
|
54
52
|
host = args.shift
|
55
53
|
host = $cfg['net.host'] if host.nil?
|
@@ -76,6 +74,11 @@ command 'password delete' do |c|
|
|
76
74
|
psd = MrMurano::Passwords.new
|
77
75
|
psd.load
|
78
76
|
|
77
|
+
if args.count < 1 then
|
78
|
+
psd.error "Missing username"
|
79
|
+
exit 1
|
80
|
+
end
|
81
|
+
|
79
82
|
username = args.shift
|
80
83
|
host = args.shift
|
81
84
|
host = $cfg['net.host'] if host.nil?
|
@@ -70,7 +70,11 @@ command :status do |c|
|
|
70
70
|
def gmerge(ret, type, options)
|
71
71
|
if options.grouped then
|
72
72
|
[:toadd, :todel, :tomod, :unchg].each do |kind|
|
73
|
-
ret[kind].each
|
73
|
+
ret[kind].each do |item|
|
74
|
+
item = item.to_h
|
75
|
+
item[:pp_type] = type
|
76
|
+
@grouped[kind] << item
|
77
|
+
end
|
74
78
|
end
|
75
79
|
else
|
76
80
|
pretty(ret, options)
|
data/lib/MrMurano/commands.rb
CHANGED
@@ -6,6 +6,7 @@ require 'MrMurano/commands/cors'
|
|
6
6
|
require 'MrMurano/commands/domain'
|
7
7
|
require 'MrMurano/commands/init'
|
8
8
|
require 'MrMurano/commands/keystore'
|
9
|
+
require 'MrMurano/commands/login'
|
9
10
|
require 'MrMurano/commands/logs'
|
10
11
|
require 'MrMurano/commands/mock'
|
11
12
|
require 'MrMurano/commands/postgresql'
|
@@ -24,7 +25,6 @@ require 'MrMurano/commands/solutionDelete'
|
|
24
25
|
require 'MrMurano/commands/solutionList'
|
25
26
|
require 'MrMurano/commands/status'
|
26
27
|
require 'MrMurano/commands/sync'
|
27
|
-
require 'MrMurano/commands/timeseries'
|
28
28
|
require 'MrMurano/commands/tsdb'
|
29
29
|
require 'MrMurano/commands/usage'
|
30
30
|
|
data/lib/MrMurano/version.rb
CHANGED
data/spec/Account_spec.rb
CHANGED
@@ -7,6 +7,8 @@ require '_workspace'
|
|
7
7
|
RSpec.describe MrMurano::Account, "token" do
|
8
8
|
include_context "WORKSPACE"
|
9
9
|
before(:example) do
|
10
|
+
@saved_cfg = ENV['MURANO_CONFIGFILE']
|
11
|
+
ENV['MURANO_CONFIGFILE'] = nil
|
10
12
|
$cfg = MrMurano::Config.new
|
11
13
|
$cfg.load
|
12
14
|
$cfg['net.host'] = 'bizapi.hosted.exosite.io'
|
@@ -18,6 +20,7 @@ RSpec.describe MrMurano::Account, "token" do
|
|
18
20
|
|
19
21
|
after(:example) do
|
20
22
|
@acc.token_reset
|
23
|
+
ENV['MURANO_CONFIGFILE'] = @saved_cfg
|
21
24
|
end
|
22
25
|
|
23
26
|
context "Get login info" do
|
@@ -107,6 +110,8 @@ end
|
|
107
110
|
RSpec.describe MrMurano::Account do
|
108
111
|
include_context "WORKSPACE"
|
109
112
|
before(:example) do
|
113
|
+
@saved_cfg = ENV['MURANO_CONFIGFILE']
|
114
|
+
ENV['MURANO_CONFIGFILE'] = nil
|
110
115
|
$cfg = MrMurano::Config.new
|
111
116
|
$cfg.load
|
112
117
|
$cfg['net.host'] = 'bizapi.hosted.exosite.io'
|
@@ -116,6 +121,9 @@ RSpec.describe MrMurano::Account do
|
|
116
121
|
@acc = MrMurano::Account.new
|
117
122
|
allow(@acc).to receive(:token).and_return("TTTTTTTTTT")
|
118
123
|
end
|
124
|
+
after(:example) do
|
125
|
+
ENV['MURANO_CONFIGFILE'] = @saved_cfg
|
126
|
+
end
|
119
127
|
|
120
128
|
it "initializes" do
|
121
129
|
uri = @acc.endPoint('')
|
data/spec/ConfigMigrate_spec.rb
CHANGED
@@ -10,6 +10,8 @@ RSpec.describe MrMurano::ConfigMigrate do
|
|
10
10
|
before(:example) do
|
11
11
|
@saved_pwd = ENV['MURANO_PASSWORD']
|
12
12
|
ENV['MURANO_PASSWORD'] = nil
|
13
|
+
@saved_cfg = ENV['MURANO_CONFIGFILE']
|
14
|
+
ENV['MURANO_CONFIGFILE'] = nil
|
13
15
|
|
14
16
|
$cfg = MrMurano::Config.new
|
15
17
|
$cfg.load
|
@@ -27,6 +29,7 @@ RSpec.describe MrMurano::ConfigMigrate do
|
|
27
29
|
after(:example) do
|
28
30
|
$stdout, $stderr = @stdsaved
|
29
31
|
ENV['MURANO_PASSWORD'] = @saved_pwd
|
32
|
+
ENV['MURANO_CONFIGFILE'] = @saved_cfg
|
30
33
|
end
|
31
34
|
|
32
35
|
it "imports all" do
|
data/spec/Config_spec.rb
CHANGED
@@ -131,8 +131,11 @@ RSpec.describe MrMurano::Config do
|
|
131
131
|
end
|
132
132
|
|
133
133
|
context "ENV['MURANO_CONFIGFILE']" do
|
134
|
+
before(:example) do
|
135
|
+
@saved_cfg = ENV['MURANO_CONFIGFILE']
|
136
|
+
end
|
134
137
|
after(:example) do
|
135
|
-
ENV['MURANO_CONFIGFILE'] =
|
138
|
+
ENV['MURANO_CONFIGFILE'] = @saved_cfg
|
136
139
|
ENV['MR_CONFIGFILE'] = nil
|
137
140
|
end
|
138
141
|
|
@@ -165,13 +168,24 @@ RSpec.describe MrMurano::Config do
|
|
165
168
|
end
|
166
169
|
|
167
170
|
it "warns about migrating old ENV name" do
|
171
|
+
ENV['MURANO_CONFIGFILE'] = nil
|
172
|
+
ENV['MR_CONFIGFILE'] = @tmpdir + '/home/testcreate.config'
|
173
|
+
expect_any_instance_of(MrMurano::Config).to receive(:warning).once
|
174
|
+
MrMurano::Config.new
|
175
|
+
end
|
176
|
+
|
177
|
+
it "errors if both are defined" do
|
178
|
+
ENV['MURANO_CONFIGFILE'] = @tmpdir + '/home/testcreate.config'
|
168
179
|
ENV['MR_CONFIGFILE'] = @tmpdir + '/home/testcreate.config'
|
169
180
|
expect_any_instance_of(MrMurano::Config).to receive(:warning).once
|
181
|
+
expect_any_instance_of(MrMurano::Config).to receive(:error).once
|
170
182
|
MrMurano::Config.new
|
171
183
|
end
|
172
184
|
end
|
173
185
|
|
174
186
|
it "dumps" do
|
187
|
+
@saved_cfg = ENV['MURANO_CONFIGFILE']
|
188
|
+
ENV['MURANO_CONFIGFILE'] = nil
|
175
189
|
cfg = MrMurano::Config.new
|
176
190
|
cfg.load
|
177
191
|
cfg['sync.bydefault'] = 'files'
|
@@ -182,6 +196,7 @@ RSpec.describe MrMurano::Config do
|
|
182
196
|
want = template.result(binding)
|
183
197
|
|
184
198
|
expect(ret).to eq(want)
|
199
|
+
ENV['MURANO_CONFIGFILE'] = @saved_cfg
|
185
200
|
end
|
186
201
|
|
187
202
|
context "fixing permissions" do
|
@@ -290,12 +290,14 @@ RSpec.describe MrMurano::Endpoint do
|
|
290
290
|
'Content-Type'=>'application/json'}).
|
291
291
|
to_return(body: "")
|
292
292
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
293
|
+
ret = @srv.upload(@tio_.path,
|
294
|
+
MrMurano::Endpoint::RouteItem.new(
|
295
|
+
:id=>"9K0",
|
296
|
+
:method=>"websocket",
|
297
|
+
:path=>"/api/v1/bar",
|
298
|
+
:content_type=>"application/json",
|
299
|
+
), true)
|
300
|
+
expect(ret)
|
299
301
|
end
|
300
302
|
|
301
303
|
it "when nothing is there" do
|
@@ -308,11 +310,13 @@ RSpec.describe MrMurano::Endpoint do
|
|
308
310
|
'Content-Type'=>'application/json'}).
|
309
311
|
to_return(body: "")
|
310
312
|
|
311
|
-
ret = @srv.upload(@tio_.path,
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
313
|
+
ret = @srv.upload(@tio_.path,
|
314
|
+
MrMurano::Endpoint::RouteItem.new(
|
315
|
+
:id=>"9K0",
|
316
|
+
:method=>"websocket",
|
317
|
+
:path=>"/api/v1/bar",
|
318
|
+
:content_type=>"application/json",
|
319
|
+
), false)
|
316
320
|
expect(ret)
|
317
321
|
end
|
318
322
|
|
@@ -322,10 +326,12 @@ RSpec.describe MrMurano::Endpoint do
|
|
322
326
|
'Content-Type'=>'application/json'}).
|
323
327
|
to_return(body: "")
|
324
328
|
|
325
|
-
ret = @srv.upload(@tio_.path,
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
+
ret = @srv.upload(@tio_.path,
|
330
|
+
MrMurano::Endpoint::RouteItem.new(
|
331
|
+
:method=>"websocket",
|
332
|
+
:path=>"/api/v1/bar",
|
333
|
+
:content_type=>"application/json",
|
334
|
+
), false)
|
329
335
|
expect(ret)
|
330
336
|
end
|
331
337
|
|
@@ -336,11 +342,13 @@ RSpec.describe MrMurano::Endpoint do
|
|
336
342
|
to_return(status: 502, body: "{}")
|
337
343
|
|
338
344
|
expect(@srv).to receive(:error).and_return(nil)
|
339
|
-
ret = @srv.upload(@tio_.path,
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
345
|
+
ret = @srv.upload(@tio_.path,
|
346
|
+
MrMurano::Endpoint::RouteItem.new(
|
347
|
+
:id=>"9K0",
|
348
|
+
:method=>"websocket",
|
349
|
+
:path=>"/api/v1/bar",
|
350
|
+
:content_type=>"application/json",
|
351
|
+
), true)
|
344
352
|
expect(ret)
|
345
353
|
end
|
346
354
|
end
|
@@ -145,11 +145,13 @@ end
|
|
145
145
|
}
|
146
146
|
tio.close
|
147
147
|
|
148
|
-
ret = @srv.upload(tio.path,
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
148
|
+
ret = @srv.upload(tio.path,
|
149
|
+
MrMurano::EventHandler::EventHandlerItem.new(
|
150
|
+
:id=>"9K0",
|
151
|
+
:service=>'data',
|
152
|
+
:event=>'datapoint',
|
153
|
+
:solution_id=>"XYZ",
|
154
|
+
))
|
153
155
|
expect(ret)
|
154
156
|
end
|
155
157
|
end
|
@@ -172,11 +174,13 @@ end
|
|
172
174
|
}
|
173
175
|
tio.close
|
174
176
|
|
175
|
-
ret = @srv.upload(tio.path,
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
177
|
+
ret = @srv.upload(tio.path,
|
178
|
+
MrMurano::EventHandler::EventHandlerItem.new(
|
179
|
+
:id=>"9K0",
|
180
|
+
:service=>'device',
|
181
|
+
:event=>'datapoint',
|
182
|
+
:solution_id=>"XYZ",
|
183
|
+
))
|
180
184
|
expect(ret)
|
181
185
|
end
|
182
186
|
|
@@ -264,25 +268,25 @@ end
|
|
264
268
|
|
265
269
|
it "raises on alias without service" do
|
266
270
|
expect {
|
267
|
-
@srv.mkname(
|
271
|
+
@srv.mkname( MrMurano::EventHandler::EventHandlerItem.new(:event=>'bob') )
|
268
272
|
}.to raise_error %{Missing parts! {"event":"bob"}}
|
269
273
|
end
|
270
274
|
|
271
275
|
it "raises on alias without event" do
|
272
276
|
expect {
|
273
|
-
@srv.mkalias(
|
277
|
+
@srv.mkalias( MrMurano::EventHandler::EventHandlerItem.new(:service=>'bob') )
|
274
278
|
}.to raise_error %{Missing parts! {"service":"bob"}}
|
275
279
|
end
|
276
280
|
|
277
281
|
it "raises on name without service" do
|
278
282
|
expect {
|
279
|
-
@srv.mkalias(
|
283
|
+
@srv.mkalias( MrMurano::EventHandler::EventHandlerItem.new(:event=>'bob') )
|
280
284
|
}.to raise_error %{Missing parts! {"event":"bob"}}
|
281
285
|
end
|
282
286
|
|
283
287
|
it "raises on name without event" do
|
284
288
|
expect {
|
285
|
-
@srv.mkname(
|
289
|
+
@srv.mkname( MrMurano::EventHandler::EventHandlerItem.new(:service=>'bob') )
|
286
290
|
}.to raise_error %{Missing parts! {"service":"bob"}}
|
287
291
|
end
|
288
292
|
end
|
@@ -334,13 +338,15 @@ end
|
|
334
338
|
tio.close
|
335
339
|
|
336
340
|
ret = @srv.toRemoteItem(nil, tio.path)
|
337
|
-
expect(ret).to eq(
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
341
|
+
expect(ret).to eq(
|
342
|
+
MrMurano::EventHandler::EventHandlerItem.new(
|
343
|
+
:service=>'device',
|
344
|
+
:event=>'datapoint',
|
345
|
+
:line=>1,
|
346
|
+
:line_end=>3,
|
347
|
+
:local_path=>Pathname.new(tio.path),
|
348
|
+
:script=>%{--#EVENT device datapoint\nTsdb.write{tags={sn='1'},metrics={[data.alias]=data.value[2]}}\n},
|
349
|
+
))
|
344
350
|
end
|
345
351
|
end
|
346
352
|
|