MrMurano 1.5.2 → 1.5.3

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: ac2a53f721bb1eb5785155d07e9a0f63afb07b43
4
- data.tar.gz: d0deb6961935b84b30766580fb1f3e66dc1439ac
3
+ metadata.gz: eb66958edb807052d6d7e8ea8673cf1137dea0f7
4
+ data.tar.gz: 84d50836cafec96fb0bd3c6cc92ecd2c78b92a61
5
5
  SHA512:
6
- metadata.gz: 3694669cfcc0b7a9588cff924ac3aa9516e5a30194a9884cdb3911617542d813a3015f3b7cc4a72cf08eaf71f6dcd886d63cd8fa029297316627fb2f49aa5d1c
7
- data.tar.gz: 0a510f4d9d497057a7b3371be4f792720f4d84eb9ee815be2dfcbcd580329835f4f0461c7bf746785482285514ce31045a414e523575ac66d173b84646a14c75
6
+ metadata.gz: bafcf0de9d2466d5e6262217317ee7f3824baf012645ed5136388a99e34cd91bf87b73751435c78ef62acbcd656723a7c28988ce23b98dd7e566c0355429f42f
7
+ data.tar.gz: d09ef03f75a47cb230949635d1562e9ce2e076a2acc617cfd4281ff486146884ea79ad89b63582bca687314623848dc41316be2446e4deb8b69ab338084674a1
data/TODO.taskpaper CHANGED
@@ -39,6 +39,7 @@ Timeseries:
39
39
 
40
40
  Product:
41
41
  - Auto convert exoline spec files into murano spec files on upload?
42
+ - write alias command @done(2016-09-26)
42
43
  - Need to add way to set the product ID on a device eventhandler. @done(2016-08-01)
43
44
 
44
45
  Service Device:
@@ -9,6 +9,7 @@ require 'MrMurano/commands/exportImport'
9
9
  require 'MrMurano/commands/keystore'
10
10
  require 'MrMurano/commands/logs'
11
11
  require 'MrMurano/commands/productSpec'
12
+ require 'MrMurano/commands/productWrite'
12
13
  require 'MrMurano/commands/status'
13
14
  require 'MrMurano/commands/sync'
14
15
  require 'MrMurano/commands/timeseries'
@@ -11,7 +11,6 @@ command :config do |c|
11
11
  c.example %{See what the current combined config is}, 'mr config --dump'
12
12
  c.example %{Query a value}, 'mr config solution.id'
13
13
  c.example %{Set a new value; writing to the project config file}, 'mr config solution.id XXXXXXXX'
14
- c.example %{Set a new value; writing to the private config file}, 'mr config --private solution.id XXXXXXXX'
15
14
  c.example %{Set a new value; writing to the user config file}, 'mr config --user user.name my@email.address'
16
15
  c.example %{Unset a value in a configfile. (lower scopes will become visible if set)},
17
16
  'mr config diff.cmd --unset'
@@ -20,7 +19,7 @@ command :config do |c|
20
19
  c.option '--system', 'Use only the system config file. (/etc/mrmuranorc)'
21
20
  c.option '--user', 'Use only the config file in $HOME (.mrmuranorc)'
22
21
  c.option '--project', 'Use only the config file in the project (.mrmuranorc)'
23
- c.option '--private', 'Use only the private config file in the project (.mrmuranorc.private)'
22
+ c.option '--env', 'Use only the config file from $MR_CONFIGFILE'
24
23
  c.option '--specified', 'Use only the config file from the --config option.'
25
24
 
26
25
  c.option '--unset', 'Remove key from config file.'
@@ -34,14 +33,14 @@ command :config do |c|
34
33
  say_error "Need a config key"
35
34
  elsif args.count == 1 and not options.unset then
36
35
  options.defaults :system=>false, :user=>false, :project=>false,
37
- :specified=>false, :private=>false
36
+ :specified=>false, :env=>false
38
37
 
39
38
  # For read, if no scopes, than all. Otherwise just those specified
40
39
  scopes = []
41
40
  scopes << :system if options.system
42
41
  scopes << :user if options.user
43
42
  scopes << :project if options.project
44
- scopes << :private if options.private
43
+ scopes << :env if options.env
45
44
  scopes << :specified if options.specified
