strongdm 1.0.0 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/doc/LICENSE.html +45 -136
  3. data/doc/Object.html +623 -105
  4. data/doc/README_md.html +15 -7
  5. data/doc/SDM.html +16 -24
  6. data/doc/SDM/AKS.html +150 -52
  7. data/doc/SDM/AKSBasicAuth.html +130 -36
  8. data/doc/SDM/AKSServiceAccount.html +125 -32
  9. data/doc/SDM/AccountAttachment.html +77 -27
  10. data/doc/SDM/AccountAttachmentCreateOptions.html +62 -13
  11. data/doc/SDM/AccountAttachmentCreateResponse.html +75 -24
  12. data/doc/SDM/AccountAttachmentDeleteResponse.html +69 -19
  13. data/doc/SDM/AccountAttachmentGetResponse.html +75 -23
  14. data/doc/SDM/AccountAttachments.html +62 -61
  15. data/doc/SDM/AccountCreateResponse.html +80 -27
  16. data/doc/SDM/AccountDeleteResponse.html +69 -17
  17. data/doc/SDM/AccountGetResponse.html +74 -21
  18. data/doc/SDM/AccountGrant.html +89 -39
  19. data/doc/SDM/AccountGrantCreateResponse.html +75 -23
  20. data/doc/SDM/AccountGrantDeleteResponse.html +69 -18
  21. data/doc/SDM/AccountGrantGetResponse.html +75 -22
  22. data/doc/SDM/AccountGrants.html +63 -58
  23. data/doc/SDM/AccountUpdateResponse.html +74 -21
  24. data/doc/SDM/Accounts.html +74 -68
  25. data/doc/SDM/AlreadyExistsError.html +13 -10
  26. data/doc/SDM/AmazonEKS.html +163 -48
  27. data/doc/SDM/AmazonES.html +117 -40
  28. data/doc/SDM/Athena.html +117 -40
  29. data/doc/SDM/AuroraMysql.html +122 -44
  30. data/doc/SDM/AuroraPostgres.html +127 -48
  31. data/doc/SDM/AuthenticationError.html +13 -10
  32. data/doc/SDM/BadRequestError.html +13 -10
  33. data/doc/SDM/BigQuery.html +117 -40
  34. data/doc/SDM/Cassandra.html +122 -44
  35. data/doc/SDM/Citus.html +409 -0
  36. data/doc/SDM/Client.html +29 -48
  37. data/doc/SDM/Clustrix.html +122 -44
  38. data/doc/SDM/Cockroach.html +127 -48
  39. data/doc/SDM/CreateResponseMetadata.html +59 -9
  40. data/doc/SDM/DB2.html +391 -0
  41. data/doc/SDM/DeadlineExceededError.html +13 -10
  42. data/doc/SDM/DeleteResponseMetadata.html +60 -10
  43. data/doc/SDM/Druid.html +117 -40
  44. data/doc/SDM/DynamoDB.html +117 -40
  45. data/doc/SDM/Elastic.html +122 -44
  46. data/doc/SDM/ElasticacheRedis.html +117 -40
  47. data/doc/SDM/Gateway.html +108 -39
  48. data/doc/SDM/GetResponseMetadata.html +60 -10
  49. data/doc/SDM/GoogleGKE.html +135 -40
  50. data/doc/SDM/Greenplum.html +127 -48
  51. data/doc/SDM/HTTPAuth.html +122 -44
  52. data/doc/SDM/HTTPBasicAuth.html +127 -48
  53. data/doc/SDM/HTTPNoAuth.html +117 -40
  54. data/doc/SDM/InternalError.html +13 -10
  55. data/doc/SDM/Kubernetes.html +150 -52
  56. data/doc/SDM/KubernetesBasicAuth.html +130 -36
  57. data/doc/SDM/KubernetesServiceAccount.html +125 -32
  58. data/doc/SDM/Maria.html +122 -44
  59. data/doc/SDM/Memcached.html +107 -32
  60. data/doc/SDM/Memsql.html +122 -44
  61. data/doc/SDM/MongoHost.html +127 -48
  62. data/doc/SDM/MongoLegacyHost.html +132 -52
  63. data/doc/SDM/MongoLegacyReplicaset.html +137 -56
  64. data/doc/SDM/MongoReplicaSet.html +137 -56
  65. data/doc/SDM/Mysql.html +122 -44
  66. data/doc/SDM/NodeCreateResponse.html +80 -27
  67. data/doc/SDM/NodeDeleteResponse.html +69 -17
  68. data/doc/SDM/NodeGetResponse.html +74 -21
  69. data/doc/SDM/NodeUpdateResponse.html +74 -21
  70. data/doc/SDM/Nodes.html +75 -70
  71. data/doc/SDM/NotFoundError.html +13 -10
  72. data/doc/SDM/Oracle.html +127 -48
  73. data/doc/SDM/PermissionError.html +13 -10
  74. data/doc/SDM/Plumbing.html +4177 -3576
  75. data/doc/SDM/Postgres.html +127 -48
  76. data/doc/SDM/Presto.html +127 -48
  77. data/doc/SDM/RDP.html +117 -40
  78. data/doc/SDM/RPCError.html +12 -8
  79. data/doc/SDM/RateLimitError.html +13 -10
  80. data/doc/SDM/RateLimitMetadata.html +81 -29
  81. data/doc/SDM/Redis.html +112 -36
  82. data/doc/SDM/Redshift.html +127 -48
  83. data/doc/SDM/Relay.html +96 -27
  84. data/doc/SDM/ResourceCreateResponse.html +74 -21
  85. data/doc/SDM/ResourceDeleteResponse.html +69 -17
  86. data/doc/SDM/ResourceGetResponse.html +74 -21
  87. data/doc/SDM/ResourceUpdateResponse.html +74 -22
  88. data/doc/SDM/Resources.html +71 -63
  89. data/doc/SDM/Role.html +96 -27
  90. data/doc/SDM/RoleAttachment.html +77 -26
  91. data/doc/SDM/RoleAttachmentCreateResponse.html +75 -24
  92. data/doc/SDM/RoleAttachmentDeleteResponse.html +69 -19
  93. data/doc/SDM/RoleAttachmentGetResponse.html +75 -22
  94. data/doc/SDM/RoleAttachments.html +63 -60
  95. data/doc/SDM/RoleCreateResponse.html +75 -23
  96. data/doc/SDM/RoleDeleteResponse.html +69 -17
  97. data/doc/SDM/RoleGetResponse.html +75 -22
  98. data/doc/SDM/RoleGrant.html +77 -24
  99. data/doc/SDM/RoleGrantCreateResponse.html +75 -23
  100. data/doc/SDM/RoleGrantDeleteResponse.html +69 -18
  101. data/doc/SDM/RoleGrantGetResponse.html +75 -22
  102. data/doc/SDM/RoleGrants.html +63 -60
  103. data/doc/SDM/RoleUpdateResponse.html +75 -23
  104. data/doc/SDM/Roles.html +76 -74
  105. data/doc/SDM/SQLServer.html +132 -52
  106. data/doc/SDM/SSH.html +135 -40
  107. data/doc/SDM/SSHCert.html +373 -0
  108. data/doc/SDM/Service.html +95 -25
  109. data/doc/SDM/Snowflake.html +122 -44
  110. data/doc/SDM/Sybase.html +117 -40
  111. data/doc/SDM/SybaseIQ.html +117 -40
  112. data/doc/SDM/Teradata.html +117 -40
  113. data/doc/SDM/UpdateResponseMetadata.html +60 -10
  114. data/doc/SDM/User.html +104 -31
  115. data/doc/V1.html +35 -11
  116. data/doc/V1/AccountAttachments.html +10 -6
  117. data/doc/V1/AccountAttachments/Service.html +11 -8
  118. data/doc/V1/AccountGrants.html +10 -6
  119. data/doc/V1/AccountGrants/Service.html +11 -9
  120. data/doc/V1/Accounts.html +10 -6
  121. data/doc/V1/Accounts/Service.html +12 -10
  122. data/doc/V1/Nodes.html +10 -6
  123. data/doc/V1/Nodes/Service.html +13 -13
  124. data/doc/V1/Resources.html +10 -6
  125. data/doc/V1/Resources/Service.html +10 -6
  126. data/doc/V1/RoleAttachments.html +10 -6
  127. data/doc/V1/RoleAttachments/Service.html +11 -11
  128. data/doc/V1/RoleGrants.html +10 -6
  129. data/doc/V1/RoleGrants/Service.html +11 -11
  130. data/doc/V1/Roles.html +10 -6
  131. data/doc/V1/Roles/Service.html +11 -12
  132. data/doc/V1/Tags.html +113 -0
  133. data/doc/created.rid +45 -37
  134. data/doc/css/fonts.css +6 -6
  135. data/doc/css/rdoc.css +22 -1
  136. data/doc/examples/Gemfile.html +14 -4
  137. data/doc/examples/Gemfile_lock.html +14 -4
  138. data/doc/examples/README_md.html +14 -4
  139. data/doc/examples/okta-sync/Gemfile.html +105 -0
  140. data/doc/examples/okta-sync/Gemfile_lock.html +146 -0
  141. data/doc/index.html +23 -10
  142. data/doc/js/darkfish.js +23 -100
  143. data/doc/js/navigation.js +4 -41
  144. data/doc/js/navigation.js.gz +0 -0
  145. data/doc/js/search.js +32 -31
  146. data/doc/js/search_index.js +1 -1
  147. data/doc/js/search_index.js.gz +0 -0
  148. data/doc/js/searcher.js +7 -6
  149. data/doc/js/searcher.js.gz +0 -0
  150. data/doc/lib/version.html +16 -6
  151. data/doc/strongdm_gemspec.html +15 -5
  152. data/doc/table_of_contents.html +1587 -771
  153. data/examples/Gemfile +2 -2
  154. data/examples/ldap-sync/ldapSync.rb +290 -0
  155. data/examples/listUsers.rb +8 -8
  156. data/examples/okta-sync/Gemfile +4 -0
  157. data/examples/okta-sync/Gemfile.lock +38 -0
  158. data/examples/okta-sync/matchers.yml +11 -0
  159. data/examples/okta-sync/oktaSync.rb +173 -0
  160. data/examples/panicButton.rb +103 -119
  161. data/lib/errors/errors.rb +55 -53
  162. data/lib/grpc/account_attachments_pb.rb +9 -14
  163. data/lib/grpc/account_attachments_services_pb.rb +7 -8
  164. data/lib/grpc/account_grants_pb.rb +10 -10
  165. data/lib/grpc/account_grants_services_pb.rb +8 -9
  166. data/lib/grpc/accounts_pb.rb +12 -9
  167. data/lib/grpc/accounts_services_pb.rb +7 -8
  168. data/lib/grpc/drivers_pb.rb +104 -7
  169. data/lib/grpc/nodes_pb.rb +12 -9
  170. data/lib/grpc/nodes_services_pb.rb +7 -8
  171. data/lib/grpc/options_pb.rb +16 -5
  172. data/lib/grpc/plumbing.rb +4367 -4084
  173. data/lib/grpc/protoc-gen-swagger/options/annotations_pb.rb +4 -4
  174. data/lib/grpc/resources_pb.rb +9 -9
  175. data/lib/grpc/resources_services_pb.rb +7 -8
  176. data/lib/grpc/role_attachments_pb.rb +9 -9
  177. data/lib/grpc/role_attachments_services_pb.rb +7 -8
  178. data/lib/grpc/role_grants_pb.rb +9 -9
  179. data/lib/grpc/role_grants_services_pb.rb +7 -8
  180. data/lib/grpc/roles_pb.rb +11 -9
  181. data/lib/grpc/roles_services_pb.rb +7 -8
  182. data/lib/grpc/spec_pb.rb +7 -8
  183. data/lib/grpc/tags_pb.rb +36 -0
  184. data/lib/models/porcelain.rb +4966 -4017
  185. data/lib/strongdm.rb +94 -95
  186. data/lib/svc.rb +1200 -1224
  187. data/lib/version +16 -2
  188. data/lib/version.rb +6 -6
  189. data/strongdm.gemspec +10 -10
  190. metadata +27 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 64d39417633f40ee553dcacc106ee8b499ade5c5fa1cda339188d6147aee9414
