Compare commits
1 Commits
102509b9a8
...
updated-in
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4751311a9 |
14
flake.lock
generated
14
flake.lock
generated
@@ -411,11 +411,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1757627777,
|
"lastModified": 1757364612,
|
||||||
"narHash": "sha256-NGUqHQ+/BaUhjgSYQauTihTtNyhhnQRMJ8t7ZSPNpmk=",
|
"narHash": "sha256-6MSqlWHH15qbWbvS9b6OTGdtIkW6GVb9SSLkEYAMdDw=",
|
||||||
"ref": "refs/heads/main",
|
"ref": "refs/heads/main",
|
||||||
"rev": "b7b0f0d5191433bca1377f7d818b800627a83fda",
|
"rev": "cb758d9bc97baa11e80a048e666c99986cabed43",
|
||||||
"revCount": 9,
|
"revCount": 6,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.clerie.de/clerie/mu5001tool.git"
|
"url": "https://git.clerie.de/clerie/mu5001tool.git"
|
||||||
},
|
},
|
||||||
@@ -666,11 +666,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_5": {
|
"nixpkgs_5": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1753549186,
|
"lastModified": 1757347588,
|
||||||
"narHash": "sha256-Znl7rzuxKg/Mdm6AhimcKynM7V3YeNDIcLjBuoBcmNs=",
|
"narHash": "sha256-tLdkkC6XnsY9EOZW9TlpesTclELy8W7lL2ClL+nma8o=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "17f6bd177404d6d43017595c5264756764444ab8",
|
"rev": "b599843bad24621dcaa5ab60dac98f9b0eb1cabe",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
DynamicUser = true;
|
DynamicUser = true;
|
||||||
LoadCredential = "zte-hypermobile-5g-password:${config.sops.secrets."zte-hypermobile-5g-password".path}";
|
LoadCredential = "zte-hypermobile-5g-password:${config.sops.secrets."zte-hypermobile-5g-password".path}";
|
||||||
Restart = "on-failure";
|
|
||||||
RestartSec = "15s";
|
|
||||||
};
|
};
|
||||||
script = ''
|
script = ''
|
||||||
${lib.getExe pkgs.mu5001tool} --password-file ''${CREDENTIALS_DIRECTORY}/zte-hypermobile-5g-password prometheus-exporter --listen-port 9242
|
${lib.getExe pkgs.mu5001tool} --password-file ''${CREDENTIALS_DIRECTORY}/zte-hypermobile-5g-password prometheus-exporter --listen-port 9242
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
signal-desktop
|
signal-desktop
|
||||||
dino
|
dino
|
||||||
fractal
|
fractal
|
||||||
tuba
|
|
||||||
flare-signal
|
|
||||||
|
|
||||||
tio
|
tio
|
||||||
xournalpp
|
xournalpp
|
||||||
|
|||||||
@@ -11,28 +11,7 @@ with lib;
|
|||||||
};
|
};
|
||||||
users.groups.data-em = {};
|
users.groups.data-em = {};
|
||||||
|
|
||||||
users.users.data-em-mp3 = {
|
|
||||||
group = "data-em-mp3";
|
|
||||||
home = "/data/em-mp3";
|
|
||||||
useDefaultShell = true;
|
|
||||||
isSystemUser = true;
|
|
||||||
};
|
|
||||||
users.groups.data-em-mp3 = {};
|
|
||||||
|
|
||||||
systemd.tmpfiles.rules = [
|
systemd.tmpfiles.rules = [
|
||||||
"d /data/em - data-em data-em - -"
|
"d /data/em - data-em data-em - -"
|
||||||
"d /data/em-mp3 - data-em-mp3 data-em-mp3 - -"
|
|
||||||
];
|
];
|
||||||
|
|
||||||
systemd.services.convert-flac-dir-to-mp3 = {
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
ExecStart = "${lib.getExe pkgs.convert-flac-dir-to-mp3} /data/em /data/em-mp3";
|
|
||||||
StateDirectory = "convert-flac-dir-to-mp3";
|
|
||||||
WorkingDirectory = "/var/lib/convert-flac-dir-to-mp3";
|
|
||||||
User = "data-em-mp3";
|
|
||||||
Group = "data-em-mp3";
|
|
||||||
};
|
|
||||||
startAt = "*-*-* 03:47:00";
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,23 +53,17 @@ in {
|
|||||||
"mixcloud.clerie.de" = {
|
"mixcloud.clerie.de" = {
|
||||||
enableACME = true;
|
enableACME = true;
|
||||||
forceSSL = true;
|
forceSSL = true;
|
||||||
basicAuthFile = config.sops.secrets.mixcloud-htpasswd.path;
|
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
alias = "/data/mixcloud/";
|
alias = "/data/mixcloud/";
|
||||||
|
basicAuthFile = config.sops.secrets.mixcloud-htpasswd.path;
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
autoindex on;
|
autoindex on;
|
||||||
autoindex_exact_size off;
|
autoindex_exact_size off;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
locations."/api/" = {
|
|
||||||
alias = "/data/mixcloud/";
|
|
||||||
extraConfig = ''
|
|
||||||
autoindex on;
|
|
||||||
autoindex_format json;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
locations."/media/" = {
|
locations."/media/" = {
|
||||||
alias = "/data/media/";
|
alias = "/data/media/";
|
||||||
|
basicAuthFile = config.sops.secrets.mixcloud-htpasswd.path;
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
autoindex on;
|
autoindex on;
|
||||||
autoindex_exact_size off;
|
autoindex_exact_size off;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
python3,
|
python3,
|
||||||
makeWrapper,
|
writeTextFile,
|
||||||
runCommand,
|
|
||||||
lib,
|
lib,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@@ -10,7 +9,6 @@
|
|||||||
text,
|
text,
|
||||||
runtimePackages ? ps: [],
|
runtimePackages ? ps: [],
|
||||||
pythonPackage ? python3,
|
pythonPackage ? python3,
|
||||||
runtimeInputs ? [],
|
|
||||||
meta ? {},
|
meta ? {},
|
||||||
passthru ? {},
|
passthru ? {},
|
||||||
derivationArgs ? {},
|
derivationArgs ? {},
|
||||||
@@ -20,17 +18,13 @@ let
|
|||||||
|
|
||||||
pythonWithPackages = pythonPackage.withPackages runtimePackages;
|
pythonWithPackages = pythonPackage.withPackages runtimePackages;
|
||||||
|
|
||||||
in runCommand name ({
|
in writeTextFile {
|
||||||
passAsFile = [ "text" ] ++ (derivationArgs.passAsFile or []);
|
inherit
|
||||||
|
name
|
||||||
meta = {
|
meta
|
||||||
mainProgram = name;
|
passthru
|
||||||
} // meta // (derivationArgs.meta or {});
|
derivationArgs
|
||||||
|
;
|
||||||
passthru = passthru // (derivationArgs.passthru or {});
|
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper ] ++ (derivationArgs.nativeBuildInputs or []);
|
|
||||||
|
|
||||||
executable = true;
|
executable = true;
|
||||||
destination = "/bin/${name}";
|
destination = "/bin/${name}";
|
||||||
allowSubstitutes = true;
|
allowSubstitutes = true;
|
||||||
@@ -40,17 +34,4 @@ in runCommand name ({
|
|||||||
|
|
||||||
${text}
|
${text}
|
||||||
'';
|
'';
|
||||||
} // (
|
}
|
||||||
builtins.removeAttrs derivationArgs [ "passAsFile" "meta" "passthru" "nativeBuildInputs" ]
|
|
||||||
))
|
|
||||||
''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
|
|
||||||
target=$out/bin/${lib.escapeShellArg name}
|
|
||||||
|
|
||||||
cp "$textPath" "$target"
|
|
||||||
|
|
||||||
chmod +x "$target"
|
|
||||||
|
|
||||||
wrapProgram "$target" --prefix PATH : "${lib.makeBinPath runtimeInputs}"
|
|
||||||
''
|
|
||||||
|
|||||||
@@ -1,109 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
from pathlib import Path
|
|
||||||
from progress.bar import Bar
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
def files_and_dirs_for_directory(path):
|
|
||||||
filepaths = []
|
|
||||||
dirpaths = []
|
|
||||||
|
|
||||||
for dirpath, dirnames, filenames in path.walk():
|
|
||||||
dirpaths.append(dirpath)
|
|
||||||
|
|
||||||
for filename in filenames:
|
|
||||||
filepath = dirpath / filename
|
|
||||||
filepaths.append(filepath)
|
|
||||||
|
|
||||||
return set(filepaths), set(dirpaths)
|
|
||||||
|
|
||||||
def make_paths_relative(paths, relative_to_path):
|
|
||||||
return set(path.relative_to(relative_to_path) for path in paths)
|
|
||||||
|
|
||||||
def replace_suffix(path, suffix):
|
|
||||||
return path.with_name(path.stem + suffix)
|
|
||||||
|
|
||||||
def convert_filepath(path):
|
|
||||||
if path.suffix == ".flac":
|
|
||||||
return replace_suffix(path, ".mp3")
|
|
||||||
|
|
||||||
return path
|
|
||||||
|
|
||||||
def ffmpeg_flac_to_mp3(in_path, out_path):
|
|
||||||
print("")
|
|
||||||
subprocess.run(["ffmpeg", "-hide_banner", "-loglevel", "warning", "-stats", "-i", in_path, "-ab", "320k", "-map_metadata", "0", "-id3v2_version", "3", out_path], check=True)
|
|
||||||
print("")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(prog="convert-flac-dir-to-mp3")
|
|
||||||
parser.add_argument("from_dir", type=Path)
|
|
||||||
parser.add_argument("to_dir", type=Path)
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
from_path = args.from_dir.absolute()
|
|
||||||
to_path = args.to_dir.absolute()
|
|
||||||
|
|
||||||
if not from_path.exists():
|
|
||||||
raise Exception("from_path does not exist")
|
|
||||||
|
|
||||||
if not to_path.exists():
|
|
||||||
raise Exception("to_path does not exist")
|
|
||||||
|
|
||||||
if not from_path.is_dir():
|
|
||||||
raise Exception("from_path is not a directory")
|
|
||||||
|
|
||||||
if not to_path.is_dir():
|
|
||||||
raise Exception("to_path is not a directory")
|
|
||||||
|
|
||||||
print(f"Converting {from_path} to {to_path}…")
|
|
||||||
|
|
||||||
from_filepaths, from_dirpaths = files_and_dirs_for_directory(from_path)
|
|
||||||
to_filepaths, to_dirpaths = files_and_dirs_for_directory(to_path)
|
|
||||||
|
|
||||||
|
|
||||||
relative_from_filepaths = make_paths_relative(from_filepaths, from_path)
|
|
||||||
relative_to_filepaths = make_paths_relative(to_filepaths, to_path)
|
|
||||||
|
|
||||||
converted_from_filepaths = set(convert_filepath(filepath) for filepath in relative_from_filepaths)
|
|
||||||
|
|
||||||
filepaths_missing_in_to_path = converted_from_filepaths - relative_to_filepaths
|
|
||||||
|
|
||||||
|
|
||||||
relative_from_dirpaths = make_paths_relative(from_dirpaths, from_path)
|
|
||||||
relative_to_dirpaths = make_paths_relative(to_dirpaths, to_path)
|
|
||||||
|
|
||||||
dirpaths_missing_in_to_path = relative_from_dirpaths - relative_to_dirpaths
|
|
||||||
|
|
||||||
print(f"Missing {len(filepaths_missing_in_to_path)} files and {len(dirpaths_missing_in_to_path)} directories")
|
|
||||||
|
|
||||||
if len(dirpaths_missing_in_to_path) > 0:
|
|
||||||
for dirpath in Bar("Creating directories").iter(dirpaths_missing_in_to_path):
|
|
||||||
(to_path / dirpath).mkdir(parents=True, exist_ok=True)
|
|
||||||
|
|
||||||
if len(filepaths_missing_in_to_path) > 0:
|
|
||||||
for filepath in Bar("Creating files").iter(filepaths_missing_in_to_path):
|
|
||||||
if filepath in relative_from_filepaths:
|
|
||||||
# Just copy the file
|
|
||||||
shutil.copy(from_path / filepath, to_path / filepath)
|
|
||||||
elif filepath.suffix == ".mp3" and replace_suffix(filepath, ".flac") in relative_from_filepaths:
|
|
||||||
# Convert from flac
|
|
||||||
print("")
|
|
||||||
print(f"Converting {to_path / filepath}…")
|
|
||||||
|
|
||||||
# Tempfile for ffmpeg
|
|
||||||
tmpfilepath = filepath.with_name(".~" + filepath.name)
|
|
||||||
(to_path / tmpfilepath).unlink(missing_ok=True)
|
|
||||||
|
|
||||||
print(f"Using tempfile for ffmpeg {to_path / tmpfilepath}…")
|
|
||||||
|
|
||||||
# Convert
|
|
||||||
ffmpeg_flac_to_mp3(from_path / replace_suffix(filepath, ".flac"), to_path / tmpfilepath)
|
|
||||||
|
|
||||||
# Rename tempfile
|
|
||||||
(to_path / tmpfilepath).rename(to_path / filepath)
|
|
||||||
else:
|
|
||||||
raise Exception("Unable to figure out how to get {to_path / filepath} from {from_path}")
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{ pkgs, ... }:
|
|
||||||
|
|
||||||
pkgs.clerie-build-support.writePythonScript {
|
|
||||||
name = "convert-flac-dir-to-mp3";
|
|
||||||
runtimePackages = ps: with ps; [ progress ];
|
|
||||||
runtimeInputs = [ pkgs.ffmpeg-headless ];
|
|
||||||
text = builtins.readFile ./convert-flac-dir-to-mp3.py;
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
e2fsprogs,
|
e2fsprogs,
|
||||||
gptfdisk,
|
|
||||||
jq,
|
jq,
|
||||||
parted,
|
parted,
|
||||||
writeShellApplication,
|
writeShellApplication,
|
||||||
@@ -11,7 +10,6 @@ writeShellApplication {
|
|||||||
text = builtins.readFile ./grow-last-partition-and-filesystem.sh;
|
text = builtins.readFile ./grow-last-partition-and-filesystem.sh;
|
||||||
runtimeInputs = [
|
runtimeInputs = [
|
||||||
e2fsprogs
|
e2fsprogs
|
||||||
gptfdisk
|
|
||||||
jq
|
jq
|
||||||
parted
|
parted
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -11,9 +11,6 @@ fi
|
|||||||
|
|
||||||
DEVICE="$1"
|
DEVICE="$1"
|
||||||
|
|
||||||
echo "Move GTP backup header to end of disk"
|
|
||||||
sgdisk "${DEVICE}" --move-second-header
|
|
||||||
|
|
||||||
PARTITIONDATA="$(parted --script --json --fix "${DEVICE}" print)"
|
PARTITIONDATA="$(parted --script --json --fix "${DEVICE}" print)"
|
||||||
PARTNUMBER="$(echo "${PARTITIONDATA}" | jq -r '.disk.partitions | last | .number')"
|
PARTNUMBER="$(echo "${PARTITIONDATA}" | jq -r '.disk.partitions | last | .number')"
|
||||||
PARTNAME="$(echo "${PARTITIONDATA}" | jq -r '.disk.partitions | last | .name')"
|
PARTNAME="$(echo "${PARTITIONDATA}" | jq -r '.disk.partitions | last | .name')"
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ final: prev: {
|
|||||||
clerie-sops-edit = final.callPackage ./clerie-sops/clerie-sops-edit.nix {};
|
clerie-sops-edit = final.callPackage ./clerie-sops/clerie-sops-edit.nix {};
|
||||||
clerie-update-nixfiles = final.callPackage ./clerie-update-nixfiles/clerie-update-nixfiles.nix {};
|
clerie-update-nixfiles = final.callPackage ./clerie-update-nixfiles/clerie-update-nixfiles.nix {};
|
||||||
chromium-incognito = final.callPackage ./chromium-incognito {};
|
chromium-incognito = final.callPackage ./chromium-incognito {};
|
||||||
convert-flac-dir-to-mp3 = final.callPackage ./convert-flac-dir-to-mp3 {};
|
|
||||||
curl-timings = final.callPackage ./curl-timings {};
|
curl-timings = final.callPackage ./curl-timings {};
|
||||||
factorio-launcher = final.callPackage ./factorio-launcher {};
|
factorio-launcher = final.callPackage ./factorio-launcher {};
|
||||||
feeds-dir = final.callPackage ./feeds-dir {};
|
feeds-dir = final.callPackage ./feeds-dir {};
|
||||||
|
|||||||
Reference in New Issue
Block a user