aspera-cli 4.27.1 → 4.27.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +67 -1
  4. data/bin/ascli +2 -1
  5. data/docs/README.md +805 -747
  6. data/lib/aspera/agent/connect.rb +6 -4
  7. data/lib/aspera/agent/desktop.rb +2 -2
  8. data/lib/aspera/agent/direct.rb +3 -1
  9. data/lib/aspera/agent/node.rb +3 -3
  10. data/lib/aspera/api/alee.rb +1 -1
  11. data/lib/aspera/api/aoc.rb +14 -12
  12. data/lib/aspera/api/ats.rb +1 -1
  13. data/lib/aspera/api/cos_node.rb +2 -2
  14. data/lib/aspera/api/faspex.rb +9 -7
  15. data/lib/aspera/api/httpgw.rb +37 -33
  16. data/lib/aspera/api/node.rb +38 -33
  17. data/lib/aspera/ascmd.rb +3 -1
  18. data/lib/aspera/ascp/installation.rb +62 -27
  19. data/lib/aspera/ascp/management.rb +1 -0
  20. data/lib/aspera/assert.rb +4 -0
  21. data/lib/aspera/cli/ascp_actions.rb +20 -41
  22. data/lib/aspera/cli/async_transfer_store.rb +2 -2
  23. data/lib/aspera/cli/bootstrapper.rb +11 -15
  24. data/lib/aspera/cli/command_line.rb +252 -0
  25. data/lib/aspera/cli/command_registry.rb +149 -33
  26. data/lib/aspera/cli/command_spec.rb +103 -14
  27. data/lib/aspera/cli/completion/ascli.bash +12 -0
  28. data/lib/aspera/cli/completion/ascli.fish +16 -0
  29. data/lib/aspera/cli/completion/ascli.zsh +19 -0
  30. data/lib/aspera/cli/context.rb +3 -0
  31. data/lib/aspera/cli/deprecation.rb +37 -0
  32. data/lib/aspera/cli/extended_value.rb +2 -0
  33. data/lib/aspera/cli/formatter.rb +87 -75
  34. data/lib/aspera/cli/gem_checker.rb +1 -1
  35. data/lib/aspera/cli/hints.rb +7 -6
  36. data/lib/aspera/cli/http.rb +21 -21
  37. data/lib/aspera/cli/info.rb +3 -0
  38. data/lib/aspera/cli/mcp_tool.rb +47 -83
  39. data/lib/aspera/cli/option_declarator.rb +33 -42
  40. data/lib/aspera/cli/option_registry.rb +69 -0
  41. data/lib/aspera/cli/option_types.rb +103 -0
  42. data/lib/aspera/cli/option_value.rb +281 -0
  43. data/lib/aspera/cli/options.schema.yaml +38 -5
  44. data/lib/aspera/cli/parser.rb +307 -848
  45. data/lib/aspera/cli/plugins/alee.rb +7 -4
  46. data/lib/aspera/cli/plugins/aoc.rb +435 -380
  47. data/lib/aspera/cli/plugins/ats.rb +58 -73
  48. data/lib/aspera/cli/plugins/base.rb +190 -240
  49. data/lib/aspera/cli/plugins/basic_auth.rb +2 -10
  50. data/lib/aspera/cli/plugins/config.rb +244 -178
  51. data/lib/aspera/cli/plugins/console.rb +102 -38
  52. data/lib/aspera/cli/plugins/cos.rb +6 -23
  53. data/lib/aspera/cli/plugins/factory.rb +3 -0
  54. data/lib/aspera/cli/plugins/faspex5.rb +176 -173
  55. data/lib/aspera/cli/plugins/faspio.rb +5 -10
  56. data/lib/aspera/cli/plugins/httpgw.rb +8 -11
  57. data/lib/aspera/cli/plugins/mcp.rb +20 -55
  58. data/lib/aspera/cli/plugins/node.rb +277 -311
  59. data/lib/aspera/cli/plugins/orchestrator.rb +90 -77
  60. data/lib/aspera/cli/plugins/preview.rb +79 -90
  61. data/lib/aspera/cli/plugins/server.rb +76 -50
  62. data/lib/aspera/cli/plugins/shares.rb +68 -116
  63. data/lib/aspera/cli/preset_actions.rb +17 -10
  64. data/lib/aspera/cli/preset_manager.rb +12 -2
  65. data/lib/aspera/cli/prompt.rb +35 -0
  66. data/lib/aspera/cli/result.rb +13 -18
  67. data/lib/aspera/cli/runner.rb +31 -54
  68. data/lib/aspera/cli/special_values.rb +5 -0
  69. data/lib/aspera/cli/sync_actions.rb +41 -37
  70. data/lib/aspera/cli/terminal_formatter.rb +9 -3
  71. data/lib/aspera/cli/transfer_actions.rb +0 -6
  72. data/lib/aspera/cli/transfer_agent.rb +29 -35
  73. data/lib/aspera/cli/vault_manager.rb +0 -17
  74. data/lib/aspera/cli/version.rb +1 -1
  75. data/lib/aspera/cli/wizard.rb +4 -2
  76. data/lib/aspera/command_line_builder.rb +1 -0
  77. data/lib/aspera/coverage.rb +1 -0
  78. data/lib/aspera/environment.rb +7 -1
  79. data/lib/aspera/faspex_gw.rb +2 -1
  80. data/lib/aspera/faspex_postproc.rb +1 -0
  81. data/lib/aspera/graphql.rb +5 -5
  82. data/lib/aspera/json_rpc/client.rb +5 -5
  83. data/lib/aspera/keychain/encrypted_hash.rb +1 -1
  84. data/lib/aspera/keychain/one_password_api.rb +1 -1
  85. data/lib/aspera/link_header.rb +2 -2
  86. data/lib/aspera/log.rb +22 -25
  87. data/lib/aspera/markdown.rb +2 -0
  88. data/lib/aspera/mime.rb +25 -0
  89. data/lib/aspera/node_simulator.rb +1 -0
  90. data/lib/aspera/oauth/base.rb +35 -25
  91. data/lib/aspera/oauth/factory.rb +1 -0
  92. data/lib/aspera/oauth/generic.rb +1 -1
  93. data/lib/aspera/oauth/jwt.rb +1 -1
  94. data/lib/aspera/oauth/web.rb +9 -8
  95. data/lib/aspera/preview/file_types.rb +4 -4
  96. data/lib/aspera/preview/generator.rb +7 -0
  97. data/lib/aspera/preview/options.rb +4 -4
  98. data/lib/aspera/preview/terminal.rb +4 -3
  99. data/lib/aspera/preview/utils.rb +9 -6
  100. data/lib/aspera/products/connect.rb +1 -1
  101. data/lib/aspera/rainbow.rb +7 -0
  102. data/lib/aspera/rest/aspera_errors.rb +60 -0
  103. data/lib/aspera/rest/call_error.rb +27 -0
  104. data/lib/aspera/rest/client.rb +514 -0
  105. data/lib/aspera/rest/error_analyzer.rb +113 -0
  106. data/lib/aspera/rest/list.rb +143 -0
  107. data/lib/aspera/rest/parameters.rb +55 -0
  108. data/lib/aspera/rest/util.rb +176 -0
  109. data/lib/aspera/rest.rb +7 -621
  110. data/lib/aspera/schema/IBM Aspera Console-enhanced.yaml +1125 -0
  111. data/lib/aspera/schema/IBM Aspera on Cloud API-0.2.6-enhanced.yaml +39 -0
  112. data/lib/aspera/schema/IBM Aspera on Cloud Automation API-1.0.5-enhanced.yaml +2395 -0
  113. data/lib/aspera/schema/documentation.rb +13 -3
  114. data/lib/aspera/schema/registry.rb +18 -1
  115. data/lib/aspera/schema/validator.rb +92 -0
  116. data/lib/aspera/secret_hider.rb +36 -25
  117. data/lib/aspera/string_ext.rb +15 -0
  118. data/lib/aspera/temp_file_manager.rb +6 -5
  119. data/lib/aspera/transfer/parameters.rb +2 -0
  120. data/lib/aspera/transfer/spec.rb +1 -0
  121. data/lib/aspera/transfer/spec.schema.yaml +1 -0
  122. data/lib/aspera/uri_reader.rb +11 -11
  123. data/lib/aspera/web_auth/index.html +147 -0
  124. data/lib/aspera/web_auth/server.rb +81 -0
  125. data.tar.gz.sig +0 -0
  126. metadata +39 -7
  127. metadata.gz.sig +0 -0
  128. data/lib/aspera/colors.rb +0 -79
  129. data/lib/aspera/rest_call_error.rb +0 -25
  130. data/lib/aspera/rest_error_analyzer.rb +0 -111
  131. data/lib/aspera/rest_errors_aspera.rb +0 -58
  132. data/lib/aspera/rest_list.rb +0 -136
  133. data/lib/aspera/web_auth.rb +0 -211