4
- data.tar.gz: 937450bae4c0b9b10326659f9e137d8cbb5cacf4f8c1dc73037d91792583c79a
3
+ metadata.gz: 86cc4d6b9580c2ea725286eaf30a140a051f8b035f50a3728b16dd90eb777ff0
4
+ data.tar.gz: 06c32258d35b6952710addf5cfd4566f99b632d1f989e85264cbffa5fcfa63d2
5
5
  SHA512:
6
- metadata.gz: efe4d90c9f811992211ecc4bbba76c5795c1d6a36ff3f4dafbb4f40a528b721545a746c7383636ec8cbefa6d6fd04c49d4806648e974b4cb00fb6a645c651625
7
- data.tar.gz: 382676d3c3d79e727995af8f023d2c87e0e05adadea025650dc63007a80e93d33c9a4b96e1d5a5798b0f6a475c50c5ccf76fdcf0d58a6e83e99b66c966cdedf5
6
+ metadata.gz: 98e2c20ee4168b3948210c0d0313ba20f25e4055e81210aac9cda3c2974669c514dd2d6830b581e62e2f2d826802409ef316cdd94f9bd6bb8cd537a7db72f281
7
+ data.tar.gz: bc46ed7ffed5c9ea0b993631f62c52e1d1577a3c52b8b28455dbef97a9d7ac2d8e5e4c492397852dee580d5c3b9e3388cc2a053a7308b66e77fcca34bb25ab61
@@ -8,16 +8,21 @@
8
8
 
9
9
  <script type="text/javascript">
10
10
  var rdoc_rel_prefix = "./";
11
+ var index_rel_prefix = "./";
11
12
  </script>
12
13
 
13
- <script src="./js/jquery.js"></script>
14
- <script src="./js/darkfish.js"></script>
14
+ <script src="./js/navigation.js" defer></script>
15
+ <script src="./js/search.js" defer></script>
16
+ <script src="./js/search_index.js" defer></script>
17
+ <script src="./js/searcher.js" defer></script>
18
+ <script src="./js/darkfish.js" defer></script>
15
19
 
16
20
  <link href="./css/fonts.css" rel="stylesheet">
17
21
  <link href="./css/rdoc.css" rel="stylesheet">
18
22
 
19
23
 
20
24
 
25
+
21
26
  <body id="top" role="document" class="file">
22
27
  <nav role="navigation">
23
28
  <div id="project-navigation">
@@ -68,6 +73,10 @@
68
73
 
69
74
  <li><a href="./examples/README_md.html">README</a>
70
75
 
76
+ <li><a href="./examples/okta-sync/Gemfile.html">Gemfile</a>
77
+
78
+ <li><a href="./examples/okta-sync/Gemfile_lock.html">Gemfile.lock</a>
79
+
71
80
  <li><a href="./lib/version.html">version</a>
72
81
 
73
82
  <li><a href="./strongdm_gemspec.html">strongdm.gemspec</a>
@@ -88,88 +97,31 @@ http://www.apache.org/licenses/
88
97
  <ol><li>
89
98
  <p>Definitions.</p>
90
99
 
91
- <p>“License” shall mean the terms and conditions for use, reproduction, and
92
- distribution as defined by Sections 1 through 9 of this document.</p>
93
-
94
- <p>“Licensor” shall mean the copyright owner or entity authorized by the
95
- copyright owner that is granting the License.</p>
96
-
97
- <p>“Legal Entity” shall mean the union of the acting entity and all other
98
- entities that control, are controlled by, or are under common control with
99
- that entity. For the purposes of this definition, “control” means (i) the
100
- power, direct or indirect, to cause the direction or management of such
101
- entity, whether by contract or otherwise, or (ii) ownership of fifty
102
- percent (50%) or more of the outstanding shares, or (iii) beneficial
103
- ownership of such entity.</p>
104
-
105
- <p>“You” (or “Your”) shall mean an individual or Legal Entity exercising
106
- permissions granted by this License.</p>
107
-
108
- <p>“Source” form shall mean the preferred form for making modifications,
109
- including but not limited to software source code, documentation source,
110
- and configuration files.</p>
111
-
112
- <p>“Object” form shall mean any form resulting from mechanical transformation
113
- or translation of a Source form, including but not limited to compiled
114
- object code, generated documentation, and conversions to other media types.</p>
115
-
116
- <p>“Work” shall mean the work of authorship, whether in Source or <a
117
- href="Object.html">Object</a> form, made available under the License, as
118
- indicated by a copyright notice that is included in or attached to the work
119
- (an example is provided in the Appendix below).</p>
120
-
121
- <p>“Derivative Works” shall mean any work, whether in Source or <a
122
- href="Object.html">Object</a> form, that is based on (or derived from) the
123
- Work and for which the editorial revisions, annotations, elaborations, or
124
- other modifications represent, as a whole, an original work of authorship.
125
- For the purposes of this License, Derivative Works shall not include works
126
- that remain separable from, or merely link (or bind by name) to the
127
- interfaces of, the Work and Derivative Works thereof.</p>
128
-
129
- <p>“Contribution” shall mean any work of authorship, including the original
130
- version of the Work and any modifications or additions to that Work or
131
- Derivative Works thereof, that is intentionally submitted to Licensor for
132
- inclusion in the Work by the copyright owner or by an individual or Legal
133
- Entity authorized to submit on behalf of the copyright owner. For the
134
- purposes of this definition, “submitted” means any form of electronic,
135
- verbal, or written communication sent to the Licensor or its
136
- representatives, including but not limited to communication on electronic
137
- mailing lists, source code control systems, and issue tracking systems that
138
- are managed by, or on behalf of, the Licensor for the purpose of discussing
139
- and improving the Work, but excluding communication that is conspicuously
140
- marked or otherwise designated in writing by the copyright owner as “Not a
141
- Contribution.”</p>
142
-
143
- <p>“Contributor” shall mean Licensor and any individual or Legal Entity on
144
- behalf of whom a Contribution has been received by Licensor and
145
- subsequently incorporated within the Work.</p>
100
+ <p>“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.</p>
101
+
102
+ <p>“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p>
103
+
104
+ <p>“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p>
105
+
106
+ <p>“You” (or “Your) shall mean an individual or Legal Entity exercising permissions granted by this License.</p>
107
+
108
+ <p>“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p>
109
+
110
+ <p>“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p>
111
+
112
+ <p>“Work” shall mean the work of authorship, whether in Source or <a href="Object.html"><code>Object</code></a> form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p>
113
+
114
+ <p>“Derivative Worksshall mean any work, whether in Source or <a href="Object.html"><code>Object</code></a> form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p>
115
+
116
+ <p>“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”</p>
117
+
118
+ <p>“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.</p>
146
119
  </li><li>
147
- <p>Grant of Copyright License. Subject to the terms and conditions of this
148
- License, each Contributor hereby grants to You a perpetual, worldwide,
149
- non-exclusive, no-charge, royalty-free, irrevocable copyright license to
150
- reproduce, prepare Derivative Works of, publicly display, publicly perform,
151
- sublicense, and distribute the Work and such Derivative Works in Source or
152
- <a href="Object.html">Object</a> form.</p>
120
+ <p>Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or <a href="Object.html"><code>Object</code></a> form.</p>
153
121
  </li><li>
154
- <p>Grant of Patent License. Subject to the terms and conditions of this
155
- License, each Contributor hereby grants to You a perpetual, worldwide,
156
- non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
157
- this section) patent license to make, have made, use, offer to sell, sell,
158
- import, and otherwise transfer the Work, where such license applies only to
159
- those patent claims licensable by such Contributor that are necessarily
160
- infringed by their Contribution(s) alone or by combination of their
161
- Contribution(s) with the Work to which such Contribution(s) was submitted.
162
- If You institute patent litigation against any entity (including a
163
- cross-claim or counterclaim in a lawsuit) alleging that the Work or a
164
- Contribution incorporated within the Work constitutes direct or
165
- contributory patent infringement, then any patent licenses granted to You
166
- under this License for that Work shall terminate as of the date such
167
- litigation is filed.</p>
122
+ <p>Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.</p>
168
123
  </li><li>
