soracom 1.0.9 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e9745bc2f0f947a2cb0954fe49cdc1fc50590a4
4
- data.tar.gz: 501bcd5ecda32e92233dac8bf3d60a8f4d3cee1a
3
+ metadata.gz: 76e5bdebebad971ecab7c61854f14379ed898737
4
+ data.tar.gz: 1b4187c8005078047866acaec5e3bd5771bfd47e
5
5
  SHA512:
6
- metadata.gz: 1ec3fd4d06886bd480cbba8488104c478bdb33ae3df13c32386641915e9a82554fcfeee2c4d20d3e96083ebe9539d26834c1ef874b0ed2fc64ee5a725c6fdbe8
7
- data.tar.gz: 0b029b540cab0faa08082b7c1bfc1b86c03fb094ee0d63db98985678186ffaaccce6813170bfb222bc0671b8477bd39e5695cd08f79a288c854f6a8403a91d62
6
+ metadata.gz: b32df7ef3e41262310fc24f97e52f61a527173758961b770fcfbc4d78e11f7f4dd5ec1a22331f39c9cee234ec2ae3a2d0aec44fb2792ccd6ae13303d1392a76e
7
+ data.tar.gz: 02ff32ffa7a5e7e70ba311503e8fec1ac8e1441acb5e98103182c486f5d5c793fb411144d6ab715634cb1e360f94e3ee120ec6701ad13732260f6743462b14c9
@@ -10,7 +10,8 @@ module SoracomCli
10
10
  option :limit, type: :numeric, required: false, desc: 'max number of result(default:1024)'
11
11
  option :filter, type: :hash, required: false, desc: 'ex) --filter key:imsi value:001010000000001 / --filter key:tagname value:tagvalue'
12
12
  def list
13
- client = Soracom::Client.new
13
+ client = Soracom::Client.new(profile:options.profile)
14
+ options.delete('profile')
14
15
  sims = client.list_subscribers(Hash[options.map { |k, v| [k.to_sym, v] }])
15
16
  puts JSON.pretty_generate(sims)
16
17
  end
@@ -21,21 +22,22 @@ module SoracomCli
21
22
  option :type, type: :string, desc: 'default plan type'
22
23
  option :tags, type: :hash, desc: 'tag as hash i.e. --tags name:"foo" group:"bar"'
23
24
  def register
24
- client = Soracom::Client.new
25
+ client = Soracom::Client.new(profile:options.profile)
26
+ options.delete('profile')
25
27
  puts JSON.pretty_generate(client.register_subscriber(Hash[options.map { |k, v| [k.to_sym, v] }]))
26
28
  end
27
29
 
28
30
  desc 'activate', 'activate Subscriber(SIM)s'
29
31
  option :imsi, type: :array, required: true
30
32
  def activate
31
- client = Soracom::Client.new
33
+ client = Soracom::Client.new(profile:options.profile)
32
34
  puts JSON.pretty_generate(client.activate_subscriber(options[:imsi]))
33
35
  end
34
36
 
35
37
  desc 'deactivate', 'deactivate Subscriber(SIM)s'
36
38
  option :imsi, type: :array, required: true
37
39
  def deactivate
38
- client = Soracom::Client.new
40
+ client = Soracom::Client.new(profile:options.profile)
39
41
  puts JSON.pretty_generate(client.deactivate_subscriber(options[:imsi]))
40
42
  end
41
43
 
@@ -44,21 +46,21 @@ module SoracomCli
44
46
  option :confirm, type: :string
45
47
  def terminate
46
48
  abort 'You may not revert terminate opereation. Please add "--confirm YES" if you are sure.' if options[:confirm] != 'YES'
47
- client = Soracom::Client.new
49
+ client = Soracom::Client.new(profile:options.profile)
48
50
  puts JSON.pretty_generate(client.terminate_subscriber(options[:imsi]))
49
51
  end
50
52
 
51
53
  desc 'enable_termination', 'enable termination of Subscriber(SIM)s'
52
54
  option :imsi, type: :array, required: true
53
55
  def enable_termination
54
- client = Soracom::Client.new
56
+ client = Soracom::Client.new(profile:options.profile)
55
57
  puts JSON.pretty_generate(client.enable_termination(options[:imsi]))
56
58
  end
57
59
 
58
60
  desc 'disable_termination', 'disable termination of Subscriber(SIM)s'
59
61
  option :imsi, type: :array, required: true
60
62
  def disable_termination
61
- client = Soracom::Client.new
63
+ client = Soracom::Client.new(profile:options.profile)
62
64
  puts JSON.pretty_generate(client.disable_termination(options[:imsi]))
63
65
  end
64
66
 
@@ -66,7 +68,7 @@ module SoracomCli
66
68
  option :imsi, type: :array, required: true
67
69
  option :tags, type: :hash, required: true
68
70
  def update_tags
69
- client = Soracom::Client.new
71
+ client = Soracom::Client.new(profile:options.profile)
70
72
  puts JSON.pretty_generate(client.update_subscriber_tags(options[:imsi], options[:tags]))
71
73
  end
72
74
 
@@ -74,7 +76,7 @@ module SoracomCli
74
76
  option :imsi, type: :array, required: true
75
77
  option :tag_name, type: :string, required: true
76
78
  def delete_tag
77
- client = Soracom::Client.new
79
+ client = Soracom::Client.new(profile:options.profile)
78
80
  puts JSON.pretty_generate(client.delete_subscriber_tag(options[:imsi], options[:tag_name]))
79
81
  end
80
82
 
@@ -82,7 +84,7 @@ module SoracomCli
82
84
  option :imsi, type: :array, required: true
83
85
  option :speed_class, type: :string, required: true
84
86
  def update_speed_class