46
45
  scopes = MrMurano::Config::CFG_SCOPES if scopes.empty?
47
46
 
@@ -49,13 +48,13 @@ command :config do |c|
49
48
  else
50
49
 
51
50
  options.defaults :system=>false, :user=>false, :project=>true,
52
- :specified=>false, :private=>false
51
+ :specified=>false, :env=>false
53
52
  # For write, if scope is specified, only write to that scope.
54
53
  scope = :project
55
54
  scope = :system if options.system
56
55
  scope = :user if options.user
57
56
  scope = :project if options.project
58
- scope = :private if options.private
57
+ scope = :env if options.env
59
58
  scope = :specified if options.specified
60
59
 
61
60
  args[1] = nil if options.unset
@@ -84,23 +84,51 @@ command 'keystore delete' do |c|
84
84
  end
85
85
  end
86
86
  alias_command 'keystore rm', 'keystore delete'
87
+ alias_command 'keystore del', 'keystore delete'
87
88
 
88
89
  command 'keystore command' do |c|
89
- c.syntax = %{mr keystore command <key> <command> <args...>}
90
+ c.syntax = %{mr keystore command <command> <key> <args...>}
90
91
  c.summary = %{Call some Redis commands in the Keystore}
91
92
  c.description = %{Call some Redis commands in the Keystore.
92
93
 
93
94
  Only a subset of all Redis commands is supported.
94
95
  See http://docs.exosite.com/murano/services/keystore/#command for current list.
95
96
  }
96
- c.example %{mr keystore command mykey lpush myvalue}, %{Push a value onto list}
97
- c.example %{mr keystore command mykey lpush A B C}, %{Push three values onto list}
98
- c.example %{mr keystore command mykey lrem 0 B}, %{Remove all B values from list}
97
+ c.example %{mr keystore command lpush mykey myvalue}, %{Push a value onto list}
98
+ c.example %{mr keystore command lpush mykey A B C}, %{Push three values onto list}
99
+ c.example %{mr keystore command lrem mykey 0 B}, %{Remove all B values from list}
99
100
  c.action do |args,options|
100
- sol = MrMurano::Keystore.new
101
- pp sol.command(args[0], args[1], args[2..-1])
101
+ if args.count < 2 then
102
+ say_error "Not enough params"
103
+ else
104
+ sol = MrMurano::Keystore.new
105
+ ret = sol.command(args[1], args[0], args[2..-1])
106
+ if ret.has_key?(:value) then
107
+ puts ret[:value]
108
+ else
109
+ say_error "#{ret[:code]}: #{ret.message}"
110
+ pp ret[:error] if ($cfg['tool.debug'] and ret.has_key?(:error))
111
+ end
112
+ end
102
113
  end
103
114
  end
104
115
  alias_command 'keystore cmd', 'keystore command'
105
116
 
117
+ # A bunch of common REDIS commands that are suported in Murano
118
+ alias_command 'keystore lpush', 'keystore command', 'lpush'
119
+ alias_command 'keystore lindex', 'keystore command', 'lindex'
120
+ alias_command 'keystore llen', 'keystore command', 'llen'
121
+ alias_command 'keystore linsert', 'keystore command', 'linsert'
122
+ alias_command 'keystore lrange', 'keystore command', 'lrange'
123
+ alias_command 'keystore lrem', 'keystore command', 'lrem'
124
+ alias_command 'keystore lset', 'keystore command', 'lset'
125
+ alias_command 'keystore ltrim', 'keystore command', 'ltrim'
126
+ alias_command 'keystore rpop', 'keystore command', 'rpop'
127
+ alias_command 'keystore rpush', 'keystore command', 'rpush'
128
+ alias_command 'keystore sadd', 'keystore command', 'sadd'
129
+ alias_command 'keystore srem', 'keystore command', 'srem'
130
+ alias_command 'keystore scard', 'keystore command', 'scard'
131
+ alias_command 'keystore smembers', 'keystore command', 'smembers'
132
+ alias_command 'keystore spop', 'keystore command', 'spop'
133
+
106
134
  # vim: set ai et sw=2 ts=2 :
@@ -20,100 +20,103 @@ command :logs do |c|
20
20
 
21
21
  sol = MrMurano::Solution.new
22
22
  begin
