syscare/0014-syscare-move-files-to-working-directory.patch
ningyu 5909c8dc30 update to 1.2.0-10
Sync patch
2023-12-28 17:21:44 +08:00

1383 lines
53 KiB
Diff

From c2c863a88390c7e479fc4c77350c01dd6edf8ac4 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net>
Date: Thu, 28 Dec 2023 10:32:42 +0800
Subject: [PATCH 14/15] syscare: move files to working directory
syscared & syscare:
1. move pid file to /var/run/syscare/syscared.pid
2. move socket file to /var/run/syscare/syscared.sock
3. move lock file to /var/run/syscare/patch_op.lock
upatchd & upatch-build:
1. move pid file to /var/run/syscare/upatchd.pid
2. move socket file to /var/run/syscare/upatchd.sock
3. rewrite compiler hacking & unhacking logic
syscare-build & upatch-build:
1. reuse '--work-dir' as daemon working directory, ie. /var/run/syscare
2. add '--build-root' as build temp directory
3. rename WorkDir to BuildRoot
Signed-off-by: renoseven <dev@renoseven.net>
---
builder/src/args/matcher.rs | 6 +-
builder/src/args/mod.rs | 10 +-
builder/src/build_params.rs | 5 +-
builder/src/{workdir => build_root}/mod.rs | 8 +-
.../{workdir => build_root}/package_root.rs | 0
.../src/{workdir => build_root}/patch_root.rs | 0
builder/src/main.rs | 38 ++---
.../src/patch/kernel_patch/kpatch_builder.rs | 6 +-
.../src/patch/user_patch/upatch_builder.rs | 10 +-
cli/src/args/matcher.rs | 4 +-
cli/src/args/mod.rs | 6 +-
cli/src/executor/patch.rs | 25 ++--
cli/src/main.rs | 15 +-
daemon/src/args/matcher.rs | 4 -
daemon/src/args/mod.rs | 10 --
daemon/src/main.rs | 36 +++--
daemon/src/patch/manager/entity/mod.rs | 2 +-
.../upatch-build/src/upatch/args/matcher.rs | 6 +-
upatch/upatch-build/src/upatch/args/mod.rs | 18 ++-
upatch/upatch-build/src/upatch/build.rs | 51 ++++---
.../src/upatch/{workdir.rs => build_root.rs} | 10 +-
upatch/upatch-build/src/upatch/compiler.rs | 137 +++++++-----------
upatch/upatch-build/src/upatch/mod.rs | 4 +-
upatch/upatch-daemon/src/args/matcher.rs | 6 +-
upatch/upatch-daemon/src/args/mod.rs | 10 --
upatch/upatch-daemon/src/main.rs | 36 +++--
26 files changed, 238 insertions(+), 225 deletions(-)
rename builder/src/{workdir => build_root}/mod.rs (91%)
rename builder/src/{workdir => build_root}/package_root.rs (100%)
rename builder/src/{workdir => build_root}/patch_root.rs (100%)
rename upatch/upatch-build/src/upatch/{workdir.rs => build_root.rs} (89%)
diff --git a/builder/src/args/matcher.rs b/builder/src/args/matcher.rs
index 8bc89a2..93e9420 100644
--- a/builder/src/args/matcher.rs
+++ b/builder/src/args/matcher.rs
@@ -6,7 +6,8 @@ use syscare_common::os;
const DEFAULT_PATCH_VERSION: &str = "1";
const DEFAULT_PATCH_RELEASE: &str = "1";
const DEFAULT_PATCH_DESCRIPTION: &str = "(none)";
-const DEFAULT_WORK_DIR: &str = ".";
+const DEFAULT_WORK_DIR: &str = "/var/run/syscare";
+const DEFAULT_BUILD_ROOT: &str = ".";
const DEFAULT_OUTPUT_DIR: &str = ".";
lazy_static! {
@@ -38,7 +39,8 @@ impl ArgMatcher {
(@arg source: short("s") long("source") +required +takes_value +multiple value_name("SOURCE") "Source package(s)")
(@arg debuginfo: short("d") long("debuginfo") +required +takes_value +multiple value_name("DEBUGINFO") "Debuginfo package(s)")
(@arg patch: short("p") long("patch") +required +takes_value +multiple value_name("PATCH") "Patch file(s)")
- (@arg workdir: long("workdir") +takes_value value_name("WORKDIR") default_value(DEFAULT_WORK_DIR) "Working directory")
+ (@arg work_dir: long("work-dir") +takes_value value_name("WORK_DIR") default_value(DEFAULT_WORK_DIR) "Working directory")
+ (@arg build_root: long("build-root") +takes_value value_name("BUILD_ROOT") default_value(DEFAULT_BUILD_ROOT) "Build temporary directory")
(@arg output: short("o") long("output") +takes_value value_name("OUTPUT") default_value(DEFAULT_OUTPUT_DIR) "Output directory")
(@arg jobs: short("j") long("jobs") +takes_value value_name("JOBS") default_value(&DEFAULT_BUILD_JOBS) "Parallel build jobs")
(@arg skip_compiler_check: long("skip-compiler-check") "Skip compiler version check (not recommended)")
diff --git a/builder/src/args/mod.rs b/builder/src/args/mod.rs
index 7fe575b..f81d26e 100644
--- a/builder/src/args/mod.rs
+++ b/builder/src/args/mod.rs
@@ -41,7 +41,10 @@ pub struct Arguments {
pub patch: Vec<PathBuf>,
/// Working directory
- pub workdir: PathBuf,
+ pub work_dir: PathBuf,
+
+ /// Build temporary directory
+ pub build_root: PathBuf,
/// Generated patch output directory
pub output: PathBuf,
@@ -74,7 +77,8 @@ impl Parser<'_> for Arguments {
source: ArgParserImpl::parse_args(matches, "source")?,
debuginfo: ArgParserImpl::parse_args(matches, "debuginfo")?,
patch: ArgParserImpl::parse_args(matches, "patch")?,
- workdir: ArgParserImpl::parse_arg(matches, "workdir")?,
+ work_dir: ArgParserImpl::parse_arg(matches, "work_dir")?,
+ build_root: ArgParserImpl::parse_arg(matches, "build_root")?,
output: ArgParserImpl::parse_arg(matches, "output")?,
jobs: ArgParserImpl::parse_arg(matches, "jobs")?,
skip_compiler_check: ArgParserImpl::is_present(matches, "skip_compiler_check"),
@@ -102,7 +106,7 @@ impl Arguments {
for patch_file in &mut self.patch {
*patch_file = fs::normalize(&patch_file)?;
}
- self.workdir = fs::normalize(&self.workdir)?;
+ self.build_root = fs::normalize(&self.build_root)?;
self.output = fs::normalize(&self.output)?;
Ok(self)
diff --git a/builder/src/build_params.rs b/builder/src/build_params.rs
index f252ec7..a8296a3 100644
--- a/builder/src/build_params.rs
+++ b/builder/src/build_params.rs
@@ -2,7 +2,7 @@ use std::path::PathBuf;
use syscare_abi::{PackageInfo, PatchFile, PatchType};
-use crate::{package::PackageBuildRoot, workdir::WorkDir};
+use crate::{build_root::BuildRoot, package::PackageBuildRoot};
#[derive(Debug, Clone)]
pub struct BuildEntry {
@@ -12,7 +12,8 @@ pub struct BuildEntry {
}
pub struct BuildParameters {
- pub workdir: WorkDir,
+ pub work_dir: PathBuf,
+ pub build_root: BuildRoot,
pub pkg_build_root: PackageBuildRoot,
pub build_entry: BuildEntry,
pub kernel_build_entry: Option<BuildEntry>,
diff --git a/builder/src/workdir/mod.rs b/builder/src/build_root/mod.rs
similarity index 91%
rename from builder/src/workdir/mod.rs
rename to builder/src/build_root/mod.rs
index 871e628..329a318 100644
--- a/builder/src/workdir/mod.rs
+++ b/builder/src/build_root/mod.rs
@@ -19,14 +19,14 @@ const PATCH_ROOT_NAME: &str = "patch";
const BUILD_LOG_NAME: &str = "build.log";
#[derive(Debug, Clone)]
-pub struct WorkDir {
+pub struct BuildRoot {
pub path: PathBuf,
pub package: PackageRoot,
pub patch: PatchRoot,
pub log_file: PathBuf,
}
-impl WorkDir {
+impl BuildRoot {
pub fn new<P: AsRef<Path>>(path: P) -> Result<Self> {
let path = path.as_ref().to_path_buf();
let package = PackageRoot::new(path.join(PACKAGE_ROOT_NAME))?;
@@ -46,7 +46,7 @@ impl WorkDir {
}
}
-impl Deref for WorkDir {
+impl Deref for BuildRoot {
type Target = Path;
fn deref(&self) -> &Self::Target {
@@ -54,7 +54,7 @@ impl Deref for WorkDir {
}
}
-impl AsRef<OsStr> for WorkDir {
+impl AsRef<OsStr> for BuildRoot {
fn as_ref(&self) -> &OsStr {
self.as_os_str()
}
diff --git a/builder/src/workdir/package_root.rs b/builder/src/build_root/package_root.rs
similarity index 100%
rename from builder/src/workdir/package_root.rs
rename to builder/src/build_root/package_root.rs
diff --git a/builder/src/workdir/patch_root.rs b/builder/src/build_root/patch_root.rs
similarity index 100%
rename from builder/src/workdir/patch_root.rs
rename to builder/src/build_root/patch_root.rs
diff --git a/builder/src/main.rs b/builder/src/main.rs
index 3e92019..1b40122 100644
--- a/builder/src/main.rs
+++ b/builder/src/main.rs
@@ -1,5 +1,5 @@
use std::path::{Path, PathBuf};
-use std::{ops::Deref, process::exit, sync::Arc};
+use std::{process::exit, sync::Arc};
use anyhow::{anyhow, bail, ensure, Context, Result};
use lazy_static::lazy_static;
@@ -11,18 +11,18 @@ use syscare_common::{os, util::fs};
mod args;
mod build_params;
+mod build_root;
mod logger;
mod package;
mod patch;
mod util;
-mod workdir;
use args::Arguments;
use build_params::{BuildEntry, BuildParameters};
+use build_root::BuildRoot;
use logger::Logger;
use package::{PackageBuildRoot, PackageBuilderFactory, PackageFormat, PackageImpl};
use patch::{PatchBuilderFactory, PatchHelper, PatchMetadata, PATCH_FILE_EXT};
-use workdir::WorkDir;
use crate::package::{PackageSpecBuilderFactory, PackageSpecWriterFactory};
@@ -37,7 +37,7 @@ lazy_static! {
pub struct SyscareBuilder {
args: Arguments,
- workdir: WorkDir,
+ build_root: BuildRoot,
}
impl SyscareBuilder {
@@ -200,7 +200,7 @@ impl SyscareBuilder {
}
fn prepare_to_build(&mut self) -> Result<BuildParameters> {
- let pkg_root = &self.workdir.package;
+ let pkg_root = &self.build_root.package;
debug!("- Collecting patch file(s)");
let mut patch_files = PatchHelper::collect_patch_files(&self.args.patch)
@@ -249,7 +249,8 @@ impl SyscareBuilder {
debug!("- Generating build parameters");
let build_params = BuildParameters {
- workdir: self.workdir.to_owned(),
+ work_dir: self.args.work_dir.to_owned(),
+ build_root: self.build_root.to_owned(),
pkg_build_root,
build_entry,
kernel_build_entry,
@@ -271,10 +272,10 @@ impl SyscareBuilder {
}
fn build_patch_package(&self, patch_info: &PatchInfo) -> Result<()> {
- let pkg_build_root = &self.workdir.package.build_root;
+ let pkg_build_root = &self.build_root.package.build_root;
let pkg_source_dir = &pkg_build_root.sources;
let pkg_spec_dir = &pkg_build_root.specs;
- let patch_output_dir = &self.workdir.patch.output;
+ let patch_output_dir = &self.build_root.patch.output;
debug!("- Writing patch metadata");
let metadata_file = pkg_source_dir.join(PatchMetadata::metadata_file_name());
@@ -359,23 +360,24 @@ impl SyscareBuilder {
}
fn clean_up(&mut self) {
- self.workdir.remove().ok();
+ self.build_root.remove().ok();
}
}
impl SyscareBuilder {
fn new() -> Result<Self> {
- let args = Arguments::new()?;
+ let mut args = Arguments::new()?;
Self::check_input_args(&args)?;
os::umask::set_umask(CLI_UMASK);
- let workdir = WorkDir::new(
- args.workdir
- .join(format!("syscare-build.{}", os::process::id())),
- )?;
+
+ args.build_root = args
+ .build_root
+ .join(format!("syscare-build.{}", os::process::id()));
+ let build_root = BuildRoot::new(&args.build_root)?;
Logger::initialize(
- workdir.deref(),
+ &args.build_root,
LevelFilter::Trace,
match &args.verbose {
false => LevelFilter::Info,
@@ -383,7 +385,7 @@ impl SyscareBuilder {
},
)?;
- Ok(SyscareBuilder { args, workdir })
+ Ok(SyscareBuilder { args, build_root })
}
fn check_input_args(args: &Arguments) -> Result<()> {
@@ -407,7 +409,7 @@ impl SyscareBuilder {
}
}
- let workdir = &args.workdir;
+ let workdir = &args.work_dir;
if !workdir.exists() {
fs::create_dir_all(workdir)?;
}
@@ -431,7 +433,7 @@ impl SyscareBuilder {
}
fn build_main(mut self, log_file: Arc<Mutex<PathBuf>>) -> Result<()> {
- *log_file.lock() = self.workdir.log_file.clone();
+ *log_file.lock() = self.build_root.log_file.clone();
info!("==============================");
info!("{}", CLI_ABOUT);
diff --git a/builder/src/patch/kernel_patch/kpatch_builder.rs b/builder/src/patch/kernel_patch/kpatch_builder.rs
index 69c0cee..eec39a6 100644
--- a/builder/src/patch/kernel_patch/kpatch_builder.rs
+++ b/builder/src/patch/kernel_patch/kpatch_builder.rs
@@ -59,8 +59,8 @@ impl KernelPatchBuilder {
debug!("- Finding kernel directories");
let pkg_build_dir = build_params.pkg_build_root.build.clone();
- let patch_build_root = build_params.workdir.patch.build.clone();
- let patch_output_dir: PathBuf = build_params.workdir.patch.output.clone();
+ let patch_build_root = build_params.build_root.patch.build.clone();
+ let patch_output_dir: PathBuf = build_params.build_root.patch.output.clone();
let kernel_pkg = &kernel_entry.target_pkg;
let kernel_source_dir: PathBuf = PKG_IMPL
@@ -72,7 +72,7 @@ impl KernelPatchBuilder {
),
)
.context("Cannot find kernel source directory")?;
- let kernel_debug_dir = &build_params.workdir.package.debuginfo;
+ let kernel_debug_dir = &build_params.build_root.package.debuginfo;
let oot_source_dir = oot_module_entry.map(|build_entry| build_entry.build_source.clone());
debug!("- Generating kernel default config");
diff --git a/builder/src/patch/user_patch/upatch_builder.rs b/builder/src/patch/user_patch/upatch_builder.rs
index 89166fa..5901656 100644
--- a/builder/src/patch/user_patch/upatch_builder.rs
+++ b/builder/src/patch/user_patch/upatch_builder.rs
@@ -26,6 +26,7 @@ lazy_static! {
}
struct UBuildParameters {
+ work_dir: PathBuf,
pkg_binary_dir: PathBuf,
pkg_output_dir: PathBuf,
patch_build_root: PathBuf,
@@ -89,11 +90,11 @@ impl UserPatchBuilder {
let pkg_build_root = &build_params.pkg_build_root;
let pkg_binary_dir = pkg_build_root.buildroot.clone();
let pkg_output_dir = pkg_build_root.rpms.clone();
- let debuginfo_pkg_root = &build_params.workdir.package.debuginfo;
+ let debuginfo_pkg_root = &build_params.build_root.package.debuginfo;
let build_entry = &build_params.build_entry;
- let patch_build_root = build_params.workdir.patch.build.clone();
- let patch_output_dir = build_params.workdir.patch.output.clone();
+ let patch_build_root = build_params.build_root.patch.build.clone();
+ let patch_output_dir = build_params.build_root.patch.output.clone();
let patch_source_dir = build_entry.build_source.clone();
let patch_spec = &build_entry.build_spec;
@@ -136,6 +137,7 @@ impl UserPatchBuilder {
}
let ubuild_params = UBuildParameters {
+ work_dir: build_params.work_dir.to_owned(),
pkg_binary_dir,
pkg_output_dir,
patch_build_root,
@@ -163,6 +165,8 @@ impl UserPatchBuilder {
fn parse_ubuild_cmd_args(&self, ubuild_params: &UBuildParameters) -> ExternCommandArgs {
let mut cmd_args = ExternCommandArgs::new()
.arg("--work-dir")
+ .arg(&ubuild_params.work_dir)
+ .arg("--build-root")
.arg(&ubuild_params.patch_build_root)
.arg("--source-dir")
.arg(&ubuild_params.patch_source_dir)
diff --git a/cli/src/args/matcher.rs b/cli/src/args/matcher.rs
index de041a9..eb8cb97 100644
--- a/cli/src/args/matcher.rs
+++ b/cli/src/args/matcher.rs
@@ -1,6 +1,6 @@
use clap::{clap_app, crate_description, crate_name, crate_version, AppSettings, ArgMatches};
-const DEFAULT_SOCKET_FILE: &str = "/var/run/syscared.sock";
+const DEFAULT_WORK_DIR: &str = "/var/run/syscare";
pub struct ArgMatcher;
@@ -21,7 +21,7 @@ impl ArgMatcher {
AppSettings::VersionlessSubcommands,
AppSettings::DisableHelpSubcommand,
])
- (@arg socket_file: short("s") long("socket-file") value_name("SOCKET_FILE") +takes_value default_value(DEFAULT_SOCKET_FILE) "Path for daemon unix socket")
+ (@arg work_dir: short("w") long("work-dir") value_name("WORK_DIR") +takes_value default_value(DEFAULT_WORK_DIR) "Path for working directory")
(@arg verbose: short("v") long("verbose") "Provide more detailed info")
(@subcommand build =>
(about: "Build a patch")
diff --git a/cli/src/args/mod.rs b/cli/src/args/mod.rs
index 19ea65b..e0a2467 100644
--- a/cli/src/args/mod.rs
+++ b/cli/src/args/mod.rs
@@ -17,7 +17,7 @@ use syscare_common::util::fs;
#[derive(Debug)]
pub struct Arguments {
pub command: SubCommand,
- pub socket_file: PathBuf,
+ pub work_dir: PathBuf,
pub verbose: bool,
}
@@ -30,7 +30,7 @@ impl Arguments {
}
fn normalize_pathes(mut self) -> Result<Self> {
- self.socket_file = fs::normalize(self.socket_file)?;
+ self.work_dir = fs::normalize(self.work_dir)?;
Ok(self)
}
}
@@ -42,7 +42,7 @@ impl Parser<'_> for Arguments {
{
Ok(Self {
command: SubCommand::parse(matches)?,
- socket_file: ArgParserImpl::parse_arg(matches, "socket_file")?,
+ work_dir: ArgParserImpl::parse_arg(matches, "work_dir")?,
verbose: ArgParserImpl::parse_arg(matches, "verbose")?,
})
}
diff --git a/cli/src/executor/patch.rs b/cli/src/executor/patch.rs
index 1c9711e..e61c1da 100644
--- a/cli/src/executor/patch.rs
+++ b/cli/src/executor/patch.rs
@@ -1,3 +1,5 @@
+use std::path::PathBuf;
+
use anyhow::{anyhow, ensure, Error, Result};
use log::info;
@@ -7,15 +9,14 @@ use crate::{args::SubCommand, flock::ExclusiveFileLockGuard, rpc::RpcProxy};
use super::CommandExecutor;
-const PATCH_OP_LOCK_PATH: &str = "/tmp/syscare_patch_op.lock";
-
pub struct PatchCommandExecutor {
proxy: RpcProxy,
+ lock_file: PathBuf,
}
impl PatchCommandExecutor {
- pub fn new(proxy: RpcProxy) -> Self {
- Self { proxy }
+ pub fn new(proxy: RpcProxy, lock_file: PathBuf) -> Self {
+ Self { proxy, lock_file }
}
}
@@ -122,7 +123,7 @@ impl CommandExecutor for PatchCommandExecutor {
Self::show_patch_list(self.proxy.get_patch_list()?);
}
SubCommand::Check { identifiers } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
let mut error_list = vec![];
for identifier in identifiers {
@@ -134,7 +135,7 @@ impl CommandExecutor for PatchCommandExecutor {
ensure!(error_list.is_empty(), Self::build_error_msg(error_list));
}
SubCommand::Apply { identifiers, force } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
let mut status_list = vec![];
let mut error_list = vec![];
@@ -149,7 +150,7 @@ impl CommandExecutor for PatchCommandExecutor {
ensure!(error_list.is_empty(), Self::build_error_msg(error_list));
}
SubCommand::Remove { identifiers } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
let mut status_list = vec![];
let mut error_list = vec![];
@@ -164,7 +165,7 @@ impl CommandExecutor for PatchCommandExecutor {
ensure!(error_list.is_empty(), Self::build_error_msg(error_list));
}
SubCommand::Active { identifiers } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
let mut status_list = vec![];
let mut error_list = vec![];
@@ -179,7 +180,7 @@ impl CommandExecutor for PatchCommandExecutor {
ensure!(error_list.is_empty(), Self::build_error_msg(error_list));
}
SubCommand::Deactive { identifiers } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
let mut status_list = vec![];
let mut error_list = vec![];
@@ -194,7 +195,7 @@ impl CommandExecutor for PatchCommandExecutor {
ensure!(error_list.is_empty(), Self::build_error_msg(error_list));
}
SubCommand::Accept { identifiers } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
let mut status_list = vec![];
let mut error_list = vec![];
@@ -209,12 +210,12 @@ impl CommandExecutor for PatchCommandExecutor {
ensure!(error_list.is_empty(), Self::build_error_msg(error_list));
}
SubCommand::Save => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
self.proxy.save_patch_status()?;
}
SubCommand::Restore { accepted } => {
- let _flock_guard = ExclusiveFileLockGuard::new(PATCH_OP_LOCK_PATH)?;
+ let _flock_guard = ExclusiveFileLockGuard::new(&self.lock_file)?;
self.proxy.restore_patch_status(*accepted)?;
}
diff --git a/cli/src/main.rs b/cli/src/main.rs
index ef0878f..d0ac5b9 100644
--- a/cli/src/main.rs
+++ b/cli/src/main.rs
@@ -13,6 +13,12 @@ use args::Arguments;
use executor::{build::BuildCommandExecutor, patch::PatchCommandExecutor, CommandExecutor};
use logger::Logger;
use rpc::{RpcProxy, RpcRemote};
+use syscare_common::os;
+
+const CLI_UMASK: u32 = 0o077;
+
+const SOCKET_FILE_NAME: &str = "syscared.sock";
+const PATCH_OP_LOCK_NAME: &str = "patch_op.lock";
struct SyscareCLI {
args: Arguments,
@@ -20,6 +26,8 @@ struct SyscareCLI {
impl SyscareCLI {
fn start_and_run() -> Result<()> {
+ os::umask::set_umask(CLI_UMASK);
+
let instance = Self {
args: Arguments::new()?,
};
@@ -30,15 +38,18 @@ impl SyscareCLI {
debug!("Start with {:#?}", instance.args);
debug!("Initializing remote procedure call client...");
- let remote = Rc::new(RpcRemote::new(&instance.args.socket_file));
+ let socket_file = instance.args.work_dir.join(SOCKET_FILE_NAME);
+ let remote = Rc::new(RpcRemote::new(socket_file));
debug!("Initializing remote procedure calls...");
let patch_proxy = RpcProxy::new(remote);
debug!("Initializing command executors...");
+ let patch_lock_file = instance.args.work_dir.join(PATCH_OP_LOCK_NAME);
let executors = vec![
Box::new(BuildCommandExecutor) as Box<dyn CommandExecutor>,
- Box::new(PatchCommandExecutor::new(patch_proxy)) as Box<dyn CommandExecutor>,
+ Box::new(PatchCommandExecutor::new(patch_proxy, patch_lock_file))
+ as Box<dyn CommandExecutor>,
];
let command = instance.args.command;
diff --git a/daemon/src/args/matcher.rs b/daemon/src/args/matcher.rs
index 2fbca35..d3d2203 100644
--- a/daemon/src/args/matcher.rs
+++ b/daemon/src/args/matcher.rs
@@ -1,7 +1,5 @@
use clap::{clap_app, crate_description, crate_name, crate_version, AppSettings, ArgMatches};
-const DEFAULT_PID_FILE: &str = "/var/run/syscared.pid";
-const DEFAULT_SOCKET_FILE: &str = "/var/run/syscared.sock";
const DEFAULT_DATA_DIR: &str = "/usr/lib/syscare";
const DEFAULT_WORK_DIR: &str = "/var/run/syscare";
const DEFAULT_LOG_DIR: &str = "/var/log/syscare";
@@ -22,8 +20,6 @@ impl ArgMatcher {
AppSettings::UnifiedHelpMessage,
])
(@arg daemon: short("d") long("daemon") "Run as a daemon")
- (@arg pid_file: long("pid-file") +takes_value value_name("PID_FILE") default_value(DEFAULT_PID_FILE) "Path for daemon pid file")
- (@arg socket_file: long("socket-file") +takes_value value_name("SOCKET_FILE") default_value(DEFAULT_SOCKET_FILE) "Path for daemon unix socket")
(@arg data_dir: long("data-dir") +takes_value value_name("DATA_DIR") default_value(DEFAULT_DATA_DIR) "Daemon data directory")
(@arg work_dir: long("work-dir") +takes_value value_name("WORK_DIR") default_value(DEFAULT_WORK_DIR) "Daemon working directory")
(@arg log_dir: long("log-dir") +takes_value value_name("LOG_DIR") default_value(DEFAULT_LOG_DIR) "Daemon logging directory")
diff --git a/daemon/src/args/mod.rs b/daemon/src/args/mod.rs
index cdac224..5273609 100644
--- a/daemon/src/args/mod.rs
+++ b/daemon/src/args/mod.rs
@@ -17,12 +17,6 @@ pub struct Arguments {
/// Run as a daemon
pub daemon: bool,
- /// Path for daemon pid file
- pub pid_file: PathBuf,
-
- /// Path for daemon unix socket
- pub socket_file: PathBuf,
-
/// Daemon working directory
pub work_dir: PathBuf,
@@ -43,8 +37,6 @@ impl Parser<'_> for Arguments {
{
Ok(Self {
daemon: ArgParserImpl::is_present(matches, "daemon"),
- pid_file: ArgParserImpl::parse_arg(matches, "pid_file")?,
- socket_file: ArgParserImpl::parse_arg(matches, "socket_file")?,
work_dir: ArgParserImpl::parse_arg(matches, "work_dir")?,
data_dir: ArgParserImpl::parse_arg(matches, "data_dir")?,
log_dir: ArgParserImpl::parse_arg(matches, "log_dir")?,
@@ -62,8 +54,6 @@ impl Arguments {
}
fn normalize_pathes(mut self) -> Result<Self> {
- self.pid_file = fs::normalize(&self.pid_file)?;
- self.socket_file = fs::normalize(&self.socket_file)?;
self.work_dir = fs::normalize(self.work_dir)?;
self.data_dir = fs::normalize(&self.data_dir)?;
self.log_dir = fs::normalize(&self.log_dir)?;
diff --git a/daemon/src/main.rs b/daemon/src/main.rs
index 094c6fc..e926859 100644
--- a/daemon/src/main.rs
+++ b/daemon/src/main.rs
@@ -1,5 +1,6 @@
use std::{
- fs,
+ fs::{self, Permissions},
+ os::unix::fs::PermissionsExt,
path::Path,
process,
sync::{
@@ -36,8 +37,12 @@ use rpc::{
use crate::patch::{PatchManager, PatchMonitor};
const DAEMON_VERSION: &str = env!("CARGO_PKG_VERSION");
-const DAEMON_UMASK: u32 = 0o027;
-const DAEMON_SLEEP_TIME: u64 = 100;
+const DAEMON_UMASK: u32 = 0o077;
+const DAEMON_PARK_TIME: u64 = 100;
+
+const WORK_DIR_PERMISSION: u32 = 0o755;
+const PID_FILE_NAME: &str = "syscared.pid";
+const SOCKET_FILE_NAME: &str = "syscared.sock";
struct Daemon {
args: Arguments,
@@ -75,6 +80,11 @@ impl Daemon {
fn prepare_environment(&self) -> Result<()> {
self.prepare_directory(&self.args.work_dir)?;
+ fs::set_permissions(
+ &self.args.work_dir,
+ Permissions::from_mode(WORK_DIR_PERMISSION),
+ )?;
+
self.prepare_directory(&self.args.data_dir)?;
self.prepare_directory(&self.args.log_dir)?;
@@ -97,10 +107,11 @@ impl Daemon {
return Ok(());
}
+ let pid_file = self.args.work_dir.join(PID_FILE_NAME);
Daemonize::new()
- .pid_file(&self.args.pid_file)
- .working_directory(&self.args.work_dir)
.umask(DAEMON_UMASK)
+ .working_directory(&self.args.work_dir)
+ .pid_file(pid_file)
.start()
.context("Daemonize failed")
}
@@ -124,15 +135,14 @@ impl Daemon {
}
fn start_rpc_server(&self, io_handler: IoHandler) -> Result<Server> {
- let socket_path = &self
- .args
- .socket_file
- .to_str()
- .context("Failed to convert socket path to string")?;
-
+ let socket_file = self.args.work_dir.join(SOCKET_FILE_NAME);
let server = ServerBuilder::new(io_handler)
.set_client_buffer_size(1)
- .start(socket_path)?;
+ .start(
+ socket_file
+ .to_str()
+ .context("Failed to convert socket path to string")?,
+ )?;
Ok(server)
}
@@ -177,7 +187,7 @@ impl Daemon {
info!("Daemon is running...");
while !instance.term_flag.load(Ordering::Relaxed) {
- std::thread::sleep(Duration::from_millis(DAEMON_SLEEP_TIME));
+ std::thread::park_timeout(Duration::from_millis(DAEMON_PARK_TIME));
}
info!("Shutting down...");
diff --git a/daemon/src/patch/manager/entity/mod.rs b/daemon/src/patch/manager/entity/mod.rs
index 2f17abe..f9c4130 100644
--- a/daemon/src/patch/manager/entity/mod.rs
+++ b/daemon/src/patch/manager/entity/mod.rs
@@ -110,7 +110,7 @@ impl std::cmp::Eq for Patch {}
impl std::cmp::PartialOrd for Patch {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
- self.entity_name.partial_cmp(&other.entity_name)
+ Some(self.entity_name.cmp(&other.entity_name))
}
}
impl std::cmp::Ord for Patch {
diff --git a/upatch/upatch-build/src/upatch/args/matcher.rs b/upatch/upatch-build/src/upatch/args/matcher.rs
index 11bdbf0..6e82837 100644
--- a/upatch/upatch-build/src/upatch/args/matcher.rs
+++ b/upatch/upatch-build/src/upatch/args/matcher.rs
@@ -1,6 +1,7 @@
use clap::{clap_app, crate_description, crate_name, crate_version, AppSettings, ArgMatches};
-const DEFAULT_WORK_DIR: &str = "~/.upatch";
+const DEFAULT_WORK_DIR: &str = "/var/run/syscare";
+const DEFAULT_BUILD_ROOT: &str = "~/.upatch";
const DEFAULT_BUILD_PATCH_CMD: &str = "";
const DEFAULT_COMPILERS: &str = "gcc";
const DEFAULT_OUTPUT_DIR: &str = "~/.upatch";
@@ -21,7 +22,8 @@ impl ArgMatcher {
AppSettings::UnifiedHelpMessage,
])
(@arg name: short("n") long("name") +takes_value value_name("NAME") "Specify output name")
- (@arg work_dir: short("w") long("work-dir") +takes_value value_name("WORK_DIR") default_value(DEFAULT_WORK_DIR) "Specify working directory")
+ (@arg work_dir: long("work-dir") +takes_value value_name("WORK_DIR") default_value(DEFAULT_WORK_DIR) "Specify working directory")
+ (@arg build_root: long("build-root") +takes_value value_name("BUILD_ROOT") default_value(DEFAULT_BUILD_ROOT) "Specify build temporary directory")
(@arg source_dir: short("s") long("source-dir") +required +takes_value value_name("SOURCE_DIR") "Specify source directory")
(@arg build_source_cmd: short("b") long("build-source-cmd") +required +takes_value value_name("BUILD_SOURCE_CMD") "Specify build source command")
(@arg build_patch_cmd: long("build-patch-cmd") +takes_value value_name("BUILD_PATCH_CMD") default_value(DEFAULT_BUILD_PATCH_CMD) +hide_default_value "Specify build patched source command [default: <BUILD_SOURCE_CMD>]")
diff --git a/upatch/upatch-build/src/upatch/args/mod.rs b/upatch/upatch-build/src/upatch/args/mod.rs
index c08f071..53c4c2a 100644
--- a/upatch/upatch-build/src/upatch/args/mod.rs
+++ b/upatch/upatch-build/src/upatch/args/mod.rs
@@ -21,6 +21,9 @@ pub struct Arguments {
/// Specify work directory
pub work_dir: PathBuf,
+ /// Specify build temporary directory
+ pub build_root: PathBuf,
+
/// Specify source directory
pub source_dir: PathBuf,
@@ -66,6 +69,7 @@ impl Parser<'_> for Arguments {
true => ArgParserImpl::parse_arg(matches, "name")?,
},
work_dir: ArgParserImpl::parse_arg(matches, "work_dir")?,
+ build_root: ArgParserImpl::parse_arg(matches, "build_root")?,
source_dir: ArgParserImpl::parse_arg(matches, "source_dir")?,
build_source_cmd: ArgParserImpl::parse_arg(matches, "build_source_cmd")?,
build_patch_cmd: ArgParserImpl::parse_arg(matches, "build_patch_cmd")?,
@@ -95,13 +99,21 @@ impl Arguments {
}
fn check(mut self) -> anyhow::Result<Self> {
- if !self.work_dir.is_dir() {
+ if !self.build_root.is_dir() {
bail!(
- "Working directory \"{}\" should be a directory",
+ "Work directory \"{}\" should be a directory",
self.work_dir.display()
);
}
- self.work_dir = real_arg(self.work_dir)?.join("upatch");
+ self.build_root = real_arg(&self.build_root)?;
+
+ if !self.build_root.is_dir() {
+ bail!(
+ "Build root directory \"{}\" should be a directory",
+ self.build_root.display()
+ );
+ }
+ self.build_root = real_arg(&self.build_root)?.join("upatch");
if !self.source_dir.is_dir() {
bail!(
diff --git a/upatch/upatch-build/src/upatch/build.rs b/upatch/upatch-build/src/upatch/build.rs
index 044e719..ac4bedb 100644
--- a/upatch/upatch-build/src/upatch/build.rs
+++ b/upatch/upatch-build/src/upatch/build.rs
@@ -11,17 +11,19 @@ use crate::tool::*;
use super::note;
use super::resolve;
use super::Arguments;
+use super::BuildRoot;
use super::Error;
use super::LinkMessages;
use super::Project;
use super::Result;
use super::Tool;
-use super::WorkDir;
use super::{Compiler, CompilerHackGuard};
+const UPATCHD_SOCKET_NAME: &str = "upatchd.sock";
+
pub struct UpatchBuild {
args: Arguments,
- work_dir: WorkDir,
+ build_root: BuildRoot,
compiler: Compiler,
tool: Tool,
dwarf: Dwarf,
@@ -35,7 +37,7 @@ impl UpatchBuild {
fn new() -> Result<Self> {
Ok(Self {
args: Arguments::new()?,
- work_dir: WorkDir::new(),
+ build_root: BuildRoot::new(),
compiler: Compiler::new(),
tool: Tool::new(),
dwarf: Dwarf::new(),
@@ -54,7 +56,7 @@ impl UpatchBuild {
}
fn build_main(mut self) -> Result<()> {
- self.work_dir.create_dir(&self.args.work_dir)?;
+ self.build_root.create_dir(&self.args.build_root)?;
self.init_logger()?;
// find upatch-diff
@@ -70,18 +72,19 @@ impl UpatchBuild {
self.compiler.analyze(&self.args.compiler)?;
if !self.args.skip_compiler_check {
self.compiler
- .check_version(self.work_dir.cache_dir(), &self.args.debuginfo)?;
+ .check_version(self.build_root.cache_dir(), &self.args.debuginfo)?;
}
// hack compiler
- info!("Hacking compiler");
- let compiler_hacker = CompilerHackGuard::new(self.compiler.clone())?;
+ info!("Hacking compilers");
+ let socket_file = self.args.work_dir.join(UPATCHD_SOCKET_NAME);
+ let compiler_hacker = CompilerHackGuard::new(&self.compiler, socket_file)?;
let project_name = self.args.source_dir.file_name().unwrap();
// build source
info!("Building original {:?}", project_name);
project.build(
- self.work_dir.source_dir(),
+ self.build_root.source_dir(),
self.args.build_source_cmd.clone(),
)?;
@@ -92,12 +95,13 @@ impl UpatchBuild {
// collect source link message and object message
self.source_link_messages =
- LinkMessages::from(&self.args.elf_path, self.work_dir.source_dir())?;
- self.source_obj = self.correlate_obj(&self.args.source_dir, self.work_dir.source_dir())?;
+ LinkMessages::from(&self.args.elf_path, self.build_root.source_dir())?;
+ self.source_obj =
+ self.correlate_obj(&self.args.source_dir, self.build_root.source_dir())?;
if self.source_obj.is_empty() {
return Err(Error::Build(format!(
"no valid object in {:?}",
- self.work_dir.source_dir()
+ self.build_root.source_dir()
)));
}
@@ -106,21 +110,24 @@ impl UpatchBuild {
// build patched
info!("Building patched {:?}", project_name);
- project.build(self.work_dir.patch_dir(), self.args.build_patch_cmd.clone())?;
+ project.build(
+ self.build_root.patch_dir(),
+ self.args.build_patch_cmd.clone(),
+ )?;
// collect patched link message and object message
self.patch_link_messages =
- LinkMessages::from(&self.args.elf_path, self.work_dir.patch_dir())?;
- self.patch_obj = self.correlate_obj(&self.args.source_dir, self.work_dir.patch_dir())?;
+ LinkMessages::from(&self.args.elf_path, self.build_root.patch_dir())?;
+ self.patch_obj = self.correlate_obj(&self.args.source_dir, self.build_root.patch_dir())?;
if self.patch_obj.is_empty() {
return Err(Error::Build(format!(
"no valid object in {:?}",
- self.work_dir.patch_dir()
+ self.build_root.patch_dir()
)));
}
// unhack compiler
- info!("Unhacking compiler");
+ info!("Unhacking compilers");
drop(compiler_hacker);
// detecting changed objects
@@ -153,7 +160,7 @@ impl UpatchBuild {
};
logger.set_print_level(log_level);
- logger.set_log_file(LevelFilter::Trace, self.work_dir.log_file())?;
+ logger.set_log_file(LevelFilter::Trace, self.build_root.log_file())?;
Logger::init_logger(logger);
Ok(())
@@ -228,7 +235,7 @@ impl UpatchBuild {
patch_path,
&output,
&debug_info,
- self.work_dir.log_file(),
+ self.build_root.log_file(),
self.args.verbose,
)?,
None => {
@@ -312,11 +319,15 @@ impl UpatchBuild {
};
let binary_name = file_name(&self.args.elf_path[i])?;
- let diff_dir = self.work_dir.output_dir().to_path_buf().join(&binary_name);
+ let diff_dir = self
+ .build_root
+ .output_dir()
+ .to_path_buf()
+ .join(&binary_name);
fs::create_dir(&diff_dir)?;
let new_debug_info = self
- .work_dir
+ .build_root
.debuginfo_dir()
.join(file_name(&self.args.debuginfo[i])?);
debug!(
diff --git a/upatch/upatch-build/src/upatch/workdir.rs b/upatch/upatch-build/src/upatch/build_root.rs
similarity index 89%
rename from upatch/upatch-build/src/upatch/workdir.rs
rename to upatch/upatch-build/src/upatch/build_root.rs
index 7d4a8fa..c6edcc5 100644
--- a/upatch/upatch-build/src/upatch/workdir.rs
+++ b/upatch/upatch-build/src/upatch/build_root.rs
@@ -4,7 +4,7 @@ use std::path::{Path, PathBuf};
use super::Result;
use crate::tool::*;
-pub struct WorkDir {
+pub struct BuildRoot {
cache_dir: PathBuf,
source_dir: PathBuf,
patch_dir: PathBuf,
@@ -13,7 +13,7 @@ pub struct WorkDir {
log_file: PathBuf,
}
-impl WorkDir {
+impl BuildRoot {
pub fn new() -> Self {
Self {
cache_dir: PathBuf::new(),
@@ -25,8 +25,8 @@ impl WorkDir {
}
}
- pub fn create_dir<P: AsRef<Path>>(&mut self, work_dir: P) -> Result<()> {
- self.cache_dir = work_dir.as_ref().to_path_buf();
+ pub fn create_dir<P: AsRef<Path>>(&mut self, build_root: P) -> Result<()> {
+ self.cache_dir = build_root.as_ref().to_path_buf();
self.source_dir = self.cache_dir.join("source");
self.patch_dir = self.cache_dir.join("patch");
self.debuginfo_dir = self.cache_dir.join("debug_info");
@@ -71,7 +71,7 @@ impl WorkDir {
}
}
-impl Default for WorkDir {
+impl Default for BuildRoot {
fn default() -> Self {
Self::new()
}
diff --git a/upatch/upatch-build/src/upatch/compiler.rs b/upatch/upatch-build/src/upatch/compiler.rs
index 5baaa65..2f9df9f 100644
--- a/upatch/upatch-build/src/upatch/compiler.rs
+++ b/upatch/upatch-build/src/upatch/compiler.rs
@@ -1,4 +1,3 @@
-use std::cmp;
use std::collections::HashSet;
use std::ffi::{OsStr, OsString};
use std::fs::File;
@@ -16,24 +15,19 @@ use crate::rpc::*;
use super::Error;
use super::Result;
-const UPATCHD_SOCKET: &str = "/var/run/upatchd.sock";
-
#[derive(Clone)]
pub struct Compiler {
compiler: Vec<PathBuf>,
assembler: Vec<PathBuf>,
linker: Vec<PathBuf>,
- upatch_proxy: UpatchProxy,
}
impl Compiler {
pub fn new() -> Self {
- let remote = RpcRemote::new(UPATCHD_SOCKET);
Self {
compiler: Vec::new(),
assembler: Vec::new(),
linker: Vec::new(),
- upatch_proxy: UpatchProxy::new(Rc::new(remote)),
}
}
@@ -94,14 +88,6 @@ impl Compiler {
Ok(())
}
- pub fn hack(&self) -> Result<()> {
- self.hijacker_register(self.compiler.len() + self.assembler.len())
- }
-
- pub fn unhack(&self) -> Result<()> {
- self.hijacker_unregister(self.compiler.len() + self.assembler.len())
- }
-
pub fn check_version<P, I, Q>(&self, cache_dir: P, debug_infoes: I) -> Result<()>
where
P: AsRef<Path>,
@@ -188,89 +174,76 @@ impl Compiler {
}
}
-impl Compiler {
- fn hijacker_register(&self, num: usize) -> Result<()> {
- for i in 0..cmp::min(num, self.compiler.len()) {
- trace!("hack {}", self.compiler[i].display());
- if let Err(e) = self.upatch_proxy.enable_hijack(self.compiler[i].clone()) {
- trace!("hack {:?} error {}, try to rollback", self.compiler[i], e);
- self.hijacker_unregister(i)?;
- return Err(Error::Mod(format!(
- "hack {} error {}",
- self.compiler[i].display(),
- e
- )));
+pub struct CompilerHackGuard<'a> {
+ inner: &'a Compiler,
+ upatch_proxy: UpatchProxy,
+}
+
+impl<'a> CompilerHackGuard<'a> {
+ pub fn new<P: AsRef<Path>>(compiler: &'a Compiler, socket_file: P) -> Result<Self> {
+ let remote = RpcRemote::new(socket_file);
+ let instance = Self {
+ inner: compiler,
+ upatch_proxy: UpatchProxy::new(Rc::new(remote)),
+ };
+ instance.hack()?;
+
+ Ok(instance)
+ }
+}
+
+impl CompilerHackGuard<'_> {
+ pub fn hack(&self) -> Result<()> {
+ let mut hack_list = Vec::new();
+ hack_list.extend(&self.inner.compiler);
+ hack_list.extend(&self.inner.assembler);
+
+ let mut finished_list = Vec::new();
+ let mut need_rollback = false;
+
+ for exec_path in hack_list {
+ trace!("Hacking \"{}\"...", exec_path.display());
+ if let Err(e) = self.upatch_proxy.enable_hijack(exec_path.to_owned()) {
+ error!("Failed to hack \"{}\", {}", exec_path.display(), e);
+ need_rollback = true;
+ break;
}
+ finished_list.push(exec_path);
}
- for i in self.compiler.len()..num {
- let i = i - self.compiler.len();
- trace!("hack {}", self.assembler[i].display());
- if let Err(e) = self.upatch_proxy.enable_hijack(self.assembler[i].clone()) {
- trace!(
- "hack {} error {}, try to rollback",
- self.assembler[i].display(),
- e
- );
- self.hijacker_unregister(i)?;
- return Err(Error::Mod(format!(
- "hack {} error {}",
- self.assembler[i].display(),
- e
- )));
+
+ if need_rollback {
+ trace!("Rolling back...");
+ for exec_path in finished_list {
+ trace!("Unhacking \"{}\"...", exec_path.display());
+ self.upatch_proxy.disable_hijack(exec_path.to_owned()).ok();
}
+ return Err(Error::Mod(String::from("Failed to hack compilers")));
}
+
Ok(())
}
- fn hijacker_unregister(&self, num: usize) -> Result<()> {
- for i in (self.compiler.len()..num).rev() {
- let i = i - self.compiler.len();
- trace!("unhack {}", self.assembler[i].display());
- if let Err(e) = self.upatch_proxy.disable_hijack(self.assembler[i].clone()) {
- trace!("unhack {} error {}", self.assembler[i].display(), e);
- return Err(Error::Mod(format!(
- "unhack {} error {}",
- self.assembler[i].display(),
- e
- )));
- }
- }
-
- for i in (0..cmp::min(num, self.compiler.len())).rev() {
- trace!("unhack {}", self.compiler[i].display());
- if let Err(e) = self.upatch_proxy.disable_hijack(self.compiler[i].clone()) {
- trace!("unhack {} error {}", self.compiler[i].display(), e);
- return Err(Error::Mod(format!(
- "unhack {} error {}",
- self.compiler[i].display(),
- e
- )));
+ pub fn unhack(&self) -> Result<()> {
+ let mut hack_list = Vec::new();
+ hack_list.extend(&self.inner.compiler);
+ hack_list.extend(&self.inner.assembler);
+ hack_list.reverse();
+
+ for exec_path in hack_list {
+ trace!("Unhacking \"{}\"...", exec_path.display());
+ if let Err(e) = self.upatch_proxy.disable_hijack(exec_path.to_owned()) {
+ error!("Failed to unhack \"{}\", {}", exec_path.display(), e);
+ return Err(Error::Mod(String::from("Failed to unhack compilers")));
}
}
Ok(())
}
}
-pub struct CompilerHackGuard {
- compiler: Compiler,
-}
-
-impl CompilerHackGuard {
- pub fn new(compiler: Compiler) -> Result<Self> {
- compiler.hack()?;
- Ok(CompilerHackGuard { compiler })
- }
-}
-impl Drop for CompilerHackGuard {
+impl Drop for CompilerHackGuard<'_> {
fn drop(&mut self) {
- if let Err(e) = self.compiler.unhack() {
+ if let Err(e) = self.unhack() {
trace!("{}", e);
}
}
}
-
-impl Default for Compiler {
- fn default() -> Self {
- Self::new()
- }
-}
diff --git a/upatch/upatch-build/src/upatch/mod.rs b/upatch/upatch-build/src/upatch/mod.rs
index a359aa2..88c5f1c 100644
--- a/upatch/upatch-build/src/upatch/mod.rs
+++ b/upatch/upatch-build/src/upatch/mod.rs
@@ -1,5 +1,6 @@
mod args;
mod build;
+mod build_root;
mod compiler;
mod error;
mod link_message;
@@ -7,10 +8,10 @@ mod note;
mod project;
mod resolve;
mod tools;
-mod workdir;
pub use args::*;
pub use build::*;
+pub use build_root::*;
pub use compiler::*;
pub use error::*;
pub use link_message::*;
@@ -18,4 +19,3 @@ pub use note::*;
pub use project::*;
pub use resolve::*;
pub use tools::*;
-pub use workdir::*;
diff --git a/upatch/upatch-daemon/src/args/matcher.rs b/upatch/upatch-daemon/src/args/matcher.rs
index 0badaf6..e938e6e 100644
--- a/upatch/upatch-daemon/src/args/matcher.rs
+++ b/upatch/upatch-daemon/src/args/matcher.rs
@@ -1,7 +1,5 @@
use clap::{clap_app, crate_description, crate_name, crate_version, AppSettings, ArgMatches};
-const DEFAULT_PID_FILE: &str = "/var/run/upatchd.pid";
-const DEFAULT_SOCKET_FILE: &str = "/var/run/upatchd.sock";
const DEFAULT_WORK_DIR: &str = "/var/run/syscare";
const DEFAULT_CONFIG_DIR: &str = "/etc/syscare";
const DEFAULT_LOG_DIR: &str = "/var/log/syscare";
@@ -22,9 +20,7 @@ impl ArgMatcher {
AppSettings::UnifiedHelpMessage,
])
(@arg daemon: short("d") long("daemon") "Run as a daemon")
- (@arg pid_file: long("pid-file") +takes_value value_name("PID_FILE") default_value(DEFAULT_PID_FILE) "Path for daemon pid file")
- (@arg socket_file: long("socket-file") +takes_value value_name("SOCKET_FILE") default_value(DEFAULT_SOCKET_FILE) "Path for daemon unix socket")
- (@arg config_file: long("config-dir") +takes_value value_name("CONFIG_DIR") default_value(DEFAULT_CONFIG_DIR) "Daemon config directory")
+ (@arg config_dir: long("config-dir") +takes_value value_name("CONFIG_DIR") default_value(DEFAULT_CONFIG_DIR) "Daemon config directory")
(@arg work_dir: long("work-dir") +takes_value value_name("WORK_DIR") default_value(DEFAULT_WORK_DIR) "Daemon working directory")
(@arg log_dir: long("log-dir") +takes_value value_name("LOG_DIR") default_value(DEFAULT_LOG_DIR) "Daemon logging directory")
(@arg log_level: short("l") long("log-level") +takes_value value_name("LOG_LEVEL") default_value(DEFAULT_LOG_LEVEL) "Set the logging level (\"trace\"|\"debug\"|\"info\"|\"warn\"|\"error\")")
diff --git a/upatch/upatch-daemon/src/args/mod.rs b/upatch/upatch-daemon/src/args/mod.rs
index 318470e..bd6cb3c 100644
--- a/upatch/upatch-daemon/src/args/mod.rs
+++ b/upatch/upatch-daemon/src/args/mod.rs
@@ -17,12 +17,6 @@ pub struct Arguments {
/// Run as a daemon
pub daemon: bool,
- /// Path for daemon pid file
- pub pid_file: PathBuf,
-
- /// Path for daemon unix socket
- pub socket_file: PathBuf,
-
/// Daemon config directory
pub config_dir: PathBuf,
@@ -43,8 +37,6 @@ impl Parser<'_> for Arguments {
{
Ok(Self {
daemon: ArgParserImpl::is_present(matches, "daemon"),
- pid_file: ArgParserImpl::parse_arg(matches, "pid_file")?,
- socket_file: ArgParserImpl::parse_arg(matches, "socket_file")?,
config_dir: ArgParserImpl::parse_arg(matches, "config_dir")?,
work_dir: ArgParserImpl::parse_arg(matches, "work_dir")?,
log_dir: ArgParserImpl::parse_arg(matches, "log_dir")?,
@@ -62,8 +54,6 @@ impl Arguments {
}
fn normalize_pathes(mut self) -> Result<Self> {
- self.pid_file = fs::normalize(&self.pid_file)?;
- self.socket_file = fs::normalize(&self.socket_file)?;
self.config_dir = fs::normalize(&self.config_dir)?;
self.work_dir = fs::normalize(self.work_dir)?;
self.log_dir = fs::normalize(&self.log_dir)?;
diff --git a/upatch/upatch-daemon/src/main.rs b/upatch/upatch-daemon/src/main.rs
index 80c292f..a112c99 100644
--- a/upatch/upatch-daemon/src/main.rs
+++ b/upatch/upatch-daemon/src/main.rs
@@ -1,5 +1,5 @@
use std::{
- fs,
+ fs::{self, Permissions},
os::unix::fs::PermissionsExt,
path::Path,
process,
@@ -31,8 +31,14 @@ use rpc::{Skeleton, SkeletonImpl};
const CONFIG_FILE_NAME: &str = "upatchd.yaml";
const DAEMON_VERSION: &str = env!("CARGO_PKG_VERSION");
-const DAEMON_UMASK: u32 = 0o027;
-const DAEMON_PARK_TIMEOUT: u64 = 100;
+const DAEMON_UMASK: u32 = 0o077;
+const DAEMON_PARK_TIME: u64 = 100;
+
+const PID_FILE_NAME: &str = "upatchd.pid";
+const SOCKET_FILE_NAME: &str = "upatchd.sock";
+
+const WORK_DIR_PERMISSION: u32 = 0o755;
+const SOCKET_FILE_PERMISSION: u32 = 0o666;
struct Daemon {
args: Arguments,
@@ -72,7 +78,13 @@ impl Daemon {
self.prepare_directory(&self.args.config_dir)?;
self.prepare_directory(&self.args.work_dir)?;
+ fs::set_permissions(
+ &self.args.work_dir,
+ Permissions::from_mode(WORK_DIR_PERMISSION),
+ )?;
+
self.prepare_directory(&self.args.log_dir)?;
+
Ok(())
}
@@ -81,10 +93,11 @@ impl Daemon {
return Ok(());
}
+ let pid_file = self.args.work_dir.join(PID_FILE_NAME);
Daemonize::new()
- .pid_file(&self.args.pid_file)
- .working_directory(&self.args.work_dir)
.umask(DAEMON_UMASK)
+ .working_directory(&self.args.work_dir)
+ .pid_file(pid_file)
.start()
.context("Daemonize failed")
}
@@ -119,9 +132,7 @@ impl Daemon {
}
fn start_rpc_server(&self, io_handler: IoHandler) -> Result<Server> {
- const SOCKET_FILE_PERMISSION: u32 = 0o666;
-
- let socket_file = self.args.socket_file.as_path();
+ let socket_file = self.args.work_dir.join(SOCKET_FILE_NAME);
let builder = ServerBuilder::new(io_handler).set_client_buffer_size(1);
let server = builder.start(
socket_file
@@ -129,10 +140,7 @@ impl Daemon {
.context("Failed to convert socket path to string")?,
)?;
- let mut perm = socket_file.metadata()?.permissions();
- perm.set_mode(SOCKET_FILE_PERMISSION);
-
- fs::set_permissions(socket_file, perm)?;
+ fs::set_permissions(socket_file, Permissions::from_mode(SOCKET_FILE_PERMISSION))?;
Ok(server)
}
@@ -142,7 +150,7 @@ impl Daemon {
instance.initialize_logger()?;
info!("============================");
- info!("Syscare Builder Daemon - v{}", DAEMON_VERSION);
+ info!("Upatch Daemon - v{}", DAEMON_VERSION);
info!("============================");
info!("Preparing environment...");
instance.prepare_environment()?;
@@ -167,7 +175,7 @@ impl Daemon {
info!("Daemon is running...");
while !instance.term_flag.load(Ordering::Relaxed) {
- std::thread::park_timeout(Duration::from_millis(DAEMON_PARK_TIMEOUT));
+ std::thread::park_timeout(Duration::from_millis(DAEMON_PARK_TIME));
}
info!("Shutting down...");
--
2.33.0