harbr 0.2.10 → 2.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/exe/harbr +225 -150
  4. data/lib/examples/container.toml +13 -0
  5. data/lib/harbr/container.rb +14 -10
  6. data/lib/harbr/host.rb +21 -0
  7. data/lib/harbr/version.rb +1 -1
  8. data/lib/harbr.rb +21 -6
  9. data/vendor/bundle/ruby/3.2.0/cache/dddr-1.0.8.gem +0 -0
  10. data/vendor/bundle/ruby/3.2.0/cache/dddr-1.1.0.gem +0 -0
  11. data/vendor/bundle/ruby/3.2.0/cache/dddr-1.1.1.gem +0 -0
  12. data/vendor/bundle/ruby/3.2.0/cache/net-ssh-7.2.1.gem +0 -0
  13. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/.DS_Store +0 -0
  14. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/.rspec +3 -0
  15. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/.standard.yml +3 -0
  16. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/CHANGELOG.md +5 -0
  17. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/CODE_OF_CONDUCT.md +84 -0
  18. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/LICENSE.txt +21 -0
  19. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/README.md +96 -0
  20. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/Rakefile +10 -0
  21. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/hero.png +0 -0
  22. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/lib/dddr/version.rb +5 -0
  23. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/lib/dddr.rb +205 -0
  24. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.0.8/sig/dddr.rbs +4 -0
  25. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/.DS_Store +0 -0
  26. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/.rspec +3 -0
  27. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/.standard.yml +3 -0
  28. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/CHANGELOG.md +5 -0
  29. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/CODE_OF_CONDUCT.md +84 -0
  30. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/LICENSE.txt +21 -0
  31. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/README.md +96 -0
  32. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/Rakefile +10 -0
  33. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/hero.png +0 -0
  34. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/lib/dddr/version.rb +5 -0
  35. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/lib/dddr.rb +182 -0
  36. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.0/sig/dddr.rbs +4 -0
  37. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/.DS_Store +0 -0
  38. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/.rspec +3 -0
  39. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/.standard.yml +3 -0
  40. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/CHANGELOG.md +5 -0
  41. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/CODE_OF_CONDUCT.md +84 -0
  42. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/LICENSE.txt +21 -0
  43. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/README.md +96 -0
  44. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/Rakefile +10 -0
  45. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/hero.png +0 -0
  46. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/lib/dddr/version.rb +5 -0
  47. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/lib/dddr.rb +184 -0
  48. data/vendor/bundle/ruby/3.2.0/gems/dddr-1.1.1/sig/dddr.rbs +4 -0
  49. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.dockerignore +6 -0
  50. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.github/FUNDING.yml +1 -0
  51. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.github/config/rubocop_linter_action.yml +4 -0
  52. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.github/workflows/ci-with-docker.yml +44 -0
  53. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.github/workflows/ci.yml +94 -0
  54. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.github/workflows/rubocop.yml +16 -0
  55. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.gitignore +15 -0
  56. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.rubocop.yml +22 -0
  57. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/.rubocop_todo.yml +1081 -0
  58. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/CHANGES.txt +738 -0
  59. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/DEVELOPMENT.md +23 -0
  60. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Dockerfile +29 -0
  61. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Dockerfile.openssl3 +17 -0
  62. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Gemfile +13 -0
  63. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Gemfile.noed25519 +12 -0
  64. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Gemfile.norbnacl +12 -0
  65. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/ISSUE_TEMPLATE.md +30 -0
  66. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/LICENSE.txt +19 -0
  67. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Manifest +132 -0
  68. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/README.md +298 -0
  69. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/Rakefile +192 -0
  70. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/SECURITY.md +4 -0
  71. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/THANKS.txt +110 -0
  72. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/appveyor.yml +58 -0
  73. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/docker-compose.yml +25 -0
  74. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/agent.rb +284 -0
  75. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/certificate.rb +183 -0
  76. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/constants.rb +20 -0
  77. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/ed25519.rb +186 -0
  78. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  79. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/key_manager.rb +327 -0
  80. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/methods/abstract.rb +79 -0
  81. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/methods/hostbased.rb +72 -0
  82. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/methods/keyboard_interactive.rb +77 -0
  83. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/methods/none.rb +34 -0
  84. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/methods/password.rb +80 -0
  85. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/methods/publickey.rb +137 -0
  86. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/pageant.rb +497 -0
  87. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  88. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/authentication/session.rb +172 -0
  89. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/buffer.rb +449 -0
  90. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/buffered_io.rb +202 -0
  91. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/config.rb +406 -0
  92. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/connection/channel.rb +694 -0
  93. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/connection/constants.rb +33 -0
  94. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/connection/event_loop.rb +123 -0
  95. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/connection/keepalive.rb +59 -0
  96. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/connection/session.rb +712 -0
  97. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/connection/term.rb +180 -0
  98. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/errors.rb +106 -0
  99. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/key_factory.rb +218 -0
  100. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/known_hosts.rb +265 -0
  101. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/loggable.rb +62 -0
  102. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/packet.rb +106 -0
  103. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/prompt.rb +62 -0
  104. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/command.rb +123 -0
  105. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/errors.rb +16 -0
  106. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/http.rb +98 -0
  107. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/https.rb +50 -0
  108. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/jump.rb +54 -0
  109. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/socks4.rb +67 -0
  110. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/proxy/socks5.rb +140 -0
  111. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/service/forward.rb +426 -0
  112. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/channel.rb +147 -0
  113. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/extensions.rb +173 -0
  114. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/kex.rb +46 -0
  115. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/local_packet.rb +53 -0
  116. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/packet.rb +101 -0
  117. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/remote_packet.rb +40 -0
  118. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/script.rb +180 -0
  119. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test/socket.rb +65 -0
  120. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/test.rb +94 -0
  121. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/algorithms.rb +524 -0
  122. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
  123. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
  124. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/cipher_factory.rb +128 -0
  125. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/constants.rb +40 -0
  126. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/ctr.rb +115 -0
  127. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/abstract.rb +97 -0
  128. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/md5.rb +10 -0
  129. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/md5_96.rb +9 -0
  130. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/none.rb +13 -0
  131. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/ripemd160.rb +11 -0
  132. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha1.rb +11 -0
  133. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha1_96.rb +9 -0
  134. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha2_256.rb +11 -0
  135. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha2_256_96.rb +9 -0
  136. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  137. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha2_512.rb +11 -0
  138. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha2_512_96.rb +9 -0
  139. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  140. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/hmac.rb +47 -0
  141. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/identity_cipher.rb +65 -0
  142. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/abstract.rb +130 -0
  143. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  144. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  145. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  146. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +37 -0
  147. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  148. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +122 -0
  149. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +72 -0
  150. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +11 -0
  151. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +39 -0
  152. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +21 -0
  153. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +21 -0
  154. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/kex.rb +31 -0
  155. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/key_expander.rb +30 -0
  156. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/openssl.rb +274 -0
  157. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
  158. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/packet_stream.rb +301 -0
  159. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/server_version.rb +77 -0
  160. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/session.rb +354 -0
  161. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/transport/state.rb +208 -0
  162. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/verifiers/accept_new.rb +33 -0
  163. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  164. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/verifiers/always.rb +58 -0
  165. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/verifiers/never.rb +19 -0
  166. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh/version.rb +68 -0
  167. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/lib/net/ssh.rb +338 -0
  168. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/net-ssh-public_cert.pem +20 -0
  169. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/net-ssh.gemspec +46 -0
  170. data/vendor/bundle/ruby/3.2.0/gems/net-ssh-7.2.1/support/ssh_tunnel_bug.rb +65 -0
  171. data/vendor/bundle/ruby/3.2.0/specifications/dddr-1.0.8.gemspec +27 -0
  172. data/vendor/bundle/ruby/3.2.0/specifications/dddr-1.1.0.gemspec +27 -0
  173. data/vendor/bundle/ruby/3.2.0/specifications/dddr-1.1.1.gemspec +27 -0
  174. data/vendor/bundle/ruby/3.2.0/specifications/net-ssh-7.2.1.gemspec +38 -0
  175. metadata +174 -9
  176. data/config/manifest.yml +0 -5
  177. data/lib/harbr/job.rb +0 -252
  178. data/lib/harbr/lxd/job.rb +0 -119
  179. data/lib/harbr/lxd/setup.rb +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '080e73e776d948d2528073f3b01e8295f364f090c160a034fd67fcae5adc867f'