169
- <p>Redistribution. You may reproduce and distribute copies of the Work or
170
- Derivative Works thereof in any medium, with or without modifications, and
171
- in Source or <a href="Object.html">Object</a> form, provided that You meet
172
- the following conditions:</p>
124
+ <p>Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or <a href="Object.html"><code>Object</code></a> form, provided that You meet the following conditions:</p>
173
125
 
174
126
  <p>(a) You must give any other recipients of the Work or</p>
175
127
 
@@ -204,55 +156,17 @@ or as an addendum to the NOTICE text from the Work, provided
204
156
  that such additional attribution notices cannot be construed
205
157
  as modifying the License.</pre>
206
158
 
207
- <p>You may add Your own copyright statement to Your modifications and may
208
- provide additional or different license terms and conditions for use,
209
- reproduction, or distribution of Your modifications, or for any such
210
- Derivative Works as a whole, provided Your use, reproduction, and
211
- distribution of the Work otherwise complies with the conditions stated in
212
- this License.</p>
159
+ <p>You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.</p>
213
160
  </li><li>
214
- <p>Submission of Contributions. Unless You explicitly state otherwise, any
215
- Contribution intentionally submitted for inclusion in the Work by You to
216
- the Licensor shall be under the terms and conditions of this License,
217
- without any additional terms or conditions. Notwithstanding the above,
218
- nothing herein shall supersede or modify the terms of any separate license
219
- agreement you may have executed with Licensor regarding such Contributions.</p>
161
+ <p>Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.</p>
220
162
  </li><li>
221
- <p>Trademarks. This License does not grant permission to use the trade names,
222
- trademarks, service marks, or product names of the Licensor, except as
223
- required for reasonable and customary use in describing the origin of the
224
- Work and reproducing the content of the NOTICE file.</p>
163
+ <p>Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.</p>
225
164
  </li><li>
