1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// SPDX-License-Identifier: Apache-2.0
use serde::{Deserialize, Serialize};
use crate::{ErrorKind, MergedInterfaces, NetworkStateMode, NmstateError};
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub struct DispatchConfig {
/// Dispatch bash script content to be invoked after interface activation
/// finished by network backend. Nmstate will append additional lines
/// to make sure this script is only invoked for specified interface when
/// backend interface activation finished.
/// Setting to empty string will remove the dispatch script
#[serde(skip_serializing_if = "Option::is_none")]
pub post_activation: Option<String>,
/// Dispatch bash script content to be invoked after interface deactivation
/// finished by network backend. Nmstate will append additional lines
/// to make sure this script is only invoked for specified interface when
/// backend interface deactivation finished.
/// Setting to empty string will remove the dispatch script
#[serde(skip_serializing_if = "Option::is_none")]
pub post_deactivation: Option<String>,
}
impl MergedInterfaces {
pub(crate) fn validate_dispatch_script_has_no_checkpoint(
&self,
) -> Result<(), NmstateError> {
if self.kernel_ifaces.values().any(|i| {
i.is_desired()
&& i.for_apply
.as_ref()
.map(|f| f.base_iface().dispatch.is_some())
.unwrap_or_default()
}) {
if self.mode == NetworkStateMode::GenerateConfig {
return Err(NmstateError::new(
ErrorKind::InvalidArgument,
"Dispatch script is not supported in gc(gen_conf) mode"
.to_string(),
));
} else {
log::info!(
"Dispatch script is not protected by checkpoint, please \
backup your original nmstate created dispatch scripts"
)
}
}
Ok(())
}
}