usd 0.1.5 → 0.2.2
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/LICENSE.md +20 -0
- data/README.md +22 -21
- data/bin/rusdc +205 -59
- data/change_log.md +76 -0
- data/lib/usd.rb +11 -5
- data/usd.gemspec +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3fcd67e1d03c8438152bd6a247c644d72b4d7300ae8e434d5e0920772df6473
|
4
|
+
data.tar.gz: 49289a822d2906027417ac0d56d621a1cd1b53766ff651b5069858a8bb221d6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e4f7fde898d1b6477b9c08e96811b738d45e40fffffd16f3c0d474c1629d3e2a0ba4079b453623917a1d111f11b6989e83378b63e728c334936c4ecce271f5b
|
7
|
+
data.tar.gz: b517f049992b629a745e23c0af441814a7f45486a9a0617b6a69ae319cd6c68df9cf0561ac1033d1d4bc63e045d281836067f40e24fc6ca6c2985d9f401967e0
|
data/LICENSE.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2019 Oliver Gaida
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ There is a ruby class and a commandline tool rusdc.
|
|
8
8
|
just install the gem:
|
9
9
|
|
10
10
|
```bash
|
11
|
-
|
11
|
+
gem install usd
|
12
12
|
```
|
13
13
|
|
14
14
|
Be aware that you need some compiler-tools and the ruby headers:
|
@@ -27,34 +27,35 @@ If you use the `rusdc find` command with `--format mlr` option then you need `ml
|
|
27
27
|
|
28
28
|
- [mlr - Miller](http://johnkerl.org/miller/doc/index.html) - a great tool for data-transforming to and from json, csv and many more
|
29
29
|
|
30
|
-
Place the `mlr`-binary in a path, which is in your PATH-Environment.
|
30
|
+
Place the `mlr`-binary in a path, which is in your PATH-Environment. Download-Url for mlr-releases: [https://github.com/johnkerl/miller/releases](https://github.com/johnkerl/miller/releases)
|
31
31
|
|
32
32
|
# functions from the commandline-tool `rusdc`
|
33
33
|
|
34
34
|
```
|
35
35
|
rusdc
|
36
36
|
Commands:
|
37
|
-
rusdc chg_add_nr
|
38
|
-
rusdc chg_list_nr
|
39
|
-
rusdc create
|
40
|
-
rusdc field_names
|
41
|
-
rusdc find
|
42
|
-
rusdc get
|
43
|
-
rusdc get_attachment_of_ci
|
44
|
-
rusdc get_attachment_of_co
|
45
|
-
rusdc help [COMMAND]
|
46
|
-
rusdc
|
47
|
-
rusdc
|
48
|
-
rusdc
|
49
|
-
rusdc
|
50
|
-
rusdc
|
51
|
-
rusdc
|
52
|
-
rusdc
|
53
|
-
rusdc
|
37
|
+
rusdc chg_add_nr <co> <ci> # add a CI to a changeorder
|
38
|
+
rusdc chg_list_nr <co> # list all CIs of one changeorder
|
39
|
+
rusdc create # pipe json-data to create object
|
40
|
+
rusdc field_names <object-type> # list all fields of an object including its format
|
41
|
+
rusdc find <object-type> [where-clause] [fields, comma separated] [options] # finds each object which meets the wc-condition
|
42
|
+
rusdc get <object-type> <common_name> # shows one object
|
43
|
+
rusdc get_attachment_of_ci <ci_name> <filename> # download an attachment of a CI and print it out on stdout
|
44
|
+
rusdc get_attachment_of_co <co_name> <filename> # download an attachment of a changeorder and print it out on stdout
|
45
|
+
rusdc help [COMMAND] # Describe available commands or one specific command
|
46
|
+
rusdc in_list_child_ins <in> # list all child-incidents of one incident
|
47
|
+
rusdc list_attachments_of_ci <ci_name> # list all attachments of a CI
|
48
|
+
rusdc list_attachments_of_co <co_name> # list all attachments of a changeorder
|
49
|
+
rusdc nr_add_child <nr-name> <child-name> # add one child CI to another CI
|
50
|
+
rusdc nr_changes <nr> [inactive-too] # list all open changeorders of one CI
|
51
|
+
rusdc nr_childs <ci-name> # lists all childs CIs of a specific CI
|
52
|
+
rusdc nr_incidents <nr> [inactive-too] # lists all incident of a specific CI
|
53
|
+
rusdc nr_parents <ci-name> # lists all parent CIs of a specific CI
|
54
|
+
rusdc update # pipe json-data to update object
|
55
|
+
rusdc update_attr <obj> <common_name> <key> <value> # updates a direct (not referenced) attribute of one object.
|
56
|
+
rusdc update_ref_attr <obj> <common_name> <key> <value> # updates a referenced attribute of one object.
|
54
57
|
```
|
55
58
|
|
56
|
-
the german text will be translated soon.
|
57
|
-
|
58
59
|
# environment-variables
|
59
60
|
|
60
61
|
rusdc needs some environment-variables. there are:
|
data/bin/rusdc
CHANGED
@@ -7,7 +7,7 @@ require "usd"
|
|
7
7
|
|
8
8
|
class Rusdc < Thor
|
9
9
|
|
10
|
-
desc "chg_add_nr
|
10
|
+
desc "chg_add_nr <co> <ci>", "add a CI to a changeorder"
|
11
11
|
def chg_add_nr(co, ci)
|
12
12
|
template = ERB.new <<-EOF
|
13
13
|
{
|
@@ -25,9 +25,9 @@ class Rusdc < Thor
|
|
25
25
|
puts loadcon.create({:type => "json", :data => json})
|
26
26
|
end
|
27
27
|
|
28
|
-
desc "chg_list_nr", "
|
28
|
+
desc "chg_list_nr <co>", "list all CIs of one changeorder"
|
29
29
|
def chg_list_nr(co)
|
30
|
-
invoke 'find', ['lrel_asset_chgnr', %(chg.chg_ref_num = '#{co}'), "nr"], {:format => "mlr"
|
30
|
+
invoke 'find', ['lrel_asset_chgnr', %(chg.chg_ref_num = '#{co}'), "nr"], {:format => "mlr"}
|
31
31
|
end
|
32
32
|
|
33
33
|
desc "create", "pipe json-data to create object"
|
@@ -35,64 +35,79 @@ class Rusdc < Thor
|
|
35
35
|
puts loadcon.create({:type => "json", :data => STDIN.read})
|
36
36
|
end
|
37
37
|
|
38
|
-
desc "field_names
|
39
|
-
def field_names(object)
|
40
|
-
e = loadcon.search(object,{'fields' => "*","start" => "1", "size" => "1"})[0]
|
38
|
+
desc "field_names <object-type> [wc]","list all fields of an object including its format"
|
39
|
+
def field_names(object,wc="")
|
40
|
+
e = loadcon.search(object,{'fields' => "*","wc"=>wc,"start" => "1", "size" => "1"})[0]
|
41
41
|
e.keys.sort.each do |k|
|
42
|
-
puts "#{k} (#{e[k].class})"
|
43
42
|
if e[k].class == Hash
|
43
|
+
puts "#{k} (#{e[k].class}):"
|
44
44
|
puts e[k].jp
|
45
|
+
else
|
46
|
+
puts "#{k} (#{e[k].class}) : #{e[k]}"
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
|
-
desc "find
|
51
|
+
desc "find <object-type> [where-clause] [fields, comma separated] [options]", "finds each object which meets the wc-condition"
|
50
52
|
long_desc <<-LONGDESC
|
51
53
|
|
52
54
|
|
53
|
-
|
55
|
+
with --mlr_format you may change the output-format of Miller (mlr) to csv, md (markdown), xtab , dkvp (delimited key-value pairs) ..., refer `mlr --help`
|
56
|
+
|
57
|
+
Examples:
|
54
58
|
|
55
|
-
|
59
|
+
- all grc objects (! don't use this kind of query for objecttype like nr, in, chg etc., whose number of objects is too big)
|
60
|
+
rusdc find grc
|
56
61
|
|
57
|
-
-
|
58
|
-
|
62
|
+
- all aktive ci which start with the string `servername`, only print the fields @id and name:
|
63
|
+
rusdc find nr "name like 'servername%' and delete_flag.sym = 'Active' " "@id,name" --format mlr
|
59
64
|
|
60
|
-
-
|
61
|
-
|
65
|
+
- my active incidents with most importent fields:
|
66
|
+
rusdc find --format mlr in "assignee.last_name = 'gaida' and status.sym in ('Service pending','Work in progress.','Customer Pending','Open','Hold','Resolved')" ref_num,z_project,summary,status,call_back_date,affected_resource,orig_user_organization
|
62
67
|
|
63
|
-
-
|
64
|
-
|
68
|
+
- activity-Log of an incident in xtab format:
|
69
|
+
rusdc find alg "call_req_id.ref_num = 'I00001'" "call_req_id,action_desc,analyst,description,time_stamp,type" --format mlr --mlr_format xtab
|
65
70
|
|
66
|
-
-
|
67
|
-
|
71
|
+
- the same but only the field description in csv-format:
|
72
|
+
rusdc find alg "call_req_id.ref_num = 'I00001'" "description" --format mlr --mlr_format csv
|
68
73
|
|
69
|
-
-
|
70
|
-
|
74
|
+
- incidents of the ci with the name `servername`
|
75
|
+
rusdc find in "affected_resource.name = 'servername'" "ref_num,summary" --format mlr
|
71
76
|
|
72
|
-
-
|
73
|
-
|
77
|
+
- combination of all activity-log-description of all incidents of a specific ci in pprint-Miller-format:
|
78
|
+
rusdc find alg "call_req_id.affected_resource.name = 'servername'" "description" --format mlr
|
74
79
|
|
75
|
-
-
|
80
|
+
- changeorders of a secific ci:
|
76
81
|
rusdc find chg "asset.nr.name = 'servername'" "@COMMON_NAME,summary,status" --format mlr
|
77
82
|
|
78
|
-
-
|
83
|
+
- find all active ci whose name start with dc and check if they have children like Windows or Linux server:
|
79
84
|
for ci in $(rusdc find nr "name like 'dc%' and delete_flag.sym = 'active'" "name" --format mlr | sed '1 d'); do rusdc nr_childs $ci > help ; echo "$ci: $(grep -iP '^(Linux|.*MS windows).*server' help)" ; done
|
80
85
|
|
81
86
|
LONGDESC
|
82
|
-
option :format, :type => :string, :default => "json"
|
83
|
-
option :mlr_format, :type => :string, :default => "pprint"
|
84
|
-
option :nice_time, :type => :boolean, :default => true
|
85
|
-
option :debug, :type => :boolean, :default => false
|
86
|
-
def find(object, wc, fields="
|
87
|
+
option :format, :type => :string, :default => "json", :banner => "[json|yaml|mlr]"
|
88
|
+
option :mlr_format, :type => :string, :default => "pprint",:banner => "[pprint|json|md|csv|xtab]"
|
89
|
+
option :nice_time, :type => :boolean, :default => true,:banner => "[true|false]"
|
90
|
+
option :debug, :type => :boolean, :default => false,:banner => "[true|false]"
|
91
|
+
def find(object, wc="", fields="@COMMON_NAME")
|
87
92
|
unless (fields =~ /^[\w\_,@]+$/)
|
88
|
-
puts "fields-problem: there must be only letters, numbers, comma
|
93
|
+
puts "fields-problem: there must be only letters, numbers, comma, the @-sign or underscore, nothing else!"
|
89
94
|
else
|
90
95
|
con = loadcon
|
96
|
+
mlr_array = []
|
91
97
|
con.debug = options[:debug]
|
92
98
|
e = con.search(object,{'fields' => fields,"wc" => wc})
|
93
99
|
fields_array=fields.split(/,/)
|
94
100
|
e.each do |elem|
|
101
|
+
# init all requested keys with empty strings, better for mlr format and needed for fields-order
|
102
|
+
fields_array.each do |elem_key|
|
103
|
+
elem[elem_key]="" unless elem.has_key?(elem_key)
|
104
|
+
end
|
95
105
|
elem.keys.each do |elem_key|
|
106
|
+
if options[:nice_time]
|
107
|
+
if elem_key =~ /(date|last_mod|warranty_start|warranty_end|time_stamp)$/
|
108
|
+
elem[elem_key]=Time.at(elem[elem_key]).to_s
|
109
|
+
end
|
110
|
+
end
|
96
111
|
if fields_array.include?(elem_key)
|
97
112
|
if elem[elem_key].class == Hash
|
98
113
|
elem_value = elem[elem_key]["@COMMON_NAME"]
|
@@ -103,32 +118,21 @@ class Rusdc < Thor
|
|
103
118
|
elem.delete(elem_key)
|
104
119
|
end
|
105
120
|
end
|
106
|
-
#
|
107
|
-
fields_array.
|
108
|
-
unless elem.has_key?(elem_key)
|
109
|
-
elem[elem_key]=""
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
if options[:nice_time]
|
114
|
-
e.each_index do |i|
|
115
|
-
e[i].keys.each do |key|
|
116
|
-
if key =~ /(date|last_mod|warranty_start|warranty_end|time_stamp)$/
|
117
|
-
e[i][key]=Time.at(e[i][key]).to_s
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
+
# sort the keys
|
122
|
+
mlr_array << Hash[fields_array.map {|k| [k, elem[k]]}].jp
|
121
123
|
end
|
124
|
+
mlr = "[" + mlr_array.join(",") + "]"
|
122
125
|
case options[:format]
|
123
126
|
when "json"
|
124
|
-
puts
|
127
|
+
puts mlr
|
125
128
|
when "yaml"
|
129
|
+
# keys not sorted, maybe a todo
|
126
130
|
puts e.to_yaml
|
127
131
|
when "mlr"
|
128
132
|
# hierfuer muss mlr verfuegbar sein
|
129
133
|
file = Tempfile.new('json')
|
130
134
|
cmd = %(mlr --ijson --o#{options[:mlr_format]} cat #{file.path})
|
131
|
-
file.write(
|
135
|
+
file.write(mlr)
|
132
136
|
file.close
|
133
137
|
puts `#{cmd}`
|
134
138
|
file.unlink
|
@@ -138,10 +142,15 @@ class Rusdc < Thor
|
|
138
142
|
end # fields check
|
139
143
|
end
|
140
144
|
|
141
|
-
desc "get
|
145
|
+
desc "get <object-type> <common_name|id>", "shows one object by name or id"
|
146
|
+
option :by_id, :type => :boolean, :default => false
|
142
147
|
option :yaml, :type => :boolean, :default => false
|
143
|
-
def get(object,
|
144
|
-
|
148
|
+
def get(object, ident)
|
149
|
+
if options[:by_id] || ident =~ /^U'[0-9A-F]/i
|
150
|
+
e = loadcon.request("/caisd-rest/#{object}/#{ident}")
|
151
|
+
else
|
152
|
+
e = loadcon.request("/caisd-rest/#{object}/COMMON_NAME-#{ident}")
|
153
|
+
end
|
145
154
|
if e.class == Hash
|
146
155
|
puts options[:yaml] ? e[object].to_yaml : e[object].jp
|
147
156
|
elsif e.message == "409 Conflict"
|
@@ -151,7 +160,23 @@ class Rusdc < Thor
|
|
151
160
|
end
|
152
161
|
end
|
153
162
|
|
154
|
-
desc "
|
163
|
+
desc "get_all_attachments_of_co <co_name>", "get all attachments of a changeorder and save all these to current folder"
|
164
|
+
def get_all_attachments_of_co(coname)
|
165
|
+
# todo : care more about eml-multipart: https://github.com/mikel/mail
|
166
|
+
chg_id=loadcon.request("/caisd-rest/chg/COMMON_NAME-#{coname}")["chg"]["@id"]
|
167
|
+
att_nr = loadcon.search("lrel_attachments_changes",{'fields' => "attmnt","wc" => "chg = #{chg_id}"})
|
168
|
+
att_nr.each do |att|
|
169
|
+
attmnt = loadcon.request("/caisd-rest/attmnt/COMMON_NAME-#{att["attmnt"]["@COMMON_NAME"]}")["attmnt"]
|
170
|
+
filename = attmnt["orig_file_name"]
|
171
|
+
puts "save #{filename}"
|
172
|
+
f = File.open(filename, 'w')
|
173
|
+
f.write(loadcon.request("/caisd-rest/attmnt/#{attmnt["@id"]}/file-resource",{:unchanged => true}))
|
174
|
+
f.close
|
175
|
+
end
|
176
|
+
puts "all attachments were saved"
|
177
|
+
end
|
178
|
+
|
179
|
+
desc "get_attachment_of_ci <ci_name> <filename>", "download an attachment of a CI and print it out on stdout"
|
155
180
|
def get_attachment_of_ci(ciname, filename)
|
156
181
|
att_nr = loadcon.search("lrel_attachments_nr",{'fields' => "attmnt","wc" => "nr.name = '#{ciname}'"})
|
157
182
|
att_nr.each do |att|
|
@@ -162,7 +187,7 @@ class Rusdc < Thor
|
|
162
187
|
end
|
163
188
|
end
|
164
189
|
|
165
|
-
desc "get_attachment_of_co
|
190
|
+
desc "get_attachment_of_co <co_name> <filename>", "download an attachment of a changeorder and print it out on stdout"
|
166
191
|
def get_attachment_of_co(coname, filename)
|
167
192
|
chg_id=loadcon.request("/caisd-rest/chg/COMMON_NAME-#{coname}")["chg"]["@id"]
|
168
193
|
att_nr = loadcon.search("lrel_attachments_changes",{'fields' => "attmnt","wc" => "chg = #{chg_id}"})
|
@@ -174,7 +199,12 @@ class Rusdc < Thor
|
|
174
199
|
end
|
175
200
|
end
|
176
201
|
|
177
|
-
desc "
|
202
|
+
desc "in_list_child_ins <in>", "list all child-incidents of one incident"
|
203
|
+
def in_list_child_ins(incident)
|
204
|
+
invoke('find',['cr', "parent.ref_num = '#{incident}'", "ref_num"], {:format => "mlr"})
|
205
|
+
end
|
206
|
+
|
207
|
+
desc "list_attachments_of_ci <ci_name>", "list all attachments of a CI"
|
178
208
|
def list_attachments_of_ci(ciname)
|
179
209
|
att_nr = loadcon.search("lrel_attachments_nr",{'fields' => "attmnt","wc" => "nr.name = '#{ciname}'"})
|
180
210
|
att_nr.each do |att|
|
@@ -182,7 +212,7 @@ class Rusdc < Thor
|
|
182
212
|
end
|
183
213
|
end
|
184
214
|
|
185
|
-
desc "list_attachments_of_co", "
|
215
|
+
desc "list_attachments_of_co <co_name>", "list all attachments of a changeorder"
|
186
216
|
def list_attachments_of_co(coname)
|
187
217
|
chg_id=loadcon.request("/caisd-rest/chg/COMMON_NAME-#{coname}")["chg"]["@id"]
|
188
218
|
att_nr = loadcon.search("lrel_attachments_changes",{'fields' => "attmnt","wc" => "chg = #{chg_id}"})
|
@@ -191,7 +221,7 @@ class Rusdc < Thor
|
|
191
221
|
end
|
192
222
|
end
|
193
223
|
|
194
|
-
desc "nr_add_child
|
224
|
+
desc "nr_add_child <nr-name> <child-name>", "add one child CI to another CI"
|
195
225
|
def nr_add_child(nr, child)
|
196
226
|
template = ERB.new <<-EOF
|
197
227
|
{
|
@@ -209,7 +239,7 @@ class Rusdc < Thor
|
|
209
239
|
puts loadcon.create({:type => "json", :data => json})
|
210
240
|
end
|
211
241
|
|
212
|
-
desc "nr_changes
|
242
|
+
desc "nr_changes <nr> [inactive-too]", "list all open changeorders of one CI"
|
213
243
|
option :inactive_too, :type => :boolean, :default => false
|
214
244
|
def nr_changes(nr)
|
215
245
|
wc_add = (options[:inactive_too] ? "" : " and status.sym in ('Service pending','Work in progress','Customer Pending','Open','Hold')")
|
@@ -217,20 +247,20 @@ class Rusdc < Thor
|
|
217
247
|
invoke 'find', ['chg', wc, 'chg_ref_num,summary,status'], {:format => "mlr"}
|
218
248
|
end
|
219
249
|
|
220
|
-
desc "nr_childs
|
250
|
+
desc "nr_childs <ci-name>", "lists all childs CIs of a specific CI"
|
221
251
|
def nr_childs(name)
|
222
252
|
loadcon.search("hier",{'fields' => "*","wc" => "parent.name = '#{name}'"}).each do |c|
|
223
253
|
puts c["child"]["@COMMON_NAME"]
|
224
254
|
end
|
225
255
|
end
|
226
256
|
|
227
|
-
desc "nr_incidents
|
257
|
+
desc "nr_incidents <nr> [inactive-too]", "lists all incident of a specific CI"
|
228
258
|
option :inactive_too, :type => :boolean, :default => false
|
229
259
|
def nr_incidents(nr)
|
230
260
|
invoke 'find', ['in', %(affected_resource.name = '#{nr}'#{options[:inactive_too] ? "" : " and not status.sym in ('Cancelled','Closed')"}), "ref_num,summary,status"], {:format => "mlr"}
|
231
261
|
end
|
232
262
|
|
233
|
-
desc "nr_parents
|
263
|
+
desc "nr_parents <ci-name>", "lists all parent CIs of a specific CI"
|
234
264
|
def nr_parents(name)
|
235
265
|
loadcon.search("hier",{'fields' => "*","wc" => "child.name = '#{name}'"}).each do |c|
|
236
266
|
puts c["parent"]["@COMMON_NAME"]
|
@@ -250,6 +280,122 @@ class Rusdc < Thor
|
|
250
280
|
puts loadcon.update({:type => "json", :data => STDIN.read})
|
251
281
|
end
|
252
282
|
|
283
|
+
desc "update_attr <obj> <common_name|wc> <key> <value>", "updates a direct (not referenced) attribute of one or more objects."
|
284
|
+
option :plain_text, :type => :boolean, :default => false
|
285
|
+
def update_attr(obj, cn, k, v)
|
286
|
+
if k =~ /(date|last_mod|warranty_start|warranty_end|time_stamp)$/
|
287
|
+
v=Time.parse(v).to_i
|
288
|
+
end
|
289
|
+
if cn =~ /([<>=]| like )/
|
290
|
+
obj_arr=loadcon.search(obj,{'fields' => "@id","wc"=>"#{cn} and delete_flag.sym = 'Active'"})
|
291
|
+
obj_arr.each do |inner_obj|
|
292
|
+
inner_id=inner_obj["@id"]
|
293
|
+
template = ERB.new <<-EOF
|
294
|
+
{
|
295
|
+
"<%= obj %>": {
|
296
|
+
"@id": "<%= id %>",
|
297
|
+
"<%= k %>": "<%= v %>"
|
298
|
+
}
|
299
|
+
}
|
300
|
+
EOF
|
301
|
+
json = template.result_with_hash({
|
302
|
+
:obj => obj,
|
303
|
+
:id => inner_id,
|
304
|
+
:k => k,
|
305
|
+
:v => v
|
306
|
+
})
|
307
|
+
puts loadcon.update({:type => "json", :data => json})
|
308
|
+
end
|
309
|
+
else
|
310
|
+
if options[:plain_text]
|
311
|
+
data={
|
312
|
+
obj => {
|
313
|
+
"@COMMON_NAME" => cn,
|
314
|
+
k => v
|
315
|
+
}
|
316
|
+
}
|
317
|
+
json = JSON.pretty_generate(data)
|
318
|
+
else
|
319
|
+
template = ERB.new <<-EOF
|
320
|
+
{
|
321
|
+
"<%= obj %>": {
|
322
|
+
"@COMMON_NAME": "<%= cn %>",
|
323
|
+
"<%= k %>": "<%= v %>"
|
324
|
+
}
|
325
|
+
}
|
326
|
+
EOF
|
327
|
+
json = template.result_with_hash({
|
328
|
+
:obj => obj,
|
329
|
+
:cn => cn,
|
330
|
+
:k => k,
|
331
|
+
:v => v
|
332
|
+
})
|
333
|
+
end
|
334
|
+
puts loadcon.update({:type => "json", :data => json})
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
desc "update_attr_by_id <obj> <id> <key> <value>", "updates a plain attribute of one object by id, does not work"
|
339
|
+
def update_attr_by_id(obj, id, k, v)
|
340
|
+
template = ERB.new <<-EOF
|
341
|
+
{
|
342
|
+
"<%= obj %>": {
|
343
|
+
"@id": "<%= id %>",
|
344
|
+
"<%= k %>": "<%= v %>"
|
345
|
+
}
|
346
|
+
}
|
347
|
+
EOF
|
348
|
+
json = template.result_with_hash({
|
349
|
+
:obj => obj,
|
350
|
+
:id => id,
|
351
|
+
:k => k,
|
352
|
+
:v => v
|
353
|
+
})
|
354
|
+
puts loadcon.update({:type => "json", :data => json})
|
355
|
+
end
|
356
|
+
|
357
|
+
desc "update_ref_attr <obj> <common_name> <key> <value>", "updates a referenced attribute of one object."
|
358
|
+
def update_ref_attr(obj, cn, k, v)
|
359
|
+
template = ERB.new <<-EOF
|
360
|
+
{
|
361
|
+
"<%= obj %>": {
|
362
|
+
"@COMMON_NAME": "<%= cn %>",
|
363
|
+
"<%= k %>": {
|
364
|
+
"@COMMON_NAME": "<%= v %>"
|
365
|
+
}
|
366
|
+
}
|
367
|
+
}
|
368
|
+
EOF
|
369
|
+
json = template.result_with_hash({
|
370
|
+
:obj => obj,
|
371
|
+
:cn => cn,
|
372
|
+
:k => k,
|
373
|
+
:v => v
|
374
|
+
})
|
375
|
+
puts loadcon.update({:type => "json", :data => json})
|
376
|
+
end
|
377
|
+
|
378
|
+
desc "update_ref_attr_by_id <obj> <id> <key> <value>", "updates a referenced attribute of one object by id"
|
379
|
+
def update_ref_attr_by_id(obj, id, k, v)
|
380
|
+
template = ERB.new <<-EOF
|
381
|
+
{
|
382
|
+
"<%= obj %>": {
|
383
|
+
"@id": "<%= id %>",
|
384
|
+
"<%= k %>": {
|
385
|
+
"@id": "<%= v %>"
|
386
|
+
}
|
387
|
+
}
|
388
|
+
}
|
389
|
+
EOF
|
390
|
+
json = template.result_with_hash({
|
391
|
+
:obj => obj,
|
392
|
+
:id => id,
|
393
|
+
:k => k,
|
394
|
+
:v => v
|
395
|
+
})
|
396
|
+
puts loadcon.update({:type => "json", :data => json})
|
397
|
+
end
|
398
|
+
|
253
399
|
|
254
400
|
private
|
255
401
|
|
data/change_log.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# changelog
|
2
|
+
|
3
|
+
## 0.2.1
|
4
|
+
|
5
|
+
- function `update_attr` has a new option for putting plain text with linebreaks in it.
|
6
|
+
|
7
|
+
- new funciton `update_ref_attr_by_id` sometimes there are problem if you try to update via common_name, so here you can use the `@id` instead.
|
8
|
+
|
9
|
+
- `rusdc get` now supports id too
|
10
|
+
|
11
|
+
- rusdc field_names , now there is a second parameter [wc]. So that's a way to show all fields of a special opbject.
|
12
|
+
|
13
|
+
Example:
|
14
|
+
|
15
|
+
```
|
16
|
+
rusdc field_names wf "@id = 1535123" | head -3
|
17
|
+
@COMMON_NAME (String) :
|
18
|
+
@REL_ATTR (String) : 1535123
|
19
|
+
@id (String) : 1535123
|
20
|
+
```
|
21
|
+
|
22
|
+
## 0.1.9
|
23
|
+
|
24
|
+
- function update_attr will parse with Time-Module if the key match the regular expression: `(date|last_mod|warranty_start|warranty_end|time_stamp)`. And then the value will be change to epoche-seconds
|
25
|
+
|
26
|
+
Example:
|
27
|
+
|
28
|
+
```
|
29
|
+
rusdc update_attr chg CO000001 call_back_date "2020-01-01 11:11:11 +0100"
|
30
|
+
```
|
31
|
+
|
32
|
+
- new function in rusdc `get_all_attachments_of_co`. In the first implementation it will save all attachments with its original name in the current folder. existing files may be overwritten. Caution!
|
33
|
+
|
34
|
+
## 0.1.8
|
35
|
+
|
36
|
+
- new function in rusdc `update_attr`
|
37
|
+
|
38
|
+
Example for `update_attr`:
|
39
|
+
|
40
|
+
```bash
|
41
|
+
> rusdc help update_attr
|
42
|
+
Usage:
|
43
|
+
rusdc update_attr <obj> <common_name> <key> <value>
|
44
|
+
|
45
|
+
updates a direct (not referenced) attribute of one object.
|
46
|
+
|
47
|
+
> rusdc get cnt 'gaida, oliver' | grep alt_phone
|
48
|
+
"alt_phone": "",
|
49
|
+
> rusdc update_attr cnt 'gaida, oliver' alt_phone "+49123456789"
|
50
|
+
> rusdc get cnt 'gaida, oliver' | grep alt_phone
|
51
|
+
"alt_phone": "+49123456789",
|
52
|
+
```
|
53
|
+
|
54
|
+
- new function in rusdc `update_ref_attr`
|
55
|
+
|
56
|
+
Example for `update_ref_attr`:
|
57
|
+
|
58
|
+
```bash
|
59
|
+
> rusdc help update_ref_attr
|
60
|
+
Usage:
|
61
|
+
rusdc update_ref_attr <obj> <common_name> <key> <value>
|
62
|
+
|
63
|
+
updates a referenced attribute of one object.
|
64
|
+
> rusdc find chg "chg_ref_num = 'CO000001'" status --format mlr
|
65
|
+
status
|
66
|
+
Work in progress
|
67
|
+
> rusdc update_ref_attr chg CO000001 status "Service pending"
|
68
|
+
> rusdc find chg "chg_ref_num = 'CO000001'" status --format mlr
|
69
|
+
status
|
70
|
+
Service pending
|
71
|
+
```
|
72
|
+
|
73
|
+
## 0.1.7
|
74
|
+
|
75
|
+
- fix sorting the output of `rusdc find`
|
76
|
+
- add new rusdc function `rusdc in_list_child_ins`
|
data/lib/usd.rb
CHANGED
@@ -21,8 +21,9 @@ class Usd
|
|
21
21
|
@base_url = base_url
|
22
22
|
@user = user
|
23
23
|
@debug = false
|
24
|
-
|
25
|
-
|
24
|
+
remfile = "#{ENV["HOME"]}/.usd"
|
25
|
+
if File.exist?(remfile) and hash[:save_access_key]
|
26
|
+
tt = YAML.load(File.open(remfile,"r"))
|
26
27
|
if (tt.expiration_date - Time.now.to_i ) > 900 and tt.base_url == base_url
|
27
28
|
@access_key = tt.access_key
|
28
29
|
@expiration_date = tt.expiration_date
|
@@ -56,7 +57,7 @@ class Usd
|
|
56
57
|
@access_key = authData['rest_access']['access_key']
|
57
58
|
@expiration_date = authData['rest_access']['expiration_date']
|
58
59
|
if hash[:save_access_key]
|
59
|
-
f=File.open(
|
60
|
+
f=File.open(remfile,"w")
|
60
61
|
f.puts self.to_yaml
|
61
62
|
f.close
|
62
63
|
end
|
@@ -146,8 +147,13 @@ class Usd
|
|
146
147
|
end
|
147
148
|
puts "update - data: #{JSON.pretty_generate(data)}" if @debug
|
148
149
|
object = data.keys[0]
|
149
|
-
|
150
|
-
|
150
|
+
if data[object].has_key?("@id")
|
151
|
+
request("/caisd-rest/#{object}/#{data[object]["@id"]}",{:method => "put", :json => data.to_json, :header => header({'X-Obj-Attrs' => 'COMMON_NAME'})})
|
152
|
+
elsif data[object].has_key?("@COMMON_NAME")
|
153
|
+
request("/caisd-rest/#{object}/COMMON_NAME-#{data[object]["@COMMON_NAME"]}",{:method => "put", :json => data.to_json, :header => header({'X-Obj-Attrs' => 'COMMON_NAME'})})
|
154
|
+
else
|
155
|
+
puts "specify @COMMON_NAME or @id at least."
|
156
|
+
end
|
151
157
|
end
|
152
158
|
|
153
159
|
def set_url_parm(params_hash,attribute_name,default)
|
data/usd.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'usd'
|
3
|
-
spec.version = '0.
|
4
|
-
spec.date = '2019-
|
3
|
+
spec.version = '0.2.2'
|
4
|
+
spec.date = '2019-11-26'
|
5
5
|
spec.summary = "SDM REST-API-Calls"
|
6
6
|
spec.description = "a Ruby class and a commandlinetool for SDM REST-API-Calls"
|
7
7
|
spec.authors = ["Oliver Gaida"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oliver Gaida
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -77,9 +77,11 @@ executables:
|
|
77
77
|
extensions: []
|
78
78
|
extra_rdoc_files: []
|
79
79
|
files:
|
80
|
+
- LICENSE.md
|
80
81
|
- README.md
|
81
82
|
- bin/rusdc
|
82
83
|
- bin/set_env
|
84
|
+
- change_log.md
|
83
85
|
- lib/usd.rb
|
84
86
|
- usd.gemspec
|
85
87
|
homepage: https://github.com/ogaida/usd
|