From a58116c14aeeafba922d7b6506933a257d20c316 Mon Sep 17 00:00:00 2001 From: Idan Saadon Date: Tue, 1 Oct 2024 10:43:33 +0300 Subject: [PATCH 1/6] feat: generate a seed image --- MODULE.bazel | 8 ++ qemu/seed/image/BUILD.bazel | 64 ++++++++++++ qemu/seed/image/create_key_pair.py | 33 ++++++ qemu/seed/image/requirements.in | 2 + qemu/seed/image/requirements.txt | 159 +++++++++++++++++++++++++++++ qemu/seed/image/seed_image.py | 68 ++++++++++++ 6 files changed, 334 insertions(+) create mode 100644 qemu/seed/image/BUILD.bazel create mode 100755 qemu/seed/image/create_key_pair.py create mode 100755 qemu/seed/image/requirements.in create mode 100755 qemu/seed/image/requirements.txt create mode 100644 qemu/seed/image/seed_image.py diff --git a/MODULE.bazel b/MODULE.bazel index e6744440..b925318a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -321,3 +321,11 @@ download_file = use_repo_rule("@download_utils//download/file:defs.bzl", "downlo ("arm64", "sha256-gxjqgasbjKLrLUtVJYz/MTiPbttisBz3Y4HglSRRspo="), ) ] + +# Download PyPI dependencies +pip.parse( + hub_name = "rules_labgrid-qemu-seed-pkg", + python_version = "3.11", + requirements_lock = "//qemu/seed/image:requirements.txt", +) +use_repo(pip, "rules_labgrid-qemu-seed-pkg") diff --git a/qemu/seed/image/BUILD.bazel b/qemu/seed/image/BUILD.bazel new file mode 100644 index 00000000..e3f95d35 --- /dev/null +++ b/qemu/seed/image/BUILD.bazel @@ -0,0 +1,64 @@ +load("@python_versions//3.11:defs.bzl", "compile_pip_requirements") +load("@rules_python//python:defs.bzl", "py_binary", "py_library") + +compile_pip_requirements( + name = "requirements", + src = "requirements.in", + requirements_txt = "requirements.txt", + tags = ["manual"], +) + +py_binary( + name = "create_key_pair", + srcs = ["create_key_pair.py"], + visibility = ["//visibility:public"], + deps = [ + "@rules_labgrid-qemu-seed-pkg//paramiko", + "@rules_python//python/runfiles", + ], +) + +genrule( + name = "genrule_create_key_pair", + outs = [ + "private_key.pem", + "public_key.pem", + ], + cmd = "$(location :create_key_pair) --output-files $(OUTS)", + tools = [":create_key_pair"], +) + +alias( + name = "public_key", + actual = "public_key.pem", +) + +alias( + name = "private_key", + actual = "private_key.pem", +) + +py_binary( + name = "seed_image", + srcs = ["seed_image.py"], + data = ["public_key"], + visibility = ["//visibility:public"], + deps = [ + "@rules_labgrid-qemu-seed-pkg//pycdlib", + "@rules_python//python/runfiles", + ], +) + +genrule( + name = "genrule_seed_image", + outs = [ + "seed.iso", + ], + cmd = "$(location :seed_image) --output-file $@", + tools = [":seed_image"], +) + +alias( + name = "seed_image_cc", + actual = "seed.iso", +) diff --git a/qemu/seed/image/create_key_pair.py b/qemu/seed/image/create_key_pair.py new file mode 100755 index 00000000..2d728707 --- /dev/null +++ b/qemu/seed/image/create_key_pair.py @@ -0,0 +1,33 @@ +import paramiko +import os +from argparse import ArgumentParser, ArgumentTypeError + + + +def arguments(prsr: ArgumentParser) -> None: + prsr.add_argument( + "--output-files", + help="the output files ", + type=str, + nargs=2, + required=True, + ) + + +def main(): + prsr = ArgumentParser() + arguments(prsr) + parsed = prsr.parse_args() + private_key_path, public_key_path = parsed.output_files + key = paramiko.RSAKey.generate(4096) + key.write_private_key_file(private_key_path) + public_key = f"{key.get_name()} {key.get_base64()}" + + + with open(public_key_path, 'w') as f: + f.write(public_key) + +if __name__ == "__main__": + main() + + diff --git a/qemu/seed/image/requirements.in b/qemu/seed/image/requirements.in new file mode 100755 index 00000000..7b7c625e --- /dev/null +++ b/qemu/seed/image/requirements.in @@ -0,0 +1,2 @@ +paramiko==3.4.1 +pycdlib==1.14.0 \ No newline at end of file diff --git a/qemu/seed/image/requirements.txt b/qemu/seed/image/requirements.txt new file mode 100755 index 00000000..04edafca --- /dev/null +++ b/qemu/seed/image/requirements.txt @@ -0,0 +1,159 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# bazel run //qemu/seed/image:requirements.update +# +bcrypt==4.2.0 \ + --hash=sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb \ + --hash=sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399 \ + --hash=sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291 \ + --hash=sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d \ + --hash=sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7 \ + --hash=sha256:1ff39b78a52cf03fdf902635e4c81e544714861ba3f0efc56558979dd4f09170 \ + --hash=sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d \ + --hash=sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe \ + --hash=sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060 \ + --hash=sha256:373db9abe198e8e2c70d12b479464e0d5092cc122b20ec504097b5f2297ed184 \ + --hash=sha256:39e1d30c7233cfc54f5c3f2c825156fe044efdd3e0b9d309512cc514a263ec2a \ + --hash=sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68 \ + --hash=sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c \ + --hash=sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458 \ + --hash=sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9 \ + --hash=sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328 \ + --hash=sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7 \ + --hash=sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34 \ + --hash=sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e \ + --hash=sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2 \ + --hash=sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5 \ + --hash=sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae \ + --hash=sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00 \ + --hash=sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841 \ + --hash=sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8 \ + --hash=sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221 \ + --hash=sha256:f4f4acf526fcd1c34e7ce851147deedd4e26e6402369304220250598b26448db + # via paramiko +cffi==1.17.1 \ + --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \ + --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \ + --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \ + --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \ + --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \ + --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \ + --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \ + --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \ + --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \ + --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \ + --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \ + --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \ + --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \ + --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \ + --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \ + --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \ + --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \ + --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \ + --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \ + --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \ + --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \ + --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \ + --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \ + --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \ + --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \ + --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \ + --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \ + --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \ + --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \ + --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \ + --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \ + --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \ + --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \ + --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \ + --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \ + --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \ + --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \ + --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \ + --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \ + --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \ + --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \ + --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \ + --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \ + --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \ + --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \ + --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \ + --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \ + --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \ + --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \ + --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \ + --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \ + --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \ + --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ + --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ + --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ + --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ + --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ + --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ + --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \ + --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \ + --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \ + --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \ + --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \ + --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \ + --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \ + --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ + --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b + # via + # cryptography + # pynacl +cryptography==43.0.1 \ + --hash=sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494 \ + --hash=sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806 \ + --hash=sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d \ + --hash=sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062 \ + --hash=sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2 \ + --hash=sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4 \ + --hash=sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1 \ + --hash=sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85 \ + --hash=sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84 \ + --hash=sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042 \ + --hash=sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d \ + --hash=sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962 \ + --hash=sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2 \ + --hash=sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa \ + --hash=sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d \ + --hash=sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365 \ + --hash=sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96 \ + --hash=sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47 \ + --hash=sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d \ + --hash=sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d \ + --hash=sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c \ + --hash=sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb \ + --hash=sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277 \ + --hash=sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172 \ + --hash=sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034 \ + --hash=sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a \ + --hash=sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289 + # via paramiko +paramiko==3.4.1 \ + --hash=sha256:8b15302870af7f6652f2e038975c1d2973f06046cb5d7d65355668b3ecbece0c \ + --hash=sha256:8e49fd2f82f84acf7ffd57c64311aa2b30e575370dc23bdb375b10262f7eac32 + # via -r qemu/seed/image/requirements.in +pycdlib==1.14.0 \ + --hash=sha256:8ec306b31d9c850f28c5fda52438d904edd1e8fcf862c5ffd756272efac9f422 \ + --hash=sha256:a905827335f0066af3fd416c5cf9b1f29dffaf4d0914b714555213d1809f38d4 + # via -r qemu/seed/image/requirements.in +pycparser==2.22 \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc + # via cffi +pynacl==1.5.0 \ + --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ + --hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \ + --hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \ + --hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \ + --hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \ + --hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \ + --hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \ + --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ + --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 + # via paramiko diff --git a/qemu/seed/image/seed_image.py b/qemu/seed/image/seed_image.py new file mode 100644 index 00000000..8559a46b --- /dev/null +++ b/qemu/seed/image/seed_image.py @@ -0,0 +1,68 @@ +import pycdlib +import os +from python.runfiles import Runfiles + +from argparse import ArgumentParser, ArgumentTypeError + + + +def arguments(prsr: ArgumentParser) -> None: + prsr.add_argument( + "--output-file", + help="the output file ", + type=str, + nargs=1, + required=True, + ) +def main(): + prsr = ArgumentParser() + arguments(prsr) + parsed = prsr.parse_args() + seed_image_path = parsed.output_file + runfiles = Runfiles.Create() + path = runfiles.Rlocation("_main/qemu/seed/image/public_key.pem") + with open(path) as stream: + public_key = stream.read() + # def create_iso_seed_images(user_data,meta_data,output_file): + + #generate_user_data file + user_data = f"""\ + #cloud-config + users: + - name: idan + ssh-authorized-keys: + - {public_key} + + + sudo: ['ALL=(ALL) NOPASSWD:ALL'] + groups: sudo + shell: /bin/bash + """ + + print(user_data) + meta_data = """\ + instance-id: iid-local01 + local-hostname: cloudimg + """ + + + # Write user-data and meta-data to temporary files + user_data_path = 'USERDATA' + meta_data_path = 'METADATA' + + with open(user_data_path, 'w') as f: + f.write(user_data) + + with open(meta_data_path, 'w') as f: + f.write(meta_data) + + iso = pycdlib.PyCdlib() + # Set the volume ID to 'cidata' + iso.new(interchange_level=3,joliet=True,rock_ridge='1.09',vol_ident='cidata') + iso.add_file(user_data_path, '/USER_DAT.;1', rr_name='user-data') + iso.add_file(meta_data_path, '/META_DAT.;1', rr_name='meta-data') + iso.write(seed_image_path[0]) + iso.close() + +if __name__ == "__main__": + main() \ No newline at end of file -- GitLab From f628f3f816950be81d1911b203027cf43229bb68 Mon Sep 17 00:00:00 2001 From: Idan Saadon Date: Tue, 1 Oct 2024 14:47:36 +0300 Subject: [PATCH 2/6] feat: generate a seed image --- qemu/seed/image/BUILD.bazel | 32 +++------- qemu/seed/image/create_key_pair.py | 33 ---------- qemu/seed/image/seed_image.py | 98 ++++++++++++++++-------------- 3 files changed, 58 insertions(+), 105 deletions(-) delete mode 100755 qemu/seed/image/create_key_pair.py mode change 100644 => 100755 qemu/seed/image/seed_image.py diff --git a/qemu/seed/image/BUILD.bazel b/qemu/seed/image/BUILD.bazel index e3f95d35..a0973be7 100644 --- a/qemu/seed/image/BUILD.bazel +++ b/qemu/seed/image/BUILD.bazel @@ -9,23 +9,25 @@ compile_pip_requirements( ) py_binary( - name = "create_key_pair", - srcs = ["create_key_pair.py"], + name = "seed_image", + srcs = ["seed_image.py"], visibility = ["//visibility:public"], deps = [ "@rules_labgrid-qemu-seed-pkg//paramiko", + "@rules_labgrid-qemu-seed-pkg//pycdlib", "@rules_python//python/runfiles", ], ) genrule( - name = "genrule_create_key_pair", + name = "genrule_seed_image", outs = [ "private_key.pem", "public_key.pem", + "seed.iso", ], - cmd = "$(location :create_key_pair) --output-files $(OUTS)", - tools = [":create_key_pair"], + cmd = "$(location :seed_image) --output-files $(OUTS)", + tools = [":seed_image"], ) alias( @@ -38,26 +40,6 @@ alias( actual = "private_key.pem", ) -py_binary( - name = "seed_image", - srcs = ["seed_image.py"], - data = ["public_key"], - visibility = ["//visibility:public"], - deps = [ - "@rules_labgrid-qemu-seed-pkg//pycdlib", - "@rules_python//python/runfiles", - ], -) - -genrule( - name = "genrule_seed_image", - outs = [ - "seed.iso", - ], - cmd = "$(location :seed_image) --output-file $@", - tools = [":seed_image"], -) - alias( name = "seed_image_cc", actual = "seed.iso", diff --git a/qemu/seed/image/create_key_pair.py b/qemu/seed/image/create_key_pair.py deleted file mode 100755 index 2d728707..00000000 --- a/qemu/seed/image/create_key_pair.py +++ /dev/null @@ -1,33 +0,0 @@ -import paramiko -import os -from argparse import ArgumentParser, ArgumentTypeError - - - -def arguments(prsr: ArgumentParser) -> None: - prsr.add_argument( - "--output-files", - help="the output files ", - type=str, - nargs=2, - required=True, - ) - - -def main(): - prsr = ArgumentParser() - arguments(prsr) - parsed = prsr.parse_args() - private_key_path, public_key_path = parsed.output_files - key = paramiko.RSAKey.generate(4096) - key.write_private_key_file(private_key_path) - public_key = f"{key.get_name()} {key.get_base64()}" - - - with open(public_key_path, 'w') as f: - f.write(public_key) - -if __name__ == "__main__": - main() - - diff --git a/qemu/seed/image/seed_image.py b/qemu/seed/image/seed_image.py old mode 100644 new mode 100755 index 8559a46b..ac8a225a --- a/qemu/seed/image/seed_image.py +++ b/qemu/seed/image/seed_image.py @@ -1,68 +1,72 @@ -import pycdlib +import paramiko import os -from python.runfiles import Runfiles - from argparse import ArgumentParser, ArgumentTypeError +import pycdlib def arguments(prsr: ArgumentParser) -> None: prsr.add_argument( - "--output-file", - help="the output file ", + "--output-files", + help="the output files ", type=str, - nargs=1, + nargs=3, required=True, ) -def main(): - prsr = ArgumentParser() - arguments(prsr) - parsed = prsr.parse_args() - seed_image_path = parsed.output_file - runfiles = Runfiles.Create() - path = runfiles.Rlocation("_main/qemu/seed/image/public_key.pem") - with open(path) as stream: - public_key = stream.read() - # def create_iso_seed_images(user_data,meta_data,output_file): - #generate_user_data file - user_data = f"""\ - #cloud-config - users: - - name: idan - ssh-authorized-keys: - - {public_key} + +def main(): + prsr = ArgumentParser() + arguments(prsr) + parsed = prsr.parse_args() + private_key_path,public_key_path, seed_image_path = parsed.output_files + key = paramiko.RSAKey.generate(4096) + key.write_private_key_file(private_key_path) + public_key = f"{key.get_name()} {key.get_base64()}" - sudo: ['ALL=(ALL) NOPASSWD:ALL'] - groups: sudo - shell: /bin/bash - """ - print(user_data) - meta_data = """\ - instance-id: iid-local01 - local-hostname: cloudimg - """ + with open(public_key_path, 'w') as f: + f.write(public_key) + + #generate_user_data file + user_data = f"""\ + #cloud-config + users: + - name: idan + ssh-authorized-keys: + - {public_key} + sudo: ['ALL=(ALL) NOPASSWD:ALL'] + groups: sudo + shell: /bin/bash + """ - # Write user-data and meta-data to temporary files - user_data_path = 'USERDATA' - meta_data_path = 'METADATA' + print(user_data) + meta_data = """\ + instance-id: iid-local01 + local-hostname: cloudimg + """ - with open(user_data_path, 'w') as f: - f.write(user_data) - with open(meta_data_path, 'w') as f: - f.write(meta_data) + # Write user-data and meta-data to temporary files + user_data_path = 'USERDATA' + meta_data_path = 'METADATA' - iso = pycdlib.PyCdlib() - # Set the volume ID to 'cidata' - iso.new(interchange_level=3,joliet=True,rock_ridge='1.09',vol_ident='cidata') - iso.add_file(user_data_path, '/USER_DAT.;1', rr_name='user-data') - iso.add_file(meta_data_path, '/META_DAT.;1', rr_name='meta-data') - iso.write(seed_image_path[0]) - iso.close() + with open(user_data_path, 'w') as f: + f.write(user_data) + with open(meta_data_path, 'w') as f: + f.write(meta_data) + + iso = pycdlib.PyCdlib() + # Set the volume ID to 'cidata' + iso.new(interchange_level=3,joliet=True,rock_ridge='1.09',vol_ident='cidata') + iso.add_file(user_data_path, '/USER_DAT.;1', rr_name='user-data') + iso.add_file(meta_data_path, '/META_DAT.;1', rr_name='meta-data') + iso.write(seed_image_path) + iso.close() if __name__ == "__main__": - main() \ No newline at end of file + main() + + -- GitLab From d63a6b6dc6b07e92f919b49be93e914371ac4db7 Mon Sep 17 00:00:00 2001 From: Idan Saadon Date: Sun, 6 Oct 2024 16:03:17 +0300 Subject: [PATCH 3/6] feat: generate a seed image - code review changes --- qemu/seed/image/BUILD.bazel | 14 ++++------- qemu/seed/image/seed_image.py | 46 ++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/qemu/seed/image/BUILD.bazel b/qemu/seed/image/BUILD.bazel index a0973be7..2d974e2f 100644 --- a/qemu/seed/image/BUILD.bazel +++ b/qemu/seed/image/BUILD.bazel @@ -11,7 +11,7 @@ compile_pip_requirements( py_binary( name = "seed_image", srcs = ["seed_image.py"], - visibility = ["//visibility:public"], + visibility = ["//visibility:private"], deps = [ "@rules_labgrid-qemu-seed-pkg//paramiko", "@rules_labgrid-qemu-seed-pkg//pycdlib", @@ -26,21 +26,17 @@ genrule( "public_key.pem", "seed.iso", ], - cmd = "$(location :seed_image) --output-files $(OUTS)", + cmd = "$(location :seed_image) --image $(location seed.iso) --ssh-private-key $(location private_key.pem) --ssh-public-key $(location public_key.pem)", tools = [":seed_image"], + visibility = ["//visibility:private"], ) alias( - name = "public_key", - actual = "public_key.pem", -) - -alias( - name = "private_key", + name = "ssh-private-key", actual = "private_key.pem", ) alias( - name = "seed_image_cc", + name = "image", actual = "seed.iso", ) diff --git a/qemu/seed/image/seed_image.py b/qemu/seed/image/seed_image.py index ac8a225a..3045b73c 100755 --- a/qemu/seed/image/seed_image.py +++ b/qemu/seed/image/seed_image.py @@ -1,26 +1,38 @@ import paramiko -import os from argparse import ArgumentParser, ArgumentTypeError import pycdlib - - +import io def arguments(prsr: ArgumentParser) -> None: prsr.add_argument( - "--output-files", - help="the output files ", + "--ssh-public-key", + help="the path of the public key", + type=str, + required=True, + ) + prsr.add_argument( + "--ssh-private-key", + help="the path of the private key", + type=str, + required=True, + ) + prsr.add_argument( + "--image", + help="the path of the seed image", type=str, - nargs=3, required=True, ) + def main(): prsr = ArgumentParser() arguments(prsr) parsed = prsr.parse_args() - private_key_path,public_key_path, seed_image_path = parsed.output_files - key = paramiko.RSAKey.generate(4096) + private_key_path = parsed.ssh_private_key + public_key_path = parsed.ssh_public_key + seed_image_path = parsed.image + key = paramiko.ECDSAKey.generate() key.write_private_key_file(private_key_path) public_key = f"{key.get_name()} {key.get_base64()}" @@ -49,21 +61,15 @@ def main(): """ - # Write user-data and meta-data to temporary files - user_data_path = 'USERDATA' - meta_data_path = 'METADATA' - - with open(user_data_path, 'w') as f: - f.write(user_data) - - with open(meta_data_path, 'w') as f: - f.write(meta_data) - iso = pycdlib.PyCdlib() # Set the volume ID to 'cidata' + user_data = io.BytesIO(user_data.encode('utf-8')) + meta_data = io.BytesIO(meta_data.encode('utf-8')) + user_data_size = user_data.getbuffer().nbytes + meta_data_size = meta_data.getbuffer().nbytes iso.new(interchange_level=3,joliet=True,rock_ridge='1.09',vol_ident='cidata') - iso.add_file(user_data_path, '/USER_DAT.;1', rr_name='user-data') - iso.add_file(meta_data_path, '/META_DAT.;1', rr_name='meta-data') + iso.add_fp(user_data,user_data_size, '/USER_DAT.;1', rr_name='user-data') + iso.add_fp(meta_data,meta_data_size, '/META_DAT.;1', rr_name='meta-data') iso.write(seed_image_path) iso.close() if __name__ == "__main__": -- GitLab From 1d723c68816033173fe1544a1889905270b263c2 Mon Sep 17 00:00:00 2001 From: Idan Saadon Date: Sun, 6 Oct 2024 21:18:07 +0300 Subject: [PATCH 4/6] feat: generate a seed image - code review changes --- qemu/seed/image/BUILD.bazel | 8 ++++---- qemu/seed/image/seed_image.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/qemu/seed/image/BUILD.bazel b/qemu/seed/image/BUILD.bazel index 2d974e2f..95790c71 100644 --- a/qemu/seed/image/BUILD.bazel +++ b/qemu/seed/image/BUILD.bazel @@ -22,18 +22,18 @@ py_binary( genrule( name = "genrule_seed_image", outs = [ - "private_key.pem", - "public_key.pem", + "id_ecdsa", + "id_ecdsa.pub", "seed.iso", ], - cmd = "$(location :seed_image) --image $(location seed.iso) --ssh-private-key $(location private_key.pem) --ssh-public-key $(location public_key.pem)", + cmd = "$(location :seed_image) --image $(location seed.iso) --ssh-private-key $(location id_ecdsa) --ssh-public-key $(location id_ecdsa.pub)", tools = [":seed_image"], visibility = ["//visibility:private"], ) alias( name = "ssh-private-key", - actual = "private_key.pem", + actual = "id_ecdsa", ) alias( diff --git a/qemu/seed/image/seed_image.py b/qemu/seed/image/seed_image.py index 3045b73c..e64ca35a 100755 --- a/qemu/seed/image/seed_image.py +++ b/qemu/seed/image/seed_image.py @@ -45,7 +45,7 @@ def main(): user_data = f"""\ #cloud-config users: - - name: idan + - name: cloud-user ssh-authorized-keys: - {public_key} -- GitLab From 617c8cbf2a2c56264e3123defa9ccfd827fa65c3 Mon Sep 17 00:00:00 2001 From: Idan Saadon Date: Mon, 7 Oct 2024 08:24:42 +0300 Subject: [PATCH 5/6] feat: generate a seed image - code review changes --- qemu/seed/image/seed_image.py | 44 ++++++++++++----------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/qemu/seed/image/seed_image.py b/qemu/seed/image/seed_image.py index e64ca35a..9ea9fe0d 100755 --- a/qemu/seed/image/seed_image.py +++ b/qemu/seed/image/seed_image.py @@ -3,28 +3,19 @@ from argparse import ArgumentParser, ArgumentTypeError import pycdlib import io + def arguments(prsr: ArgumentParser) -> None: prsr.add_argument( - "--ssh-public-key", - help="the path of the public key", - type=str, - required=True, + "--ssh-public-key", help="the path of the public key", type=str, required=True ) prsr.add_argument( - "--ssh-private-key", - help="the path of the private key", - type=str, - required=True, + "--ssh-private-key", help="the path of the private key", type=str, required=True ) prsr.add_argument( - "--image", - help="the path of the seed image", - type=str, - required=True, + "--image", help="the path of the seed image", type=str, required=True ) - def main(): prsr = ArgumentParser() arguments(prsr) @@ -36,12 +27,10 @@ def main(): key.write_private_key_file(private_key_path) public_key = f"{key.get_name()} {key.get_base64()}" - - - with open(public_key_path, 'w') as f: + with open(public_key_path, "w") as f: f.write(public_key) - - #generate_user_data file + + # generate_user_data file user_data = f"""\ #cloud-config users: @@ -54,25 +43,22 @@ def main(): shell: /bin/bash """ - print(user_data) meta_data = """\ instance-id: iid-local01 local-hostname: cloudimg """ - iso = pycdlib.PyCdlib() - # Set the volume ID to 'cidata' - user_data = io.BytesIO(user_data.encode('utf-8')) - meta_data = io.BytesIO(meta_data.encode('utf-8')) + user_data = io.BytesIO(user_data.encode("utf-8")) + meta_data = io.BytesIO(meta_data.encode("utf-8")) user_data_size = user_data.getbuffer().nbytes meta_data_size = meta_data.getbuffer().nbytes - iso.new(interchange_level=3,joliet=True,rock_ridge='1.09',vol_ident='cidata') - iso.add_fp(user_data,user_data_size, '/USER_DAT.;1', rr_name='user-data') - iso.add_fp(meta_data,meta_data_size, '/META_DAT.;1', rr_name='meta-data') + iso.new(interchange_level=3, joliet=True, rock_ridge="1.09", vol_ident="cidata") + iso.add_fp(user_data, user_data_size, "/USER_DAT.;1", rr_name="user-data") + iso.add_fp(meta_data, meta_data_size, "/META_DAT.;1", rr_name="meta-data") iso.write(seed_image_path) iso.close() -if __name__ == "__main__": - main() - + +if __name__ == "__main__": + main() -- GitLab From f17185f615105e71b584d94a5b90474f36c340dc Mon Sep 17 00:00:00 2001 From: Idan Saadon Date: Tue, 8 Oct 2024 12:13:12 +0300 Subject: [PATCH 6/6] feat: generate a seed image - code review changes --- qemu/seed/image/BUILD.bazel | 13 ++++++++----- qemu/seed/image/{seed_image.py => main.py} | 0 2 files changed, 8 insertions(+), 5 deletions(-) rename qemu/seed/image/{seed_image.py => main.py} (100%) diff --git a/qemu/seed/image/BUILD.bazel b/qemu/seed/image/BUILD.bazel index 95790c71..ac46a249 100644 --- a/qemu/seed/image/BUILD.bazel +++ b/qemu/seed/image/BUILD.bazel @@ -9,8 +9,9 @@ compile_pip_requirements( ) py_binary( - name = "seed_image", - srcs = ["seed_image.py"], + name = "seed-image", + srcs = ["main.py"], + main = "main.py", visibility = ["//visibility:private"], deps = [ "@rules_labgrid-qemu-seed-pkg//paramiko", @@ -20,23 +21,25 @@ py_binary( ) genrule( - name = "genrule_seed_image", + name = "genrule-seed-image", outs = [ "id_ecdsa", "id_ecdsa.pub", "seed.iso", ], - cmd = "$(location :seed_image) --image $(location seed.iso) --ssh-private-key $(location id_ecdsa) --ssh-public-key $(location id_ecdsa.pub)", - tools = [":seed_image"], + cmd = "$(location :seed-image) --image $(location seed.iso) --ssh-private-key $(location id_ecdsa) --ssh-public-key $(location id_ecdsa.pub)", + tools = [":seed-image"], visibility = ["//visibility:private"], ) alias( name = "ssh-private-key", actual = "id_ecdsa", + visibility = ["//visibility:public"], ) alias( name = "image", actual = "seed.iso", + visibility = ["//visibility:public"], ) diff --git a/qemu/seed/image/seed_image.py b/qemu/seed/image/main.py similarity index 100% rename from qemu/seed/image/seed_image.py rename to qemu/seed/image/main.py -- GitLab