@@ -1,211 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'aspera/web_server_simple'
4
- require 'aspera/assert'
5
- require 'erb'
6
-
7
- module Aspera
8
- # servlet called on callback: it records the callback request
9
- class WebAuthServlet < WEBrick::HTTPServlet::AbstractServlet
10
- # @param server [WEBrick::HTTPServer] the HTTP server instance
11
- # @param web_auth [WebAuth] the WebAuth instance to record the callback
12
- def initialize(server, web_auth)
13
- Log.log.debug('WebAuthServlet initialize')
14
- super(server)
15
- @web_auth = web_auth
16
- end
17
-
18
- def service(request, response)
19
- Log.log.debug { "received request from browser #{request.request_method} #{request.path}" }
20
- Aspera.assert_values(request.request_method, ['GET'], type: WEBrick::HTTPStatus::MethodNotAllowed) { 'HTTP verb' }
21
- additional_info = @web_auth.signal_request(request)
22
- response.status = 200
23
- response.content_type = 'text/html'
24
- response.body = <<~HTML
25
- <!DOCTYPE html>
26
- <html lang="en">
27
- <head>
28
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
29
- <link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIiBmaWxsPSJub25lIiBzdHJva2U9IiMyMjIiIHN0cm9rZS13aWR0aD0iMyI+CiAgPGxpbmUgeDE9IjMiIHkxPSIzIiB4Mj0iMjkiIHkyPSIyOSIgIHN0cm9rZT0icmVkIi8+CiAgPGxpbmUgeDE9IjI5IiB5MT0iMyIgeDI9IjMiIHkyPSIyOSIgc3Ryb2tlPSJyZWQiIC8+Cjwvc3ZnPg==" type="image/svg+xml">
30
- <title>Close Now</title>
31
- <style>
32
- body {
33
- font-family: Arial, sans-serif;
34
- text-align: center;
35
- padding: 2rem;
36
- margin: 0;
37
- background: linear-gradient(135deg, #f0f4f8, #d9e2ec);
38
- color: #333;
39
- overflow: hidden; /* Ensure no scrollbars for the background animation */
40
- position: relative;
41
- }
42
- h1 {
43
- font-size: 2.5rem;
44
- color: #0078d4;
45
- }
46
- p {
47
- font-size: 1.2rem;
48
- margin-top: 1rem;
49
- }
50
-
51
- /* Styling for animated IBM logos */
52
- .logo {
53
- position: absolute;
54
- bottom: -100px;
55
- width: 40px;
56
- height: 40px;
57
- background: none;
58
- display: flex;
59
- justify-content: center;
60
- align-items: center;
61
- animation: rise 10s infinite ease-in-out;
62
- }
63
-
64
- .logo svg {
65
- width: 100%;
66
- height: 100%;
67
- }
68
-
69
- .logo:nth-child(odd) {
70
- animation-duration: 8s;
71
- }
72
-
73
- .logo:nth-child(even) {
74
- animation-duration: 12s;
75
- }
76
-
77
- @keyframes rise {
78
- 0% {
79
- transform: translateY(0) scale(1);
80
- opacity: 1;
81
- }
82
- 50% {
83
- opacity: 0.7;
84
- }
85
- 100% {
86
- transform: translateY(-120vh) scale(0.7);
87
- opacity: 0;
88
- }
89
- }
90
- </style>
91
- </head>
92
- <body>
93
- <h1>Thank You!</h1>
94
- <p>You can close this window.</p>
95
- <p>#{ERB::Util.html_escape(additional_info) unless additional_info.nil?}</p>
96
-
97
- <!-- JavaScript to generate IBM logos -->
98
- <script>
99
- // Function to create logos dynamically
100
- function createLogos() {
101
- const body = document.body;
102
- const svgContent = `
103
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000px" height="401.149px" viewBox="0 0 1000 401.149" xml:space="preserve">
104
- <g>
105
- <rect fill="#1F70C1" x="0" y="373.217" width="194.433" height="27.833"/>
106
- <rect fill="#1F70C1" x="0" y="319.83" width="194.433" height="27.931"/>
107
- <rect fill="#1F70C1" x="55.468" y="266.541" width="83.399" height="27.932"/>
108
- <rect fill="#1F70C1" x="55.468" y="213.253" width="83.399" height="27.932"/>
109
- <rect fill="#1F70C1" x="55.468" y="159.964" width="83.399" height="27.932"/>
110
- <rect fill="#1F70C1" x="55.468" y="106.577" width="83.399" height="27.932"/>
111
- <rect fill="#1F70C1" x="0" y="53.288" width="194.433" height="27.932"/>
112
- <rect fill="#1F70C1" x="0" y="0" width="194.433" height="27.932"/>
113
- <path fill="#1F70C1" d="M222.167,347.761h299.029c5.051-8.617,8.815-18.027,11.094-27.932H222.167V347.761z"/>
114
- <path fill="#1F70C1" d="M497.92,213.253H277.734v27.932h243.463C514.857,230.487,507.032,221.078,497.92,213.253z"/>
115
- <path fill="#1F70C1" d="M277.734,159.964v27.932H497.92c9.311-7.825,17.135-17.235,23.277-27.932H277.734z"/>
116
- <path fill="#1F70C1" d="M521.197,53.288H222.167V81.22H532.29C529.715,71.315,525.951,61.906,521.197,53.288z"/>
117
- <path fill="#1F70C1" d="M429.279,0H222.167v27.932h278.526C482.072,10.697,456.815,0,429.279,0z"/>
118
- <rect fill="#1F70C1" x="277.734" y="106.577" width="83.3" height="27.932"/>
119
- <path fill="#1F70C1" d="M444.433,134.509h87.163c2.476-8.914,3.764-18.324,3.764-27.932h-90.927z"/>
120
- <rect fill="#1F70C1" x="277.734" y="266.541" width="83.3" height="27.932"/>
121
- <path fill="#1F70C1" d="M444.433,266.541v27.932h90.927c0-9.608-1.288-19.017-3.764-27.932H444.433z"/>
122
- <path fill="#1F70C1" d="M222.167,400.852h207.112c27.734,0,52.793-10.697,71.513-27.932H222.167V400.852z"/>
123
- <rect fill="#1F70C1" x="555.567" y="373.217" width="138.866" height="27.833"/>
124
- <rect fill="#1F70C1" x="555.567" y="319.83" width="138.866" height="27.931"/>
125
- <rect fill="#1F70C1" x="611.034" y="266.541" width="83.399" height="27.932"/>
126
- <rect fill="#1F70C1" x="611.034" y="213.253" width="83.399" height="27.932"/>
127
- <polygon fill="#1F70C1" points="733.063,53.288 555.567,53.288 555.567,81.22 742.67,81.22"/>
128
- <polygon fill="#1F70C1" points="714.639,0 555.567,0 555.567,27.932 724.247,27.932"/>
129
- <rect fill="#1F70C1" x="861.034" y="373.217" width="138.866" height="27.833"/>
130
- <rect fill="#1F70C1" x="861.034" y="319.83" width="138.866" height="27.931"/>
131
- <rect fill="#1F70C1" x="861.034" y="266.541" width="83.399" height="27.932"/>
132
- <rect fill="#1F70C1" x="861.034" y="213.253" width="83.399" height="27.932"/>
133
- <polygon fill="#1F70C1" points="861.034,187.896 944.433,187.896 944.433,159.964 861.034,159.964 694.433,159.964 611.034,159.964 611.034,187.896 694.433,187.896 852.219,187.896"/>
134
- <polygon fill="#1F70C1" points="944.433,106.577 803.982,106.577 794.374,134.509 944.433,134.509"/>
135
- <polygon fill="#1F70C1" points="840.927,0 831.319,27.932 1000,27.932 1000,0"/>
136
- <polygon fill="#1F70C1" points="777.734,400.852 787.341,373.217 768.126,373.217"/>
137
- <polygon fill="#1F70C1" points="759.311,347.761 796.157,347.761 806.062,319.83 749.505,319.83"/>
138
- <polygon fill="#1F70C1" points="740.59,294.473 814.877,294.473 824.683,266.541 730.784,266.541"/>
139
- <polygon fill="#1F70C1" points="721.969,241.185 833.597,241.185 843.106,213.253 712.361,213.253"/>
140
- <polygon fill="#1F70C1" points="611.034,134.509 761.093,134.509 751.486,106.577 611.034,106.577"/>
141
- <polygon fill="#1F70C1" points="812.896,81.22 1000,81.22 1000,53.288 822.405,53.288"/>
142
- </g>
143
- </svg>
144
- `;
145
- for (let i = 0; i < 20; i++) {
146
- const logo = document.createElement('div');
147
- logo.className = 'logo';
148
- const size = Math.random() * 30 + 20; // Random size between 20px and 50px
149
- logo.style.width = `${size}px`;
150
- logo.style.height = `${size}px`;
151
- logo.style.left = `${Math.random() * 100}vw`;
152
- logo.style.animationDelay = `${Math.random() * 5}s`;
153
- logo.innerHTML = svgContent;
154
- body.appendChild(logo);
155
- }
156
- }
157
-
158
- // Call the function to create logos on load
159
- createLogos();
160
- </script>
161
- </body>
162
- </html>
163
- HTML
164
-
165
- return
166
- end
167
- end
168
-
169
- # start a local web server
170
- # then start a browser that will callback the local server upon authentication
171
- # store the final query
172
- class WebAuth < WebServerSimple
173
- # @param endpoint_url [String] e.g. 'https://127.0.0.1:12345'
174
- # @param additional_info [String] Information in web page
175
- def initialize(endpoint_url, additional_info = nil)
176
- uri = URI.parse(endpoint_url)
177
- super(uri)
178
- @mutex = Mutex.new
179
- @cond = ConditionVariable.new
180
- @expected_path = uri.path.empty? ? '/' : uri.path
181
- @query = nil
182
- @additional_info = additional_info
183
- # last argument (self) is provided to constructor of servlet
184
- mount(@expected_path, WebAuthServlet, self)
185
- # server runs in thread
186
- Thread.new { start }
187
- end
188
-
189
- # Called by web server thread on received request
190
- # @return [String] additional information for web page
191
- def signal_request(request)
192
- raise WEBrick::HTTPStatus::NotFound, "unexpected path: #{request.path}" unless request.path.eql?(@expected_path)
193
- # acquire lock and signal change
194
- @mutex.synchronize do
195
- @query = request.query
196
- @cond.signal
197
- end
198
- return @additional_info
199
- end
200
-
201
- # wait for request on web server (main thread)
202
- # @return [Hash] the query
203
- def received_request
204
- # wait for signal from thread
205
- @mutex.synchronize { @cond.wait(@mutex) }
206
- # tell server thread to stop
207
- shutdown
208
- return @query
209
- end
210
- end
211
- end