4
- data.tar.gz: eb4c1f32b65805784e0be36804143f994ea05eec5aaefec48a8b6e4938344ed5
3
+ metadata.gz: 2d22be1691e9a058891f9eea7f3c3f6948ebe2012a2c99e275413d55d9700040
4
+ data.tar.gz: eca940628488eb5002a912bc8dbd299e7fbb4356fa07d3461313c21392bdad0c
5
5
  SHA512:
6
- metadata.gz: bc1db32542486d8965184c780cdf7086722d571587be7a0441abecd96f4ac00c26b42d8adb0a765c8d3f6a083c7049481763fd1bdf0637b2df80081993b9c450
7
- data.tar.gz: 859fe567afe19637a7ff5cc1a49324ba94db966a6afcdcd6424219f1c0f52a6875c209c5613a5b24c7dfcf2aa1497f73fa5973f6fd0ab5138284bfec508b86be
6
+ metadata.gz: f75aa4c6034468b2e76707d95ff8f1442f3dc9a1cf042160dedc07dab79dc03bd979025cf6641e65a50375bb4d66ea03aaf8cb092adb16783debd76f4767bcbf
7
+ data.tar.gz: 4d6a1c95f6656329d6cc88a2b9f4f667f4cc8f7d3f7ca0ac4d75269257681f0e302cc30c47c1e34d7158fe213730b65fe659d9f415e55c18edc7e7beb944083c
data/.DS_Store ADDED
Binary file
data/exe/harbr CHANGED
@@ -1,8 +1,213 @@
1
1
  #!/usr/bin/env ruby
