ifcfg_devname/
lib.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2
3use std::error;
4use std::str::FromStr;
5
6use mac_address::{mac_address_by_name, MacAddress};
7
8use lazy_static::lazy_static;
9use regex::Regex;
10
11/* Check if new devname is equal to kernel standard devname (eth0, etc.) */
12pub fn is_like_kernel_name(new_devname: &str) -> bool {
13    lazy_static! {
14        /* Check if new devname is equal to kernel standard devname (eth0, etc.)
15         * regex: ^eth\d+$
16         * ^eth - look for name starting with `eth`
17         * \d+$ - following with set of numbers [0-9]
18         * example: eth1234 | eth1234a
19         *          ^^^^^^^^  ~~~~~~~~
20         *           MATCH    NO MATCH */
21        static ref IS_NEW_DEVNAME_ETH_LIKE: Regex = Regex::new(r"^eth\d+$").unwrap();
22    }
23
24    IS_NEW_DEVNAME_ETH_LIKE.is_match(new_devname)
25}
26
27pub fn is_test_mode(params: &[String], number_params_required: usize) -> bool {
28    params.len() >= number_params_required
29}
30
31pub fn get_mac_address(
32    is_test_mode: bool,
33    args: &[String],
34    index: usize,
35    kernel_name: &str,
36) -> Result<MacAddress, Box<dyn error::Error>> {
37    let mac_address = if is_test_mode {
38        let mac_address = args[index].clone();
39        MacAddress::from_str(&mac_address)?
40    } else {
41        match mac_address_by_name(kernel_name)? {
42            Some(mac) => mac,
43            None => panic!(),
44        }
45    };
46
47    Ok(mac_address)
48}
49
50#[cfg(test)]
51pub mod should {
52    use super::*;
53
54    #[test]
55    #[should_panic]
56    fn check_for_test_mode() {
57        const NUMBER_PARAMS_REQUIRED: usize = 3;
58        const ARGS: Vec<String> = Vec::new();
59
60        let is_test_mode = is_test_mode(&ARGS, NUMBER_PARAMS_REQUIRED);
61
62        assert!(is_test_mode);
63    }
64
65    #[test]
66    fn check_if_is_like_kernel_name() {
67        const KERNEL_LIKE_NAME: &str = "eth123";
68
69        let is_like_kernel = is_like_kernel_name(KERNEL_LIKE_NAME);
70
71        assert!(is_like_kernel);
72    }
73
74    #[test]
75    #[should_panic]
76    fn not_get_mac_address() {
77        const IS_TEST_MODE: bool = false;
78        const ARGS: &Vec<String> = &Vec::new();
79        const INDEX: usize = 3;
80        let kernel_name: String = String::from_str("this-should-fail").unwrap();
81
82        let _ = get_mac_address(IS_TEST_MODE, ARGS, INDEX, &kernel_name);
83    }
84}