Initial commit, hopefully in working state.
This commit is contained in:
commit
fb1b360627
2 changed files with 253 additions and 0 deletions
253
flake.nix
Normal file
253
flake.nix
Normal file
|
@ -0,0 +1,253 @@
|
|||
{
|
||||
description = "The definitive all-in-one SnapRAID script on Linux";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
|
||||
snapraid-aio-src = {
|
||||
url = "github:auanasgheps/snapraid-aio-script/a46c7362af385eac945e86a2a0f6097dbe7ca3fb"; # v3.4-beta3
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
{
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
snapraid-aio-src,
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem (
|
||||
system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
dependencies = with pkgs; [
|
||||
apprise
|
||||
bash
|
||||
bc
|
||||
coreutils
|
||||
curl
|
||||
findutils
|
||||
gnugrep
|
||||
gnused
|
||||
hostname # Added for the hostname command
|
||||
jq
|
||||
mailutils # For mailx
|
||||
procps
|
||||
(python3.withPackages (ps: with ps; [ markdown ])) # Fixed Python with markdown module
|
||||
python3Packages.pipx
|
||||
smartmontools # For smartctl
|
||||
snapraid
|
||||
util-linux # For lsblk
|
||||
];
|
||||
in
|
||||
{
|
||||
packages = rec {
|
||||
default = snapraid-aio;
|
||||
|
||||
snapraid-aio = pkgs.stdenv.mkDerivation rec {
|
||||
pname = "snapraid-aio";
|
||||
version = "3.4-beta3";
|
||||
src = snapraid-aio-src;
|
||||
|
||||
nativeBuildInputs = [ pkgs.makeWrapper ];
|
||||
buildInputs = dependencies;
|
||||
|
||||
dontBuild = true;
|
||||
|
||||
installPhase = ''
|
||||
# Create directories
|
||||
mkdir -p $out/bin
|
||||
mkdir -p $out/share/snapraid-aio
|
||||
|
||||
# 1. PATCH CONFIG: Modify the config file to not overwrite PATH
|
||||
cat script-config.conf | sed 's|^PATH=.*$|# PATH is managed by Nix wrapper|' > $out/share/snapraid-aio/default-config.conf
|
||||
cp README.md $out/share/snapraid-aio/
|
||||
|
||||
# 2. PATCH SCRIPT: Add PATH protection to the main script and fix paths
|
||||
cat snapraid-aio-script.sh > temp_script.sh
|
||||
|
||||
# Insert code to save PATH before sourcing config
|
||||
sed -i '/#shellcheck source=script-config.conf/i # Save original PATH\nORIGINAL_PATH="$PATH"' temp_script.sh
|
||||
|
||||
# Insert code to restore PATH after sourcing config
|
||||
sed -i '/source "$CONFIG_FILE"/a # Restore original PATH\nPATH="$ORIGINAL_PATH"' temp_script.sh
|
||||
|
||||
# Fix the process substitution issue
|
||||
sed -i 's/exec > >(tee/exec > >(PATH="$PATH" tee/g' temp_script.sh
|
||||
|
||||
# Fix specific command paths
|
||||
sed -i 's|MAIL_BIN=/usr/bin/mailx|MAIL_BIN=${pkgs.mailutils}/bin/mailx|g' temp_script.sh
|
||||
sed -i 's|command -v dpkg >/dev/null|false|g' temp_script.sh
|
||||
sed -i 's|python3 -m markdown|${
|
||||
pkgs.python3.withPackages (ps: with ps; [ markdown ])
|
||||
}/bin/python3 -m markdown|g' temp_script.sh
|
||||
|
||||
# Copy the patched script
|
||||
cp temp_script.sh $out/share/snapraid-aio/snapraid-aio-script.sh
|
||||
chmod +x $out/share/snapraid-aio/snapraid-aio-script.sh
|
||||
rm temp_script.sh
|
||||
|
||||
# 3. EXPLICIT PATH IN WRAPPER: Create wrapper script with explicit PATH setting
|
||||
cat > $out/bin/snapraid-aio << EOF
|
||||
#!${pkgs.bash}/bin/bash
|
||||
|
||||
# Set PATH explicitly to include all dependencies
|
||||
export PATH="${pkgs.lib.makeBinPath dependencies}:$PATH"
|
||||
|
||||
# Create a writable temp directory if needed
|
||||
TEMP_DIR="\$HOME/.cache/snapraid-aio"
|
||||
mkdir -p "\$TEMP_DIR"
|
||||
|
||||
# Define default config path
|
||||
DEFAULT_CONFIG="$out/share/snapraid-aio/default-config.conf"
|
||||
|
||||
# Export environment variables the script needs
|
||||
export TMP_OUTPUT="\$TEMP_DIR/snapRAID.out"
|
||||
export SYNC_WARN_FILE="\$TEMP_DIR/snapRAID.warnCount"
|
||||
export SCRUB_COUNT_FILE="\$TEMP_DIR/snapRAID.scrubCount"
|
||||
|
||||
# If user specified a config, use it
|
||||
if [ "\$1" ] && [ -f "\$1" ]; then
|
||||
exec ${pkgs.bash}/bin/bash $out/share/snapraid-aio/snapraid-aio-script.sh "\$@"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Otherwise use the default config
|
||||
exec ${pkgs.bash}/bin/bash $out/share/snapraid-aio/snapraid-aio-script.sh "\$DEFAULT_CONFIG" "\$@"
|
||||
EOF
|
||||
chmod +x $out/bin/snapraid-aio
|
||||
|
||||
# Still use wrapProgram as a 4th layer of protection
|
||||
wrapProgram $out/share/snapraid-aio/snapraid-aio-script.sh \
|
||||
--prefix PATH : ${pkgs.lib.makeBinPath dependencies}
|
||||
'';
|
||||
|
||||
meta = with pkgs.lib; {
|
||||
description = "All-in-one SnapRAID helper script";
|
||||
homepage = "https://github.com/auanasgheps/snapraid-aio-script";
|
||||
license = licenses.gpl3;
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
)
|
||||
// {
|
||||
# NixOS module for system-wide installation
|
||||
nixosModules.default =
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.services.snapraid-aio;
|
||||
in
|
||||
{
|
||||
options.services.snapraid-aio = {
|
||||
enable = mkEnableOption "snapraid-aio script";
|
||||
|
||||
configFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = "Path to custom snapraid-aio configuration file";
|
||||
};
|
||||
|
||||
schedule = mkOption {
|
||||
type = types.str;
|
||||
default = "daily";
|
||||
description = "Systemd calendar expression for when to run snapraid-aio";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
environment.systemPackages = [ self.packages.${pkgs.system}.default ];
|
||||
|
||||
systemd.services.snapraid-aio = {
|
||||
description = "SnapRAID maintenance with snapraid-aio";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart =
|
||||
if cfg.configFile != null then
|
||||
"${self.packages.${pkgs.system}.default}/bin/snapraid-aio ${cfg.configFile}"
|
||||
else
|
||||
"${self.packages.${pkgs.system}.default}/bin/snapraid-aio";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.timers.snapraid-aio = {
|
||||
description = "Run snapraid-aio on schedule";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = cfg.schedule;
|
||||
Persistent = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# Home-manager module
|
||||
homeManagerModules.default =
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.services.snapraid-aio;
|
||||
in
|
||||
{
|
||||
options.services.snapraid-aio = {
|
||||
enable = mkEnableOption "snapraid-aio script";
|
||||
|
||||
configFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = "Path to custom snapraid-aio configuration file";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = [ self.packages.${pkgs.system}.default ];
|
||||
|
||||
# For home-manager, we'll add a systemd user service instead
|
||||
systemd.user.services.snapraid-aio = {
|
||||
Unit = {
|
||||
Description = "SnapRAID maintenance with snapraid-aio";
|
||||
};
|
||||
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecStart =
|
||||
if cfg.configFile != null then
|
||||
"${self.packages.${pkgs.system}.default}/bin/snapraid-aio ${cfg.configFile}"
|
||||
else
|
||||
"${self.packages.${pkgs.system}.default}/bin/snapraid-aio";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.user.timers.snapraid-aio = {
|
||||
Unit = {
|
||||
Description = "Run snapraid-aio daily";
|
||||
};
|
||||
|
||||
Timer = {
|
||||
OnCalendar = "daily";
|
||||
Persistent = true;
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "timers.target" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
0
readme.md
Normal file
0
readme.md
Normal file
Loading…
Add table
Reference in a new issue