07070100000000000081A40000000000000000000000016A032DB600010C5A000000000000000000000000000000000000001B00000000wicked2nm-1.5.0/Cargo.lock# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "agama-locale-data" version = "0.1.0" source = "git+https://github.com/agama-project/agama#249333efd053cc76d0a904e6ac50e03751ebce80" dependencies = [ "chrono-tz", "flate2", "quick-xml 0.37.5", "regex", "schemars 1.2.1", "serde", "thiserror", ] [[package]] name = "agama-network" version = "0.1.0" source = "git+https://github.com/agama-project/agama#249333efd053cc76d0a904e6ac50e03751ebce80" dependencies = [ "agama-utils", "anyhow", "async-trait", "cidr", "futures-util", "gettext-rs", "macaddr", "pin-project", "schemars 1.2.1", "semver", "serde", "serde_with", "thiserror", "tokio", "tokio-stream", "tracing", "uuid", "zbus", ] [[package]] name = "agama-utils" version = "0.1.0" source = "git+https://github.com/agama-project/agama#249333efd053cc76d0a904e6ac50e03751ebce80" dependencies = [ "agama-locale-data", "anyhow", "async-trait", "camino", "cidr", "fluent-uri", "fs-err", "gettext-rs", "libsystemd", "macaddr", "merge", "regex", "schemars 1.2.1", "serde", "serde_json", "serde_with", "serde_yaml", "strum 0.27.2", "tempfile", "thiserror", "tokio", "tracing", "tracing-journald", "tracing-subscriber", "url", "uuid", "zbus", "zvariant", ] [[package]] name = "aho-corasick" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "android_system_properties" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ "libc", ] [[package]] name = "anstream" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "async-broadcast" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-channel" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", "pin-project-lite", "slab", ] [[package]] name = "async-io" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", "rustix", "slab", "windows-sys", ] [[package]] name = "async-lock" version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-process" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", "event-listener", "futures-lite", "rustix", ] [[package]] name = "async-recursion" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "async-signal" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", "rustix", "signal-hook-registry", "slab", "windows-sys", ] [[package]] name = "async-task" version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "blocking" version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", "futures-io", "futures-lite", "piper", ] [[package]] name = "borrow-or-share" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" [[package]] name = "bstr" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "serde", ] [[package]] name = "bumpalo" version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" [[package]] name = "cc" version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "num-traits", "serde", "windows-link", ] [[package]] name = "chrono-tz" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" dependencies = [ "chrono", "phf", ] [[package]] name = "cidr" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "579504560394e388085d0c080ea587dfa5c15f7e251b4d5247d1e1a61d1d6928" dependencies = [ "serde", ] [[package]] name = "clap" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", "terminal_size", ] [[package]] name = "clap_derive" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "colorchoice" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "concurrent-queue" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", ] [[package]] name = "darling" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ "ident_case", "proc-macro2", "quote", "strsim", "syn", ] [[package]] name = "darling_macro" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", "syn", ] [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", "serde_core", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", "subtle", ] [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "dotenv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "dyn-clone" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "endi" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "enumflags2" version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", ] [[package]] name = "enumflags2_derive" version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", "windows-sys", ] [[package]] name = "event-listener" version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", "pin-project-lite", ] [[package]] name = "event-listener-strategy" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", ] [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "fluent-uri" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" dependencies = [ "borrow-or-share", "ref-cast", "serde", ] [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "fs-err" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" dependencies = [ "autocfg", ] [[package]] name = "futures-core" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-io" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", "futures-io", "parking", "pin-project-lite", ] [[package]] name = "futures-task" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-task", "pin-project-lite", "slab", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", "r-efi", "wasip2", "wasip3", ] [[package]] name = "gettext-rs" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf" dependencies = [ "gettext-sys", "locale_config", ] [[package]] name = "gettext-sys" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" dependencies = [ "cc", "temp-dir", ] [[package]] name = "globset" version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", "regex-automata", "regex-syntax", ] [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "foldhash", ] [[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ "digest", ] [[package]] name = "iana-time-zone" version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "log", "wasm-bindgen", "windows-core", ] [[package]] name = "iana-time-zone-haiku" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ "cc", ] [[package]] name = "icu_collections" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_locale_core" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", "tinystr", "writeable", "zerovec", ] [[package]] name = "icu_normalizer" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", "zerovec", ] [[package]] name = "icu_normalizer_data" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", "writeable", "yoke", "zerofrom", "zerotrie", "zerovec", ] [[package]] name = "id-arena" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", "utf8_iter", ] [[package]] name = "idna_adapter" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", ] [[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", "serde", ] [[package]] name = "indexmap" version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", "serde", "serde_core", ] [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leb128fmt" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libsystemd" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19c97a761fc86953c5b885422b22c891dbf5bcb9dcc99d0110d6ce4c052759f0" dependencies = [ "hmac", "libc", "log", "nix 0.29.0", "nom", "once_cell", "serde", "sha2", "thiserror", "uuid", ] [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "locale_config" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" dependencies = [ "lazy_static", "objc", "objc-foundation", "regex", "winapi", ] [[package]] name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "macaddr" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baee0bbc17ce759db233beb01648088061bf678383130602a298e6998eedb2d8" dependencies = [ "serde", ] [[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ "libc", ] [[package]] name = "matchers" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ "regex-automata", ] [[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memoffset" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "merge" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e520ba58faea3487f75df198b1d079644ec226ea3b0507d002c6fa4b8cf93a" dependencies = [ "merge_derive", "num-traits", ] [[package]] name = "merge_derive" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8f8ce6efff81cbc83caf4af0905c46e58cb46892f63ad3835e81b47eaf7968" dependencies = [ "proc-macro-error2", "proc-macro2", "quote", "syn", ] [[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", ] [[package]] name = "mio" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "wasi", "windows-sys", ] [[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags", "cfg-if", "cfg_aliases", "libc", "memoffset", ] [[package]] name = "nix" version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ "bitflags", "cfg-if", "cfg_aliases", "libc", "memoffset", ] [[package]] name = "nom" version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" dependencies = [ "memchr", ] [[package]] name = "nu-ansi-term" version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ "windows-sys", ] [[package]] name = "num-conv" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_threads" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] [[package]] name = "objc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", ] [[package]] name = "objc-foundation" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ "block", "objc", "objc_id", ] [[package]] name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ "objc", ] [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "ordered-stream" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ "futures-core", "pin-project-lite", ] [[package]] name = "parking" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" dependencies = [ "phf_shared", ] [[package]] name = "phf_shared" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" dependencies = [ "siphasher", ] [[package]] name = "pin-project" version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "piper" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", "futures-io", ] [[package]] name = "polling" version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", "rustix", "windows-sys", ] [[package]] name = "potential_utf" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "prettyplease" version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", ] [[package]] name = "proc-macro-crate" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro-error-attr2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ "proc-macro2", "quote", ] [[package]] name = "proc-macro-error2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", "syn", ] [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", "serde", ] [[package]] name = "quick-xml" version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" dependencies = [ "memchr", "serde", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "ref-cast" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "regex" version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rustix" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys", ] [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "schemars" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" dependencies = [ "dyn-clone", "ref-cast", "serde", "serde_json", ] [[package]] name = "schemars" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", "schemars_derive", "serde", "serde_json", "url", "uuid", ] [[package]] name = "schemars_derive" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", "syn", ] [[package]] name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_derive_internals" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_ignored" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" dependencies = [ "serde", "serde_core", ] [[package]] name = "serde_json" version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", "serde", "serde_core", "zmij", ] [[package]] name = "serde_path_to_error" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", "serde_core", ] [[package]] name = "serde_repr" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_with" version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", "indexmap 2.13.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", "time", ] [[package]] name = "serde_with_macros" version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ "darling", "proc-macro2", "quote", "syn", ] [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ "indexmap 2.13.0", "itoa", "ryu", "serde", "unsafe-libyaml", ] [[package]] name = "sha2" version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sharded-slab" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ "errno", "libc", ] [[package]] name = "simd-adler32" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simplelog" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" dependencies = [ "log", "termcolor", "time", ] [[package]] name = "siphasher" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", "windows-sys", ] [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" [[package]] name = "strum" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros 0.27.2", ] [[package]] name = "strum_macros" version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", "rustversion", "syn", ] [[package]] name = "strum_macros" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", "syn", ] [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "synstructure" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "temp-dir" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "tempfile" version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", "getrandom", "once_cell", "rustix", "windows-sys", ] [[package]] name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "terminal_size" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" dependencies = [ "rustix", "windows-sys", ] [[package]] name = "testing_logger" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d92b727cb45d33ae956f7f46b966b25f1bc712092aeef9dba5ac798fc89f720" dependencies = [ "log", ] [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thread_local" version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", ] [[package]] name = "time" version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "libc", "num-conv", "num_threads", "powerfmt", "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tinystr" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", ] [[package]] name = "tokio" version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", "mio", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", "tracing", "windows-sys", ] [[package]] name = "tokio-macros" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tokio-stream" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", "tokio", ] [[package]] name = "toml_datetime" version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" version = "0.25.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" dependencies = [ "indexmap 2.13.0", "toml_datetime", "toml_parser", "winnow 1.0.0", ] [[package]] name = "toml_parser" version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" dependencies = [ "winnow 1.0.0", ] [[package]] name = "tracing" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", ] [[package]] name = "tracing-journald" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3a81ed245bfb62592b1e2bc153e77656d94ee6a0497683a65a12ccaf2438d0" dependencies = [ "libc", "tracing-core", "tracing-subscriber", ] [[package]] name = "tracing-log" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", "once_cell", "regex-automata", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", ] [[package]] name = "typenum" version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "uds_windows" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", "windows-sys", ] [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "url" version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", "serde_derive", ] [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ "getrandom", "js-sys", "serde_core", "wasm-bindgen", ] [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasip3" version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-encoder" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ "leb128fmt", "wasmparser", ] [[package]] name = "wasm-metadata" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", "indexmap 2.13.0", "wasm-encoder", "wasmparser", ] [[package]] name = "wasmparser" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags", "hashbrown 0.15.5", "indexmap 2.13.0", "semver", ] [[package]] name = "wicked2nm" version = "1.5.0" dependencies = [ "agama-network", "anyhow", "cidr", "clap", "dotenv", "globset", "log", "macaddr", "nix 0.30.1", "quick-xml 0.39.2", "regex", "serde", "serde_ignored", "serde_json", "serde_path_to_error", "serde_with", "serde_yaml", "simplelog", "strum 0.25.0", "strum_macros 0.25.3", "testing_logger", "thiserror", "tokio", "uuid", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", "windows-strings", ] [[package]] name = "windows-implement" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-interface" version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "winnow" version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] name = "winnow" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" dependencies = [ "wit-bindgen-rust-macro", ] [[package]] name = "wit-bindgen-core" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", "heck 0.5.0", "wit-parser", ] [[package]] name = "wit-bindgen-rust" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck 0.5.0", "indexmap 2.13.0", "prettyplease", "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", ] [[package]] name = "wit-bindgen-rust-macro" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" dependencies = [ "anyhow", "prettyplease", "proc-macro2", "quote", "syn", "wit-bindgen-core", "wit-bindgen-rust", ] [[package]] name = "wit-component" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags", "indexmap 2.13.0", "log", "serde", "serde_derive", "serde_json", "wasm-encoder", "wasm-metadata", "wasmparser", "wit-parser", ] [[package]] name = "wit-parser" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", "indexmap 2.13.0", "log", "semver", "serde", "serde_derive", "serde_json", "unicode-xid", "wasmparser", ] [[package]] name = "writeable" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ "stable_deref_trait", "yoke-derive", "zerofrom", ] [[package]] name = "yoke-derive" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zbus" version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" dependencies = [ "async-broadcast", "async-executor", "async-io", "async-lock", "async-process", "async-recursion", "async-task", "async-trait", "blocking", "enumflags2", "event-listener", "futures-core", "futures-lite", "hex", "libc", "ordered-stream", "rustix", "serde", "serde_repr", "tokio", "tracing", "uds_windows", "uuid", "windows-sys", "winnow 0.7.15", "zbus_macros", "zbus_names", "zvariant", ] [[package]] name = "zbus_macros" version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn", "zbus_names", "zvariant", "zvariant_utils", ] [[package]] name = "zbus_names" version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ "serde", "winnow 0.7.15", "zvariant", ] [[package]] name = "zerofrom" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zerotrie" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", "zerofrom", ] [[package]] name = "zerovec" version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zvariant" version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" dependencies = [ "endi", "enumflags2", "serde", "winnow 0.7.15", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn", "zvariant_utils", ] [[package]] name = "zvariant_utils" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" dependencies = [ "proc-macro2", "quote", "serde", "syn", "winnow 0.7.15", ] 07070100000001000081A40000000000000000000000016A032DB600000442000000000000000000000000000000000000001B00000000wicked2nm-1.5.0/Cargo.toml[package] name = "wicked2nm" version = "1.5.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] serde = { version = "1.0.152", features = ["derive"] } serde_json = "1.0.91" serde_yaml = "0.9.17" quick-xml = { version = "0.39.2", features = ["serialize"] } agama-network = { git = "https://github.com/agama-project/agama" } regex = "1.9.5" cidr = { version = "0.3.1", features = ["serde"] } clap = { version = "4.1.4", features = ["derive", "wrap_help", "env"] } anyhow = "1.0.71" log = "0.4" simplelog = "0.12.1" strum = "0.25.0" strum_macros = "0.25.2" serde_with = "3.3.0" tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] } serde_ignored = "0.1.9" uuid = { version = "1.3.4", features = ["v4"] } macaddr = "1.0" dotenv = "0.15.0" serde_path_to_error = "0.1.16" globset = { version = "0.4.16", default-features = false } nix = { version = "0.30.1", features = ["net"] } thiserror = "2.0.12" [dev-dependencies] testing_logger = "0.1.1" [[bin]] name = "wicked2nm" path = "src/main.rs" 07070100000002000081A40000000000000000000000016A032DB6000046AC000000000000000000000000000000000000001800000000wicked2nm-1.5.0/LICENSE GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. 07070100000003000081A40000000000000000000000016A032DB60000098E000000000000000000000000000000000000001A00000000wicked2nm-1.5.0/README.md# Wicked to NetworkManager migration This project creates a `wicked2nm` binary which is able to parse wicked xml configs and send them to a NetworkManager dbus service. ## Installation `wicked2nm` is available in openSUSE tumbleweed `zypper in wicked2nm`. There is also a package that includes all the latest changes available at https://build.opensuse.org/package/show/home:jcronenberg:migrate-wicked/wicked2nm. ## Usage ### On system If both `wicked` and `NetworkManager` are available `wicked2nm` can be run on the system directly simply with: ```bash wicked show-config > wicked.xml wicked2nm migrate wicked.xml ``` More detailed instructions how a migration can work here: ```bash # NetworkManager-config-server is required as otherwise NM will immediately add connections for all interfaces, resulting in duplicates. # NetworkManager-config-server can be removed after the migration is done. zypper in wicked2nm NetworkManager NetworkManager-config-server # If NetworkManager-config-server is not available you can also manually add the drop-in configuration. echo -e "[main]\nno-auto-default=*" > /etc/NetworkManager/conf.d/10-server.conf # You can test beforehand whether there are errors or warnings. wicked show-config | wicked2nm migrate --dry-run - # WARNING: Run this as root, wicked will shut down the interfaces and they will only come up again once the migration is done. # This oneliner shuts down wicked, starts NM and runs the migration, if anything went wrong it starts wicked again. systemctl disable --now wicked \ && (systemctl enable --now NetworkManager && wicked show-config | wicked2nm migrate --continue-migration --activate-connections -) \ || (systemctl disable --now NetworkManager; systemctl enable --now wicked) ``` ### Via container `wicked2nm` can also be run via a container. ```bash podman run -v /etc/sysconfig/network:/etc/sysconfig/network registry.opensuse.org/home/jcronenberg/migrate-wicked/containers/opensuse/wicked2nm:latest ``` This will create `*.nmconnection` files inside `/etc/sysconfig/network/NM-migrated`. See also the [Container's README](https://build.opensuse.org/projects/home:jcronenberg:migrate-wicked/packages/wicked2nm-container/files/README?expand=1) for further infos. ## Architecture `wicked2nm` uses agama as a library to communicate the parsed network state to NetworkManager but the binary is completely independent of any agama services and can be run standalone. 07070100000004000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001400000000wicked2nm-1.5.0/src07070100000005000081A40000000000000000000000016A032DB600003728000000000000000000000000000000000000001C00000000wicked2nm-1.5.0/src/bond.rsuse agama_network::model::{self}; use agama_network::types::BondMode as AgamaBondMode; use serde::{Deserialize, Deserializer, Serialize}; use serde_with::{skip_serializing_none, DeserializeFromStr, SerializeDisplay}; use std::collections::HashMap; use strum_macros::{Display, EnumString}; #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum FailOverMac { None, Active, Follow, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum XmitHashPolicy { Layer2, Layer23, Layer34, Encap23, Encap34, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum LacpRate { Slow, Fast, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum AdSelect { Stable, Bandwidth, Count, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum PrimaryReselect { Always, Better, Failure, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum WickedBondMode { BalanceRr = 0, ActiveBackup, BalanceXor, Broadcast, #[strum(serialize = "ieee802-3ad")] IEEE8023ad, BalanceTlb, BalanceAlb, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Bond { pub mode: WickedBondMode, pub miimon: Option, pub arpmon: Option, /* only on mode=[802.3ad, balance_xor] */ pub xmit_hash_policy: Option, /* only on mode=balance_rr */ pub packets_per_slave: Option, /* only on mode=balance_tlb */ pub tlb_dynamic_lb: Option, /* only on mode=802.3ad */ pub lacp_rate: Option, /* only on mode=802.3ad */ pub ad_select: Option, /* only on mode=802.3ad */ pub ad_user_port_key: Option, /* only on mode=802.3ad */ pub ad_actor_sys_prio: Option, /* only on mode=802.3ad */ pub ad_actor_system: Option, /* only on mode=802.3ad */ pub min_links: Option, /* only on mode=active-backup */ pub primary_reselect: Option, /* only on mode=active-backup */ pub fail_over_mac: Option, /* only on mode=active-backup */ pub num_grat_arp: Option, /* only on mode=active-backup */ pub num_unsol_na: Option, /* only on mode=[balance_tlb|balance_alb] */ pub lp_interval: Option, /* only on mode=[active-backup|balance_tlb|balance_alb] */ pub primary: Option, /* only on mode=[balance_tlb|balance_alb|balance_RR|active-backup] */ pub resend_igmp: Option, pub all_slaves_active: Option, pub address: Option, } #[derive(Debug, PartialEq, Default, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum CarrierDetect { Ioctl = 0, #[default] Netif = 1, } #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct Miimon { pub frequency: u32, #[serde(rename = "carrier-detect")] pub carrier_detect: CarrierDetect, pub downdelay: Option, pub updelay: Option, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum ArpValidateTargets { Any = 0, All = 1, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "snake_case")] pub enum ArpValidate { None = 0, Active = 1, Backup = 2, All = 3, Filter = 4, FilterActive = 5, FilterBackup = 6, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct ArpMon { pub interval: u32, pub validate: ArpValidate, #[serde(rename = "validate-targets")] pub validate_targets: Option, #[serde(deserialize_with = "unwrap_arpmon_targets")] pub targets: Vec, } fn unwrap_arpmon_targets<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct ArpMonTargetAddressV4 { #[serde(rename = "ipv4-address")] pub ipv4_address: Vec, } Ok(ArpMonTargetAddressV4::deserialize(deserializer)?.ipv4_address) } impl From<&WickedBondMode> for AgamaBondMode { fn from(bondmode: &WickedBondMode) -> AgamaBondMode { match bondmode { WickedBondMode::BalanceRr => AgamaBondMode::RoundRobin, WickedBondMode::ActiveBackup => AgamaBondMode::ActiveBackup, WickedBondMode::BalanceXor => AgamaBondMode::BalanceXOR, WickedBondMode::Broadcast => AgamaBondMode::Broadcast, WickedBondMode::IEEE8023ad => AgamaBondMode::LACP, WickedBondMode::BalanceTlb => AgamaBondMode::BalanceTLB, WickedBondMode::BalanceAlb => AgamaBondMode::BalanceALB, } } } impl XmitHashPolicy { fn to_agama(&self) -> String { match self { XmitHashPolicy::Layer2 => String::from("layer2"), XmitHashPolicy::Layer23 => String::from("layer2+3"), XmitHashPolicy::Layer34 => String::from("layer3+4"), XmitHashPolicy::Encap23 => String::from("encap2+3"), XmitHashPolicy::Encap34 => String::from("encap3+4"), } } } impl From<&Bond> for model::ConnectionConfig { fn from(bond: &Bond) -> model::ConnectionConfig { let mut h: HashMap = HashMap::new(); if let Some(p) = &bond.primary { h.insert(String::from("primary"), p.clone()); } if let Some(m) = &bond.miimon { h.insert(String::from("miimon"), format!("{}", m.frequency)); h.insert( String::from("use_carrier"), match m.carrier_detect { CarrierDetect::Ioctl => 0, CarrierDetect::Netif => 1, } .to_string(), ); if let Some(v) = m.downdelay { h.insert(String::from("downdelay"), v.to_string()); } if let Some(v) = m.updelay { h.insert(String::from("updelay"), v.to_string()); } } if let Some(a) = &bond.arpmon { h.insert(String::from("arp_interval"), format!("{}", a.interval)); h.insert(String::from("arp_validate"), a.validate.to_string()); if !a.targets.is_empty() { let sv = a .targets .iter() .map(|c| c.as_ref()) .collect::>() .join(","); h.insert(String::from("arp_ip_target"), sv); } if let Some(v) = &a.validate_targets { h.insert(String::from("arp_all_targets"), v.to_string()); } } if let Some(fom) = &bond.fail_over_mac { h.insert(String::from("fail_over_mac"), fom.to_string()); } if let Some(v) = &bond.xmit_hash_policy { h.insert(String::from("xmit_hash_policy"), v.to_agama()); } if let Some(v) = &bond.packets_per_slave { h.insert(String::from("packets_per_slave"), v.to_string()); } if let Some(v) = &bond.tlb_dynamic_lb { h.insert( String::from("tlb_dynamic_lb"), if *v { 1.to_string() } else { 0.to_string() }, ); } if let Some(v) = &bond.lacp_rate { h.insert(String::from("lacp_rate"), v.to_string()); } if let Some(v) = &bond.ad_select { h.insert(String::from("ad_select"), v.to_string()); } if let Some(v) = &bond.ad_user_port_key { h.insert(String::from("ad_user_port_key"), v.to_string()); } if let Some(v) = &bond.ad_actor_sys_prio { h.insert(String::from("ad_actor_sys_prio"), v.to_string()); } if let Some(v) = &bond.ad_actor_system { h.insert(String::from("ad_actor_system"), v.clone()); } if let Some(v) = &bond.min_links { h.insert(String::from("min_links"), v.to_string()); } if let Some(v) = &bond.primary_reselect { h.insert(String::from("primary_reselect"), v.to_string()); } if let Some(v) = &bond.num_grat_arp { h.insert(String::from("num_grat_arp"), v.to_string()); } if let Some(v) = &bond.num_unsol_na { h.insert(String::from("num_unsol_na"), v.to_string()); } if let Some(v) = &bond.lp_interval { h.insert(String::from("lp_interval"), v.to_string()); } if let Some(v) = &bond.resend_igmp { h.insert(String::from("resend_igmp"), v.to_string()); } if let Some(v) = &bond.all_slaves_active { h.insert( String::from("all_slaves_active"), if *v { 1.to_string() } else { 0.to_string() }, ); } model::ConnectionConfig::Bond(model::BondConfig { options: model::BondOptions(h), mode: AgamaBondMode::from(&bond.mode), }) } } #[cfg(test)] mod tests { use super::*; use crate::interface::*; use crate::MIGRATION_SETTINGS; #[allow(dead_code)] fn setup_default_migration_settings() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); } #[test] fn test_bond_options() { setup_default_migration_settings(); let bond_interface = Interface { bond: Some(Bond { mode: WickedBondMode::IEEE8023ad, xmit_hash_policy: Some(XmitHashPolicy::Encap34), fail_over_mac: Some(FailOverMac::Active), packets_per_slave: Some(23), tlb_dynamic_lb: Some(true), lacp_rate: Some(LacpRate::Slow), ad_select: Some(AdSelect::Bandwidth), ad_user_port_key: Some(42), ad_actor_sys_prio: Some(5), ad_actor_system: Some(String::from("00:de:ad:be:ef:00")), min_links: Some(3), primary_reselect: Some(PrimaryReselect::Better), num_grat_arp: Some(7), num_unsol_na: Some(13), lp_interval: Some(17), resend_igmp: Some(19), all_slaves_active: Some(true), miimon: Some(Miimon { frequency: 42, carrier_detect: CarrierDetect::Netif, downdelay: Some(23), updelay: Some(5), }), arpmon: Some(ArpMon { interval: 23, validate: ArpValidate::FilterBackup, validate_targets: Some(ArpValidateTargets::Any), targets: vec![String::from("1.2.3.4"), String::from("4.3.2.1")], }), address: Some(String::from("02:11:22:33:44:55")), primary: Some(String::from("en0")), }), ..Default::default() }; let connection: &model::Connection = &bond_interface.to_connection(&None).unwrap().connections[0]; assert!(matches!( connection.config, model::ConnectionConfig::Bond(_) )); assert_eq!( connection.custom_mac_address.to_string(), "02:11:22:33:44:55" ); if let model::ConnectionConfig::Bond(bond) = &connection.config { assert_eq!(bond.mode, AgamaBondMode::LACP); let s = HashMap::from([ ("xmit_hash_policy", String::from("encap3+4")), ("packets_per_slave", 23.to_string()), ("tlb_dynamic_lb", 1.to_string()), ("lacp_rate", String::from("slow")), ("ad_select", String::from("bandwidth")), ("ad_user_port_key", 42.to_string()), ("ad_actor_sys_prio", 5.to_string()), ("ad_actor_system", String::from("00:de:ad:be:ef:00")), ("min_links", 3.to_string()), ("primary_reselect", String::from("better")), ("fail_over_mac", String::from("active")), ("num_grat_arp", 7.to_string()), ("num_unsol_na", 13.to_string()), ("lp_interval", 17.to_string()), ("resend_igmp", 19.to_string()), ("all_slaves_active", 1.to_string()), // miimon ("miimon", 42.to_string()), ("use_carrier", 1.to_string()), ("downdelay", 23.to_string()), ("updelay", 5.to_string()), // arpmon ("arp_validate", String::from("filter_backup")), ("arp_all_targets", String::from("any")), ("arp_ip_target", String::from("1.2.3.4,4.3.2.1")), ("arp_interval", 23.to_string()), ("primary", String::from("en0")), ]); for (k, v) in s.iter() { assert!( bond.options.0.contains_key(*k), "Missing key '{}' in bond hash {:?}", *k, bond.options.0 ); assert_eq!( bond.options.0.get(*k).unwrap(), v, "Unexpected value '{}' in key '{}'", *k, v ); } } } } 07070100000006000081A40000000000000000000000016A032DB600000442000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/src/bridge.rsuse agama_network::model; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Bridge { #[serde(default)] pub stp: bool, pub priority: Option, pub forward_delay: Option, pub hello_time: Option, pub max_age: Option, pub aging_time: Option, // wicked uses US english, but kernel and nm UK (ageing) pub address: Option, } impl From<&Bridge> for model::ConnectionConfig { fn from(bridge: &Bridge) -> model::ConnectionConfig { model::ConnectionConfig::Bridge(model::BridgeConfig { stp: Some(bridge.stp), priority: bridge.priority.map(|v| v as u32), forward_delay: bridge.forward_delay.map(|v| v.round() as u32), hello_time: bridge.hello_time.map(|v| v.round() as u32), max_age: bridge.max_age.map(|v| v.round() as u32), ageing_time: bridge.aging_time.map(|v| v.round() as u32), }) } } 07070100000007000081A40000000000000000000000016A032DB60000130E000000000000000000000000000000000000002200000000wicked2nm-1.5.0/src/infiniband.rsuse agama_network::model::{self, InfinibandConfig, InfinibandTransportMode}; use serde::{Deserialize, Deserializer, Serialize}; use serde_with::skip_serializing_none; use std::str::FromStr; #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct Infiniband { pub mode: Option, pub multicast: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct InfinibandChild { pub device: String, #[serde(deserialize_with = "deserialize_pkey")] pub pkey: u16, pub mode: Option, pub multicast: Option, } fn deserialize_pkey<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let pkey_string: String = String::deserialize(deserializer)?; let pkey_string: &str = pkey_string.trim_start_matches("0x"); Ok(u16::from_str_radix(pkey_string, 16).unwrap()) } impl From<&Infiniband> for model::ConnectionConfig { fn from(value: &Infiniband) -> Self { model::ConnectionConfig::Infiniband(InfinibandConfig { transport_mode: InfinibandTransportMode::from_str( value .mode .as_ref() .unwrap_or(&"datagram".to_string()) .as_str(), ) .unwrap(), ..Default::default() }) } } impl From<&InfinibandChild> for model::ConnectionConfig { fn from(value: &InfinibandChild) -> Self { model::ConnectionConfig::Infiniband(InfinibandConfig { p_key: Some(value.pkey as i32), parent: Some(value.device.clone()), transport_mode: InfinibandTransportMode::from_str( value .mode .as_ref() .unwrap_or(&"datagram".to_string()) .as_str(), ) .unwrap(), }) } } #[cfg(test)] mod tests { use super::*; use crate::interface::*; use crate::MIGRATION_SETTINGS; #[allow(dead_code)] fn setup_default_migration_settings() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); } #[test] fn test_infiniband_migration() { setup_default_migration_settings(); let infiniband_interface = Interface { infiniband: Some(Infiniband { mode: Some("datagram".to_string()), multicast: Some("allowed".to_string()), }), ..Default::default() }; let connections = infiniband_interface.to_connection(&None); assert!(connections.is_ok()); let connection = &connections.unwrap().connections[0]; let model::ConnectionConfig::Infiniband(infiniband) = &connection.config else { panic!() }; assert_eq!( infiniband.transport_mode, InfinibandTransportMode::from_str("datagram").unwrap() ); } #[test] fn test_infiniband_child_migration() { setup_default_migration_settings(); let infiniband_child_interface = Interface { infiniband_child: Some(InfinibandChild { mode: Some("datagram".to_string()), multicast: Some("allowed".to_string()), pkey: 0x8001, device: "ib0".to_string(), }), name: "ib0".to_string(), ..Default::default() }; testing_logger::setup(); let connections = infiniband_child_interface.to_connection(&None); assert!(connections.is_ok()); // Check multicast warning is generated assert!(connections.as_ref().unwrap().has_warnings); testing_logger::validate(|captured_logs| { assert_eq!(captured_logs.len(), 1); assert_eq!( captured_logs[0].body, "Infiniband multicast in ib0 isn't supported by NetworkManager" ); }); let connection = &connections.unwrap().connections[0]; let model::ConnectionConfig::Infiniband(infiniband_child) = &connection.config else { panic!() }; assert_eq!( infiniband_child.transport_mode, InfinibandTransportMode::from_str("datagram").unwrap() ); assert_eq!(infiniband_child.p_key, Some(0x8001)); assert_eq!(infiniband_child.parent, Some("ib0".to_string())); } #[test] fn test_deserialize_pkey() { let xml = r##" 0x8001 ib0 "##; let infiniband_child = quick_xml::de::from_str::(xml).unwrap(); assert_eq!(infiniband_child.pkey, 0x8001); } } 07070100000008000081A40000000000000000000000016A032DB60000C61F000000000000000000000000000000000000002100000000wicked2nm-1.5.0/src/interface.rsuse crate::bond::Bond; use crate::bridge::Bridge; use crate::infiniband::{Infiniband, InfinibandChild}; use crate::netconfig_dhcp::{HostnameOption, NetconfigDhcp}; use crate::ovs::OvsBridge; use crate::team::Team; use crate::tuntap::Tap; use crate::tuntap::Tun; use crate::vlan::Vlan; use crate::wireless::Wireless; use crate::MIGRATION_SETTINGS; use agama_network::model; use agama_network::types::{ Dhcp4Settings, Dhcp6Settings, DhcpClientId, DhcpDuid, DhcpIaid, IpConfig, IpRoute, Ipv4Method, Ipv6Method, LinkLocal, MacAddress, Status, }; use cidr::IpInet; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, skip_serializing_none, DeserializeFromStr, SerializeDisplay}; use std::collections::HashSet; use std::{net::IpAddr, str::FromStr}; use strum_macros::{Display, EnumString}; #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] #[serde(default)] pub struct Interface { pub name: String, pub firewall: Firewall, pub link: Link, pub ipv4: Ipv4, #[serde(rename = "ipv4-static")] pub ipv4_static: Option, #[serde(rename = "ipv4-dhcp")] pub ipv4_dhcp: Option, #[serde(rename = "ipv4-auto")] pub ipv4_auto: Option, pub ipv6: Ipv6, #[serde(rename = "ipv6-static")] pub ipv6_static: Option, #[serde(rename = "ipv6-dhcp")] pub ipv6_dhcp: Option, #[serde(rename = "ipv6-auto")] pub ipv6_auto: Option, pub dummy: Option, pub ethernet: Option, pub bond: Option, pub team: Option, #[serde(skip_serializing_if = "Option::is_none")] pub wireless: Option, #[serde(rename = "@origin")] pub origin: String, pub vlan: Option, pub bridge: Option, pub infiniband: Option, #[serde(rename = "infiniband-child")] pub infiniband_child: Option, pub tun: Option, pub tap: Option, #[serde(rename = "ovs-bridge")] pub ovs_bridge: Option, pub control: Control, } #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] #[serde(default)] pub struct Firewall { pub zone: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize, Clone)] #[serde(default)] pub struct Link { pub master: Option, pub mtu: Option, pub port: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct LinkPort { #[serde(rename = "@type")] pub port_type: LinkPortType, // Bridge port options pub priority: Option, #[serde(rename = "path-cost")] pub path_cost: Option, // Team port options pub queue_id: Option, pub prio: Option, #[serde(default)] pub sticky: bool, pub lacp_key: Option, pub lacp_prio: Option, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Clone)] #[strum(serialize_all = "kebab-case")] pub enum LinkPortType { Bridge, Bond, OvsBridge, Team, } fn default_true() -> bool { true } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Ipv4 { #[serde(default = "default_true")] pub enabled: bool, // ignored #[serde(rename = "arp-verify", default = "default_true")] pub arp_verify: bool, } impl Default for Ipv4 { fn default() -> Self { Self { enabled: true, arp_verify: true, } } } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Ipv6 { #[serde(default = "default_true")] pub enabled: bool, pub privacy: Option, // ignored #[serde(rename = "accept-redirects", default)] pub accept_redirects: bool, } #[derive( Debug, PartialEq, Default, SerializeDisplay, DeserializeFromStr, EnumString, Clone, Display, )] #[strum(serialize_all = "kebab-case")] pub enum Ip6Privacy { Disable = 0, #[default] PreferPublic = 1, PreferTemporary = 2, } impl Default for Ipv6 { fn default() -> Self { Self { enabled: true, privacy: None, accept_redirects: false, } } } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Ipv4Static { #[serde(rename = "address")] pub addresses: Option>, #[serde(rename = "route")] pub routes: Option>, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Ipv4Dhcp { pub enabled: bool, // ignored #[serde(default = "default_flags")] pub flags: String, // ignored #[serde(default = "default_v4_update")] pub update: String, pub hostname: Option, #[serde(rename = "create-cid", default)] pub create_cid: CreateCid, #[serde(rename = "client-id")] pub client_id: Option, // ignored #[serde(rename = "defer-timeout", default = "default_defer_timeout")] pub defer_timeout: u32, // ignored #[serde(rename = "recover-lease", default = "default_true")] pub recover_lease: bool, #[serde(rename = "release-lease", default)] pub release_lease: bool, } #[derive( Debug, PartialEq, Default, SerializeDisplay, DeserializeFromStr, EnumString, Display, Clone, )] #[strum(serialize_all = "kebab-case")] pub enum CreateCid { #[default] Rfc4361, Rfc2132, Disable, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Ipv4Auto { pub enabled: bool, pub flags: Option, } fn default_flags() -> String { "group".to_string() } fn default_v4_update() -> String { "default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot".to_string() } fn default_defer_timeout() -> u32 { 15_u32 } impl Default for Ipv4Dhcp { fn default() -> Self { Self { enabled: true, flags: default_flags(), update: default_v4_update(), hostname: None, create_cid: CreateCid::default(), client_id: None, defer_timeout: default_defer_timeout(), recover_lease: true, release_lease: false, } } } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Ipv6Static { #[serde(rename = "address")] pub addresses: Option>, #[serde(rename = "route")] pub routes: Option>, } #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] #[serde(default)] pub struct Address { pub local: String, pub broadcast: Option, } #[serde_as] #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(default)] pub struct Ipv6Dhcp { pub enabled: bool, pub mode: String, // ignored #[serde(default = "default_flags")] pub flags: String, // ignored #[serde(default = "default_v6_dhcp_update")] pub update: String, // ignored #[serde(rename = "rapid-commit", default = "default_true")] pub rapid_commit: bool, pub hostname: Option, // ignored #[serde(rename = "defer-timeout", default = "default_defer_timeout")] pub defer_timeout: u32, // ignored #[serde(rename = "recover-lease", default = "default_true")] pub recover_lease: bool, // ignored #[serde(rename = "refresh-lease", default)] pub refresh_lease: bool, #[serde(rename = "release-lease", default)] pub release_lease: bool, } fn default_v6_dhcp_update() -> String { "hostname,dns,nis,ntp,tz,boot".to_string() } impl Default for Ipv6Dhcp { fn default() -> Self { Self { enabled: true, mode: String::from("auto"), flags: default_flags(), update: default_v6_dhcp_update(), rapid_commit: true, hostname: None, defer_timeout: default_defer_timeout(), recover_lease: true, refresh_lease: false, release_lease: false, } } } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(default)] pub struct Ipv6Auto { pub enabled: bool, // ignored #[serde(default = "default_v6_dhcp_update")] pub update: String, } fn default_v6_auto_update() -> String { "dns".to_string() } impl Default for Ipv6Auto { fn default() -> Self { Self { enabled: true, update: default_v6_auto_update(), } } } #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct Dummy { pub address: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct Route { pub destination: Option, #[serde(rename = "nexthop")] pub nexthops: Option>, pub priority: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct Ethernet { pub address: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Nexthop { pub gateway: String, } #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] pub struct Control { #[serde(default)] pub mode: ControlMode, // ignored #[serde(rename = "boot-stage")] pub boot_stage: Option, // ignored pub persistent: Option, } #[derive( Debug, PartialEq, Default, SerializeDisplay, DeserializeFromStr, EnumString, Clone, Display, )] #[strum(serialize_all = "snake_case")] pub enum ControlMode { #[default] Manual, Off, Boot, Hotplug, } impl From for bool { fn from(value: ControlMode) -> Self { match value { ControlMode::Manual => false, ControlMode::Off => false, ControlMode::Boot => true, ControlMode::Hotplug => true, } } } #[derive(Default)] pub struct ConnectionResult { pub connections: Vec, pub has_warnings: bool, } #[derive(Default)] pub struct IpConfigResult { ip_config: IpConfig, has_warnings: bool, } impl From<&LinkPort> for model::PortConfig { fn from(port: &LinkPort) -> Self { match port.port_type { LinkPortType::Bridge => model::PortConfig::Bridge(model::BridgePortConfig { priority: port.priority, path_cost: port.path_cost, }), LinkPortType::Bond => model::PortConfig::None, LinkPortType::OvsBridge => model::PortConfig::OvsBridge(model::OvsBridgePortConfig {}), LinkPortType::Team => model::PortConfig::None, } } } impl Interface { fn to_ovs_port_name(&self) -> String { format!("{}-port", self.name) } fn to_ovs_bridge_name(&self) -> String { format!("{}-bridge", self.name) } pub fn to_connection( &self, netconfig_dhcp: &Option, ) -> Result { let settings = MIGRATION_SETTINGS.get().unwrap(); let mut connection_result = ConnectionResult::default(); let ip_config = self.to_ip_config(netconfig_dhcp)?; connection_result.has_warnings |= ip_config.has_warnings; connection_result.has_warnings |= has_unhandled_field(self); let mut connection = model::Connection { id: self.name.clone(), firewall_zone: self.firewall.zone.clone(), interface: Some(self.name.clone()), ip_config: ip_config.ip_config, status: Status::Down, mtu: self.link.mtu.unwrap_or_default(), autoconnect: self.control.mode.clone().into(), ..Default::default() }; if let Some(port) = &self.link.port { connection.port_config = port.into(); if let LinkPortType::OvsBridge = port.port_type { let con_ovs_port = model::Connection { id: self.to_ovs_port_name(), interface: Some(self.to_ovs_port_name()), autoconnect: self.control.mode.clone().into(), config: model::ConnectionConfig::OvsPort(model::OvsPortConfig::default()), ..Default::default() }; connection.controller = Some(con_ovs_port.uuid); connection_result.connections.push(con_ovs_port); } else if let LinkPortType::Team = port.port_type { // Warn about team port options that can't be translated if let Some(queue_id) = port.queue_id { if let Some(master) = self.link.master.as_ref() { log::warn!( "Team port '{}' queue_id={} is not supported in NetworkManager bond configuration. \ To set manually after bond creation: echo \"{}:{}\" > /sys/class/net/{}/bonding/queue_id", self.name, queue_id, self.name, queue_id, master ); } else { log::warn!( "Team port '{}' queue_id={} is not supported in NetworkManager bond configuration.", self.name, queue_id ); } connection_result.has_warnings = true; } if port.lacp_key.is_some() { log::warn!( "Team port '{}' lacp_key option is not supported in bond configuration", self.name ); connection_result.has_warnings = true; } if port.lacp_prio.is_some() { log::warn!( "Team port '{}' lacp_prio option is not supported in kernel 6.12 - requires kernel 6.18+ (actor_port_prio)", self.name ); connection_result.has_warnings = true; } } } if settings.activate_connections { connection.status = if connection.autoconnect { Status::Up } else { Status::Down }; } if let Some(ethernet) = &self.ethernet { connection.custom_mac_address = MacAddress::try_from(ðernet.address)?; connection.config = model::ConnectionConfig::Ethernet; connection_result.connections.push(connection); } else if let Some(dummy) = &self.dummy { connection.custom_mac_address = MacAddress::try_from(&dummy.address)?; connection.config = model::ConnectionConfig::Dummy; connection_result.connections.push(connection); } else if let Some(bond) = &self.bond { connection.custom_mac_address = MacAddress::try_from(&bond.address)?; connection.config = bond.into(); connection_result.connections.push(connection); } else if let Some(team) = &self.team { log::info!( "Converting team interface '{}' to bond - team is no longer supported", self.name ); connection.custom_mac_address = MacAddress::try_from(&team.address)?; let (config, has_warnings) = team.to_connection_config(); connection.config = config; connection_result.has_warnings |= has_warnings; connection_result.connections.push(connection); } else if let Some(vlan) = &self.vlan { connection.custom_mac_address = MacAddress::try_from(&vlan.address)?; connection.config = vlan.into(); connection_result.connections.push(connection); } else if let Some(bridge) = &self.bridge { connection.custom_mac_address = MacAddress::try_from(&bridge.address)?; connection.config = bridge.into(); connection_result.connections.push(connection); } else if let Some(wireless) = &self.wireless { if let Some(networks) = &wireless.networks { if networks.len() > 1 { log::info!("{} has multiple networks defined, these will be split into different connections in NM", connection.id); } for (i, network) in networks.iter().enumerate() { let mut wireless_connection = connection.clone(); if networks.len() > 1 { wireless_connection.id.push_str(&format!("-{i}")); } wireless_connection.config = network.try_into()?; if let Some(wpa_eap) = &network.wpa_eap { wireless_connection.ieee_8021x_config = Some(wpa_eap.try_into()?); } connection_result.connections.push(wireless_connection); } } } else if let Some(infiniband) = &self.infiniband { if infiniband.multicast.is_some() { log::warn!( "Infiniband multicast in {} isn't supported by NetworkManager", self.name ); connection_result.has_warnings = true; } connection.config = infiniband.into(); connection_result.connections.push(connection); } else if let Some(infiniband_child) = &self.infiniband_child { if infiniband_child.multicast.is_some() { log::warn!( "Infiniband multicast in {} isn't supported by NetworkManager", self.name ); connection_result.has_warnings = true; } connection.config = infiniband_child.into(); connection_result.connections.push(connection); } else if let Some(tun) = &self.tun { connection.config = tun.into(); connection_result.connections.push(connection); } else if let Some(tap) = &self.tap { connection.config = tap.into(); connection_result.connections.push(connection); } else if let Some(ovs_bridge) = &self.ovs_bridge { let mut vlan_tag: Option = None; let mut controller_uuid = None; if let Some(vlan) = &ovs_bridge.vlan { vlan_tag = Some(vlan.tag); } else { let con_ovs_bridge = model::Connection { id: self.to_ovs_bridge_name(), interface: Some(self.to_ovs_bridge_name()), autoconnect: self.control.mode.clone().into(), config: model::ConnectionConfig::OvsBridge(model::OvsBridgeConfig::default()), ..Default::default() }; controller_uuid = Some(con_ovs_bridge.uuid); connection_result.connections.push(con_ovs_bridge); } let con_ovs_port = model::Connection { id: self.to_ovs_port_name(), interface: Some(self.to_ovs_port_name()), autoconnect: self.control.mode.clone().into(), config: model::ConnectionConfig::OvsPort(model::OvsPortConfig { tag: vlan_tag }), controller: controller_uuid, ..Default::default() }; connection.config = model::ConnectionConfig::OvsInterface(model::OvsInterfaceConfig { interface_type: model::OvsInterfaceType::Internal, }); connection.controller = Some(con_ovs_port.uuid); connection_result.connections.push(con_ovs_port); connection_result.connections.push(connection); } else { connection_result.connections.push(connection); } Ok(connection_result) } pub fn to_ip_config( &self, netconfig_dhcp: &Option, ) -> Result { let mut ipconfig_result = IpConfigResult::default(); let method4 = if self.ipv4_dhcp.is_some() { Ipv4Method::Auto } else if self.ipv4_static.is_some() { Ipv4Method::Manual } else if !self.ipv4.enabled { Ipv4Method::Disabled } else if self.ipv4_auto.is_some() { Ipv4Method::LinkLocal } else { Ipv4Method::Disabled }; let method6 = if self.ipv6_dhcp.is_some() && self.ipv6_dhcp.as_ref().unwrap().mode == "managed" { Ipv6Method::Dhcp } else if self.ipv6_dhcp.is_some() { Ipv6Method::Auto } else if self.ipv6_static.is_some() { Ipv6Method::Manual } else if !self.ipv6.enabled { Ipv6Method::Disabled } else { Ipv6Method::Auto }; let link_local4 = if let Some(auto4) = &self.ipv4_auto { if auto4.enabled { if let Some(flags) = &auto4.flags { if flags.contains("fallback") { LinkLocal::Fallback } else if flags.contains("primary") { LinkLocal::Enabled } else { LinkLocal::Auto } } else { LinkLocal::Auto } } else { LinkLocal::Disabled } } else { LinkLocal::Default }; let mut addresses: Vec = vec![]; let mut routes4: Vec = vec![]; let mut routes6: Vec = vec![]; if let Some(ipv4_static) = &self.ipv4_static { if let Some(addresses_in) = &ipv4_static.addresses { for addr in addresses_in { let local_addr = match IpInet::from_str(addr.local.as_str()) { Ok(address) => address, Err(e) => { anyhow::bail!( "Failed to parse address \"{}\" for {}: {}", addr.local, self.name, e ) } }; if let Some(broadcast) = &addr.broadcast { let broadcast_addr = match IpAddr::from_str(broadcast) { Ok(address) => address, Err(e) => { anyhow::bail!( "Failed to parse broadcast address \"{}\" for {}: {}", broadcast, self.name, e ) } }; if broadcast_addr != local_addr.last_address() { log::warn!( "Broadcast \"{}\" for {}: Custom broadcast addresses are not supported by NetworkManager", broadcast, self.name ); ipconfig_result.has_warnings = true; } } addresses.push(local_addr); } } if let Some(routes) = &ipv4_static.routes { for route in routes { routes4.push(match route.try_into() { Ok(route) => route, Err(e) => { log::warn!("Failed parsing ipv4 route for {}: {}", self.name, e); ipconfig_result.has_warnings = true; continue; } }); } } } if let Some(ipv6_static) = &self.ipv6_static { if let Some(addresses_in) = &ipv6_static.addresses { for addr in addresses_in { addresses.push(match IpInet::from_str(addr.local.as_str()) { Ok(address) => address, Err(e) => { anyhow::bail!( "Failed to parse address \"{}\" for {}: {}", addr.local, self.name, e ) } }); } } if let Some(routes) = &ipv6_static.routes { for route in routes { routes6.push(match route.try_into() { Ok(route) => route, Err(e) => { log::warn!("Failed parsing ipv6 route for {}: {}", self.name, e); ipconfig_result.has_warnings = true; continue; } }); } } } let mut dhcp4_settings: Dhcp4Settings = Dhcp4Settings::default(); let mut dhcp6_settings: Dhcp6Settings = Dhcp6Settings::default(); let mut never_default4 = Some(false); if let Some(ipv4_dhcp) = &self.ipv4_dhcp { if let Some(hostname) = &ipv4_dhcp.hostname { dhcp4_settings.send_hostname = Some(true); if let Some(netconfig_dhcp) = netconfig_dhcp { if netconfig_dhcp.dhclient_hostname_option != HostnameOption::Auto { dhcp4_settings.hostname = Some(hostname.clone()); } } else { dhcp4_settings.hostname = Some(hostname.clone()); } } else { dhcp4_settings.send_hostname = Some(false); } dhcp4_settings.send_release = Some(ipv4_dhcp.release_lease); dhcp4_settings.client_id = if let Some(client_id) = &ipv4_dhcp.client_id { DhcpClientId::Id(client_id.clone()) } else { match ipv4_dhcp.create_cid { CreateCid::Rfc4361 => DhcpClientId::Ipv6Duid, CreateCid::Rfc2132 => DhcpClientId::Mac, CreateCid::Disable => DhcpClientId::None, } }; dhcp4_settings.iaid = DhcpIaid::Mac; dhcp6_settings.duid = DhcpDuid::Llt; never_default4 = Some(!ipv4_dhcp.update.split(",").any(|x| x == "default-route")); } let dhcp4_settings: Option = Some(dhcp4_settings); if let Some(ipv6_dhcp) = &self.ipv6_dhcp { if let Some(hostname) = &ipv6_dhcp.hostname { dhcp6_settings.send_hostname = Some(true); if let Some(netconfig_dhcp) = netconfig_dhcp { if netconfig_dhcp.dhclient6_hostname_option != HostnameOption::Auto { dhcp6_settings.hostname = Some(hostname.clone()); } } else { dhcp6_settings.hostname = Some(hostname.clone()); } } else { dhcp6_settings.send_hostname = Some(false); } dhcp6_settings.send_release = Some(ipv6_dhcp.release_lease); dhcp6_settings.iaid = DhcpIaid::Mac; dhcp6_settings.duid = DhcpDuid::Llt; } let dhcp6_settings: Option = Some(dhcp6_settings); let mut ip6_privacy: Option = None; if let Some(privacy) = &self.ipv6.privacy { ip6_privacy = Some(privacy.clone() as i32); } ipconfig_result.ip_config = IpConfig { addresses, method4, method6, routes4, routes6, dhcp4_settings, dhcp6_settings, ip6_privacy, link_local4, never_default4, ..Default::default() }; Ok(ipconfig_result) } } impl TryFrom<&Route> for IpRoute { type Error = anyhow::Error; fn try_from(route: &Route) -> Result { let mut next_hop: Option = None; if let Some(nexthops) = &route.nexthops { if nexthops.len() > 1 { return Err(anyhow::anyhow!( "Multipath routing isn't natively supported by NetworkManager" )); } else { next_hop = Some(IpAddr::from_str(&nexthops[0].gateway)?); } } let destination = if let Some(destination) = &route.destination { IpInet::from_str(destination)? } else if let Some(next_hop) = next_hop { // default route let default_ip = if next_hop.is_ipv4() { IpAddr::from_str("0.0.0.0")? } else { IpAddr::from_str("::")? }; IpInet::new(default_ip, 0)? } else { return Err(anyhow::anyhow!( "Route contains neither destination nor next-hop" )); }; let metric = route.priority; Ok(IpRoute { destination, next_hop, metric, }) } } pub fn check_extra_flags(flags_a: &str, flags_b: &str, diff_flags: &str) -> bool { let flags_a: HashSet<&str> = flags_a .split(',') .map(|s| s.trim()) .filter(|s| !s.is_empty()) .collect(); let flags_b: HashSet<&str> = flags_b .split(',') .map(|s| s.trim()) .filter(|s| !s.is_empty()) .collect(); let diff_flags: HashSet<&str> = diff_flags .split(',') .map(|s| s.trim()) .filter(|s| !s.is_empty()) .collect(); let calculated_diff: HashSet<&str> = flags_a.symmetric_difference(&flags_b).copied().collect(); calculated_diff == diff_flags } fn check_dhcp_update(update: &str, default_update: &str, interface_name: &str, dhcp_type: &str) { let default_set: HashSet<&str> = default_update .split(',') .map(|s| s.trim()) .filter(|s| !s.is_empty() && *s != "default-route") .collect(); let update_set: HashSet<&str> = update .split(',') .map(|s| s.trim()) .filter(|s| !s.is_empty() && *s != "default-route") .collect(); for missing in default_set.difference(&update_set) { log::info!( "{} in interface {} is missing default entry: {}", dhcp_type, interface_name, missing ); } for added in update_set.difference(&default_set) { log::info!( "{} in interface {} has extra entry: {}", dhcp_type, interface_name, added ); } } fn has_unhandled_field(interface: &Interface) -> bool { let mut warnings = false; let ipv4 = &interface.ipv4; let ipv4_default = Ipv4::default(); if ipv4.arp_verify != ipv4_default.arp_verify { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv4.arp_verify) ); warnings = true; } let ipv6 = &interface.ipv6; let ipv6_default = Ipv6::default(); if ipv6.accept_redirects != ipv6_default.accept_redirects { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6.accept_redirects) ); warnings = true; } if let Some(ipv4_dhcp) = &interface.ipv4_dhcp { let ipv4_dhcp_default = Ipv4Dhcp::default(); if ipv4_dhcp.flags != ipv4_dhcp_default.flags && !(check_extra_flags( ipv4_dhcp.flags.as_str(), ipv4_dhcp_default.flags.as_str(), "primary", ) && interface.ipv4_auto.is_some()) { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv4_dhcp.flags) ); warnings = true; } check_dhcp_update( &ipv4_dhcp.update, &ipv4_dhcp_default.update, &interface.name, "ipv4_dhcp.update", ); if ipv4_dhcp.defer_timeout != ipv4_dhcp_default.defer_timeout { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv4_dhcp.defer_timeout) ); warnings = true; } if ipv4_dhcp.recover_lease != ipv4_dhcp_default.recover_lease { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv4_dhcp.recover_lease) ); warnings = true; } } if let Some(ipv6_dhcp) = &interface.ipv6_dhcp { let ipv6_dhcp_default = Ipv6Dhcp::default(); if ipv6_dhcp.flags != ipv6_dhcp_default.flags { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6_dhcp.flags) ); warnings = true; } check_dhcp_update( &ipv6_dhcp.update, &ipv6_dhcp_default.update, &interface.name, "ipv6_dhcp.update", ); if ipv6_dhcp.rapid_commit != ipv6_dhcp_default.rapid_commit { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6_dhcp.rapid_commit) ); warnings = true; } if ipv6_dhcp.defer_timeout != ipv6_dhcp_default.defer_timeout { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6_dhcp.defer_timeout) ); warnings = true; } if ipv6_dhcp.recover_lease != ipv6_dhcp_default.recover_lease { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6_dhcp.recover_lease) ); warnings = true; } if ipv6_dhcp.refresh_lease != ipv6_dhcp_default.refresh_lease { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6_dhcp.refresh_lease) ); warnings = true; } } if let Some(ipv6_auto) = &interface.ipv6_auto { let ipv6_auto_default = Ipv6Auto::default(); if ipv6_auto.update != ipv6_auto_default.update { log::warn!( "Unhandled field in interface {}: {}", interface.name, stringify!(ipv6_auto.update) ); warnings = true; } } warnings } #[cfg(test)] mod tests { use super::*; use log::Level; #[allow(dead_code)] fn setup_default_migration_settings() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); } #[test] fn test_static_interface_to_connection() { setup_default_migration_settings(); let static_interface = Interface { ipv4: Ipv4::default(), ipv4_static: Some(Ipv4Static { addresses: Some(vec![Address { local: "127.0.0.1/8".to_string(), ..Default::default() }]), routes: Some(vec![Route { nexthops: Some(vec![Nexthop { gateway: "127.0.0.1".to_string(), }]), ..Default::default() }]), }), ipv6: Ipv6::default(), ipv6_static: Some(Ipv6Static { addresses: Some(vec![Address { local: "::1/128".to_string(), ..Default::default() }]), routes: Some(vec![Route { nexthops: Some(vec![Nexthop { gateway: "::1".to_string(), }]), ..Default::default() }]), }), ..Default::default() }; let static_connection: model::Connection = static_interface.to_connection(&None).unwrap().connections[0].to_owned(); assert_eq!(static_connection.ip_config.method4, Ipv4Method::Manual); assert_eq!( static_connection.ip_config.addresses[0].to_string(), "127.0.0.1/8" ); assert_eq!(static_connection.ip_config.method6, Ipv6Method::Manual); assert_eq!(static_connection.ip_config.addresses[1].to_string(), "::1"); assert_eq!( static_connection.ip_config.addresses[1] .network_length() .to_string(), "128" ); assert!(static_connection.ip_config.routes4.len() == 1); assert_eq!( static_connection.ip_config.routes4[0] .destination .to_string(), "0.0.0.0/0" ); assert_eq!( static_connection.ip_config.routes4[0] .next_hop .unwrap() .to_string(), "127.0.0.1" ); assert!(static_connection.ip_config.routes6.len() == 1); assert_eq!( static_connection.ip_config.routes6[0] .destination .to_string(), "::/0" ); assert_eq!( static_connection.ip_config.routes6[0] .next_hop .unwrap() .to_string(), "::1" ); } #[test] fn test_dhcp_interface_to_connection() { setup_default_migration_settings(); let dhcp_interface = Interface { ipv4_dhcp: Some(Ipv4Dhcp { enabled: true, ..Default::default() }), ..Default::default() }; let dhcp_connection: model::Connection = dhcp_interface.to_connection(&None).unwrap().connections[0].to_owned(); assert_eq!(dhcp_connection.ip_config.method4, Ipv4Method::Auto); assert_eq!(dhcp_connection.ip_config.method6, Ipv6Method::Auto); assert_eq!(dhcp_connection.ip_config.addresses.len(), 0); assert_eq!( dhcp_connection .ip_config .dhcp4_settings .as_ref() .unwrap() .client_id, DhcpClientId::Ipv6Duid ); } #[test] fn test_dhcp_create_cid() { setup_default_migration_settings(); let tests = vec![ (CreateCid::Rfc4361, None, DhcpClientId::Ipv6Duid), (CreateCid::Rfc2132, None, DhcpClientId::Mac), (CreateCid::Disable, None, DhcpClientId::None), ( CreateCid::Rfc4361, Some("52:54:00:dc:8e:94".to_string()), DhcpClientId::Id("52:54:00:dc:8e:94".to_string()), ), ]; for (create_cid, client_id, expected_client_id) in tests { let dhcp_interface = Interface { ipv4_dhcp: Some(Ipv4Dhcp { enabled: true, create_cid, client_id, ..Default::default() }), ..Default::default() }; let dhcp_connection: model::Connection = dhcp_interface.to_connection(&None).unwrap().connections[0].to_owned(); assert_eq!( dhcp_connection .ip_config .dhcp4_settings .as_ref() .unwrap() .client_id, expected_client_id ); } } #[test] fn test_dummy_interface_to_connection() { setup_default_migration_settings(); let dummy_interface = Interface { dummy: Some(Dummy { address: Some("12:34:56:78:9A:BC".to_string()), }), ..Default::default() }; let connection: &model::Connection = &dummy_interface.to_connection(&None).unwrap().connections[0]; assert!(matches!(connection.config, model::ConnectionConfig::Dummy)); assert_eq!( connection.custom_mac_address.to_string(), "12:34:56:78:9A:BC" ); let dummy_interface = Interface { dummy: Some(Dummy { ..Default::default() }), ..Default::default() }; let connection: &model::Connection = &dummy_interface.to_connection(&None).unwrap().connections[0]; assert!(matches!(connection.config, model::ConnectionConfig::Dummy)); assert_eq!(dummy_interface.dummy.unwrap().address, None); assert!(matches!(connection.custom_mac_address, MacAddress::Unset)); } #[test] fn test_team_interface_address_to_connection() { setup_default_migration_settings(); let team_interface = Interface { team: Some(crate::team::Team { address: Some("AA:BB:CC:DD:EE:FF".to_string()), ..Default::default() }), ..Default::default() }; let connection: &model::Connection = &team_interface.to_connection(&None).unwrap().connections[0]; assert!(matches!( connection.config, model::ConnectionConfig::Bond(_) )); assert_eq!( connection.custom_mac_address.to_string(), "AA:BB:CC:DD:EE:FF" ); // Test team without address let team_interface = Interface { team: Some(crate::team::Team { address: None, ..Default::default() }), ..Default::default() }; let connection: &model::Connection = &team_interface.to_connection(&None).unwrap().connections[0]; assert!(matches!( connection.config, model::ConnectionConfig::Bond(_) )); assert!(matches!(connection.custom_mac_address, MacAddress::Unset)); } #[test] fn test_firewall_zone_to_connection() { setup_default_migration_settings(); let ifc = Interface { firewall: Firewall { zone: Some("topsecret".to_string()), }, ..Default::default() }; let con: model::Connection = ifc.to_connection(&None).unwrap().connections[0].to_owned(); assert_eq!(con.firewall_zone, Some("topsecret".to_string())); } #[test] fn test_startmode_to_connection() { setup_default_migration_settings(); let mut ifc = Interface::default(); let con: model::Connection = ifc.to_connection(&None).unwrap().connections[0].to_owned(); assert!(!con.autoconnect); ifc.control.mode = ControlMode::Boot; let con: model::Connection = ifc.to_connection(&None).unwrap().connections[0].to_owned(); assert!(con.autoconnect); } #[test] fn test_ignored_default() { let ifc = Interface::default(); assert!(!has_unhandled_field(&ifc)); testing_logger::setup(); let ifc = Interface { ipv4_dhcp: Some(Ipv4Dhcp { flags: String::from("123"), update: String::from("456"), defer_timeout: 0, recover_lease: false, ..Default::default() }), ipv6_dhcp: Some(Ipv6Dhcp { flags: String::from("123"), update: String::from("456"), rapid_commit: false, defer_timeout: 0, recover_lease: false, refresh_lease: true, ..Default::default() }), ipv6_auto: Some(Ipv6Auto { update: String::from("123"), ..Default::default() }), ..Default::default() }; assert!(has_unhandled_field(&ifc)); testing_logger::validate(|captured_logs| { captured_logs .iter() .for_each(|f| println!("[{}] {}", f.level, f.body)); assert_eq!( captured_logs .iter() .filter(|l| l.level == Level::Warn) .count(), 9 ); assert_eq!( captured_logs .iter() .filter(|l| l.level == Level::Info) .count(), 16 ); }); } #[test] fn test_check_extra_flags() { assert!(check_extra_flags("A, B,C ", " C,D ,E", "A,B,D,E")); assert!(!check_extra_flags("A, B,C ", " C,D ,E", "A,B,D,E,X")); assert!(check_extra_flags("A,B,C", "C,B,A", "")); assert!(check_extra_flags("A,B,C", "C,B,A,E", "E")); } #[test] fn test_autoip() { setup_default_migration_settings(); testing_logger::setup(); let ifc = Interface { ipv4_dhcp: Some(Ipv4Dhcp { flags: String::from("primary,group"), update: String::from("default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot"), ..Default::default() }), ipv4_auto: Some(Ipv4Auto { enabled: true, flags: Some("fallback".to_string()), }), ..Default::default() }; let conn_res = ifc.to_connection(&None).unwrap(); let connection = &conn_res.connections[0]; testing_logger::validate(|captured_logs| { captured_logs .iter() .for_each(|f| println!("[{}] {}", f.level, f.body)); assert_eq!( captured_logs .iter() .filter(|l| l.level == Level::Warn) .count(), 0 ); assert_eq!( captured_logs .iter() .filter(|l| l.level == Level::Info) .count(), 0 ); }); assert!(connection.ip_config.link_local4 == LinkLocal::Fallback); assert!(!conn_res.has_warnings); let ifc = Interface { ipv4_auto: Some(Ipv4Auto { enabled: true, flags: Some("".to_string()), }), ..Default::default() }; let conn_res = ifc.to_connection(&None).unwrap(); let connection = &conn_res.connections[0]; assert!(connection.ip_config.method4 == Ipv4Method::LinkLocal); assert!(connection.ip_config.link_local4 == LinkLocal::Auto); assert!(!conn_res.has_warnings); let ifc = Interface { ipv4_auto: Some(Ipv4Auto { enabled: true, flags: None, }), ..Default::default() }; let conn_res = ifc.to_connection(&None).unwrap(); let connection = &conn_res.connections[0]; assert!(connection.ip_config.method4 == Ipv4Method::LinkLocal); assert!(connection.ip_config.link_local4 == LinkLocal::Auto); assert!(!conn_res.has_warnings); let ifc = Interface { ipv4_auto: Some(Ipv4Auto { enabled: true, flags: Some("primary".to_string()), }), ..Default::default() }; let conn_res = ifc.to_connection(&None).unwrap(); let connection = &conn_res.connections[0]; assert!(connection.ip_config.method4 == Ipv4Method::LinkLocal); assert!(connection.ip_config.link_local4 == LinkLocal::Enabled); assert!(!conn_res.has_warnings); } #[test] fn test_broadcast() { let ifc = Interface { ipv4_static: Some(Ipv4Static { addresses: Some(vec![Address { local: "192.168.100.10/24".to_string(), broadcast: Some("192.168.100.255".to_string()), }]), routes: None, }), ..Default::default() }; let ip_result = ifc.to_ip_config(&None).unwrap(); assert!(!ip_result.has_warnings); let ifc = Interface { ipv4_static: Some(Ipv4Static { addresses: Some(vec![Address { local: "192.168.100.10/24".to_string(), broadcast: Some("192.168.100.254".to_string()), }]), routes: None, }), ..Default::default() }; let ip_result = ifc.to_ip_config(&None).unwrap(); assert!(ip_result.has_warnings); } #[test] fn test_team_port_queue_id_warning() { setup_default_migration_settings(); testing_logger::setup(); let ifc = Interface { name: "eth1".to_string(), control: Control { mode: ControlMode::Hotplug, ..Default::default() }, link: Link { master: Some("team0".to_string()), port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: Some(2), prio: None, sticky: false, lacp_key: None, lacp_prio: None, }), ..Default::default() }, ethernet: Some(Ethernet::default()), ..Default::default() }; let conn_res = ifc.to_connection(&None).unwrap(); assert!(conn_res.has_warnings); testing_logger::validate(|captured_logs| { let warnings: Vec<_> = captured_logs .iter() .filter(|l| l.level == Level::Warn) .collect(); assert_eq!(warnings.len(), 1); assert!(warnings[0] .body .contains("echo \"eth1:2\" > /sys/class/net/team0/bonding/queue_id")); }); } } 07070100000009000081A40000000000000000000000016A032DB6000025CB000000000000000000000000000000000000001C00000000wicked2nm-1.5.0/src/main.rsmod bond; mod bridge; mod infiniband; mod interface; mod migrate; mod netconfig; mod netconfig_dhcp; mod ovs; mod reader; mod team; mod tuntap; mod vlan; mod wireless; use clap::builder::TypedValueParser; use clap::{Args, Parser, Subcommand}; use log::*; use migrate::{apply_networkstate, to_networkstate}; use reader::read as wicked_read; use serde::Serialize; use simplelog::ConfigBuilder; use std::path::PathBuf; use std::process::{ExitCode, Termination}; use thiserror::Error; use tokio::sync::OnceCell; use crate::interface::Interface; use crate::netconfig::Netconfig; #[derive(Parser, Clone, Debug)] #[command(name = "wicked2nm", version, about, long_about = None)] struct Cli { #[clap(flatten)] global_opts: GlobalOpts, #[command(subcommand)] pub command: Commands, } #[derive(Debug, Args, Clone)] struct GlobalOpts { #[arg(long, global = true, default_value_t = LevelFilter::Info, value_parser = clap::builder::PossibleValuesParser::new(["TRACE", "DEBUG", "INFO", "WARN", "ERROR"]).map(|s| s.parse::().unwrap()),)] pub log_level: LevelFilter, #[arg(long, global = true, env = "W2NM_WITHOUT_NETCONFIG")] pub without_netconfig: bool, /// Base directory for ifcfg, ifsysctl and netconfig configuration files. #[arg( long, global = true, default_value = "/etc/sysconfig/network/", env = "W2NM_NETCONFIG_BASE_DIR" )] pub netconfig_base_dir: PathBuf, /// Specify the path to the netconfig config file. /// If not set, defaults to $W2NM_NETCONFIG_BASE_DIR/config #[arg(long, global = true, env = "W2NM_NETCONFIG_PATH")] pub netconfig_path: Option, /// Specify the path to the netconfig dhcp config file. /// If not set, defaults to $W2NM_NETCONFIG_BASE_DIR/dhcp #[arg(long, global = true, env = "W2NM_NETCONFIG_DHCP_PATH")] pub netconfig_dhcp_path: Option, /// Disable user hints. #[arg(long, global = true, env = "W2NM_DISABLE_HINTS")] pub disable_hints: bool, } #[derive(Subcommand, Clone, Debug)] pub enum Commands { /// Shows the current xml wicked configuration Show { /// Format output #[arg(value_enum, short, long, default_value_t = Format::Json)] format: Format, /// Wicked XML files or directories where the wicked xml configs are located. /// Can also be "-" to read from stdin #[arg(required = true)] paths: Vec, }, /// Migrate wicked state at path Migrate { /// Wicked XML files or directories where the wicked xml configs are located. /// Can also be "-" to read from stdin #[arg(required = true)] paths: Vec, /// Continue migration if warnings are encountered #[arg(short, long, global = true, env = "W2NM_CONTINUE_MIGRATION")] continue_migration: bool, /// Run migration without sending connections to NetworkManager (can be run without NetworkManager installed) #[arg(long, global = true, env = "W2NM_DRY_RUN")] dry_run: bool, /// Activate connections that are marked as autostart immediately #[arg(long, global = true, env = "W2NM_ACTIVATE_CONNECTIONS")] activate_connections: bool, }, } /// Supported output formats #[derive(clap::ValueEnum, Clone, Debug)] pub enum Format { Json, PrettyJson, Yaml, Xml, Text, } #[derive(Error, Debug)] pub enum MigrationError { #[error("Migration failed because of warnings")] Warnings, #[error("Show failed: {0}")] ShowError(anyhow::Error), #[error("Migration failed: {0}")] MigrationError(anyhow::Error), } async fn run_command(cli: Cli) -> Result<(), MigrationError> { let mut migration_settings = MigrationSettings { continue_migration: true, activate_connections: true, with_netconfig: !cli.global_opts.without_netconfig, netconfig_path: cli .global_opts .netconfig_path .unwrap_or_else(|| cli.global_opts.netconfig_base_dir.join("config")), netconfig_dhcp_path: cli .global_opts .netconfig_dhcp_path .unwrap_or_else(|| cli.global_opts.netconfig_base_dir.join("dhcp")), netconfig_base_dir: cli.global_opts.netconfig_base_dir, }; match cli.command { Commands::Show { paths, format } => { MIGRATION_SETTINGS .set(migration_settings) .expect("MIGRATION_SETTINGS was set too early"); show_command(paths, format).map_err(MigrationError::ShowError) } Commands::Migrate { paths, continue_migration, dry_run, activate_connections, } => { migration_settings.continue_migration = continue_migration; migration_settings.activate_connections = activate_connections; MIGRATION_SETTINGS .set(migration_settings) .expect("MIGRATION_SETTINGS was set too early"); log::debug!( "Running migration with MigrationSettings: {:#?}", MIGRATION_SETTINGS.get().unwrap() ); let interfaces_result = wicked_read(paths).map_err(MigrationError::MigrationError)?; let mut network_state_result = to_networkstate(&interfaces_result).map_err(MigrationError::MigrationError)?; if !continue_migration && network_state_result.has_warnings { return Err(MigrationError::Warnings); } if dry_run { for connection in network_state_result.network_state.connections { log::debug!("{connection:#?}"); } return Ok(()); } match apply_networkstate( &mut network_state_result.network_state, interfaces_result.netconfig, ) .await { Ok(()) => Ok(()), Err(e) => Err(MigrationError::MigrationError(e)), } } } } fn show_command(paths: Vec, format: Format) -> anyhow::Result<()> { let interfaces_result = wicked_read(paths)?; #[derive(Debug, Serialize)] struct WickedConfig { interface: Vec, netconfig: Option, } let show_output = WickedConfig { interface: interfaces_result.interfaces, netconfig: interfaces_result.netconfig, }; let output = match format { Format::Json => serde_json::to_string(&show_output)?, Format::PrettyJson => serde_json::to_string_pretty(&show_output)?, Format::Yaml => serde_yaml::to_string(&show_output)?, Format::Xml => quick_xml::se::to_string_with_root("wicked-config", &show_output)?, Format::Text => format!("{show_output:?}"), }; println!("{output}"); Ok(()) } /// Represents the result of execution. pub enum CliResult { /// Successful execution. Ok = 0, /// Something went wrong. Error = 1, /// Failed due to warnings. Warnings = 3, } impl Termination for CliResult { fn report(self) -> ExitCode { ExitCode::from(self as u8) } } #[derive(Debug)] struct MigrationSettings { continue_migration: bool, activate_connections: bool, with_netconfig: bool, netconfig_base_dir: PathBuf, netconfig_path: PathBuf, netconfig_dhcp_path: PathBuf, } impl Default for MigrationSettings { fn default() -> Self { MigrationSettings { continue_migration: false, activate_connections: true, with_netconfig: false, netconfig_base_dir: PathBuf::default(), netconfig_path: PathBuf::default(), netconfig_dhcp_path: PathBuf::default(), } } } static MIGRATION_SETTINGS: OnceCell = OnceCell::const_new(); #[tokio::main] async fn main() -> CliResult { let cli = Cli::parse(); let config = ConfigBuilder::new() .set_time_level(LevelFilter::Off) .add_filter_allow("wicked2nm".to_string()) .build(); simplelog::TermLogger::init( cli.global_opts.log_level, config, simplelog::TerminalMode::Stderr, simplelog::ColorChoice::Auto, ) .unwrap(); if let Err(error) = run_command(cli.clone()).await { log::error!("{error}"); match error { MigrationError::Warnings => { if !cli.global_opts.disable_hints { log::info!("Use the `--continue-migration` flag to ignore warnings"); } return CliResult::Warnings; } _ => { return CliResult::Error; } } } CliResult::Ok } #[cfg(test)] mod tests { use super::*; use clap::error::ErrorKind; #[test] fn test_show_without_paths_fails() { let result = Cli::try_parse_from(&["wicked2nm", "show"]); assert!(result.is_err()); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument ); } #[test] fn test_migrate_without_paths_fails() { let result = Cli::try_parse_from(&["wicked2nm", "migrate"]); assert!(result.is_err()); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument ); } #[test] fn test_show_with_paths_passes() { let result = Cli::try_parse_from(&["wicked2nm", "show", "some_file.xml"]); assert!(result.is_ok()); } } 0707010000000A000081A40000000000000000000000016A032DB60000C80B000000000000000000000000000000000000001F00000000wicked2nm-1.5.0/src/migrate.rsuse crate::interface::{ConnectionResult, Link, LinkPort, LinkPortType}; use crate::netconfig::{apply_dns_policy, Netconfig}; use crate::reader::InterfacesResult; use crate::MIGRATION_SETTINGS; use agama_network::model::{Connection, ConnectionConfig, MatchConfig, StateConfig}; use agama_network::types::{IpConfig, Ipv4Method, Ipv6Method}; use agama_network::{model, Adapter, NetworkManagerAdapter, NetworkState}; use cidr::IpInet; use nix::ifaddrs::getifaddrs; use std::collections::HashMap; use std::collections::HashSet; use std::fmt; use std::str::FromStr; use uuid::Uuid; #[derive(Debug)] struct ParentMatch { uuid: Uuid, tag: Option, } impl From for ParentMatch { fn from(value: Uuid) -> Self { ParentMatch { uuid: value, tag: None, } } } impl fmt::Display for ParentMatch { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.tag { Some(tag_value) => write!(f, "{}(tag: {tag_value})", self.uuid), None => write!(f, "{}", self.uuid), } } } fn get_parentmatch_ovsbridge( parent_connection: &Connection, connections: &[Connection], ) -> Option { let bridge_port = connections .iter() .find(|c| Some(c.uuid) == parent_connection.controller)?; let ConnectionConfig::OvsPort(config) = &bridge_port.config else { return None; }; let bridge = connections .iter() .find(|c| Some(c.uuid) == bridge_port.controller)?; Some(ParentMatch { uuid: bridge.uuid, tag: config.tag, }) } fn update_parent_connection( cresult: &mut ConnectionResult, parents: &mut HashMap, ) -> Result<(), anyhow::Error> { let mut parent_uuids: HashMap = HashMap::new(); for (port_uuid, parent) in parents.iter() { let Some(parent_con) = cresult .connections .iter() .find(|c| c.interface == parent.master) else { log::warn!( "Missing parent connection with interface {} for port {port_uuid}", parent.clone().master.unwrap() ); cresult.has_warnings = true; continue; }; let Some(port) = &parent.port else { continue; }; if let Some(parent_match) = match port.port_type { LinkPortType::OvsBridge => get_parentmatch_ovsbridge(parent_con, &cresult.connections), _ => Some(ParentMatch::from(parent_con.uuid)), } { parent_uuids.insert(*port_uuid, parent_match); } } for (port_uuid, parent_match) in parent_uuids { let Some(connection) = cresult.connections.iter_mut().find(|c| c.uuid == port_uuid) else { anyhow::bail!( "Unexpected failure - missing port connection {port_uuid} from parent {parent_match}" ); }; connection.controller = Some(parent_match.uuid); if let Some(vlan_tag) = parent_match.tag { if let ConnectionConfig::OvsPort(config) = &mut connection.config { config.tag = Some(vlan_tag); } } parents.remove(&port_uuid); } Ok(()) } struct TeamPortOptions { name: String, prio: Option, sticky: bool, } fn apply_team_port_options_to_bond( connections: &mut [Connection], original_parents: &HashMap, ) -> bool { let mut has_warnings = false; // Build a map of bond UUID -> list of team port options let mut bond_ports: HashMap> = HashMap::new(); for connection in connections.iter() { let Some(controller_uuid) = connection.controller else { continue; }; // Check if this port has team port options let Some(link) = original_parents.get(&connection.uuid) else { continue; }; let Some(port) = &link.port else { continue; }; if port.port_type == LinkPortType::Team { let port_name = connection .interface .as_ref() .unwrap_or(&connection.id) .clone(); bond_ports .entry(controller_uuid) .or_default() .push(TeamPortOptions { name: port_name, prio: port.prio, sticky: port.sticky, }); } } // Now update bond options based on collected port info for connection in connections.iter_mut() { let ConnectionConfig::Bond(bond_config) = &mut connection.config else { continue; }; let Some(ports) = bond_ports.get(&connection.uuid) else { continue; }; let ports_with_prio: Vec<&TeamPortOptions> = ports.iter().filter(|p| p.prio.is_some()).collect(); let sticky_ports: Vec<&TeamPortOptions> = ports.iter().filter(|p| p.sticky).collect(); // If no port has prio there is nothing to do but // warn about sticky ports if ports_with_prio.is_empty() { for sticky_port in sticky_ports { log::warn!( "Team port '{}' is marked as sticky. Bond requires a primary port (with prio set) to use sticky behavior.", sticky_port.name ); has_warnings = true; } continue; } let max_prio = ports_with_prio .iter() .map(|p| p.prio.unwrap()) .max() .unwrap(); let ports_with_max_prio: Vec<&TeamPortOptions> = ports_with_prio .iter() .filter(|p| p.prio.unwrap() == max_prio) .copied() .collect(); // Multiple ports with same highest priority - ambiguous if ports_with_max_prio.len() > 1 { let names: Vec<&str> = ports_with_max_prio .iter() .map(|p| p.name.as_str()) .collect(); log::warn!( "Team has multiple ports {:?} with the same highest prio={}. Bond requires a single primary port, not setting primary.", names, max_prio ); has_warnings = true; continue; } let port = ports_with_max_prio[0]; bond_config .options .0 .insert(String::from("primary"), port.name.clone()); if port.sticky { bond_config .options .0 .insert(String::from("primary_reselect"), String::from("failure")); } // Check if mapping is perfect (only 2 different priority values) let unique_prios: std::collections::HashSet = ports_with_prio.iter().map(|p| p.prio.unwrap()).collect(); if unique_prios.len() > 2 { log::warn!( "Team has {} different priority levels, but bond only supports primary vs backup (2 levels). Port '{}' with prio={} set as bond primary.", unique_prios.len(), port.name, port.prio.unwrap() ); has_warnings = true; } else { log::info!( "Team port '{}' with highest prio={} mapped to bond primary", port.name, port.prio.unwrap() ); } // Warn if other ports are sticky (bond doesn't support per-port sticky) for sticky_port in &sticky_ports { if sticky_port.name != port.name { log::warn!("Team port '{}' is marked as sticky. Bonding only allows the primary port to be sticky.", sticky_port.name); has_warnings = true; } } } has_warnings } fn create_lo_connection() -> Connection { Connection { id: "lo".to_string(), ip_config: IpConfig { method4: Ipv4Method::Manual, method6: Ipv6Method::Manual, addresses: vec![ IpInet::from_str("127.0.0.1/8").unwrap(), IpInet::from_str("::1/128").unwrap(), ], ..Default::default() }, interface: Some("lo".to_string()), match_config: MatchConfig::default(), config: model::ConnectionConfig::Loopback, ..Default::default() } } #[derive(Default)] pub struct NetworkStateResult { pub network_state: NetworkState, pub has_warnings: bool, } pub fn to_networkstate( interface_result: &InterfacesResult, ) -> Result { let settings = MIGRATION_SETTINGS.get().unwrap(); let mut parents: HashMap = HashMap::new(); let mut connection_result: ConnectionResult = ConnectionResult { has_warnings: interface_result.has_warnings, ..Default::default() }; for interface in &interface_result.interfaces { let ifc_connection_result = interface.to_connection(&interface_result.netconfig_dhcp)?; connection_result.has_warnings |= ifc_connection_result.has_warnings; for connection in ifc_connection_result.connections { if connection.controller.is_none() { if interface.link.master.is_some() { parents.insert(connection.uuid, interface.link.clone()); } else if let Some(ovs_bridge) = &interface.ovs_bridge { // This "if let" handles the special port handling of ovs-bridge // which is NOT defined via the `` field but inside the // `` tag like (aka "fake bridge", see man 5 ifcfg-ovs-bridge): // // // // ovsbrA // 10 // // // // The `vlan tag` is set in the corresponding ovs-port and needs to // be inherited to the ports of this "fake bridge" (see: // update_parent_connection() ) // if let Some(vlan) = &ovs_bridge.vlan { let link = Link { master: Some(vlan.parent.clone()), port: Some(LinkPort { port_type: LinkPortType::OvsBridge, priority: None, path_cost: None, queue_id: None, prio: None, sticky: false, lacp_key: None, lacp_prio: None, }), ..Default::default() }; parents.insert(connection.uuid, link); } } } connection_result.connections.push(connection); } } // Store original parents before they get consumed by update_parent_connection loop let original_parents = parents.clone(); loop { // This loop is needed, as we need to map the "ovs-port" of a "fake bridge" // to the "ovs-bridge" first. And then link all "ovs-ports" from the fakebridge // to the same "ovs-bridge". // let len = parents.len(); update_parent_connection(&mut connection_result, &mut parents)?; if parents.is_empty() { break; } if len == parents.len() { let connections = connection_result .connections .iter() .filter(|c| parents.contains_key(&c.uuid)) .map(|c| c.id.as_str()) .collect::>() .join("\n"); anyhow::bail!("Unexpected error, port connection is missing controller: {connections}"); } } // Apply team port options (prio, sticky) to bond configuration connection_result.has_warnings |= apply_team_port_options_to_bond(&mut connection_result.connections, &original_parents); if settings.activate_connections { let system_interfaces = list_system_interfaces()?; for con in &mut connection_result.connections { let interface_name = match &con.config { ConnectionConfig::Dummy => continue, ConnectionConfig::Bond(_) => continue, ConnectionConfig::Loopback => continue, ConnectionConfig::Vlan(_) => continue, ConnectionConfig::Bridge(_) => continue, ConnectionConfig::Tun(_) => continue, ConnectionConfig::OvsBridge(_) => continue, ConnectionConfig::OvsPort(_) => continue, ConnectionConfig::OvsInterface(_) => continue, ConnectionConfig::Ethernet => con.interface.as_ref().unwrap_or(&con.id), ConnectionConfig::Wireless(_) => con.interface.as_ref().unwrap_or(&con.id), ConnectionConfig::Infiniband(config) => { if let Some(parent) = &config.parent { parent } else { continue; } } }; if con.autoconnect && !system_interfaces.contains(interface_name) { con.status = agama_network::types::Status::Down; } } } let mut state_result = NetworkStateResult { has_warnings: connection_result.has_warnings, ..Default::default() }; for connection in &connection_result.connections { state_result .network_state .add_connection(connection.clone())?; } Ok(state_result) } pub async fn apply_networkstate( state: &mut NetworkState, netconfig: Option, ) -> Result<(), anyhow::Error> { let nm = NetworkManagerAdapter::from_system().await?; if let Some(netconfig) = netconfig { let current_state = nm.read(StateConfig::default()).await?; let mut loopback = match current_state.get_connection("lo") { Some(lo) => lo.clone(), None => create_lo_connection(), }; loopback.ip_config.nameservers = netconfig.static_dns_servers.clone(); if let Some(static_dns_searchlist) = &netconfig.static_dns_searchlist { loopback.ip_config.dns_searchlist = static_dns_searchlist.clone(); } state.add_connection(loopback)?; apply_dns_policy(&netconfig, state)?; // When a connection didn't get a dns priority it means it wasn't matched by the netconfig policy, // so ignore-auto-dns should be set to true. for con in state.connections.iter_mut() { if con.id != "lo" && con.ip_config.dns_priority4.is_none() && con.ip_config.dns_priority6.is_none() { con.ip_config.ignore_auto_dns = true; } } } nm.write(state).await?; Ok(()) } fn list_system_interfaces() -> Result, anyhow::Error> { let mut interface_names = HashSet::new(); for ifaddr in getifaddrs()? { interface_names.insert(ifaddr.interface_name); } Ok(interface_names) } #[cfg(test)] mod tests { use super::*; use crate::bond::{Bond as WickedBond, WickedBondMode}; use crate::interface::{Interface, Link, LinkPort, LinkPortType}; use crate::ovs::OvsBridge; use crate::reader::InterfacesResult; use crate::team::{Runner, RunnerName, Team as WickedTeam}; use log::Level; #[test] fn test_apply_team_port_options_prio_to_primary() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with lower priority Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(10), sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) with higher priority Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Higher priority sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { assert_eq!(bond.options.0.get("primary").unwrap(), "eth1"); } else { panic!("Expected bond config"); } } #[test] fn test_apply_team_port_options_sticky_to_primary_reselect() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with highest priority and sticky Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Highest prio and sticky sticky: true, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) with lower priority Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(50), // Lower prio, not sticky sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); assert!(!result.has_warnings); // No warnings - perfect mapping let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { assert_eq!(bond.options.0.get("primary").unwrap(), "eth0"); assert_eq!(bond.options.0.get("primary_reselect").unwrap(), "failure"); } else { panic!("Expected bond config"); } } #[test] fn test_apply_team_port_options_multiple_prio_warns() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with low priority Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(10), sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) with medium priority Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(50), sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 3 (eth2) with highest priority Interface { name: "eth2".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); assert!(result.has_warnings); let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { assert_eq!(bond.options.0.get("primary").unwrap(), "eth2"); } else { panic!("Expected bond config"); } testing_logger::validate(|captured_logs| { let warnings: Vec<_> = captured_logs .iter() .filter(|l| l.level == Level::Warn) .collect(); assert_eq!(warnings.len(), 1); assert!(warnings[0].body.contains("3 different priority levels")); assert!(warnings[0].body.contains("primary vs backup")); }); } #[test] fn test_apply_team_port_options_non_primary_sticky_warns() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with highest priority, not sticky Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Highest prio, not sticky sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) with lower priority, but sticky Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(50), // Lower prio, but sticky - should warn sticky: true, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); assert!(result.has_warnings); let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { assert_eq!(bond.options.0.get("primary").unwrap(), "eth0"); // primary_reselect should NOT be set because highest prio is not sticky assert!(!bond.options.0.contains_key("primary_reselect")); } else { panic!("Expected bond config"); } testing_logger::validate(|captured_logs| { let warnings: Vec<_> = captured_logs .iter() .filter(|l| l.level == Level::Warn) .collect(); assert_eq!(warnings.len(), 1); assert!(warnings[0].body.contains("eth1")); }); } #[test] fn test_apply_team_port_options_sticky_without_prio_warns() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with sticky but no prio Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: None, // No prio set sticky: true, // But sticky is set lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); assert!(result.has_warnings); let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { // Should NOT set primary_reselect because no prio is set assert!(!bond.options.0.contains_key("primary_reselect")); } else { panic!("Expected bond config"); } testing_logger::validate(|captured_logs| { let warnings: Vec<_> = captured_logs .iter() .filter(|l| l.level == Level::Warn) .collect(); assert_eq!(warnings.len(), 1); assert!(warnings[0].body.contains("eth0")); }); } #[test] fn test_apply_team_port_options_duplicate_prio_warns() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with prio 100 Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Same as eth1 sticky: true, // Sticky, but shouldn't set primary_reselect due to ambiguous priority lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) with same prio 100 Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Same as eth0 sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); assert!(result.has_warnings); let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { // Should NOT set primary because of ambiguous priority assert!(!bond.options.0.contains_key("primary")); assert!(!bond.options.0.contains_key("primary_reselect")); } else { panic!("Expected bond config"); } testing_logger::validate(|captured_logs| { let warnings: Vec<_> = captured_logs .iter() .filter(|l| l.level == Level::Warn) .collect(); assert_eq!(warnings.len(), 1); // Should mention both ports and the duplicate priority assert!(warnings[0].body.contains("eth0")); assert!(warnings[0].body.contains("eth1")); assert!(warnings[0].body.contains("100")); assert!(warnings[0].body.contains("same highest prio")); }); } #[test] fn test_apply_team_port_options_clear_primary_with_duplicate_backups() { testing_logger::setup(); let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); let interfaces = vec![ // Team port 1 (eth0) with highest priority Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Highest - should be primary sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) with lower priority Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(50), // Lower - backup sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 3 (eth2) with same priority as eth1 Interface { name: "eth2".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(50), // Same as eth1 - also backup sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); assert!(!result.has_warnings); // Should map cleanly - only 2 priority levels (100 and 50) let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond) = &team0.config { // eth0 should be primary (highest prio) assert_eq!(bond.options.0.get("primary").unwrap(), "eth0"); // No primary_reselect since not sticky assert!(!bond.options.0.contains_key("primary_reselect")); } else { panic!("Expected bond config"); } testing_logger::validate(|captured_logs| { let warnings: Vec<_> = captured_logs .iter() .filter(|l| l.level == Level::Warn) .collect(); // No warnings - only 2 priority levels assert_eq!(warnings.len(), 0); }); } #[test] fn test_team_single_prio_multiple_interfaces() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); // Create a team with 3 ports where only one has a prio let interfaces = vec![ // Team port 1 (eth0) - has prio Interface { name: "eth0".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Only this port has a prio sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 2 (eth1) - no prio Interface { name: "eth1".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: None, // No prio sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team port 3 (eth2) - no prio Interface { name: "eth2".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: None, // No prio sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Team controller Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); // Should not have warnings - single prio is unambiguous assert!(!result.has_warnings); // Verify team was converted to bond let team0 = result .network_state .get_connection("team0") .expect("team0 should exist"); if let ConnectionConfig::Bond(bond_config) = &team0.config { assert_eq!( bond_config.options.0.get("primary"), Some(&"eth0".to_string()), "eth0 should be the primary port" ); // No primary_reselect since not sticky assert!( !bond_config.options.0.contains_key("primary_reselect"), "primary_reselect should not be set" ); } else { panic!("team0 should have been converted to bond"); } } #[test] fn test_to_networkstate_complex_topology() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); // Create a complex topology with: // 1. A regular bond (bond0) with 2 ports (eth0, eth1) // 2. A team (team0) that will be converted to bond with 2 ports (eth2 with prio+sticky, eth3) // 3. An OVS bridge (ovsbr0) with 2 ports (eth4 untagged, eth5 as vlan port) // // NOTE: Interfaces are intentionally shuffled (ports before controllers) // to ensure the migration code doesn't rely on ordering let interfaces = vec![ // Team port 1 (eth2) Interface { name: "eth2".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(100), // Highest priority sticky: true, // Sticky port lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // OVS port 1 (eth4) Interface { name: "eth4".to_string(), link: Link { master: Some("ovsbr0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::OvsBridge, priority: None, path_cost: None, queue_id: None, prio: None, sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Bond controller Interface { name: "bond0".to_string(), bond: Some(WickedBond { mode: WickedBondMode::ActiveBackup, miimon: None, arpmon: None, xmit_hash_policy: None, packets_per_slave: None, tlb_dynamic_lb: None, lacp_rate: None, ad_select: None, ad_user_port_key: None, ad_actor_sys_prio: None, ad_actor_system: None, min_links: None, primary_reselect: None, primary: None, num_grat_arp: None, num_unsol_na: None, fail_over_mac: None, all_slaves_active: None, resend_igmp: None, lp_interval: None, address: None, }), ..Default::default() }, // Team controller (will be converted to bond) Interface { name: "team0".to_string(), team: Some(WickedTeam { runner: Some(Runner { name: RunnerName::ActiveBackup, ..Default::default() }), ..Default::default() }), ..Default::default() }, // Bond port 1 (eth0) Interface { name: "eth0".to_string(), link: Link { master: Some("bond0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Bond, priority: None, path_cost: None, queue_id: None, prio: None, sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // OVS bridge Interface { name: "ovsbr0".to_string(), ovs_bridge: Some(OvsBridge { vlan: None }), ..Default::default() }, // Team port 2 (eth3) Interface { name: "eth3".to_string(), link: Link { master: Some("team0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Team, priority: None, path_cost: None, queue_id: None, prio: Some(50), // Lower priority sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, // Bond port 2 (eth1) Interface { name: "eth1".to_string(), link: Link { master: Some("bond0".to_string()), mtu: None, port: Some(LinkPort { port_type: LinkPortType::Bond, priority: None, path_cost: None, queue_id: None, prio: None, sticky: false, lacp_key: None, lacp_prio: None, }), }, ..Default::default() }, ]; let interfaces_result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; let result = to_networkstate(&interfaces_result).unwrap(); let find_connection_by_interface = |name: &str| result.network_state.get_connection(name).cloned(); // Verify regular bond (bond0) exists and is still a bond let bond0 = find_connection_by_interface("bond0").expect("bond0 should exist"); assert!( matches!(bond0.config, ConnectionConfig::Bond(_)), "bond0 should be a bond" ); // Verify team0 was converted to bond let team0 = find_connection_by_interface("team0").expect("team0 should exist"); if let ConnectionConfig::Bond(bond_config) = &team0.config { assert_eq!( bond_config.options.0.get("primary"), Some(&"eth2".to_string()), "eth2 should be the primary port" ); assert_eq!( bond_config.options.0.get("primary_reselect"), Some(&"failure".to_string()), "primary_reselect should be set to failure due to sticky" ); } else { panic!("team0 should have been converted to bond"); } // Verify OVS bridge exists (created with "-bridge" suffix) let ovsbr0_bridge = result .network_state .get_connection("ovsbr0-bridge") .expect("OVS bridge should exist"); assert!( matches!(ovsbr0_bridge.config, ConnectionConfig::OvsBridge(_)), "ovsbr0-bridge should be an OVS bridge" ); // Verify OVS port for eth4 exists let eth4_port = find_connection_by_interface("eth4").expect("eth4 should exist"); assert!( eth4_port.controller.is_some(), "eth4 should have a controller" ); // Verify all expected connections exist assert!( find_connection_by_interface("bond0").is_some(), "bond0 should exist" ); assert!( find_connection_by_interface("eth0").is_some(), "eth0 should exist" ); assert!( find_connection_by_interface("eth1").is_some(), "eth1 should exist" ); assert!( find_connection_by_interface("team0").is_some(), "team0 should exist" ); assert!( find_connection_by_interface("eth2").is_some(), "eth2 should exist" ); assert!( find_connection_by_interface("eth3").is_some(), "eth3 should exist" ); assert!( find_connection_by_interface("eth4").is_some(), "eth4 should exist" ); } } 0707010000000B000081A40000000000000000000000016A032DB600003718000000000000000000000000000000000000002100000000wicked2nm-1.5.0/src/netconfig.rsuse agama_network::{model::Connection, NetworkState}; use globset::Glob; use serde::{Deserialize, Serialize}; use std::{net::IpAddr, path::Path}; #[derive(Debug, Default, PartialEq, Serialize, Deserialize)] pub struct Netconfig { pub static_dns_servers: Vec, pub static_dns_searchlist: Option>, pub dns_policy: Vec, pub has_warning: bool, } pub fn read_netconfig(path: impl AsRef) -> Result { if let Err(e) = dotenv::from_filename(path) { return Err(e.into()); }; handle_netconfig_values() } fn handle_netconfig_values() -> Result { let mut netconfig = Netconfig::default(); if let Ok(mut dns_policy) = dotenv::var("NETCONFIG_DNS_POLICY") { if dns_policy == "auto" { netconfig.dns_policy = vec!["STATIC".to_string(), "*".to_string()]; } else if !dns_policy.is_empty() { // NetworkManager shouldn't apply here but in case it is still present // netconfig just ignores everything after if wicked is used dns_policy = dns_policy .split_once("NetworkManager") .map(|(before, _)| before.to_string()) .unwrap_or(dns_policy); if dns_policy.contains(&"STATIC_FALLBACK".to_string()) { log::warn!("NETCONFIG_DNS_POLICY \"STATIC_FALLBACK\" is not supported"); netconfig.has_warning = true; // Replace STATIC_FALLBACK with STATIC at the end to somewhat mimic behaviour dns_policy = dns_policy.replace("STATIC_FALLBACK", ""); dns_policy.push_str(" STATIC"); } netconfig.dns_policy = dns_policy .split_ascii_whitespace() .map(|s| s.to_string()) .collect(); } } if let Ok(static_dns_servers) = dotenv::var("NETCONFIG_DNS_STATIC_SERVERS") { if !static_dns_servers.is_empty() { netconfig.static_dns_servers = static_dns_servers .split_ascii_whitespace() .filter_map(|ip_str| match ip_str.parse::() { Ok(x) => Some(x), Err(_e) => { log::warn!("Invalid value '{ip_str}' in NETCONFIG_DNS_STATIC_SERVERS"); netconfig.has_warning = true; None } }) .collect(); } } if let Ok(static_dns_searchlist) = dotenv::var("NETCONFIG_DNS_STATIC_SEARCHLIST") { if !static_dns_searchlist.is_empty() { netconfig.static_dns_searchlist = Some( static_dns_searchlist .split_ascii_whitespace() .map(|s| s.to_string()) .collect::>(), ); } } if let Ok(gratuitous_arp) = dotenv::var("SEND_GRATUITOUS_ARP") { if !gratuitous_arp.eq("auto") { log::warn!("SEND_GRATUITOUS_ARP differs from 'auto', consider net.ipv4.conf.{{all,default}}.arp_notify variable in /etc/sysctl.conf"); netconfig.has_warning = true; } } Ok(netconfig) } pub fn apply_dns_policy( netconfig: &Netconfig, nm_state: &mut NetworkState, ) -> Result<(), anyhow::Error> { // Start at 10 because 0 is special global default in NM // and increase by 10 to give room for future changes. let mut i: i32 = 10; for policy in &netconfig.dns_policy { match policy.as_str() { "" => continue, "STATIC" => { let Some(loopback) = nm_state.get_connection_mut("lo") else { anyhow::bail!("Failed to get loopback connection"); }; loopback.ip_config.dns_priority4 = Some(i); loopback.ip_config.dns_priority6 = Some(i); } _ => { let glob = Glob::new(policy)?.compile_matcher(); for con in nm_state .connections .iter_mut() .filter(|c| { c.interface .as_ref() .is_some_and(|c_iface| glob.is_match(c_iface)) && c.ip_config.dns_priority4.is_none() && c.ip_config.dns_priority6.is_none() }) .collect::>() { con.ip_config.dns_priority4 = Some(i); con.ip_config.dns_priority6 = Some(i); } } } i += 10; } Ok(()) } #[cfg(test)] mod tests { use agama_network::model::Connection; use super::*; use std::env; #[test] fn test_handle_netconfig_values() { env::set_var("NETCONFIG_DNS_POLICY", "STATIC_FALLBACK NetworkManager"); assert!(handle_netconfig_values().unwrap().has_warning); env::set_var("NETCONFIG_DNS_POLICY", "STATIC_FALLBACK"); assert!(handle_netconfig_values().unwrap().has_warning); // STATIC_FALLBACK should be replaced with STATIC at the end but contain a warning // NetworkManager should have the effect that everything after (eth1) is ignored env::set_var( "NETCONFIG_DNS_POLICY", "STATIC_FALLBACK eth0 NetworkManager eth1", ); assert_eq!( handle_netconfig_values().unwrap(), Netconfig { dns_policy: vec!["eth0".to_string(), "STATIC".to_string()], has_warning: true, ..Default::default() } ); env::set_var("NETCONFIG_DNS_POLICY", ""); env::set_var( "NETCONFIG_DNS_STATIC_SERVERS", "192.168.0.10 192.168.1.10 2001:db8::10", ); env::set_var("NETCONFIG_DNS_STATIC_SEARCHLIST", "suse.com suse.de"); assert!(handle_netconfig_values().unwrap().dns_policy.is_empty()); env::set_var("NETCONFIG_DNS_POLICY", "STATIC"); assert_eq!( handle_netconfig_values().unwrap(), Netconfig { static_dns_servers: vec![ "192.168.0.10".parse().unwrap(), "192.168.1.10".parse().unwrap(), "2001:db8::10".parse().unwrap() ], static_dns_searchlist: Some(vec!["suse.com".to_string(), "suse.de".to_string()]), dns_policy: vec!["STATIC".to_string()], ..Default::default() } ); env::set_var("NETCONFIG_DNS_POLICY", ""); env::set_var("NETCONFIG_DNS_STATIC_SERVERS", ""); env::set_var("NETCONFIG_DNS_STATIC_SEARCHLIST", ""); assert_eq!( handle_netconfig_values().unwrap(), Netconfig { static_dns_servers: vec![], static_dns_searchlist: None, ..Default::default() } ); env::set_var("NETCONFIG_DNS_POLICY", "auto"); assert_eq!( handle_netconfig_values().unwrap().dns_policy, vec!["STATIC".to_string(), "*".to_string(),] ); env::set_var("NETCONFIG_DNS_POLICY", "STATIC eth* ppp?"); assert_eq!( handle_netconfig_values().unwrap().dns_policy, vec!["STATIC".to_string(), "eth*".to_string(), "ppp?".to_string()] ); } #[test] fn test_apply_dns_policy() { let netconfig = Netconfig { dns_policy: vec![ "STATIC".to_string(), "e???".to_string(), "ppp?".to_string(), "eth0.??".to_string(), "eth*".to_string(), "wlan?".to_string(), ], ..Default::default() }; let mut nm_state = NetworkState::default(); // Should match with e??? assert!(nm_state .add_connection(Connection { id: "eth0".to_string(), interface: Some("eth0".to_string()), ..Default::default() }) .is_ok()); // Should match with eth0.?? assert!(nm_state .add_connection(Connection { id: "eth0.11".to_string(), interface: Some("eth0.11".to_string()), ..Default::default() }) .is_ok()); // Should match with eth* assert!(nm_state .add_connection(Connection { id: "eth0211".to_string(), interface: Some("eth0211".to_string()), ..Default::default() }) .is_ok()); // Should not match assert!(nm_state .add_connection(Connection { id: "neth0".to_string(), interface: Some("neth0".to_string()), ..Default::default() }) .is_ok()); // Should match with ppp? assert!(nm_state .add_connection(Connection { id: "ppp0".to_string(), interface: Some("ppp0".to_string()), ..Default::default() }) .is_ok()); // Should not match assert!(nm_state .add_connection(Connection { id: "en0".to_string(), interface: Some("en0".to_string()), ..Default::default() }) .is_ok()); // Should match with wlan? assert!(nm_state .add_connection(Connection { id: "wlan0-0".to_string(), interface: Some("wlan0".to_string()), ..Default::default() }) .is_ok()); // Should match with wlan? assert!(nm_state .add_connection(Connection { id: "wlan0-1".to_string(), interface: Some("wlan0".to_string()), ..Default::default() }) .is_ok()); // Missing loopback assert!(apply_dns_policy(&netconfig, &mut nm_state).is_err()); assert!(nm_state .add_connection(Connection { id: "lo".to_string(), config: agama_network::model::ConnectionConfig::Loopback, ..Default::default() }) .is_ok()); assert!(apply_dns_policy(&netconfig, &mut nm_state).is_ok()); assert_eq!( nm_state .get_connection("lo") .unwrap() .ip_config .dns_priority4, Some(10) ); assert_eq!( nm_state .get_connection("lo") .unwrap() .ip_config .dns_priority6, Some(10) ); assert_eq!( nm_state .get_connection("eth0") .unwrap() .ip_config .dns_priority4, Some(20) ); assert_eq!( nm_state .get_connection("eth0") .unwrap() .ip_config .dns_priority6, Some(20) ); assert_eq!( nm_state .get_connection("eth0.11") .unwrap() .ip_config .dns_priority4, Some(40) ); assert_eq!( nm_state .get_connection("eth0.11") .unwrap() .ip_config .dns_priority6, Some(40) ); assert_eq!( nm_state .get_connection("eth0211") .unwrap() .ip_config .dns_priority4, Some(50) ); assert_eq!( nm_state .get_connection("eth0211") .unwrap() .ip_config .dns_priority6, Some(50) ); assert_eq!( nm_state .get_connection("neth0") .unwrap() .ip_config .dns_priority4, None ); assert_eq!( nm_state .get_connection("neth0") .unwrap() .ip_config .dns_priority6, None ); assert_eq!( nm_state .get_connection("ppp0") .unwrap() .ip_config .dns_priority4, Some(30) ); assert_eq!( nm_state .get_connection("ppp0") .unwrap() .ip_config .dns_priority6, Some(30) ); assert_eq!( nm_state .get_connection("wlan0-0") .unwrap() .ip_config .dns_priority4, Some(60) ); assert_eq!( nm_state .get_connection("wlan0-0") .unwrap() .ip_config .dns_priority6, Some(60) ); assert_eq!( nm_state .get_connection("wlan0-1") .unwrap() .ip_config .dns_priority4, Some(60) ); assert_eq!( nm_state .get_connection("wlan0-1") .unwrap() .ip_config .dns_priority6, Some(60) ); assert_eq!( nm_state .get_connection("en0") .unwrap() .ip_config .dns_priority4, None ); assert_eq!( nm_state .get_connection("en0") .unwrap() .ip_config .dns_priority6, None ); } } 0707010000000C000081A40000000000000000000000016A032DB6000005D6000000000000000000000000000000000000002600000000wicked2nm-1.5.0/src/netconfig_dhcp.rsuse serde::Serialize; use std::path::Path; #[derive(Debug, Default, PartialEq, Serialize)] pub struct NetconfigDhcp { pub dhclient_hostname_option: HostnameOption, pub dhclient6_hostname_option: HostnameOption, pub has_warning: bool, } #[derive(Default, Debug, PartialEq, Serialize)] pub enum HostnameOption { #[default] Empty, Auto, Value(String), } impl From for HostnameOption { fn from(s: String) -> Self { match s.as_str() { "" => Self::Empty, "AUTO" => Self::Auto, _ => Self::Value(s), } } } pub fn read_netconfig_dhcp(path: &Path) -> Result { if !path.exists() { log::warn!("Missing netconfig dhcp file {}", path.display()); return Ok(NetconfigDhcp { has_warning: true, ..Default::default() }); } if let Err(e) = dotenv::from_filename(path) { anyhow::bail!(e); }; Ok(handle_netconfig_dhcp_values()) } fn handle_netconfig_dhcp_values() -> NetconfigDhcp { let mut netconfig_dhcp = NetconfigDhcp::default(); if let Ok(dhclient_hostname_option) = dotenv::var("DHCLIENT_HOSTNAME_OPTION") { netconfig_dhcp.dhclient_hostname_option = dhclient_hostname_option.into(); } if let Ok(dhclient6_hostname_option) = dotenv::var("DHCLIENT6_HOSTNAME_OPTION") { netconfig_dhcp.dhclient6_hostname_option = dhclient6_hostname_option.into(); } netconfig_dhcp } 0707010000000D000081A40000000000000000000000016A032DB600000156000000000000000000000000000000000000001B00000000wicked2nm-1.5.0/src/ovs.rsuse serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[skip_serializing_none()] #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct OvsBridge { pub vlan: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct OvsBridgeVlan { pub parent: String, pub tag: u16, } 0707010000000E000081A40000000000000000000000016A032DB600003A48000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/src/reader.rsuse crate::interface::Interface; use crate::netconfig::{read_netconfig, Netconfig}; use crate::netconfig_dhcp::{read_netconfig_dhcp, NetconfigDhcp}; use crate::MIGRATION_SETTINGS; use quick_xml::events::Event; use quick_xml::Reader; use regex::Regex; use std::fs::{self, read_dir}; use std::io::{self}; use std::path::{Path, PathBuf}; #[derive(Debug)] pub struct InterfacesResult { pub interfaces: Vec, pub netconfig: Option, pub netconfig_dhcp: Option, pub has_warnings: bool, } fn validate_xml(xml: &str) -> Result<(), anyhow::Error> { let mut reader = Reader::from_str(xml); reader.config_mut().check_end_names = true; let mut root_found = false; loop { match reader.read_event() { Ok(Event::Eof) => break, Ok(Event::Start(e)) => { let name = e.local_name(); let name_bytes = name.as_ref(); if name_bytes != b"interface" { anyhow::bail!( "The provided file is not a valid Wicked XML configuration (unexpected element: <{}>).", String::from_utf8_lossy(name_bytes) ); } root_found = true; break; } Ok(_) => (), Err(e) => { anyhow::bail!("Invalid XML configuration: {}", e); } } } if !root_found { anyhow::bail!("The provided file is not a valid Wicked XML configuration (no element found)."); } Ok(()) } // Define a list of fields that are ignored if present. // The list must be in alphabetical order. pub const IGNORED_FIELDS: &[&str] = &[ "ipv4.arp-notify", "ipv4.forwarding", "ipv6.accept-dad", "ipv6.accept-ra", "ipv6.addr-gen-mode", "ipv6.autoconf", "ipv6.forwarding", "ipv6.stable-secret", ]; pub fn read_xml_file(path: PathBuf) -> Result { let contents = match fs::read_to_string(path.clone()) { Ok(contents) => contents, Err(e) => { return Err(anyhow::anyhow!( "Couldn't read {}: {}", path.as_path().display(), e )) } }; deserialize_xml(contents) } pub fn deserialize_xml(contents: String) -> Result { validate_xml(contents.as_str())?; let replaced_string = replace_colons(contents.as_str()); let deserializer = &mut quick_xml::de::Deserializer::from_str(replaced_string.as_str()); let mut unhandled_fields = vec![]; let interfaces: Vec = match serde_ignored::deserialize(deserializer, |path| { unhandled_fields.push(path.to_string()) }) { Ok(interfaces) => interfaces, Err(e) => { let deserializer2 = &mut quick_xml::de::Deserializer::from_str(replaced_string.as_str()); let res: Result, _> = serde_path_to_error::deserialize(deserializer2); if let Err(path_error) = res { log::error!("Error at {}: {}", path_error.path(), e); } return Err(e.into()); } }; let mut result = InterfacesResult { interfaces, netconfig: None, netconfig_dhcp: None, has_warnings: false, }; for e in unhandled_fields { let split_str = e.split_once('.').unwrap(); let ifc_name = &result.interfaces[split_str.0.parse::().unwrap()].name; let field = split_str.1; if IGNORED_FIELDS.binary_search(&field).is_ok() { log::debug!("Ingnore field in interface {ifc_name}: {field}"); } else { log::warn!("Unhandled field in interface {ifc_name}: {field}"); result.has_warnings = true; } } Ok(result) } fn replace_colons(colon_string: &str) -> String { let re = Regex::new(r"<([\/]?)(\w+):(\w+)\b").unwrap(); let replaced = re.replace_all(colon_string, "<$1$2-$3").to_string(); replaced } // https://stackoverflow.com/a/76820878 fn list_files(path: impl AsRef, recursive: bool) -> std::io::Result> { let mut buf = vec![]; let entries = read_dir(path)?; for entry in entries { let entry = entry?; let meta = entry.metadata()?; if meta.is_dir() && recursive { let mut subdir = list_files(entry.path(), recursive)?; buf.append(&mut subdir); } if meta.is_file() { buf.push(entry.path()); } } Ok(buf) } fn is_ifsysctl(path: &Path) -> bool { let invalid_suffix = [ "~", ".old", ".bak", ".orig", ".scpmbackup", ".rpmnew", ".rpmsave", ".rpmorig", ]; path.file_name() .and_then(|name| name.to_str()) .map(|filename| { filename.starts_with("ifsysctl") && !invalid_suffix.iter().any(|e| filename.ends_with(e)) }) .unwrap_or(false) } fn warn_on_deprecated_ifsysctl() -> Result { let settings = MIGRATION_SETTINGS.get().unwrap(); let mut has_warning = false; let files = list_files(&settings.netconfig_base_dir, false)?; for file in files { if is_ifsysctl(&file) { log::warn!( "ifsysctl file \"{}\" is deprecated and will not be migrated", file.display() ); has_warning = true; } } Ok(has_warning) } pub fn read(paths: Vec) -> Result { let settings = MIGRATION_SETTINGS.get().unwrap(); let mut result = if paths.len() == 1 && paths[0] == "-" { deserialize_xml(io::read_to_string(io::stdin())?)? } else { read_files(paths)? }; if settings.with_netconfig { match read_netconfig(settings.netconfig_path.clone()) { Ok(netconfig) => { result.has_warnings |= netconfig.has_warning; result.netconfig = Some(netconfig); } Err(e) => { anyhow::bail!( "Failed to read netconfig at {}: {}", settings.netconfig_path.display(), e ); } }; match read_netconfig_dhcp(&settings.netconfig_dhcp_path) { Ok(netconfig_dhcp) => { result.has_warnings |= netconfig_dhcp.has_warning; result.netconfig_dhcp = Some(netconfig_dhcp); } Err(e) => { anyhow::bail!( "Failed to read netconfig_dhcp at {}: {}", settings.netconfig_dhcp_path.display(), e ) } }; match warn_on_deprecated_ifsysctl() { Err(e) => anyhow::bail!("Unexpected error, while searching ifsysctl files: {}", e), Ok(has_warnings) => result.has_warnings |= has_warnings, }; } // Filter loopback as it doesn't need to be migrated result.interfaces.retain(|interface| interface.name != "lo"); Ok(result) } fn read_files(file_paths: Vec) -> Result { let mut result = InterfacesResult { interfaces: vec![], netconfig: None, netconfig_dhcp: None, has_warnings: false, }; for path in file_paths { let path: PathBuf = path.into(); if path.is_dir() { let files = list_files(path, true)?; for file in files { match file.extension() { None => continue, Some(ext) => { if !ext.eq("xml") { continue; } } } let mut read_xml = read_xml_file(file)?; result.has_warnings |= read_xml.has_warnings; result.interfaces.append(&mut read_xml.interfaces); } } else { let mut read_xml = read_xml_file(path)?; result.has_warnings |= read_xml.has_warnings; result.interfaces.append(&mut read_xml.interfaces); } } Ok(result) } #[cfg(test)] mod tests { use super::*; use crate::bond::*; #[test] fn test_bond_options_from_xml() { let xml = r##" bond0 active-backup layer34 none 1 true slow bandwidth 5 7 00:de:ad:be:ef:00 11 better 13 17 19 23 true 23 27 31 ioctl 23 filter_backup any 1.2.3.4 4.3.2.1
02:11:22:33:44:55
en0
"##; let ifc = deserialize_xml(xml.to_string()) .unwrap() .interfaces .pop() .unwrap(); assert!(ifc.bond.is_some()); let bond = ifc.bond.unwrap(); assert_eq!( bond, Bond { mode: WickedBondMode::ActiveBackup, xmit_hash_policy: Some(XmitHashPolicy::Layer34), fail_over_mac: Some(FailOverMac::None), packets_per_slave: Some(1), tlb_dynamic_lb: Some(true), lacp_rate: Some(LacpRate::Slow), ad_select: Some(AdSelect::Bandwidth), ad_user_port_key: Some(5), ad_actor_sys_prio: Some(7), ad_actor_system: Some(String::from("00:de:ad:be:ef:00")), min_links: Some(11), primary_reselect: Some(PrimaryReselect::Better), num_grat_arp: Some(13), num_unsol_na: Some(17), lp_interval: Some(19), resend_igmp: Some(23), all_slaves_active: Some(true), miimon: Some(Miimon { frequency: 23, carrier_detect: CarrierDetect::Ioctl, downdelay: Some(31), updelay: Some(27), }), arpmon: Some(ArpMon { interval: 23, validate: ArpValidate::FilterBackup, validate_targets: Some(ArpValidateTargets::Any), targets: vec![String::from("1.2.3.4"), String::from("4.3.2.1")] }), address: Some(String::from("02:11:22:33:44:55")), primary: Some(String::from("en0")), } ); } /// This test check that the default for stp from wicked is False. #[test] fn test_bridge_default_stp() { let xml = r##" br0 en0 "##; let ifc = deserialize_xml(xml.to_string()) .unwrap() .interfaces .pop() .unwrap(); assert!(ifc.bridge.is_some()); assert!(!ifc.bridge.unwrap().stp); } #[test] fn test_broken_xml() { let xml = r##" eth1
127.0.0.1 "##; let err = deserialize_xml(xml.to_string()); assert!(err.is_err()); } #[test] fn test_non_xml() { let content = "This is just some random text, not XML at all."; let err = deserialize_xml(content.to_string()); assert!(err.is_err()); assert!(err .unwrap_err() .to_string() .contains("no element found")); } #[test] fn test_empty_xml() { let content = " "; let err = deserialize_xml(content.to_string()); assert!(err.is_err()); assert!(err .unwrap_err() .to_string() .contains("no element found")); } #[test] fn test_unexpected_root() { let content = "bar"; let err = deserialize_xml(content.to_string()); assert!(err.is_err()); assert!(err .unwrap_err() .to_string() .contains("unexpected element: ")); } #[test] fn test_xml_firewall_zone() { let xml = r##" eth1 foo "##; let ifc = deserialize_xml(xml.to_string()) .unwrap() .interfaces .pop() .unwrap(); assert_eq!(ifc.firewall.zone, Some("foo".to_string())); } #[test] fn check_sort_of_ignored_fields() { let mut i = 1; while i < IGNORED_FIELDS.len() { let a = IGNORED_FIELDS[i - 1].as_bytes(); let b = IGNORED_FIELDS[i].as_bytes(); assert!(a <= b); i += 1; } } } 0707010000000F000081A40000000000000000000000016A032DB60000F478000000000000000000000000000000000000001C00000000wicked2nm-1.5.0/src/team.rsuse agama_network::model::{self}; use agama_network::types::BondMode as AgamaBondMode; use serde::{Deserialize, Serialize}; use serde_with::{skip_serializing_none, DeserializeFromStr, SerializeDisplay}; use std::collections::HashMap; use strum_macros::{Display, EnumString}; #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct Team { // ignored pub debug_level: Option, pub notify_peers: Option, pub mcast_rejoin: Option, pub runner: Option, pub link_watch_policy: Option, pub link_watch: Option, pub address: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct NotifyPeers { pub count: Option, pub interval: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct McastRejoin { pub count: Option, pub interval: Option, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Default)] #[strum(serialize_all = "lowercase")] pub enum RunnerName { Lacp, ActiveBackup, #[default] RoundRobin, Broadcast, LoadBalance, Random, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Default)] #[strum(serialize_all = "snake_case")] pub enum SelectPolicy { #[default] LacpPrio, LacpPrioStable, Bandwidth, Count, PortOptions, } fn default_true() -> bool { true } fn default_sys_prio() -> u16 { 255 } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Default)] #[strum(serialize_all = "snake_case")] pub enum HwAddrPolicy { #[default] SameAll, ByActive, OnlyActive, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct Runner { #[serde(rename = "@name", default)] pub name: RunnerName, // LACP runner fields #[serde(default = "default_true")] pub active: bool, #[serde(default)] pub fast_rate: bool, #[serde(default = "default_sys_prio")] pub sys_prio: u16, #[serde(default)] pub min_ports: u16, #[serde(default)] pub select_policy: SelectPolicy, // LoadBalance and LACP runner fields pub tx_hash: Option, pub tx_balancer: Option, // ActiveBackup runner fields pub hwaddr_policy: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct TxBalancer { pub name: Option, pub balancing_interval: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct LinkWatch { #[serde(rename = "watch", default)] pub watches: Vec, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Default)] #[strum(serialize_all = "snake_case")] pub enum WatchName { #[default] Ethtool, ArpPing, NsnaPing, Tipc, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct Watch { #[serde(rename = "@name", default)] pub name: WatchName, // Ethtool watch fields #[serde(default)] pub delay_up: u32, #[serde(default)] pub delay_down: u32, // ARP ping and NSNA ping watch fields #[serde(default)] pub interval: u32, #[serde(default)] pub init_wait: u32, pub target_host: Option, // ARP ping specific fields pub source_host: Option, pub validate_active: Option, pub validate_inactive: Option, pub send_always: Option, #[serde(default)] pub missed_max: u32, pub vlanid: Option, // TIPC watch fields pub bearer: Option, } /// Calculate greatest common divisor using Euclidean algorithm fn gcd(mut a: u32, mut b: u32) -> u32 { while b != 0 { let temp = b; b = a % b; a = temp; } a } impl Team { /// Convert Team configuration to bond ConnectionConfig, returning (config, has_warnings) pub fn to_connection_config(&self) -> (model::ConnectionConfig, bool) { let mut bond_options: HashMap = HashMap::new(); let mut mode = AgamaBondMode::RoundRobin; // Default fallback let mut has_warnings = false; // Handle top-level team options if let Some(notify_peers) = &self.notify_peers { if let Some(count) = notify_peers.count { bond_options.insert(String::from("num_grat_arp"), count.to_string()); bond_options.insert(String::from("num_unsol_na"), count.to_string()); } if let Some(interval) = notify_peers.interval { bond_options.insert(String::from("peer_notif_delay"), interval.to_string()); } } if let Some(mcast_rejoin) = &self.mcast_rejoin { if let Some(count) = mcast_rejoin.count { bond_options.insert(String::from("resend_igmp"), count.to_string()); } if mcast_rejoin.interval.is_some() { log::warn!( "Team 'mcast_rejoin.interval' is not supported in bond configuration - bond uses hardcoded 200ms interval" ); has_warnings = true; } } if self.link_watch_policy.is_some() { log::warn!("Team 'link_watch_policy' is not supported in bond configuration"); has_warnings = true; } if let Some(runner) = &self.runner { match runner.name { RunnerName::Lacp => { mode = AgamaBondMode::LACP; bond_options.insert( String::from("lacp_active"), if runner.active { "1" } else { "0" }.to_string(), ); bond_options.insert( String::from("lacp_rate"), if runner.fast_rate { "fast" } else { "slow" }.to_string(), ); // Bond's ad_actor_sys_prio valid range is 1-65535, team allows 0-65535 let sys_prio = if runner.sys_prio == 0 { log::info!("Team sys_prio '0' converted to '1' - bond range starts at 1"); 1 } else { runner.sys_prio }; bond_options.insert(String::from("ad_actor_sys_prio"), sys_prio.to_string()); bond_options.insert(String::from("min_links"), runner.min_ports.to_string()); let val = match runner.select_policy { SelectPolicy::LacpPrio => { log::info!("Team select_policy 'lacp_prio' approximated to bond ad_select 'stable'."); "stable" } SelectPolicy::LacpPrioStable => { log::info!("Team select_policy 'lacp_prio_stable' approximated to bond ad_select 'stable'."); "stable" } SelectPolicy::Bandwidth => "bandwidth", SelectPolicy::Count => "count", SelectPolicy::PortOptions => { log::warn!( "Team select_policy 'port_options' not supported in kernel 6.12 - requires kernel 6.18+ (actor_port_prio). Using 'stable' instead." ); has_warnings = true; "stable" } }; bond_options.insert(String::from("ad_select"), val.to_string()); if runner.tx_balancer.is_some() { log::info!( "Team LACP with tx_balancer converted to bond 802.3ad - dynamic flow rebalancing not available in bond" ); } } RunnerName::ActiveBackup => { mode = AgamaBondMode::ActiveBackup; if let Some(hwaddr_policy) = &runner.hwaddr_policy { let fail_over_mac = match hwaddr_policy { HwAddrPolicy::SameAll => "none", HwAddrPolicy::ByActive => "active", HwAddrPolicy::OnlyActive => "follow", }; bond_options .insert(String::from("fail_over_mac"), fail_over_mac.to_string()); } } RunnerName::RoundRobin => { mode = AgamaBondMode::RoundRobin; } RunnerName::Broadcast => { mode = AgamaBondMode::Broadcast; } RunnerName::LoadBalance => { mode = AgamaBondMode::BalanceTLB; // Not possible in wicked currently, but maybe things change in the future if runner.tx_balancer.is_none() { bond_options.insert(String::from("tlb_dynamic_lb"), String::from("0")); } } RunnerName::Random => { log::info!("Team runner 'random' approximated by bond mode 'balance-rr' with packets_per_slave=0"); mode = AgamaBondMode::RoundRobin; bond_options.insert(String::from("packets_per_slave"), String::from("0")); } } if let Some(tx_hash) = &runner.tx_hash { let team: Vec<&str> = tx_hash.split(',').map(|s| s.trim()).collect(); // Expand team aliases to actual elements let mut team_expanded = Vec::new(); for &elem in &team { match elem { "ip" | "l3" => { team_expanded.push("ipv4"); team_expanded.push("ipv6"); } "l4" => { team_expanded.push("tcp"); team_expanded.push("udp"); team_expanded.push("sctp"); } other => team_expanded.push(other), } } // Define bond policies and what they hash on let policies = [ ("layer2", vec!["eth"]), ("layer2+3", vec!["eth", "ipv4", "ipv6"]), ("layer3+4", vec!["ipv4", "ipv6", "tcp", "udp", "sctp"]), ("vlan+srcmac", vec!["vlan"]), ]; // Find the bond policy with most matches let mut best_policy = "layer2"; let mut best_elements = &policies[0].1; let mut best_count = 0; for (policy, elements) in &policies { let count = team_expanded .iter() .filter(|&elem| elements.contains(elem)) .count(); if count > best_count { best_policy = policy; best_elements = elements; best_count = count; } } bond_options.insert(String::from("xmit_hash_policy"), best_policy.to_string()); // Check if there are team elements not in the selected bond policy let team_set: std::collections::HashSet<_> = team_expanded.iter().collect(); let bond_set: std::collections::HashSet<_> = best_elements.iter().collect(); let missing: Vec<_> = team_set.difference(&bond_set).map(|&&s| s).collect(); if !missing.is_empty() { log::info!( "Team tx_hash '{}' mapped to bond xmit_hash_policy '{}' - elements not covered in this conversion: {}", tx_hash, best_policy, missing.join(", ") ); } // If balancer is set it should fall back to the team default: ["eth", "ipv4", "ipv6"] → layer2+3 } else if runner.tx_balancer.is_some() { // When tx_hash is not explicitly set, use team's default bond_options.insert(String::from("xmit_hash_policy"), String::from("layer2+3")); } } if let Some(lw_container) = &self.link_watch { // Bond only supports one monitoring method at a time (miimon OR arp_interval, not both) // Prefer ethtool (miimon) over arp_ping/nsna_ping, warn if multiple are configured let has_ethtool = lw_container .watches .iter() .any(|w| w.name == WatchName::Ethtool); let has_arp_ping = lw_container .watches .iter() .any(|w| w.name == WatchName::ArpPing); let has_nsna_ping = lw_container .watches .iter() .any(|w| w.name == WatchName::NsnaPing); // Warn if we have ethtool AND (arp_ping OR nsna_ping) if has_ethtool && (has_arp_ping || has_nsna_ping) { log::warn!("Team has both ethtool and arp_ping/nsna_ping watches - bond supports only one monitoring method. Using miimon (ethtool), ignoring arp_ping/nsna_ping."); has_warnings = true; } // Track if we've already processed ethtool or warned about unsupported fields let mut ethtool_done = false; let mut arp_warnings_done = false; let mut nsna_warnings_done = false; // Process watches - prefer ethtool, fallback to arp_ping/nsna_ping for watch in &lw_container.watches { match watch.name { WatchName::Ethtool => { if ethtool_done { log::info!("Team has multiple ethtool watches - bond only supports one. Using first watch's settings. Behavior may differ from team's link_watch_policy."); continue; } // Calculate miimon as GCD of delays to ensure updelay/downdelay are exact multiples // Bond requires updelay and downdelay to be multiples of miimon let miimon = if watch.delay_up > 0 && watch.delay_down > 0 { gcd(watch.delay_up, watch.delay_down) } else if watch.delay_up > 0 { watch.delay_up } else if watch.delay_down > 0 { watch.delay_down } else { 100 // Default when no delays configured }; bond_options.insert(String::from("miimon"), miimon.to_string()); if watch.delay_up > 0 { bond_options .insert(String::from("updelay"), watch.delay_up.to_string()); } if watch.delay_down > 0 { bond_options .insert(String::from("downdelay"), watch.delay_down.to_string()); } ethtool_done = true; } WatchName::ArpPing if !has_ethtool => { // Handle interval - insert if not present, warn if different if let Some(existing_interval) = bond_options.get("arp_interval") { if existing_interval != &watch.interval.to_string() { log::warn!("Team has multiple arp_ping/nsna_ping watches with different intervals - bond only supports one value (shared for both IPv4 and IPv6). Using first watch's interval."); has_warnings = true; } } else { bond_options .insert(String::from("arp_interval"), watch.interval.to_string()); } // Handle arp_validate - insert if not present, warn if different if watch.validate_active.is_some() || watch.validate_inactive.is_some() { let validate_active = watch.validate_active.unwrap_or(false); let validate_inactive = watch.validate_inactive.unwrap_or(false); let arp_validate = match (validate_active, validate_inactive) { (true, true) => "all", (true, false) => "active", (false, true) => "backup", (false, false) => "none", }; if let Some(existing_validate) = bond_options.get("arp_validate") { if existing_validate != arp_validate { log::warn!("Team has multiple arp_ping watches with different validation settings - bond only supports one value. Using first watch's validation."); has_warnings = true; } } else { bond_options .insert(String::from("arp_validate"), arp_validate.to_string()); } } // Add target to comma-separated list if let Some(target) = &watch.target_host { if let Some(existing_targets) = bond_options.get("arp_ip_target") { bond_options.insert( String::from("arp_ip_target"), format!("{},{}", existing_targets, target), ); } else { bond_options.insert(String::from("arp_ip_target"), target.clone()); } } // Handle missed_max - insert if not present, warn if different if watch.missed_max > 0 { if let Some(existing_missed_max) = bond_options.get("arp_missed_max") { if existing_missed_max != &watch.missed_max.to_string() { log::warn!("Team has multiple arp_ping/nsna_ping watches with different missed_max values - bond only supports one value (shared for both IPv4 and IPv6). Using first watch's missed_max."); has_warnings = true; } } else { bond_options.insert( String::from("arp_missed_max"), watch.missed_max.to_string(), ); } } // Warn about unsupported ARP ping fields (only once) if !arp_warnings_done { if watch.source_host.is_some() { log::warn!("Team ARP ping 'source_host' is not supported in bond configuration"); has_warnings = true; } if watch.init_wait > 0 { log::warn!("Team ARP ping 'init_wait' is not supported in bond configuration"); has_warnings = true; } if watch.send_always.is_some() { log::warn!("Team ARP ping 'send_always' is not supported in bond configuration"); has_warnings = true; } if watch.vlanid.is_some() { log::warn!( "Team ARP ping 'vlanid' is not supported in bond configuration" ); has_warnings = true; } arp_warnings_done = true; } } WatchName::NsnaPing if !has_ethtool => { // Handle interval - insert if not present, warn if different (shared with arp_ping) if let Some(existing_interval) = bond_options.get("arp_interval") { if existing_interval != &watch.interval.to_string() { log::warn!("Team has multiple arp_ping/nsna_ping watches with different intervals - bond only supports one value (shared for both IPv4 and IPv6). Using first watch's interval."); has_warnings = true; } } else { bond_options .insert(String::from("arp_interval"), watch.interval.to_string()); } // Append target_host to ns_ip6_target (comma-separated) if let Some(target) = &watch.target_host { if let Some(existing_targets) = bond_options.get("ns_ip6_target") { bond_options.insert( String::from("ns_ip6_target"), format!("{},{}", existing_targets, target), ); } else { bond_options.insert(String::from("ns_ip6_target"), target.clone()); } } // Handle missed_max - shared with arp_ping if watch.missed_max > 0 { if let Some(existing_missed_max) = bond_options.get("arp_missed_max") { if existing_missed_max != &watch.missed_max.to_string() { log::warn!("Team has multiple arp_ping/nsna_ping watches with different missed_max values - bond only supports one value (shared for both IPv4 and IPv6). Using first watch's missed_max."); has_warnings = true; } } else { bond_options.insert( String::from("arp_missed_max"), watch.missed_max.to_string(), ); } } // Warn about unsupported NS/NA ping fields (only once) if !nsna_warnings_done { if watch.init_wait > 0 { log::warn!("Team NS/NA ping 'init_wait' is not supported in bond configuration"); has_warnings = true; } nsna_warnings_done = true; } } WatchName::Tipc => { log::warn!("Team link watch 'tipc' is not supported in bond configuration"); has_warnings = true; } _ => {} // Skip non-preferred watches (e.g., arp_ping when ethtool exists) } } } let config = model::ConnectionConfig::Bond(model::BondConfig { options: model::BondOptions(bond_options), mode, }); (config, has_warnings) } } impl From<&Team> for model::ConnectionConfig { fn from(team: &Team) -> model::ConnectionConfig { team.to_connection_config().0 } } #[cfg(test)] mod tests { use super::*; use agama_network::model::ConnectionConfig; use agama_network::types::BondMode as AgamaBondMode; #[test] fn test_team_to_connection_config_lacp() { let team = Team { runner: Some(Runner { name: RunnerName::Lacp, active: true, fast_rate: true, sys_prio: 100, min_ports: 2, select_policy: SelectPolicy::Bandwidth, tx_hash: Some("ipv4,ipv6,l4".to_string()), tx_balancer: None, hwaddr_policy: None, }), link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::Ethtool, delay_up: 10, delay_down: 20, ..Default::default() }, Watch { name: WatchName::ArpPing, interval: 100, target_host: Some("1.2.3.4".to_string()), ..Default::default() }, ], }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.mode, AgamaBondMode::LACP); let options = bond.options.0; assert_eq!(options.get("lacp_active").unwrap(), "1"); assert_eq!(options.get("lacp_rate").unwrap(), "fast"); assert_eq!(options.get("ad_actor_sys_prio").unwrap(), "100"); assert_eq!(options.get("min_links").unwrap(), "2"); assert_eq!(options.get("ad_select").unwrap(), "bandwidth"); assert_eq!(options.get("xmit_hash_policy").unwrap(), "layer3+4"); assert_eq!(options.get("miimon").unwrap(), "10"); // GCD(10, 20) = 10 assert_eq!(options.get("updelay").unwrap(), "10"); assert_eq!(options.get("downdelay").unwrap(), "20"); // arp_interval should NOT be set (bond prefers ethtool/miimon when both present) assert!(options.get("arp_interval").is_none()); assert!(options.get("arp_ip_target").is_none()); } else { panic!("Expected Bond config"); } } #[test] fn test_team_to_connection_config_tx_hash() { let cases = vec![ // Basic elements (Some("ipv4,ipv6,l4".to_string()), "layer3+4"), (Some("tcp,udp".to_string()), "layer3+4"), (Some("ipv4,ipv6".to_string()), "layer2+3"), (Some("ipv4".to_string()), "layer2+3"), (Some("eth".to_string()), "layer2"), (Some("vlan,eth".to_string()), "layer2"), (Some("vlan".to_string()), "vlan+srcmac"), // Aliases (Some("ip".to_string()), "layer2+3"), (Some("l3".to_string()), "layer2+3"), (Some("l4".to_string()), "layer3+4"), // Most matches logic (Some("eth,ipv4".to_string()), "layer2+3"), // layer2+3 has 2 matches vs layer2 has 1 (Some("eth,tcp".to_string()), "layer2"), // layer2 has 1 match (eth), layer3+4 has 1 (tcp) - tie goes to layer2 (Some("ipv4,tcp".to_string()), "layer3+4"), // layer3+4 has 2 matches vs layer2+3 has 1 (Some("ipv4,ipv6,tcp".to_string()), "layer3+4"), // layer3+4 has 3 matches vs layer2+3 has 2 (None, ""), ]; for (tx_hash, expected) in cases { let team = Team { runner: Some(Runner { name: RunnerName::RoundRobin, tx_hash: tx_hash.clone(), ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { if tx_hash.is_some() { assert_eq!(bond.options.0.get("xmit_hash_policy").unwrap(), expected); } else { assert!(!bond.options.0.contains_key("xmit_hash_policy")); } } } } #[test] fn test_team_tx_hash_unsupported_elements_logging() { testing_logger::setup(); let team = Team { runner: Some(Runner { name: RunnerName::RoundRobin, tx_hash: Some("eth,ipv4,tcp,vlan".to_string()), ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("xmit_hash_policy").unwrap(), "layer2+3"); } testing_logger::validate(|captured_logs| { assert_eq!(captured_logs.len(), 1); // Log contains a - to differentiate // [0]: What tx_hash is and what is was converted to // [1]: What was missed in this conversion let captured_logs_split: Vec<_> = captured_logs[0].body.split('-').map(|s| s.trim()).collect(); assert!(captured_logs_split[0].contains("'eth,ipv4,tcp,vlan'")); assert!(captured_logs_split[0].contains("'layer2+3'")); assert!(captured_logs_split[1].contains("tcp")); assert!(captured_logs_split[1].contains("vlan")); }); } #[test] fn test_team_tx_hash_no_logging_when_all_supported() { testing_logger::setup(); let team = Team { runner: Some(Runner { name: RunnerName::RoundRobin, tx_hash: Some("eth,ipv4".to_string()), ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("xmit_hash_policy").unwrap(), "layer2+3"); } testing_logger::validate(|captured_logs| { assert_eq!(captured_logs.len(), 0); }); } #[test] fn test_team_loadbalance_with_tx_balancer() { let team = Team { runner: Some(Runner { name: RunnerName::LoadBalance, tx_balancer: Some(TxBalancer { name: Some("basic".to_string()), balancing_interval: Some(100), }), ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.mode, AgamaBondMode::BalanceTLB); assert_eq!(bond.options.0.get("xmit_hash_policy").unwrap(), "layer2+3"); // With tx_balancer, tlb_dynamic_lb should NOT be set (uses default=1) assert!(bond.options.0.get("tlb_dynamic_lb").is_none()); } } // This scenario can't actually happen in wicked currently #[test] fn test_team_loadbalance_without_tx_balancer() { let team = Team { runner: Some(Runner { name: RunnerName::LoadBalance, ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.mode, AgamaBondMode::BalanceTLB); // Without tx_balancer, tlb_dynamic_lb should be set to 0 (passive mode) assert_eq!(bond.options.0.get("tlb_dynamic_lb").unwrap(), "0"); } } #[test] fn test_runner_name_mapping() { let cases = vec![ (RunnerName::Lacp, AgamaBondMode::LACP), (RunnerName::ActiveBackup, AgamaBondMode::ActiveBackup), (RunnerName::RoundRobin, AgamaBondMode::RoundRobin), (RunnerName::Broadcast, AgamaBondMode::Broadcast), (RunnerName::LoadBalance, AgamaBondMode::BalanceTLB), (RunnerName::Random, AgamaBondMode::RoundRobin), ]; for (name, expected_mode) in cases { let team = Team { runner: Some(Runner { name, ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.mode, expected_mode); } } } #[test] fn test_random_runner_packets_per_slave() { let team = Team { runner: Some(Runner { name: RunnerName::Random, ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.mode, AgamaBondMode::RoundRobin); assert_eq!( bond.options.0.get("packets_per_slave").unwrap(), "0", "Random runner should set packets_per_slave=0 for random slave selection" ); } } #[test] fn test_select_policy_mapping() { let policies = vec![ (SelectPolicy::LacpPrio, "stable"), (SelectPolicy::LacpPrioStable, "stable"), (SelectPolicy::Bandwidth, "bandwidth"), (SelectPolicy::Count, "count"), (SelectPolicy::PortOptions, "stable"), ]; for (policy, expected) in policies { let team = Team { runner: Some(Runner { name: RunnerName::Lacp, select_policy: policy, ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("ad_select").unwrap(), expected); } } } #[test] fn test_lacp_sys_prio_zero_conversion() { testing_logger::setup(); let team = Team { runner: Some(Runner { name: RunnerName::Lacp, sys_prio: 0, select_policy: SelectPolicy::Bandwidth, ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("ad_actor_sys_prio").unwrap(), "1"); } testing_logger::validate(|captured_logs| { assert_eq!(captured_logs.len(), 1); assert!(captured_logs[0].body.contains("sys_prio '0'")); assert!(captured_logs[0].body.contains("converted to '1'")); }); } #[test] fn test_nsna_ping_supported() { let team = Team { link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::NsnaPing, interval: 100, target_host: Some("fe80::1".to_string()), missed_max: 3, ..Default::default() }], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(!has_warnings, "Single nsna_ping should not warn"); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("arp_interval").unwrap(), "100"); assert_eq!(bond.options.0.get("ns_ip6_target").unwrap(), "fe80::1"); assert_eq!(bond.options.0.get("arp_missed_max").unwrap(), "3"); // No arp_validate - nsna_ping doesn't support validation options in team } } #[test] fn test_arp_ping_and_nsna_ping_same_interval() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), ..Default::default() }, Watch { name: WatchName::NsnaPing, interval: 1000, target_host: Some("fe80::1".to_string()), ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(!has_warnings, "Same interval should not warn"); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("arp_interval").unwrap(), "1000"); assert_eq!(bond.options.0.get("arp_ip_target").unwrap(), "192.168.1.1"); assert_eq!(bond.options.0.get("ns_ip6_target").unwrap(), "fe80::1"); } } #[test] fn test_arp_ping_and_nsna_ping_different_intervals() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), ..Default::default() }, Watch { name: WatchName::NsnaPing, interval: 2000, target_host: Some("fe80::1".to_string()), ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(has_warnings, "Different intervals should warn"); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("arp_interval").unwrap(), "1000"); assert_eq!(bond.options.0.get("arp_ip_target").unwrap(), "192.168.1.1"); assert_eq!(bond.options.0.get("ns_ip6_target").unwrap(), "fe80::1"); } } #[test] fn test_multiple_nsna_ping_targets() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::NsnaPing, interval: 1000, target_host: Some("fe80::1".to_string()), ..Default::default() }, Watch { name: WatchName::NsnaPing, interval: 1000, target_host: Some("fe80::2".to_string()), ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!( !has_warnings, "Multiple nsna_ping with same interval should not warn" ); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("arp_interval").unwrap(), "1000"); assert_eq!( bond.options.0.get("ns_ip6_target").unwrap(), "fe80::1,fe80::2" ); } } #[test] fn test_notify_peers_and_mcast_rejoin() { let team = Team { notify_peers: Some(NotifyPeers { count: Some(5), interval: Some(200), }), mcast_rejoin: Some(McastRejoin { count: Some(3), interval: Some(100), }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("num_grat_arp").unwrap(), "5"); assert_eq!(bond.options.0.get("num_unsol_na").unwrap(), "5"); assert_eq!(bond.options.0.get("peer_notif_delay").unwrap(), "200"); assert_eq!(bond.options.0.get("resend_igmp").unwrap(), "3"); } } #[test] fn test_mcast_rejoin_interval_warning() { let team = Team { mcast_rejoin: Some(McastRejoin { count: Some(5), interval: Some(150), }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(has_warnings, "Should warn about mcast_rejoin.interval"); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("resend_igmp").unwrap(), "5"); // interval is ignored } } #[test] fn test_hwaddr_policy_mapping() { let test_cases = vec![ (HwAddrPolicy::SameAll, "none"), (HwAddrPolicy::ByActive, "active"), (HwAddrPolicy::OnlyActive, "follow"), ]; for (hwaddr_policy, expected_fail_over_mac) in test_cases { let team = Team { runner: Some(Runner { name: RunnerName::ActiveBackup, hwaddr_policy: Some(hwaddr_policy), ..Default::default() }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.mode, AgamaBondMode::ActiveBackup); assert_eq!( bond.options.0.get("fail_over_mac").unwrap(), expected_fail_over_mac ); } } } #[test] fn test_arp_validate_mapping() { let test_cases = vec![ (Some(true), Some(true), "all"), (Some(true), Some(false), "active"), (Some(false), Some(true), "backup"), (Some(false), Some(false), "none"), (Some(true), None, "active"), (None, Some(true), "backup"), ]; for (validate_active, validate_inactive, expected) in test_cases { let team = Team { link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::ArpPing, interval: 100, target_host: Some("192.168.1.1".to_string()), validate_active, validate_inactive, ..Default::default() }], }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("arp_validate").unwrap(), expected); } } } #[test] fn test_tipc_watch_ignored() { let team = Team { link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::Tipc, bearer: Some("eth:eth0".to_string()), ..Default::default() }], }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { assert!(bond.options.0.is_empty()); } } #[test] fn test_team_full_deserialization() { let xml = r#" 5 3 100 2 50 any
02:00:00:00:00:01
by_active 100 10 192.168.1.1 192.168.1.100 true false false 5 10
"#; let mut deserializer = quick_xml::de::Deserializer::from_str(xml); let team: Team = Team::deserialize(&mut deserializer).unwrap(); assert_eq!(team.debug_level, Some(5)); assert_eq!(team.notify_peers.as_ref().unwrap().count, Some(3)); assert_eq!(team.notify_peers.as_ref().unwrap().interval, Some(100)); assert_eq!(team.mcast_rejoin.as_ref().unwrap().count, Some(2)); assert_eq!(team.mcast_rejoin.as_ref().unwrap().interval, Some(50)); assert_eq!(team.link_watch_policy.as_ref().unwrap(), "any"); assert_eq!(team.address.as_ref().unwrap(), "02:00:00:00:00:01"); let runner = team.runner.as_ref().unwrap(); assert_eq!(runner.name, RunnerName::ActiveBackup); assert_eq!( runner.hwaddr_policy.as_ref().unwrap(), &HwAddrPolicy::ByActive ); let link_watch = team.link_watch.as_ref().unwrap(); assert_eq!(link_watch.watches.len(), 1); let watch = &link_watch.watches[0]; assert_eq!(watch.name, WatchName::ArpPing); assert_eq!(watch.interval, 100); assert_eq!(watch.init_wait, 10); assert_eq!(watch.target_host.as_ref().unwrap(), "192.168.1.1"); assert_eq!(watch.source_host.as_ref().unwrap(), "192.168.1.100"); assert_eq!(watch.validate_active, Some(true)); assert_eq!(watch.validate_inactive, Some(false)); assert_eq!(watch.send_always, Some(false)); assert_eq!(watch.missed_max, 5); assert_eq!(watch.vlanid, Some(10)); } #[test] fn test_multiple_link_watches() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::Ethtool, delay_up: 100, delay_down: 200, ..Default::default() }, Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("10.0.0.1".to_string()), ..Default::default() }, ], }), ..Default::default() }; let config: ConnectionConfig = (&team).into(); if let ConnectionConfig::Bond(bond) = config { // Bond only supports one monitoring method - ethtool (miimon) is preferred assert_eq!(bond.options.0.get("miimon").unwrap(), "100"); assert_eq!(bond.options.0.get("updelay").unwrap(), "100"); assert_eq!(bond.options.0.get("downdelay").unwrap(), "200"); // arp_interval should NOT be set (bond can't use both) assert!(bond.options.0.get("arp_interval").is_none()); assert!(bond.options.0.get("arp_ip_target").is_none()); } } #[test] fn test_warnings_tracking() { // Test that unsupported features generate warnings let team_with_warnings = Team { link_watch_policy: Some("any".to_string()), mcast_rejoin: Some(McastRejoin { count: Some(3), interval: Some(100), }), runner: Some(Runner { name: RunnerName::Random, ..Default::default() }), link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 100, target_host: Some("192.168.1.1".to_string()), source_host: Some("192.168.1.100".to_string()), init_wait: 50, send_always: Some(true), missed_max: 3, vlanid: Some(100), ..Default::default() }, Watch { name: WatchName::NsnaPing, interval: 100, target_host: Some("fe80::1".to_string()), ..Default::default() }, Watch { name: WatchName::Tipc, bearer: Some("eth:eth0".to_string()), ..Default::default() }, ], }), ..Default::default() }; let (_, has_warnings) = team_with_warnings.to_connection_config(); assert!(has_warnings, "Expected warnings for unsupported features"); // Test that supported features don't generate warnings let team_without_warnings = Team { runner: Some(Runner { name: RunnerName::Lacp, select_policy: SelectPolicy::Bandwidth, ..Default::default() }), link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::Ethtool, delay_up: 10, delay_down: 20, ..Default::default() }], }), ..Default::default() }; let (_, has_warnings) = team_without_warnings.to_connection_config(); assert!(!has_warnings, "Expected no warnings for supported features"); } #[test] fn test_multiple_arp_ping_targets() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), validate_active: Some(true), validate_inactive: Some(false), ..Default::default() }, Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("8.8.8.8".to_string()), validate_active: Some(true), validate_inactive: Some(false), ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!( !has_warnings, "Same interval and validation should not warn" ); if let ConnectionConfig::Bond(bond) = config { // Both targets should be combined into comma-separated list assert_eq!( bond.options.0.get("arp_ip_target").unwrap(), "192.168.1.1,8.8.8.8" ); assert_eq!(bond.options.0.get("arp_interval").unwrap(), "1000"); assert_eq!(bond.options.0.get("arp_validate").unwrap(), "active"); } } #[test] fn test_multiple_arp_ping_different_intervals() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), missed_max: 3, ..Default::default() }, Watch { name: WatchName::ArpPing, interval: 2000, target_host: Some("8.8.8.8".to_string()), missed_max: 5, ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!( has_warnings, "Different intervals and missed_max should warn" ); if let ConnectionConfig::Bond(bond) = config { // Should use first interval and first missed_max assert_eq!(bond.options.0.get("arp_interval").unwrap(), "1000"); assert_eq!(bond.options.0.get("arp_missed_max").unwrap(), "3"); assert_eq!( bond.options.0.get("arp_ip_target").unwrap(), "192.168.1.1,8.8.8.8" ); } } #[test] fn test_multiple_arp_ping_different_validation() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), validate_active: Some(true), validate_inactive: Some(false), ..Default::default() }, Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("8.8.8.8".to_string()), validate_active: Some(true), validate_inactive: Some(true), ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(has_warnings, "Different validation settings should warn"); if let ConnectionConfig::Bond(bond) = config { // Should use first validation setting assert_eq!(bond.options.0.get("arp_validate").unwrap(), "active"); assert_eq!( bond.options.0.get("arp_ip_target").unwrap(), "192.168.1.1,8.8.8.8" ); } } #[test] fn test_single_ethtool_no_warnings() { let team = Team { link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::Ethtool, delay_up: 10, delay_down: 20, ..Default::default() }], }), ..Default::default() }; let (_, has_warnings) = team.to_connection_config(); assert!(!has_warnings, "Single ethtool should not warn"); } #[test] fn test_single_arp_ping_no_warnings() { let team = Team { link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), missed_max: 5, ..Default::default() }], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(!has_warnings, "Single arp_ping should not warn"); if let ConnectionConfig::Bond(bond) = config { assert_eq!(bond.options.0.get("arp_interval").unwrap(), "1000"); assert_eq!(bond.options.0.get("arp_ip_target").unwrap(), "192.168.1.1"); assert_eq!(bond.options.0.get("arp_missed_max").unwrap(), "5"); } } #[test] fn test_ethtool_and_arp_ping_warns() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::Ethtool, delay_up: 10, ..Default::default() }, Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(has_warnings, "Both ethtool and arp_ping should warn"); if let ConnectionConfig::Bond(bond) = config { // Should use ethtool (miimon), not arp_ping assert!(bond.options.0.get("miimon").is_some()); assert!(bond.options.0.get("arp_interval").is_none()); } } #[test] fn test_ethtool_and_nsna_warns() { testing_logger::setup(); let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::Ethtool, delay_up: 10, ..Default::default() }, Watch { name: WatchName::NsnaPing, interval: 1000, ..Default::default() }, ], }), ..Default::default() }; let (_, has_warnings) = team.to_connection_config(); assert!(has_warnings, "nsna_ping should warn"); testing_logger::validate(|captured_logs| { assert!(captured_logs .iter() .any(|log| log.body.contains("nsna_ping"))); }); } #[test] fn test_arp_ping_and_tipc_warns() { testing_logger::setup(); let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::ArpPing, interval: 1000, target_host: Some("192.168.1.1".to_string()), ..Default::default() }, Watch { name: WatchName::Tipc, bearer: Some("eth:eth0".to_string()), ..Default::default() }, ], }), ..Default::default() }; let (_, has_warnings) = team.to_connection_config(); assert!(has_warnings, "tipc should warn"); testing_logger::validate(|captured_logs| { assert!(captured_logs.iter().any(|log| log.body.contains("tipc"))); }); } #[test] fn test_multiple_ethtool_uses_first() { let team = Team { link_watch: Some(LinkWatch { watches: vec![ Watch { name: WatchName::Ethtool, delay_up: 10, delay_down: 20, ..Default::default() }, Watch { name: WatchName::Ethtool, delay_up: 30, delay_down: 40, ..Default::default() }, ], }), ..Default::default() }; let (config, has_warnings) = team.to_connection_config(); assert!(!has_warnings, "Multiple ethtool watches should not warn"); if let ConnectionConfig::Bond(bond) = config { // Should use first ethtool watch assert_eq!(bond.options.0.get("miimon").unwrap(), "10"); // GCD(10, 20) = 10 assert_eq!(bond.options.0.get("updelay").unwrap(), "10"); assert_eq!(bond.options.0.get("downdelay").unwrap(), "20"); } } #[test] fn test_miimon_gcd_calculation() { // Test GCD calculation for miimon let test_cases = vec![ (15, 25, "5"), // GCD(15, 25) = 5 (10, 20, "10"), // GCD(10, 20) = 10 (100, 200, "100"), // GCD(100, 200) = 100 (7, 13, "1"), // GCD(7, 13) = 1 (coprime) (0, 50, "50"), // Only delay_down (50, 0, "50"), // Only delay_up (0, 0, "100"), // No delays, use default ]; for (delay_up, delay_down, expected_miimon) in test_cases { let team = Team { link_watch: Some(LinkWatch { watches: vec![Watch { name: WatchName::Ethtool, delay_up, delay_down, ..Default::default() }], }), ..Default::default() }; let (config, _) = team.to_connection_config(); if let ConnectionConfig::Bond(bond) = config { assert_eq!( bond.options.0.get("miimon").unwrap(), expected_miimon, "Failed for delay_up={}, delay_down={}", delay_up, delay_down ); } } } } 07070100000010000081A40000000000000000000000016A032DB60000045E000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/src/tuntap.rsuse agama_network::model; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] #[serde(default)] pub struct Tun { pub owner: Option, pub group: Option, } #[skip_serializing_none] #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] #[serde(default)] pub struct Tap { pub owner: Option, pub group: Option, } impl From<&Tun> for model::ConnectionConfig { fn from(tuntap: &Tun) -> model::ConnectionConfig { model::ConnectionConfig::Tun(model::TunConfig { mode: model::TunMode::Tun, group: tuntap.group.map(|v| v.to_string()), owner: tuntap.owner.map(|v| v.to_string()), }) } } impl From<&Tap> for model::ConnectionConfig { fn from(tuntap: &Tap) -> model::ConnectionConfig { model::ConnectionConfig::Tun(model::TunConfig { mode: model::TunMode::Tap, group: tuntap.group.map(|v| v.to_string()), owner: tuntap.owner.map(|v| v.to_string()), }) } } 07070100000011000081A40000000000000000000000016A032DB600000B2C000000000000000000000000000000000000001C00000000wicked2nm-1.5.0/src/vlan.rsuse agama_network::model; use serde::{Deserialize, Serialize}; use serde_with::{skip_serializing_none, DeserializeFromStr, SerializeDisplay}; use strum_macros::{Display, EnumString}; #[derive( Debug, Clone, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Default, )] #[strum(serialize_all = "kebab_case")] pub enum WickedVlanProtocol { #[default] #[strum(serialize = "ieee802-1Q")] Ieee802_1Q, Ieee802Ad, } #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Vlan { pub device: String, pub address: Option, #[serde(default)] pub protocol: WickedVlanProtocol, pub tag: u16, } impl From<&Vlan> for model::ConnectionConfig { fn from(vlan: &Vlan) -> model::ConnectionConfig { model::ConnectionConfig::Vlan(model::VlanConfig { parent: vlan.device.clone(), id: (vlan.tag as u32), protocol: (&vlan.protocol).into(), }) } } impl From<&WickedVlanProtocol> for model::VlanProtocol { fn from(v: &WickedVlanProtocol) -> model::VlanProtocol { match v { WickedVlanProtocol::Ieee802_1Q => model::VlanProtocol::IEEE802_1Q, WickedVlanProtocol::Ieee802Ad => model::VlanProtocol::IEEE802_1ad, } } } #[cfg(test)] mod tests { use super::*; use crate::interface::*; use crate::MIGRATION_SETTINGS; #[allow(dead_code)] fn setup_default_migration_settings() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); } #[test] fn test_vlan_protocol() { setup_default_migration_settings(); let v: WickedVlanProtocol = Default::default(); assert_eq!(v, WickedVlanProtocol::Ieee802_1Q); assert_eq!(v.to_string(), String::from("ieee802-1Q")); let v = WickedVlanProtocol::Ieee802Ad; assert_eq!(v.to_string(), String::from("ieee802-ad")); } #[test] fn test_vlan_interface() { setup_default_migration_settings(); let vlan_interface = Interface { vlan: Some(Vlan { device: String::from("en0"), tag: 10, protocol: WickedVlanProtocol::Ieee802Ad, address: Some(String::from("02:11:22:33:44:55")), }), ..Default::default() }; let ifc = vlan_interface.to_connection(&None); assert!(ifc.is_ok()); let ifc = &ifc.unwrap().connections[0]; assert!(matches!(ifc.config, model::ConnectionConfig::Vlan(_))); if let model::ConnectionConfig::Vlan(v) = &ifc.config { assert_eq!(v.id, 10); assert_eq!(v.protocol, model::VlanProtocol::IEEE802_1ad); assert_eq!(v.parent, "en0"); } assert_eq!(ifc.custom_mac_address.to_string(), "02:11:22:33:44:55"); } } 07070100000012000081A40000000000000000000000016A032DB600006B09000000000000000000000000000000000000002000000000wicked2nm-1.5.0/src/wireless.rsuse crate::MIGRATION_SETTINGS; use agama_network::model::{self, WEPAuthAlg, WEPKeyType, WEPSecurity}; use agama_network::types::SSID; use anyhow::anyhow; use macaddr::MacAddr6; use serde::{Deserialize, Deserializer, Serialize}; use serde_with::formats::CommaSeparator; use serde_with::StringWithSeparator; use serde_with::{serde_as, skip_serializing_none, DeserializeFromStr, SerializeDisplay}; use std::str::FromStr; use strum_macros::{Display, EnumString}; #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Wireless { #[serde(rename = "ap-scan")] pub ap_scan: u32, #[serde(default)] #[serde(deserialize_with = "unwrap_wireless_networks")] pub networks: Option>, } #[serde_as] #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct Network { pub essid: String, #[serde(rename = "scan-ssid")] pub scan_ssid: bool, pub mode: WickedWirelessMode, #[serde(rename = "wpa-psk")] pub wpa_psk: Option, #[serde(default)] #[serde(rename = "key-management")] #[serde_as(as = "StringWithSeparator::")] pub key_management: Vec, pub channel: Option, #[serde(rename = "access-point")] pub access_point: Option, pub wep: Option, #[serde(rename = "wpa-eap")] pub wpa_eap: Option, } #[derive(Default, Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab-case")] pub enum WickedWirelessMode { AdHoc = 0, #[default] Infrastructure = 1, AP = 2, } impl From<&WickedWirelessMode> for model::WirelessMode { fn from(value: &WickedWirelessMode) -> Self { match value { WickedWirelessMode::AdHoc => model::WirelessMode::AdHoc, WickedWirelessMode::Infrastructure => model::WirelessMode::Infra, WickedWirelessMode::AP => model::WirelessMode::AP, } } } #[serde_as] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct WpaPsk { pub passphrase: String, #[serde(rename = "auth-proto", skip_serializing_if = "Vec::is_empty", default)] #[serde_as(as = "StringWithSeparator::")] pub auth_proto: Vec, #[serde( rename = "pairwise-cipher", skip_serializing_if = "Vec::is_empty", default )] #[serde_as(as = "StringWithSeparator::")] pub pairwise_cipher: Vec, #[serde( rename = "group-cipher", skip_serializing_if = "Vec::is_empty", default )] #[serde_as(as = "StringWithSeparator::")] pub group_cipher: Vec, pub pmf: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Wep { #[serde(rename = "auth-algo")] pub auth_algo: String, #[serde(rename = "default-key")] pub default_key: u32, pub key: Vec, } #[serde_as] #[derive(Debug, PartialEq, Serialize, Deserialize, Default)] pub struct WpaEap { pub method: WickedEapMethods, pub identity: Option, pub phase1: Option, pub phase2: Option, pub anonid: Option, pub tls: Option, #[serde(rename = "auth-proto", skip_serializing_if = "Vec::is_empty", default)] #[serde_as(as = "StringWithSeparator::")] pub auth_proto: Vec, #[serde( rename = "pairwise-cipher", skip_serializing_if = "Vec::is_empty", default )] #[serde_as(as = "StringWithSeparator::")] pub pairwise_cipher: Vec, #[serde( rename = "group-cipher", skip_serializing_if = "Vec::is_empty", default )] #[serde_as(as = "StringWithSeparator::")] pub group_cipher: Vec, pub pmf: Option, } impl TryFrom<&WpaEap> for model::IEEE8021XConfig { type Error = anyhow::Error; fn try_from(value: &WpaEap) -> Result { let eap: Vec = vec![value.method.try_into()?]; let mut config = model::IEEE8021XConfig { eap, identity: value.identity.clone(), anonymous_identity: value.anonid.clone(), ..Default::default() }; if let Some(phase1) = &value.phase1 { if let Some(peap_label) = phase1.peap_label { config.peap_label = peap_label; } if let Some(peap_version) = phase1.peap_version { config.peap_version = Some(peap_version.to_string()); } } if let Some(phase2) = &value.phase2 { if let Some(method) = phase2.method { config.phase2_auth = Some(method.try_into()?); } if let Some(password) = &phase2.password { config.password = Some(password.to_string()); } } if let Some(tls) = &value.tls { if let Some(ca_cert) = &tls.ca_cert { config.ca_cert = Some(wicked_cert_to_path(ca_cert)?); } if let Some(client_cert) = &tls.client_cert { config.client_cert = Some(wicked_cert_to_path(client_cert)?); } if let Some(client_key) = &tls.client_key { config.private_key = Some(wicked_cert_to_path(client_key)?); } config.private_key_password = tls.client_key_passwd.clone(); } Ok(config) } } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Phase1 { #[serde(rename = "peap-version")] pub peap_version: Option, #[serde(rename = "peap-label")] pub peap_label: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Phase2 { pub method: Option, pub password: Option, } #[derive( Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Clone, Copy, )] #[strum(serialize_all = "lowercase")] pub enum Pmf { Disabled = 1, Optional = 2, Required = 3, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "snake_case")] pub enum EapAuthProto { Wpa, Rsn, } impl From<&EapAuthProto> for model::WPAProtocolVersion { fn from(value: &EapAuthProto) -> Self { match value { EapAuthProto::Wpa => Self::Wpa, EapAuthProto::Rsn => Self::Rsn, } } } #[derive( Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display, Clone, Copy, Default, )] #[strum(serialize_all = "snake_case")] pub enum WickedEapMethods { Wpa, #[default] None, Md5, Tls, Pap, Chap, Mschap, Mschapv2, Peap, Ttls, Gtc, Otp, Leap, Psk, Pax, Sake, Gpsk, Wsc, Ikev2, Tnc, Fast, Aka, AkaPrime, Sim, } impl TryFrom for model::EAPMethod { type Error = anyhow::Error; fn try_from(value: WickedEapMethods) -> Result { match value { WickedEapMethods::Leap => Ok(Self::LEAP), WickedEapMethods::Md5 => Ok(Self::MD5), WickedEapMethods::Tls => Ok(Self::TLS), WickedEapMethods::Peap => Ok(Self::PEAP), WickedEapMethods::Ttls => Ok(Self::TTLS), WickedEapMethods::Fast => Ok(Self::FAST), _ => Err(anyhow!("Invalid EAP (outer) method")), } } } impl TryFrom for model::Phase2AuthMethod { type Error = anyhow::Error; fn try_from(value: WickedEapMethods) -> Result { match value { WickedEapMethods::Pap => Ok(Self::PAP), WickedEapMethods::Chap => Ok(Self::CHAP), WickedEapMethods::Mschap => Ok(Self::MSCHAP), WickedEapMethods::Mschapv2 => Ok(Self::MSCHAPV2), WickedEapMethods::Gtc => Ok(Self::GTC), WickedEapMethods::Otp => Ok(Self::OTP), WickedEapMethods::Md5 => Ok(Self::MD5), WickedEapMethods::Tls => Ok(Self::TLS), _ => Err(anyhow!("Invalid phase 2 (inner) method")), } } } #[allow(non_camel_case_types)] #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "SCREAMING-KEBAB-CASE")] pub enum EapPairwiseCipher { Tkip, Ccmp, Ccmp_256, Gcmp, Gcmp_256, } impl TryFrom<&EapPairwiseCipher> for model::PairwiseAlgorithm { type Error = anyhow::Error; fn try_from(value: &EapPairwiseCipher) -> Result { match value { EapPairwiseCipher::Ccmp => Ok(Self::Ccmp), EapPairwiseCipher::Tkip => Ok(Self::Tkip), _ => Err(anyhow!("EAP pairwise chipher not supported, leaving empty")), } } } #[allow(non_camel_case_types)] #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "SCREAMING-KEBAB-CASE")] pub enum EapGroupCipher { Tkip, Ccmp, Ccmp_256, Gcmp, Gcmp_256, Wep104, Wep40, } impl TryFrom<&EapGroupCipher> for model::GroupAlgorithm { type Error = anyhow::Error; fn try_from(value: &EapGroupCipher) -> Result { match value { EapGroupCipher::Ccmp => Ok(Self::Ccmp), EapGroupCipher::Tkip => Ok(Self::Tkip), EapGroupCipher::Wep104 => Ok(Self::Wep104), EapGroupCipher::Wep40 => Ok(Self::Wep40), _ => Err(anyhow!("EAP group cipher not supported, leaving empty")), } } } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct EapTLS { #[serde(rename = "ca-cert")] pub ca_cert: Option, #[serde(rename = "client-cert")] pub client_cert: Option, #[serde(rename = "client-key")] pub client_key: Option, #[serde(rename = "client-key-passwd")] pub client_key_passwd: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct WickedCertificate { #[serde(rename = "$value")] pub cert: String, #[serde(rename = "@type")] pub cert_type: WickedCertType, } #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "lowercase")] pub enum WickedCertType { Path, File, Hex, } fn wicked_cert_to_path(wicked_cert: &WickedCertificate) -> Result { if wicked_cert.cert_type == WickedCertType::Hex { return Err(anyhow!("Hex certificate type is currently not supported")); } else if wicked_cert.cert_type == WickedCertType::File { log::info!("Certificate type 'file' may not work as intended"); } Ok(wicked_cert.cert.clone()) } fn common_settings_to_config( auth_protos: &[EapAuthProto], pairwise_ciphers: &[EapPairwiseCipher], group_ciphers: &[EapGroupCipher], pmf: &Option, config: &mut model::WirelessConfig, ) { config.wpa_protocol_versions = auth_protos .iter() .map(|x| x.into()) .collect::>(); let mut pairwise_algorithms: Vec = vec![]; for pairwise_cipher in pairwise_ciphers { match model::PairwiseAlgorithm::try_from(pairwise_cipher) { Ok(algo) => pairwise_algorithms.push(algo), Err(e) => { log::info!("{e}"); pairwise_algorithms = vec![]; break; } } } config.pairwise_algorithms = pairwise_algorithms; let mut group_algorithms: Vec = vec![]; for group_cipher in group_ciphers { match model::GroupAlgorithm::try_from(group_cipher) { Ok(algo) => group_algorithms.push(algo), Err(e) => { log::info!("{e}"); group_algorithms = vec![]; break; } } } config.group_algorithms = group_algorithms; if let Some(pmf) = pmf { config.pmf = *pmf as i32; } } fn unwrap_wireless_networks<'de, D>(deserializer: D) -> Result>, D::Error> where D: Deserializer<'de>, { #[derive(Debug, PartialEq, Default, Serialize, Deserialize)] struct Networks { network: Vec, } Ok(Some(Networks::deserialize(deserializer)?.network)) } fn all(array: &[String], needle: &[&str]) -> bool { if array.is_empty() { return false; } array.iter().all(|x| needle.iter().any(|&y| x == y)) } fn any(array: &[String], needle: &[&str]) -> bool { if array.is_empty() { return false; } array.iter().any(|x| needle.iter().any(|&y| x == y)) } fn guess_wireless_security_protocol( network: &Network, ) -> Result { let mgmt = &network.key_management; let result = if any(mgmt, &["wpa-eap", "wpa-eap-sha256"]) { model::SecurityProtocol::WPA2Enterprise } else if any(mgmt, &["wpa-eap-suite-b-192", "wpa-eap-suite-b"]) { model::SecurityProtocol::WPA3Only } else if any(mgmt, &["wpa-psk", "wpa-psk-sha256"]) { model::SecurityProtocol::WPA2 } else if any(mgmt, &["sae", "ft-sae"]) { model::SecurityProtocol::WPA3Personal } else if any(mgmt, &["owe"]) { model::SecurityProtocol::OWE } else if any(mgmt, &["none"]) { model::SecurityProtocol::WEP } else if network.wpa_eap.is_some() { model::SecurityProtocol::WPA2Enterprise } else if network.wpa_psk.is_some() { model::SecurityProtocol::WPA2 } else { model::SecurityProtocol::WEP }; log::warn!( "Unsupported key-management protocol(s) '{}' guessing '{}'", mgmt.join(","), result ); Ok(result) } fn wireless_security_protocol(network: &Network) -> Result { let mgmt = &network.key_management; if all(mgmt, &["sae", "ft-sae"]) { Ok(model::SecurityProtocol::WPA3Personal) } else if all(mgmt, &["wpa-psk", "wpa-psk-sha256", "sae", "ft-sae"]) { Ok(model::SecurityProtocol::WPA2) } else if all(mgmt, &["wpa-eap-suite-b-192", "wpa-eap-suite-b"]) { Ok(model::SecurityProtocol::WPA3Only) } else if all( mgmt, &[ "wpa-eap", "wpa-eap-sha256", "wpa-eap-suite-b-192", "wpa-eap-suite-b", ], ) { Ok(model::SecurityProtocol::WPA2Enterprise) } else if all(mgmt, &["owe"]) { Ok(model::SecurityProtocol::OWE) } else if all(mgmt, &["none"]) { Ok(model::SecurityProtocol::WEP) } else if mgmt.is_empty() { if network.wpa_eap.is_some() { Ok(model::SecurityProtocol::WPA2Enterprise) } else if network.wpa_psk.is_some() { Ok(model::SecurityProtocol::WPA2) } else { Ok(model::SecurityProtocol::WEP) } } else { Err(anyhow!( "Unrecognized key-management protocol(s): {}", mgmt.join(",") )) } } impl TryFrom<&Network> for model::ConnectionConfig { type Error = anyhow::Error; fn try_from(network: &Network) -> Result { let settings = MIGRATION_SETTINGS.get().unwrap(); let mut config = model::WirelessConfig { ssid: SSID(network.essid.as_bytes().to_vec()), hidden: network.scan_ssid, ..Default::default() }; let mut sec = wireless_security_protocol(network); if sec.is_err() && settings.continue_migration { sec = guess_wireless_security_protocol(network); } config.security = sec?; if let Some(wpa_psk) = &network.wpa_psk { config.password = Some(wpa_psk.passphrase.clone()); common_settings_to_config( &wpa_psk.auth_proto, &wpa_psk.pairwise_cipher, &wpa_psk.group_cipher, &wpa_psk.pmf, &mut config, ); } if let Some(channel) = network.channel { config.channel = channel; if channel <= 14 { config.band = Some(model::WirelessBand::BG); } else { config.band = Some(model::WirelessBand::A); } log::warn!( "NetworkManager requires setting a band for wireless when a channel is set. The band has been set to \"{}\". This may in certain regions be incorrect.", config.band.unwrap() ); } if let Some(access_point) = &network.access_point { config.bssid = Some(MacAddr6::from_str(access_point)?); } if let Some(wep) = &network.wep { // filter out `s:`, `h:`, `:`, and `-` of wep keys let keys: Vec = wep .key .clone() .into_iter() .map(|mut x| { x = x.replace("s:", ""); x = x.replace("h:", ""); x = x.replace(':', ""); x.replace('-', "") }) .collect(); let wep_security = WEPSecurity { auth_alg: WEPAuthAlg::try_from(wep.auth_algo.as_str())?, wep_key_type: WEPKeyType::Key, keys, wep_key_index: wep.default_key, }; config.wep_security = Some(wep_security); } if let Some(wpa_eap) = &network.wpa_eap { common_settings_to_config( &wpa_eap.auth_proto, &wpa_eap.pairwise_cipher, &wpa_eap.group_cipher, &wpa_eap.pmf, &mut config, ); } config.mode = (&network.mode).into(); Ok(model::ConnectionConfig::Wireless(config)) } } #[cfg(test)] mod tests { use super::*; use crate::interface::*; use crate::MIGRATION_SETTINGS; #[allow(dead_code)] fn setup_default_migration_settings() { let _ = MIGRATION_SETTINGS.set(crate::MigrationSettings::default()); } #[test] fn test_wireless_bands() { setup_default_migration_settings(); let mut wireless_interface = Interface { wireless: Some(Wireless { networks: Some(vec![Network { channel: Some(0), essid: "testssid".to_string(), scan_ssid: false, mode: WickedWirelessMode::AP, wpa_psk: None, key_management: vec!["wpa-psk".to_string()], access_point: None, wep: None, wpa_eap: None, }]), ap_scan: 0, }), ..Default::default() }; let connections = wireless_interface.to_connection(&None); assert!(connections.is_ok()); let connection = &connections.unwrap().connections[0]; let model::ConnectionConfig::Wireless(wireless) = &connection.config else { panic!() }; assert_eq!(wireless.band, Some("bg".try_into().unwrap())); wireless_interface .wireless .as_mut() .unwrap() .networks .as_mut() .unwrap()[0] .channel = Some(32); let ifc = wireless_interface.to_connection(&None); assert!(ifc.is_ok()); let ifc = &ifc.unwrap().connections[0]; let model::ConnectionConfig::Wireless(wireless) = &ifc.config else { panic!() }; assert_eq!(wireless.band, Some("a".try_into().unwrap())); } #[test] fn test_wireless_migration() { setup_default_migration_settings(); let wireless_interface = Interface { wireless: Some(Wireless { networks: Some(vec![Network { essid: "testssid".to_string(), scan_ssid: true, mode: WickedWirelessMode::Infrastructure, wpa_psk: Some(WpaPsk { passphrase: "testpassword".to_string(), ..Default::default() }), key_management: vec!["wpa-psk".to_string()], channel: Some(14), access_point: Some("12:34:56:78:9A:BC".to_string()), wep: Some(Wep { auth_algo: "open".to_string(), default_key: 1, key: vec!["01020304ff".to_string(), "s:hello".to_string()], }), wpa_eap: None, }]), ap_scan: 0, }), ..Default::default() }; let connections = wireless_interface.to_connection(&None); assert!(connections.is_ok()); let connection = &connections.unwrap().connections[0]; let model::ConnectionConfig::Wireless(wireless) = &connection.config else { panic!() }; assert_eq!(wireless.ssid, SSID("testssid".as_bytes().to_vec())); assert!(wireless.hidden); assert_eq!(wireless.mode, model::WirelessMode::Infra); assert_eq!(wireless.password, Some("testpassword".to_string())); assert_eq!(wireless.security, model::SecurityProtocol::WPA2); assert_eq!( wireless.bssid, Some(MacAddr6::from_str("12:34:56:78:9A:BC").unwrap()) ); assert_eq!( wireless.wep_security, Some(WEPSecurity { auth_alg: WEPAuthAlg::Open, wep_key_type: WEPKeyType::Key, keys: vec!["01020304ff".to_string(), "hello".to_string()], wep_key_index: 1, }) ); assert_eq!(wireless.band, Some("bg".try_into().unwrap())); } #[test] fn wireless_security_protocol_strict() { setup_default_migration_settings(); let mut net = Network { ..Default::default() }; net.key_management = vec![]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WEP ); net.key_management = vec![]; net.wpa_eap = Some(WpaEap { ..Default::default() }); assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2Enterprise ); net.wpa_eap = None; net.wpa_psk = Some(WpaPsk { ..Default::default() }); assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2 ); net.wpa_psk = None; net.key_management = vec!["wpa-psk".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2 ); net.key_management = vec!["sae".to_string(), "wpa-psk".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2 ); net.key_management = vec!["sae".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA3Personal ); net.key_management = vec!["wpa-eap".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2Enterprise ); net.key_management = vec!["wpa-eap".to_string(), "wpa-eap-suite-b".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2Enterprise ); net.key_management = vec!["wpa-eap-suite-b".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA3Only ); net.key_management = vec!["owe".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::OWE ); net.key_management = vec!["none".to_string()]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WEP ); net.key_management = vec!["none".to_string(), "wpa-psk".to_string()]; assert!(wireless_security_protocol(&net).is_err()); net.key_management = vec!["wpa-eap".to_string(), "wpa-psk".to_string()]; assert!(wireless_security_protocol(&net).is_err()); net.key_management = vec!["wpa-eap".to_string(), "sae".to_string()]; assert!(wireless_security_protocol(&net).is_err()); net.key_management = vec!["wpa-eap-suite-b".to_string(), "sae".to_string()]; assert!(wireless_security_protocol(&net).is_err()); net.key_management = vec!["wpa-eap-suite-b".to_string(), "owe".to_string()]; assert!(wireless_security_protocol(&net).is_err()); net.key_management = vec!["wpa-psk".to_string(), "owe".to_string()]; assert!(wireless_security_protocol(&net).is_err()); } #[test] fn wireless_security_protocol_continue_migration() { setup_default_migration_settings(); let mut net = Network { ..Default::default() }; net.key_management = vec![]; assert_eq!( wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WEP ); net.key_management = vec![]; net.wpa_eap = Some(WpaEap { ..Default::default() }); net.key_management = vec!["none".to_string(), "wpa-psk".to_string()]; assert_eq!( guess_wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2 ); net.key_management = vec!["wpa-eap".to_string(), "wpa-psk".to_string()]; assert_eq!( guess_wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2Enterprise ); net.key_management = vec!["wpa-eap".to_string(), "sae".to_string()]; assert_eq!( guess_wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2Enterprise ); net.key_management = vec!["wpa-eap-suite-b".to_string(), "sae".to_string()]; assert_eq!( guess_wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA3Only ); net.key_management = vec!["wpa-eap-suite-b".to_string(), "owe".to_string()]; assert_eq!( guess_wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA3Only ); net.key_management = vec!["wpa-psk".to_string(), "owe".to_string()]; assert_eq!( guess_wireless_security_protocol(&net).unwrap(), model::SecurityProtocol::WPA2 ); } } 07070100000013000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001600000000wicked2nm-1.5.0/tests07070100000014000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/autoconnect07070100000015000081A40000000000000000000000016A032DB60000003B000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/autoconnect/ENVW2NM_WITHOUT_NETCONFIG=true W2NM_ACTIVATE_CONNECTIONS=true 07070100000016000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/autoconnect/system-connections07070100000017000081A40000000000000000000000016A032DB6000000CF000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/autoconnect/system-connections/eth9.nmconnection[connection] id=eth9 uuid=da886e32-22a9-4d83-8c04-421ec59d274b type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000018000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/autoconnect/wicked_xml07070100000019000081A40000000000000000000000016A032DB600000147000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/autoconnect/wicked_xml/autoconnect.xml eth9 boot true prefer-public false 0707010000001A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001D00000000wicked2nm-1.5.0/tests/autoip0707010000001B000081A40000000000000000000000016A032DB600000024000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/autoip/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig 0707010000001C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/autoip/netconfig0707010000001D000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/autoip/netconfig/config0707010000001E000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/autoip/netconfig/dhcp0707010000001F000081A40000000000000000000000016A032DB600000020000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/autoip/netconfig/ifcfg-en5STARTMODE=auto BOOTPROTO=autoip 07070100000020000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/autoip/system-connections07070100000021000081A40000000000000000000000016A032DB600000106000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/autoip/system-connections/en5.nmconnection[connection] id=en5 uuid=988c43ec-efc3-449d-bee0-e7ecc42c840a type=ethernet interface-name=en5 [ethernet] [match] [ipv4] ignore-auto-dns=true link-local=1 method=link-local [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000022000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/autoip/wicked_xml07070100000023000081A40000000000000000000000016A032DB600000158000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/autoip/wicked_xml/config.xml en5 boot true true true prefer-public 07070100000024000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/autoip_fallback07070100000025000081A40000000000000000000000016A032DB600000038000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/autoip_fallback/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 07070100000026000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/autoip_fallback/netconfig07070100000027000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/autoip_fallback/netconfig/config07070100000028000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/autoip_fallback/netconfig/dhcpDHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 07070100000029000081A40000000000000000000000016A032DB600000025000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/autoip_fallback/netconfig/ifcfg-en5STARTMODE=auto BOOTPROTO=dhcp+autoip 0707010000002A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/autoip_fallback/system-connections0707010000002B000081A40000000000000000000000016A032DB6000001DD000000000000000000000000000000000000004A00000000wicked2nm-1.5.0/tests/autoip_fallback/system-connections/en5.nmconnection[connection] id=en5 uuid=1ea32b91-40ed-4f57-87fd-93f572c9d8bf type=ethernet interface-name=en5 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true link-local=4 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 0707010000002C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/autoip_fallback/wicked_xml0707010000002D000081A40000000000000000000000016A032DB6000003AA000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/autoip_fallback/wicked_xml/config.xml en5 boot true true group,primary default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false true fallback true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false 0707010000002E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/autoip_fallback20707010000002F000081A40000000000000000000000016A032DB600000038000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/autoip_fallback2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.52 07070100000030000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/autoip_fallback2/netconfig07070100000031000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/autoip_fallback2/netconfig/config07070100000032000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/autoip_fallback2/netconfig/dhcp07070100000033000081A40000000000000000000000016A032DB600000025000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/autoip_fallback2/netconfig/ifcfg-en5STARTMODE=auto BOOTPROTO=dhcp+autoip 07070100000034000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/autoip_fallback2/system-connections07070100000035000081A40000000000000000000000016A032DB600000175000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/autoip_fallback2/system-connections/en5.nmconnection[connection] id=en5 uuid=cce4bb0d-657c-473f-8215-37d7893a73fd type=ethernet interface-name=en5 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true link-local=3 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000036000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/autoip_fallback2/wicked_xml07070100000037000081A40000000000000000000000016A032DB600000399000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/autoip_fallback2/wicked_xml/config.xml en5 boot true true group,primary default-route,dns,nis,ntp,nds,mtu,tz,boot true false true fallback true prefer-public true group dns,nis,ntp,tz,boot auto true true false false 07070100000038000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/bond_active-backup07070100000039000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/bond_active-backup/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 0707010000003A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/bond_active-backup/netconfig0707010000003B000081A40000000000000000000000016A032DB60000001A000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/bond_active-backup/netconfig/configCHECK_DUPLICATE_IP="yes" 0707010000003C000081A40000000000000000000000016A032DB600000071000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/bond_active-backup/netconfig/dhcpDHCLIENT_WAIT_AT_BOOT="15" DHCLIENT6_WAIT_AT_BOOT="15" DHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 0707010000003D000081A40000000000000000000000016A032DB6000000CD000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/bond_active-backup/netconfig/ifcfg-bond0STARTMODE=auto BOOTPROTO=dhcp BONDING_MASTER=yes BONDING_SLAVE_1=en0 BONDING_SLAVE_2=en1 BONDING_MODULE_OPTS='mode=active-backup miimon=100 primary=en0' LLADDR='02:00:33:44:55:11' FIREWALL=yes ZONE=public 0707010000003E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/bond_active-backup/system-connections0707010000003F000081A40000000000000000000000016A032DB600000255000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/bond_active-backup/system-connections/bond0.nmconnection[connection] id=bond0 uuid=17e25c83-3b11-49d1-9096-38e97c0fd065 type=bond autoconnect-ports=1 interface-name=bond0 zone=public [ethernet] cloned-mac-address=02:00:33:44:55:11 [bond] miimon=100 mode=active-backup primary=en0 use_carrier=1 [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000040000081A40000000000000000000000016A032DB600000094000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/bond_active-backup/system-connections/en0.nmconnection[connection] id=en0 uuid=38d979e6-aa0e-4bae-8cff-a6dda281d0c7 type=ethernet controller=bond0 interface-name=en0 port-type=bond [ethernet] [match] 07070100000041000081A40000000000000000000000016A032DB600000094000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/bond_active-backup/system-connections/en1.nmconnection[connection] id=en1 uuid=9269bbb4-a771-406f-ba66-3f65ed15634c type=ethernet controller=bond0 interface-name=en1 port-type=bond [ethernet] [match] 07070100000042000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/bond_active-backup/wicked_xml07070100000043000081A40000000000000000000000016A032DB600000766000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/bond_active-backup/wicked_xml/config.xml bond0 boot public active-backup 100 netif en0
02:00:33:44:55:11
true true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot 15 true false true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true 15 true false false
en0 hotplug bond0 false false en1 hotplug bond0 false false 07070100000044000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/bond_active-backup207070100000045000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/bond_active-backup2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.46 07070100000046000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/bond_active-backup2/netconfig07070100000047000081A40000000000000000000000016A032DB60000001A000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/bond_active-backup2/netconfig/configCHECK_DUPLICATE_IP="yes" 07070100000048000081A40000000000000000000000016A032DB600000038000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/bond_active-backup2/netconfig/dhcpDHCLIENT_WAIT_AT_BOOT="15" DHCLIENT6_WAIT_AT_BOOT="15" 07070100000049000081A40000000000000000000000016A032DB6000000CD000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/bond_active-backup2/netconfig/ifcfg-bond0STARTMODE=auto BOOTPROTO=dhcp BONDING_MASTER=yes BONDING_SLAVE_1=en0 BONDING_SLAVE_2=en1 BONDING_MODULE_OPTS='mode=active-backup miimon=100 primary=en0' LLADDR='02:00:33:44:55:11' FIREWALL=yes ZONE=public 0707010000004A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/bond_active-backup2/system-connections0707010000004B000081A40000000000000000000000016A032DB6000001EE000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/bond_active-backup2/system-connections/bond0.nmconnection[connection] id=bond0 uuid=17e25c83-3b11-49d1-9096-38e97c0fd065 type=bond autoconnect-slaves=1 interface-name=bond0 zone=public [ethernet] cloned-mac-address=02:00:33:44:55:11 [bond] miimon=100 mode=active-backup primary=en0 use_carrier=1 [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 0707010000004C000081A40000000000000000000000016A032DB600000091000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/bond_active-backup2/system-connections/en0.nmconnection[connection] id=en0 uuid=38d979e6-aa0e-4bae-8cff-a6dda281d0c7 type=ethernet interface-name=en0 master=bond0 slave-type=bond [ethernet] [match] 0707010000004D000081A40000000000000000000000016A032DB600000091000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/bond_active-backup2/system-connections/en1.nmconnection[connection] id=en1 uuid=9269bbb4-a771-406f-ba66-3f65ed15634c type=ethernet interface-name=en1 master=bond0 slave-type=bond [ethernet] [match] 0707010000004E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/bond_active-backup2/wicked_xml0707010000004F000081A40000000000000000000000016A032DB600000757000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/bond_active-backup2/wicked_xml/config.xml bond0 boot public active-backup 100 netif en0
02:00:33:44:55:11
true true true group default-route,dns,nis,ntp,nds,mtu,tz,boot 15 true false true prefer-public true group dns,nis,ntp,tz,boot auto true 15 true false false
en0 hotplug bond0 false false en1 hotplug bond0 false false 07070100000050000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/bond_ieee802_3ad07070100000051000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.46 07070100000052000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/netconfig07070100000053000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/netconfig/config07070100000054000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/netconfig/dhcp07070100000055000081A40000000000000000000000016A032DB600000108000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/netconfig/ifcfg-bond0STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.161.72.11/24' IPADDR6='2620:113:80c0:8200::11/64' BONDING_MASTER='yes' BONDING_SLAVE_0='sfp1' BONDING_SLAVE_1='sfp2' BONDING_MODULE_OPTS='mode=802.3ad miimon=100 xmit_hash_policy=layer2+3' LLADDR='3c:fd:fe:a5:be:cc' 07070100000056000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/system-connections07070100000057000081A40000000000000000000000016A032DB6000001B4000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/system-connections/bond0.nmconnection[connection] id=bond0 uuid=099bb601-dc24-4111-a5c0-f0d947033f46 type=bond autoconnect-ports=1 interface-name=bond0 [ethernet] cloned-mac-address=3C:FD:FE:A5:BE:CC [bond] miimon=100 mode=802.3ad use_carrier=1 xmit_hash_policy=layer2+3 [match] [ipv4] address1=10.161.72.11/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default address1=2620:113:80c0:8200::11/64 ignore-auto-dns=true ip6-privacy=1 method=manual [proxy] 07070100000058000081A40000000000000000000000016A032DB600000096000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/system-connections/sfp1.nmconnection[connection] id=sfp1 uuid=43fb1e44-9f5c-43f1-9372-9c0f42eb3473 type=ethernet controller=bond0 interface-name=sfp1 port-type=bond [ethernet] [match] 07070100000059000081A40000000000000000000000016A032DB600000096000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/system-connections/sfp2.nmconnection[connection] id=sfp2 uuid=2a076505-fbc4-4edf-a934-8fb0e835a9ac type=ethernet controller=bond0 interface-name=sfp2 port-type=bond [ethernet] [match] 0707010000005A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/wicked_xml0707010000005B000081A40000000000000000000000016A032DB600000580000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad/wicked_xml/config.xml bond0 boot ieee802-3ad 100 netif layer23
3c:fd:fe:a5:be:cc
true
10.161.72.11/24
true prefer-public
2620:113:80c0:8200::11/64
sfp1 hotplug bond0 false false sfp2 hotplug bond0 false false 0707010000005C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/bond_ieee802_3ad20707010000005D000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.46 0707010000005E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/netconfig0707010000005F000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/netconfig/config07070100000060000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/netconfig/dhcp07070100000061000081A40000000000000000000000016A032DB600000108000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/netconfig/ifcfg-bond0STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.161.72.11/24' IPADDR6='2620:113:80c0:8200::11/64' BONDING_MASTER='yes' BONDING_SLAVE_0='sfp1' BONDING_SLAVE_1='sfp2' BONDING_MODULE_OPTS='mode=802.3ad miimon=100 xmit_hash_policy=layer2+3' LLADDR='3c:fd:fe:a5:be:cc' 07070100000062000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/system-connections07070100000063000081A40000000000000000000000016A032DB6000001B5000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/system-connections/bond0.nmconnection[connection] id=bond0 uuid=099bb601-dc24-4111-a5c0-f0d947033f46 type=bond autoconnect-slaves=1 interface-name=bond0 [ethernet] cloned-mac-address=3C:FD:FE:A5:BE:CC [bond] miimon=100 mode=802.3ad use_carrier=1 xmit_hash_policy=layer2+3 [match] [ipv4] address1=10.161.72.11/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default address1=2620:113:80c0:8200::11/64 ignore-auto-dns=true ip6-privacy=1 method=manual [proxy] 07070100000064000081A40000000000000000000000016A032DB600000093000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/system-connections/sfp1.nmconnection[connection] id=sfp1 uuid=43fb1e44-9f5c-43f1-9372-9c0f42eb3473 type=ethernet interface-name=sfp1 master=bond0 slave-type=bond [ethernet] [match] 07070100000065000081A40000000000000000000000016A032DB600000093000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/system-connections/sfp2.nmconnection[connection] id=sfp2 uuid=2a076505-fbc4-4edf-a934-8fb0e835a9ac type=ethernet interface-name=sfp2 master=bond0 slave-type=bond [ethernet] [match] 07070100000066000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/wicked_xml07070100000067000081A40000000000000000000000016A032DB600000583000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/bond_ieee802_3ad2/wicked_xml/config.xml bond0 boot ieee802-3ad 100 netif layer23
3c:fd:fe:a5:be:cc
true
10.161.72.11/24
true prefer-public
2620:113:80c0:8200::11/64
sfp1 hotplug bond0 false false sfp2 hotplug bond0 false false 07070100000068000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/bridge107070100000069000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/bridge1/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.46 0707010000006A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/bridge1/netconfig0707010000006B000081A40000000000000000000000016A032DB60000001A000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/bridge1/netconfig/configCHECK_DUPLICATE_IP="yes" 0707010000006C000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/bridge1/netconfig/dhcp0707010000006D000081A40000000000000000000000016A032DB600000112000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/bridge1/netconfig/ifcfg-br0STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.0.0.1/24' BRIDGE='yes' BRIDGE_STP='off' BRIDGE_PRIORITY="5" BRIDGE_FORWARDDELAY='3.2' BRIDGE_HELLOTIME="1.1" BRIDGE_AGEINGTIME="1.2" BRIDGE_MAXAGE="40.3" BRIDGE_PORTS='en0 en1' BRIDGE_PORTPRIORITIES="9 0" BRIDGE_PATHCOSTS="2" 0707010000006E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/bridge1/system-connections0707010000006F000081A40000000000000000000000016A032DB600000171000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/bridge1/system-connections/br0.nmconnection[connection] id=br0 uuid=c1960284-68f5-4294-b1b7-f865ac5a4994 type=bridge autoconnect-ports=1 interface-name=br0 [ethernet] [bridge] ageing-time=1 forward-delay=3 hello-time=1 max-age=40 priority=5 stp=false [match] [ipv4] address1=10.0.0.1/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000070000081A40000000000000000000000016A032DB6000000BA000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/bridge1/system-connections/en0.nmconnection[connection] id=en0 uuid=4c941c30-b610-470a-b24a-5a6c73ab6710 type=ethernet controller=br0 interface-name=en0 port-type=bridge [ethernet] [bridge-port] path-cost=2 priority=9 [match] 07070100000071000081A40000000000000000000000016A032DB6000000AE000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/bridge1/system-connections/en1.nmconnection[connection] id=en1 uuid=f760dace-c275-4983-ab36-51c8e9642dfc type=ethernet controller=br0 interface-name=en1 port-type=bridge [ethernet] [bridge-port] priority=0 [match] 07070100000072000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/bridge1/wicked_xml07070100000073000081A40000000000000000000000016A032DB600000558000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/bridge1/wicked_xml/config.xml br0 boot false 5 3.20 1.20 1.10 40.30 true true
10.0.0.1/24
true prefer-public
en0 hotplug br0 9 2 false false en1 hotplug br0 0 false false 07070100000074000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/bridge207070100000075000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/bridge2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.46 07070100000076000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/bridge2/netconfig07070100000077000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/bridge2/netconfig/config07070100000078000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/bridge2/netconfig/dhcp07070100000079000081A40000000000000000000000016A032DB6000000CC000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/bridge2/netconfig/ifcfg-br99STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.161.72.11/24' IPADDR6='2620:113:80c0:8200::11/64' LLADDR='3c:fd:fe:a5:be:cc' BRIDGE='yes' BRIDGE_STP='off' BRIDGE_FORWARDDELAY='0' BRIDGE_PORTS='eth8 eth9' 0707010000007A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/bridge2/system-connections0707010000007B000081A40000000000000000000000016A032DB600000190000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/bridge2/system-connections/br99.nmconnection[connection] id=br99 uuid=bbd5f9fa-7905-4d8e-a319-34cbb4b77872 type=bridge autoconnect-ports=1 interface-name=br99 [ethernet] cloned-mac-address=3C:FD:FE:A5:BE:CC [bridge] forward-delay=0 stp=false [match] [ipv4] address1=10.161.72.11/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default address1=2620:113:80c0:8200::11/64 ignore-auto-dns=true ip6-privacy=1 method=manual [proxy] 0707010000007C000081A40000000000000000000000016A032DB6000000A6000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/bridge2/system-connections/eth8.nmconnection[connection] id=eth8 uuid=18cb882a-33ef-49ac-a9dd-151a9e014fb1 type=ethernet controller=br99 interface-name=eth8 port-type=bridge [ethernet] [bridge-port] [match] 0707010000007D000081A40000000000000000000000016A032DB6000000A6000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/bridge2/system-connections/eth9.nmconnection[connection] id=eth9 uuid=faea58e2-d243-4a36-a40d-897c3741e7c9 type=ethernet controller=br99 interface-name=eth9 port-type=bridge [ethernet] [bridge-port] [match] 0707010000007E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/bridge2/wicked_xml0707010000007F000081A40000000000000000000000016A032DB6000004ED000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/bridge2/wicked_xml/config.xml br99 boot false 0.00
3c:fd:fe:a5:be:cc
true
10.161.72.11/24
true prefer-public
2620:113:80c0:8200::11/64
eth8 hotplug br99 false false eth9 hotplug br99 false false 07070100000080000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/bridge307070100000081000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/bridge3/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.46 07070100000082000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/bridge3/netconfig07070100000083000081A40000000000000000000000016A032DB60000001A000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/bridge3/netconfig/configCHECK_DUPLICATE_IP="yes" 07070100000084000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/bridge3/netconfig/dhcp07070100000085000081A40000000000000000000000016A032DB600000112000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/bridge3/netconfig/ifcfg-br0STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.0.0.1/24' BRIDGE='yes' BRIDGE_STP='off' BRIDGE_PRIORITY="5" BRIDGE_FORWARDDELAY='3.2' BRIDGE_HELLOTIME="1.1" BRIDGE_AGEINGTIME="1.2" BRIDGE_MAXAGE="40.3" BRIDGE_PORTS='en0 en1' BRIDGE_PORTPRIORITIES="9 0" BRIDGE_PATHCOSTS="2" 07070100000086000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/bridge3/system-connections07070100000087000081A40000000000000000000000016A032DB600000172000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/bridge3/system-connections/br0.nmconnection[connection] id=br0 uuid=c1960284-68f5-4294-b1b7-f865ac5a4994 type=bridge autoconnect-slaves=1 interface-name=br0 [ethernet] [bridge] ageing-time=1 forward-delay=3 hello-time=1 max-age=40 priority=5 stp=false [match] [ipv4] address1=10.0.0.1/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000088000081A40000000000000000000000016A032DB6000000B7000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/bridge3/system-connections/en0.nmconnection[connection] id=en0 uuid=4c941c30-b610-470a-b24a-5a6c73ab6710 type=ethernet interface-name=en0 master=br0 slave-type=bridge [ethernet] [bridge-port] path-cost=2 priority=9 [match] 07070100000089000081A40000000000000000000000016A032DB6000000AB000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/bridge3/system-connections/en1.nmconnection[connection] id=en1 uuid=f760dace-c275-4983-ab36-51c8e9642dfc type=ethernet interface-name=en1 master=br0 slave-type=bridge [ethernet] [bridge-port] priority=0 [match] 0707010000008A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/bridge3/wicked_xml0707010000008B000081A40000000000000000000000016A032DB600000558000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/bridge3/wicked_xml/config.xml br0 boot false 5 3.20 1.20 1.10 40.30 true true
10.0.0.1/24
true prefer-public
en0 hotplug br0 9 2 false false en1 hotplug br0 0 false false 0707010000008C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/bridge40707010000008D000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/bridge4/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.46 0707010000008E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/bridge4/netconfig0707010000008F000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/bridge4/netconfig/config07070100000090000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/bridge4/netconfig/dhcp07070100000091000081A40000000000000000000000016A032DB6000000CC000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/bridge4/netconfig/ifcfg-br99STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.161.72.11/24' IPADDR6='2620:113:80c0:8200::11/64' LLADDR='3c:fd:fe:a5:be:cc' BRIDGE='yes' BRIDGE_STP='off' BRIDGE_FORWARDDELAY='0' BRIDGE_PORTS='eth8 eth9' 07070100000092000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/bridge4/system-connections07070100000093000081A40000000000000000000000016A032DB600000191000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/bridge4/system-connections/br99.nmconnection[connection] id=br99 uuid=bbd5f9fa-7905-4d8e-a319-34cbb4b77872 type=bridge autoconnect-slaves=1 interface-name=br99 [ethernet] cloned-mac-address=3C:FD:FE:A5:BE:CC [bridge] forward-delay=0 stp=false [match] [ipv4] address1=10.161.72.11/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default address1=2620:113:80c0:8200::11/64 ignore-auto-dns=true ip6-privacy=1 method=manual [proxy] 07070100000094000081A40000000000000000000000016A032DB6000000A3000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/bridge4/system-connections/eth8.nmconnection[connection] id=eth8 uuid=18cb882a-33ef-49ac-a9dd-151a9e014fb1 type=ethernet interface-name=eth8 master=br99 slave-type=bridge [ethernet] [bridge-port] [match] 07070100000095000081A40000000000000000000000016A032DB6000000A3000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/bridge4/system-connections/eth9.nmconnection[connection] id=eth9 uuid=faea58e2-d243-4a36-a40d-897c3741e7c9 type=ethernet interface-name=eth9 master=br99 slave-type=bridge [ethernet] [bridge-port] [match] 07070100000096000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/bridge4/wicked_xml07070100000097000081A40000000000000000000000016A032DB6000004ED000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/bridge4/wicked_xml/config.xml br99 boot false 0.00
3c:fd:fe:a5:be:cc
true
10.161.72.11/24
true prefer-public
2620:113:80c0:8200::11/64
eth8 hotplug br99 false false eth9 hotplug br99 false false 07070100000098000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/broadcast07070100000099000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/broadcast/ENVW2NM_WITHOUT_NETCONFIG=true 0707010000009A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/broadcast/netconfig0707010000009B000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/broadcast/netconfig/config0707010000009C000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/broadcast/netconfig/dhcp0707010000009D000081A40000000000000000000000016A032DB600000041000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/broadcast/netconfig/ifcfg-eth9BOOTPROTO=static IPADDR=192.168.99.5/24 BROADCAST=192.168.99.255 0707010000009E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/broadcast/system-connections0707010000009F000081A40000000000000000000000016A032DB6000000F8000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/broadcast/system-connections/eth9.nmconnection[connection] id=eth9 uuid=2536f14e-1c4c-42c9-af23-d37b275c0706 type=ethernet autoconnect=false interface-name=eth9 [ethernet] [match] [ipv4] address1=192.168.99.5/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000000A0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/broadcast/wicked_xml070701000000A1000081A40000000000000000000000016A032DB6000001B5000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/broadcast/wicked_xml/config.xml eth9 manual true
192.168.99.5/24 192.168.99.255
true prefer-public
070701000000A2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/dhcp4_client_id070701000000A3000081A40000000000000000000000016A032DB600000013000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/dhcp4_client_id/ENVNM_VERSION_ge=1.52 070701000000A4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig070701000000A5000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/config070701000000A6000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/dhcpDHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 070701000000A7000081A40000000000000000000000016A032DB600000045000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/ifcfg-eth5BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CLIENT_ID="52:54:00:dc:8e:94" 070701000000A8000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/ifcfg-eth6BOOTPROTO=dhcp STARTMODE=auto 070701000000A9000081A40000000000000000000000016A032DB60000003C000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/ifcfg-eth7BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CREATE_CID="disable" 070701000000AA000081A40000000000000000000000016A032DB60000003C000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/ifcfg-eth8BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CREATE_CID="rfc2132" 070701000000AB000081A40000000000000000000000016A032DB60000003C000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/netconfig/ifcfg-eth9BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CREATE_CID="rfc4361" 070701000000AC000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/dhcp4_client_id/system-connections070701000000AD000081A40000000000000000000000016A032DB6000001D0000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/system-connections/eth5.nmconnection[connection] id=eth5 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth5 [ethernet] [match] [ipv4] dhcp-client-id=52:54:00:dc:8e:94 dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000AE000081A40000000000000000000000016A032DB6000001C8000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/system-connections/eth6.nmconnection[connection] id=eth6 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth6 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000AF000081A40000000000000000000000016A032DB6000001C3000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/system-connections/eth7.nmconnection[connection] id=eth7 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth7 [ethernet] [match] [ipv4] dhcp-client-id=none dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000B0000081A40000000000000000000000016A032DB6000001C2000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/system-connections/eth8.nmconnection[connection] id=eth8 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth8 [ethernet] [match] [ipv4] dhcp-client-id=mac dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000B1000081A40000000000000000000000016A032DB6000001C8000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/dhcp4_client_id/system-connections/eth9.nmconnection[connection] id=eth9 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000B2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/dhcp4_client_id/wicked_xml070701000000B3000081A40000000000000000000000016A032DB600001127000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp4_client_id/wicked_xml/config.xml eth6 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false eth5 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false 52:54:00:dc:8e:94 true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false eth9 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false rfc4361 true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false eth7 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false disable true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false eth8 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false rfc2132 true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false 070701000000B4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/dhcp4_client_id2070701000000B5000081A40000000000000000000000016A032DB600000013000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/ENVNM_VERSION_lt=1.52 070701000000B6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig070701000000B7000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/config070701000000B8000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/dhcp070701000000B9000081A40000000000000000000000016A032DB600000045000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/ifcfg-eth5BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CLIENT_ID="52:54:00:dc:8e:94" 070701000000BA000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/ifcfg-eth6BOOTPROTO=dhcp STARTMODE=auto 070701000000BB000081A40000000000000000000000016A032DB60000003C000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/ifcfg-eth7BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CREATE_CID="disable" 070701000000BC000081A40000000000000000000000016A032DB60000003C000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/ifcfg-eth8BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CREATE_CID="rfc2132" 070701000000BD000081A40000000000000000000000016A032DB60000003C000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/netconfig/ifcfg-eth9BOOTPROTO=dhcp STARTMODE=auto DHCLIENT_CREATE_CID="rfc4361" 070701000000BE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/system-connections070701000000BF000081A40000000000000000000000016A032DB600000168000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/system-connections/eth5.nmconnection[connection] id=eth5 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth5 [ethernet] [match] [ipv4] dhcp-client-id=52:54:00:dc:8e:94 dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000C0000081A40000000000000000000000016A032DB600000160000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/system-connections/eth6.nmconnection[connection] id=eth6 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth6 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000C1000081A40000000000000000000000016A032DB60000015B000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/system-connections/eth7.nmconnection[connection] id=eth7 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth7 [ethernet] [match] [ipv4] dhcp-client-id=none dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000C2000081A40000000000000000000000016A032DB60000015A000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/system-connections/eth8.nmconnection[connection] id=eth8 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth8 [ethernet] [match] [ipv4] dhcp-client-id=mac dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000C3000081A40000000000000000000000016A032DB600000160000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/system-connections/eth9.nmconnection[connection] id=eth9 uuid=00000000-0000-0000-0000-000000000000 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000C4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/dhcp4_client_id2/wicked_xml070701000000C5000081A40000000000000000000000016A032DB6000010D2000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/dhcp4_client_id2/wicked_xml/config.xml eth6 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group dns,nis,ntp,tz,boot auto true true false false eth5 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false 52:54:00:dc:8e:94 true prefer-public true group dns,nis,ntp,tz,boot auto true true false false eth9 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false rfc4361 true prefer-public true group dns,nis,ntp,tz,boot auto true true false false eth7 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false disable true prefer-public true group dns,nis,ntp,tz,boot auto true true false false eth8 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false rfc2132 true prefer-public true group dns,nis,ntp,tz,boot auto true true false false 070701000000C6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/dhcp4_default_route070701000000C7000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/dhcp4_default_route/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 070701000000C8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/dhcp4_default_route/netconfig070701000000C9000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_default_route/netconfig/config070701000000CA000081A40000000000000000000000016A032DB60000005B000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/dhcp4_default_route/netconfig/dhcpDHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" DHCLIENT_SET_DEFAULT_ROUTE="no" 070701000000CB000081A40000000000000000000000016A032DB60000003F000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/dhcp4_default_route/netconfig/ifcfg-eth10STARTMODE=auto BOOTPROTO=dhcp DHCLIENT_SET_DEFAULT_ROUTE="yes" 070701000000CC000081A40000000000000000000000016A032DB600000036000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/dhcp4_default_route/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp IPADDR=192.168.2.123/24 070701000000CD000081A40000000000000000000000016A032DB6000000A0000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/dhcp4_default_route/netconfig/routes192.168.2.0/24 - - eth9 10.23.2.0 192.168.2.200 255.255.255.0 eth9 default 192.168.2.1 eth9 070701000000CE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/dhcp4_default_route/system-connections070701000000CF000081A40000000000000000000000016A032DB6000001D4000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/dhcp4_default_route/system-connections/eth10.nmconnection[connection] id=eth10 uuid=620219d9-75b4-41db-a1d9-45e3f58fbc8e type=ethernet interface-name=eth10 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000000D0000081A40000000000000000000000016A032DB600000254000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/dhcp4_default_route/system-connections/eth9.nmconnection[connection] id=eth9 uuid=3ad50746-c80f-4375-b7a7-aeb9a880a3d7 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] address1=192.168.2.123/24 dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true method=auto never-default=true route1=192.168.2.0/24 route2=10.23.2.0/24,192.168.2.200 route3=0.0.0.0/0,192.168.2.1 [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000000D1000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/dhcp4_default_route/wicked_xml070701000000D2000081A40000000000000000000000016A032DB600000864000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/dhcp4_default_route/wicked_xml/config.xml eth9 boot true true group hostname,dns,nis,ntp,nds,mtu,tz,boot true false
192.168.2.123/24
192.168.2.0/24 10.23.2.0/24 192.168.2.200 0.0.0.0/0 192.168.2.1
true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false
eth10 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false 070701000000D3000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/dhcp_and_static_ip070701000000D4000081A40000000000000000000000016A032DB600000013000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/ENVNM_VERSION_ge=1.52 070701000000D5000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/netconfig070701000000D6000081A40000000000000000000000016A032DB60000003D000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/netconfig/configDHCLIENT_HOSTNAME_OPTION=AUTO DHCLIENT6_HOSTNAME_OPTION=AUTO 070701000000D7000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/netconfig/dhcpDHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 070701000000D8000081A40000000000000000000000016A032DB600000095000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp IPADDR_0=192.168.99.24/24 IPADDR_1=192.168.100.24/24 IPADDR_2=fd00::192:168:99:24/64 IPADDR_3=fd00::192:168:100:24/64 070701000000D9000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/system-connections070701000000DA000081A40000000000000000000000016A032DB60000023E000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/system-connections/eth9.nmconnection[connection] id=eth9 uuid=5b638b23-00c3-4ed4-94b5-81c806af7585 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] address1=192.168.99.24/24 address2=192.168.100.24/24 dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default address1=fd00::192:168:99:24/64 address2=fd00::192:168:100:24/64 dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 070701000000DB000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/wicked_xml070701000000DC000081A40000000000000000000000016A032DB6000004AE000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/dhcp_and_static_ip/wicked_xml/config.xml eth9 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false
192.168.99.24/24
192.168.100.24/24
true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false
fd00::192:168:99:24/64
fd00::192:168:100:24/64
070701000000DD000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001C00000000wicked2nm-1.5.0/tests/dummy070701000000DE000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/dummy/ENVW2NM_WITHOUT_NETCONFIG=true 070701000000DF000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/dummy/system-connections070701000000E0000081A40000000000000000000000016A032DB60000012F000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/dummy/system-connections/dummy0.nmconnection[connection] id=dummy0 uuid=d5c90a99-bde4-4c92-884c-d8208d8fb6da type=dummy interface-name=dummy0 [ethernet] cloned-mac-address=12:34:56:78:9A:BC [dummy] [match] [ipv4] address1=10.0.0.100/24 method=manual [ipv6] addr-gen-mode=default address1=2001:db8:1::1/64 ip6-privacy=1 method=manual [proxy] 070701000000E1000081A40000000000000000000000016A032DB60000010A000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/dummy/system-connections/dummy1.nmconnection[connection] id=dummy1 uuid=b551cd5a-d139-4297-a79f-d7dd33a97879 type=dummy interface-name=dummy1 [ethernet] [dummy] [match] [ipv4] address1=10.0.0.101/24 method=manual [ipv6] addr-gen-mode=default address1=2001:db8:1::2/64 ip6-privacy=1 method=manual [proxy] 070701000000E2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/dummy/wicked_xml070701000000E3000081A40000000000000000000000016A032DB600000495000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/dummy/wicked_xml/dummy.xml dummy0 boot
12:34:56:78:9A:BC
true
10.0.0.100/24
true prefer-public false
2001:db8:1::1/64
dummy1 boot true
10.0.0.101/24
true prefer-public false
2001:db8:1::2/64
070701000000E4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/ethernet_mac_address070701000000E5000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ethernet_mac_address/ENVW2NM_WITHOUT_NETCONFIG=true 070701000000E6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/ethernet_mac_address/system-connections070701000000E7000081A40000000000000000000000016A032DB60000010C000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/ethernet_mac_address/system-connections/eth8.nmconnection[connection] id=eth8 uuid=4935f592-3e86-491b-847b-2ce4f180001c type=ethernet interface-name=eth8 [ethernet] cloned-mac-address=12:34:56:78:9A:BC [match] [ipv4] address1=192.168.100.5/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000000E8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ethernet_mac_address/wicked_xml070701000000E9000081A40000000000000000000000016A032DB600000227000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/ethernet_mac_address/wicked_xml/ipv4_static.xml eth8 boot
12:34:56:78:9a:bc
true true
192.168.100.5/24
true prefer-public false
070701000000EA000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/firewall_zone070701000000EB000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/firewall_zone/ENVW2NM_WITHOUT_NETCONFIG=true 070701000000EC000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/firewall_zone/system-connections070701000000ED000081A40000000000000000000000016A032DB6000000D0000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/firewall_zone/system-connections/eth8.nmconnection[connection] id=eth8 uuid=17dad0f7-8cad-411a-9ae4-af22f8feb67c type=ethernet interface-name=eth8 zone=topsecret [ethernet] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 070701000000EE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/firewall_zone/wicked_xml070701000000EF000081A40000000000000000000000016A032DB6000000D3000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/firewall_zone/wicked_xml/firewall_zone.xml eth8 boot topsecret 070701000000F0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001F00000000wicked2nm-1.5.0/tests/hostname070701000000F1000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/hostname/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 070701000000F2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/hostname/netconfig070701000000F3000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/hostname/netconfig/config070701000000F4000081A40000000000000000000000016A032DB60000008E000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/hostname/netconfig/dhcpDHCLIENT_HOSTNAME_OPTION=test-hostname-v4 DHCLIENT6_HOSTNAME_OPTION=test-hostname-v6 DHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 070701000000F5000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/hostname/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 070701000000F6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/hostname/system-connections070701000000F7000081A40000000000000000000000016A032DB6000001C8000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/hostname/system-connections/eth9.nmconnection[connection] id=eth9 uuid=34bf6f22-3770-4071-acb7-e7987d3e68af type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-hostname=test-hostname-v4 dhcp-iaid=mac dhcp-send-hostname=1 dhcp-send-release=0 ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-hostname=test-hostname-v6 dhcp-iaid=mac dhcp-send-hostname=1 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000000F8000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/hostname/system-connections/lo.nmconnection[connection] id=lo uuid=bc3985a9-38c6-4fee-a125-4bce7fc00322 type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 070701000000F9000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/hostname/wicked_xml070701000000FA000081A40000000000000000000000016A032DB60000039C000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/hostname/wicked_xml/config.xml eth9 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot test-hostname-v4 true false true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true test-hostname-v6 true false false 070701000000FB000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/hostname2070701000000FC000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/hostname2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 070701000000FD000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/hostname2/netconfig070701000000FE000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/hostname2/netconfig/config070701000000FF000081A40000000000000000000000016A032DB60000006E000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/hostname2/netconfig/dhcpDHCLIENT_HOSTNAME_OPTION= DHCLIENT6_HOSTNAME_OPTION= DHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 07070100000100000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/hostname2/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 07070100000101000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/hostname2/system-connections07070100000102000081A40000000000000000000000016A032DB6000001D2000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/hostname2/system-connections/eth9.nmconnection[connection] id=eth9 uuid=8b05ac79-3c20-4147-8324-d3afc262159a type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000103000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/hostname2/system-connections/lo.nmconnection[connection] id=lo uuid=c3185cb3-4a60-4620-8640-831d500c5eac type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 07070100000104000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/hostname2/wicked_xml07070100000105000081A40000000000000000000000016A032DB600000349000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/hostname2/wicked_xml/config.xml eth9 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false 07070100000106000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/hostname307070100000107000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/hostname3/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.52 07070100000108000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/hostname3/netconfig07070100000109000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/hostname3/netconfig/config0707010000010A000081A40000000000000000000000016A032DB600000055000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/hostname3/netconfig/dhcpDHCLIENT_HOSTNAME_OPTION=test-hostname-v4 DHCLIENT6_HOSTNAME_OPTION=test-hostname-v6 0707010000010B000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/hostname3/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 0707010000010C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/hostname3/system-connections0707010000010D000081A40000000000000000000000016A032DB600000176000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/hostname3/system-connections/eth9.nmconnection[connection] id=eth9 uuid=34bf6f22-3770-4071-acb7-e7987d3e68af type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-hostname=test-hostname-v4 dhcp-iaid=mac ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-hostname=test-hostname-v6 dhcp-iaid=mac ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 0707010000010E000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/hostname3/system-connections/lo.nmconnection[connection] id=lo uuid=bc3985a9-38c6-4fee-a125-4bce7fc00322 type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 0707010000010F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/hostname3/wicked_xml07070100000110000081A40000000000000000000000016A032DB60000038B000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/hostname3/wicked_xml/config.xml eth9 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot test-hostname-v4 true false true prefer-public true group dns,nis,ntp,tz,boot auto true test-hostname-v6 true false false 07070100000111000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/hostname407070100000112000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/hostname4/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.52 07070100000113000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/hostname4/netconfig07070100000114000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/hostname4/netconfig/config07070100000115000081A40000000000000000000000016A032DB600000035000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/hostname4/netconfig/dhcpDHCLIENT_HOSTNAME_OPTION= DHCLIENT6_HOSTNAME_OPTION= 07070100000116000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/hostname4/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 07070100000117000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/hostname4/system-connections07070100000118000081A40000000000000000000000016A032DB60000016A000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/hostname4/system-connections/eth9.nmconnection[connection] id=eth9 uuid=8b05ac79-3c20-4147-8324-d3afc262159a type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000119000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/hostname4/system-connections/lo.nmconnection[connection] id=lo uuid=c3185cb3-4a60-4620-8640-831d500c5eac type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 0707010000011A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/hostname4/wicked_xml0707010000011B000081A40000000000000000000000016A032DB600000337000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/hostname4/wicked_xml/config.xml eth9 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group dns,nis,ntp,tz,boot auto true true false false 0707010000011C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001F00000000wicked2nm-1.5.0/tests/ifsysctl0707010000011D000081A40000000000000000000000016A032DB60000003A000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/ifsysctl/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig TEST_EXPECT_FAIL=true 0707010000011E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/ifsysctl/netconfig0707010000011F000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/ifsysctl/netconfig/config07070100000120000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/ifsysctl/netconfig/dhcp07070100000121000081A40000000000000000000000016A032DB600000021000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/ifsysctl/netconfig/ifsysctlnet.ipv4.conf.all.forwarding = 1 07070100000122000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/ifsysctl/wicked_xml07070100000123000081A40000000000000000000000016A032DB600000345000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ifsysctl/wicked_xml/config.xml en0 boot true true true false
192.168.2.2/24
true true true prefer-public router fail-address random fe:dead::beaf
fc00:dead:beaf::1/64
07070100000124000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/ifsysctl207070100000125000081A40000000000000000000000016A032DB60000003A000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/ifsysctl2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig TEST_EXPECT_FAIL=true 07070100000126000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/ifsysctl2/netconfig07070100000127000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ifsysctl2/netconfig/config07070100000128000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ifsysctl2/netconfig/dhcp07070100000129000081A40000000000000000000000016A032DB600000021000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/ifsysctl2/netconfig/ifsysctl-en0net.ipv4.conf.all.forwarding = 1 0707010000012A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/ifsysctl2/wicked_xml0707010000012B000081A40000000000000000000000016A032DB600000345000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ifsysctl2/wicked_xml/config.xml en0 boot true true true false
192.168.2.2/24
true true true prefer-public router fail-address random fe:dead::beaf
fc00:dead:beaf::1/64
0707010000012C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/ifsysctl30707010000012D000081A40000000000000000000000016A032DB600000024000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/ifsysctl3/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig 0707010000012E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/ifsysctl3/netconfig0707010000012F000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ifsysctl3/netconfig/config07070100000130000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ifsysctl3/netconfig/dhcp07070100000131000081A40000000000000000000000016A032DB600000021000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/ifsysctl3/netconfig/ifsysctl-en0.baknet.ipv4.conf.all.forwarding = 1 07070100000132000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ifsysctl3/system-connections07070100000133000081A40000000000000000000000016A032DB60000012D000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/ifsysctl3/system-connections/en0.nmconnection[connection] id=en0 uuid=9948be5b-4f80-4bcb-a1ed-de2dfb9f9f4a type=ethernet interface-name=en0 [ethernet] [match] [ipv4] address1=192.168.2.2/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default address1=fc00:dead:beaf::1/64 ignore-auto-dns=true ip6-privacy=1 method=manual [proxy] 07070100000134000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/ifsysctl3/wicked_xml07070100000135000081A40000000000000000000000016A032DB600000345000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ifsysctl3/wicked_xml/config.xml en0 boot true true true false
192.168.2.2/24
true true true prefer-public router fail-address random fe:dead::beaf
fc00:dead:beaf::1/64
07070100000136000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/infiniband07070100000137000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/infiniband/ENVW2NM_CONTINUE_MIGRATION=true W2NM_WITHOUT_NETCONFIG=true 07070100000138000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/infiniband/system-connections07070100000139000081A40000000000000000000000016A032DB600000101000000000000000000000000000000000000004A00000000wicked2nm-1.5.0/tests/infiniband/system-connections/ib0.8001.nmconnection[connection] id=ib0.8001 uuid=9b67f665-65f9-46a5-a8f2-312a25c76848 type=infiniband interface-name=ib0.8001 [infiniband] p-key=32769 parent=ib0 transport-mode=connected [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000013A000081A40000000000000000000000016A032DB600000100000000000000000000000000000000000000004A00000000wicked2nm-1.5.0/tests/infiniband/system-connections/ib0.8002.nmconnection[connection] id=ib0.8002 uuid=01ee4005-008c-487e-a288-13bc1aca0d71 type=infiniband interface-name=ib0.8002 [infiniband] p-key=32770 parent=ib0 transport-mode=datagram [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000013B000081A40000000000000000000000016A032DB6000000DF000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/infiniband/system-connections/ib0.nmconnection[connection] id=ib0 uuid=e700a7e8-3598-4554-a8d8-8f1f494573f7 type=infiniband interface-name=ib0 [infiniband] transport-mode=datagram [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000013C000081A40000000000000000000000016A032DB6000000DF000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/infiniband/system-connections/ib1.nmconnection[connection] id=ib1 uuid=d0364ba4-f028-42b1-9bfd-c584db341c59 type=infiniband interface-name=ib1 [infiniband] transport-mode=datagram [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000013D000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/infiniband/wicked_xml0707010000013E000081A40000000000000000000000016A032DB60000059D000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/infiniband/wicked_xml/infiniband.xml ib0 boot false false ib0.8001 boot ib0 0x8001 connected allowed false false ib0.8002 boot ib0 0x8002 false false ib1 boot datagram disallowed false false 0707010000013F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/ipv4+6_dhcp07070100000140000081A40000000000000000000000016A032DB600000013000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/ENVNM_VERSION_ge=1.52 07070100000141000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/netconfig07070100000142000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/netconfig/config07070100000143000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/netconfig/dhcpDHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 07070100000144000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 07070100000145000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/system-connections07070100000146000081A40000000000000000000000016A032DB6000001C8000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/system-connections/eth9.nmconnection[connection] id=eth9 uuid=a123047b-232e-4b86-9f69-851e7690deaa type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=0 dns-priority=20 ip6-privacy=1 method=auto [proxy] 07070100000147000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/wicked_xml07070100000148000081A40000000000000000000000016A032DB60000034B000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ipv4+6_dhcp/wicked_xml/config.xml eth9 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false false 07070100000149000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/ipv4+6_dhcp20707010000014A000081A40000000000000000000000016A032DB600000013000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/ENVNM_VERSION_lt=1.52 0707010000014B000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/netconfig0707010000014C000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/netconfig/config0707010000014D000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/netconfig/dhcp0707010000014E000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 0707010000014F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/system-connections07070100000150000081A40000000000000000000000016A032DB600000160000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/system-connections/eth9.nmconnection[connection] id=eth9 uuid=a123047b-232e-4b86-9f69-851e7690deaa type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false dns-priority=20 ip6-privacy=1 method=auto [proxy] 07070100000151000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/wicked_xml07070100000152000081A40000000000000000000000016A032DB60000033A000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/ipv4+6_dhcp2/wicked_xml/config.xml eth9 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true false true prefer-public true group dns,nis,ntp,tz,boot auto true true false false 07070100000153000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/ipv4_static07070100000154000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/ipv4_static/ENVW2NM_WITHOUT_NETCONFIG=true 07070100000155000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ipv4_static/system-connections07070100000156000081A40000000000000000000000016A032DB600000101000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/ipv4_static/system-connections/eth8.nmconnection[connection] id=eth8 uuid=4935f592-3e86-491b-847b-2ce4f180001c type=ethernet interface-name=eth8 [ethernet] [match] [ipv4] address1=192.168.100.5/24 address2=192.168.101.5/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000157000081A40000000000000000000000016A032DB600000101000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/ipv4_static/system-connections/eth9.nmconnection[connection] id=eth9 uuid=da886e32-22a9-4d83-8c04-421ec59d274b type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] address1=192.168.100.5/24 address2=192.168.101.5/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000158000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/ipv4_static/wicked_xml07070100000159000081A40000000000000000000000016A032DB600000414000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/ipv4_static/wicked_xml/ipv4_static.xml eth8 boot true true
192.168.100.5/24
192.168.101.5/24
true prefer-public false
eth9 boot true
192.168.100.5/24
192.168.101.5/24
prefer-public false
0707010000015A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/ipv6_auto0707010000015B000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/ipv6_auto/netconfig0707010000015C000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ipv6_auto/netconfig/config0707010000015D000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ipv6_auto/netconfig/dhcp0707010000015E000081A40000000000000000000000016A032DB60000001F000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ipv6_auto/netconfig/ifcfg-eth7STARTMODE=auto BOOTPROTO=auto6 0707010000015F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ipv6_auto/system-connections07070100000160000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/ipv6_auto/system-connections/eth7.nmconnection[connection] id=eth7 uuid=6efc94cf-c0a9-4272-a5d6-d054779a48a7 type=ethernet interface-name=eth7 [ethernet] [match] [ipv4] dns-priority=20 method=disabled [ipv6] addr-gen-mode=default dns-priority=20 ip6-privacy=1 method=auto [proxy] 07070100000161000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/ipv6_auto/wicked_xml07070100000162000081A40000000000000000000000016A032DB600000176000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ipv6_auto/wicked_xml/config.xml eth7 boot true true prefer-public true dns 07070100000163000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/ipv6_dhcp07070100000164000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/ipv6_dhcp/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 07070100000165000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/ipv6_dhcp/netconfig07070100000166000081A40000000000000000000000016A032DB60000003D000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ipv6_dhcp/netconfig/configDHCLIENT_HOSTNAME_OPTION=AUTO DHCLIENT6_HOSTNAME_OPTION=AUTO 07070100000167000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ipv6_dhcp/netconfig/dhcpDHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 07070100000168000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ipv6_dhcp/system-connections07070100000169000081A40000000000000000000000016A032DB60000013E000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/ipv6_dhcp/system-connections/eth5.nmconnection[connection] id=eth5 uuid=ee291fe1-7dd3-4376-9c63-4228fab9df27 type=ethernet interface-name=eth5 [ethernet] [match] [ipv4] ignore-auto-dns=true method=disabled [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=1 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=dhcp [proxy] 0707010000016A000081A40000000000000000000000016A032DB60000013E000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/ipv6_dhcp/system-connections/eth6.nmconnection[connection] id=eth6 uuid=ee291fe1-7dd3-4376-9c63-4228fab9df27 type=ethernet interface-name=eth6 [ethernet] [match] [ipv4] ignore-auto-dns=true method=disabled [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=1 dhcp-send-release=0 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 0707010000016B000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/ipv6_dhcp/system-connections/lo.nmconnection[connection] id=lo uuid=401d49c9-e948-4207-8558-93b2760a428c type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 0707010000016C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/ipv6_dhcp/wicked_xml0707010000016D000081A40000000000000000000000016A032DB6000005CB000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/ipv6_dhcp/wicked_xml/ipv6_dhcp.xml eth6 boot true true true prefer-public false true hostname,dns,nis,ntp,tz,boot auto true dev3 15 true false false eth5 boot true true true prefer-public false true hostname,dns,nis,ntp,tz,boot managed true dev3 15 true false false 0707010000016E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/ipv6_dhcp20707010000016F000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/ipv6_dhcp2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.52 07070100000170000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/ipv6_dhcp2/netconfig07070100000171000081A40000000000000000000000016A032DB60000003D000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/ipv6_dhcp2/netconfig/configDHCLIENT_HOSTNAME_OPTION=AUTO DHCLIENT6_HOSTNAME_OPTION=AUTO 07070100000172000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/ipv6_dhcp2/netconfig/dhcp07070100000173000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/ipv6_dhcp2/system-connections07070100000174000081A40000000000000000000000016A032DB600000115000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/ipv6_dhcp2/system-connections/eth5.nmconnection[connection] id=eth5 uuid=ee291fe1-7dd3-4376-9c63-4228fab9df27 type=ethernet interface-name=eth5 [ethernet] [match] [ipv4] ignore-auto-dns=true method=disabled [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac ignore-auto-dns=true ip6-privacy=1 method=dhcp [proxy] 07070100000175000081A40000000000000000000000016A032DB600000115000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/ipv6_dhcp2/system-connections/eth6.nmconnection[connection] id=eth6 uuid=ee291fe1-7dd3-4376-9c63-4228fab9df27 type=ethernet interface-name=eth6 [ethernet] [match] [ipv4] ignore-auto-dns=true method=disabled [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000176000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/ipv6_dhcp2/system-connections/lo.nmconnection[connection] id=lo uuid=401d49c9-e948-4207-8558-93b2760a428c type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 07070100000177000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/ipv6_dhcp2/wicked_xml07070100000178000081A40000000000000000000000016A032DB6000005B9000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/ipv6_dhcp2/wicked_xml/ipv6_dhcp.xml eth6 boot true true true prefer-public false true dns,nis,ntp,tz,boot auto true dev3 15 true false false eth5 boot true true true prefer-public false true dns,nis,ntp,tz,boot managed true dev3 15 true false false 07070100000179000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/ipv6_static0707010000017A000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/ipv6_static/ENVW2NM_WITHOUT_NETCONFIG=true 0707010000017B000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ipv6_static/system-connections0707010000017C000081A40000000000000000000000016A032DB600000109000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/ipv6_static/system-connections/eth5.nmconnection[connection] id=eth5 uuid=79dac508-d8ae-4bae-82bc-8590c9e501cd type=ethernet interface-name=eth5 [ethernet] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default address1=2001:db8:0:1::5/64 address2=2001:db8:0:2::5/64 ip6-privacy=1 method=manual [proxy] 0707010000017D000081A40000000000000000000000016A032DB600000109000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/ipv6_static/system-connections/eth6.nmconnection[connection] id=eth6 uuid=f429f20c-8e87-4e84-8380-4fbcc1bcd371 type=ethernet interface-name=eth6 [ethernet] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default address1=2001:db8:0:1::5/64 address2=2001:db8:0:2::5/64 ip6-privacy=1 method=manual [proxy] 0707010000017E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/ipv6_static/wicked_xml0707010000017F000081A40000000000000000000000016A032DB600000438000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/ipv6_static/wicked_xml/ipv6_static.xml eth5 boot true true true prefer-public false
2001:db8:0:1::5/64
2001:db8:0:2::5/64
eth6 boot true true prefer-public false
2001:db8:0:1::5/64
2001:db8:0:2::5/64
07070100000180000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001A00000000wicked2nm-1.5.0/tests/mtu07070100000181000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/mtu/ENVW2NM_WITHOUT_NETCONFIG=true 07070100000182000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/mtu/system-connections07070100000183000081A40000000000000000000000016A032DB6000000CE000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/mtu/system-connections/eth9.nmconnection[connection] id=eth9 uuid=c8666266-940a-4c15-96ed-8565170ff322 type=ethernet interface-name=eth9 [ethernet] mtu=1500 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000184000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/mtu/wicked_xml07070100000185000081A40000000000000000000000016A032DB600000128000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/mtu/wicked_xml/mtu.xml eth9 boot 1500 false false 07070100000186000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/multipath_routing_failure07070100000187000081A40000000000000000000000016A032DB600000032000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/multipath_routing_failure/ENVW2NM_WITHOUT_NETCONFIG=true TEST_EXPECT_FAIL=true 07070100000188000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/multipath_routing_failure/wicked_xml07070100000189000081A40000000000000000000000016A032DB60000043B000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/multipath_routing_failure/wicked_xml/single_gateway.xml eth9 boot true true
192.168.101.5/24
192.168.102.5/24
192.168.101.0/24 192.168.102.0/24 192.168.102.1 192.168.102.2 1
true prefer-public
2001:db8:1::5/64
2001:db8:1::1 1
0707010000018A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/netconfig0707010000018B000081A40000000000000000000000016A032DB600000024000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/netconfig/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig 0707010000018C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/netconfig/netconfig0707010000018D000081A40000000000000000000000016A032DB600000095000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/netconfig/netconfig/configNETCONFIG_DNS_POLICY="auto" NETCONFIG_DNS_STATIC_SEARCHLIST="suse.de suse.com" NETCONFIG_DNS_STATIC_SERVERS="192.168.0.10 192.168.1.10 2001:db8::10" 0707010000018E000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/netconfig/netconfig/dhcp0707010000018F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/netconfig/system-connections07070100000190000081A40000000000000000000000016A032DB6000000E5000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/netconfig/system-connections/eth9.nmconnection[connection] id=eth9 uuid=71735c72-06c3-4016-aafb-1bdb181bd533 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dns-priority=20 method=disabled [ipv6] addr-gen-mode=default dns-priority=20 method=disabled [proxy] 07070100000191000081A40000000000000000000000016A032DB60000017A000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/netconfig/system-connections/lo.nmconnection[connection] id=lo uuid=e722f75b-6207-4339-ae65-2f40cd4569e8 type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 dns=192.168.0.10;192.168.1.10; dns-priority=10 dns-search=suse.de;suse.com; method=manual [ipv6] addr-gen-mode=default address1=::1/128 dns=2001:db8::10; dns-priority=10 dns-search=suse.de;suse.com; method=manual [proxy] 07070100000192000081A40000000000000000000000016A032DB6000000E7000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/netconfig/system-connections/test1.nmconnection[connection] id=test1 uuid=1df2ab05-b3a4-45f1-8940-478f72e14a4a type=ethernet interface-name=test1 [ethernet] [match] [ipv4] dns-priority=20 method=disabled [ipv6] addr-gen-mode=default dns-priority=20 method=disabled [proxy] 07070100000193000081A40000000000000000000000016A032DB6000000E9000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/netconfig/system-connections/test12.nmconnection[connection] id=test12 uuid=5b5acc9f-c241-442f-8206-5b40571fd2ce type=ethernet interface-name=test12 [ethernet] [match] [ipv4] dns-priority=20 method=disabled [ipv6] addr-gen-mode=default dns-priority=20 method=disabled [proxy] 07070100000194000081A40000000000000000000000016A032DB6000000EB000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/netconfig/system-connections/test123.nmconnection[connection] id=test123 uuid=ba0a9eeb-f8ae-4cd7-bec4-4385102e4234 type=ethernet interface-name=test123 [ethernet] [match] [ipv4] dns-priority=20 method=disabled [ipv6] addr-gen-mode=default dns-priority=20 method=disabled [proxy] 07070100000195000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/netconfig/wicked_xml07070100000196000081A40000000000000000000000016A032DB600000438000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/netconfig/wicked_xml/basic.xml eth9 boot false false test1 boot false false test12 boot false false test123 boot false false 07070100000197000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/netconfig207070100000198000081A40000000000000000000000016A032DB600000024000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/netconfig2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig 07070100000199000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/netconfig2/netconfig0707010000019A000081A40000000000000000000000016A032DB6000000AF000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/netconfig2/netconfig/configNETCONFIG_DNS_POLICY="eth* est* STATIC test? test???" NETCONFIG_DNS_STATIC_SEARCHLIST="suse.de suse.com" NETCONFIG_DNS_STATIC_SERVERS="192.168.0.10 192.168.1.10 2001:db8::10" 0707010000019B000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/netconfig2/netconfig/dhcp0707010000019C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/netconfig2/system-connections0707010000019D000081A40000000000000000000000016A032DB6000000E5000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/netconfig2/system-connections/eth9.nmconnection[connection] id=eth9 uuid=d1391dba-0131-4425-8ddf-3a8742fbc91f type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dns-priority=10 method=disabled [ipv6] addr-gen-mode=default dns-priority=10 method=disabled [proxy] 0707010000019E000081A40000000000000000000000016A032DB60000017A000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/netconfig2/system-connections/lo.nmconnection[connection] id=lo uuid=e81cfda7-ecbe-4d04-b7bc-312933550318 type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 dns=192.168.0.10;192.168.1.10; dns-priority=30 dns-search=suse.de;suse.com; method=manual [ipv6] addr-gen-mode=default address1=::1/128 dns=2001:db8::10; dns-priority=30 dns-search=suse.de;suse.com; method=manual [proxy] 0707010000019F000081A40000000000000000000000016A032DB6000000E7000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/netconfig2/system-connections/test1.nmconnection[connection] id=test1 uuid=b6003272-745f-4b05-bab6-afc988f2f638 type=ethernet interface-name=test1 [ethernet] [match] [ipv4] dns-priority=40 method=disabled [ipv6] addr-gen-mode=default dns-priority=40 method=disabled [proxy] 070701000001A0000081A40000000000000000000000016A032DB6000000F3000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/netconfig2/system-connections/test12.nmconnection[connection] id=test12 uuid=7b9b2560-bcb9-49be-877e-cb63148122dc type=ethernet interface-name=test12 [ethernet] [match] [ipv4] ignore-auto-dns=true method=disabled [ipv6] addr-gen-mode=default ignore-auto-dns=true method=disabled [proxy] 070701000001A1000081A40000000000000000000000016A032DB6000000EB000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/netconfig2/system-connections/test123.nmconnection[connection] id=test123 uuid=aac0a124-d27f-4b3d-aec9-85087239c188 type=ethernet interface-name=test123 [ethernet] [match] [ipv4] dns-priority=50 method=disabled [ipv6] addr-gen-mode=default dns-priority=50 method=disabled [proxy] 070701000001A2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/netconfig2/wicked_xml070701000001A3000081A40000000000000000000000016A032DB600000438000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/netconfig2/wicked_xml/basic.xml eth9 boot false false test1 boot false false test12 boot false false test123 boot false false 070701000001A4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/ovs-bridge1070701000001A5000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/ovs-bridge1.1070701000001A6000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/ovs-bridge1.1/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.46 070701000001A7000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/netconfig070701000001A8000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ovs-bridge1.1/netconfig/config070701000001A9000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ovs-bridge1.1/netconfig/dhcp070701000001AA000081A40000000000000000000000016A032DB60000009C000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge1.1/netconfig/ifcfg-br0STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.0.2.2/15' ZONE=internal OVS_BRIDGE='yes' OVS_BRIDGE_PORT_DEVICE_0='tap10' OVS_BRIDGE_PORT_DEVICE_1='tap20' 070701000001AB000081A40000000000000000000000016A032DB60000005F000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/netconfig/ifcfg-tap10BOOTPROTO='none' STARTMODE='auto' TUNNEL='tap' TUNNEL_SET_GROUP='root' TUNNEL_SET_OWNER='root' 070701000001AC000081A40000000000000000000000016A032DB60000005F000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/netconfig/ifcfg-tap20BOOTPROTO='none' STARTMODE='auto' TUNNEL='tap' TUNNEL_SET_GROUP='root' TUNNEL_SET_OWNER='root' 070701000001AD000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections070701000001AE000081A40000000000000000000000016A032DB60000010B000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/br0-bridge.nmconnection[connection] id=br0-bridge uuid=f288debb-d493-4ac2-aa3f-a6d9ec25e010 type=ovs-bridge autoconnect-ports=1 interface-name=br0-bridge [ovs-bridge] [match] [ipv4] ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default ignore-auto-dns=true method=auto [proxy] 070701000001AF000081A40000000000000000000000016A032DB6000000BD000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/br0-port.nmconnection[connection] id=br0-port uuid=81d6fe12-2cf3-4f42-b794-6d634bd15891 type=ovs-port autoconnect-ports=1 controller=br0-bridge interface-name=br0-port port-type=ovs-bridge [ovs-port] [match] 070701000001B0000081A40000000000000000000000016A032DB600000149000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/br0.nmconnection[connection] id=br0 uuid=ac6f4b40-35f7-4c33-ba32-cd54121ede83 type=ovs-interface controller=br0-port interface-name=br0 port-type=ovs-port [ovs-interface] type=internal [match] [ipv4] address1=10.0.2.2/15 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000001B1000081A40000000000000000000000016A032DB6000000C1000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/tap10-port.nmconnection[connection] id=tap10-port uuid=20ec90cb-e4e1-4478-997c-b118aea2df78 type=ovs-port autoconnect-ports=1 controller=br0-bridge interface-name=tap10-port port-type=ovs-bridge [ovs-port] [match] 070701000001B2000081A40000000000000000000000016A032DB6000000CB000000000000000000000000000000000000004A00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/tap10.nmconnection[connection] id=tap10 uuid=d0407883-1a3d-4822-8b09-0e730871ebd6 type=tun controller=tap10-port interface-name=tap10 port-type=ovs-port [ovs-interface] type=system [tun] group=0 mode=2 owner=0 [match] 070701000001B3000081A40000000000000000000000016A032DB6000000C1000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/tap20-port.nmconnection[connection] id=tap20-port uuid=803545de-c926-44b2-9f82-810feddc7f05 type=ovs-port autoconnect-ports=1 controller=br0-bridge interface-name=tap20-port port-type=ovs-bridge [ovs-port] [match] 070701000001B4000081A40000000000000000000000016A032DB6000000CB000000000000000000000000000000000000004A00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/system-connections/tap20.nmconnection[connection] id=tap20 uuid=7cf60862-d5a2-426c-a6c6-5c8496d0e82b type=tun controller=tap20-port interface-name=tap20 port-type=ovs-port [ovs-interface] type=system [tun] group=0 mode=2 owner=0 [match] 070701000001B5000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/wicked_xml070701000001B6000081A40000000000000000000000016A032DB600000499000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/ovs-bridge1.1/wicked_xml/config.xml br0 boot true
10.0.2.2/15
true prefer-public
tap20 boot 0 0 br0 false false tap10 boot 0 0 br0 false false 070701000001B7000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/ovs-bridge1/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.46 070701000001B8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/ovs-bridge1/netconfig070701000001B9000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ovs-bridge1/netconfig/config070701000001BA000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ovs-bridge1/netconfig/dhcp070701000001BB000081A40000000000000000000000016A032DB60000009C000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ovs-bridge1/netconfig/ifcfg-br0STARTMODE='auto' BOOTPROTO='static' IPADDR4='10.0.2.2/15' ZONE=internal OVS_BRIDGE='yes' OVS_BRIDGE_PORT_DEVICE_0='tap10' OVS_BRIDGE_PORT_DEVICE_1='tap20' 070701000001BC000081A40000000000000000000000016A032DB60000005F000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge1/netconfig/ifcfg-tap10BOOTPROTO='none' STARTMODE='auto' TUNNEL='tap' TUNNEL_SET_GROUP='root' TUNNEL_SET_OWNER='root' 070701000001BD000081A40000000000000000000000016A032DB60000005F000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge1/netconfig/ifcfg-tap20BOOTPROTO='none' STARTMODE='auto' TUNNEL='tap' TUNNEL_SET_GROUP='root' TUNNEL_SET_OWNER='root' 070701000001BE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections070701000001BF000081A40000000000000000000000016A032DB60000010C000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/br0-bridge.nmconnection[connection] id=br0-bridge uuid=ff797ef9-bf7f-4ecb-9f8a-d3833afec08e type=ovs-bridge autoconnect-slaves=1 interface-name=br0-bridge [ovs-bridge] [match] [ipv4] ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default ignore-auto-dns=true method=auto [proxy] 070701000001C0000081A40000000000000000000000016A032DB6000000BB000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/br0-port.nmconnection[connection] id=br0-port uuid=0867d65a-221c-4ae4-b548-4e6592af8ff3 type=ovs-port autoconnect-slaves=1 interface-name=br0-port master=br0-bridge slave-type=ovs-bridge [ovs-port] [match] 070701000001C1000081A40000000000000000000000016A032DB600000146000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/br0.nmconnection[connection] id=br0 uuid=0986f097-506d-40c5-9ca7-a76d168ba99c type=ovs-interface interface-name=br0 master=br0-port slave-type=ovs-port [ovs-interface] type=internal [match] [ipv4] address1=10.0.2.2/15 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000001C2000081A40000000000000000000000016A032DB6000000BF000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/tap10-port.nmconnection[connection] id=tap10-port uuid=23bfdab0-d696-44cc-9659-f97717766615 type=ovs-port autoconnect-slaves=1 interface-name=tap10-port master=br0-bridge slave-type=ovs-bridge [ovs-port] [match] 070701000001C3000081A40000000000000000000000016A032DB6000000C8000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/tap10.nmconnection[connection] id=tap10 uuid=6c26d745-6fd1-45fe-98bf-00bcc31770f1 type=tun interface-name=tap10 master=tap10-port slave-type=ovs-port [ovs-interface] type=system [tun] group=0 mode=2 owner=0 [match] 070701000001C4000081A40000000000000000000000016A032DB6000000BF000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/tap20-port.nmconnection[connection] id=tap20-port uuid=b9abd61f-0c79-41be-a385-23dfefdc05c3 type=ovs-port autoconnect-slaves=1 interface-name=tap20-port master=br0-bridge slave-type=ovs-bridge [ovs-port] [match] 070701000001C5000081A40000000000000000000000016A032DB6000000C8000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/ovs-bridge1/system-connections/tap20.nmconnection[connection] id=tap20 uuid=02b1f005-abc6-437c-a064-172f850ede65 type=tun interface-name=tap20 master=tap20-port slave-type=ovs-port [ovs-interface] type=system [tun] group=0 mode=2 owner=0 [match] 070701000001C6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/ovs-bridge1/wicked_xml070701000001C7000081A40000000000000000000000016A032DB600000493000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge1/wicked_xml/config.xml br0 boot true
10.0.2.2/15
true prefer-public
tap20 boot 0 0 br0 false false tap10 boot 0 0 br0 false false 070701000001C8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/ovs-bridge2070701000001C9000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/ovs-bridge2.1070701000001CA000081A40000000000000000000000016A032DB600000057000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/ovs-bridge2.1/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig W2NM_ACTIVATE_CONNECTIONS=false NM_VERSION_ge=1.46 070701000001CB000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig070701000001CC000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig/config070701000001CD000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig/dhcp070701000001CE000081A40000000000000000000000016A032DB600000022000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig/ifcfg-en0STARTMODE='auto' BOOTPROTO='none' 070701000001CF000081A40000000000000000000000016A032DB600000022000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig/ifcfg-en1STARTMODE='auto' BOOTPROTO='none' 070701000001D0000081A40000000000000000000000016A032DB60000007A000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig/ifcfg-ovsbrASTARTMODE='auto' BOOTPROTO='static' ZONE=trusted IPADDR='198.18.10.10/24' OVS_BRIDGE='yes' OVS_BRIDGE_PORT_DEVICE_1='en0' 070701000001D1000081A40000000000000000000000016A032DB6000000A5000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/netconfig/ifcfg-ovsbrBSTARTMODE='auto' BOOTPROTO='static' IPADDR='198.18.11.10/24' OVS_BRIDGE='yes' OVS_BRIDGE_VLAN_PARENT='ovsbrA' OVS_BRIDGE_VLAN_TAG='10' OVS_BRIDGE_PORT_DEVICE_1=en1 070701000001D2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections070701000001D3000081A40000000000000000000000016A032DB6000000C0000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/en0-port.nmconnection[connection] id=en0-port uuid=f3d21162-ff2f-457e-ba65-740aaee4b8e8 type=ovs-port autoconnect-ports=1 controller=ovsbrA-bridge interface-name=en0-port port-type=ovs-bridge [ovs-port] [match] 070701000001D4000081A40000000000000000000000016A032DB6000000B8000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/en0.nmconnection[connection] id=en0 uuid=377c12d0-a12c-4c96-9dfa-501f7ee4e0e3 type=ethernet controller=en0-port interface-name=en0 port-type=ovs-port [ethernet] [ovs-interface] type=system [match] 070701000001D5000081A40000000000000000000000016A032DB6000000C7000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/en1-port.nmconnection[connection] id=en1-port uuid=2205d992-3374-4aad-8d10-363694ec8efa type=ovs-port autoconnect-ports=1 controller=ovsbrA-bridge interface-name=en1-port port-type=ovs-bridge [ovs-port] tag=10 [match] 070701000001D6000081A40000000000000000000000016A032DB6000000B8000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/en1.nmconnection[connection] id=en1 uuid=3ca9734d-f315-4c5d-a53a-f7bb90a15a23 type=ethernet controller=en1-port interface-name=en1 port-type=ovs-port [ethernet] [ovs-interface] type=system [match] 070701000001D7000081A40000000000000000000000016A032DB600000111000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/ovsbrA-bridge.nmconnection[connection] id=ovsbrA-bridge uuid=49f44de0-99b1-4868-af2a-6e99b7ad2171 type=ovs-bridge autoconnect-ports=1 interface-name=ovsbrA-bridge [ovs-bridge] [match] [ipv4] ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default ignore-auto-dns=true method=auto [proxy] 070701000001D8000081A40000000000000000000000016A032DB6000000C6000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/ovsbrA-port.nmconnection[connection] id=ovsbrA-port uuid=94cbbcc9-0639-4655-b067-3a453cb13e55 type=ovs-port autoconnect-ports=1 controller=ovsbrA-bridge interface-name=ovsbrA-port port-type=ovs-bridge [ovs-port] [match] 070701000001D9000081A40000000000000000000000016A032DB600000156000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/ovsbrA.nmconnection[connection] id=ovsbrA uuid=d0656477-9a76-424e-ae34-906217bfcb1a type=ovs-interface controller=ovsbrA-port interface-name=ovsbrA port-type=ovs-port [ovs-interface] type=internal [match] [ipv4] address1=198.18.10.10/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000001DA000081A40000000000000000000000016A032DB6000000CD000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/ovsbrB-port.nmconnection[connection] id=ovsbrB-port uuid=8c95d17c-4dbf-4c58-a2c2-ffda25dc463e type=ovs-port autoconnect-ports=1 controller=ovsbrA-bridge interface-name=ovsbrB-port port-type=ovs-bridge [ovs-port] tag=10 [match] 070701000001DB000081A40000000000000000000000016A032DB600000156000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/system-connections/ovsbrB.nmconnection[connection] id=ovsbrB uuid=02f29edd-a249-45e5-a699-528388facd41 type=ovs-interface controller=ovsbrB-port interface-name=ovsbrB port-type=ovs-port [ovs-interface] type=internal [match] [ipv4] address1=198.18.11.10/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000001DC000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/wicked_xml070701000001DD000081A40000000000000000000000016A032DB600000622000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/ovs-bridge2.1/wicked_xml/config.xml ovsbrA boot true
198.18.10.10/24
true prefer-public
en1 boot ovsbrB false false ovsbrB boot ovsbrA 10 true
198.18.11.10/24
true prefer-public
en0 boot ovsbrA false false 070701000001DE000081A40000000000000000000000016A032DB600000057000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/ovs-bridge2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig W2NM_ACTIVATE_CONNECTIONS=false NM_VERSION_lt=1.46 070701000001DF000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig070701000001E0000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig/config070701000001E1000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig/dhcp070701000001E2000081A40000000000000000000000016A032DB600000022000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig/ifcfg-en0STARTMODE='auto' BOOTPROTO='none' 070701000001E3000081A40000000000000000000000016A032DB600000022000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig/ifcfg-en1STARTMODE='auto' BOOTPROTO='none' 070701000001E4000081A40000000000000000000000016A032DB60000007A000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig/ifcfg-ovsbrASTARTMODE='auto' BOOTPROTO='static' ZONE=trusted IPADDR='198.18.10.10/24' OVS_BRIDGE='yes' OVS_BRIDGE_PORT_DEVICE_1='en0' 070701000001E5000081A40000000000000000000000016A032DB6000000A5000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/ovs-bridge2/netconfig/ifcfg-ovsbrBSTARTMODE='auto' BOOTPROTO='static' IPADDR='198.18.11.10/24' OVS_BRIDGE='yes' OVS_BRIDGE_VLAN_PARENT='ovsbrA' OVS_BRIDGE_VLAN_TAG='10' OVS_BRIDGE_PORT_DEVICE_1=en1 070701000001E6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections070701000001E7000081A40000000000000000000000016A032DB6000000BE000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/en0-port.nmconnection[connection] id=en0-port uuid=20232292-14c6-42cc-9936-1198672187c8 type=ovs-port autoconnect-slaves=1 interface-name=en0-port master=ovsbrA-bridge slave-type=ovs-bridge [ovs-port] [match] 070701000001E8000081A40000000000000000000000016A032DB6000000B5000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/en0.nmconnection[connection] id=en0 uuid=e1211fdb-7139-401e-bf62-037f10ed86cf type=ethernet interface-name=en0 master=en0-port slave-type=ovs-port [ethernet] [ovs-interface] type=system [match] 070701000001E9000081A40000000000000000000000016A032DB6000000C5000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/en1-port.nmconnection[connection] id=en1-port uuid=1cbc73d9-86a3-4f28-b688-afb4c5518b50 type=ovs-port autoconnect-slaves=1 interface-name=en1-port master=ovsbrA-bridge slave-type=ovs-bridge [ovs-port] tag=10 [match] 070701000001EA000081A40000000000000000000000016A032DB6000000B5000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/en1.nmconnection[connection] id=en1 uuid=d18dc48d-68ec-494e-ba56-08653161e9dc type=ethernet interface-name=en1 master=en1-port slave-type=ovs-port [ethernet] [ovs-interface] type=system [match] 070701000001EB000081A40000000000000000000000016A032DB600000112000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/ovsbrA-bridge.nmconnection[connection] id=ovsbrA-bridge uuid=bdec49eb-00e9-4779-a954-16c73e5f6dd3 type=ovs-bridge autoconnect-slaves=1 interface-name=ovsbrA-bridge [ovs-bridge] [match] [ipv4] ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default ignore-auto-dns=true method=auto [proxy] 070701000001EC000081A40000000000000000000000016A032DB6000000C4000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/ovsbrA-port.nmconnection[connection] id=ovsbrA-port uuid=629711e6-4e92-495b-85f4-5d330d199cae type=ovs-port autoconnect-slaves=1 interface-name=ovsbrA-port master=ovsbrA-bridge slave-type=ovs-bridge [ovs-port] [match] 070701000001ED000081A40000000000000000000000016A032DB600000153000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/ovsbrA.nmconnection[connection] id=ovsbrA uuid=0dff0c56-ae5c-4767-bb4e-47f518b0d724 type=ovs-interface interface-name=ovsbrA master=ovsbrA-port slave-type=ovs-port [ovs-interface] type=internal [match] [ipv4] address1=198.18.10.10/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000001EE000081A40000000000000000000000016A032DB6000000CB000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/ovsbrB-port.nmconnection[connection] id=ovsbrB-port uuid=3708e33e-8790-4904-88fd-bbca6575e376 type=ovs-port autoconnect-slaves=1 interface-name=ovsbrB-port master=ovsbrA-bridge slave-type=ovs-bridge [ovs-port] tag=10 [match] 070701000001EF000081A40000000000000000000000016A032DB600000153000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/ovs-bridge2/system-connections/ovsbrB.nmconnection[connection] id=ovsbrB uuid=a70f84aa-09c4-40cf-ba73-7e04c8406683 type=ovs-interface interface-name=ovsbrB master=ovsbrB-port slave-type=ovs-port [ovs-interface] type=internal [match] [ipv4] address1=198.18.11.10/24 ignore-auto-dns=true method=manual [ipv6] addr-gen-mode=default ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 070701000001F0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/ovs-bridge2/wicked_xml070701000001F1000081A40000000000000000000000016A032DB60000061A000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/ovs-bridge2/wicked_xml/config.xml ovsbrA boot true
198.18.10.10/24
true prefer-public
en1 boot ovsbrB false false ovsbrB boot ovsbrA 10 true
198.18.11.10/24
true prefer-public
en0 boot ovsbrA false false 070701000001F2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001D00000000wicked2nm-1.5.0/tests/routes070701000001F3000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/routes/ENVW2NM_WITHOUT_NETCONFIG=true 070701000001F4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/routes/system-connections070701000001F5000081A40000000000000000000000016A032DB600000241000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/routes/system-connections/eth9.nmconnection[connection] id=eth9 uuid=e7736944-bd8b-4da3-8be9-84b333b2ccfa type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] address1=192.168.101.5/24 address2=192.168.102.5/24 method=manual route1=192.168.101.0/24,192.168.101.1 route2=192.168.102.0/24,192.168.102.1,1 route3=192.168.102.0/24,192.168.102.2,2 route4=192.168.103.0/24,192.168.101.1 route5=192.168.104.0/24,192.168.102.1 route6=0.0.0.0/0,192.168.102.1,1 [ipv6] addr-gen-mode=default address1=2001:db8:1::5/64 ip6-privacy=1 method=manual route1=::/0,2001:db8:1::1 route2=2001:db8:1::/64,2001:db8:1::1,1 [proxy] 070701000001F6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/routes/wicked_xml070701000001F7000081A40000000000000000000000016A032DB600000741000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/routes/wicked_xml/routes.xml eth9 boot true true
192.168.101.5/24
192.168.102.5/24
192.168.101.0/24 192.168.101.1 192.168.102.0/24 192.168.102.1 1 192.168.102.0/24 192.168.102.2 2 192.168.103.0/24 192.168.101.1 192.168.104.0/24 192.168.102.1 192.168.102.1 1
true prefer-public false
2001:db8:1::5/64
2001:db8:1::1 2001:db8:1::/64 2001:db8:1::1 1
070701000001F8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/send_release070701000001F9000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/send_release/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_ge=1.52 070701000001FA000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/send_release/netconfig070701000001FB000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/send_release/netconfig/config070701000001FC000081A40000000000000000000000016A032DB60000007C000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/send_release/netconfig/dhcpDHCLIENT_RELEASE_BEFORE_QUIT=yes DHCLIENT6_RELEASE_BEFORE_QUIT=yes DHCLIENT_SET_HOSTNAME="yes" DHCLIENT6_SET_HOSTNAME="yes" 070701000001FD000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/send_release/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 070701000001FE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/send_release/system-connections070701000001FF000081A40000000000000000000000016A032DB6000001D2000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/send_release/system-connections/eth9.nmconnection[connection] id=eth9 uuid=068f01ea-be4d-4400-9596-8d84784d5d17 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=1 ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname-deprecated=false dhcp-send-hostname=0 dhcp-send-release=1 ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 07070100000200000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/send_release/system-connections/lo.nmconnection[connection] id=lo uuid=3896cf4e-6f4c-4e26-af71-d6875a4891cc type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 07070100000201000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/send_release/wicked_xml07070100000202000081A40000000000000000000000016A032DB60000034A000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/send_release/wicked_xml/config.xml eth9 boot true true group default-route,hostname,dns,nis,ntp,nds,mtu,tz,boot true true true prefer-public true group hostname,dns,nis,ntp,tz,boot auto true true false true 07070100000203000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/send_release207070100000204000081A40000000000000000000000016A032DB600000037000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/send_release2/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig NM_VERSION_lt=1.52 07070100000205000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/send_release2/netconfig07070100000206000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/send_release2/netconfig/config07070100000207000081A40000000000000000000000016A032DB600000043000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/send_release2/netconfig/dhcpDHCLIENT_RELEASE_BEFORE_QUIT=yes DHCLIENT6_RELEASE_BEFORE_QUIT=yes 07070100000208000081A40000000000000000000000016A032DB60000001E000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/send_release2/netconfig/ifcfg-eth9STARTMODE=auto BOOTPROTO=dhcp 07070100000209000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/send_release2/system-connections0707010000020A000081A40000000000000000000000016A032DB60000016A000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/send_release2/system-connections/eth9.nmconnection[connection] id=eth9 uuid=068f01ea-be4d-4400-9596-8d84784d5d17 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] dhcp-client-id=ipv6-duid dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true method=auto [ipv6] addr-gen-mode=default dhcp-duid=llt dhcp-iaid=mac dhcp-send-hostname=false ignore-auto-dns=true ip6-privacy=1 method=auto [proxy] 0707010000020B000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/send_release2/system-connections/lo.nmconnection[connection] id=lo uuid=3896cf4e-6f4c-4e26-af71-d6875a4891cc type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 method=manual [ipv6] addr-gen-mode=default address1=::1/128 method=manual [proxy] 0707010000020C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/send_release2/wicked_xml0707010000020D000081A40000000000000000000000016A032DB600000339000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/send_release2/wicked_xml/config.xml eth9 boot true true group default-route,dns,nis,ntp,nds,mtu,tz,boot true true true prefer-public true group dns,nis,ntp,tz,boot auto true true false true 0707010000020E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002000000000wicked2nm-1.5.0/tests/startmode0707010000020F000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/startmode/ENVW2NM_WITHOUT_NETCONFIG=true 07070100000210000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/startmode/system-connections07070100000211000081A40000000000000000000000016A032DB6000000E5000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/startmode/system-connections/startmode0.nmconnection[connection] id=startmode0 uuid=9c634f1a-166b-4c91-b1b5-df831add1623 type=dummy autoconnect=false interface-name=startmode0 [ethernet] [dummy] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 07070100000212000081A40000000000000000000000016A032DB6000000D3000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/startmode/system-connections/startmode1.nmconnection[connection] id=startmode1 uuid=43c52f71-5298-4147-9950-f41ed65f9093 type=dummy interface-name=startmode1 [ethernet] [dummy] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 07070100000213000081A40000000000000000000000016A032DB6000000E5000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/startmode/system-connections/startmode2.nmconnection[connection] id=startmode2 uuid=37374441-f8c1-495f-abf5-33dd859b1691 type=dummy autoconnect=false interface-name=startmode2 [ethernet] [dummy] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 07070100000214000081A40000000000000000000000016A032DB6000000D3000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/startmode/system-connections/startmode3.nmconnection[connection] id=startmode3 uuid=4cddd65e-11ca-4f75-bc01-cc2f62336681 type=dummy interface-name=startmode3 [ethernet] [dummy] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 07070100000215000081A40000000000000000000000016A032DB6000000D3000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/startmode/system-connections/startmode4.nmconnection[connection] id=startmode4 uuid=5571cf47-8af8-4218-9b61-3f0506e3595b type=dummy interface-name=startmode4 [ethernet] [dummy] [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 07070100000216000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/startmode/wicked_xml07070100000217000081A40000000000000000000000016A032DB6000005EB000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/startmode/wicked_xml/startmode.xml startmode0 manual true true startmode1 boot true true startmode2 off true true startmode3 hotplug true true startmode4 boot localfs true true true 07070100000218000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/static_dns07070100000219000081A40000000000000000000000016A032DB600000024000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/static_dns/ENVW2NM_NETCONFIG_BASE_DIR=./netconfig 0707010000021A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/static_dns/netconfig0707010000021B000081A40000000000000000000000016A032DB60000263C000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/static_dns/netconfig/config## Path: Network/General ## Description: Global network configuration # # Note: # Most of the options can and should be overridden by per-interface # settings in the ifcfg-* files. # # Note: The ISC dhclient started by the NetworkManager is not using any # of these options -- NetworkManager is not using any sysconfig settings. # ## Type: yesno ## Default: yes # If ifup should check if an IPv4 address is already in use, set this to yes. # # Make sure that packet sockets (CONFIG_PACKET) are supported in the kernel, # since this feature uses arp, which depends on that. # Also be aware that this takes one second per interface; consider that when # setting up a lot of interfaces. CHECK_DUPLICATE_IP="yes" ## Type: list(auto,yes,no) ## Default: auto # If ifup should send a gratuitous ARP to inform the receivers about its # IPv4 addresses. Default is to send gratuitous ARP, when duplicate IPv4 # address check is enabled and the check were successful. # # Make sure that packet sockets (CONFIG_PACKET) are supported in the kernel, # since this feature uses arp, which depends on that. SEND_GRATUITOUS_ARP="auto" ## Type: yesno ## Default: no # Switch on/off debug messages for all network configuration stuff. If set to no # most scripts can enable it locally with "-o debug". DEBUG="no" ## Type: integer ## Default: 30 # # Some interfaces need some time to come up or come asynchronously via hotplug. # WAIT_FOR_INTERFACES is a global wait for all mandatory interfaces in # seconds. If empty no wait occurs. # WAIT_FOR_INTERFACES="30" ## Type: yesno ## Default: yes # # With this variable you can determine if the SuSEfirewall when enabled # should get started when network interfaces are started. FIREWALL="yes" ## Type: int ## Default: 30 # # When using NetworkManager you may define a timeout to wait for NetworkManager # to connect in NetworkManager-wait-online.service. Other network services # may require the system to have a valid network setup in order to succeed. # # This variable has no effect if NetworkManager is disabled. # NM_ONLINE_TIMEOUT="30" ## Type: string ## Default: "dns-resolver dns-bind ntp-runtime nis" # # This variable defines the start order of netconfig modules installed # in the /etc/netconfig.d and /usr/libexec/netconfig/netconfig.d/ directories. # # To disable the execution of a module, don't remove it from the list # but prepend it with a minus sign, "-ntp-runtime". # NETCONFIG_MODULES_ORDER="dns-resolver dns-bind dns-dnsmasq nis ntp-runtime" ## Type: yesno ## Default: no # # Enable netconfig verbose reporting. # NETCONFIG_VERBOSE="no" ## Type: yesno ## Default: no # # This variable enables netconfig to always force a replace of modified # files and automatically enables the -f | --force-replace parameter. # # The purpose is to use it as workaround, when some other tool trashes # the files, e.g. /etc/resolv.conf and you observe messages like this # in your logs on in "netconfig update" output: # ATTENTION: You have modified /etc/resolv.conf. Leaving it untouched. # # Please do not forget to also report a bug as we have a system policy # to use netconfig. # NETCONFIG_FORCE_REPLACE="no" ## Type: string ## Default: "auto" # # Defines the DNS merge policy as documented in netconfig(8) manual page. # Set to "" to disable DNS configuration. # NETCONFIG_DNS_POLICY="STATIC" ## Type: string(resolver,bind,dnsmasq,) ## Default: "resolver" # # Defines the name of the DNS forwarder that has to be configured. # Currently implemented are "bind", "dnsmasq" and "resolver", that # causes to write the name server IP addresses to /etc/resolv.conf # only (no forwarder). Empty string defaults to "resolver". # NETCONFIG_DNS_FORWARDER="resolver" ## Type: yesno ## Default: yes # # When enabled (default) in forwarder mode ("bind", "dnsmasq"), # netconfig writes an explicit localhost nameserver address to the # /etc/resolv.conf, followed by the policy resolved name server list # as fallback for the moments, when the local forwarder is stopped. # NETCONFIG_DNS_FORWARDER_FALLBACK="yes" ## Type: string ## Default: "" # # List of DNS domain names used for host-name lookup. # It is written as search list into the /etc/resolv.conf file. # NETCONFIG_DNS_STATIC_SEARCHLIST="suse.de suse.com" ## Type: string ## Default: "" # # List of DNS nameserver IP addresses to use for host-name lookup. # When the NETCONFIG_DNS_FORWARDER variable is set to "resolver", # the name servers are written directly to /etc/resolv.conf. # Otherwise, the nameserver are written into a forwarder specific # configuration file and the /etc/resolv.conf does not contain any # nameservers causing the glibc to use the name server on the local # machine (the forwarder). See also netconfig(8) manual page. # NETCONFIG_DNS_STATIC_SERVERS="192.168.0.10 192.168.1.10 2001:db8::10" ## Type: string ## Default: "auto" # # Allows to specify a custom DNS service ranking list, that is which # services provide preferred (e.g. vpn services), and which services # fallback settings (e.g. avahi). # Preferred service names have to be prepended with a "+", fallback # service names with a "-" character. The special default value # "auto" enables the current build-in service ranking list -- see the # netconfig(8) manual page -- "none" or "" disables the ranking. # NETCONFIG_DNS_RANKING="auto" ## Type: string ## Default: "" # # Allows to specify options to use when writing the /etc/resolv.conf, # for example: # "debug attempts:1 timeout:10" # See resolv.conf(5) manual page for details. # NETCONFIG_DNS_RESOLVER_OPTIONS="" ## Type: string ## Default: "" # # Allows to specify a sortlist to use when writing the /etc/resolv.conf, # for example: # 130.155.160.0/255.255.240.0 130.155.0.0" # See resolv.conf(5) manual page for details. # NETCONFIG_DNS_RESOLVER_SORTLIST="" ## Type: string ## Default: "auto" # # Defines the NTP merge policy as documented in netconfig(8) manual page. # Set to "" to disable NTP configuration. # NETCONFIG_NTP_POLICY="auto" ## Type: string ## Default: "" # # List of NTP servers. # NETCONFIG_NTP_STATIC_SERVERS="" ## Type: string ## Default: "auto" # # Defines the NIS merge policy as documented in netconfig(8) manual page. # Set to "" to disable NIS configuration. # NETCONFIG_NIS_POLICY="auto" ## Type: string(yes,no,) ## Default: "yes" # # Defines whether to set the default NIS domain. When enabled and no domain # is provided dynamically or in static settings, /etc/defaultdomain is used. # Valid values are: # - "no" or "" netconfig does not set the domainname # - "yes" netconfig sets the domainname according to the # NIS policy using settings provided by the first # interface and service that provided it. # - "" as yes, but only using settings from interface. # NETCONFIG_NIS_SETDOMAINNAME="yes" ## Type: string ## Default: "" # # Defines a default NIS domain. # # Further domain can be specified by adding a "_" suffix to # the NETCONFIG_NIS_STATIC_DOMAIN and NETCONFIG_NIS_STATIC_SERVERS # variables, e.g.: NETCONFIG_NIS_STATIC_DOMAIN_1="second". # NETCONFIG_NIS_STATIC_DOMAIN="" ## Type: string ## Default: "" # # Defines a list of NIS servers for the default NIS domain or the # domain specified with same "_" suffix. # NETCONFIG_NIS_STATIC_SERVERS="" ## Type: string ## Default: '' # # Set this variable global variable to the ISO / IEC 3166 alpha2 # country code specifying the wireless regulatory domain to set. # When not empty, ifup-wireless will be set in the wpa_supplicant # config or via 'iw reg set' command. # # Note: This option requires a wpa driver supporting it, like # the 'nl80211' driver used by default since openSUSE 11.3. # When you notice problems with your hardware, please file a # bug report and set e.g. WIRELESS_WPA_DRIVER='wext' (the old # default driver) in the ifcfg file. # See also "/usr/sbin/wpa_supplicant --help" for the list of # available wpa drivers. # WIRELESS_REGULATORY_DOMAIN='' ## Type: integer ## Default: "" # # How log to wait for IPv6 autoconfig in ifup when requested with # the auto6 or +auto6 tag in BOOTPROTO variable. # When unset, a wicked built-in default defer time (10sec) is used. # AUTO6_WAIT_AT_BOOT="" ## Type: list(all,dns,none,"") ## Default: "" # # Whether to update system (DNS) settings from IPv6 RA when requested # with the auto6 or +auto6 tag in BOOTPROTO variable. # Defaults to update if autoconf sysctl (address autoconf) is enabled. # AUTO6_UPDATE="" ## Type: list(auto,yes,no) ## Default: "auto" # # Permits to specify/modify a global ifcfg default. Use with care! # # This settings breaks rules for many things, which require carrier # before they can start, e.g. L2 link protocols, link authentication, # ipv4 duplicate address detection, ipv6 duplicate detection will # happen "post-mortem" and maybe even cause to disable ipv6 at all. # See also "man ifcfg" for further information. # LINK_REQUIRED="auto" ## Type: string ## Default: "" # # Allows to specify a comma separated list of debug facilities used # by wicked. Negated facility names can be prepended by a "-", e.g.: # "all,-events,-socket,-objectmodel,xpath,xml,dbus" # # When set, wicked debug level is automatically enabled. # For a complete list of facility names, see: "wicked --debug help". # WICKED_DEBUG="" ## Type: list("",error,warning,notice,info,debug,debug1,debug2,debug3) ## Default: "" # # Allows to specify wicked debug level. Default level is "notice". # WICKED_LOG_LEVEL="" 0707010000021C000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/static_dns/netconfig/dhcp0707010000021D000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/static_dns/system-connections0707010000021E000081A40000000000000000000000016A032DB6000000EF000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/static_dns/system-connections/eth9.nmconnection[connection] id=eth9 uuid=5e734b30-8000-4889-894e-61c7a185b835 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] ignore-auto-dns=true method=disabled [ipv6] addr-gen-mode=default ignore-auto-dns=true method=disabled [proxy] 0707010000021F000081A40000000000000000000000016A032DB60000017A000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/static_dns/system-connections/lo.nmconnection[connection] id=lo uuid=8711628a-f044-4516-a5b4-bb19f4f9f8fd type=loopback interface-name=lo [ethernet] [loopback] [match] [ipv4] address1=127.0.0.1/8 dns=192.168.0.10;192.168.1.10; dns-priority=10 dns-search=suse.de;suse.com; method=manual [ipv6] addr-gen-mode=default address1=::1/128 dns=2001:db8::10; dns-priority=10 dns-search=suse.de;suse.com; method=manual [proxy] 07070100000220000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/static_dns/wicked_xml07070100000221000081A40000000000000000000000016A032DB60000010B000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/static_dns/wicked_xml/basic.xml eth9 boot false false 07070100000222000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001D00000000wicked2nm-1.5.0/tests/sysctl07070100000223000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002100000000wicked2nm-1.5.0/tests/sysctl/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 07070100000224000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/sysctl/system-connections07070100000225000081A40000000000000000000000016A032DB600000103000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/sysctl/system-connections/en0.nmconnection[connection] id=en0 uuid=b88f60c5-3707-4265-87bc-85cb2e0b11ec type=ethernet interface-name=en0 [ethernet] [match] [ipv4] address1=192.168.2.2/24 method=manual [ipv6] addr-gen-mode=default address1=fc00:dead:beaf::1/64 ip6-privacy=1 method=manual [proxy] 07070100000226000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/sysctl/wicked_xml07070100000227000081A40000000000000000000000016A032DB600000345000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/sysctl/wicked_xml/config.xml en0 boot true true true false
192.168.2.2/24
true true true prefer-public router fail-address random fe:dead::beaf
fc00:dead:beaf::1/64
07070100000228000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001A00000000wicked2nm-1.5.0/tests/tap07070100000229000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/tap/ENVW2NM_WITHOUT_NETCONFIG=true 0707010000022A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/tap/system-connections0707010000022B000081A40000000000000000000000016A032DB6000000CE000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/tap/system-connections/tap9.nmconnection[connection] id=tap9 uuid=059e4e35-8b7a-4fae-a2bd-7d172c5c4e94 type=tun interface-name=tap9 [tun] group=0 mode=2 owner=0 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 0707010000022C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/tap/wicked_xml0707010000022D000081A40000000000000000000000016A032DB6000000E6000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/tap/wicked_xml/tun.xml tap9 boot 0 0 0707010000022E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/team_activebackup_arp0707010000022F000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003000000000wicked2nm-1.5.0/tests/team_activebackup_arp/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 07070100000230000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig07070100000231000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig/config07070100000232000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig/dhcp07070100000233000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig/ifcfg-eth10STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000234000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000235000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000236000081A40000000000000000000000016A032DB6000001B2000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_arp/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.50.1/24 TEAM_RUNNER=activebackup TEAM_AB_HWADDR_POLICY=only_active TEAM_LW_NAME=arp_ping TEAM_LW_ARP_PING_INTERVAL=500 TEAM_LW_ARP_PING_TARGET_HOST=192.168.50.254 TEAM_LW_ARP_PING_VALIDATE_ACTIVE=yes TEAM_LW_ARP_PING_MISSED_MAX=5 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_PRIO_1=100 TEAM_PORT_STICKY_1=yes TEAM_PORT_DEVICE_2=eth8 TEAM_PORT_PRIO_2=50 TEAM_PORT_DEVICE_3=eth10 TEAM_PORT_PRIO_3=50 07070100000237000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_activebackup_arp/system-connections07070100000238000081A40000000000000000000000016A032DB60000006E000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/team_activebackup_arp/system-connections/eth10.nmconnection[connection] id=eth10 type=ethernet controller=team0 interface-name=eth10 port-type=bond [ethernet] [match] 07070100000239000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005100000000wicked2nm-1.5.0/tests/team_activebackup_arp/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet controller=team0 interface-name=eth8 port-type=bond [ethernet] [match] 0707010000023A000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005100000000wicked2nm-1.5.0/tests/team_activebackup_arp/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet controller=team0 interface-name=eth9 port-type=bond [ethernet] [match] 0707010000023B000081A40000000000000000000000016A032DB600000177000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/team_activebackup_arp/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] [bond] arp_interval=500 arp_ip_target=192.168.50.254 arp_missed_max=5 arp_validate=active fail_over_mac=follow mode=active-backup primary=eth9 primary_reselect=failure [match] [ipv4] address1=192.168.50.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 0707010000023C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_activebackup_arp/wicked_xml0707010000023D000081A40000000000000000000000016A032DB600000764000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_arp/wicked_xml/config.xml eth10 hotplug team0 50 false false eth9 hotplug team0 100 true false false team0 boot only_active 192.168.50.254 500 true 5 true
192.168.50.1/24
true prefer-public
eth8 hotplug team0 50 false false 0707010000023E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/team_activebackup_arp20707010000023F000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/team_activebackup_arp2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 07070100000240000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig07070100000241000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig/config07070100000242000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig/dhcp07070100000243000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig/ifcfg-eth10STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000244000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000245000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000246000081A40000000000000000000000016A032DB6000001B2000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_arp2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.50.1/24 TEAM_RUNNER=activebackup TEAM_AB_HWADDR_POLICY=only_active TEAM_LW_NAME=arp_ping TEAM_LW_ARP_PING_INTERVAL=500 TEAM_LW_ARP_PING_TARGET_HOST=192.168.50.254 TEAM_LW_ARP_PING_VALIDATE_ACTIVE=yes TEAM_LW_ARP_PING_MISSED_MAX=5 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_PRIO_1=100 TEAM_PORT_STICKY_1=yes TEAM_PORT_DEVICE_2=eth8 TEAM_PORT_PRIO_2=50 TEAM_PORT_DEVICE_3=eth10 TEAM_PORT_PRIO_3=50 07070100000247000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_activebackup_arp2/system-connections07070100000248000081A40000000000000000000000016A032DB60000006B000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_activebackup_arp2/system-connections/eth10.nmconnection[connection] id=eth10 type=ethernet interface-name=eth10 master=team0 slave-type=bond [ethernet] [match] 07070100000249000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/team_activebackup_arp2/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet interface-name=eth8 master=team0 slave-type=bond [ethernet] [match] 0707010000024A000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/team_activebackup_arp2/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet interface-name=eth9 master=team0 slave-type=bond [ethernet] [match] 0707010000024B000081A40000000000000000000000016A032DB600000178000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_activebackup_arp2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] [bond] arp_interval=500 arp_ip_target=192.168.50.254 arp_missed_max=5 arp_validate=active fail_over_mac=follow mode=active-backup primary=eth9 primary_reselect=failure [match] [ipv4] address1=192.168.50.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 0707010000024C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_activebackup_arp2/wicked_xml0707010000024D000081A40000000000000000000000016A032DB600000768000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_arp2/wicked_xml/config.xml eth10 hotplug team0 50 false false eth9 hotplug team0 100 true false false team0 boot only_active 192.168.50.254 500 true 5 true
192.168.50.1/24
true prefer-public
eth8 hotplug team0 50 false false 0707010000024E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/team_activebackup_notifications0707010000024F000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 07070100000250000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_activebackup_notifications/netconfig07070100000251000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/team_activebackup_notifications/netconfig/config07070100000252000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/team_activebackup_notifications/netconfig/dhcp07070100000253000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000254000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004B00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000255000081A40000000000000000000000016A032DB60000015D000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.200.1/24 LLADDR=02:11:22:33:44:55 TEAM_RUNNER=activebackup TEAM_AB_HWADDR_POLICY=by_active TEAM_NOTIFY_PEERS_COUNT=5 TEAM_NOTIFY_PEERS_INTERVAL=200 TEAM_MCAST_REJOIN_COUNT=3 TEAM_LW_NAME=ethtool TEAM_LW_ETHTOOL_DELAY_UP=50 TEAM_LW_ETHTOOL_DELAY_DOWN=100 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 07070100000256000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/team_activebackup_notifications/system-connections07070100000257000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005B00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet controller=team0 interface-name=eth8 port-type=bond [ethernet] [match] 07070100000258000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005B00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet controller=team0 interface-name=eth9 port-type=bond [ethernet] [match] 07070100000259000081A40000000000000000000000016A032DB600000188000000000000000000000000000000000000005C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] cloned-mac-address=02:11:22:33:44:55 [bond] downdelay=100 fail_over_mac=active miimon=50 mode=active-backup num_grat_arp=5 num_unsol_na=5 peer_notif_delay=200 resend_igmp=3 updelay=50 [match] [ipv4] address1=192.168.200.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 0707010000025A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_activebackup_notifications/wicked_xml0707010000025B000081A40000000000000000000000016A032DB600000615000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot
02:11:22:33:44:55
5 200 3 by_active 50 100
true
192.168.200.1/24
true prefer-public
eth8 hotplug team0 false false 0707010000025C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_activebackup_notifications20707010000025D000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 0707010000025E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/netconfig0707010000025F000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/netconfig/config07070100000260000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000004600000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/netconfig/dhcp07070100000261000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000262000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000263000081A40000000000000000000000016A032DB60000015D000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.200.1/24 LLADDR=02:11:22:33:44:55 TEAM_RUNNER=activebackup TEAM_AB_HWADDR_POLICY=by_active TEAM_NOTIFY_PEERS_COUNT=5 TEAM_NOTIFY_PEERS_INTERVAL=200 TEAM_MCAST_REJOIN_COUNT=3 TEAM_LW_NAME=ethtool TEAM_LW_ETHTOOL_DELAY_UP=50 TEAM_LW_ETHTOOL_DELAY_DOWN=100 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 07070100000264000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004A00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/system-connections07070100000265000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet interface-name=eth8 master=team0 slave-type=bond [ethernet] [match] 07070100000266000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005C00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet interface-name=eth9 master=team0 slave-type=bond [ethernet] [match] 07070100000267000081A40000000000000000000000016A032DB600000189000000000000000000000000000000000000005D00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] cloned-mac-address=02:11:22:33:44:55 [bond] downdelay=100 fail_over_mac=active miimon=50 mode=active-backup num_grat_arp=5 num_unsol_na=5 peer_notif_delay=200 resend_igmp=3 updelay=50 [match] [ipv4] address1=192.168.200.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000268000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/wicked_xml07070100000269000081A40000000000000000000000016A032DB600000618000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/team_activebackup_notifications2/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot
02:11:22:33:44:55
5 200 3 by_active 50 100
true
192.168.200.1/24
true prefer-public
eth8 hotplug team0 false false 0707010000026A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/team_activebackup_nsna0707010000026B000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/team_activebackup_nsna/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 0707010000026C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_activebackup_nsna/netconfig0707010000026D000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/team_activebackup_nsna/netconfig/config0707010000026E000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/team_activebackup_nsna/netconfig/dhcp0707010000026F000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_nsna/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000270000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_activebackup_nsna/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 07070100000271000081A40000000000000000000000016A032DB600000122000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_nsna/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=2001:db8::1/64 TEAM_RUNNER=activebackup TEAM_AB_HWADDR_POLICY=only_active TEAM_LW_NAME=nsna_ping TEAM_LW_NSNA_PING_INTERVAL=500 TEAM_LW_NSNA_PING_TARGET_HOST=2001:db8::254 TEAM_LW_NSNA_PING_MISSED_MAX=5 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 07070100000272000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_activebackup_nsna/system-connections07070100000273000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/team_activebackup_nsna/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet controller=team0 interface-name=eth8 port-type=bond [ethernet] [match] 07070100000274000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005200000000wicked2nm-1.5.0/tests/team_activebackup_nsna/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet controller=team0 interface-name=eth9 port-type=bond [ethernet] [match] 07070100000275000081A40000000000000000000000016A032DB60000013F000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_activebackup_nsna/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] [bond] arp_interval=500 arp_missed_max=5 fail_over_mac=follow mode=active-backup ns_ip6_target=2001:db8::254 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default address1=2001:db8::1/64 ip6-privacy=1 method=manual [proxy] 07070100000276000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_activebackup_nsna/wicked_xml07070100000277000081A40000000000000000000000016A032DB6000005AC000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_nsna/wicked_xml/config.xml eth9 hotplug team0 false true disable team0 boot only_active 2001:db8::254 500 5 true true prefer-public
2001:db8::1/64
eth8 hotplug team0 false true disable 07070100000278000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/team_activebackup_nsna207070100000279000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 0707010000027A000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/netconfig0707010000027B000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/netconfig/config0707010000027C000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/netconfig/dhcp0707010000027D000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 0707010000027E000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 0707010000027F000081A40000000000000000000000016A032DB600000122000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=2001:db8::1/64 TEAM_RUNNER=activebackup TEAM_AB_HWADDR_POLICY=only_active TEAM_LW_NAME=nsna_ping TEAM_LW_NSNA_PING_INTERVAL=500 TEAM_LW_NSNA_PING_TARGET_HOST=2001:db8::254 TEAM_LW_NSNA_PING_MISSED_MAX=5 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 07070100000280000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/system-connections07070100000281000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet interface-name=eth8 master=team0 slave-type=bond [ethernet] [match] 07070100000282000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet interface-name=eth9 master=team0 slave-type=bond [ethernet] [match] 07070100000283000081A40000000000000000000000016A032DB600000140000000000000000000000000000000000000005400000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] [bond] arp_interval=500 arp_missed_max=5 fail_over_mac=follow mode=active-backup ns_ip6_target=2001:db8::254 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default address1=2001:db8::1/64 ip6-privacy=1 method=manual [proxy] 07070100000284000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/wicked_xml07070100000285000081A40000000000000000000000016A032DB6000005AF000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/team_activebackup_nsna2/wicked_xml/config.xml eth9 hotplug team0 false true disable team0 boot only_active 2001:db8::254 500 5 true true prefer-public
2001:db8::1/64
eth8 hotplug team0 false true disable 07070100000286000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/team_lacp_ethtool07070100000287000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 07070100000288000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/team_lacp_ethtool/netconfig07070100000289000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_lacp_ethtool/netconfig/config0707010000028A000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_lacp_ethtool/netconfig/dhcp0707010000028B000081A40000000000000000000000016A032DB600000089000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/netconfig/ifcfg-en0STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 # Optional priority if we want to test it via ifcfg # TEAM_PORT_CONFIG='{"prio": 10}' 0707010000028C000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/netconfig/ifcfg-en1STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 0707010000028D000081A40000000000000000000000016A032DB600000150000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.100.1/24 TEAM_RUNNER=lacp TEAM_LACP_FAST_RATE=yes TEAM_LACP_SYS_PRIO=100 TEAM_LACP_MIN_PORTS=2 TEAM_LACP_SELECT_POLICY=bandwidth TEAM_RUNNER_TX_HASH='ipv4,ipv6,l4' TEAM_LW_NAME=ethtool TEAM_LW_ETHTOOL_DELAY_UP=10 TEAM_LW_ETHTOOL_DELAY_DOWN=20 TEAM_PORT_DEVICE_1=en0 TEAM_PORT_DEVICE_2=en1 0707010000028E000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/system-connections0707010000028F000081A40000000000000000000000016A032DB60000006A000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/system-connections/en0.nmconnection[connection] id=en0 type=ethernet controller=team0 interface-name=en0 port-type=bond [ethernet] [match] 07070100000290000081A40000000000000000000000016A032DB60000006A000000000000000000000000000000000000004C00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/system-connections/en1.nmconnection[connection] id=en1 type=ethernet controller=team0 interface-name=en1 port-type=bond [ethernet] [match] 07070100000291000081A40000000000000000000000016A032DB600000173000000000000000000000000000000000000004E00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] [bond] ad_actor_sys_prio=100 ad_select=bandwidth downdelay=20 lacp_active=0 lacp_rate=fast miimon=10 min_links=2 mode=802.3ad updelay=10 xmit_hash_policy=layer2+3 [match] [ipv4] address1=192.168.100.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000292000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/team_lacp_ethtool/wicked_xml07070100000293000081A40000000000000000000000016A032DB60000060F000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/team_lacp_ethtool/wicked_xml/config.xml en1 hotplug team0 false false team0 boot false true 100 2 bandwidth basic 50 10 20 true
192.168.100.1/24
true prefer-public
en0 hotplug team0 false false 07070100000294000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002900000000wicked2nm-1.5.0/tests/team_lacp_ethtool207070100000295000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 07070100000296000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/netconfig07070100000297000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/netconfig/config07070100000298000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/netconfig/dhcp07070100000299000081A40000000000000000000000016A032DB600000089000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/netconfig/ifcfg-en0STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 # Optional priority if we want to test it via ifcfg # TEAM_PORT_CONFIG='{"prio": 10}' 0707010000029A000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/netconfig/ifcfg-en1STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 0707010000029B000081A40000000000000000000000016A032DB600000150000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.100.1/24 TEAM_RUNNER=lacp TEAM_LACP_FAST_RATE=yes TEAM_LACP_SYS_PRIO=100 TEAM_LACP_MIN_PORTS=2 TEAM_LACP_SELECT_POLICY=bandwidth TEAM_RUNNER_TX_HASH='ipv4,ipv6,l4' TEAM_LW_NAME=ethtool TEAM_LW_ETHTOOL_DELAY_UP=10 TEAM_LW_ETHTOOL_DELAY_DOWN=20 TEAM_PORT_DEVICE_1=en0 TEAM_PORT_DEVICE_2=en1 0707010000029C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/system-connections0707010000029D000081A40000000000000000000000016A032DB600000067000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/system-connections/en0.nmconnection[connection] id=en0 type=ethernet interface-name=en0 master=team0 slave-type=bond [ethernet] [match] 0707010000029E000081A40000000000000000000000016A032DB600000067000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/system-connections/en1.nmconnection[connection] id=en1 type=ethernet interface-name=en1 master=team0 slave-type=bond [ethernet] [match] 0707010000029F000081A40000000000000000000000016A032DB600000174000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] [bond] ad_actor_sys_prio=100 ad_select=bandwidth downdelay=20 lacp_active=0 lacp_rate=fast miimon=10 min_links=2 mode=802.3ad updelay=10 xmit_hash_policy=layer2+3 [match] [ipv4] address1=192.168.100.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002A0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/wicked_xml070701000002A1000081A40000000000000000000000016A032DB600000612000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_lacp_ethtool2/wicked_xml/config.xml en1 hotplug team0 false false team0 boot false true 100 2 bandwidth basic 50 10 20 true
192.168.100.1/24
true prefer-public
en0 hotplug team0 false false 070701000002A2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/team_loadbalance_txhash070701000002A3000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 070701000002A4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/netconfig070701000002A5000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/netconfig/config070701000002A6000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/netconfig/dhcp070701000002A7000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002A8000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002A9000081A40000000000000000000000016A032DB6000000EE000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=172.16.0.1/16 TEAM_RUNNER=loadbalance TEAM_RUNNER_TX_HASH='ipv4,ipv6' TEAM_LW_NAME=ethtool TEAM_LW_ETHTOOL_DELAY_UP=200 TEAM_LW_ETHTOOL_DELAY_DOWN=200 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002AA000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/system-connections070701000002AB000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet controller=team0 interface-name=eth8 port-type=bond [ethernet] [match] 070701000002AC000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000005300000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet controller=team0 interface-name=eth9 port-type=bond [ethernet] [match] 070701000002AD000081A40000000000000000000000016A032DB600000124000000000000000000000000000000000000005400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] [bond] downdelay=200 miimon=200 mode=balance-tlb updelay=200 xmit_hash_policy=layer2+3 [match] [ipv4] address1=172.16.0.1/16 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002AE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/wicked_xml070701000002AF000081A40000000000000000000000016A032DB60000057F000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot basic 50 200 200 true
172.16.0.1/16
true prefer-public
eth8 hotplug team0 false false 070701000002B0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2070701000002B1000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 070701000002B2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/netconfig070701000002B3000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/netconfig/config070701000002B4000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/netconfig/dhcp070701000002B5000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002B6000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002B7000081A40000000000000000000000016A032DB6000000EE000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=172.16.0.1/16 TEAM_RUNNER=loadbalance TEAM_RUNNER_TX_HASH='ipv4,ipv6' TEAM_LW_NAME=ethtool TEAM_LW_ETHTOOL_DELAY_UP=200 TEAM_LW_ETHTOOL_DELAY_DOWN=200 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002B8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000004200000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/system-connections070701000002B9000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet interface-name=eth8 master=team0 slave-type=bond [ethernet] [match] 070701000002BA000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005400000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet interface-name=eth9 master=team0 slave-type=bond [ethernet] [match] 070701000002BB000081A40000000000000000000000016A032DB600000125000000000000000000000000000000000000005500000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] [bond] downdelay=200 miimon=200 mode=balance-tlb updelay=200 xmit_hash_policy=layer2+3 [match] [ipv4] address1=172.16.0.1/16 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002BC000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/wicked_xml070701000002BD000081A40000000000000000000000016A032DB600000582000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/team_loadbalance_txhash2/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot basic 50 200 200 true
172.16.0.1/16
true prefer-public
eth8 hotplug team0 false false 070701000002BE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002200000000wicked2nm-1.5.0/tests/team_random070701000002BF000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/team_random/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 070701000002C0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002C00000000wicked2nm-1.5.0/tests/team_random/netconfig070701000002C1000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/team_random/netconfig/config070701000002C2000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003100000000wicked2nm-1.5.0/tests/team_random/netconfig/dhcp070701000002C3000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_random/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002C4000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/team_random/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002C5000081A40000000000000000000000016A032DB60000008D000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_random/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=10.20.10.1/24 TEAM_RUNNER=random TEAM_LW_NAME=ethtool TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002C6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/team_random/system-connections070701000002C7000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/team_random/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet controller=team0 interface-name=eth8 port-type=bond [ethernet] [match] 070701000002C8000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/team_random/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet controller=team0 interface-name=eth9 port-type=bond [ethernet] [match] 070701000002C9000081A40000000000000000000000016A032DB600000103000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/team_random/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] [bond] miimon=100 mode=balance-rr packets_per_slave=0 [match] [ipv4] address1=10.20.10.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002CA000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/team_random/wicked_xml070701000002CB000081A40000000000000000000000016A032DB6000004CD000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_random/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot 0 0 true
10.20.10.1/24
true prefer-public
eth8 hotplug team0 false false 070701000002CC000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/team_random2070701000002CD000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/team_random2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 070701000002CE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/team_random2/netconfig070701000002CF000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/team_random2/netconfig/config070701000002D0000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/team_random2/netconfig/dhcp070701000002D1000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_random2/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002D2000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003800000000wicked2nm-1.5.0/tests/team_random2/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002D3000081A40000000000000000000000016A032DB60000008D000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_random2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=10.20.10.1/24 TEAM_RUNNER=random TEAM_LW_NAME=ethtool TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002D4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/team_random2/system-connections070701000002D5000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/team_random2/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet interface-name=eth8 master=team0 slave-type=bond [ethernet] [match] 070701000002D6000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000004800000000wicked2nm-1.5.0/tests/team_random2/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet interface-name=eth9 master=team0 slave-type=bond [ethernet] [match] 070701000002D7000081A40000000000000000000000016A032DB600000104000000000000000000000000000000000000004900000000wicked2nm-1.5.0/tests/team_random2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] [bond] miimon=100 mode=balance-rr packets_per_slave=0 [match] [ipv4] address1=10.20.10.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002D8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/team_random2/wicked_xml070701000002D9000081A40000000000000000000000016A032DB6000004D0000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_random2/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot 0 0 true
10.20.10.1/24
true prefer-public
eth8 hotplug team0 false false 070701000002DA000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/team_roundrobin_arp070701000002DB000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_ge=1.46 070701000002DC000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003400000000wicked2nm-1.5.0/tests/team_roundrobin_arp/netconfig070701000002DD000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003B00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/netconfig/config070701000002DE000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_roundrobin_arp/netconfig/dhcp070701000002DF000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002E0000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002E1000081A40000000000000000000000016A032DB600000127000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_roundrobin_arp/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=10.10.10.1/24 TEAM_RUNNER=roundrobin TEAM_LW_NAME=arp_ping TEAM_LW_ARP_PING_INTERVAL=1000 TEAM_LW_ARP_PING_TARGET_HOST=10.10.10.254 TEAM_LW_ARP_PING_VALIDATE_ACTIVE=yes TEAM_LW_ARP_PING_VALIDATE_INACTIVE=yes TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002E2000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003D00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/system-connections070701000002E3000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet controller=team0 interface-name=eth8 port-type=bond [ethernet] [match] 070701000002E4000081A40000000000000000000000016A032DB60000006C000000000000000000000000000000000000004F00000000wicked2nm-1.5.0/tests/team_roundrobin_arp/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet controller=team0 interface-name=eth9 port-type=bond [ethernet] [match] 070701000002E5000081A40000000000000000000000016A032DB600000122000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/team_roundrobin_arp/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-ports=1 interface-name=team0 [ethernet] [bond] arp_interval=1000 arp_ip_target=10.10.10.254 arp_validate=all mode=balance-rr [match] [ipv4] address1=10.10.10.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002E6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/team_roundrobin_arp/wicked_xml070701000002E7000081A40000000000000000000000016A032DB60000055E000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_roundrobin_arp/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot 10.10.10.254 1000 true true true
10.10.10.1/24
true prefer-public
eth8 hotplug team0 false false 070701000002E8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002B00000000wicked2nm-1.5.0/tests/team_roundrobin_arp2070701000002E9000081A40000000000000000000000016A032DB60000002F000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/ENVW2NM_WITHOUT_NETCONFIG=true NM_VERSION_lt=1.46 070701000002EA000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/netconfig070701000002EB000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003C00000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/netconfig/config070701000002EC000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/netconfig/dhcp070701000002ED000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002EE000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002EF000081A40000000000000000000000016A032DB600000127000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=10.10.10.1/24 TEAM_RUNNER=roundrobin TEAM_LW_NAME=arp_ping TEAM_LW_ARP_PING_INTERVAL=1000 TEAM_LW_ARP_PING_TARGET_HOST=10.10.10.254 TEAM_LW_ARP_PING_VALIDATE_ACTIVE=yes TEAM_LW_ARP_PING_VALIDATE_INACTIVE=yes TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002F0000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003E00000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/system-connections070701000002F1000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/system-connections/eth8.nmconnection[connection] id=eth8 type=ethernet interface-name=eth8 master=team0 slave-type=bond [ethernet] [match] 070701000002F2000081A40000000000000000000000016A032DB600000069000000000000000000000000000000000000005000000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/system-connections/eth9.nmconnection[connection] id=eth9 type=ethernet interface-name=eth9 master=team0 slave-type=bond [ethernet] [match] 070701000002F3000081A40000000000000000000000016A032DB600000123000000000000000000000000000000000000005100000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/system-connections/team0.nmconnection[connection] id=team0 type=bond autoconnect-slaves=1 interface-name=team0 [ethernet] [bond] arp_interval=1000 arp_ip_target=10.10.10.254 arp_validate=all mode=balance-rr [match] [ipv4] address1=10.10.10.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 070701000002F4000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/wicked_xml070701000002F5000081A40000000000000000000000016A032DB600000561000000000000000000000000000000000000004100000000wicked2nm-1.5.0/tests/team_roundrobin_arp2/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot 10.10.10.254 1000 true true true
10.10.10.1/24
true prefer-public
eth8 hotplug team0 false false 070701000002F6000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002400000000wicked2nm-1.5.0/tests/team_warnings070701000002F7000081A40000000000000000000000016A032DB600000032000000000000000000000000000000000000002800000000wicked2nm-1.5.0/tests/team_warnings/ENVW2NM_WITHOUT_NETCONFIG=true TEST_EXPECT_FAIL=true 070701000002F8000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/team_warnings/netconfig070701000002F9000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003500000000wicked2nm-1.5.0/tests/team_warnings/netconfig/config070701000002FA000081A40000000000000000000000016A032DB600000000000000000000000000000000000000000000003300000000wicked2nm-1.5.0/tests/team_warnings/netconfig/dhcp070701000002FB000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_warnings/netconfig/ifcfg-eth8STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002FC000081A40000000000000000000000016A032DB600000033000000000000000000000000000000000000003900000000wicked2nm-1.5.0/tests/team_warnings/netconfig/ifcfg-eth9STARTMODE=hotplug BOOTPROTO=none TEAM_MASTER=team0 070701000002FD000081A40000000000000000000000016A032DB6000001B2000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/team_warnings/netconfig/ifcfg-team0STARTMODE=auto BOOTPROTO=static IPADDR=192.168.60.1/24 # Use random runner (unsupported - will warn) TEAM_RUNNER=random TEAM_LW_NAME=arp_ping TEAM_LW_ARP_PING_INTERVAL=1000 TEAM_LW_ARP_PING_TARGET_HOST=192.168.60.254 # These ARP ping options are unsupported and will generate warnings: TEAM_LW_ARP_PING_SOURCE_HOST=192.168.60.1 TEAM_LW_ARP_PING_INIT_WAIT=100 TEAM_LW_ARP_PING_VLANID=10 TEAM_PORT_DEVICE_1=eth9 TEAM_PORT_DEVICE_2=eth8 070701000002FE000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/team_warnings/wicked_xml070701000002FF000081A40000000000000000000000016A032DB600000557000000000000000000000000000000000000003A00000000wicked2nm-1.5.0/tests/team_warnings/wicked_xml/config.xml eth9 hotplug team0 false false team0 boot 192.168.60.1 192.168.60.254 1000 100 10 true
192.168.60.1/24
true prefer-public
eth8 hotplug team0 false false 07070100000300000081ED0000000000000000000000016A032DB6000025CC000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/test.sh#!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' BOLD='\033[1m' NC='\033[0m' FAILED_TESTS=() SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) cd $SCRIPT_DIR MIGRATE_WICKED_BIN="$SCRIPT_DIR/../target/debug/wicked2nm" TEST_DIRS=${TEST_DIRS:-$(ls -d */ | sed 's#/##')} NO_CLEANUP=${NO_CLEANUP:-0} NO_WICKED=${NO_WICKED:-0} NM_CLEANUP=${NM_CLEANUP:-0} FORCE=${FORCE:-0} LOG_LEVEL=1 TEST_STDIN=true NM_VERSION=$(NetworkManager --version) KEEP_CONNECTIONS=() CONNECTIONS=() error_msg() { log_error "Error for test $1:$2" } log_error() { [ $LOG_LEVEL -gt 0 ] && echo -e "${RED}$@${NC}" } log_verbose() { [ $LOG_LEVEL -gt 1 ] && echo -e "$@" } keep_connection() { local con=$1 local element for element in "${KEEP_CONNECTIONS[@]}"; do if [[ "$element" == "$con" ]]; then return 0 # Found fi done return 1 # Not found } refresh_connections() { local filename CONNECTIONS=() while IFS= read -r -d '' filename ; do [[ "$filename" != *".nmconnection" ]] && continue uuid=$(grep '^uuid=' "$filename" -m 1 | cut -d= -f2) con_name=$(grep '^id=' "$filename" -m 1 | cut -d= -f2) keep_connection "$con_name" && continue keep_connection "$uuid" && continue CONNECTIONS+=("$con_name") done < <(find "/etc/NetworkManager/system-connections/" -maxdepth 1 -type f -print0) } nm_cleanup() { refresh_connections for con in "${CONNECTIONS[@]}"; do IFS=: read NAME UUID XXX < <(nmcli -t -f NAME,UUID c s | grep -P '(^|:)'"$con"'($|:)') [[ -z "$UUID" ]] && continue; echo "nmcli con delete $UUID ($NAME)" nmcli con delete "$UUID" while nmcli -t -f UUID c s | grep -P "^$UUID$" >/dev/null; do echo " -> Wait for $NAME($UUID) deletion" sleep 1 done done } nm_version_greater_equal() { printf '%s\n%s\n' "$1" "$NM_VERSION" | sort --check=quiet --version-sort } print_help() { echo "Usage:" echo " ./test [ARGUMENTS] [TEST_DIRS]" echo "" echo "Arguments:" echo " -v|--verbose Be more verbose" echo " --debug Prints out all commands executed" echo " --binary Path to wicked2nm binary" echo " -q|--quiet Be less verbose" echo " --nm-cleanup Cleanup current NetworkManager config before start" echo " -f|--force Force decision (e.g. cleanup Connections)" echo " -k|--keep-connection Connections will not be removed with --nm-cleanup" echo " --no-cleanup Do not cleanup NetworkManger after test" echo " --no-wicked If set, ifcfg tests do not fail when wicked isn't available" echo " -h|--help Print this help" } POSITIONAL_ARGS=() while [[ $# -gt 0 ]]; do opt=$1; shift; case $opt in -v|--verbose) LOG_LEVEL=$((LOG_LEVEL + 1)) ;; --debug) set -x ;; --binary) MIGRATE_WICKED_BIN=$1; shift ;; --no-wicked) NO_WICKED=1; ;; -k|--keep-connection) KEEP_CONNECTIONS+=("$1") shift; ;; --nm-cleanup) NM_CLEANUP=1 ;; -f|--force) FORCE=1 ;; --no-cleanup) NO_CLEANUP=1 ;; -q|--quiet) [ $LOG_LEVEL -gt 0 ] && LOG_LEVEL=$((LOG_LEVEL - 1)) ;; -h|--help) print_help exit 0; ;; -*|--*) echo "Unknown option $opt" exit 1 ;; *) POSITIONAL_ARGS+=("$opt") # save positional arg ;; esac done if [ ${#POSITIONAL_ARGS[@]} -gt 0 ]; then TEST_STDIN=false TEST_DIRS=() for pos_arg in "${POSITIONAL_ARGS[@]}"; do if [[ "$pos_arg" == "stdin" ]]; then TEST_STDIN=true else TEST_DIRS+=("$pos_arg") fi done fi if [[ $NM_CLEANUP -gt 0 ]]; then refresh_connections if [ ${#CONNECTIONS[@]} -gt 0 ]; then echo -e "The following connections will be deleted:" for c in "${CONNECTIONS[@]}"; do echo " $c"; done | sort if [ "$FORCE" -ne 1 ]; then read -p "Do you want to continue? [y/N] " continue_cleanup if [ "$continue_cleanup" != "y" ]; then exit 1 fi fi nm_cleanup fi fi refresh_connections if [[ ${#CONNECTIONS[@]} -gt 0 ]]; then echo -e "${RED}There are already NM connections. You may be running this script on a live system, which is highly discouraged!${NC}" exit 1 fi if [ ! -f $MIGRATE_WICKED_BIN ]; then echo -e "${RED}No wicked2nm binary found${NC}" exit 1 fi for test_dir in ${TEST_DIRS[@]}; do if [ ! -d "$SCRIPT_DIR/$test_dir" ]; then echo -e "${RED}[ERROR]${NC} Directory ${BOLD}$test_dir${NC} doesn't exists!" FAILED_TESTS+=("${test_dir}::test-dir-exists") continue fi echo -e "${BOLD}Testing ${test_dir}${NC}" cd $SCRIPT_DIR/$test_dir # Reset all environment variables unset W2NM_DRY_RUN unset W2NM_ACTIVATE_CONNECTIONS unset W2NM_CONTINUE_MIGRATION unset W2NM_WITHOUT_NETCONFIG unset W2NM_NETCONFIG_BASE_DIR unset W2NM_NETCONFIG_PATH unset W2NM_NETCONFIG_DHCP_PATH NM_VERSION_lt= NM_VERSION_ge= TEST_EXPECT_FAIL=false if [ -f ./ENV ]; then set -a && source ./ENV set +a fi if [ -n "$NM_VERSION_ge" ] && ! nm_version_greater_equal "$NM_VERSION_ge"; then echo "NM version too low, skipping..." continue fi if [ -n "$NM_VERSION_lt" ] && nm_version_greater_equal "$NM_VERSION_lt"; then echo "NM version too high, skipping..." continue fi if ls -1 ./netconfig/ifcfg-* >/dev/null 2>&1 && [ $NO_WICKED -eq 0 ]; then err_log="$SCRIPT_DIR/$test_dir/wicked_show_config_error.log" cfg_out="$SCRIPT_DIR/$test_dir/wicked_xml/config.xml" if ! command -v wicked >/dev/null ; then error_msg "$test_dir" "missing wicked executable" FAILED_TESTS+=("${test_dir}::wicked-show-config") continue fi wicked show-config --ifconfig compat:./netconfig \ > "$cfg_out" \ 2> "$err_log" if [ $? -ne 0 ] || [ -s "$err_log" ]; then err_msg="'wicked show-config' failed" [ -s "$err_log" ] && err_msg+=" see $err_log" error_msg "$test_dir" "$err_msg" FAILED_TESTS+=("${test_dir}::wicked-show-config") continue fi # https://unix.stackexchange.com/a/209744 regex_esc_test_dir="$(printf '%s' "$test_dir" | sed 's/[\/.[\(*^$+?{|]/\\&/g')" sed -i -E 's/[^:]+(\/tests\/'"$regex_esc_test_dir"')/\1/' "$cfg_out" fi log_verbose "RUN: $MIGRATE_WICKED_BIN show $test_dir/wicked_xml" $MIGRATE_WICKED_BIN show ./wicked_xml if [ $? -ne 0 ] && [ "$TEST_EXPECT_FAIL" = false ]; then error_msg ${test_dir} "show failed" FAILED_TESTS+=("${test_dir}::show") fi log_verbose "RUN: $MIGRATE_WICKED_BIN migrate $test_dir/wicked_xml" if $MIGRATE_WICKED_BIN migrate ./wicked_xml; then if [ "$TEST_EXPECT_FAIL" = true ]; then error_msg ${test_dir} "migration succeeded but test expected fail" FAILED_TESTS+=("${test_dir}::migrate") continue fi else if [ "$TEST_EXPECT_FAIL" = false ]; then error_msg ${test_dir} "migration failed" FAILED_TESTS+=("${test_dir}::migrate") continue else echo -e "${GREEN}Migration for $test_dir failed as expected${NC}" fi fi if [ -d "./system-connections" ]; then for cmp_file in $(ls -1 ./system-connections/); do a="./system-connections/$cmp_file" b="/etc/NetworkManager/system-connections/${cmp_file}" diff_cmd="diff --unified=0 --color=always -I uuid -I timestamp $a $b" log_verbose "RUN: $diff_cmd" if $diff_cmd; then echo -e "${GREEN}Migration for connection ${cmp_file/\.nmconnection/} successful${NC}" else diff_cmd="diff -I uuid -I timestamp --color=always $a $b" log_verbose "RUN: $diff_cmd\n$($diff_cmd)\n" error_msg ${test_dir} "$cmp_file didn't match" FAILED_TESTS+=("${test_dir}::compare_config::${cmp_file}") fi done fi [ "$NO_CLEANUP" -gt 0 ] || nm_cleanup done if $TEST_STDIN; then echo -e "${BOLD}Testing stdin show${NC}" cat </dev/null
192.168.100.5/24
EOF if [ $? -ne 0 ]; then error_msg "stdin" "show failed" FAILED_TESTS+=("stdin::show") else echo -e "${GREEN}stdin show successful${NC}" fi echo -e "${BOLD}Testing stdin migrate${NC}" cat <&1 | grep "192.168.100.5" &>/dev/null
192.168.100.5/24
EOF if [ $? -ne 0 ]; then error_msg "stdin" "migrate failed" FAILED_TESTS+=("stdin::migrate") else echo -e "${GREEN}stdin migrate successful${NC}" fi fi echo -e "\n${BOLD}Result:${NC}" if [ ${#FAILED_TESTS[@]} -eq 0 ]; then echo -e "${GREEN}All tests successful${NC}" else echo -e "${RED}Failed test cases:" for testcase in "${FAILED_TESTS[@]}"; do echo " $testcase" done echo -n -e "${NC}" exit 1 fi 07070100000301000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001A00000000wicked2nm-1.5.0/tests/tun07070100000302000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000001E00000000wicked2nm-1.5.0/tests/tun/ENVW2NM_WITHOUT_NETCONFIG=true 07070100000303000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/tun/system-connections07070100000304000081A40000000000000000000000016A032DB6000000C7000000000000000000000000000000000000003F00000000wicked2nm-1.5.0/tests/tun/system-connections/tun9.nmconnection[connection] id=tun9 uuid=d06fb4af-cda0-4314-9a7e-c337d636d6d6 type=tun interface-name=tun9 [tun] group=0 owner=0 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=auto [proxy] 07070100000305000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002500000000wicked2nm-1.5.0/tests/tun/wicked_xml07070100000306000081A40000000000000000000000016A032DB6000000E6000000000000000000000000000000000000002D00000000wicked2nm-1.5.0/tests/tun/wicked_xml/tun.xml tun9 boot 0 0 07070100000307000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001B00000000wicked2nm-1.5.0/tests/vlan07070100000308000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000001F00000000wicked2nm-1.5.0/tests/vlan/ENVW2NM_WITHOUT_NETCONFIG=true 07070100000309000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/vlan/system-connections0707010000030A000081A40000000000000000000000016A032DB60000013B000000000000000000000000000000000000004300000000wicked2nm-1.5.0/tests/vlan/system-connections/eth9.10.nmconnection[connection] id=eth9.10 uuid=91726373-17de-4fbc-b794-91f2e13127aa type=vlan interface-name=eth9.10 [ethernet] cloned-mac-address=DE:EA:DD:BE:EE:FF [vlan] flags=0 id=10 parent=eth9 protocol=802.1Q [match] [ipv4] address1=10.1.0.1/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 0707010000030B000081A40000000000000000000000016A032DB6000000E7000000000000000000000000000000000000004000000000wicked2nm-1.5.0/tests/vlan/system-connections/eth9.nmconnection[connection] id=eth9 uuid=413aa828-9cb9-4dfe-8b16-8774fbe2d9f4 type=ethernet interface-name=eth9 [ethernet] [match] [ipv4] address1=192.168.100.5/24 method=manual [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 0707010000030C000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002600000000wicked2nm-1.5.0/tests/vlan/wicked_xml0707010000030D000081A40000000000000000000000016A032DB6000001E3000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/vlan/wicked_xml/eth9.xml eth9 boot true true
192.168.100.5/24
true prefer-public false
0707010000030E000081A40000000000000000000000016A032DB600000270000000000000000000000000000000000000002F00000000wicked2nm-1.5.0/tests/vlan/wicked_xml/vlan.xml eth9.10 boot eth9
de:ea:dd:be:ee:ff
ieee802-1Q 10
true true
10.1.0.1/24
true prefer-public false
0707010000030F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000001F00000000wicked2nm-1.5.0/tests/wireless07070100000310000081A40000000000000000000000016A032DB600000039000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/wireless/ENVW2NM_CONTINUE_MIGRATION=true W2NM_WITHOUT_NETCONFIG=true 07070100000311000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003200000000wicked2nm-1.5.0/tests/wireless/system-connections07070100000312000081A40000000000000000000000016A032DB60000017D000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan0-0.nmconnection[connection] id=wlan0-0 uuid=2a262d6e-ccba-4afb-a190-ec08d0175c56 type=wifi autoconnect=false interface-name=wlan0 [wifi] band=a bssid=12:34:56:78:9A:BC channel=100 hidden=true mode=adhoc ssid=example_ssid [wifi-security] group=ccmp; key-mgmt=wpa-psk pairwise=ccmp; pmf=2 psk=example_passwd [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000313000081A40000000000000000000000016A032DB600000154000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan0-1.nmconnection[connection] id=wlan0-1 uuid=e05ab8eb-9905-4746-b81a-54e190b16354 type=wifi autoconnect=false interface-name=wlan0 [wifi] hidden=true mode=adhoc ssid=example_ssid2 [wifi-security] group=ccmp; key-mgmt=wpa-psk pairwise=ccmp; pmf=2 psk=example_passwd2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000314000081A40000000000000000000000016A032DB600000189000000000000000000000000000000000000004500000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan1.nmconnection[connection] id=wlan1 uuid=9d48ef42-2c96-4e43-8ab6-6c66385efdb6 type=wifi autoconnect=false interface-name=wlan1 [wifi] bssid=12:34:56:78:9A:BC mode=infrastructure ssid=wep_1 [wifi-security] auth-alg=shared key-mgmt=none wep-key-type=1 wep-key0=hello wep-key1=5b73215e232f4c577c5073455d wep-tx-keyidx=1 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000315000081A40000000000000000000000016A032DB6000000ED000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan2-0.nmconnection[connection] id=wlan2-0 uuid=81ea2b2d-e6bb-4897-aded-de95eb298de5 type=wifi interface-name=wlan2 [wifi] hidden=true mode=infrastructure ssid=open_1 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000316000081A40000000000000000000000016A032DB6000000E1000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan2-1.nmconnection[connection] id=wlan2-1 uuid=30a3966f-3005-4cab-bc0d-48b47d2d2ce6 type=wifi interface-name=wlan2 [wifi] mode=infrastructure ssid=open_2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000317000081A40000000000000000000000016A032DB600000121000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan3-0.nmconnection[connection] id=wlan3-0 uuid=899c6026-3000-4ca2-8526-216471cef61a type=wifi interface-name=wlan3 [wifi] hidden=true mode=infrastructure ssid=psk_1 [wifi-security] key-mgmt=wpa-psk psk=total_geheim!! [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000318000081A40000000000000000000000016A032DB600000115000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan3-1.nmconnection[connection] id=wlan3-1 uuid=f2465ff2-fc04-46ff-88be-b14805f0e972 type=wifi interface-name=wlan3 [wifi] mode=infrastructure ssid=psk_2 [wifi-security] key-mgmt=wpa-psk psk=total_geheim!! [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000319000081A40000000000000000000000016A032DB600000111000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan3-2.nmconnection[connection] id=wlan3-2 uuid=8676060a-0b82-4207-b0a2-a3420992ac2c type=wifi interface-name=wlan3 [wifi] mode=infrastructure ssid=psk_3 [wifi-security] key-mgmt=sae psk=total_geheim!! [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000031A000081A40000000000000000000000016A032DB600000115000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan3-3.nmconnection[connection] id=wlan3-3 uuid=c2f7bf46-9d1c-4dc0-b347-ac8973d1feb9 type=wifi interface-name=wlan3 [wifi] mode=infrastructure ssid=psk_4 [wifi-security] key-mgmt=wpa-psk psk=total_geheim!! [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000031B000081A40000000000000000000000016A032DB600000189000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan4-0.nmconnection[connection] id=wlan4-0 uuid=10de7698-31f0-4af8-a55f-a4526f6693de type=wifi interface-name=wlan4 [wifi] hidden=true mode=infrastructure ssid=eap_1 [wifi-security] key-mgmt=wpa-eap [802-1x] anonymous-identity=anonymous eap=peap; identity=tester password=test1234 phase1-peaplabel=0 phase2-auth=mschapv2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000031C000081A40000000000000000000000016A032DB600000189000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan4-1.nmconnection[connection] id=wlan4-1 uuid=2b177278-d460-4c93-95bb-c01bfca3782f type=wifi interface-name=wlan4 [wifi] hidden=true mode=infrastructure ssid=eap_2 [wifi-security] key-mgmt=wpa-eap [802-1x] anonymous-identity=anonymous eap=peap; identity=tester password=test1234 phase1-peaplabel=0 phase2-auth=mschapv2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000031D000081A40000000000000000000000016A032DB600000195000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan4-2.nmconnection[connection] id=wlan4-2 uuid=06236476-7fdb-4d3d-97e6-a24ec71fbf44 type=wifi interface-name=wlan4 [wifi] hidden=true mode=infrastructure ssid=eap_3 [wifi-security] key-mgmt=wpa-eap-suite-b-192 [802-1x] anonymous-identity=anonymous eap=peap; identity=tester password=test1234 phase1-peaplabel=0 phase2-auth=mschapv2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000031E000081A40000000000000000000000016A032DB600000189000000000000000000000000000000000000004700000000wicked2nm-1.5.0/tests/wireless/system-connections/wlan4-3.nmconnection[connection] id=wlan4-3 uuid=f8adfd38-7127-4a25-bddd-a65e8add0887 type=wifi interface-name=wlan4 [wifi] hidden=true mode=infrastructure ssid=eap_4 [wifi-security] key-mgmt=wpa-eap [802-1x] anonymous-identity=anonymous eap=peap; identity=tester password=test1234 phase1-peaplabel=0 phase2-auth=mschapv2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 0707010000031F000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002A00000000wicked2nm-1.5.0/tests/wireless/wicked_xml07070100000320000081A40000000000000000000000016A032DB6000019E9000000000000000000000000000000000000003700000000wicked2nm-1.5.0/tests/wireless/wicked_xml/wireless.xml wlan0 manual 1 example_ssid 100 12:34:56:78:9A:BC true ad-hoc wpa-psk,wpa-psk-sha256,sae example_passwd CCMP CCMP optional example_ssid2 true ad-hoc wpa-psk,wpa-psk-sha256,sae example_passwd2 CCMP CCMP optional false false wlan1 manual 1 wep_1 false infrastructure 12:34:56:78:9a:bc none shared 1 s:hello 5b73215e232f4c577c5073455d false false wlan2 boot 1 open_1 true infrastructure open_2 false infrastructure none false false wlan3 boot 1 psk_1 true infrastructure total_geheim!! psk_2 false infrastructure wpa-psk total_geheim!! psk_3 false infrastructure sae total_geheim!! psk_4 false infrastructure none,wpa-psk total_geheim!! false false wlan4 boot 1 nl80211 eap_1 true infrastructure peap tester false mschapv2 test1234 anonymous eap_2 true infrastructure wpa-eap peap tester false mschapv2 test1234 anonymous eap_3 true infrastructure wpa-eap-suite-b peap tester false mschapv2 test1234 anonymous eap_4 true infrastructure wpa-psk,wpa-eap peap tester false mschapv2 test1234 anonymous false false 07070100000321000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002300000000wicked2nm-1.5.0/tests/wireless_eap07070100000322000081A40000000000000000000000016A032DB60000001C000000000000000000000000000000000000002700000000wicked2nm-1.5.0/tests/wireless_eap/ENVW2NM_WITHOUT_NETCONFIG=true 07070100000323000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/wireless_eap/system-connections07070100000324000081A40000000000000000000000016A032DB600000241000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/wireless_eap/system-connections/wlan_eap0.nmconnection[connection] id=wlan_eap0 uuid=62c02744-5807-445b-9636-421b1162e000 type=wifi autoconnect=false interface-name=wlan_eap0 [wifi] bssid=12:34:56:78:9A:BC hidden=true mode=ap ssid=test [wifi-security] group=tkip;wep40; key-mgmt=wpa-eap pairwise=tkip; proto=wpa;rsn; [802-1x] ca-cert=/etc/sysconfig/network/./ca_cert client-cert=/etc/sysconfig/network/./client_cert eap=tls; identity=test phase1-peaplabel=0 private-key=/etc/sysconfig/network/./client_key private-key-password=testclientpw [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default method=disabled [proxy] 07070100000325000081A40000000000000000000000016A032DB6000001AF000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/wireless_eap/system-connections/wlan_eap1.nmconnection[connection] id=wlan_eap1 uuid=f16a2831-d858-4d0c-8799-5262884c50cc type=wifi autoconnect=false interface-name=wlan_eap1 [wifi] hidden=true mode=infrastructure ssid=example_ssid [wifi-security] key-mgmt=wpa-eap pmf=1 [802-1x] anonymous-identity=bob eap=md5; identity=alice password=test_pw phase1-peaplabel=0 phase2-auth=mschapv2 [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000326000081A40000000000000000000000016A032DB6000001B9000000000000000000000000000000000000004D00000000wicked2nm-1.5.0/tests/wireless_eap/system-connections/wlan_eap2.nmconnection[connection] id=wlan_eap2 uuid=36eca905-1ac0-42f2-873d-f2ed783f2ce6 type=wifi autoconnect=false interface-name=wlan_eap2 [wifi] hidden=true mode=infrastructure ssid=example_ssid2 [wifi-security] key-mgmt=wpa-eap pairwise=ccmp;tkip; pmf=3 [802-1x] eap=peap; identity=bob password=test_pw phase1-peaplabel=1 phase1-peapver=1 phase2-auth=chap [match] [ipv4] method=disabled [ipv6] addr-gen-mode=default ip6-privacy=1 method=auto [proxy] 07070100000327000041ED0000000000000000000000026A032DB600000000000000000000000000000000000000000000002E00000000wicked2nm-1.5.0/tests/wireless_eap/wicked_xml07070100000328000081A40000000000000000000000016A032DB600000C62000000000000000000000000000000000000003600000000wicked2nm-1.5.0/tests/wireless_eap/wicked_xml/eap.xml wlan_eap0 manual 1 test true ap 12:34:56:78:9a:bc wpa-eap tls wpa,rsn TKIP TKIP,WEP40 test /etc/sysconfig/network/./ca_cert /etc/sysconfig/network/./client_cert /etc/sysconfig/network/./client_key testclientpw false false wlan_eap1 manual 1 example_ssid true infrastructure wpa-eap md5 CCMP-256 disabled alice bob mschapv2 test_pw true prefer-public false wlan_eap2 manual 1 example_ssid2 true infrastructure wpa-eap peap CCMP,TKIP required bob 1 true chap test_pw true prefer-public false 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!1292 blocks