226
- <p>Disclaimer of Warranty. Unless required by applicable law or agreed to in
227
- writing, Licensor provides the Work (and each Contributor provides its
228
- Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
229
- KIND, either express or implied, including, without limitation, any
230
- warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or
231
- FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
232
- determining the appropriateness of using or redistributing the Work and
233
- assume any risks associated with Your exercise of permissions under this
234
- License.</p>
165
+ <p>Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.</p>
235
166
  </li><li>
236
- <p>Limitation of Liability. In no event and under no legal theory, whether in
237
- tort (including negligence), contract, or otherwise, unless required by
238
- applicable law (such as deliberate and grossly negligent acts) or agreed to
239
- in writing, shall any Contributor be liable to You for damages, including
240
- any direct, indirect, special, incidental, or consequential damages of any
241
- character arising as a result of this License or out of the use or
242
- inability to use the Work (including but not limited to damages for loss of
243
- goodwill, work stoppage, computer failure or malfunction, or any and all
244
- other commercial damages or losses), even if such Contributor has been
245
- advised of the possibility of such damages.</p>
167
+ <p>Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.</p>
246
168
  </li><li>
247
- <p>Accepting Warranty or Additional Liability. While redistributing the Work
248
- or Derivative Works thereof, You may choose to offer, and charge a fee for,
249
- acceptance of support, warranty, indemnity, or other liability obligations
250
- and/or rights consistent with this License. However, in accepting such
251
- obligations, You may act only on Your own behalf and on Your sole
252
- responsibility, not on behalf of any other Contributor, and only if You
253
- agree to indemnify, defend, and hold each Contributor harmless for any
254
- liability incurred by, or claims asserted against, such Contributor by
255
- reason of your accepting any such warranty or additional liability.</p>
169
+ <p>Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.</p>
256
170
  </li></ol>
257
171
 
258
172
  <p>END OF TERMS AND CONDITIONS</p>
@@ -270,25 +184,20 @@ identification within third-party archives.
270
184
 
271
185
  <p>Copyright 2020 StrongDM Inc</p>
272
186
 
273
- <p>Licensed under the Apache License, Version 2.0 (the “License”); you may not
274
- use this file except in compliance with the License. You may obtain a copy
275
- of the License at</p>
187
+ <p>Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at</p>
276
188
 
277
- <pre class="ruby"><span class="ruby-identifier">http</span>:<span class="ruby-operator">/</span><span class="ruby-regexp">/www.apache.org/</span><span class="ruby-identifier">licenses</span><span class="ruby-operator">/</span><span class="ruby-constant">LICENSE</span><span class="ruby-operator">-</span><span class="ruby-value">2.0</span>
189
+ <pre class="ruby"><span class="ruby-identifier">http</span><span class="ruby-value">:/</span><span class="ruby-operator">/</span><span class="ruby-identifier">www</span>.<span class="ruby-identifier">apache</span>.<span class="ruby-identifier">org</span><span class="ruby-operator">/</span><span class="ruby-identifier">licenses</span><span class="ruby-operator">/</span><span class="ruby-constant">LICENSE</span><span class="ruby-value">-2.0</span>
278
190
  </pre>
279
191
 
280
- <p>Unless required by applicable law or agreed to in writing, software
281
- distributed under the License is distributed on an “AS IS” BASIS, WITHOUT
282
- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
283
- License for the specific language governing permissions and limitations
284
- under the License.</p>
192
+ <p>Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.</p>
193
+
285
194
  </main>
286
195
 
287
196
 
288
197
 
289
198
  <footer id="validator-badges" role="contentinfo">
290
- <p><a href="http://validator.w3.org/check/referer">Validate</a>
291
- <p>Generated by <a href="http://docs.seattlerb.org/rdoc/">RDoc</a> 4.2.1.
199
+ <p><a href="https://validator.w3.org/check/referer">Validate</a>
200
+ <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.1.2.
292
201
  <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
293
202
  </footer>
294
203
 
@@ -8,16 +8,21 @@
8
8
 
9
9
  <script type="text/javascript">
10
10
  var rdoc_rel_prefix = "./";
11
+ var index_rel_prefix = "./";
11
12
  </script>
12
13
 
13
- <script src="./js/jquery.js"></script>
14
- <script src="./js/darkfish.js"></script>
14
+ <script src="./js/navigation.js" defer></script>
15
+ <script src="./js/search.js" defer></script>
16
+ <script src="./js/search_index.js" defer></script>
17
+ <script src="./js/searcher.js" defer></script>
18
+ <script src="./js/darkfish.js" defer></script>
15
19
 
16
20
  <link href="./css/fonts.css" rel="stylesheet">
17
21
  <link href="./css/rdoc.css" rel="stylesheet">
18
22
 
19
23
 
20
24
 
25
+
21
26
  <body id="top" role="document" class="class">
22
27
  <nav role="navigation">
23
28
  <div id="project-navigation">
@@ -70,8 +75,14 @@
70
75
 
71
76
  <ul class="link-list" role="directory">
72
77
 
78
+ <li ><a href="#method-i-first">#first</a>
79
+
80
+ <li ><a href="#method-i-ldap_sync">#ldap_sync</a>
81
+
73
82
  <li ><a href="#method-i-main">#main</a>
74
83
 
84
+ <li ><a href="#method-i-okta_sync">#okta_sync</a>
85
+
75
86
  </ul>
76
87
  </div>
77
88
 
@@ -88,8 +99,6 @@
88
99
  </section>
89
100
 
90
101
 
91
-
92
-
93
102
  <section id="5Buntitled-5D" class="documentation-section">
94
103
 
95
104
 
@@ -117,6 +126,55 @@
117
126
  <dd>
118
127
 
119
128
 
129
+ <dt id="LDAP_BIND_DN">LDAP_BIND_DN
130
+
131
+ <dd>
132
+
133
+
134
+ <dt id="LDAP_HOST">LDAP_HOST
135
+
136
+ <dd>
137
+
138
+
139
+ <dt id="LDAP_PASSWORD">LDAP_PASSWORD
140
+
141
+ <dd>
142
+
143
+
144
+ <dt id="OKTA_CLIENT_ORGURL">OKTA_CLIENT_ORGURL
145
+
146
+ <dd>
147
+
148
+
149
+ <dt id="OKTA_CLIENT_TOKEN">OKTA_CLIENT_TOKEN
150
+
151
+ <dd>
152
+
153
+
154
+ <dt id="SDM_API_ACCESS_KEY">SDM_API_ACCESS_KEY
155
+
156
+ <dd><p>organizationalUnits:</p>
157
+
158
+ <pre>- dn: OU=Other-OU,DC=j42,DC=xyz
159
+ role: Other-OU
160
+ resources:
161
+ - name:*Other-OU*
162
+ - name:*Multi*
163
+ - dn: OU=admins,DC=j42,DC=xyz
164
+ role: admins
165
+ resources:
166
+ - name:*admins*
167
+ - dn: OU=People,DC=j42,DC=xyz
168
+ role: People
169
+ resources:
170
+ - name:*People*</pre>
171
+
172
+
173
+ <dt id="SDM_API_SECRET_KEY">SDM_API_SECRET_KEY
174
+
175
+ <dd>
176
+
177
+
120
178
  </dl>
121
179
  </section>
122
180
 
@@ -130,10 +188,49 @@
130
188
  </header>
131
189
 
132
190
 
133
- <div id="method-i-main" class="method-detail ">
191
+ <div id="method-i-first" class="method-detail ">
134
192
 
135
193
  <div class="method-heading">
136
- <span class="method-name">main</span><span
194
+ <span class="method-name">first</span><span
195
+ class="method-args">(attrib)</span>
196
+
197
+ <span class="method-click-advice">click to toggle source</span>
198
+
199
+ </div>
200
+
201
+
202
+ <div class="method-description">
203
+
204
+ <p>gets the first item in a list or generator</p>
205
+
206
+
207
+
208
+
209
+ <div class="method-source-code" id="first-source">
210
+ <pre><span class="ruby-comment"># File examples/ldap-sync/ldapSync.rb, line 58</span>
211
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">first</span>(<span class="ruby-identifier">attrib</span>)
212
+ <span class="ruby-identifier">result</span> = <span class="ruby-keyword">nil</span>
213
+ <span class="ruby-identifier">attrib</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">item</span><span class="ruby-operator">|</span>
214
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">result</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
215
+ <span class="ruby-identifier">result</span> = <span class="ruby-identifier">item</span>
216
+ <span class="ruby-keyword">end</span>
217
+ <span class="ruby-keyword">end</span>
218
+ <span class="ruby-identifier">result</span>
219
+ <span class="ruby-keyword">end</span></pre>
220
+ </div>
221
+
222
+ </div>
223
+
224
+
225
+
226
+
227
+ </div>
228
+
229
+
230
+ <div id="method-i-ldap_sync" class="method-detail ">
231
+
232
+ <div class="method-heading">
233
+ <span class="method-name">ldap_sync</span><span
137
234
  class="method-args">()</span>
138
235
 
139
236
  <span class="method-click-advice">click to toggle source</span>
@@ -143,128 +240,548 @@
143
240
 
144
241
  <div class="method-description">
145
242
 
146
- <p>panicButton.rb suspends all users except for one admin, in the fake use
147
- case of a critical break in or something usage: ruby panicButton.rb
148
- adminuser@email.com to revert back to pre-panic state: ruby panicButton.rb
149
- revert</p>
243
+
150
244
 
151
245
 
152
246
 
153
247
 
154
- <div class="method-source-code" id="main-source">
155
- <pre><span class="ruby-comment"># File examples/panicButton.rb, line 40</span>
156
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">main</span>
157
- <span class="ruby-identifier">access_key</span> = <span class="ruby-constant">ENV</span>[<span class="ruby-string">&quot;SDM_API_ACCESS_KEY&quot;</span>]
158
- <span class="ruby-identifier">secret_key</span> = <span class="ruby-constant">ENV</span>[<span class="ruby-string">&quot;SDM_API_SECRET_KEY&quot;</span>]
159
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">access_key</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">secret_key</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
160
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;SDM_API_ACCESS_KEY and SDM_API_SECRET_KEY must be provided&quot;</span>
161
- <span class="ruby-keyword">return</span>
248
+ <div class="method-source-code" id="ldap_sync-source">
249
+ <pre><span class="ruby-comment"># File examples/ldap-sync/ldapSync.rb, line 68</span>
250
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">ldap_sync</span>
251
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">SDM_API_ACCESS_KEY</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">SDM_API_SECRET_KEY</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">LDAP_BIND_DN</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span>
252
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&#39;SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY, and LDAP_BIND_DN must be set&#39;</span>
253
+ <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
254
+ <span class="ruby-keyword">end</span>
255
+
256
+ <span class="ruby-identifier">plan</span> = <span class="ruby-keyword">false</span>
257
+ <span class="ruby-identifier">verbose</span> = <span class="ruby-keyword">false</span>
258
+ <span class="ruby-identifier">configPath</span> = <span class="ruby-string">&#39;config.yml&#39;</span>
259
+ <span class="ruby-constant">OptionParser</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">opts</span><span class="ruby-operator">|</span>
260
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">banner</span> = <span class="ruby-string">&quot;Usage ldapSync.rb [options]&quot;</span>
261
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-p&quot;</span>, <span class="ruby-string">&quot;--plan&quot;</span>, <span class="ruby-string">&quot;calculate changes but do not apply them&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span>
262
+ <span class="ruby-identifier">plan</span> = <span class="ruby-identifier">p</span>
263
+ <span class="ruby-keyword">end</span>
264
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-v&quot;</span>, <span class="ruby-string">&quot;--verbose&quot;</span>, <span class="ruby-string">&quot;print detailed report&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
265
+ <span class="ruby-identifier">verbose</span> = <span class="ruby-identifier">v</span>
266
+ <span class="ruby-keyword">end</span>
267
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-c&quot;</span>, <span class="ruby-string">&quot;--config FILE&quot;</span>, <span class="ruby-string">&quot;specify path to config YAML file (default: &#39;config.yml&#39;)&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
268
+ <span class="ruby-identifier">configPath</span> = <span class="ruby-identifier">v</span>
269
+ <span class="ruby-keyword">end</span>
270
+ <span class="ruby-keyword">end</span>.<span class="ruby-identifier">parse!</span>
271
+
272
+ <span class="ruby-keyword">begin</span>
273
+ <span class="ruby-identifier">config</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">configPath</span>))
274
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
275
+ <span class="ruby-identifier">raise</span> <span class="ruby-identifier">ex</span>, <span class="ruby-node">&quot;failed to parse #{configPath}&quot;</span>
276
+ <span class="ruby-keyword">end</span>
277
+
278
+ <span class="ruby-keyword">begin</span>
279
+ <span class="ruby-identifier">sdmClient</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">SDM_API_ACCESS_KEY</span>, <span class="ruby-constant">SDM_API_SECRET_KEY</span>, <span class="ruby-value">host:</span> <span class="ruby-string">&#39;api.strongdmdev.com:443&#39;</span>)
280
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">RPCError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
281
+ <span class="ruby-identifier">raise</span> <span class="ruby-identifier">ex</span>, <span class="ruby-string">&#39;failed to create StrongDM client&#39;</span>
282
+ <span class="ruby-keyword">end</span>
283
+
284
+ <span class="ruby-identifier">ldap</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">LDAP</span>.<span class="ruby-identifier">new</span>
285
+ <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">host</span> = <span class="ruby-constant">LDAP_HOST</span>
286
+ <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">auth</span> <span class="ruby-constant">LDAP_BIND_DN</span>, <span class="ruby-constant">LDAP_PASSWORD</span>
287
+ <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">bind</span>
288
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&#39;failed to bind LDAP connection - authentication error&#39;</span>
289
+ <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
290
+ <span class="ruby-keyword">end</span>
291
+
292
+ <span class="ruby-identifier">sdmRoles</span> = { } <span class="ruby-comment"># map of name to ID</span>
293
+ <span class="ruby-identifier">sdmAccounts</span> = { } <span class="ruby-comment"># map of email to id</span>
294
+ <span class="ruby-identifier">sdmResources</span> = { } <span class="ruby-comment"># map of ID to name</span>
295
+ <span class="ruby-identifier">sdmAccountsById</span> = { } <span class="ruby-comment"># map of id to { :email, :firstName, :lastName }</span>
296
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span> = { } <span class="ruby-comment"># map of email to id of all accounts that are in the roles we&#39;re interested in</span>
297
+ <span class="ruby-identifier">sdmAccountAttachments</span> = { } <span class="ruby-comment"># map of role name to list of emails</span>
298
+ <span class="ruby-identifier">sdmRoleGrants</span> = { } <span class="ruby-comment"># map of role name to list of { :resourceId, :grantId }</span>
299
+ <span class="ruby-identifier">ldapRoles</span> = [] <span class="ruby-comment"># list of names</span>
300
+ <span class="ruby-identifier">ldapAccounts</span> = { } <span class="ruby-comment"># map of email to { :firstName, :lastName }</span>
301
+ <span class="ruby-identifier">ldapAccountAttachments</span> = { } <span class="ruby-comment"># map of role name to list of emails</span>
302
+ <span class="ruby-identifier">desiredRoleGrants</span> = { } <span class="ruby-comment"># map of role name to list of resource IDs</span>
303
+
304
+ <span class="ruby-comment"># get SDM accounts</span>
305
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">account</span><span class="ruby-operator">|</span>
306
+ <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">email</span>] = <span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>
307
+ <span class="ruby-identifier">sdmAccountsById</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>] = { <span class="ruby-value">:email</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">email</span>, <span class="ruby-value">:firstName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">first_name</span>, <span class="ruby-value">:lastName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">last_name</span> }
308
+ <span class="ruby-keyword">end</span>
309
+
310
+ <span class="ruby-comment"># get SDM resources</span>
311
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
312
+ <span class="ruby-identifier">sdmResources</span>[<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">name</span>
313
+ <span class="ruby-keyword">end</span>
314
+
315
+ <span class="ruby-comment"># loop through OUs</span>
316
+ <span class="ruby-identifier">config</span>[<span class="ruby-string">&#39;organizationalUnits&#39;</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ou</span><span class="ruby-operator">|</span>
317
+
318
+ <span class="ruby-comment"># get SDM state for this OU</span>
319
+ <span class="ruby-identifier">role</span> = <span class="ruby-identifier">first</span>(<span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">roles</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;name:?&#39;</span>, <span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;role&#39;</span>]))
320
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">role</span>
321
+ <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>
322
+
323
+ <span class="ruby-comment"># get accounts attached to this role</span>
324
+ <span class="ruby-identifier">accountEmails</span> = []
325
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;roleid:?&#39;</span>, <span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attachment</span><span class="ruby-operator">|</span>
326
+ <span class="ruby-identifier">sdmAccount</span> = <span class="ruby-identifier">sdmAccountsById</span>[<span class="ruby-identifier">attachment</span>.<span class="ruby-identifier">account_id</span>]
327
+ <span class="ruby-identifier">email</span> = <span class="ruby-identifier">sdmAccount</span>[<span class="ruby-value">:email</span>]
328
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span>[<span class="ruby-identifier">email</span>] = <span class="ruby-identifier">attachment</span>.<span class="ruby-identifier">account_id</span>
329
+ <span class="ruby-identifier">accountEmails</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
330
+ <span class="ruby-keyword">end</span>
331
+ <span class="ruby-identifier">sdmAccountAttachments</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">accountEmails</span>
332
+
333
+ <span class="ruby-comment"># get resources granted to this role</span>
334
+ <span class="ruby-identifier">roleGrants</span> = []
335
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">role_grants</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;roleid:?&#39;</span>, <span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">grant</span><span class="ruby-operator">|</span>
336
+ <span class="ruby-identifier">roleGrants</span>.<span class="ruby-identifier">push</span>({ <span class="ruby-value">:resourceId</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">grant</span>.<span class="ruby-identifier">resource_id</span>, <span class="ruby-value">:grantId</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">grant</span>.<span class="ruby-identifier">id</span> })
337
+ <span class="ruby-keyword">end</span>
338
+ <span class="ruby-identifier">sdmRoleGrants</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">roleGrants</span>
339
+
340
+ <span class="ruby-comment"># get resources that we want to grant to this role</span>
341
+ <span class="ruby-identifier">filteredResources</span> = { } <span class="ruby-comment"># map of resource ID to true (to prevent duplicates)</span>
342
+ <span class="ruby-identifier">filters</span> = <span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;resources&#39;</span>] <span class="ruby-comment"># list of filter strings</span>
343
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">filters</span>
344
+ <span class="ruby-identifier">filters</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">filter</span><span class="ruby-operator">|</span>
345
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">list</span>(<span class="ruby-identifier">filter</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
346
+ <span class="ruby-identifier">filteredResources</span>[<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">id</span>] = <span class="ruby-keyword">true</span>
347
+ <span class="ruby-keyword">end</span>
348
+ <span class="ruby-keyword">end</span>
349
+ <span class="ruby-identifier">desiredRoleGrants</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">filteredResources</span>.<span class="ruby-identifier">keys</span>
350
+ <span class="ruby-keyword">end</span>
162
351
  <span class="ruby-keyword">end</span>
163
- <span class="ruby-identifier">client</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">access_key</span>, <span class="ruby-identifier">secret_key</span>)
164
352
 
165
- <span class="ruby-keyword">if</span> <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span> <span class="ruby-keyword">and</span> <span class="ruby-constant">ARGV</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-string">&quot;revert&quot;</span>
166
- <span class="ruby-identifier">state_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&quot;state.json&quot;</span>)
167
- <span class="ruby-identifier">state</span> = <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">state_file</span>)
353
+ <span class="ruby-comment"># get LDAP state for this OU</span>
354
+ <span class="ruby-identifier">ldapRoles</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;role&#39;</span>].<span class="ruby-identifier">to_s</span>)
355
+ <span class="ruby-identifier">roleAccounts</span> = []
356
+ <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">search</span>(<span class="ruby-value">:base</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;dn&#39;</span>], <span class="ruby-value">:filter</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">LDAP</span><span class="ruby-operator">::</span><span class="ruby-constant">Filter</span>.<span class="ruby-identifier">eq</span>(<span class="ruby-string">&#39;objectclass&#39;</span>, <span class="ruby-string">&#39;user&#39;</span>), <span class="ruby-value">:return_result</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-keyword">false</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">entry</span><span class="ruby-operator">|</span>
357
+ <span class="ruby-identifier">ldapAccounts</span>[<span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">mail</span>).<span class="ruby-identifier">to_s</span>] = {
358
+ <span class="ruby-value">:firstName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">givenname</span>).<span class="ruby-identifier">to_s</span>,
359
+ <span class="ruby-value">:lastName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">sn</span>).<span class="ruby-identifier">to_s</span>,
360
+ }
361
+ <span class="ruby-identifier">roleAccounts</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">mail</span>).<span class="ruby-identifier">to_s</span>)
362
+ <span class="ruby-keyword">end</span>
363
+ <span class="ruby-identifier">ldapAccountAttachments</span>[<span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;role&#39;</span>].<span class="ruby-identifier">to_s</span>] = <span class="ruby-identifier">roleAccounts</span>
364
+ <span class="ruby-keyword">end</span>
365
+
366
+ <span class="ruby-comment"># compute diff</span>
367
+ <span class="ruby-identifier">report</span> = {
368
+ <span class="ruby-value">:createRoles</span> <span class="ruby-operator">=&gt;</span> [],
369
+ <span class="ruby-value">:deleteAccounts</span> <span class="ruby-operator">=&gt;</span> [],
370
+ <span class="ruby-value">:updateAccounts</span> <span class="ruby-operator">=&gt;</span> [],
371
+ <span class="ruby-value">:createAccounts</span> <span class="ruby-operator">=&gt;</span> [],
372
+ <span class="ruby-value">:createAccountAttachments</span> <span class="ruby-operator">=&gt;</span> [],
373
+ <span class="ruby-value">:deleteAccountAttachments</span> <span class="ruby-operator">=&gt;</span> [],
374
+ <span class="ruby-value">:deleteRoleGrants</span> <span class="ruby-operator">=&gt;</span> [],
375
+ <span class="ruby-value">:createRoleGrants</span> <span class="ruby-operator">=&gt;</span> [],
376
+ }
377
+ <span class="ruby-comment"># createRoles</span>
378
+ <span class="ruby-identifier">ldapRoles</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span><span class="ruby-operator">|</span>
379
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
380
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createRoles</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">roleName</span>)
381
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
382
+ <span class="ruby-identifier">response</span> = <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">roles</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Role</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">name:</span> <span class="ruby-identifier">roleName</span>))
383
+ <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>] = <span class="ruby-identifier">response</span>.<span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>
384
+ <span class="ruby-keyword">end</span>
385
+ <span class="ruby-comment"># deleteAccounts</span>
386
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span>, <span class="ruby-identifier">id</span><span class="ruby-operator">|</span>
387
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ldapAccounts</span>[<span class="ruby-identifier">email</span>]
388
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:deleteAccounts</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
389
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
390
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">id</span>)
391
+ <span class="ruby-keyword">end</span>
392
+ <span class="ruby-comment"># updateAccounts</span>
393
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span>, <span class="ruby-identifier">id</span><span class="ruby-operator">|</span>
394
+ <span class="ruby-identifier">ldapAccount</span> = <span class="ruby-identifier">ldapAccounts</span>[<span class="ruby-identifier">email</span>]
395
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">ldapAccount</span>
396
+ <span class="ruby-identifier">sdmAccount</span> = <span class="ruby-identifier">sdmAccountsById</span>[<span class="ruby-identifier">id</span>]
397
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmAccount</span>[<span class="ruby-value">:firstName</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:firstName</span>] <span class="ruby-keyword">and</span> <span class="ruby-identifier">sdmAccount</span>[<span class="ruby-value">:lastName</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:lastName</span>]
398
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:updateAccounts</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
399
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
400
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">update</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">User</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">id:</span> <span class="ruby-identifier">id</span>, <span class="ruby-value">first_name:</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:firstName</span>], <span class="ruby-value">last_name:</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:lastName</span>]))
401
+ <span class="ruby-keyword">end</span>
402
+ <span class="ruby-comment"># createAccounts</span>
403
+ <span class="ruby-identifier">ldapAccounts</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span>, <span class="ruby-identifier">account</span><span class="ruby-operator">|</span>
404
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">email</span>]
405
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createAccounts</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
406
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
407
+ <span class="ruby-identifier">response</span> = <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">User</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">email:</span> <span class="ruby-identifier">email</span>, <span class="ruby-value">first_name:</span> <span class="ruby-identifier">account</span>[<span class="ruby-value">:firstName</span>], <span class="ruby-value">last_name:</span> <span class="ruby-identifier">account</span>[<span class="ruby-value">:lastName</span>]))
408
+ <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">response</span>.<span class="ruby-identifier">account</span>.<span class="ruby-identifier">email</span>] = <span class="ruby-identifier">response</span>.<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>
409
+ <span class="ruby-keyword">end</span>
410
+ <span class="ruby-comment"># deleteAccountAttachments</span>
411
+ <span class="ruby-identifier">sdmAccountAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">accounts</span><span class="ruby-operator">|</span>
412
+ <span class="ruby-identifier">roleId</span> = <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
413
+ <span class="ruby-identifier">ldapAccountsInRole</span> = <span class="ruby-identifier">ldapAccountAttachments</span>[<span class="ruby-identifier">roleName</span>]
414
+ <span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span><span class="ruby-operator">|</span>
415
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ldapAccountsInRole</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">ldapAccountsInRole</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">email</span>
416
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:deleteAccountAttachments</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:account</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">email</span> })
417
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
418
+ <span class="ruby-identifier">accountId</span> = <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">email</span>]
419
+ <span class="ruby-identifier">attachment</span> = <span class="ruby-identifier">first</span>(<span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;accountid:? roleid:?&#39;</span>, <span class="ruby-identifier">accountId</span>, <span class="ruby-identifier">roleId</span>))
420
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">attachment</span> <span class="ruby-comment"># already deleted by the deleteAccounts step</span>
421
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">attachment</span>.<span class="ruby-identifier">id</span>)
422
+ <span class="ruby-keyword">end</span>
423
+ <span class="ruby-keyword">end</span>
424
+ <span class="ruby-comment"># createAccountAttachments</span>
425
+ <span class="ruby-identifier">ldapAccountAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">accounts</span><span class="ruby-operator">|</span>
426
+ <span class="ruby-identifier">roleId</span> = <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
427
+ <span class="ruby-identifier">sdmAccountsInRole</span> = <span class="ruby-identifier">sdmAccountAttachments</span>[<span class="ruby-identifier">roleName</span>]
428
+ <span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span><span class="ruby-operator">|</span>
429
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmAccountsInRole</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">sdmAccountsInRole</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">email</span>
430
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createAccountAttachments</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:account</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">email</span> })
431
+ <span class="ruby-identifier">accountId</span> = <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">email</span>]
432
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
433
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountAttachment</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">account_id:</span> <span class="ruby-identifier">accountId</span>, <span class="ruby-value">role_id:</span> <span class="ruby-identifier">roleId</span>))
434
+ <span class="ruby-keyword">end</span>
435
+ <span class="ruby-keyword">end</span>
436
+ <span class="ruby-comment"># deleteRoleGrants</span>
437
+ <span class="ruby-identifier">sdmRoleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">roleGrants</span><span class="ruby-operator">|</span>
438
+ <span class="ruby-identifier">desired</span> = <span class="ruby-identifier">desiredRoleGrants</span>[<span class="ruby-identifier">roleName</span>]
439
+ <span class="ruby-identifier">roleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">grant</span><span class="ruby-operator">|</span>
440
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">desired</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">desired</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">grant</span>[<span class="ruby-value">:resourceId</span>]
441
+ <span class="ruby-identifier">resourceName</span> = <span class="ruby-identifier">sdmResources</span>[<span class="ruby-identifier">grant</span>[<span class="ruby-value">:resourceId</span>]]
442
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:deleteRoleGrants</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:resource</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">resourceName</span>})
443
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
444
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">role_grants</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">grant</span>[<span class="ruby-value">:grantId</span>])
445
+ <span class="ruby-keyword">end</span>
446
+ <span class="ruby-keyword">end</span>
447
+ <span class="ruby-comment"># createRoleGrants</span>
448
+ <span class="ruby-identifier">desiredRoleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">roleGrants</span><span class="ruby-operator">|</span>
449
+ <span class="ruby-identifier">roleId</span> = <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
450
+ <span class="ruby-identifier">existing</span> = <span class="ruby-identifier">sdmRoleGrants</span>[<span class="ruby-identifier">roleName</span>]
451
+ <span class="ruby-identifier">roleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span>
452
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">existing</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">existing</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">existingGrant</span><span class="ruby-operator">|</span> <span class="ruby-identifier">existingGrant</span>[<span class="ruby-value">:resourceId</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">resourceId</span> }
453
+ <span class="ruby-identifier">resourceName</span> = <span class="ruby-identifier">sdmResources</span>[<span class="ruby-identifier">resourceId</span>]
454
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createRoleGrants</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:resource</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">resourceName</span> })
455
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
456
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">role_grants</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">RoleGrant</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">role_id:</span> <span class="ruby-identifier">roleId</span>, <span class="ruby-value">resource_id:</span> <span class="ruby-identifier">resourceId</span>))
457
+ <span class="ruby-keyword">end</span>
458
+ <span class="ruby-keyword">end</span>
459
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">verbose</span>
460
+ <span class="ruby-identifier">puts</span> <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">pretty_generate</span>(<span class="ruby-identifier">report</span>)
461
+ <span class="ruby-keyword">else</span>
462
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createRoles].length} roles&quot;</span>
463
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Delete #{report[:deleteAccounts].length} accounts&quot;</span>
464
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createAccounts].length} accounts&quot;</span>
465
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Delete #{report[:deleteAccountAttachments].length} account attachments&quot;</span>
466
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createAccountAttachments].length} account attachments&quot;</span>
467
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Delete #{report[:deleteRoleGrants].length} role grants&quot;</span>
468
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createRoleGrants].length} role grants&quot;</span>
469
+ <span class="ruby-keyword">end</span>
470
+ <span class="ruby-keyword">end</span></pre>
471
+ </div>
472
+
473
+ </div>
168
474
 
