diff --git a/.gitignore b/.gitignore index f0f9c70..8e85c12 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ rel.drawio.png src/config/build_cfg.rs +*.log diff --git a/Cargo.lock b/Cargo.lock index 99a7b16..9a19dc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -388,7 +388,6 @@ dependencies = [ name = "lolicron" version = "0.1.0" dependencies = [ - "bitflags", "cfg-if", "chrono", "config_struct", @@ -399,6 +398,7 @@ dependencies = [ "mopa", "notify", "once_cell", + "readable-perms", "recolored", "rustc_version", "sexp", @@ -603,6 +603,17 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "readable-perms" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027e9ff27619e387809844e9f87d2798b288cf6257c45d67e2b9996d1ca4a41f" +dependencies = [ + "bitflags", + "libc", + "rustc_version", +] + [[package]] name = "recolored" version = "1.9.3" diff --git a/TODO b/TODO index 7978bc1..1418aee 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,4 @@ Log filtering rules in config file. For `Trace`s, `Level`s, sublevels, etc. Log normalise source path in terminal print -Log change system. Use `Log` trait that we can define different printers for terminal, logfile, etc + +Log have #[cfg(feature="threaded")] for deferring write to background worker diff --git a/src/log/custom/global_logfile.rs b/src/log/custom/global_logfile.rs index d20ec5b..40bd0b1 100644 --- a/src/log/custom/global_logfile.rs +++ b/src/log/custom/global_logfile.rs @@ -53,6 +53,29 @@ pub struct LogFileHook sender: Option>, } +impl Internal +{ + //funcs we might both want to use + + fn valid_perms(&self) -> readable_perms::Permissions + { + //TODO: Add field for this + readable_perms::Permissions::new() + .add_mask(readable_perms::User::Owner, readable_perms::Bit::Read | readable_perms::Bit::Write) + .add_mask(readable_perms::User::Group, readable_perms::Bit::Read) + .add_mask(readable_perms::User::Owner, readable_perms::Bit::None) + } + + /// Fix permissions on this file to what we want. + fn fix_perms(&self, file: &mut tokio::fs::File) + { + use readable_perms::*; + if let Err(e) = file.chmod(self.valid_perms()) { + crate::warn!("Error fixing logfile permissions: {}", e); + } + } +} + impl LogFileHook { /// Create a new log file hook @@ -100,6 +123,7 @@ impl Hook for LogFileHook let mut file = match OpenOptions::new() .append(true) .create(true) + .write(true) .open(path).await { Ok(file) => file, Err(err) => { @@ -108,6 +132,8 @@ impl Hook for LogFileHook }, }; + internal.fix_perms(&mut file); + if let Err(err) = write_log(&mut file, command).await { crate::warn!("Failed writing to logfile {:?}: {}", path, err); } diff --git a/src/log/mod.rs b/src/log/mod.rs index b5cf642..c9333f4 100644 --- a/src/log/mod.rs +++ b/src/log/mod.rs @@ -26,7 +26,7 @@ pub use level::*; mod trace; pub use trace::*; -mod custom; +pub mod custom; /// A logger that prints to stdout and stderr idk. #[derive(Debug)] diff --git a/src/main.rs b/src/main.rs index 039d171..541424a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,8 +32,6 @@ mod hot; mod context; mod job; -mod perms; - //This is a test function, when we have a real job server, remove it. async fn do_thing_every() -> Result<(mpsc::Sender<()>, task::JoinHandle<()>), Box> { @@ -125,7 +123,7 @@ fn print_stats() async fn main() -> Result<(), Box> { log::init(log::Level::Debug); - //log::Logger::global().add_hook(log::custom::LogFileHook::new(log::Level::Debug, "test.log", "test.err.log", false)); + log::Logger::global().add_hook(log::custom::LogFileHook::new(log::Level::Debug, "test.log", "test.err.log", false)); debug!("Logger initialised"); //TODO: Parse config first print_stats(); diff --git a/src/perms.rs b/src/perms.rs deleted file mode 100644 index 1b10346..0000000 --- a/src/perms.rs +++ /dev/null @@ -1,202 +0,0 @@ -//! Permissions shit kms -//! -//! No I don't care about Microshaft wangblows -#![allow(non_upper_case_globals)] -use bitflags::bitflags; - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -enum Class -{ - Owner(Bit), - Group(Bit), - Other(Bit), -} - -impl Class -{ - /// Lmfao. Fuck bit masks and unix permissiong, `const fn` so idc - const fn mode(&self) -> u32 - { - macro_rules! map { - ($bit:expr, $bt:path, $constant:ident) => { - if $bit.contains($bt) { - $constant - } else { - 0 - } - } - } - match self { - Self::Owner(bit) => { - 0u32 | - map!(bit, Bit::Read, MODE_USER_READ) | - map!(bit, Bit::Write, MODE_USER_WRITE) | - map!(bit, Bit::Execute, MODE_USER_EXECUTE) - }, - Self::Group(bit) => { - 0u32 | - map!(bit, Bit::Read, MODE_GROUP_READ) | - map!(bit, Bit::Write, MODE_GROUP_WRITE) | - map!(bit, Bit::Execute, MODE_GROUP_EXECUTE) - }, - Self::Other(bit) => { - 0u32 | - map!(bit, Bit::Read, MODE_OTHER_READ) | - map!(bit, Bit::Write, MODE_OTHER_WRITE) | - map!(bit, Bit::Execute, MODE_OTHER_EXECUTE) - }, - } - } - - const fn mask_mode(&self, bit: u32) -> Bit - { - macro_rules! map { - ($bit:expr, $bt:path, $constant:ident) => { - if ($bit & $constant) == $constant {$bt.bits()} else {0u32} - } - } - - Bit::from_bits_truncate(match self { - Self::Owner(_) => { - map!(bit, Bit::Read, MODE_USER_READ) | - map!(bit, Bit::Write, MODE_USER_WRITE) | - map!(bit, Bit::Execute, MODE_USER_EXECUTE) - }, - Self::Group(_) => { - map!(bit, Bit::Read, MODE_GROUP_READ) | - map!(bit, Bit::Write, MODE_GROUP_WRITE) | - map!(bit, Bit::Execute, MODE_GROUP_EXECUTE) - }, - Self::Other(_) => { - map!(bit, Bit::Read, MODE_OTHER_READ) | - map!(bit, Bit::Write, MODE_OTHER_WRITE) | - map!(bit, Bit::Execute, MODE_OTHER_EXECUTE) - }, - }) - } -} - -const MODE_USER: u32 = 0o700; -const MODE_USER_READ: u32 = 0o400; -const MODE_USER_WRITE: u32 = 0o200; -const MODE_USER_EXECUTE: u32 = 0o100; - -const MODE_GROUP: u32 = 0o70; -const MODE_GROUP_READ: u32 = 0o40; -const MODE_GROUP_WRITE: u32 = 0o20; -const MODE_GROUP_EXECUTE: u32 = 0o10; - -const MODE_OTHER: u32 = 0o7; -const MODE_OTHER_READ: u32 = 0o4; -const MODE_OTHER_WRITE: u32 = 0o2; -const MODE_OTHER_EXECUTE: u32 = 0o1; - -const MODE: u32 = 0o777; - -bitflags!{ - pub struct Bit: u32 { - const None = 0; - const Read = 1; - const Write = 2; - const Execute = 4; - const Mask = 7; - } -} - -bitflags!{ - struct StickyBit: u32{ - const None = 0; - const Setuid = 0o40000; - const Setgid = 0o20000; - const SaveSwap = 0o10000; - - } -} - -/// Permissions struct in readable format -#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy, Ord, PartialOrd)] -pub struct Permissions -{ - pub u_owner: Bit, - pub u_group: Bit, - pub u_other: Bit, - - _u_sticky: StickyBit, //idc about this either -} - -impl Default for Permissions -{ - #[inline] fn default() -> Self - { - Self::new() - } -} - -impl Permissions -{ - /// Create a new empty `Permissions` struct - pub const fn new() -> Self - { - Self { - u_owner: Bit::None, - u_group: Bit::None, - u_other: Bit::None, - _u_sticky: StickyBit::None, - } - } -} - -// Mask impl -impl Permissions -{ - #[inline] const fn c_owner(&self) -> Class - { - Class::Owner(self.u_owner) - } - #[inline] const fn c_group(&self) -> Class - { - Class::Group(self.u_group) - } - #[inline] const fn c_other(&self) -> Class - { - Class::Other(self.u_other) - } - - /// Convert into `mode_t` repr. - #[inline] pub const fn mask(&self) -> u32 - { - self.c_owner().mode() | - self.c_group().mode() | - self.c_other().mode() - } - - /// Convert from `mode_t` repr. - #[inline] pub const fn from_mask(bit: u32) -> Self - { - Self{ - u_owner: Class::Owner(Bit::Mask).mask_mode(bit), - u_group: Class::Group(Bit::Mask).mask_mode(bit), - u_other: Class::Other(Bit::Mask).mask_mode(bit), - - _u_sticky: StickyBit::None, - } - } -} - -impl From for u32 -{ - #[inline] fn from(from: Permissions) -> Self - { - from.mask() - } -} - -impl From for Permissions -{ - #[inline] fn from(from: u32) -> Self - { - Self::from_mask(from) - } -} - - diff --git a/test.log b/test.log deleted file mode 100644 index 6d4695f..0000000 --- a/test.log +++ /dev/null @@ -1,21 +0,0 @@ -2020-08-05 01:04:28 UTC [Debug]: Logger initialised2020-08-05 01:04:28 UTC [Debug]: This is the lolicron daemon version 0.1.0 by Avril , Mx. Package Install (debug build)2020-08-05 01:04:28 UTC [Debug]: ---2020-08-05 01:04:28 UTC [Debug]: Compiled with (on (default), off (default)):2020-08-05 01:04:28 UTC [Debug]:  +nightly2020-08-05 01:04:28 UTC [Debug]:  +debug_assertions2020-08-05 01:04:28 UTC [Debug]: features:2020-08-05 01:04:28 UTC [Debug]:  +threaded2020-08-05 01:04:28 UTC [Debug]:  +watcher2020-08-05 01:04:28 UTC [Debug]:  +debug_logger2020-08-05 01:04:28 UTC [Debug]:  -watcher_unlimited2020-08-05 01:04:28 UTC [Debug]:  +watcher_timeout2020-08-05 01:04:28 UTC [Debug]: 2020-08-05 01:04:28 UTC [Debug]: Static options:2020-08-05 01:04:28 UTC [Debug]: hot::BACKLOG = 1002020-08-05 01:04:28 UTC [Debug]: hot::TIMEOUT = 52020-08-05 01:04:28 UTC [Debug]: GPl'd with <32020-08-05 01:04:28 UTC [Debug]: Please enjoy2020-08-05 01:04:28 UTC [Debug]: ---2020-08-05 01:04:28 UTC [Debug]: Watcher initialised, starting for path "/home/avril/work/lolicron"2020-08-05 01:04:28 UTC [Info]: Watcher up2020-08-05 01:05:39 UTC [Debug]: Logger initialised -2020-08-05 01:05:39 UTC [Debug]: This is the lolicron daemon version 0.1.0 by Avril , Mx. Package Install (debug build) -2020-08-05 01:05:39 UTC [Debug]: --- -2020-08-05 01:05:39 UTC [Debug]: Compiled with (on (default), off (default)): -2020-08-05 01:05:39 UTC [Debug]:  +nightly -2020-08-05 01:05:39 UTC [Debug]:  +debug_assertions -2020-08-05 01:05:39 UTC [Debug]: features: -2020-08-05 01:05:39 UTC [Debug]:  +threaded -2020-08-05 01:05:39 UTC [Debug]:  +watcher -2020-08-05 01:05:39 UTC [Debug]:  +debug_logger -2020-08-05 01:05:39 UTC [Debug]:  -watcher_unlimited -2020-08-05 01:05:39 UTC [Debug]:  +watcher_timeout -2020-08-05 01:05:39 UTC [Debug]: -2020-08-05 01:05:39 UTC [Debug]: Static options: -2020-08-05 01:05:39 UTC [Debug]: hot::BACKLOG = 100 -2020-08-05 01:05:39 UTC [Debug]: hot::TIMEOUT = 5 -2020-08-05 01:05:39 UTC [Debug]: GPl'd with <3 -2020-08-05 01:05:39 UTC [Debug]: Please enjoy -2020-08-05 01:05:39 UTC [Debug]: --- -2020-08-05 01:05:39 UTC [Debug]: Watcher initialised, starting for path "/home/avril/work/lolicron" -2020-08-05 01:05:39 UTC [Info]: Watcher up