usd 0.1.5 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|