23
- ret = sol.get('/logs') # TODO: ('/logs?polling=true') Currently ignored.
24
-
25
- if ret.kind_of?(Hash) and ret.has_key?(:items) then
26
- ret[:items].reverse.each do |line|
27
- curtime = ""
28
- if line.kind_of?(String) then
29
-
30
- line.sub!(/^\[[^\]]*\]/) {|m| m.color(:red).background(:aliceblue)}
31
- line.sub!(/\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.\d+)(?:\+\d\d:\d\d)/) {|m|
32
- if options.localtime then
33
- m = DateTime.parse(m).to_time.localtime.to_datetime.iso8601(3)
34
- end
35
- curtime = m
36
- m.color(:blue)
37
- }
38
-
39
- line.gsub!(/\{(?>[^}{]+|\g<0>)*\}/m) do |m|
40
- if options.pretty then
41
- js = JSON.parse(m, {:allow_nan=>true, :create_additions=>false})
42
- ret = JSON.pretty_generate(js).to_s
43
- ret[0] = ret[0].color(:magenta)
44
- ret[-1] = ret[-1].color(:magenta)
45
- ret
46
- else
47
- m.sub!(/^{/){|ml| ml.color(:magenta)}
48
- m.sub!(/}$/){|ml| ml.color(:magenta)}
49
- m
50
- end
51
- end
52
-
53
- out = line
54
-
55
- elsif line.kind_of?(Hash) then
56
- out=""
57
-
58
- if line.has_key?(:type) then
59
- out << "#{line[:type]} ".upcase.color(:red).background(:aliceblue)
60
- end
61
- out << "[#{line[:subject]}]".color(:red).background(:aliceblue)
62
- out << " "
63
- if options.localtime then
64
- curtime = Time.at(line[:timestamp]).localtime.to_datetime.iso8601(3)
65
- else
66
- curtime = Time.at(line[:timestamp]).to_datetime.iso8601(3)
67
- end
68
- out << curtime.color(:blue)
69
- out << ":\n"
70
- if line.has_key?(:data) then
71
- data = line[:data]
23
+ begin
24
+ ret = sol.get('/logs') # TODO: ('/logs?polling=true') Currently ignored.
25
+
26
+ if ret.kind_of?(Hash) and ret.has_key?(:items) then
27
+ ret[:items].reverse.each do |line|
28
+ curtime = ""
29
+ if line.kind_of?(String) then
30
+
31
+ line.sub!(/^\[[^\]]*\]/) {|m| m.color(:red).background(:aliceblue)}
32
+ line.sub!(/\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.\d+)(?:\+\d\d:\d\d)/) {|m|
33
+ if options.localtime then
34
+ m = DateTime.parse(m).to_time.localtime.to_datetime.iso8601(3)
35
+ end
36
+ curtime = m
37
+ m.color(:blue)
38
+ }
72
39
 
73
- if data.kind_of?(Hash) and data.has_key?(:request) and data.has_key?(:response) then
74
- out << "---------\nrequest:"
40
+ line.gsub!(/\{(?>[^}{]+|\g<0>)*\}/m) do |m|
75
41
  if options.pretty then
76
- ret = JSON.pretty_generate(data[:request]).to_s
42
+ js = JSON.parse(m, {:allow_nan=>true, :create_additions=>false})
43
+ ret = JSON.pretty_generate(js).to_s
77
44
  ret[0] = ret[0].color(:magenta)
78
45
  ret[-1] = ret[-1].color(:magenta)
79
- out << ret
46
+ ret
80
47
  else
81
- out << data[:request].to_json
48
+ m.sub!(/^{/){|ml| ml.color(:magenta)}
49
+ m.sub!(/}$/){|ml| ml.color(:magenta)}
50
+ m
82
51
  end
