soracom 1.0.9 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 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