85
- client = Soracom::Client.new
87
+ client = Soracom::Client.new(profile:options.profile)
86
88
  puts JSON.pretty_generate(client.update_subscriber_speed_class(options[:imsi], options[:speed_class]))
87
89
  end
88
90
 
@@ -90,14 +92,14 @@ module SoracomCli
90
92
  option :imsi, type: :array, required: true
91
93
  option :expiry_time, type: :numeric, required: true
92
94
  def set_expiry_time
93
- client = Soracom::Client.new
95
+ client = Soracom::Client.new(profile:options.profile)
94
96
  puts JSON.pretty_generate(client.set_expiry_time(options[:imsi], options[:expiry_time]))
95
97
  end
96
98
 
97
99
  desc 'unset_expiry_time', 'delete expiry time of Subscriber(SIM)s'
98
100
  option :imsi, type: :array, required: true
99
101
  def unset_expiry_time
100
- client = Soracom::Client.new
102
+ client = Soracom::Client.new(profile:options.profile)
101
103
  puts JSON.pretty_generate(client.unset_expiry_time(options[:imsi]))
102
104
  end
103
105
 
@@ -105,14 +107,14 @@ module SoracomCli
105
107
  option :imsi, type: :string, required: true
106
108
  option :group_id, type: :string, required: true
107
109
  def set_group
108
- client = Soracom::Client.new
110
+ client = Soracom::Client.new(profile:options.profile)
109
111
  puts JSON.pretty_generate(client.set_group(options[:imsi], options[:group_id]))
110
112
  end
111
113
 
112
114
  desc 'unset_group', 'unset group of Subscriber(SIM)'
113
115
  option :imsi, type: :string, required: true
114
116
  def unset_group
115
- client = Soracom::Client.new
117
+ client = Soracom::Client.new(profile:options.profile)
116
118
  puts JSON.pretty_generate(client.unset_group(options[:imsi]))
117
119
  end
118
120
  end
@@ -122,28 +124,28 @@ module SoracomCli
122
124
  desc 'list', 'list groups'
123
125
  option :group_id, type: :string, desc: 'group ID'
124
126
  def list
125
- client = Soracom::Client.new
127
+ client = Soracom::Client.new(profile:options.profile)
126
128
  puts JSON.pretty_generate(client.list_groups(options.group_id))
127
129
  end
128
130
 
129
131
  desc 'list_subscribers', 'list subscriber in a group'
130
132
  option :group_id, type: :string, required:true, desc: 'group ID'
131
133
  def list_subscribers
132
- client = Soracom::Client.new
134
+ client = Soracom::Client.new(profile:options.profile)
133
135
  puts JSON.pretty_generate(client.list_subscribers_in_group(options.group_id))
134
136
  end
135
137
 
136
138
  desc 'create', 'create group'
137
139
  option :tags, type: :hash, desc: 'group tags'
138
140
  def create
139
- client = Soracom::Client.new
141
+ client = Soracom::Client.new(profile:options.profile)
140
142
  puts JSON.pretty_generate(client.create_group(options.tags))
141
143
  end
142
144
 
143
145
  desc 'delete_group', 'delete a group'
144
146
  option :group_id, type: :string, required:true, desc: 'group ID'
145
147
  def delete
146
- client = Soracom::Client.new
148
+ client = Soracom::Client.new(profile:options.profile)
147
149
  puts JSON.pretty_generate(client.delete_group(options.group_id))
148
150
  end
149
151
 
@@ -152,7 +154,16 @@ module SoracomCli
152
154
  option :namespace, type: :string, required:true, desc: 'namespace of the parameter'
153
155
  option :params, type: :string, required:true, desc: 'JSON string of the configuration parameter'
154
156
  def update_configuration