169
- <span class="ruby-identifier">reinstated_count</span> = <span class="ruby-value">0</span>
475
+
170
476
 
171
- <span class="ruby-identifier">users</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>)
172
- <span class="ruby-identifier">users</span>.<span class="ruby-identifier">each</span>{ <span class="ruby-operator">|</span><span class="ruby-identifier">user</span><span class="ruby-operator">|</span>
173
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">suspended</span>
174
- <span class="ruby-identifier">reinstated_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
175
- <span class="ruby-identifier">user</span>.<span class="ruby-identifier">suspended</span> = <span class="ruby-keyword">false</span>
176
- <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">update</span>(<span class="ruby-identifier">user</span>)
177
- <span class="ruby-keyword">end</span>
178
- }
179
- <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;attachments&quot;</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">attachment</span><span class="ruby-operator">|</span>
180
- <span class="ruby-keyword">begin</span>
181
- <span class="ruby-identifier">a</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountAttachment</span>.<span class="ruby-identifier">new</span>()
182
- <span class="ruby-identifier">a</span>.<span class="ruby-identifier">account_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;account_id&quot;</span>]
183
- <span class="ruby-identifier">a</span>.<span class="ruby-identifier">role_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;role_id&quot;</span>]
184
- <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">create</span>(<span class="ruby-identifier">a</span>)
185
- <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AlreadyExistsError</span>
186
- <span class="ruby-keyword">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ex</span>
187
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;skipping creation of attachment due to error: &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">to_s</span>
188
- <span class="ruby-keyword">end</span>
477
+
478
+ </div>
479
+
480
+
481
+ <div id="method-i-main" class="method-detail ">
482
+
483
+ <div class="method-heading">
484
+ <span class="method-name">main</span><span
485
+ class="method-args">()</span>
486
+
487
+ <span class="method-click-advice">click to toggle source</span>
488
+
489
+ </div>
490
+
491
+
492
+ <div class="method-description">
493
+
494
+ <p>panicButton.rb suspends all users except for one admin, in the fake use case of a critical break in or something usage: ruby panicButton.rb adminuser@email.com to revert back to pre-panic state: ruby panicButton.rb revert</p>
495
+
496
+
497
+
498
+
499
+ <div class="method-source-code" id="main-source">
500
+ <pre><span class="ruby-comment"># File examples/panicButton.rb, line 25</span>
501
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">main</span>
502
+ <span class="ruby-identifier">access_key</span> = <span class="ruby-constant">ENV</span>[<span class="ruby-string">&quot;SDM_API_ACCESS_KEY&quot;</span>]
503
+ <span class="ruby-identifier">secret_key</span> = <span class="ruby-constant">ENV</span>[<span class="ruby-string">&quot;SDM_API_SECRET_KEY&quot;</span>]
504
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">access_key</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">secret_key</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
505
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;SDM_API_ACCESS_KEY and SDM_API_SECRET_KEY must be provided&quot;</span>
506
+ <span class="ruby-keyword">return</span>
507
+ <span class="ruby-keyword">end</span>
508
+ <span class="ruby-identifier">client</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">access_key</span>, <span class="ruby-identifier">secret_key</span>)
509
+
510
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span> <span class="ruby-keyword">and</span> <span class="ruby-constant">ARGV</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-string">&quot;revert&quot;</span>
511
+ <span class="ruby-identifier">state_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&quot;state.json&quot;</span>)
512
+ <span class="ruby-identifier">state</span> = <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">state_file</span>)
513
+
514
+ <span class="ruby-identifier">reinstated_count</span> = <span class="ruby-value">0</span>
515
+
516
+ <span class="ruby-identifier">users</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;&quot;</span>)
517
+ <span class="ruby-identifier">users</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">user</span><span class="ruby-operator">|</span>
518
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">suspended</span>
519
+ <span class="ruby-identifier">reinstated_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
520
+ <span class="ruby-identifier">user</span>.<span class="ruby-identifier">suspended</span> = <span class="ruby-keyword">false</span>
521
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">update</span>(<span class="ruby-identifier">user</span>)
522
+ <span class="ruby-keyword">end</span>
523
+ }
524
+ <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;attachments&quot;</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">attachment</span><span class="ruby-operator">|</span>
525
+ <span class="ruby-keyword">begin</span>
526
+ <span class="ruby-identifier">a</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountAttachment</span>.<span class="ruby-identifier">new</span>()
527
+ <span class="ruby-identifier">a</span>.<span class="ruby-identifier">account_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;account_id&quot;</span>]
528
+ <span class="ruby-identifier">a</span>.<span class="ruby-identifier">role_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;role_id&quot;</span>]
529
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">create</span>(<span class="ruby-identifier">a</span>)
530
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AlreadyExistsError</span>
531
+ <span class="ruby-keyword">rescue</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
532
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;skipping creation of attachment due to error: &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">to_s</span>
533
+ <span class="ruby-keyword">end</span>
534
+ }
535
+ <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;grants&quot;</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">attachment</span><span class="ruby-operator">|</span>
536
+ <span class="ruby-keyword">begin</span>
537
+ <span class="ruby-identifier">g</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountGrant</span>.<span class="ruby-identifier">new</span>()
538
+ <span class="ruby-identifier">g</span>.<span class="ruby-identifier">account_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;account_id&quot;</span>]
539
+ <span class="ruby-identifier">g</span>.<span class="ruby-identifier">resource_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;resource_id&quot;</span>]
540
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">create</span>(<span class="ruby-identifier">g</span>)
541
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AlreadyExistsError</span>
542
+ <span class="ruby-keyword">rescue</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
543
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;skipping creation of grant due to error: &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">to_s</span>
544
+ <span class="ruby-keyword">end</span>
545
+ }
546
+
547
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;reinstated &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">reinstated_count</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; users&quot;</span>
548
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;recreated &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;attachments&quot;</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account attachments&quot;</span>
549
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;recreated &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;grants&quot;</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account grants&quot;</span>
550
+
551
+ <span class="ruby-keyword">return</span>
552
+ <span class="ruby-keyword">end</span>
553
+
554
+ <span class="ruby-identifier">admin_email</span> = <span class="ruby-string">&quot;&quot;</span>
555
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
556
+ <span class="ruby-identifier">admin_email</span> = <span class="ruby-constant">ARGV</span>[<span class="ruby-value">0</span>]
557
+ <span class="ruby-keyword">else</span>
558
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;please provide an admin email to preserve&quot;</span>
559
+ <span class="ruby-keyword">return</span> <span class="ruby-value">1</span>
560
+ <span class="ruby-keyword">end</span>
561
+
562
+ <span class="ruby-identifier">admin_user_id</span> = <span class="ruby-string">&quot;&quot;</span>
563
+ <span class="ruby-identifier">users</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;email:?&quot;</span>, <span class="ruby-identifier">admin_email</span>)
564
+ <span class="ruby-identifier">users</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">user</span><span class="ruby-operator">|</span>
565
+ <span class="ruby-identifier">admin_user_id</span> = <span class="ruby-identifier">user</span>.<span class="ruby-identifier">id</span>
566
+ }
567
+
568
+ <span class="ruby-identifier">account_attachments</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;&quot;</span>)
569
+ <span class="ruby-identifier">account_grants</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;&quot;</span>)
570
+
571
+ <span class="ruby-identifier">state</span> = {
572
+ <span class="ruby-value">&#39;attachments&#39;:</span> <span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span>
573
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">admin_user_id</span>
574
+ <span class="ruby-identifier">out</span> = {
575
+ <span class="ruby-value">&#39;account_id&#39;:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span>,
576
+ <span class="ruby-value">&#39;role_id&#39;:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">role_id</span>,
189
577
  }
190
- <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;grants&quot;</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">attachment</span><span class="ruby-operator">|</span>
191
- <span class="ruby-keyword">begin</span>
192
- <span class="ruby-identifier">g</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountGrant</span>.<span class="ruby-identifier">new</span>()
193
- <span class="ruby-identifier">g</span>.<span class="ruby-identifier">account_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;account_id&quot;</span>]
194
- <span class="ruby-identifier">g</span>.<span class="ruby-identifier">resource_id</span> = <span class="ruby-identifier">attachment</span>[<span class="ruby-string">&quot;resource_id&quot;</span>]
195
- <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">create</span>(<span class="ruby-identifier">g</span>)
196
- <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AlreadyExistsError</span>
197
- <span class="ruby-keyword">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ex</span>
198
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;skipping creation of grant due to error: &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">to_s</span>
199
- <span class="ruby-keyword">end</span>
578
+ <span class="ruby-keyword">end</span>
579
+ }.<span class="ruby-identifier">reject</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> },
580
+ <span class="ruby-value">&#39;grants&#39;:</span> <span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span>
581
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">admin_user_id</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">valid_until</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
582
+ <span class="ruby-identifier">out</span> = {
583
+ <span class="ruby-value">&#39;account_id&#39;:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span>,
584
+ <span class="ruby-value">&#39;resource_id&#39;:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">resource_id</span>,
200
585
  }
586
+ <span class="ruby-keyword">end</span>
587
+ }.<span class="ruby-identifier">reject</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> },
588
+ }
201
589
 
202
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;reinstated &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">reinstated_count</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; users&quot;</span>
203
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;recreated &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;attachments&quot;</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account attachments&quot;</span>
204
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;recreated &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-string">&quot;grants&quot;</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account grants&quot;</span>
590
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;storing &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-value">:attachments</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account attachments in state&quot;</span>
591
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;storing &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-value">:grants</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account grants in state&quot;</span>
205
592
 
206
- <span class="ruby-keyword">return</span>
207
- <span class="ruby-keyword">end</span>
593
+ <span class="ruby-identifier">state_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&quot;state.json&quot;</span>, <span class="ruby-string">&quot;w&quot;</span>)
594
+ <span class="ruby-identifier">state_file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">state</span>.<span class="ruby-identifier">to_json</span>)
208
595
 
209
- <span class="ruby-identifier">admin_email</span> = <span class="ruby-string">&quot;&quot;</span>
210
- <span class="ruby-keyword">if</span> <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
211
- <span class="ruby-identifier">admin_email</span> = <span class="ruby-constant">ARGV</span>[<span class="ruby-value">0</span>]
212
- <span class="ruby-keyword">else</span>
213
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;please provide an admin email to preserve&quot;</span>
214
- <span class="ruby-keyword">return</span> <span class="ruby-value">1</span>
596
+ <span class="ruby-identifier">suspended_count</span> = <span class="ruby-value">0</span>
597
+ <span class="ruby-identifier">users</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;&quot;</span>)
598
+ <span class="ruby-identifier">users</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">user</span><span class="ruby-operator">|</span>
599
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">instance_of?</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">User</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">email</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">admin_email</span>
600
+ <span class="ruby-keyword">next</span>
215
601
  <span class="ruby-keyword">end</span>