2
2
  require_relative "../lib/harbr"
3
3
 
4
+ class Host < Thor
5
+ attr_reader :containers
6
+ attr_reader :hosts
7
+
8
+ def initialize(a, b, c)
9
+ @containers = Harbr::Container::Repository.new
10
+ @hosts = Harbr::Host::Repository.new
11
+ super(a, b, c)
12
+ end
13
+
14
+ no_commands do
15
+ def display_table(hosts)
16
+ return puts "No hosts available." if hosts.empty?
17
+
18
+ # Define headers based on Container attributes
19
+ headers = ["Uid", "Container","Ip","Port", "Host"]
20
+
21
+ rows = hosts.map do |host|
22
+ container = containers.get(host.container_uid)
23
+ [host.uid, container.name,container.ip,host.port,host.header]
24
+ end
25
+
26
+ table = ::Terminal::Table.new(headings: headers, rows: rows)
27
+ puts ""
28
+ puts "Harbr Container Hosts"
29
+ puts ""
30
+ puts table
31
+ puts ""
32
+ end
33
+ end
34
+
35
+ desc "add CONTAINER PORT HOST", "Add a new host"
36
+ def add(container,port, header)
37
+ container = containers.find_by_name(container)
38
+ host = Harbr::Host.new
39
+ host.container_uid = container.uid
40
+ host.port = port
41
+ host.header = header
42
+ hosts.create(host)
43
+ end
44
+
45
+ desc "delete ID", "Delete a host"
46
+ def delete(id)
47
+ host = hosts.get(id)
48
+ host ||= hosts.find_by_header(id)
49
+
50
+ hosts.delete(host) if host
51
+ end
52
+
53
+ desc "update ID HOST_HEADER", "Update a host"
54
+ def update(id, host_header, port)
55
+ host = hosts.get(id)
56
+ host.header = host_header
57
+ host.port = port
58
+ hosts.update(host)
59
+ end
60
+
61
+ desc "list", "List all hosts"
62
+ def list
63
+ display_table(hosts.all)
64
+ end
65
+
66
+ desc "show", "show host for container"
67
+ def show(name)
68
+ container = containers.find_by_name(name)
69
+ display_table(hosts.get_by_container(container))
70
+ end
71
+
72
+ end
73
+
74
+ class Container < Thor
75
+ no_commands do
76
+ def display_table(containers)
77
+ return puts "No containers available." if containers.empty?
78
+
79
+ # Define headers based on Container attributes
80
+ headers = ["Uid","Name", "IP", "Host Headers and Port"]
81
+ rows = containers.map do |container|
82
+ raise "oops" if container.is_a?(Harbr::Host)
83
+
84
+ container&.hosts = hosts&.get_by_container(container)
85
+
86
+ [container.uid,container.name, container.ip, container&.hosts&.map(&:to_s)&.join("\n")]
87
+ end
88
+
89
+ table = ::Terminal::Table.new(headings: headers, rows: rows)
90
+ puts ""
91
+ puts "Harbr Containers"
92
+ puts ""
93
+ puts table
94
+ puts ""
95
+ end
96
+ end
97
+
98
+ attr_reader :containers
99
+ attr_reader :hosts
100
+
101
+ def initialize(a, b, c)
102
+ @containers = Harbr::Container::Repository.new
103
+ @hosts = Harbr::Host::Repository.new
104
+ super(a, b, c)
105
+ end
106
+ desc "add NAME, IP", "Add a new container"
107
+ def add(name,ip)
108
+ container = Harbr::Container.new
109
+ container.name = name
110
+ container.ip = ip
111
+ containers.create(container)
112
+ end
113
+
114
+ desc "delete NAME", "Delete a container"
115
+ def delete(name)
116
+ container = @containers.get(name)
117
+ container = @containers.find_by_name(name) if container.nil?
118
+ if container
119
+ hosts.get_by_container(container).each do |host|
120
+ hosts.delete(host)
121
+ end
122
+ containers.delete(container)
123
+ end
124
+ end
125
+
126
+ desc "update NAME ID", "Update ip address of a container"
127
+ def update(name, ip, port)
128
+ container = @containers.find_by_name(name)
129
+ container.ip = ip
130
+ §§container.port = port
131
+ @containers.update(container) if container
132
+ end
133
+
134
+ desc "list", "List all names"
135
+ def list
136
+ display_table(@containers.all)
137
+ end
138
+
139
+ desc "show", "show container"
140
+ def show(name)
141
+ container = @containers.find_by_name(name)
142
+ display_table([container])
143
+ end
144
+
145
+ end
146
+
4
147
  class HarbrCLI < Thor
