MrMurano 1.6.3 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -2
- data/Gemfile +1 -1
- data/MrMurano.gemspec +1 -1
- data/README.markdown +4 -0
- data/TODO.taskpaper +17 -4
- data/lib/MrMurano/Account.rb +5 -1
- data/lib/MrMurano/Config.rb +3 -1
- data/lib/MrMurano/Product-Resources.rb +239 -0
- data/lib/MrMurano/Product.rb +51 -2
- data/lib/MrMurano/Solution-Cors.rb +81 -0
- data/lib/MrMurano/Solution-Endpoint.rb +8 -4
- data/lib/MrMurano/Solution-File.rb +4 -2
- data/lib/MrMurano/Solution-ServiceConfig.rb +74 -1
- data/lib/MrMurano/Solution-Services.rb +4 -2
- data/lib/MrMurano/Solution-Users.rb +6 -3
- data/lib/MrMurano/Solution.rb +6 -274
- data/lib/MrMurano/SyncUpDown.rb +433 -0
- data/lib/MrMurano/commands/completion.rb +152 -0
- data/lib/MrMurano/commands/content.rb +15 -14
- data/lib/MrMurano/commands/cors.rb +11 -38
- data/lib/MrMurano/commands/exportImport.rb +4 -3
- data/lib/MrMurano/commands/keystore.rb +15 -16
- data/lib/MrMurano/commands/logs.rb +2 -2
- data/lib/MrMurano/commands/productCreate.rb +4 -4
- data/lib/MrMurano/commands/productDelete.rb +6 -8
- data/lib/MrMurano/commands/productSpec.rb +31 -36
- data/lib/MrMurano/commands/productWrite.rb +9 -7
- data/lib/MrMurano/commands/serialNumberCmds.rb +4 -4
- data/lib/MrMurano/commands/solutionCreate.rb +4 -4
- data/lib/MrMurano/commands/solutionDelete.rb +5 -5
- data/lib/MrMurano/commands/status.rb +9 -42
- data/lib/MrMurano/commands/sync.rb +15 -71
- data/lib/MrMurano/commands/timeseries.rb +23 -29
- data/lib/MrMurano/commands/tsdb.rb +202 -0
- data/lib/MrMurano/commands/zshcomplete.erb +112 -0
- data/lib/MrMurano/commands.rb +4 -1
- data/lib/MrMurano/http.rb +4 -3
- data/lib/MrMurano/makePretty.rb +15 -6
- data/lib/MrMurano/verbosing.rb +71 -0
- data/lib/MrMurano/version.rb +1 -1
- data/lib/MrMurano.rb +1 -0
- data/spec/ConfigFile_spec.rb +3 -3
- data/spec/ProductContent_spec.rb +2 -2
- data/spec/ProductResources_spec.rb +152 -0
- data/spec/Product_spec.rb +38 -1
- data/spec/Solution-Cors_spec.rb +134 -0
- data/spec/Solution-ServiceConfig_spec.rb +198 -0
- data/spec/SyncRoot_spec.rb +74 -0
- data/spec/cmd_config_spec.rb +51 -0
- data/spec/fixtures/.mrmuranorc +9 -0
- data/spec/{testfiles → fixtures}/configfile +0 -0
- data/spec/fixtures/mrmuranorc_deleted_bob +8 -0
- data/spec/fixtures/product_spec_files/example.exoline.spec.yaml +116 -0
- data/spec/fixtures/product_spec_files/example.murano.spec.yaml +14 -0
- data/spec/fixtures/product_spec_files/gwe.exoline.spec.yaml +21 -0
- data/spec/fixtures/product_spec_files/gwe.murano.spec.yaml +16 -0
- data/spec/{lightbulb.yaml → fixtures/product_spec_files/lightbulb.yaml} +0 -0
- data/spec/spec_helper.rb +4 -4
- metadata +47 -19
@@ -3,12 +3,11 @@ command :syncdown do |c|
|
|
3
3
|
c.syntax = %{mr syncdown [options]}
|
4
4
|
c.description = %{Sync project down from Murano}
|
5
5
|
c.option '--all', 'Sync everything'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
c.option '--users', %{Sync Users}
|
6
|
+
|
7
|
+
# Load options to control which things to sync
|
8
|
+
MrMurano::SyncRoot.each_option do |s,l,d|
|
9
|
+
c.option s, l, d
|
10
|
+
end
|
12
11
|
|
13
12
|
c.option '--[no-]delete', %{Don't delete things from server}
|
14
13
|
c.option '--[no-]create', %{Don't create things on server}
|
@@ -17,41 +16,14 @@ command :syncdown do |c|
|
|
17
16
|
c.example %{Make local be like what is on the server}, %{mr syncdown --all}
|
18
17
|
c.example %{Pull down new things, but don't delete or modify anything}, %{mr syncdown --all --no-delete --no-update}
|
19
18
|
c.example %{Only Pull new static files}, %{mr syncdown --files --no-delete --no-update}
|
20
|
-
|
19
|
+
|
21
20
|
c.action do |args,options|
|
22
21
|
options.default :delete=>true, :create=>true, :update=>true
|
23
|
-
MrMurano.checkSAME(options)
|
24
|
-
|
25
|
-
if options.endpoints then
|
26
|
-
sol = MrMurano::Endpoint.new
|
27
|
-
sol.syncdown(options)
|
28
|
-
end
|
29
|
-
|
30
|
-
if options.modules then
|
31
|
-
sol = MrMurano::Library.new
|
32
|
-
sol.syncdown(options)
|
33
|
-
end
|
34
|
-
|
35
|
-
if options.eventhandlers then
|
36
|
-
sol = MrMurano::EventHandler.new
|
37
|
-
sol.syncdown(options)
|
38
|
-
end
|
39
|
-
|
40
|
-
if options.roles then
|
41
|
-
sol = MrMurano::Role.new
|
42
|
-
sol.syncdown(options)
|
43
|
-
end
|
44
22
|
|
45
|
-
|
46
|
-
sol =
|
23
|
+
MrMurano::SyncRoot.each_filtered(options.__hash__) do |name, type, klass|
|
24
|
+
sol = klass.new
|
47
25
|
sol.syncdown(options)
|
48
26
|
end
|
49
|
-
|
50
|
-
if options.files then
|
51
|
-
sol = MrMurano::File.new
|
52
|
-
sol.syncdown(options)
|
53
|
-
end
|
54
|
-
|
55
27
|
end
|
56
28
|
end
|
57
29
|
alias_command :pull, :syncdown, '--no-delete'
|
@@ -60,12 +32,11 @@ command :syncup do |c|
|
|
60
32
|
c.syntax = %{mr syncup [options]}
|
61
33
|
c.description = %{Sync project up into Murano}
|
62
34
|
c.option '--all', 'Sync everything'
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
c.option '--users', %{Sync Users}
|
35
|
+
|
36
|
+
# Load options to control which things to sync
|
37
|
+
MrMurano::SyncRoot.each_option do |s,l,d|
|
38
|
+
c.option s, l, d
|
39
|
+
end
|
69
40
|
|
70
41
|
c.option '--[no-]delete', %{Don't delete things from server}
|
71
42
|
c.option '--[no-]create', %{Don't create things on server}
|
@@ -77,38 +48,11 @@ command :syncup do |c|
|
|
77
48
|
|
78
49
|
c.action do |args,options|
|
79
50
|
options.default :delete=>true, :create=>true, :update=>true
|
80
|
-
MrMurano.checkSAME(options)
|
81
|
-
|
82
|
-
if options.endpoints then
|
83
|
-
sol = MrMurano::Endpoint.new
|
84
|
-
sol.syncup(options)
|
85
|
-
end
|
86
|
-
|
87
|
-
if options.modules then
|
88
|
-
sol = MrMurano::Library.new
|
89
|
-
sol.syncup(options)
|
90
|
-
end
|
91
|
-
|
92
|
-
if options.eventhandlers then
|
93
|
-
sol = MrMurano::EventHandler.new
|
94
|
-
sol.syncup(options)
|
95
|
-
end
|
96
|
-
|
97
|
-
if options.roles then
|
98
|
-
sol = MrMurano::Role.new
|
99
|
-
sol.syncup(options)
|
100
|
-
end
|
101
51
|
|
102
|
-
|
103
|
-
sol =
|
52
|
+
MrMurano::SyncRoot.each_filtered(options.__hash__) do |name, type, klass|
|
53
|
+
sol = klass.new
|
104
54
|
sol.syncup(options)
|
105
55
|
end
|
106
|
-
|
107
|
-
if options.files then
|
108
|
-
sol = MrMurano::File.new
|
109
|
-
sol.syncup(options)
|
110
|
-
end
|
111
|
-
|
112
56
|
end
|
113
57
|
end
|
114
58
|
alias_command :push, :syncup, '--no-delete'
|
@@ -8,15 +8,15 @@ module MrMurano
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def query(query)
|
11
|
-
|
11
|
+
call(:query, :post, {:q=>query})
|
12
12
|
end
|
13
13
|
|
14
14
|
def write(writestr)
|
15
|
-
|
15
|
+
call(:write, :post, { :query=>writestr })
|
16
16
|
end
|
17
17
|
|
18
18
|
def command(cmd)
|
19
|
-
|
19
|
+
call(:command, :post, { :q=>cmd})
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
@@ -25,6 +25,7 @@ end
|
|
25
25
|
command 'timeseries query' do |c|
|
26
26
|
c.syntax = %{mr timeseries query <query string>}
|
27
27
|
c.description = %{Query the timeseries database}
|
28
|
+
c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
|
28
29
|
c.option '--[no-]json', %{Display results as raw json}
|
29
30
|
c.option '--[no-]csv', %{Display results as CSV}
|
30
31
|
|
@@ -32,29 +33,28 @@ command 'timeseries query' do |c|
|
|
32
33
|
options.defalts :json=>false, :csv=>false
|
33
34
|
sol = MrMurano::Timeseries.new
|
34
35
|
ret = sol.query args.join(' ')
|
35
|
-
if options.json then
|
36
|
-
puts ret.to_json
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
(res[:series] or []).each do |ser|
|
41
|
-
cols = ser[:columns] #.map{|h| "#{ser[:name]}.#{h}"}
|
42
|
-
CSV($stdout, :headers=>cols, :write_headers=>true) do |csv|
|
43
|
-
ser[:values].each{|v| csv << v}
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
37
|
+
$cfg['tool.outformat'] = 'json' if options.json
|
38
|
+
$cfg['tool.outformat'] = 'best csv' if options.csv
|
47
39
|
|
48
|
-
|
40
|
+
io=nil
|
41
|
+
if options.output then
|
42
|
+
io = File.open(options.output, 'w')
|
43
|
+
end
|
44
|
+
|
45
|
+
sol.outf(ret, io) do |dd, ios|
|
49
46
|
(ret[:results] or []).each do |res|
|
50
47
|
(res[:series] or []).each do |ser|
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
sol.tabularize({
|
49
|
+
:title=>ser[:name],
|
50
|
+
:headers=>ser[:columns],
|
51
|
+
:rows=>ser[:values]
|
52
|
+
}, ios)
|
54
53
|
end
|
55
54
|
end
|
56
|
-
# If nothing displayed, Format wasn't what we expected, so do what?
|
57
55
|
end
|
56
|
+
io.close unless io.nil?
|
57
|
+
|
58
58
|
end
|
59
59
|
end
|
60
60
|
alias_command :tsq, 'timeseries query'
|
@@ -65,13 +65,10 @@ command 'timeseries write' do |c|
|
|
65
65
|
c.option '--[no-]json', %{Display results as raw json}
|
66
66
|
c.action do |args,options|
|
67
67
|
options.defalts :json=>false
|
68
|
+
$cfg['tool.outformat'] = 'json' if options.json
|
68
69
|
sol = MrMurano::Timeseries.new
|
69
70
|
ret = sol.write args.join(' ')
|
70
|
-
|
71
|
-
puts ret.to_json
|
72
|
-
else
|
73
|
-
pp ret
|
74
|
-
end
|
71
|
+
sol.outf ret
|
75
72
|
end
|
76
73
|
end
|
77
74
|
alias_command :tsw, 'timeseries write'
|
@@ -82,13 +79,10 @@ command 'timeseries command' do |c|
|
|
82
79
|
c.option '--[no-]json', %{Display results as raw json}
|
83
80
|
c.action do |args,options|
|
84
81
|
options.defalts :json=>false
|
82
|
+
$cfg['tool.outformat'] = 'json' if options.json
|
85
83
|
sol = MrMurano::Timeseries.new
|
86
84
|
ret = sol.command args.join(' ')
|
87
|
-
|
88
|
-
puts ret.to_json
|
89
|
-
else
|
90
|
-
pp ret
|
91
|
-
end
|
85
|
+
sol.outf ret
|
92
86
|
end
|
93
87
|
end
|
94
88
|
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'MrMurano/Solution-ServiceConfig'
|
3
|
+
|
4
|
+
module MrMurano
|
5
|
+
module ServiceConfigs
|
6
|
+
class Tsdb < ServiceConfig
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
@serviceName = 'tsdb'
|
10
|
+
end
|
11
|
+
|
12
|
+
def write(data)
|
13
|
+
call(:write, :post, data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def query(query)
|
17
|
+
call(:query, :post, query)
|
18
|
+
end
|
19
|
+
|
20
|
+
def listTags
|
21
|
+
call(:listTags)
|
22
|
+
end
|
23
|
+
|
24
|
+
def listMetrics
|
25
|
+
call(:listMetrics)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def str_to_timestamp(str)
|
30
|
+
if str =~ /^\d+(u|ms|s)?$/ then
|
31
|
+
str
|
32
|
+
else
|
33
|
+
dt = DateTime.parse(str)
|
34
|
+
(dt.to_time.to_f * 1000000).to_i
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
command 'tsdb write' do |c|
|
42
|
+
c.syntax = %{mr tsdb write [options] <metric=value>|@<tag=value> … }
|
43
|
+
c.summary = %{write data}
|
44
|
+
c.description = %{Write data
|
45
|
+
|
46
|
+
TIMESTAMP is microseconds since unix epoch, or can be suffixed with units.
|
47
|
+
Units are u (microseconds), ms (milliseconds), s (seconds)
|
48
|
+
|
49
|
+
Also, many date-time formats can be parsed and will be converted to microseconds
|
50
|
+
}
|
51
|
+
c.option '--when TIMESTAMP', %{When this data happened. (defaults to now)}
|
52
|
+
# TODO: add option to take data from STDIN.
|
53
|
+
|
54
|
+
c.action do |args, options|
|
55
|
+
sol = MrMurano::ServiceConfigs::Tsdb.new
|
56
|
+
|
57
|
+
# we have hash of tags, hash of metrics, optional timestamp.
|
58
|
+
metrics = {}
|
59
|
+
tags = {}
|
60
|
+
args.each do |item|
|
61
|
+
key, value = item.split('=', 2)
|
62
|
+
if key[0] == '@' then
|
63
|
+
tags[key[1..-1]] = value.to_s #tags are always strings.
|
64
|
+
else
|
65
|
+
value = value.to_i if value == value.to_i.to_s
|
66
|
+
metrics[key] = value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
data = {:tags=>tags, :metrics=>metrics}
|
71
|
+
if not options.when.nil? and options.when != 'now' then
|
72
|
+
data[:ts] = sol.str_to_timestamp(options.when)
|
73
|
+
end
|
74
|
+
|
75
|
+
ret = sol.write(data)
|
76
|
+
if ret != {} then
|
77
|
+
sol.error ret
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
command 'tsdb query' do |c|
|
83
|
+
c.syntax = %{mr tsdb query [options] }
|
84
|
+
c.summary = %{query data}
|
85
|
+
c.description =%{
|
86
|
+
|
87
|
+
list metrics to return
|
88
|
+
list tag=value to match
|
89
|
+
|
90
|
+
|
91
|
+
FUNCS is a comma seperated list of the aggregate functions.
|
92
|
+
FILL is null, none, any integer, previous
|
93
|
+
|
94
|
+
DURATION is an integer with time unit to indicate relative time before now.
|
95
|
+
Units are u (microseconds), ms (milliseconds), s (seconds), m (minutes),
|
96
|
+
h (hours), d (days), w (weeks)
|
97
|
+
|
98
|
+
TIMESTAMP is microseconds since unix epoch, or can be suffixed with units.
|
99
|
+
Units are u (microseconds), ms (milliseconds), s (seconds)
|
100
|
+
|
101
|
+
Also, many date-time formats can be parsed and will be converted to microseconds
|
102
|
+
}
|
103
|
+
c.option '--start_time TIMESTAMP', %{Start time range}
|
104
|
+
c.option '--end_time TIMESTAMP', %{End time range; defaults to now}
|
105
|
+
c.option '--relative_start DURATION', %{Start time relative from now}
|
106
|
+
c.option '--relative_end DURATION', %{End time relative from now}
|
107
|
+
c.option '--sampling_size DURATION', %{The size of time slots used for downsampling}
|
108
|
+
c.option '--limit NUM', Integer, %{Limit number of data points returned}
|
109
|
+
c.option '--epoch UNIT', ['u','ms','s'], %{Set size of returned timestamps}
|
110
|
+
c.option '--mode MODE', ['merge','split'], %{Merge or split each returned metric}
|
111
|
+
c.option '--fill FILL', %{Value to fill for time slots with no data points exist in merge mode}
|
112
|
+
c.option '--order_by ORDER', ['desc','asc'], %{Return results in ascending or descending time order}
|
113
|
+
c.option '--aggregate FUNCS', %{Aggregation functions to apply}
|
114
|
+
|
115
|
+
c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
|
116
|
+
|
117
|
+
c.action do |args, options|
|
118
|
+
sol = MrMurano::ServiceConfigs::Tsdb.new
|
119
|
+
|
120
|
+
query = {}
|
121
|
+
tags = {}
|
122
|
+
metrics = []
|
123
|
+
args.each do |arg|
|
124
|
+
if arg =~ /=/ then
|
125
|
+
# a tag.
|
126
|
+
k,v = arg.split('=', 2)
|
127
|
+
tags[k] = v
|
128
|
+
else
|
129
|
+
metrics << arg
|
130
|
+
end
|
131
|
+
end
|
132
|
+
query[:tags] = tags unless tags.empty?
|
133
|
+
query[:metrics] = metrics unless metrics.empty?
|
134
|
+
|
135
|
+
unless options.start_time.nil? then
|
136
|
+
query[:start_time] = sol.str_to_timestamp(options.start_time)
|
137
|
+
end
|
138
|
+
unless options.end_time.nil? then
|
139
|
+
query[:end_time] = sol.str_to_timestamp(options.end_time)
|
140
|
+
end
|
141
|
+
|
142
|
+
unless options.relative_start.nil? then
|
143
|
+
o = options.relative_start
|
144
|
+
o = "-#{o}" unless o[0] == '-'
|
145
|
+
query[:relative_start] = o
|
146
|
+
end
|
147
|
+
unless options.relative_end.nil? then
|
148
|
+
o = options.relative_end
|
149
|
+
o = "-#{o}" unless o[0] == '-'
|
150
|
+
query[:relative_end] = o
|
151
|
+
end
|
152
|
+
query[:sampling_size] = options.sampling_size unless options.sampling_size.nil?
|
153
|
+
|
154
|
+
query[:limit] = options.limit unless options.limit.nil?
|
155
|
+
query[:epoch] = options.epoch unless options.epoch.nil?
|
156
|
+
query[:mode] = options.mode unless options.mode.nil?
|
157
|
+
query[:order_by] = options.order_by unless options.order_by.nil?
|
158
|
+
|
159
|
+
query[:fill] = options.fill unless options.fill.nil?
|
160
|
+
unless options.aggregate.nil? then
|
161
|
+
query[:aggregate] = options.aggregate.split(',')
|
162
|
+
end
|
163
|
+
|
164
|
+
io=nil
|
165
|
+
if options.output then
|
166
|
+
io = File.open(options.output, 'w')
|
167
|
+
end
|
168
|
+
sol.outf sol.query(query) do |dd, ios|
|
169
|
+
sol.tabularize({
|
170
|
+
:headers=>dd[:columns],
|
171
|
+
:rows=>dd[:values]
|
172
|
+
}, ios)
|
173
|
+
end
|
174
|
+
io.close unless io.nil?
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
command 'tsdb list tags' do |c|
|
179
|
+
c.syntax = %{mr tsdb list tags [options]}
|
180
|
+
c.summary = %{List tags}
|
181
|
+
|
182
|
+
c.action do |args, options|
|
183
|
+
sol = MrMurano::ServiceConfigs::Tsdb.new
|
184
|
+
ret = sol.listTags
|
185
|
+
# TODO: handle looping if :next != nil
|
186
|
+
sol.outf ret[:tags].keys
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
command 'tsdb list metrics' do |c|
|
191
|
+
c.syntax = %{mr tsdb list metrics [options]}
|
192
|
+
c.summary = %{List metrics}
|
193
|
+
|
194
|
+
c.action do |args, options|
|
195
|
+
sol = MrMurano::ServiceConfigs::Tsdb.new
|
196
|
+
ret = sol.listMetrics
|
197
|
+
# TODO: handle looping if :next != nil
|
198
|
+
sol.outf ret[:metrics]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
# vim: set ai et sw=2 ts=2 :
|
@@ -0,0 +1,112 @@
|
|
1
|
+
#compdef <%= program :name %>
|
2
|
+
|
3
|
+
__<%= program :name %>_common_options=(
|
4
|
+
<% for option in @options -%>
|
5
|
+
<%- if flatswitches(option).count > 1 -%>
|
6
|
+
{<%= flatswitches(option).join(',') %>}<%= takesArg(option) %>:"<%= optionDesc option %>"
|
7
|
+
<%- else -%>
|
8
|
+
"<%= flatswitches(option).first %><%= takesArg(option) %>:<%= optionDesc option %>"
|
9
|
+
<%- end -%>
|
10
|
+
<% end %>
|
11
|
+
)
|
12
|
+
|
13
|
+
_<%= program :name %> () {
|
14
|
+
local curcontext="$curcontext" state line
|
15
|
+
typeset -A opt_args
|
16
|
+
|
17
|
+
# except this fails when a command only has one arg and then options.
|
18
|
+
_arguments -C \
|
19
|
+
':command:->command' \
|
20
|
+
'*::options:->options'
|
21
|
+
#echo "\n=$curcontext=$state=$words=\n"
|
22
|
+
case $state in
|
23
|
+
(command)
|
24
|
+
local -a list
|
25
|
+
list=(
|
26
|
+
<%- for name, subs in cmdTree -%>
|
27
|
+
<%- cmd = subs["\0cmd"] -%>
|
28
|
+
<%- if cmd.nil? -%>
|
29
|
+
<%= name %>:' '
|
30
|
+
<%-else-%>
|
31
|
+
<%= name %>:'<%= cmd.summary || cmd.description.lines[0] -%>'
|
32
|
+
<%-end-%>
|
33
|
+
<%-end-%>
|
34
|
+
)
|
35
|
+
_describe -t firstArg 'firstArg' list
|
36
|
+
_describe -t options 'global options' __<%= program :name %>_common_options
|
37
|
+
;;
|
38
|
+
(options)
|
39
|
+
case $line[1] in
|
40
|
+
<%- for name, subs in cmdTree -%>
|
41
|
+
(<%= name %>)
|
42
|
+
__<%=program :name%>-<%= name %>
|
43
|
+
;;
|
44
|
+
<%-end-%>
|
45
|
+
esac
|
46
|
+
;;
|
47
|
+
esac
|
48
|
+
}
|
49
|
+
|
50
|
+
<%- for name, subs in cmdTree -%>
|
51
|
+
<%- command = subs["\0cmd"]; subs = subs.reject{|k,_| k == "\0cmd"} -%>
|
52
|
+
__<%=program :name%>-<%= name %> () {
|
53
|
+
local curcontext="$curcontext" state line
|
54
|
+
typeset -A opt_args
|
55
|
+
|
56
|
+
_arguments -C \
|
57
|
+
':command:->command' \
|
58
|
+
'*::options:->options'
|
59
|
+
|
60
|
+
case $state in
|
61
|
+
(command)
|
62
|
+
<%- unless subs.empty? -%>
|
63
|
+
local -a subcommands
|
64
|
+
subcommands=(
|
65
|
+
<%- for sname, ssubs in subs -%>
|
66
|
+
<%- command = ssubs["\0cmd"] -%>
|
67
|
+
<%- if command.nil? then -%>
|
68
|
+
<%=sname%>:''
|
69
|
+
<%-else-%>
|
70
|
+
<%=sname%>:'<%= command.summary || command.description.lines[0] -%>'
|
71
|
+
<%-end-%>
|
72
|
+
<%-end-%>
|
73
|
+
)
|
74
|
+
_describe -t commands 'subcommand' subcommands
|
75
|
+
<%-end-%>
|
76
|
+
_describe -t options 'global options' __<%= program :name %>_common_options
|
77
|
+
<%- unless command.nil? or command.options.empty? then -%>
|
78
|
+
_arguments \
|
79
|
+
<%- for option in command.options -%>
|
80
|
+
<%- if flatswitches(option).count > 1 -%>
|
81
|
+
{<%= flatswitches(option).join(',') %>}<%= takesArg(option) %>"[<%= optionDesc option %>]: :" \
|
82
|
+
<%- else -%>
|
83
|
+
"<%= flatswitches(option).first %><%= takesArg(option) %>[<%= optionDesc option %>]: :" \
|
84
|
+
<%- end -%>
|
85
|
+
<%- end -%>
|
86
|
+
<%- end %>
|
87
|
+
;;
|
88
|
+
(options)
|
89
|
+
case $line[1] in
|
90
|
+
<%- for sname, ssubs in subs -%>
|
91
|
+
<%- command = ssubs["\0cmd"]; subs = ssubs.reject{|k,_| k == "\0cmd"} -%>
|
92
|
+
(<%=sname%>)
|
93
|
+
_describe -t options 'global options' __<%= program :name %>_common_options
|
94
|
+
<%- unless command.nil? or command.options.empty? then -%>
|
95
|
+
_arguments \
|
96
|
+
<%- for option in command.options -%>
|
97
|
+
<%- if flatswitches(option).count > 1 -%>
|
98
|
+
{<%= flatswitches(option).join(',') %>}<%= takesArg(option) %>"[<%= optionDesc option %>]: :" \
|
99
|
+
<%- else -%>
|
100
|
+
"<%= flatswitches(option).first %><%= takesArg(option) %>[<%= optionDesc option %>]: :" \
|
101
|
+
<%- end -%>
|
102
|
+
<%- end -%>
|
103
|
+
<%- end %>
|
104
|
+
;;
|
105
|
+
<%-end-%>
|
106
|
+
esac
|
107
|
+
;;
|
108
|
+
esac
|
109
|
+
}
|
110
|
+
<%- end -%>
|
111
|
+
|
112
|
+
# vim: set ai et sw=2 ts=2 :
|
data/lib/MrMurano/commands.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require 'MrMurano/commands/account'
|
3
2
|
require 'MrMurano/commands/assign'
|
4
3
|
require 'MrMurano/commands/config'
|
@@ -20,3 +19,7 @@ require 'MrMurano/commands/solutionList'
|
|
20
19
|
require 'MrMurano/commands/status'
|
21
20
|
require 'MrMurano/commands/sync'
|
22
21
|
require 'MrMurano/commands/timeseries'
|
22
|
+
require 'MrMurano/commands/tsdb'
|
23
|
+
|
24
|
+
require 'MrMurano/commands/completion'
|
25
|
+
|
data/lib/MrMurano/http.rb
CHANGED
@@ -12,7 +12,7 @@ module MrMurano
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def json_opts
|
15
|
-
return @json_opts unless @json_opts.nil?
|
15
|
+
return @json_opts unless not defined?(@json_opts) or @json_opts.nil?
|
16
16
|
@json_opts = {
|
17
17
|
:allow_nan => true,
|
18
18
|
:symbolize_names => true,
|
@@ -38,7 +38,7 @@ module MrMurano
|
|
38
38
|
|
39
39
|
def http
|
40
40
|
uri = URI('https://' + $cfg['net.host'])
|
41
|
-
if @http.nil? then
|
41
|
+
if not defined?(@http) or @http.nil? then
|
42
42
|
@http = Net::HTTP.new(uri.host, uri.port)
|
43
43
|
@http.use_ssl = true
|
44
44
|
@http.start
|
@@ -111,8 +111,9 @@ module MrMurano
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
def get(path='', &block)
|
114
|
+
def get(path='', query=nil, &block)
|
115
115
|
uri = endPoint(path)
|
116
|
+
uri.query = URI.encode_www_form(query) unless query.nil?
|
116
117
|
workit(set_def_headers(Net::HTTP::Get.new(uri)), &block)
|
117
118
|
end
|
118
119
|
|
data/lib/MrMurano/makePretty.rb
CHANGED
@@ -1,14 +1,23 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'json'
|
3
|
-
require '
|
3
|
+
require 'highline'
|
4
4
|
|
5
5
|
module MrMurano
|
6
6
|
module Pretties
|
7
|
+
|
8
|
+
HighLine::Style.new(:name=>:on_aliceblue, :code=>"\e[48;5;231m", :rgb=>[240, 248, 255])
|
9
|
+
PRETTIES_COLORSCHEME = HighLine::ColorScheme.new do |cs|
|
10
|
+
cs[:subject] = [:red, :on_aliceblue]
|
11
|
+
cs[:timestamp] = [:blue]
|
12
|
+
cs[:json] = [:magenta]
|
13
|
+
end
|
14
|
+
HighLine.color_scheme = PRETTIES_COLORSCHEME
|
15
|
+
|
7
16
|
def self.makeJsonPretty(data, options)
|
8
17
|
if options.pretty then
|
9
18
|
ret = JSON.pretty_generate(data).to_s
|
10
|
-
ret[0] = ret[0]
|
11
|
-
ret[-1] = ret[-1]
|
19
|
+
ret[0] = HighLine.color(ret[0], :json)
|
20
|
+
ret[-1] = HighLine.color(ret[-1], :json)
|
12
21
|
ret
|
13
22
|
else
|
14
23
|
data.to_json
|
@@ -17,8 +26,8 @@ module MrMurano
|
|
17
26
|
|
18
27
|
def self.makePretty(line, options)
|
19
28
|
out=''
|
20
|
-
out << "#{line[:type] || '--'} ".upcase
|
21
|
-
out << "[#{line[:subject] || ''}]"
|
29
|
+
out << HighLine.color("#{line[:type] || '--'} ".upcase, :subject)
|
30
|
+
out << HighLine.color("[#{line[:subject] || ''}]", :subject)
|
22
31
|
out << " "
|
23
32
|
if line.has_key?(:timestamp) then
|
24
33
|
if line[:timestamp].kind_of? Numeric then
|
@@ -33,7 +42,7 @@ module MrMurano
|
|
33
42
|
else
|
34
43
|
curtime = "<no timestamp>"
|
35
44
|
end
|
36
|
-
out <<
|
45
|
+
out << HighLine.color(curtime, :timestamp)
|
37
46
|
out << ":\n"
|
38
47
|
if line.has_key?(:data) then
|
39
48
|
data = line[:data]
|