602
+ <span class="ruby-identifier">user</span>.<span class="ruby-identifier">suspended</span> = <span class="ruby-keyword">true</span>
603
+ <span class="ruby-keyword">begin</span>
604
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">update</span>(<span class="ruby-identifier">user</span>)
605
+ <span class="ruby-identifier">suspended_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
606
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
607
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;skipping user &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">id</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; on account of error: &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">to_s</span>
608
+ <span class="ruby-keyword">end</span>
609
+ }
216
610
 
217
- <span class="ruby-identifier">admin_user_id</span> = <span class="ruby-string">&quot;&quot;</span>
218
- <span class="ruby-identifier">users</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;email:?&quot;</span>, <span class="ruby-identifier">admin_email</span>)
219
- <span class="ruby-identifier">users</span>.<span class="ruby-identifier">each</span>{ <span class="ruby-operator">|</span><span class="ruby-identifier">user</span><span class="ruby-operator">|</span>
220
- <span class="ruby-identifier">admin_user_id</span> = <span class="ruby-identifier">user</span>.<span class="ruby-identifier">id</span>
221
- }
611
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;suspended &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">suspended_count</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; users&quot;</span>
612
+ <span class="ruby-keyword">end</span></pre>
613
+ </div>
614
+
615
+ </div>
222
616
 
223
- <span class="ruby-identifier">account_attachments</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>)
224
- <span class="ruby-identifier">account_grants</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>)
617
+
225
618
 
226
- <span class="ruby-identifier">state</span> = {
227
- <span class="ruby-string">&#39;attachments&#39;</span><span class="ruby-operator">:</span> <span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span>
228
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">admin_user_id</span>
229
- <span class="ruby-identifier">out</span> = {
230
- <span class="ruby-string">&#39;account_id&#39;</span><span class="ruby-operator">:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span>,
231
- <span class="ruby-string">&#39;role_id&#39;</span><span class="ruby-operator">:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">role_id</span>,
232
- }
233
- <span class="ruby-keyword">end</span>
234
- }.<span class="ruby-identifier">reject</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>},
235
- <span class="ruby-string">&#39;grants&#39;</span><span class="ruby-operator">:</span> <span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span>
236
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">admin_user_id</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">valid_until</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
237
- <span class="ruby-identifier">out</span> = {
238
- <span class="ruby-string">&#39;account_id&#39;</span><span class="ruby-operator">:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">account_id</span>,
239
- <span class="ruby-string">&#39;resource_id&#39;</span><span class="ruby-operator">:</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">resource_id</span>,
240
- }
241
- <span class="ruby-keyword">end</span>
242
- }.<span class="ruby-identifier">reject</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>},
243
- }
619
+
620
+ </div>
244
621
 
245
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;storing &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-value">:attachments</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account attachments in state&quot;</span>
246
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;storing &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">state</span>[<span class="ruby-value">:grants</span>].<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; account grants in state&quot;</span>
622
+
623
+ <div id="method-i-okta_sync" class="method-detail ">
624
+
625
+ <div class="method-heading">
626
+ <span class="method-name">okta_sync</span><span
627
+ class="method-args">()</span>
628
+
629
+ <span class="method-click-advice">click to toggle source</span>
630
+
631
+ </div>
632
+
247
633
 
248
- <span class="ruby-identifier">state_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&quot;state.json&quot;</span>, <span class="ruby-string">&quot;w&quot;</span>)
249
- <span class="ruby-identifier">state_file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">state</span>.<span class="ruby-identifier">to_json</span>)
634
+ <div class="method-description">
635
+
636
+
637
+
638
+
250
639
 