52
+ end
53
+
54
+ out = line
55
+
56
+ elsif line.kind_of?(Hash) then
57
+ out=""
58
+
59
+ if line.has_key?(:type) then
60
+ out << "#{line[:type]} ".upcase.color(:red).background(:aliceblue)
61
+ end
62
+ out << "[#{line[:subject]}]".color(:red).background(:aliceblue)
63
+ out << " "
64
+ if options.localtime then
65
+ curtime = Time.at(line[:timestamp]).localtime.to_datetime.iso8601(3)
66
+ else
67
+ curtime = Time.at(line[:timestamp]).to_datetime.iso8601(3)
68
+ end
69
+ out << curtime.color(:blue)
70
+ out << ":\n"
71
+ if line.has_key?(:data) then
72
+ data = line[:data]
73
+
74
+ if data.kind_of?(Hash) and data.has_key?(:request) and data.has_key?(:response) then
75
+ out << "---------\nrequest:"
76
+ if options.pretty then
77
+ ret = JSON.pretty_generate(data[:request]).to_s
78
+ ret[0] = ret[0].color(:magenta)
79
+ ret[-1] = ret[-1].color(:magenta)
80
+ out << ret
81
+ else
82
+ out << data[:request].to_json
83
+ end
84
+
85
+ out << "\n---------\nresponse:"
86
+ if options.pretty then
87
+ ret = JSON.pretty_generate(data[:response]).to_s
88
+ ret[0] = ret[0].color(:magenta)
89
+ ret[-1] = ret[-1].color(:magenta)
90
+ out << ret
91
+ else
92
+ out << data[:response].to_json
93
+ end
83
94
 
84
- out << "\n---------\nresponse:"
85
- if options.pretty then
86
- ret = JSON.pretty_generate(data[:response]).to_s
87
- ret[0] = ret[0].color(:magenta)
88
- ret[-1] = ret[-1].color(:magenta)
89
- out << ret
90
95
  else
91
- out << data[:response].to_json
96
+ out << data.to_s
92
97
  end
93
98
 
94
99
  else
95
- out << data.to_s
100
+ out << line.to_s
96
101
  end
97
102
 
98
- else
99
- out << line.to_s
100
103
  end
101
104
 
102
- end
105
+ if curtime > lasttime then
106
+ lasttime = curtime
107
+ puts out
108
+ end
103
109
 
104
- if curtime > lasttime then
105
- lasttime = curtime
106
- puts out
107
110
  end
108
-
111
+ else
112
+ say_error "Couldn't get logs: #{ret}"
113
+ break
109
114
  end
110
- else
111
- say_error "Couldn't get logs: #{ret}"
112
- break
113
- end
114
115
 
115
- sleep(options.pollrate) if options.follow
116
- end while options.follow
116
+ sleep(options.pollrate) if options.follow
117
+ end while options.follow
118
+ rescue Interrupt => e
119
+ end
117
120
 
118
121
  end
119
122
  end
@@ -0,0 +1,25 @@
1
+ require 'MrMurano/Product'
2
+
3
+ command 'product write' do |c|
4
+ c.syntax = %{mr product write <sn> <alias> <value> ([<alias> <value>]…)}
5
+ c.summary = %{Write values into the product}
6
+
7
+ c.action do |args,options|
8
+ sn = args.shift
9
+ if (args.count % 2) != 0 then
10
+ say_error "Last alias is missing a value to write."
11
+ else
12
+ data = Hash[*args]
13
+ prd = MrMurano::Product.new
14
+ ret = prd.write(sn, data)
15
+ ret.each_pair do |k,v|
16
+ if v == 'ok' then
17
+ say "#{k.to_s}: #{v}"
18
+ else
19
+ say_error "#{k.to_s}: #{v}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ # vim: set ai et sw=2 ts=2 :
data/lib/MrMurano/http.rb CHANGED
@@ -61,7 +61,7 @@ module MrMurano
61
61
  ret = JSON.parse(data, json_opts)
62
62
  return JSON.pretty_generate(ret)
63
63
  rescue
64
- return response.body
64
+ return data
65
65
  end
66
66
  end
67
67
 
@@ -1,4 +1,4 @@
1
1
  module MrMurano
2
- VERSION = '1.5.2'.freeze
2
+ VERSION = '1.5.3'.freeze
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: MrMurano
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Conrad Tadpol Tilstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-27 00:00:00.000000000 Z
11
+ date: 2016-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -218,6 +218,7 @@ files:
218
218
  - lib/MrMurano/commands/keystore.rb
219
219
  - lib/MrMurano/commands/logs.rb
220
220
  - lib/MrMurano/commands/productSpec.rb
221
+ - lib/MrMurano/commands/productWrite.rb
221
222
  - lib/MrMurano/commands/status.rb
222
223
  - lib/MrMurano/commands/sync.rb
223
224
  - lib/MrMurano/commands/timeseries.rb