148
+ include Thor::Actions
149
+ include Harbr::SSH
150
+
151
+ attr_reader :containers
152
+ attr_reader :hosts
153
+
154
+ def initialize(a, b, c)
155
+ @containers = Harbr::Container::Repository.new
156
+ @hosts = Harbr::Host::Repository.new
157
+ super(a, b, c)
158
+ end
159
+
5
160
  no_commands do
161
+ def render_hosts(container)
162
+ container&.hosts&.map { |host| "Host(`#{host.header}`)" }&.join(" || ")
163
+ end
164
+
165
+ def commit_to_file(container)
166
+
167
+ container.hosts.each do |host|
168
+ filename,contents = generate_traefik_config_with_filename(host.header, container.ip, host.port)
169
+
170
+ on_ssh do |ssh|
171
+ ssh << ("echo '#{contents}' > /etc/traefik/providers/#{filename}")
172
+ end
173
+
174
+ end
175
+
176
+
177
+
178
+ end
179
+
180
+ def generate_traefik_config_with_filename(domain, host, port)
181
+ server_url = "http://#{host}:#{port}"
182
+ service_name = "#{domain.gsub('.', '_')}_#{port}"
183
+ filename = "#{domain.gsub('.', '-')}.toml"
184
+
185
+ erb_template = <<-ERB
186
+ # Traefik Configuration for <%= domain %>
187
+ # Service for <%= domain %>
188
+ # produced by Harbr version #{Harbr::VERSION}
189
+
190
+ # Router for <%= domain %>
191
+ [http.routers.<%= domain.gsub('.', '-') %>]
192
+ rule = "Host(`<%= domain %>`)"
193
+ service = "<%= service_name %>"
194
+ entryPoints = ["http", "https"]
195
+ [http.routers.<%= domain.gsub('.', '-') %>.tls]
196
+ certResolver = "letsencrypt"
197
+
198
+ # Service for <%= domain %>
199
+ [http.services.<%= service_name %>.loadBalancer]
200
+ [[http.services.<%= service_name %>.loadBalancer.servers]]
201
+ url = "<%= server_url %>"
202
+ ERB
203
+
204
+ config_content = ERB.new(erb_template, trim_mode: '-').result(binding)
205
+ return filename, config_content
206
+ end
207
+
208
+
209
+
210
+
6
211
  def display_containers_table(containers)
7
212
  return puts "No containers available." if containers.empty?
8
213
 
@@ -21,13 +226,6 @@ class HarbrCLI < Thor
21
226
  puts ""
22
227
  end
23
228
 
24
- def check_and_create_directory(path)
25
- unless Dir.exist?(path)
26
- puts "Creating directory: #{path}"
27
- FileUtils.mkdir_p(path)
28
- end
29
- end
30
-
31
229
  def command_exists?(command)
32
230
  system("command -v #{command} > /dev/null 2>&1")
33
231
  end
@@ -47,83 +245,6 @@ class HarbrCLI < Thor
47
245
  puts "Installing #{package} using apt..."
48
246
  system("sudo apt install #{package}") or raise "Failed to install #{package}"
49
247
  end
50
-
51
- def create_traefik_config(containers)
52
- config = {
53
- "http" => {
54
- "routers" => {},
55
- "services" => {}
56
- }
57
- }
58
-
59
- containers.each do |container|
60
- container.ip = "127.0.0.1"
61
- name = container.name.tr(".", "-")
62
-
63
- router_key = "#{name}-router-secure"
64
- config["http"]["routers"][router_key] = {
65
- "rule" => "Host(`#{container.host_header}`)",
66
- "service" => "#{name}-service",
67
- "entryPoints" => ["https"],
68
- "tls" => {
69
- "certResolver" => "myresolver"
70
- }
71
- }
72
-
73
- config["http"]["services"]["#{name}-service"] = {
74
- "loadBalancer" => {
75
- "servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
76
- }
77
- }
78
- end
79
-
80
- File.write("/etc/traefik/providers/harbr.toml", TomlRB.dump(config))
81
- puts "Traefik configuration written to /etc/traefik/providers/harbr.toml"
82
- end
83
- end
84
-
85
- desc "destroy", "Destroy a container and remove all traces"
86
- def destroy(name)
87
- puts "Destroying container: #{name}"
88
-
89
- container_repo = Harbr::Container::Repository.new
90
-
91
- ["live.#{name}", "next.#{name}", name].each do |container_name|
92
- container_repo.get_by_name(container_name).each do |container|
93
- `port release #{container.port}`
94
- puts "released port #{container.port} successfully."
95
- container_repo.delete(container)
96
- end
97
-
98
- `rm -rf /etc/service/#{container_name}`
99
- `rm -rf /etc/sv/harbr/#{container_name}`
100
-
101
- puts "Container #{container_name} destroyed successfully."
102
- end
103
-
104
- `rm -rf /var/harbr/containers/#{name}`
105
- `rm -rf /var/log/harbr/#{name}`
106
-
107
- create_traefik_config(container_repo.all)
108
- end
109
-
110
- desc "logs", "Show logs"
111
- def logs
112
- exec "tail -f /var/log/harbr/current"
113
- end
114
-
115
- desc "peek CONTAINER", "Peek in a given container"
116
- method_option :live, type: :boolean, aliases: "-l", desc: "Process in live mode"
117
- method_option :next, type: :boolean, default: true, aliases: "-n", desc: "Process in next mode"
118
- def peek(container)
119
- container_repo = Harbr::Container::Repository.new
120
- container = container_repo.find_by_name(container)
121
- if container
122
- exec "tail -f /var/log/harbr/#{container.name}/live/current" if options[:live]
123
- exec "tail -f /var/log/harbr/#{container.name}/next/current" if options[:next]
124
- else
125
- puts "Container not recognized"
126
- end
127
248
  end
128
249
 
129
250
  desc "setup", "Set up Harbr environment"
@@ -135,87 +256,41 @@ class HarbrCLI < Thor
135
256
  install_with_snap("ruby") unless command_exists?("ruby")
136
257
  install_with_snap("traefik") unless command_exists?("traefik")
137
258
  install_with_apt("runit") unless command_exists?("runit")
259
+ install_with_apt("lxd") unless command_exists?("lxd")
138
260
  install_with_apt("lxc") unless command_exists?("lxc")
139
261
 
140
- Harbr::Lxd::Setup.new.perform("panamax")
141
-
142
262
  puts "Setup completed successfully."
143
263
  end
144
264
 
145
- desc "containers", "show all containers"
146
- def containers
147
- container_repo = Harbr::Container::Repository.new
148
- display_containers_table(container_repo.all)
149
- end
150
-
151
- desc "deploy", "deploy a container to production"
152
- method_option :live, type: :boolean, default: false, aliases: "-l", desc: "deploy to live environment"
153
- method_option :next, type: :boolean, default: false, aliases: "-n", desc: "deploy to next environment"
154
- def deploy(name, version = nil)
155
- if options[:live]
156
- /versions\/(?<version>\d*)/ =~ `ls -l /var/harbr/containers/#{name}/next`
157
- version = $1
158
- raise "Ooops! next version not found!" if version.nil?
159
-
160
- Harbr::Job.perform_async(name, version, "live")
161
-
162
- /versions\/(?<version>\d*)/ =~ `ls -l /var/harbr/containers/#{name}/live`
163
- `ln -sf /var/harbr/containers/#{name}/version/#{$1} /var/harbr/containers/#{name}/rollback`
164
-
165
- puts "deploy version #{version} of #{name} to live environment"
265
+ desc "commit", "commit changes traeffic"
266
+ def commit
267
+
268
+ on_ssh do |ssh|
269
+ ssh << "rm -rf /etc/traefik/providers/*;"
166
270
  end
167
-
168
- if options[:next]
169
- `ln -sf /var/harbr/containers/#{name}/version/#{version} /var/harbr/containers/#{name}/next`
170
- Harbr::Job.perform_async(name, version, "next")
171
- puts "deploy version #{version} of #{name} to next environment"
271
+ containers.all.each do |container|
272
+ container.hosts = hosts.get_by_container(container)
273
+ commit_to_file(container)
172
274
  end
275
+
173
276
  end
174
277
 
175
- desc "containerise", "deploy a container to a lxd comtainer"
176
- method_option :live, type: :boolean, default: false, aliases: "-l", desc: "deploy to live environment"
177
- method_option :next, type: :boolean, default: false, aliases: "-n", desc: "deploy to next environment"
178
- def containerise(name, version = nil)
179
- if options[:live]
180
- /versions\/(?<version>\d*)/ =~ `ls -l /var/harbr/containers/#{name}/next`
181
- version = $1
182
- raise "Ooops! next version not found!" if version.nil?
183
-
184
- Harbr::Lxd::Job.perform_async(name,version, "live",9292)
185
-
186
- /versions\/(?<version>\d*)/ =~ `ls -l /var/harbr/containers/#{name}/live`
187
- `ln -sf /var/harbr/containers/#{name}/version/#{$1} /var/harbr/containers/#{name}/rollback`
188
-
189
- puts "deploy version #{version} of #{name} to live environment"
190
- end
191
-
192
- if options[:next]
193
- `ln -sf /var/harbr/containers/#{name}/version/#{version} /var/harbr/containers/#{name}/next`
194
- Harbr::Lxd::Job.perform_async(name,version,"next",9292)
195
- puts "deploy version #{version} of #{name} to next environment"
196
- end
197
- end
198
-
199
-
200
- desc "rollback", "rollback last deploy"
201
- def rollback(name)
202
- Dir.chdir("/var/harbr/containers/#{name}") do
203
- if File.exist?("rollback")
204
- Dir.chdir("/var/harbr/containers/#{name}/") do
205
- /(?:. * -> (?:.*))/ =~ `ls -l /var/harbr/containers/#{name}/rollback`
206
- `rm -r live`
207
- `ln -sf #{$2} live`
208
- `sv restart live.#{name}`
209
- end
210
- puts "rollback successful"
211
- end
212
- end
278
+ desc "rollback", "rollback changes to traeffic"
279
+ def rollback
213
280
  end
214
281
 
215
282
  desc "update", "update to the latest version of harbr"
216
283
  def update
217
284
  system "gem update harbr"
218
285
  end
286
+
287
+ # Registering the Host subcommand
288
+ desc "host", "Manage hosts"
289
+ subcommand "host", Host
290
+
291
+ # Registering the Host subcommand
292
+ desc "container", "Manage containers"
293
+ subcommand "container", Container
219
294
  end
220
295
 
221
296
  HarbrCLI.start(ARGV)
@@ -0,0 +1,13 @@
1
+ # Dynamic configuration
2
+ [http.routers]
3
+ [http.routers.sild]
4
+ rule = "Host(`sild.harbr.zero2one.ee`) || Host(`next.sild.harbr.zero2one.ee`)"
5
+ service = "sild"
6
+ entryPoints = ["http", "https"]
7
+ [http.routers.sild.tls]
8
+ certResolver = "myresolver"
9
+
10
+ [http.services]
11
+ [http.services.sild.loadBalancer]
12
+ [[http.services.sild.loadBalancer.servers]]
13
+ url = "http://10.189.96.89"
@@ -1,19 +1,23 @@
1
1
  module Harbr
2
2
  class Container
3
3
  include Dddr::Entity
4
- attr_accessor :name, :host_header, :ip, :port
5
4
 
6
- queries do
7
- def find_by_header(host_header)
8
- all.find { |container| container.host_header.downcase == host_header.downcase }
9
- end
5
+ def initialize
6
+ @hosts = []
7
+ @ports = []
8
+ end
10
9
 
11
- def find_by_name(name)
12
- all.find { |container| container.name.downcase == name.downcase }
13
- end
10
+ attr_accessor :name, :ip
11
+
12
+ attr_writer :hosts
13
+ attr_reader :hosts
14
+
15
+ attr_writer :ports
16
+ attr_reader :ports
14
17
 
15
- def get_by_name(name)
16
- all.select { |container| container.name.downcase.include? name.downcase }
18
+ queries do
19
+ def find_by_name(name)
20
+ all.find { |container| container.name.to_s.downcase == name.to_s.downcase }
17
21
  end
18
22
  end
19
23
  end
data/lib/harbr/host.rb ADDED
@@ -0,0 +1,21 @@
1
+ module Harbr
2
+ class Host
3
+ include Dddr::Entity
4
+ attr_accessor :header,:container_uid,:port
5
+
6
+ def to_s
7
+ "#{port} -> #{header}"
8
+ end
9
+
10
+ queries do
11
+ def find_by_header(header)
12
+ all.find { |host| host.header == header }
13
+ end
14
+
15
+ def get_by_container(container)
16
+ all.select { |host| host.container_uid == container.uid}
17
+ end
18
+
19
+ end
20
+ end
21
+ end
data/lib/harbr/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Harbr
4
- VERSION = "0.2.10"
4
+ VERSION = "2.8.1"
5
5
  end
data/lib/harbr.rb CHANGED
@@ -7,22 +7,37 @@ require "fileutils"
7
7
  require "ostruct"
8
8
  require "sucker_punch"
9
9
  require "resend"
10
+ require "net/ssh"
10
11
 
11
12
  require_relative "harbr/version"
12
13
  require_relative "harbr/container"
13
- require_relative "harbr/job"
14
- require_relative "harbr/lxd/job"
15
- require_relative "harbr/lxd/setup"
16
-
14
+ require_relative "harbr/host"
17
15
 
18
16
 
19
17
  # Harbr module for managing containers, jobs, ports, and 2s
20
18
  module Harbr
21
- DEFAULT_DIRECTORY = "/var/harbr/containers"
19
+ DEFAULT_DIRECTORY = "~/.config/harbr"
22
20
  DEFAULT_DIRECTORY_DATA_DIR = "#{DEFAULT_DIRECTORY}/.data"
23
21
 
24
22
  Dddr.configure do |config|
25
- config.data_dir = DEFAULT_DIRECTORY_DATA_DIR
23
+ config.container = "harbr"
24
+ end
25
+
26
+ module SSH
27
+ def on_ssh
28
+ command = ""
29
+ command = yield command
30
+ hostname = "smtp.laki.zero2one.ee"
31
+ username = "root"
32
+ key_path = "/Users/db/.ssh/id_rsa" # Replace with the path to your private SSH key
33
+ Net::SSH.start(hostname, username, keys: [key_path]) do |ssh|
34
+ ssh.exec!(command)
35
+ end
36
+ rescue => e
37
+ puts "Error: #{e.class}"
38
+ puts "backtrace: #{e.backtrace.join('\n')}"
39
+ puts "Error sending notification: #{e.message}"
40
+ end
26
41
  end
27
42
 
28
43
  class Error < StandardError; end
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,3 @@
1
+ # For available configuration options, see:
2
+ # https://github.com/testdouble/standard
3
+ ruby_version: 2.6
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2023-10-29
4
+
5
+ - Initial release
@@ -0,0 +1,84 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
8
+
9
+ ## Our Standards
10
+
11
+ Examples of behavior that contributes to a positive environment for our community include:
12
+
13
+ * Demonstrating empathy and kindness toward other people
14
+ * Being respectful of differing opinions, viewpoints, and experiences
15
+ * Giving and gracefully accepting constructive feedback
16
+ * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
17
+ * Focusing on what is best not just for us as individuals, but for the overall community
18
+
19
+ Examples of unacceptable behavior include:
20
+
21
+ * The use of sexualized language or imagery, and sexual attention or
22
+ advances of any kind
23
+ * Trolling, insulting or derogatory comments, and personal or political attacks
24
+ * Public or private harassment
25
+ * Publishing others' private information, such as a physical or email
26
+ address, without their explicit permission
27
+ * Other conduct which could reasonably be considered inappropriate in a
28
+ professional setting
29
+
30
+ ## Enforcement Responsibilities
31
+
32
+ Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
33
+
34
+ Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
35
+
36
+ ## Scope
37
+
38
+ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
39
+
40
+ ## Enforcement
41
+
42
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at delaney@vidtreone.com. All complaints will be reviewed and investigated promptly and fairly.
43
+
44
+ All community leaders are obligated to respect the privacy and security of the reporter of any incident.
45
+
46
+ ## Enforcement Guidelines
47
+
48
+ Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
49
+
50
+ ### 1. Correction
51
+
52
+ **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
53
+
54
+ **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
55
+
56
+ ### 2. Warning
57
+
58
+ **Community Impact**: A violation through a single incident or series of actions.
59
+
60
+ **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
61
+
62
+ ### 3. Temporary Ban
63
+
64
+ **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
65
+
66
+ **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
67
+
68
+ ### 4. Permanent Ban
69
+
70
+ **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
71
+
72
+ **Consequence**: A permanent ban from any sort of public interaction within the community.
73
+
74
+ ## Attribution
75
+
76
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
77
+ available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
78
+
79
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
80
+
81
+ [homepage]: https://www.contributor-covenant.org
82
+
83
+ For answers to common questions about this code of conduct, see the FAQ at
84
+ https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.