155
- client = Soracom::Client.new
157
+ if options.params=~/^[a-z]+:\/\/(.+)/
158
+ begin
159
+ content = open(options.params.sub(/^file:\/\//,'')).read
160
+ options['params'] = content
161
+ rescue Errno::ENOENT
162
+ rescue SocketError
163
+ abort "ERROR: Cannot access #{options.params}."
164
+ end
165
+ end
166
+ client = Soracom::Client.new(profile:options.profile)
156
167
  puts JSON.pretty_generate(client.update_group_configuration(options.group_id, options.namespace, options.params))
157
168
  end
158
169
 
@@ -161,7 +172,7 @@ module SoracomCli
161
172
  option :namespace, type: :string, required:true, desc: 'namespace of the parameter'
162
173
  option :name, type: :string, required:true, desc: 'name of configuration parameter to delete'
163
174
  def delete_configuration
164
- client = Soracom::Client.new
175
+ client = Soracom::Client.new(profile:options.profile)
165
176
  puts JSON.pretty_generate(client.delete_group_configuration(options.group_id, options.namespace, options.name))
166
177
  end
167
178
 
@@ -169,7 +180,7 @@ module SoracomCli
169
180
  option :group_id, type: :string, required:true, desc: 'group ID'
170
181
  option :tags, type: :string, required:true, desc: 'JSON string of tags i.e. [{"tagName":"name","tagValue":"new group name"}]'
171
182
  def update_tags
172
- client = Soracom::Client.new
183
+ client = Soracom::Client.new(profile:options.profile)
173
184
  puts JSON.pretty_generate(client.update_group_tags(options.group_id, options.tags))
174
185
  end
175
186
 
@@ -177,7 +188,7 @@ module SoracomCli
177
188
  option :group_id, type: :string, required:true, desc: 'group ID'
178
189
  option :name, type: :string, required:true, desc: 'tag name to delete'
179
190
  def delete_tag
180
- client = Soracom::Client.new
191
+ client = Soracom::Client.new(profile:options.profile)
181
192
  puts JSON.pretty_generate(client.delete_group_tags(options.group_id, options.name))
182
193
  end
183
194
  end
@@ -189,21 +200,31 @@ module SoracomCli
189
200
  option :imsi, type: :string, desc: 'SIM unique ID, 15 digits'
190
201
  option :target, type: :string, desc: 'target can be operator/imsi/tag'
191
202
  def list
192
- client = Soracom::Client.new
203
+ client = Soracom::Client.new(profile:options.profile)
204
+ options.delete('profile')
193
205
  puts JSON.pretty_generate(client.list_event_handlers(Hash[options.map { |k, v| [k.to_sym, v] }]))
194
206
  end
195
207
 
196
208
  desc 'create', 'create event handler'
197
209
  option :req, type: :string, desc: 'JSON string of event handler configuration'
198
210
  def create
199
- client = Soracom::Client.new
211
+ if options.req=~/^[a-z]+:\/\/(.+)/
212
+ begin
213
+ content = open(options.req.sub(/^file:\/\//,'')).read
214
+ options['req'] = content
215
+ rescue Errno::ENOENT
216
+ rescue SocketError
217
+ abort "ERROR: Cannot access #{options.req}."
218
+ end
219
+ end
220
+ client = Soracom::Client.new(profile:options.profile)
200
221
  puts JSON.pretty_generate(client.create_event_handler(options.req))
201
222
  end
202
223
 
203
224
  desc 'delete', 'delete event handler'
204
225
  option :handler_id, type: :string, required:true, desc: 'Event Handler ID'
205
226
  def delete
206
- client = Soracom::Client.new
227
+ client = Soracom::Client.new(profile:options.profile)
207
228
  puts JSON.pretty_generate(client.delete_event_handler(options.handler_id))
208
229
  end
209
230
 
@@ -211,7 +232,16 @@ module SoracomCli
211
232
  option :handler_id, type: :string, required:true, desc: 'Event Handler ID'
212
233
  option :req, type: :string, desc: 'JSON string of event handler configuration'
213
234
  def update
214
- client = Soracom::Client.new
235
+ if options.req=~/^[a-z]+:\/\/(.+)/
236
+ begin
237
+ content = open(options.req.sub(/^file:\/\//,'')).read
238
+ options['req'] = content
239
+ rescue Errno::ENOENT
240
+ rescue SocketError
241
+ abort "ERROR: Cannot access #{options.req}."
242
+ end
243
+ end
244
+ client = Soracom::Client.new(profile:options.profile)
215
245
  puts JSON.pretty_generate(client.update_event_handler(options.handler_id, options.req))
216
246
  end
217
247
  end
@@ -224,7 +254,8 @@ module SoracomCli
224
254
  option :to, type: :numeric, required: false, desc: 'UNIX time in seconds when stat window ends'
225
255
  option :period, type: :string, required: false, desc: 'miniutes or day or month'
226
256
  def get_air_usage
227
- client = Soracom::Client.new
257
+ client = Soracom::Client.new(profile:options.profile)
258
+ options.delete('profile')
228
259
  data = client.get_air_usage(Hash[options.map { |k, v| [k.to_sym, v] }])
229
260
  puts JSON.pretty_generate(data)
230
261
  end
@@ -235,7 +266,8 @@ module SoracomCli
235
266
  option :to, type: :numeric, required: false, desc: 'UNIX time in seconds when stat window ends'
236
267
  option :period, type: :string, required: false, desc: 'miniutes or day or month'
237
268
  def get_beam_usage
238
- client = Soracom::Client.new
269
+ client = Soracom::Client.new(profile:options.profile)
270
+ options.delete('profile')
239
271
  data = client.get_beam_usage(Hash[options.map { |k, v| [k.to_sym, v] }])
240
272
  puts JSON.pretty_generate(data)
241
273
  end
@@ -245,7 +277,7 @@ module SoracomCli
245
277
  option :to, type: :numeric, required: false, desc: 'UNIX time in seconds when stat window ends'
246
278
  option :period, type: :string, required: false, desc: 'miniutes or day or month'
247
279
  def export_air_usage
248
- client = Soracom::Client.new
280
+ client = Soracom::Client.new(profile:options.profile)
249
281
  csv = client.export_air_usage(Hash[options.map { |k, v| [k.to_sym, v] }])
250
282
  puts csv
251
283
  end
@@ -255,54 +287,299 @@ module SoracomCli
255
287
  option :to, type: :numeric, required: false, desc: 'UNIX time in seconds when stat window ends'
256
288
  option :period, type: :string, required: false, desc: 'miniutes or day or month'
257
289
  def export_beam_usage
258
- client = Soracom::Client.new
290
+ client = Soracom::Client.new(profile:options.profile)
291
+ options.delete('profile')
259
292
  csv = client.export_beam_usage(Hash[options.map { |k, v| [k.to_sym, v] }])
260
293
  puts csv
261
294
  end
262
295
  end
263
296
 
297
+ # Operator related commands
264
298
  class Operator < Thor
265
- desc 'list_auth_keys', 'list auth keys'
299
+ desc 'list_auth_keys', 'list auth keys for Operator'
266
300
  def list_auth_keys
267
- client = Soracom::Client.new
268
- data = client.list_auth_keys()
301
+ client = Soracom::Client.new(profile:options.profile)
302
+ data = client.list_operator_auth_keys()
269
303
  puts JSON.pretty_generate(data)
270
304
  end
271
305
 
272
- desc 'create_auth_key', 'create new auth key'
273
- def create_auth_key
274
- client = Soracom::Client.new
275
- data = client.create_auth_key()
306
+ desc 'generate_auth_key', 'generate new auth key for Operator'
307
+ def generate_auth_key
308
+ client = Soracom::Client.new(profile:options.profile)
309
+ data = client.generate_operator_auth_key()
276
310
  puts JSON.pretty_generate(data)
277
311
  end
278
312
 
279
- desc 'delete_auth_key', 'delete existing auth key'
313
+ desc 'delete_auth_key', 'delete existing auth key for Operator'
280
314
  option :auth_key_id, type: :string, required: true, desc: 'auth key id starting "keyId-"'
281
315
  def delete_auth_key
316
+ client = Soracom::Client.new(profile:options.profile)
317
+ data = client.delete_operator_auth_key(options.auth_key_id)
318
+ puts JSON.pretty_generate(data)
319
+ end
320
+ end
321
+
322
+ # User related commands
323
+ class User < Thor
324
+ desc 'list_users', 'list users under Operator'
325
+ def list_users
326
+ client = Soracom::Client.new(profile:options.profile)
327
+ data = client.list_users()
328
+ puts JSON.pretty_generate(data)
329
+ end
330
+
331
+ desc 'delete_user', 'delete user under Operator'
332
+ option :user_name, required: true, desc: 'User name'
333
+ def delete_user
334
+ client = Soracom::Client.new(profile:options.profile)
335
+ data = client.delete_user(options.user_name)
336
+ puts JSON.pretty_generate(data)
337
+ end
338
+
339
+ desc 'get_user', 'get user info under Operator'
340
+ option :user_name, desc: 'User name'
341
+ def get_user
342
+ client = Soracom::Client.new(profile:options.profile)
343
+ data = client.get_user(options.user_name)
344
+ puts JSON.pretty_generate(data)
345
+ end
346
+
347
+ desc 'create_user', 'create user under Operator'
348
+ option :user_name, required: true, desc: 'User name'
349
+ option :description, desc: 'description for the user'
350
+ def create_user
351
+ client = Soracom::Client.new(profile:options.profile)
352
+ data = client.create_user(options.user_name, options.description)
353
+ puts JSON.pretty_generate(data)
354
+ end
355
+
356
+ desc 'update_user', 'update user under Operator'
357
+ option :user_name, required: true, desc: 'User name'
358
+ option :description, desc: 'description for the user'
359
+ def update_user
360
+ client = Soracom::Client.new(profile:options.profile)
361
+ data = client.update_user(options.user_name, options.description)
362
+ puts JSON.pretty_generate(data)
363
+ end
364
+
365
+ desc 'list_auth_keys', 'list auth keys for user'
366
+ option :user_name, desc: 'User name'
367
+ def list_auth_keys
368
+ client = Soracom::Client.new(profile:options.profile)
369
+ data = client.list_users_auth_key(options.user_name)
370
+ puts JSON.pretty_generate(data)
371
+ end
372
+
373
+ desc 'generate_auth_key', 'generate new auth key for user'
374
+ option :user_name, desc: 'User name'
375
+ def generate_auth_key
376
+ client = Soracom::Client.new(profile:options.profile)
377
+ data = client.generate_users_auth_key(options.user_name)
378
+ puts JSON.pretty_generate(data)
379
+ end
380
+
381
+ desc 'delete_auth_key', 'delete existing auth key for user'
382
+ option :user_name, desc: 'User name'
383
+ option :auth_key_id, type: :string, required: true, desc: 'auth key id starting "keyId-"'
384
+ def delete_auth_key
385
+ client = Soracom::Client.new(profile:options.profile)
386
+ data = client.delete_users_auth_key(options.user_name, options.auth_key_id)
387
+ puts JSON.pretty_generate(data)
388
+ end
389
+
390
+ desc 'get_auth_key', 'get auth key info for user'
391
+ option :user_name, desc: 'User name'
392
+ option :auth_key_id, type: :string, required: true, desc: 'auth key id starting "keyId-"'
393
+ def get_auth_key
394
+ client = Soracom::Client.new(profile:options.profile)
395
+ data = client.get_users_auth_key(options.user_name, options.auth_key_id)
396
+ puts JSON.pretty_generate(data)
397
+ end
398
+
399
+ desc 'delete_password', 'delete existing password for user'
400
+ option :user_name, desc: 'User name'
401
+ def delete_password
402
+ client = Soracom::Client.new(profile:options.profile)
403
+ data = client.delete_user_password(options.user_name)
404
+ puts JSON.pretty_generate(data)
405
+ end
406
+
407
+ desc 'has_password', 'check if the user has password'
408
+ option :user_name, desc: 'User name'
409
+ def has_password
410
+ client = Soracom::Client.new(profile:options.profile)
411
+ data = client.has_user_password(options.user_name)
412
+ puts JSON.pretty_generate(data)
413
+ end
414
+
415
+ desc 'create_password', 'create passwod for the user'
416
+ option :user_name, desc: 'User name'
417
+ option :password, desc: 'Password for the user'
418
+ def create_password
419
+ client = Soracom::Client.new(profile:options.profile)
420
+ data = client.create_user_password(options.user_name, options.password)
421
+ puts JSON.pretty_generate(data)
422
+ end
423
+
424
+ desc 'get_permission', 'get permission for the user'
425
+ option :user_name, desc: 'User name'
426
+ def get_permission
427
+ client = Soracom::Client.new(profile:options.profile)
428
+ data = client.get_user_permission(options.user_name)
429
+ puts JSON.pretty_generate(data)
430
+ end
431
+
432
+ desc 'upadte_permission', 'update permission for the user'
433
+ option :user_name, desc: 'User name'
434
+ option :permission, required:true, desc: 'Permission string for the user'
435
+ option :description, desc: 'Description for the permission'
436
+ def update_permission
437
+ client = Soracom::Client.new(profile:options.profile)
438
+ data = client.update_user_permission(options.user_name, options.permission, options.description)
439
+ puts JSON.pretty_generate(data)
440
+ end
441
+
442
+ end
443
+
444
+ # Role related commands
445
+ class Role < Thor
446
+ desc 'list_roles', 'list roles'
447
+ def list_roles
448
+ client = Soracom::Client.new(profile:options.profile)
449
+ data = client.list_roles()
450
+ puts JSON.pretty_generate(data)
451
+ end
452
+
453
+ desc 'delete_roles', 'delete role'
454
+ option :role_id, required: true, desc: 'ID of the role'
455
+ def delete_role
456
+ client = Soracom::Client.new(profile:options.profile)
457
+ data = client.delete_role()
458
+ puts JSON.pretty_generate(data)
459
+ end
460
+
461
+ desc 'get_role', 'get information of role'
462
+ option :role_id, required: true, desc: 'ID of the role'
463
+ def get_role
464
+ client = Soracom::Client.new(profile:options.profile)
465
+ data = client.get_role(options.role_id)
466
+ puts JSON.pretty_generate(data)
467
+ end
468
+
469
+ desc 'create_role', 'create a role'
470
+ option :role_id, required: true, desc: 'ID of the role'
471
+ option :permission, required: true, desc: 'Permission for the role'
472
+ option :description, desc: 'Descroption for the role'
473
+ def create_role
474
+ client = Soracom::Client.new(profile:options.profile)
475
+ data = client.create_role(options.role_id, options.permission, options.description)
476
+ puts JSON.pretty_generate(data)
477
+ end
478
+
479
+ desc 'update_role', 'update existing role'
480
+ option :role_id, required: true, desc: 'ID of the role'
481
+ option :permission, required: true, desc: 'Permission for the role'
482
+ option :description, desc: 'Descroption for the role'
483
+ def update_role
484
+ client = Soracom::Client.new(profile:options.profile)
485
+ data = client.update_role(options.role_id, options.permission, options.description)
486
+ puts JSON.pretty_generate(data)
487
+ end
488
+
489
+ desc 'list_role_attached_users', 'list users having a role attached'
490
+ def list_role_attached_users
491
+ client = Soracom::Client.new(profile:options.profile)
492
+ data = client.list_role_attached_users
493
+ puts JSON.pretty_generate(data)
494
+ end
495
+
496
+ desc 'list_user_roles', 'list roles attached to a user'
497
+ option :user_name, required: true, desc: 'user name'
498
+ def list_user_roles
499
+ client = Soracom::Client.new(profile:options.profile)
500
+ data = client.list_user_roles(options.user_name)
501
+ puts JSON.pretty_generate(data)
502
+ end
503
+
504
+ desc 'attach_role_to_user', 'attach role to user'
505
+ option :user_name, required: true, desc: 'user name'
506
+ option :role_id, required: true, desc: 'role_id'
507
+ def attach_role_to_user
508
+ client = Soracom::Client.new(profile:options.profile)
509
+ data = client.attach_role_to_user(options.user_name, options.role_id)
510
+ puts JSON.pretty_generate(data)
511
+ end
512
+
513
+ desc 'delete_role_from_user', 'delete role from user'
514
+ option :user_name, required: true, desc: 'user name'
515
+ option :role_id, required: true, desc: 'role_id'
516
+ def delete_role_from_user
517
+ client = Soracom::Client.new(profile:options.profile)
518
+ data = client.delete_role_from_user(options.user_name, options.role_id)
519
+ puts JSON.pretty_generate(data)
520
+ end
521
+
522
+ end
523
+
524
+ class Credentials < Thor
525
+ desc 'list_credentials', 'list stored credentials'
526
+ def list_credentials
527
+ client = Soracom::Client.new
528
+ data = client.list_credentials
529
+ puts JSON.pretty_generate(data)
530
+ end
531
+
532
+ desc 'create_credentials', 'create new credentials'
533
+ option :credentials_id, type: :string, required: true, desc: 'Credentials Id'
534
+ option :credentials_body, type: :string, required: true, desc: 'Credentials Body as JSON string'
535
+ def create_credentials
536
+ if options.credentials_body=~/^[a-z]+:\/\/(.+)/
537
+ begin
538
+ content = open(options.credentials_body.sub(/^file:\/\//,'')).read
539
+ options['credentials_body'] = content
540
+ rescue Errno::ENOENT
541
+ rescue SocketError
542
+ abort "ERROR: Cannot access #{options.credentials_body}."
543
+ end
544
+ end
545
+ client = Soracom::Client.new
546
+ data = client.create_credentials(options.credentials_id, options.credentials_body)
547
+ puts JSON.pretty_generate(data)
548
+ end
549
+
550
+ desc 'delete_credentials', 'delete credentials'
551
+ option :credentials_id, type: :string, required: true, desc: 'credentials Id'
552
+ def delete_credentials
282
553
  client = Soracom::Client.new
283
- data = client.delete_auth_key(options.auth_key_id)
554
+ data = client.delete_credentials(options.credentials_id)
284
555
  puts JSON.pretty_generate(data)
285
556
  end
286
557
  end
287
558
 
288
559
  # Using Thor for CLI Implementation
289
560
  class CLI < Thor
561
+ class_option :profile, default: 'default', desc: 'profile to use, stored in $HOME/.soracom/PROFILE.json'
562
+
290
563
  register(Subscriber, 'subscriber', 'subscriber <command>', 'Subscriber related operations')
291
564
  register(Subscriber, 'sim', 'sim <command>', 'Subscriber related operations(alias)')
292
565
  register(Group, 'group', 'group <command>', 'Group related operations')
293
566
  register(EventHandler, 'event_handler', 'event_handler <command>', 'Event Handler related operations')
294
567
  register(Stats, 'stats', 'stats <command>', 'Stats related operations')
295
568
  register(Operator, 'operator', 'operator <command>', 'Operator related operations')
569
+ register(User, 'user', 'user <command>', 'SAM User related operations')
570
+ register(Role, 'role', 'role <command>', 'Role related operations')
571
+ register(Credentials, 'credentials', 'credentials <command>', 'Credentials related operations')
296
572
 
297
573
  desc 'auth', 'test authentication'
298
574
  def auth
299
- puts 'testing authentication...'
575
+ puts "testing authentication... #{options.profile}"
300
576
  begin
301
- client = Soracom::Client.new
577
+ client = Soracom::Client.new(profile:options.profile)
302
578
  puts <<EOS
303
579
  authentication succeeded.
304
580
  apiKey: #{client.api_key}
305
581
  operatorId: #{client.operator_id}
582
+ userName: #{client.user_name}
306
583
  token: #{client.token}
307
584
  EOS
308
585
  rescue => evar
@@ -310,9 +587,53 @@ EOS
310
587
  end
311
588
  end
312
589
 
590
+ desc 'configure', 'setup soracom environment'
591
+ def configure
592
+ print <<EOS
593
+ --- SORACOM CLI setup ---
594
+ This will create .soracom directory under #{ENV['HOME']} and place '#{options.profile}.json' in it.
595
+
596
+ Please select which authentication method to use.
597
+
598
+ 1. Input AuthKeyId and AuthKey *Recommended*
599
+ 2. Input Operator credentials (Operator Email and Password)
600
+ 3. Input SAM credentials (OperatorId and UserName and Password)
601
+
602
+ EOS
603
+ mode = STDIN.tap{print "select(1-3)> "}.gets.chomp
604
+ begin
605
+ Dir.mkdir("#{ENV['HOME']}/.soracom/",0700)
606
+ rescue Errno::EEXIST
607
+ end
608
+ case mode
609
+ when '1'
610
+ authKeyId = STDIN.tap{print "authKeyId: "}.gets.chomp
611
+ authKey = STDIN.tap{print "authKey: "}.noecho(&:gets).tap{print "\n"}.chomp
612
+ File.open("#{ENV['HOME']}/.soracom/#{options.profile}.json", "w") do |f|
613
+ f.print JSON.pretty_generate ({authKeyId: authKeyId, authKey: authKey})
614
+ end
615
+ when '2'
616
+ email = STDIN.tap{print "Email: "}.gets.chomp
617
+ password = STDIN.tap{print "Password: "}.noecho(&:gets).tap{print "\n"}.chomp
618
+ File.open("#{ENV['HOME']}/.soracom/#{options.profile}.json", "w") do |f|
619
+ f.print JSON.pretty_generate ({email: email, password: password})
620
+ end
621
+ when '3'
622
+ operatorId = STDIN.tap{print "operatorId: "}.gets.chomp
623
+ userName = STDIN.tap{print "userName: "}.gets.chomp
624
+ password = STDIN.tap{print "password: "}.noecho(&:gets).tap{print "\n"}.chomp
625
+ File.open("#{ENV['HOME']}/.soracom/#{options.profile}.json", "w") do |f|
626
+ f.print JSON.pretty_generate ({operatorId: operatorId, userName: userName, password: password})
627
+ end
628
+ else
629
+ abort "invalid number."
630
+ end
631
+ print "wrote to #{ENV['HOME']}/.soracom/#{options.profile}.json\n"
632
+ end
633
+
313
634
  desc 'support', 'open support site'
314
635
  def support
315
- client = Soracom::Client.new
636
+ client = Soracom::Client.new(profile:options.profile)
316
637
  url = client.get_support_url
317
638
  system "open '#{url}' &> /dev/null || ( echo open following URL in your browser. ; echo '#{url}' )"
318
639
  end
@@ -13,24 +13,35 @@ module Soracom
13
13
  class Client
14
14
  # 設定されなかった場合には、環境変数から認証情報を取得
15
15
  def initialize(
16
- endpoint:ENV['SORACOM_ENDPOINT'],
17
- email:ENV['SORACOM_EMAIL'], password:ENV['SORACOM_PASSWORD'],
18
- auth_key_id:ENV['SORACOM_AUTH_KEY_ID'], auth_key:ENV['SORACOM_AUTH_KEY']
16
+ profile: nil,
17
+ endpoint: ENV['SORACOM_ENDPOINT'] || API_BASE_URL,
18
+ email:ENV['SORACOM_EMAIL'], password:ENV['SORACOM_PASSOWRD'],
19
+ auth_key_id:ENV['SORACOM_AUTH_KEY_ID'], auth_key:ENV['SORACOM_AUTH_KEY'],
20
+ operator_id:ENV['SORACOM_OPERATOR_ID'], user_name:ENV['SORACOM_USER_NAME']
19
21
  )
20
22
  @log = Logger.new(STDERR)
21
23
  @log.level = ENV['SORACOM_DEBUG'] ? Logger::DEBUG : Logger::WARN
24
+ @endpoint = endpoint
22
25
  begin
23
- if auth_key_id && auth_key
24
- @auth = auth_by_key(auth_key_id, auth_key, endpoint)
26
+ if profile
27
+ @auth = auth_by_profile(profile)
28
+ elsif auth_key_id && auth_key
29
+ @auth = auth_by_key(auth_key_id, auth_key, @endpoint)
25
30
  elsif email && password
26
- @auth = auth(email, password, endpoint)
31
+ @auth = auth_by_email(email, password, @endpoint)
32
+ elsif operator_id && user_name && password
33
+ @auth = auth_by_user(operator_id, user_name, password, @endpoint)
27
34
  else
28
- fail 'Could not find any credentials(authKeyId & authKey or email & password)'
35
+ @auth = auth_by_profile('default')
29
36
  end
30
37
  rescue => evar
31
38
  abort 'ERROR: ' + evar.to_s
32
39
  end
33
- @api = Soracom::ApiClient.new(@auth, endpoint)
40
+ if @auth
41
+ @api = Soracom::ApiClient.new(@auth, @endpoint)
42
+ else
43
+ fail 'Could not find any credentials(authKeyId & authKey or email & password or operatorId & userName and password)'
44
+ end
34
45
  end
35
46
 
36
47
  # 特定Operator下のSubscriber一覧を取
@@ -233,6 +244,7 @@ module Soracom
233
244
 
234
245
  # コンフィグパラメータの更新
235
246
  def update_group_configuration(group_id, namespace, params)
247
+ params = transform_json(params)
236
248
  @api.put(path: "/groups/#{group_id}/configuration/#{namespace}", payload: params)
237
249
  end
238
250
 
@@ -266,6 +278,7 @@ module Soracom
266
278
 
267
279
  # イベントハンドラーを新規作成する
268
280
  def create_event_handler(req)
281
+ req = transform_json req
269
282
  @api.post(path: '/event_handlers', payload: req)
270
283
  end
271
284
 
@@ -280,8 +293,9 @@ module Soracom
280
293
  end
281
294
 
282
295
  # イベントハンドラーを更新する
283
- def update_event_handler(handler_id, params)
284
- @api.put(path: "/event_handlers/#{handler_id}", payload: params)
296
+ def update_event_handler(handler_id, req)
297
+ req = transform_json req
298
+ @api.put(path: "/event_handlers/#{handler_id}", payload: req)
285
299
  end
286
300
 
287
301
  # Subscriber毎のAir使用状況を得る(デフォルトでは直近1日)
@@ -312,15 +326,145 @@ module Soracom
312
326
  "https://soracom.zendesk.com/access/jwt?jwt=#{res['token']}&return_to=#{return_to}"
313
327
  end
314
328
 
315
- def list_auth_keys()
329
+ def list_credentials()
330
+ @api.get(path: '/credentials')
331
+ end
332
+
333
+ def create_credentials(credentials_id, credentials)
334
+ @api.post(path: "/credentials/#{credentials_id}", payload: credentials)
335
+ end
336
+
337
+ def delete_credentials(credentials_id)
338
+ @api.delete(path: "/credentials/#{credentials_id}")
339
+ end
340
+
341
+ # SAMユーザー一覧取得
342
+ def list_users()
343
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users")
344
+ end
345
+
346
+ # SAMユーザーを削除する
347
+ def delete_user(username)
348
+ @api.delete(path: "/operators/#{@auth[:operatorId]}/users/#{username}")
349
+ end
350
+
351
+ # SAMユーザー取得
352
+ def get_user(username=@auth[:userName])
353
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users/#{username}")
354
+ end
355
+
356
+ # SAMユーザーを新しく追加する
357
+ def create_user(username, description='')
358
+ @api.post(path: "/operators/#{@auth[:operatorId]}/users/#{username}", payload: { description: description })
359
+ end
360
+
361
+ # SAMユーザーを更新する
362
+ def update_user(username, description='')
363
+ @api.put(path: "/operators/#{@auth[:operatorId]}/users/#{username}", payload: { description: description })
364
+ end
365
+
366
+ # SAMユーザーのAuthKey一覧取得
367
+ def list_users_auth_key(username=@auth[:userName])
368
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users/#{username}/auth_keys")
369
+ end
370
+
371
+ # SAMユーザーのAuthKey生成
372
+ def generate_users_auth_key(username=@auth[:userName])
373
+ @api.post(path: "/operators/#{@auth[:operatorId]}/users/#{username}/auth_keys")
374
+ end
375
+
376
+ # SAMユーザーのAuthKey削除
377
+ def delete_users_auth_key(username, auth_key_id)
378
+ @api.delete(path: "/operators/#{@auth[:operatorId]}/users/#{username}/auth_keys/#{auth_key_id}")
379
+ end
380
+
381
+ # SAMユーザーのAuthKey取得
382
+ def get_users_auth_key(username, auth_key_id)
383
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users/#{username}/auth_keys/#{auth_key_id}")
384
+ end
385
+
386
+ # SAMユーザーのパスワードを削除する
387
+ def delete_user_password(username=@auth[:userName])
388
+ @api.delete(path: "/operators/#{@auth[:operatorId]}/users/#{username}/password")
389
+ end
390
+
391
+ # SAMユーザーのパスワードがセットされているかを取得する
392
+ def has_user_password(username=@auth[:userName])
393
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users/#{username}/password")
394
+ end
395
+
396
+ # SAMユーザーのパスワードを作成する
397
+ def create_user_password(username=@auth[:userName], password)
398
+ @api.post(path: "/operators/#{@auth[:operatorId]}/users/#{username}/password", payload:{password: password})
399
+ end
400
+
401
+ # SAMユーザーの権限設定を取得する
402
+ def get_user_permission(username=@auth[:userName])
403
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users/#{username}/permission")
404
+ end
405
+
406
+ # SAMユーザーの権限を更新する
407
+ def update_user_permission(username=@auth[:userName], permission="", description="")
408
+ @api.put(path: "/operators/#{@auth[:operatorId]}/users/#{username}/permission", payload:{description: description, permission: permission})
409
+ end
410
+
411
+ # Role一覧取得
412
+ def list_roles()
413
+ @api.get(path: "/operators/#{@auth[:operatorId]}/roles")
414
+ end
415
+
416
+ # Role を削除する
417
+ def delete_role(role_id)
418
+ @api.delete(path: "/operators/#{@auth[:operatorId]}/roles/#{role_id}")
419
+ end
420
+
421
+ # Role を取得する
422
+ def get_role(role_id)
423
+ @api.get(path: "/operators/#{@auth[:operatorId]}/roles/#{role_id}")
424
+ end
425
+
426
+ # Role を新しく追加する
427
+ def create_role(role_id, permission, description='')
428
+ @api.post(path: "/operators/#{@auth[:operatorId]}/roles/#{role_id}", payload:{description: description, permission: permission})
429
+ end
430
+
431
+ # Role を編集する
432
+ def update_role(role_id, permission, description='')
433
+ @api.put(path: "/operators/#{@auth[:operatorId]}/roles/#{role_id}", payload:{description: description, permission: permission})
434
+ end
435
+
436
+ # Role に紐づくユーザーの一覧を取得する
437
+ def list_role_attached_users(role_id)
438
+ @api.get(path: "/operators/#{@auth[:operatorId]}/roles/#{role_id}/users")
439
+ end
440
+
441
+ # SAMユーザーのロール一覧取得
442
+ def list_user_roles(user_name)
443
+ @api.get(path: "/operators/#{@auth[:operatorId]}/users/#{user_name}/roles")
444
+ end
445
+
446
+ # SAMユーザーにロールをアタッチ
447
+ def attach_role_to_user(user_name, role_id)
448
+ @api.post(path: "/operators/#{@auth[:operatorId]}/users/#{user_name}/roles", payload: {roleId: role_id})
449
+ end
450
+
451
+ # SAMユーザーからロールをデタッチ
452
+ def delete_role_from_user(user_name, role_id)
453
+ @api.delete(path: "/operators/#{@auth[:operatorId]}/users/#{user_name}/roles/#{role_id}")
454
+ end
455
+
456
+ # OperatorのAuthKey一覧取得
457
+ def list_operator_auth_keys()
316
458
  @api.get(path: "/operators/#{@auth[:operatorId]}/auth_keys")
317
459
  end
318
460
 
319
- def create_auth_key()
461
+ # OperatorのAuthKey生成
462
+ def generate_operator_auth_key()
320
463
  @api.post(path: "/operators/#{@auth[:operatorId]}/auth_keys")
321
464
  end
322
465
 
323
- def delete_auth_key(auth_key_id)
466
+ # OperatorのAuthKey削除
467
+ def delete_operator_auth_key(auth_key_id)
324
468
  @api.delete(path: "/operators/#{@auth[:operatorId]}/auth_keys/#{auth_key_id}")
325
469
  end
326
470
 
@@ -334,6 +478,11 @@ module Soracom
334
478
  @auth[:operatorId]
335
479
  end
336
480
 
481
+ # ユーザ名を取得
482
+ def user_name
483
+ @auth[:userName]
484
+ end
485
+
337
486
  # トークンを取得
338
487
  def token
339
488
  @auth[:token]
@@ -342,7 +491,7 @@ module Soracom
342
491
  private
343
492
 
344
493
  # authenticate by email and password
345
- def auth(email, password, endpoint)
494
+ def auth_by_email(email, password, endpoint)
346
495
  endpoint = API_BASE_URL if endpoint.nil?
347
496
  res = RestClient.post endpoint + '/auth',
348
497
  { email: email, password: password },
@@ -365,10 +514,49 @@ module Soracom
365
514
  Hash[JSON.parse(res.body).map { |k, v| [k.to_sym, v] }]
366
515
  end
367
516
 
517
+ # authenticate by operator_id and user_name and password
518
+ def auth_by_user(operator_id, user_name, password, endpoint)
519
+ endpoint = API_BASE_URL if endpoint.nil?
520
+ res = RestClient.post endpoint + '/auth',
521
+ { operatorId: operator_id, userName: user_name, password: password },
522
+ 'Content-Type' => 'application/json',
523
+ 'Accept' => 'application/json'
524
+ result = JSON.parse(res.body)
525
+ fail result['message'] if res.code != '200'
526
+ Hash[JSON.parse(res.body).map { |k, v| [k.to_sym, v] }]
527
+ end
528
+
529
+ def auth_by_profile(profile)
530
+ profile_string = open( "#{ENV['HOME']}/.soracom/#{profile}.json").read
531
+ profile_data = JSON.parse(profile_string)
532
+ @endpoint = profile_data.fetch('endpoint', @endpoint)
533
+ if profile_data['authKeyId'] && profile_data['authKey']
534
+ @auth = auth_by_key(profile_data['authKeyId'], profile_data['authKey'], @endpoint)
535
+ elsif profile_data['email'] && profile_data['password']
536
+ @auth = auth_by_email(profile_data['email'], profile_data['password'], @endpoint)
537
+ elsif profile_data['operatorId'] && profile_data['userName'] && profile_data['password']
538
+ @auth = auth_by_user(profile_data['operatorId'], profile_data['userName'], profile_data['password'], @endpoint)
539
+ else
540
+ return nil
541
+ end
542
+ end
543
+
368
544
  def extract_jwt(jwt)
369
545
  encoded = jwt.split('.')[1]
370
546
  encoded += '=' * (4 - encoded.length % 4) # add padding(=) for Base64
371
547
  Base64.decode64(encoded)
372
548
  end
549
+
550
+ def transform_json(json)
551
+ begin
552
+ target=JSON.parse(json)
553
+ if target.class == Hash
554
+ target = target.map{|k,v| {"key" => k, "value" => v}}
555
+ end
556
+ rescue JSON::ParserError
557
+ abort("ERROR: parameter cannot be parsed as JSON.")
558
+ end
559
+ JSON.pretty_generate target
560
+ end
373
561
  end
374
562
  end
@@ -1,4 +1,4 @@
1
1
  # version info
2
2
  module Soracom
3
- VERSION = '1.0.9'
3
+ VERSION = '1.1.1'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soracom
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - MATSUI, Motokatsu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-12 00:00:00.000000000 Z
11
+ date: 2016-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler