Merge remote-tracking branch 'origin/master' into staging-next

This commit is contained in:
Fabián Heredia Montiel
2025-08-22 10:30:15 -06:00
42 changed files with 371 additions and 864 deletions
-1
View File
@@ -13,7 +13,6 @@ on:
- release-*
- staging-*
- haskell-updates
- python-updates
permissions: {}
+1 -1
View File
@@ -36,7 +36,7 @@ For the purposes of CI, branches in the NixOS/nixpkgs repository are classified
- Pull Requests required.
- Long-lived, no deletion, no force push.
- **Secondary development** branches
- `staging-` prefix, `haskell-updates` and `python-updates`
- `staging-` prefix and `haskell-updates`
- Pull Requests normally required, except when merging development branches into each other.
- Long-lived, no deletion, no force push.
- **Work-In-Progress** branches
-1
View File
@@ -6,4 +6,3 @@ staging
release-*
staging-*
haskell-updates
python-updates
-1
View File
@@ -9,7 +9,6 @@ const typeConfig = {
staging: ['development', 'secondary'],
'staging-next': ['development', 'secondary'],
'haskell-updates': ['development', 'secondary'],
'python-updates': ['development', 'secondary'],
nixos: ['channel'],
nixpkgs: ['channel'],
}
+1 -4
View File
@@ -31,10 +31,7 @@ let
PAPERLESS_REDIS = "unix://${redisServer.unixSocket}";
}
// lib.optionalAttrs (cfg.settings.PAPERLESS_ENABLE_NLTK or true) {
PAPERLESS_NLTK_DIR = pkgs.symlinkJoin {
name = "paperless_ngx_nltk_data";
paths = cfg.package.nltkData;
};
PAPERLESS_NLTK_DIR = cfg.package.nltkDataDir;
}
// lib.optionalAttrs (cfg.openMPThreadingWorkaround) {
OMP_NUM_THREADS = "1";
+34 -4
View File
@@ -103,14 +103,16 @@ let
# Send a subrequest to verify if the user is authenticated and has permission to access the resource.
auth_request /auth;
# Save the upstream metadata response headers from Authelia to variables.
# Save the upstream metadata response headers from the auth request to variables
auth_request_set $user $upstream_http_remote_user;
auth_request_set $role $upstream_http_remote_role;
auth_request_set $groups $upstream_http_remote_groups;
auth_request_set $name $upstream_http_remote_name;
auth_request_set $email $upstream_http_remote_email;
# Inject the metadata response headers from the variables into the request made to the backend.
proxy_set_header Remote-User $user;
proxy_set_header Remote-Role $role;
proxy_set_header Remote-Groups $groups;
proxy_set_header Remote-Email $email;
proxy_set_header Remote-Name $name;
@@ -195,9 +197,11 @@ in
checkConfig = mkOption {
type = bool;
default = pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform;
defaultText = literalExpression ''
default =
pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform
&& (!pkgs.stdenv.hostPlatform.isAarch64);
defaultText = literalExpression ''
pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform && !(pkgs.stdenv.hostPlaform.isAarch64)
'';
description = ''
Whether to check the configuration at build time.
@@ -343,8 +347,15 @@ in
expires off;
keepalive_disable safari;
# vod module returns 502 for non-existent media
# https://github.com/kaltura/nginx-vod-module/issues/468
error_page 502 =404 /vod-not-found;
'';
};
"/vod-not-found" = {
return = 404;
};
"/stream/" = {
alias = "/var/cache/frigate/stream/";
extraConfig = nginxAuthRequest + ''
@@ -549,6 +560,23 @@ in
add_header Cache-Control "public";
'';
};
"/locales/" = {
root = cfg.package.web;
extraConfig = ''
access_log off;
add_header Cache-Control "public";
'';
};
"~ ^/.*-([A-Za-z0-9]+)\.webmanifest$" = {
root = cfg.package.web;
extraConfig = ''
access_log off;
expires 1y;
add_header Cache-Control "public";
default_type application/json;
proxy_set_header Accept-Encoding "";
'';
};
"/" = {
root = cfg.package.web;
tryFiles = "$uri $uri.html $uri/ /index.html";
@@ -583,6 +611,9 @@ in
open_file_cache_errors on;
aio on;
# file upload size
client_max_body_size 20M;
# https://github.com/kaltura/nginx-vod-module#vod_open_file_thread_pool
vod_open_file_thread_pool default;
@@ -657,7 +688,6 @@ in
[
# unfree:
# config.boot.kernelPackages.nvidiaPackages.latest.bin
ffmpeg-headless
libva-utils
procps
radeontop
@@ -1,31 +1,37 @@
{
lib,
stdenv,
fetchFromGitHub,
makeWrapper,
electron,
python3,
stdenv,
copyDesktopItems,
nodejs,
pnpm,
makeDesktopItem,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "youtube-music";
version = "3.9.0";
version = "3.10.0";
src = fetchFromGitHub {
owner = "th-ch";
repo = "youtube-music";
rev = "v${finalAttrs.version}";
hash = "sha256-xaHYNfW5ZLYiaeJ0F32NQ87woMh6K4Ea9rjgNOyabck=";
tag = "v${finalAttrs.version}";
hash = "sha256-+PCDA7lHaUQw9DhODRsEScyJC+9v8UPiZ1W8w2h/Ljg=";
};
patches = [
# MPRIS's DesktopEntry property needs to match the desktop entry basename
./fix-mpris-desktop-entry.patch
];
pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src;
fetcherVersion = 1;
hash = "sha256-xIQyTetHU37gTxCcQp4VCqzGdIfVQGy/aORCVba6YQ0=";
fetcherVersion = 2;
hash = "sha256-b5I0n3CedA6qCL68lePU3pwyGp1JlQHzUpfCvhqw2qI=";
};
nativeBuildInputs = [
@@ -36,7 +42,7 @@ stdenv.mkDerivation (finalAttrs: {
]
++ lib.optionals (!stdenv.hostPlatform.isDarwin) [ copyDesktopItems ];
ELECTRON_SKIP_BINARY_DOWNLOAD = 1;
env.ELECTRON_SKIP_BINARY_DOWNLOAD = 1;
postBuild =
lib.optionalString stdenv.hostPlatform.isDarwin ''
@@ -51,6 +57,17 @@ stdenv.mkDerivation (finalAttrs: {
-c.electronVersion=${electron.version}
'';
desktopItems = [
(makeDesktopItem {
name = "com.github.th_ch.youtube_music";
exec = "youtube-music %u";
icon = "youtube-music";
desktopName = "YouTube Music";
startupWMClass = "com.github.th_ch.youtube_music";
categories = [ "AudioVideo" ];
})
];
installPhase = ''
runHook preInstall
@@ -58,11 +75,11 @@ stdenv.mkDerivation (finalAttrs: {
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
mkdir -p $out/{Applications,bin}
mv pack/mac*/YouTube\ Music.app $out/Applications
makeWrapper $out/Applications/YouTube\ Music.app/Contents/MacOS/YouTube\ Music $out/bin/youtube-music
ln -s "$out/Applications/YouTube Music.app/Contents/MacOS/YouTube Music" $out/bin/youtube-music
''
+ lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
mkdir -p "$out/share/lib/youtube-music"
cp -r pack/*-unpacked/{locales,resources{,.pak}} "$out/share/lib/youtube-music"
mkdir -p "$out/share/youtube-music"
cp -r pack/*-unpacked/{locales,resources{,.pak}} "$out/share/youtube-music"
pushd assets/generated/icons/png
for file in *.png; do
@@ -77,37 +94,23 @@ stdenv.mkDerivation (finalAttrs: {
postFixup = lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
makeWrapper ${electron}/bin/electron $out/bin/youtube-music \
--add-flags $out/share/lib/youtube-music/resources/app.asar \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
--add-flags $out/share/youtube-music/resources/app.asar \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true --wayland-text-input-version=3}}" \
--set-default ELECTRON_FORCE_IS_PACKAGED 1 \
--set-default ELECTRON_IS_DEV 0 \
--inherit-argv0
'';
patches = [
# MPRIS's DesktopEntry property needs to match the desktop entry basename
./fix-mpris-desktop-entry.patch
];
passthru.updateScript = nix-update-script { };
desktopItems = [
(makeDesktopItem {
name = "com.github.th_ch.youtube_music";
exec = "youtube-music %u";
icon = "youtube-music";
desktopName = "YouTube Music";
startupWMClass = "com.github.th_ch.youtube_music";
categories = [ "AudioVideo" ];
})
];
meta = with lib; {
meta = {
description = "Electron wrapper around YouTube Music";
homepage = "https://th-ch.github.io/youtube-music/";
changelog = "https://github.com/th-ch/youtube-music/blob/master/changelog.md#${
lib.replaceStrings [ "." ] [ "" ] finalAttrs.src.rev
lib.replaceStrings [ "." ] [ "" ] finalAttrs.src.tag
}";
license = licenses.mit;
maintainers = with maintainers; [
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
aacebedo
SuperSandro2000
];
@@ -1,79 +0,0 @@
{
lib,
stdenv,
fetchurl,
copper,
python3,
pkg-config,
withQt ? false,
qtbase ? null,
wrapQtAppsHook ? null,
withGtk2 ? false,
gtk2,
withGtk3 ? false,
gtk3,
mkDerivation ? stdenv.mkDerivation,
}:
let
onlyOneEnabled = xs: 1 == builtins.length (builtins.filter lib.id xs);
in
assert onlyOneEnabled [
withQt
withGtk2
withGtk3
];
mkDerivation rec {
pname = "code-browser";
version = "8.0";
src = fetchurl {
url = "https://tibleiz.net/download/code-browser-${version}-src.tar.gz";
sha256 = "sha256-beCp4lx4MI1+hVgWp2h3piE/zu51zfwQdB5g7ImgmwY=";
};
postPatch = ''
substituteInPlace Makefile --replace "LFLAGS=-no-pie" "LFLAGS=-no-pie -L."
patchShebangs .
''
+ lib.optionalString withQt ''
substituteInPlace libs/copper-ui/Makefile --replace "moc -o" "${qtbase.dev}/bin/moc -o"
substituteInPlace libs/copper-ui/Makefile --replace "all: qt gtk gtk2" "all: qt"
''
+ lib.optionalString withGtk2 ''
substituteInPlace libs/copper-ui/Makefile --replace "all: qt gtk gtk2" "all: gtk2"
''
+ lib.optionalString withGtk3 ''
substituteInPlace libs/copper-ui/Makefile --replace "all: qt gtk gtk2" "all: gtk"
'';
nativeBuildInputs = [
copper
python3
pkg-config
]
++ lib.optionals withGtk2 [ gtk2 ]
++ lib.optionals withGtk3 [ gtk3 ]
++ lib.optionals withQt [
qtbase
wrapQtAppsHook
];
buildInputs =
lib.optionals withQt [ qtbase ]
++ lib.optionals withGtk2 [ gtk2 ]
++ lib.optionals withGtk3 [ gtk3 ];
makeFlags = [
"prefix=$(out)"
"COPPER=${copper}/bin/copper-elf64"
"with-local-libs"
]
++ lib.optionals withQt [
"QINC=${qtbase.dev}/include"
"UI=qt"
]
++ lib.optionals withGtk2 [ "UI=gtk2" ]
++ lib.optionals withGtk3 [ "UI=gtk" ];
meta = with lib; {
description = "Folding text editor, designed to hierarchically structure any kind of text file and especially source code";
homepage = "https://tibleiz.net/code-browser/";
license = licenses.gpl2;
platforms = platforms.x86_64;
};
}
-56
View File
@@ -1,56 +0,0 @@
{
lib,
stdenv,
fetchurl,
pkg-config,
intltool,
gtk2,
xorg,
glib,
xneur,
libglade,
GConf,
libappindicator-gtk2,
pcre,
}:
stdenv.mkDerivation rec {
pname = "gxneur";
version = "0.20.0";
src = fetchurl {
url = "https://github.com/AndrewCrewKuznetsov/xneur-devel/raw/f66723feb272c68f7c22a8bf0dbcafa5e3a8a5ee/dists/${version}/gxneur_${version}.orig.tar.gz";
sha256 = "0avmhdcj0hpr55fc0iih8fjykmdhn34c8mwdnqvl8jh4nhxxchxr";
};
# glib-2.62 deprecations
env.NIX_CFLAGS_COMPILE = "-DGLIB_DISABLE_DEPRECATION_WARNINGS";
nativeBuildInputs = [
pkg-config
intltool
];
buildInputs = [
xorg.libX11
glib
gtk2
xorg.libXpm
xorg.libXt
xorg.libXext
xneur
libglade
GConf
pcre
libappindicator-gtk2
];
meta = with lib; {
description = "GUI for XNEUR keyboard layout switcher";
platforms = platforms.linux;
license = with licenses; [
gpl2
gpl3
];
mainProgram = "gxneur";
};
}
+4 -2
View File
@@ -128,6 +128,10 @@ rec {
krb5
gsettings-desktop-schemas
hicolor-icon-theme # dont show a gtk warning about hicolor not being installed
# libraries not on the upstream include list, but nevertheless expected
# by at least one appimage
libsecret # For bitwarden, appimage is x86_64 only
];
# list of libraries expected in an appimage environment:
@@ -244,8 +248,6 @@ rec {
at-spi2-core
pciutils # for FreeCAD
pipewire # immersed-vr wayland support
libsecret # For bitwarden
libmpg123 # Slippi launcher
brotli # TwitchDropsMiner
];
+1 -3
View File
@@ -308,8 +308,6 @@ let
substituteInPlace authentik/lib/default.yml \
--replace-fail '/blueprints' "$out/blueprints" \
--replace-fail './media' '/var/lib/authentik/media'
substituteInPlace pyproject.toml \
--replace-fail 'djangorestframework-guardian' 'djangorestframework-guardian2'
substituteInPlace authentik/stages/email/utils.py \
--replace-fail 'web/' '${webui}/'
'';
@@ -346,7 +344,7 @@ let
django-storages
django-tenants
djangorestframework
djangorestframework-guardian2
djangorestframework-guardian
docker
drf-orjson-renderer
drf-spectacular
+3 -2
View File
@@ -92,9 +92,10 @@ stdenv.mkDerivation rec {
patchelf --replace-needed libpcap.so.0.8 ${libpcap}/lib/libpcap.so $out/bin/warp-dex
mv lib/systemd/system $out/lib/systemd/
substituteInPlace $out/lib/systemd/system/warp-svc.service \
--replace "ExecStart=" "ExecStart=$out"
--replace-fail "ExecStart=" "ExecStart=$out"
substituteInPlace $out/lib/systemd/user/warp-taskbar.service \
--replace "ExecStart=" "ExecStart=$out"
--replace-fail "ExecStart=" "ExecStart=$out" \
--replace-fail "BindsTo=" "PartOf="
cat >>$out/lib/systemd/user/warp-taskbar.service <<EOF
-34
View File
@@ -1,34 +0,0 @@
{
lib,
stdenv,
fetchurl,
libffi,
}:
stdenv.mkDerivation rec {
pname = "copper";
version = "4.6";
src = fetchurl {
url = "https://tibleiz.net/download/copper-${version}-src.tar.gz";
sha256 = "sha256-tyxAMJp4H50eBz8gjt2O3zj5fq6nOIXKX47wql8aUUg=";
};
buildInputs = [
libffi
];
postPatch = ''
patchShebangs .
'';
buildPhase = ''
make BACKEND=elf64 boot-elf64
make BACKEND=elf64 COPPER=stage3/copper-elf64 copper-elf64
'';
installPhase = ''
make BACKEND=elf64 install prefix=$out
'';
meta = with lib; {
description = "Simple imperative language, statically typed with type inference and genericity";
homepage = "https://tibleiz.net/copper/";
license = licenses.bsd2;
platforms = platforms.x86_64;
broken = true;
};
}
+3 -3
View File
@@ -8,7 +8,7 @@
versionCheckHook,
}:
let
version = "1.35.0";
version = "1.35.1";
inherit (stdenv.hostPlatform) system;
throwSystem = throw "envoy-bin is not available for ${system}.";
@@ -21,8 +21,8 @@ let
hash =
{
aarch64-linux = "sha256-PLlFrs65Z+mV5V2OoW+bb/91DC5V9Ss2HnERccIunWY=";
x86_64-linux = "sha256-0l12MVwCNrUPjn9t6hOpuUscP6EQQHNLd0kG4YjhEeY=";
aarch64-linux = "sha256-tIBXnm6bGdA6tlYFL+aDf1bOjlUVof0MDNDpFi0tcbE=";
x86_64-linux = "sha256-emAbbVhEw0MA21rPxQD/z/p3yVuDi5JZg1yjuRkkmlo=";
}
.${system} or throwSystem;
in
+7 -365
View File
@@ -1,380 +1,22 @@
diff --git a/frigate/api/media.py b/frigate/api/media.py
index b5f3ba70..09a09c13 100644
--- a/frigate/api/media.py
+++ b/frigate/api/media.py
@@ -31,6 +31,7 @@ from frigate.config import FrigateConfig
from frigate.const import (
CACHE_DIR,
CLIPS_DIR,
+ INSTALL_DIR,
MAX_SEGMENT_DURATION,
PREVIEW_FRAME_TYPE,
RECORD_DIR,
@@ -154,7 +155,9 @@ def latest_frame(
frame_processor.get_current_frame_time(camera_name) + retry_interval
):
if request.app.camera_error_image is None:
- error_image = glob.glob("/opt/frigate/frigate/images/camera-error.jpg")
+ error_image = glob.glob(
+ os.path.join(INSTALL_DIR, "frigate/images/camera-error.jpg")
+ )
if len(error_image) > 0:
request.app.camera_error_image = cv2.imread(
@@ -497,7 +500,7 @@ def recording_clip(
)
file_name = sanitize_filename(f"playlist_{camera_name}_{start_ts}-{end_ts}.txt")
- file_path = f"/tmp/cache/{file_name}"
+ file_path = os.path.join(CACHE_DIR, file_name)
with open(file_path, "w") as file:
clip: Recordings
for clip in recordings:
diff --git a/frigate/api/preview.py b/frigate/api/preview.py
index d14a15ff..2db2326a 100644
--- a/frigate/api/preview.py
+++ b/frigate/api/preview.py
@@ -9,7 +9,7 @@ from fastapi import APIRouter
from fastapi.responses import JSONResponse
from frigate.api.defs.tags import Tags
-from frigate.const import CACHE_DIR, PREVIEW_FRAME_TYPE
+from frigate.const import BASE_DIR, CACHE_DIR, PREVIEW_FRAME_TYPE
from frigate.models import Previews
logger = logging.getLogger(__name__)
@@ -52,7 +52,7 @@ def preview_ts(camera_name: str, start_ts: float, end_ts: float):
clips.append(
{
"camera": preview["camera"],
- "src": preview["path"].replace("/media/frigate", ""),
+ "src": preview["path"].replace(BASE_DIR, ""),
"type": "video/mp4",
"start": preview["start_time"],
"end": preview["end_time"],
diff --git a/frigate/comms/webpush.py b/frigate/comms/webpush.py
index abfd52d1..ab4cf3c5 100644
index c5986d45..b767e19e 100644
--- a/frigate/comms/webpush.py
+++ b/frigate/comms/webpush.py
@@ -12,7 +12,7 @@ from pywebpush import WebPusher
@@ -17,7 +17,7 @@ from titlecase import titlecase
from frigate.comms.base_communicator import Communicator
from frigate.comms.config_updater import ConfigSubscriber
from frigate.comms.dispatcher import Communicator
from frigate.config import FrigateConfig
-from frigate.const import CONFIG_DIR
+from frigate.const import BASE_DIR, CONFIG_DIR
from frigate.models import User
logger = logging.getLogger(__name__)
@@ -151,7 +151,7 @@ class WebPushClient(Communicator): # type: ignore[misc]
camera: str = payload["after"]["camera"]
title = f"{', '.join(sorted_objects).replace('_', ' ').title()}{' was' if state == 'end' else ''} detected in {', '.join(payload['after']['data']['zones']).replace('_', ' ').title()}"
message = f"Detected on {camera.replace('_', ' ').title()}"
@@ -333,7 +333,7 @@ class WebPushClient(Communicator): # type: ignore[misc]
title = f"{titlecase(', '.join(sorted_objects).replace('_', ' '))}{' was' if state == 'end' else ''} detected in {titlecase(', '.join(payload['after']['data']['zones']).replace('_', ' '))}"
message = f"Detected on {titlecase(camera.replace('_', ' '))}"
- image = f"{payload['after']['thumb_path'].replace('/media/frigate', '')}"
+ image = f"{payload['after']['thumb_path'].replace(BASE_DIR, '')}"
# if event is ongoing open to live view otherwise open to recordings view
direct_url = f"/review?id={reviewId}" if state == "end" else f"/#{camera}"
diff --git a/frigate/const.py b/frigate/const.py
index 5976f47b..dc710467 100644
--- a/frigate/const.py
+++ b/frigate/const.py
@@ -1,5 +1,6 @@
import re
+INSTALL_DIR = "/opt/frigate"
CONFIG_DIR = "/config"
DEFAULT_DB_PATH = f"{CONFIG_DIR}/frigate.db"
MODEL_CACHE_DIR = f"{CONFIG_DIR}/model_cache"
diff --git a/frigate/detectors/detector_config.py b/frigate/detectors/detector_config.py
index 452f1fee..13535a62 100644
--- a/frigate/detectors/detector_config.py
+++ b/frigate/detectors/detector_config.py
@@ -9,7 +9,7 @@ import requests
from pydantic import BaseModel, ConfigDict, Field
from pydantic.fields import PrivateAttr
-from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP
+from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP, MODEL_CACHE_DIR
from frigate.plus import PlusApi
from frigate.util.builtin import generate_color_palette, load_labels
@@ -117,7 +117,7 @@ class ModelConfig(BaseModel):
return
model_id = self.path[7:]
- self.path = f"/config/model_cache/{model_id}"
+ self.path = os.path.join(MODEL_CACHE_DIR, model_id)
model_info_path = f"{self.path}.json"
# download the model if it doesn't exist
diff --git a/frigate/detectors/plugins/hailo8l.py b/frigate/detectors/plugins/hailo8l.py
index b66d78bd..69e86bc5 100644
--- a/frigate/detectors/plugins/hailo8l.py
+++ b/frigate/detectors/plugins/hailo8l.py
@@ -22,6 +22,7 @@ except ModuleNotFoundError:
from pydantic import BaseModel, Field
from typing_extensions import Literal
+from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig
@@ -57,7 +58,7 @@ class HailoDetector(DetectionApi):
self.h8l_tensor_format = detector_config.model.input_tensor
self.h8l_pixel_format = detector_config.model.input_pixel_format
self.model_url = "https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8l/ssd_mobilenet_v1.hef"
- self.cache_dir = "/config/model_cache/h8l_cache"
+ self.cache_dir = os.path.join(MODEL_CACHE_DIR, "h8l_cache")
self.expected_model_filename = "ssd_mobilenet_v1.hef"
output_type = "FLOAT32"
diff --git a/frigate/detectors/plugins/openvino.py b/frigate/detectors/plugins/openvino.py
index 51e48530..d199317b 100644
--- a/frigate/detectors/plugins/openvino.py
+++ b/frigate/detectors/plugins/openvino.py
@@ -7,6 +7,7 @@ import openvino.properties as props
from pydantic import Field
from typing_extensions import Literal
+from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum
@@ -35,8 +36,10 @@ class OvDetector(DetectionApi):
logger.error(f"OpenVino model file {detector_config.model.path} not found.")
raise FileNotFoundError
- os.makedirs("/config/model_cache/openvino", exist_ok=True)
- self.ov_core.set_property({props.cache_dir: "/config/model_cache/openvino"})
+ os.makedirs(os.path.join(MODEL_CACHE_DIR, "openvino"), exist_ok=True)
+ self.ov_core.set_property(
+ {props.cache_dir: os.path.join(MODEL_CACHE_DIR, "openvino")}
+ )
self.interpreter = self.ov_core.compile_model(
model=detector_config.model.path, device_name=detector_config.device
)
diff --git a/frigate/detectors/plugins/rknn.py b/frigate/detectors/plugins/rknn.py
index df94d7b6..bc3d9ae0 100644
--- a/frigate/detectors/plugins/rknn.py
+++ b/frigate/detectors/plugins/rknn.py
@@ -6,6 +6,7 @@ from typing import Literal
from pydantic import Field
+from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum
@@ -17,7 +18,7 @@ supported_socs = ["rk3562", "rk3566", "rk3568", "rk3576", "rk3588"]
supported_models = {ModelTypeEnum.yolonas: "^deci-fp16-yolonas_[sml]$"}
-model_cache_dir = "/config/model_cache/rknn_cache/"
+model_cache_dir = os.path.join(MODEL_CACHE_DIR, "rknn_cache/")
class RknnDetectorConfig(BaseDetectorConfig):
diff --git a/frigate/detectors/plugins/rocm.py b/frigate/detectors/plugins/rocm.py
index 60118d12..7c87edb5 100644
--- a/frigate/detectors/plugins/rocm.py
+++ b/frigate/detectors/plugins/rocm.py
@@ -9,6 +9,7 @@ import numpy as np
from pydantic import Field
from typing_extensions import Literal
+from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import (
BaseDetectorConfig,
@@ -116,7 +117,7 @@ class ROCmDetector(DetectionApi):
logger.info(f"AMD/ROCm: saving parsed model into {mxr_path}")
- os.makedirs("/config/model_cache/rocm", exist_ok=True)
+ os.makedirs(os.path.join(MODEL_CACHE_DIR, "rocm"), exist_ok=True)
migraphx.save(self.model, mxr_path)
logger.info("AMD/ROCm: model loaded")
diff --git a/frigate/output/birdseye.py b/frigate/output/birdseye.py
index 00f17c8f..8331eb64 100644
--- a/frigate/output/birdseye.py
+++ b/frigate/output/birdseye.py
@@ -16,7 +16,7 @@ import numpy as np
from frigate.comms.config_updater import ConfigSubscriber
from frigate.config import BirdseyeModeEnum, FfmpegConfig, FrigateConfig
-from frigate.const import BASE_DIR, BIRDSEYE_PIPE
+from frigate.const import BASE_DIR, BIRDSEYE_PIPE, INSTALL_DIR
from frigate.util.image import (
SharedMemoryFrameManager,
copy_yuv_to_position,
@@ -297,7 +297,9 @@ class BirdsEyeFrameManager:
birdseye_logo = cv2.imread(custom_logo_files[0], cv2.IMREAD_UNCHANGED)
if birdseye_logo is None:
- logo_files = glob.glob("/opt/frigate/frigate/images/birdseye.png")
+ logo_files = glob.glob(
+ os.path.join(INSTALL_DIR, "frigate/images/birdseye.png")
+ )
if len(logo_files) > 0:
birdseye_logo = cv2.imread(logo_files[0], cv2.IMREAD_UNCHANGED)
diff --git a/frigate/test/http_api/base_http_test.py b/frigate/test/http_api/base_http_test.py
index e7a1d03e..4fa4a5b5 100644
--- a/frigate/test/http_api/base_http_test.py
+++ b/frigate/test/http_api/base_http_test.py
@@ -9,6 +9,7 @@ from playhouse.sqliteq import SqliteQueueDatabase
from frigate.api.fastapi_app import create_fastapi_app
from frigate.config import FrigateConfig
+from frigate.const import BASE_DIR, CACHE_DIR
from frigate.models import Event, Recordings, ReviewSegment
from frigate.review.types import SeverityEnum
from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS
@@ -72,19 +73,19 @@ class BaseTestHttp(unittest.TestCase):
"total": 67.1,
"used": 16.6,
},
- "/media/frigate/clips": {
+ os.path.join(BASE_DIR, "clips"): {
"free": 42429.9,
"mount_type": "ext4",
"total": 244529.7,
"used": 189607.0,
},
- "/media/frigate/recordings": {
+ os.path.join(BASE_DIR, "recordings"): {
"free": 0.2,
"mount_type": "ext4",
"total": 8.0,
"used": 7.8,
},
- "/tmp/cache": {
+ CACHE_DIR: {
"free": 976.8,
"mount_type": "tmpfs",
"total": 1000.0,
diff --git a/frigate/test/test_config.py b/frigate/test/test_config.py
index e6cb1274..5a3deefd 100644
--- a/frigate/test/test_config.py
+++ b/frigate/test/test_config.py
@@ -854,9 +854,9 @@ class TestConfig(unittest.TestCase):
assert frigate_config.model.merged_labelmap[0] == "person"
def test_plus_labelmap(self):
- with open("/config/model_cache/test", "w") as f:
+ with open(os.path.join(MODEL_CACHE_DIR, "test"), "w") as f:
json.dump(self.plus_model_info, f)
- with open("/config/model_cache/test.json", "w") as f:
+ with open(os.path.join(MODEL_CACHE_DIR, "test.json"), "w") as f:
json.dump(self.plus_model_info, f)
config = {
diff --git a/frigate/test/test_http.py b/frigate/test/test_http.py
index 21379425..66f9d22a 100644
--- a/frigate/test/test_http.py
+++ b/frigate/test/test_http.py
@@ -12,6 +12,7 @@ from playhouse.sqliteq import SqliteQueueDatabase
from frigate.api.fastapi_app import create_fastapi_app
from frigate.config import FrigateConfig
+from frigate.const import BASE_DIR, CACHE_DIR
from frigate.models import Event, Recordings, Timeline
from frigate.stats.emitter import StatsEmitter
from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS
@@ -76,19 +77,19 @@ class TestHttp(unittest.TestCase):
"total": 67.1,
"used": 16.6,
},
- "/media/frigate/clips": {
+ os.path.join(BASE_DIR, "clips"): {
"free": 42429.9,
"mount_type": "ext4",
"total": 244529.7,
"used": 189607.0,
},
- "/media/frigate/recordings": {
+ os.path.join(BASE_DIR, "recordings"): {
"free": 0.2,
"mount_type": "ext4",
"total": 8.0,
"used": 7.8,
},
- "/tmp/cache": {
+ CACHE_DIR: {
"free": 976.8,
"mount_type": "tmpfs",
"total": 1000.0,
diff --git a/frigate/util/config.py b/frigate/util/config.py
index d456c755..b6b270c9 100644
--- a/frigate/util/config.py
+++ b/frigate/util/config.py
@@ -14,7 +14,7 @@ from frigate.util.services import get_video_properties
logger = logging.getLogger(__name__)
CURRENT_CONFIG_VERSION = "0.15-1"
-DEFAULT_CONFIG_FILE = "/config/config.yml"
+DEFAULT_CONFIG_FILE = os.path.join(CONFIG_DIR, "config.yml")
def find_config_file() -> str:
diff --git a/frigate/util/model.py b/frigate/util/model.py
index ce2c9538..6e93cb38 100644
--- a/frigate/util/model.py
+++ b/frigate/util/model.py
@@ -12,6 +12,8 @@ except ImportError:
# openvino is not included
pass
+from frigate.const import MODEL_CACHE_DIR
+
logger = logging.getLogger(__name__)
@@ -46,7 +48,8 @@ def get_ort_providers(
# so it is not enabled by default
if device == "Tensorrt":
os.makedirs(
- "/config/model_cache/tensorrt/ort/trt-engines", exist_ok=True
+ os.path.join(MODEL_CACHE_DIR, "tensorrt/ort/trt-engines"),
+ exist_ok=True,
)
device_id = 0 if not device.isdigit() else int(device)
providers.append(provider)
@@ -57,19 +60,23 @@ def get_ort_providers(
and os.environ.get("USE_FP_16", "True") != "False",
"trt_timing_cache_enable": True,
"trt_engine_cache_enable": True,
- "trt_timing_cache_path": "/config/model_cache/tensorrt/ort",
- "trt_engine_cache_path": "/config/model_cache/tensorrt/ort/trt-engines",
+ "trt_timing_cache_path": os.path.join(
+ MODEL_CACHE_DIR, "tensorrt/ort"
+ ),
+ "trt_engine_cache_path": os.path.join(
+ MODEL_CACHE_DIR, "tensorrt/ort/trt-engines"
+ ),
}
)
else:
continue
elif provider == "OpenVINOExecutionProvider":
- os.makedirs("/config/model_cache/openvino/ort", exist_ok=True)
+ os.makedirs(os.path.join(MODEL_CACHE_DIR, "openvino/ort"), exist_ok=True)
providers.append(provider)
options.append(
{
"arena_extend_strategy": "kSameAsRequested",
- "cache_dir": "/config/model_cache/openvino/ort",
+ "cache_dir": os.path.join(MODEL_CACHE_DIR, "openvino/ort"),
"device_type": device,
}
)
@@ -103,7 +110,7 @@ class ONNXModelRunner:
self.type = "ov"
self.ov = ov.Core()
self.ov.set_property(
- {ov.properties.cache_dir: "/config/model_cache/openvino"}
+ {ov.properties.cache_dir: os.path.join(MODEL_CACHE_DIR, "openvino")}
)
self.interpreter = self.ov.compile_model(
model=model_path, device_name=device
+39
View File
@@ -0,0 +1,39 @@
diff --git a/frigate/config/camera/ffmpeg.py b/frigate/config/camera/ffmpeg.py
index 04bbfac7..4390a571 100644
--- a/frigate/config/camera/ffmpeg.py
+++ b/frigate/config/camera/ffmpeg.py
@@ -70,18 +70,14 @@ class FfmpegConfig(FrigateBaseModel):
@property
def ffmpeg_path(self) -> str:
if self.path == "default":
- return f"/usr/lib/ffmpeg/{DEFAULT_FFMPEG_VERSION}/bin/ffmpeg"
- elif self.path in INCLUDED_FFMPEG_VERSIONS:
- return f"/usr/lib/ffmpeg/{self.path}/bin/ffmpeg"
+ return "@ffmpeg@"
else:
return f"{self.path}/bin/ffmpeg"
@property
def ffprobe_path(self) -> str:
if self.path == "default":
- return f"/usr/lib/ffmpeg/{DEFAULT_FFMPEG_VERSION}/bin/ffprobe"
- elif self.path in INCLUDED_FFMPEG_VERSIONS:
- return f"/usr/lib/ffmpeg/{self.path}/bin/ffprobe"
+ return "@ffprobe@"
else:
return f"{self.path}/bin/ffprobe"
diff --git a/frigate/record/export.py b/frigate/record/export.py
index 0d3f96da..09cadbcd 100644
--- a/frigate/record/export.py
+++ b/frigate/record/export.py
@@ -126,7 +126,7 @@ class RecordingExporter(threading.Thread):
minutes = int(diff / 60)
seconds = int(diff % 60)
ffmpeg_cmd = [
- "/usr/lib/ffmpeg/7.0/bin/ffmpeg", # hardcode path for exports thumbnail due to missing libwebp support
+ "@ffmpeg@", # hardcode path for exports thumbnail due to missing libwebp support
"-hide_banner",
"-loglevel",
"warning",
~
+38 -25
View File
@@ -2,31 +2,32 @@
lib,
stdenv,
callPackage,
python312,
replaceVars,
python312Packages,
fetchFromGitHub,
fetchurl,
rocmPackages,
ffmpeg-headless,
sqlite-vec,
frigate,
nixosTests,
}:
let
version = "0.15.2";
version = "0.16.0";
src = fetchFromGitHub {
name = "frigate-${version}-source";
owner = "blakeblackshear";
repo = "frigate";
tag = "v${version}";
hash = "sha256-YJFtMVCTtp8h9a9RmkcoZSQ+nIKb5o/4JVynVslkx78=";
hash = "sha256-O1rOFRrS3hDbf4fVgfz+KASo20R1aqbDoIf3JKQ1jhs=";
};
frigate-web = callPackage ./web.nix {
inherit version src;
};
python = python312;
python = python312Packages.python;
# Tensorflow audio model
# https://github.com/blakeblackshear/frigate/blob/v0.15.0/docker/main/Dockerfile#L125
@@ -55,14 +56,21 @@ let
hash = "sha256-5Cj2vEiWR8Z9d2xBmVoLZuNRv4UOuxHSGZQWTJorXUQ=";
};
in
python.pkgs.buildPythonApplication rec {
python312Packages.buildPythonApplication rec {
pname = "frigate";
inherit version;
format = "other";
inherit src;
patches = [ ./constants.patch ];
patches = [
./constants.patch
(replaceVars ./ffmpeg.patch {
ffmpeg = lib.getExe ffmpeg-headless;
ffprobe = lib.getExe' ffmpeg-headless "ffprobe";
})
];
postPatch = ''
echo 'VERSION = "${version}"' > frigate/version.py
@@ -86,15 +94,6 @@ python.pkgs.buildPythonApplication rec {
substituteInPlace frigate/db/sqlitevecq.py \
--replace-fail "/usr/local/lib/vec0" "${lib.getLib sqlite-vec}/lib/vec0${stdenv.hostPlatform.extensions.sharedLibrary}"
''
# clang-rocm, provided by `rocmPackages.clr`, only works on x86_64-linux specifically
+ lib.optionalString (with stdenv.hostPlatform; isx86_64 && isLinux) ''
substituteInPlace frigate/detectors/plugins/rocm.py \
--replace-fail "/opt/rocm/bin/rocminfo" "rocminfo" \
--replace-fail "/opt/rocm/lib" "${rocmPackages.clr}/lib"
''
+ ''
# provide default paths for models and maps that are shipped with frigate
substituteInPlace frigate/config/config.py \
--replace-fail "/cpu_model.tflite" "${tflite_cpu_model}" \
@@ -106,30 +105,37 @@ python.pkgs.buildPythonApplication rec {
substituteInPlace frigate/events/audio.py \
--replace-fail "/cpu_audio_model.tflite" "${placeholder "out"}/share/frigate/cpu_audio_model.tflite" \
--replace-fail "/audio-labelmap.txt" "${placeholder "out"}/share/frigate/audio-labelmap.txt"
# work around onvif-zeep idiosyncrasy
substituteInPlace frigate/ptz/onvif.py \
--replace-fail dist-packages site-packages
'';
dontBuild = true;
dependencies = with python.pkgs; [
dependencies = with python312Packages; [
# docker/main/requirements.txt
scikit-build
# docker/main/requirements-wheel.txt
aiofiles
aiohttp
appdirs
argcomplete
contextlib2
click
distlib
fastapi
filelock
future
importlib-metadata
importlib-resources
google-generativeai
imutils
joserfc
levenshtein
markupsafe
netaddr
netifaces
norfair
numpy
ollama
onnxruntime
onvif-zeep
onvif-zeep-async
openai
opencv4
openvino
@@ -138,9 +144,12 @@ python.pkgs.buildPythonApplication rec {
pathvalidate
peewee
peewee-migrate
prometheus-client
psutil
py3nvml
pyclipper
pydantic
python-multipart
pytz
py-vapid
pywebpush
@@ -149,14 +158,18 @@ python.pkgs.buildPythonApplication rec {
ruamel-yaml
scipy
setproctitle
shapely
slowapi
starlette
starlette-context
tensorflow-bin
titlecase
transformers
tzlocal
unidecode
uvicorn
verboselogs
virtualenv
ws4py
];
@@ -178,7 +191,7 @@ python.pkgs.buildPythonApplication rec {
runHook postInstall
'';
nativeCheckInputs = with python.pkgs; [
nativeCheckInputs = with python312Packages; [
pytestCheckHook
];
@@ -200,7 +213,7 @@ python.pkgs.buildPythonApplication rec {
passthru = {
web = frigate-web;
inherit python;
pythonPath = (python.pkgs.makePythonPath dependencies) + ":${frigate}/${python.sitePackages}";
pythonPath = (python312Packages.makePythonPath dependencies) + ":${frigate}/${python.sitePackages}";
tests = {
inherit (nixosTests) frigate;
};
+1 -1
View File
@@ -30,7 +30,7 @@ buildNpmPackage {
--replace-fail "/tmp/cache" "/var/cache/frigate"
'';
npmDepsHash = "sha256-tPwydUJtFDJs17q0haJaUVEkxua+nHfmwQ9Z9Y24ca8=";
npmDepsHash = "sha256-CrK/6BaKmKIxlohEZdGEEKJkioszBUupyKQx4nBeLqI=";
installPhase = ''
cp -rv dist/ $out
+1 -1
View File
@@ -135,7 +135,7 @@ python.pkgs.buildPythonApplication rec {
'';
nativeCheckInputs = with python.pkgs; [
(postgresql.withPackages (p: [ p.postgis ]))
(postgresql.withPackages (p: [ p.postgis ])).out
postgresqlTestHook
pytest-django
pytest-playwright
+88 -77
View File
@@ -24,23 +24,24 @@
xcbuild,
pango,
pkg-config,
symlinkJoin,
nltk-data,
xorg,
}:
let
version = "2.17.1";
version = "2.18.1";
src = fetchFromGitHub {
owner = "paperless-ngx";
repo = "paperless-ngx";
tag = "v${version}";
hash = "sha256-6FvP/HgomsPxqCtKrZFxMlD2fFyT2e/JII2L7ANiOao=";
hash = "sha256-POHF00cV8pl6i1rcwxtZ+Q1AlLybDj6gSlL0lPwSSCo=";
};
python = python3.override {
self = python;
packageOverrides = final: prev: {
django = prev.django_5_1;
django = prev.django_5_2;
fido2 = prev.fido2.overridePythonAttrs {
version = "1.2.0";
@@ -71,73 +72,79 @@ let
poppler-utils
];
frontend =
let
frontendSrc = src + "/src-ui";
in
stdenv.mkDerivation rec {
pname = "paperless-ngx-frontend";
inherit version;
frontend = stdenv.mkDerivation (finalAttrs: {
pname = "paperless-ngx-frontend";
inherit version;
src = frontendSrc;
src = src + "/src-ui";
pnpmDeps = pnpm.fetchDeps {
inherit pname version src;
fetcherVersion = 1;
hash = "sha256-VtYYwpMXPAC3g1OESnw3dzLTwiGqJBQcicFZskEucok=";
};
nativeBuildInputs = [
node-gyp
nodejs_20
pkg-config
pnpm.configHook
python3
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
xcbuild
];
buildInputs = [
pango
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
giflib
];
CYPRESS_INSTALL_BINARY = "0";
NG_CLI_ANALYTICS = "false";
buildPhase = ''
runHook preBuild
pushd node_modules/canvas
node-gyp rebuild
popd
pnpm run build --configuration production
runHook postBuild
'';
doCheck = true;
checkPhase = ''
runHook preCheck
pnpm run test
runHook postCheck
'';
installPhase = ''
runHook preInstall
mkdir -p $out/lib/paperless-ui
mv ../src/documents/static/frontend $out/lib/paperless-ui/
runHook postInstall
'';
pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src;
fetcherVersion = 1;
hash = "sha256-bx/jXlG3lRiwKyz1M0dU00Xn5xaeALSIxIAGzo8gAgo=";
};
nativeBuildInputs = [
node-gyp
nodejs_20
pkg-config
pnpm.configHook
python3
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
xcbuild
];
buildInputs = [
pango
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
giflib
];
CYPRESS_INSTALL_BINARY = "0";
NG_CLI_ANALYTICS = "false";
buildPhase = ''
runHook preBuild
pushd node_modules/canvas
node-gyp rebuild
popd
# cat forcefully disables angular cli's spinner which doesn't work with nix' tty which is 0x0
pnpm run build --configuration production | cat
runHook postBuild
'';
doCheck = true;
checkPhase = ''
runHook preCheck
pnpm run test | cat
runHook postCheck
'';
installPhase = ''
runHook preInstall
mkdir -p $out/lib/paperless-ui
mv ../src/documents/static/frontend $out/lib/paperless-ui/
runHook postInstall
'';
});
nltkDataDir = symlinkJoin {
name = "paperless_ngx_nltk_data";
paths = with nltk-data; [
punkt-tab
snowball-data
stopwords
];
};
in
python.pkgs.buildPythonApplication rec {
pname = "paperless-ngx";
@@ -161,8 +168,7 @@ python.pkgs.buildPythonApplication rec {
fi
substituteInPlace pyproject.toml \
--replace-fail '"--numprocesses=auto",' "" \
--replace-fail '--maxprocesses=16' "--numprocesses=$NIX_BUILD_CORES" \
--replace-fail "djangorestframework-guardian~=0.3.0" "djangorestframework-guardian2"
--replace-fail '--maxprocesses=16' "--numprocesses=$NIX_BUILD_CORES"
'';
nativeBuildInputs = [
@@ -171,6 +177,7 @@ python.pkgs.buildPythonApplication rec {
];
pythonRelaxDeps = [
"django"
"django-allauth"
"django-auditlog"
"django-guardian"
@@ -185,6 +192,7 @@ python.pkgs.buildPythonApplication rec {
dependencies =
with python.pkgs;
[
babel
bleach
channels
channels-redis
@@ -204,6 +212,7 @@ python.pkgs.buildPythonApplication rec {
}
))
django-auditlog
django-cachalot
django-celery-results
django-compression-middleware
django-cors-headers
@@ -213,7 +222,7 @@ python.pkgs.buildPythonApplication rec {
django-multiselectfield
django-soft-delete
djangorestframework
djangorestframework-guardian2
djangorestframework-guardian
drf-spectacular
drf-spectacular-sidecar
drf-writable-nested
@@ -232,6 +241,7 @@ python.pkgs.buildPythonApplication rec {
pathvalidate
pdf2image
psycopg
psycopg-pool
python-dateutil
python-dotenv
python-gnupg
@@ -320,6 +330,7 @@ python.pkgs.buildPythonApplication rec {
export PATH="${path}:$PATH"
export HOME=$(mktemp -d)
export XDG_DATA_DIRS="${liberation_ttf}/share:$XDG_DATA_DIRS"
export PAPERLESS_NLTK_DIR=${passthru.nltkDataDir}
'';
disabledTests = [
@@ -337,22 +348,22 @@ python.pkgs.buildPythonApplication rec {
# Favicon tests fail due to static file handling in the test environment
"test_favicon_view"
"test_favicon_view_missing_file"
# Requires DNS
"test_send_webhook_data_or_json"
"test_workflow_webhook_send_webhook_retry"
"test_workflow_webhook_send_webhook_task"
];
doCheck = !stdenv.hostPlatform.isDarwin;
passthru = {
inherit
python
path
frontend
nltkDataDir
path
python
tesseract5
;
nltkData = with nltk-data; [
punkt-tab
snowball-data
stopwords
];
tests = { inherit (nixosTests) paperless; };
};
+6 -2
View File
@@ -13,13 +13,13 @@
buildGoModule (finalAttrs: {
pname = "VictoriaMetrics";
version = "1.123.0";
version = "1.124.0";
src = fetchFromGitHub {
owner = "VictoriaMetrics";
repo = "VictoriaMetrics";
tag = "v${finalAttrs.version}";
hash = "sha256-GUVRMlF94BaZSVfz4Z+IBSpf6WuA5o1WQQmeZAqKZ1g=";
hash = "sha256-f0Mf/4cFnJ/3I8z/4UhhNJnSCau9Q7mFfR32lP9/yi0=";
};
vendorHash = null;
@@ -51,6 +51,10 @@ buildGoModule (finalAttrs: {
# This appears to be some kind of test server for development purposes only.
rm -f app/vmui/packages/vmui/web/{go.mod,main.go}
# Allow older go versions
substituteInPlace go.mod \
--replace-fail "go 1.24.6" "go ${finalAttrs.passthru.go.version}"
# Increase timeouts in tests to prevent failure on heavily loaded builders
substituteInPlace lib/storage/storage_test.go \
--replace-fail "time.After(10 " "time.After(120 " \
+16
View File
@@ -2,6 +2,8 @@
lib,
rustPlatform,
fetchFromGitHub,
openssl,
pkg-config,
versionCheckHook,
}:
rustPlatform.buildRustPackage (finalAttrs: {
@@ -17,6 +19,20 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoHash = "sha256-77ArdZ9mOYEon4nzNUNSL0x0UlE1iVujFLwreAd9iMM=";
strictDeps = true;
nativeBuildInputs = [
pkg-config
];
buildInputs = [
openssl
];
buildNoDefaultFeatures = true;
buildFeatures = [
"native-tls"
];
doCheck = true;
# Requires network access
checkFlags = [
@@ -28,9 +28,12 @@ lib.makeScope pkgs.newScope (
(prev: {
autoPatchelfIgnoreMissingDeps = [ "libonnxruntime.so.1" ];
});
graalvm-oracle_24 = (self.callPackage ./graalvm-oracle { version = "24"; }).overrideAttrs (prev: {
autoPatchelfIgnoreMissingDeps = [ "libonnxruntime.so.1.18.0" ];
});
graalvm-oracle_23 = self.callPackage ./graalvm-oracle { version = "23"; };
graalvm-oracle_17 = self.callPackage ./graalvm-oracle { version = "17"; };
graalvm-oracle = self.graalvm-oracle_23;
graalvm-oracle = self.graalvm-oracle_24;
}
// lib.optionalAttrs config.allowAliases {
graalvm-oracle_22 = throw "GraalVM 22 is EOL, use a newer version instead";
@@ -4,7 +4,7 @@
fetchurl,
graalvmPackages,
useMusl ? false,
version ? "23",
version ? "24",
}:
graalvmPackages.buildGraalvm {
@@ -22,6 +22,24 @@
url = "https://github.com/graalvm/oracle-graalvm-ea-builds/releases/download/jdk-25.0.0-ea.34/graalvm-jdk-25.0.0-ea.34_macos-aarch64_bin.tar.gz";
};
};
"24" = {
"aarch64-linux" = {
hash = "sha256-dvJVfzLoz75ti3u/Mx8PCS674cw2omeOCYMFiSB2KYs=";
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_linux-aarch64_bin.tar.gz";
};
"x86_64-linux" = {
hash = "sha256-sBYaSbvB0PQGl1Mt36u4BSpaFeRjd15pRf4+SSAlm64=";
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_linux-x64_bin.tar.gz";
};
"x86_64-darwin" = {
hash = "sha256-3w+eXRASAcUL+muqPGV6gaKIPFtQl6n1q5PauG9+O6I=";
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_macos-x64_bin.tar.gz";
};
"aarch64-darwin" = {
hash = "sha256-LcdjTtk5xyXUGjU/c0Q/8y5w8vtXc2fxKmk2EH40lNw=";
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_macos-aarch64_bin.tar.gz";
};
};
"23" = {
"aarch64-linux" = {
hash = "sha256-VlB664/l7NWFQrPE3vEJvCXkEzKEJ0ck/HNU5pGGTwU=";
@@ -2,6 +2,7 @@
lib,
buildDunePackage,
fetchurl,
backoff,
domain-local-await,
mtime,
multicore-magic,
@@ -10,14 +11,15 @@
buildDunePackage rec {
pname = "multicore-bench";
version = "0.1.4";
version = "0.1.7";
src = fetchurl {
url = "https://github.com/ocaml-multicore/multicore-bench/releases/download/${version}/multicore-bench-${version}.tbz";
hash = "sha256-iCx5QvhYo/e53cW23Sza2as4aez4HeESVvLPF1DW85A=";
hash = "sha256-vrp9yiuTwhijhYjeDKPFRGyh/5LeydKWJSyMLZRRXIM=";
};
propagatedBuildInputs = [
backoff
domain-local-await
mtime
multicore-magic
@@ -16,14 +16,14 @@
buildPythonPackage rec {
pname = "django-auditlog";
version = "3.2.0";
version = "3.2.1";
pyproject = true;
src = fetchFromGitHub {
owner = "jazzband";
repo = "django-auditlog";
tag = "v${version}";
hash = "sha256-NOtpnYh6HUo7VRSyCUhbpNDv0V9KWST0OEzl7Pt6eR8=";
hash = "sha256-159p82PT3za3wp2XhekGxy+NYxLyQfAyUOyhDjyr2CI=";
};
nativeBuildInputs = [
@@ -7,8 +7,14 @@
psycopg2,
jinja2,
beautifulsoup4,
pytest-django,
pytestCheckHook,
python,
pytz,
redis,
redisTestHook,
setuptools,
stdenv,
}:
buildPythonPackage rec {
@@ -29,18 +35,27 @@ buildPythonPackage rec {
./disable-unsupported-tests.patch
];
propagatedBuildInputs = [ django ];
build-system = [ setuptools ];
checkInputs = [
dependencies = [ django ];
nativeCheckInputs = [
beautifulsoup4
django-debug-toolbar
psycopg2
jinja2
pytest-django
pytestCheckHook
pytz
redis
redisTestHook
];
pythonImportsCheck = [ "cachalot" ];
# redisTestHook does not work on darwin
doCheck = !stdenv.hostPlatform.isDarwin;
# disable broken pinning test
preCheck = ''
substituteInPlace cachalot/tests/read.py \
@@ -3,6 +3,8 @@
buildPythonPackage,
fetchFromGitHub,
djangorestframework,
pytest-django,
pytestCheckHook,
setuptools,
}:
@@ -18,21 +20,20 @@ buildPythonPackage rec {
hash = "sha256-nUkR5xTyeBv7ziJ6Mej9TKvMOa5/k+ELBqt4BVam/wk=";
};
build-system = [ setuptools ];
postPatch = ''
patchShebangs manage.py
'';
build-system = [ setuptools ];
dependencies = [ djangorestframework ];
checkPhase = ''
runHook preCheck
nativeCheckInputs = [
pytest-django
pytestCheckHook
];
./manage.py test
runHook postCheck
'';
env.DJANGO_SETTINGS_MODULE = "tests.django_settings";
pythonImportsCheck = [ "rest_framework_dataclasses" ];
@@ -2,36 +2,38 @@
lib,
buildPythonPackage,
fetchFromGitHub,
django,
django-guardian,
djangorestframework,
pytest-django,
pytestCheckHook,
setuptools,
}:
buildPythonPackage rec {
pname = "djangorestframework-guardian";
version = "0.3.0";
format = "setuptools";
version = "0.4.0";
pyproject = true;
src = fetchFromGitHub {
owner = "rpkilby";
repo = "django-rest-framework-guardian";
rev = version;
hash = "sha256-jl/VEl1pUHU8J1d5ZQSGJweNJayIGw1iVAmwID85fqw=";
hash = "sha256-7SaKyWoLen5DAwSyrWeA4rEmjXMcPwJ7LM7WYxk+IKs=";
};
postPatch = ''
chmod +x manage.py
patchShebangs manage.py
'';
build-system = [ setuptools ];
propagatedBuildInputs = [
dependencies = [
django-guardian
djangorestframework
];
checkPhase = ''
./manage.py test
'';
nativeCheckInputs = [
pytest-django
pytestCheckHook
];
env.DJANGO_SETTINGS_MODULE = "tests.settings";
pythonImportsCheck = [ "rest_framework_guardian" ];
@@ -40,7 +42,5 @@ buildPythonPackage rec {
homepage = "https://github.com/rpkilby/django-rest-framework-guardian";
license = licenses.bsd3;
maintainers = [ ];
# unmaintained, last compatible version is 3.x, use djangorestframework-guardian2 instead
broken = lib.versionAtLeast django.version "4";
};
}
@@ -1,46 +0,0 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
django-guardian,
djangorestframework,
setuptools,
}:
buildPythonPackage rec {
pname = "djangorestframework-guardian2";
version = "0.7.0";
pyproject = true;
src = fetchFromGitHub {
owner = "johnthagen";
repo = "django-rest-framework-guardian2";
tag = "v${version}";
hash = "sha256-LrIhOoBWC3HttjAGbul4zof++OW35pGMyFGZzUpG1Tk=";
};
postPatch = ''
chmod +x manage.py
patchShebangs manage.py
'';
build-system = [ setuptools ];
dependencies = [
django-guardian
djangorestframework
];
checkPhase = ''
./manage.py test
'';
pythonImportsCheck = [ "rest_framework_guardian" ];
meta = with lib; {
description = "Django-guardian support for Django REST Framework";
homepage = "https://github.com/johnthagen/django-rest-framework-guardian2/";
license = licenses.bsd3;
maintainers = with maintainers; [ e1mo ];
};
}
@@ -8,14 +8,14 @@
buildPythonPackage rec {
pname = "drf-spectacular-sidecar";
version = "2025.4.1";
version = "2025.8.1";
pyproject = true;
src = fetchFromGitHub {
owner = "tfranzel";
repo = "drf-spectacular-sidecar";
rev = version;
hash = "sha256-YzSUwShj7QGCVKlTRM2Gro38Y+jGYQsMGBMAH0radmA=";
hash = "sha256-H2eHFX7VG7YqLztEV/G4QnVYytkfADeHxgBTRlmKt50=";
};
build-system = [ setuptools ];
@@ -33,13 +33,13 @@
buildPythonPackage rec {
pname = "python-openstackclient";
version = "8.1.0";
version = "8.2.0";
pyproject = true;
src = fetchPypi {
pname = "python_openstackclient";
inherit version;
hash = "sha256-m5xCs/a8S0tICmJU/FYKywGXh4MeCUOW2/msmuVxrks=";
hash = "sha256-1hKvGN/GbMjzHmzpZpC2wnOt6KJA7EC39INaiJb7vgE=";
};
build-system = [
@@ -49,6 +49,9 @@ buildPythonPackage rec {
__darwinAllowLocalNetworking = true;
# redisTestHook does not work on darwin-x86_64
doCheck = !(stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64);
disabledTests = lib.optionals stdenv.hostPlatform.isDarwin [
# PermissionError: [Errno 13] Permission denied: '/tmp/rq-tests.txt'
"test_deleted_jobs_arent_executed"
@@ -69,8 +69,6 @@ buildPythonPackage rec {
]
++ optional-dependencies.http3;
doCheck = !stdenv.hostPlatform.isDarwin;
preCheck = ''
# Some tests depends on sanic on PATH
PATH="$out/bin:$PATH"
@@ -78,6 +76,11 @@ buildPythonPackage rec {
# needed for relative paths for some packages
cd tests
''
# Work around "OSError: AF_UNIX path too long"
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace worker/test_socket.py \
--replace-fail '"./test.sock"' '"/tmp/test.sock"'
'';
disabledTests = [
@@ -2,7 +2,7 @@
lib,
buildPythonPackage,
fetchFromGitHub,
pythonOlder,
anyio,
hatchling,
httpx,
}:
@@ -12,8 +12,6 @@ buildPythonPackage rec {
version = "0.10.0";
pyproject = true;
disabled = pythonOlder "3.9";
src = fetchFromGitHub {
owner = "stumpylog";
repo = "tika-client";
@@ -23,14 +21,14 @@ buildPythonPackage rec {
build-system = [ hatchling ];
dependencies = [ httpx ];
dependencies = [
anyio
httpx
];
pythonImportsCheck = [ "tika_client" ];
# Almost all of the tests (all except one in 0.1.0) fail since there
# is no tika http API endpoint reachable. Since tika is not yet
# packaged for nixpkgs, it seems like an unreasonable amount of effort
# fixing these tests.
# The tests expect the tika-server to run in a docker container
doChecks = false;
meta = with lib; {
-54
View File
@@ -1,54 +0,0 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
protobufc,
libunwind,
lzo,
openssl,
protobuf,
zlib,
}:
stdenv.mkDerivation rec {
pname = "zbackup";
version = "1.4.4";
src = fetchFromGitHub {
owner = "zbackup";
repo = "zbackup";
rev = version;
hash = "sha256-9Fk4EhEeQ2J4Kirc7oad4CzmW70Mmza6uozd87qfgZI=";
};
patches = [
# compare with https://github.com/zbackup/zbackup/pull/158;
# but that doesn't apply cleanly to this version
./protobuf-api-change.patch
];
# zbackup uses dynamic exception specifications which are not
# allowed in C++17
env.NIX_CFLAGS_COMPILE = toString [ "--std=c++14" ];
buildInputs = [
zlib
openssl
protobuf
lzo
libunwind
];
nativeBuildInputs = [
cmake
protobufc
];
meta = {
description = "Versatile deduplicating backup tool";
mainProgram = "zbackup";
homepage = "http://zbackup.org/";
platforms = lib.platforms.linux;
license = lib.licenses.gpl2Plus;
};
}
@@ -1,11 +0,0 @@
--- a/backup_restorer.cc
+++ b/backup_restorer.cc
@@ -48,7 +48,7 @@
// TODO: this disables size checks for each separate message. Figure a better
// way to do this while keeping them enabled. It seems we need to create an
// instance of CodedInputStream for each message, but it might be expensive
- cis.SetTotalBytesLimit( backupData.size(), -1 );
+ cis.SetTotalBytesLimit( backupData.size() );
// Used when emitting chunks
string chunk;
+6
View File
@@ -619,11 +619,15 @@ mapAliases {
cloudlogoffline = throw "cloudlogoffline has been removed"; # added 2025-05-18
clwrapperFunction = throw "Lisp packages have been redesigned. See 'lisp-modules' in the nixpkgs manual."; # Added 2024-05-07
CoinMP = coinmp; # Added 2024-06-12
code-browser-gtk = throw "'code-browser-gtk' has been removed, as it was broken since 22.11"; # Added 2025-08-22
code-browser-gtk2 = throw "'code-browser-gtk2' has been removed, as it was broken since 22.11"; # Added 2025-08-22
code-browser-qt = throw "'code-browser-qt' has been removed, as it was broken since 22.11"; # Added 2025-08-22
collada-dom = opencollada; # added 2024-02-21
colloid-kde = throw "'colloid-kde' has been removed, as it is only compatible with Plasma 5, which is EOL"; # Added 2025-08-20
colorpicker = throw "'colorpicker' has been removed due to lack of maintenance upstream. Consider using 'xcolor', 'gcolor3', 'eyedropper' or 'gpick' instead"; # Added 2024-10-19
colorstorm = throw "'colorstorm' has been removed because it was unmaintained in nixpkgs and upstream was rewritten."; # Added 2025-06-15
connman-ncurses = throw "'connman-ncurses' has been removed due to lack of maintenance upstream."; # Added 2025-05-27
copper = throw "'copper' has been removed, as it was broken since 22.11"; # Added 2025-08-22
cordless = throw "'cordless' has been removed due to being archived upstream. Consider using 'discordo' instead."; # Added 2025-06-07
coriander = throw "'coriander' has been removed because it depends on GNOME 2 libraries"; # Added 2024-06-27
corretto19 = throw "Corretto 19 was removed as it has reached its end of life"; # Added 2024-08-01
@@ -1073,6 +1077,7 @@ mapAliases {
guardian-agent = throw "'guardian-agent' has been removed, as it hasn't been maintained upstream in years and accumulated many vulnerabilities"; # Added 2024-06-09
guile-disarchive = disarchive; # Added 2023-10-27
gutenprintBin = gutenprint-bin; # Added 2025-08-21
gxneur = throw "'gxneur' has been removed due to lack of maintenance and reliance on gnome2 and 2to3."; # Added 2025-08-17
### H ###
@@ -2439,6 +2444,7 @@ mapAliases {
z3_4_8 = throw "'z3_4_8' has been removed in favour of the latest version. Use 'z3'."; # Added 2025-05-18
zabbix50 = throw "'zabbix50' has been removed, it would have reached its End of Life a few days after the release of NixOS 25.05. Consider upgrading to 'zabbix60' or 'zabbix70'.";
zabbix64 = throw "'zabbix64' has been removed because it reached its End of Life. Consider upgrading to 'zabbix70'.";
zbackup = throw "'zbackup' has been removed due to being unmaintained upstream"; # Added 2025-08-22
zeroadPackages = recurseIntoAttrs {
zeroad = lib.warnOnInstantiate "'zeroadPackages.zeroad' has been renamed to 'zeroad'" zeroad; # Added 2025-03-22
zeroad-data = lib.warnOnInstantiate "'zeroadPackages.zeroad-data' has been renamed to 'zeroad-data'" zeroad-data; # Added 2025-03-22
-12
View File
@@ -2615,10 +2615,6 @@ with pkgs;
cask-server = libsForQt5.callPackage ../applications/misc/cask-server { };
code-browser-qt = libsForQt5.callPackage ../applications/editors/code-browser { withQt = true; };
code-browser-gtk2 = callPackage ../applications/editors/code-browser { withGtk2 = true; };
code-browser-gtk = callPackage ../applications/editors/code-browser { withGtk3 = true; };
cffconvert = python3Packages.toPythonApplication python3Packages.cffconvert;
ckb-next = libsForQt5.callPackage ../tools/misc/ckb-next { };
@@ -4583,10 +4579,6 @@ with pkgs;
# To expose more packages for Yi, override the extraPackages arg.
yi = callPackage ../applications/editors/yi/wrapper.nix { };
zbackup = callPackage ../tools/backup/zbackup {
protobuf = protobuf_21;
};
zbar = libsForQt5.callPackage ../tools/graphics/zbar { };
# Nvidia support does not require any proprietary libraries, so CI can build it.
@@ -13836,10 +13828,6 @@ with pkgs;
;
};
gxneur = callPackage ../applications/misc/gxneur {
inherit (gnome2) libglade GConf;
};
xournalpp = callPackage ../applications/graphics/xournalpp {
lua = lua5_3;
};
+1
View File
@@ -188,6 +188,7 @@ mapAliases ({
distutils_extra = distutils-extra; # added 2023-10-12
digital-ocean = python-digitalocean; # addad 2024-04-12
dj-stripe = throw "dj-stripe has been removed because it is unused and broken"; # added 2025-07-21
djangorestframework-guardian2 = throw "djangorestframework-guardian2 has been removed because djangorestframework-guardian is active again and the upstream project was archived"; # added 2025-08-22
djangorestframework-jwt = drf-jwt; # added 2021-07-20
django-allauth-2fa = throw "django-allauth-2fa was removed because it was unused and django-allauth now contains 2fa logic itself."; # added 2025-02-15
django-sampledatahelper = throw "django-sampledatahelper was removed because it is no longer compatible to latest Django version"; # added 2022-07-18
-4
View File
@@ -4142,10 +4142,6 @@ self: super: with self; {
callPackage ../development/python-modules/djangorestframework-guardian
{ };
djangorestframework-guardian2 =
callPackage ../development/python-modules/djangorestframework-guardian2
{ };
djangorestframework-jsonp = callPackage ../development/python-modules/djangorestframework-jsonp { };
djangorestframework-recursive =