update sysmaster for compiling with rust 1.57
(cherry picked from commit 2521b5eedcccdce37796e22450da5b476efb033e)
This commit is contained in:
parent
b900050cbc
commit
83bebcca13
@ -1,613 +0,0 @@
|
||||
From 3c91ed36496fa7cab722cdc3646781c873242034 Mon Sep 17 00:00:00 2001
|
||||
From: overweight <hexiaowen@huawei.com>
|
||||
Date: Wed, 5 Jul 2023 10:53:20 +0800
|
||||
Subject: [PATCH] build: To adjust the directory structure
|
||||
|
||||
---
|
||||
Cargo.toml | 12 ++++++++----
|
||||
core/{lib => libsysmaster}/error.rs | 0
|
||||
core/{lib => libsysmaster}/exec/base.rs | 0
|
||||
core/{lib => libsysmaster}/exec/cmd.rs | 0
|
||||
core/{lib => libsysmaster}/exec/mod.rs | 0
|
||||
core/{lib => libsysmaster}/lib.rs | 0
|
||||
core/{lib => libsysmaster}/rel/api.rs | 0
|
||||
core/{lib => libsysmaster}/rel/base.rs | 0
|
||||
core/{lib => libsysmaster}/rel/enable.rs | 0
|
||||
core/{lib => libsysmaster}/rel/history.rs | 0
|
||||
core/{lib => libsysmaster}/rel/last.rs | 0
|
||||
core/{lib => libsysmaster}/rel/mod.rs | 0
|
||||
core/{lib => libsysmaster}/rel/pending.rs | 0
|
||||
core/{lib => libsysmaster}/rel/station.rs | 0
|
||||
core/{lib => libsysmaster}/serialize.rs | 0
|
||||
core/{lib => libsysmaster}/unit/base.rs | 0
|
||||
core/{lib => libsysmaster}/unit/deps.rs | 0
|
||||
core/{lib => libsysmaster}/unit/kill.rs | 0
|
||||
core/{lib => libsysmaster}/unit/mod.rs | 0
|
||||
core/{lib => libsysmaster}/unit/state.rs | 0
|
||||
core/{lib => libsysmaster}/unit/umif.rs | 0
|
||||
core/{lib => libsysmaster}/utils/fd.rs | 0
|
||||
core/{lib => libsysmaster}/utils/mod.rs | 0
|
||||
{exts/sctl/src => core/sctl}/main.rs | 0
|
||||
core/{bin => sysmaster}/job/alloc.rs | 0
|
||||
core/{bin => sysmaster}/job/entry.rs | 0
|
||||
core/{bin => sysmaster}/job/junit.rs | 0
|
||||
core/{bin => sysmaster}/job/manager.rs | 0
|
||||
core/{bin => sysmaster}/job/mod.rs | 0
|
||||
core/{bin => sysmaster}/job/notify.rs | 0
|
||||
core/{bin => sysmaster}/job/rentry.rs | 0
|
||||
core/{bin => sysmaster}/job/stat.rs | 0
|
||||
core/{bin => sysmaster}/job/table.rs | 0
|
||||
core/{bin => sysmaster}/job/transaction.rs | 0
|
||||
core/{bin => sysmaster}/keep_alive/mod.rs | 0
|
||||
core/{bin => sysmaster}/main.rs | 0
|
||||
core/{bin => sysmaster}/manager/alive_timer.rs | 0
|
||||
core/{bin => sysmaster}/manager/commands.rs | 0
|
||||
core/{bin => sysmaster}/manager/config.rs | 0
|
||||
core/{bin => sysmaster}/manager/mod.rs | 0
|
||||
core/{bin => sysmaster}/manager/pre_install.rs | 0
|
||||
core/{bin => sysmaster}/manager/rentry.rs | 0
|
||||
core/{bin => sysmaster}/manager/signals.rs | 0
|
||||
core/{bin => sysmaster}/mount/mod.rs | 0
|
||||
core/{bin => sysmaster}/mount/setup.rs | 0
|
||||
core/{bin => sysmaster}/plugin/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/base/load.rs | 0
|
||||
core/{bin => sysmaster}/unit/base/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/base/relation.rs | 0
|
||||
core/{bin => sysmaster}/unit/base/relation_atom.rs | 0
|
||||
core/{bin => sysmaster}/unit/data/dep_conf.rs | 0
|
||||
core/{bin => sysmaster}/unit/data/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/data/state.rs | 0
|
||||
core/{bin => sysmaster}/unit/data/table.rs | 0
|
||||
core/{bin => sysmaster}/unit/datastore/child.rs | 0
|
||||
core/{bin => sysmaster}/unit/datastore/deps.rs | 0
|
||||
core/{bin => sysmaster}/unit/datastore/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/datastore/sets.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/base.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/cgroup.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/child.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/condition.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/config.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/load.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/ratelimit.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/uentry.rs | 0
|
||||
core/{bin => sysmaster}/unit/entry/unitx.rs | 0
|
||||
core/{bin => sysmaster}/unit/execute/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/execute/spawn.rs | 0
|
||||
core/{bin => sysmaster}/unit/manager.rs | 0
|
||||
core/{bin => sysmaster}/unit/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/notify.rs | 0
|
||||
core/{bin => sysmaster}/unit/rentry.rs | 0
|
||||
core/{bin => sysmaster}/unit/runtime.rs | 0
|
||||
core/{bin => sysmaster}/unit/sigchld.rs | 0
|
||||
core/{bin => sysmaster}/unit/test/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/uload.rs | 0
|
||||
core/{bin => sysmaster}/unit/util/mod.rs | 0
|
||||
core/{bin => sysmaster}/unit/util/unit_file.rs | 0
|
||||
core/{bin => sysmaster}/utils/mod.rs | 0
|
||||
core/{bin => sysmaster}/utils/table.rs | 0
|
||||
exts/sctl/Cargo.toml | 13 -------------
|
||||
{exts/init => init}/Cargo.toml | 2 +-
|
||||
{exts/init => init}/src/main.rs | 0
|
||||
{exts/init => init}/src/runtime/comm.rs | 0
|
||||
{exts/init => init}/src/runtime/epoll.rs | 0
|
||||
{exts/init => init}/src/runtime/mod.rs | 0
|
||||
{exts/init => init}/src/runtime/param.rs | 0
|
||||
{exts/init => init}/src/runtime/signals.rs | 0
|
||||
{exts/init => init}/src/runtime/timer.rs | 0
|
||||
91 files changed, 9 insertions(+), 18 deletions(-)
|
||||
rename core/{lib => libsysmaster}/error.rs (100%)
|
||||
rename core/{lib => libsysmaster}/exec/base.rs (100%)
|
||||
rename core/{lib => libsysmaster}/exec/cmd.rs (100%)
|
||||
rename core/{lib => libsysmaster}/exec/mod.rs (100%)
|
||||
rename core/{lib => libsysmaster}/lib.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/api.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/base.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/enable.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/history.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/last.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/mod.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/pending.rs (100%)
|
||||
rename core/{lib => libsysmaster}/rel/station.rs (100%)
|
||||
rename core/{lib => libsysmaster}/serialize.rs (100%)
|
||||
rename core/{lib => libsysmaster}/unit/base.rs (100%)
|
||||
rename core/{lib => libsysmaster}/unit/deps.rs (100%)
|
||||
rename core/{lib => libsysmaster}/unit/kill.rs (100%)
|
||||
rename core/{lib => libsysmaster}/unit/mod.rs (100%)
|
||||
rename core/{lib => libsysmaster}/unit/state.rs (100%)
|
||||
rename core/{lib => libsysmaster}/unit/umif.rs (100%)
|
||||
rename core/{lib => libsysmaster}/utils/fd.rs (100%)
|
||||
rename core/{lib => libsysmaster}/utils/mod.rs (100%)
|
||||
rename {exts/sctl/src => core/sctl}/main.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/alloc.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/entry.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/junit.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/manager.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/notify.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/rentry.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/stat.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/table.rs (100%)
|
||||
rename core/{bin => sysmaster}/job/transaction.rs (100%)
|
||||
rename core/{bin => sysmaster}/keep_alive/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/main.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/alive_timer.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/commands.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/config.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/pre_install.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/rentry.rs (100%)
|
||||
rename core/{bin => sysmaster}/manager/signals.rs (100%)
|
||||
rename core/{bin => sysmaster}/mount/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/mount/setup.rs (100%)
|
||||
rename core/{bin => sysmaster}/plugin/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/base/load.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/base/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/base/relation.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/base/relation_atom.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/data/dep_conf.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/data/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/data/state.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/data/table.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/datastore/child.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/datastore/deps.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/datastore/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/datastore/sets.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/base.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/cgroup.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/child.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/condition.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/config.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/load.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/ratelimit.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/uentry.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/entry/unitx.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/execute/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/execute/spawn.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/manager.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/notify.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/rentry.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/runtime.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/sigchld.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/test/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/uload.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/util/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/unit/util/unit_file.rs (100%)
|
||||
rename core/{bin => sysmaster}/utils/mod.rs (100%)
|
||||
rename core/{bin => sysmaster}/utils/table.rs (100%)
|
||||
delete mode 100644 exts/sctl/Cargo.toml
|
||||
rename {exts/init => init}/Cargo.toml (81%)
|
||||
rename {exts/init => init}/src/main.rs (100%)
|
||||
rename {exts/init => init}/src/runtime/comm.rs (100%)
|
||||
rename {exts/init => init}/src/runtime/epoll.rs (100%)
|
||||
rename {exts/init => init}/src/runtime/mod.rs (100%)
|
||||
rename {exts/init => init}/src/runtime/param.rs (100%)
|
||||
rename {exts/init => init}/src/runtime/signals.rs (100%)
|
||||
rename {exts/init => init}/src/runtime/timer.rs (100%)
|
||||
|
||||
diff --git a/Cargo.toml b/Cargo.toml
|
||||
index 089e7ab..f97be77 100644
|
||||
--- a/Cargo.toml
|
||||
+++ b/Cargo.toml
|
||||
@@ -7,12 +7,16 @@ build = "build.rs"
|
||||
|
||||
[lib]
|
||||
name = "sysmaster"
|
||||
-path = "core/lib/lib.rs"
|
||||
+path = "core/libsysmaster/lib.rs"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[[bin]]
|
||||
name = "sysmaster"
|
||||
-path = "core/bin/main.rs"
|
||||
+path = "core/sysmaster/main.rs"
|
||||
+
|
||||
+[[bin]]
|
||||
+name = "sctl"
|
||||
+path = "core/sctl/main.rs"
|
||||
|
||||
[dev-dependencies.libtests]
|
||||
path = "libs/libtests"
|
||||
@@ -111,9 +111,9 @@ overflow-checks = false
|
||||
|
||||
[workspace]
|
||||
members = [
|
||||
+ # sysmaster-init
|
||||
+ "init",
|
||||
# external binaries
|
||||
- "exts/init",
|
||||
- "exts/sctl",
|
||||
"exts/hostname_setup",
|
||||
#internal libraries crates
|
||||
"libs/cmdproto",
|
||||
diff --git a/core/lib/error.rs b/core/libsysmaster/error.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/error.rs
|
||||
rename to core/libsysmaster/error.rs
|
||||
diff --git a/core/lib/exec/base.rs b/core/libsysmaster/exec/base.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/exec/base.rs
|
||||
rename to core/libsysmaster/exec/base.rs
|
||||
diff --git a/core/lib/exec/cmd.rs b/core/libsysmaster/exec/cmd.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/exec/cmd.rs
|
||||
rename to core/libsysmaster/exec/cmd.rs
|
||||
diff --git a/core/lib/exec/mod.rs b/core/libsysmaster/exec/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/exec/mod.rs
|
||||
rename to core/libsysmaster/exec/mod.rs
|
||||
diff --git a/core/lib/lib.rs b/core/libsysmaster/lib.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/lib.rs
|
||||
rename to core/libsysmaster/lib.rs
|
||||
diff --git a/core/lib/rel/api.rs b/core/libsysmaster/rel/api.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/api.rs
|
||||
rename to core/libsysmaster/rel/api.rs
|
||||
diff --git a/core/lib/rel/base.rs b/core/libsysmaster/rel/base.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/base.rs
|
||||
rename to core/libsysmaster/rel/base.rs
|
||||
diff --git a/core/lib/rel/enable.rs b/core/libsysmaster/rel/enable.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/enable.rs
|
||||
rename to core/libsysmaster/rel/enable.rs
|
||||
diff --git a/core/lib/rel/history.rs b/core/libsysmaster/rel/history.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/history.rs
|
||||
rename to core/libsysmaster/rel/history.rs
|
||||
diff --git a/core/lib/rel/last.rs b/core/libsysmaster/rel/last.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/last.rs
|
||||
rename to core/libsysmaster/rel/last.rs
|
||||
diff --git a/core/lib/rel/mod.rs b/core/libsysmaster/rel/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/mod.rs
|
||||
rename to core/libsysmaster/rel/mod.rs
|
||||
diff --git a/core/lib/rel/pending.rs b/core/libsysmaster/rel/pending.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/pending.rs
|
||||
rename to core/libsysmaster/rel/pending.rs
|
||||
diff --git a/core/lib/rel/station.rs b/core/libsysmaster/rel/station.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/rel/station.rs
|
||||
rename to core/libsysmaster/rel/station.rs
|
||||
diff --git a/core/lib/serialize.rs b/core/libsysmaster/serialize.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/serialize.rs
|
||||
rename to core/libsysmaster/serialize.rs
|
||||
diff --git a/core/lib/unit/base.rs b/core/libsysmaster/unit/base.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/unit/base.rs
|
||||
rename to core/libsysmaster/unit/base.rs
|
||||
diff --git a/core/lib/unit/deps.rs b/core/libsysmaster/unit/deps.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/unit/deps.rs
|
||||
rename to core/libsysmaster/unit/deps.rs
|
||||
diff --git a/core/lib/unit/kill.rs b/core/libsysmaster/unit/kill.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/unit/kill.rs
|
||||
rename to core/libsysmaster/unit/kill.rs
|
||||
diff --git a/core/lib/unit/mod.rs b/core/libsysmaster/unit/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/unit/mod.rs
|
||||
rename to core/libsysmaster/unit/mod.rs
|
||||
diff --git a/core/lib/unit/state.rs b/core/libsysmaster/unit/state.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/unit/state.rs
|
||||
rename to core/libsysmaster/unit/state.rs
|
||||
diff --git a/core/lib/unit/umif.rs b/core/libsysmaster/unit/umif.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/unit/umif.rs
|
||||
rename to core/libsysmaster/unit/umif.rs
|
||||
diff --git a/core/lib/utils/fd.rs b/core/libsysmaster/utils/fd.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/utils/fd.rs
|
||||
rename to core/libsysmaster/utils/fd.rs
|
||||
diff --git a/core/lib/utils/mod.rs b/core/libsysmaster/utils/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/lib/utils/mod.rs
|
||||
rename to core/libsysmaster/utils/mod.rs
|
||||
diff --git a/exts/sctl/src/main.rs b/core/sctl/main.rs
|
||||
similarity index 100%
|
||||
rename from exts/sctl/src/main.rs
|
||||
rename to core/sctl/main.rs
|
||||
diff --git a/core/bin/job/alloc.rs b/core/sysmaster/job/alloc.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/alloc.rs
|
||||
rename to core/sysmaster/job/alloc.rs
|
||||
diff --git a/core/bin/job/entry.rs b/core/sysmaster/job/entry.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/entry.rs
|
||||
rename to core/sysmaster/job/entry.rs
|
||||
diff --git a/core/bin/job/junit.rs b/core/sysmaster/job/junit.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/junit.rs
|
||||
rename to core/sysmaster/job/junit.rs
|
||||
diff --git a/core/bin/job/manager.rs b/core/sysmaster/job/manager.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/manager.rs
|
||||
rename to core/sysmaster/job/manager.rs
|
||||
diff --git a/core/bin/job/mod.rs b/core/sysmaster/job/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/mod.rs
|
||||
rename to core/sysmaster/job/mod.rs
|
||||
diff --git a/core/bin/job/notify.rs b/core/sysmaster/job/notify.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/notify.rs
|
||||
rename to core/sysmaster/job/notify.rs
|
||||
diff --git a/core/bin/job/rentry.rs b/core/sysmaster/job/rentry.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/rentry.rs
|
||||
rename to core/sysmaster/job/rentry.rs
|
||||
diff --git a/core/bin/job/stat.rs b/core/sysmaster/job/stat.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/stat.rs
|
||||
rename to core/sysmaster/job/stat.rs
|
||||
diff --git a/core/bin/job/table.rs b/core/sysmaster/job/table.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/table.rs
|
||||
rename to core/sysmaster/job/table.rs
|
||||
diff --git a/core/bin/job/transaction.rs b/core/sysmaster/job/transaction.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/job/transaction.rs
|
||||
rename to core/sysmaster/job/transaction.rs
|
||||
diff --git a/core/bin/keep_alive/mod.rs b/core/sysmaster/keep_alive/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/keep_alive/mod.rs
|
||||
rename to core/sysmaster/keep_alive/mod.rs
|
||||
diff --git a/core/bin/main.rs b/core/sysmaster/main.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/main.rs
|
||||
rename to core/sysmaster/main.rs
|
||||
diff --git a/core/bin/manager/alive_timer.rs b/core/sysmaster/manager/alive_timer.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/alive_timer.rs
|
||||
rename to core/sysmaster/manager/alive_timer.rs
|
||||
diff --git a/core/bin/manager/commands.rs b/core/sysmaster/manager/commands.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/commands.rs
|
||||
rename to core/sysmaster/manager/commands.rs
|
||||
diff --git a/core/bin/manager/config.rs b/core/sysmaster/manager/config.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/config.rs
|
||||
rename to core/sysmaster/manager/config.rs
|
||||
diff --git a/core/bin/manager/mod.rs b/core/sysmaster/manager/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/mod.rs
|
||||
rename to core/sysmaster/manager/mod.rs
|
||||
diff --git a/core/bin/manager/pre_install.rs b/core/sysmaster/manager/pre_install.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/pre_install.rs
|
||||
rename to core/sysmaster/manager/pre_install.rs
|
||||
diff --git a/core/bin/manager/rentry.rs b/core/sysmaster/manager/rentry.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/rentry.rs
|
||||
rename to core/sysmaster/manager/rentry.rs
|
||||
diff --git a/core/bin/manager/signals.rs b/core/sysmaster/manager/signals.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/manager/signals.rs
|
||||
rename to core/sysmaster/manager/signals.rs
|
||||
diff --git a/core/bin/mount/mod.rs b/core/sysmaster/mount/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/mount/mod.rs
|
||||
rename to core/sysmaster/mount/mod.rs
|
||||
diff --git a/core/bin/mount/setup.rs b/core/sysmaster/mount/setup.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/mount/setup.rs
|
||||
rename to core/sysmaster/mount/setup.rs
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/sysmaster/plugin/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/plugin/mod.rs
|
||||
rename to core/sysmaster/plugin/mod.rs
|
||||
diff --git a/core/bin/unit/base/load.rs b/core/sysmaster/unit/base/load.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/base/load.rs
|
||||
rename to core/sysmaster/unit/base/load.rs
|
||||
diff --git a/core/bin/unit/base/mod.rs b/core/sysmaster/unit/base/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/base/mod.rs
|
||||
rename to core/sysmaster/unit/base/mod.rs
|
||||
diff --git a/core/bin/unit/base/relation.rs b/core/sysmaster/unit/base/relation.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/base/relation.rs
|
||||
rename to core/sysmaster/unit/base/relation.rs
|
||||
diff --git a/core/bin/unit/base/relation_atom.rs b/core/sysmaster/unit/base/relation_atom.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/base/relation_atom.rs
|
||||
rename to core/sysmaster/unit/base/relation_atom.rs
|
||||
diff --git a/core/bin/unit/data/dep_conf.rs b/core/sysmaster/unit/data/dep_conf.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/data/dep_conf.rs
|
||||
rename to core/sysmaster/unit/data/dep_conf.rs
|
||||
diff --git a/core/bin/unit/data/mod.rs b/core/sysmaster/unit/data/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/data/mod.rs
|
||||
rename to core/sysmaster/unit/data/mod.rs
|
||||
diff --git a/core/bin/unit/data/state.rs b/core/sysmaster/unit/data/state.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/data/state.rs
|
||||
rename to core/sysmaster/unit/data/state.rs
|
||||
diff --git a/core/bin/unit/data/table.rs b/core/sysmaster/unit/data/table.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/data/table.rs
|
||||
rename to core/sysmaster/unit/data/table.rs
|
||||
diff --git a/core/bin/unit/datastore/child.rs b/core/sysmaster/unit/datastore/child.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/datastore/child.rs
|
||||
rename to core/sysmaster/unit/datastore/child.rs
|
||||
diff --git a/core/bin/unit/datastore/deps.rs b/core/sysmaster/unit/datastore/deps.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/datastore/deps.rs
|
||||
rename to core/sysmaster/unit/datastore/deps.rs
|
||||
diff --git a/core/bin/unit/datastore/mod.rs b/core/sysmaster/unit/datastore/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/datastore/mod.rs
|
||||
rename to core/sysmaster/unit/datastore/mod.rs
|
||||
diff --git a/core/bin/unit/datastore/sets.rs b/core/sysmaster/unit/datastore/sets.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/datastore/sets.rs
|
||||
rename to core/sysmaster/unit/datastore/sets.rs
|
||||
diff --git a/core/bin/unit/entry/base.rs b/core/sysmaster/unit/entry/base.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/base.rs
|
||||
rename to core/sysmaster/unit/entry/base.rs
|
||||
diff --git a/core/bin/unit/entry/cgroup.rs b/core/sysmaster/unit/entry/cgroup.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/cgroup.rs
|
||||
rename to core/sysmaster/unit/entry/cgroup.rs
|
||||
diff --git a/core/bin/unit/entry/child.rs b/core/sysmaster/unit/entry/child.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/child.rs
|
||||
rename to core/sysmaster/unit/entry/child.rs
|
||||
diff --git a/core/bin/unit/entry/condition.rs b/core/sysmaster/unit/entry/condition.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/condition.rs
|
||||
rename to core/sysmaster/unit/entry/condition.rs
|
||||
diff --git a/core/bin/unit/entry/config.rs b/core/sysmaster/unit/entry/config.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/config.rs
|
||||
rename to core/sysmaster/unit/entry/config.rs
|
||||
diff --git a/core/bin/unit/entry/load.rs b/core/sysmaster/unit/entry/load.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/load.rs
|
||||
rename to core/sysmaster/unit/entry/load.rs
|
||||
diff --git a/core/bin/unit/entry/mod.rs b/core/sysmaster/unit/entry/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/mod.rs
|
||||
rename to core/sysmaster/unit/entry/mod.rs
|
||||
diff --git a/core/bin/unit/entry/ratelimit.rs b/core/sysmaster/unit/entry/ratelimit.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/ratelimit.rs
|
||||
rename to core/sysmaster/unit/entry/ratelimit.rs
|
||||
diff --git a/core/bin/unit/entry/uentry.rs b/core/sysmaster/unit/entry/uentry.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/uentry.rs
|
||||
rename to core/sysmaster/unit/entry/uentry.rs
|
||||
diff --git a/core/bin/unit/entry/unitx.rs b/core/sysmaster/unit/entry/unitx.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/entry/unitx.rs
|
||||
rename to core/sysmaster/unit/entry/unitx.rs
|
||||
diff --git a/core/bin/unit/execute/mod.rs b/core/sysmaster/unit/execute/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/execute/mod.rs
|
||||
rename to core/sysmaster/unit/execute/mod.rs
|
||||
diff --git a/core/bin/unit/execute/spawn.rs b/core/sysmaster/unit/execute/spawn.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/execute/spawn.rs
|
||||
rename to core/sysmaster/unit/execute/spawn.rs
|
||||
diff --git a/core/bin/unit/manager.rs b/core/sysmaster/unit/manager.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/manager.rs
|
||||
rename to core/sysmaster/unit/manager.rs
|
||||
diff --git a/core/bin/unit/mod.rs b/core/sysmaster/unit/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/mod.rs
|
||||
rename to core/sysmaster/unit/mod.rs
|
||||
diff --git a/core/bin/unit/notify.rs b/core/sysmaster/unit/notify.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/notify.rs
|
||||
rename to core/sysmaster/unit/notify.rs
|
||||
diff --git a/core/bin/unit/rentry.rs b/core/sysmaster/unit/rentry.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/rentry.rs
|
||||
rename to core/sysmaster/unit/rentry.rs
|
||||
diff --git a/core/bin/unit/runtime.rs b/core/sysmaster/unit/runtime.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/runtime.rs
|
||||
rename to core/sysmaster/unit/runtime.rs
|
||||
diff --git a/core/bin/unit/sigchld.rs b/core/sysmaster/unit/sigchld.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/sigchld.rs
|
||||
rename to core/sysmaster/unit/sigchld.rs
|
||||
diff --git a/core/bin/unit/test/mod.rs b/core/sysmaster/unit/test/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/test/mod.rs
|
||||
rename to core/sysmaster/unit/test/mod.rs
|
||||
diff --git a/core/bin/unit/uload.rs b/core/sysmaster/unit/uload.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/uload.rs
|
||||
rename to core/sysmaster/unit/uload.rs
|
||||
diff --git a/core/bin/unit/util/mod.rs b/core/sysmaster/unit/util/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/util/mod.rs
|
||||
rename to core/sysmaster/unit/util/mod.rs
|
||||
diff --git a/core/bin/unit/util/unit_file.rs b/core/sysmaster/unit/util/unit_file.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/unit/util/unit_file.rs
|
||||
rename to core/sysmaster/unit/util/unit_file.rs
|
||||
diff --git a/core/bin/utils/mod.rs b/core/sysmaster/utils/mod.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/utils/mod.rs
|
||||
rename to core/sysmaster/utils/mod.rs
|
||||
diff --git a/core/bin/utils/table.rs b/core/sysmaster/utils/table.rs
|
||||
similarity index 100%
|
||||
rename from core/bin/utils/table.rs
|
||||
rename to core/sysmaster/utils/table.rs
|
||||
diff --git a/exts/sctl/Cargo.toml b/exts/sctl/Cargo.toml
|
||||
deleted file mode 100644
|
||||
index 21c00c7..0000000
|
||||
--- a/exts/sctl/Cargo.toml
|
||||
+++ /dev/null
|
||||
@@ -1,13 +0,0 @@
|
||||
-[package]
|
||||
-name = "sctl"
|
||||
-version = "0.2.4"
|
||||
-edition = "2021"
|
||||
-
|
||||
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
-
|
||||
-[dependencies]
|
||||
-clap = { version = "3.1.8", features = ["derive"] }
|
||||
-cmdproto = { path = "../../libs/cmdproto" }
|
||||
-basic = { path = "../../libs/basic" }
|
||||
-nix = "0.24"
|
||||
-constants = { path = "../../libs/constants" }
|
||||
diff --git a/exts/init/Cargo.toml b/init/Cargo.toml
|
||||
similarity index 81%
|
||||
rename from exts/init/Cargo.toml
|
||||
rename to init/Cargo.toml
|
||||
index f72b52a..6dcfb61 100644
|
||||
--- a/exts/init/Cargo.toml
|
||||
+++ b/init/Cargo.toml
|
||||
@@ -6,6 +6,6 @@ edition = "2021"
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
-constants = { path = "../../libs/constants" }
|
||||
+constants = { path = "../libs/constants" }
|
||||
libc = "0.2.*"
|
||||
nix = "0.24"
|
||||
diff --git a/exts/init/src/main.rs b/init/src/main.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/main.rs
|
||||
rename to init/src/main.rs
|
||||
diff --git a/exts/init/src/runtime/comm.rs b/init/src/runtime/comm.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/runtime/comm.rs
|
||||
rename to init/src/runtime/comm.rs
|
||||
diff --git a/exts/init/src/runtime/epoll.rs b/init/src/runtime/epoll.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/runtime/epoll.rs
|
||||
rename to init/src/runtime/epoll.rs
|
||||
diff --git a/exts/init/src/runtime/mod.rs b/init/src/runtime/mod.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/runtime/mod.rs
|
||||
rename to init/src/runtime/mod.rs
|
||||
diff --git a/exts/init/src/runtime/param.rs b/init/src/runtime/param.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/runtime/param.rs
|
||||
rename to init/src/runtime/param.rs
|
||||
diff --git a/exts/init/src/runtime/signals.rs b/init/src/runtime/signals.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/runtime/signals.rs
|
||||
rename to init/src/runtime/signals.rs
|
||||
diff --git a/exts/init/src/runtime/timer.rs b/init/src/runtime/timer.rs
|
||||
similarity index 100%
|
||||
rename from exts/init/src/runtime/timer.rs
|
||||
rename to init/src/runtime/timer.rs
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,198 +0,0 @@
|
||||
From af5f8417e595d7155b343efdbc63d6c337102058 Mon Sep 17 00:00:00 2001
|
||||
From: overweight <hexiaowen@huawei.com>
|
||||
Date: Wed, 5 Jul 2023 10:51:21 +0800
|
||||
Subject: [PATCH] build: update version to 0.2.4
|
||||
|
||||
---
|
||||
Cargo.toml | 2 +-
|
||||
coms/service/Cargo.toml | 2 +-
|
||||
coms/target/Cargo.toml | 2 +-
|
||||
exts/hostname_setup/Cargo.toml | 4 ++--
|
||||
exts/init/Cargo.toml | 4 ++--
|
||||
exts/sctl/Cargo.toml | 4 ++--
|
||||
libs/basic/Cargo.toml | 2 +-
|
||||
libs/cgroup/Cargo.toml | 2 +-
|
||||
libs/constants/Cargo.toml | 2 +-
|
||||
libs/event/Cargo.toml | 2 +-
|
||||
libs/libtests/Cargo.toml | 2 +-
|
||||
libs/macros/Cargo.toml | 2 +-
|
||||
libs/watchdog/Cargo.toml | 2 +-
|
||||
23 files changed, 28 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/Cargo.toml b/Cargo.toml
|
||||
index 89efa33..089e7ab 100644
|
||||
--- a/Cargo.toml
|
||||
+++ b/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "sysmaster"
|
||||
-version = "0.2.2"
|
||||
+version = "0.2.4"
|
||||
authors = ["sysmaster"]
|
||||
edition = "2021"
|
||||
build = "build.rs"
|
||||
diff --git a/coms/service/Cargo.toml b/coms/service/Cargo.toml
|
||||
index e87706e..0f37cf8 100644
|
||||
--- a/coms/service/Cargo.toml
|
||||
+++ b/coms/service/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "service"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
diff --git a/coms/target/Cargo.toml b/coms/target/Cargo.toml
|
||||
index 69d8bda..7223879 100644
|
||||
--- a/coms/target/Cargo.toml
|
||||
+++ b/coms/target/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "target"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
diff --git a/exts/hostname_setup/Cargo.toml b/exts/hostname_setup/Cargo.toml
|
||||
index b2cbdcf..0758da6 100644
|
||||
--- a/exts/hostname_setup/Cargo.toml
|
||||
+++ b/exts/hostname_setup/Cargo.toml
|
||||
@@ -1,11 +1,11 @@
|
||||
[package]
|
||||
name = "hostname_setup"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
nix = "0.24"
|
||||
log = "0.4"
|
||||
libc = "0.2.*"
|
||||
-constants = { version = "0.1.0", path = "../../libs/constants" }
|
||||
+constants = { path = "../../libs/constants" }
|
||||
basic = { path = "../../libs/basic" }
|
||||
diff --git a/exts/init/Cargo.toml b/exts/init/Cargo.toml
|
||||
index e351b61..f72b52a 100644
|
||||
--- a/exts/init/Cargo.toml
|
||||
+++ b/exts/init/Cargo.toml
|
||||
@@ -1,11 +1,11 @@
|
||||
[package]
|
||||
name = "init"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
-constants = { version = "0.1.0", path = "../../libs/constants" }
|
||||
+constants = { path = "../../libs/constants" }
|
||||
libc = "0.2.*"
|
||||
nix = "0.24"
|
||||
diff --git a/exts/sctl/Cargo.toml b/exts/sctl/Cargo.toml
|
||||
index b0c0bfc..21c00c7 100644
|
||||
--- a/exts/sctl/Cargo.toml
|
||||
+++ b/exts/sctl/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "sctl"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
@@ -10,4 +10,4 @@ clap = { version = "3.1.8", features = ["derive"] }
|
||||
cmdproto = { path = "../../libs/cmdproto" }
|
||||
basic = { path = "../../libs/basic" }
|
||||
nix = "0.24"
|
||||
-constants = { version = "0.1.0", path = "../../libs/constants" }
|
||||
+constants = { path = "../../libs/constants" }
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index c18991a..3d2c9cc 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "basic"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
authors = ["overweight <hexiaowen@huawei.com>"]
|
||||
edition = "2021"
|
||||
|
||||
diff --git a/libs/cgroup/Cargo.toml b/libs/cgroup/Cargo.toml
|
||||
index c7d17d2..f772c80 100644
|
||||
--- a/libs/cgroup/Cargo.toml
|
||||
+++ b/libs/cgroup/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "cgroup"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
diff --git a/libs/constants/Cargo.toml b/libs/constants/Cargo.toml
|
||||
index 06d8173..f0552de 100644
|
||||
--- a/libs/constants/Cargo.toml
|
||||
+++ b/libs/constants/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "constants"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
diff --git a/libs/event/Cargo.toml b/libs/event/Cargo.toml
|
||||
index 21dad06..8cd9398 100644
|
||||
--- a/libs/event/Cargo.toml
|
||||
+++ b/libs/event/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "event"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
authors = ["overweight <hexiaowen@huawei.com>"]
|
||||
edition = "2021"
|
||||
|
||||
diff --git a/libs/libtests/Cargo.toml b/libs/libtests/Cargo.toml
|
||||
index 0d80f5b..b14166c 100644
|
||||
--- a/libs/libtests/Cargo.toml
|
||||
+++ b/libs/libtests/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "libtests"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
diff --git a/libs/macros/Cargo.toml b/libs/macros/Cargo.toml
|
||||
index 955b94c..e7d178a 100644
|
||||
--- a/libs/macros/Cargo.toml
|
||||
+++ b/libs/macros/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "macros"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
diff --git a/libs/watchdog/Cargo.toml b/libs/watchdog/Cargo.toml
|
||||
index 5583d9a..458b55d 100644
|
||||
--- a/libs/watchdog/Cargo.toml
|
||||
+++ b/libs/watchdog/Cargo.toml
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "watchdog"
|
||||
-version = "0.1.0"
|
||||
+version = "0.2.4"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,118 +0,0 @@
|
||||
From 4c86ef5908d10a9d6c29c80d39c993fbce0ab99c Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Sun, 25 Jun 2023 14:54:03 +0800
|
||||
Subject: [PATCH] feature: add LogFileSize and LogFileNumber
|
||||
|
||||
---
|
||||
core/bin/main.rs | 9 +++------
|
||||
core/bin/manager/config.rs | 6 ++++++
|
||||
core/bin/unit/manager.rs | 16 ++++++++++++++++
|
||||
core/lib/unit/umif.rs | 10 ++++++++++
|
||||
5 files changed, 59 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/core/bin/main.rs b/core/bin/main.rs
|
||||
index 7f163c7..b75ef0b 100644
|
||||
--- a/core/bin/main.rs
|
||||
+++ b/core/bin/main.rs
|
||||
@@ -82,16 +82,13 @@ fn main() -> Result<()> {
|
||||
let args = Args::parse();
|
||||
|
||||
let manager_config = Rc::new(ManagerConfig::new(None));
|
||||
- let log_file = if manager_config.LogFile.is_empty() {
|
||||
- None
|
||||
- } else {
|
||||
- Some(manager_config.LogFile.as_str())
|
||||
- };
|
||||
logger::init_log(
|
||||
"sysmaster",
|
||||
manager_config.LogLevel,
|
||||
&manager_config.LogTarget,
|
||||
- log_file,
|
||||
+ &manager_config.LogFile,
|
||||
+ manager_config.LogFileSize,
|
||||
+ manager_config.LogFileNumber,
|
||||
);
|
||||
log::info!("sysmaster running in system mode.");
|
||||
|
||||
diff --git a/core/bin/manager/config.rs b/core/bin/manager/config.rs
|
||||
index 8b7aaab..fc4c028 100644
|
||||
--- a/core/bin/manager/config.rs
|
||||
+++ b/core/bin/manager/config.rs
|
||||
@@ -30,6 +30,10 @@ pub struct ManagerConfig {
|
||||
pub LogTarget: String,
|
||||
#[config(default = "")]
|
||||
pub LogFile: String,
|
||||
+ #[config(default = 10240)]
|
||||
+ pub LogFileSize: u32,
|
||||
+ #[config(default = 10)]
|
||||
+ pub LogFileNumber: u32,
|
||||
|
||||
#[config(default = 1048576)] // RELI_HISTORY_MAPSIZE_DEFAULT
|
||||
pub DbSize: usize,
|
||||
@@ -55,6 +59,8 @@ impl Default for ManagerConfig {
|
||||
LogLevel: log::LevelFilter::Debug,
|
||||
LogTarget: "console".to_string(),
|
||||
LogFile: String::new(),
|
||||
+ LogFileSize: 10240,
|
||||
+ LogFileNumber: 10,
|
||||
DbSize: RELI_HISTORY_MAPSIZE_DEFAULT,
|
||||
}
|
||||
}
|
||||
diff --git a/core/bin/unit/manager.rs b/core/bin/unit/manager.rs
|
||||
index 99366fa..492f3f4 100644
|
||||
--- a/core/bin/unit/manager.rs
|
||||
+++ b/core/bin/unit/manager.rs
|
||||
@@ -475,6 +475,14 @@ impl UmIf for UnitManager {
|
||||
self.get_log_target()
|
||||
}
|
||||
|
||||
+ fn get_log_file_size(&self) -> u32 {
|
||||
+ self.get_log_file_size()
|
||||
+ }
|
||||
+
|
||||
+ fn get_log_file_number(&self) -> u32 {
|
||||
+ self.get_log_file_number()
|
||||
+ }
|
||||
+
|
||||
/// set the service's socket fd
|
||||
fn service_set_socket_fd(&self, service_name: &str, fd: i32) {
|
||||
let service = match self.units_get(service_name) {
|
||||
@@ -1130,6 +1138,14 @@ impl UnitManager {
|
||||
fn get_log_target(&self) -> &str {
|
||||
&self.manager_config.LogTarget
|
||||
}
|
||||
+
|
||||
+ fn get_log_file_size(&self) -> u32 {
|
||||
+ self.manager_config.LogFileSize
|
||||
+ }
|
||||
+
|
||||
+ fn get_log_file_number(&self) -> u32 {
|
||||
+ self.manager_config.LogFileNumber
|
||||
+ }
|
||||
}
|
||||
|
||||
impl ReStation for UnitManager {
|
||||
diff --git a/core/lib/unit/umif.rs b/core/lib/unit/umif.rs
|
||||
index 049013d..c41c211 100644
|
||||
--- a/core/lib/unit/umif.rs
|
||||
+++ b/core/lib/unit/umif.rs
|
||||
@@ -195,6 +195,16 @@ pub trait UmIf {
|
||||
""
|
||||
}
|
||||
|
||||
+ /// get the log file size
|
||||
+ fn get_log_file_size(&self) -> u32 {
|
||||
+ 0
|
||||
+ }
|
||||
+
|
||||
+ /// get the log file number
|
||||
+ fn get_log_file_number(&self) -> u32 {
|
||||
+ 0
|
||||
+ }
|
||||
+
|
||||
/// get the log target config
|
||||
fn get_log_target(&self) -> &str {
|
||||
""
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,138 +0,0 @@
|
||||
From d570a9c740fec2c89f006c83f0cd46cec5e547a8 Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Mon, 3 Jul 2023 01:03:39 +0800
|
||||
Subject: [PATCH] feature(devmaster): support update device database and tags
|
||||
|
||||
Besides, move the loop device interfaces to libdevice as some test
|
||||
cases in libdevice need to use loop device.
|
||||
---
|
||||
libs/basic/src/fs_util.rs | 88 +++++-
|
||||
9 files changed, 542 insertions(+), 128 deletions(-)
|
||||
delete mode 100644 exts/devmaster/src/lib/utils/loop_device.rs
|
||||
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index 8a8f276..413008b 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -15,7 +15,7 @@
|
||||
use crate::{error::*, format_proc_fd_path};
|
||||
use libc::{fchownat, mode_t, timespec, AT_EMPTY_PATH, S_IFLNK, S_IFMT};
|
||||
use nix::{
|
||||
- fcntl::{readlink, renameat, OFlag},
|
||||
+ fcntl::{open, readlink, renameat, OFlag},
|
||||
sys::stat::{fstat, Mode},
|
||||
unistd::{unlinkat, Gid, Uid, UnlinkatFlags},
|
||||
};
|
||||
@@ -23,7 +23,7 @@ use pathdiff::diff_paths;
|
||||
use rand::Rng;
|
||||
use std::{
|
||||
ffi::CString,
|
||||
- fs::{remove_dir, File},
|
||||
+ fs::{create_dir_all, remove_dir, File},
|
||||
io::ErrorKind,
|
||||
os::unix::prelude::{AsRawFd, FromRawFd, PermissionsExt, RawFd},
|
||||
path::Path,
|
||||
@@ -245,13 +245,70 @@ pub fn remove_dir_until(path: &str, stop: &str) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+/// create and open a temporary file
|
||||
+pub fn open_temporary(path: &str) -> Result<(File, String)> {
|
||||
+ let tmp_file = format!("{}.{}", path, rand::thread_rng().gen::<u32>());
|
||||
+
|
||||
+ let f = open(
|
||||
+ tmp_file.as_str(),
|
||||
+ OFlag::O_CLOEXEC | OFlag::O_NOCTTY | OFlag::O_RDWR | OFlag::O_CREAT | OFlag::O_EXCL,
|
||||
+ Mode::from_bits(0o644).unwrap(),
|
||||
+ )
|
||||
+ .context(NixSnafu)?;
|
||||
+
|
||||
+ let file = unsafe { File::from_raw_fd(f) };
|
||||
+
|
||||
+ Ok((file, tmp_file))
|
||||
+}
|
||||
+
|
||||
+/// Create a new file based on absolute path.
|
||||
+pub fn touch_file(
|
||||
+ path: &str,
|
||||
+ parents: bool,
|
||||
+ mode: Option<mode_t>,
|
||||
+ uid: Option<Uid>,
|
||||
+ gid: Option<Gid>,
|
||||
+) -> Result<bool> {
|
||||
+ let p = Path::new(path);
|
||||
+
|
||||
+ if parents && p.parent().is_some() {
|
||||
+ let _ = create_dir_all(p.parent().unwrap());
|
||||
+ }
|
||||
+
|
||||
+ let fd = match open(
|
||||
+ p,
|
||||
+ OFlag::O_PATH | OFlag::O_CLOEXEC | OFlag::O_NOFOLLOW,
|
||||
+ Mode::empty(),
|
||||
+ ) {
|
||||
+ Ok(n) => n,
|
||||
+ Err(e) => {
|
||||
+ if e != nix::Error::ENOENT {
|
||||
+ return Err(Error::Nix { source: e });
|
||||
+ }
|
||||
+
|
||||
+ open(
|
||||
+ p,
|
||||
+ OFlag::O_WRONLY | OFlag::O_CREAT | OFlag::O_EXCL | OFlag::O_CLOEXEC,
|
||||
+ mode.map(|v| Mode::from_bits(v).unwrap_or(Mode::empty()))
|
||||
+ .unwrap_or(Mode::empty()),
|
||||
+ )
|
||||
+ .context(NixSnafu)?
|
||||
+ }
|
||||
+ };
|
||||
+
|
||||
+ /* The returned value should be explicitly declared, otherwise the file will be closed at once */
|
||||
+ let _f = unsafe { File::from_raw_fd(fd) };
|
||||
+
|
||||
+ fchmod_and_chown(fd, path, mode, uid, gid)
|
||||
+}
|
||||
+
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::fs_util::symlink;
|
||||
- use nix::unistd::{self};
|
||||
+ use nix::unistd::{self, unlink};
|
||||
use std::{
|
||||
- fs::{create_dir_all, File},
|
||||
+ fs::{create_dir_all, remove_file, File},
|
||||
os::unix::prelude::MetadataExt,
|
||||
time::SystemTime,
|
||||
};
|
||||
@@ -369,4 +426,27 @@ mod tests {
|
||||
assert!(!Path::new("/tmp/test_remove_dir_until_2/test2").exists());
|
||||
assert!(Path::new("/tmp/test_remove_dir_until_2/test_file").exists());
|
||||
}
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_open_temporary() {
|
||||
+ let (file, name) = open_temporary("test_open_temporary").unwrap();
|
||||
+ let p = Path::new(&name);
|
||||
+ println!("{:?}", p.canonicalize().unwrap());
|
||||
+ drop(file);
|
||||
+ remove_file(name).unwrap();
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_touch_file() {
|
||||
+ let _ = unlink("/tmp/test_touch_file/f1");
|
||||
+ touch_file("/tmp/test_touch_file/f1", true, Some(0o444), None, None).unwrap();
|
||||
+ let p = Path::new("/tmp/test_touch_file/f1");
|
||||
+ assert!(p.exists());
|
||||
+ let md = p.metadata().unwrap();
|
||||
+ assert_eq!(md.mode() & 0o777, 0o444);
|
||||
+ touch_file("/tmp/test_touch_file/f1", true, Some(0o666), None, None).unwrap();
|
||||
+ let md = p.metadata().unwrap();
|
||||
+ assert_eq!(md.mode() & 0o777, 0o666);
|
||||
+ let _ = unlink("/tmp/test_touch_file/f1");
|
||||
+ }
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,38 +0,0 @@
|
||||
From 8bdb2720d1d3a16624b441c5c0c93269e1feb6a2 Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Wed, 21 Jun 2023 21:30:08 +0800
|
||||
Subject: [PATCH] feature(libbasic): add more error information
|
||||
|
||||
Print error source information in addition.
|
||||
---
|
||||
libs/basic/src/error.rs | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/error.rs b/libs/basic/src/error.rs
|
||||
index 373ee57..2730883 100644
|
||||
--- a/libs/basic/src/error.rs
|
||||
+++ b/libs/basic/src/error.rs
|
||||
@@ -32,16 +32,16 @@ pub enum Error {
|
||||
errno: i32,
|
||||
},
|
||||
|
||||
- #[snafu(display("Io"))]
|
||||
+ #[snafu(display("Io: {}", source))]
|
||||
Io { source: std::io::Error },
|
||||
|
||||
- #[snafu(display("Errno"))]
|
||||
+ #[snafu(display("Errno: {}", source))]
|
||||
Nix { source: nix::Error },
|
||||
|
||||
- #[snafu(display("Var"))]
|
||||
+ #[snafu(display("Var: {}", source))]
|
||||
Var { source: std::env::VarError },
|
||||
|
||||
- #[snafu(display("procfs"))]
|
||||
+ #[snafu(display("procfs: {}", source))]
|
||||
Proc { source: procfs::ProcError },
|
||||
|
||||
#[snafu(display("Error parsing from string: {}", source))]
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,86 +0,0 @@
|
||||
From 0b9863bfcb3148247986ead64683bd9add2502fa Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Wed, 21 Jun 2023 21:29:27 +0800
|
||||
Subject: [PATCH] feature(libbasic): add opendirat
|
||||
|
||||
opendirat is used to open a directory with the directory fd.
|
||||
---
|
||||
libs/basic/src/fd_util.rs | 46 +++++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 42 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/fd_util.rs b/libs/basic/src/fd_util.rs
|
||||
index b397472..0d41966 100644
|
||||
--- a/libs/basic/src/fd_util.rs
|
||||
+++ b/libs/basic/src/fd_util.rs
|
||||
@@ -14,9 +14,9 @@
|
||||
use crate::error::*;
|
||||
use nix::{
|
||||
errno::Errno,
|
||||
- fcntl::{FcntlArg, FdFlag, OFlag},
|
||||
+ fcntl::{openat, FcntlArg, FdFlag, OFlag},
|
||||
ioctl_read,
|
||||
- sys::stat::SFlag,
|
||||
+ sys::stat::{Mode, SFlag},
|
||||
};
|
||||
|
||||
/// check if the given stat.st_mode is regular file
|
||||
@@ -157,11 +157,33 @@ pub fn fd_get_diskseq(fd: i32) -> Result<u64> {
|
||||
Ok(diskseq)
|
||||
}
|
||||
|
||||
+/// open the directory at fd
|
||||
+pub fn opendirat(dirfd: i32, flags: OFlag) -> Result<nix::dir::Dir> {
|
||||
+ let nfd = openat(
|
||||
+ dirfd,
|
||||
+ ".",
|
||||
+ OFlag::O_RDONLY | OFlag::O_NONBLOCK | OFlag::O_DIRECTORY | OFlag::O_CLOEXEC | flags,
|
||||
+ Mode::empty(),
|
||||
+ )
|
||||
+ .context(NixSnafu)?;
|
||||
+
|
||||
+ nix::dir::Dir::from_fd(nfd).context(NixSnafu)
|
||||
+}
|
||||
+
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::fd_util::{stat_is_char, stat_is_reg};
|
||||
- use nix::sys::stat::fstat;
|
||||
- use std::{fs::File, os::unix::prelude::AsRawFd, path::Path};
|
||||
+ use nix::{
|
||||
+ fcntl::{open, OFlag},
|
||||
+ sys::stat::{fstat, Mode},
|
||||
+ };
|
||||
+ use std::{
|
||||
+ fs::{remove_dir_all, File},
|
||||
+ os::unix::prelude::AsRawFd,
|
||||
+ path::Path,
|
||||
+ };
|
||||
+
|
||||
+ use super::opendirat;
|
||||
|
||||
#[test]
|
||||
fn test_stats() {
|
||||
@@ -185,4 +207,20 @@ mod tests {
|
||||
let st = fstat(fd_non_char_file.as_raw_fd()).unwrap();
|
||||
assert!(!stat_is_char(st.st_mode));
|
||||
}
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_opendirat() {
|
||||
+ std::fs::create_dir_all("/tmp/test_opendirat").unwrap();
|
||||
+ File::create("/tmp/test_opendirat/entry0").unwrap();
|
||||
+ File::create("/tmp/test_opendirat/entry1").unwrap();
|
||||
+
|
||||
+ let dirfd = open("/tmp/test_opendirat", OFlag::O_DIRECTORY, Mode::empty()).unwrap();
|
||||
+ let mut dir = opendirat(dirfd, OFlag::O_NOFOLLOW).unwrap();
|
||||
+
|
||||
+ for e in dir.iter() {
|
||||
+ let _ = e.unwrap();
|
||||
+ }
|
||||
+
|
||||
+ remove_dir_all("/tmp/test_opendirat").unwrap();
|
||||
+ }
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,76 +0,0 @@
|
||||
From 292dfedd1d02b2ac4a926a5e32658562a92bd9be Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Wed, 21 Jun 2023 21:25:56 +0800
|
||||
Subject: [PATCH] feature(libbasic): add path_simplify
|
||||
|
||||
path_simplify is used to remove redundant inner and trailing slashes
|
||||
and unnecessary dots in path.
|
||||
---
|
||||
libs/basic/src/path_util.rs | 44 ++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 43 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libs/basic/src/path_util.rs b/libs/basic/src/path_util.rs
|
||||
index 4ac9de9..7391615 100644
|
||||
--- a/libs/basic/src/path_util.rs
|
||||
+++ b/libs/basic/src/path_util.rs
|
||||
@@ -21,9 +21,44 @@ pub fn path_equal(a: &str, b: &str) -> bool {
|
||||
p_a == p_b
|
||||
}
|
||||
|
||||
+/// Remove redundant inner and trailing slashes and unnecessary dots to simplify path.
|
||||
+/// e.g., //foo//.//bar/ becomes /foo/bar
|
||||
+/// .//foo//.//bar/ becomes foo/bar
|
||||
+pub fn path_simplify(s: &str) -> String {
|
||||
+ let mut ret = String::new();
|
||||
+
|
||||
+ let mut pre = "";
|
||||
+
|
||||
+ for com in s.split('/') {
|
||||
+ match com {
|
||||
+ "" => {
|
||||
+ if ret.is_empty() && pre.is_empty() {
|
||||
+ ret.push('/');
|
||||
+ }
|
||||
+ }
|
||||
+ "." => {
|
||||
+ if pre.is_empty() {
|
||||
+ pre = ".";
|
||||
+ }
|
||||
+ }
|
||||
+ _ => {
|
||||
+ ret.push_str(com);
|
||||
+ ret.push('/');
|
||||
+ pre = com;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ /* drop the trailing slash */
|
||||
+ if ret.ends_with('/') {
|
||||
+ let _ = ret.pop();
|
||||
+ }
|
||||
+
|
||||
+ ret
|
||||
+}
|
||||
+
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
- use crate::path_util::path_equal;
|
||||
+ use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_path_equal() {
|
||||
@@ -35,4 +70,11 @@ mod tests {
|
||||
assert!(path_equal("/x/././y", "/x/y/./."));
|
||||
assert!(!path_equal("/etc", "/var"));
|
||||
}
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_path_simplify() {
|
||||
+ assert_eq!(path_simplify("//foo//.//bar/"), "/foo/bar");
|
||||
+ assert_eq!(path_simplify(".//foo//.//bar/"), "foo/bar");
|
||||
+ assert_eq!(path_simplify("foo//.//bar/"), "foo/bar");
|
||||
+ }
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,106 +0,0 @@
|
||||
From d9fdd267027d6bf3b8265c18279a7f50c2b62081 Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Wed, 21 Jun 2023 21:27:38 +0800
|
||||
Subject: [PATCH] feature(libbasic): add remove_dir_until
|
||||
|
||||
remove_dir_until is used to recursively remove parent directories
|
||||
which contains nothing until specific directory.
|
||||
---
|
||||
libs/basic/src/fs_util.rs | 64 +++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 62 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index 63c43ca..5f34e9a 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -20,7 +20,7 @@ use nix::{
|
||||
unistd::{Gid, Uid},
|
||||
};
|
||||
use pathdiff::diff_paths;
|
||||
-use std::{os::unix::prelude::PermissionsExt, path::Path};
|
||||
+use std::{fs::remove_dir, io::ErrorKind, os::unix::prelude::PermissionsExt, path::Path};
|
||||
|
||||
/// open the parent directory of path
|
||||
pub fn open_parent(path: &Path, flags: OFlag, mode: Mode) -> Result<i32> {
|
||||
@@ -164,12 +164,55 @@ pub fn futimens_opath(fd: i32, ts: Option<[timespec; 2]>) -> Result<()> {
|
||||
}
|
||||
}
|
||||
|
||||
+/// recursively remove parent directories until specific directory
|
||||
+pub fn remove_dir_until(path: &str, stop: &str) -> Result<()> {
|
||||
+ let path = Path::new(path);
|
||||
+
|
||||
+ let mut dir = if path.is_dir() {
|
||||
+ Path::new(path)
|
||||
+ } else {
|
||||
+ match path.parent() {
|
||||
+ Some(p) => p,
|
||||
+ None => {
|
||||
+ return Ok(());
|
||||
+ }
|
||||
+ }
|
||||
+ };
|
||||
+
|
||||
+ loop {
|
||||
+ if let Err(e) = remove_dir(dir) {
|
||||
+ match e.kind() {
|
||||
+ ErrorKind::NotFound => break,
|
||||
+ _ => {
|
||||
+ return Err(Error::Io { source: e });
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ match dir.parent() {
|
||||
+ Some(p) => {
|
||||
+ if p.ends_with(stop) {
|
||||
+ break;
|
||||
+ }
|
||||
+ dir = p;
|
||||
+ }
|
||||
+ None => break,
|
||||
+ };
|
||||
+ }
|
||||
+
|
||||
+ Ok(())
|
||||
+}
|
||||
+
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::fs_util::symlink;
|
||||
use nix::unistd::{self};
|
||||
- use std::{fs::File, os::unix::prelude::MetadataExt, time::SystemTime};
|
||||
+ use std::{
|
||||
+ fs::{create_dir_all, File},
|
||||
+ os::unix::prelude::MetadataExt,
|
||||
+ time::SystemTime,
|
||||
+ };
|
||||
|
||||
#[test]
|
||||
fn test_symlink() {
|
||||
@@ -267,4 +310,21 @@ mod tests {
|
||||
|
||||
std::fs::remove_file("/tmp/test_futimens_opath").unwrap();
|
||||
}
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_remove_dir_until() {
|
||||
+ create_dir_all("/tmp/test_remove_dir_until_1/test1").unwrap();
|
||||
+ assert!(Path::new("/tmp/test_remove_dir_until_1/test1").exists());
|
||||
+ remove_dir_until("/tmp/test_remove_dir_until_1/test1", "/tmp").unwrap();
|
||||
+ assert!(!Path::new("/tmp/test_remove_dir_until_1/test1").exists());
|
||||
+ assert!(!Path::new("/tmp/test_remove_dir_until_1").exists());
|
||||
+
|
||||
+ create_dir_all("/tmp/test_remove_dir_until_2/test2").unwrap();
|
||||
+ File::create("/tmp/test_remove_dir_until_2/test_file").unwrap();
|
||||
+ assert!(Path::new("/tmp/test_remove_dir_until_2/test2").exists());
|
||||
+ assert!(Path::new("/tmp/test_remove_dir_until_2/test_file").exists());
|
||||
+ assert!(remove_dir_until("/tmp/test_remove_dir_until_2/test2", "/tmp").is_err());
|
||||
+ assert!(!Path::new("/tmp/test_remove_dir_until_2/test2").exists());
|
||||
+ assert!(Path::new("/tmp/test_remove_dir_until_2/test_file").exists());
|
||||
+ }
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,426 +0,0 @@
|
||||
From d854bdec0aa318fb1db33c96a7f2e52976452bc4 Mon Sep 17 00:00:00 2001
|
||||
From: zhangyao2022 <zhangyao108@huawei.com>
|
||||
Date: Tue, 20 Jun 2023 17:26:52 +0800
|
||||
Subject: [PATCH] feature: support hostname setup
|
||||
|
||||
---
|
||||
Cargo.toml | 1 +
|
||||
exts/hostname_setup/Cargo.toml | 11 ++
|
||||
exts/hostname_setup/src/main.rs | 235 +++++++++++++++++++++++
|
||||
install.sh | 1 +
|
||||
libs/basic/src/lib.rs | 1 +
|
||||
libs/basic/src/os_release.rs | 109 +++++++++++
|
||||
9 files changed, 368 insertions(+), 1 deletion(-)
|
||||
create mode 100644 exts/hostname_setup/Cargo.toml
|
||||
create mode 100644 exts/hostname_setup/src/main.rs
|
||||
create mode 100644 libs/basic/src/os_release.rs
|
||||
|
||||
diff --git a/Cargo.toml b/Cargo.toml
|
||||
index b96ec26..a375070 100644
|
||||
--- a/Cargo.toml
|
||||
+++ b/Cargo.toml
|
||||
@@ -120,6 +120,7 @@ members = [
|
||||
# external binaries
|
||||
"exts/init",
|
||||
"exts/sctl",
|
||||
+ "exts/hostname_setup",
|
||||
#internal libraries crates
|
||||
"libs/cmdproto",
|
||||
#external libraries crates
|
||||
diff --git a/exts/hostname_setup/Cargo.toml b/exts/hostname_setup/Cargo.toml
|
||||
new file mode 100644
|
||||
index 0000000..b2cbdcf
|
||||
--- /dev/null
|
||||
+++ b/exts/hostname_setup/Cargo.toml
|
||||
@@ -0,0 +1,11 @@
|
||||
+[package]
|
||||
+name = "hostname_setup"
|
||||
+version = "0.1.0"
|
||||
+edition = "2021"
|
||||
+
|
||||
+[dependencies]
|
||||
+nix = "0.24"
|
||||
+log = "0.4"
|
||||
+libc = "0.2.*"
|
||||
+constants = { version = "0.1.0", path = "../../libs/constants" }
|
||||
+basic = { path = "../../libs/basic" }
|
||||
diff --git a/exts/hostname_setup/src/main.rs b/exts/hostname_setup/src/main.rs
|
||||
new file mode 100644
|
||||
index 0000000..4dc5a1b
|
||||
--- /dev/null
|
||||
+++ b/exts/hostname_setup/src/main.rs
|
||||
@@ -0,0 +1,235 @@
|
||||
+// Copyright (c) 2022 Huawei Technologies Co.,Ltd. All rights reserved.
|
||||
+//
|
||||
+// sysMaster is licensed under Mulan PSL v2.
|
||||
+// You can use this software according to the terms and conditions of the Mulan
|
||||
+// PSL v2.
|
||||
+// You may obtain a copy of Mulan PSL v2 at:
|
||||
+// http://license.coscl.org.cn/MulanPSL2
|
||||
+// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
|
||||
+// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||||
+// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
+// See the Mulan PSL v2 for more details.
|
||||
+
|
||||
+//! hostname setup
|
||||
+
|
||||
+use basic::logger;
|
||||
+use basic::os_release;
|
||||
+use basic::proc_cmdline;
|
||||
+use nix::Result;
|
||||
+use std::fmt;
|
||||
+use std::fmt::Display;
|
||||
+
|
||||
+const SYSTEMD_HOSTNAME_KEY: &str = "systemd.hostname";
|
||||
+const SYSMASTER_HOSTNAME_KEY: &str = "sysmaster.hostname";
|
||||
+const DEFAULT_HOSTNAME: &str = "localhost";
|
||||
+
|
||||
+#[derive(Debug)]
|
||||
+struct Hostname {
|
||||
+ hostname: String,
|
||||
+}
|
||||
+
|
||||
+impl Hostname {
|
||||
+ fn from_string(str_hostname: &str) -> Option<Hostname> {
|
||||
+ let hostname = Hostname::new(str_hostname.trim());
|
||||
+ if hostname.valid() {
|
||||
+ Some(hostname)
|
||||
+ } else {
|
||||
+ None
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn from_cmdline() -> Option<Hostname> {
|
||||
+ let systemd_hostname = match proc_cmdline::cmdline_get_value(SYSTEMD_HOSTNAME_KEY) {
|
||||
+ Err(e) => {
|
||||
+ log::warn!(
|
||||
+ "Failed to get proc cmdline by key {}: {}",
|
||||
+ SYSTEMD_HOSTNAME_KEY,
|
||||
+ e
|
||||
+ );
|
||||
+ None
|
||||
+ }
|
||||
+ Ok(hostname) => hostname,
|
||||
+ };
|
||||
+
|
||||
+ systemd_hostname.map_or_else(
|
||||
+ || match proc_cmdline::cmdline_get_value(SYSMASTER_HOSTNAME_KEY) {
|
||||
+ Err(e) => {
|
||||
+ log::warn!(
|
||||
+ "Failed to get proc cmdline by key {}: {}",
|
||||
+ SYSMASTER_HOSTNAME_KEY,
|
||||
+ e
|
||||
+ );
|
||||
+ None
|
||||
+ }
|
||||
+ Ok(hostname) => hostname.and_then(|hostname| Hostname::from_string(&hostname)),
|
||||
+ },
|
||||
+ |hostname| Hostname::from_string(&hostname),
|
||||
+ )
|
||||
+ }
|
||||
+
|
||||
+ fn from_etc_hostname() -> Option<Self> {
|
||||
+ match std::fs::read_to_string("/etc/hostname") {
|
||||
+ Err(e) => {
|
||||
+ log::warn!("Failed to get /etc/hostname: {}", e);
|
||||
+ None
|
||||
+ }
|
||||
+ Ok(hostname) => Hostname::from_string(&hostname),
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn new(hostname: &str) -> Self {
|
||||
+ Hostname {
|
||||
+ hostname: hostname.trim().to_string(),
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn valid(&self) -> bool {
|
||||
+ if self.hostname.is_empty() {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if self.hostname.len() > 64 {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ let mut dot = true;
|
||||
+ let mut hyphen = true;
|
||||
+
|
||||
+ for c in self.hostname.chars() {
|
||||
+ if c == '.' {
|
||||
+ if dot || hyphen {
|
||||
+ return false;
|
||||
+ }
|
||||
+ dot = true;
|
||||
+ hyphen = false;
|
||||
+ } else if c == '-' {
|
||||
+ if dot {
|
||||
+ return false;
|
||||
+ }
|
||||
+ dot = false;
|
||||
+ hyphen = true;
|
||||
+ } else {
|
||||
+ if !c.is_ascii_alphanumeric() {
|
||||
+ return false;
|
||||
+ }
|
||||
+ dot = false;
|
||||
+ hyphen = false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if dot {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if hyphen {
|
||||
+ return false;
|
||||
+ }
|
||||
+ true
|
||||
+ }
|
||||
+
|
||||
+ fn setup(hostname: &Self) -> Result<()> {
|
||||
+ if !hostname.valid() {
|
||||
+ return Err(nix::errno::Errno::EINVAL);
|
||||
+ }
|
||||
+
|
||||
+ let local_hostname = Hostname::local_hostname()?;
|
||||
+ if local_hostname.eq(hostname) {
|
||||
+ log::info!("Hostname has already been set: {hostname}.");
|
||||
+ return Ok(());
|
||||
+ }
|
||||
+ nix::unistd::sethostname(&hostname.hostname)
|
||||
+ }
|
||||
+
|
||||
+ fn local_hostname() -> Result<Hostname> {
|
||||
+ match nix::sys::utsname::uname() {
|
||||
+ Err(e) => {
|
||||
+ log::warn!("Failed to get uname: {}", e);
|
||||
+ Err(e)
|
||||
+ }
|
||||
+ Ok(uts_name) => Ok(uts_name
|
||||
+ .nodename()
|
||||
+ .to_str()
|
||||
+ .map_or(Hostname::new(""), Hostname::new)),
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn hostname_is_set() -> bool {
|
||||
+ Hostname::local_hostname().map_or(false, |hostname| hostname != Hostname::new("(none)"))
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+impl PartialEq for Hostname {
|
||||
+ fn eq(&self, other: &Self) -> bool {
|
||||
+ self.hostname.eq(&other.hostname)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+impl Display for Hostname {
|
||||
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
+ write!(f, "{}", self.hostname)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+impl Default for Hostname {
|
||||
+ fn default() -> Self {
|
||||
+ if let Ok(Some(str)) = os_release::get_os_release("DEFAULT_HOSTNAME") {
|
||||
+ return Hostname::from_string(&str).unwrap_or_else(|| Hostname::new(DEFAULT_HOSTNAME));
|
||||
+ }
|
||||
+ Hostname::new(DEFAULT_HOSTNAME)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+fn main() {
|
||||
+ logger::init_log_to_console("hostname-setup", log::LevelFilter::Info);
|
||||
+ let mut op_hostname = Hostname::from_cmdline();
|
||||
+ if op_hostname.is_none() {
|
||||
+ op_hostname = Hostname::from_etc_hostname();
|
||||
+ }
|
||||
+
|
||||
+ if op_hostname.is_none() && Hostname::hostname_is_set() {
|
||||
+ log::info!("Hostname has already been set, skipping.");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ let hostname = op_hostname.unwrap_or_default();
|
||||
+
|
||||
+ log::info!("Hostname set to: {}.", hostname);
|
||||
+ if let Err(e) = Hostname::setup(&hostname) {
|
||||
+ log::error!("Failed to set hostname: {}.", e);
|
||||
+ std::process::exit(e as i32);
|
||||
+ }
|
||||
+ std::process::exit(0);
|
||||
+}
|
||||
+
|
||||
+#[cfg(test)]
|
||||
+mod test {
|
||||
+ use crate::Hostname;
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_hostname_valid() {
|
||||
+ assert!(Hostname::new("foobar").valid());
|
||||
+ assert!(Hostname::new("foobar.com").valid());
|
||||
+ assert!(!Hostname::new("foobar.com.").valid());
|
||||
+ assert!(Hostname::new("fooBAR").valid());
|
||||
+ assert!(Hostname::new("fooBAR.com").valid());
|
||||
+ assert!(!Hostname::new("fooBAR.").valid());
|
||||
+ assert!(!Hostname::new("fooBAR.com.").valid());
|
||||
+ assert!(!Hostname::new("fööbar").valid());
|
||||
+ assert!(!Hostname::new("").valid());
|
||||
+ assert!(!Hostname::new(".").valid());
|
||||
+ assert!(!Hostname::new("..").valid());
|
||||
+ assert!(!Hostname::new("foobar.").valid());
|
||||
+ assert!(!Hostname::new(".foobar").valid());
|
||||
+ assert!(!Hostname::new("foo..bar").valid());
|
||||
+ assert!(!Hostname::new("foo.bar..").valid());
|
||||
+ assert!(!Hostname::new("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").valid());
|
||||
+ assert!(!Hostname::new(
|
||||
+ "au-xph5-rvgrdsb5hcxc-47et3a5vvkrc-server-wyoz4elpdpe3.openstack.local"
|
||||
+ )
|
||||
+ .valid());
|
||||
+ assert!(Hostname::new("local--host.localdomain").valid());
|
||||
+ assert!(!Hostname::new("localhost-.localdomain").valid());
|
||||
+ assert!(!Hostname::new("localhost.-localdomain").valid());
|
||||
+ assert!(Hostname::new("localhost.localdomain").valid());
|
||||
+ }
|
||||
+}
|
||||
diff --git a/install.sh b/install.sh
|
||||
index eb1b43e..675c543 100644
|
||||
--- a/install.sh
|
||||
+++ b/install.sh
|
||||
@@ -14,6 +14,7 @@ install -Dm0755 -t ${install_dir} ${target_dir}/fstab || exit 1
|
||||
install -Dm0755 -t ${install_dir} ${target_dir}/sysmonitor || exit 1
|
||||
install -Dm0755 -t ${install_dir} ${target_dir}/random_seed || exit 1
|
||||
install -Dm0755 -t ${install_dir} ${target_dir}/rc-local-generator || exit 1
|
||||
+install -Dm0755 -t ${install_dir} ${target_dir}/hostname_setup || exit 1
|
||||
|
||||
strip ${target_dir}/lib*.so
|
||||
|
||||
diff --git a/libs/basic/src/lib.rs b/libs/basic/src/lib.rs
|
||||
index 8678b58..db80efb 100644
|
||||
--- a/libs/basic/src/lib.rs
|
||||
+++ b/libs/basic/src/lib.rs
|
||||
@@ -44,3 +44,4 @@ pub mod user_group_util;
|
||||
pub mod uuid;
|
||||
pub mod virtualize;
|
||||
pub use error::*;
|
||||
+pub mod os_release;
|
||||
diff --git a/libs/basic/src/os_release.rs b/libs/basic/src/os_release.rs
|
||||
new file mode 100644
|
||||
index 0000000..26e291d
|
||||
--- /dev/null
|
||||
+++ b/libs/basic/src/os_release.rs
|
||||
@@ -0,0 +1,109 @@
|
||||
+// Copyright (c) 2022 Huawei Technologies Co.,Ltd. All rights reserved.
|
||||
+//
|
||||
+// sysMaster is licensed under Mulan PSL v2.
|
||||
+// You can use this software according to the terms and conditions of the Mulan
|
||||
+// PSL v2.
|
||||
+// You may obtain a copy of Mulan PSL v2 at:
|
||||
+// http://license.coscl.org.cn/MulanPSL2
|
||||
+// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
|
||||
+// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||||
+// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
+// See the Mulan PSL v2 for more details.
|
||||
+
|
||||
+//! Parse info about /etc/os-release
|
||||
+use std::{
|
||||
+ fs::File,
|
||||
+ io::{BufRead, BufReader},
|
||||
+};
|
||||
+
|
||||
+use crate::error::*;
|
||||
+
|
||||
+/// get value by key in /etc/os-release
|
||||
+pub fn get_os_release(key: &str) -> Result<Option<String>> {
|
||||
+ let reader = BufReader::new(File::open("/etc/os-release").context(IoSnafu)?);
|
||||
+ for line in reader.lines().map(std::result::Result::unwrap_or_default) {
|
||||
+ match parse_line(key, &line) {
|
||||
+ Some(value) => return Ok(Some(value.to_string())),
|
||||
+ None => continue,
|
||||
+ }
|
||||
+ }
|
||||
+ Ok(None)
|
||||
+}
|
||||
+
|
||||
+fn parse_line<'a>(key: &str, line: &'a str) -> Option<&'a str> {
|
||||
+ if let Some(pos) = line.chars().position(|c| c == '=') {
|
||||
+ let line_key = line[..pos].trim();
|
||||
+ if key == line_key {
|
||||
+ let s = trim_quotes(line[pos + 1..].trim());
|
||||
+ if !s.is_empty() {
|
||||
+ return Some(s);
|
||||
+ }
|
||||
+ }
|
||||
+ None
|
||||
+ } else {
|
||||
+ None
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+fn trim_quotes(str: &str) -> &str {
|
||||
+ if ["\"", "'"]
|
||||
+ .iter()
|
||||
+ .any(|s| str.starts_with(s) && str.ends_with(s))
|
||||
+ {
|
||||
+ str[1..str.len() - 1].trim()
|
||||
+ } else {
|
||||
+ str.trim()
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+#[cfg(test)]
|
||||
+mod test {
|
||||
+ use super::*;
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_trim_quotes() {
|
||||
+ let str1 = "\"aaaaa\"";
|
||||
+ assert_eq!(&str1[1..str1.len() - 1], trim_quotes(str1));
|
||||
+
|
||||
+ let str2 = "'aaaaa'";
|
||||
+ assert_eq!(&str2[1..str2.len() - 1], trim_quotes(str2));
|
||||
+
|
||||
+ let str3 = "\"aaaaa";
|
||||
+ assert_eq!(str3, trim_quotes(str3));
|
||||
+
|
||||
+ let str4 = "'aaaaa";
|
||||
+ assert_eq!(str4, trim_quotes(str4));
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_parse_line() {
|
||||
+ let line = "ID=\"openEuler\"";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+ assert_eq!(parse_line("NONE", line), None);
|
||||
+
|
||||
+ let line = "ID='openEuler'";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+ assert_eq!(parse_line("NONE", line), None);
|
||||
+
|
||||
+ let line = "IDopenEuler";
|
||||
+ assert_eq!(parse_line("ID", line), None);
|
||||
+
|
||||
+ let line = "ID=";
|
||||
+ assert_eq!(parse_line("ID", line), None);
|
||||
+
|
||||
+ let line = "ID=\"openEuler \"";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+
|
||||
+ let line = "ID=\"openEuler \"";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+
|
||||
+ let line = "ID=\"openEuler\" ";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+
|
||||
+ let line = "ID=openEuler";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+
|
||||
+ let line = "ID=openEuler ";
|
||||
+ assert_eq!(parse_line("ID", line), Some("openEuler"));
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,309 +0,0 @@
|
||||
From 8b9ac4b0954529df5c343317ee5223307224303c Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Sun, 25 Jun 2023 15:00:41 +0800
|
||||
Subject: [PATCH] feature: use LogFileSize and LogFileNumber to rotate the log
|
||||
and make __um_obj_create() accept LogFileSize/LogFileNumber
|
||||
|
||||
---
|
||||
core/bin/plugin/mod.rs | 61 ++++++++++++++++------------
|
||||
core/bin/unit/manager.rs | 25 ++++++++----
|
||||
core/lib/unit/umif.rs | 6 ++-
|
||||
libs/basic/src/logger.rs | 88 +++++++++++++++++++++++++++++++---------
|
||||
4 files changed, 125 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/bin/plugin/mod.rs
|
||||
index 9b19336..a8f6f24 100644
|
||||
--- a/core/bin/plugin/mod.rs
|
||||
+++ b/core/bin/plugin/mod.rs
|
||||
@@ -475,33 +475,44 @@ impl Plugin {
|
||||
unit_type: UnitType,
|
||||
target: &str,
|
||||
file: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
) -> Result<Box<dyn UnitManagerObj>> {
|
||||
- match self.get_lib(unit_type) {
|
||||
- Ok(dy_lib) => {
|
||||
- #[allow(clippy::type_complexity)]
|
||||
- let sym: Result<
|
||||
- Symbol<
|
||||
- fn(level: LevelFilter, target: &str, file: &str) -> *mut dyn UnitManagerObj,
|
||||
- >,
|
||||
- > = unsafe {
|
||||
- dy_lib
|
||||
- .lib
|
||||
- .get(b"__um_obj_create")
|
||||
- .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
- };
|
||||
- if let Ok(fun) = sym {
|
||||
- let boxed_raw = fun(log::max_level(), target, file);
|
||||
- Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
- } else {
|
||||
- Err(Error::PluginLoad {
|
||||
- msg: format!("The library of {:?} is {:?}", unit_type, sym.err()),
|
||||
- })
|
||||
- }
|
||||
+ let dy_lib = match self.get_lib(unit_type) {
|
||||
+ Err(_) => {
|
||||
+ return Err(Error::PluginLoad {
|
||||
+ msg: format!("create um, the {unit_type:?} plugin is not exist"),
|
||||
+ });
|
||||
}
|
||||
- Err(_) => Err(Error::PluginLoad {
|
||||
- msg: format!("create um, the {unit_type:?} plugin is not exist"),
|
||||
- }),
|
||||
- }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ type FnType = fn(
|
||||
+ level: LevelFilter,
|
||||
+ target: &str,
|
||||
+ file: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
+ ) -> *mut dyn UnitManagerObj;
|
||||
+
|
||||
+ #[allow(clippy::type_complexity)]
|
||||
+ let sym: Result<Symbol<FnType>> = unsafe {
|
||||
+ dy_lib
|
||||
+ .lib
|
||||
+ .get(b"__um_obj_create")
|
||||
+ .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
+ };
|
||||
+ let fun = match sym {
|
||||
+ Err(_) => {
|
||||
+ return Err(Error::PluginLoad {
|
||||
+ msg: format!("The library of {:?} is {:?}", unit_type, sym.err()),
|
||||
+ })
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ let boxed_raw = fun(log::max_level(), target, file, file_size, file_number);
|
||||
+ Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
}
|
||||
|
||||
fn get_lib(&self, unit_type: UnitType) -> Result<Arc<Lib>> {
|
||||
diff --git a/core/bin/unit/manager.rs b/core/bin/unit/manager.rs
|
||||
index 492f3f4..f548817 100644
|
||||
--- a/core/bin/unit/manager.rs
|
||||
+++ b/core/bin/unit/manager.rs
|
||||
@@ -1408,15 +1408,24 @@ mod unit_submanager {
|
||||
|
||||
fn new_sub(&self, unit_type: UnitType) -> Option<Box<dyn UnitManagerObj>> {
|
||||
let um = self.um();
|
||||
- let target = um.get_log_target();
|
||||
- let file = um.get_log_file();
|
||||
- let ret = Plugin::get_instance().create_um_obj(unit_type, target, file);
|
||||
- if ret.is_err() {
|
||||
- log::info!("create um_obj is not found, type {:?}!", unit_type);
|
||||
- return None;
|
||||
- }
|
||||
+ log::info!(
|
||||
+ "Creating UnitManagerObj for {:?} by __um_obj_create()",
|
||||
+ unit_type
|
||||
+ );
|
||||
+ let sub = match Plugin::get_instance().create_um_obj(
|
||||
+ unit_type,
|
||||
+ um.get_log_target(),
|
||||
+ um.get_log_file(),
|
||||
+ um.get_log_file_size(),
|
||||
+ um.get_log_file_number(),
|
||||
+ ) {
|
||||
+ Err(_) => {
|
||||
+ log::info!("__um_obj_create() of {:?} is not found", unit_type);
|
||||
+ return None;
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
|
||||
- let sub = ret.unwrap();
|
||||
let reli = um.reliability();
|
||||
sub.attach_um(um);
|
||||
sub.attach_reli(reli);
|
||||
diff --git a/core/lib/unit/umif.rs b/core/lib/unit/umif.rs
|
||||
index c41c211..a000a3d 100644
|
||||
--- a/core/lib/unit/umif.rs
|
||||
+++ b/core/lib/unit/umif.rs
|
||||
@@ -250,9 +250,11 @@ macro_rules! declure_umobj_plugin {
|
||||
pub fn __um_obj_create(
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file: &str,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
) -> *mut dyn $crate::unit::UnitManagerObj {
|
||||
- logger::init_log_for_subum($name, level, target, file);
|
||||
+ logger::init_log_for_subum($name, level, target, file_path, file_size, file_number);
|
||||
let construcotr: fn() -> $unit_type = $constructor;
|
||||
let obj = construcotr();
|
||||
let boxed: Box<dyn $crate::unit::UnitManagerObj> = Box::new(obj);
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 2f24d25..0bc15bb 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -15,7 +15,12 @@ use log::{LevelFilter, Log};
|
||||
use log4rs::{
|
||||
append::{
|
||||
console::{ConsoleAppender, Target},
|
||||
- file::FileAppender,
|
||||
+ rolling_file::{
|
||||
+ policy::compound::{
|
||||
+ roll::fixed_window::FixedWindowRoller, trigger::size::SizeTrigger, CompoundPolicy,
|
||||
+ },
|
||||
+ RollingFileAppender,
|
||||
+ },
|
||||
Append,
|
||||
},
|
||||
config::{Appender, Config, Logger, Root},
|
||||
@@ -78,13 +83,20 @@ impl log::Log for SysLogger {
|
||||
fn flush(&self) {}
|
||||
}
|
||||
|
||||
-fn append_log(app_name: &str, level: LevelFilter, target: &str, file_path: Option<&str>) {
|
||||
+fn append_log(
|
||||
+ app_name: &str,
|
||||
+ level: LevelFilter,
|
||||
+ target: &str,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
+) {
|
||||
if target == "syslog" {
|
||||
let _ = log::set_boxed_logger(Box::new(SysLogger));
|
||||
log::set_max_level(level);
|
||||
return;
|
||||
}
|
||||
- let config = build_log_config(app_name, level, target, file_path);
|
||||
+ let config = build_log_config(app_name, level, target, file_path, file_size, file_number);
|
||||
let logger = log4rs::Logger::new(config);
|
||||
log::set_max_level(level);
|
||||
let _ = log::set_boxed_logger(Box::new(LogPlugin(logger)));
|
||||
@@ -99,12 +111,18 @@ fn append_log(app_name: &str, level: LevelFilter, target: &str, file_path: Optio
|
||||
/// target: log target
|
||||
///
|
||||
/// file_path: file path if the target is set to file
|
||||
-pub fn init_log_for_subum(app_name: &str, level: LevelFilter, target: &str, file: &str) {
|
||||
- let file = if file.is_empty() { None } else { Some(file) };
|
||||
+pub fn init_log_for_subum(
|
||||
+ app_name: &str,
|
||||
+ level: LevelFilter,
|
||||
+ target: &str,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
+) {
|
||||
/* We should avoid calling init_log here, or we will get many "attempted
|
||||
* to set a logger after the logging system was already initialized" error
|
||||
* message. */
|
||||
- append_log(app_name, level, target, file);
|
||||
+ append_log(app_name, level, target, file_path, file_size, file_number);
|
||||
}
|
||||
|
||||
/// Init and set the log target to console
|
||||
@@ -113,7 +131,7 @@ pub fn init_log_for_subum(app_name: &str, level: LevelFilter, target: &str, file
|
||||
///
|
||||
/// level: maximum log level
|
||||
pub fn init_log_to_console(app_name: &str, level: LevelFilter) {
|
||||
- init_log(app_name, level, "console", None);
|
||||
+ init_log(app_name, level, "console", "", 0, 0);
|
||||
}
|
||||
|
||||
/// Init and set the log target to file
|
||||
@@ -123,8 +141,14 @@ pub fn init_log_to_console(app_name: &str, level: LevelFilter) {
|
||||
/// level: maximum log level
|
||||
///
|
||||
/// file_path: log to which file
|
||||
-pub fn init_log_to_file(app_name: &str, level: LevelFilter, file_path: &str) {
|
||||
- init_log(app_name, level, "file", Some(file_path));
|
||||
+pub fn init_log_to_file(
|
||||
+ app_name: &str,
|
||||
+ level: LevelFilter,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
+) {
|
||||
+ init_log(app_name, level, "file", file_path, file_size, file_number);
|
||||
}
|
||||
|
||||
/// Init and set the logger
|
||||
@@ -136,13 +160,20 @@ pub fn init_log_to_file(app_name: &str, level: LevelFilter, file_path: &str) {
|
||||
/// target: log target
|
||||
///
|
||||
/// file_path: file path if the target is set to file
|
||||
-pub fn init_log(app_name: &str, level: LevelFilter, target: &str, file_path: Option<&str>) {
|
||||
+pub fn init_log(
|
||||
+ app_name: &str,
|
||||
+ level: LevelFilter,
|
||||
+ target: &str,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
+) {
|
||||
if target == "syslog" {
|
||||
let _ = log::set_boxed_logger(Box::new(SysLogger));
|
||||
log::set_max_level(level);
|
||||
return;
|
||||
}
|
||||
- let config = build_log_config(app_name, level, target, file_path);
|
||||
+ let config = build_log_config(app_name, level, target, file_path, file_size, file_number);
|
||||
let r = log4rs::init_config(config);
|
||||
if let Err(e) = r {
|
||||
println!("{e}");
|
||||
@@ -153,12 +184,18 @@ fn build_log_config(
|
||||
app_name: &str,
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file: Option<&str>,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
) -> Config {
|
||||
let mut target = target;
|
||||
/* If the file is configured to None, use console forcely. */
|
||||
- if file.is_none() && target == "file" {
|
||||
- println!("LogTarget is configured to `file`, but LogFile is not configured, changing the LogTarget to `console`");
|
||||
+ if (file_path.is_empty() || file_size == 0 || file_number == 0) && target == "file" {
|
||||
+ println!(
|
||||
+ "LogTarget is configured to `file`, but configuration is invalid, changing the \
|
||||
+ LogTarget to `console`, file: {file_path}, file_size: {file_size}, file_number: \
|
||||
+ {file_number}"
|
||||
+ );
|
||||
target = "console";
|
||||
}
|
||||
let encoder = Box::new(PatternEncoder::new(LOG_PATTERN));
|
||||
@@ -169,12 +206,23 @@ fn build_log_config(
|
||||
.target(Target::Stdout)
|
||||
.build(),
|
||||
),
|
||||
- "file" => Box::new(
|
||||
- FileAppender::builder()
|
||||
- .encoder(encoder)
|
||||
- .build(file.unwrap())
|
||||
- .unwrap(),
|
||||
- ),
|
||||
+ "file" => {
|
||||
+ let pattern = file_path.to_string() + &".{}";
|
||||
+ let policy = Box::new(CompoundPolicy::new(
|
||||
+ Box::new(SizeTrigger::new(file_size as u64 * 1024)),
|
||||
+ Box::new(
|
||||
+ FixedWindowRoller::builder()
|
||||
+ .build(&pattern, file_number)
|
||||
+ .unwrap(),
|
||||
+ ),
|
||||
+ ));
|
||||
+ Box::new(
|
||||
+ RollingFileAppender::builder()
|
||||
+ .encoder(encoder)
|
||||
+ .build(file_path, policy)
|
||||
+ .unwrap(),
|
||||
+ )
|
||||
+ }
|
||||
_ => Box::new(
|
||||
ConsoleAppender::builder()
|
||||
.encoder(encoder)
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,283 +0,0 @@
|
||||
From f70fcf7c4389ee9eb81f62e8b763e095ed50aea9 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Tue, 27 Jun 2023 20:15:04 +0800
|
||||
Subject: [PATCH] feature: use our own file logger
|
||||
|
||||
This implements a simple file logger which supports log rorating. we set
|
||||
the log file mode to 600 forcely
|
||||
---
|
||||
libs/basic/Cargo.toml | 1 +
|
||||
libs/basic/src/logger.rs | 203 ++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 202 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index 7557d37..6ee7162 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -21,6 +21,7 @@ lazy_static = "1.4.0"
|
||||
bitflags = "1.3.2"
|
||||
pkg-config = "0.3"
|
||||
rand = "0.4.6"
|
||||
+time = {version = "=0.3.10", features = ["formatting", "macros"] }
|
||||
|
||||
[dev-dependencies]
|
||||
libtests = { path = "../libtests" }
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 56def43..3bf579b 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -11,6 +11,14 @@
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
//!
|
||||
+use std::{
|
||||
+ fs::{File, OpenOptions},
|
||||
+ io::Write,
|
||||
+ os::unix::prelude::OpenOptionsExt,
|
||||
+ path::{Path, PathBuf},
|
||||
+ sync::Mutex,
|
||||
+};
|
||||
+
|
||||
use log::{LevelFilter, Log};
|
||||
use log4rs::{
|
||||
append::{
|
||||
@@ -27,6 +35,7 @@ use log4rs::{
|
||||
encode::pattern::PatternEncoder,
|
||||
};
|
||||
use nix::libc;
|
||||
+use time::UtcOffset;
|
||||
|
||||
/// sysmaster log parttern:
|
||||
///
|
||||
@@ -83,6 +92,174 @@ impl log::Log for SysLogger {
|
||||
fn flush(&self) {}
|
||||
}
|
||||
|
||||
+struct FileLogger {
|
||||
+ level: log::Level,
|
||||
+ file_path: PathBuf,
|
||||
+ #[allow(dead_code)]
|
||||
+ file_mode: u32,
|
||||
+ file_number: u32,
|
||||
+ max_size: u32,
|
||||
+ file: Mutex<File>,
|
||||
+}
|
||||
+
|
||||
+impl log::Log for FileLogger {
|
||||
+ fn enabled(&self, metadata: &log::Metadata) -> bool {
|
||||
+ metadata.level() <= self.level
|
||||
+ }
|
||||
+
|
||||
+ fn log(&self, record: &log::Record) {
|
||||
+ if !self.enabled(record.metadata()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ let current_size: u32;
|
||||
+ {
|
||||
+ let mut file = self.file.lock().unwrap();
|
||||
+ self.write(
|
||||
+ &mut file,
|
||||
+ record.module_path().unwrap(),
|
||||
+ record.args().to_string(),
|
||||
+ );
|
||||
+ current_size = file.metadata().unwrap().len() as u32;
|
||||
+ /* file is automatically unlocked. */
|
||||
+ }
|
||||
+ if current_size > self.max_size {
|
||||
+ self.rotate();
|
||||
+ let file = self.file.lock().unwrap();
|
||||
+ let _ = file.set_len(0);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn flush(&self) {
|
||||
+ let mut file = self.file.lock().unwrap();
|
||||
+ let _ = file.flush();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+impl FileLogger {
|
||||
+ fn file_open(file_path: &PathBuf, file_mode: u32) -> File {
|
||||
+ OpenOptions::new()
|
||||
+ .write(true)
|
||||
+ .create(true)
|
||||
+ .append(true)
|
||||
+ .mode(file_mode)
|
||||
+ .open(file_path)
|
||||
+ .unwrap()
|
||||
+ }
|
||||
+
|
||||
+ fn mv_file_in_dir(src: &str, dst: Option<&str>, dir: &Path) {
|
||||
+ let src = dir.join(src);
|
||||
+ if dst.is_none() {
|
||||
+ let _ = std::fs::remove_file(src);
|
||||
+ return;
|
||||
+ }
|
||||
+ let dst = dir.join(dst.unwrap());
|
||||
+ let _ = std::fs::rename(src, dst);
|
||||
+ }
|
||||
+
|
||||
+ fn cp_file_in_dir(src: &str, dst: &str, dir: &Path) {
|
||||
+ let src = dir.join(src);
|
||||
+ let dst = dir.join(dst);
|
||||
+ let _ = std::fs::copy(src, dst);
|
||||
+ }
|
||||
+
|
||||
+ fn new(
|
||||
+ level: log::Level,
|
||||
+ file_path: PathBuf,
|
||||
+ file_mode: u32,
|
||||
+ max_size: u32,
|
||||
+ file_number: u32,
|
||||
+ ) -> Self {
|
||||
+ let file = Self::file_open(&file_path, file_mode);
|
||||
+ Self {
|
||||
+ level,
|
||||
+ file_path,
|
||||
+ file_mode,
|
||||
+ file_number,
|
||||
+ max_size: max_size * 1024,
|
||||
+ file: Mutex::new(file),
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn write(&self, file: &mut File, module: &str, msg: String) {
|
||||
+ let now = time::OffsetDateTime::now_utc().to_offset(UtcOffset::UTC);
|
||||
+ let format =
|
||||
+ time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]");
|
||||
+ let now = now.format(&format).unwrap();
|
||||
+
|
||||
+ /* 1. Write time */
|
||||
+ if let Err(e) = file.write(format!("{now} ").as_bytes()) {
|
||||
+ println!("Failed to log time message: {e}");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* 2. Write module */
|
||||
+ if let Err(e) = file.write((module.to_string() + " ").as_bytes()) {
|
||||
+ println!("Failed to log module message: {e}");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* 3. Write message */
|
||||
+ if let Err(e) = file.write((msg + "\n").as_bytes()) {
|
||||
+ println!("Failed to log message: {e}");
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn rotate(&self) {
|
||||
+ let dir = self.file_path.parent().unwrap();
|
||||
+ let file_name = self
|
||||
+ .file_path
|
||||
+ .file_name()
|
||||
+ .unwrap()
|
||||
+ .to_string_lossy()
|
||||
+ .to_string();
|
||||
+ let file_name_dot = String::from(&file_name) + ".";
|
||||
+ let mut num_list: Vec<usize> = Vec::new();
|
||||
+
|
||||
+ for de in dir.read_dir().unwrap() {
|
||||
+ let de = match de {
|
||||
+ Err(_) => continue,
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if !de.file_type().unwrap().is_file() {
|
||||
+ continue;
|
||||
+ }
|
||||
+ let de_file_name = de.file_name().to_string_lossy().to_string();
|
||||
+ let rotated_num = de_file_name.trim_start_matches(&file_name_dot);
|
||||
+ let rotated_num = match rotated_num.parse::<usize>() {
|
||||
+ Err(_) => {
|
||||
+ continue;
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ num_list.push(rotated_num);
|
||||
+ }
|
||||
+
|
||||
+ num_list.sort();
|
||||
+
|
||||
+ /* 1. delete surplus rotated file */
|
||||
+ /* We only keep (file_number - 1) rotated files, because we will generate a new one later. */
|
||||
+ let file_number = self.file_number as usize;
|
||||
+ for i in file_number - 1..num_list.len() {
|
||||
+ let src = String::from(&file_name_dot) + &num_list[i].to_string();
|
||||
+ Self::mv_file_in_dir(&src, None, dir);
|
||||
+ }
|
||||
+
|
||||
+ let end = std::cmp::min(num_list.len(), file_number);
|
||||
+ /* 2. {sysmaster.log.1, sysmaster.log.2, ...} => {sysmaster.log.2, sysmaster.log.3, ...} */
|
||||
+ for i in (0..end).rev() {
|
||||
+ let src = String::from(&file_name_dot) + &num_list[i].to_string();
|
||||
+ let dst = String::from(&file_name_dot) + &(num_list[i] + 1).to_string();
|
||||
+ Self::mv_file_in_dir(&src, Some(&dst), dir);
|
||||
+ }
|
||||
+
|
||||
+ /* 3. **copy** sysmaster.log => sysmaster.log.1 */
|
||||
+ let src = String::from(&file_name);
|
||||
+ let dst = String::from(&file_name_dot) + "1";
|
||||
+ Self::cp_file_in_dir(&src, &dst, dir);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
fn append_log(
|
||||
app_name: &str,
|
||||
level: LevelFilter,
|
||||
@@ -96,6 +273,17 @@ fn append_log(
|
||||
log::set_max_level(level);
|
||||
return;
|
||||
}
|
||||
+ if target == "file" {
|
||||
+ log::set_max_level(level);
|
||||
+ let _ = log::set_boxed_logger(Box::new(FileLogger::new(
|
||||
+ log::Level::Debug,
|
||||
+ PathBuf::from(file_path),
|
||||
+ 0o600,
|
||||
+ file_size,
|
||||
+ file_number,
|
||||
+ )));
|
||||
+ return;
|
||||
+ }
|
||||
let config = build_log_config(app_name, level, target, file_path, file_size, file_number);
|
||||
let logger = log4rs::Logger::new(config);
|
||||
log::set_max_level(level);
|
||||
@@ -173,6 +361,17 @@ pub fn init_log(
|
||||
log::set_max_level(level);
|
||||
return;
|
||||
}
|
||||
+ if target == "file" {
|
||||
+ let _ = log::set_boxed_logger(Box::new(FileLogger::new(
|
||||
+ log::Level::Debug,
|
||||
+ PathBuf::from(&file_path),
|
||||
+ 0o600,
|
||||
+ file_size,
|
||||
+ file_number,
|
||||
+ )));
|
||||
+ log::set_max_level(level);
|
||||
+ return;
|
||||
+ }
|
||||
let config = build_log_config(app_name, level, target, file_path, file_size, file_number);
|
||||
let r = log4rs::init_config(config);
|
||||
if let Err(e) = r {
|
||||
@@ -190,7 +389,7 @@ fn build_log_config(
|
||||
) -> Config {
|
||||
let mut target = target;
|
||||
/* If the file is configured to None, use console forcely. */
|
||||
- if (file_path.is_empty() || file_size == 0 || file_number == 0) && target == "file" {
|
||||
+ if (file_path.is_empty() || file_size == 0 || file_number == 0) && target == "rolling_file" {
|
||||
println!(
|
||||
"LogTarget is configured to `file`, but configuration is invalid, changing the \
|
||||
LogTarget to `console`, file: {file_path}, file_size: {file_size}, file_number: \
|
||||
@@ -206,7 +405,7 @@ fn build_log_config(
|
||||
.target(Target::Stdout)
|
||||
.build(),
|
||||
),
|
||||
- "file" => {
|
||||
+ "rolling_file" => {
|
||||
let pattern = file_path.to_string() + ".{}";
|
||||
let policy = Box::new(CompoundPolicy::new(
|
||||
Box::new(SizeTrigger::new(file_size as u64 * 1024)),
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,24 +0,0 @@
|
||||
From 1782a2b961e7a68960a37ef9a7b0140f20fad72e Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 28 Jun 2023 16:47:54 +0800
|
||||
Subject: [PATCH] fix: add default system.toml
|
||||
|
||||
---
|
||||
units/system.toml | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
create mode 100644 units/system.toml
|
||||
|
||||
diff --git a/units/system.toml b/units/system.toml
|
||||
new file mode 100644
|
||||
index 0000000..539a119
|
||||
--- /dev/null
|
||||
+++ b/units/system.toml
|
||||
@@ -0,0 +1,5 @@
|
||||
+LogLevel="info"
|
||||
+LogTarget="syslog"
|
||||
+LogFile="/var/log/sysmaster/sysmaster.log"
|
||||
+LogFileSize=10240
|
||||
+LogFileNumber=10
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,134 +0,0 @@
|
||||
From be5bf4f1e2a8a61e6277e0a568cd3d0be058f0ae Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 24 Jul 2023 11:47:53 +0800
|
||||
Subject: [PATCH] fix: add two helper function to check if the path name is
|
||||
safe, and path length is valid
|
||||
|
||||
---
|
||||
libs/basic/src/path_util.rs | 98 +++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 98 insertions(+)
|
||||
|
||||
diff --git a/libs/basic/src/path_util.rs b/libs/basic/src/path_util.rs
|
||||
index 7391615..58f8e49 100644
|
||||
--- a/libs/basic/src/path_util.rs
|
||||
+++ b/libs/basic/src/path_util.rs
|
||||
@@ -14,6 +14,12 @@
|
||||
//!
|
||||
use std::path::Path;
|
||||
|
||||
+/// The maximum length of a linux path
|
||||
+pub const PATH_LENGTH_MAX: usize = 4096;
|
||||
+
|
||||
+/// The maximum length of a linux file name
|
||||
+pub const FILE_LENGTH_MAX: usize = 255;
|
||||
+
|
||||
/// return true if the path of a and b equaled.
|
||||
pub fn path_equal(a: &str, b: &str) -> bool {
|
||||
let p_a = Path::new(a);
|
||||
@@ -21,6 +27,58 @@ pub fn path_equal(a: &str, b: &str) -> bool {
|
||||
p_a == p_b
|
||||
}
|
||||
|
||||
+/// check if the path name contains unsafe character
|
||||
+///
|
||||
+/// return true if it doesn't contain unsafe character
|
||||
+pub fn path_name_is_safe(s: &str) -> bool {
|
||||
+ if s.is_empty() {
|
||||
+ return false;
|
||||
+ }
|
||||
+ for c in s.chars() {
|
||||
+ if c > 0 as char && c < ' ' {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if (c as char).is_ascii_control() {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ true
|
||||
+}
|
||||
+
|
||||
+/// check if the path length is valid
|
||||
+pub fn path_length_is_valid(s: &str) -> bool {
|
||||
+ if s.is_empty() {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if s.len() > PATH_LENGTH_MAX {
|
||||
+ return false;
|
||||
+ }
|
||||
+ let mut de_len = 0;
|
||||
+ let mut last_c = '/';
|
||||
+ for c in s.chars() {
|
||||
+ match c {
|
||||
+ '/' => {
|
||||
+ de_len = 0;
|
||||
+ }
|
||||
+ '.' => {
|
||||
+ if last_c == '/' {
|
||||
+ de_len = 1;
|
||||
+ } else {
|
||||
+ de_len += 1;
|
||||
+ }
|
||||
+ }
|
||||
+ _ => {
|
||||
+ de_len += 1;
|
||||
+ }
|
||||
+ }
|
||||
+ if de_len > FILE_LENGTH_MAX {
|
||||
+ return false;
|
||||
+ }
|
||||
+ last_c = c;
|
||||
+ }
|
||||
+ true
|
||||
+}
|
||||
+
|
||||
/// Remove redundant inner and trailing slashes and unnecessary dots to simplify path.
|
||||
/// e.g., //foo//.//bar/ becomes /foo/bar
|
||||
/// .//foo//.//bar/ becomes foo/bar
|
||||
@@ -77,4 +135,44 @@ mod tests {
|
||||
assert_eq!(path_simplify(".//foo//.//bar/"), "foo/bar");
|
||||
assert_eq!(path_simplify("foo//.//bar/"), "foo/bar");
|
||||
}
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_path_name_is_safe() {
|
||||
+ assert!(!path_name_is_safe(""));
|
||||
+ assert!(path_name_is_safe("/abc"));
|
||||
+ assert!(!path_name_is_safe("/abc\x7f/a"));
|
||||
+ assert!(!path_name_is_safe("/abc\x1f/a"));
|
||||
+ assert!(!path_name_is_safe("/\x0a/a"));
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_path_length_is_valid() {
|
||||
+ assert!(!path_length_is_valid(""));
|
||||
+
|
||||
+ let path = "/a/".to_string() + &String::from_iter(vec!['1'; 255]);
|
||||
+ assert!(path_length_is_valid(&path));
|
||||
+
|
||||
+ let path = "/a/".to_string() + &String::from_iter(vec!['1'; 256]);
|
||||
+ assert!(!path_length_is_valid(&path));
|
||||
+
|
||||
+ let path = "/a/".to_string() + &String::from_iter(vec!['/'; 256]);
|
||||
+ assert!(path_length_is_valid(&path));
|
||||
+
|
||||
+ let path = "/a/".to_string() + &String::from_iter(vec!['.'; 255]);
|
||||
+ assert!(path_length_is_valid(&path));
|
||||
+
|
||||
+ let mut path = "".to_string();
|
||||
+ for _ in 0..40 {
|
||||
+ path += "/";
|
||||
+ path += &String::from_iter(vec!['1'; 100]);
|
||||
+ }
|
||||
+ assert!(path_length_is_valid(&path));
|
||||
+
|
||||
+ let mut path = "".to_string();
|
||||
+ for _ in 0..41 {
|
||||
+ path += "/";
|
||||
+ path += &String::from_iter(vec!['1'; 100]);
|
||||
+ }
|
||||
+ assert!(!path_length_is_valid(&path));
|
||||
+ }
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From e9ce7c44f15a6e03df5d5c4837f8b4d86841cd1f Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 5 Jul 2023 16:42:08 +0800
|
||||
Subject: [PATCH] fix: add two helper macroes to help us log message out when
|
||||
we operate a file or directory easily
|
||||
|
||||
---
|
||||
libs/basic/src/fs_util.rs | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index ec814e2..3aa93e9 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -310,6 +310,31 @@ pub fn touch_file(
|
||||
fchmod_and_chown(fd, path, mode, uid, gid)
|
||||
}
|
||||
|
||||
+/// do some operations and log message out, returns Io error when fail
|
||||
+#[macro_export]
|
||||
+macro_rules! do_entry_or_return_io_error {
|
||||
+ ($function:expr, $entry:ident, $action:literal) => {
|
||||
+ match $function(&$entry) {
|
||||
+ Err(e) => {
|
||||
+ log::error!("Failed to {} {:?}: {e}", $action, $entry);
|
||||
+ return Err(e).context(IoSnafu);
|
||||
+ }
|
||||
+ Ok(_) => log::debug!("{} {:?} succeeded", $action, $entry),
|
||||
+ }
|
||||
+ };
|
||||
+}
|
||||
+
|
||||
+/// do some operations and log message out, skip the error
|
||||
+#[macro_export]
|
||||
+macro_rules! do_entry_log {
|
||||
+ ($function:expr, $entry:ident, $action:literal) => {
|
||||
+ match $function(&$entry) {
|
||||
+ Err(e) => log::error!("Failed to {} {:?}: {e}", $action, $entry),
|
||||
+ Ok(_) => log::debug!("{} {:?} succeeded", $action, $entry),
|
||||
+ }
|
||||
+ };
|
||||
+}
|
||||
+
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,288 +0,0 @@
|
||||
From bb5273fb5e381cc9f655cec8ca1c77faebc3a40b Mon Sep 17 00:00:00 2001
|
||||
From: xuxiaozhou1 <xuxiaozhou1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 14:29:08 +0800
|
||||
Subject: [PATCH] fix: adjust the mode of internal generated files
|
||||
|
||||
---
|
||||
core/libsysmaster/rel/api.rs | 25 ++++++++++++++++++++-----
|
||||
core/libsysmaster/rel/base.rs | 9 +++++++++
|
||||
core/libsysmaster/rel/history.rs | 11 ++++++++++-
|
||||
core/sysmaster/unit/notify.rs | 10 +++++++++-
|
||||
core/sysmaster/unit/util/unit_file.rs | 4 ++--
|
||||
init/src/runtime/comm.rs | 16 ++++++++++++++--
|
||||
libs/basic/src/path_lookup.rs | 18 +++++++++++-------
|
||||
tests/common/util_lib.sh | 6 +++---
|
||||
8 files changed, 104 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/core/libsysmaster/rel/api.rs b/core/libsysmaster/rel/api.rs
|
||||
index fb482b8..94f9015 100644
|
||||
--- a/core/libsysmaster/rel/api.rs
|
||||
+++ b/core/libsysmaster/rel/api.rs
|
||||
@@ -21,6 +21,7 @@ use super::{
|
||||
use crate::{error::*, rel::base};
|
||||
use basic::do_entry_or_return_io_error;
|
||||
use heed::Database;
|
||||
+use nix::sys::stat::{self, Mode};
|
||||
use std::{
|
||||
fs::{self, File},
|
||||
path::Path,
|
||||
@@ -396,17 +397,31 @@ fn reli_prepare() -> Result<String> {
|
||||
base::reli_dir_prepare()?; // again
|
||||
let dir_string = base::reli_dir_get().unwrap();
|
||||
|
||||
+ // prepare
|
||||
+ /* create '/run/sysmaster/reliability/sub_dir' or 'xxx/reliability/sub_dir' with mode 700 */
|
||||
+ let old_mask = stat::umask(Mode::from_bits_truncate(!0o700));
|
||||
+ let ret = reli_do_prepare(&dir_string);
|
||||
+ let _ = stat::umask(old_mask);
|
||||
+ if let Err(e) = ret {
|
||||
+ log::error!("reliability prepare failed: dir{:?}, {}", dir_string, e);
|
||||
+ return Err(e);
|
||||
+ }
|
||||
+
|
||||
+ Ok(dir_string)
|
||||
+}
|
||||
+
|
||||
+fn reli_do_prepare(dir_string: &str) -> Result<()> {
|
||||
// enable
|
||||
- enable::prepare(&dir_string)?;
|
||||
+ enable::prepare(dir_string)?;
|
||||
|
||||
// last
|
||||
- last::prepare(&dir_string)?;
|
||||
+ last::prepare(dir_string)?;
|
||||
|
||||
// history
|
||||
- history::prepare(&dir_string)?;
|
||||
+ history::prepare(dir_string)?;
|
||||
|
||||
// pending
|
||||
- pending::prepare(&dir_string)?;
|
||||
+ pending::prepare(dir_string)?;
|
||||
|
||||
- Ok(dir_string)
|
||||
+ Ok(())
|
||||
}
|
||||
diff --git a/core/libsysmaster/rel/base.rs b/core/libsysmaster/rel/base.rs
|
||||
index 7137e13..65307e0 100644
|
||||
--- a/core/libsysmaster/rel/base.rs
|
||||
+++ b/core/libsysmaster/rel/base.rs
|
||||
@@ -15,6 +15,7 @@ use crate::error::*;
|
||||
use heed::types::SerdeBincode;
|
||||
use heed::Database;
|
||||
use heed::{Env, RoTxn, RwTxn};
|
||||
+use nix::sys::stat::{self, Mode};
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde::Serialize;
|
||||
use std::cell::RefCell;
|
||||
@@ -305,6 +306,14 @@ pub fn reli_dir_get() -> Result<String> {
|
||||
/// 2. OUT_DIR/../reliability/: make CI happy, which is target/debug/reliability/ or target/release/reliability/ usually.
|
||||
/// 3. PROCESS_RELI_PATH: the path customized.
|
||||
pub fn reli_dir_prepare() -> Result<()> {
|
||||
+ // create '/run/sysmaster/reliability' or 'xxx/reliability' with mode 700
|
||||
+ let old_mask = stat::umask(Mode::from_bits_truncate(!0o700));
|
||||
+ let ret = reli_dir_prepare_body();
|
||||
+ let _ = stat::umask(old_mask);
|
||||
+ ret
|
||||
+}
|
||||
+
|
||||
+fn reli_dir_prepare_body() -> Result<()> {
|
||||
// // /run/sysmaster/reliability/
|
||||
let ret_run = reli_dir_prepare_run();
|
||||
if ret_run.is_ok() {
|
||||
diff --git a/core/libsysmaster/rel/history.rs b/core/libsysmaster/rel/history.rs
|
||||
index fc31623..c301f38 100644
|
||||
--- a/core/libsysmaster/rel/history.rs
|
||||
+++ b/core/libsysmaster/rel/history.rs
|
||||
@@ -14,6 +14,7 @@ use super::base::{ReDbRoTxn, ReDbRwTxn, ReDbTable};
|
||||
use crate::error::*;
|
||||
use basic::{do_entry_log, do_entry_or_return_io_error};
|
||||
use heed::{CompactionOption, Env, EnvOpenOptions};
|
||||
+use nix::sys::stat::{self, Mode};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashMap;
|
||||
use std::fmt;
|
||||
@@ -120,6 +121,14 @@ impl ReliHistory {
|
||||
}
|
||||
|
||||
pub(super) fn compact(&self) -> Result<()> {
|
||||
+ // action with mode 700, excluding group and other users
|
||||
+ let old_mask = stat::umask(Mode::from_bits_truncate(!0o700));
|
||||
+ let ret = self.compact_body();
|
||||
+ let _ = stat::umask(old_mask);
|
||||
+ ret
|
||||
+ }
|
||||
+
|
||||
+ fn compact_body(&self) -> Result<()> {
|
||||
// a -> b or b -> a
|
||||
// prepare next
|
||||
let history = history_path_get(&self.hdir);
|
||||
@@ -189,7 +198,7 @@ pub fn prepare(dir_str: &str) -> Result<()> {
|
||||
|
||||
let b = history.join(RELI_HISTORY_B_DIR);
|
||||
if !b.exists() {
|
||||
- do_entry_or_return_io_error!(fs::create_dir_all, a, "create");
|
||||
+ do_entry_or_return_io_error!(fs::create_dir_all, b, "create");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
diff --git a/core/sysmaster/unit/notify.rs b/core/sysmaster/unit/notify.rs
|
||||
index d23a725..4f92b63 100644
|
||||
--- a/core/sysmaster/unit/notify.rs
|
||||
+++ b/core/sysmaster/unit/notify.rs
|
||||
@@ -21,6 +21,7 @@ use nix::errno::Errno;
|
||||
use nix::sys::socket::{
|
||||
self, sockopt, AddressFamily, MsgFlags, RecvMsg, SockFlag, SockType, UnixAddr, UnixCredentials,
|
||||
};
|
||||
+use nix::sys::stat::{self, Mode};
|
||||
use nix::unistd::Pid;
|
||||
use std::{
|
||||
cell::RefCell, collections::HashMap, fs, io::IoSliceMut, os::unix::prelude::RawFd,
|
||||
@@ -171,7 +172,14 @@ impl Notify {
|
||||
log::warn!("unlink path failed: {:?}, error: {}", sock_path, e);
|
||||
}
|
||||
|
||||
- socket::bind(fd, &unix_addr)?;
|
||||
+ // create '/run/sysmaster/notify' with mode 666
|
||||
+ let old_mask = stat::umask(Mode::from_bits_truncate(!0o666));
|
||||
+ let ret = socket::bind(fd, &unix_addr);
|
||||
+ let _ = stat::umask(old_mask);
|
||||
+ if let Err(e) = ret {
|
||||
+ log::error!("Failed to bind socket {:?}: {}", sock_path, e);
|
||||
+ return Err(e);
|
||||
+ }
|
||||
socket::setsockopt(fd, sockopt::PassCred, &true)?;
|
||||
|
||||
log::debug!("set event fd is: {}", fd);
|
||||
diff --git a/core/sysmaster/unit/util/unit_file.rs b/core/sysmaster/unit/util/unit_file.rs
|
||||
index eb9404b..4f7078f 100644
|
||||
--- a/core/sysmaster/unit/util/unit_file.rs
|
||||
+++ b/core/sysmaster/unit/util/unit_file.rs
|
||||
@@ -105,7 +105,7 @@ impl UnitFileData {
|
||||
if fs::metadata(path).is_err() {
|
||||
return None;
|
||||
}
|
||||
- /* {/etc/sysmaster, /usr/lib/sysmaster}/foo.service.d */
|
||||
+ /* {/etc/sysmaster/system, /usr/lib/sysmaster/system}/foo.service.d */
|
||||
let pathd_str = format!("{path}/{name}.d");
|
||||
let dir = Path::new(&pathd_str);
|
||||
if dir.is_dir() {
|
||||
@@ -121,7 +121,7 @@ impl UnitFileData {
|
||||
res.push(fragment);
|
||||
}
|
||||
}
|
||||
- /* {/etc/sysmater, /usr/lib/sysmaster}/foo.service */
|
||||
+ /* {/etc/sysmater/system, /usr/lib/sysmaster/system}/foo.service */
|
||||
let config_path = Path::new(path).join(name);
|
||||
if !config_path.exists() {
|
||||
return None;
|
||||
diff --git a/init/src/runtime/comm.rs b/init/src/runtime/comm.rs
|
||||
index 92d52bc..c285ad7 100644
|
||||
--- a/init/src/runtime/comm.rs
|
||||
+++ b/init/src/runtime/comm.rs
|
||||
@@ -16,6 +16,7 @@ use nix::errno::Errno;
|
||||
use nix::sys::epoll::EpollEvent;
|
||||
use nix::sys::inotify::{AddWatchFlags, InitFlags, Inotify, WatchDescriptor};
|
||||
use nix::sys::socket::{self, AddressFamily, SockFlag, SockType, UnixAddr};
|
||||
+use nix::sys::stat::{self, Mode};
|
||||
use nix::unistd;
|
||||
use std::os::unix::io::AsRawFd;
|
||||
use std::os::unix::prelude::RawFd;
|
||||
@@ -281,12 +282,16 @@ fn create_listen_fd(epoll: &Rc<Epoll>) -> Result<(i32, Inotify, WatchDescriptor)
|
||||
None,
|
||||
)?;
|
||||
|
||||
+ // create '/run/sysmaster' with mode 755
|
||||
let sock_path = PathBuf::from(INIT_SOCKET);
|
||||
let path = match sock_path.as_path().parent() {
|
||||
None => return Err(Errno::EINVAL),
|
||||
Some(v) => v,
|
||||
};
|
||||
- if let Err(e) = fs::create_dir_all(path) {
|
||||
+ let old_mask = stat::umask(Mode::from_bits_truncate(!0o755));
|
||||
+ let ret = fs::create_dir_all(path);
|
||||
+ let _ = stat::umask(old_mask);
|
||||
+ if let Err(e) = ret {
|
||||
eprintln!("Failed to create directory {path:?}: {e}");
|
||||
return Err(Errno::from_i32(
|
||||
e.raw_os_error().unwrap_or(Errno::EINVAL as i32),
|
||||
@@ -297,8 +302,15 @@ fn create_listen_fd(epoll: &Rc<Epoll>) -> Result<(i32, Inotify, WatchDescriptor)
|
||||
eprintln!("Failed to unlink path:{:?}, error:{}", sock_path, e);
|
||||
}
|
||||
|
||||
+ // create '/run/sysmaster/init' with mode 600
|
||||
let addr = UnixAddr::new(&sock_path)?;
|
||||
- socket::bind(listen_fd, &addr)?;
|
||||
+ let old_mask = stat::umask(Mode::from_bits_truncate(!0o600));
|
||||
+ let ret = socket::bind(listen_fd, &addr);
|
||||
+ let _ = stat::umask(old_mask);
|
||||
+ if let Err(e) = ret {
|
||||
+ eprintln!("Failed to bind socket {sock_path:?}: {e}");
|
||||
+ return Err(e);
|
||||
+ }
|
||||
socket::listen(listen_fd, LISTEN_BACKLOG)?;
|
||||
|
||||
let inotify = Inotify::init(InitFlags::all())?;
|
||||
diff --git a/libs/basic/src/path_lookup.rs b/libs/basic/src/path_lookup.rs
|
||||
index 4c9797d..e3ab1f2 100644
|
||||
--- a/libs/basic/src/path_lookup.rs
|
||||
+++ b/libs/basic/src/path_lookup.rs
|
||||
@@ -13,11 +13,11 @@
|
||||
//! the management of the unit file lookup path
|
||||
|
||||
/// unit lookup path in /etc
|
||||
-pub const ETC_SYSTEM_PATH: &str = "/etc/sysmaster";
|
||||
+pub const ETC_SYSTEM_PATH: &str = "/etc/sysmaster/system";
|
||||
/// unit lookup path in /run
|
||||
-pub const RUN_SYSTEM_PATH: &str = "/run/sysmaster";
|
||||
+pub const RUN_SYSTEM_PATH: &str = "/run/sysmaster/system";
|
||||
/// unit lookup path in /usr/lib
|
||||
-pub const LIB_SYSTEM_PATH: &str = "/usr/lib/sysmaster";
|
||||
+pub const LIB_SYSTEM_PATH: &str = "/usr/lib/sysmaster/system";
|
||||
|
||||
/// struct LookupPaths
|
||||
#[derive(Debug, Clone)]
|
||||
@@ -85,15 +85,19 @@ mod tests {
|
||||
lp.init_lookup_paths();
|
||||
assert_eq!(
|
||||
lp.search_path,
|
||||
- vec!["/usr/lib/sysmaster", "/run/sysmaster", "/etc/sysmaster"]
|
||||
+ vec![
|
||||
+ "/usr/lib/sysmaster/system",
|
||||
+ "/run/sysmaster/system",
|
||||
+ "/etc/sysmaster/system"
|
||||
+ ]
|
||||
);
|
||||
assert_eq!(
|
||||
lp.preset_path,
|
||||
vec![
|
||||
- "/etc/sysmaster/system-preset",
|
||||
- "/usr/lib/sysmaster/system-preset"
|
||||
+ "/etc/sysmaster/system/system-preset",
|
||||
+ "/usr/lib/sysmaster/system/system-preset"
|
||||
]
|
||||
);
|
||||
- assert_eq!(lp.persistent_path, "/etc/sysmaster")
|
||||
+ assert_eq!(lp.persistent_path, "/etc/sysmaster/system")
|
||||
}
|
||||
}
|
||||
diff --git a/tests/common/util_lib.sh b/tests/common/util_lib.sh
|
||||
index 1878016..18de448 100644
|
||||
--- a/tests/common/util_lib.sh
|
||||
+++ b/tests/common/util_lib.sh
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
export EXPECT_FAIL=0
|
||||
-export SYSMST_LIB_PATH='/usr/lib/sysmaster'
|
||||
-export SYSMST_ETC_PATH='/etc/sysmaster'
|
||||
-export SYSMST_RUN_PATH='/run/sysmaster'
|
||||
+export SYSMST_LIB_PATH='/usr/lib/sysmaster/system'
|
||||
+export SYSMST_ETC_PATH='/etc/sysmaster/system'
|
||||
+export SYSMST_RUN_PATH='/run/sysmaster/system'
|
||||
export SYSMST_LOG='/opt/sysmaster.log'
|
||||
export RELIAB_SWITCH_PATH='/run/sysmaster/reliability'
|
||||
export RELIAB_SWITCH='switch.debug'
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,102 +0,0 @@
|
||||
From cf4539ac602c1bcf7dc1bf1664cba60118ccd576 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 10:57:34 +0800
|
||||
Subject: [PATCH] fix: avoid calling init_lookup_paths in testcase
|
||||
|
||||
We know where our testcases are, so just push the directory into our search_path
|
||||
---
|
||||
core/bin/manager/pre_install.rs | 14 ++++++++++++--
|
||||
core/bin/unit/entry/uentry.rs | 7 ++++++-
|
||||
core/bin/unit/manager.rs | 7 ++++++-
|
||||
core/bin/unit/test/mod.rs | 7 ++++++-
|
||||
4 files changed, 30 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/core/bin/manager/pre_install.rs b/core/bin/manager/pre_install.rs
|
||||
index 7762ecb..88150c0 100644
|
||||
--- a/core/bin/manager/pre_install.rs
|
||||
+++ b/core/bin/manager/pre_install.rs
|
||||
@@ -796,7 +796,12 @@ mod test {
|
||||
#[test]
|
||||
fn test_read_presets() {
|
||||
let mut l_path = LookupPaths::new();
|
||||
- l_path.init_lookup_paths();
|
||||
+ let test_preset_dir = libtests::get_project_root()
|
||||
+ .unwrap()
|
||||
+ .join("tests/presets")
|
||||
+ .to_string_lossy()
|
||||
+ .to_string();
|
||||
+ l_path.preset_path.push(test_preset_dir);
|
||||
let lookup_path = Rc::new(l_path);
|
||||
|
||||
let install = Install::new(PresetMode::Enable, lookup_path);
|
||||
@@ -815,7 +820,12 @@ mod test {
|
||||
#[test]
|
||||
fn test_preset_all() {
|
||||
let mut l_path = LookupPaths::new();
|
||||
- l_path.init_lookup_paths();
|
||||
+ let test_preset_dir = libtests::get_project_root()
|
||||
+ .unwrap()
|
||||
+ .join("tests/presets")
|
||||
+ .to_string_lossy()
|
||||
+ .to_string();
|
||||
+ l_path.preset_path.push(test_preset_dir);
|
||||
let lookup_path = Rc::new(l_path);
|
||||
let install = Install::new(PresetMode::Enable, lookup_path);
|
||||
assert!(install.preset_all().is_ok());
|
||||
diff --git a/core/bin/unit/entry/uentry.rs b/core/bin/unit/entry/uentry.rs
|
||||
index 45f0e57..d2f5369 100644
|
||||
--- a/core/bin/unit/entry/uentry.rs
|
||||
+++ b/core/bin/unit/entry/uentry.rs
|
||||
@@ -783,7 +783,12 @@ mod tests {
|
||||
let rentry = Rc::new(UnitRe::new(&reli));
|
||||
|
||||
let mut l_path = LookupPaths::new();
|
||||
- l_path.init_lookup_paths();
|
||||
+ let test_units_dir = libtests::get_project_root()
|
||||
+ .unwrap()
|
||||
+ .join("tests/test_units/")
|
||||
+ .to_string_lossy()
|
||||
+ .to_string();
|
||||
+ l_path.search_path.push(test_units_dir);
|
||||
let lookup_path = Rc::new(l_path);
|
||||
let unit_file = UnitFile::new(&lookup_path);
|
||||
|
||||
diff --git a/core/bin/unit/manager.rs b/core/bin/unit/manager.rs
|
||||
index 73fb593..0a3549f 100644
|
||||
--- a/core/bin/unit/manager.rs
|
||||
+++ b/core/bin/unit/manager.rs
|
||||
@@ -1403,7 +1403,12 @@ mod tests {
|
||||
fn init_dm_for_test() -> (Rc<DataManager>, Rc<Events>, Rc<UnitManager>) {
|
||||
logger::init_log_to_console("manager test", log::LevelFilter::Trace);
|
||||
let mut l_path = LookupPaths::new();
|
||||
- l_path.init_lookup_paths();
|
||||
+ let test_units_dir = libtests::get_project_root()
|
||||
+ .unwrap()
|
||||
+ .join("tests/test_units/")
|
||||
+ .to_string_lossy()
|
||||
+ .to_string();
|
||||
+ l_path.search_path.push(test_units_dir);
|
||||
let lookup_path = Rc::new(l_path);
|
||||
|
||||
let event = Rc::new(Events::new().unwrap());
|
||||
diff --git a/core/bin/unit/test/mod.rs b/core/bin/unit/test/mod.rs
|
||||
index 8f2d120..2138ab6 100644
|
||||
--- a/core/bin/unit/test/mod.rs
|
||||
+++ b/core/bin/unit/test/mod.rs
|
||||
@@ -32,7 +32,12 @@ pub(crate) mod test_utils {
|
||||
name: &str,
|
||||
) -> Rc<UnitX> {
|
||||
let mut l_path = LookupPaths::new();
|
||||
- l_path.init_lookup_paths();
|
||||
+ let test_units_dir = libtests::get_project_root()
|
||||
+ .unwrap()
|
||||
+ .join("tests/test_units/")
|
||||
+ .to_string_lossy()
|
||||
+ .to_string();
|
||||
+ l_path.search_path.push(test_units_dir);
|
||||
let lookup_path = Rc::new(l_path);
|
||||
|
||||
let file = Rc::new(UnitFile::new(&lookup_path));
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,87 +0,0 @@
|
||||
From 2546fa929d682c61e179eac0a67e6d0da59ebd8a Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 7 Jul 2023 14:36:58 +0800
|
||||
Subject: [PATCH] fix: call clear_last_frame before early return
|
||||
|
||||
This makes sure 'frame' is released
|
||||
---
|
||||
core/sysmaster/manager/commands.rs | 46 ++++++++++++++++++------------
|
||||
1 file changed, 28 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/core/sysmaster/manager/commands.rs b/core/sysmaster/manager/commands.rs
|
||||
index 6e1da40..ad3e97f 100644
|
||||
--- a/core/sysmaster/manager/commands.rs
|
||||
+++ b/core/sysmaster/manager/commands.rs
|
||||
@@ -31,7 +31,10 @@ pub(super) struct Commands<T> {
|
||||
socket_fd: i32,
|
||||
}
|
||||
|
||||
-impl<T> Commands<T> {
|
||||
+impl<T> Commands<T>
|
||||
+where
|
||||
+ T: ExecuterAction,
|
||||
+{
|
||||
pub(super) fn new(relir: &Rc<Reliability>, comm_action: T) -> Self {
|
||||
/* The socket is used to communicate with sctl, panic if any of the following steps fail. */
|
||||
let sctl_socket_path = Path::new(SCTL_SOCKET);
|
||||
@@ -65,22 +68,8 @@ impl<T> Commands<T> {
|
||||
socket_fd,
|
||||
}
|
||||
}
|
||||
-}
|
||||
|
||||
-impl<T> Source for Commands<T>
|
||||
-where
|
||||
- T: ExecuterAction,
|
||||
-{
|
||||
- fn event_type(&self) -> EventType {
|
||||
- EventType::Io
|
||||
- }
|
||||
-
|
||||
- fn epoll_event(&self) -> u32 {
|
||||
- (libc::EPOLLIN) as u32
|
||||
- }
|
||||
-
|
||||
- fn dispatch(&self, _e: &Events) -> i32 {
|
||||
- self.reli.set_last_frame1(ReliLastFrame::CmdOp as u32);
|
||||
+ pub fn dispatch_commands(&self) -> i32 {
|
||||
let client = match socket::accept(self.socket_fd) {
|
||||
Err(e) => {
|
||||
log::error!("Failed to accept connection: {}, ignoring.", e);
|
||||
@@ -104,10 +93,31 @@ where
|
||||
Err(e) => log::error!("Commands failed: {:?}", e),
|
||||
}
|
||||
basic::fd_util::close(client);
|
||||
- self.reli.clear_last_frame();
|
||||
-
|
||||
0
|
||||
}
|
||||
+}
|
||||
+
|
||||
+impl<T> Source for Commands<T>
|
||||
+where
|
||||
+ T: ExecuterAction,
|
||||
+{
|
||||
+ fn event_type(&self) -> EventType {
|
||||
+ EventType::Io
|
||||
+ }
|
||||
+
|
||||
+ fn epoll_event(&self) -> u32 {
|
||||
+ (libc::EPOLLIN) as u32
|
||||
+ }
|
||||
+
|
||||
+ fn dispatch(&self, _e: &Events) -> i32 {
|
||||
+ self.reli.set_last_frame1(ReliLastFrame::CmdOp as u32);
|
||||
+ /* NOTE: we must call clear_last_frame before return. If we don't do this, the allocated
|
||||
+ * vector "frame" in reli.set_frame will be leaked, and become larger and larger until
|
||||
+ * triggers a panic. */
|
||||
+ let ret = self.dispatch_commands();
|
||||
+ self.reli.clear_last_frame();
|
||||
+ ret
|
||||
+ }
|
||||
|
||||
fn token(&self) -> u64 {
|
||||
let data: u64 = unsafe { std::mem::transmute(self) };
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
From 403e74d159d0937e5e0f5c67a59483b8fce41890 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 14 Jul 2023 15:47:15 +0800
|
||||
Subject: [PATCH] fix: check if the message is truncated
|
||||
|
||||
---
|
||||
core/sysmaster/unit/notify.rs | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/core/sysmaster/unit/notify.rs b/core/sysmaster/unit/notify.rs
|
||||
index f35ed91..4f3cc15 100644
|
||||
--- a/core/sysmaster/unit/notify.rs
|
||||
+++ b/core/sysmaster/unit/notify.rs
|
||||
@@ -224,6 +224,12 @@ impl Notify {
|
||||
let msgs = socket::recvmsg::<()>(self.rawfd(), &mut iov, Some(&mut space), flags)
|
||||
.context(NixSnafu)?;
|
||||
|
||||
+ if msgs.flags.contains(MsgFlags::MSG_CTRUNC) {
|
||||
+ return Err(Error::Nix {
|
||||
+ source: nix::Error::EXFULL,
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
// check: peek == pop
|
||||
let (received_cred, received_fds) = notify_trans_recvmsg(&msgs);
|
||||
if get_pid_from_cred(&received_cred) != pid {
|
||||
@@ -279,6 +285,12 @@ fn notify_peek_pid(fd: RawFd, flags: MsgFlags) -> Result<libc::pid_t> {
|
||||
let msgs =
|
||||
socket::recvmsg::<()>(fd, &mut iov, Some(&mut space), peek_flags).context(NixSnafu)?;
|
||||
|
||||
+ if msgs.flags.contains(MsgFlags::MSG_CTRUNC) {
|
||||
+ return Err(Error::Nix {
|
||||
+ source: nix::Error::EXFULL,
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
// get message information
|
||||
let (received_cred, received_fds) = notify_trans_recvmsg(&msgs);
|
||||
for fd in received_fds.iter() {
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
From 9a1154cb9c038921d118f576c691c823ca32995d Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 14 Jul 2023 15:46:21 +0800
|
||||
Subject: [PATCH] fix: check if the words is empty before using it
|
||||
|
||||
---
|
||||
core/sysmaster/unit/rentry.rs | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/core/sysmaster/unit/rentry.rs b/core/sysmaster/unit/rentry.rs
|
||||
index 312347e..5d7360c 100644
|
||||
--- a/core/sysmaster/unit/rentry.rs
|
||||
+++ b/core/sysmaster/unit/rentry.rs
|
||||
@@ -30,6 +30,9 @@ use sysmaster::unit::{UnitRelations, UnitType};
|
||||
|
||||
pub(crate) fn unit_name_to_type(unit_name: &str) -> UnitType {
|
||||
let words: Vec<&str> = unit_name.split('.').collect();
|
||||
+ if words.is_empty() {
|
||||
+ return UnitType::UnitTypeInvalid;
|
||||
+ }
|
||||
UnitType::from_str(words[words.len() - 1]).unwrap_or(UnitType::UnitTypeInvalid)
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,248 +0,0 @@
|
||||
From ae19e57d309303b4f8e16ea26dbe6c6c7fd04f7d Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Tue, 27 Jun 2023 13:57:20 +0800
|
||||
Subject: [PATCH] fix(devmaster): deal with fd leak
|
||||
|
||||
RawFd will not be automatically closed when it is dropped. Use std::fs::File
|
||||
or nix::dir::Dir to take the RawFd when opening the file or directory, which
|
||||
can automatically close the RawFd when the variable is dropped.
|
||||
|
||||
Also rename the fd type from i32 to RawFd to better declare the file descriptor
|
||||
type.
|
||||
---
|
||||
core/bin/mount/setup.rs | 9 +-
|
||||
libs/basic/src/fd_util.rs | 18 ++--
|
||||
libs/basic/src/fs_util.rs | 28 +++---
|
||||
libs/basic/src/mount_util.rs | 4 +-
|
||||
8 files changed, 146 insertions(+), 107 deletions(-)
|
||||
|
||||
diff --git a/core/bin/mount/setup.rs b/core/bin/mount/setup.rs
|
||||
index 6a13626..e7ca9df 100644
|
||||
--- a/core/bin/mount/setup.rs
|
||||
+++ b/core/bin/mount/setup.rs
|
||||
@@ -23,6 +23,7 @@ use nix::{
|
||||
sys::stat::Mode,
|
||||
unistd::AccessFlags,
|
||||
};
|
||||
+use std::os::unix::prelude::AsRawFd;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
fs,
|
||||
@@ -361,7 +362,7 @@ impl MountPoint {
|
||||
// symlink
|
||||
|
||||
let path = Path::new(&self.target);
|
||||
- let ret = fs_util::open_parent(
|
||||
+ let file = fs_util::open_parent(
|
||||
path,
|
||||
OFlag::O_PATH | OFlag::O_CLOEXEC,
|
||||
Mode::from_bits(0).unwrap(),
|
||||
@@ -369,7 +370,11 @@ impl MountPoint {
|
||||
|
||||
let last_file_name = path.file_name().unwrap_or_default();
|
||||
|
||||
- let ret = mount_util::mount_point_fd_valid(ret, last_file_name.to_str().unwrap(), flags)?;
|
||||
+ let ret = mount_util::mount_point_fd_valid(
|
||||
+ file.as_raw_fd(),
|
||||
+ last_file_name.to_str().unwrap(),
|
||||
+ flags,
|
||||
+ )?;
|
||||
|
||||
Ok(ret)
|
||||
}
|
||||
diff --git a/libs/basic/src/fd_util.rs b/libs/basic/src/fd_util.rs
|
||||
index 0d41966..210c830 100644
|
||||
--- a/libs/basic/src/fd_util.rs
|
||||
+++ b/libs/basic/src/fd_util.rs
|
||||
@@ -18,6 +18,8 @@ use nix::{
|
||||
ioctl_read,
|
||||
sys::stat::{Mode, SFlag},
|
||||
};
|
||||
+use std::os::unix::prelude::FromRawFd;
|
||||
+use std::{fs::File, os::unix::prelude::RawFd};
|
||||
|
||||
/// check if the given stat.st_mode is regular file
|
||||
pub fn stat_is_reg(st_mode: u32) -> bool {
|
||||
@@ -30,7 +32,7 @@ pub fn stat_is_char(st_mode: u32) -> bool {
|
||||
}
|
||||
|
||||
///
|
||||
-pub fn fd_nonblock(fd: i32, nonblock: bool) -> Result<()> {
|
||||
+pub fn fd_nonblock(fd: RawFd, nonblock: bool) -> Result<()> {
|
||||
assert!(fd >= 0);
|
||||
|
||||
let flags = nix::fcntl::fcntl(fd, FcntlArg::F_GETFL).context(NixSnafu)?;
|
||||
@@ -51,7 +53,7 @@ pub fn fd_nonblock(fd: i32, nonblock: bool) -> Result<()> {
|
||||
}
|
||||
|
||||
///
|
||||
-pub fn fd_cloexec(fd: i32, cloexec: bool) -> Result<()> {
|
||||
+pub fn fd_cloexec(fd: RawFd, cloexec: bool) -> Result<()> {
|
||||
assert!(fd >= 0);
|
||||
|
||||
let flags = nix::fcntl::fcntl(fd, FcntlArg::F_GETFD).context(NixSnafu)?;
|
||||
@@ -69,7 +71,7 @@ pub fn fd_cloexec(fd: i32, cloexec: bool) -> Result<()> {
|
||||
}
|
||||
|
||||
///
|
||||
-pub fn fd_is_cloexec(fd: i32) -> bool {
|
||||
+pub fn fd_is_cloexec(fd: RawFd) -> bool {
|
||||
assert!(fd >= 0);
|
||||
|
||||
let flags = nix::fcntl::fcntl(fd, FcntlArg::F_GETFD).unwrap_or(0);
|
||||
@@ -78,7 +80,7 @@ pub fn fd_is_cloexec(fd: i32) -> bool {
|
||||
}
|
||||
|
||||
///
|
||||
-pub fn close(fd: i32) {
|
||||
+pub fn close(fd: RawFd) {
|
||||
if let Err(e) = nix::unistd::close(fd) {
|
||||
log::warn!("close fd {} failed, errno: {}", fd, e);
|
||||
}
|
||||
@@ -90,12 +92,12 @@ pub fn close(fd: i32) {
|
||||
/// this function can not work on sockets, as they can not be opened
|
||||
///
|
||||
/// note that this function implicitly reset the read index to zero
|
||||
-pub fn fd_reopen(fd: i32, oflags: OFlag) -> Result<i32> {
|
||||
+pub fn fd_reopen(fd: RawFd, oflags: OFlag) -> Result<File> {
|
||||
if oflags.intersects(OFlag::O_DIRECTORY) {
|
||||
let new_fd = nix::fcntl::openat(fd, ".", oflags, nix::sys::stat::Mode::empty())
|
||||
.map_err(|e| Error::Nix { source: e })?;
|
||||
|
||||
- return Ok(new_fd);
|
||||
+ return Ok(unsafe { File::from_raw_fd(new_fd) });
|
||||
}
|
||||
|
||||
match nix::fcntl::open(
|
||||
@@ -103,7 +105,7 @@ pub fn fd_reopen(fd: i32, oflags: OFlag) -> Result<i32> {
|
||||
oflags,
|
||||
nix::sys::stat::Mode::empty(),
|
||||
) {
|
||||
- Ok(n) => Ok(n),
|
||||
+ Ok(n) => Ok(unsafe { File::from_raw_fd(n) }),
|
||||
Err(e) => {
|
||||
if e != Errno::ENOENT {
|
||||
return Err(Error::Nix { source: e });
|
||||
@@ -137,7 +139,7 @@ ioctl_read!(
|
||||
);
|
||||
|
||||
/// get the diskseq according to fd
|
||||
-pub fn fd_get_diskseq(fd: i32) -> Result<u64> {
|
||||
+pub fn fd_get_diskseq(fd: RawFd) -> Result<u64> {
|
||||
let mut diskseq: u64 = 0;
|
||||
let ptr: *mut u64 = &mut diskseq;
|
||||
unsafe {
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index 3f72658..8a8f276 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -22,16 +22,20 @@ use nix::{
|
||||
use pathdiff::diff_paths;
|
||||
use rand::Rng;
|
||||
use std::{
|
||||
- ffi::CString, fs::remove_dir, io::ErrorKind, os::unix::prelude::PermissionsExt, path::Path,
|
||||
+ ffi::CString,
|
||||
+ fs::{remove_dir, File},
|
||||
+ io::ErrorKind,
|
||||
+ os::unix::prelude::{AsRawFd, FromRawFd, PermissionsExt, RawFd},
|
||||
+ path::Path,
|
||||
};
|
||||
|
||||
/// open the parent directory of path
|
||||
-pub fn open_parent(path: &Path, flags: OFlag, mode: Mode) -> Result<i32> {
|
||||
+pub fn open_parent(path: &Path, flags: OFlag, mode: Mode) -> Result<File> {
|
||||
let parent = path.parent().ok_or(Error::Nix {
|
||||
source: nix::errno::Errno::EINVAL,
|
||||
})?;
|
||||
|
||||
- nix::fcntl::open(parent, flags, mode).context(NixSnafu)
|
||||
+ Ok(unsafe { File::from_raw_fd(nix::fcntl::open(parent, flags, mode).context(NixSnafu)?) })
|
||||
}
|
||||
|
||||
/// create symlink link_name -> target
|
||||
@@ -39,7 +43,7 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
let link_path = Path::new(&link);
|
||||
let target_path = Path::new(&target);
|
||||
|
||||
- let (target_path, dirfd) = if relative {
|
||||
+ let (target_path, dir) = if relative {
|
||||
let link_path_parent = link_path.parent().ok_or(Error::NotExisted {
|
||||
what: format!("{}'s parent", link_path.to_string_lossy()),
|
||||
})?;
|
||||
@@ -51,19 +55,19 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
Mode::from_bits(0).unwrap(),
|
||||
)
|
||||
.context(NixSnafu)?;
|
||||
- (rel_path, Some(fd))
|
||||
+ (rel_path, Some(unsafe { File::from_raw_fd(fd) }))
|
||||
} else {
|
||||
(target_path.to_path_buf(), None)
|
||||
};
|
||||
|
||||
let mut rng = rand::thread_rng();
|
||||
-
|
||||
let tmp_to = format!("{}.{}", link, rng.gen::<u32>());
|
||||
+ let raw_fd = dir.map(|f| f.as_raw_fd());
|
||||
|
||||
- nix::unistd::symlinkat(target_path.as_path(), dirfd, tmp_to.as_str()).context(NixSnafu)?;
|
||||
+ nix::unistd::symlinkat(target_path.as_path(), raw_fd, tmp_to.as_str()).context(NixSnafu)?;
|
||||
|
||||
- if let Err(e) = renameat(dirfd, tmp_to.as_str(), dirfd, link_path) {
|
||||
- let _ = unlinkat(dirfd, tmp_to.as_str(), UnlinkatFlags::NoRemoveDir);
|
||||
+ if let Err(e) = renameat(raw_fd, tmp_to.as_str(), raw_fd, link_path) {
|
||||
+ let _ = unlinkat(raw_fd, tmp_to.as_str(), UnlinkatFlags::NoRemoveDir);
|
||||
return Err(Error::Nix { source: e });
|
||||
}
|
||||
|
||||
@@ -71,7 +75,7 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
}
|
||||
|
||||
/// chmod based on fd opened with O_PATH
|
||||
-pub fn fchmod_opath(fd: i32, mode: mode_t) -> Result<()> {
|
||||
+pub fn fchmod_opath(fd: RawFd, mode: mode_t) -> Result<()> {
|
||||
let fd_path = format_proc_fd_path!(fd);
|
||||
|
||||
let mut perms = std::fs::metadata(&fd_path).context(IoSnafu)?.permissions();
|
||||
@@ -91,7 +95,7 @@ pub fn chmod(path: &str, mode: mode_t) -> Result<()> {
|
||||
/// the access mode is above the old mode under old owner or the new
|
||||
/// mode under new owner.
|
||||
pub fn fchmod_and_chown(
|
||||
- fd: i32,
|
||||
+ fd: RawFd,
|
||||
path: &str,
|
||||
mode: Option<mode_t>,
|
||||
uid: Option<Uid>,
|
||||
@@ -151,7 +155,7 @@ pub fn fchmod_and_chown(
|
||||
}
|
||||
|
||||
/// Update the timestamp of a file with fd. If 'ts' is not provided, use the current timestamp by default.
|
||||
-pub fn futimens_opath(fd: i32, ts: Option<[timespec; 2]>) -> Result<()> {
|
||||
+pub fn futimens_opath(fd: RawFd, ts: Option<[timespec; 2]>) -> Result<()> {
|
||||
let fd_path = format_proc_fd_path!(fd);
|
||||
let c_string =
|
||||
CString::new(fd_path.clone()).map_err(|e| crate::Error::NulError { source: e })?;
|
||||
diff --git a/libs/basic/src/mount_util.rs b/libs/basic/src/mount_util.rs
|
||||
index 3b041d3..72a11d3 100644
|
||||
--- a/libs/basic/src/mount_util.rs
|
||||
+++ b/libs/basic/src/mount_util.rs
|
||||
@@ -11,6 +11,8 @@
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
//!
|
||||
+use std::os::unix::prelude::RawFd;
|
||||
+
|
||||
use crate::error::*;
|
||||
use nix::{
|
||||
fcntl::AtFlags,
|
||||
@@ -18,7 +20,7 @@ use nix::{
|
||||
};
|
||||
|
||||
///
|
||||
-pub fn mount_point_fd_valid(fd: i32, file_name: &str, flags: AtFlags) -> Result<bool> {
|
||||
+pub fn mount_point_fd_valid(fd: RawFd, file_name: &str, flags: AtFlags) -> Result<bool> {
|
||||
assert!(fd >= 0);
|
||||
|
||||
let flags = if flags.contains(AtFlags::AT_SYMLINK_FOLLOW) {
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,69 +0,0 @@
|
||||
From d50fcced7eea0ceabf74191d3de4d08420120a3a Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 24 Jul 2023 19:12:16 +0800
|
||||
Subject: [PATCH] fix: downgrade the time crate from 0.3.x to 0.1.45
|
||||
|
||||
---
|
||||
libs/basic/Cargo.toml | 2 +-
|
||||
libs/basic/src/logger.rs | 23 +++++++++++------------
|
||||
2 files changed, 12 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index 29f97a3..d0dd4fb 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -21,7 +21,7 @@ lazy_static = "1.4.0"
|
||||
bitflags = "1.3.2"
|
||||
pkg-config = "0.3"
|
||||
rand = "0.4.6"
|
||||
-time = {version = "=0.3.5", features = ["formatting", "macros", "local-offset"] }
|
||||
+time = "=0.1.45"
|
||||
constants = { path = "../constants"}
|
||||
|
||||
[dev-dependencies]
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index ae12c36..9f96316 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -36,7 +36,6 @@ use log4rs::{
|
||||
encode::pattern::PatternEncoder,
|
||||
};
|
||||
use nix::libc;
|
||||
-use time::macros::offset;
|
||||
|
||||
use crate::Error;
|
||||
|
||||
@@ -69,19 +68,19 @@ impl log::Log for LogPlugin {
|
||||
}
|
||||
|
||||
fn write_msg_common(writer: &mut impl Write, module: &str, msg: String) {
|
||||
- let now = match time::OffsetDateTime::now_local() {
|
||||
- Ok(v) => v,
|
||||
- Err(_) => time::OffsetDateTime::now_utc().to_offset(offset!(+8)),
|
||||
- };
|
||||
-
|
||||
- let format = time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]");
|
||||
- let now = match now.format(&format) {
|
||||
- Err(_) => "[unknown time]".to_string(),
|
||||
- Ok(v) => v,
|
||||
- };
|
||||
+ let now = time::now();
|
||||
+ let now_str = format!(
|
||||
+ "{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2} ",
|
||||
+ now.tm_year + 1900, /* tm_year is years since 1900 */
|
||||
+ now.tm_mon + 1, /* tm_mon is months since Jan: [0, 11] */
|
||||
+ now.tm_mday,
|
||||
+ now.tm_hour,
|
||||
+ now.tm_min,
|
||||
+ now.tm_sec
|
||||
+ );
|
||||
|
||||
/* 1. Write time */
|
||||
- if let Err(e) = writer.write(format!("{now} ").as_bytes()) {
|
||||
+ if let Err(e) = writer.write(now_str.as_bytes()) {
|
||||
println!("Failed to log time message: {e}");
|
||||
return;
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
From 2d3c357ab61bbe2b6b5cb24ccb964105a250d5b7 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Thu, 20 Jul 2023 14:22:04 +0800
|
||||
Subject: [PATCH] fix: fix the type error of test_get_service_type()
|
||||
|
||||
---
|
||||
coms/service/src/config.rs | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/coms/service/src/config.rs b/coms/service/src/config.rs
|
||||
index ec2ebf4..5205351 100644
|
||||
--- a/coms/service/src/config.rs
|
||||
+++ b/coms/service/src/config.rs
|
||||
@@ -199,6 +199,7 @@ impl ServiceConfigData {
|
||||
mod tests {
|
||||
use crate::comm::ServiceUnitComm;
|
||||
use crate::config::ServiceConfig;
|
||||
+ use crate::rentry::ServiceType;
|
||||
use libtests::get_project_root;
|
||||
use std::rc::Rc;
|
||||
|
||||
@@ -228,7 +229,7 @@ mod tests {
|
||||
let comm = Rc::new(ServiceUnitComm::new());
|
||||
let config = ServiceConfig::new(&comm);
|
||||
|
||||
- let result = config.load(paths, false);
|
||||
- assert_eq!(config.service_type(), b"Simple")
|
||||
+ assert!(config.load(paths, false).is_ok());
|
||||
+ assert_eq!(config.service_type(), ServiceType::Simple)
|
||||
}
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
From d1eb397bbf6760569c3043119c6a6cb733ad301f Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 10:52:55 +0800
|
||||
Subject: [PATCH] fix: ignore auto generated toml file in tests/test_units
|
||||
|
||||
---
|
||||
.gitignore | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/.gitignore b/.gitignore
|
||||
index 2408785..e8437ea 100644
|
||||
--- a/.gitignore
|
||||
+++ b/.gitignore
|
||||
@@ -4,3 +4,4 @@ Cargo.lock
|
||||
tests/**/*.log
|
||||
/site
|
||||
libs/blkid_rs/src/libblkid.rs
|
||||
+tests/test_units/*.toml
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,775 +0,0 @@
|
||||
From 2c6d13f3fac35b901b39a851eea2662ae6d02bf1 Mon Sep 17 00:00:00 2001
|
||||
From: huyubiao <h13958451065@163.com>
|
||||
Date: Thu, 29 Jun 2023 21:40:53 +0800
|
||||
Subject: [PATCH] fix: init does not enter the freeze during normal running
|
||||
|
||||
---
|
||||
core/bin/unit/notify.rs | 4 +-
|
||||
exts/init/src/main.rs | 21 ++--
|
||||
exts/init/src/runtime/comm.rs | 163 ++++++++++++++++++++-----------
|
||||
exts/init/src/runtime/epoll.rs | 14 ++-
|
||||
exts/init/src/runtime/mod.rs | 51 ++++------
|
||||
exts/init/src/runtime/signals.rs | 95 ++++++++----------
|
||||
exts/init/src/runtime/timer.rs | 58 ++++++++---
|
||||
libs/constants/src/lib.rs | 3 +
|
||||
8 files changed, 226 insertions(+), 183 deletions(-)
|
||||
|
||||
diff --git a/core/bin/unit/notify.rs b/core/bin/unit/notify.rs
|
||||
index f824725..d23a725 100644
|
||||
--- a/core/bin/unit/notify.rs
|
||||
+++ b/core/bin/unit/notify.rs
|
||||
@@ -109,7 +109,7 @@ impl NotifyManager {
|
||||
}
|
||||
}
|
||||
|
||||
-const NOTIFY_INVALID_FD: i32 = -1;
|
||||
+use constants::INVALID_FD;
|
||||
const NOTIFY_INVALID_PID: libc::pid_t = -1;
|
||||
|
||||
struct Notify {
|
||||
@@ -135,7 +135,7 @@ impl Notify {
|
||||
rentry: Rc::clone(rentryr),
|
||||
db: Rc::clone(dbr),
|
||||
config: Rc::clone(configr),
|
||||
- fd: RefCell::new(NOTIFY_INVALID_FD),
|
||||
+ fd: RefCell::new(INVALID_FD),
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/exts/init/src/main.rs b/exts/init/src/main.rs
|
||||
index 587077e..fbd77b9 100644
|
||||
--- a/exts/init/src/main.rs
|
||||
+++ b/exts/init/src/main.rs
|
||||
@@ -23,21 +23,14 @@ fn main() {
|
||||
// Run: Monitor the sysmaster's liveliness and acceptance of message.
|
||||
// Unrecover: On-site problem collection or recreate new sysmaster.
|
||||
match RunTime::new(cmd) {
|
||||
- Ok(mut run_time) => {
|
||||
- loop {
|
||||
- let state = run_time.state();
|
||||
- let ret = match state {
|
||||
- InitState::Reexec => run_time.reexec(),
|
||||
- InitState::Run => run_time.run(),
|
||||
- InitState::Unrecover => run_time.unrecover(),
|
||||
- };
|
||||
- if let Err(err) = ret {
|
||||
- eprintln!("Failed to {:?}:{:?} ", state, err);
|
||||
- break;
|
||||
- }
|
||||
+ Ok(mut run_time) => loop {
|
||||
+ let state = run_time.state();
|
||||
+ match state {
|
||||
+ InitState::Reexec => run_time.reexec(),
|
||||
+ InitState::Run => run_time.run(),
|
||||
+ InitState::Unrecover => run_time.unrecover(),
|
||||
}
|
||||
- run_time.clear();
|
||||
- }
|
||||
+ },
|
||||
Err(err) => eprintln!(
|
||||
"Failed to new init, it may be necessary to run it as root :{:?}",
|
||||
err
|
||||
diff --git a/exts/init/src/runtime/comm.rs b/exts/init/src/runtime/comm.rs
|
||||
index 1a0d0ca..8f71511 100644
|
||||
--- a/exts/init/src/runtime/comm.rs
|
||||
+++ b/exts/init/src/runtime/comm.rs
|
||||
@@ -14,18 +14,18 @@ use super::epoll::Epoll;
|
||||
use super::timer::Timer;
|
||||
use nix::errno::Errno;
|
||||
use nix::sys::epoll::EpollEvent;
|
||||
+use nix::sys::inotify::{AddWatchFlags, InitFlags, Inotify, WatchDescriptor};
|
||||
use nix::sys::socket::{self, AddressFamily, SockFlag, SockType, UnixAddr};
|
||||
use nix::unistd;
|
||||
+use std::os::unix::io::AsRawFd;
|
||||
use std::os::unix::prelude::RawFd;
|
||||
use std::rc::Rc;
|
||||
-use std::str;
|
||||
-use std::{fs, path::PathBuf};
|
||||
+use std::{fs, path::PathBuf, str};
|
||||
|
||||
const LISTEN_BACKLOG: usize = 10;
|
||||
-const INVALID_FD: i32 = -1;
|
||||
const ACCEPT_COUNT: i32 = 3;
|
||||
const BUF_SIZE: usize = 16; //The communication string length is fixed to 16 characters.
|
||||
-use constants::{ALIVE, INIT_SOCKET};
|
||||
+use constants::{ALIVE, INIT_SOCKET, INVALID_FD};
|
||||
|
||||
pub struct Comm {
|
||||
epoll: Rc<Epoll>,
|
||||
@@ -33,6 +33,8 @@ pub struct Comm {
|
||||
connect_fd: RawFd,
|
||||
online_fd: RawFd, // Specsify either listen_fd or connect_fd.
|
||||
timer: Timer,
|
||||
+ inotify: Inotify,
|
||||
+ wd: WatchDescriptor,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq)]
|
||||
@@ -47,28 +49,7 @@ impl Comm {
|
||||
pub fn new(epoll: &Rc<Epoll>, time_wait: i64, time_cnt: i64) -> Result<Comm, Errno> {
|
||||
let timer = Timer::new(epoll, time_wait, time_cnt)?;
|
||||
|
||||
- let sock_path = PathBuf::from(INIT_SOCKET);
|
||||
- let listen_fd = socket::socket(
|
||||
- AddressFamily::Unix,
|
||||
- SockType::Stream,
|
||||
- SockFlag::SOCK_CLOEXEC,
|
||||
- None,
|
||||
- )?;
|
||||
-
|
||||
- let parent_path = sock_path.as_path().parent();
|
||||
- match parent_path {
|
||||
- Some(path) => fs::create_dir_all(path)
|
||||
- .map_err(|e| Errno::from_i32(e.raw_os_error().unwrap_or(Errno::EINVAL as i32)))?,
|
||||
- None => return Err(Errno::EINVAL),
|
||||
- }
|
||||
-
|
||||
- if let Err(e) = unistd::unlink(&sock_path) {
|
||||
- eprintln!("Failed to unlink path:{:?}, error:{}", sock_path, e);
|
||||
- }
|
||||
-
|
||||
- let addr = UnixAddr::new(&sock_path)?;
|
||||
- socket::bind(listen_fd, &addr)?;
|
||||
- socket::listen(listen_fd, LISTEN_BACKLOG)?;
|
||||
+ let (listen_fd, inotify, wd) = create_listen_fd(epoll)?;
|
||||
|
||||
let mut comm = Comm {
|
||||
epoll: epoll.clone(),
|
||||
@@ -76,51 +57,50 @@ impl Comm {
|
||||
connect_fd: INVALID_FD,
|
||||
online_fd: INVALID_FD,
|
||||
timer,
|
||||
+ inotify,
|
||||
+ wd,
|
||||
};
|
||||
|
||||
comm.set_online_fd(comm.listen_fd)?;
|
||||
-
|
||||
Ok(comm)
|
||||
}
|
||||
|
||||
pub fn is_fd(&self, fd: RawFd) -> bool {
|
||||
- if fd == self.online_fd || fd == self.timer.fd() {
|
||||
- return true;
|
||||
- }
|
||||
- false
|
||||
+ fd == self.online_fd || fd == self.timer.fd() || fd == self.inotify.as_raw_fd()
|
||||
}
|
||||
|
||||
- pub fn proc(&mut self, event: EpollEvent) -> Result<CommType, Errno> {
|
||||
+ pub fn proc(&mut self, event: EpollEvent) -> CommType {
|
||||
if self.timer.fd() as u64 == event.data() {
|
||||
- if self.timer.is_time_out(event)? {
|
||||
- return Ok(CommType::PipTMOUT);
|
||||
+ if self.timer.is_time_out(event) {
|
||||
+ return CommType::PipTMOUT;
|
||||
}
|
||||
- return Ok(CommType::Succeed);
|
||||
+ return CommType::Succeed;
|
||||
+ }
|
||||
+
|
||||
+ if self.inotify.as_raw_fd() as u64 == event.data() {
|
||||
+ // Dont self.inotify.read_events(), because if recover fails, event can be retrieved to recover again.
|
||||
+ return self.recover();
|
||||
+ }
|
||||
+
|
||||
+ // When the program runs normally, listen_fd will not be closed,
|
||||
+ // but connect_fd will be closed during listening.
|
||||
+ if self.listen_fd as u64 == event.data() && self.epoll.is_err(event) {
|
||||
+ return self.recover();
|
||||
}
|
||||
|
||||
- // When online_fd fails, ensure that connect_fd is closed, and then execute again after timeout.
|
||||
if self.online_fd as u64 == event.data() {
|
||||
match self.online_fd {
|
||||
- x if x == self.listen_fd => return self.listen_proc(event),
|
||||
+ x if x == self.listen_fd => return self.listen_proc(),
|
||||
x if x == self.connect_fd => return self.connect_proc(event),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
- Ok(CommType::Succeed)
|
||||
+ CommType::Succeed
|
||||
}
|
||||
|
||||
pub fn finish(&mut self) {
|
||||
_ = self.set_online_fd(self.listen_fd);
|
||||
- }
|
||||
-
|
||||
- pub fn clear(&mut self) {
|
||||
- self.epoll.safe_close(self.listen_fd);
|
||||
- self.listen_fd = INVALID_FD;
|
||||
-
|
||||
- self.epoll.safe_close(self.connect_fd);
|
||||
- self.connect_fd = INVALID_FD;
|
||||
-
|
||||
- self.timer.clear();
|
||||
+ self.timer.reset();
|
||||
}
|
||||
|
||||
fn connect(&mut self) -> Result<(), Errno> {
|
||||
@@ -223,21 +203,18 @@ impl Comm {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
- fn listen_proc(&mut self, event: EpollEvent) -> Result<CommType, Errno> {
|
||||
- if self.epoll.is_err(event) {
|
||||
- return Err(Errno::EINVAL);
|
||||
- }
|
||||
+ fn listen_proc(&mut self) -> CommType {
|
||||
if self.connect().is_err() {
|
||||
- return Ok(CommType::PipOFF);
|
||||
+ return CommType::PipOFF;
|
||||
}
|
||||
self.timer.reset();
|
||||
- Ok(CommType::PipON)
|
||||
+ CommType::PipON
|
||||
}
|
||||
|
||||
- fn connect_proc(&mut self, event: EpollEvent) -> Result<CommType, Errno> {
|
||||
+ fn connect_proc(&mut self, event: EpollEvent) -> CommType {
|
||||
if self.epoll.is_err(event) {
|
||||
_ = self.set_online_fd(self.listen_fd);
|
||||
- return Ok(CommType::PipOFF);
|
||||
+ return CommType::PipOFF;
|
||||
}
|
||||
match self.recv_msg() {
|
||||
Ok(buf) => {
|
||||
@@ -252,6 +229,78 @@ impl Comm {
|
||||
unistd::sleep(1);
|
||||
}
|
||||
}
|
||||
- Ok(CommType::Succeed)
|
||||
+ CommType::Succeed
|
||||
}
|
||||
+
|
||||
+ fn recover(&mut self) -> CommType {
|
||||
+ match create_listen_fd(&self.epoll) {
|
||||
+ Ok((listen_fd, inotify, wd)) => {
|
||||
+ self.epoll.safe_close(self.listen_fd);
|
||||
+ self.epoll.safe_close(self.inotify.as_raw_fd());
|
||||
+ self.listen_fd = listen_fd;
|
||||
+ self.inotify = inotify;
|
||||
+ self.wd = wd;
|
||||
+ eprintln!("comm recover");
|
||||
+ if self.online_fd == self.connect_fd {
|
||||
+ // The socket file(INIT_SOCKET) cannot be used when connecting,
|
||||
+ // so recreate the socket file(INIT_SOCKET) and return success.
|
||||
+ return CommType::Succeed;
|
||||
+ } else {
|
||||
+ // If init is in the listening state,
|
||||
+ // the sysmaster cannot be connected through the old socket file(INIT_SOCKET) at this time,
|
||||
+ // we must recreate the socket file and then reexec the sysmaster.
|
||||
+ return CommType::PipTMOUT;
|
||||
+ }
|
||||
+ }
|
||||
+ Err(e) => {
|
||||
+ eprintln!("Failed to create_listen_fd:{:?}", e);
|
||||
+ }
|
||||
+ }
|
||||
+ CommType::Succeed
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+impl Drop for Comm {
|
||||
+ fn drop(&mut self) {
|
||||
+ self.epoll.safe_close(self.listen_fd);
|
||||
+ self.listen_fd = INVALID_FD;
|
||||
+
|
||||
+ self.epoll.safe_close(self.connect_fd);
|
||||
+ self.connect_fd = INVALID_FD;
|
||||
+
|
||||
+ let _ = self.inotify.rm_watch(self.wd);
|
||||
+ self.epoll.safe_close(self.inotify.as_raw_fd());
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+fn create_listen_fd(epoll: &Rc<Epoll>) -> Result<(i32, Inotify, WatchDescriptor), Errno> {
|
||||
+ let listen_fd = socket::socket(
|
||||
+ AddressFamily::Unix,
|
||||
+ SockType::Stream,
|
||||
+ SockFlag::SOCK_CLOEXEC,
|
||||
+ None,
|
||||
+ )?;
|
||||
+
|
||||
+ let sock_path = PathBuf::from(INIT_SOCKET);
|
||||
+ let parent_path = sock_path.as_path().parent();
|
||||
+ match parent_path {
|
||||
+ Some(path) => fs::create_dir_all(path)
|
||||
+ .map_err(|e| Errno::from_i32(e.raw_os_error().unwrap_or(Errno::EINVAL as i32)))?,
|
||||
+ None => return Err(Errno::EINVAL),
|
||||
+ }
|
||||
+
|
||||
+ if let Err(e) = unistd::unlink(&sock_path) {
|
||||
+ eprintln!("Failed to unlink path:{:?}, error:{}", sock_path, e);
|
||||
+ }
|
||||
+
|
||||
+ let addr = UnixAddr::new(&sock_path)?;
|
||||
+ socket::bind(listen_fd, &addr)?;
|
||||
+ socket::listen(listen_fd, LISTEN_BACKLOG)?;
|
||||
+
|
||||
+ let inotify = Inotify::init(InitFlags::all())?;
|
||||
+
|
||||
+ let wd = inotify.add_watch(INIT_SOCKET, AddWatchFlags::IN_ALL_EVENTS)?;
|
||||
+
|
||||
+ epoll.register(inotify.as_raw_fd())?;
|
||||
+ Ok((listen_fd, inotify, wd))
|
||||
}
|
||||
diff --git a/exts/init/src/runtime/epoll.rs b/exts/init/src/runtime/epoll.rs
|
||||
index ad7475f..6c21bbc 100644
|
||||
--- a/exts/init/src/runtime/epoll.rs
|
||||
+++ b/exts/init/src/runtime/epoll.rs
|
||||
@@ -10,6 +10,7 @@
|
||||
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
+use constants::INVALID_FD;
|
||||
use nix::errno::Errno;
|
||||
use nix::sys::epoll::{self, EpollEvent, EpollFlags, EpollOp};
|
||||
use nix::unistd;
|
||||
@@ -21,7 +22,7 @@ pub struct Epoll {
|
||||
|
||||
impl Epoll {
|
||||
pub(crate) fn new() -> Result<Epoll, Errno> {
|
||||
- let epoll_fd = epoll::epoll_create1(epoll::EpollCreateFlags::empty())?;
|
||||
+ let epoll_fd = epoll::epoll_create1(epoll::EpollCreateFlags::EPOLL_CLOEXEC)?;
|
||||
Ok(Epoll { epoll_fd })
|
||||
}
|
||||
|
||||
@@ -61,10 +62,6 @@ impl Epoll {
|
||||
false
|
||||
}
|
||||
|
||||
- pub(crate) fn clear(&self) {
|
||||
- self.safe_close(self.epoll_fd);
|
||||
- }
|
||||
-
|
||||
pub(crate) fn safe_close(&self, fd: RawFd) {
|
||||
if fd <= 0 {
|
||||
return;
|
||||
@@ -75,3 +72,10 @@ impl Epoll {
|
||||
};
|
||||
}
|
||||
}
|
||||
+
|
||||
+impl Drop for Epoll {
|
||||
+ fn drop(&mut self) {
|
||||
+ self.safe_close(self.epoll_fd);
|
||||
+ self.epoll_fd = INVALID_FD;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/exts/init/src/runtime/mod.rs b/exts/init/src/runtime/mod.rs
|
||||
index d11d8f2..e81a513 100644
|
||||
--- a/exts/init/src/runtime/mod.rs
|
||||
+++ b/exts/init/src/runtime/mod.rs
|
||||
@@ -81,7 +81,7 @@ impl RunTime {
|
||||
self.state
|
||||
}
|
||||
|
||||
- pub fn reexec(&mut self) -> Result<(), Errno> {
|
||||
+ pub fn reexec(&mut self) {
|
||||
if self.need_reexec {
|
||||
self.reexec_manager();
|
||||
}
|
||||
@@ -89,43 +89,33 @@ impl RunTime {
|
||||
let event = self.epoll.wait_one();
|
||||
let fd = event.data() as RawFd;
|
||||
match fd {
|
||||
- _x if self.comm.is_fd(fd) => self.reexec_comm_dispatch(event)?,
|
||||
- _x if self.signals.is_fd(fd) => self.reexec_signal_dispatch(event)?,
|
||||
+ _x if self.comm.is_fd(fd) => self.reexec_comm_dispatch(event),
|
||||
+ _x if self.signals.is_fd(fd) => self.reexec_signal_dispatch(event),
|
||||
_ => self.epoll.safe_close(fd),
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
- pub fn run(&mut self) -> Result<(), Errno> {
|
||||
+ pub fn run(&mut self) {
|
||||
let event = self.epoll.wait_one();
|
||||
let fd = event.data() as RawFd;
|
||||
match fd {
|
||||
- _x if self.comm.is_fd(fd) => self.run_comm_dispatch(event)?,
|
||||
- _x if self.signals.is_fd(fd) => self.run_signal_dispatch(event)?,
|
||||
+ _x if self.comm.is_fd(fd) => self.run_comm_dispatch(event),
|
||||
+ _x if self.signals.is_fd(fd) => self.run_signal_dispatch(event),
|
||||
_ => self.epoll.safe_close(fd),
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
- pub fn unrecover(&mut self) -> Result<(), Errno> {
|
||||
+ pub fn unrecover(&mut self) {
|
||||
let event = self.epoll.wait_one();
|
||||
let fd = event.data() as RawFd;
|
||||
match fd {
|
||||
_x if self.comm.is_fd(fd) => self.unrecover_comm_dispatch(event),
|
||||
- _x if self.signals.is_fd(fd) => self.unrecover_signal_dispatch(event)?,
|
||||
+ _x if self.signals.is_fd(fd) => self.unrecover_signal_dispatch(event),
|
||||
_ => self.epoll.safe_close(fd),
|
||||
}
|
||||
- Ok(())
|
||||
- }
|
||||
-
|
||||
- pub fn clear(&mut self) {
|
||||
- self.comm.clear();
|
||||
- self.signals.clear();
|
||||
- self.epoll.clear();
|
||||
}
|
||||
|
||||
pub fn reexec_self(&mut self) {
|
||||
- self.clear();
|
||||
let mut args = Vec::new();
|
||||
let mut init_path = CString::new("/usr/bin/init").unwrap();
|
||||
if let Some(str) = std::env::args().next() {
|
||||
@@ -154,17 +144,16 @@ impl RunTime {
|
||||
unsafe { libc::kill(self.sysmaster_pid.into(), libc::SIGABRT) };
|
||||
}
|
||||
|
||||
- fn reexec_comm_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
- match self.comm.proc(event)? {
|
||||
+ fn reexec_comm_dispatch(&mut self, event: EpollEvent) {
|
||||
+ match self.comm.proc(event) {
|
||||
CommType::PipON => self.state = InitState::Run,
|
||||
CommType::PipTMOUT => self.need_reexec = true,
|
||||
_ => {}
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
- fn run_comm_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
- match self.comm.proc(event)? {
|
||||
+ fn run_comm_dispatch(&mut self, event: EpollEvent) {
|
||||
+ match self.comm.proc(event) {
|
||||
CommType::PipOFF => self.state = InitState::Reexec,
|
||||
CommType::PipTMOUT => {
|
||||
self.state = InitState::Reexec;
|
||||
@@ -172,15 +161,14 @@ impl RunTime {
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
fn unrecover_comm_dispatch(&mut self, event: EpollEvent) {
|
||||
_ = self.comm.proc(event);
|
||||
}
|
||||
|
||||
- fn reexec_signal_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
- if let Some(siginfo) = self.signals.read(event)? {
|
||||
+ fn reexec_signal_dispatch(&mut self, event: EpollEvent) {
|
||||
+ if let Some(siginfo) = self.signals.read(event) {
|
||||
match siginfo {
|
||||
_x if self.signals.is_zombie(siginfo) => self.do_recycle(),
|
||||
_x if self.signals.is_restart(siginfo) => self.do_reexec(),
|
||||
@@ -188,11 +176,10 @@ impl RunTime {
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
- fn run_signal_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
- if let Some(siginfo) = self.signals.read(event)? {
|
||||
+ fn run_signal_dispatch(&mut self, event: EpollEvent) {
|
||||
+ if let Some(siginfo) = self.signals.read(event) {
|
||||
match siginfo {
|
||||
_x if self.signals.is_zombie(siginfo) => self.do_recycle(),
|
||||
_x if self.signals.is_restart(siginfo) => self.do_reexec(),
|
||||
@@ -200,11 +187,10 @@ impl RunTime {
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
- fn unrecover_signal_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
- if let Some(siginfo) = self.signals.read(event)? {
|
||||
+ fn unrecover_signal_dispatch(&mut self, event: EpollEvent) {
|
||||
+ if let Some(siginfo) = self.signals.read(event) {
|
||||
match siginfo {
|
||||
_x if self.signals.is_zombie(siginfo) => {
|
||||
self.signals.recycle_zombie();
|
||||
@@ -216,7 +202,6 @@ impl RunTime {
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
- Ok(())
|
||||
}
|
||||
|
||||
fn change_to_unrecover(&mut self) {
|
||||
diff --git a/exts/init/src/runtime/signals.rs b/exts/init/src/runtime/signals.rs
|
||||
index 1c3059c..327ff3e 100644
|
||||
--- a/exts/init/src/runtime/signals.rs
|
||||
+++ b/exts/init/src/runtime/signals.rs
|
||||
@@ -13,7 +13,8 @@
|
||||
use super::epoll::Epoll;
|
||||
use nix::errno::Errno;
|
||||
use nix::sys::epoll::EpollEvent;
|
||||
-use nix::sys::signal::{SigmaskHow, Signal};
|
||||
+use nix::sys::signal::{self, SigSet, SigmaskHow, Signal};
|
||||
+use nix::sys::signalfd::{self, SfdFlags};
|
||||
use nix::sys::wait::{self, Id, WaitPidFlag, WaitStatus};
|
||||
use nix::unistd;
|
||||
use std::mem;
|
||||
@@ -21,42 +22,12 @@ use std::ops::Neg;
|
||||
use std::os::unix::io::RawFd;
|
||||
use std::rc::Rc;
|
||||
|
||||
+use constants::INVALID_FD;
|
||||
use constants::{SIG_RESTART_MANAGER_OFFSET, SIG_RUN_UNRECOVER_OFFSET, SIG_SWITCH_ROOT_OFFSET};
|
||||
-const INVALID_FD: i32 = -1;
|
||||
-
|
||||
-pub(crate) struct SigSet {
|
||||
- sigset: libc::sigset_t,
|
||||
-}
|
||||
-
|
||||
-impl SigSet {
|
||||
- /// Initialize to include nothing.
|
||||
- pub fn empty() -> SigSet {
|
||||
- let mut sigset = mem::MaybeUninit::zeroed();
|
||||
- let _ = unsafe { libc::sigemptyset(sigset.as_mut_ptr()) };
|
||||
-
|
||||
- unsafe {
|
||||
- SigSet {
|
||||
- sigset: sigset.assume_init(),
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- /// Add the specified signal to the set.
|
||||
- pub fn add(&mut self, signal: libc::c_int) {
|
||||
- unsafe {
|
||||
- libc::sigaddset(
|
||||
- &mut self.sigset as *mut libc::sigset_t,
|
||||
- signal as libc::c_int,
|
||||
- )
|
||||
- };
|
||||
- }
|
||||
-}
|
||||
|
||||
pub struct Signals {
|
||||
epoll: Rc<Epoll>,
|
||||
- signal_fd: RawFd,
|
||||
- set: SigSet,
|
||||
- oldset: SigSet,
|
||||
+ pub signal_fd: RawFd,
|
||||
signals: Vec<i32>,
|
||||
zombie_signal: i32,
|
||||
restart_signal: i32,
|
||||
@@ -71,8 +42,6 @@ impl Signals {
|
||||
Signals {
|
||||
epoll: epoll.clone(),
|
||||
signal_fd: INVALID_FD,
|
||||
- set: SigSet::empty(),
|
||||
- oldset: SigSet::empty(),
|
||||
signals,
|
||||
zombie_signal: libc::SIGCHLD,
|
||||
unrecover_signal: libc::SIGRTMIN() + SIG_RUN_UNRECOVER_OFFSET,
|
||||
@@ -101,29 +70,25 @@ impl Signals {
|
||||
}
|
||||
|
||||
pub fn create_signals_epoll(&mut self) -> Result<(), Errno> {
|
||||
- self.reset_sigset();
|
||||
+ self.signal_fd = self.reset_sigset()?;
|
||||
self.epoll.register(self.signal_fd)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
- pub fn reset_sigset(&mut self) {
|
||||
+ pub fn reset_sigset(&mut self) -> Result<RawFd, Errno> {
|
||||
+ let mut sigset = SigSet::empty();
|
||||
for sig in self.signals.clone() {
|
||||
- self.set.add(sig);
|
||||
- }
|
||||
-
|
||||
- unsafe {
|
||||
- libc::pthread_sigmask(libc::SIG_BLOCK, &self.set.sigset, &mut self.oldset.sigset);
|
||||
- self.signal_fd = libc::signalfd(
|
||||
- -1,
|
||||
- &mut self.set.sigset as *const libc::sigset_t,
|
||||
- libc::SFD_NONBLOCK,
|
||||
- );
|
||||
+ let signum: Signal = unsafe { std::mem::transmute(sig) };
|
||||
+ sigset.add(signum);
|
||||
}
|
||||
+ let mut oldset = SigSet::empty();
|
||||
+ signal::pthread_sigmask(SigmaskHow::SIG_BLOCK, Some(&sigset), Some(&mut oldset))?;
|
||||
+ signalfd::signalfd(-1, &sigset, SfdFlags::SFD_CLOEXEC | SfdFlags::SFD_NONBLOCK)
|
||||
}
|
||||
|
||||
- pub fn read(&mut self, event: EpollEvent) -> Result<Option<libc::signalfd_siginfo>, Errno> {
|
||||
+ pub fn read(&mut self, event: EpollEvent) -> Option<libc::signalfd_siginfo> {
|
||||
if self.epoll.is_err(event) {
|
||||
- return Err(Errno::EIO);
|
||||
+ return self.recover();
|
||||
}
|
||||
let mut buffer = mem::MaybeUninit::<libc::signalfd_siginfo>::zeroed();
|
||||
|
||||
@@ -139,14 +104,14 @@ impl Signals {
|
||||
match res {
|
||||
x if x == size as isize => {
|
||||
let info = unsafe { buffer.assume_init() };
|
||||
- Ok(Some(info))
|
||||
+ Some(info)
|
||||
}
|
||||
- x if x >= 0 => Ok(None),
|
||||
+ x if x >= 0 => None,
|
||||
x => {
|
||||
let err = Errno::from_i32(x.neg() as i32);
|
||||
eprintln!("read_signals failed err:{:?}", err);
|
||||
unistd::sleep(1);
|
||||
- Ok(None)
|
||||
+ None
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -191,13 +156,31 @@ impl Signals {
|
||||
}
|
||||
|
||||
pub fn is_fd(&self, fd: RawFd) -> bool {
|
||||
- if fd == self.signal_fd {
|
||||
- return true;
|
||||
+ fd == self.signal_fd
|
||||
+ }
|
||||
+
|
||||
+ fn recover(&mut self) -> Option<libc::signalfd_siginfo> {
|
||||
+ match self.reset_sigset() {
|
||||
+ Ok(signal_fd) => match self.epoll.register(signal_fd) {
|
||||
+ Ok(_) => {
|
||||
+ self.epoll.safe_close(self.signal_fd);
|
||||
+ self.signal_fd = signal_fd;
|
||||
+ eprintln!("signals recover");
|
||||
+ }
|
||||
+ Err(e) => {
|
||||
+ eprintln!("Failed to register signal_fd:{:?}", e);
|
||||
+ }
|
||||
+ },
|
||||
+ Err(e) => {
|
||||
+ eprintln!("Failed to create_signals_epoll:{:?}", e);
|
||||
+ }
|
||||
}
|
||||
- false
|
||||
+ None
|
||||
}
|
||||
+}
|
||||
|
||||
- pub fn clear(&mut self) {
|
||||
+impl Drop for Signals {
|
||||
+ fn drop(&mut self) {
|
||||
self.epoll.safe_close(self.signal_fd);
|
||||
self.signal_fd = INVALID_FD;
|
||||
if let Err(e) = nix::sys::signal::pthread_sigmask(
|
||||
diff --git a/exts/init/src/runtime/timer.rs b/exts/init/src/runtime/timer.rs
|
||||
index f7b5f30..54fcc62 100644
|
||||
--- a/exts/init/src/runtime/timer.rs
|
||||
+++ b/exts/init/src/runtime/timer.rs
|
||||
@@ -24,25 +24,18 @@ pub struct Timer {
|
||||
epoll: Rc<Epoll>,
|
||||
timer: TimerFd,
|
||||
current_cnt: i64,
|
||||
+ time_wait: i64,
|
||||
time_cnt: i64,
|
||||
}
|
||||
|
||||
impl Timer {
|
||||
pub fn new(epoll: &Rc<Epoll>, time_wait: i64, time_cnt: i64) -> Result<Timer, Errno> {
|
||||
- let timer = TimerFd::new(
|
||||
- ClockId::CLOCK_REALTIME,
|
||||
- TimerFlags::TFD_NONBLOCK | TimerFlags::TFD_CLOEXEC,
|
||||
- )?;
|
||||
- timer.set(
|
||||
- Expiration::Interval(TimeSpec::seconds(time_wait)),
|
||||
- TimerSetTimeFlags::empty(),
|
||||
- )?;
|
||||
-
|
||||
- epoll.register(timer.as_raw_fd())?;
|
||||
+ let timer = create_timer(epoll, time_wait)?;
|
||||
Ok(Timer {
|
||||
epoll: epoll.clone(),
|
||||
timer,
|
||||
current_cnt: 0,
|
||||
+ time_wait,
|
||||
time_cnt,
|
||||
})
|
||||
}
|
||||
@@ -56,18 +49,18 @@ impl Timer {
|
||||
}
|
||||
|
||||
#[allow(clippy::wrong_self_convention)]
|
||||
- pub fn is_time_out(&mut self, event: EpollEvent) -> Result<bool, Errno> {
|
||||
+ pub fn is_time_out(&mut self, event: EpollEvent) -> bool {
|
||||
if self.epoll.is_err(event) {
|
||||
- return Err(Errno::EIO);
|
||||
+ return self.recover();
|
||||
}
|
||||
self.flush();
|
||||
self.current_cnt += 1;
|
||||
if self.time_cnt <= self.current_cnt {
|
||||
eprintln!("time out!");
|
||||
self.reset();
|
||||
- return Ok(true);
|
||||
+ return true;
|
||||
}
|
||||
- Ok(false)
|
||||
+ false
|
||||
}
|
||||
|
||||
// reset timer.
|
||||
@@ -79,7 +72,40 @@ impl Timer {
|
||||
self.timer.as_raw_fd()
|
||||
}
|
||||
|
||||
- pub fn clear(&mut self) {
|
||||
- self.epoll.safe_close(self.timer.as_raw_fd());
|
||||
+ fn recover(&mut self) -> bool {
|
||||
+ match create_timer(&self.epoll, self.time_wait) {
|
||||
+ Ok(timer) => {
|
||||
+ // After successfully creating a new timer, recycle the old timer so that
|
||||
+ // if create_timer fails, event can be retrieved to create_timer again.
|
||||
+ // timer have drop, no need to manually close timer.
|
||||
+ self.timer = timer;
|
||||
+ eprintln!("timer recover");
|
||||
+ }
|
||||
+ Err(e) => {
|
||||
+ eprintln!("Failed to create_timer:{:?}", e);
|
||||
+ }
|
||||
+ }
|
||||
+ // Here we believe that the system has encountered an exception, set it to timeout
|
||||
+ true
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+impl Drop for Timer {
|
||||
+ fn drop(&mut self) {
|
||||
+ // self.timer does not need to drop, because TimerFd have drop.
|
||||
}
|
||||
}
|
||||
+
|
||||
+fn create_timer(epoll: &Rc<Epoll>, time_wait: i64) -> Result<TimerFd, Errno> {
|
||||
+ let timer = TimerFd::new(
|
||||
+ ClockId::CLOCK_REALTIME,
|
||||
+ TimerFlags::TFD_NONBLOCK | TimerFlags::TFD_CLOEXEC,
|
||||
+ )?;
|
||||
+ timer.set(
|
||||
+ Expiration::Interval(TimeSpec::seconds(time_wait)),
|
||||
+ TimerSetTimeFlags::empty(),
|
||||
+ )?;
|
||||
+
|
||||
+ epoll.register(timer.as_raw_fd())?;
|
||||
+ Ok(timer)
|
||||
+}
|
||||
diff --git a/libs/constants/src/lib.rs b/libs/constants/src/lib.rs
|
||||
index 6005067..1f84b40 100644
|
||||
--- a/libs/constants/src/lib.rs
|
||||
+++ b/libs/constants/src/lib.rs
|
||||
@@ -29,3 +29,6 @@ pub const SCTL_SOCKET: &str = "/run/sysmaster/sctl";
|
||||
|
||||
/// Default log file path when LogTarget is configured to "file"
|
||||
pub const LOG_FILE_PATH: &str = "/var/log/sysmaster/sysmaster.log";
|
||||
+
|
||||
+/// invalid fd
|
||||
+pub const INVALID_FD: i32 = -1;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From 11b48132ed907faa586220da9aafffa3b3e246ce Mon Sep 17 00:00:00 2001
|
||||
From: huyubiao <h13958451065@163.com>
|
||||
Date: Fri, 7 Jul 2023 16:08:27 +0800
|
||||
Subject: [PATCH] fix: init recyle zombie process normally, corrects document
|
||||
writing errors
|
||||
|
||||
---
|
||||
init/src/runtime/mod.rs | 12 ++++++------
|
||||
init/src/runtime/signals.rs | 18 +++++++++---------
|
||||
4 files changed, 17 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/init/src/runtime/signals.rs b/init/src/runtime/signals.rs
|
||||
index 327ff3e..1226e99 100644
|
||||
--- a/init/src/runtime/signals.rs
|
||||
+++ b/init/src/runtime/signals.rs
|
||||
@@ -81,8 +81,7 @@ impl Signals {
|
||||
let signum: Signal = unsafe { std::mem::transmute(sig) };
|
||||
sigset.add(signum);
|
||||
}
|
||||
- let mut oldset = SigSet::empty();
|
||||
- signal::pthread_sigmask(SigmaskHow::SIG_BLOCK, Some(&sigset), Some(&mut oldset))?;
|
||||
+ signal::pthread_sigmask(SigmaskHow::SIG_BLOCK, Some(&sigset), None)?;
|
||||
signalfd::signalfd(-1, &sigset, SfdFlags::SFD_CLOEXEC | SfdFlags::SFD_NONBLOCK)
|
||||
}
|
||||
|
||||
@@ -183,12 +182,13 @@ impl Drop for Signals {
|
||||
fn drop(&mut self) {
|
||||
self.epoll.safe_close(self.signal_fd);
|
||||
self.signal_fd = INVALID_FD;
|
||||
- if let Err(e) = nix::sys::signal::pthread_sigmask(
|
||||
- SigmaskHow::SIG_SETMASK,
|
||||
- Some(&nix::sys::signal::SigSet::empty()),
|
||||
- None,
|
||||
- ) {
|
||||
- eprintln!("reset pthread_sigmask failed: {e}");
|
||||
- }
|
||||
+ reset_signal_mask();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+pub fn reset_signal_mask() {
|
||||
+ let set = SigSet::empty();
|
||||
+ if let Err(e) = signal::pthread_sigmask(SigmaskHow::SIG_SETMASK, Some(&set), None) {
|
||||
+ eprintln!("reset signal mask failed: {e}");
|
||||
}
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,285 +0,0 @@
|
||||
From 5c9eb30727331780e01cd34293801efd38aa787d Mon Sep 17 00:00:00 2001
|
||||
From: huyubiao <h13958451065@163.com>
|
||||
Date: Fri, 16 Jun 2023 15:32:28 +0800
|
||||
Subject: [PATCH] fix: init uses SIGABRT to reexec sysmaster, increase signal
|
||||
permissions
|
||||
|
||||
---
|
||||
core/bin/main.rs | 46 ++++++++++++++++----------------
|
||||
core/bin/manager/mod.rs | 9 ++++++-
|
||||
exts/init/Cargo.toml | 1 -
|
||||
exts/init/src/runtime/mod.rs | 33 +++++++++--------------
|
||||
exts/init/src/runtime/signals.rs | 19 +++++++------
|
||||
libs/constants/src/lib.rs | 2 --
|
||||
7 files changed, 60 insertions(+), 62 deletions(-)
|
||||
|
||||
diff --git a/core/bin/main.rs b/core/bin/main.rs
|
||||
index 0239ce9..7f163c7 100644
|
||||
--- a/core/bin/main.rs
|
||||
+++ b/core/bin/main.rs
|
||||
@@ -39,7 +39,7 @@ use crate::mount::setup;
|
||||
use basic::logger::{self};
|
||||
use basic::process_util;
|
||||
use clap::Parser;
|
||||
-use libc::{c_int, getppid, prctl, PR_SET_CHILD_SUBREAPER};
|
||||
+use libc::{c_int, getpid, getppid, prctl, PR_SET_CHILD_SUBREAPER};
|
||||
use log::{self};
|
||||
use manager::signals::EVENT_SIGNALS;
|
||||
use nix::sys::resource::{self, Resource};
|
||||
@@ -52,7 +52,6 @@ use std::rc::Rc;
|
||||
use sysmaster::error::*;
|
||||
use sysmaster::rel;
|
||||
|
||||
-use constants::SIG_MANAGER_REEXEC_OFFSET;
|
||||
use constants::SIG_SWITCH_ROOT_OFFSET;
|
||||
|
||||
/// parse program arguments
|
||||
@@ -106,21 +105,17 @@ fn main() -> Result<()> {
|
||||
setup::mount_setup()?;
|
||||
|
||||
rel::reli_dir_prepare()?;
|
||||
- let switch = rel::reli_debug_get_switch();
|
||||
- log::info!("sysmaster initialize with switch: {}.", switch);
|
||||
+ let self_recovery_enable = rel::reli_debug_get_switch();
|
||||
+ log::info!("sysmaster self_recovery_enable: {}.", self_recovery_enable);
|
||||
|
||||
- initialize_runtime(switch)?;
|
||||
+ initialize_runtime(self_recovery_enable)?;
|
||||
|
||||
let manager = Manager::new(Mode::System, Action::Run, manager_config);
|
||||
|
||||
- // enable clear, mutex with install_crash_handler
|
||||
- if !switch {
|
||||
- if !args.deserialize {
|
||||
- manager.debug_clear_restore();
|
||||
- log::info!("debug: clear data restored.");
|
||||
- }
|
||||
- // if switch is false unregister init's reexec signal.
|
||||
- register_reexec_signal(false);
|
||||
+ // enable clear
|
||||
+ if !self_recovery_enable && !args.deserialize {
|
||||
+ manager.debug_clear_restore();
|
||||
+ log::info!("debug: clear data restored.");
|
||||
}
|
||||
|
||||
manager.setup_cgroup()?;
|
||||
@@ -144,10 +139,13 @@ fn main() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
-fn initialize_runtime(switch: bool) -> Result<()> {
|
||||
- if switch {
|
||||
+fn initialize_runtime(self_recovery_enable: bool) -> Result<()> {
|
||||
+ if self_recovery_enable {
|
||||
install_crash_handler();
|
||||
log::info!("install crash handler.");
|
||||
+ } else {
|
||||
+ // if self_recovery_enable is false unregister init's reexec signal.
|
||||
+ register_reexec_signal(false);
|
||||
}
|
||||
|
||||
#[cfg(feature = "linux")]
|
||||
@@ -222,7 +220,7 @@ fn install_crash_handler() {
|
||||
Signal::SIGABRT,
|
||||
Signal::SIGSYS,
|
||||
];
|
||||
- let handler = SigHandler::Handler(crash);
|
||||
+ let handler = SigHandler::SigAction(crash);
|
||||
let flags = SaFlags::SA_NODEFER;
|
||||
let action = SigAction::new(handler, flags, SigSet::empty());
|
||||
for &signal in signals.iter() {
|
||||
@@ -232,11 +230,14 @@ fn install_crash_handler() {
|
||||
}
|
||||
}
|
||||
|
||||
-extern "C" fn crash(signo: c_int) {
|
||||
- let _signal = Signal::try_from(signo).unwrap(); // debug
|
||||
-
|
||||
- let args: Vec<String> = env::args().collect();
|
||||
- do_reexecute(&args, false);
|
||||
+extern "C" fn crash(signo: c_int, siginfo: *mut libc::siginfo_t, _con: *mut libc::c_void) {
|
||||
+ let signal = Signal::try_from(signo).unwrap(); // debug
|
||||
+ if (signal == Signal::SIGABRT && unsafe { (*siginfo).si_pid() == getppid() })
|
||||
+ || unsafe { (*siginfo).si_pid() == getpid() }
|
||||
+ {
|
||||
+ let args: Vec<String> = env::args().collect();
|
||||
+ do_reexecute(&args, false);
|
||||
+ }
|
||||
}
|
||||
|
||||
fn execarg_build_default() -> (String, Vec<String>) {
|
||||
@@ -265,8 +266,7 @@ extern "C" fn crash_none(_signo: c_int, _siginfo: *mut libc::siginfo_t, _con: *m
|
||||
}
|
||||
|
||||
fn register_reexec_signal(enable: bool) {
|
||||
- let manager_signal: signal::Signal =
|
||||
- unsafe { std::mem::transmute(libc::SIGRTMIN() + SIG_MANAGER_REEXEC_OFFSET) };
|
||||
+ let manager_signal: Signal = Signal::SIGABRT;
|
||||
let handler = match enable {
|
||||
true => SigHandler::SigAction(crash_reexec),
|
||||
false => SigHandler::SigAction(crash_none),
|
||||
diff --git a/core/bin/manager/mod.rs b/core/bin/manager/mod.rs
|
||||
index e972cc7..7bd16e0 100644
|
||||
--- a/core/bin/manager/mod.rs
|
||||
+++ b/core/bin/manager/mod.rs
|
||||
@@ -59,6 +59,12 @@ impl SignalMgr {
|
||||
SignalMgr { um: Rc::clone(&um) }
|
||||
}
|
||||
fn reexec(&self) -> Result<i32> {
|
||||
+ self.um.set_state(State::ReExecute);
|
||||
+ Ok(1)
|
||||
+ }
|
||||
+
|
||||
+ fn reload(&self) -> Result<i32> {
|
||||
+ self.um.set_state(State::ReLoad);
|
||||
Ok(1)
|
||||
}
|
||||
}
|
||||
@@ -70,7 +76,8 @@ impl SignalDispatcher for SignalMgr {
|
||||
return Ok(1);
|
||||
}
|
||||
match signal.ssi_signo as libc::c_int {
|
||||
- libc::SIGHUP | libc::SIGTERM => self.reexec(),
|
||||
+ libc::SIGHUP => self.reload(),
|
||||
+ libc::SIGTERM => self.reexec(),
|
||||
libc::SIGCHLD => Ok(self.um.child_sigchld_enable(true)),
|
||||
/* Kernel will send SIGINT to PID1 when users press ctrl-alt-del,
|
||||
* init should forward SIGINT to sysmaster. */
|
||||
diff --git a/exts/init/Cargo.toml b/exts/init/Cargo.toml
|
||||
index e3c0198..e351b61 100644
|
||||
--- a/exts/init/Cargo.toml
|
||||
+++ b/exts/init/Cargo.toml
|
||||
@@ -9,4 +9,3 @@ edition = "2021"
|
||||
constants = { version = "0.1.0", path = "../../libs/constants" }
|
||||
libc = "0.2.*"
|
||||
nix = "0.24"
|
||||
-signal-hook-registry = "1.4.0"
|
||||
diff --git a/exts/init/src/runtime/mod.rs b/exts/init/src/runtime/mod.rs
|
||||
index e37ff01..d11d8f2 100644
|
||||
--- a/exts/init/src/runtime/mod.rs
|
||||
+++ b/exts/init/src/runtime/mod.rs
|
||||
@@ -33,7 +33,6 @@ use std::rc::Rc;
|
||||
|
||||
use constants::SIG_SWITCH_ROOT_OFFSET;
|
||||
const INVALID_PID: i32 = -1;
|
||||
-const MANAGER_SIG_OFFSET: i32 = 7;
|
||||
const SYSMASTER_PATH: &str = "/usr/lib/sysmaster/sysmaster";
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd)]
|
||||
@@ -152,12 +151,7 @@ impl RunTime {
|
||||
|
||||
self.comm.finish();
|
||||
|
||||
- unsafe {
|
||||
- libc::kill(
|
||||
- self.sysmaster_pid.into(),
|
||||
- libc::SIGRTMIN() + MANAGER_SIG_OFFSET,
|
||||
- )
|
||||
- };
|
||||
+ unsafe { libc::kill(self.sysmaster_pid.into(), libc::SIGABRT) };
|
||||
}
|
||||
|
||||
fn reexec_comm_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
@@ -187,11 +181,10 @@ impl RunTime {
|
||||
|
||||
fn reexec_signal_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
if let Some(siginfo) = self.signals.read(event)? {
|
||||
- let signo = siginfo.ssi_signo as i32;
|
||||
- match signo {
|
||||
- _x if self.signals.is_zombie(signo) => self.do_recycle(),
|
||||
- _x if self.signals.is_restart(signo) => self.do_reexec(),
|
||||
- _x if self.signals.is_unrecover(signo) => self.change_to_unrecover(),
|
||||
+ match siginfo {
|
||||
+ _x if self.signals.is_zombie(siginfo) => self.do_recycle(),
|
||||
+ _x if self.signals.is_restart(siginfo) => self.do_reexec(),
|
||||
+ _x if self.signals.is_unrecover(siginfo) => self.change_to_unrecover(),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -200,11 +193,10 @@ impl RunTime {
|
||||
|
||||
fn run_signal_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
if let Some(siginfo) = self.signals.read(event)? {
|
||||
- let signo = siginfo.ssi_signo as i32;
|
||||
- match signo {
|
||||
- _x if self.signals.is_zombie(signo) => self.do_recycle(),
|
||||
- _x if self.signals.is_restart(signo) => self.do_reexec(),
|
||||
- _x if self.signals.is_switch_root(signo) => self.send_switch_root_signal(),
|
||||
+ match siginfo {
|
||||
+ _x if self.signals.is_zombie(siginfo) => self.do_recycle(),
|
||||
+ _x if self.signals.is_restart(siginfo) => self.do_reexec(),
|
||||
+ _x if self.signals.is_switch_root(siginfo) => self.send_switch_root_signal(),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -213,15 +205,14 @@ impl RunTime {
|
||||
|
||||
fn unrecover_signal_dispatch(&mut self, event: EpollEvent) -> Result<(), Errno> {
|
||||
if let Some(siginfo) = self.signals.read(event)? {
|
||||
- let signo = siginfo.ssi_signo as i32;
|
||||
- match signo {
|
||||
- _x if self.signals.is_zombie(signo) => {
|
||||
+ match siginfo {
|
||||
+ _x if self.signals.is_zombie(siginfo) => {
|
||||
self.signals.recycle_zombie();
|
||||
if self.is_sysmaster(siginfo.ssi_pid as i32) && self.switching {
|
||||
self.reexec_self()
|
||||
}
|
||||
}
|
||||
- _x if self.signals.is_restart(signo) => self.do_recreate(),
|
||||
+ _x if self.signals.is_restart(siginfo) => self.do_recreate(),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
diff --git a/exts/init/src/runtime/signals.rs b/exts/init/src/runtime/signals.rs
|
||||
index eee088c..1c3059c 100644
|
||||
--- a/exts/init/src/runtime/signals.rs
|
||||
+++ b/exts/init/src/runtime/signals.rs
|
||||
@@ -81,20 +81,23 @@ impl Signals {
|
||||
}
|
||||
}
|
||||
|
||||
- pub fn is_zombie(&self, signo: i32) -> bool {
|
||||
- self.zombie_signal == signo
|
||||
+ pub fn is_zombie(&self, siginfo: libc::signalfd_siginfo) -> bool {
|
||||
+ self.zombie_signal as u32 == siginfo.ssi_signo
|
||||
}
|
||||
|
||||
- pub fn is_restart(&self, signo: i32) -> bool {
|
||||
- self.restart_signal == signo
|
||||
+ pub fn is_restart(&self, siginfo: libc::signalfd_siginfo) -> bool {
|
||||
+ self.restart_signal as u32 == siginfo.ssi_signo
|
||||
}
|
||||
|
||||
- pub fn is_unrecover(&self, signo: i32) -> bool {
|
||||
- self.unrecover_signal == signo
|
||||
+ pub fn is_unrecover(&self, siginfo: libc::signalfd_siginfo) -> bool {
|
||||
+ if 0 == siginfo.ssi_uid {
|
||||
+ return self.unrecover_signal as u32 == siginfo.ssi_signo;
|
||||
+ }
|
||||
+ false
|
||||
}
|
||||
|
||||
- pub fn is_switch_root(&self, signo: i32) -> bool {
|
||||
- self.switch_root_signal == signo
|
||||
+ pub fn is_switch_root(&self, siginfo: libc::signalfd_siginfo) -> bool {
|
||||
+ self.switch_root_signal as u32 == siginfo.ssi_signo
|
||||
}
|
||||
|
||||
pub fn create_signals_epoll(&mut self) -> Result<(), Errno> {
|
||||
diff --git a/libs/constants/src/lib.rs b/libs/constants/src/lib.rs
|
||||
index 7c918aa..b1db27c 100644
|
||||
--- a/libs/constants/src/lib.rs
|
||||
+++ b/libs/constants/src/lib.rs
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
//! Common used constants by init, sysmaster and other extensions.
|
||||
|
||||
-/// Signal used to reexecute sysmaster, SIGRTMIN+7
|
||||
-pub const SIG_MANAGER_REEXEC_OFFSET: i32 = 7;
|
||||
/// Signal used run unrecover, SIGRTMIN+8
|
||||
pub const SIG_RUN_UNRECOVER_OFFSET: i32 = 8;
|
||||
/// Signal used to restart the manager, SIGRTMIN+9
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,261 +0,0 @@
|
||||
From 9414249d740f90dfe5b65a922835306a78a1ad9f Mon Sep 17 00:00:00 2001
|
||||
From: huyubiao <h13958451065@163.com>
|
||||
Date: Tue, 18 Jul 2023 02:22:51 +0800
|
||||
Subject: [PATCH] fix: integer overflow
|
||||
|
||||
---
|
||||
coms/service/Cargo.toml | 1 +
|
||||
coms/service/src/config.rs | 15 +++++++++++++++
|
||||
coms/service/src/mng.rs | 10 +++++-----
|
||||
coms/service/src/rentry.rs | 4 ++--
|
||||
coms/service/src/spawn.rs | 2 +-
|
||||
coms/service/src/unit.rs | 6 ------
|
||||
core/sysmaster/mount/setup.rs | 1 -
|
||||
libs/basic/src/time_util.rs | 3 ---
|
||||
libs/constants/src/lib.rs | 9 +++++++++
|
||||
libs/event/Cargo.toml | 1 +
|
||||
libs/event/src/timer.rs | 20 +++++---------------
|
||||
11 files changed, 39 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/coms/service/Cargo.toml b/coms/service/Cargo.toml
|
||||
index 0f37cf8..27cedda 100644
|
||||
--- a/coms/service/Cargo.toml
|
||||
+++ b/coms/service/Cargo.toml
|
||||
@@ -10,6 +10,7 @@ crate-type = ["dylib"]
|
||||
name = "service"
|
||||
|
||||
[dependencies]
|
||||
+constants = { path = "../../libs/constants" }
|
||||
basic = { path = "../../libs/basic" }
|
||||
macros = { path = "../../libs/macros" }
|
||||
cgroup = { path = "../../libs/cgroup" }
|
||||
diff --git a/coms/service/src/config.rs b/coms/service/src/config.rs
|
||||
index aa62b00..e61340b 100644
|
||||
--- a/coms/service/src/config.rs
|
||||
+++ b/coms/service/src/config.rs
|
||||
@@ -14,6 +14,7 @@
|
||||
use super::comm::ServiceUnitComm;
|
||||
use super::rentry::{NotifyAccess, SectionService, ServiceCommand, ServiceType};
|
||||
use confique::{Config, FileFormat, Partial};
|
||||
+use constants::{USEC_INFINITY, USEC_PER_SEC};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::path::PathBuf;
|
||||
@@ -86,6 +87,7 @@ impl ServiceConfig {
|
||||
}
|
||||
Ok(v) => v,
|
||||
};
|
||||
+ self.data.borrow_mut().verify();
|
||||
|
||||
if update {
|
||||
self.db_update();
|
||||
@@ -178,6 +180,19 @@ impl ServiceConfigData {
|
||||
pub(self) fn set_timeout_stop(&mut self, time_out: u64) {
|
||||
self.Service.set_timeout_stop(time_out);
|
||||
}
|
||||
+
|
||||
+ pub(self) fn verify(&mut self) {
|
||||
+ if self.Service.WatchdogSec >= USEC_INFINITY / USEC_PER_SEC {
|
||||
+ self.Service.WatchdogSec = 0;
|
||||
+ } else {
|
||||
+ self.Service.WatchdogSec *= USEC_PER_SEC;
|
||||
+ }
|
||||
+ if self.Service.RestartSec >= USEC_INFINITY / USEC_PER_SEC {
|
||||
+ self.Service.RestartSec = USEC_PER_SEC;
|
||||
+ } else {
|
||||
+ self.Service.RestartSec *= USEC_PER_SEC;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
diff --git a/coms/service/src/mng.rs b/coms/service/src/mng.rs
|
||||
index b44a0dd..e5fbeb8 100644
|
||||
--- a/coms/service/src/mng.rs
|
||||
+++ b/coms/service/src/mng.rs
|
||||
@@ -1228,9 +1228,9 @@ impl ServiceMng {
|
||||
}
|
||||
|
||||
fn restart_watchdog(&self) {
|
||||
- self.monitor.borrow_mut().set_original_watchdog(
|
||||
- self.config.config_data().borrow().Service.WatchdogSec * 1000000,
|
||||
- );
|
||||
+ self.monitor
|
||||
+ .borrow_mut()
|
||||
+ .set_original_watchdog(self.config.config_data().borrow().Service.WatchdogSec);
|
||||
let watchdog_usec = self.monitor.borrow().watchdog_usec();
|
||||
if watchdog_usec == 0 || watchdog_usec == u64::MAX {
|
||||
self.stop_watchdog();
|
||||
@@ -2570,7 +2570,7 @@ mod tests {
|
||||
assert!(rt.armd_watchdog());
|
||||
assert_eq!(
|
||||
rt.watchdog().time(),
|
||||
- config.config_data().borrow().Service.WatchdogSec * 1000000
|
||||
+ config.config_data().borrow().Service.WatchdogSec
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2589,7 +2589,7 @@ mod tests {
|
||||
assert!(rt.armd_watchdog());
|
||||
assert_eq!(
|
||||
rt.watchdog().time(),
|
||||
- config.config_data().borrow().Service.WatchdogSec * 1000000
|
||||
+ config.config_data().borrow().Service.WatchdogSec
|
||||
);
|
||||
|
||||
messages.remove("WATCHDOG");
|
||||
diff --git a/coms/service/src/rentry.rs b/coms/service/src/rentry.rs
|
||||
index 7099e01..87c92b2 100644
|
||||
--- a/coms/service/src/rentry.rs
|
||||
+++ b/coms/service/src/rentry.rs
|
||||
@@ -32,7 +32,7 @@ use sysmaster::serialize::DeserializeWith;
|
||||
use sysmaster::unit::KillMode;
|
||||
|
||||
use basic::special::EXEC_RUNTIME_PREFIX;
|
||||
-use basic::time_util::USEC_PER_SEC;
|
||||
+use constants::USEC_PER_SEC;
|
||||
|
||||
struct ServiceReDb<K, V>(ReDb<K, V>);
|
||||
|
||||
@@ -290,7 +290,7 @@ pub(super) struct SectionService {
|
||||
#[config(deserialize_with = ExitStatusSet::deserialize_with)]
|
||||
#[config(default = "")]
|
||||
pub RestartPreventExitStatus: ExitStatusSet,
|
||||
- #[config(default = 100000)]
|
||||
+ #[config(default = 1)]
|
||||
pub RestartSec: u64,
|
||||
#[config(deserialize_with = Vec::<String>::deserialize_with)]
|
||||
#[config(default = "")]
|
||||
diff --git a/coms/service/src/spawn.rs b/coms/service/src/spawn.rs
|
||||
index 2ff9e92..9b895aa 100644
|
||||
--- a/coms/service/src/spawn.rs
|
||||
+++ b/coms/service/src/spawn.rs
|
||||
@@ -171,7 +171,7 @@ impl ServiceSpawn {
|
||||
}
|
||||
|
||||
fn watchdog_timer(&self) -> u64 {
|
||||
- self.config.config_data().borrow().Service.WatchdogSec * 1000000
|
||||
+ self.config.config_data().borrow().Service.WatchdogSec
|
||||
}
|
||||
|
||||
pub(super) fn set_socket_fd(&self, fd: i32) {
|
||||
diff --git a/coms/service/src/unit.rs b/coms/service/src/unit.rs
|
||||
index 4bb235e..ac2e05b 100644
|
||||
--- a/coms/service/src/unit.rs
|
||||
+++ b/coms/service/src/unit.rs
|
||||
@@ -405,11 +405,5 @@ impl ServiceUnit {
|
||||
}
|
||||
}
|
||||
|
||||
-/*impl Default for ServiceUnit {
|
||||
- fn default() -> Self {
|
||||
- ServiceUnit::new()
|
||||
- }
|
||||
-}*/
|
||||
-
|
||||
use sysmaster::declare_unitobj_plugin_with_param;
|
||||
declare_unitobj_plugin_with_param!(ServiceUnit, ServiceUnit::new);
|
||||
diff --git a/core/sysmaster/mount/setup.rs b/core/sysmaster/mount/setup.rs
|
||||
index e7ca9df..850a2b2 100644
|
||||
--- a/core/sysmaster/mount/setup.rs
|
||||
+++ b/core/sysmaster/mount/setup.rs
|
||||
@@ -32,7 +32,6 @@ use std::{
|
||||
use sysmaster::error::*;
|
||||
|
||||
const EARLY_MOUNT_NUM: u8 = 3;
|
||||
-// const CGROUP_ROOT: &str = "/sys/fs/cgroup/";
|
||||
|
||||
type Callback = fn() -> bool;
|
||||
|
||||
diff --git a/libs/basic/src/time_util.rs b/libs/basic/src/time_util.rs
|
||||
index 45a12af..a6eb5cb 100644
|
||||
--- a/libs/basic/src/time_util.rs
|
||||
+++ b/libs/basic/src/time_util.rs
|
||||
@@ -15,9 +15,6 @@ use std::time::SystemTime;
|
||||
|
||||
const USEC_INFINITY: u128 = u128::MAX;
|
||||
|
||||
-/// usec per sec
|
||||
-pub const USEC_PER_SEC: u64 = 1000000;
|
||||
-
|
||||
///
|
||||
pub fn timespec_load(systime: SystemTime) -> u128 {
|
||||
match systime.duration_since(SystemTime::UNIX_EPOCH) {
|
||||
diff --git a/libs/constants/src/lib.rs b/libs/constants/src/lib.rs
|
||||
index 46a3a50..3be5723 100644
|
||||
--- a/libs/constants/src/lib.rs
|
||||
+++ b/libs/constants/src/lib.rs
|
||||
@@ -35,3 +35,12 @@ pub const INIT_PARA_PATH: &str = "/run/sysmaster/init_para";
|
||||
|
||||
/// invalid fd
|
||||
pub const INVALID_FD: i32 = -1;
|
||||
+
|
||||
+/// USec per Sec
|
||||
+pub const USEC_PER_SEC: u64 = 1000000;
|
||||
+/// NSec per USec
|
||||
+pub const NSEC_PER_USEC: u64 = 1000;
|
||||
+/// NSec per Sec
|
||||
+pub const NSEC_PER_SEC: u64 = 1000000000;
|
||||
+/// USec infinity
|
||||
+pub const USEC_INFINITY: u64 = u64::MAX;
|
||||
diff --git a/libs/event/Cargo.toml b/libs/event/Cargo.toml
|
||||
index 8cd9398..55a5cb4 100644
|
||||
--- a/libs/event/Cargo.toml
|
||||
+++ b/libs/event/Cargo.toml
|
||||
@@ -7,6 +7,7 @@ edition = "2021"
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
+constants = { path = "../constants" }
|
||||
libc = { version = "0.2" }
|
||||
nix = { version = "0.24" }
|
||||
snafu = { version = "0.7" }
|
||||
diff --git a/libs/event/src/timer.rs b/libs/event/src/timer.rs
|
||||
index a94025b..9a0cb3d 100644
|
||||
--- a/libs/event/src/timer.rs
|
||||
+++ b/libs/event/src/timer.rs
|
||||
@@ -19,11 +19,7 @@ use std::{
|
||||
};
|
||||
|
||||
use crate::{EventType, Source};
|
||||
-
|
||||
-use std::u64::MAX as USEC_INFINITY;
|
||||
-const USEC_PER_SEC: u64 = 1000000;
|
||||
-const NSEC_PER_USEC: u64 = 1000;
|
||||
-const NSEC_PER_SEC: u64 = 1000000000;
|
||||
+use constants::{NSEC_PER_SEC, NSEC_PER_USEC, USEC_INFINITY, USEC_PER_SEC};
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub(crate) struct Timestamp {
|
||||
@@ -137,16 +133,11 @@ impl Timer {
|
||||
pub fn push(&mut self, source: Rc<dyn Source>) {
|
||||
// calc the time
|
||||
let mut next = source.time_relative();
|
||||
- if next != u64::MAX {
|
||||
- next += self.timerid(&source.event_type());
|
||||
- } else {
|
||||
+ let now = self.timerid(&source.event_type());
|
||||
+ if next > USEC_INFINITY - now {
|
||||
next = source.time();
|
||||
- }
|
||||
-
|
||||
- if next == u64::MAX {
|
||||
- panic!(
|
||||
- "You need to implement time() or time_relative(), and cannot be set to u64::MAX"
|
||||
- );
|
||||
+ } else {
|
||||
+ next += now;
|
||||
}
|
||||
|
||||
let cd = ClockData::new(source.clone(), next);
|
||||
@@ -165,7 +156,6 @@ impl Timer {
|
||||
|
||||
pub fn pop(&mut self, et: &EventType) -> Option<Rc<dyn Source>> {
|
||||
let next = self.timerid(et);
|
||||
- // self.now();
|
||||
match self.timer_set.get_mut(et) {
|
||||
Some(timer) => {
|
||||
if timer.data.is_empty() {
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,462 +0,0 @@
|
||||
From d36bb9fa9a0322f475f6039948bba6ea8e106d74 Mon Sep 17 00:00:00 2001
|
||||
From: xuxiaozhou1 <xuxiaozhou1@huawei.com>
|
||||
Date: Sun, 2 Jul 2023 17:32:25 +0800
|
||||
Subject: [PATCH] fix: isolate debugging code through configuration predicate
|
||||
'debug'
|
||||
|
||||
---
|
||||
build.rs | 8 +++
|
||||
core/libsysmaster/rel/api.rs | 106 ++++++++-------------------------
|
||||
core/libsysmaster/rel/base.rs | 40 +++++++++++--
|
||||
core/libsysmaster/rel/debug.rs | 106 +++++++++++++++++++++++++++++++++
|
||||
core/libsysmaster/rel/mod.rs | 6 +-
|
||||
5 files changed, 178 insertions(+), 88 deletions(-)
|
||||
create mode 100644 core/libsysmaster/rel/debug.rs
|
||||
|
||||
diff --git a/build.rs b/build.rs
|
||||
index 05296f5..15c2a21 100644
|
||||
--- a/build.rs
|
||||
+++ b/build.rs
|
||||
@@ -14,6 +14,8 @@
|
||||
// if use env out_dir need add build.rs
|
||||
use std::{env, process::Command};
|
||||
|
||||
+const RELEASE: &str = "release";
|
||||
+
|
||||
macro_rules! warn {
|
||||
($message:expr) => {
|
||||
println!("cargo:warning={}", $message);
|
||||
@@ -45,4 +47,10 @@ fn main() {
|
||||
println!("cargo:rerun-if-changed=build.sh");
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
// println!("cargo:rerun-if-changed=config.service");
|
||||
+
|
||||
+ // turn on "debug" for non-release build
|
||||
+ let profile = env::var("PROFILE").unwrap();
|
||||
+ if profile != RELEASE {
|
||||
+ println!("cargo:rustc-cfg=debug");
|
||||
+ }
|
||||
}
|
||||
diff --git a/core/libsysmaster/rel/api.rs b/core/libsysmaster/rel/api.rs
|
||||
index 94f9015..ad7743a 100644
|
||||
--- a/core/libsysmaster/rel/api.rs
|
||||
+++ b/core/libsysmaster/rel/api.rs
|
||||
@@ -10,6 +10,8 @@
|
||||
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
+#[cfg(debug)]
|
||||
+use super::debug::{self, ReliDebug};
|
||||
use super::{
|
||||
enable::{self, ReliEnable},
|
||||
history::{self, ReliHistory},
|
||||
@@ -19,24 +21,9 @@ use super::{
|
||||
ReDbTable, ReStation, ReStationKind,
|
||||
};
|
||||
use crate::{error::*, rel::base};
|
||||
-use basic::do_entry_or_return_io_error;
|
||||
use heed::Database;
|
||||
use nix::sys::stat::{self, Mode};
|
||||
-use std::{
|
||||
- fs::{self, File},
|
||||
- path::Path,
|
||||
- rc::Rc,
|
||||
- thread,
|
||||
- time::Duration,
|
||||
-};
|
||||
-
|
||||
-const RELI_DEBUG_SWITCH_FILE: &str = "switch.debug";
|
||||
-const RELI_DEBUG_CLEAR_FILE: &str = "clear.debug";
|
||||
-const RELI_DEBUG_CFIRST_FILE: &str = "clear_first.debug";
|
||||
-const RELI_DEBUG_ENABLE_FILE: &str = "enable.debug";
|
||||
-const RELI_DEBUG_PANIC_FILE: &str = "panic.debug";
|
||||
-const RELI_DEBUG_PFIRST_FILE: &str = "panic_first.debug";
|
||||
-const RELI_DEBUG_SLEEP_FILE: &str = "sleep.debug";
|
||||
+use std::rc::Rc;
|
||||
|
||||
/// the configuration of reliability instance
|
||||
pub struct ReliConf {
|
||||
@@ -76,8 +63,11 @@ impl Default for ReliConf {
|
||||
/// reliability instance
|
||||
#[derive(Debug)]
|
||||
pub struct Reliability {
|
||||
+ // debug
|
||||
+ #[cfg(debug)]
|
||||
+ debug: ReliDebug,
|
||||
+
|
||||
// control data
|
||||
- dir_string: String,
|
||||
enable: ReliEnable,
|
||||
|
||||
// output data
|
||||
@@ -102,7 +92,8 @@ impl Reliability {
|
||||
pub fn new(conf: &ReliConf) -> Reliability {
|
||||
let dir_s = reli_prepare().expect("reliability prepare");
|
||||
let reli = Reliability {
|
||||
- dir_string: dir_s.clone(),
|
||||
+ #[cfg(debug)]
|
||||
+ debug: ReliDebug::new(&dir_s),
|
||||
enable: ReliEnable::new(&dir_s),
|
||||
last: ReliLast::new(&dir_s),
|
||||
history: ReliHistory::new(&dir_s, conf.map_size, conf.max_dbs),
|
||||
@@ -250,8 +241,8 @@ impl Reliability {
|
||||
|
||||
/// do the debug action: enable the recover process
|
||||
pub fn debug_enable(&self) {
|
||||
- let enable = Path::new(&self.dir_string).join(RELI_DEBUG_ENABLE_FILE);
|
||||
- if enable.exists() {
|
||||
+ #[cfg(debug)]
|
||||
+ if self.debug.enable() {
|
||||
log::info!("reliability debug: enable data...");
|
||||
self.set_enable(true);
|
||||
}
|
||||
@@ -259,53 +250,25 @@ impl Reliability {
|
||||
|
||||
/// do the debug action: clear data excluding enable
|
||||
pub fn debug_clear(&self) {
|
||||
- let clear = Path::new(&self.dir_string).join(RELI_DEBUG_CLEAR_FILE);
|
||||
- if clear.exists() {
|
||||
- log::info!("reliability debug: clear data...");
|
||||
- let cfirst = Path::new(&self.dir_string).join(RELI_DEBUG_CFIRST_FILE);
|
||||
- if cfirst.exists() {
|
||||
- // do nothing
|
||||
- log::info!("reliability debug_clear: non-first time, do nothing.");
|
||||
- } else {
|
||||
- log::info!("reliability debug_clear: first time, try clear.");
|
||||
- File::create(&cfirst).unwrap();
|
||||
- log::debug!("Successfully created {cfirst:?}");
|
||||
- log::info!("reliability debug_clear: first time, clear ...");
|
||||
-
|
||||
- // clear data excluding enable
|
||||
- let enable = self.enable();
|
||||
- self.data_clear();
|
||||
- self.set_enable(enable);
|
||||
- }
|
||||
+ #[cfg(debug)]
|
||||
+ if self.debug.clear() {
|
||||
+ // clear data excluding enable
|
||||
+ let enable = self.enable();
|
||||
+ self.data_clear();
|
||||
+ self.set_enable(enable);
|
||||
}
|
||||
}
|
||||
|
||||
/// do the debug action: panic
|
||||
pub fn debug_panic(&self) {
|
||||
- let panic = Path::new(&self.dir_string).join(RELI_DEBUG_PANIC_FILE);
|
||||
- if panic.exists() {
|
||||
- log::info!("reliability debug: panic...");
|
||||
- let pfirst = Path::new(&self.dir_string).join(RELI_DEBUG_PFIRST_FILE);
|
||||
- if pfirst.exists() {
|
||||
- // do nothing
|
||||
- log::info!("reliability debug_panic: non-first time, do nothing.");
|
||||
- } else {
|
||||
- log::info!("reliability debug_panic: first time, try panic.");
|
||||
- File::create(&pfirst).unwrap();
|
||||
- log::debug!("Successfully created {pfirst:?}");
|
||||
- log::info!("reliability debug_panic: first time, panic ...");
|
||||
- panic!("first debug_panic.");
|
||||
- }
|
||||
- }
|
||||
+ #[cfg(debug)]
|
||||
+ self.debug.panic();
|
||||
}
|
||||
|
||||
/// do the debug action: sleep
|
||||
pub fn debug_sleep(&self) {
|
||||
- let sleep = Path::new(&self.dir_string).join(RELI_DEBUG_SLEEP_FILE);
|
||||
- if sleep.exists() {
|
||||
- log::info!("reliability debug: sleep...");
|
||||
- thread::sleep(Duration::from_secs(3600));
|
||||
- }
|
||||
+ #[cfg(debug)]
|
||||
+ self.debug.sleep();
|
||||
}
|
||||
|
||||
fn input_rebuild(&self) {
|
||||
@@ -365,31 +328,12 @@ impl Reliability {
|
||||
}
|
||||
}
|
||||
|
||||
-/// do the debug action: enable or disable switch flag. effective after restart.
|
||||
-#[allow(dead_code)]
|
||||
-pub fn reli_debug_enable_switch(enable: bool) -> Result<()> {
|
||||
- log::info!("reliability debug: enable[{}] switch.", enable);
|
||||
-
|
||||
- let dir_string = base::reli_dir_get().unwrap();
|
||||
- let switch = Path::new(&dir_string).join(RELI_DEBUG_SWITCH_FILE);
|
||||
- // touch switch.debug if enable
|
||||
- if enable && !switch.exists() {
|
||||
- do_entry_or_return_io_error!(File::create, switch, "create");
|
||||
- }
|
||||
- // remove switch.debug if disable
|
||||
- if !enable && switch.exists() {
|
||||
- do_entry_or_return_io_error!(fs::remove_file, switch, "remove");
|
||||
- }
|
||||
-
|
||||
- Ok(())
|
||||
-}
|
||||
-
|
||||
/// get the debug flag of switch
|
||||
pub fn reli_debug_get_switch() -> bool {
|
||||
- let dir_string = base::reli_dir_get().expect("guaranteed by caller.");
|
||||
- let switch = Path::new(&dir_string).join(RELI_DEBUG_SWITCH_FILE);
|
||||
- log::info!("reliability debug: get switch file: {:?}.", switch);
|
||||
- switch.exists()
|
||||
+ #[cfg(debug)]
|
||||
+ return debug::switch();
|
||||
+ #[cfg(not(debug))]
|
||||
+ return true;
|
||||
}
|
||||
|
||||
fn reli_prepare() -> Result<String> {
|
||||
diff --git a/core/libsysmaster/rel/base.rs b/core/libsysmaster/rel/base.rs
|
||||
index 65307e0..bcc8a21 100644
|
||||
--- a/core/libsysmaster/rel/base.rs
|
||||
+++ b/core/libsysmaster/rel/base.rs
|
||||
@@ -20,10 +20,12 @@ use serde::de::DeserializeOwned;
|
||||
use serde::Serialize;
|
||||
use std::cell::RefCell;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
+#[cfg(debug)]
|
||||
+use std::env;
|
||||
use std::fmt::Debug;
|
||||
+use std::fs;
|
||||
use std::hash::Hash;
|
||||
use std::path::Path;
|
||||
-use std::{env, fs};
|
||||
|
||||
/// the reliability database
|
||||
/// K & V that can be deserialized without borrowing any data from the deserializer.
|
||||
@@ -275,7 +277,21 @@ pub trait ReDbTable {
|
||||
|
||||
const RELI_PATH_DIR: &str = "/run/sysmaster/reliability";
|
||||
|
||||
+/// get the directory for reliability.
|
||||
pub fn reli_dir_get() -> Result<String> {
|
||||
+ #[cfg(debug)]
|
||||
+ return reli_dir_get_debug();
|
||||
+ #[cfg(not(debug))]
|
||||
+ return reli_dir_get_release();
|
||||
+}
|
||||
+
|
||||
+#[cfg(not(debug))]
|
||||
+fn reli_dir_get_release() -> Result<String> {
|
||||
+ return reli_dir_get_run();
|
||||
+}
|
||||
+
|
||||
+#[cfg(debug)]
|
||||
+fn reli_dir_get_debug() -> Result<String> {
|
||||
// /run/sysmaster/reliability/
|
||||
let ret_run = reli_dir_get_run();
|
||||
if ret_run.is_ok() {
|
||||
@@ -303,17 +319,26 @@ pub fn reli_dir_get() -> Result<String> {
|
||||
/// prepare the directory for reliability.
|
||||
/// the reliability path is prepared and searched according to the following priority, from high to low:
|
||||
/// 1. /run/sysmaster/reliability/: the real running directory.
|
||||
-/// 2. OUT_DIR/../reliability/: make CI happy, which is target/debug/reliability/ or target/release/reliability/ usually.
|
||||
-/// 3. PROCESS_RELI_PATH: the path customized.
|
||||
+/// 2. [debug-only]OUT_DIR/../reliability/: make CI happy, which is target/debug/reliability/ or target/release/reliability/ usually.
|
||||
+/// 3. [debug-only]ROCESS_RELI_PATH: the path customized.
|
||||
pub fn reli_dir_prepare() -> Result<()> {
|
||||
// create '/run/sysmaster/reliability' or 'xxx/reliability' with mode 700
|
||||
let old_mask = stat::umask(Mode::from_bits_truncate(!0o700));
|
||||
- let ret = reli_dir_prepare_body();
|
||||
+ #[cfg(debug)]
|
||||
+ let ret = reli_dir_prepare_debug();
|
||||
+ #[cfg(not(debug))]
|
||||
+ let ret = reli_dir_prepare_release();
|
||||
let _ = stat::umask(old_mask);
|
||||
ret
|
||||
}
|
||||
|
||||
-fn reli_dir_prepare_body() -> Result<()> {
|
||||
+#[cfg(not(debug))]
|
||||
+fn reli_dir_prepare_release() -> Result<()> {
|
||||
+ return reli_dir_prepare_run();
|
||||
+}
|
||||
+
|
||||
+#[cfg(debug)]
|
||||
+fn reli_dir_prepare_debug() -> Result<()> {
|
||||
// // /run/sysmaster/reliability/
|
||||
let ret_run = reli_dir_prepare_run();
|
||||
if ret_run.is_ok() {
|
||||
@@ -373,6 +398,7 @@ fn reli_dir_get_run() -> Result<String> {
|
||||
}
|
||||
}
|
||||
|
||||
+#[cfg(debug)]
|
||||
fn reli_dir_prepare_out() -> Result<()> {
|
||||
let dir_string = out_dir_string_get();
|
||||
if let Some(d_str) = dir_string {
|
||||
@@ -390,6 +416,7 @@ fn reli_dir_prepare_out() -> Result<()> {
|
||||
})
|
||||
}
|
||||
|
||||
+#[cfg(debug)]
|
||||
fn reli_dir_get_out() -> Result<String> {
|
||||
let dir_string = out_dir_string_get();
|
||||
if let Some(d_str) = dir_string {
|
||||
@@ -405,6 +432,7 @@ fn reli_dir_get_out() -> Result<String> {
|
||||
})
|
||||
}
|
||||
|
||||
+#[cfg(debug)]
|
||||
fn reli_dir_prepare_customize() -> Result<()> {
|
||||
let dir_string = env::var("PROCESS_LIB_LOAD_PATH").ok();
|
||||
if let Some(d_str) = dir_string {
|
||||
@@ -425,6 +453,7 @@ fn reli_dir_prepare_customize() -> Result<()> {
|
||||
})
|
||||
}
|
||||
|
||||
+#[cfg(debug)]
|
||||
fn reli_dir_get_customize() -> Result<String> {
|
||||
let dir_string = env::var("PROCESS_LIB_LOAD_PATH").ok();
|
||||
if let Some(d_str) = dir_string {
|
||||
@@ -443,6 +472,7 @@ fn reli_dir_get_customize() -> Result<String> {
|
||||
})
|
||||
}
|
||||
|
||||
+#[cfg(debug)]
|
||||
fn out_dir_string_get() -> Option<String> {
|
||||
let run = env::var("OUT_DIR").ok();
|
||||
let compile: Option<String> = option_env!("OUT_DIR").map(String::from);
|
||||
diff --git a/core/libsysmaster/rel/debug.rs b/core/libsysmaster/rel/debug.rs
|
||||
new file mode 100644
|
||||
index 0000000..fff3463
|
||||
--- /dev/null
|
||||
+++ b/core/libsysmaster/rel/debug.rs
|
||||
@@ -0,0 +1,106 @@
|
||||
+use super::base::{self};
|
||||
+use crate::error::*;
|
||||
+use basic::do_entry_or_return_io_error;
|
||||
+use std::fs::{self, File};
|
||||
+use std::path::Path;
|
||||
+use std::thread;
|
||||
+use std::time::Duration;
|
||||
+
|
||||
+const RELI_DEBUG_SWITCH_FILE: &str = "switch.debug";
|
||||
+const RELI_DEBUG_CLEAR_FILE: &str = "clear.debug";
|
||||
+const RELI_DEBUG_CFIRST_FILE: &str = "clear_first.debug";
|
||||
+const RELI_DEBUG_ENABLE_FILE: &str = "enable.debug";
|
||||
+const RELI_DEBUG_PANIC_FILE: &str = "panic.debug";
|
||||
+const RELI_DEBUG_PFIRST_FILE: &str = "panic_first.debug";
|
||||
+const RELI_DEBUG_SLEEP_FILE: &str = "sleep.debug";
|
||||
+
|
||||
+#[derive(Debug)]
|
||||
+pub(crate) struct ReliDebug {
|
||||
+ hdir: String, // home-directory
|
||||
+}
|
||||
+
|
||||
+impl ReliDebug {
|
||||
+ pub(crate) fn new(dir_str: &str) -> ReliDebug {
|
||||
+ ReliDebug {
|
||||
+ hdir: String::from(dir_str),
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ pub(crate) fn enable(&self) -> bool {
|
||||
+ let enable = Path::new(&self.hdir).join(RELI_DEBUG_ENABLE_FILE);
|
||||
+ enable.exists()
|
||||
+ }
|
||||
+
|
||||
+ pub(crate) fn clear(&self) -> bool {
|
||||
+ let clear = Path::new(&self.hdir).join(RELI_DEBUG_CLEAR_FILE);
|
||||
+ if clear.exists() {
|
||||
+ let cfirst = Path::new(&self.hdir).join(RELI_DEBUG_CFIRST_FILE);
|
||||
+ if cfirst.exists() {
|
||||
+ // do nothing
|
||||
+ log::info!("reliability debug_clear: non-first time, do nothing.");
|
||||
+ false
|
||||
+ } else {
|
||||
+ File::create(&cfirst).unwrap();
|
||||
+ log::debug!("Successfully created {cfirst:?}");
|
||||
+
|
||||
+ // clear data
|
||||
+ log::info!("reliability debug_clear: first time, clear ...");
|
||||
+ true
|
||||
+ }
|
||||
+ } else {
|
||||
+ false
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ pub(crate) fn panic(&self) {
|
||||
+ let panic = Path::new(&self.hdir).join(RELI_DEBUG_PANIC_FILE);
|
||||
+ if panic.exists() {
|
||||
+ let pfirst = Path::new(&self.hdir).join(RELI_DEBUG_PFIRST_FILE);
|
||||
+ if pfirst.exists() {
|
||||
+ // do nothing
|
||||
+ log::info!("reliability debug_panic: non-first time, do nothing.");
|
||||
+ } else {
|
||||
+ File::create(&pfirst).unwrap();
|
||||
+ log::debug!("Successfully created {pfirst:?}");
|
||||
+
|
||||
+ // panic
|
||||
+ log::info!("reliability debug_panic: first time, panic ...");
|
||||
+ panic!("first debug_panic.");
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ pub(crate) fn sleep(&self) {
|
||||
+ let sleep = Path::new(&self.hdir).join(RELI_DEBUG_SLEEP_FILE);
|
||||
+ if sleep.exists() {
|
||||
+ log::info!("reliability debug: sleep...");
|
||||
+ thread::sleep(Duration::from_secs(3600));
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+#[allow(dead_code)]
|
||||
+pub(crate) fn enable_switch(enable: bool) -> Result<()> {
|
||||
+ // do the debug action: enable or disable switch flag. effective after restart.
|
||||
+ log::info!("reliability debug: enable[{}] switch.", enable);
|
||||
+
|
||||
+ let dir_string = base::reli_dir_get().unwrap();
|
||||
+ let switch = Path::new(&dir_string).join(RELI_DEBUG_SWITCH_FILE);
|
||||
+ // touch switch.debug if enable
|
||||
+ if enable && !switch.exists() {
|
||||
+ do_entry_or_return_io_error!(File::create, switch, "create");
|
||||
+ }
|
||||
+ // remove switch.debug if disable
|
||||
+ if !enable && switch.exists() {
|
||||
+ do_entry_or_return_io_error!(fs::remove_file, switch, "remove");
|
||||
+ }
|
||||
+
|
||||
+ Ok(())
|
||||
+}
|
||||
+
|
||||
+pub(crate) fn switch() -> bool {
|
||||
+ let dir_string = base::reli_dir_get().expect("guaranteed by caller.");
|
||||
+ let switch = Path::new(&dir_string).join(RELI_DEBUG_SWITCH_FILE);
|
||||
+ log::info!("reliability debug: get switch file: {:?}.", switch);
|
||||
+ switch.exists()
|
||||
+}
|
||||
diff --git a/core/libsysmaster/rel/mod.rs b/core/libsysmaster/rel/mod.rs
|
||||
index 07470e4..2ae515a 100644
|
||||
--- a/core/libsysmaster/rel/mod.rs
|
||||
+++ b/core/libsysmaster/rel/mod.rs
|
||||
@@ -11,15 +11,17 @@
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
//! reliability module
|
||||
-pub use api::{reli_debug_enable_switch, reli_debug_get_switch, ReliConf, Reliability};
|
||||
+pub use api::{reli_debug_get_switch, ReliConf, Reliability};
|
||||
pub use base::{reli_dir_prepare, ReDb, ReDbRoTxn, ReDbRwTxn, ReDbTable};
|
||||
use serde::{Deserialize, Serialize};
|
||||
pub use station::{ReStation, ReStationKind};
|
||||
use std::convert::TryFrom;
|
||||
|
||||
-// dependency: base -> {enable | last | history | pending | station} -> api
|
||||
+// dependency: base -> {enable | last | history | pending | station} -> debug -> api
|
||||
mod api;
|
||||
mod base;
|
||||
+#[cfg(debug)]
|
||||
+mod debug;
|
||||
mod enable;
|
||||
mod history;
|
||||
mod last;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
From e4e5ecb66154ee71dde02120287aaf26a24577d1 Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Tue, 20 Jun 2023 02:50:36 +0800
|
||||
Subject: [PATCH] fix(libbasic): create relative symlink in right way
|
||||
|
||||
When creating relative symlink, 'symlinkat' should take the directory
|
||||
fd as input, but previously the 'symlink' function tried to open the
|
||||
symlink that hasn't been created. The unit test case for 'symlink' just
|
||||
consider the usage on creating non-relative symlink, thus it didn't
|
||||
find the bug when creating relative symlink.
|
||||
---
|
||||
libs/basic/src/fs_util.rs | 39 ++++++++++++++++++++++-----------------
|
||||
1 file changed, 22 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index e7cbfb9..63c43ca 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -42,17 +42,18 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
})?;
|
||||
|
||||
let rel_path = diff_paths(target_path, link_path_parent).unwrap();
|
||||
- let fd = nix::fcntl::open(&rel_path, OFlag::O_DIRECT, Mode::from_bits(0).unwrap())
|
||||
- .context(NixSnafu)?;
|
||||
+ let fd = nix::fcntl::open(
|
||||
+ link_path_parent,
|
||||
+ OFlag::O_DIRECTORY | OFlag::O_CLOEXEC | OFlag::O_NOFOLLOW,
|
||||
+ Mode::from_bits(0).unwrap(),
|
||||
+ )
|
||||
+ .context(NixSnafu)?;
|
||||
(rel_path, Some(fd))
|
||||
} else {
|
||||
(target_path.to_path_buf(), None)
|
||||
};
|
||||
|
||||
- nix::unistd::symlinkat(target_path.as_path(), fd, link_path).map_err(|e| {
|
||||
- log::debug!("Failed to create symlink: {} -> {}", link, target);
|
||||
- Error::Nix { source: e }
|
||||
- })
|
||||
+ nix::unistd::symlinkat(target_path.as_path(), fd, link_path).context(NixSnafu)
|
||||
}
|
||||
|
||||
/// chmod based on fd opened with O_PATH
|
||||
@@ -61,18 +62,14 @@ pub fn fchmod_opath(fd: i32, mode: mode_t) -> Result<()> {
|
||||
|
||||
let mut perms = std::fs::metadata(&fd_path).context(IoSnafu)?.permissions();
|
||||
perms.set_mode(mode);
|
||||
- std::fs::set_permissions(&fd_path, perms).context(IoSnafu)?;
|
||||
-
|
||||
- Ok(())
|
||||
+ std::fs::set_permissions(&fd_path, perms).context(IoSnafu)
|
||||
}
|
||||
|
||||
/// chmod based on path
|
||||
pub fn chmod(path: &str, mode: mode_t) -> Result<()> {
|
||||
let mut perms = std::fs::metadata(path).context(IoSnafu)?.permissions();
|
||||
perms.set_mode(mode);
|
||||
- std::fs::set_permissions(path, perms).context(IoSnafu)?;
|
||||
-
|
||||
- Ok(())
|
||||
+ std::fs::set_permissions(path, perms).context(IoSnafu)
|
||||
}
|
||||
|
||||
/// Safely chmod and chown based on a file description. If ownership
|
||||
@@ -183,15 +180,23 @@ mod tests {
|
||||
return;
|
||||
}
|
||||
|
||||
- let ret = symlink("/dev/null", "/tmp/test_link_name_39285b", false);
|
||||
- assert!(ret.is_ok());
|
||||
+ symlink("/dev/null", "/tmp/test_link_name_39285b", false).unwrap();
|
||||
|
||||
- let ret = unistd::unlinkat(
|
||||
+ unistd::unlinkat(
|
||||
None,
|
||||
link_name_path.to_str().unwrap(),
|
||||
unistd::UnlinkatFlags::NoRemoveDir,
|
||||
- );
|
||||
- assert!(ret.is_ok());
|
||||
+ )
|
||||
+ .unwrap();
|
||||
+
|
||||
+ symlink("/dev/null", "/tmp/test_link_name_39285c", true).unwrap();
|
||||
+
|
||||
+ unistd::unlinkat(
|
||||
+ None,
|
||||
+ "/tmp/test_link_name_39285c",
|
||||
+ unistd::UnlinkatFlags::NoRemoveDir,
|
||||
+ )
|
||||
+ .unwrap();
|
||||
}
|
||||
|
||||
/// test changing the mode of a file by file descriptor with O_PATH
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,77 +0,0 @@
|
||||
From 58774990868761750874fc8c21af0ccabefb1e53 Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Wed, 21 Jun 2023 23:43:12 +0800
|
||||
Subject: [PATCH] fix(libbasic): create symlink atomically
|
||||
|
||||
Create a temporary symlink and rename it into the final symlink.
|
||||
If there exists a symlink with the same name already, the symlink
|
||||
will be overrided. If any error occurs, the original symlink will
|
||||
be reserved.
|
||||
---
|
||||
libs/basic/Cargo.toml | 1 +
|
||||
libs/basic/src/fs_util.rs | 20 ++++++++++++++++----
|
||||
2 files changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index 64fbfba..7557d37 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -20,6 +20,7 @@ caps = "0.5.5"
|
||||
lazy_static = "1.4.0"
|
||||
bitflags = "1.3.2"
|
||||
pkg-config = "0.3"
|
||||
+rand = "0.4.6"
|
||||
|
||||
[dev-dependencies]
|
||||
libtests = { path = "../libtests" }
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index 5f34e9a..6a6378d 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -15,11 +15,12 @@
|
||||
use crate::{error::*, format_proc_fd_path};
|
||||
use libc::{fchownat, mode_t, timespec, AT_EMPTY_PATH, S_IFLNK, S_IFMT};
|
||||
use nix::{
|
||||
- fcntl::OFlag,
|
||||
+ fcntl::{renameat, OFlag},
|
||||
sys::stat::{fstat, Mode},
|
||||
- unistd::{Gid, Uid},
|
||||
+ unistd::{unlinkat, Gid, Uid, UnlinkatFlags},
|
||||
};
|
||||
use pathdiff::diff_paths;
|
||||
+use rand::Rng;
|
||||
use std::{fs::remove_dir, io::ErrorKind, os::unix::prelude::PermissionsExt, path::Path};
|
||||
|
||||
/// open the parent directory of path
|
||||
@@ -36,7 +37,7 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
let link_path = Path::new(&link);
|
||||
let target_path = Path::new(&target);
|
||||
|
||||
- let (target_path, fd) = if relative {
|
||||
+ let (target_path, dirfd) = if relative {
|
||||
let link_path_parent = link_path.parent().ok_or(Error::NotExisted {
|
||||
what: format!("{}'s parent", link_path.to_string_lossy()),
|
||||
})?;
|
||||
@@ -53,7 +54,18 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
(target_path.to_path_buf(), None)
|
||||
};
|
||||
|
||||
- nix::unistd::symlinkat(target_path.as_path(), fd, link_path).context(NixSnafu)
|
||||
+ let mut rng = rand::thread_rng();
|
||||
+
|
||||
+ let tmp_to = format!("{}.{}", link, rng.gen::<u32>());
|
||||
+
|
||||
+ nix::unistd::symlinkat(target_path.as_path(), dirfd, tmp_to.as_str()).context(NixSnafu)?;
|
||||
+
|
||||
+ if let Err(e) = renameat(dirfd, tmp_to.as_str(), dirfd, link_path) {
|
||||
+ let _ = unlinkat(dirfd, tmp_to.as_str(), UnlinkatFlags::NoRemoveDir);
|
||||
+ return Err(Error::Nix { source: e });
|
||||
+ }
|
||||
+
|
||||
+ Ok(())
|
||||
}
|
||||
|
||||
/// chmod based on fd opened with O_PATH
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,152 +0,0 @@
|
||||
From 11b505249041b6368eaac0b5699c455599a9565a Mon Sep 17 00:00:00 2001
|
||||
From: chenjiayi <chenjiayi22@huawei.com>
|
||||
Date: Tue, 27 Jun 2023 05:01:37 +0800
|
||||
Subject: [PATCH] fix(libbasic): try to follow the fd path to make the
|
||||
utimensat work
|
||||
|
||||
In devmaster threads, utimensat will fail with errno of ENOENT, which means
|
||||
the file path does not exist, if the fd path is used. The fd path is a symlink to
|
||||
the opened real file. It is weired because the fd path really exists but utimesat
|
||||
can not find it. To avoid the failure, we have no choice but to follow the fd path
|
||||
symlink to the real file, and update the timestamp directly on it.
|
||||
---
|
||||
libs/basic/src/error.rs | 7 +++-
|
||||
libs/basic/src/fs_util.rs | 78 ++++++++++++++++++++++++++-------------
|
||||
2 files changed, 57 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/error.rs b/libs/basic/src/error.rs
|
||||
index 2730883..cfa89f8 100644
|
||||
--- a/libs/basic/src/error.rs
|
||||
+++ b/libs/basic/src/error.rs
|
||||
@@ -44,6 +44,9 @@ pub enum Error {
|
||||
#[snafu(display("procfs: {}", source))]
|
||||
Proc { source: procfs::ProcError },
|
||||
|
||||
+ #[snafu(display("NulError: '{}'", source))]
|
||||
+ NulError { source: std::ffi::NulError },
|
||||
+
|
||||
#[snafu(display("Error parsing from string: {}", source))]
|
||||
Parse {
|
||||
source: Box<dyn std::error::Error + Send + Sync>,
|
||||
@@ -52,13 +55,13 @@ pub enum Error {
|
||||
#[snafu(display("Invalid naming scheme string: {}", what))]
|
||||
ParseNamingScheme { what: String },
|
||||
|
||||
- #[snafu(display("Not exist): '{}'.", what))]
|
||||
+ #[snafu(display("Not exist: '{}'.", what))]
|
||||
NotExisted { what: String },
|
||||
|
||||
#[snafu(display("Invalid: '{}'.", what))]
|
||||
Invalid { what: String },
|
||||
|
||||
- #[snafu(display("OtherError): '{}'.", msg))]
|
||||
+ #[snafu(display("OtherError: '{}'.", msg))]
|
||||
Other { msg: String },
|
||||
}
|
||||
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index 6a6378d..3f72658 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -15,13 +15,15 @@
|
||||
use crate::{error::*, format_proc_fd_path};
|
||||
use libc::{fchownat, mode_t, timespec, AT_EMPTY_PATH, S_IFLNK, S_IFMT};
|
||||
use nix::{
|
||||
- fcntl::{renameat, OFlag},
|
||||
+ fcntl::{readlink, renameat, OFlag},
|
||||
sys::stat::{fstat, Mode},
|
||||
unistd::{unlinkat, Gid, Uid, UnlinkatFlags},
|
||||
};
|
||||
use pathdiff::diff_paths;
|
||||
use rand::Rng;
|
||||
-use std::{fs::remove_dir, io::ErrorKind, os::unix::prelude::PermissionsExt, path::Path};
|
||||
+use std::{
|
||||
+ ffi::CString, fs::remove_dir, io::ErrorKind, os::unix::prelude::PermissionsExt, path::Path,
|
||||
+};
|
||||
|
||||
/// open the parent directory of path
|
||||
pub fn open_parent(path: &Path, flags: OFlag, mode: Mode) -> Result<i32> {
|
||||
@@ -148,32 +150,56 @@ pub fn fchmod_and_chown(
|
||||
Ok(do_chown || do_chmod)
|
||||
}
|
||||
|
||||
-/// if ts are not provided, use the current timestamp by default.
|
||||
+/// Update the timestamp of a file with fd. If 'ts' is not provided, use the current timestamp by default.
|
||||
pub fn futimens_opath(fd: i32, ts: Option<[timespec; 2]>) -> Result<()> {
|
||||
- let r = unsafe {
|
||||
- libc::utimensat(
|
||||
- libc::AT_FDCWD,
|
||||
- format_proc_fd_path!(fd).as_ptr() as *const libc::c_char,
|
||||
- &ts.unwrap_or([
|
||||
- timespec {
|
||||
- tv_sec: 0,
|
||||
- tv_nsec: libc::UTIME_NOW,
|
||||
- },
|
||||
- timespec {
|
||||
- tv_sec: 0,
|
||||
- tv_nsec: libc::UTIME_NOW,
|
||||
- },
|
||||
- ])[0],
|
||||
- 0,
|
||||
- )
|
||||
- };
|
||||
- if r < 0 {
|
||||
- Err(Error::Nix {
|
||||
- source: nix::Error::from_i32(std::io::Error::last_os_error().raw_os_error().unwrap()),
|
||||
- })
|
||||
- } else {
|
||||
- Ok(())
|
||||
+ let fd_path = format_proc_fd_path!(fd);
|
||||
+ let c_string =
|
||||
+ CString::new(fd_path.clone()).map_err(|e| crate::Error::NulError { source: e })?;
|
||||
+ let times = ts.unwrap_or([
|
||||
+ timespec {
|
||||
+ tv_sec: 0,
|
||||
+ tv_nsec: libc::UTIME_NOW,
|
||||
+ },
|
||||
+ timespec {
|
||||
+ tv_sec: 0,
|
||||
+ tv_nsec: libc::UTIME_NOW,
|
||||
+ },
|
||||
+ ])[0];
|
||||
+
|
||||
+ if unsafe { libc::utimensat(libc::AT_FDCWD, c_string.as_ptr(), ×, 0) } < 0 {
|
||||
+ let errno = nix::Error::from_i32(
|
||||
+ std::io::Error::last_os_error()
|
||||
+ .raw_os_error()
|
||||
+ .unwrap_or_default(),
|
||||
+ );
|
||||
+
|
||||
+ if errno == nix::Error::ENOENT {
|
||||
+ /*
|
||||
+ * In devmaster threads, utimensat will fail with errno of ENOENT, which means
|
||||
+ * the file path does not exist, if the fd path is used. The fd path is a symlink to
|
||||
+ * the opened real file. It is weird because the fd path really exists but utimesat
|
||||
+ * can not find it. To avoid the failure, we try to follow the fd path symlink to the
|
||||
+ * real file and update the timestamp directly on it.
|
||||
+ */
|
||||
+ let target = readlink(fd_path.as_str()).unwrap();
|
||||
+ let c_string = target
|
||||
+ .to_str()
|
||||
+ .ok_or(Error::Nix { source: errno })
|
||||
+ .map(|s| unsafe { libc::strdup(s.as_ptr() as *const libc::c_char) })?;
|
||||
+
|
||||
+ if unsafe { libc::utimensat(libc::AT_FDCWD, c_string, ×, 0) } < 0 {
|
||||
+ return Err(Error::Nix {
|
||||
+ source: nix::Error::from_i32(
|
||||
+ std::io::Error::last_os_error().raw_os_error().unwrap(),
|
||||
+ ),
|
||||
+ });
|
||||
+ }
|
||||
+ } else {
|
||||
+ return Err(Error::Nix { source: errno });
|
||||
+ }
|
||||
}
|
||||
+
|
||||
+ Ok(())
|
||||
}
|
||||
|
||||
/// recursively remove parent directories until specific directory
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
From 213633478307d6178b5ce85b27350d63174651e7 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 5 Jul 2023 09:31:43 +0800
|
||||
Subject: [PATCH] fix: log message before and after reaping zombie process
|
||||
|
||||
---
|
||||
core/sysmaster/unit/sigchld.rs | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/core/sysmaster/unit/sigchld.rs b/core/sysmaster/unit/sigchld.rs
|
||||
index 72da0eb..423b9b9 100644
|
||||
--- a/core/sysmaster/unit/sigchld.rs
|
||||
+++ b/core/sysmaster/unit/sigchld.rs
|
||||
@@ -197,7 +197,9 @@ impl SigchldData {
|
||||
}
|
||||
|
||||
// check
|
||||
- let (pid, _code, _signal) = si.unwrap();
|
||||
+ let (pid, code, signal) = si.unwrap();
|
||||
+ log::debug!("Process {} exited witch code: {code}, signal: {signal:?}", pid.as_raw());
|
||||
+
|
||||
if pid.as_raw() <= 0 {
|
||||
log::debug!("invalid pid in signal: {:?}", pid);
|
||||
return false; // turn_off
|
||||
@@ -214,8 +216,9 @@ impl SigchldData {
|
||||
}
|
||||
|
||||
// pop: reap the zombie
|
||||
- if let Err(e) = wait::waitid(Id::Pid(pid), WaitPidFlag::WEXITED) {
|
||||
- log::error!("Error when reap the zombie, ignoring: {}", e);
|
||||
+ match wait::waitid(Id::Pid(pid), WaitPidFlag::WEXITED) {
|
||||
+ Err(e) => log::error!("Failed to reap process {}: {e}", pid.as_raw()),
|
||||
+ Ok(_) => log::debug!("Reaped process {}", pid.as_raw()),
|
||||
}
|
||||
|
||||
true // stay turn_on
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,283 +0,0 @@
|
||||
From 09c44e3e4877a283bdb9bfca6ac1036513f2f2c1 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 5 Jul 2023 16:29:35 +0800
|
||||
Subject: [PATCH] fix: log message out when we create/delete a file or
|
||||
directory
|
||||
|
||||
---
|
||||
coms/service/src/mng.rs | 9 ++-------
|
||||
core/libsysmaster/rel/api.rs | 17 ++++++++++-------
|
||||
core/libsysmaster/rel/history.rs | 23 ++++++++++-------------
|
||||
core/sysmaster/manager/commands.rs | 9 ++++++---
|
||||
core/sysmaster/unit/sigchld.rs | 5 ++++-
|
||||
init/src/runtime/comm.rs | 12 ++++++++----
|
||||
libs/cgroup/src/cgroup.rs | 9 +++++++--
|
||||
9 files changed, 53 insertions(+), 46 deletions(-)
|
||||
|
||||
diff --git a/coms/service/src/mng.rs b/coms/service/src/mng.rs
|
||||
index 4bf20bd..b44a0dd 100644
|
||||
--- a/coms/service/src/mng.rs
|
||||
+++ b/coms/service/src/mng.rs
|
||||
@@ -20,7 +20,7 @@ use super::rentry::{
|
||||
};
|
||||
use super::spawn::ServiceSpawn;
|
||||
use crate::rentry::{ExitStatus, PreserveMode};
|
||||
-use basic::{fd_util, IN_SET};
|
||||
+use basic::{do_entry_log, fd_util, IN_SET};
|
||||
use basic::{file_util, process_util};
|
||||
use event::{EventState, EventType, Events, Source};
|
||||
use log::Level;
|
||||
@@ -623,12 +623,7 @@ impl ServiceMng {
|
||||
}
|
||||
|
||||
if let Some(p) = self.config.pid_file() {
|
||||
- if let Err(e) = nix::unistd::unlink(&p) {
|
||||
- log::warn!(
|
||||
- "{}",
|
||||
- format!("failed to unlink pid file: {:?}, error: {}", p, e)
|
||||
- );
|
||||
- }
|
||||
+ do_entry_log!(nix::unistd::unlink, p, "unlink");
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/core/libsysmaster/rel/api.rs b/core/libsysmaster/rel/api.rs
|
||||
index ad14796..fb482b8 100644
|
||||
--- a/core/libsysmaster/rel/api.rs
|
||||
+++ b/core/libsysmaster/rel/api.rs
|
||||
@@ -19,6 +19,7 @@ use super::{
|
||||
ReDbTable, ReStation, ReStationKind,
|
||||
};
|
||||
use crate::{error::*, rel::base};
|
||||
+use basic::do_entry_or_return_io_error;
|
||||
use heed::Database;
|
||||
use std::{
|
||||
fs::{self, File},
|
||||
@@ -267,6 +268,7 @@ impl Reliability {
|
||||
} else {
|
||||
log::info!("reliability debug_clear: first time, try clear.");
|
||||
File::create(&cfirst).unwrap();
|
||||
+ log::debug!("Successfully created {cfirst:?}");
|
||||
log::info!("reliability debug_clear: first time, clear ...");
|
||||
|
||||
// clear data excluding enable
|
||||
@@ -289,6 +291,7 @@ impl Reliability {
|
||||
} else {
|
||||
log::info!("reliability debug_panic: first time, try panic.");
|
||||
File::create(&pfirst).unwrap();
|
||||
+ log::debug!("Successfully created {pfirst:?}");
|
||||
log::info!("reliability debug_panic: first time, panic ...");
|
||||
panic!("first debug_panic.");
|
||||
}
|
||||
@@ -366,15 +369,15 @@ impl Reliability {
|
||||
pub fn reli_debug_enable_switch(enable: bool) -> Result<()> {
|
||||
log::info!("reliability debug: enable[{}] switch.", enable);
|
||||
|
||||
- // [enable]touch switch.debug or [disable]rm -rf switch.debug
|
||||
let dir_string = base::reli_dir_get().unwrap();
|
||||
let switch = Path::new(&dir_string).join(RELI_DEBUG_SWITCH_FILE);
|
||||
- if enable {
|
||||
- if !switch.exists() {
|
||||
- File::create(&switch).context(IoSnafu)?;
|
||||
- }
|
||||
- } else if switch.exists() {
|
||||
- fs::remove_file(&switch).context(IoSnafu)?;
|
||||
+ // touch switch.debug if enable
|
||||
+ if enable && !switch.exists() {
|
||||
+ do_entry_or_return_io_error!(File::create, switch, "create");
|
||||
+ }
|
||||
+ // remove switch.debug if disable
|
||||
+ if !enable && switch.exists() {
|
||||
+ do_entry_or_return_io_error!(fs::remove_file, switch, "remove");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
diff --git a/core/libsysmaster/rel/history.rs b/core/libsysmaster/rel/history.rs
|
||||
index 9381c10..fc31623 100644
|
||||
--- a/core/libsysmaster/rel/history.rs
|
||||
+++ b/core/libsysmaster/rel/history.rs
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
use super::base::{ReDbRoTxn, ReDbRwTxn, ReDbTable};
|
||||
use crate::error::*;
|
||||
+use basic::{do_entry_log, do_entry_or_return_io_error};
|
||||
use heed::{CompactionOption, Env, EnvOpenOptions};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashMap;
|
||||
@@ -126,8 +127,8 @@ impl ReliHistory {
|
||||
let next_file = next_path.join(RELI_HISTORY_DATA_FILE);
|
||||
|
||||
// clear next: delete and re-create the whole directory
|
||||
- fs::remove_dir_all(next_path.clone()).context(IoSnafu)?;
|
||||
- fs::create_dir_all(next_path).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(fs::remove_dir_all, next_path, "remove");
|
||||
+ do_entry_or_return_io_error!(fs::create_dir_all, next_path, "create");
|
||||
|
||||
// copy to next
|
||||
self.env
|
||||
@@ -138,21 +139,17 @@ impl ReliHistory {
|
||||
// remark the next flag at last: the another one
|
||||
let bflag = bflag_path_get(history.clone());
|
||||
if self.b_exist {
|
||||
- fs::remove_file(bflag).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(fs::remove_file, bflag, "remove");
|
||||
} else {
|
||||
- File::create(bflag).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(File::create, bflag, "create");
|
||||
}
|
||||
|
||||
// try to clear previous: it would be done in the next re-exec, but we try to delete it as soon as possible.
|
||||
let cur_path = history.join(subdir_cur_get(self.b_exist));
|
||||
let cur_data = cur_path.join(RELI_HISTORY_DATA_FILE);
|
||||
let cur_lock = cur_path.join(RELI_HISTORY_LOCK_FILE);
|
||||
- if let Err(e) = fs::remove_file(cur_data.clone()) {
|
||||
- log::error!("remove data file {:?} failed, err = {:?}", cur_data, e);
|
||||
- }
|
||||
- if let Err(e) = fs::remove_file(cur_lock.clone()) {
|
||||
- log::error!("remove lock file {:?} failed, err = {:?}", cur_lock, e);
|
||||
- }
|
||||
+ do_entry_log!(fs::remove_file, cur_data, "remove");
|
||||
+ do_entry_log!(fs::remove_file, cur_lock, "remove");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -181,18 +178,18 @@ pub fn prepare(dir_str: &str) -> Result<()> {
|
||||
// directory
|
||||
let history = history_path_get(dir_str);
|
||||
if !history.exists() {
|
||||
- fs::create_dir_all(&history).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(fs::create_dir_all, history, "create");
|
||||
}
|
||||
|
||||
// sub-directory
|
||||
let a = history.join(RELI_HISTORY_A_DIR);
|
||||
if !a.exists() {
|
||||
- fs::create_dir_all(&a).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(fs::create_dir_all, a, "create");
|
||||
}
|
||||
|
||||
let b = history.join(RELI_HISTORY_B_DIR);
|
||||
if !b.exists() {
|
||||
- fs::create_dir_all(&b).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(fs::create_dir_all, a, "create");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
diff --git a/core/sysmaster/manager/commands.rs b/core/sysmaster/manager/commands.rs
|
||||
index 57f9d5d..6e1da40 100644
|
||||
--- a/core/sysmaster/manager/commands.rs
|
||||
+++ b/core/sysmaster/manager/commands.rs
|
||||
@@ -10,7 +10,7 @@
|
||||
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
-use basic::socket_util;
|
||||
+use basic::{do_entry_log, socket_util};
|
||||
use cmdproto::proto::execute::ExecuterAction;
|
||||
use cmdproto::proto::ProstServerStream;
|
||||
use event::{EventType, Events, Source};
|
||||
@@ -37,7 +37,7 @@ impl<T> Commands<T> {
|
||||
let sctl_socket_path = Path::new(SCTL_SOCKET);
|
||||
/* remove the old socket if it exists */
|
||||
if sctl_socket_path.exists() && !sctl_socket_path.is_symlink() {
|
||||
- let _ = std::fs::remove_file(sctl_socket_path);
|
||||
+ do_entry_log!(std::fs::remove_file, sctl_socket_path, "remove");
|
||||
}
|
||||
let sctl_socket_addr = socket::UnixAddr::new(Path::new(SCTL_SOCKET)).unwrap();
|
||||
let socket_fd = socket::socket(
|
||||
@@ -51,7 +51,10 @@ impl<T> Commands<T> {
|
||||
socket_util::set_pass_cred(socket_fd, true).unwrap();
|
||||
/* create the socket with mode 666 */
|
||||
let old_mask = stat::umask(stat::Mode::from_bits_truncate(!0o666));
|
||||
- let _ = socket::bind(socket_fd, &sctl_socket_addr);
|
||||
+ match socket::bind(socket_fd, &sctl_socket_addr) {
|
||||
+ Err(e) => log::error!("Failed to bind {sctl_socket_addr:?}: {e}"),
|
||||
+ Ok(_) => log::debug!("Successfully bind {sctl_socket_addr:?}"),
|
||||
+ }
|
||||
/* restore our umask */
|
||||
let _ = stat::umask(old_mask);
|
||||
/* Allow at most 4096 incoming connections can queue */
|
||||
diff --git a/core/sysmaster/unit/sigchld.rs b/core/sysmaster/unit/sigchld.rs
|
||||
index 423b9b9..eead6f7 100644
|
||||
--- a/core/sysmaster/unit/sigchld.rs
|
||||
+++ b/core/sysmaster/unit/sigchld.rs
|
||||
@@ -198,7 +198,10 @@ impl SigchldData {
|
||||
|
||||
// check
|
||||
let (pid, code, signal) = si.unwrap();
|
||||
- log::debug!("Process {} exited witch code: {code}, signal: {signal:?}", pid.as_raw());
|
||||
+ log::debug!(
|
||||
+ "Process {} exited witch code: {code}, signal: {signal:?}",
|
||||
+ pid.as_raw()
|
||||
+ );
|
||||
|
||||
if pid.as_raw() <= 0 {
|
||||
log::debug!("invalid pid in signal: {:?}", pid);
|
||||
diff --git a/init/src/runtime/comm.rs b/init/src/runtime/comm.rs
|
||||
index 8f71511..92d52bc 100644
|
||||
--- a/init/src/runtime/comm.rs
|
||||
+++ b/init/src/runtime/comm.rs
|
||||
@@ -282,11 +282,15 @@ fn create_listen_fd(epoll: &Rc<Epoll>) -> Result<(i32, Inotify, WatchDescriptor)
|
||||
)?;
|
||||
|
||||
let sock_path = PathBuf::from(INIT_SOCKET);
|
||||
- let parent_path = sock_path.as_path().parent();
|
||||
- match parent_path {
|
||||
- Some(path) => fs::create_dir_all(path)
|
||||
- .map_err(|e| Errno::from_i32(e.raw_os_error().unwrap_or(Errno::EINVAL as i32)))?,
|
||||
+ let path = match sock_path.as_path().parent() {
|
||||
None => return Err(Errno::EINVAL),
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ if let Err(e) = fs::create_dir_all(path) {
|
||||
+ eprintln!("Failed to create directory {path:?}: {e}");
|
||||
+ return Err(Errno::from_i32(
|
||||
+ e.raw_os_error().unwrap_or(Errno::EINVAL as i32),
|
||||
+ ));
|
||||
}
|
||||
|
||||
if let Err(e) = unistd::unlink(&sock_path) {
|
||||
diff --git a/libs/cgroup/src/cgroup.rs b/libs/cgroup/src/cgroup.rs
|
||||
index 13efee2..02b266c 100644
|
||||
--- a/libs/cgroup/src/cgroup.rs
|
||||
+++ b/libs/cgroup/src/cgroup.rs
|
||||
@@ -13,6 +13,7 @@
|
||||
use super::CgFlags;
|
||||
use crate::error::*;
|
||||
use crate::CgType;
|
||||
+use basic::do_entry_or_return_io_error;
|
||||
use basic::special::CGROUP_SYSMASTER;
|
||||
use basic::special::INIT_SCOPE;
|
||||
use basic::special::SYSMASTER_SLICE;
|
||||
@@ -146,7 +147,7 @@ pub fn cg_attach(pid: Pid, cg_path: &PathBuf) -> Result<()> {
|
||||
pub fn cg_create(cg_path: &PathBuf) -> Result<()> {
|
||||
log::debug!("cgroup create path {:?}", cg_path);
|
||||
let abs_cg_path: PathBuf = cg_abs_path(cg_path, &PathBuf::from(""))?;
|
||||
- fs::create_dir_all(abs_cg_path).context(IoSnafu)?;
|
||||
+ do_entry_or_return_io_error!(fs::create_dir_all, abs_cg_path, "create");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -232,7 +233,10 @@ fn remove_dir(cg_path: &PathBuf) -> Result<()> {
|
||||
let mut try_times = 0;
|
||||
loop {
|
||||
let e = match fs::remove_dir(cg_path) {
|
||||
- Ok(()) => return Ok(()),
|
||||
+ Ok(()) => {
|
||||
+ log::debug!("Successfully removed {cg_path:?}");
|
||||
+ return Ok(());
|
||||
+ }
|
||||
Err(e) => e,
|
||||
};
|
||||
let os_errno = match e.raw_os_error() {
|
||||
@@ -244,6 +248,7 @@ fn remove_dir(cg_path: &PathBuf) -> Result<()> {
|
||||
try_times += 1;
|
||||
continue;
|
||||
}
|
||||
+ log::error!("Failed to remove {cg_path:?}: {e}");
|
||||
return Err(Error::Io { source: e });
|
||||
}
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,70 +0,0 @@
|
||||
From 9384fffab8369e6390d37a20b969eaec7b1a2b19 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 5 Jul 2023 16:26:19 +0800
|
||||
Subject: [PATCH] fix: log message when creating symlink.
|
||||
|
||||
Also, rename tmp_to to tmp_link, and add comment to avoid using 'from/to' in this function
|
||||
---
|
||||
libs/basic/src/fs_util.rs | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/fs_util.rs b/libs/basic/src/fs_util.rs
|
||||
index 413008b..ec814e2 100644
|
||||
--- a/libs/basic/src/fs_util.rs
|
||||
+++ b/libs/basic/src/fs_util.rs
|
||||
@@ -38,7 +38,9 @@ pub fn open_parent(path: &Path, flags: OFlag, mode: Mode) -> Result<File> {
|
||||
Ok(unsafe { File::from_raw_fd(nix::fcntl::open(parent, flags, mode).context(NixSnafu)?) })
|
||||
}
|
||||
|
||||
-/// create symlink link_name -> target
|
||||
+/// create symlink link -> target
|
||||
+/* Please don't use "from/to", use "symlink/target" to name path.
|
||||
+ * Take "A -> B" for example, A is "link", B is "target". */
|
||||
pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
let link_path = Path::new(&link);
|
||||
let target_path = Path::new(&target);
|
||||
@@ -48,29 +50,35 @@ pub fn symlink(target: &str, link: &str, relative: bool) -> Result<()> {
|
||||
what: format!("{}'s parent", link_path.to_string_lossy()),
|
||||
})?;
|
||||
|
||||
- let rel_path = diff_paths(target_path, link_path_parent).unwrap();
|
||||
+ let relative_path = diff_paths(target_path, link_path_parent).unwrap();
|
||||
let fd = nix::fcntl::open(
|
||||
link_path_parent,
|
||||
OFlag::O_DIRECTORY | OFlag::O_CLOEXEC | OFlag::O_NOFOLLOW,
|
||||
Mode::from_bits(0).unwrap(),
|
||||
)
|
||||
.context(NixSnafu)?;
|
||||
- (rel_path, Some(unsafe { File::from_raw_fd(fd) }))
|
||||
+ (relative_path, Some(unsafe { File::from_raw_fd(fd) }))
|
||||
} else {
|
||||
(target_path.to_path_buf(), None)
|
||||
};
|
||||
|
||||
let mut rng = rand::thread_rng();
|
||||
- let tmp_to = format!("{}.{}", link, rng.gen::<u32>());
|
||||
+ let tmp_link = format!("{}.{}", link, rng.gen::<u32>());
|
||||
let raw_fd = dir.map(|f| f.as_raw_fd());
|
||||
|
||||
- nix::unistd::symlinkat(target_path.as_path(), raw_fd, tmp_to.as_str()).context(NixSnafu)?;
|
||||
+ if let Err(e) = nix::unistd::symlinkat(target_path.as_path(), raw_fd, tmp_link.as_str()) {
|
||||
+ log::error!("Failed to create symlink {link} -> {target}: {e}");
|
||||
+ return Err(Error::Nix { source: e });
|
||||
+ }
|
||||
|
||||
- if let Err(e) = renameat(raw_fd, tmp_to.as_str(), raw_fd, link_path) {
|
||||
- let _ = unlinkat(raw_fd, tmp_to.as_str(), UnlinkatFlags::NoRemoveDir);
|
||||
+ if let Err(e) = renameat(raw_fd, tmp_link.as_str(), raw_fd, link_path) {
|
||||
+ log::error!("Failed to rename the temporary path of {link_path:?}: {e}");
|
||||
+ let _ = unlinkat(raw_fd, tmp_link.as_str(), UnlinkatFlags::NoRemoveDir);
|
||||
return Err(Error::Nix { source: e });
|
||||
}
|
||||
|
||||
+ log::debug!("Successfully created symlink: {link} -> {target}");
|
||||
+
|
||||
Ok(())
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
From 8b447063d1ebde763cbb19563b682d5709282301 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 17:17:48 +0800
|
||||
Subject: [PATCH] fix: make config.service.toml same as config.service
|
||||
|
||||
---
|
||||
tests/test_units/config.service.toml | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/test_units/config.service.toml b/tests/test_units/config.service.toml
|
||||
index 5b00dc6..8c56508 100644
|
||||
--- a/tests/test_units/config.service.toml
|
||||
+++ b/tests/test_units/config.service.toml
|
||||
@@ -1,11 +1,12 @@
|
||||
[Unit]
|
||||
Description="CN"
|
||||
Documentation="192.168.1.1"
|
||||
-
|
||||
+Requires="test.service"
|
||||
|
||||
[Service]
|
||||
Type="Simple"
|
||||
ExecCondition="/usr/bin/sleep 5"
|
||||
+ExecStartPre="/usr/bin/echo test"
|
||||
ExecStart="/bin/echo 'test'"
|
||||
ExecStop="/bin/kill $MAINPID"
|
||||
WatchdogSec=10
|
||||
@@ -13,5 +14,6 @@ Restart="always"
|
||||
RestartPreventExitStatus="1 2 SIGKILL"
|
||||
RestartSec=5
|
||||
|
||||
+
|
||||
[Install]
|
||||
WantedBy="dbus.service"
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,124 +0,0 @@
|
||||
From c818931d9e6f64bcac77c4c4d21a1ec34078bce3 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 19 Jun 2023 15:29:13 +0800
|
||||
Subject: [PATCH] fix: make test_cgroup really work.
|
||||
|
||||
1. we used to attach our test tasks to system.slice, this is not safe.
|
||||
Because system.slice is a common name, and there are many system
|
||||
process attched in this directory, we can't just kill all processes
|
||||
in this directory.
|
||||
|
||||
2. remove_dir used to return Ok(()) even if there is really a error.
|
||||
|
||||
3. use fs::remove_dir instead of fs::remove_all_dir because /sys/fs/cgroup
|
||||
is a pseudo file system, we can't really remove files here.
|
||||
---
|
||||
libs/cgroup/src/cgroup.rs | 74 ++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 58 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/libs/cgroup/src/cgroup.rs b/libs/cgroup/src/cgroup.rs
|
||||
index 83fe8ca..18513c2 100644
|
||||
--- a/libs/cgroup/src/cgroup.rs
|
||||
+++ b/libs/cgroup/src/cgroup.rs
|
||||
@@ -188,20 +188,64 @@ pub fn cg_get_pids(cg_path: &PathBuf) -> Vec<Pid> {
|
||||
}
|
||||
|
||||
fn remove_dir(cg_path: &PathBuf) -> Result<()> {
|
||||
- let abs_cg_path: PathBuf = cg_abs_path(cg_path, &PathBuf::from(""))?;
|
||||
-
|
||||
- match fs::remove_dir_all(abs_cg_path.clone()) {
|
||||
- Ok(_) => {}
|
||||
+ if !cg_path.is_absolute() {
|
||||
+ log::error!("We only support remove absolute directory.");
|
||||
+ return Err(Error::NotSupported);
|
||||
+ }
|
||||
+ /* Note: We can't just call fs::remove_all_dir here. This is because /sys/fs/cgroup
|
||||
+ * is a pseudo file system, we can only remove directory, but can't remove regular
|
||||
+ * file. */
|
||||
+ let read_dir = match cg_path.read_dir() {
|
||||
Err(e) => {
|
||||
- log::debug!(
|
||||
- "remove dir failed:{:?}, err: {}",
|
||||
- abs_cg_path,
|
||||
- e.to_string()
|
||||
- );
|
||||
+ log::error!("Failed to read dir: {:?}", cg_path);
|
||||
+ return Err(Error::Io { source: e });
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ for entry in read_dir {
|
||||
+ let entry = match entry {
|
||||
+ Err(e) => {
|
||||
+ log::error!("Failed to get directory entry: {e}");
|
||||
+ return Err(Error::Io { source: e });
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ let entry_file_type = match entry.file_type() {
|
||||
+ Err(e) => {
|
||||
+ log::error!(
|
||||
+ "Failed to geth the file type of {:?}: {e}",
|
||||
+ entry.file_name()
|
||||
+ );
|
||||
+ return Err(Error::Io { source: e });
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if !entry_file_type.is_dir() {
|
||||
+ continue;
|
||||
}
|
||||
+ remove_dir(&entry.path())?;
|
||||
}
|
||||
|
||||
- Ok(())
|
||||
+ /* Sometimes there are still tasks in cg_path, and rmdir will return EBUSY,
|
||||
+ * we wait 10 us for 10 times. */
|
||||
+ let mut try_times = 0;
|
||||
+ loop {
|
||||
+ let e = match fs::remove_dir(cg_path) {
|
||||
+ Ok(()) => return Ok(()),
|
||||
+ Err(e) => e,
|
||||
+ };
|
||||
+ let os_errno = match e.raw_os_error() {
|
||||
+ None => return Err(Error::Io { source: e }),
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ if os_errno == nix::libc::EBUSY && try_times < 10 {
|
||||
+ std::thread::sleep(std::time::Duration::from_micros(10));
|
||||
+ try_times += 1;
|
||||
+ continue;
|
||||
+ }
|
||||
+ return Err(Error::Io { source: e });
|
||||
+ }
|
||||
}
|
||||
|
||||
fn cg_kill_process(
|
||||
@@ -291,11 +335,9 @@ pub fn cg_kill_recursive(
|
||||
cg_kill(cg_path, signal, flags, pids)?;
|
||||
|
||||
if flags.contains(CgFlags::REMOVE) {
|
||||
- match remove_dir(cg_path) {
|
||||
- Ok(_) => {}
|
||||
- Err(e) => {
|
||||
- return Err(e);
|
||||
- }
|
||||
+ let abs_cg_path = cg_abs_path(cg_path, &PathBuf::from(""))?;
|
||||
+ if let Err(e) = remove_dir(&abs_cg_path) {
|
||||
+ return Err(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,7 +687,7 @@ mod tests {
|
||||
return;
|
||||
};
|
||||
|
||||
- let cg_path = PathBuf::from("system.slice");
|
||||
+ let cg_path = PathBuf::from("sysmaster-test.slice");
|
||||
let ret = super::cg_create(&cg_path);
|
||||
assert!(ret.is_ok());
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,168 +0,0 @@
|
||||
From 911a991c592cddda0dd7827e8d42277b1fda43cc Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Tue, 11 Jul 2023 20:40:39 +0800
|
||||
Subject: [PATCH] fix: make the help information clearer
|
||||
|
||||
---
|
||||
core/sctl/main.rs | 82 ++++++++++++++++++++++++++++-------------------
|
||||
1 file changed, 49 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/core/sctl/main.rs b/core/sctl/main.rs
|
||||
index 664db62..10e9ae8 100644
|
||||
--- a/core/sctl/main.rs
|
||||
+++ b/core/sctl/main.rs
|
||||
@@ -36,102 +36,118 @@ struct Args {
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
enum SubCmd {
|
||||
- /// [units] start the units
|
||||
+ /// [unit] Isolate one or more units
|
||||
#[clap(display_order = 1)]
|
||||
- Start {
|
||||
+ Isolate {
|
||||
#[clap(required = true)]
|
||||
units: Vec<String>,
|
||||
},
|
||||
|
||||
- /// [units] stop the units
|
||||
+ /// [unit] Reload one or more units
|
||||
#[clap(display_order = 2)]
|
||||
- Stop {
|
||||
+ Reload {
|
||||
#[clap(required = true)]
|
||||
units: Vec<String>,
|
||||
},
|
||||
|
||||
- /// [units] restart the units
|
||||
+ /// [unit] Reset the failed state of one or more units
|
||||
#[clap(display_order = 3)]
|
||||
- Restart { units: Vec<String> },
|
||||
+ ResetFailed {
|
||||
+ #[clap(required = true)]
|
||||
+ units: Vec<String>,
|
||||
+ },
|
||||
|
||||
- /// [units] status of the units
|
||||
+ /// [unit] Restart one or more units
|
||||
#[clap(display_order = 4)]
|
||||
- Status {
|
||||
+ Restart {
|
||||
#[clap(required = true)]
|
||||
units: Vec<String>,
|
||||
},
|
||||
|
||||
- /// [units] reload the units
|
||||
+ /// [unit] Show the status of one or more units
|
||||
#[clap(display_order = 5)]
|
||||
- Reload {
|
||||
+ Status {
|
||||
#[clap(required = true)]
|
||||
units: Vec<String>,
|
||||
},
|
||||
|
||||
- /// [units] isolate the units
|
||||
- Isolate {
|
||||
+ /// [unit] Start one or more units
|
||||
+ #[clap(display_order = 6)]
|
||||
+ Start {
|
||||
#[clap(required = true)]
|
||||
units: Vec<String>,
|
||||
},
|
||||
|
||||
- /// [units] reset the failed units
|
||||
- ResetFailed {
|
||||
+ /// [unit] Stop one or more units
|
||||
+ #[clap(display_order = 7)]
|
||||
+ Stop {
|
||||
#[clap(required = true)]
|
||||
units: Vec<String>,
|
||||
},
|
||||
|
||||
- /// [manager] list all units
|
||||
+ /// [manager] Reload sysmaster manager configuration
|
||||
+ #[clap(display_order = 8)]
|
||||
+ DaemonReload {},
|
||||
+
|
||||
+ /// [manager] Reexecute sysmaster manager
|
||||
+ #[clap(display_order = 9)]
|
||||
+ DaemonReexec {},
|
||||
+
|
||||
+ /// [manager] List all units
|
||||
+ #[clap(display_order = 10)]
|
||||
ListUnits {},
|
||||
|
||||
- /// [system] shutdown the system
|
||||
- Shutdown {
|
||||
+ /// [system] Halt the system
|
||||
+ #[clap(display_order = 11)]
|
||||
+ Halt {
|
||||
#[clap(short, required = false)]
|
||||
force: bool,
|
||||
},
|
||||
|
||||
- /// [system] reboot the system
|
||||
- Reboot {
|
||||
+ /// [system] Poweroff the system
|
||||
+ #[clap(display_order = 12)]
|
||||
+ Poweroff {
|
||||
#[clap(short, required = false)]
|
||||
force: bool,
|
||||
},
|
||||
|
||||
- /// [system] halt the system
|
||||
- Halt {
|
||||
+ /// [system] Reboot the system
|
||||
+ #[clap(display_order = 13)]
|
||||
+ Reboot {
|
||||
#[clap(short, required = false)]
|
||||
force: bool,
|
||||
},
|
||||
|
||||
- /// [system] poweroff the system
|
||||
- Poweroff {
|
||||
+ /// [system] Shutdown the system
|
||||
+ #[clap(display_order = 14)]
|
||||
+ Shutdown {
|
||||
#[clap(short, required = false)]
|
||||
force: bool,
|
||||
},
|
||||
|
||||
- /// [manager] Reload sysmaster manager configuration
|
||||
- DaemonReload {},
|
||||
-
|
||||
- /// [manager] Reexecute sysmaster manager
|
||||
- DaemonReexec {},
|
||||
-
|
||||
- /// enable one unit file
|
||||
+ /// [unit-file] Enable one or more units
|
||||
+ #[clap(display_order = 15)]
|
||||
Enable {
|
||||
#[clap(required = true)]
|
||||
unit_file: Vec<String>,
|
||||
},
|
||||
|
||||
- /// enable one unit file
|
||||
+ /// [unit-file] Disable one or more units
|
||||
+ #[clap(display_order = 16)]
|
||||
Disable {
|
||||
#[clap(required = true)]
|
||||
unit_file: Vec<String>,
|
||||
},
|
||||
|
||||
- // mask one unit file
|
||||
+ /// [unit-file] Mask one or more units
|
||||
+ #[clap(display_order = 17)]
|
||||
Mask {
|
||||
#[clap(required = true)]
|
||||
unit_file: Vec<String>,
|
||||
},
|
||||
|
||||
- // unmask one unit file
|
||||
+ /// [unit-file] Unmask one or more units
|
||||
+ #[clap(display_order = 18)]
|
||||
Unmask {
|
||||
#[clap(required = true)]
|
||||
unit_file: Vec<String>,
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,59 +0,0 @@
|
||||
From 0240f960850290f08b8dbdd11492a7010fc97e0b Mon Sep 17 00:00:00 2001
|
||||
From: Yangyang Shen <shenyy1994@163.com>
|
||||
Date: Tue, 27 Jun 2023 19:03:01 +0800
|
||||
Subject: [PATCH] fix: modify units for sctl enable
|
||||
|
||||
---
|
||||
units/sshd-keygen@ecdsa.service | 3 +++
|
||||
units/sshd-keygen@ed25519.service | 3 +++
|
||||
units/sshd-keygen@rsa.service | 3 +++
|
||||
units/sshd.service | 3 +++
|
||||
4 files changed, 12 insertions(+)
|
||||
|
||||
diff --git a/units/sshd-keygen@ecdsa.service b/units/sshd-keygen@ecdsa.service
|
||||
index a690fe1..8202d24 100644
|
||||
--- a/units/sshd-keygen@ecdsa.service
|
||||
+++ b/units/sshd-keygen@ecdsa.service
|
||||
@@ -6,3 +6,6 @@ ConditionFileNotEmpty="|!/etc/ssh/ssh_host_ecdsa_key"
|
||||
Type="oneshot"
|
||||
EnvironmentFile="-/etc/sysconfig/sshd"
|
||||
ExecStart="/usr/libexec/openssh/sshd-keygen ecdsa"
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy="sshd-keygen.target"
|
||||
diff --git a/units/sshd-keygen@ed25519.service b/units/sshd-keygen@ed25519.service
|
||||
index 30237d3..7f4dd31 100644
|
||||
--- a/units/sshd-keygen@ed25519.service
|
||||
+++ b/units/sshd-keygen@ed25519.service
|
||||
@@ -6,3 +6,6 @@ ConditionFileNotEmpty="|!/etc/ssh/ssh_host_ed25519_key"
|
||||
Type="oneshot"
|
||||
EnvironmentFile="-/etc/sysconfig/sshd"
|
||||
ExecStart="/usr/libexec/openssh/sshd-keygen ed25519"
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy="sshd-keygen.target"
|
||||
diff --git a/units/sshd-keygen@rsa.service b/units/sshd-keygen@rsa.service
|
||||
index 209edff..a30a1e5 100644
|
||||
--- a/units/sshd-keygen@rsa.service
|
||||
+++ b/units/sshd-keygen@rsa.service
|
||||
@@ -6,3 +6,6 @@ ConditionFileNotEmpty="|!/etc/ssh/ssh_host_rsa_key"
|
||||
Type="oneshot"
|
||||
EnvironmentFile="-/etc/sysconfig/sshd"
|
||||
ExecStart="/usr/libexec/openssh/sshd-keygen rsa"
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy="sshd-keygen.target"
|
||||
diff --git a/units/sshd.service b/units/sshd.service
|
||||
index 762b8bb..7779e4e 100644
|
||||
--- a/units/sshd.service
|
||||
+++ b/units/sshd.service
|
||||
@@ -12,3 +12,6 @@ ExecReload="/bin/kill -HUP $MAINPID"
|
||||
KillMode="process"
|
||||
Restart="on-failure"
|
||||
RestartSec=42
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy="multi-user.target"
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,185 +0,0 @@
|
||||
From 8c8d9b46e84b4c33afb6a3356e660aaca915ce88 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Sun, 25 Jun 2023 15:06:52 +0800
|
||||
Subject: [PATCH] fix: remove unit_obj_create_default, we never use it
|
||||
|
||||
---
|
||||
core/bin/plugin/mod.rs | 120 +++++++++++++++++++++--------------------
|
||||
core/lib/unit/base.rs | 18 -------
|
||||
2 files changed, 62 insertions(+), 76 deletions(-)
|
||||
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/bin/plugin/mod.rs
|
||||
index 0b67f74..69bf8b8 100644
|
||||
--- a/core/bin/plugin/mod.rs
|
||||
+++ b/core/bin/plugin/mod.rs
|
||||
@@ -62,10 +62,6 @@ use walkdir::{DirEntry, WalkDir};
|
||||
|
||||
const LIB_PLUGIN_PATH: &str = "/usr/lib/sysmaster/plugin/";
|
||||
|
||||
-const CONSTRUCTOR_NAME_DEFAULT: &[u8; 25] = b"__unit_obj_create_default";
|
||||
-
|
||||
-const CONSTRUCTOR_NAME_WITH_PARAM: &[u8; 29] = b"__unit_obj_create_with_params";
|
||||
-
|
||||
static INSTANCE: Lazy<Arc<Plugin>> = Lazy::new(|| {
|
||||
let plugin = Plugin::new();
|
||||
let default_lib_path = Plugin::get_default_libpath();
|
||||
@@ -293,65 +289,73 @@ impl Plugin {
|
||||
filename: &OsStr,
|
||||
reload_handler: &mut dynamic_reload::DynamicReload,
|
||||
) -> Result<()> {
|
||||
- if let Some(v) = filename.to_str() {
|
||||
- let unit_type = self.get_unit_type(v);
|
||||
- if unit_type == UnitType::UnitTypeInvalid {
|
||||
- log::error!("lib name {} is invalid, skip it", v);
|
||||
+ let v = match filename.to_str() {
|
||||
+ None => return Ok(()),
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ let unit_type = self.get_unit_type(v);
|
||||
+ if unit_type == UnitType::UnitTypeInvalid {
|
||||
+ log::error!("lib name {} is invalid, skipping", v);
|
||||
+ return Ok(());
|
||||
+ }
|
||||
+
|
||||
+ let lib = match unsafe { reload_handler.add_library(v, dynamic_reload::PlatformName::No) } {
|
||||
+ Err(e) => {
|
||||
+ error!("Unable to loading dynamic lib, err {:?}", e);
|
||||
return Ok(());
|
||||
}
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
|
||||
- match unsafe { reload_handler.add_library(v, dynamic_reload::PlatformName::No) } {
|
||||
- Ok(lib) => {
|
||||
- #[allow(clippy::type_complexity)]
|
||||
- let symunit: Result<Symbol<fn() -> *mut dyn SubUnit>> = unsafe {
|
||||
- lib.lib
|
||||
- .get(CONSTRUCTOR_NAME_DEFAULT)
|
||||
- .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
- };
|
||||
- if symunit.is_err() {
|
||||
- log::warn!("Lib {} not contain __unit_obj_create_default try __unit_obj_create_with_params", v);
|
||||
- type SymType = fn(
|
||||
- um: Rc<dyn UmIf>,
|
||||
- level: LevelFilter,
|
||||
- target: &str,
|
||||
- file: &str,
|
||||
- ) -> *mut dyn SubUnit;
|
||||
- #[allow(clippy::type_complexity)]
|
||||
- let symunit: Result<Symbol<SymType>> = unsafe {
|
||||
- lib.lib
|
||||
- .get(CONSTRUCTOR_NAME_WITH_PARAM)
|
||||
- .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
- };
|
||||
- if symunit.is_err() {
|
||||
- log::error!("Lib {} not contain __unit_obj_create_default and __unit_obj_create_with_params skip it", v);
|
||||
- return Ok(());
|
||||
- }
|
||||
- }
|
||||
+ /* We need the lib*.so pass SubUnit and UnitManagerObj to sysmaster-core, and we check if
|
||||
+ * subunit_create_with_params and um_obj_create exists in lib*.so, because these two funs
|
||||
+ * will be used to generate SubUnit and UnitManagerObj. */
|
||||
|
||||
- #[allow(clippy::type_complexity)]
|
||||
- let symum: Result<
|
||||
- Symbol<
|
||||
- fn(level: LevelFilter, target: &str, file: &str) -> *mut dyn SubUnit,
|
||||
- >,
|
||||
- > = unsafe {
|
||||
- lib.lib
|
||||
- .get(b"__um_obj_create")
|
||||
- .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
- };
|
||||
- if symum.is_err() {
|
||||
- log::error!("Lib {} not contain __um_obj_create sym um skip it", v);
|
||||
- return Ok(());
|
||||
- }
|
||||
- log::debug!("Insert unit {:?} dynamic lib into libs", unit_type);
|
||||
- {
|
||||
- let mut wloadlibs = self.load_libs.write().unwrap();
|
||||
- (*wloadlibs).insert(unit_type, lib.clone());
|
||||
- }
|
||||
- log::info!("loading dynamic lib successful");
|
||||
- }
|
||||
- Err(e) => error!("Unable to loading dynamic lib, err {:?}", e),
|
||||
- }
|
||||
+ type FnTypeSubUnit = fn(um: Rc<dyn UmIf>) -> *mut dyn SubUnit;
|
||||
+ type FnTypeUnitManagerObj = fn(
|
||||
+ um: Rc<dyn UmIf>,
|
||||
+ level: LevelFilter,
|
||||
+ target: &str,
|
||||
+ file_path: &str,
|
||||
+ file_size: u32,
|
||||
+ file_number: u32,
|
||||
+ ) -> *mut dyn UnitManagerObj;
|
||||
+
|
||||
+ /* 1. check if the lib contains __subunit_create_with_params */
|
||||
+ #[allow(clippy::type_complexity)]
|
||||
+ let symunit: Result<Symbol<FnTypeSubUnit>> = unsafe {
|
||||
+ lib.lib
|
||||
+ .get(b"__subunit_create_with_params")
|
||||
+ .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
+ };
|
||||
+
|
||||
+ if symunit.is_err() {
|
||||
+ log::error!(
|
||||
+ "Lib {} doesn't contain __subunit_create_with_params, skipping",
|
||||
+ v
|
||||
+ );
|
||||
+ return Ok(());
|
||||
}
|
||||
+
|
||||
+ /* 2. check if the lib contains __um_obj_create */
|
||||
+ #[allow(clippy::type_complexity)]
|
||||
+ let symum: Result<Symbol<FnTypeUnitManagerObj>> = unsafe {
|
||||
+ lib.lib
|
||||
+ .get(b"__um_obj_create")
|
||||
+ .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
+ };
|
||||
+ if symum.is_err() {
|
||||
+ log::error!("Lib {} doesn't contain __um_obj_create, skipping", v);
|
||||
+ return Ok(());
|
||||
+ }
|
||||
+
|
||||
+ /* 3. Insert */
|
||||
+ log::debug!("Inserting {:?} dynamic lib", unit_type);
|
||||
+ let mut wloadlibs = self.load_libs.write().unwrap();
|
||||
+ (*wloadlibs).insert(unit_type, lib.clone());
|
||||
+ log::info!("Successfully loaded dynamic lib");
|
||||
+
|
||||
Ok(())
|
||||
}
|
||||
|
||||
diff --git a/core/lib/unit/base.rs b/core/lib/unit/base.rs
|
||||
index 8aea031..20f8c91 100644
|
||||
--- a/core/lib/unit/base.rs
|
||||
+++ b/core/lib/unit/base.rs
|
||||
@@ -168,24 +168,6 @@ pub trait SubUnit: ReStation + UnitMngUtil {
|
||||
}
|
||||
}
|
||||
|
||||
-/// #[macro_use]
|
||||
-/// the macro for create a sub unit instance
|
||||
-#[macro_export]
|
||||
-macro_rules! declure_unitobj_plugin_default {
|
||||
- ($unit_type:ty, $constructor:path, $name:expr, $level:expr) => {
|
||||
- /// method for create the unit instance
|
||||
- #[no_mangle]
|
||||
- pub fn __unit_obj_create_default() -> *mut dyn $crate::unit::SubUnit {
|
||||
- logger::init_log_for_subum($name, $level, "console", "");
|
||||
- let construcotr: fn() -> $unit_type = $constructor;
|
||||
-
|
||||
- let obj = construcotr();
|
||||
- let boxed: Box<dyn $crate::unit::SubUnit> = Box::new(obj);
|
||||
- Box::into_raw(boxed)
|
||||
- }
|
||||
- };
|
||||
-}
|
||||
-
|
||||
/// #[macro_use]
|
||||
/// the macro for create a sub unit instance with dyn ref of UmIf,
|
||||
/// which sub unit wants invoke um interface, about UmIf see doc of UmIf
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
From f7d19b466e118cf2f6e322ab989fa3f91f5f8e2b Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 3 Jul 2023 15:42:44 +0800
|
||||
Subject: [PATCH] fix: rename config.service.toml to config.service
|
||||
|
||||
Now we don't need the file's extension be .toml, rename it. also delete config.service.toml
|
||||
from our git repo
|
||||
---
|
||||
coms/service/src/config.rs | 2 +-
|
||||
coms/service/src/mng.rs | 2 +-
|
||||
core/bin/unit/entry/config.rs | 2 +-
|
||||
libs/libtests/src/lib.rs | 2 +-
|
||||
tests/test_units/config.service.toml | 19 -------------------
|
||||
5 files changed, 4 insertions(+), 23 deletions(-)
|
||||
delete mode 100644 tests/test_units/config.service.toml
|
||||
|
||||
diff --git a/coms/service/src/config.rs b/coms/service/src/config.rs
|
||||
index 3b7eb43..aa62b00 100644
|
||||
--- a/coms/service/src/config.rs
|
||||
+++ b/coms/service/src/config.rs
|
||||
@@ -190,7 +190,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_service_parse() {
|
||||
let mut file_path = get_project_root().unwrap();
|
||||
- file_path.push("tests/test_units/config.service.toml");
|
||||
+ file_path.push("tests/test_units/config.service");
|
||||
|
||||
let paths = vec![file_path];
|
||||
|
||||
diff --git a/coms/service/src/mng.rs b/coms/service/src/mng.rs
|
||||
index bfa2c9f..4bf20bd 100644
|
||||
--- a/coms/service/src/mng.rs
|
||||
+++ b/coms/service/src/mng.rs
|
||||
@@ -2542,7 +2542,7 @@ mod tests {
|
||||
|
||||
fn create_mng() -> (Rc<ServiceMng>, Rc<RunningData>, Rc<ServiceConfig>) {
|
||||
let mut file_path = get_project_root().unwrap();
|
||||
- file_path.push("tests/test_units/config.service.toml");
|
||||
+ file_path.push("tests/test_units/config.service");
|
||||
let paths = vec![file_path];
|
||||
|
||||
let comm = Rc::new(ServiceUnitComm::new());
|
||||
diff --git a/core/bin/unit/entry/config.rs b/core/bin/unit/entry/config.rs
|
||||
index 91313c4..ceead3c 100644
|
||||
--- a/core/bin/unit/entry/config.rs
|
||||
+++ b/core/bin/unit/entry/config.rs
|
||||
@@ -204,7 +204,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_unit_parse() {
|
||||
let mut file_path = get_project_root().unwrap();
|
||||
- file_path.push("test_units/config.service.toml");
|
||||
+ file_path.push("test_units/config.service");
|
||||
|
||||
let mut builder = UeConfigData::builder().env();
|
||||
builder = builder.file(&file_path);
|
||||
diff --git a/libs/libtests/src/lib.rs b/libs/libtests/src/lib.rs
|
||||
index 260d7f8..c795fca 100644
|
||||
--- a/libs/libtests/src/lib.rs
|
||||
+++ b/libs/libtests/src/lib.rs
|
||||
@@ -47,7 +47,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_get_project_root() {
|
||||
let mut file_path = get_project_root().unwrap();
|
||||
- file_path.push("tests/test_units/config.service.toml");
|
||||
+ file_path.push("tests/test_units/config.service");
|
||||
|
||||
println!("{file_path:?}");
|
||||
assert!(file_path.is_file())
|
||||
diff --git a/tests/test_units/config.service.toml b/tests/test_units/config.service.toml
|
||||
deleted file mode 100644
|
||||
index 8c56508..0000000
|
||||
--- a/tests/test_units/config.service.toml
|
||||
+++ /dev/null
|
||||
@@ -1,19 +0,0 @@
|
||||
-[Unit]
|
||||
-Description="CN"
|
||||
-Documentation="192.168.1.1"
|
||||
-Requires="test.service"
|
||||
-
|
||||
-[Service]
|
||||
-Type="Simple"
|
||||
-ExecCondition="/usr/bin/sleep 5"
|
||||
-ExecStartPre="/usr/bin/echo test"
|
||||
-ExecStart="/bin/echo 'test'"
|
||||
-ExecStop="/bin/kill $MAINPID"
|
||||
-WatchdogSec=10
|
||||
-Restart="always"
|
||||
-RestartPreventExitStatus="1 2 SIGKILL"
|
||||
-RestartSec=5
|
||||
-
|
||||
-
|
||||
-[Install]
|
||||
-WantedBy="dbus.service"
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,233 +0,0 @@
|
||||
From d497414fec2b8e5b4a242f32b740113cd49b8398 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Sun, 25 Jun 2023 15:05:14 +0800
|
||||
Subject: [PATCH] fix: rename create_unit_obj_with_um to
|
||||
create_subunit_with_um, rename __unit_obj_create_with_params to
|
||||
__subunit_create_with_params, and we don't need to init logger when creating
|
||||
subunit, because we have already done that when we create UnitManagerObj
|
||||
|
||||
---
|
||||
coms/service/src/unit.rs | 4 +--
|
||||
coms/target/src/unit.rs | 4 +--
|
||||
core/bin/plugin/mod.rs | 66 +++++++++++++++++++----------------
|
||||
core/bin/unit/entry/uentry.rs | 2 +-
|
||||
core/bin/unit/test/mod.rs | 2 +-
|
||||
core/bin/unit/uload.rs | 11 +++---
|
||||
core/lib/unit/base.rs | 9 ++---
|
||||
9 files changed, 49 insertions(+), 58 deletions(-)
|
||||
|
||||
diff --git a/coms/service/src/unit.rs b/coms/service/src/unit.rs
|
||||
index a4f6a79..2a217d4 100644
|
||||
--- a/coms/service/src/unit.rs
|
||||
+++ b/coms/service/src/unit.rs
|
||||
@@ -12,13 +12,11 @@
|
||||
|
||||
use crate::rentry::ServiceRestart;
|
||||
|
||||
-use super::base::PLUGIN_NAME;
|
||||
use super::comm::ServiceUnitComm;
|
||||
use super::config::ServiceConfig;
|
||||
use super::mng::RunningData;
|
||||
use super::mng::ServiceMng;
|
||||
use super::rentry::{NotifyAccess, ServiceCommand, ServiceType};
|
||||
-use basic::logger;
|
||||
use basic::special::{BASIC_TARGET, SHUTDOWN_TARGET, SYSINIT_TARGET};
|
||||
use nix::sys::signal::Signal;
|
||||
use nix::sys::socket::UnixCredentials;
|
||||
@@ -414,4 +412,4 @@ impl ServiceUnit {
|
||||
}*/
|
||||
|
||||
use sysmaster::declure_unitobj_plugin_with_param;
|
||||
-declure_unitobj_plugin_with_param!(ServiceUnit, ServiceUnit::new, PLUGIN_NAME);
|
||||
+declure_unitobj_plugin_with_param!(ServiceUnit, ServiceUnit::new);
|
||||
diff --git a/coms/target/src/unit.rs b/coms/target/src/unit.rs
|
||||
index e4caf5d..bcd97c7 100644
|
||||
--- a/coms/target/src/unit.rs
|
||||
+++ b/coms/target/src/unit.rs
|
||||
@@ -15,10 +15,8 @@
|
||||
//! Trait UnitObj defines the behavior of the sub unit.
|
||||
//! Trait UnitMngUtil is used to attach the Unitmanager to the sub unit.
|
||||
//! Trait UnitSubClass implement the convert from sub unit to UnitObj.
|
||||
-use super::base::PLUGIN_NAME;
|
||||
use super::comm::TargetUnitComm;
|
||||
use super::mng::TargetMng;
|
||||
-use basic::logger;
|
||||
use nix::sys::wait::WaitStatus;
|
||||
use std::{path::PathBuf, rc::Rc};
|
||||
use sysmaster::error::*;
|
||||
@@ -193,4 +191,4 @@ impl UnitMngUtil for Target {
|
||||
}*/
|
||||
|
||||
use sysmaster::declure_unitobj_plugin_with_param;
|
||||
-declure_unitobj_plugin_with_param!(Target, Target::new, PLUGIN_NAME);
|
||||
+declure_unitobj_plugin_with_param!(Target, Target::new);
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/bin/plugin/mod.rs
|
||||
index a8f6f24..0b67f74 100644
|
||||
--- a/core/bin/plugin/mod.rs
|
||||
+++ b/core/bin/plugin/mod.rs
|
||||
@@ -430,43 +430,47 @@ impl Plugin {
|
||||
}
|
||||
}
|
||||
|
||||
- /// Create a obj for subclasses of unit
|
||||
+ /// Create the subunit trait of unit
|
||||
/// each sub unit need reference of declure_unitobj_plugin_with_param
|
||||
///
|
||||
- pub fn create_unit_obj_with_um(
|
||||
+ pub fn create_subunit_with_um(
|
||||
&self,
|
||||
unit_type: UnitType,
|
||||
um: Rc<dyn UmIf>,
|
||||
) -> Result<Box<dyn SubUnit>> {
|
||||
- type SymType =
|
||||
- fn(um: Rc<dyn UmIf>, level: LevelFilter, target: &str, file: &str) -> *mut dyn SubUnit;
|
||||
- match self.get_lib(unit_type) {
|
||||
- Ok(dy_lib) => {
|
||||
- let sym: Result<Symbol<SymType>> = unsafe {
|
||||
- dy_lib
|
||||
- .lib
|
||||
- .get(CONSTRUCTOR_NAME_WITH_PARAM)
|
||||
- .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
- };
|
||||
- log::debug!(
|
||||
- "create unit obj with param level filter: {:?}",
|
||||
- log::max_level()
|
||||
- );
|
||||
- let target = um.get_log_target();
|
||||
- let file = um.get_log_file();
|
||||
- if let Ok(fun) = sym {
|
||||
- let boxed_raw = fun(um.clone(), log::max_level(), target, file);
|
||||
- Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
- } else {
|
||||
- Err(Error::PluginLoad {
|
||||
- msg: format!("The library of {:?} is {:?}", unit_type, sym.err()),
|
||||
- })
|
||||
- }
|
||||
+ type FnType = fn(um: Rc<dyn UmIf>) -> *mut dyn SubUnit;
|
||||
+
|
||||
+ let dy_lib = match self.get_lib(unit_type) {
|
||||
+ Err(_) => {
|
||||
+ return Err(Error::PluginLoad {
|
||||
+ msg: format!("create unit, the {unit_type:?} plugin is not exist"),
|
||||
+ })
|
||||
}
|
||||
- Err(_) => Err(Error::PluginLoad {
|
||||
- msg: format!("create unit, the {unit_type:?} plugin is not exist"),
|
||||
- }),
|
||||
- }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ let sym: Result<Symbol<FnType>> = unsafe {
|
||||
+ dy_lib
|
||||
+ .lib
|
||||
+ .get(b"__subunit_create_with_params")
|
||||
+ .map_err(|e| Error::PluginLoad { msg: e.to_string() })
|
||||
+ };
|
||||
+
|
||||
+ let fun = match sym {
|
||||
+ Err(_) => {
|
||||
+ return Err(Error::PluginLoad {
|
||||
+ msg: format!("The library of {:?} is {:?}", unit_type, sym.err()),
|
||||
+ })
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ log::debug!(
|
||||
+ "create unit obj with param level filter: {:?}",
|
||||
+ log::max_level()
|
||||
+ );
|
||||
+ let boxed_raw = fun(um.clone());
|
||||
+ Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
}
|
||||
/// Create a obj for subclasses of unit manager
|
||||
/// each sub unit manager need reference of declure_umobj_plugin
|
||||
@@ -583,7 +587,7 @@ mod tests {
|
||||
fn test_plugin_create_unit() {
|
||||
let plugin = init_test();
|
||||
let umifd = Rc::new(UmIfD);
|
||||
- let unitobj = plugin.create_unit_obj_with_um(UnitType::UnitService, umifd);
|
||||
+ let unitobj = plugin.create_subunit_with_um(UnitType::UnitService, umifd);
|
||||
assert!(
|
||||
unitobj.is_ok(),
|
||||
"create unit [{:?}] failed",
|
||||
diff --git a/core/bin/unit/entry/uentry.rs b/core/bin/unit/entry/uentry.rs
|
||||
index 44a4af8..45f0e57 100644
|
||||
--- a/core/bin/unit/entry/uentry.rs
|
||||
+++ b/core/bin/unit/entry/uentry.rs
|
||||
@@ -791,7 +791,7 @@ mod tests {
|
||||
let plugin = Plugin::get_instance();
|
||||
let umifd = Rc::new(UmIfD);
|
||||
let sub_obj = plugin
|
||||
- .create_unit_obj_with_um(UnitType::UnitService, umifd.clone())
|
||||
+ .create_subunit_with_um(UnitType::UnitService, umifd.clone())
|
||||
.unwrap();
|
||||
sub_obj.attach_um(umifd);
|
||||
sub_obj.attach_reli(Rc::clone(&reli));
|
||||
diff --git a/core/bin/unit/test/mod.rs b/core/bin/unit/test/mod.rs
|
||||
index 1fc1965..8f2d120 100644
|
||||
--- a/core/bin/unit/test/mod.rs
|
||||
+++ b/core/bin/unit/test/mod.rs
|
||||
@@ -39,7 +39,7 @@ pub(crate) mod test_utils {
|
||||
let unit_type = unit_name_to_type(name);
|
||||
let umifd = Rc::new(UmIfD);
|
||||
let plugins = Plugin::get_instance();
|
||||
- let subclass = plugins.create_unit_obj_with_um(unit_type, umifd).unwrap();
|
||||
+ let subclass = plugins.create_subunit_with_um(unit_type, umifd).unwrap();
|
||||
subclass.attach_reli(Rc::clone(relir));
|
||||
Rc::new(UnitX::new(dmr, rentryr, &file, unit_type, name, subclass))
|
||||
}
|
||||
diff --git a/core/bin/unit/uload.rs b/core/bin/unit/uload.rs
|
||||
index d6fea43..382b2c0 100644
|
||||
--- a/core/bin/unit/uload.rs
|
||||
+++ b/core/bin/unit/uload.rs
|
||||
@@ -157,14 +157,13 @@ impl UnitLoadData {
|
||||
return None;
|
||||
}
|
||||
|
||||
- log::info!(
|
||||
- "begin create obj for type {:?}, name {} by plugin",
|
||||
- unit_type,
|
||||
- name
|
||||
- );
|
||||
let um = self.um();
|
||||
let um_rc = Rc::clone(&um);
|
||||
- let subclass = match Plugin::get_instance().create_unit_obj_with_um(unit_type, um_rc) {
|
||||
+ log::info!(
|
||||
+ "Creating SubUnit for {:?}: {name} by __subunit_create_with_params()",
|
||||
+ unit_type
|
||||
+ );
|
||||
+ let subclass = match Plugin::get_instance().create_subunit_with_um(unit_type, um_rc) {
|
||||
Ok(sub) => sub,
|
||||
Err(_e) => {
|
||||
log::error!("Failed to create unit_obj!{}", _e);
|
||||
diff --git a/core/lib/unit/base.rs b/core/lib/unit/base.rs
|
||||
index 555bb69..8aea031 100644
|
||||
--- a/core/lib/unit/base.rs
|
||||
+++ b/core/lib/unit/base.rs
|
||||
@@ -191,19 +191,14 @@ macro_rules! declure_unitobj_plugin_default {
|
||||
/// which sub unit wants invoke um interface, about UmIf see doc of UmIf
|
||||
#[macro_export]
|
||||
macro_rules! declure_unitobj_plugin_with_param {
|
||||
- ($unit_type:ty, $constructor:path, $name:expr) => {
|
||||
+ ($unit_type:ty, $constructor:path) => {
|
||||
use log::LevelFilter;
|
||||
/// method for create the unit instance
|
||||
#[no_mangle]
|
||||
- pub fn __unit_obj_create_with_params(
|
||||
+ pub fn __subunit_create_with_params(
|
||||
um: Rc<dyn $crate::unit::UmIf>,
|
||||
- level: LevelFilter,
|
||||
- target: &str,
|
||||
- file: &str,
|
||||
) -> *mut dyn $crate::unit::SubUnit {
|
||||
- logger::init_log_for_subum($name, level, target, file);
|
||||
let construcotr: fn(um: Rc<dyn $crate::unit::UmIf>) -> $unit_type = $constructor;
|
||||
-
|
||||
let obj = construcotr(um);
|
||||
let boxed: Box<dyn $crate::unit::SubUnit> = Box::new(obj);
|
||||
Box::into_raw(boxed)
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
From ec6b1ff816ac6f1f18c441b3ace4069f744cc301 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 3 Jul 2023 16:17:34 +0800
|
||||
Subject: [PATCH] fix: rename system.toml to system.conf
|
||||
|
||||
---
|
||||
config/conf/{system.toml => system.conf} | 0
|
||||
core/bin/manager/config.rs | 22 ++++++++++++++++------
|
||||
5 files changed, 20 insertions(+), 10 deletions(-)
|
||||
rename config/conf/{system.toml => system.conf} (100%)
|
||||
|
||||
diff --git a/config/conf/system.toml b/config/conf/system.conf
|
||||
similarity index 100%
|
||||
rename from config/conf/system.toml
|
||||
rename to config/conf/system.conf
|
||||
diff --git a/core/bin/manager/config.rs b/core/bin/manager/config.rs
|
||||
index 229537f..94f676a 100644
|
||||
--- a/core/bin/manager/config.rs
|
||||
+++ b/core/bin/manager/config.rs
|
||||
@@ -12,9 +12,9 @@
|
||||
//
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
-use confique::Config;
|
||||
+use confique::{Config, FileFormat, Partial};
|
||||
|
||||
-pub const SYSTEM_CONFIG: &str = "/etc/sysmaster/system.toml";
|
||||
+pub const SYSTEM_CONFIG: &str = "/etc/sysmaster/system.conf";
|
||||
const RELI_HISTORY_MAPSIZE_DEFAULT: usize = 1048576; // 1M
|
||||
|
||||
#[derive(Config, Debug)]
|
||||
@@ -40,9 +40,19 @@ pub struct ManagerConfig {
|
||||
impl ManagerConfig {
|
||||
#[allow(dead_code)]
|
||||
pub fn new(file: Option<&str>) -> ManagerConfig {
|
||||
- let builder = ManagerConfig::builder().env();
|
||||
- let manager_config = builder.file(file.unwrap_or(SYSTEM_CONFIG));
|
||||
- match manager_config.load() {
|
||||
+ type ConfigPartial = <ManagerConfig as Config>::Partial;
|
||||
+ let mut partial: ConfigPartial = match Partial::from_env() {
|
||||
+ Err(_) => return ManagerConfig::default(),
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ partial = match confique::File::with_format(file.unwrap_or(SYSTEM_CONFIG), FileFormat::Toml)
|
||||
+ .load()
|
||||
+ {
|
||||
+ Err(_) => return ManagerConfig::default(),
|
||||
+ Ok(v) => partial.with_fallback(v),
|
||||
+ };
|
||||
+ partial = partial.with_fallback(ConfigPartial::default_values());
|
||||
+ match ManagerConfig::from_partial(partial) {
|
||||
Ok(v) => v,
|
||||
Err(_) => ManagerConfig::default(),
|
||||
}
|
||||
@@ -72,7 +82,7 @@ mod test {
|
||||
#[test]
|
||||
fn load() {
|
||||
let mut file: PathBuf = get_crate_root().unwrap();
|
||||
- file.push("config/system.toml");
|
||||
+ file.push("config/system.conf");
|
||||
let config = ManagerConfig::new(file.to_str());
|
||||
println!("{config:?}");
|
||||
assert_eq!(config.DefaultRestartSec, 100);
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,35 +0,0 @@
|
||||
From d41a6113c8c109d3436a0de0329984ebec522da5 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Tue, 11 Jul 2023 17:05:25 +0800
|
||||
Subject: [PATCH] fix: set the notify socket receive buffer to 8M
|
||||
|
||||
---
|
||||
core/sysmaster/unit/notify.rs | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/core/sysmaster/unit/notify.rs b/core/sysmaster/unit/notify.rs
|
||||
index 4f92b63..f35ed91 100644
|
||||
--- a/core/sysmaster/unit/notify.rs
|
||||
+++ b/core/sysmaster/unit/notify.rs
|
||||
@@ -14,7 +14,7 @@ use super::datastore::UnitDb;
|
||||
use super::entry::UnitX;
|
||||
use super::rentry::UnitRe;
|
||||
use crate::job::JobManager;
|
||||
-use basic::fd_util;
|
||||
+use basic::{fd_util, socket_util};
|
||||
use event::{EventState, EventType, Events, Source};
|
||||
use nix::cmsg_space;
|
||||
use nix::errno::Errno;
|
||||
@@ -181,6 +181,9 @@ impl Notify {
|
||||
return Err(e);
|
||||
}
|
||||
socket::setsockopt(fd, sockopt::PassCred, &true)?;
|
||||
+ if let Err(e) = socket_util::set_receive_buffer(fd, 1024 * 1014 * 8) {
|
||||
+ log::error!("Failed to set the notify socket receive buffer: {e}");
|
||||
+ }
|
||||
|
||||
log::debug!("set event fd is: {}", fd);
|
||||
self.reli.fd_cloexec(fd, false)?;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,511 +0,0 @@
|
||||
From 0ce2ca0cfe650b88bccdd8e9b62a9b233e794f34 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 28 Jun 2023 16:35:55 +0800
|
||||
Subject: [PATCH] fix: several fixes on logger
|
||||
|
||||
1. Also use our own logger to log message to console, now log4rs can be removed
|
||||
2. remove 'rolling_file', as it can only save log file in 644, we can't set the mode
|
||||
3. change 'console' to 'console-syslog', when users want to print message to console
|
||||
we will also record the message in syslog
|
||||
4. check the returned value more
|
||||
---
|
||||
core/bin/manager/config.rs | 4 +-
|
||||
libs/basic/src/logger.rs | 311 +++++++++++++++++++++++++------------
|
||||
3 files changed, 215 insertions(+), 109 deletions(-)
|
||||
|
||||
diff --git a/core/bin/manager/config.rs b/core/bin/manager/config.rs
|
||||
index fc4c028..691b692 100644
|
||||
--- a/core/bin/manager/config.rs
|
||||
+++ b/core/bin/manager/config.rs
|
||||
@@ -26,7 +26,7 @@ pub struct ManagerConfig {
|
||||
|
||||
#[config(default = "info")]
|
||||
pub LogLevel: log::LevelFilter,
|
||||
- #[config(default = "console")]
|
||||
+ #[config(default = "syslog")]
|
||||
pub LogTarget: String,
|
||||
#[config(default = "")]
|
||||
pub LogFile: String,
|
||||
@@ -57,7 +57,7 @@ impl Default for ManagerConfig {
|
||||
DefaultRestartSec: 100,
|
||||
DefaultTimeoutSec: 90,
|
||||
LogLevel: log::LevelFilter::Debug,
|
||||
- LogTarget: "console".to_string(),
|
||||
+ LogTarget: "syslog".to_string(),
|
||||
LogFile: String::new(),
|
||||
LogFileSize: 10240,
|
||||
LogFileNumber: 10,
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 06f4ff2..8ee3ffa 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
//!
|
||||
use std::{
|
||||
- fs::{File, OpenOptions},
|
||||
+ fs::{self, File, OpenOptions},
|
||||
io::Write,
|
||||
- os::unix::prelude::OpenOptionsExt,
|
||||
+ os::unix::prelude::{OpenOptionsExt, PermissionsExt},
|
||||
path::{Path, PathBuf},
|
||||
sync::Mutex,
|
||||
};
|
||||
@@ -37,6 +37,8 @@ use log4rs::{
|
||||
use nix::libc;
|
||||
use time::UtcOffset;
|
||||
|
||||
+use crate::Error;
|
||||
+
|
||||
/// sysmaster log parttern:
|
||||
///
|
||||
/// ```rust,ignore
|
||||
@@ -65,6 +67,36 @@ impl log::Log for LogPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
+fn write_msg_common(writer: &mut impl Write, module: &str, msg: String) {
|
||||
+ let now = time::OffsetDateTime::now_utc().to_offset(UtcOffset::UTC);
|
||||
+ let format = time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]");
|
||||
+ let now = match now.format(&format) {
|
||||
+ Err(_) => "[unknown time]".to_string(),
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ /* 1. Write time */
|
||||
+ if let Err(e) = writer.write(format!("{now} ").as_bytes()) {
|
||||
+ println!("Failed to log time message: {e}");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* 2. Write module */
|
||||
+ if let Err(e) = writer.write((module.to_string() + " ").as_bytes()) {
|
||||
+ println!("Failed to log module message: {e}");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* 3. Write message */
|
||||
+ if let Err(e) = writer.write((msg + "\n").as_bytes()) {
|
||||
+ println!("Failed to log message: {e}");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+fn write_msg_file(writer: &mut File, module: &str, msg: String) {
|
||||
+ write_msg_common(writer, module, msg);
|
||||
+}
|
||||
+
|
||||
struct SysLogger;
|
||||
|
||||
/* This is an extremely simple implementation, and only
|
||||
@@ -92,6 +124,25 @@ impl log::Log for SysLogger {
|
||||
fn flush(&self) {}
|
||||
}
|
||||
|
||||
+struct ConsoleLogger;
|
||||
+
|
||||
+impl log::Log for ConsoleLogger {
|
||||
+ fn enabled(&self, _metadata: &log::Metadata) -> bool {
|
||||
+ true
|
||||
+ }
|
||||
+
|
||||
+ fn log(&self, record: &log::Record) {
|
||||
+ let mut stdout = std::io::stdout();
|
||||
+ let module_path = match record.module_path() {
|
||||
+ None => "unknown",
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ write_msg_common(&mut stdout, module_path, record.args().to_string());
|
||||
+ }
|
||||
+
|
||||
+ fn flush(&self) {}
|
||||
+}
|
||||
+
|
||||
struct FileLogger {
|
||||
level: log::Level,
|
||||
file_path: PathBuf,
|
||||
@@ -113,30 +164,55 @@ impl log::Log for FileLogger {
|
||||
}
|
||||
let current_size: u32;
|
||||
{
|
||||
- let mut file = self.file.lock().unwrap();
|
||||
- self.write(
|
||||
- &mut file,
|
||||
- record.module_path().unwrap(),
|
||||
- record.args().to_string(),
|
||||
- );
|
||||
- current_size = file.metadata().unwrap().len() as u32;
|
||||
+ let mut file = match self.file.lock() {
|
||||
+ Err(_) => return,
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ let module_path = match record.module_path() {
|
||||
+ None => "unknown",
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ write_msg_file(&mut file, module_path, record.args().to_string());
|
||||
+ current_size = match file.metadata() {
|
||||
+ Err(_) => return,
|
||||
+ Ok(v) => v.len() as u32,
|
||||
+ };
|
||||
/* file is automatically unlocked. */
|
||||
}
|
||||
if current_size > self.max_size {
|
||||
- self.rotate();
|
||||
- let file = self.file.lock().unwrap();
|
||||
- let _ = file.set_len(0);
|
||||
+ let file = match self.file.lock() {
|
||||
+ Err(_) => return,
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if let Err(e) = self.rotate() {
|
||||
+ println!("Failed to rotate log file: {e}");
|
||||
+ }
|
||||
+ if let Err(e) = file.set_len(0) {
|
||||
+ println!("Failed to clear log file: {e}");
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
fn flush(&self) {
|
||||
- let mut file = self.file.lock().unwrap();
|
||||
- let _ = file.flush();
|
||||
+ let mut file = match self.file.lock() {
|
||||
+ Err(_) => return,
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if let Err(e) = file.flush() {
|
||||
+ println!("Failed to flush log file: {e}");
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
impl FileLogger {
|
||||
fn file_open(file_path: &PathBuf, file_mode: u32) -> File {
|
||||
+ /* Panic if we cann't open a log file. */
|
||||
+ let dir = file_path.parent().unwrap();
|
||||
+ if !dir.exists() {
|
||||
+ fs::create_dir_all(dir).unwrap();
|
||||
+ }
|
||||
+ fs::set_permissions(dir, fs::Permissions::from_mode(0o700)).unwrap();
|
||||
OpenOptions::new()
|
||||
.write(true)
|
||||
.create(true)
|
||||
@@ -146,22 +222,6 @@ impl FileLogger {
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
- fn mv_file_in_dir(src: &str, dst: Option<&str>, dir: &Path) {
|
||||
- let src = dir.join(src);
|
||||
- if dst.is_none() {
|
||||
- let _ = std::fs::remove_file(src);
|
||||
- return;
|
||||
- }
|
||||
- let dst = dir.join(dst.unwrap());
|
||||
- let _ = std::fs::rename(src, dst);
|
||||
- }
|
||||
-
|
||||
- fn cp_file_in_dir(src: &str, dst: &str, dir: &Path) {
|
||||
- let src = dir.join(src);
|
||||
- let dst = dir.join(dst);
|
||||
- let _ = std::fs::copy(src, dst);
|
||||
- }
|
||||
-
|
||||
fn new(
|
||||
level: log::Level,
|
||||
file_path: PathBuf,
|
||||
@@ -180,49 +240,70 @@ impl FileLogger {
|
||||
}
|
||||
}
|
||||
|
||||
- fn write(&self, file: &mut File, module: &str, msg: String) {
|
||||
- let now = time::OffsetDateTime::now_utc().to_offset(UtcOffset::UTC);
|
||||
- let format =
|
||||
- time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]");
|
||||
- let now = now.format(&format).unwrap();
|
||||
-
|
||||
- /* 1. Write time */
|
||||
- if let Err(e) = file.write(format!("{now} ").as_bytes()) {
|
||||
- println!("Failed to log time message: {e}");
|
||||
+ fn mv_file_in_dir(src: &str, dst: Option<&str>, dir: &Path) {
|
||||
+ let src = dir.join(src);
|
||||
+ if dst.is_none() {
|
||||
+ if let Err(e) = fs::remove_file(src) {
|
||||
+ println!("Failed to remove old log file: {e}");
|
||||
+ }
|
||||
return;
|
||||
}
|
||||
-
|
||||
- /* 2. Write module */
|
||||
- if let Err(e) = file.write((module.to_string() + " ").as_bytes()) {
|
||||
- println!("Failed to log module message: {e}");
|
||||
- return;
|
||||
+ let dst = dir.join(dst.unwrap()); /* safe here */
|
||||
+ if let Err(e) = fs::rename(src, dst) {
|
||||
+ println!("Failed to rotate log file: {e}");
|
||||
}
|
||||
+ }
|
||||
|
||||
- /* 3. Write message */
|
||||
- if let Err(e) = file.write((msg + "\n").as_bytes()) {
|
||||
- println!("Failed to log message: {e}");
|
||||
+ fn cp_file_in_dir(src: &str, dst: &str, dir: &Path) {
|
||||
+ let src = dir.join(src);
|
||||
+ let dst = dir.join(dst);
|
||||
+ if let Err(e) = fs::copy(src, &dst) {
|
||||
+ println!("Failed to create sysmaster.log.1: {e}");
|
||||
+ }
|
||||
+ if let Err(e) = fs::set_permissions(dst, fs::Permissions::from_mode(0o400)) {
|
||||
+ println!("Failed to set log file mode: {e}");
|
||||
}
|
||||
}
|
||||
|
||||
- fn rotate(&self) {
|
||||
- let dir = self.file_path.parent().unwrap();
|
||||
- let file_name = self
|
||||
- .file_path
|
||||
- .file_name()
|
||||
- .unwrap()
|
||||
- .to_string_lossy()
|
||||
- .to_string();
|
||||
+ fn rotate(&self) -> Result<(), Error> {
|
||||
+ let dir = match self.file_path.parent() {
|
||||
+ None => {
|
||||
+ return Err(Error::Other {
|
||||
+ msg: "Cannot determine the parent directory of log file".to_string(),
|
||||
+ })
|
||||
+ }
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ let file_name = match self.file_path.file_name() {
|
||||
+ None => {
|
||||
+ return Err(Error::Other {
|
||||
+ msg: "Cannot determine the file name of log file".to_string(),
|
||||
+ })
|
||||
+ }
|
||||
+ Some(v) => v.to_string_lossy().to_string(),
|
||||
+ };
|
||||
let file_name_dot = String::from(&file_name) + ".";
|
||||
- let mut num_list: Vec<usize> = Vec::new();
|
||||
|
||||
- for de in dir.read_dir().unwrap() {
|
||||
+ /* Walk through the parent directory, save the suffix rotate number in num_list */
|
||||
+ let mut num_list: Vec<usize> = Vec::new();
|
||||
+ let read_dir = match dir.read_dir() {
|
||||
+ Err(e) => return Err(Error::Io { source: e }),
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ for de in read_dir {
|
||||
let de = match de {
|
||||
Err(_) => continue,
|
||||
Ok(v) => v,
|
||||
};
|
||||
- if !de.file_type().unwrap().is_file() {
|
||||
+
|
||||
+ let file_type = match de.file_type() {
|
||||
+ Err(_) => continue,
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if !file_type.is_file() {
|
||||
continue;
|
||||
}
|
||||
+
|
||||
let de_file_name = de.file_name().to_string_lossy().to_string();
|
||||
let rotated_num = de_file_name.trim_start_matches(&file_name_dot);
|
||||
let rotated_num = match rotated_num.parse::<usize>() {
|
||||
@@ -238,17 +319,16 @@ impl FileLogger {
|
||||
|
||||
/* 1. delete surplus rotated file */
|
||||
/* We only keep (file_number - 1) rotated files, because we will generate a new one later. */
|
||||
- let file_number = self.file_number as usize;
|
||||
- for rotated_num in num_list.iter().skip(file_number - 1) {
|
||||
- let src = String::from(&file_name_dot) + &rotated_num.to_string();
|
||||
+ while num_list.len() > (self.file_number - 1) as usize {
|
||||
+ let num = num_list.pop().unwrap(); /* safe here */
|
||||
+ let src = String::from(&file_name_dot) + &num.to_string();
|
||||
Self::mv_file_in_dir(&src, None, dir);
|
||||
}
|
||||
|
||||
- let end = std::cmp::min(num_list.len(), file_number);
|
||||
/* 2. {sysmaster.log.1, sysmaster.log.2, ...} => {sysmaster.log.2, sysmaster.log.3, ...} */
|
||||
- for i in (0..end).rev() {
|
||||
- let src = String::from(&file_name_dot) + &num_list[i].to_string();
|
||||
- let dst = String::from(&file_name_dot) + &(num_list[i] + 1).to_string();
|
||||
+ while let Some(num) = num_list.pop() {
|
||||
+ let src = String::from(&file_name_dot) + &num.to_string();
|
||||
+ let dst = String::from(&file_name_dot) + &(num + 1).to_string();
|
||||
Self::mv_file_in_dir(&src, Some(&dst), dir);
|
||||
}
|
||||
|
||||
@@ -256,37 +336,38 @@ impl FileLogger {
|
||||
let src = String::from(&file_name);
|
||||
let dst = String::from(&file_name_dot) + "1";
|
||||
Self::cp_file_in_dir(&src, &dst, dir);
|
||||
+ Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
-fn append_log(
|
||||
- app_name: &str,
|
||||
- level: LevelFilter,
|
||||
- target: &str,
|
||||
- file_path: &str,
|
||||
- file_size: u32,
|
||||
- file_number: u32,
|
||||
-) {
|
||||
- if target == "syslog" {
|
||||
- let _ = log::set_boxed_logger(Box::new(SysLogger));
|
||||
- log::set_max_level(level);
|
||||
- return;
|
||||
+struct CombinedLogger {
|
||||
+ loggers: Vec<Box<dyn log::Log>>,
|
||||
+}
|
||||
+
|
||||
+impl log::Log for CombinedLogger {
|
||||
+ fn enabled(&self, _metadata: &log::Metadata) -> bool {
|
||||
+ true
|
||||
}
|
||||
- if target == "file" {
|
||||
- log::set_max_level(level);
|
||||
- let _ = log::set_boxed_logger(Box::new(FileLogger::new(
|
||||
- log::Level::Debug,
|
||||
- PathBuf::from(file_path),
|
||||
- 0o600,
|
||||
- file_size,
|
||||
- file_number,
|
||||
- )));
|
||||
- return;
|
||||
+
|
||||
+ fn log(&self, record: &log::Record) {
|
||||
+ for logger in &self.loggers {
|
||||
+ logger.log(record);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn flush(&self) {}
|
||||
+}
|
||||
+
|
||||
+impl CombinedLogger {
|
||||
+ fn empty() -> Self {
|
||||
+ Self {
|
||||
+ loggers: Vec::new(),
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fn push(&mut self, logger: Box<dyn Log>) {
|
||||
+ self.loggers.push(logger)
|
||||
}
|
||||
- let config = build_log_config(app_name, level, target, file_path, file_size, file_number);
|
||||
- let logger = log4rs::Logger::new(config);
|
||||
- log::set_max_level(level);
|
||||
- let _ = log::set_boxed_logger(Box::new(LogPlugin(logger)));
|
||||
}
|
||||
|
||||
/// Init and set the sub unit manager's log
|
||||
@@ -297,7 +378,11 @@ fn append_log(
|
||||
///
|
||||
/// target: log target
|
||||
///
|
||||
-/// file_path: file path if the target is set to file
|
||||
+/// file_path: file path (valid when target == "file")
|
||||
+///
|
||||
+/// file_size: the maximum size of an active log file (valid when target == "file")
|
||||
+///
|
||||
+/// file_number: the maximum number of rotated log files (valid when target == "file")
|
||||
pub fn init_log_for_subum(
|
||||
app_name: &str,
|
||||
level: LevelFilter,
|
||||
@@ -309,7 +394,7 @@ pub fn init_log_for_subum(
|
||||
/* We should avoid calling init_log here, or we will get many "attempted
|
||||
* to set a logger after the logging system was already initialized" error
|
||||
* message. */
|
||||
- append_log(app_name, level, target, file_path, file_size, file_number);
|
||||
+ init_log(app_name, level, target, file_path, file_size, file_number);
|
||||
}
|
||||
|
||||
/// Init and set the log target to console
|
||||
@@ -318,7 +403,7 @@ pub fn init_log_for_subum(
|
||||
///
|
||||
/// level: maximum log level
|
||||
pub fn init_log_to_console(app_name: &str, level: LevelFilter) {
|
||||
- init_log(app_name, level, "console", "", 0, 0);
|
||||
+ init_log(app_name, level, "console-syslog", "", 0, 0);
|
||||
}
|
||||
|
||||
/// Init and set the log target to file
|
||||
@@ -327,7 +412,11 @@ pub fn init_log_to_console(app_name: &str, level: LevelFilter) {
|
||||
///
|
||||
/// level: maximum log level
|
||||
///
|
||||
-/// file_path: log to which file
|
||||
+/// file_path: file path
|
||||
+///
|
||||
+/// file_size: the maximum size of an active log file
|
||||
+///
|
||||
+/// file_number: the maximum number of rotated log files
|
||||
pub fn init_log_to_file(
|
||||
app_name: &str,
|
||||
level: LevelFilter,
|
||||
@@ -346,20 +435,42 @@ pub fn init_log_to_file(
|
||||
///
|
||||
/// target: log target
|
||||
///
|
||||
-/// file_path: file path if the target is set to file
|
||||
+/// file_path: file path (valid when target == "file")
|
||||
+///
|
||||
+/// file_size: the maximum size of an active log file (valid when target == "file")
|
||||
+///
|
||||
+/// file_number: the maximum number of rotated log files (valid when target == "file")
|
||||
pub fn init_log(
|
||||
- app_name: &str,
|
||||
+ _app_name: &str,
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
file_path: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) {
|
||||
+ let mut target = target;
|
||||
+ if target == "file" && (file_path.is_empty() || file_size == 0 || file_number == 0) {
|
||||
+ println!(
|
||||
+ "LogTarget is configured to `file`, but configuration is invalid, changing the \
|
||||
+ LogTarget to `console`, file: {file_path}, file_size: {file_size}, file_number: \
|
||||
+ {file_number}"
|
||||
+ );
|
||||
+ target = "syslog";
|
||||
+ }
|
||||
+
|
||||
if target == "syslog" {
|
||||
let _ = log::set_boxed_logger(Box::new(SysLogger));
|
||||
log::set_max_level(level);
|
||||
return;
|
||||
}
|
||||
+ if target == "console-syslog" {
|
||||
+ let mut logger = CombinedLogger::empty();
|
||||
+ logger.push(Box::new(ConsoleLogger));
|
||||
+ logger.push(Box::new(SysLogger));
|
||||
+ let _ = log::set_boxed_logger(Box::new(logger));
|
||||
+ log::set_max_level(level);
|
||||
+ return;
|
||||
+ }
|
||||
if target == "file" {
|
||||
let _ = log::set_boxed_logger(Box::new(FileLogger::new(
|
||||
log::Level::Debug,
|
||||
@@ -371,13 +482,9 @@ pub fn init_log(
|
||||
log::set_max_level(level);
|
||||
return;
|
||||
}
|
||||
- let config = build_log_config(app_name, level, target, file_path, file_size, file_number);
|
||||
- let r = log4rs::init_config(config);
|
||||
- if let Err(e) = r {
|
||||
- println!("{e}");
|
||||
- }
|
||||
}
|
||||
|
||||
+#[allow(unused)]
|
||||
fn build_log_config(
|
||||
app_name: &str,
|
||||
level: LevelFilter,
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,53 +0,0 @@
|
||||
From 8400fe3ec5ee164a2225cc4445b0e661f7d194f9 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Tue, 20 Jun 2023 12:03:12 +0800
|
||||
Subject: [PATCH] fix: several socket fixes
|
||||
|
||||
1. bump the incomming connections from 10 to 4096
|
||||
|
||||
2. set SO_PASSCRED explictly
|
||||
---
|
||||
core/bin/manager/commands.rs | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/core/bin/manager/commands.rs b/core/bin/manager/commands.rs
|
||||
index 0727295..57f9d5d 100644
|
||||
--- a/core/bin/manager/commands.rs
|
||||
+++ b/core/bin/manager/commands.rs
|
||||
@@ -10,6 +10,7 @@
|
||||
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
+use basic::socket_util;
|
||||
use cmdproto::proto::execute::ExecuterAction;
|
||||
use cmdproto::proto::ProstServerStream;
|
||||
use event::{EventType, Events, Source};
|
||||
@@ -32,6 +33,7 @@ pub(super) struct Commands<T> {
|
||||
|
||||
impl<T> Commands<T> {
|
||||
pub(super) fn new(relir: &Rc<Reliability>, comm_action: T) -> Self {
|
||||
+ /* The socket is used to communicate with sctl, panic if any of the following steps fail. */
|
||||
let sctl_socket_path = Path::new(SCTL_SOCKET);
|
||||
/* remove the old socket if it exists */
|
||||
if sctl_socket_path.exists() && !sctl_socket_path.is_symlink() {
|
||||
@@ -45,13 +47,15 @@ impl<T> Commands<T> {
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
+ /* set SO_PASSCRED, we need it to check whether sctl is running under root */
|
||||
+ socket_util::set_pass_cred(socket_fd, true).unwrap();
|
||||
/* create the socket with mode 666 */
|
||||
let old_mask = stat::umask(stat::Mode::from_bits_truncate(!0o666));
|
||||
let _ = socket::bind(socket_fd, &sctl_socket_addr);
|
||||
/* restore our umask */
|
||||
let _ = stat::umask(old_mask);
|
||||
- /* Allow at most 10 incoming connections can queue */
|
||||
- let _ = socket::listen(socket_fd, 10);
|
||||
+ /* Allow at most 4096 incoming connections can queue */
|
||||
+ let _ = socket::listen(socket_fd, 4096);
|
||||
Commands {
|
||||
reli: Rc::clone(relir),
|
||||
command_action: Rc::new(comm_action),
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,131 +0,0 @@
|
||||
From e3df7d05b8ab5346c08d5a4d654074225abd68e1 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 10 Jul 2023 21:52:36 +0800
|
||||
Subject: [PATCH] fix: simply code a bit, delete an annoying log, and don't set
|
||||
frame if we didn't do anything
|
||||
|
||||
---
|
||||
core/sysmaster/unit/runtime.rs | 70 ++++++++++++++++++----------------
|
||||
core/sysmaster/unit/uload.rs | 2 -
|
||||
2 files changed, 38 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/core/sysmaster/unit/runtime.rs b/core/sysmaster/unit/runtime.rs
|
||||
index 5c4f45e..24833a5 100644
|
||||
--- a/core/sysmaster/unit/runtime.rs
|
||||
+++ b/core/sysmaster/unit/runtime.rs
|
||||
@@ -251,7 +251,12 @@ impl UnitRTData {
|
||||
}
|
||||
|
||||
pub(self) fn dispatch_load_queue(&self) {
|
||||
- log::trace!("dispatch load queue");
|
||||
+ if self.load_queue.borrow().is_empty() {
|
||||
+ self.dispatch_target_dep_queue();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ log::debug!("Dispatching load queue");
|
||||
|
||||
self.reli
|
||||
.set_last_frame2(ReliLastFrame::Queue as u32, ReliLastQue::Load as u32);
|
||||
@@ -260,34 +265,27 @@ impl UnitRTData {
|
||||
//unitX pop from the load queue and then no need the ref of load queue
|
||||
//the unitX load process will borrow load queue as mut again
|
||||
// pop
|
||||
- let first_unit = self.load_queue.borrow_mut().pop_front();
|
||||
- match first_unit {
|
||||
+ let unit = match self.load_queue.borrow_mut().pop_front() {
|
||||
None => break,
|
||||
- Some(unit) => {
|
||||
- // record + action
|
||||
- self.reli.set_last_unit(unit.id());
|
||||
- match unit.load() {
|
||||
- Ok(()) => {
|
||||
- let load_state = unit.load_state();
|
||||
- if load_state == UnitLoadState::Loaded {
|
||||
- self.push_target_dep_queue(Rc::clone(&unit));
|
||||
- }
|
||||
- }
|
||||
- Err(e) => {
|
||||
- log::error!("load unit [{}] failed: {}", unit.id(), e.to_string());
|
||||
- }
|
||||
- }
|
||||
- self.reli.clear_last_unit();
|
||||
- }
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+
|
||||
+ log::debug!("Loading unit: {}", unit.id());
|
||||
+ self.reli.set_last_unit(unit.id());
|
||||
+ if let Err(e) = unit.load() {
|
||||
+ log::error!("Failed to load unit [{}]: {e}", unit.id());
|
||||
}
|
||||
+
|
||||
+ let load_state = unit.load_state();
|
||||
+ if load_state == UnitLoadState::Loaded {
|
||||
+ self.push_target_dep_queue(Rc::clone(&unit));
|
||||
+ }
|
||||
+
|
||||
+ self.reli.clear_last_unit();
|
||||
}
|
||||
- self.reli.clear_last_frame();
|
||||
|
||||
- log::trace!("dispatch target dep queue");
|
||||
- self.reli
|
||||
- .set_last_frame2(ReliLastFrame::Queue as u32, ReliLastQue::TargetDeps as u32);
|
||||
- self.dispatch_target_dep_queue();
|
||||
self.reli.clear_last_frame();
|
||||
+ self.dispatch_target_dep_queue();
|
||||
}
|
||||
|
||||
pub(self) fn unit_add_dependency(
|
||||
@@ -307,17 +305,25 @@ impl UnitRTData {
|
||||
}
|
||||
|
||||
fn dispatch_target_dep_queue(&self) {
|
||||
+ if self.target_dep_queue.borrow().is_empty() {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ log::debug!("Dispatching target dep queue");
|
||||
+ self.reli
|
||||
+ .set_last_frame2(ReliLastFrame::Queue as u32, ReliLastQue::TargetDeps as u32);
|
||||
+
|
||||
loop {
|
||||
- let first_unit = self.target_dep_queue.borrow_mut().pop_front();
|
||||
- match first_unit {
|
||||
+ let unit = match self.target_dep_queue.borrow_mut().pop_front() {
|
||||
None => break,
|
||||
- Some(unit) => {
|
||||
- self.reli.set_last_unit(unit.id());
|
||||
- dispatch_target_dep_unit(&self.db, &unit);
|
||||
- self.reli.clear_last_unit();
|
||||
- }
|
||||
- }
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ self.reli.set_last_unit(unit.id());
|
||||
+ dispatch_target_dep_unit(&self.db, &unit);
|
||||
+ self.reli.clear_last_unit();
|
||||
}
|
||||
+
|
||||
+ self.reli.clear_last_frame();
|
||||
}
|
||||
|
||||
fn push_target_dep_queue(&self, unit: Rc<UnitX>) {
|
||||
diff --git a/core/sysmaster/unit/uload.rs b/core/sysmaster/unit/uload.rs
|
||||
index 382b2c0..fa5f616 100644
|
||||
--- a/core/sysmaster/unit/uload.rs
|
||||
+++ b/core/sysmaster/unit/uload.rs
|
||||
@@ -140,9 +140,7 @@ impl UnitLoadData {
|
||||
|
||||
pub(self) fn load_unit(&self, name: &str) -> Option<Rc<UnitX>> {
|
||||
self.prepare_unit(name).map(|u| {
|
||||
- log::debug!("Try to load {name} by dispatching the load queue.");
|
||||
self.rt.dispatch_load_queue();
|
||||
- log::debug!("The loading state of {name}: {:?}", u.load_state());
|
||||
u
|
||||
})
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,28 +0,0 @@
|
||||
From aaf7cf2eca91dc9490c60a298c83915f99d3436f Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 21 Jul 2023 17:40:57 +0800
|
||||
Subject: [PATCH] fix: specify the version of tempfile
|
||||
|
||||
prost-build depends on tempfile but doesn't specify its version, if tempfile upgrades
|
||||
to higher version i.e. 3.7.0, it may requires we use rustc 1.63 or newer. Now we can't
|
||||
upgrate rustc to a newer version, we choose to avoid this problem by pinning the
|
||||
version of tempfile to 3.6.0.
|
||||
---
|
||||
Cargo.toml | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Cargo.toml b/Cargo.toml
|
||||
index e86003d..17cbd79 100644
|
||||
--- a/Cargo.toml
|
||||
+++ b/Cargo.toml
|
||||
@@ -44,6 +44,7 @@ nix = "0.24"
|
||||
regex = { version = "1.6.0", default-features = false, features = ["std"] }
|
||||
serde = "1.0.130"
|
||||
siphasher = { version = "0.3", features = ["serde"] }
|
||||
+tempfile = "=3.6.0"
|
||||
walkdir = "2"
|
||||
fnmatch-regex = "0.2.0"
|
||||
snafu = "0.7"
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,129 +0,0 @@
|
||||
From e4646077cac8c196f676e2711d99ef46a40bda25 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 16:07:29 +0800
|
||||
Subject: [PATCH] fix: use UnixStream to test send_and_recv
|
||||
|
||||
---
|
||||
libs/cmdproto/src/proto/frame.rs | 82 +++++++++++++++++++-------------
|
||||
1 file changed, 49 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/libs/cmdproto/src/proto/frame.rs b/libs/cmdproto/src/proto/frame.rs
|
||||
index 6b6912b..9c48cf0 100644
|
||||
--- a/libs/cmdproto/src/proto/frame.rs
|
||||
+++ b/libs/cmdproto/src/proto/frame.rs
|
||||
@@ -172,25 +172,25 @@ where
|
||||
msg.encode_frame(&mut buf)?;
|
||||
let encoded = buf.freeze();
|
||||
let msg_len = msg_len_vec(encoded.len());
|
||||
- match socket::send(self.accept_fd, &msg_len, socket::MsgFlags::empty()) {
|
||||
- Ok(len) => {
|
||||
- if len != msg_len.len() {
|
||||
- return Err(Error::SendStream {
|
||||
- msg: "Invalid message length".to_string(),
|
||||
- });
|
||||
- }
|
||||
- }
|
||||
+
|
||||
+ let len = match socket::send(self.accept_fd, &msg_len, socket::MsgFlags::empty()) {
|
||||
Err(e) => return Err(Error::SendStream { msg: e.to_string() }),
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if len != msg_len.len() {
|
||||
+ return Err(Error::SendStream {
|
||||
+ msg: "Invalid message length".to_string(),
|
||||
+ });
|
||||
}
|
||||
- match socket::send(self.accept_fd, &encoded, socket::MsgFlags::empty()) {
|
||||
- Ok(len) => {
|
||||
- if len != encoded.len() {
|
||||
- return Err(Error::SendStream {
|
||||
- msg: "Invalid message length".to_string(),
|
||||
- });
|
||||
- }
|
||||
- }
|
||||
+
|
||||
+ let len = match socket::send(self.accept_fd, &encoded, socket::MsgFlags::empty()) {
|
||||
Err(e) => return Err(Error::SendStream { msg: e.to_string() }),
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
+ if len != encoded.len() {
|
||||
+ return Err(Error::SendStream {
|
||||
+ msg: "Invalid message length".to_string(),
|
||||
+ });
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -240,37 +240,53 @@ where
|
||||
mod tests {
|
||||
use super::super::abi::unit_comm::Action as UnitAction;
|
||||
use super::*;
|
||||
- use std::net::{SocketAddr, TcpStream};
|
||||
+ use core::time;
|
||||
+ use std::os::unix::net::UnixStream;
|
||||
+ use std::path::Path;
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
#[test]
|
||||
fn test_send_and_recv() {
|
||||
+ let socket_name = "./test-sctl.sock";
|
||||
+ let socket_path = Path::new(socket_name);
|
||||
+ if socket_path.exists() {
|
||||
+ std::fs::remove_file(&socket_path).unwrap();
|
||||
+ }
|
||||
thread::spawn(move || {
|
||||
thread::sleep(Duration::from_secs(1));
|
||||
- let addrs = [
|
||||
- SocketAddr::from(([127, 0, 0, 1], 9528)),
|
||||
- SocketAddr::from(([127, 0, 0, 1], 9529)),
|
||||
- ];
|
||||
- let stream = TcpStream::connect(&addrs[..]).unwrap();
|
||||
+ let stream = match UnixStream::connect(socket_name) {
|
||||
+ Err(e) => {
|
||||
+ println!("Failed to connect to sysmaster: {e}");
|
||||
+ return;
|
||||
+ }
|
||||
+ Ok(v) => v,
|
||||
+ };
|
||||
let mut client = ProstClientStream::new(stream);
|
||||
let cmd =
|
||||
CommandRequest::new_unitcomm(UnitAction::Start, vec!["test.service".to_string()]);
|
||||
let _ = client.execute(cmd).unwrap();
|
||||
});
|
||||
|
||||
- let addrs = [
|
||||
- SocketAddr::from(([127, 0, 0, 1], 9528)),
|
||||
- SocketAddr::from(([127, 0, 0, 1], 9529)),
|
||||
- ];
|
||||
- let fd = std::net::TcpListener::bind(&addrs[..]).unwrap();
|
||||
- loop {
|
||||
- for stream in fd.incoming() {
|
||||
- match stream {
|
||||
- Err(e) => panic!("failed: {e}"),
|
||||
- Ok(_stream) => return,
|
||||
- }
|
||||
+ let sctl_socket_addr = socket::UnixAddr::new(Path::new(socket_path)).unwrap();
|
||||
+ let socket_fd = socket::socket(
|
||||
+ socket::AddressFamily::Unix,
|
||||
+ socket::SockType::Stream,
|
||||
+ socket::SockFlag::SOCK_CLOEXEC | socket::SockFlag::SOCK_NONBLOCK,
|
||||
+ None,
|
||||
+ )
|
||||
+ .unwrap();
|
||||
+
|
||||
+ let _ = socket::bind(socket_fd, &sctl_socket_addr);
|
||||
+ let _ = socket::listen(socket_fd, 10);
|
||||
+
|
||||
+ for _ in 0..5 {
|
||||
+ match socket::accept(socket_fd) {
|
||||
+ Err(nix::Error::EAGAIN) => thread::sleep(time::Duration::from_millis(500)),
|
||||
+ Ok(_) => break,
|
||||
+ Err(_) => panic!("Unexpected error when accepting connection."),
|
||||
}
|
||||
}
|
||||
+ std::fs::remove_file(&socket_path).unwrap();
|
||||
}
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,52 +0,0 @@
|
||||
From 67f99391d25fd1108e15887b33df2e7bf19b90ef Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Thu, 29 Jun 2023 10:33:27 +0800
|
||||
Subject: [PATCH] fix: use localtime instead of UTC
|
||||
|
||||
---
|
||||
libs/basic/Cargo.toml | 2 +-
|
||||
libs/basic/src/logger.rs | 8 ++++++--
|
||||
2 files changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index b7d343c..42ac3ab 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -21,7 +21,7 @@ lazy_static = "1.4.0"
|
||||
bitflags = "1.3.2"
|
||||
pkg-config = "0.3"
|
||||
rand = "0.4.6"
|
||||
-time = {version = "=0.3.10", features = ["formatting", "macros"] }
|
||||
+time = {version = "=0.3.10", features = ["formatting", "macros", "local-offset"] }
|
||||
constants = { path = "../constants"}
|
||||
|
||||
[dev-dependencies]
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 83fce0e..ae12c36 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -36,7 +36,7 @@ use log4rs::{
|
||||
encode::pattern::PatternEncoder,
|
||||
};
|
||||
use nix::libc;
|
||||
-use time::UtcOffset;
|
||||
+use time::macros::offset;
|
||||
|
||||
use crate::Error;
|
||||
|
||||
@@ -69,7 +69,11 @@ impl log::Log for LogPlugin {
|
||||
}
|
||||
|
||||
fn write_msg_common(writer: &mut impl Write, module: &str, msg: String) {
|
||||
- let now = time::OffsetDateTime::now_utc().to_offset(UtcOffset::UTC);
|
||||
+ let now = match time::OffsetDateTime::now_local() {
|
||||
+ Ok(v) => v,
|
||||
+ Err(_) => time::OffsetDateTime::now_utc().to_offset(offset!(+8)),
|
||||
+ };
|
||||
+
|
||||
let format = time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]");
|
||||
let now = match now.format(&format) {
|
||||
Err(_) => "[unknown time]".to_string(),
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,259 +0,0 @@
|
||||
From 2dfef21c0b7d4fef04ab0e65b3f8cc52944d7b44 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Thu, 29 Jun 2023 10:08:56 +0800
|
||||
Subject: [PATCH] fix: use /var/log/sysmaster/sysmaster.log to save log, don't
|
||||
allow users change
|
||||
|
||||
---
|
||||
core/bin/main.rs | 1 -
|
||||
core/bin/manager/config.rs | 3 ---
|
||||
core/bin/plugin/mod.rs | 5 +----
|
||||
core/bin/unit/manager.rs | 5 -----
|
||||
core/lib/unit/umif.rs | 3 +--
|
||||
libs/basic/Cargo.toml | 1 +
|
||||
libs/basic/src/logger.rs | 30 ++++++++----------------------
|
||||
libs/constants/src/lib.rs | 3 +++
|
||||
units/system.toml | 1 -
|
||||
11 files changed, 20 insertions(+), 49 deletions(-)
|
||||
|
||||
diff --git a/core/bin/main.rs b/core/bin/main.rs
|
||||
index b75ef0b..c2010e2 100644
|
||||
--- a/core/bin/main.rs
|
||||
+++ b/core/bin/main.rs
|
||||
@@ -86,7 +86,6 @@ fn main() -> Result<()> {
|
||||
"sysmaster",
|
||||
manager_config.LogLevel,
|
||||
&manager_config.LogTarget,
|
||||
- &manager_config.LogFile,
|
||||
manager_config.LogFileSize,
|
||||
manager_config.LogFileNumber,
|
||||
);
|
||||
diff --git a/core/bin/manager/config.rs b/core/bin/manager/config.rs
|
||||
index 691b692..229537f 100644
|
||||
--- a/core/bin/manager/config.rs
|
||||
+++ b/core/bin/manager/config.rs
|
||||
@@ -28,8 +28,6 @@ pub struct ManagerConfig {
|
||||
pub LogLevel: log::LevelFilter,
|
||||
#[config(default = "syslog")]
|
||||
pub LogTarget: String,
|
||||
- #[config(default = "")]
|
||||
- pub LogFile: String,
|
||||
#[config(default = 10240)]
|
||||
pub LogFileSize: u32,
|
||||
#[config(default = 10)]
|
||||
@@ -58,7 +56,6 @@ impl Default for ManagerConfig {
|
||||
DefaultTimeoutSec: 90,
|
||||
LogLevel: log::LevelFilter::Debug,
|
||||
LogTarget: "syslog".to_string(),
|
||||
- LogFile: String::new(),
|
||||
LogFileSize: 10240,
|
||||
LogFileNumber: 10,
|
||||
DbSize: RELI_HISTORY_MAPSIZE_DEFAULT,
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/bin/plugin/mod.rs
|
||||
index 9a8e4f6..e6f5183 100644
|
||||
--- a/core/bin/plugin/mod.rs
|
||||
+++ b/core/bin/plugin/mod.rs
|
||||
@@ -317,7 +317,6 @@ impl Plugin {
|
||||
um: Rc<dyn UmIf>,
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file_path: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) -> *mut dyn UnitManagerObj;
|
||||
@@ -479,7 +478,6 @@ impl Plugin {
|
||||
&self,
|
||||
unit_type: UnitType,
|
||||
target: &str,
|
||||
- file: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) -> Result<Box<dyn UnitManagerObj>> {
|
||||
@@ -495,7 +493,6 @@ impl Plugin {
|
||||
type FnType = fn(
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) -> *mut dyn UnitManagerObj;
|
||||
@@ -516,7 +513,7 @@ impl Plugin {
|
||||
Ok(v) => v,
|
||||
};
|
||||
|
||||
- let boxed_raw = fun(log::max_level(), target, file, file_size, file_number);
|
||||
+ let boxed_raw = fun(log::max_level(), target, file_size, file_number);
|
||||
Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
}
|
||||
|
||||
diff --git a/core/bin/unit/manager.rs b/core/bin/unit/manager.rs
|
||||
index 2e6caba..1e8d08f 100644
|
||||
--- a/core/bin/unit/manager.rs
|
||||
+++ b/core/bin/unit/manager.rs
|
||||
@@ -1030,10 +1030,6 @@ impl UnitManager {
|
||||
|
||||
fn remove_job_result(&self, _source: &str) {}
|
||||
|
||||
- fn get_log_file(&self) -> &str {
|
||||
- &self.manager_config.LogFile
|
||||
- }
|
||||
-
|
||||
fn get_log_target(&self) -> &str {
|
||||
&self.manager_config.LogTarget
|
||||
}
|
||||
@@ -1314,7 +1310,6 @@ mod unit_submanager {
|
||||
let sub = match Plugin::get_instance().create_um_obj(
|
||||
unit_type,
|
||||
um.get_log_target(),
|
||||
- um.get_log_file(),
|
||||
um.get_log_file_size(),
|
||||
um.get_log_file_number(),
|
||||
) {
|
||||
diff --git a/core/lib/unit/umif.rs b/core/lib/unit/umif.rs
|
||||
index 85603fa..f0019d0 100644
|
||||
--- a/core/lib/unit/umif.rs
|
||||
+++ b/core/lib/unit/umif.rs
|
||||
@@ -230,11 +230,10 @@ macro_rules! declare_umobj_plugin {
|
||||
pub fn __um_obj_create(
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file_path: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) -> *mut dyn $crate::unit::UnitManagerObj {
|
||||
- logger::init_log_for_subum($name, level, target, file_path, file_size, file_number);
|
||||
+ logger::init_log_for_subum($name, level, target, file_size, file_number);
|
||||
let construcotr: fn() -> $unit_type = $constructor;
|
||||
let obj = construcotr();
|
||||
let boxed: Box<dyn $crate::unit::UnitManagerObj> = Box::new(obj);
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index 6ee7162..b7d343c 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -22,6 +22,7 @@ bitflags = "1.3.2"
|
||||
pkg-config = "0.3"
|
||||
rand = "0.4.6"
|
||||
time = {version = "=0.3.10", features = ["formatting", "macros"] }
|
||||
+constants = { path = "../constants"}
|
||||
|
||||
[dev-dependencies]
|
||||
libtests = { path = "../libtests" }
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 3161513..83fce0e 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -19,6 +19,7 @@ use std::{
|
||||
sync::Mutex,
|
||||
};
|
||||
|
||||
+use constants::LOG_FILE_PATH;
|
||||
use log::{LevelFilter, Log};
|
||||
use log4rs::{
|
||||
append::{
|
||||
@@ -378,8 +379,6 @@ impl CombinedLogger {
|
||||
///
|
||||
/// target: log target
|
||||
///
|
||||
-/// file_path: file path (valid when target == "file")
|
||||
-///
|
||||
/// file_size: the maximum size of an active log file (valid when target == "file")
|
||||
///
|
||||
/// file_number: the maximum number of rotated log files (valid when target == "file")
|
||||
@@ -387,14 +386,13 @@ pub fn init_log_for_subum(
|
||||
app_name: &str,
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file_path: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) {
|
||||
/* We should avoid calling init_log here, or we will get many "attempted
|
||||
* to set a logger after the logging system was already initialized" error
|
||||
* message. */
|
||||
- init_log(app_name, level, target, file_path, file_size, file_number);
|
||||
+ init_log(app_name, level, target, file_size, file_number);
|
||||
}
|
||||
|
||||
/// Init and set the log target to console
|
||||
@@ -403,7 +401,7 @@ pub fn init_log_for_subum(
|
||||
///
|
||||
/// level: maximum log level
|
||||
pub fn init_log_to_console(app_name: &str, level: LevelFilter) {
|
||||
- init_log(app_name, level, "console-syslog", "", 0, 0);
|
||||
+ init_log(app_name, level, "console-syslog", 0, 0);
|
||||
}
|
||||
|
||||
/// Init and set the log target to file
|
||||
@@ -412,19 +410,11 @@ pub fn init_log_to_console(app_name: &str, level: LevelFilter) {
|
||||
///
|
||||
/// level: maximum log level
|
||||
///
|
||||
-/// file_path: file path
|
||||
-///
|
||||
/// file_size: the maximum size of an active log file
|
||||
///
|
||||
/// file_number: the maximum number of rotated log files
|
||||
-pub fn init_log_to_file(
|
||||
- app_name: &str,
|
||||
- level: LevelFilter,
|
||||
- file_path: &str,
|
||||
- file_size: u32,
|
||||
- file_number: u32,
|
||||
-) {
|
||||
- init_log(app_name, level, "file", file_path, file_size, file_number);
|
||||
+pub fn init_log_to_file(app_name: &str, level: LevelFilter, file_size: u32, file_number: u32) {
|
||||
+ init_log(app_name, level, "file", file_size, file_number);
|
||||
}
|
||||
|
||||
/// Init and set the logger
|
||||
@@ -435,8 +425,6 @@ pub fn init_log_to_file(
|
||||
///
|
||||
/// target: log target
|
||||
///
|
||||
-/// file_path: file path (valid when target == "file")
|
||||
-///
|
||||
/// file_size: the maximum size of an active log file (valid when target == "file")
|
||||
///
|
||||
/// file_number: the maximum number of rotated log files (valid when target == "file")
|
||||
@@ -444,16 +432,14 @@ pub fn init_log(
|
||||
_app_name: &str,
|
||||
level: LevelFilter,
|
||||
target: &str,
|
||||
- file_path: &str,
|
||||
file_size: u32,
|
||||
file_number: u32,
|
||||
) {
|
||||
let mut target = target;
|
||||
- if target == "file" && (file_path.is_empty() || file_size == 0 || file_number == 0) {
|
||||
+ if target == "file" && (file_size == 0 || file_number == 0) {
|
||||
println!(
|
||||
"LogTarget is configured to `file`, but configuration is invalid, changing the \
|
||||
- LogTarget to `console`, file: {file_path}, file_size: {file_size}, file_number: \
|
||||
- {file_number}"
|
||||
+ LogTarget to `syslog`, file_size: {file_size}, file_number: {file_number}"
|
||||
);
|
||||
target = "syslog";
|
||||
}
|
||||
@@ -474,7 +460,7 @@ pub fn init_log(
|
||||
if target == "file" {
|
||||
let _ = log::set_boxed_logger(Box::new(FileLogger::new(
|
||||
log::Level::Debug,
|
||||
- PathBuf::from(&file_path),
|
||||
+ PathBuf::from(LOG_FILE_PATH),
|
||||
0o600,
|
||||
file_size,
|
||||
file_number,
|
||||
diff --git a/libs/constants/src/lib.rs b/libs/constants/src/lib.rs
|
||||
index b1db27c..6005067 100644
|
||||
--- a/libs/constants/src/lib.rs
|
||||
+++ b/libs/constants/src/lib.rs
|
||||
@@ -26,3 +26,6 @@ pub const ALIVE: &str = "ALIVE01234567890";
|
||||
|
||||
/// Socket used to transfer message between sysmaster and sctl
|
||||
pub const SCTL_SOCKET: &str = "/run/sysmaster/sctl";
|
||||
+
|
||||
+/// Default log file path when LogTarget is configured to "file"
|
||||
+pub const LOG_FILE_PATH: &str = "/var/log/sysmaster/sysmaster.log";
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
From f4c2faab82bf903c800417c8b04a9d9763bc7c61 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 10:54:12 +0800
|
||||
Subject: [PATCH] fix: version 0.3.10 may fail to build when use tuna source,
|
||||
use 0.3.5
|
||||
|
||||
---
|
||||
libs/basic/Cargo.toml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml
|
||||
index 42ac3ab..c18991a 100644
|
||||
--- a/libs/basic/Cargo.toml
|
||||
+++ b/libs/basic/Cargo.toml
|
||||
@@ -21,7 +21,7 @@ lazy_static = "1.4.0"
|
||||
bitflags = "1.3.2"
|
||||
pkg-config = "0.3"
|
||||
rand = "0.4.6"
|
||||
-time = {version = "=0.3.10", features = ["formatting", "macros", "local-offset"] }
|
||||
+time = {version = "=0.3.5", features = ["formatting", "macros", "local-offset"] }
|
||||
constants = { path = "../constants"}
|
||||
|
||||
[dev-dependencies]
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
From ca038d416eb1d6b7ae4cd4a709a62fc055e25c12 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 10:55:39 +0800
|
||||
Subject: [PATCH] fix: we shouldn't lookup build directory if we are not in CI
|
||||
environment
|
||||
|
||||
---
|
||||
libs/basic/src/path_lookup.rs | 51 +++++++++--------------------------
|
||||
1 file changed, 12 insertions(+), 39 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/path_lookup.rs b/libs/basic/src/path_lookup.rs
|
||||
index c711305..4c9797d 100644
|
||||
--- a/libs/basic/src/path_lookup.rs
|
||||
+++ b/libs/basic/src/path_lookup.rs
|
||||
@@ -11,7 +11,6 @@
|
||||
// See the Mulan PSL v2 for more details.
|
||||
|
||||
//! the management of the unit file lookup path
|
||||
-use std::env;
|
||||
|
||||
/// unit lookup path in /etc
|
||||
pub const ETC_SYSTEM_PATH: &str = "/etc/sysmaster";
|
||||
@@ -55,28 +54,6 @@ impl LookupPaths {
|
||||
|
||||
/// init lookup paths
|
||||
pub fn init_lookup_paths(&mut self) {
|
||||
- let devel_path = || {
|
||||
- let out_dir = env::var("OUT_DIR").unwrap_or_else(|_x| {
|
||||
- let _tmp_str: Option<&'static str> = option_env!("OUT_DIR");
|
||||
- _tmp_str.unwrap_or("").to_string()
|
||||
- });
|
||||
- if out_dir.is_empty() {
|
||||
- env::var("LD_LIBRARY_PATH").map_or("".to_string(), |_v| {
|
||||
- let _tmp = _v.split(':').collect::<Vec<_>>()[0];
|
||||
- let _tmp_path = _tmp.split("target").collect::<Vec<_>>()[0];
|
||||
- _tmp_path.to_string()
|
||||
- })
|
||||
- } else {
|
||||
- out_dir
|
||||
- }
|
||||
- };
|
||||
-
|
||||
- let out_dir = devel_path();
|
||||
- if !out_dir.is_empty() && out_dir.contains("build") {
|
||||
- let tmp_str: Vec<_> = out_dir.split("build").collect();
|
||||
- self.search_path.push(tmp_str[0].to_string());
|
||||
- self.preset_path.push(tmp_str[0].to_string());
|
||||
- }
|
||||
self.search_path.push(LIB_SYSTEM_PATH.to_string());
|
||||
self.search_path.push(RUN_SYSTEM_PATH.to_string());
|
||||
self.search_path.push(ETC_SYSTEM_PATH.to_string());
|
||||
@@ -98,29 +75,25 @@ impl Default for LookupPaths {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
-
|
||||
- use std::env;
|
||||
-
|
||||
use crate::logger;
|
||||
|
||||
use super::LookupPaths;
|
||||
#[test]
|
||||
fn test_init_lookup_paths() {
|
||||
logger::init_log_to_console("test_init_lookup_paths", log::LevelFilter::Trace);
|
||||
- let mut _lp = LookupPaths::default();
|
||||
- _lp.init_lookup_paths();
|
||||
- for item in _lp.search_path.iter() {
|
||||
- log::info!("lookup path is{:?}", item);
|
||||
- }
|
||||
- let tmp_dir = env::var("OUT_DIR");
|
||||
- if tmp_dir.is_err() {
|
||||
- return;
|
||||
- }
|
||||
- let tmp = tmp_dir.unwrap();
|
||||
- let tmp_dir_v: Vec<_> = tmp.split("build").collect();
|
||||
+ let mut lp = LookupPaths::default();
|
||||
+ lp.init_lookup_paths();
|
||||
+ assert_eq!(
|
||||
+ lp.search_path,
|
||||
+ vec!["/usr/lib/sysmaster", "/run/sysmaster", "/etc/sysmaster"]
|
||||
+ );
|
||||
assert_eq!(
|
||||
- _lp.search_path.first().unwrap().to_string(),
|
||||
- tmp_dir_v[0].to_string()
|
||||
+ lp.preset_path,
|
||||
+ vec![
|
||||
+ "/etc/sysmaster/system-preset",
|
||||
+ "/usr/lib/sysmaster/system-preset"
|
||||
+ ]
|
||||
);
|
||||
+ assert_eq!(lp.persistent_path, "/etc/sysmaster")
|
||||
}
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,231 +0,0 @@
|
||||
From fd14e9295a04cb051a70779fd6039d2d25ce9b85 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Mon, 3 Jul 2023 15:39:47 +0800
|
||||
Subject: [PATCH] refactor: don't copy unit file to .toml file when loading a
|
||||
unit
|
||||
|
||||
We used to do this because we thought confique could only infer
|
||||
the file format from the file extension, so we copied the file
|
||||
to .toml to tell confique this is a toml file. But actually,
|
||||
confique allows us to specify the file format if we use Partial.
|
||||
|
||||
Let's use confique::Partial to avoid copying files.
|
||||
---
|
||||
coms/service/src/config.rs | 24 ++++++++++++--------
|
||||
core/bin/manager/pre_install.rs | 40 +++++++++++++++++----------------
|
||||
core/bin/unit/entry/config.rs | 25 +++++++++++++--------
|
||||
core/bin/unit/util/unit_file.rs | 17 +++-----------
|
||||
5 files changed, 69 insertions(+), 57 deletions(-)
|
||||
|
||||
diff --git a/coms/service/src/config.rs b/coms/service/src/config.rs
|
||||
index e698ac2..3b7eb43 100644
|
||||
--- a/coms/service/src/config.rs
|
||||
+++ b/coms/service/src/config.rs
|
||||
@@ -13,7 +13,7 @@
|
||||
#![allow(non_snake_case)]
|
||||
use super::comm::ServiceUnitComm;
|
||||
use super::rentry::{NotifyAccess, SectionService, ServiceCommand, ServiceType};
|
||||
-use confique::Config;
|
||||
+use confique::{Config, FileFormat, Partial};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::path::PathBuf;
|
||||
@@ -64,15 +64,21 @@ impl ServiceConfig {
|
||||
}
|
||||
|
||||
pub(super) fn load(&self, paths: Vec<PathBuf>, update: bool) -> Result<()> {
|
||||
- let mut builder = ServiceConfigData::builder().env();
|
||||
-
|
||||
- log::debug!("service load path: {:?}", paths);
|
||||
- // fragment
|
||||
- for v in paths {
|
||||
- builder = builder.file(v);
|
||||
+ type ConfigPartial = <ServiceConfigData as Config>::Partial;
|
||||
+ let mut partial: ConfigPartial = Partial::from_env().context(ConfiqueSnafu)?;
|
||||
+ /* The first config wins, so add default values at last. */
|
||||
+ log::debug!("Loading service config from: {:?}", paths);
|
||||
+ for path in paths {
|
||||
+ partial = match confique::File::with_format(&path, FileFormat::Toml).load() {
|
||||
+ Err(e) => {
|
||||
+ log::error!("Failed to load {path:?}: {e}, skipping");
|
||||
+ continue;
|
||||
+ }
|
||||
+ Ok(v) => partial.with_fallback(v),
|
||||
+ }
|
||||
}
|
||||
-
|
||||
- *self.data.borrow_mut() = match builder.load() {
|
||||
+ partial = partial.with_fallback(ConfigPartial::default_values());
|
||||
+ *self.data.borrow_mut() = match ServiceConfigData::from_partial(partial) {
|
||||
Err(e) => {
|
||||
/* The error message is pretty readable, just print it out. */
|
||||
log::error!("{e}");
|
||||
diff --git a/core/bin/manager/pre_install.rs b/core/bin/manager/pre_install.rs
|
||||
index 88150c0..08c795a 100644
|
||||
--- a/core/bin/manager/pre_install.rs
|
||||
+++ b/core/bin/manager/pre_install.rs
|
||||
@@ -15,7 +15,7 @@ use crate::unit::{unit_name_to_type, UeConfigInstall, UnitType};
|
||||
use basic::fs_util;
|
||||
use basic::path_lookup::LookupPaths;
|
||||
use bitflags::bitflags;
|
||||
-use confique::Config;
|
||||
+use confique::{Config, FileFormat, Partial};
|
||||
use nix::unistd::UnlinkatFlags;
|
||||
use std::{
|
||||
cell::RefCell,
|
||||
@@ -553,14 +553,14 @@ impl Install {
|
||||
}
|
||||
|
||||
let canon_path = path.canonicalize()?;
|
||||
- let tmp = format!("{}.toml", canon_path.as_path().display());
|
||||
- if let Err(e) = std::fs::copy(canon_path, &tmp).context(IoSnafu) {
|
||||
- log::warn!("copy file content to toml file error: {}", e);
|
||||
- return Err(e);
|
||||
- }
|
||||
-
|
||||
- let mut builder = UeConfigData::builder().env();
|
||||
- builder = builder.file(&tmp);
|
||||
+ type ConfigPartial = <UeConfigData as Config>::Partial;
|
||||
+ let mut partial: ConfigPartial = Partial::from_env().context(ConfiqueSnafu)?;
|
||||
+ /* The first config wins, so add default values at last. */
|
||||
+ partial = partial.with_fallback(
|
||||
+ confique::File::with_format(canon_path, FileFormat::Toml)
|
||||
+ .load()
|
||||
+ .context(ConfiqueSnafu)?,
|
||||
+ );
|
||||
|
||||
let dropin_dir_name = format!("{}.d", unit_install.name());
|
||||
|
||||
@@ -570,7 +570,7 @@ impl Install {
|
||||
let dropin_dir = base_dir.join(&dropin_dir_name);
|
||||
|
||||
if !dropin_dir.exists() {
|
||||
- log::debug!("dropin path is not exist, ignore it: {:?}", &dropin_dir);
|
||||
+ log::debug!("Dropin path {dropin_dir:?} does not exist, ignoring");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -578,24 +578,26 @@ impl Install {
|
||||
for entry in dirs {
|
||||
let dir_entry = entry?;
|
||||
let fragment = dir_entry.path();
|
||||
- if fragment.is_file() {
|
||||
- let file_name = String::from(fragment.file_name().unwrap().to_str().unwrap());
|
||||
- if file_name.starts_with('.') || !file_name.ends_with(".toml") {
|
||||
+ if !fragment.is_file() {
|
||||
+ log::debug!("Fragment file {fragment:?} is not a file, ignoring");
|
||||
+ continue;
|
||||
+ }
|
||||
+ partial = match confique::File::with_format(&fragment, FileFormat::Toml).load() {
|
||||
+ Err(e) => {
|
||||
+ log::error!("Failed to load {fragment:?}: {e}, skipping.");
|
||||
continue;
|
||||
}
|
||||
-
|
||||
- builder = builder.file(fragment);
|
||||
- }
|
||||
+ Ok(v) => partial.with_fallback(v),
|
||||
+ };
|
||||
}
|
||||
}
|
||||
-
|
||||
- let configer = builder.load().context(ConfiqueSnafu)?;
|
||||
+ partial = partial.with_fallback(ConfigPartial::default_values());
|
||||
+ let configer = UeConfigData::from_partial(partial).context(ConfiqueSnafu)?;
|
||||
unit_install.fill_struct(&configer);
|
||||
|
||||
for also in &configer.Install.Also {
|
||||
self.unit_install_discover(also, ctx.clone())?;
|
||||
}
|
||||
- // fs::remove_file(&tmp);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
diff --git a/core/bin/unit/entry/config.rs b/core/bin/unit/entry/config.rs
|
||||
index 705512d..91313c4 100644
|
||||
--- a/core/bin/unit/entry/config.rs
|
||||
+++ b/core/bin/unit/entry/config.rs
|
||||
@@ -14,7 +14,7 @@
|
||||
use super::base::UeBase;
|
||||
use crate::unit::rentry::{UeConfigInstall, UeConfigUnit};
|
||||
use crate::unit::util::UnitFile;
|
||||
-use confique::Config;
|
||||
+use confique::{Config, FileFormat, Partial};
|
||||
use serde::{Deserialize, Deserializer, Serialize};
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
@@ -132,21 +132,28 @@ impl UeConfig {
|
||||
}
|
||||
|
||||
pub(super) fn load_fragment_and_dropin(&self, files: &UnitFile, name: &String) -> Result<()> {
|
||||
- let mut builder = UeConfigData::builder().env();
|
||||
-
|
||||
+ type ConfigPartial = <UeConfigData as Config>::Partial;
|
||||
+ let mut partial: ConfigPartial = Partial::from_env().context(ConfiqueSnafu)?;
|
||||
+ /* The first config wins, so add default values at last. */
|
||||
let unit_conf_frag = files.get_unit_id_fragment_pathbuf(name);
|
||||
if unit_conf_frag.is_empty() {
|
||||
return Err(format!("{name} doesn't have corresponding config file").into());
|
||||
}
|
||||
// fragment
|
||||
- for v in unit_conf_frag {
|
||||
- if !v.exists() {
|
||||
- return Err(format!("Config file {:?} of {name} doesn't exist", v).into());
|
||||
+ for path in unit_conf_frag {
|
||||
+ if !path.exists() {
|
||||
+ return Err(format!("Config file {:?} of {name} doesn't exist", path).into());
|
||||
}
|
||||
- builder = builder.file(&v);
|
||||
+ partial = match confique::File::with_format(&path, FileFormat::Toml).load() {
|
||||
+ Err(e) => {
|
||||
+ log::error!("Failed to load {path:?}: {e}, skipping");
|
||||
+ continue;
|
||||
+ }
|
||||
+ Ok(v) => partial.with_fallback(v),
|
||||
+ };
|
||||
}
|
||||
-
|
||||
- let mut configer = builder.load().context(ConfiqueSnafu)?;
|
||||
+ partial = partial.with_fallback(ConfigPartial::default_values());
|
||||
+ let mut configer = UeConfigData::from_partial(partial).context(ConfiqueSnafu)?;
|
||||
|
||||
// dropin
|
||||
for v in files.get_unit_wants_symlink_units(name) {
|
||||
diff --git a/core/bin/unit/util/unit_file.rs b/core/bin/unit/util/unit_file.rs
|
||||
index 0a0fa9f..eb9404b 100644
|
||||
--- a/core/bin/unit/util/unit_file.rs
|
||||
+++ b/core/bin/unit/util/unit_file.rs
|
||||
@@ -118,12 +118,7 @@ impl UnitFileData {
|
||||
if file_name.starts_with('.') || file_name.ends_with(".toml") {
|
||||
continue;
|
||||
}
|
||||
- let path = format!("{}.toml", fragment.to_string_lossy());
|
||||
-
|
||||
- if let Err(e) = std::fs::copy(fragment, &path) {
|
||||
- log::warn!("copy file content to toml file error: {}", e);
|
||||
- }
|
||||
- res.push(Path::new(&path).to_path_buf());
|
||||
+ res.push(fragment);
|
||||
}
|
||||
}
|
||||
/* {/etc/sysmater, /usr/lib/sysmaster}/foo.service */
|
||||
@@ -135,14 +130,8 @@ impl UnitFileData {
|
||||
if config_path.is_symlink() {
|
||||
return None;
|
||||
}
|
||||
- /* Add .toml to the original path name */
|
||||
- let path_toml = format!("{}.toml", config_path.to_string_lossy());
|
||||
- let to = Path::new(&path_toml);
|
||||
- if let Err(e) = std::fs::copy(config_path, to) {
|
||||
- log::warn!("copy file content to toml file error: {}", e);
|
||||
- return None;
|
||||
- }
|
||||
- res.push(to.to_path_buf());
|
||||
+
|
||||
+ res.push(config_path);
|
||||
Some(res)
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,541 +0,0 @@
|
||||
From dc03b566b2dc087f1d8ba27d4bcd796578fc68af Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 28 Jun 2023 10:42:36 +0800
|
||||
Subject: [PATCH] refactor: move UmIf functions, no functional change
|
||||
|
||||
There are many functions in 'impl UmIf for UnitManager' just call the same
|
||||
name function in 'impl UnitManager', this commit moves these functions from
|
||||
'impl UnitManager' to 'impl UmIf for UnitManager'. No functional change.
|
||||
---
|
||||
core/bin/unit/manager.rs | 369 ++++++++++++++-------------------------
|
||||
core/lib/unit/umif.rs | 20 ---
|
||||
2 files changed, 134 insertions(+), 255 deletions(-)
|
||||
|
||||
diff --git a/core/bin/unit/manager.rs b/core/bin/unit/manager.rs
|
||||
index f548817..2e6caba 100644
|
||||
--- a/core/bin/unit/manager.rs
|
||||
+++ b/core/bin/unit/manager.rs
|
||||
@@ -269,7 +269,19 @@ pub struct UnitManager {
|
||||
impl UmIf for UnitManager {
|
||||
/// check the unit s_u_name and t_u_name have atom relation
|
||||
fn unit_has_dependecy(&self, s_u_name: &str, atom: UnitRelationAtom, t_u_name: &str) -> bool {
|
||||
- self.unit_has_dependecy(s_u_name, atom, t_u_name)
|
||||
+ let s_unit = if let Some(s_unit) = self.db.units_get(s_u_name) {
|
||||
+ s_unit
|
||||
+ } else {
|
||||
+ return false;
|
||||
+ };
|
||||
+
|
||||
+ let t_unit = if let Some(unit) = self.db.units_get(t_u_name) {
|
||||
+ unit
|
||||
+ } else {
|
||||
+ return false;
|
||||
+ };
|
||||
+
|
||||
+ self.db.dep_is_dep_atom_with(&s_unit, atom, &t_unit)
|
||||
}
|
||||
|
||||
///add a unit dependency to th unit deplist
|
||||
@@ -284,7 +296,20 @@ impl UmIf for UnitManager {
|
||||
add_ref: bool,
|
||||
mask: UnitDependencyMask,
|
||||
) -> Result<()> {
|
||||
- self.unit_add_dependency(unit_name, relation, target_name, add_ref, mask)
|
||||
+ let s_unit = if let Some(unit) = self.load_unitx(unit_name) {
|
||||
+ unit
|
||||
+ } else {
|
||||
+ return Err(Error::UnitActionENoent);
|
||||
+ };
|
||||
+ let t_unit = if let Some(unit) = self.load_unitx(target_name) {
|
||||
+ unit
|
||||
+ } else {
|
||||
+ return Err(Error::UnitActionENoent);
|
||||
+ };
|
||||
+
|
||||
+ self.rt
|
||||
+ .unit_add_dependency(s_unit, relation, t_unit, add_ref, mask);
|
||||
+ Ok(())
|
||||
}
|
||||
|
||||
///add two unit dependency to the unit
|
||||
@@ -307,7 +332,11 @@ impl UmIf for UnitManager {
|
||||
|
||||
/// load the unit for reference name
|
||||
fn load_unit_success(&self, name: &str) -> bool {
|
||||
- self.load_unit_success(name)
|
||||
+ if let Some(unit) = self.load_unitx(name) {
|
||||
+ return unit.load_state() == UnitLoadState::Loaded;
|
||||
+ }
|
||||
+
|
||||
+ false
|
||||
}
|
||||
|
||||
fn unit_enabled(&self, name: &str) -> Result<()> {
|
||||
@@ -329,17 +358,36 @@ impl UmIf for UnitManager {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+ /// check if there is already a stop job in process
|
||||
fn has_stop_job(&self, name: &str) -> bool {
|
||||
- self.has_stop_job(name)
|
||||
+ let u = match self.db.units_get(name) {
|
||||
+ None => return false,
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ self.jm.has_stop_job(&u)
|
||||
}
|
||||
|
||||
+ /// check if there is already a start job in process
|
||||
fn has_start_job(&self, name: &str) -> bool {
|
||||
- self.has_start_job(name)
|
||||
+ let u = match self.db.units_get(name) {
|
||||
+ None => return false,
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
+ self.jm.has_start_job(&u)
|
||||
}
|
||||
|
||||
/// check the unit that will be triggered by {name} is in active or activating state
|
||||
fn relation_active_or_pending(&self, name: &str) -> bool {
|
||||
- self.relation_active_or_pending(name)
|
||||
+ let deps = self.db.dep_gets(name, UnitRelations::UnitTriggers);
|
||||
+ let mut pending: bool = false;
|
||||
+ for dep in deps.iter() {
|
||||
+ if dep.active_or_activating() {
|
||||
+ pending = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ pending
|
||||
}
|
||||
|
||||
fn unit_destroy_runtime_data(&self, runtime_directory: Vec<PathBuf>) -> Result<()> {
|
||||
@@ -355,8 +403,9 @@ impl UmIf for UnitManager {
|
||||
self.start_unit(name, false, "replace")
|
||||
}
|
||||
|
||||
+ ///
|
||||
fn events(&self) -> Rc<Events> {
|
||||
- self.events()
|
||||
+ Rc::clone(&self.events)
|
||||
}
|
||||
|
||||
fn child_unwatch_pid(&self, id: &str, pid: Pid) {
|
||||
@@ -388,32 +437,66 @@ impl UmIf for UnitManager {
|
||||
}
|
||||
}
|
||||
|
||||
+ /// add pid and its correspond unit to
|
||||
fn child_watch_pid(&self, id: &str, pid: Pid) {
|
||||
- self.child_watch_pid(id, pid)
|
||||
+ self.db.child_add_watch_pid(id, pid)
|
||||
}
|
||||
|
||||
fn child_watch_all_pids(&self, id: &str) {
|
||||
- self.child_watch_all_pids(id)
|
||||
+ self.db.child_watch_all_pids(id)
|
||||
}
|
||||
|
||||
fn child_unwatch_all_pids(&self, id: &str) {
|
||||
- self.child_unwatch_all_pids(id)
|
||||
+ self.db.child_unwatch_all_pids(id)
|
||||
}
|
||||
|
||||
fn notify_socket(&self) -> Option<PathBuf> {
|
||||
- self.notify_socket()
|
||||
+ self.notify.notify_sock()
|
||||
}
|
||||
|
||||
fn same_unit_with_pid(&self, unit: &str, pid: Pid) -> bool {
|
||||
- self.same_unit_with_pid(unit, pid)
|
||||
+ if !process_util::valid_pid(pid) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ let p_unit = self.db.get_unit_by_pid(pid);
|
||||
+ if p_unit.is_none() {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if p_unit.unwrap().id() == unit {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ false
|
||||
}
|
||||
|
||||
fn collect_socket_fds(&self, name: &str) -> Vec<i32> {
|
||||
- self.collect_socket_fds(name)
|
||||
+ let deps = self.db.dep_gets(name, UnitRelations::UnitTriggeredBy);
|
||||
+ let mut fds = Vec::new();
|
||||
+ for dep in deps.iter() {
|
||||
+ if dep.unit_type() != UnitType::UnitSocket {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ fds.extend(dep.collect_fds())
|
||||
+ }
|
||||
+
|
||||
+ fds
|
||||
}
|
||||
|
||||
- fn get_dependency_list(&self, _unit_name: &str, _atom: UnitRelationAtom) -> Vec<String> {
|
||||
- self.get_dependency_list(_unit_name, _atom)
|
||||
+ fn get_dependency_list(&self, unit_name: &str, atom: UnitRelationAtom) -> Vec<String> {
|
||||
+ let s_unit = if let Some(unit) = self.db.units_get(unit_name) {
|
||||
+ unit
|
||||
+ } else {
|
||||
+ log::error!("unit [{}] not found!!!!!", unit_name);
|
||||
+ return Vec::new();
|
||||
+ };
|
||||
+ let dep_units = self.db.dep_gets_atom(&s_unit, atom);
|
||||
+ dep_units
|
||||
+ .iter()
|
||||
+ .map(|uxr| uxr.unit().id().to_string())
|
||||
+ .collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
fn unit_has_default_dependecy(&self, _unit_name: &str) -> bool {
|
||||
@@ -426,7 +509,11 @@ impl UmIf for UnitManager {
|
||||
}
|
||||
|
||||
fn units_get_all(&self, unit_type: Option<UnitType>) -> Vec<String> {
|
||||
- self.units_get_all(unit_type)
|
||||
+ let units = self.db.units_get_all(unit_type);
|
||||
+ units
|
||||
+ .iter()
|
||||
+ .map(|uxr| uxr.unit().id().to_string())
|
||||
+ .collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
fn current_active_state(&self, _unit_name: &str) -> UnitActiveState {
|
||||
@@ -464,23 +551,40 @@ impl UmIf for UnitManager {
|
||||
}
|
||||
|
||||
fn restart_unit(&self, name: &str, is_manual: bool) -> Result<()> {
|
||||
- self.restart_unit(name, is_manual)
|
||||
- }
|
||||
-
|
||||
- fn get_log_file(&self) -> &str {
|
||||
- self.get_log_file()
|
||||
- }
|
||||
+ let unit = match self.load_unitx(name) {
|
||||
+ None => {
|
||||
+ return Err(Error::UnitActionENoent);
|
||||
+ }
|
||||
+ Some(v) => v,
|
||||
+ };
|
||||
|
||||
- fn get_log_target(&self) -> &str {
|
||||
- self.get_log_target()
|
||||
- }
|
||||
+ if is_manual
|
||||
+ && unit
|
||||
+ .get_config()
|
||||
+ .config_data()
|
||||
+ .borrow()
|
||||
+ .Unit
|
||||
+ .RefuseManualStop
|
||||
+ {
|
||||
+ return Err(Error::UnitActionERefuseManualStop);
|
||||
+ }
|
||||
|
||||
- fn get_log_file_size(&self) -> u32 {
|
||||
- self.get_log_file_size()
|
||||
- }
|
||||
+ if unit
|
||||
+ .get_config()
|
||||
+ .config_data()
|
||||
+ .borrow()
|
||||
+ .Unit
|
||||
+ .RefuseManualStart
|
||||
+ {
|
||||
+ return Err(Error::UnitActionERefuseManualStart);
|
||||
+ }
|
||||
|
||||
- fn get_log_file_number(&self) -> u32 {
|
||||
- self.get_log_file_number()
|
||||
+ self.jm.exec(
|
||||
+ &JobConf::new(&unit, JobKind::Restart),
|
||||
+ JobMode::Replace,
|
||||
+ &mut JobAffect::new(false),
|
||||
+ )?;
|
||||
+ Ok(())
|
||||
}
|
||||
|
||||
/// set the service's socket fd
|
||||
@@ -504,21 +608,6 @@ impl UmIf for UnitManager {
|
||||
|
||||
/// the declaration "pub(self)" is for identification only.
|
||||
impl UnitManager {
|
||||
- /// add pid and its correspond unit to
|
||||
- fn child_watch_pid(&self, id: &str, pid: Pid) {
|
||||
- self.db.child_add_watch_pid(id, pid)
|
||||
- }
|
||||
-
|
||||
- /// add all the pid of unit id, read pids from cgroup path.
|
||||
- fn child_watch_all_pids(&self, id: &str) {
|
||||
- self.db.child_watch_all_pids(id)
|
||||
- }
|
||||
-
|
||||
- /// remove all pids
|
||||
- fn child_unwatch_all_pids(&self, id: &str) {
|
||||
- self.db.child_unwatch_all_pids(id)
|
||||
- }
|
||||
-
|
||||
/// delete the pid from the db
|
||||
fn child_unwatch_pid(&self, id: &str, pid: Pid) {
|
||||
self.db.child_unwatch_pid(id, pid)
|
||||
@@ -543,102 +632,6 @@ impl UnitManager {
|
||||
self.db.units_get(name).map(|uxr| uxr.unit())
|
||||
}
|
||||
|
||||
- ///
|
||||
- fn units_get_all(&self, unit_type: Option<UnitType>) -> Vec<String> {
|
||||
- let units = self.db.units_get_all(unit_type);
|
||||
- units
|
||||
- .iter()
|
||||
- .map(|uxr| uxr.unit().id().to_string())
|
||||
- .collect::<Vec<_>>()
|
||||
- }
|
||||
-
|
||||
- /// load the unit for reference name
|
||||
- fn load_unit_success(&self, name: &str) -> bool {
|
||||
- if let Some(unit) = self.load_unitx(name) {
|
||||
- return unit.load_state() == UnitLoadState::Loaded;
|
||||
- }
|
||||
-
|
||||
- false
|
||||
- }
|
||||
-
|
||||
- /// check the unit s_u_name and t_u_name have atom relation
|
||||
- fn unit_has_dependecy(&self, s_u_name: &str, atom: UnitRelationAtom, t_u_name: &str) -> bool {
|
||||
- let s_unit = if let Some(s_unit) = self.db.units_get(s_u_name) {
|
||||
- s_unit
|
||||
- } else {
|
||||
- return false;
|
||||
- };
|
||||
-
|
||||
- let t_unit = if let Some(unit) = self.db.units_get(t_u_name) {
|
||||
- unit
|
||||
- } else {
|
||||
- return false;
|
||||
- };
|
||||
-
|
||||
- self.db.dep_is_dep_atom_with(&s_unit, atom, &t_unit)
|
||||
- }
|
||||
-
|
||||
- ///add a unit dependency to th unit deplist
|
||||
- /// can called by sub unit
|
||||
- /// sub unit add some default dependency
|
||||
- ///
|
||||
- pub fn unit_add_dependency(
|
||||
- &self,
|
||||
- unit_name: &str,
|
||||
- relation: UnitRelations,
|
||||
- target_name: &str,
|
||||
- add_ref: bool,
|
||||
- mask: UnitDependencyMask,
|
||||
- ) -> Result<()> {
|
||||
- let s_unit = if let Some(unit) = self.load_unitx(unit_name) {
|
||||
- unit
|
||||
- } else {
|
||||
- return Err(Error::UnitActionENoent);
|
||||
- };
|
||||
- let t_unit = if let Some(unit) = self.load_unitx(target_name) {
|
||||
- unit
|
||||
- } else {
|
||||
- return Err(Error::UnitActionENoent);
|
||||
- };
|
||||
-
|
||||
- self.rt
|
||||
- .unit_add_dependency(s_unit, relation, t_unit, add_ref, mask);
|
||||
- Ok(())
|
||||
- }
|
||||
-
|
||||
- /// get the unit the has atom relation with the unit
|
||||
- fn get_dependency_list(&self, unit_name: &str, atom: UnitRelationAtom) -> Vec<String> {
|
||||
- let s_unit = if let Some(unit) = self.db.units_get(unit_name) {
|
||||
- unit
|
||||
- } else {
|
||||
- log::error!("unit [{}] not found!!!!!", unit_name);
|
||||
- return Vec::new();
|
||||
- };
|
||||
- let dep_units = self.db.dep_gets_atom(&s_unit, atom);
|
||||
- dep_units
|
||||
- .iter()
|
||||
- .map(|uxr| uxr.unit().id().to_string())
|
||||
- .collect::<Vec<_>>()
|
||||
- }
|
||||
-
|
||||
- /// check if there is already a stop job in process
|
||||
- fn has_stop_job(&self, name: &str) -> bool {
|
||||
- let u = match self.db.units_get(name) {
|
||||
- None => return false,
|
||||
- Some(v) => v,
|
||||
- };
|
||||
- self.jm.has_stop_job(&u)
|
||||
- }
|
||||
-
|
||||
- /// check if there is already a start job in process
|
||||
- fn has_start_job(&self, name: &str) -> bool {
|
||||
- let u = match self.db.units_get(name) {
|
||||
- None => return false,
|
||||
- Some(v) => v,
|
||||
- };
|
||||
- self.jm.has_start_job(&u)
|
||||
- }
|
||||
-
|
||||
///
|
||||
pub fn unit_emergency_action(&self, action: UnitEmergencyAction, reason: String) {
|
||||
if action == UnitEmergencyAction::None {
|
||||
@@ -713,53 +706,6 @@ impl UnitManager {
|
||||
}
|
||||
}
|
||||
|
||||
- /// return the fds that trigger the unit {name};
|
||||
- fn collect_socket_fds(&self, name: &str) -> Vec<i32> {
|
||||
- let deps = self.db.dep_gets(name, UnitRelations::UnitTriggeredBy);
|
||||
- let mut fds = Vec::new();
|
||||
- for dep in deps.iter() {
|
||||
- if dep.unit_type() != UnitType::UnitSocket {
|
||||
- continue;
|
||||
- }
|
||||
-
|
||||
- fds.extend(dep.collect_fds())
|
||||
- }
|
||||
-
|
||||
- fds
|
||||
- }
|
||||
-
|
||||
- /// check the unit that will be triggered by {name} is in active or activating state
|
||||
- fn relation_active_or_pending(&self, name: &str) -> bool {
|
||||
- let deps = self.db.dep_gets(name, UnitRelations::UnitTriggers);
|
||||
- let mut pending: bool = false;
|
||||
- for dep in deps.iter() {
|
||||
- if dep.active_or_activating() {
|
||||
- pending = true;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- pending
|
||||
- }
|
||||
-
|
||||
- /// check the pid corresponding unit is the same with the unit
|
||||
- fn same_unit_with_pid(&self, unit: &str, pid: Pid) -> bool {
|
||||
- if !process_util::valid_pid(pid) {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- let p_unit = self.db.get_unit_by_pid(pid);
|
||||
- if p_unit.is_none() {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if p_unit.unwrap().id() == unit {
|
||||
- return true;
|
||||
- }
|
||||
-
|
||||
- false
|
||||
- }
|
||||
-
|
||||
fn start_unit(&self, name: &str, is_manual: bool, job_mode_str: &str) -> Result<()> {
|
||||
let unit = match self.load_unitx(name) {
|
||||
None => {
|
||||
@@ -793,16 +739,6 @@ impl UnitManager {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
- /// return the notify path
|
||||
- fn notify_socket(&self) -> Option<PathBuf> {
|
||||
- self.notify.notify_sock()
|
||||
- }
|
||||
-
|
||||
- ///
|
||||
- pub fn events(&self) -> Rc<Events> {
|
||||
- Rc::clone(&self.events)
|
||||
- }
|
||||
-
|
||||
///
|
||||
pub fn reliability(&self) -> Rc<Reliability> {
|
||||
Rc::clone(&self.reli)
|
||||
@@ -875,43 +811,6 @@ impl UnitManager {
|
||||
}
|
||||
}
|
||||
|
||||
- pub(self) fn restart_unit(&self, name: &str, is_manual: bool) -> Result<()> {
|
||||
- let unit = match self.load_unitx(name) {
|
||||
- None => {
|
||||
- return Err(Error::UnitActionENoent);
|
||||
- }
|
||||
- Some(v) => v,
|
||||
- };
|
||||
-
|
||||
- if is_manual
|
||||
- && unit
|
||||
- .get_config()
|
||||
- .config_data()
|
||||
- .borrow()
|
||||
- .Unit
|
||||
- .RefuseManualStop
|
||||
- {
|
||||
- return Err(Error::UnitActionERefuseManualStop);
|
||||
- }
|
||||
-
|
||||
- if unit
|
||||
- .get_config()
|
||||
- .config_data()
|
||||
- .borrow()
|
||||
- .Unit
|
||||
- .RefuseManualStart
|
||||
- {
|
||||
- return Err(Error::UnitActionERefuseManualStart);
|
||||
- }
|
||||
-
|
||||
- self.jm.exec(
|
||||
- &JobConf::new(&unit, JobKind::Restart),
|
||||
- JobMode::Replace,
|
||||
- &mut JobAffect::new(false),
|
||||
- )?;
|
||||
- Ok(())
|
||||
- }
|
||||
-
|
||||
fn get_unit_cgroup_path(&self, unit: Rc<Unit>) -> String {
|
||||
let res = match unit.cg_path().to_str() {
|
||||
Some(res) => res.to_string(),
|
||||
diff --git a/core/lib/unit/umif.rs b/core/lib/unit/umif.rs
|
||||
index a000a3d..18616f5 100644
|
||||
--- a/core/lib/unit/umif.rs
|
||||
+++ b/core/lib/unit/umif.rs
|
||||
@@ -190,26 +190,6 @@ pub trait UmIf {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
- /// get the log file config
|
||||
- fn get_log_file(&self) -> &str {
|
||||
- ""
|
||||
- }
|
||||
-
|
||||
- /// get the log file size
|
||||
- fn get_log_file_size(&self) -> u32 {
|
||||
- 0
|
||||
- }
|
||||
-
|
||||
- /// get the log file number
|
||||
- fn get_log_file_number(&self) -> u32 {
|
||||
- 0
|
||||
- }
|
||||
-
|
||||
- /// get the log target config
|
||||
- fn get_log_target(&self) -> &str {
|
||||
- ""
|
||||
- }
|
||||
-
|
||||
/* ========== ONLY VALID IN SERVICE ========== */
|
||||
/// set the service's socket fd
|
||||
fn service_set_socket_fd(&self, _service_name: &str, _fd: i32) {}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,17 +0,0 @@
|
||||
From 81acf0ac1e5c6d2afd3159f0c1e0bc1569c7ecd9 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Thu, 29 Jun 2023 14:28:46 +0800
|
||||
Subject: [PATCH] refactor: mv system.toml to config/conf
|
||||
|
||||
---
|
||||
{units => config/conf}/system.toml | 0
|
||||
1 file changed, 0 insertions(+), 0 deletions(-)
|
||||
rename {units => config/conf}/system.toml (100%)
|
||||
|
||||
diff --git a/units/system.toml b/config/conf/system.toml
|
||||
similarity index 100%
|
||||
rename from units/system.toml
|
||||
rename to config/conf/system.toml
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,191 +0,0 @@
|
||||
From 2e5a2327f009432ac9bd247567f2b6d953ec63c6 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Thu, 13 Jul 2023 14:50:28 +0800
|
||||
Subject: [PATCH] test: add UT testcase for command dispatch
|
||||
|
||||
---
|
||||
core/sysmaster/manager/commands.rs | 171 +++++++++++++++++++++++++++++
|
||||
1 file changed, 171 insertions(+)
|
||||
|
||||
diff --git a/core/sysmaster/manager/commands.rs b/core/sysmaster/manager/commands.rs
|
||||
index ad3e97f..a05d949 100644
|
||||
--- a/core/sysmaster/manager/commands.rs
|
||||
+++ b/core/sysmaster/manager/commands.rs
|
||||
@@ -132,3 +132,174 @@ where
|
||||
0i8
|
||||
}
|
||||
}
|
||||
+
|
||||
+#[cfg(test)]
|
||||
+mod tests {
|
||||
+ use std::sync::{Arc, Mutex};
|
||||
+ use std::{os::unix::net::UnixStream, rc::Rc};
|
||||
+
|
||||
+ use cmdproto::error::Result;
|
||||
+ use cmdproto::proto::{execute::ExecuterAction, unit_comm};
|
||||
+ use cmdproto::proto::{CommandRequest, ProstClientStream};
|
||||
+ use constants::SCTL_SOCKET;
|
||||
+ use event::{EventState, Events};
|
||||
+ use sysmaster::rel::{ReliConf, Reliability};
|
||||
+
|
||||
+ use crate::manager::RELI_HISTORY_MAX_DBS;
|
||||
+
|
||||
+ use super::Commands;
|
||||
+
|
||||
+ struct TestExecAction {}
|
||||
+
|
||||
+ impl ExecuterAction for TestExecAction {
|
||||
+ type Error = nix::Error;
|
||||
+ type Status = nix::Error;
|
||||
+
|
||||
+ fn start(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Err(nix::Error::ENOENT)
|
||||
+ }
|
||||
+
|
||||
+ fn stop(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn restart(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn reload(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn isolate(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn reset_failed(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn status(&self, _unit_name: &str) -> Result<Self::Status, Self::Error> {
|
||||
+ Ok(nix::Error::EINVAL)
|
||||
+ }
|
||||
+
|
||||
+ fn list_units(&self) -> Result<String, Self::Error> {
|
||||
+ Ok(String::new())
|
||||
+ }
|
||||
+
|
||||
+ fn suspend(&self) -> Result<i32, Self::Error> {
|
||||
+ Ok(0)
|
||||
+ }
|
||||
+
|
||||
+ fn poweroff(&self) -> Result<i32, Self::Error> {
|
||||
+ Ok(0)
|
||||
+ }
|
||||
+
|
||||
+ fn reboot(&self) -> Result<i32, Self::Error> {
|
||||
+ Ok(0)
|
||||
+ }
|
||||
+
|
||||
+ fn halt(&self) -> Result<i32, Self::Error> {
|
||||
+ Ok(0)
|
||||
+ }
|
||||
+
|
||||
+ fn disable(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn enable(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn mask(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn unmask(&self, _unit_name: &str) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn daemon_reload(&self) {}
|
||||
+
|
||||
+ fn daemon_reexec(&self) {}
|
||||
+
|
||||
+ fn switch_root(&self, _init: &[String]) -> Result<(), Self::Error> {
|
||||
+ Ok(())
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_sctl_socket() {
|
||||
+ if !nix::unistd::getuid().is_root() {
|
||||
+ println!(
|
||||
+ "We will create a socket under '/run', so we must be root to run this testcase."
|
||||
+ );
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ let mutex_main = Arc::new(Mutex::new(0));
|
||||
+ let mutex_child = Arc::clone(&mutex_main);
|
||||
+ let temp = mutex_main.lock().unwrap();
|
||||
+
|
||||
+ std::thread::spawn(move || {
|
||||
+ /* Wait until the main thread are ready to process our request. */
|
||||
+ let mut test_ok = mutex_child.lock().unwrap();
|
||||
+ /* 1. Start a service as root. */
|
||||
+ let stream = UnixStream::connect(SCTL_SOCKET).unwrap();
|
||||
+ let mut client = ProstClientStream::new(stream);
|
||||
+
|
||||
+ let req = CommandRequest::new_unitcomm(
|
||||
+ unit_comm::Action::Start,
|
||||
+ vec!["foo.service".to_string()],
|
||||
+ );
|
||||
+ let data = client.execute(req).unwrap();
|
||||
+ if !data
|
||||
+ .message
|
||||
+ .eq("Failed to start foo.service: ENOENT: No such file or directory")
|
||||
+ {
|
||||
+ return;
|
||||
+ }
|
||||
+ /* 2. Start a service as an unprivileged user. */
|
||||
+ if nix::unistd::setuid(nix::unistd::Uid::from_raw(1000)).is_err() {
|
||||
+ println!("Failed to set ourself to unprivileged user");
|
||||
+ return;
|
||||
+ }
|
||||
+ let stream = UnixStream::connect(SCTL_SOCKET).unwrap();
|
||||
+ let mut client = ProstClientStream::new(stream);
|
||||
+
|
||||
+ let req = CommandRequest::new_unitcomm(
|
||||
+ unit_comm::Action::Start,
|
||||
+ vec!["foo.service".to_string()],
|
||||
+ );
|
||||
+ let data = client.execute(req).unwrap();
|
||||
+ if !data
|
||||
+ .message
|
||||
+ .eq("Failed to execute your command: Operation not permitted.")
|
||||
+ {
|
||||
+ return;
|
||||
+ }
|
||||
+ *test_ok = 1;
|
||||
+ });
|
||||
+
|
||||
+ let exec_action = TestExecAction {};
|
||||
+ let reli = Rc::new(Reliability::new(
|
||||
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
|
||||
+ ));
|
||||
+ /* This will remove the /run/sysmaster/sctl on the compiling environment. */
|
||||
+ let command = Rc::new(Commands::new(&reli, exec_action));
|
||||
+ let e = Events::new().unwrap();
|
||||
+ e.add_source(command.clone()).unwrap();
|
||||
+ e.set_enabled(command.clone(), EventState::On).unwrap();
|
||||
+ /* Drop temp, let the child thread go. */
|
||||
+ drop(temp);
|
||||
+ /* We have 2 events to dispatch, but are not sure if we can get these events after waiting
|
||||
+ * 300ms, 400ms. So we wait one more time to make sure all events are dispatched. */
|
||||
+ e.run(300).unwrap();
|
||||
+ e.run(400).unwrap();
|
||||
+ e.run(300).unwrap();
|
||||
+ let test_ok = mutex_main.lock().unwrap();
|
||||
+ /* The value should be set to 1 in the child process, if everything works well. */
|
||||
+ assert_eq!(*test_ok, 1);
|
||||
+ e.del_source(command).unwrap();
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
From 614e5cd80a89cf5b4eb3f9cd3fe9e8fca9c30e97 Mon Sep 17 00:00:00 2001
|
||||
From: love_hangzhou <421699196@qq.com>
|
||||
Date: Wed, 19 Jul 2023 22:28:05 +0800
|
||||
Subject: [PATCH] test(condition): add unit test for condition
|
||||
|
||||
---
|
||||
coms/service/src/config.rs | 13 +++++++
|
||||
core/sysmaster/unit/entry/condition.rs | 53 ++++++++++++++++++++++++++
|
||||
2 files changed, 66 insertions(+)
|
||||
|
||||
diff --git a/coms/service/src/config.rs b/coms/service/src/config.rs
|
||||
index e61340b..ec2ebf4 100644
|
||||
--- a/coms/service/src/config.rs
|
||||
+++ b/coms/service/src/config.rs
|
||||
@@ -218,4 +218,17 @@ mod tests {
|
||||
|
||||
assert!(result.is_ok());
|
||||
}
|
||||
+ #[test]
|
||||
+ fn test_get_service_type() {
|
||||
+ let mut file_path = get_project_root().unwrap();
|
||||
+ file_path.push("tests/test_units/config.service");
|
||||
+
|
||||
+ let paths = vec![file_path];
|
||||
+
|
||||
+ let comm = Rc::new(ServiceUnitComm::new());
|
||||
+ let config = ServiceConfig::new(&comm);
|
||||
+
|
||||
+ let result = config.load(paths, false);
|
||||
+ assert_eq!(config.service_type(), b"Simple")
|
||||
+ }
|
||||
}
|
||||
diff --git a/core/sysmaster/unit/entry/condition.rs b/core/sysmaster/unit/entry/condition.rs
|
||||
index c3836b4..225297e 100644
|
||||
--- a/core/sysmaster/unit/entry/condition.rs
|
||||
+++ b/core/sysmaster/unit/entry/condition.rs
|
||||
@@ -160,3 +160,56 @@ impl UeCondition {
|
||||
Self::condition_vec_test(assert_conditions)
|
||||
}
|
||||
}
|
||||
+
|
||||
+#[cfg(test)]
|
||||
+mod tests {
|
||||
+ use basic::condition::ConditionType;
|
||||
+
|
||||
+ use crate::unit::entry::condition::condition_keys::CONDITION_NEEDS_UPDATE;
|
||||
+
|
||||
+ use super::{
|
||||
+ assert_keys::ASSERT_PATH_EXISTS, condition_keys::CONDITION_PATH_EXISTS, UeCondition,
|
||||
+ };
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_new_condition_trigger() {
|
||||
+ let uc = UeCondition::new();
|
||||
+ let c = uc.new_condition(ConditionType::FileNotEmpty, String::from("|!test"));
|
||||
+ assert_eq!(c.trigger(), 1, "condition trigger is {}", c.trigger());
|
||||
+ }
|
||||
+ #[test]
|
||||
+ fn test_new_condition_is_not_trigger() {
|
||||
+ let uc = UeCondition::new();
|
||||
+ let c = uc.new_condition(ConditionType::FileNotEmpty, String::from("!test"));
|
||||
+ assert_eq!(c.trigger(), 0, "condition trigger is {}", c.trigger());
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_new_condition_is_revert() {
|
||||
+ let uc = UeCondition::new();
|
||||
+ let c = uc.new_condition(ConditionType::FileNotEmpty, String::from("!test"));
|
||||
+ assert_eq!(c.revert(), 1, "condition revert is {}", c.revert());
|
||||
+ }
|
||||
+ #[test]
|
||||
+ fn test_new_condition_is_not_revert() {
|
||||
+ let uc = UeCondition::new();
|
||||
+ let c = uc.new_condition(ConditionType::FileNotEmpty, String::from("test"));
|
||||
+ assert_eq!(c.revert(), 0, "condition revert is {}", c.revert());
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_add_condition() {
|
||||
+ let uc = UeCondition::new();
|
||||
+ uc.add_condition(CONDITION_PATH_EXISTS, String::from("test"));
|
||||
+ assert_eq!(uc.conditions.borrow().0.len(), 1);
|
||||
+ uc.add_condition(CONDITION_NEEDS_UPDATE, String::from("True"));
|
||||
+ assert_eq!(uc.conditions.borrow().0.len(), 2);
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn test_add_assert() {
|
||||
+ let uc = UeCondition::new();
|
||||
+ uc.add_assert(ASSERT_PATH_EXISTS, String::from("assert"));
|
||||
+ assert_eq!(uc.asserts.borrow().0.len(), 1);
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,689 +0,0 @@
|
||||
From 3533162ce06945fe2bae8ddb4d0200e6b3e361c2 Mon Sep 17 00:00:00 2001
|
||||
From: oh_thats_great <hexinyue1@huawei.com>
|
||||
Date: Tue, 11 Jul 2023 16:37:43 +0800
|
||||
Subject: [PATCH] test: support yum install sysmaster
|
||||
|
||||
---
|
||||
install.sh | 30 +++++++------
|
||||
tests/common/docker_lib.sh | 45 ++++++++++++++++---
|
||||
tests/common/monitor.sh | 2 +-
|
||||
tests/common/util_lib.sh | 36 ++++++---------
|
||||
.../unit_config_test/action_001/action_001.sh | 1 -
|
||||
.../unit_config_test/assert_001/assert_001.sh | 1 -
|
||||
.../unit_config_test/condition_001/check.sh | 2 +-
|
||||
.../condition_001/condition_001.sh | 1 -
|
||||
.../unit_config_test/condition_002/check.sh | 2 +-
|
||||
.../condition_002/condition_002.sh | 1 -
|
||||
.../condition_003/condition_003.sh | 1 -
|
||||
.../unit_config_test/dependency_001/check.sh | 2 +-
|
||||
.../dependency_001/dependency_001.sh | 1 -
|
||||
.../dependency_002/dependency_002.sh | 1 -
|
||||
.../dependency_003/dependency_003.sh | 1 -
|
||||
.../dependency_004/dependency_004.sh | 1 -
|
||||
.../dependency_005/dependency_005.sh | 1 -
|
||||
.../unit_config_test/env_001/env_001.sh | 1 -
|
||||
.../unit_config_test/exec_001/exec_001.sh | 1 -
|
||||
.../isolate_001/isolate_001.sh | 1 -
|
||||
.../unit_config_test/kill_001/kill_001.sh | 1 -
|
||||
.../unit_config_test/listen_001/check.sh | 2 +-
|
||||
.../unit_config_test/listen_001/listen_001.sh | 1 -
|
||||
.../unit_config_test/refuse_001/refuse_001.sh | 1 -
|
||||
.../restart_001/restart_001.sh | 1 -
|
||||
.../service_001/service_001.sh | 1 -
|
||||
.../service_002/service_002.sh | 1 -
|
||||
.../service_003/service_003.sh | 1 -
|
||||
.../unit_config_test/service_004/check.sh | 2 +-
|
||||
.../service_004/service_004.sh | 1 -
|
||||
.../unit_config_test/socket_001/check.sh | 2 +-
|
||||
.../unit_config_test/socket_001/socket_001.sh | 1 -
|
||||
.../startlimit_001/startlimit_001.sh | 1 -
|
||||
.../timeout_001/timeout_001.sh | 1 -
|
||||
.../timeout_002/timeout_002.sh | 1 -
|
||||
.../docker_example_001/check.sh | 3 +-
|
||||
tests/perf_test/cpu_time_001/check.sh | 2 +-
|
||||
tests/test_frame.sh | 7 +--
|
||||
38 files changed, 84 insertions(+), 78 deletions(-)
|
||||
|
||||
diff --git a/install.sh b/install.sh
|
||||
index 675c543..dc0e6da 100644
|
||||
--- a/install.sh
|
||||
+++ b/install.sh
|
||||
@@ -7,19 +7,23 @@ install_dir=${work_dir}/target/install/usr/lib/sysmaster
|
||||
|
||||
rm -rf "${work_dir}"/target/install
|
||||
|
||||
-install -Dm0755 -t ${work_dir}/target/install/usr/bin ${target_dir}/sctl || exit 1
|
||||
-install -Dm0755 -t ${work_dir}/target/install/usr/bin ${target_dir}/init || exit 1
|
||||
-install -Dm0755 -t ${install_dir} ${target_dir}/sysmaster || exit 1
|
||||
-install -Dm0755 -t ${install_dir} ${target_dir}/fstab || exit 1
|
||||
-install -Dm0755 -t ${install_dir} ${target_dir}/sysmonitor || exit 1
|
||||
-install -Dm0755 -t ${install_dir} ${target_dir}/random_seed || exit 1
|
||||
-install -Dm0755 -t ${install_dir} ${target_dir}/rc-local-generator || exit 1
|
||||
-install -Dm0755 -t ${install_dir} ${target_dir}/hostname_setup || exit 1
|
||||
+install -Dm0550 -t ${work_dir}/target/install/usr/bin ${target_dir}/sctl || exit 1
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/init || exit 1
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/sysmaster || exit 1
|
||||
+
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/fstab || exit 1
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/sysmonitor || exit 1
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/random_seed || exit 1
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/rc-local-generator || exit 1
|
||||
+install -Dm0550 -t ${install_dir} ${target_dir}/hostname_setup || exit 1
|
||||
+
|
||||
+install -Dm0640 -t ${install_dir} ${work_dir}/units/* || exit 1
|
||||
+install -Dm0640 -t ${install_dir}/plugin ${target_dir}/conf/plugin.conf || exit 1
|
||||
+install -Dm0640 -t ${work_dir}/target/install/etc/sysmaster ${target_dir}/conf/system.conf || exit 1
|
||||
|
||||
strip ${target_dir}/lib*.so
|
||||
|
||||
-install -Dm0644 -t ${install_dir}/plugin ${target_dir}/libmount.so || exit 1
|
||||
-install -Dm0644 -t ${install_dir}/plugin ${target_dir}/libservice.so || exit 1
|
||||
-install -Dm0644 -t ${install_dir}/plugin ${target_dir}/libsocket.so || exit 1
|
||||
-install -Dm0644 -t ${install_dir}/plugin ${target_dir}/libtarget.so || exit 1
|
||||
-install -Dm0644 -t ${install_dir}/plugin ${target_dir}/conf/plugin.conf || exit 1
|
||||
+install -Dm0750 -t ${install_dir}/plugin ${target_dir}/libmount.so || exit 1
|
||||
+install -Dm0750 -t ${install_dir}/plugin ${target_dir}/libservice.so || exit 1
|
||||
+install -Dm0750 -t ${install_dir}/plugin ${target_dir}/libsocket.so || exit 1
|
||||
+install -Dm0750 -t ${install_dir}/plugin ${target_dir}/libtarget.so || exit 1
|
||||
diff --git a/tests/common/docker_lib.sh b/tests/common/docker_lib.sh
|
||||
index cc57e51..2ff96b6 100755
|
||||
--- a/tests/common/docker_lib.sh
|
||||
+++ b/tests/common/docker_lib.sh
|
||||
@@ -43,15 +43,32 @@ function load_isula_img() {
|
||||
|
||||
function build_base_img() {
|
||||
cp -arf ${BUILD_PATH}/target/install "${TMP_DIR}"
|
||||
+ cp -arf /etc/yum.repos.d "${TMP_DIR}"
|
||||
|
||||
pushd "${TMP_DIR}"
|
||||
- cat << EOF > Dockerfile
|
||||
+ if yum list sysmaster; then
|
||||
+ cat << EOF > Dockerfile
|
||||
FROM ${BASE_IMG} as ${SYSMST_BASE_IMG}
|
||||
+
|
||||
+RUN rm -rf /etc/yum.repos.d && mkdir /etc/yum.repos.d
|
||||
+COPY yum.repos.d /etc/yum.repos.d/
|
||||
+RUN yum install -y sysmaster util-linux shadow sudo passwd net-tools iproute nmap
|
||||
+EOF
|
||||
+ else
|
||||
+ cat << EOF > Dockerfile
|
||||
+FROM ${BASE_IMG} as ${SYSMST_BASE_IMG}
|
||||
+
|
||||
+RUN rm -rf /etc/yum.repos.d && mkdir /etc/yum.repos.d
|
||||
+COPY yum.repos.d /etc/yum.repos.d/
|
||||
+RUN yum install -y util-linux shadow sudo passwd net-tools iproute nmap
|
||||
+
|
||||
COPY install/usr/bin/sctl /usr/bin/
|
||||
-COPY install/usr/bin/init /usr/bin/
|
||||
-RUN mkdir /usr/lib/sysmaster
|
||||
+RUN mkdir /usr/lib/sysmaster /etc/sysmaster
|
||||
COPY install/usr/lib/sysmaster /usr/lib/sysmaster/
|
||||
+COPY install/etc/sysmaster /etc/sysmaster/
|
||||
+RUN sed -i '/LogTarget/ s/=.*/="console-syslog"/' /etc/sysmaster/system.conf
|
||||
EOF
|
||||
+ fi
|
||||
cat Dockerfile
|
||||
if ! docker build -t "${SYSMST_BASE_IMG}:latest" .; then
|
||||
log_error "build ${SYSMST_BASE_IMG} image failed!"
|
||||
@@ -69,13 +86,29 @@ function build_isula_img() {
|
||||
|
||||
pushd "${TMP_DIR}"
|
||||
img_name=$(isula-build ctr-img images | grep "${BASE_IMG}" | head -n1 | awk '{print $1}')
|
||||
- cat << EOF > Dockerfile
|
||||
+ if yum list sysmaster; then
|
||||
+ cat << EOF > Dockerfile
|
||||
FROM ${img_name} as ${SYSMST_BASE_IMG}
|
||||
+
|
||||
+RUN rm -rf /etc/yum.repos.d && mkdir /etc/yum.repos.d
|
||||
+COPY yum.repos.d /usr/lib/sysmaster/
|
||||
+RUN yum install -y sysmaster util-linux shadow sudo passwd net-tools iproute nmap
|
||||
+EOF
|
||||
+ else
|
||||
+ cat << EOF > Dockerfile
|
||||
+FROM ${img_name} as ${SYSMST_BASE_IMG}
|
||||
+
|
||||
+RUN rm -rf /etc/yum.repos.d && mkdir /etc/yum.repos.d
|
||||
+COPY yum.repos.d /usr/lib/sysmaster/
|
||||
+RUN yum install -y util-linux shadow sudo passwd net-tools iproute nmap
|
||||
+
|
||||
COPY install/usr/bin/sctl /usr/bin/
|
||||
-COPY install/usr/bin/init /usr/bin/
|
||||
-RUN mkdir /usr/lib/sysmaster
|
||||
+RUN mkdir /usr/lib/sysmaster /etc/sysmaster
|
||||
COPY install/usr/lib/sysmaster /usr/lib/sysmaster/
|
||||
+COPY install/etc/sysmaster /etc/sysmaster/
|
||||
+RUN sed -i '/LogTarget/ s/=.*/="console-syslog"/' /etc/sysmaster/system.conf
|
||||
EOF
|
||||
+ fi
|
||||
cat Dockerfile
|
||||
if ! isula-build ctr-img build -o isulad:"${SYSMST_BASE_IMG}:latest" -f Dockerfile .; then
|
||||
log_error "build ${SYSMST_BASE_IMG} image failed!"
|
||||
diff --git a/tests/common/monitor.sh b/tests/common/monitor.sh
|
||||
index 2fe790f..24b8e6a 100644
|
||||
--- a/tests/common/monitor.sh
|
||||
+++ b/tests/common/monitor.sh
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
while ((1)); do
|
||||
time="$(date)"
|
||||
- init_data="$(ps aux | grep -v grep | grep '/usr/bin/init')"
|
||||
+ init_data="$(ps aux | grep -v grep | grep '/usr/lib/sysmaster/init')"
|
||||
sysmst_data="$(ps aux | grep -v grep | grep '/usr/lib/sysmaster/sysmaster')"
|
||||
|
||||
pid=$(echo ${init_data} | awk '{print $2}')
|
||||
diff --git a/tests/common/util_lib.sh b/tests/common/util_lib.sh
|
||||
index 18de448..2cf944a 100644
|
||||
--- a/tests/common/util_lib.sh
|
||||
+++ b/tests/common/util_lib.sh
|
||||
@@ -5,6 +5,13 @@ export SYSMST_LIB_PATH='/usr/lib/sysmaster/system'
|
||||
export SYSMST_ETC_PATH='/etc/sysmaster/system'
|
||||
export SYSMST_RUN_PATH='/run/sysmaster/system'
|
||||
export SYSMST_LOG='/opt/sysmaster.log'
|
||||
+[ "${DOCKER_TEST}" -ne 1 ] && SYSMST_LOG='/var/log/messages'
|
||||
+if ! test -d /usr/lib/sysmaster/system; then
|
||||
+ SYSMST_LIB_PATH='/usr/lib/sysmaster'
|
||||
+ SYSMST_ETC_PATH='/etc/sysmaster'
|
||||
+ SYSMST_RUN_PATH='/run/sysmaster'
|
||||
+fi
|
||||
+export SYSMST_PATH='/usr/lib/sysmaster'
|
||||
export RELIAB_SWITCH_PATH='/run/sysmaster/reliability'
|
||||
export RELIAB_SWITCH='switch.debug'
|
||||
export RELIAB_CLR='clear.debug'
|
||||
@@ -12,7 +19,6 @@ export init_pid=''
|
||||
export sysmaster_pid=''
|
||||
export cond_fail_log='Starting failed .* condition test failed'
|
||||
export asst_fail_log='Starting failed .* assert test failed'
|
||||
-export yum_proxy='proxy='
|
||||
|
||||
# ================== log function ==================
|
||||
function log_info() {
|
||||
@@ -127,14 +133,13 @@ function expect_str_eq() {
|
||||
function run_sysmaster() {
|
||||
local user="${1:-root}"
|
||||
|
||||
- cp -arf "${work_dir}"/tmp_units/*.target ${SYSMST_LIB_PATH} || return 1
|
||||
if [ "${user}" = root ]; then
|
||||
- RUST_BACKTRACE=full /usr/bin/init &> "${SYSMST_LOG}" &
|
||||
+ RUST_BACKTRACE=full "${SYSMST_PATH}"/init &> "${SYSMST_LOG}" &
|
||||
else
|
||||
- chmod 777 /usr/bin/init
|
||||
- chmod -R 777 /usr/lib/sysmaster /run
|
||||
+ chmod 777 "${SYSMST_PATH}"/init
|
||||
+ chmod -R 777 "${SYSMST_PATH}" /run
|
||||
chmod -R 777 "$(dirname "${SYSMST_LOG}")"
|
||||
- sudo -u "${user}" /usr/bin/init &> "${SYSMST_LOG}" &
|
||||
+ sudo -u "${user}" "${SYSMST_PATH}"/init &> "${SYSMST_LOG}" &
|
||||
fi
|
||||
init_pid=$!
|
||||
|
||||
@@ -142,17 +147,17 @@ function run_sysmaster() {
|
||||
sleep 3
|
||||
for ((i = 0; i < 300; ++i)); do
|
||||
sleep 1
|
||||
- ps -elf | grep -v grep | grep " $(echo ${user} | cut -c1-7)" | grep -w '/usr/lib/sysmaster/sysmaster' | grep ep_pol && break
|
||||
+ ps -elf | grep -v grep | grep " $(echo ${user} | cut -c1-7)" | grep -w "${SYSMST_PATH}"/sysmaster | grep ep_pol && break
|
||||
done
|
||||
# debug
|
||||
ps -elf | grep -v grep | grep -Ew 'sysmaster|init'
|
||||
- if ! ps -elf | grep -v grep | grep " $(echo ${user} | cut -c1-7)" | grep -wq '/usr/lib/sysmaster/sysmaster'; then
|
||||
+ if ! ps -elf | grep -v grep | grep " $(echo ${user} | cut -c1-7)" | grep -wq "${SYSMST_PATH}"/sysmaster; then
|
||||
cat "${SYSMST_LOG}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# get sysmaster pid
|
||||
- sysmaster_pid="$(ps -elf | grep -v grep | grep " $(echo ${user} | cut -c1-7)" | grep -w '/usr/lib/sysmaster/sysmaster' | awk '{print $4}')"
|
||||
+ sysmaster_pid="$(ps -elf | grep -v grep | grep " $(echo ${user} | cut -c1-7)" | grep -w "${SYSMST_PATH}"/sysmaster | awk '{print $4}')"
|
||||
echo > "${SYSMST_LOG}"
|
||||
return 0
|
||||
}
|
||||
@@ -223,19 +228,6 @@ function get_pids() {
|
||||
sctl status "${service}" |& sed -n '/PID:/,$p' | sed 's/PID://' | awk '{print $1}'
|
||||
}
|
||||
|
||||
-# usage: install packages
|
||||
-# input: packages names or files
|
||||
-function install_pkg() {
|
||||
- if ! grep -rq 'proxy=' /etc/yum.repos.d; then
|
||||
- for file in /etc/yum.repos.d/*.repo; do
|
||||
- sed -i "/^baseurl=/a ${yum_proxy}" "${file}"
|
||||
- done
|
||||
- yum clean all
|
||||
- yum makecache
|
||||
- fi
|
||||
- yum install -y $@
|
||||
-}
|
||||
-
|
||||
# usage: check netstat
|
||||
# input: $1: path
|
||||
# $2: type
|
||||
diff --git a/tests/config_test/unit_config_test/action_001/action_001.sh b/tests/config_test/unit_config_test/action_001/action_001.sh
|
||||
index 5f4d505..3d3d07b 100644
|
||||
--- a/tests/config_test/unit_config_test/action_001/action_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/action_001/action_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{reboot.target,poweroff.target,exit.target} tmp_units
|
||||
popd
|
||||
diff --git a/tests/config_test/unit_config_test/assert_001/assert_001.sh b/tests/config_test/unit_config_test/assert_001/assert_001.sh
|
||||
index 60fc3c9..fe40ee3 100644
|
||||
--- a/tests/config_test/unit_config_test/assert_001/assert_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/assert_001/assert_001.sh
|
||||
@@ -12,7 +12,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/condition_001/check.sh b/tests/config_test/unit_config_test/condition_001/check.sh
|
||||
index 0107bb6..9afb53b 100644
|
||||
--- a/tests/config_test/unit_config_test/condition_001/check.sh
|
||||
+++ b/tests/config_test/unit_config_test/condition_001/check.sh
|
||||
@@ -165,7 +165,7 @@ function test03() {
|
||||
expect_eq $? 0 || return 1
|
||||
|
||||
# ro mounted path
|
||||
- which mount || install_pkg /usr/bin/mount
|
||||
+ which mount || yum install -y /usr/bin/mount
|
||||
expect_eq $? 0 || return 1
|
||||
dd if=/dev/zero of=/tmp/mountfile bs=1M count=10
|
||||
mkfs.ext4 /tmp/mountfile
|
||||
diff --git a/tests/config_test/unit_config_test/condition_001/condition_001.sh b/tests/config_test/unit_config_test/condition_001/condition_001.sh
|
||||
index 4deada6..e082880 100644
|
||||
--- a/tests/config_test/unit_config_test/condition_001/condition_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/condition_001/condition_001.sh
|
||||
@@ -14,7 +14,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/condition_002/check.sh b/tests/config_test/unit_config_test/condition_002/check.sh
|
||||
index 1deabaa..3ad0455 100644
|
||||
--- a/tests/config_test/unit_config_test/condition_002/check.sh
|
||||
+++ b/tests/config_test/unit_config_test/condition_002/check.sh
|
||||
@@ -86,7 +86,7 @@ function test04() {
|
||||
test_user_2="test2_${RANDOM}"
|
||||
user_pw_1="PW!test1_${RANDOM}"
|
||||
user_pw_2="PW!test2_${RANDOM}"
|
||||
- install_pkg shadow sudo
|
||||
+ yum install -y shadow sudo
|
||||
expect_eq $? 0 || return 1
|
||||
useradd "${test_user_1}"
|
||||
useradd "${test_user_2}"
|
||||
diff --git a/tests/config_test/unit_config_test/condition_002/condition_002.sh b/tests/config_test/unit_config_test/condition_002/condition_002.sh
|
||||
index 3bc857c..207805d 100644
|
||||
--- a/tests/config_test/unit_config_test/condition_002/condition_002.sh
|
||||
+++ b/tests/config_test/unit_config_test/condition_002/condition_002.sh
|
||||
@@ -12,7 +12,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/condition_003/condition_003.sh b/tests/config_test/unit_config_test/condition_003/condition_003.sh
|
||||
index 54eb5be..af33bad 100644
|
||||
--- a/tests/config_test/unit_config_test/condition_003/condition_003.sh
|
||||
+++ b/tests/config_test/unit_config_test/condition_003/condition_003.sh
|
||||
@@ -12,7 +12,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/dependency_001/check.sh b/tests/config_test/unit_config_test/dependency_001/check.sh
|
||||
index 9259bab..e9d3774 100644
|
||||
--- a/tests/config_test/unit_config_test/dependency_001/check.sh
|
||||
+++ b/tests/config_test/unit_config_test/dependency_001/check.sh
|
||||
@@ -11,7 +11,7 @@ function test01() {
|
||||
cp -arf "${work_dir}"/tmp_units/{conflicts.service,requires.service,wants.service,requisite.service,partof.service,bindsto.service} ${SYSMST_LIB_PATH} || return 1
|
||||
sctl daemon-reload
|
||||
sctl status base.service &> log
|
||||
- expect_eq $? 1
|
||||
+ expect_ne $? 0
|
||||
check_log log 'Failed to show the status of base.service: NotExisted'
|
||||
expect_eq $? 0 || return 1
|
||||
rm -rf log
|
||||
diff --git a/tests/config_test/unit_config_test/dependency_001/dependency_001.sh b/tests/config_test/unit_config_test/dependency_001/dependency_001.sh
|
||||
index f29e2ee..393b4cd 100644
|
||||
--- a/tests/config_test/unit_config_test/dependency_001/dependency_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/dependency_001/dependency_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,conflicts.service,requires.service,wants.service,requisite.service,partof.service,bindsto.service} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/dependency_002/dependency_002.sh b/tests/config_test/unit_config_test/dependency_002/dependency_002.sh
|
||||
index b00be90..6f7758f 100644
|
||||
--- a/tests/config_test/unit_config_test/dependency_002/dependency_002.sh
|
||||
+++ b/tests/config_test/unit_config_test/dependency_002/dependency_002.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/dependency_003/dependency_003.sh b/tests/config_test/unit_config_test/dependency_003/dependency_003.sh
|
||||
index f43d7f1..163b1d8 100644
|
||||
--- a/tests/config_test/unit_config_test/dependency_003/dependency_003.sh
|
||||
+++ b/tests/config_test/unit_config_test/dependency_003/dependency_003.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/dependency_004/dependency_004.sh b/tests/config_test/unit_config_test/dependency_004/dependency_004.sh
|
||||
index a37b502..f11c8b5 100644
|
||||
--- a/tests/config_test/unit_config_test/dependency_004/dependency_004.sh
|
||||
+++ b/tests/config_test/unit_config_test/dependency_004/dependency_004.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/dependency_005/dependency_005.sh b/tests/config_test/unit_config_test/dependency_005/dependency_005.sh
|
||||
index 01d76e8..6b71497 100644
|
||||
--- a/tests/config_test/unit_config_test/dependency_005/dependency_005.sh
|
||||
+++ b/tests/config_test/unit_config_test/dependency_005/dependency_005.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{fork.service,before.service,after.service} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/env_001/env_001.sh b/tests/config_test/unit_config_test/env_001/env_001.sh
|
||||
index 9218e42..6e8f40b 100644
|
||||
--- a/tests/config_test/unit_config_test/env_001/env_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/env_001/env_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/env.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/exec_001/exec_001.sh b/tests/config_test/unit_config_test/exec_001/exec_001.sh
|
||||
index 666a154..90b3f74 100644
|
||||
--- a/tests/config_test/unit_config_test/exec_001/exec_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/exec_001/exec_001.sh
|
||||
@@ -12,7 +12,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,exec.service} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/isolate_001/isolate_001.sh b/tests/config_test/unit_config_test/isolate_001/isolate_001.sh
|
||||
index 20bd545..8ee2127 100644
|
||||
--- a/tests/config_test/unit_config_test/isolate_001/isolate_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/isolate_001/isolate_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,reboot.target} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/kill_001/kill_001.sh b/tests/config_test/unit_config_test/kill_001/kill_001.sh
|
||||
index 259fa03..c781f80 100644
|
||||
--- a/tests/config_test/unit_config_test/kill_001/kill_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/kill_001/kill_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/fork.service tmp_units
|
||||
gcc kill_mode.c -o kill_mode
|
||||
popd
|
||||
diff --git a/tests/config_test/unit_config_test/listen_001/check.sh b/tests/config_test/unit_config_test/listen_001/check.sh
|
||||
index 8891f99..c124a38 100644
|
||||
--- a/tests/config_test/unit_config_test/listen_001/check.sh
|
||||
+++ b/tests/config_test/unit_config_test/listen_001/check.sh
|
||||
@@ -222,7 +222,7 @@ seed="1$((${RANDOM} % 1000))"
|
||||
test01_socket="/run/test01_${seed}.socket"
|
||||
test02_socket="/run/test02_${seed}.socket"
|
||||
test03_socket="/run/test03_${seed}.socket"
|
||||
-install_pkg net-tools iproute || exit 1
|
||||
+yum install -y net-tools iproute || exit 1
|
||||
|
||||
run_sysmaster || return 1
|
||||
test01 || exit 1
|
||||
diff --git a/tests/config_test/unit_config_test/listen_001/listen_001.sh b/tests/config_test/unit_config_test/listen_001/listen_001.sh
|
||||
index c3f9f53..3539237 100644
|
||||
--- a/tests/config_test/unit_config_test/listen_001/listen_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/listen_001/listen_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,base.socket} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/refuse_001/refuse_001.sh b/tests/config_test/unit_config_test/refuse_001/refuse_001.sh
|
||||
index b43fae6..6157436 100644
|
||||
--- a/tests/config_test/unit_config_test/refuse_001/refuse_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/refuse_001/refuse_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,requires.service} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/restart_001/restart_001.sh b/tests/config_test/unit_config_test/restart_001/restart_001.sh
|
||||
index 93d1217..5dd1143 100644
|
||||
--- a/tests/config_test/unit_config_test/restart_001/restart_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/restart_001/restart_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{restart_001.service,restart_002.service,restart_003.service,restart_004.service} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/service_001/service_001.sh b/tests/config_test/unit_config_test/service_001/service_001.sh
|
||||
index da79e9c..1aac45f 100644
|
||||
--- a/tests/config_test/unit_config_test/service_001/service_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/service_001/service_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/service_002/service_002.sh b/tests/config_test/unit_config_test/service_002/service_002.sh
|
||||
index 5cf3d49..6ae0624 100644
|
||||
--- a/tests/config_test/unit_config_test/service_002/service_002.sh
|
||||
+++ b/tests/config_test/unit_config_test/service_002/service_002.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/fork.service tmp_units
|
||||
gcc fork_exec.c -o fork_exec
|
||||
popd
|
||||
diff --git a/tests/config_test/unit_config_test/service_003/service_003.sh b/tests/config_test/unit_config_test/service_003/service_003.sh
|
||||
index ccf6200..6c4fdd6 100644
|
||||
--- a/tests/config_test/unit_config_test/service_003/service_003.sh
|
||||
+++ b/tests/config_test/unit_config_test/service_003/service_003.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,base.socket} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/service_004/check.sh b/tests/config_test/unit_config_test/service_004/check.sh
|
||||
index 387121f..7effdb4 100644
|
||||
--- a/tests/config_test/unit_config_test/service_004/check.sh
|
||||
+++ b/tests/config_test/unit_config_test/service_004/check.sh
|
||||
@@ -34,7 +34,7 @@ function test01() {
|
||||
expect_eq $? 0 || return 1
|
||||
|
||||
# user/group exist
|
||||
- install_pkg shadow
|
||||
+ yum install -y shadow
|
||||
expect_eq $? 0 || return 1
|
||||
useradd "${test_user}"
|
||||
groupadd "${test_grp}"
|
||||
diff --git a/tests/config_test/unit_config_test/service_004/service_004.sh b/tests/config_test/unit_config_test/service_004/service_004.sh
|
||||
index 418f389..b2a8398 100644
|
||||
--- a/tests/config_test/unit_config_test/service_004/service_004.sh
|
||||
+++ b/tests/config_test/unit_config_test/service_004/service_004.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/socket_001/check.sh b/tests/config_test/unit_config_test/socket_001/check.sh
|
||||
index e055532..9f28604 100644
|
||||
--- a/tests/config_test/unit_config_test/socket_001/check.sh
|
||||
+++ b/tests/config_test/unit_config_test/socket_001/check.sh
|
||||
@@ -125,7 +125,7 @@ function test03() {
|
||||
seed="1$((${RANDOM} % 1000))"
|
||||
test_socket="/run/test_${seed}.socket"
|
||||
test_symlink="/dev/test_${seed}_link"
|
||||
-install_pkg net-tools nmap || exit 1
|
||||
+yum install -y net-tools nmap || exit 1
|
||||
|
||||
run_sysmaster || exit 1
|
||||
test01 || exit 1
|
||||
diff --git a/tests/config_test/unit_config_test/socket_001/socket_001.sh b/tests/config_test/unit_config_test/socket_001/socket_001.sh
|
||||
index f3efb17..6fd74a3 100644
|
||||
--- a/tests/config_test/unit_config_test/socket_001/socket_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/socket_001/socket_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{base.service,base.socket} tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/config_test/unit_config_test/startlimit_001/startlimit_001.sh b/tests/config_test/unit_config_test/startlimit_001/startlimit_001.sh
|
||||
index bd037e2..fc93149 100644
|
||||
--- a/tests/config_test/unit_config_test/startlimit_001/startlimit_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/startlimit_001/startlimit_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{reboot.target,poweroff.target,exit.target} tmp_units
|
||||
popd
|
||||
diff --git a/tests/config_test/unit_config_test/timeout_001/timeout_001.sh b/tests/config_test/unit_config_test/timeout_001/timeout_001.sh
|
||||
index df2f52f..08d4512 100644
|
||||
--- a/tests/config_test/unit_config_test/timeout_001/timeout_001.sh
|
||||
+++ b/tests/config_test/unit_config_test/timeout_001/timeout_001.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/base.service tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/{reboot.target,poweroff.target,exit.target} tmp_units
|
||||
popd
|
||||
diff --git a/tests/config_test/unit_config_test/timeout_002/timeout_002.sh b/tests/config_test/unit_config_test/timeout_002/timeout_002.sh
|
||||
index 9cfb2a5..9ccf3c7 100644
|
||||
--- a/tests/config_test/unit_config_test/timeout_002/timeout_002.sh
|
||||
+++ b/tests/config_test/unit_config_test/timeout_002/timeout_002.sh
|
||||
@@ -11,7 +11,6 @@ function test_pre() {
|
||||
pushd "${TEST_SCRIPT_PATH}"
|
||||
rm -rf tmp_units
|
||||
mkdir tmp_units
|
||||
- cp -arf "${TEST_PATH}"/test_units/{shutdown.target,sysinit.target} tmp_units
|
||||
cp -arf "${TEST_PATH}"/test_units/tests/timeout.service tmp_units
|
||||
popd
|
||||
}
|
||||
diff --git a/tests/docker_example/docker_example_001/check.sh b/tests/docker_example/docker_example_001/check.sh
|
||||
index 3db7629..3d89207 100755
|
||||
--- a/tests/docker_example/docker_example_001/check.sh
|
||||
+++ b/tests/docker_example/docker_example_001/check.sh
|
||||
@@ -1,3 +1,4 @@
|
||||
+#!/usr/bin/env bash
|
||||
+
|
||||
ls -l /usr/lib/sysmaster || exit 1
|
||||
-ls -l /usr/lib/sysmaster/plugin || exit 1
|
||||
ls -l /usr/bin/sctl || exit 1
|
||||
diff --git a/tests/perf_test/cpu_time_001/check.sh b/tests/perf_test/cpu_time_001/check.sh
|
||||
index a6e16a1..26f1dfd 100644
|
||||
--- a/tests/perf_test/cpu_time_001/check.sh
|
||||
+++ b/tests/perf_test/cpu_time_001/check.sh
|
||||
@@ -6,7 +6,7 @@ source "${work_dir}"/util_lib.sh
|
||||
set +e
|
||||
max=1000
|
||||
|
||||
-install_pkg nginx
|
||||
+yum install -y nginx
|
||||
expect_eq $? 0 || exit 1
|
||||
|
||||
cp -arf "${work_dir}"/tmp_units/*.service ${SYSMST_LIB_PATH} || exit 1
|
||||
diff --git a/tests/test_frame.sh b/tests/test_frame.sh
|
||||
index e2eab7d..c734feb 100644
|
||||
--- a/tests/test_frame.sh
|
||||
+++ b/tests/test_frame.sh
|
||||
@@ -12,7 +12,9 @@ TMP_DIR=''
|
||||
function test_setup() {
|
||||
setenforce 0
|
||||
|
||||
- install_sysmaster || return 1
|
||||
+ if ! yum list sysmaster; then
|
||||
+ install_sysmaster || return 1
|
||||
+ fi
|
||||
|
||||
if [ "${DOCKER_TEST}" == '1' ]; then
|
||||
if which isula-build; then
|
||||
@@ -57,9 +59,8 @@ function setup_isula() {
|
||||
|
||||
function test_cleanup() {
|
||||
[ -n "${TMP_DIR}" ] && rm -rf "${TMP_DIR}"
|
||||
- rm -rf /usr/bin/sctl "${SYSMST_LIB_PATH}"
|
||||
|
||||
- if [ "${DOCKER_TEST}" == '1' ]; then
|
||||
+ if [ "${DOCKER_TEST}" == '1' ] && [ -n "${DOCKER_CMD}" ]; then
|
||||
cleanup_docker || return 1
|
||||
fi
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,125 +0,0 @@
|
||||
From fbfa5543837c69c47c88e6a1c2ed5bbd3d4112f4 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 28 Jun 2023 16:43:04 +0800
|
||||
Subject: [PATCH] typo: declure -> declare
|
||||
|
||||
---
|
||||
coms/service/src/manager.rs | 4 ++--
|
||||
coms/service/src/unit.rs | 4 ++--
|
||||
coms/target/src/manager.rs | 4 ++--
|
||||
coms/target/src/unit.rs | 4 ++--
|
||||
core/bin/plugin/mod.rs | 8 ++++----
|
||||
core/lib/unit/base.rs | 2 +-
|
||||
core/lib/unit/umif.rs | 2 +-
|
||||
12 files changed, 24 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/coms/service/src/manager.rs b/coms/service/src/manager.rs
|
||||
index ebcab59..026f710 100644
|
||||
--- a/coms/service/src/manager.rs
|
||||
+++ b/coms/service/src/manager.rs
|
||||
@@ -60,5 +60,5 @@ impl Default for ServiceManager {
|
||||
}
|
||||
}
|
||||
|
||||
-use sysmaster::declure_umobj_plugin;
|
||||
-declure_umobj_plugin!(ServiceManager, ServiceManager::default, PLUGIN_NAME);
|
||||
+use sysmaster::declare_umobj_plugin;
|
||||
+declare_umobj_plugin!(ServiceManager, ServiceManager::default, PLUGIN_NAME);
|
||||
diff --git a/coms/service/src/unit.rs b/coms/service/src/unit.rs
|
||||
index 2a217d4..4bb235e 100644
|
||||
--- a/coms/service/src/unit.rs
|
||||
+++ b/coms/service/src/unit.rs
|
||||
@@ -411,5 +411,5 @@ impl ServiceUnit {
|
||||
}
|
||||
}*/
|
||||
|
||||
-use sysmaster::declure_unitobj_plugin_with_param;
|
||||
-declure_unitobj_plugin_with_param!(ServiceUnit, ServiceUnit::new);
|
||||
+use sysmaster::declare_unitobj_plugin_with_param;
|
||||
+declare_unitobj_plugin_with_param!(ServiceUnit, ServiceUnit::new);
|
||||
diff --git a/coms/target/src/manager.rs b/coms/target/src/manager.rs
|
||||
index e3c3975..832037c 100644
|
||||
--- a/coms/target/src/manager.rs
|
||||
+++ b/coms/target/src/manager.rs
|
||||
@@ -53,5 +53,5 @@ impl UnitMngUtil for TargetManager {
|
||||
}
|
||||
}
|
||||
|
||||
-use sysmaster::declure_umobj_plugin;
|
||||
-declure_umobj_plugin!(TargetManager, TargetManager::new, PLUGIN_NAME);
|
||||
+use sysmaster::declare_umobj_plugin;
|
||||
+declare_umobj_plugin!(TargetManager, TargetManager::new, PLUGIN_NAME);
|
||||
diff --git a/coms/target/src/unit.rs b/coms/target/src/unit.rs
|
||||
index bcd97c7..4914eec 100644
|
||||
--- a/coms/target/src/unit.rs
|
||||
+++ b/coms/target/src/unit.rs
|
||||
@@ -190,5 +190,5 @@ impl UnitMngUtil for Target {
|
||||
}
|
||||
}*/
|
||||
|
||||
-use sysmaster::declure_unitobj_plugin_with_param;
|
||||
-declure_unitobj_plugin_with_param!(Target, Target::new);
|
||||
+use sysmaster::declare_unitobj_plugin_with_param;
|
||||
+declare_unitobj_plugin_with_param!(Target, Target::new);
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/bin/plugin/mod.rs
|
||||
index 869f360..9a8e4f6 100644
|
||||
--- a/core/bin/plugin/mod.rs
|
||||
+++ b/core/bin/plugin/mod.rs
|
||||
@@ -34,8 +34,8 @@
|
||||
//! ```macro_rules
|
||||
//! const LOG_LEVEL: u32 = 4;
|
||||
//! const PLUGIN_NAME: &str = "TargetUnit";
|
||||
-//! use sysmaster::declure_unitobj_plugin;
|
||||
-//! declure_unitobj_plugin!(Target, Target::default, PLUGIN_NAME, LOG_LEVEL);
|
||||
+//! use sysmaster::declare_unitobj_plugin;
|
||||
+//! declare_unitobj_plugin!(Target, Target::default, PLUGIN_NAME, LOG_LEVEL);
|
||||
//! ````
|
||||
//! plugin or find the corresponding so according to the name of the corresponding unit configuration file, and load it dynamically, such as XXX.service to find libservice.so, XXX.socket to find libsocket.so
|
||||
//!
|
||||
@@ -435,7 +435,7 @@ impl Plugin {
|
||||
}
|
||||
|
||||
/// Create the subunit trait of unit
|
||||
- /// each sub unit need reference of declure_unitobj_plugin_with_param
|
||||
+ /// each sub unit need reference of declare_unitobj_plugin_with_param
|
||||
///
|
||||
pub fn create_subunit_with_um(
|
||||
&self,
|
||||
@@ -474,7 +474,7 @@ impl Plugin {
|
||||
Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
}
|
||||
/// Create a obj for subclasses of unit manager
|
||||
- /// each sub unit manager need reference of declure_umobj_plugin
|
||||
+ /// each sub unit manager need reference of declare_umobj_plugin
|
||||
pub fn create_um_obj(
|
||||
&self,
|
||||
unit_type: UnitType,
|
||||
diff --git a/core/lib/unit/base.rs b/core/lib/unit/base.rs
|
||||
index 20f8c91..5550252 100644
|
||||
--- a/core/lib/unit/base.rs
|
||||
+++ b/core/lib/unit/base.rs
|
||||
@@ -172,7 +172,7 @@ pub trait SubUnit: ReStation + UnitMngUtil {
|
||||
/// the macro for create a sub unit instance with dyn ref of UmIf,
|
||||
/// which sub unit wants invoke um interface, about UmIf see doc of UmIf
|
||||
#[macro_export]
|
||||
-macro_rules! declure_unitobj_plugin_with_param {
|
||||
+macro_rules! declare_unitobj_plugin_with_param {
|
||||
($unit_type:ty, $constructor:path) => {
|
||||
use log::LevelFilter;
|
||||
/// method for create the unit instance
|
||||
diff --git a/core/lib/unit/umif.rs b/core/lib/unit/umif.rs
|
||||
index 18616f5..85603fa 100644
|
||||
--- a/core/lib/unit/umif.rs
|
||||
+++ b/core/lib/unit/umif.rs
|
||||
@@ -222,7 +222,7 @@ pub trait UnitManagerObj: UnitMngUtil + ReStation {
|
||||
/// #[macro_use]
|
||||
/// the macro for create a sub unit-manager instance
|
||||
#[macro_export]
|
||||
-macro_rules! declure_umobj_plugin {
|
||||
+macro_rules! declare_umobj_plugin {
|
||||
($unit_type:ty, $constructor:path, $name:expr) => {
|
||||
// method for create the sub-unit-manager instance
|
||||
use log::LevelFilter;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
From 36331ec407f541f6209f270bfc0ffc2eb55836f3 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Wed, 28 Jun 2023 16:58:40 +0800
|
||||
Subject: [PATCH] typo: fix clippies
|
||||
|
||||
---
|
||||
libs/basic/src/logger.rs | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 8ee3ffa..3161513 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -207,7 +207,7 @@ impl log::Log for FileLogger {
|
||||
|
||||
impl FileLogger {
|
||||
fn file_open(file_path: &PathBuf, file_mode: u32) -> File {
|
||||
- /* Panic if we cann't open a log file. */
|
||||
+ /* Panic if we can't open a log file. */
|
||||
let dir = file_path.parent().unwrap();
|
||||
if !dir.exists() {
|
||||
fs::create_dir_all(dir).unwrap();
|
||||
@@ -480,7 +480,6 @@ pub fn init_log(
|
||||
file_number,
|
||||
)));
|
||||
log::set_max_level(level);
|
||||
- return;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
From 4b130fc57ccdc556ca5cb48eac6a54efae65de3d Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Tue, 27 Jun 2023 20:38:48 +0800
|
||||
Subject: [PATCH] typo: fix some clippy
|
||||
|
||||
---
|
||||
libs/basic/src/logger.rs | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 3bf579b..06f4ff2 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -201,7 +201,6 @@ impl FileLogger {
|
||||
/* 3. Write message */
|
||||
if let Err(e) = file.write((msg + "\n").as_bytes()) {
|
||||
println!("Failed to log message: {e}");
|
||||
- return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,13 +234,13 @@ impl FileLogger {
|
||||
num_list.push(rotated_num);
|
||||
}
|
||||
|
||||
- num_list.sort();
|
||||
+ num_list.sort_unstable();
|
||||
|
||||
/* 1. delete surplus rotated file */
|
||||
/* We only keep (file_number - 1) rotated files, because we will generate a new one later. */
|
||||
let file_number = self.file_number as usize;
|
||||
- for i in file_number - 1..num_list.len() {
|
||||
- let src = String::from(&file_name_dot) + &num_list[i].to_string();
|
||||
+ for rotated_num in num_list.iter().skip(file_number - 1) {
|
||||
+ let src = String::from(&file_name_dot) + &rotated_num.to_string();
|
||||
Self::mv_file_in_dir(&src, None, dir);
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,51 +0,0 @@
|
||||
From 7dc67f1bac0dcdd84a5a7eeb2b220ea70f17b3cf Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Sun, 25 Jun 2023 15:34:33 +0800
|
||||
Subject: [PATCH] typo: fix some debugging messages and typoes
|
||||
|
||||
---
|
||||
core/bin/plugin/mod.rs | 7 ++-----
|
||||
libs/basic/src/logger.rs | 2 +-
|
||||
3 files changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/core/bin/plugin/mod.rs b/core/bin/plugin/mod.rs
|
||||
index 69bf8b8..869f360 100644
|
||||
--- a/core/bin/plugin/mod.rs
|
||||
+++ b/core/bin/plugin/mod.rs
|
||||
@@ -309,7 +309,7 @@ impl Plugin {
|
||||
};
|
||||
|
||||
/* We need the lib*.so pass SubUnit and UnitManagerObj to sysmaster-core, and we check if
|
||||
- * subunit_create_with_params and um_obj_create exists in lib*.so, because these two funs
|
||||
+ * subunit_create_with_params and um_obj_create exist in lib*.so, because these two functions
|
||||
* will be used to generate SubUnit and UnitManagerObj. */
|
||||
|
||||
type FnTypeSubUnit = fn(um: Rc<dyn UmIf>) -> *mut dyn SubUnit;
|
||||
@@ -469,10 +469,7 @@ impl Plugin {
|
||||
Ok(v) => v,
|
||||
};
|
||||
|
||||
- log::debug!(
|
||||
- "create unit obj with param level filter: {:?}",
|
||||
- log::max_level()
|
||||
- );
|
||||
+ log::debug!("create unit obj with params");
|
||||
let boxed_raw = fun(um.clone());
|
||||
Ok(unsafe { Box::from_raw(boxed_raw) })
|
||||
}
|
||||
diff --git a/libs/basic/src/logger.rs b/libs/basic/src/logger.rs
|
||||
index 0bc15bb..56def43 100644
|
||||
--- a/libs/basic/src/logger.rs
|
||||
+++ b/libs/basic/src/logger.rs
|
||||
@@ -207,7 +207,7 @@ fn build_log_config(
|
||||
.build(),
|
||||
),
|
||||
"file" => {
|
||||
- let pattern = file_path.to_string() + &".{}";
|
||||
+ let pattern = file_path.to_string() + ".{}";
|
||||
let policy = Box::new(CompoundPolicy::new(
|
||||
Box::new(SizeTrigger::new(file_size as u64 * 1024)),
|
||||
Box::new(
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
From a244377c9a485d252da1cca7c5ba61e4915f7236 Mon Sep 17 00:00:00 2001
|
||||
From: licunlong <licunlong1@huawei.com>
|
||||
Date: Fri, 30 Jun 2023 11:29:56 +0800
|
||||
Subject: [PATCH] typo: fix some typoes
|
||||
|
||||
---
|
||||
libs/basic/src/condition.rs | 2 +-
|
||||
libs/libtests/src/lib.rs | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libs/basic/src/condition.rs b/libs/basic/src/condition.rs
|
||||
index b9743f3..ccdb6ff 100644
|
||||
--- a/libs/basic/src/condition.rs
|
||||
+++ b/libs/basic/src/condition.rs
|
||||
@@ -440,7 +440,7 @@ mod test {
|
||||
|
||||
#[test]
|
||||
fn test_condition_test() {
|
||||
- logger::init_log_to_console("test_init_lookup_paths", log::LevelFilter::Debug);
|
||||
+ logger::init_log_to_console("test_condition", log::LevelFilter::Debug);
|
||||
let project_root = get_project_root().unwrap();
|
||||
let cond_path_not_exists = Condition::new(
|
||||
ConditionType::PathExists,
|
||||
diff --git a/libs/libtests/src/lib.rs b/libs/libtests/src/lib.rs
|
||||
index 9380dc2..260d7f8 100644
|
||||
--- a/libs/libtests/src/lib.rs
|
||||
+++ b/libs/libtests/src/lib.rs
|
||||
@@ -45,7 +45,7 @@ mod tests {
|
||||
use crate::{get_crate_root, get_project_root};
|
||||
|
||||
#[test]
|
||||
- fn test_get_projecgt_root() {
|
||||
+ fn test_get_project_root() {
|
||||
let mut file_path = get_project_root().unwrap();
|
||||
file_path.push("tests/test_units/config.service.toml");
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
From f4a9ace1a685aa5ab376ad471eab079e45ab4abd Mon Sep 17 00:00:00 2001
|
||||
From: huyubiao <h13958451065@163.com>
|
||||
Date: Tue, 25 Jul 2023 11:49:40 +0800
|
||||
Subject: [PATCH] plugin.conf delete Socket and Mount
|
||||
|
||||
---
|
||||
config/conf/plugin.conf | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/config/conf/plugin.conf b/config/conf/plugin.conf
|
||||
index e17066d..0a6c31b 100644
|
||||
--- a/config/conf/plugin.conf
|
||||
+++ b/config/conf/plugin.conf
|
||||
@@ -1,4 +1,2 @@
|
||||
Service:libservice
|
||||
Target:libtarget
|
||||
-Socket:libsocket
|
||||
-Mount:libmount
|
||||
--
|
||||
2.33.0
|
||||
|
||||
Binary file not shown.
@ -10,80 +10,14 @@
|
||||
%global _cargo_build /usr/bin/env CARGO_HOME=.cargo RUSTC_BOOTSTRAP=1 %{_bindir}/cargo build %__cargo_common_opts
|
||||
|
||||
Name: sysmaster
|
||||
Version: 0.2.4
|
||||
Release: 5
|
||||
Version: 0.2.5
|
||||
Release: 1
|
||||
Summary: redesign and reimplement process1.
|
||||
|
||||
License: Mulan PSL v2
|
||||
URL: https://gitee.com/openeuler/sysmaster
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
|
||||
Patch0001: backport-fix-make-test_cgroup-really-work.patch
|
||||
Patch0002: backport-fix-several-socket-fixes.patch
|
||||
Patch0003: backport-fix-libbasic-create-relative-symlink-in-right-way.patch
|
||||
Patch0004: backport-feature-libbasic-add-path_simplify.patch
|
||||
Patch0005: backport-feature-libbasic-add-remove_dir_until.patch
|
||||
Patch0006: backport-feature-libbasic-add-opendirat.patch
|
||||
Patch0007: backport-feature-libbasic-add-more-error-information.patch
|
||||
Patch0008: backport-fix-libbasic-create-symlink-atomically.patch
|
||||
Patch0009: backport-fix-init-uses-SIGABRT-to-reexec-sysmaster-increase-s.patch
|
||||
Patch0010: backport-feature-support-hostname-setup.patch
|
||||
Patch0011: backport-fix-libbasic-try-to-follow-the-fd-path-to-make-the-u.patch
|
||||
Patch0012: backport-fix-modify-units-for-sctl-enable.patch
|
||||
Patch0013: backport-fix-devmaster-deal-with-fd-leak.patch
|
||||
Patch0014: backport-feature-add-LogFileSize-and-LogFileNumber.patch
|
||||
Patch0015: backport-feature-use-LogFileSize-and-LogFileNumber-to-rotate-.patch
|
||||
Patch0016: backport-fix-rename-create_unit_obj_with_um-to-create_subunit.patch
|
||||
Patch0017: backport-fix-remove-unit_obj_create_default-we-never-use-it.patch
|
||||
Patch0018: backport-typo-fix-some-debugging-messages-and-typoes.patch
|
||||
Patch0019: backport-feature-use-our-own-file-logger.patch
|
||||
Patch0020: backport-typo-fix-some-clippy.patch
|
||||
Patch0021: backport-refactor-move-UmIf-functions-no-functional-change.patch
|
||||
Patch0022: backport-fix-several-fixes-on-logger.patch
|
||||
Patch0023: backport-typo-declure-declare.patch
|
||||
Patch0024: backport-fix-add-default-system.toml.patch
|
||||
Patch0025: backport-typo-fix-clippies.patch
|
||||
Patch0026: backport-fix-use-var-log-sysmaster-sysmaster.log-to-save-log-.patch
|
||||
Patch0027: backport-fix-use-localtime-instead-of-UTC.patch
|
||||
Patch0028: backport-refactor-mv-system.toml-to-config-conf.patch
|
||||
Patch0029: backport-fix-ignore-auto-generated-toml-file-in-tests-test_un.patch
|
||||
Patch0030: backport-fix-version-0.3.10-may-fail-to-build-when-use-tuna-s.patch
|
||||
Patch0031: backport-fix-we-shouldn-t-lookup-build-directory-if-we-are-no.patch
|
||||
Patch0032: backport-fix-avoid-calling-init_lookup_paths-in-testcase.patch
|
||||
Patch0033: backport-typo-fix-some-typoes.patch
|
||||
Patch0034: backport-fix-use-UnixStream-to-test-send_and_recv.patch
|
||||
Patch0035: backport-fix-make-config.service.toml-same-as-config.service.patch
|
||||
Patch0036: backport-fix-init-does-not-enter-the-freeze-during-normal-run.patch
|
||||
Patch0037: backport-refactor-don-t-copy-unit-file-to-.toml-file-when-loa.patch
|
||||
Patch0038: backport-fix-rename-config.service.toml-to-config.service.patch
|
||||
Patch0039: backport-fix-rename-system.toml-to-system.conf.patch
|
||||
Patch0040: backport-feature-devmaster-support-update-device-database-and.patch
|
||||
Patch0041: backport-build-update-version-to-0.2.4.patch
|
||||
Patch0042: backport-build-To-adjust-the-directory-structure.patch
|
||||
Patch0043: backport-fix-log-message-before-and-after-reaping-zombie-proc.patch
|
||||
Patch0044: backport-fix-log-message-when-creating-symlink.patch
|
||||
Patch0045: backport-fix-add-two-helper-macroes-to-help-us-log-message-ou.patch
|
||||
Patch0046: backport-fix-log-message-out-when-we-create-delete-a-file-or-.patch
|
||||
Patch0047: backport-fix-call-clear_last_frame-before-early-return.patch
|
||||
Patch0048: backport-fix-init-recyle-zombie-process-normally-corrects-doc.patch
|
||||
Patch0049: backport-fix-adjust-the-mode-of-internal-generated-files.patch
|
||||
Patch0050: backport-fix-simply-code-a-bit-delete-an-annoying-log-and-don.patch
|
||||
Patch0051: backport-test-support-yum-install-sysmaster.patch
|
||||
Patch0052: backport-fix-set-the-notify-socket-receive-buffer-to-8M.patch
|
||||
Patch0053: backport-fix-make-the-help-information-clearer.patch
|
||||
Patch0054: backport-test-add-UT-testcase-for-command-dispatch.patch
|
||||
Patch0055: backport-fix-isolate-debugging-code-through-configuration-pre.patch
|
||||
Patch0056: backport-fix-integer-overflow.patch
|
||||
Patch0057: backport-test-condition-add-unit-test-for-condition.patch
|
||||
Patch0058: backport-fix-check-if-the-words-is-empty-before-using-it.patch
|
||||
Patch0059: backport-fix-check-if-the-message-is-truncated.patch
|
||||
Patch0060: backport-fix-fix-the-type-error-of-test_get_service_type.patch
|
||||
Patch0061: backport-fix-specify-the-version-of-tempfile.patch
|
||||
Patch0062: backport-fix-add-two-helper-function-to-check-if-the-path-nam.patch
|
||||
Patch0063: backport-fix-downgrade-the-time-crate-from-0.3.x-to-0.1.45.patch
|
||||
|
||||
Patch9001: plugin.conf-delete-Socket-and-Mount.patch
|
||||
|
||||
ExclusiveArch: x86_64 aarch64
|
||||
|
||||
BuildRequires: rust
|
||||
@ -100,16 +34,9 @@ Summary: %{summary}
|
||||
%prep
|
||||
%autosetup -p1
|
||||
|
||||
%cargo_prep
|
||||
|
||||
%cargo_generate_buildrequires
|
||||
|
||||
%build
|
||||
sed -i '/\[source.crates-io\]/{n;d}' ./.cargo/config
|
||||
sed -i '/\[source.local-registry\]/{n;d}' ./.cargo/config
|
||||
sed -i '/\[source.local-registry\]/a directory = "vendor"' ./.cargo/config
|
||||
sed -i '/\[build\]/arustflags = \["-C", "target-feature=-crt-static", "-C", "link-arg=-fstack-protector-all", "-C", "link-arg=-fpie", "-C", "link-arg=-DFORTIFY=2 -O2"\]' ./.cargo/config
|
||||
|
||||
%{_cargo_build} --profile release
|
||||
|
||||
%install
|
||||
@ -121,9 +48,6 @@ install -Dm0750 -t %{sysmaster_install_target} %{sysmaster_install_source}/sysma
|
||||
|
||||
install -Dm0640 -t %{sysmaster_install_target}/system %{unit_install_source}/*
|
||||
|
||||
install -Dm0750 -t %{sysmaster_install_target}/plugin %{sysmaster_install_source}/libservice.so
|
||||
install -Dm0750 -t %{sysmaster_install_target}/plugin %{sysmaster_install_source}/libtarget.so
|
||||
install -Dm0640 -t %{sysmaster_install_target}/plugin %{conf_install_source}/plugin.conf
|
||||
install -Dm0640 -t %{buildroot}/etc/sysmaster %{conf_install_source}/system.conf
|
||||
|
||||
%files
|
||||
@ -133,9 +57,6 @@ install -Dm0640 -t %{buildroot}/etc/sysmaster %{conf_install_source}/system.conf
|
||||
/usr/lib/sysmaster/system/basic.target
|
||||
%attr(0550,-,-) /usr/lib/sysmaster/init
|
||||
/usr/lib/sysmaster/system/multi-user.target
|
||||
%dir %attr(0550,-,-) /usr/lib/sysmaster/plugin
|
||||
%attr(0550,-,-) /usr/lib/sysmaster/plugin/*.so
|
||||
/usr/lib/sysmaster/plugin/plugin.conf
|
||||
/usr/lib/sysmaster/system/shutdown.target
|
||||
/usr/lib/sysmaster/system/sshd-keygen.target
|
||||
/usr/lib/sysmaster/system/sshd-keygen@ecdsa.service
|
||||
@ -148,6 +69,9 @@ install -Dm0640 -t %{buildroot}/etc/sysmaster %{conf_install_source}/system.conf
|
||||
/etc/sysmaster/system.conf
|
||||
|
||||
%changelog
|
||||
* Sat Aug 5 2023 shenyangyang<shenyangyang4@huawei.com> - 0.2.5-1
|
||||
- update for compiling with rust 1.57
|
||||
|
||||
* Thu Jul 27 2023 huyubiao<huyubiao@huawei.com> - 0.2.4-5
|
||||
- sync patches from upstream,
|
||||
change the path of the unit,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user