mirror of
https://github.com/kairos-io/kcrypt.git
synced 2025-06-10 16:04:56 +00:00
Compare commits
545 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8768e00fe8 | ||
|
0042f68ee0 | ||
|
a972865551 | ||
|
830bebfa91 | ||
|
16ed9fe8fd | ||
|
082a855358 | ||
|
2982561dc4 | ||
|
ec90b38334 | ||
|
cdcc6b5ca5 | ||
|
05eae3a7d7 | ||
|
d61887fdf8 | ||
|
5b09176e66 | ||
|
1344f1a562 | ||
|
3c5f119e1d | ||
|
6bcf6d8417 | ||
|
db1b78954c | ||
|
6875922ad3 | ||
|
da8e3b0e92 | ||
|
9ce82c2059 | ||
|
1678489f4f | ||
|
d432f531fc | ||
|
4658446b57 | ||
|
4a6d6139ca | ||
|
e6a9b56890 | ||
|
b0b2518e6a | ||
|
a62d81facc | ||
|
654d4de653 | ||
|
dd4b6459f2 | ||
|
5564c6a98b | ||
|
e99c6059dd | ||
|
64fd81812a | ||
|
4d1761c075 | ||
|
246e7146fe | ||
|
63626847db | ||
|
af84f23dd9 | ||
|
55a30f5239 | ||
|
7d1ccf7973 | ||
|
e12acea6d9 | ||
|
437eac239c | ||
|
ef42ac2316 | ||
|
e7bca6e988 | ||
|
d8f34c5209 | ||
|
b51193ffde | ||
|
21ff043d67 | ||
|
143dedf7b6 | ||
|
1293f2b5b5 | ||
|
dc12f76598 | ||
|
ac54aa9d91 | ||
|
a0bc44a4e4 | ||
|
1a91699215 | ||
|
9e0f9a9b67 | ||
|
1824edc2c4 | ||
|
8af9547296 | ||
|
c32e8a4821 | ||
|
40af260cce | ||
|
efc8eb5665 | ||
|
de1e3c4e2f | ||
|
84b9223b87 | ||
|
45e3de3b5d | ||
|
10260b794d | ||
|
eb1c40a09e | ||
|
e82a9c0c8f | ||
|
c9006282c5 | ||
|
7292d815e6 | ||
|
f635af1eb7 | ||
|
7282885995 | ||
|
c17dffe775 | ||
|
4eeb3d3448 | ||
|
38f2f7e8fc | ||
|
33ce07902b | ||
|
7c93fed233 | ||
|
52c5c6ebf7 | ||
|
3061f763b3 | ||
|
d7ee215dee | ||
|
d76e58e09b | ||
|
5c513aee21 | ||
|
74eb5903b3 | ||
|
d1a6c85a0c | ||
|
d559f94e30 | ||
|
1044d6baf3 | ||
|
269e968a3f | ||
|
2b78f81d23 | ||
|
987b7b8b6a | ||
|
d68b0e1b66 | ||
|
3a8a7f7240 | ||
|
8cd7de24cd | ||
|
6bf566429e | ||
|
2785cd5f13 | ||
|
b3363462e6 | ||
|
50b990c994 | ||
|
2bc901ed2c | ||
|
1477b07170 | ||
|
80f513aa3a | ||
|
6caa347c8b | ||
|
dce938efa6 | ||
|
cfdabdacff | ||
|
95f16f3505 | ||
|
b4267e76f8 | ||
|
1b169727c6 | ||
|
7ed4425bb4 | ||
|
d258183111 | ||
|
74e916632f | ||
|
b1e16767b3 | ||
|
65dcc63c3c | ||
|
e810d85f29 | ||
|
5f5898b971 | ||
|
202fbba1e3 | ||
|
a2d6c7583d | ||
|
3821821601 | ||
|
017e46eafe | ||
|
92af3af44f | ||
|
d0b0929d58 | ||
|
a21e7038f6 | ||
|
f7f97ce7e8 | ||
|
f1bacad95f | ||
|
071181e578 | ||
|
46fd0f28f0 | ||
|
9773d5ce7e | ||
|
ef5ef8e495 | ||
|
ad07ced68b | ||
|
418027453d | ||
|
efa923ba4d | ||
|
56cb05bcb2 | ||
|
14a8e3b6d2 | ||
|
621bb0cc81 | ||
|
94cf1ea554 | ||
|
e2f8949178 | ||
|
ea5fc7351a | ||
|
3655d3d81e | ||
|
df7ccef01b | ||
|
b6122a4949 | ||
|
3f138babd4 | ||
|
8c331b08f0 | ||
|
9fbd62e6c4 | ||
|
6f6b1cea7d | ||
|
3e4b1b83d6 | ||
|
8c92f897df | ||
|
9100b32875 | ||
|
f57869c3a6 | ||
|
78a19e7f7b | ||
|
9a8fa01609 | ||
|
390e0eea96 | ||
|
cac22b202c | ||
|
a3b289c5db | ||
|
c46c8ca535 | ||
|
3ab7486ab1 | ||
|
636849ec58 | ||
|
b8b9d29470 | ||
|
27fb6f9d25 | ||
|
9cfe9efb67 | ||
|
568c15a297 | ||
|
163b8719e2 | ||
|
dffd359a23 | ||
|
a0e1ae1e03 | ||
|
44267e4c1a | ||
|
3ee6086b4a | ||
|
a9090633a6 | ||
|
ead1b43410 | ||
|
b9dcb70206 | ||
|
196ade32a1 | ||
|
5a8eefde7a | ||
|
ad59eacc41 | ||
|
60a9f0dde6 | ||
|
1bf6e020a6 | ||
|
05831b7801 | ||
|
08120e338d | ||
|
8948b42fbf | ||
|
3d19444a33 | ||
|
c6da1b94d7 | ||
|
96adb2ec02 | ||
|
a9a8cb1bc3 | ||
|
716a5762bd | ||
|
9202412327 | ||
|
3943784517 | ||
|
a6ec42e638 | ||
|
dc0a97cab2 | ||
|
74a54e6b7b | ||
|
aa72c64aa0 | ||
|
ac5454d1db | ||
|
abc50af75b | ||
|
34d2ef3d60 | ||
|
cd1a2ce2c3 | ||
|
27b19db531 | ||
|
1d16082bb3 | ||
|
665d2476f1 | ||
|
f21949e6f0 | ||
|
ade6879a59 | ||
|
702f654c7f | ||
|
6a4f4fe65a | ||
|
dbe447d91d | ||
|
5d097165d6 | ||
|
9a46533e4b | ||
|
cc1db9bf60 | ||
|
87b27681c1 | ||
|
ca2344ff74 | ||
|
9b76de34b2 | ||
|
cb9d9b7554 | ||
|
f140f2bf3c | ||
|
29e50be08a | ||
|
4c385dff51 | ||
|
7a30b822e6 | ||
|
2d34fe8dfc | ||
|
8af964f0d9 | ||
|
d44bd725b4 | ||
|
7e771c1ec0 | ||
|
8b686a01f2 | ||
|
8b67536447 | ||
|
18c36ff2b8 | ||
|
d1f62913a3 | ||
|
3b27c0cf0f | ||
|
2a45a76b75 | ||
|
f09a1b1586 | ||
|
87cca84f73 | ||
|
26bd797c8e | ||
|
fc92e3ada0 | ||
|
0acdcd2961 | ||
|
51d35a8d74 | ||
|
e36b3214b1 | ||
|
a6a726cb81 | ||
|
2d975678a1 | ||
|
1108b9a0fe | ||
|
bce5b5ac83 | ||
|
c5cd4b8888 | ||
|
25495b4020 | ||
|
df3d993f12 | ||
|
6cdb39d1a8 | ||
|
ecd6f90d25 | ||
|
045b47a03d | ||
|
656a230703 | ||
|
f41b8f1f7c | ||
|
dc84f1ca56 | ||
|
c6b4b9db15 | ||
|
d5f27f3d9a | ||
|
797bc036a9 | ||
|
7ff584df45 | ||
|
0bb29cc24c | ||
|
0cf1689002 | ||
|
0c5045f549 | ||
|
4389405c3f | ||
|
7d315ad54e | ||
|
bae6e98edd | ||
|
7db0e8e717 | ||
|
cceea2a341 | ||
|
fbc19a2a95 | ||
|
4320354a78 | ||
|
a9a08af5ab | ||
|
1624151063 | ||
|
e78da597e1 | ||
|
1ad0f242b7 | ||
|
7c4583780a | ||
|
7faf1ae94a | ||
|
d0740add63 | ||
|
c68e5f3f76 | ||
|
3b3bdabf70 | ||
|
31558d9128 | ||
|
9884b49a9d | ||
|
f3b0635379 | ||
|
cfe34ac388 | ||
|
55b1ed2eb4 | ||
|
1042d4c001 | ||
|
2030ed222d | ||
|
368242a6f0 | ||
|
0acf453eca | ||
|
486cae29dd | ||
|
02c10e32de | ||
|
9eebed0a91 | ||
|
fe2be4effc | ||
|
bca9b0a345 | ||
|
c6c0710a25 | ||
|
e10a327d4e | ||
|
d4b2b29f14 | ||
|
c9e074d5df | ||
|
49ddbac460 | ||
|
23f2d5d54f | ||
|
d4c06b7714 | ||
|
ca905f822e | ||
|
cf952d311e | ||
|
42cdd0d592 | ||
|
6f306a45db | ||
|
09a0e6d646 | ||
|
53be282549 | ||
|
82db8535dc | ||
|
c2601791ab | ||
|
3830154c22 | ||
|
e248e8978d | ||
|
3c6d1cd182 | ||
|
7e997539a5 | ||
|
83b5e26e77 | ||
|
65fa1ddbc1 | ||
|
a0bdec1449 | ||
|
2ee270841a | ||
|
c68ea37c8e | ||
|
5ab4cce24f | ||
|
934793f849 | ||
|
e251508b3f | ||
|
d574f8fc4d | ||
|
472eb01daf | ||
|
fa461901d5 | ||
|
68eddb8e8c | ||
|
253581a585 | ||
|
ddf2c8c037 | ||
|
159e9430ee | ||
|
d1d3b23e13 | ||
|
e0b528ada0 | ||
|
2a804251a5 | ||
|
fe2b6140d8 | ||
|
b5fafef294 | ||
|
eabd9e852b | ||
|
d786ed31dd | ||
|
91025d3aeb | ||
|
4d161a412b | ||
|
553f2df732 | ||
|
8933ef6e01 | ||
|
d5dc80cf00 | ||
|
673f4196b8 | ||
|
b7181d030d | ||
|
3158e8d62c | ||
|
acdd04d0d2 | ||
|
610a6e9ae2 | ||
|
b64999381a | ||
|
1f56920306 | ||
|
d0d2070639 | ||
|
1992c592d2 | ||
|
1c40e856be | ||
|
addb916399 | ||
|
90d5e97250 | ||
|
9ba71b9f9b | ||
|
db4ec870cc | ||
|
366b9a19fa | ||
|
cf13ebcec0 | ||
|
c6627fa14c | ||
|
6b910df87c | ||
|
61c969abb9 | ||
|
94cc420d93 | ||
|
76591acb25 | ||
|
267cea1a9f | ||
|
4d96d37426 | ||
|
aa8abe9463 | ||
|
7087a730fe | ||
|
cf7a8857b0 | ||
|
d5390af1bb | ||
|
0bc3a02b7b | ||
|
cd5634f917 | ||
|
b6846a3c90 | ||
|
4275b2a27a | ||
|
444c87b32b | ||
|
a78d7b2113 | ||
|
195dc1f18b | ||
|
66ec298f59 | ||
|
bb0cb6dadc | ||
|
5cf0f7912b | ||
|
90bfb2723b | ||
|
267ec5fa74 | ||
|
18adfbfc1f | ||
|
e626fad723 | ||
|
1f6a2d2669 | ||
|
76f4b98a4e | ||
|
f9ab46a70a | ||
|
02a925beb8 | ||
|
3e9dbb0317 | ||
|
c195337d82 | ||
|
59e0b4bcce | ||
|
a56e6aa6e7 | ||
|
ffb63a9075 | ||
|
b5eb2a7c55 | ||
|
fbdcffb4b6 | ||
|
f1b32ad05b | ||
|
b2fd9e9d4a | ||
|
c8a30a69ea | ||
|
9b23c26413 | ||
|
138ecfd4c5 | ||
|
638fb18d9f | ||
|
d182f29f07 | ||
|
48d7743914 | ||
|
44d55fff78 | ||
|
e574701e71 | ||
|
d9a2c6fb55 | ||
|
ce7a6720f8 | ||
|
90b3efca27 | ||
|
b2a1b1c2ee | ||
|
bb3a5006cd | ||
|
751341ab03 | ||
|
6d7f2cc9de | ||
|
72b1e62f9a | ||
|
0745dd6531 | ||
|
ae0abff461 | ||
|
df3feb702f | ||
|
3185f198ec | ||
|
150619dcdd | ||
|
32eecc9d0b | ||
|
ac6f20126e | ||
|
53a64a3005 | ||
|
3b2cb3250f | ||
|
84e36d760d | ||
|
857c709345 | ||
|
9a6cad0867 | ||
|
d292537001 | ||
|
7413819474 | ||
|
a0f8399015 | ||
|
599bbcef16 | ||
|
5274499e1a | ||
|
a2f7baa39a | ||
|
8fd1f6cb77 | ||
|
365d0538fb | ||
|
a3f367f3aa | ||
|
8617a8c14a | ||
|
46aa6fba45 | ||
|
baf3fa7c83 | ||
|
88d8065808 | ||
|
e380ce1304 | ||
|
0393598788 | ||
|
ac277a494c | ||
|
2639bc8824 | ||
|
7060177e65 | ||
|
98ac6337a2 | ||
|
7878a9cce3 | ||
|
e059b73630 | ||
|
b8c08721c4 | ||
|
e136f34adc | ||
|
64a7bfceb6 | ||
|
bbee8a854c | ||
|
2870428fe1 | ||
|
b1e5a5e216 | ||
|
8ba74d9b71 | ||
|
ed614fe9db | ||
|
087f75d1a7 | ||
|
ab6ca18ebc | ||
|
72a6cc004d | ||
|
70067c9e5b | ||
|
b21bf0c967 | ||
|
3828d4261f | ||
|
441c68dc2e | ||
|
0d953c48c7 | ||
|
11e87b839c | ||
|
e18aa51c47 | ||
|
66d8bd752d | ||
|
c0fa3e5690 | ||
|
6ea10abdc5 | ||
|
679bd88e7a | ||
|
e2a5d3b2e9 | ||
|
9a533c82ed | ||
|
37e601bf9e | ||
|
4bac3eae50 | ||
|
74130c3a90 | ||
|
694a62be4b | ||
|
efa40fd4aa | ||
|
085e05c9e8 | ||
|
693d13a1a1 | ||
|
8c7e67cf22 | ||
|
ebed6d3c47 | ||
|
fdd32a17fd | ||
|
8c7c1a2a37 | ||
|
448860b21a | ||
|
05628aef6d | ||
|
d8eafb6833 | ||
|
fd707b8535 | ||
|
4715d081ec | ||
|
6b1652b8fa | ||
|
7fe64d4fce | ||
|
fcf834a5b0 | ||
|
98c0620d40 | ||
|
366724e0cb | ||
|
d6c3e42b43 | ||
|
ee419393cd | ||
|
7cf3646606 | ||
|
8d52ffab85 | ||
|
96d9945ef9 | ||
|
fc40b9d37c | ||
|
27e8a5f08e | ||
|
b9c4f3eeb3 | ||
|
c2ec37b806 | ||
|
f4a8e271ce | ||
|
0c35c9ab48 | ||
|
b379c81210 | ||
|
0b5165aca1 | ||
|
3df9b60f11 | ||
|
99c1c93d26 | ||
|
12a8d5d33c | ||
|
ce877a2a7f | ||
|
554e350fb7 | ||
|
e86d8e5595 | ||
|
42e451494d | ||
|
94af8c8dd3 | ||
|
e73e33b26d | ||
|
e43da08f2d | ||
|
365f16e8f1 | ||
|
4ec8386ac8 | ||
|
20547f93a2 | ||
|
864ff80b53 | ||
|
bdde2df13a | ||
|
166b8802ea | ||
|
3a0c3f0bae | ||
|
16ec663748 | ||
|
59ed3da68d | ||
|
c08c563658 | ||
|
47e7f67e04 | ||
|
f5dc23f554 | ||
|
2889a52eab | ||
|
18eab4843d | ||
|
3e25056dd0 | ||
|
36f861fd0c | ||
|
5f52d1f2f9 | ||
|
7a8210d26c | ||
|
6d6dfd00a1 | ||
|
a312a2ecd8 | ||
|
92c79f4e75 | ||
|
a254871c22 | ||
|
7e6a31f38b | ||
|
0f3eee7851 | ||
|
15cc284978 | ||
|
b7352829ff | ||
|
57aef89b02 | ||
|
2dbd13c984 | ||
|
ff42570ec7 | ||
|
36fafa38cf | ||
|
f977f72e8d | ||
|
608b465afc | ||
|
79fbcc2f73 | ||
|
7298e9c0dd | ||
|
94cfbcfe88 | ||
|
1296f284cb | ||
|
4cff0323af | ||
|
9c7c27af89 | ||
|
fa9eb79998 | ||
|
11bfa53dc1 | ||
|
930d7433ae | ||
|
845f5984b1 | ||
|
71506ff020 | ||
|
27183fbce7 | ||
|
018322ff00 | ||
|
361e1ab817 | ||
|
4234ae7034 | ||
|
193a7da9ee | ||
|
e0316ade0a | ||
|
1c3a3ac510 | ||
|
641fc6ffa7 | ||
|
214ae51333 | ||
|
7f397a3459 | ||
|
b3d7b86591 | ||
|
24240b6421 | ||
|
bb144f204a | ||
|
7d077c9353 | ||
|
0e278a89f0 | ||
|
7310c313ee | ||
|
b9572125e1 |
12
.github/ISSUE_TEMPLATE/file-issues-on-main-kairos-repo.md
vendored
Normal file
12
.github/ISSUE_TEMPLATE/file-issues-on-main-kairos-repo.md
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: File issues on main Kairos repo
|
||||||
|
about: Tell users to file their issues on the main Kairos repo
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
:warning: All Kairos issues are tracked in our main repo, please file your issue there, thanks! :warning:
|
||||||
|
|
||||||
|
https://github.com/kairos-io/kairos/issues
|
42
.github/workflows/dependabot_auto.yml
vendored
Normal file
42
.github/workflows/dependabot_auto.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
name: Dependabot auto-merge
|
||||||
|
on:
|
||||||
|
- pull_request_target
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
packages: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dependabot:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.actor == 'dependabot[bot]' }}
|
||||||
|
steps:
|
||||||
|
- name: Dependabot metadata
|
||||||
|
id: metadata
|
||||||
|
uses: dependabot/fetch-metadata@v2.4.0
|
||||||
|
with:
|
||||||
|
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
skip-commit-verification: true
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Approve a PR if not already approved
|
||||||
|
run: |
|
||||||
|
gh pr checkout "$PR_URL"
|
||||||
|
if [ "$(gh pr status --json reviewDecision -q .currentBranch.reviewDecision)" != "APPROVED" ];
|
||||||
|
then
|
||||||
|
gh pr review --approve "$PR_URL"
|
||||||
|
else
|
||||||
|
echo "PR already approved.";
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
PR_URL: ${{github.event.pull_request.html_url}}
|
||||||
|
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||||
|
|
||||||
|
- name: Enable auto-merge for Dependabot PRs
|
||||||
|
run: gh pr merge --auto --squash "$PR_URL"
|
||||||
|
env:
|
||||||
|
PR_URL: ${{github.event.pull_request.html_url}}
|
||||||
|
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
16
.github/workflows/lint.yaml
vendored
Normal file
16
.github/workflows/lint.yaml
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
name: Lint
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: lint-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ github.repository }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call-workflow:
|
||||||
|
uses: kairos-io/linting-composite-action/.github/workflows/reusable-linting.yaml@main
|
||||||
|
with:
|
||||||
|
yamldirs: "."
|
21
.github/workflows/osv-scanner-pr.yaml
vendored
Normal file
21
.github/workflows/osv-scanner-pr.yaml
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
name: OSV-Scanner PR Scan
|
||||||
|
|
||||||
|
# Change "main" to your default branch if you use a different name, i.e. "master"
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
merge_group:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
# Require writing security events to upload SARIF file to security tab
|
||||||
|
security-events: write
|
||||||
|
# Only need to read contents and actions
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
scan-pr:
|
||||||
|
uses: "google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@v2.0.2"
|
27
.github/workflows/release.yaml
vendored
Normal file
27
.github/workflows/release.yaml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
name: goreleaser
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
goreleaser:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- run: |
|
||||||
|
git fetch --prune --unshallow
|
||||||
|
- name: Install gcc for arm64
|
||||||
|
run: sudo apt-get update && sudo apt-get install -y gcc-aarch64-linux-gnu
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: 'go.mod'
|
||||||
|
- name: Run GoReleaser
|
||||||
|
uses: goreleaser/goreleaser-action@v6
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
args: release --clean
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
35
.github/workflows/renovate_auto.yml
vendored
Normal file
35
.github/workflows/renovate_auto.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
name: Renovate auto-merge
|
||||||
|
on:
|
||||||
|
- pull_request_target
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
packages: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dependabot:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.actor == 'renovate[bot]' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Approve a PR if not already approved
|
||||||
|
run: |
|
||||||
|
gh pr checkout "$PR_URL"
|
||||||
|
if [ "$(gh pr status --json reviewDecision -q .currentBranch.reviewDecision)" != "APPROVED" ];
|
||||||
|
then
|
||||||
|
gh pr review --approve "$PR_URL"
|
||||||
|
else
|
||||||
|
echo "PR already approved.";
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
PR_URL: ${{github.event.pull_request.html_url}}
|
||||||
|
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||||
|
|
||||||
|
- name: Enable auto-merge for Renovate PRs
|
||||||
|
run: gh pr merge --auto --squash "$PR_URL"
|
||||||
|
env:
|
||||||
|
PR_URL: ${{github.event.pull_request.html_url}}
|
||||||
|
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
32
.github/workflows/secscan.yaml
vendored
Normal file
32
.github/workflows/secscan.yaml
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
name: "Security Scan"
|
||||||
|
|
||||||
|
# Run workflow each time code is pushed to your repository and on a schedule.
|
||||||
|
# The scheduled workflow runs every at 00:00 on Sunday UTC time.
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '**'
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * 0'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GO111MODULE: on
|
||||||
|
steps:
|
||||||
|
- name: Checkout Source
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Run Gosec Security Scanner
|
||||||
|
uses: securego/gosec@v2.22.4
|
||||||
|
with:
|
||||||
|
# we let the report trigger content trigger a failure using the GitHub Security features.
|
||||||
|
args: '-no-fail -fmt sarif -out results.sarif ./...'
|
||||||
|
- name: Upload SARIF file
|
||||||
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
|
with:
|
||||||
|
# Path to SARIF file relative to the root of the repository
|
||||||
|
sarif_file: results.sarif
|
20
.github/workflows/unit-tests.yml
vendored
20
.github/workflows/unit-tests.yml
vendored
@ -1,26 +1,22 @@
|
|||||||
name: Unit tests
|
name: Unit tests
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
unit-tests:
|
unit-tests:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '^1.18'
|
go-version-file: 'go.mod'
|
||||||
|
|
||||||
- name: Install Ginkgo
|
|
||||||
run: go install github.com/onsi/ginkgo/v2/ginkgo@v2.5.0
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
ginkgo run ./...
|
go run github.com/onsi/ginkgo/v2/ginkgo ./...
|
||||||
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
build/
|
||||||
|
coverage.out
|
||||||
|
dist/
|
38
.golangci.yml
Normal file
38
.golangci.yml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
version: "2"
|
||||||
|
run:
|
||||||
|
tests: false
|
||||||
|
issues:
|
||||||
|
new: true
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- dupl
|
||||||
|
- ginkgolinter
|
||||||
|
- gocheckcompilerdirectives
|
||||||
|
- goconst
|
||||||
|
- gocyclo
|
||||||
|
- godot
|
||||||
|
- goheader
|
||||||
|
- misspell
|
||||||
|
- revive
|
||||||
|
- zerologlint
|
||||||
|
exclusions:
|
||||||
|
generated: lax
|
||||||
|
presets:
|
||||||
|
- comments
|
||||||
|
- common-false-positives
|
||||||
|
- legacy
|
||||||
|
- std-error-handling
|
||||||
|
paths:
|
||||||
|
- third_party$
|
||||||
|
- builtin$
|
||||||
|
- examples$
|
||||||
|
formatters:
|
||||||
|
enable:
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
exclusions:
|
||||||
|
generated: lax
|
||||||
|
paths:
|
||||||
|
- third_party$
|
||||||
|
- builtin$
|
||||||
|
- examples$
|
72
.goreleaser.yaml
Normal file
72
.goreleaser.yaml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# Make sure to check the documentation at http://goreleaser.com
|
||||||
|
version: 2
|
||||||
|
builds:
|
||||||
|
- ldflags:
|
||||||
|
- -w -s -X "main.Version={{.Tag}}"
|
||||||
|
env:
|
||||||
|
- CGO_ENABLED=0
|
||||||
|
goos:
|
||||||
|
- linux
|
||||||
|
goarch:
|
||||||
|
- amd64
|
||||||
|
- arm64
|
||||||
|
binary: '{{ .ProjectName }}'
|
||||||
|
id: default
|
||||||
|
- ldflags:
|
||||||
|
- -w -s -X "main.Version={{.Tag}}"
|
||||||
|
env:
|
||||||
|
- CGO_ENABLED=1
|
||||||
|
- GOEXPERIMENT=boringcrypto
|
||||||
|
goos:
|
||||||
|
- linux
|
||||||
|
goarch:
|
||||||
|
- amd64
|
||||||
|
binary: '{{ .ProjectName }}'
|
||||||
|
id: fips-amd64
|
||||||
|
hooks:
|
||||||
|
post:
|
||||||
|
- bash -c 'set -e; go version {{.Path}} | grep boringcrypto || (echo "boringcrypto not found" && exit 1)'
|
||||||
|
- ldflags:
|
||||||
|
- -w -s -X "main.Version={{.Tag}}"
|
||||||
|
env:
|
||||||
|
- CGO_ENABLED=1
|
||||||
|
- GOEXPERIMENT=boringcrypto
|
||||||
|
- CC=aarch64-linux-gnu-gcc
|
||||||
|
goos:
|
||||||
|
- linux
|
||||||
|
goarch:
|
||||||
|
- arm64
|
||||||
|
binary: '{{ .ProjectName }}'
|
||||||
|
id: fips-arm64
|
||||||
|
hooks:
|
||||||
|
post:
|
||||||
|
- bash -c 'set -e; go version {{.Path}} | grep boringcrypto || (echo "boringcrypto not found" && exit 1)'
|
||||||
|
source:
|
||||||
|
enabled: true
|
||||||
|
name_template: '{{ .ProjectName }}-{{ .Tag }}-source'
|
||||||
|
archives:
|
||||||
|
- id: default-archive
|
||||||
|
ids:
|
||||||
|
- default
|
||||||
|
name_template: '{{ .ProjectName }}-{{ .Tag }}-{{ .Os }}-{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}-{{ . }}{{ end }}{{ if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }}'
|
||||||
|
- id: fips-archive
|
||||||
|
ids:
|
||||||
|
- fips-arm64
|
||||||
|
- fips-amd64
|
||||||
|
name_template: '{{ .ProjectName }}-{{ .Tag }}-{{ .Os }}-{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}-{{ . }}{{ end }}{{ if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }}-fips'
|
||||||
|
checksum:
|
||||||
|
name_template: '{{ .ProjectName }}-{{ .Tag }}-checksums.txt'
|
||||||
|
snapshot:
|
||||||
|
version_template: "{{ .Tag }}-next"
|
||||||
|
changelog:
|
||||||
|
sort: asc
|
||||||
|
filters:
|
||||||
|
exclude:
|
||||||
|
- '^docs:'
|
||||||
|
- '^test:'
|
||||||
|
- '^Merge pull request'
|
||||||
|
env:
|
||||||
|
- GOSUMDB=sum.golang.org
|
||||||
|
before:
|
||||||
|
hooks:
|
||||||
|
- go mod tidy
|
21
.yamllint
Normal file
21
.yamllint
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
extends: default
|
||||||
|
|
||||||
|
rules:
|
||||||
|
# 80 chars should be enough, but don't fail if a line is longer
|
||||||
|
line-length:
|
||||||
|
max: 150
|
||||||
|
level: warning
|
||||||
|
|
||||||
|
# accept both key:
|
||||||
|
# - item
|
||||||
|
#
|
||||||
|
# and key:
|
||||||
|
# - item
|
||||||
|
indentation:
|
||||||
|
indent-sequences: whatever
|
||||||
|
|
||||||
|
truthy:
|
||||||
|
check-keys: false
|
||||||
|
|
||||||
|
document-start:
|
||||||
|
present: false
|
46
Earthfile
46
Earthfile
@ -3,21 +3,35 @@ VERSION 0.6
|
|||||||
# TODO: This needs to come from pre-built kernels in c3os repos, kcrypt included.
|
# TODO: This needs to come from pre-built kernels in c3os repos, kcrypt included.
|
||||||
# Framework images should use our initrd
|
# Framework images should use our initrd
|
||||||
ARG BASE_IMAGE=quay.io/kairos/core-opensuse
|
ARG BASE_IMAGE=quay.io/kairos/core-opensuse
|
||||||
|
# renovate: datasource=docker depName=golang
|
||||||
|
ARG GO_VERSION=1.23
|
||||||
|
# renovate: datasource=docker depName=golangci-lint
|
||||||
|
ARG GOLINT_VERSION=1.59.1
|
||||||
|
|
||||||
build-kcrypt:
|
build-kcrypt:
|
||||||
FROM golang:alpine
|
ARG GO_VERSION
|
||||||
|
FROM golang:$GO_VERSION-alpine
|
||||||
|
RUN apk add git
|
||||||
COPY . /work
|
COPY . /work
|
||||||
WORKDIR /work
|
WORKDIR /work
|
||||||
RUN CGO_ENABLED=0 go build -o kcrypt
|
ARG VERSION="$(git describe --tags)"
|
||||||
SAVE ARTIFACT /work/kcrypt AS LOCAL kcrypt
|
RUN CGO_ENABLED=0 go build -o kcrypt -ldflags "-X main.Version=$VERSION"
|
||||||
|
SAVE ARTIFACT /work/kcrypt kcrypt AS LOCAL kcrypt
|
||||||
|
|
||||||
|
dracut-artifacts:
|
||||||
|
FROM $BASE_IMAGE
|
||||||
|
WORKDIR /build
|
||||||
|
COPY --dir dracut/29kcrypt .
|
||||||
|
COPY dracut/10-kcrypt.conf .
|
||||||
|
SAVE ARTIFACT 29kcrypt 29kcrypt
|
||||||
|
SAVE ARTIFACT 10-kcrypt.conf 10-kcrypt.conf
|
||||||
|
|
||||||
build-dracut:
|
build-dracut:
|
||||||
FROM $BASE_IMAGE
|
FROM $BASE_IMAGE
|
||||||
COPY . /work
|
|
||||||
COPY +build-kcrypt/kcrypt /usr/bin/kcrypt
|
|
||||||
WORKDIR /work
|
WORKDIR /work
|
||||||
RUN cp -r dracut/* /usr/lib/dracut/modules.d
|
COPY +build-kcrypt/kcrypt /usr/bin/kcrypt
|
||||||
RUN cp dracut.conf /etc/dracut.conf.d/10-kcrypt.conf
|
COPY +dracut-artifacts/29kcrypt /usr/lib/dracut/modules.d/29kcrypt
|
||||||
|
COPY +dracut-artifacts/10-kcrypt.conf /etc/dracut.conf.d/10-kcrypt.conf
|
||||||
RUN kernel=$(ls /lib/modules | head -n1) && \
|
RUN kernel=$(ls /lib/modules | head -n1) && \
|
||||||
dracut -f "/boot/initrd-${kernel}" "${kernel}" && \
|
dracut -f "/boot/initrd-${kernel}" "${kernel}" && \
|
||||||
ln -sf "initrd-${kernel}" /boot/initrd
|
ln -sf "initrd-${kernel}" /boot/initrd
|
||||||
@ -61,3 +75,21 @@ iso:
|
|||||||
RUN sha256sum $ISO_NAME.iso > $ISO_NAME.iso.sha256
|
RUN sha256sum $ISO_NAME.iso > $ISO_NAME.iso.sha256
|
||||||
SAVE ARTIFACT /build/$ISO_NAME.iso iso AS LOCAL build/$ISO_NAME.iso
|
SAVE ARTIFACT /build/$ISO_NAME.iso iso AS LOCAL build/$ISO_NAME.iso
|
||||||
SAVE ARTIFACT /build/$ISO_NAME.iso.sha256 sha256 AS LOCAL build/$ISO_NAME.iso.sha256
|
SAVE ARTIFACT /build/$ISO_NAME.iso.sha256 sha256 AS LOCAL build/$ISO_NAME.iso.sha256
|
||||||
|
|
||||||
|
lint:
|
||||||
|
BUILD +golint
|
||||||
|
BUILD +yamllint
|
||||||
|
|
||||||
|
golint:
|
||||||
|
ARG GO_VERSION
|
||||||
|
FROM golang:$GO_VERSION
|
||||||
|
ARG GOLINT_VERSION
|
||||||
|
RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v$GOLINT_VERSION
|
||||||
|
WORKDIR /build
|
||||||
|
COPY . .
|
||||||
|
RUN golangci-lint run
|
||||||
|
|
||||||
|
yamllint:
|
||||||
|
FROM cytopia/yamllint
|
||||||
|
COPY . .
|
||||||
|
RUN yamllint .github/workflows/
|
||||||
|
64
README.md
Normal file
64
README.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<h1 align="center">
|
||||||
|
<br>
|
||||||
|
<img width="184" alt="kairos-white-column 5bc2fe34" src="https://user-images.githubusercontent.com/2420543/193010398-72d4ba6e-7efe-4c2e-b7ba-d3a826a55b7d.png"><br>
|
||||||
|
Kcrypt
|
||||||
|
<br>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<h3 align="center">Cloud native guardian for persistent data in the edge</h3>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://opensource.org/licenses/">
|
||||||
|
<img src="https://img.shields.io/badge/licence-APL2-brightgreen"
|
||||||
|
alt="license">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/kairos-io/kcrypt/issues"><img src="https://img.shields.io/github/issues/kairos-io/kcrypt"></a>
|
||||||
|
<a href="https://kairos.io/docs/" target=_blank> <img src="https://img.shields.io/badge/Documentation-blue"
|
||||||
|
alt="docs"></a>
|
||||||
|
<img src="https://img.shields.io/badge/made%20with-Go-blue">
|
||||||
|
<img src="https://goreportcard.com/badge/github.com/kairos-io/kcrypt" alt="go report card" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
With Kairos you can build immutable, bootable Kubernetes and OS images for your edge devices as easily as writing a Dockerfile. Optional P2P mesh with distributed ledger automates node bootstrapping and coordination. Updating nodes is as easy as CI/CD: push a new image to your container registry and let secure, risk-free A/B atomic upgrades do the rest.
|
||||||
|
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th align="center">
|
||||||
|
<img width="640" height="1px">
|
||||||
|
<p>
|
||||||
|
<small>
|
||||||
|
Documentation
|
||||||
|
</small>
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
<th align="center">
|
||||||
|
<img width="640" height="1">
|
||||||
|
<p>
|
||||||
|
<small>
|
||||||
|
Contribute
|
||||||
|
</small>
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
📚 [Getting started with Kairos](https://kairos.io/docs/getting-started) <br> :bulb: [Examples](https://kairos.io/docs/examples) <br> :movie_camera: [Video](https://kairos.io/docs/media/) <br> :open_hands:[Engage with the Community](https://kairos.io/community/)
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
🙌[ CONTRIBUTING.md ]( https://github.com/kairos-io/kairos/blob/master/CONTRIBUTING.md ) <br> :raising_hand: [ GOVERNANCE ]( https://github.com/kairos-io/kairos/blob/master/GOVERNANCE.md ) <br>:construction_worker:[Code of conduct](https://github.com/kairos-io/kairos/blob/master/CODE_OF_CONDUCT.md)
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This is the Kairos internal component which delegates encryption and decryption of partitions in a Kairos system.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
See the documentation in our website: https://kairos.io/docs/advanced/partition_encryption/.
|
@ -1 +0,0 @@
|
|||||||
add_dracutmodules+=" kcrypt "
|
|
@ -1,40 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
|
|
||||||
|
|
||||||
GENERATOR_DIR="$2"
|
|
||||||
|
|
||||||
[ -z "$GENERATOR_DIR" ] && exit 1
|
|
||||||
[ -d "$GENERATOR_DIR" ] || mkdir "$GENERATOR_DIR"
|
|
||||||
|
|
||||||
if getargbool 0 rd.neednet; then
|
|
||||||
{
|
|
||||||
echo "[Unit]"
|
|
||||||
echo "DefaultDependencies=no"
|
|
||||||
echo "Description=kcrypt online mount"
|
|
||||||
echo "Before=cos-immutable-rootfs.service"
|
|
||||||
echo "After=network-online.target"
|
|
||||||
echo "Wants=network-online.target"
|
|
||||||
echo "[Service]"
|
|
||||||
echo "Type=oneshot"
|
|
||||||
echo "RemainAfterExit=no"
|
|
||||||
echo "ExecStart=/sbin/kcrypt-mount-local"
|
|
||||||
} > "$GENERATOR_DIR"/kcrypt.service
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo "[Unit]"
|
|
||||||
echo "DefaultDependencies=no"
|
|
||||||
echo "Description=kcrypt mount"
|
|
||||||
echo "Before=cos-immutable-rootfs.service"
|
|
||||||
echo "[Service]"
|
|
||||||
echo "Type=oneshot"
|
|
||||||
echo "RemainAfterExit=no"
|
|
||||||
echo "ExecStart=/sbin/kcrypt-mount-local"
|
|
||||||
} > "$GENERATOR_DIR"/kcrypt.service
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -e "$GENERATOR_DIR/initrd-fs.target.requires/kcrypt.service" ]; then
|
|
||||||
mkdir -p "$GENERATOR_DIR"/initrd-fs.target.requires
|
|
||||||
ln -s "$GENERATOR_DIR"/kcrypt.service \
|
|
||||||
"$GENERATOR_DIR"/initrd-fs.target.requires/kcrypt.service
|
|
||||||
fi
|
|
@ -1,36 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# called by dracut
|
|
||||||
check() {
|
|
||||||
require_binaries "$systemdutildir"/systemd || return 1
|
|
||||||
return 255
|
|
||||||
}
|
|
||||||
|
|
||||||
# called by dracut
|
|
||||||
depends() {
|
|
||||||
echo systemd rootfs-block dm fs-lib
|
|
||||||
#tpm2-tss
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# called by dracut
|
|
||||||
installkernel() {
|
|
||||||
instmods overlay
|
|
||||||
}
|
|
||||||
|
|
||||||
# called by dracut
|
|
||||||
install() {
|
|
||||||
declare moddir=${moddir}
|
|
||||||
declare systemdutildir=${systemdutildir}
|
|
||||||
declare systemdsystemunitdir=${systemdsystemunitdir}
|
|
||||||
declare initdir="${initdir}"
|
|
||||||
|
|
||||||
inst_multiple \
|
|
||||||
kcrypt
|
|
||||||
inst_script "${moddir}/mount-local.sh" "/sbin/kcrypt-mount-local"
|
|
||||||
#inst_hook pre-trigger 10 "$moddir/mount-local.sh"
|
|
||||||
inst_script "${moddir}/generator.sh" \
|
|
||||||
"${systemdutildir}/system-generators/dracut-kcrypt-generator"
|
|
||||||
|
|
||||||
dracut_need_initqueue
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
|
||||||
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
|
||||||
|
|
||||||
type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
|
|
||||||
|
|
||||||
PATH=/usr/sbin:/usr/bin:/sbin:/bin
|
|
||||||
|
|
||||||
OEM=$(blkid -L COS_OEM)
|
|
||||||
if [ "$OEM" != "" ]; then
|
|
||||||
mkdir /oem
|
|
||||||
mount $OEM /oem
|
|
||||||
fi
|
|
||||||
|
|
||||||
kcrypt unlock-all
|
|
||||||
|
|
||||||
if [ "$OEM" != "" ]; then
|
|
||||||
umount /oem
|
|
||||||
fi
|
|
3
earthly.sh
Executable file
3
earthly.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
docker run --privileged -v /var/run/docker.sock:/var/run/docker.sock --rm -t -v "$(pwd)":/workspace -v earthly-tmp:/tmp/earthly:rw earthly/earthly:v0.6.21 --allow-privileged "$@"
|
119
go.mod
119
go.mod
@ -1,38 +1,111 @@
|
|||||||
module github.com/kairos-io/kcrypt
|
module github.com/kairos-io/kcrypt
|
||||||
|
|
||||||
go 1.18
|
go 1.24.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/anatol/luks.go v0.0.0-20220803222236-155595903818
|
github.com/anatol/luks.go v0.0.0-20250316021219-8cd744c3576f
|
||||||
github.com/hashicorp/go-multierror v1.1.1
|
github.com/gofrs/uuid v4.4.0+incompatible
|
||||||
github.com/jaypipes/ghw v0.9.0
|
github.com/jaypipes/ghw v0.17.0
|
||||||
github.com/mudler/go-pluggable v0.0.0-20220716112424-189d463e3ff3
|
github.com/kairos-io/kairos-sdk v0.9.4
|
||||||
github.com/onsi/ginkgo/v2 v2.5.0
|
github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5
|
||||||
github.com/onsi/gomega v1.24.0
|
github.com/onsi/ginkgo/v2 v2.23.4
|
||||||
github.com/otiai10/copy v1.7.0
|
github.com/onsi/gomega v1.37.0
|
||||||
|
github.com/otiai10/copy v1.14.1
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/urfave/cli v1.22.9
|
github.com/urfave/cli/v2 v2.27.6
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
atomicgo.dev/cursor v0.2.0 // indirect
|
||||||
|
atomicgo.dev/keyboard v0.2.9 // indirect
|
||||||
|
atomicgo.dev/schedule v0.1.0 // indirect
|
||||||
|
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||||
|
github.com/Microsoft/hcsshim v0.12.9 // indirect
|
||||||
github.com/StackExchange/wmi v1.2.1 // indirect
|
github.com/StackExchange/wmi v1.2.1 // indirect
|
||||||
github.com/anatol/devmapper.go v0.0.0-20220716012224-693a1447fc15 // indirect
|
github.com/anatol/devmapper.go v0.0.0-20230829043248-59ac2b9706ba // indirect
|
||||||
|
github.com/avast/retry-go v3.0.0+incompatible // indirect
|
||||||
|
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect
|
||||||
github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 // indirect
|
github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect
|
github.com/containerd/cgroups/v3 v3.0.5 // indirect
|
||||||
github.com/ghodss/yaml v1.0.0 // indirect
|
github.com/containerd/console v1.0.4 // indirect
|
||||||
github.com/go-logr/logr v1.2.3 // indirect
|
github.com/containerd/containerd v1.7.27 // indirect
|
||||||
|
github.com/containerd/continuity v0.4.5 // indirect
|
||||||
|
github.com/containerd/errdefs v1.0.0 // indirect
|
||||||
|
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
||||||
|
github.com/containerd/log v0.1.0 // indirect
|
||||||
|
github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect
|
||||||
|
github.com/containerd/typeurl/v2 v2.2.3 // indirect
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
|
||||||
|
github.com/denisbrodbeck/machineid v1.0.1 // indirect
|
||||||
|
github.com/dgryski/go-camellia v0.0.0-20191119043421-69a8a13fb23d // indirect
|
||||||
|
github.com/distribution/reference v0.6.0 // indirect
|
||||||
|
github.com/docker/cli v27.5.0+incompatible // indirect
|
||||||
|
github.com/docker/distribution v2.8.3+incompatible // indirect
|
||||||
|
github.com/docker/docker v27.5.1+incompatible // indirect
|
||||||
|
github.com/docker/docker-credential-helpers v0.8.2 // indirect
|
||||||
|
github.com/docker/go-connections v0.5.0 // indirect
|
||||||
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||||
github.com/google/go-cmp v0.5.9 // indirect
|
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/jaypipes/pcidb v1.0.0 // indirect
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||||
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
|
github.com/google/go-containerregistry v0.20.3 // indirect
|
||||||
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
|
||||||
|
github.com/gookit/color v1.5.4 // indirect
|
||||||
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
|
github.com/itchyny/gojq v0.12.17 // indirect
|
||||||
|
github.com/itchyny/timefmt-go v0.1.6 // indirect
|
||||||
|
github.com/jaypipes/pcidb v1.0.1 // indirect
|
||||||
|
github.com/joho/godotenv v1.5.1 // indirect
|
||||||
|
github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 // indirect
|
||||||
|
github.com/klauspost/compress v1.17.11 // indirect
|
||||||
|
github.com/lithammer/fuzzysearch v1.1.8 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 // indirect
|
github.com/moby/docker-image-spec v1.3.1 // indirect
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
github.com/moby/sys/sequential v0.6.0 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
|
github.com/moby/sys/userns v0.1.0 // indirect
|
||||||
golang.org/x/net v0.1.0 // indirect
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
||||||
golang.org/x/sys v0.1.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
golang.org/x/text v0.4.0 // indirect
|
github.com/opencontainers/image-spec v1.1.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
github.com/otiai10/mint v1.6.3 // indirect
|
||||||
|
github.com/pterm/pterm v0.12.80 // indirect
|
||||||
|
github.com/qeesung/image2ascii v1.0.1 // indirect
|
||||||
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
|
github.com/rs/zerolog v1.33.0 // indirect
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
|
github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af // indirect
|
||||||
|
github.com/twpayne/go-vfs/v4 v4.3.0 // indirect
|
||||||
|
github.com/vbatts/tar-split v0.11.6 // indirect
|
||||||
|
github.com/wayneashleyberry/terminal-dimensions v1.1.0 // indirect
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
||||||
|
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
||||||
|
go.opencensus.io v0.24.0 // indirect
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
|
||||||
|
go.opentelemetry.io/otel v1.34.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/metric v1.34.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/trace v1.34.0 // indirect
|
||||||
|
go.uber.org/automaxprocs v1.6.0 // indirect
|
||||||
|
golang.org/x/crypto v0.36.0 // indirect
|
||||||
|
golang.org/x/net v0.38.0 // indirect
|
||||||
|
golang.org/x/sync v0.12.0 // indirect
|
||||||
|
golang.org/x/sys v0.32.0 // indirect
|
||||||
|
golang.org/x/term v0.30.0 // indirect
|
||||||
|
golang.org/x/text v0.23.0 // indirect
|
||||||
|
golang.org/x/tools v0.31.0 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect
|
||||||
|
google.golang.org/grpc v1.70.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.5 // indirect
|
||||||
howett.net/plist v1.0.0 // indirect
|
howett.net/plist v1.0.0 // indirect
|
||||||
)
|
)
|
||||||
|
490
go.sum
490
go.sum
@ -1,106 +1,407 @@
|
|||||||
|
atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg=
|
||||||
|
atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ=
|
||||||
|
atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw=
|
||||||
|
atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU=
|
||||||
|
atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8=
|
||||||
|
atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ=
|
||||||
|
atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs=
|
||||||
|
atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU=
|
||||||
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
|
||||||
|
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs=
|
||||||
|
github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8=
|
||||||
|
github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII=
|
||||||
|
github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k=
|
||||||
|
github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI=
|
||||||
|
github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c=
|
||||||
|
github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE=
|
||||||
|
github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4=
|
||||||
|
github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY=
|
||||||
|
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||||
|
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||||
|
github.com/Microsoft/hcsshim v0.12.9 h1:2zJy5KA+l0loz1HzEGqyNnjd3fyZA31ZBCGKacp6lLg=
|
||||||
|
github.com/Microsoft/hcsshim v0.12.9/go.mod h1:fJ0gkFAna6ukt0bLdKB8djt4XIJhF/vEPuoIWYVvZ8Y=
|
||||||
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
|
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
|
||||||
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
|
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
|
||||||
github.com/anatol/devmapper.go v0.0.0-20220716012224-693a1447fc15 h1:741Z9HQjbLXe4SnZ6liQTYINeD559oFl/vOtzA21KM0=
|
github.com/anatol/devmapper.go v0.0.0-20230829043248-59ac2b9706ba h1:LJ/tQNki21ep58+YZElkXQVpswENcK66NMNv4JGZf7w=
|
||||||
github.com/anatol/devmapper.go v0.0.0-20220716012224-693a1447fc15/go.mod h1:Ow7/kdG1m4K6UDTOwJeYJv9bkSLoL44qSu7S/Bxxi4Y=
|
github.com/anatol/devmapper.go v0.0.0-20230829043248-59ac2b9706ba/go.mod h1:yZpXZj/k3rAZDY43DteaEzbnnxiz9OYijJqRcqWMKSw=
|
||||||
github.com/anatol/luks.go v0.0.0-20220803222236-155595903818 h1:IyYgXFMhnSIbkDnDrTnMrPDYlc/uYhG5UcGX6NVkO58=
|
github.com/anatol/luks.go v0.0.0-20250316021219-8cd744c3576f h1:4tLJrnm3h3biCFsXHQ9w6DVGwuZXW4KMfiKV/atSYXg=
|
||||||
github.com/anatol/luks.go v0.0.0-20220803222236-155595903818/go.mod h1:1lE8PgTi0cS+3YsxbWcpfvGfjiPrRdcKJZc9j70OOTs=
|
github.com/anatol/luks.go v0.0.0-20250316021219-8cd744c3576f/go.mod h1:kEOnWwULAKOORfFvE4dEkdRZJS7+NMJKxRb/vWvmARk=
|
||||||
github.com/anatol/vmtest v0.0.0-20220413190228-7a42f1f6d7b8 h1:t4JGeY9oaF5LB4Rdx9e2wARRRPAYt8Ow4eCf5SwO3fA=
|
github.com/anatol/vmtest v0.0.0-20230711210602-87511df0d4bc h1:xMQuzBhj6hXQZufedPQM2OiGX2UcQHSptXtG3+28S8Q=
|
||||||
|
github.com/anatol/vmtest v0.0.0-20230711210602-87511df0d4bc/go.mod h1:NC+g66bgkUjV1unIJXhHO35RHxVViWUzNeeKAkkO7DU=
|
||||||
|
github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk=
|
||||||
|
github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0=
|
||||||
|
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
|
||||||
|
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
|
||||||
|
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 h1:xz6Nv3zcwO2Lila35hcb0QloCQsc38Al13RNEzWRpX4=
|
github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 h1:xz6Nv3zcwO2Lila35hcb0QloCQsc38Al13RNEzWRpX4=
|
||||||
github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9/go.mod h1:2wSM9zJkl1UQEFZgSd68NfCgRz1VL1jzy/RjCg+ULrs=
|
github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9/go.mod h1:2wSM9zJkl1UQEFZgSd68NfCgRz1VL1jzy/RjCg+ULrs=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0=
|
||||||
|
github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0=
|
||||||
|
github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo=
|
||||||
|
github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins=
|
||||||
|
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
|
||||||
|
github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro=
|
||||||
|
github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
|
||||||
|
github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
|
||||||
|
github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0=
|
||||||
|
github.com/containerd/continuity v0.4.4 h1:/fNVfTJ7wIl/YPMHjf+5H32uFhl63JucB34PlCpMKII=
|
||||||
|
github.com/containerd/continuity v0.4.4/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=
|
||||||
|
github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4=
|
||||||
|
github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=
|
||||||
|
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
|
||||||
|
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
|
||||||
|
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
|
||||||
|
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
|
||||||
|
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
|
||||||
|
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
|
||||||
|
github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8=
|
||||||
|
github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU=
|
||||||
|
github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40=
|
||||||
|
github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||||
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ=
|
||||||
|
github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI=
|
||||||
|
github.com/dgryski/go-camellia v0.0.0-20191119043421-69a8a13fb23d h1:CPqTNIigGweVPT4CYb+OO2E6XyRKFOmvTHwWRLgCAlE=
|
||||||
|
github.com/dgryski/go-camellia v0.0.0-20191119043421-69a8a13fb23d/go.mod h1:QX5ZVULjAfZJux/W62Y91HvCh9hyW6enAwcrrv/sLj0=
|
||||||
|
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
||||||
|
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||||
|
github.com/docker/cli v27.5.0+incompatible h1:aMphQkcGtpHixwwhAXJT1rrK/detk2JIvDaFkLctbGM=
|
||||||
|
github.com/docker/cli v27.5.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
|
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
||||||
|
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
|
github.com/docker/docker v27.5.1+incompatible h1:4PYU5dnBYqRQi0294d1FBECqT9ECWeQAIfE8q4YnPY8=
|
||||||
|
github.com/docker/docker v27.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
|
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
|
||||||
|
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
||||||
|
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
||||||
|
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
|
||||||
|
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
||||||
|
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
||||||
|
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||||
|
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
|
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||||
|
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
|
||||||
|
github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||||
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
|
||||||
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
|
||||||
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||||
|
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
|
github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI=
|
||||||
|
github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI=
|
||||||
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
|
||||||
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ=
|
||||||
|
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
|
||||||
|
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
|
||||||
|
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
|
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||||
|
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg=
|
||||||
github.com/jaypipes/ghw v0.9.0 h1:TWF4wNIGtZcgDJaiNcFgby5BR8s2ixcUe0ydxNO2McY=
|
github.com/itchyny/gojq v0.12.17/go.mod h1:WBrEMkgAfAGO1LUcGOckBl5O726KPp+OlkKug0I/FEY=
|
||||||
github.com/jaypipes/ghw v0.9.0/go.mod h1:dXMo19735vXOjpIBDyDYSp31sB2u4hrtRCMxInqQ64k=
|
github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=
|
||||||
github.com/jaypipes/pcidb v1.0.0 h1:vtZIfkiCUE42oYbJS0TAq9XSfSmcsgo9IdxSm9qzYU8=
|
github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg=
|
||||||
github.com/jaypipes/pcidb v1.0.0/go.mod h1:TnYUvqhPBzCKnH34KrIX22kAeEbDCSRJ9cqLRCuNDfk=
|
github.com/jaypipes/ghw v0.16.0 h1:3HurCTS38VNpeQLo5fIdZsySuo/qAfpPSJ5t05QBFPM=
|
||||||
|
github.com/jaypipes/ghw v0.16.0/go.mod h1:In8SsaDqlb1oTyrbmTC14uy+fbBMvp+xdqX51MidlD8=
|
||||||
|
github.com/jaypipes/ghw v0.17.0 h1:EVLJeNcy5z6GK/Lqby0EhBpynZo+ayl8iJWY0kbEUJA=
|
||||||
|
github.com/jaypipes/ghw v0.17.0/go.mod h1:In8SsaDqlb1oTyrbmTC14uy+fbBMvp+xdqX51MidlD8=
|
||||||
|
github.com/jaypipes/pcidb v1.0.1 h1:WB2zh27T3nwg8AE8ei81sNRb9yWBii3JGNJtT7K9Oic=
|
||||||
|
github.com/jaypipes/pcidb v1.0.1/go.mod h1:6xYUz/yYEyOkIkUt2t2J2folIuZ4Yg6uByCGFXMCeE4=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
|
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||||
|
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
|
github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 h1:G+9t9cEtnC9jFiTxyptEKuNIAbiN5ZCQzX2a74lj3xg=
|
||||||
|
github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004/go.mod h1:KmHnJWQrgEvbuy0vcvj00gtMqbvNn1L+3YUZLK/B92c=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.7.3 h1:OyDSEQVtc1MnRrP3M8d+wref0RA3eZof/FTL5ETOlXM=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.7.3/go.mod h1:ZSxP3VgOE2+f/3IdPNcGK7qcYLWl44zV+gq0m+9ovoo=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.8.1 h1:e4BRX5zkwp6cDYqEAYZOKUKdryEq3+Zi1skqyHMI6gg=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.8.1/go.mod h1:+8n8VBTe9XAvjZCpm8rk6IRdXeMKgqyQpqHq/Kr+L9o=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.0 h1:Bcpf3nUwGvzreIdXBIZZRnS2LDPs496C0Reo+dpbkMs=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.0/go.mod h1:O3si3aCkYsOyjjLF2jKKTKUYW9948WcB7xR0ivKbB6M=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.1 h1:5MagNf3ghNsQaH6sVXXLVSjClrDQ9UZrxjHYRghk26Q=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.1/go.mod h1:O3si3aCkYsOyjjLF2jKKTKUYW9948WcB7xR0ivKbB6M=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.2 h1:A/9rbRpjZsBWniXSPzvT7I2dbbukgveUjrvk9iXH4AE=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.2/go.mod h1:O3si3aCkYsOyjjLF2jKKTKUYW9948WcB7xR0ivKbB6M=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.3 h1:je3Q0mfm1p4y3jO3k0P/SUp4NEax8IwLveDlnZBB8Yc=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.3/go.mod h1:O3si3aCkYsOyjjLF2jKKTKUYW9948WcB7xR0ivKbB6M=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.4 h1:cN4IVEPzNFHbu2/cTyX5CDtL+IGJdw7wSNLTrWwB4mU=
|
||||||
|
github.com/kairos-io/kairos-sdk v0.9.4/go.mod h1:O3si3aCkYsOyjjLF2jKKTKUYW9948WcB7xR0ivKbB6M=
|
||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||||
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
||||||
|
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||||
|
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
|
github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
||||||
|
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
||||||
|
github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU=
|
||||||
|
github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4=
|
||||||
|
github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4=
|
||||||
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
|
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
|
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||||
|
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mudler/go-pluggable v0.0.0-20220716112424-189d463e3ff3 h1:t4X6t8WisUy5mExfS58RBOkzaEGmuor5kOUMQS8lT2g=
|
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
|
||||||
github.com/mudler/go-pluggable v0.0.0-20220716112424-189d463e3ff3/go.mod h1:WmKcT8ONmhDQIqQ+HxU+tkGWjzBEyY/KFO8LTGCu4AI=
|
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
|
||||||
|
github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg=
|
||||||
|
github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
|
||||||
|
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
||||||
|
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
||||||
|
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
|
||||||
|
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
|
||||||
|
github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA=
|
||||||
|
github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
|
||||||
|
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
||||||
|
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||||
|
github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5 h1:FaZD86+A9mVt7lh9glAryzQblMsbJYU2VnrdZ8yHlTs=
|
||||||
|
github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5/go.mod h1:WmKcT8ONmhDQIqQ+HxU+tkGWjzBEyY/KFO8LTGCu4AI=
|
||||||
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||||
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M=
|
github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M=
|
||||||
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||||
github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls=
|
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
|
||||||
github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw=
|
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
github.com/onsi/gomega v1.24.0 h1:+0glovB9Jd6z3VR+ScSwQqXVTIfJcGA9UBM8yzQxhqg=
|
github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
|
||||||
github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg=
|
github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
|
||||||
github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
|
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
|
||||||
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
|
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
|
||||||
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8=
|
||||||
github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI=
|
github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I=
|
||||||
github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
|
github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
|
||||||
|
github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI=
|
||||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg=
|
||||||
|
github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE=
|
||||||
|
github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU=
|
||||||
|
github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE=
|
||||||
|
github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8=
|
||||||
|
github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s=
|
||||||
|
github.com/pterm/pterm v0.12.80 h1:mM55B+GnKUnLMUSqhdINe4s6tOuVQIetQ3my8JGyAIg=
|
||||||
|
github.com/pterm/pterm v0.12.80/go.mod h1:c6DeF9bSnOSeFPZlfs4ZRAFcf5SCoTwvwQ5xaKGQlHo=
|
||||||
|
github.com/qeesung/image2ascii v1.0.1 h1:Fe5zTnX/v/qNC3OC4P/cfASOXS501Xyw2UUcgrLgtp4=
|
||||||
|
github.com/qeesung/image2ascii v1.0.1/go.mod h1:kZKhyX0h2g/YXa/zdJR3JnLnJ8avHjZ3LrvEKSYyAyU=
|
||||||
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
|
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||||
|
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
||||||
|
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
|
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
|
||||||
|
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
|
||||||
|
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
|
github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af h1:Sp5TG9f7K39yfB+If0vjp97vuT74F72r8hfRpP8jLU0=
|
||||||
|
github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
|
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
|
||||||
|
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/tmc/scp v0.0.0-20170824174625-f7b48647feef h1:7D6Nm4D6f0ci9yttWaKjM1TMAXrH5Su72dojqYGntFY=
|
github.com/tmc/scp v0.0.0-20170824174625-f7b48647feef h1:7D6Nm4D6f0ci9yttWaKjM1TMAXrH5Su72dojqYGntFY=
|
||||||
github.com/urfave/cli v1.22.9 h1:cv3/KhXGBGjEXLC4bH0sLuJ9BewaAbpk5oyMOveu4pw=
|
github.com/tmc/scp v0.0.0-20170824174625-f7b48647feef/go.mod h1:WLFStEdnJXpjK8kd4qKLwQKX/1vrDzp5BcDyiZJBHJM=
|
||||||
github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
github.com/twpayne/go-vfs/v4 v4.3.0 h1:rTqFzzOQ/6ESKTSiwVubHlCBedJDOhQyVSnw8rQNZhU=
|
||||||
|
github.com/twpayne/go-vfs/v4 v4.3.0/go.mod h1:tq2UVhnUepesc0lSnPJH/jQ8HruGhzwZe2r5kDFpEIw=
|
||||||
|
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
|
||||||
|
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
|
||||||
|
github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs=
|
||||||
|
github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI=
|
||||||
|
github.com/wayneashleyberry/terminal-dimensions v1.1.0 h1:EB7cIzBdsOzAgmhTUtTTQXBByuPheP/Zv1zL2BRPY6g=
|
||||||
|
github.com/wayneashleyberry/terminal-dimensions v1.1.0/go.mod h1:2lc/0eWCObmhRczn2SdGSQtgBooLUzIotkkEGXqghyg=
|
||||||
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
|
||||||
|
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
|
||||||
|
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
|
||||||
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||||
|
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
|
||||||
|
go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw=
|
||||||
|
go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I=
|
||||||
|
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
|
||||||
|
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0=
|
||||||
|
go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ=
|
||||||
|
go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M=
|
||||||
|
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
|
||||||
|
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM=
|
||||||
|
go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s=
|
||||||
|
go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck=
|
||||||
|
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
|
||||||
|
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY=
|
||||||
|
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
|
||||||
|
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||||
|
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||||
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
|
||||||
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
|
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
|
||||||
|
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||||
|
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||||
|
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
||||||
|
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -111,26 +412,91 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
||||||
|
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
|
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
|
||||||
|
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
|
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||||
|
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||||
|
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||||
|
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
|
golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
|
||||||
|
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ=
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q=
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b h1:FQtJ1MxbXoIIrZHZ33M+w5+dAP9o86rgpjoKr/ZmT7k=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
|
||||||
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
|
google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0=
|
||||||
|
google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw=
|
||||||
|
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
|
||||||
|
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
|
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
|
||||||
|
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
@ -138,9 +504,13 @@ gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa
|
|||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY=
|
||||||
|
gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
|
||||||
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
|
howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
|
||||||
howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
|
howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
|
||||||
|
397
main.go
397
main.go
@ -2,367 +2,102 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
luks "github.com/anatol/luks.go"
|
"github.com/kairos-io/kairos-sdk/types"
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
"github.com/kairos-io/kcrypt/pkg/lib"
|
||||||
"github.com/jaypipes/ghw"
|
"github.com/urfave/cli/v2"
|
||||||
"github.com/jaypipes/ghw/pkg/block"
|
|
||||||
"github.com/kairos-io/kcrypt/pkg/bus"
|
|
||||||
"github.com/mudler/go-pluggable"
|
|
||||||
cp "github.com/otiai10/copy"
|
|
||||||
"github.com/urfave/cli"
|
|
||||||
|
|
||||||
pi "github.com/kairos-io/kcrypt/pkg/partition_info"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func waitdevice(device string, attempts int) error {
|
var Version = "v0.0.0-dev"
|
||||||
for tries := 0; tries < attempts; tries++ {
|
|
||||||
sh("udevadm settle")
|
|
||||||
_, err := os.Lstat(device)
|
|
||||||
if !os.IsNotExist(err) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
}
|
|
||||||
return fmt.Errorf("no device found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Ask to discovery a pass to unlock. keep waiting until we get it and a timeout is exhausted with retrials (exp backoff)
|
|
||||||
func getPassword(b *block.Partition) (password string, err error) {
|
|
||||||
bus.Reload()
|
|
||||||
|
|
||||||
bus.Manager.Response(bus.EventDiscoveryPassword, func(p *pluggable.Plugin, r *pluggable.EventResponse) {
|
|
||||||
password = r.Data
|
|
||||||
if r.Errored() {
|
|
||||||
err = fmt.Errorf("failed discovery: %s", r.Error)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
bus.Manager.Publish(bus.EventDiscoveryPassword, b)
|
|
||||||
|
|
||||||
if password == "" {
|
|
||||||
return password, fmt.Errorf("received empty password")
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func luksUnlock(device, mapper, password string) error {
|
|
||||||
dev, err := luks.Open(device)
|
|
||||||
if err != nil {
|
|
||||||
// handle error
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer dev.Close()
|
|
||||||
|
|
||||||
err = dev.Unlock(0, []byte(password), mapper)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func unlockDisk(b *block.Partition) error {
|
|
||||||
pass, err := getPassword(b)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("error retreiving password remotely: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return luksUnlock(fmt.Sprintf("/dev/%s", b.Name), b.Name, pass)
|
|
||||||
}
|
|
||||||
|
|
||||||
func createLuks(dev, password, version string, cryptsetupArgs ...string) error {
|
|
||||||
if version == "" {
|
|
||||||
version = "luks2"
|
|
||||||
}
|
|
||||||
args := []string{"luksFormat", "--type", version, "--iter-time", "5", "-q", dev}
|
|
||||||
args = append(args, cryptsetupArgs...)
|
|
||||||
cmd := exec.Command("cryptsetup", args...)
|
|
||||||
cmd.Stdin = strings.NewReader(password)
|
|
||||||
cmd.Stdout = os.Stdout
|
|
||||||
cmd.Stderr = os.Stderr
|
|
||||||
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func createDiskImage() (*os.File, error) {
|
|
||||||
disk, err := ioutil.TempFile("", "luksv2.go.disk")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := disk.Truncate(24 * 1024 * 1024); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return disk, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: A crypt disk utility to call after install, that with discovery discoveries the password that should be used
|
|
||||||
// this function should delete COS_PERSISTENT. delete the partition and create a luks+type in place.
|
|
||||||
|
|
||||||
// Take a part label, and recreates it with LUKS. IT OVERWRITES DATA!
|
|
||||||
// On success, it returns a machine parseable string with the partition information
|
|
||||||
// (label:name:uuid) so that it can be stored by the caller for later use.
|
|
||||||
// This is because the label of the encrypted partition is not accessible unless
|
|
||||||
// the partition is decrypted first and the uuid changed after encryption so
|
|
||||||
// any stored information needs to be updated (by the caller).
|
|
||||||
func luksify(label string) (string, error) {
|
|
||||||
// blkid
|
|
||||||
persistent, b, err := findPartition(label)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
pass, err := getPassword(b)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
persistent = fmt.Sprintf("/dev/%s", persistent)
|
|
||||||
devMapper := fmt.Sprintf("/dev/mapper/%s", b.Name)
|
|
||||||
|
|
||||||
if err := createLuks(persistent, pass, "luks1"); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := luksUnlock(persistent, b.Name, pass); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := waitdevice(devMapper, 10); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
out, err := sh(fmt.Sprintf("mkfs.ext4 -L %s %s", label, devMapper))
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("err: %w, out: %s", err, out)
|
|
||||||
}
|
|
||||||
|
|
||||||
out2, err := sh(fmt.Sprintf("cryptsetup close %s", b.Name))
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("err: %w, out: %s", err, out2)
|
|
||||||
}
|
|
||||||
|
|
||||||
return pi.PartitionToString(b), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func findPartition(label string) (string, *block.Partition, error) {
|
|
||||||
block, err := ghw.Block()
|
|
||||||
if err == nil {
|
|
||||||
for _, disk := range block.Disks {
|
|
||||||
for _, p := range disk.Partitions {
|
|
||||||
if p.Label == label {
|
|
||||||
return p.Name, p, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", nil, fmt.Errorf("not found")
|
|
||||||
}
|
|
||||||
|
|
||||||
func sh(c string) (string, error) {
|
|
||||||
o, err := exec.Command("/bin/sh", "-c", c).CombinedOutput()
|
|
||||||
return string(o), err
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
GZType = "gz"
|
|
||||||
XZType = "xz"
|
|
||||||
LZMAType = "lzma"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO: replace with golang native code
|
|
||||||
func detect(archive string) (string, error) {
|
|
||||||
out, err := sh(fmt.Sprintf("file %s", archive))
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
out = strings.ToLower(out)
|
|
||||||
if strings.Contains(out, "xz") {
|
|
||||||
return XZType, nil
|
|
||||||
|
|
||||||
} else if strings.Contains(out, "lzma") {
|
|
||||||
return LZMAType, nil
|
|
||||||
|
|
||||||
} else if strings.Contains(out, "gz") {
|
|
||||||
return GZType, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", fmt.Errorf("Unknown")
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: replace with golang native code
|
|
||||||
func extractInitrd(initrd string, dst string) error {
|
|
||||||
os.MkdirAll(dst, os.ModePerm)
|
|
||||||
var out string
|
|
||||||
var err error
|
|
||||||
format, err := detect(initrd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if format == XZType || format == LZMAType {
|
|
||||||
out, err = sh(fmt.Sprintf("cd %s && xz -dc < %s | cpio -idmv", dst, initrd))
|
|
||||||
} else if format == GZType {
|
|
||||||
out, err = sh(fmt.Sprintf("cd %s && zcat %s | cpio -idmv", dst, initrd))
|
|
||||||
}
|
|
||||||
fmt.Println(out)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func createInitrd(initrd string, src string, format string) error {
|
|
||||||
fmt.Printf("Creating '%s' from '%s' as '%s'\n", initrd, src, format)
|
|
||||||
|
|
||||||
if _, err := os.Stat(src); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
var out string
|
|
||||||
if format == XZType {
|
|
||||||
out, err = sh(fmt.Sprintf("cd %s && find . 2>/dev/null | cpio -H newc --quiet --null -o -R root:root | xz -0 --check=crc32 > %s", src, initrd))
|
|
||||||
} else if format == GZType {
|
|
||||||
out, err = sh(fmt.Sprintf("cd %s && find . | cpio -H newc -o -R root:root | gzip -9 > %s", src, initrd))
|
|
||||||
} else if format == LZMAType {
|
|
||||||
out, err = sh(fmt.Sprintf("cd %s && find . 2>/dev/null | cpio -H newc -o -R root:root | xz -9 --format=lzma > %s", src, initrd))
|
|
||||||
}
|
|
||||||
fmt.Println(out)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: A inject initramfs command to add the discovery e.g. to use inside Dockerfiles
|
|
||||||
|
|
||||||
func injectInitrd(initrd string, file, dst string) error {
|
|
||||||
|
|
||||||
fmt.Printf("Injecting '%s' as '%s' into '%s'\n", file, dst, initrd)
|
|
||||||
format, err := detect(initrd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
tmp, err := ioutil.TempDir("", "kcrypt")
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("cannot create tempdir, %s", err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(tmp)
|
|
||||||
|
|
||||||
fmt.Printf("Extracting '%s' in '%s' ...\n", initrd, tmp)
|
|
||||||
if err := extractInitrd(initrd, tmp); err != nil {
|
|
||||||
return fmt.Errorf("cannot extract initrd, %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
d := filepath.Join(tmp, dst)
|
|
||||||
fmt.Printf("Copying '%s' in '%s' ...\n", file, d)
|
|
||||||
if err := cp.Copy(file, d); err != nil {
|
|
||||||
return fmt.Errorf("cannot copy file, %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return createInitrd(initrd, tmp, format)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: a custom toolkit version, to build out initrd pre-built with this component
|
|
||||||
func unlockAll() error {
|
|
||||||
bus.Manager.Initialize()
|
|
||||||
|
|
||||||
partitionInfo, err := pi.NewPartitionInfoFromFile(pi.DefaultPartitionInfoFile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
block, err := ghw.Block()
|
|
||||||
if err == nil {
|
|
||||||
for _, disk := range block.Disks {
|
|
||||||
for _, p := range disk.Partitions {
|
|
||||||
if p.Type == "crypto_LUKS" {
|
|
||||||
p.Label = partitionInfo.LookupLabelForUUID(p.UUID)
|
|
||||||
fmt.Printf("Unmounted Luks found at '%s' LABEL '%s' \n", p.Name, p.Label)
|
|
||||||
err = multierror.Append(err, unlockDisk(p))
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Unlocking failed: '%s'\n", err.Error())
|
|
||||||
}
|
|
||||||
time.Sleep(10 * time.Second)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := &cli.App{
|
app := &cli.App{
|
||||||
Name: "keiros-kcrypt",
|
Name: "kairos-kcrypt",
|
||||||
Version: "0.1",
|
Version: Version,
|
||||||
Author: "Ettore Di Giacinto",
|
Authors: []*cli.Author{&cli.Author{Name: "Ettore Di Giacinto"}},
|
||||||
Usage: "keiros escrow key agent component",
|
Usage: "kairos escrow key agent component",
|
||||||
Description: ``,
|
Description: ``,
|
||||||
UsageText: ``,
|
UsageText: ``,
|
||||||
Copyright: "Ettore Di Giacinto",
|
Copyright: "Ettore Di Giacinto",
|
||||||
Commands: []cli.Command{
|
Commands: []*cli.Command{
|
||||||
{
|
|
||||||
|
|
||||||
Name: "extract-initrd",
|
|
||||||
Action: func(c *cli.Context) error {
|
|
||||||
if c.NArg() != 2 {
|
|
||||||
return fmt.Errorf("requires 3 args. initrd,, dst")
|
|
||||||
}
|
|
||||||
return extractInitrd(c.Args()[0], c.Args()[1])
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
|
|
||||||
Name: "encrypt",
|
Name: "encrypt",
|
||||||
Description: "Encrypts a partition",
|
Description: "Encrypts a partition",
|
||||||
|
Usage: "Encrypts a partition",
|
||||||
|
ArgsUsage: "kcrypt [--tpm] [--tpm-pcrs] [--public-key-pcrs] LABEL",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "tpm",
|
||||||
|
Usage: "Use TPM measurements to lock the partition",
|
||||||
|
},
|
||||||
|
&cli.StringSliceFlag{
|
||||||
|
Name: "tpm-pcrs",
|
||||||
|
Usage: "tpm pcrs to bind to (single measurement) . Only applies when --tpm is also set.",
|
||||||
|
},
|
||||||
|
&cli.StringSliceFlag{
|
||||||
|
Name: "public-key-pcrs",
|
||||||
|
Usage: "public key pcrs to bind to (policy). Only applies when --tpm is also set.",
|
||||||
|
Value: cli.NewStringSlice("11"),
|
||||||
|
},
|
||||||
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
|
var err error
|
||||||
|
var out string
|
||||||
if c.NArg() != 1 {
|
if c.NArg() != 1 {
|
||||||
return fmt.Errorf("requires 1 arg, the partition label")
|
return fmt.Errorf("requires 1 arg, the partition label")
|
||||||
}
|
}
|
||||||
out, err := luksify(c.Args().First())
|
log := types.NewKairosLogger("kcrypt-lock", "info", false)
|
||||||
|
if c.Bool("tpm") {
|
||||||
|
err = lib.LuksifyMeasurements(c.Args().First(), c.StringSlice("tpm-pcrs"), c.StringSlice("public-key-pcrs"), log)
|
||||||
|
} else {
|
||||||
|
out, err = lib.Luksify(c.Args().First(), log)
|
||||||
|
fmt.Println(out)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println(out)
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
Name: "unlock-all",
|
||||||
|
UsageText: "unlock-all",
|
||||||
|
Usage: "Try to unlock all LUKS partitions",
|
||||||
|
Description: "Typically run during initrd to unlock all the LUKS partitions found",
|
||||||
|
ArgsUsage: "kcrypt [--tpm] unlock-all",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "tpm",
|
||||||
|
Usage: "Use TPM to unlock the partition",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
return lib.UnlockAll(c.Bool("tpm"))
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
Name: "inject-initrd",
|
Name: "extract-initrd",
|
||||||
|
Hidden: true,
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
if c.NArg() != 2 {
|
||||||
|
return fmt.Errorf("requires 3 args. initrd,, dst")
|
||||||
|
}
|
||||||
|
return lib.ExtractInitrd(c.Args().First(), c.Args().Get(1))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "inject-initrd",
|
||||||
|
Hidden: true,
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
if c.NArg() != 3 {
|
if c.NArg() != 3 {
|
||||||
return fmt.Errorf("requires 3 args. initrd, srcfile, dst")
|
return fmt.Errorf("requires 3 args. initrd, srcfile, dst")
|
||||||
}
|
}
|
||||||
return injectInitrd(c.Args()[0], c.Args()[1], c.Args()[2])
|
return lib.InjectInitrd(c.Args().First(), c.Args().Get(1), c.Args().Get(2))
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "unlock-all",
|
|
||||||
UsageText: "unlock-all",
|
|
||||||
Usage: "Try to unlock all LUKS partitions",
|
|
||||||
Description: `
|
|
||||||
Typically run during initrd to unlock all the LUKS partitions found
|
|
||||||
`,
|
|
||||||
ArgsUsage: "kcrypt unlock-all",
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
|
|
||||||
&cli.StringFlag{},
|
|
||||||
},
|
|
||||||
Action: func(c *cli.Context) error {
|
|
||||||
return unlockAll()
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -28,7 +28,7 @@ type Bus struct {
|
|||||||
|
|
||||||
func (b *Bus) LoadProviders() {
|
func (b *Bus) LoadProviders() {
|
||||||
wd, _ := os.Getwd()
|
wd, _ := os.Getwd()
|
||||||
b.Manager.Autoload("kcrypt-discovery", "/system/discovery", "/oem/kcrypt", "/oem/system/discovery", wd).Register()
|
b.Manager.Autoload("kcrypt-discovery", "/sysroot/system/discovery", "/system/discovery", "/oem/kcrypt", "/oem/system/discovery", wd).Register()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bus) Initialize() {
|
func (b *Bus) Initialize() {
|
||||||
|
122
pkg/config/config.go
Normal file
122
pkg/config/config.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
// package config contains all the logic around kcrypt config
|
||||||
|
// This config includes everything below `kcrypt:` in the kairos config yaml
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/jaypipes/ghw/pkg/block"
|
||||||
|
"github.com/kairos-io/kairos-sdk/collector"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// There are the directories under which we expect to find kairos configuration.
|
||||||
|
// When we are booted from an iso (during installation), configuration is expected
|
||||||
|
// under `/oem`. When we are booting an installed system (in initramfs phase),
|
||||||
|
// the path is `/sysroot/oem`.
|
||||||
|
var ConfigScanDirs = []string{"/oem", "/sysroot/oem"}
|
||||||
|
|
||||||
|
// This file is "hardcoded" to `/oem` because we only use this at install time
|
||||||
|
// in which case the config is in `/oem`.
|
||||||
|
var MappingsFile = "/oem/91-kcrypt-mappings.yaml"
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Kcrypt struct {
|
||||||
|
UUIDLabelMappings map[string]string `yaml:"uuid_label_mappings,omitempty"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func PartitionToString(p *block.Partition) string {
|
||||||
|
return fmt.Sprintf("%s:%s:%s", p.FilesystemLabel, p.Name, p.UUID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Takes a partition info string (as returned by PartitionToString) and return
|
||||||
|
// the partition label and the UUID
|
||||||
|
func partitionDataFromString(partitionStr string) (string, string, error) {
|
||||||
|
parts := strings.Split(partitionStr, ":")
|
||||||
|
if len(parts) != 3 {
|
||||||
|
return "", "", errors.New("partition string not valid")
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.TrimSpace(parts[0]), strings.TrimSpace(parts[2]), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetConfiguration(configDirs []string) (Config, error) {
|
||||||
|
var result Config
|
||||||
|
|
||||||
|
o := &collector.Options{MergeBootCMDLine: false}
|
||||||
|
|
||||||
|
if err := o.Apply(collector.Directories(configDirs...), collector.NoLogs); err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := collector.Scan(o, func(d []byte) ([]byte, error) {
|
||||||
|
return d, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
configStr, err := c.String()
|
||||||
|
if err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
if err = yaml.Unmarshal([]byte(configStr), &result); err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMapping updates the Config with partition information for
|
||||||
|
// one partition. This doesn't persist on the file. WriteMappings needs to
|
||||||
|
// be called after all mapping are in the Config (possibly with multiple calls
|
||||||
|
// to this function).
|
||||||
|
func (c *Config) SetMapping(partitionInfo string) error {
|
||||||
|
label, uuid, err := partitionDataFromString(partitionInfo)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Initialize map
|
||||||
|
if c.Kcrypt.UUIDLabelMappings == nil {
|
||||||
|
c.Kcrypt.UUIDLabelMappings = map[string]string{}
|
||||||
|
}
|
||||||
|
c.Kcrypt.UUIDLabelMappings[label] = uuid
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteMappings will create or replace the MappingsFile
|
||||||
|
// It's called by kairos agent, at installation time, after the partitions
|
||||||
|
// have been created (and we have the UUIDs available).
|
||||||
|
func (c *Config) WriteMappings(fileName string) error {
|
||||||
|
data, err := yaml.Marshal(&c)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "marshalling the kcrypt configuration to yaml")
|
||||||
|
}
|
||||||
|
|
||||||
|
data = append([]byte(collector.DefaultHeader+"\n"), data...)
|
||||||
|
|
||||||
|
err = os.WriteFile(fileName, data, 0744)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "writing the kcrypt configuration file")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Config) LookupUUIDForLabel(l string) string {
|
||||||
|
return c.Kcrypt.UUIDLabelMappings[l]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Config) LookupLabelForUUID(uuid string) string {
|
||||||
|
for k, v := range c.Kcrypt.UUIDLabelMappings {
|
||||||
|
if v == uuid {
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
216
pkg/config/config_test.go
Normal file
216
pkg/config/config_test.go
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
package config_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
|
"github.com/kairos-io/kairos-sdk/collector"
|
||||||
|
configpkg "github.com/kairos-io/kcrypt/pkg/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("Config", func() {
|
||||||
|
var tmpDir string
|
||||||
|
var err error
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpDir, err = os.MkdirTemp("", "kcrypt-configuration-*")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
AfterEach(func() {
|
||||||
|
os.RemoveAll(tmpDir)
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("GetConfiguration", func() {
|
||||||
|
When("the no relevant block exists", func() {
|
||||||
|
It("returns empty Config", func() {
|
||||||
|
c, err := configpkg.GetConfiguration([]string{tmpDir})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings).To(BeEmpty())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
When("a kcrypt block exists", func() {
|
||||||
|
var tmpFile *os.File
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpFile, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
data := []byte(`#cloud-config
|
||||||
|
kcrypt:
|
||||||
|
uuid_label_mappings:
|
||||||
|
COS_PERSISTENT: some_uuid_here
|
||||||
|
`)
|
||||||
|
err := os.WriteFile(tmpFile.Name(), data, 0744)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns the Config", func() {
|
||||||
|
c, err := configpkg.GetConfiguration([]string{tmpDir})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings["COS_PERSISTENT"]).To(Equal("some_uuid_here"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
When("multiple kcrypt block exist", func() {
|
||||||
|
var tmpFile1, tmpFile2 *os.File
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpFile1, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
data := []byte(`#cloud-config
|
||||||
|
kcrypt:
|
||||||
|
challenger_server: http://test.org:8082
|
||||||
|
`)
|
||||||
|
err := os.WriteFile(tmpFile1.Name(), data, 0744)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
tmpFile2, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
data = []byte(`#cloud-config
|
||||||
|
kcrypt:
|
||||||
|
uuid_label_mappings:
|
||||||
|
COS_PERSISTENT: some_uuid_here
|
||||||
|
`)
|
||||||
|
err = os.WriteFile(tmpFile2.Name(), data, 0744)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns the merged Config", func() {
|
||||||
|
c, err := configpkg.GetConfiguration([]string{tmpDir})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings["COS_PERSISTENT"]).To(Equal("some_uuid_here"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("SetMapping", func() {
|
||||||
|
var c configpkg.Config
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
c, err = configpkg.GetConfiguration([]string{tmpDir})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("adds partition information when empty and appends when not", func() {
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings).To(BeNil())
|
||||||
|
err := c.SetMapping("some_label:some_name:some_uuid")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings["some_label"]).To(Equal("some_uuid"))
|
||||||
|
|
||||||
|
err = c.SetMapping("some_other_label:some_name:some_other_uuid")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings["some_label"]).To(Equal("some_uuid"))
|
||||||
|
Expect(c.Kcrypt.UUIDLabelMappings["some_other_label"]).To(Equal("some_other_uuid"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("WriteMappings", func() {
|
||||||
|
var tmpFile *os.File
|
||||||
|
var c configpkg.Config
|
||||||
|
|
||||||
|
When("mappings config file already exists", func() {
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpFile, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
data := []byte(`kcrypt:
|
||||||
|
uuid_label_mappings:
|
||||||
|
COS_PERSISTENT: some_uuid_here
|
||||||
|
`)
|
||||||
|
err := os.WriteFile(tmpFile.Name(), data, 0744)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("replaces the file contents", func() {
|
||||||
|
err := c.SetMapping("COS_PERSISTENT:the_new_name:the_new_uuid")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = c.WriteMappings(tmpFile.Name())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
data, err := os.ReadFile(tmpFile.Name())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(collector.HasValidHeader(string(data))).To(BeTrue())
|
||||||
|
|
||||||
|
newConfig, err := configpkg.GetConfiguration([]string{tmpDir})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(newConfig.Kcrypt.UUIDLabelMappings["COS_PERSISTENT"]).To(Equal("the_new_uuid"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
When("a mappings configuration file doesn't exist", func() {
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpFile, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
// We will reuse the same name but we make sure the file doesn't exist.
|
||||||
|
os.RemoveAll(tmpFile.Name())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("creates the file with the given mappings", func() {
|
||||||
|
err := c.SetMapping("COS_PERSISTENT:the_new_name:the_new_uuid")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = c.WriteMappings(tmpFile.Name())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
newConfig, err := configpkg.GetConfiguration([]string{tmpDir})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(newConfig.Kcrypt.UUIDLabelMappings["COS_PERSISTENT"]).To(Equal("the_new_uuid"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("LookupUUIDForLabel", func() {
|
||||||
|
var tmpFile *os.File
|
||||||
|
var c configpkg.Config
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpFile, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
// Should trim the whitespace
|
||||||
|
err = c.SetMapping("COS_PERSISTENT:the_new_name:some_uuid_1\n")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = c.WriteMappings(tmpFile.Name())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns the correct UUID", func() {
|
||||||
|
uuid := c.LookupUUIDForLabel("COS_PERSISTENT")
|
||||||
|
Expect(uuid).To(Equal("some_uuid_1"))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an empty UUID when the label is not found", func() {
|
||||||
|
uuid := c.LookupUUIDForLabel("DOESNT_EXIST")
|
||||||
|
Expect(uuid).To(Equal(""))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an empty UUID when the UUIDLabelMappings is nil", func() {
|
||||||
|
c.Kcrypt.UUIDLabelMappings = nil
|
||||||
|
uuid := c.LookupUUIDForLabel("COS_PERSISTENT")
|
||||||
|
Expect(uuid).To(Equal(""))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("LookupLabelForUUID", func() {
|
||||||
|
var tmpFile *os.File
|
||||||
|
var c configpkg.Config
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
tmpFile, err = os.CreateTemp(tmpDir, "config-*.yaml")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = c.SetMapping("COS_PERSISTENT:the_new_name:some_uuid_1")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = c.WriteMappings(tmpFile.Name())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns the correct label", func() {
|
||||||
|
uuid := c.LookupLabelForUUID("some_uuid_1")
|
||||||
|
Expect(uuid).To(Equal("COS_PERSISTENT"))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an empty label when UUID doesn't exist", func() {
|
||||||
|
uuid := c.LookupLabelForUUID("doesnt_exist")
|
||||||
|
Expect(uuid).To(Equal(""))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@ -1,4 +1,4 @@
|
|||||||
package partition_info
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@ -9,5 +9,5 @@ import (
|
|||||||
|
|
||||||
func TestPartitionINfo(t *testing.T) {
|
func TestPartitionINfo(t *testing.T) {
|
||||||
RegisterFailHandler(Fail)
|
RegisterFailHandler(Fail)
|
||||||
RunSpecs(t, "PartitionInfo file parser test suite")
|
RunSpecs(t, "Kcrypt config test suite")
|
||||||
}
|
}
|
104
pkg/lib/initrd.go
Normal file
104
pkg/lib/initrd.go
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package lib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
cp "github.com/otiai10/copy"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
GZType = "gz"
|
||||||
|
XZType = "xz"
|
||||||
|
LZMAType = "lzma"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createInitrd(initrd string, src string, format string) error {
|
||||||
|
fmt.Printf("Creating '%s' from '%s' as '%s'\n", initrd, src, format)
|
||||||
|
|
||||||
|
if _, err := os.Stat(src); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
var out string
|
||||||
|
if format == XZType {
|
||||||
|
out, err = SH(fmt.Sprintf("cd %s && find . 2>/dev/null | cpio -H newc --quiet --null -o -R root:root | xz -0 --check=crc32 > %s", src, initrd))
|
||||||
|
} else if format == GZType {
|
||||||
|
out, err = SH(fmt.Sprintf("cd %s && find . | cpio -H newc -o -R root:root | gzip -9 > %s", src, initrd))
|
||||||
|
} else if format == LZMAType {
|
||||||
|
out, err = SH(fmt.Sprintf("cd %s && find . 2>/dev/null | cpio -H newc -o -R root:root | xz -9 --format=lzma > %s", src, initrd))
|
||||||
|
}
|
||||||
|
fmt.Println(out)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func InjectInitrd(initrd string, file, dst string) error {
|
||||||
|
fmt.Printf("Injecting '%s' as '%s' into '%s'\n", file, dst, initrd)
|
||||||
|
format, err := detect(initrd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tmp, err := os.MkdirTemp("", "kcrypt")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot create tempdir, %s", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmp)
|
||||||
|
|
||||||
|
fmt.Printf("Extracting '%s' in '%s' ...\n", initrd, tmp)
|
||||||
|
if err := ExtractInitrd(initrd, tmp); err != nil {
|
||||||
|
return fmt.Errorf("cannot extract initrd, %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
d := filepath.Join(tmp, dst)
|
||||||
|
fmt.Printf("Copying '%s' in '%s' ...\n", file, d)
|
||||||
|
if err := cp.Copy(file, d); err != nil {
|
||||||
|
return fmt.Errorf("cannot copy file, %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return createInitrd(initrd, tmp, format)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExtractInitrd(initrd string, dst string) error {
|
||||||
|
var out string
|
||||||
|
var err error
|
||||||
|
err = os.MkdirAll(dst, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
format, err := detect(initrd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if format == XZType || format == LZMAType {
|
||||||
|
out, err = SH(fmt.Sprintf("cd %s && xz -dc < %s | cpio -idmv", dst, initrd))
|
||||||
|
} else if format == GZType {
|
||||||
|
out, err = SH(fmt.Sprintf("cd %s && zcat %s | cpio -idmv", dst, initrd))
|
||||||
|
}
|
||||||
|
fmt.Println(out)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func detect(archive string) (string, error) {
|
||||||
|
out, err := SH(fmt.Sprintf("file %s", archive))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
out = strings.ToLower(out)
|
||||||
|
if strings.Contains(out, "xz") {
|
||||||
|
return XZType, nil
|
||||||
|
|
||||||
|
} else if strings.Contains(out, "lzma") {
|
||||||
|
return LZMAType, nil
|
||||||
|
|
||||||
|
} else if strings.Contains(out, "gz") {
|
||||||
|
return GZType, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("Unknown")
|
||||||
|
}
|
247
pkg/lib/lock.go
Normal file
247
pkg/lib/lock.go
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
package lib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gofrs/uuid"
|
||||||
|
"github.com/jaypipes/ghw"
|
||||||
|
"github.com/jaypipes/ghw/pkg/block"
|
||||||
|
"github.com/kairos-io/kairos-sdk/types"
|
||||||
|
configpkg "github.com/kairos-io/kcrypt/pkg/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CreateLuks(dev, password string, cryptsetupArgs ...string) error {
|
||||||
|
args := []string{"luksFormat", "--type", "luks2", "--iter-time", "5", "-q", dev}
|
||||||
|
args = append(args, cryptsetupArgs...)
|
||||||
|
cmd := exec.Command("cryptsetup", args...)
|
||||||
|
cmd.Stdin = strings.NewReader(password)
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
|
||||||
|
func getRandomString(length int) string {
|
||||||
|
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
|
b := make([]byte, length)
|
||||||
|
for i := range b {
|
||||||
|
b[i] = charset[seededRand.Intn(len(charset))]
|
||||||
|
}
|
||||||
|
return string(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Luksify Take a part label, and recreates it with LUKS. IT OVERWRITES DATA!
|
||||||
|
// On success, it returns a machine parseable string with the partition information
|
||||||
|
// (label:name:uuid) so that it can be stored by the caller for later use.
|
||||||
|
// This is because the label of the encrypted partition is not accessible unless
|
||||||
|
// the partition is decrypted first and the uuid changed after encryption so
|
||||||
|
// any stored information needs to be updated (by the caller).
|
||||||
|
func Luksify(label string, logger types.KairosLogger, argsCreate ...string) (string, error) {
|
||||||
|
var pass string
|
||||||
|
|
||||||
|
// Make sure ghw will see all partitions correctly.
|
||||||
|
// older versions don't have --type=all. Try the simpler version then.
|
||||||
|
out, err := SH("udevadm trigger --type=all || udevadm trigger")
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("udevadm trigger failed: %w, out: %s", err, out)
|
||||||
|
}
|
||||||
|
syscall.Sync()
|
||||||
|
|
||||||
|
part, b, err := FindPartition(label)
|
||||||
|
if err != nil {
|
||||||
|
logger.Err(err).Msg("find partition")
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
pass, err = GetPassword(b)
|
||||||
|
if err != nil {
|
||||||
|
logger.Err(err).Msg("get password")
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
mapper := fmt.Sprintf("/dev/mapper/%s", b.Name)
|
||||||
|
device := fmt.Sprintf("/dev/%s", part)
|
||||||
|
|
||||||
|
extraArgs := []string{"--uuid", uuid.NewV5(uuid.NamespaceURL, label).String()}
|
||||||
|
extraArgs = append(extraArgs, "--label", label)
|
||||||
|
extraArgs = append(extraArgs, argsCreate...)
|
||||||
|
|
||||||
|
if err := CreateLuks(device, pass, extraArgs...); err != nil {
|
||||||
|
logger.Err(err).Msg("create luks")
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = formatLuks(device, b.Name, mapper, label, pass, logger)
|
||||||
|
if err != nil {
|
||||||
|
logger.Err(err).Msg("format luks")
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return configpkg.PartitionToString(b), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LuksifyMeasurements takes a label and a list if public-keys and pcrs to bind and uses the measurements
|
||||||
|
// in the current node to encrypt the partition with those and bind those to the given pcrs
|
||||||
|
// this expects systemd 255 as it needs the SRK public key that systemd extracts
|
||||||
|
// Sets a random password, enrolls the policy, unlocks and formats the partition, closes it and tfinally removes the random password from it
|
||||||
|
// Note that there is a diff between the publicKeyPcrs and normal Pcrs
|
||||||
|
// The former links to a policy type that allows anything signed by that policy to unlcok the partitions so its
|
||||||
|
// really useful for binding to PCR11 which is the UKI measurements in order to be able to upgrade the system and still be able
|
||||||
|
// to unlock the partitions.
|
||||||
|
// The later binds to a SINGLE measurement, so if that changes, it will not unlock anything.
|
||||||
|
// This is useful for things like PCR7 which measures the secureboot state and certificates if you dont expect those to change during
|
||||||
|
// the whole lifetime of a machine
|
||||||
|
// It can also be used to bind to things like the firmware code or efi drivers that we dont expect to change
|
||||||
|
// default for publicKeyPcrs is 11
|
||||||
|
// default for pcrs is nothing, so it doesn't bind as we want to expand things like DBX and be able to blacklist certs and such
|
||||||
|
func LuksifyMeasurements(label string, publicKeyPcrs []string, pcrs []string, logger types.KairosLogger, argsCreate ...string) error {
|
||||||
|
// Make sure ghw will see all partitions correctly.
|
||||||
|
// older versions don't have --type=all. Try the simpler version then.
|
||||||
|
out, err := SH("udevadm trigger --type=all || udevadm trigger")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("udevadm trigger failed: %w, out: %s", err, out)
|
||||||
|
}
|
||||||
|
syscall.Sync()
|
||||||
|
|
||||||
|
part, b, err := FindPartition(label)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// On TPM locking we generate a random password that will only be used here then discarded.
|
||||||
|
// only unlocking method will be PCR values
|
||||||
|
pass := getRandomString(32)
|
||||||
|
mapper := fmt.Sprintf("/dev/mapper/%s", b.Name)
|
||||||
|
device := fmt.Sprintf("/dev/%s", part)
|
||||||
|
|
||||||
|
extraArgs := []string{"--uuid", uuid.NewV5(uuid.NamespaceURL, label).String()}
|
||||||
|
extraArgs = append(extraArgs, "--label", label)
|
||||||
|
extraArgs = append(extraArgs, argsCreate...)
|
||||||
|
|
||||||
|
if err := CreateLuks(device, pass, extraArgs...); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(publicKeyPcrs) == 0 {
|
||||||
|
publicKeyPcrs = []string{"11"}
|
||||||
|
}
|
||||||
|
|
||||||
|
syscall.Sync()
|
||||||
|
|
||||||
|
// Enroll PCR policy as a keyslot
|
||||||
|
// We pass the current signature of the booted system to confirm that we would be able to unlock with the current booted system
|
||||||
|
// That checks the policy against the signatures and fails if a UKI with those signatures wont be able to unlock the device
|
||||||
|
// Files are generated by systemd automatically and are extracted from the UKI binary directly
|
||||||
|
// public pem cert -> .pcrpkey section fo the elf file
|
||||||
|
// signatures -> .pcrsig section of the elf file
|
||||||
|
args := []string{
|
||||||
|
"--tpm2-public-key=/run/systemd/tpm2-pcr-public-key.pem",
|
||||||
|
fmt.Sprintf("--tpm2-public-key-pcrs=%s", strings.Join(publicKeyPcrs, "+")),
|
||||||
|
fmt.Sprintf("--tpm2-pcrs=%s", strings.Join(pcrs, "+")),
|
||||||
|
"--tpm2-signature=/run/systemd/tpm2-pcr-signature.json",
|
||||||
|
"--tpm2-device-key=/run/systemd/tpm2-srk-public-key.tpm2b_public",
|
||||||
|
device}
|
||||||
|
logger.Logger.Debug().Str("args", strings.Join(args, " ")).Msg("running command")
|
||||||
|
cmd := exec.Command("systemd-cryptenroll", args...)
|
||||||
|
cmd.Env = append(cmd.Env, fmt.Sprintf("PASSWORD=%s", pass), "SYSTEMD_LOG_LEVEL=debug") // cannot pass it via stdin
|
||||||
|
// Store the output into a buffer to log it in case we need it
|
||||||
|
// debug output goes to stderr for some reason?
|
||||||
|
stdOut := bytes.Buffer{}
|
||||||
|
cmd.Stdout = &stdOut
|
||||||
|
cmd.Stderr = &stdOut
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
logger.Logger.Debug().Str("output", stdOut.String()).Msg("debug from cryptenroll")
|
||||||
|
logger.Err(err).Msg("Enrolling measurements")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Logger.Debug().Str("output", stdOut.String()).Msg("debug from cryptenroll")
|
||||||
|
|
||||||
|
err = formatLuks(device, b.Name, mapper, label, pass, logger)
|
||||||
|
if err != nil {
|
||||||
|
logger.Err(err).Msg("format luks")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete password slot from luks device
|
||||||
|
out, err = SH(fmt.Sprintf("systemd-cryptenroll --wipe-slot=password %s", device))
|
||||||
|
if err != nil {
|
||||||
|
logger.Err(err).Str("out", out).Msg("Removing password")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// format luks will unlock the device, wait for it and then format it
|
||||||
|
// device is the actual /dev/X luks device
|
||||||
|
// label is the label we will set to the formatted partition
|
||||||
|
// password is the pass to unlock the device to be able to format the underlying mapper
|
||||||
|
func formatLuks(device, name, mapper, label, pass string, logger types.KairosLogger) error {
|
||||||
|
l := logger.Logger.With().Str("device", device).Str("name", name).Str("mapper", mapper).Logger()
|
||||||
|
l.Debug().Msg("unlock")
|
||||||
|
if err := LuksUnlock(device, name, pass); err != nil {
|
||||||
|
return fmt.Errorf("unlock err: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
l.Debug().Msg("wait device")
|
||||||
|
if err := Waitdevice(mapper, 10); err != nil {
|
||||||
|
return fmt.Errorf("waitdevice err: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
l.Debug().Msg("format")
|
||||||
|
cmdFormat := fmt.Sprintf("mkfs.ext4 -L %s %s", label, mapper)
|
||||||
|
out, err := SH(cmdFormat)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("mkfs err: %w, out: %s", err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Refresh needs the password as its doing actions on the device directly
|
||||||
|
l.Debug().Msg("discards")
|
||||||
|
cmd := exec.Command("cryptsetup", "refresh", "--persistent", "--allow-discards", mapper)
|
||||||
|
cmd.Stdin = strings.NewReader(pass)
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("refresh err: %w, out: %s", err, string(output))
|
||||||
|
}
|
||||||
|
|
||||||
|
l.Debug().Msg("close")
|
||||||
|
out, err = SH(fmt.Sprintf("cryptsetup close %s", mapper))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("lock err: %w, out: %s", err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindPartition(label string) (string, *block.Partition, error) {
|
||||||
|
b, err := ghw.Block()
|
||||||
|
if err == nil {
|
||||||
|
for _, disk := range b.Disks {
|
||||||
|
for _, p := range disk.Partitions {
|
||||||
|
if p.FilesystemLabel == label {
|
||||||
|
return p.Name, p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", nil, fmt.Errorf("not found label %s", label)
|
||||||
|
}
|
117
pkg/lib/unlock.go
Normal file
117
pkg/lib/unlock.go
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
package lib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/anatol/luks.go"
|
||||||
|
"github.com/jaypipes/ghw"
|
||||||
|
"github.com/jaypipes/ghw/pkg/block"
|
||||||
|
"github.com/kairos-io/kairos-sdk/types"
|
||||||
|
"github.com/kairos-io/kairos-sdk/utils"
|
||||||
|
"github.com/kairos-io/kcrypt/pkg/bus"
|
||||||
|
"github.com/mudler/go-pluggable"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnlockAll Unlocks all encrypted devices found in the system
|
||||||
|
func UnlockAll(tpm bool) error {
|
||||||
|
logger := types.NewKairosLogger("kcrypt-unlock", "info", false)
|
||||||
|
|
||||||
|
return UnlockAllWithLogger(tpm, logger)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UnlockAllWithLogger(tpm bool, log types.KairosLogger) error {
|
||||||
|
bus.Manager.Initialize()
|
||||||
|
logger := log.Logger
|
||||||
|
|
||||||
|
blk, err := ghw.Block()
|
||||||
|
if err != nil {
|
||||||
|
logger.Warn().Msgf("Warning: Error reading partitions '%s \n", err.Error())
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some versions of udevadm don't support --settle (e.g. alpine)
|
||||||
|
// and older versions don't have --type=all. Try the simpler version then.
|
||||||
|
logger.Info().Msgf("triggering udev to populate disk info")
|
||||||
|
_, err = utils.SH("udevadm trigger --type=all || udevadm trigger")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, disk := range blk.Disks {
|
||||||
|
for _, p := range disk.Partitions {
|
||||||
|
if p.Type == "crypto_LUKS" {
|
||||||
|
// Check if device is already mounted
|
||||||
|
// We mount it under /dev/mapper/DEVICE, so It's pretty easy to check
|
||||||
|
if !utils.Exists(filepath.Join("/dev", "mapper", p.Name)) {
|
||||||
|
logger.Info().Msgf("Unmounted Luks found at '%s'", filepath.Join("/dev", p.Name))
|
||||||
|
if tpm {
|
||||||
|
out, err := utils.SH(fmt.Sprintf("/usr/lib/systemd/systemd-cryptsetup attach %s %s - tpm2-device=auto", p.Name, filepath.Join("/dev", p.Name)))
|
||||||
|
if err != nil {
|
||||||
|
logger.Warn().Msgf("Unlocking failed: '%s'", err.Error())
|
||||||
|
logger.Warn().Msgf("Unlocking failed, command output: '%s'", out)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = UnlockDisk(p)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warn().Msgf("Unlocking failed: '%s'", err.Error())
|
||||||
|
}
|
||||||
|
logger.Info().Msg("Unlocking succeeded")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.Info().Msgf("Device %s seems to be mounted at %s, skipping\n", filepath.Join("/dev", p.Name), filepath.Join("/dev", "mapper", p.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnlockDisk unlocks a single block.Partition
|
||||||
|
func UnlockDisk(b *block.Partition) error {
|
||||||
|
pass, err := GetPassword(b)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error retreiving password remotely: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return LuksUnlock(filepath.Join("/dev", b.Name), b.Name, pass)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPassword gets the password for a block.Partition
|
||||||
|
// TODO: Ask to discovery a pass to unlock. keep waiting until we get it and a timeout is exhausted with retrials (exp backoff)
|
||||||
|
func GetPassword(b *block.Partition) (password string, err error) {
|
||||||
|
bus.Reload()
|
||||||
|
|
||||||
|
bus.Manager.Response(bus.EventDiscoveryPassword, func(p *pluggable.Plugin, r *pluggable.EventResponse) {
|
||||||
|
password = r.Data
|
||||||
|
if r.Errored() {
|
||||||
|
err = fmt.Errorf("failed discovery: %s", r.Error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
_, err = bus.Manager.Publish(bus.EventDiscoveryPassword, b)
|
||||||
|
if err != nil {
|
||||||
|
return password, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if password == "" {
|
||||||
|
return password, fmt.Errorf("received empty password")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuksUnlock(device, mapper, password string) error {
|
||||||
|
dev, err := luks.Open(device)
|
||||||
|
if err != nil {
|
||||||
|
// handle error
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer dev.Close()
|
||||||
|
err = dev.Unlock(0, []byte(password), mapper)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
28
pkg/lib/utils.go
Normal file
28
pkg/lib/utils.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package lib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SH(c string) (string, error) {
|
||||||
|
o, err := exec.Command("/bin/sh", "-c", c).CombinedOutput()
|
||||||
|
return string(o), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Waitdevice(device string, attempts int) error {
|
||||||
|
for tries := 0; tries < attempts; tries++ {
|
||||||
|
_, err := SH("udevadm settle")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = os.Lstat(device)
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
return fmt.Errorf("no device found %s", device)
|
||||||
|
}
|
@ -1,125 +0,0 @@
|
|||||||
package partition_info
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/jaypipes/ghw/pkg/block"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
)
|
|
||||||
|
|
||||||
const DefaultPartitionInfoFile = "/oem/partition_info.yaml"
|
|
||||||
|
|
||||||
// PartitionInfo maps a partition label to a partition UUID.
|
|
||||||
// It's used in order to be able to ask the kcrypt-challenger for the passphrase
|
|
||||||
// using the partition label, even when the label is not accessible (e.g. before
|
|
||||||
// decrypting the partition). The UUID can be used to lookup the partition label
|
|
||||||
// and make the request.
|
|
||||||
type PartitionInfo struct {
|
|
||||||
file string
|
|
||||||
mapping map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPartitionInfoFromFile reads the given partition info file (if one exists)
|
|
||||||
// and returns a pointer to a PartitionInfo object.
|
|
||||||
// If a file doesn't exist, the function will create one and return an "empty"
|
|
||||||
// PartitionInfo object.
|
|
||||||
// The boolean return value indicates whether a file existed or not (true means,
|
|
||||||
// a file existed already).
|
|
||||||
func NewPartitionInfoFromFile(file string) (*PartitionInfo, bool, error) {
|
|
||||||
existed, err := createInfoFileIfNotExists(file)
|
|
||||||
if err != nil {
|
|
||||||
return nil, existed, err
|
|
||||||
}
|
|
||||||
|
|
||||||
mapping, err := ParsePartitionInfoFile(file)
|
|
||||||
if err != nil {
|
|
||||||
return nil, existed, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &PartitionInfo{
|
|
||||||
file: file,
|
|
||||||
mapping: mapping,
|
|
||||||
}, existed, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pi PartitionInfo) LookupUUIDForLabel(l string) string {
|
|
||||||
return pi.mapping[l]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pi PartitionInfo) LookupLabelForUUID(uuid string) string {
|
|
||||||
for k, v := range pi.mapping {
|
|
||||||
if v == uuid {
|
|
||||||
return k
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdatePartitionLabelMapping takes partition information as a string argument
|
|
||||||
// the the form: `label:name:uuid` (that's what the `kcrypt encrypt` command returns
|
|
||||||
// on success. This function stores it in the PartitionInfoFile yaml file for
|
|
||||||
// later use.
|
|
||||||
func (pi PartitionInfo) UpdateMapping(partitionData string) error {
|
|
||||||
label, uuid := PartitionDataFromString(partitionData)
|
|
||||||
pi.mapping[label] = uuid
|
|
||||||
|
|
||||||
return pi.save()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pi PartitionInfo) save() error {
|
|
||||||
data, err := yaml.Marshal(&pi.mapping)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "marshalling the new partition info to yaml")
|
|
||||||
}
|
|
||||||
err = ioutil.WriteFile(pi.file, data, 0)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "writing back the partition info file")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func PartitionToString(p *block.Partition) string {
|
|
||||||
return fmt.Sprintf("%s:%s:%s", p.Label, p.Name, p.UUID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Takes a partition info string (as returned by PartitionToString) and return
|
|
||||||
// the partition label and the UUID
|
|
||||||
func PartitionDataFromString(partitionStr string) (string, string) {
|
|
||||||
parts := strings.Split(partitionStr, ":")
|
|
||||||
|
|
||||||
return parts[0], parts[2]
|
|
||||||
}
|
|
||||||
|
|
||||||
func ParsePartitionInfoFile(file string) (map[string]string, error) {
|
|
||||||
var result map[string]string
|
|
||||||
|
|
||||||
yamlFile, err := ioutil.ReadFile(file)
|
|
||||||
if err != nil {
|
|
||||||
return result, errors.Wrap(err, "reading the partition info file")
|
|
||||||
}
|
|
||||||
|
|
||||||
err = yaml.Unmarshal(yamlFile, &result)
|
|
||||||
if err != nil {
|
|
||||||
return result, errors.Wrap(err, "unmarshalling partition info file")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// createInfoFileIfNotExists returns true if file already exists or creates the
|
|
||||||
// the file if it doesn't exist and returns false.
|
|
||||||
func createInfoFileIfNotExists(fileName string) (bool, error) {
|
|
||||||
_, err := os.Stat(fileName)
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
if _, err := os.Create(fileName); err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
|
@ -1,179 +0,0 @@
|
|||||||
package partition_info_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/jaypipes/ghw/pkg/block"
|
|
||||||
. "github.com/onsi/ginkgo/v2"
|
|
||||||
. "github.com/onsi/gomega"
|
|
||||||
|
|
||||||
pi "github.com/kairos-io/kcrypt/pkg/partition_info"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ = Describe("Partition Info file parsing", func() {
|
|
||||||
Describe("NewPartitionInfoFromFile", func() {
|
|
||||||
var file string
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
file = "../../tests/assets/partition_info.yaml"
|
|
||||||
})
|
|
||||||
When("the files exists already", func() {
|
|
||||||
It("returns 'true' and a PartitionInfo object", func() {
|
|
||||||
result, existed, err := pi.NewPartitionInfoFromFile(file)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(result).ToNot(BeNil())
|
|
||||||
Expect(existed).To(BeTrue())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
When("a file doesn't exist", func() {
|
|
||||||
var fileName string
|
|
||||||
BeforeEach(func() {
|
|
||||||
fileName = path.Join(
|
|
||||||
os.TempDir(),
|
|
||||||
fmt.Sprintf("partition-info-%d.yaml", time.Now().UnixNano()))
|
|
||||||
})
|
|
||||||
|
|
||||||
It("creates the file and returns 'false' and an (empty) mapping", func() {
|
|
||||||
result, existed, err := pi.NewPartitionInfoFromFile(fileName)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(result).ToNot(BeNil())
|
|
||||||
Expect(existed).To(BeFalse())
|
|
||||||
_, err = os.Stat(fileName)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Describe("ParsePartitionInfoFile", func() {
|
|
||||||
var file string
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
file = "../../tests/assets/partition_info.yaml"
|
|
||||||
})
|
|
||||||
|
|
||||||
It("parses the file correctly", func() {
|
|
||||||
info, err := pi.ParsePartitionInfoFile(file)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(len(info)).To(Equal(2))
|
|
||||||
Expect(info["COS_PERSISTENT"]).To(Equal("some_uuid_1"))
|
|
||||||
Expect(info["COS_OTHER"]).To(Equal("some_uuid_2"))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Describe("PartitionToString", func() {
|
|
||||||
var partition *block.Partition
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
partition = &block.Partition{
|
|
||||||
Disk: nil,
|
|
||||||
Name: "sda1",
|
|
||||||
Label: "COS_PERSISTENT",
|
|
||||||
MountPoint: "/mnt/sda1",
|
|
||||||
UUID: "some_uuid_here",
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
It("returns a string representation of the partition data", func() {
|
|
||||||
Expect(pi.PartitionToString(partition)).To(Equal("COS_PERSISTENT:sda1:some_uuid_here"))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Describe("PartitionDataFromString", func() {
|
|
||||||
var partitionData string
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
partitionData = "THE_LABEL:the_name:the_uuid"
|
|
||||||
})
|
|
||||||
|
|
||||||
It("returns the label and the uuid", func() {
|
|
||||||
label, uuid := pi.PartitionDataFromString(partitionData)
|
|
||||||
Expect(label).To(Equal("THE_LABEL"))
|
|
||||||
Expect(uuid).To(Equal("the_uuid"))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Describe("UpdateMapping", func() {
|
|
||||||
var file *os.File
|
|
||||||
var err error
|
|
||||||
var partitionInfo *pi.PartitionInfo
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
file, err = ioutil.TempFile("", "partition-info.*.yaml")
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
_, err = file.Write([]byte("TO_KEEP: old_uuid_1"))
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
partitionInfo, _, err = pi.NewPartitionInfoFromFile(file.Name())
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
AfterEach(func() {
|
|
||||||
os.Remove(file.Name())
|
|
||||||
})
|
|
||||||
|
|
||||||
It("Updates the file correctly from a `kcrypt encrypt` return value", func() {
|
|
||||||
partitionData := "TO_BE_ADDED:some_name:new_uuid"
|
|
||||||
|
|
||||||
err = partitionInfo.UpdateMapping(partitionData)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
dat, err := os.ReadFile(file.Name())
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
expectedContent := `TO_BE_ADDED: new_uuid
|
|
||||||
TO_KEEP: old_uuid_1
|
|
||||||
`
|
|
||||||
Expect(string(dat)).To(Equal(expectedContent))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Describe("LookupUUIDForLabel", func() {
|
|
||||||
var file string
|
|
||||||
var partitionInfo *pi.PartitionInfo
|
|
||||||
var err error
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
file = "../../tests/assets/partition_info.yaml"
|
|
||||||
partitionInfo, _, err = pi.NewPartitionInfoFromFile(file)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
It("returns the correct UUID", func() {
|
|
||||||
uuid := partitionInfo.LookupUUIDForLabel("COS_PERSISTENT")
|
|
||||||
Expect(uuid).To(Equal("some_uuid_1"))
|
|
||||||
})
|
|
||||||
|
|
||||||
It("returns an empty UUID when the label is not found", func() {
|
|
||||||
uuid := partitionInfo.LookupUUIDForLabel("DOESNT_EXIST")
|
|
||||||
Expect(uuid).To(Equal(""))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Describe("LookupLabelForUUID", func() {
|
|
||||||
var file string
|
|
||||||
var partitionInfo *pi.PartitionInfo
|
|
||||||
var err error
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
file = "../../tests/assets/partition_info.yaml"
|
|
||||||
partitionInfo, _, err = pi.NewPartitionInfoFromFile(file)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
It("returns the correct label", func() {
|
|
||||||
uuid := partitionInfo.LookupLabelForUUID("some_uuid_1")
|
|
||||||
Expect(uuid).To(Equal("COS_PERSISTENT"))
|
|
||||||
})
|
|
||||||
|
|
||||||
It("returns an empty label when UUID doesn't exist", func() {
|
|
||||||
uuid := partitionInfo.LookupLabelForUUID("doesnt_exist")
|
|
||||||
Expect(uuid).To(Equal(""))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
20
renovate.json
Normal file
20
renovate.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"config:recommended"
|
||||||
|
],
|
||||||
|
"schedule": [
|
||||||
|
"after 11pm every weekday",
|
||||||
|
"before 7am every weekday",
|
||||||
|
"every weekend"
|
||||||
|
],
|
||||||
|
"timezone": "Europe/Brussels",
|
||||||
|
"packageRules": [
|
||||||
|
{
|
||||||
|
"matchUpdateTypes": [
|
||||||
|
"patch"
|
||||||
|
],
|
||||||
|
"automerge": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,2 +0,0 @@
|
|||||||
COS_PERSISTENT: some_uuid_1
|
|
||||||
COS_OTHER: some_uuid_2
|
|
Loading…
Reference in New Issue
Block a user