MrMurano 1.6.3 → 1.7.0
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/.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]
|