251
- <span class="ruby-identifier">suspended_count</span> = <span class="ruby-value">0</span>
252
- <span class="ruby-identifier">users</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>)
253
- <span class="ruby-identifier">users</span>.<span class="ruby-identifier">each</span>{ <span class="ruby-operator">|</span><span class="ruby-identifier">user</span><span class="ruby-operator">|</span>
254
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">instance_of?</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">User</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">email</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">admin_email</span>
255
- <span class="ruby-keyword">next</span>
640
+
641
+ <div class="method-source-code" id="okta_sync-source">
642
+ <pre><span class="ruby-comment"># File examples/okta-sync/oktaSync.rb, line 25</span>
643
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">okta_sync</span>
644
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">SDM_API_ACCESS_KEY</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">SDM_API_SECRET_KEY</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">OKTA_CLIENT_TOKEN</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">OKTA_CLIENT_ORGURL</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;&quot;</span>
645
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY, OKTA_CLIENT_TOKEN, and OKTA_CLIENT_ORGURL must be set&quot;</span>
646
+ <span class="ruby-identifier">exit</span>
647
+ <span class="ruby-keyword">end</span>
648
+
649
+ <span class="ruby-identifier">report</span> = {
650
+ <span class="ruby-value">:start</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>,
651
+
652
+ <span class="ruby-value">:oktaUsersCount</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span>,
653
+ <span class="ruby-value">:oktaUsers</span> <span class="ruby-operator">=&gt;</span> [],
654
+
655
+ <span class="ruby-value">:sdmUsersCount</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span>,
656
+ <span class="ruby-value">:sdmUsers</span> <span class="ruby-operator">=&gt;</span> [],
657
+
658
+ <span class="ruby-value">:bothUsersCount</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span>,
659
+
660
+ <span class="ruby-value">:sdmResourcesCount</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span>,
661
+ <span class="ruby-value">:sdmResources</span> <span class="ruby-operator">=&gt;</span> {},
662
+
663
+ <span class="ruby-value">:permissionsGranted</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span>,
664
+ <span class="ruby-value">:permissionsRevoked</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span>,
665
+ <span class="ruby-value">:grants</span> <span class="ruby-operator">=&gt;</span> [],
666
+ <span class="ruby-value">:revocations</span> <span class="ruby-operator">=&gt;</span> [],
667
+
668
+ <span class="ruby-value">:matchers</span> <span class="ruby-operator">=&gt;</span> {},
669
+ }
670
+
671
+ <span class="ruby-identifier">plan</span> = <span class="ruby-keyword">false</span>
672
+ <span class="ruby-identifier">verbose</span> = <span class="ruby-keyword">false</span>
673
+ <span class="ruby-constant">OptionParser</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">opts</span><span class="ruby-operator">|</span>
674
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">banner</span> = <span class="ruby-string">&quot;Usage oktaSync.rb [options]&quot;</span>
675
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-p&quot;</span>, <span class="ruby-string">&quot;--plan&quot;</span>, <span class="ruby-string">&quot;calculate changes but do not apply them&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span>
676
+ <span class="ruby-identifier">plan</span> = <span class="ruby-identifier">p</span>
677
+ <span class="ruby-keyword">end</span>
678
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-v&quot;</span>, <span class="ruby-string">&quot;--verbose&quot;</span>, <span class="ruby-string">&quot;print detailed report&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
679
+ <span class="ruby-identifier">verbose</span> = <span class="ruby-identifier">v</span>
680
+ <span class="ruby-keyword">end</span>
681
+ <span class="ruby-keyword">end</span>.<span class="ruby-identifier">parse!</span>
682
+
683
+ <span class="ruby-identifier">client</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">SDM_API_ACCESS_KEY</span>, <span class="ruby-constant">SDM_API_SECRET_KEY</span>)
684
+ <span class="ruby-identifier">okta_client</span> = <span class="ruby-constant">Oktakit</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">token:</span> <span class="ruby-constant">OKTA_CLIENT_TOKEN</span>, <span class="ruby-value">api_endpoint:</span> <span class="ruby-constant">OKTA_CLIENT_ORGURL</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot;/api/v1&quot;</span>)
685
+ <span class="ruby-identifier">matchers</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-string">&quot;matchers.yml&quot;</span>))
686
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:matchers</span>] = <span class="ruby-identifier">matchers</span>
687
+
688
+ <span class="ruby-identifier">all_users</span> = <span class="ruby-identifier">okta_client</span>.<span class="ruby-identifier">list_users</span>({
689
+ <span class="ruby-value">&#39;query&#39;:</span> {
690
+ <span class="ruby-value">&#39;search&#39;:</span> <span class="ruby-string">&quot;profile.department eq \&quot;Engineering\&quot; and (status eq \&quot;ACTIVE\&quot;)&quot;</span>,
691
+ },
692
+ })
693
+
694
+ <span class="ruby-identifier">okta_users</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>()
695
+ <span class="ruby-identifier">all_users</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">u</span><span class="ruby-operator">|</span>
696
+ <span class="ruby-identifier">groups</span> = <span class="ruby-identifier">okta_client</span>.<span class="ruby-identifier">get_member_groups</span>(<span class="ruby-identifier">u</span>.<span class="ruby-identifier">id</span>)
697
+ <span class="ruby-identifier">group_names</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>()
698
+ <span class="ruby-identifier">groups</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">ug</span><span class="ruby-operator">|</span>
699
+ <span class="ruby-identifier">group_names</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">ug</span>.<span class="ruby-identifier">profile</span>.<span class="ruby-identifier">name</span>)
700
+ }
701
+ <span class="ruby-identifier">okta_users</span>.<span class="ruby-identifier">push</span>({ <span class="ruby-value">:login</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">u</span>.<span class="ruby-identifier">profile</span>.<span class="ruby-identifier">login</span>, <span class="ruby-value">:first_name</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">u</span>.<span class="ruby-identifier">profile</span>.<span class="ruby-identifier">firstName</span>, <span class="ruby-value">:last_name</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">u</span>.<span class="ruby-identifier">profile</span>.<span class="ruby-constant">LastName</span>, <span class="ruby-value">:groups</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">group_names</span> })
702
+ }
703
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:oktaUsers</span>] = <span class="ruby-identifier">okta_users</span>
704
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:oktaUsersCount</span>] = <span class="ruby-identifier">okta_users</span>.<span class="ruby-identifier">size</span>
705
+
706
+ <span class="ruby-identifier">accounts</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;type:user&quot;</span>).<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">a</span><span class="ruby-operator">|</span> [<span class="ruby-identifier">a</span>.<span class="ruby-identifier">email</span>, <span class="ruby-identifier">a</span>] }.<span class="ruby-identifier">to_h</span>
707
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:sdmUsers</span>] = <span class="ruby-identifier">accounts</span>
708
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:sdmUsersCount</span>] = <span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">size</span>
709
+ <span class="ruby-identifier">grants</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&quot;&quot;</span>).<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">ag</span><span class="ruby-operator">|</span> <span class="ruby-identifier">ag</span> }
710
+
711
+ <span class="ruby-identifier">current</span> = {}
712
+ <span class="ruby-identifier">grants</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">g</span><span class="ruby-operator">|</span>
713
+ <span class="ruby-identifier">current</span>[<span class="ruby-identifier">g</span>.<span class="ruby-identifier">account_id</span>] = [] <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">current</span>[<span class="ruby-identifier">g</span>.<span class="ruby-identifier">account_id</span>]
714
+ <span class="ruby-identifier">current</span>[<span class="ruby-identifier">g</span>.<span class="ruby-identifier">account_id</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:resource_id</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">g</span>.<span class="ruby-identifier">resource_id</span>, <span class="ruby-value">:id</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">g</span>.<span class="ruby-identifier">id</span> })
715
+ }
716
+
717
+ <span class="ruby-identifier">desired</span> = {}
718
+ <span class="ruby-identifier">overlapping</span> = <span class="ruby-value">0</span>
719
+ <span class="ruby-identifier">matchers</span>[<span class="ruby-string">&quot;groups&quot;</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">group</span><span class="ruby-operator">|</span>
720
+ <span class="ruby-identifier">group</span>[<span class="ruby-string">&quot;resources&quot;</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">resourceQuery</span><span class="ruby-operator">|</span>
721
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">list</span>(<span class="ruby-identifier">resourceQuery</span>).<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">res</span><span class="ruby-operator">|</span>
722
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:sdmResources</span>][<span class="ruby-identifier">res</span>.<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">res</span>
723
+ <span class="ruby-identifier">okta_users</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">u</span><span class="ruby-operator">|</span>
724
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">u</span>[<span class="ruby-value">:groups</span>].<span class="ruby-identifier">include?</span> <span class="ruby-identifier">group</span>[<span class="ruby-string">&quot;name&quot;</span>]
725
+ <span class="ruby-identifier">account</span> = <span class="ruby-identifier">accounts</span>[<span class="ruby-identifier">u</span>[<span class="ruby-value">:login</span>]]
726
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">account</span> <span class="ruby-operator">!=</span> <span class="ruby-keyword">nil</span>
727
+ <span class="ruby-identifier">overlapping</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
728
+ <span class="ruby-identifier">desired</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>] = [] <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">desired</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>]
729
+ <span class="ruby-identifier">desired</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">res</span>.<span class="ruby-identifier">id</span>)
730
+ <span class="ruby-keyword">end</span>
731
+ <span class="ruby-keyword">end</span>
732
+ }
733
+ }
734
+ }
735
+ }
736
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:bothUsersCount</span>] = <span class="ruby-identifier">overlapping</span>
737
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:sdmResourcesCount</span>] = <span class="ruby-identifier">report</span>[<span class="ruby-value">:sdmResources</span>].<span class="ruby-identifier">size</span>
738
+
739
+ <span class="ruby-identifier">revocations</span> = <span class="ruby-value">0</span>
740
+ <span class="ruby-identifier">current</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">aid</span>, <span class="ruby-identifier">curRes</span><span class="ruby-operator">|</span>
741
+ <span class="ruby-identifier">desRes</span> = <span class="ruby-identifier">desired</span>[<span class="ruby-identifier">aid</span>]
742
+ <span class="ruby-identifier">desRes</span> = [] <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">desired</span>[<span class="ruby-identifier">aid</span>]
743
+ <span class="ruby-identifier">curRes</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
744
+ <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span>(<span class="ruby-identifier">desRes</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">r</span>[<span class="ruby-value">:resource_id</span>])
745
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
746
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Plan: revoke %s from user %s\n&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">r</span>[<span class="ruby-value">:resource_id</span>], <span class="ruby-identifier">aid</span>]
747
+ <span class="ruby-keyword">else</span>
748
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">r</span>[<span class="ruby-value">:id</span>])
256
749
  <span class="ruby-keyword">end</span>
257
- <span class="ruby-identifier">user</span>.<span class="ruby-identifier">suspended</span> = <span class="ruby-keyword">true</span>
258
- <span class="ruby-keyword">begin</span>
259
- <span class="ruby-identifier">client</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">update</span>(<span class="ruby-identifier">user</span>)
260
- <span class="ruby-identifier">suspended_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
261
- <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ex</span>
262
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;skipping user &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">id</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; on account of error: &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">to_s</span>
750
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:revocations</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">r</span>[<span class="ruby-value">:id</span>])
751
+ <span class="ruby-identifier">revocations</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
752
+ <span class="ruby-keyword">end</span>
753
+ }
754
+ }
755
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:permissionsRevoked</span>] = <span class="ruby-identifier">revocations</span>
756
+
757
+ <span class="ruby-identifier">grants</span> = <span class="ruby-value">0</span>
758
+ <span class="ruby-identifier">desired</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">aid</span>, <span class="ruby-identifier">desRes</span><span class="ruby-operator">|</span>
759
+ <span class="ruby-identifier">curRes</span> = <span class="ruby-identifier">current</span>[<span class="ruby-identifier">aid</span>]
760
+ <span class="ruby-identifier">curRes</span> = [] <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">current</span>[<span class="ruby-identifier">aid</span>]
761
+ <span class="ruby-identifier">desRes</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
762
+ <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span>(<span class="ruby-identifier">curRes</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span> <span class="ruby-identifier">c</span>[<span class="ruby-value">:resource_id</span>] }.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">r</span>)
763
+ <span class="ruby-identifier">ag</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountGrant</span>.<span class="ruby-identifier">new</span>()
764
+ <span class="ruby-identifier">ag</span>.<span class="ruby-identifier">account_id</span> = <span class="ruby-identifier">aid</span>
765
+ <span class="ruby-identifier">ag</span>.<span class="ruby-identifier">resource_id</span> = <span class="ruby-identifier">r</span>
766
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
767
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Plan: grant %s to user %s\n&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">r</span>, <span class="ruby-identifier">aid</span>]
768
+ <span class="ruby-keyword">else</span>
769
+ <span class="ruby-identifier">client</span>.<span class="ruby-identifier">account_grants</span>.<span class="ruby-identifier">create</span>(<span class="ruby-identifier">ag</span>)
263
770
  <span class="ruby-keyword">end</span>
771
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:grants</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">ag</span>)
772
+ <span class="ruby-identifier">grants</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
773
+ <span class="ruby-keyword">end</span>
264
774
  }
775
+ }
776
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:permissionsGranted</span>] = <span class="ruby-identifier">grants</span>
265
777
 
266
- <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;suspended &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">suspended_count</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot; users&quot;</span>
778
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:complete</span>] = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
267
779
 
780
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">verbose</span>
781
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">report</span>.<span class="ruby-identifier">to_json</span>
782
+ <span class="ruby-keyword">else</span>
783
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;%d Okta users, %d strongDM users, %d overlapping users, %d grants, %d revocations&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">okta_users</span>.<span class="ruby-identifier">size</span>, <span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">size</span>, <span class="ruby-identifier">overlapping</span>, <span class="ruby-identifier">grants</span>, <span class="ruby-identifier">revocations</span>]
784
+ <span class="ruby-keyword">end</span>
268
785
  <span class="ruby-keyword">end</span></pre>
269
786
  </div>
270
787
 
@@ -279,12 +796,13 @@ revert

279
796
  </section>
280
797
 
281
798
  </section>
799
+
282
800
  </main>
283
801
 
284
802
 
285
803
  <footer id="validator-badges" role="contentinfo">
286
- <p><a href="http://validator.w3.org/check/referer">Validate</a>
287
- <p>Generated by <a href="http://docs.seattlerb.org/rdoc/">RDoc</a> 4.2.1.
804
+ <p><a href="https://validator.w3.org/check/referer">Validate</a>
805
+ <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.1.2.
288
806
  <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
289
807
  </footer>
290
808