makit 0.0.157 → 0.0.158
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +41 -41
- data/exe/makit +5 -5
- data/lib/makit/apache.rb +28 -28
- data/lib/makit/auto.rb +48 -48
- data/lib/makit/azure/blob_storage.rb +257 -257
- data/lib/makit/azure/cli.rb +284 -284
- data/lib/makit/cli/base.rb +17 -17
- data/lib/makit/cli/build_commands.rb +500 -500
- data/lib/makit/cli/generators/base_generator.rb +74 -74
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
- data/lib/makit/cli/generators/generator_factory.rb +49 -49
- data/lib/makit/cli/generators/node_generator.rb +50 -50
- data/lib/makit/cli/generators/ruby_generator.rb +77 -77
- data/lib/makit/cli/generators/rust_generator.rb +50 -50
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -41
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
- data/lib/makit/cli/main.rb +78 -78
- data/lib/makit/cli/pipeline_commands.rb +311 -311
- data/lib/makit/cli/project_commands.rb +868 -868
- data/lib/makit/cli/repository_commands.rb +661 -661
- data/lib/makit/cli/strategy_commands.rb +207 -207
- data/lib/makit/cli/utility_commands.rb +521 -521
- data/lib/makit/commands/factory.rb +359 -359
- data/lib/makit/commands/middleware/base.rb +73 -73
- data/lib/makit/commands/middleware/cache.rb +248 -248
- data/lib/makit/commands/middleware/command_logger.rb +312 -312
- data/lib/makit/commands/middleware/validator.rb +269 -269
- data/lib/makit/commands/request.rb +316 -316
- data/lib/makit/commands/result.rb +323 -323
- data/lib/makit/commands/runner.rb +386 -386
- data/lib/makit/commands/strategies/base.rb +171 -171
- data/lib/makit/commands/strategies/child_process.rb +162 -162
- data/lib/makit/commands/strategies/factory.rb +136 -136
- data/lib/makit/commands/strategies/synchronous.rb +139 -139
- data/lib/makit/commands.rb +50 -50
- data/lib/makit/configuration/dotnet_project.rb +48 -48
- data/lib/makit/configuration/gitlab_helper.rb +61 -61
- data/lib/makit/configuration/project.rb +292 -292
- data/lib/makit/configuration/rakefile_helper.rb +43 -43
- data/lib/makit/configuration/step.rb +34 -34
- data/lib/makit/configuration/timeout.rb +74 -74
- data/lib/makit/configuration.rb +21 -21
- data/lib/makit/content/default_gitignore.rb +7 -7
- data/lib/makit/content/default_gitignore.txt +225 -225
- data/lib/makit/content/default_rakefile.rb +13 -13
- data/lib/makit/content/gem_rakefile.rb +16 -16
- data/lib/makit/context.rb +1 -1
- data/lib/makit/data.rb +49 -49
- data/lib/makit/directories.rb +170 -170
- data/lib/makit/directory.rb +262 -262
- data/lib/makit/docs/files.rb +89 -89
- data/lib/makit/docs/rake.rb +102 -102
- data/lib/makit/dotnet/cli.rb +69 -69
- data/lib/makit/dotnet/project.rb +217 -217
- data/lib/makit/dotnet/solution.rb +38 -38
- data/lib/makit/dotnet/solution_classlib.rb +239 -239
- data/lib/makit/dotnet/solution_console.rb +264 -264
- data/lib/makit/dotnet/solution_maui.rb +354 -354
- data/lib/makit/dotnet/solution_wasm.rb +275 -275
- data/lib/makit/dotnet/solution_wpf.rb +304 -304
- data/lib/makit/dotnet.rb +102 -102
- data/lib/makit/email.rb +90 -90
- data/lib/makit/environment.rb +142 -142
- data/lib/makit/examples/runner.rb +370 -370
- data/lib/makit/exceptions.rb +45 -45
- data/lib/makit/fileinfo.rb +32 -32
- data/lib/makit/files.rb +43 -43
- data/lib/makit/gems.rb +40 -40
- data/lib/makit/git/cli.rb +78 -54
- data/lib/makit/git/repository.rb +100 -100
- data/lib/makit/git.rb +104 -104
- data/lib/makit/gitlab/pipeline.rb +857 -857
- data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
- data/lib/makit/gitlab_runner.rb +59 -59
- data/lib/makit/humanize.rb +218 -218
- data/lib/makit/indexer.rb +47 -47
- data/lib/makit/io/filesystem.rb +111 -111
- data/lib/makit/io/filesystem_service_impl.rb +337 -337
- data/lib/makit/lint.rb +212 -212
- data/lib/makit/logging/configuration.rb +309 -309
- data/lib/makit/logging/format_registry.rb +84 -84
- data/lib/makit/logging/formatters/base.rb +39 -39
- data/lib/makit/logging/formatters/console_formatter.rb +140 -140
- data/lib/makit/logging/formatters/json_formatter.rb +65 -65
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
- data/lib/makit/logging/formatters/text_formatter.rb +64 -64
- data/lib/makit/logging/log_request.rb +119 -119
- data/lib/makit/logging/logger.rb +199 -199
- data/lib/makit/logging/sinks/base.rb +91 -91
- data/lib/makit/logging/sinks/console.rb +72 -72
- data/lib/makit/logging/sinks/file_sink.rb +92 -92
- data/lib/makit/logging/sinks/structured.rb +123 -123
- data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
- data/lib/makit/logging.rb +578 -578
- data/lib/makit/markdown.rb +75 -75
- data/lib/makit/mp/basic_object_mp.rb +17 -17
- data/lib/makit/mp/command_mp.rb +13 -13
- data/lib/makit/mp/command_request.mp.rb +17 -17
- data/lib/makit/mp/project_mp.rb +199 -199
- data/lib/makit/mp/string_mp.rb +205 -205
- data/lib/makit/nuget.rb +74 -74
- data/lib/makit/podman/podman.rb +458 -458
- data/lib/makit/podman/podman_service_impl.rb +1081 -1081
- data/lib/makit/port.rb +32 -32
- data/lib/makit/process.rb +377 -377
- data/lib/makit/protoc.rb +112 -112
- data/lib/makit/rake/cli.rb +196 -196
- data/lib/makit/rake/trace_controller.rb +174 -174
- data/lib/makit/rake.rb +81 -81
- data/lib/makit/ruby/cli.rb +185 -185
- data/lib/makit/ruby.rb +25 -25
- data/lib/makit/rubygems.rb +137 -0
- data/lib/makit/secrets/azure_key_vault.rb +322 -322
- data/lib/makit/secrets/azure_secrets.rb +183 -183
- data/lib/makit/secrets/local_secrets.rb +72 -72
- data/lib/makit/secrets/secrets_manager.rb +105 -105
- data/lib/makit/secrets.rb +16 -16
- data/lib/makit/serializer.rb +130 -130
- data/lib/makit/services/builder.rb +186 -186
- data/lib/makit/services/error_handler.rb +226 -226
- data/lib/makit/services/repository_manager.rb +367 -367
- data/lib/makit/services/validator.rb +112 -112
- data/lib/makit/setup/classlib.rb +101 -101
- data/lib/makit/setup/gem.rb +268 -268
- data/lib/makit/setup/pages.rb +11 -11
- data/lib/makit/setup/razorclasslib.rb +101 -101
- data/lib/makit/setup/runner.rb +54 -54
- data/lib/makit/setup.rb +5 -5
- data/lib/makit/show.rb +110 -110
- data/lib/makit/storage.rb +126 -126
- data/lib/makit/symbols.rb +175 -175
- data/lib/makit/task_info.rb +130 -130
- data/lib/makit/tasks/at_exit.rb +15 -15
- data/lib/makit/tasks/build.rb +22 -22
- data/lib/makit/tasks/bump.rb +7 -7
- data/lib/makit/tasks/clean.rb +13 -13
- data/lib/makit/tasks/configure.rb +10 -10
- data/lib/makit/tasks/format.rb +10 -10
- data/lib/makit/tasks/hook_manager.rb +443 -443
- data/lib/makit/tasks/info.rb +368 -368
- data/lib/makit/tasks/init.rb +49 -49
- data/lib/makit/tasks/integrate.rb +60 -56
- data/lib/makit/tasks/pull_incoming.rb +13 -13
- data/lib/makit/tasks/secrets.rb +7 -7
- data/lib/makit/tasks/setup.rb +16 -16
- data/lib/makit/tasks/sync.rb +14 -17
- data/lib/makit/tasks/tag.rb +27 -27
- data/lib/makit/tasks/task_monkey_patch.rb +81 -81
- data/lib/makit/tasks/test.rb +22 -22
- data/lib/makit/tasks/update.rb +18 -18
- data/lib/makit/tasks/version.rb +6 -6
- data/lib/makit/tasks.rb +24 -24
- data/lib/makit/test_cache.rb +239 -239
- data/lib/makit/tree.rb +37 -37
- data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
- data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
- data/lib/makit/v1/makit.v1_pb.rb +35 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
- data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
- data/lib/makit/version.rb +661 -503
- data/lib/makit/version_util.rb +21 -21
- data/lib/makit/wix.rb +95 -95
- data/lib/makit/yaml.rb +29 -29
- data/lib/makit/zip.rb +17 -17
- data/lib/makit copy.rb +44 -44
- data/lib/makit.rb +115 -114
- metadata +3 -2
|
@@ -1,183 +1,183 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "azure_key_vault"
|
|
4
|
-
|
|
5
|
-
module Makit
|
|
6
|
-
module Secrets
|
|
7
|
-
# Azure Key Vault adapter that implements the LocalSecrets interface
|
|
8
|
-
# Uses Azure CLI to store and retrieve individual secrets
|
|
9
|
-
class AzureSecrets
|
|
10
|
-
def initialize(keyvault_name: nil, secret_prefix: nil)
|
|
11
|
-
@keyvault_name = keyvault_name || AzureKeyVault.keyvault_name
|
|
12
|
-
@secret_prefix = secret_prefix || AzureKeyVault.secret_prefix
|
|
13
|
-
raise "Azure Key Vault name is required" if @keyvault_name.nil? || @keyvault_name.empty?
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def add(key, value)
|
|
17
|
-
set(key, value)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def remove(key)
|
|
21
|
-
secret_name = build_secret_name(key)
|
|
22
|
-
return true unless secret_exists?(secret_name)
|
|
23
|
-
|
|
24
|
-
unless AzureKeyVault.azure_cli_authenticated?
|
|
25
|
-
raise "Azure CLI is not authenticated. Run 'az login' first"
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
cmd = [
|
|
29
|
-
"az keyvault secret delete",
|
|
30
|
-
"--vault-name '#{@keyvault_name}'",
|
|
31
|
-
"--name '#{secret_name}'",
|
|
32
|
-
"2>&1"
|
|
33
|
-
].join(" ")
|
|
34
|
-
|
|
35
|
-
output = `#{cmd}`
|
|
36
|
-
exit_code = $?.exitstatus
|
|
37
|
-
|
|
38
|
-
if exit_code != 0
|
|
39
|
-
raise "Failed to delete secret '#{secret_name}': #{output}"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
true
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def has_key?(key)
|
|
46
|
-
secret_name = build_secret_name(key)
|
|
47
|
-
secret_exists?(secret_name)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def get(key)
|
|
51
|
-
secret_name = build_secret_name(key)
|
|
52
|
-
return nil unless secret_exists?(secret_name)
|
|
53
|
-
|
|
54
|
-
unless AzureKeyVault.azure_cli_authenticated?
|
|
55
|
-
raise "Azure CLI is not authenticated. Run 'az login' first"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
cmd = [
|
|
59
|
-
"az keyvault secret show",
|
|
60
|
-
"--vault-name '#{@keyvault_name}'",
|
|
61
|
-
"--name '#{secret_name}'",
|
|
62
|
-
"--query value",
|
|
63
|
-
"-o tsv",
|
|
64
|
-
"2>&1"
|
|
65
|
-
].join(" ")
|
|
66
|
-
|
|
67
|
-
output = `#{cmd}`.strip
|
|
68
|
-
exit_code = $?.exitstatus
|
|
69
|
-
|
|
70
|
-
if exit_code != 0
|
|
71
|
-
nil
|
|
72
|
-
else
|
|
73
|
-
output
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def set(key, value)
|
|
78
|
-
secret_name = build_secret_name(key)
|
|
79
|
-
AzureKeyVault.set(secret_name, value.to_s, keyvault_name: @keyvault_name)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def get_secrets_filename
|
|
83
|
-
"#{@keyvault_name}/secrets"
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def get_secrets_hash
|
|
87
|
-
# Load all secrets from Azure Key Vault
|
|
88
|
-
# This is a simplified version - in practice, you might want to list all secrets
|
|
89
|
-
# For now, we'll return an empty hash and let individual get() calls retrieve secrets
|
|
90
|
-
{}
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def save_secrets_hash(hash)
|
|
94
|
-
# Save all secrets from hash to Azure Key Vault
|
|
95
|
-
hash.each do |key, value|
|
|
96
|
-
set(key, value)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def info
|
|
101
|
-
unless AzureKeyVault.azure_cli_authenticated?
|
|
102
|
-
puts " Azure CLI is not authenticated. Run 'az login' first"
|
|
103
|
-
return
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
cmd = [
|
|
107
|
-
"az keyvault secret list",
|
|
108
|
-
"--vault-name '#{@keyvault_name}'",
|
|
109
|
-
"--query '[].name'",
|
|
110
|
-
"-o tsv",
|
|
111
|
-
"2>&1"
|
|
112
|
-
].join(" ")
|
|
113
|
-
|
|
114
|
-
output = `#{cmd}`.strip
|
|
115
|
-
exit_code = $?.exitstatus
|
|
116
|
-
|
|
117
|
-
if exit_code != 0
|
|
118
|
-
# Check if it's a permission error
|
|
119
|
-
if output.include?("Forbidden") || output.include?("ForbiddenByRbac")
|
|
120
|
-
puts " Error: Insufficient permissions to list secrets from Azure Key Vault"
|
|
121
|
-
puts " The authenticated identity does not have the required RBAC permissions."
|
|
122
|
-
puts " Required permission: 'Microsoft.KeyVault/vaults/secrets/readMetadata/action'"
|
|
123
|
-
puts " Required role: 'Key Vault Secrets User' or 'Key Vault Secrets Officer'"
|
|
124
|
-
puts " Vault: #{@keyvault_name}"
|
|
125
|
-
puts ""
|
|
126
|
-
puts " To fix this, ask your Azure administrator to grant you one of these roles:"
|
|
127
|
-
puts " - Key Vault Secrets User (read-only access to secret names and values)"
|
|
128
|
-
puts " - Key Vault Secrets Officer (full access to secrets)"
|
|
129
|
-
else
|
|
130
|
-
puts " Error: Failed to list secrets from Azure Key Vault"
|
|
131
|
-
puts " #{output}"
|
|
132
|
-
end
|
|
133
|
-
return
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
secret_names = output.split("\n").map(&:strip).reject(&:empty?)
|
|
137
|
-
|
|
138
|
-
if @secret_prefix
|
|
139
|
-
# Filter secrets that match the prefix and remove the prefix
|
|
140
|
-
filtered_secrets = secret_names.select { |name| name.start_with?("#{@secret_prefix}-") }
|
|
141
|
-
.map { |name| name.sub(/^#{Regexp.escape(@secret_prefix)}-/, "") }
|
|
142
|
-
else
|
|
143
|
-
filtered_secrets = secret_names
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
if filtered_secrets.empty?
|
|
147
|
-
puts " No secrets found"
|
|
148
|
-
else
|
|
149
|
-
puts " Available secrets (#{filtered_secrets.count}):"
|
|
150
|
-
filtered_secrets.sort.each do |key|
|
|
151
|
-
puts " - #{key}"
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
private
|
|
157
|
-
|
|
158
|
-
def build_secret_name(key)
|
|
159
|
-
if @secret_prefix
|
|
160
|
-
"#{@secret_prefix}-#{key}"
|
|
161
|
-
else
|
|
162
|
-
key.to_s
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def secret_exists?(secret_name)
|
|
167
|
-
unless AzureKeyVault.azure_cli_authenticated?
|
|
168
|
-
return false
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
cmd = [
|
|
172
|
-
"az keyvault secret show",
|
|
173
|
-
"--vault-name '#{@keyvault_name}'",
|
|
174
|
-
"--name '#{secret_name}'",
|
|
175
|
-
"2>&1"
|
|
176
|
-
].join(" ")
|
|
177
|
-
|
|
178
|
-
system("#{cmd} > /dev/null 2>&1")
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "azure_key_vault"
|
|
4
|
+
|
|
5
|
+
module Makit
|
|
6
|
+
module Secrets
|
|
7
|
+
# Azure Key Vault adapter that implements the LocalSecrets interface
|
|
8
|
+
# Uses Azure CLI to store and retrieve individual secrets
|
|
9
|
+
class AzureSecrets
|
|
10
|
+
def initialize(keyvault_name: nil, secret_prefix: nil)
|
|
11
|
+
@keyvault_name = keyvault_name || AzureKeyVault.keyvault_name
|
|
12
|
+
@secret_prefix = secret_prefix || AzureKeyVault.secret_prefix
|
|
13
|
+
raise "Azure Key Vault name is required" if @keyvault_name.nil? || @keyvault_name.empty?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add(key, value)
|
|
17
|
+
set(key, value)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def remove(key)
|
|
21
|
+
secret_name = build_secret_name(key)
|
|
22
|
+
return true unless secret_exists?(secret_name)
|
|
23
|
+
|
|
24
|
+
unless AzureKeyVault.azure_cli_authenticated?
|
|
25
|
+
raise "Azure CLI is not authenticated. Run 'az login' first"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
cmd = [
|
|
29
|
+
"az keyvault secret delete",
|
|
30
|
+
"--vault-name '#{@keyvault_name}'",
|
|
31
|
+
"--name '#{secret_name}'",
|
|
32
|
+
"2>&1"
|
|
33
|
+
].join(" ")
|
|
34
|
+
|
|
35
|
+
output = `#{cmd}`
|
|
36
|
+
exit_code = $?.exitstatus
|
|
37
|
+
|
|
38
|
+
if exit_code != 0
|
|
39
|
+
raise "Failed to delete secret '#{secret_name}': #{output}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def has_key?(key)
|
|
46
|
+
secret_name = build_secret_name(key)
|
|
47
|
+
secret_exists?(secret_name)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def get(key)
|
|
51
|
+
secret_name = build_secret_name(key)
|
|
52
|
+
return nil unless secret_exists?(secret_name)
|
|
53
|
+
|
|
54
|
+
unless AzureKeyVault.azure_cli_authenticated?
|
|
55
|
+
raise "Azure CLI is not authenticated. Run 'az login' first"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
cmd = [
|
|
59
|
+
"az keyvault secret show",
|
|
60
|
+
"--vault-name '#{@keyvault_name}'",
|
|
61
|
+
"--name '#{secret_name}'",
|
|
62
|
+
"--query value",
|
|
63
|
+
"-o tsv",
|
|
64
|
+
"2>&1"
|
|
65
|
+
].join(" ")
|
|
66
|
+
|
|
67
|
+
output = `#{cmd}`.strip
|
|
68
|
+
exit_code = $?.exitstatus
|
|
69
|
+
|
|
70
|
+
if exit_code != 0
|
|
71
|
+
nil
|
|
72
|
+
else
|
|
73
|
+
output
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def set(key, value)
|
|
78
|
+
secret_name = build_secret_name(key)
|
|
79
|
+
AzureKeyVault.set(secret_name, value.to_s, keyvault_name: @keyvault_name)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def get_secrets_filename
|
|
83
|
+
"#{@keyvault_name}/secrets"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def get_secrets_hash
|
|
87
|
+
# Load all secrets from Azure Key Vault
|
|
88
|
+
# This is a simplified version - in practice, you might want to list all secrets
|
|
89
|
+
# For now, we'll return an empty hash and let individual get() calls retrieve secrets
|
|
90
|
+
{}
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def save_secrets_hash(hash)
|
|
94
|
+
# Save all secrets from hash to Azure Key Vault
|
|
95
|
+
hash.each do |key, value|
|
|
96
|
+
set(key, value)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def info
|
|
101
|
+
unless AzureKeyVault.azure_cli_authenticated?
|
|
102
|
+
puts " Azure CLI is not authenticated. Run 'az login' first"
|
|
103
|
+
return
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
cmd = [
|
|
107
|
+
"az keyvault secret list",
|
|
108
|
+
"--vault-name '#{@keyvault_name}'",
|
|
109
|
+
"--query '[].name'",
|
|
110
|
+
"-o tsv",
|
|
111
|
+
"2>&1"
|
|
112
|
+
].join(" ")
|
|
113
|
+
|
|
114
|
+
output = `#{cmd}`.strip
|
|
115
|
+
exit_code = $?.exitstatus
|
|
116
|
+
|
|
117
|
+
if exit_code != 0
|
|
118
|
+
# Check if it's a permission error
|
|
119
|
+
if output.include?("Forbidden") || output.include?("ForbiddenByRbac")
|
|
120
|
+
puts " Error: Insufficient permissions to list secrets from Azure Key Vault"
|
|
121
|
+
puts " The authenticated identity does not have the required RBAC permissions."
|
|
122
|
+
puts " Required permission: 'Microsoft.KeyVault/vaults/secrets/readMetadata/action'"
|
|
123
|
+
puts " Required role: 'Key Vault Secrets User' or 'Key Vault Secrets Officer'"
|
|
124
|
+
puts " Vault: #{@keyvault_name}"
|
|
125
|
+
puts ""
|
|
126
|
+
puts " To fix this, ask your Azure administrator to grant you one of these roles:"
|
|
127
|
+
puts " - Key Vault Secrets User (read-only access to secret names and values)"
|
|
128
|
+
puts " - Key Vault Secrets Officer (full access to secrets)"
|
|
129
|
+
else
|
|
130
|
+
puts " Error: Failed to list secrets from Azure Key Vault"
|
|
131
|
+
puts " #{output}"
|
|
132
|
+
end
|
|
133
|
+
return
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
secret_names = output.split("\n").map(&:strip).reject(&:empty?)
|
|
137
|
+
|
|
138
|
+
if @secret_prefix
|
|
139
|
+
# Filter secrets that match the prefix and remove the prefix
|
|
140
|
+
filtered_secrets = secret_names.select { |name| name.start_with?("#{@secret_prefix}-") }
|
|
141
|
+
.map { |name| name.sub(/^#{Regexp.escape(@secret_prefix)}-/, "") }
|
|
142
|
+
else
|
|
143
|
+
filtered_secrets = secret_names
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
if filtered_secrets.empty?
|
|
147
|
+
puts " No secrets found"
|
|
148
|
+
else
|
|
149
|
+
puts " Available secrets (#{filtered_secrets.count}):"
|
|
150
|
+
filtered_secrets.sort.each do |key|
|
|
151
|
+
puts " - #{key}"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
private
|
|
157
|
+
|
|
158
|
+
def build_secret_name(key)
|
|
159
|
+
if @secret_prefix
|
|
160
|
+
"#{@secret_prefix}-#{key}"
|
|
161
|
+
else
|
|
162
|
+
key.to_s
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def secret_exists?(secret_name)
|
|
167
|
+
unless AzureKeyVault.azure_cli_authenticated?
|
|
168
|
+
return false
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
cmd = [
|
|
172
|
+
"az keyvault secret show",
|
|
173
|
+
"--vault-name '#{@keyvault_name}'",
|
|
174
|
+
"--name '#{secret_name}'",
|
|
175
|
+
"2>&1"
|
|
176
|
+
].join(" ")
|
|
177
|
+
|
|
178
|
+
system("#{cmd} > /dev/null 2>&1")
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "json"
|
|
4
|
-
require_relative "../directories" unless defined?(Makit::Directories)
|
|
5
|
-
|
|
6
|
-
module Makit
|
|
7
|
-
module Secrets
|
|
8
|
-
class LocalSecrets
|
|
9
|
-
def add(key, value)
|
|
10
|
-
secrets_hash = get_secrets_hash
|
|
11
|
-
secrets_hash[key] = value
|
|
12
|
-
save_secrets_hash(secrets_hash)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def remove(key)
|
|
16
|
-
secrets_hash = get_secrets_hash
|
|
17
|
-
secrets_hash.delete(key)
|
|
18
|
-
save_secrets_hash(secrets_hash)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def has_key?(key)
|
|
22
|
-
secrets_hash = get_secrets_hash
|
|
23
|
-
secrets_hash.key?(key)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def get(key)
|
|
27
|
-
secrets_hash = get_secrets_hash
|
|
28
|
-
secrets_hash[key]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def set(key, value)
|
|
32
|
-
secrets_hash = get_secrets_hash
|
|
33
|
-
secrets_hash[key] = value
|
|
34
|
-
save_secrets_hash(secrets_hash)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def get_secrets_filename
|
|
38
|
-
"#{Makit::Directories::ROOT}/secrets.json"
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def get_secrets_hash
|
|
42
|
-
secrets_file = get_secrets_filename
|
|
43
|
-
return {} unless File.exist?(secrets_file)
|
|
44
|
-
|
|
45
|
-
text = File.read(secrets_file).strip
|
|
46
|
-
return {} if text.empty?
|
|
47
|
-
|
|
48
|
-
JSON.parse(text)
|
|
49
|
-
rescue JSON::ParserError
|
|
50
|
-
{}
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def save_secrets_hash(hash)
|
|
54
|
-
secrets_file = get_secrets_filename
|
|
55
|
-
# pretty print the hash
|
|
56
|
-
File.open(secrets_file, "w") { |f| f.puts JSON.pretty_generate(hash) }
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def info
|
|
60
|
-
secrets_hash = get_secrets_hash
|
|
61
|
-
if secrets_hash.empty?
|
|
62
|
-
puts " No secrets found"
|
|
63
|
-
else
|
|
64
|
-
puts " Available secrets (#{secrets_hash.keys.count}):"
|
|
65
|
-
secrets_hash.keys.sort.each do |key|
|
|
66
|
-
puts " - #{key}"
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require_relative "../directories" unless defined?(Makit::Directories)
|
|
5
|
+
|
|
6
|
+
module Makit
|
|
7
|
+
module Secrets
|
|
8
|
+
class LocalSecrets
|
|
9
|
+
def add(key, value)
|
|
10
|
+
secrets_hash = get_secrets_hash
|
|
11
|
+
secrets_hash[key] = value
|
|
12
|
+
save_secrets_hash(secrets_hash)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def remove(key)
|
|
16
|
+
secrets_hash = get_secrets_hash
|
|
17
|
+
secrets_hash.delete(key)
|
|
18
|
+
save_secrets_hash(secrets_hash)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def has_key?(key)
|
|
22
|
+
secrets_hash = get_secrets_hash
|
|
23
|
+
secrets_hash.key?(key)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def get(key)
|
|
27
|
+
secrets_hash = get_secrets_hash
|
|
28
|
+
secrets_hash[key]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def set(key, value)
|
|
32
|
+
secrets_hash = get_secrets_hash
|
|
33
|
+
secrets_hash[key] = value
|
|
34
|
+
save_secrets_hash(secrets_hash)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def get_secrets_filename
|
|
38
|
+
"#{Makit::Directories::ROOT}/secrets.json"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def get_secrets_hash
|
|
42
|
+
secrets_file = get_secrets_filename
|
|
43
|
+
return {} unless File.exist?(secrets_file)
|
|
44
|
+
|
|
45
|
+
text = File.read(secrets_file).strip
|
|
46
|
+
return {} if text.empty?
|
|
47
|
+
|
|
48
|
+
JSON.parse(text)
|
|
49
|
+
rescue JSON::ParserError
|
|
50
|
+
{}
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def save_secrets_hash(hash)
|
|
54
|
+
secrets_file = get_secrets_filename
|
|
55
|
+
# pretty print the hash
|
|
56
|
+
File.open(secrets_file, "w") { |f| f.puts JSON.pretty_generate(hash) }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def info
|
|
60
|
+
secrets_hash = get_secrets_hash
|
|
61
|
+
if secrets_hash.empty?
|
|
62
|
+
puts " No secrets found"
|
|
63
|
+
else
|
|
64
|
+
puts " Available secrets (#{secrets_hash.keys.count}):"
|
|
65
|
+
secrets_hash.keys.sort.each do |key|
|
|
66
|
+
puts " - #{key}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|