Skip to content

Commit

Permalink
nixos/ustreamer: init; ustreamer: 6.12 -> 6.18 (NixOS#367415)
Browse files Browse the repository at this point in the history
  • Loading branch information
MatthewCroughan authored Dec 24, 2024
2 parents e00cd56 + 813b1d3 commit f6332c0
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 20 deletions.
2 changes: 2 additions & 0 deletions nixos/doc/manual/release-notes/rl-2505.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@

- [Bat](https://github.com/sharkdp/bat), a {manpage}`cat(1)` clone with wings. Available as [programs.bat](options.html#opt-programs.bat).

- [µStreamer](https://github.com/pikvm/ustreamer), a lightweight MJPEG-HTTP streamer. Available as [services.ustreamer](options.html#opt-services.ustreamer).

- [Whoogle Search](https://github.com/benbusby/whoogle-search), a self-hosted, ad-free, privacy-respecting metasearch engine. Available as [services.whoogle-search](options.html#opt-services.whoogle-search.enable).

- [agorakit](https://github.com/agorakit/agorakit), an organization tool for citizens' collectives. Available with [services.agorakit](options.html#opt-services.agorakit.enable).
Expand Down
1 change: 1 addition & 0 deletions nixos/modules/module-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1417,6 +1417,7 @@
./services/video/mirakurun.nix
./services/video/photonvision.nix
./services/video/mediamtx.nix
./services/video/ustreamer.nix
./services/video/v4l2-relayd.nix
./services/video/wivrn.nix
./services/wayland/cage.nix
Expand Down
110 changes: 110 additions & 0 deletions nixos/modules/services/video/ustreamer.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
{
config,
lib,
pkgs,
utils,
...
}:
let
inherit (lib)
getExe
mkEnableOption
mkIf
mkOption
mkPackageOption
optionals
types
;

cfg = config.services.ustreamer;
in
{
options.services.ustreamer = {
enable = mkEnableOption "µStreamer, a lightweight MJPEG-HTTP streamer";

package = mkPackageOption pkgs "ustreamer" { };

autoStart = mkOption {
description = ''
Wether to start µStreamer on boot. Disabling this will use socket
activation. The service will stop gracefully after some inactivity.
Disabling this will set `--exit-on-no-clients=300`
'';
type = types.bool;
default = true;
example = false;
};

listenAddress = mkOption {
description = ''
Address to expose the HTTP server. This accepts values for
ListenStream= defined in {manpage}`systemd.socket(5)`
'';
type = types.str;
default = "0.0.0.0:8080";
example = "/run/ustreamer.sock";
};

device = mkOption {
description = ''
The v4l2 device to stream.
'';
type = types.path;
default = "/dev/video0";
example = "/dev/v4l/by-id/usb-0000_Dummy_abcdef-video-index0";
};

extraArgs = mkOption {
description = ''
Extra arguments to pass to `ustreamer`. See {manpage}`ustreamer(1)`
'';
type = with types; listOf str;
default = [ ];
example = [ "--resolution=1920x1080" ];
};
};

config = mkIf cfg.enable {
services.ustreamer.extraArgs =
[
"--device=${cfg.device}"
]
++ optionals (!cfg.autoStart) [
"--exit-on-no-clients=300"
];

systemd.services."ustreamer" = {
description = "µStreamer, a lightweight MJPEG-HTTP streamer";
after = [ "network.target" ];
requires = [ "ustreamer.socket" ];
wantedBy = mkIf cfg.autoStart [ "multi-user.target" ];
serviceConfig = {
ExecStart = utils.escapeSystemdExecArgs (
[
(getExe cfg.package)
"--systemd"
]
++ cfg.extraArgs
);
Restart = if cfg.autoStart then "always" else "on-failure";

DynamicUser = true;
SupplementaryGroups = [ "video" ];

NoNewPrivileges = true;
ProcSubset = "pid";
ProtectProc = "noaccess";
ProtectClock = "yes";
DeviceAllow = [ cfg.device ];
};
};

systemd.sockets."ustreamer" = {
wantedBy = [ "sockets.target" ];
partOf = [ "ustreamer.service" ];
socketConfig = {
ListenStream = cfg.listenAddress;
};
};
};
}
25 changes: 8 additions & 17 deletions nixos/tests/ustreamer.nix
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,13 @@ import ./make-test-python.nix (
'';
in
{
environment.systemPackages = [ pkgs.ustreamer ];
networking.firewall.enable = false;
systemd.services.ustreamer = {
description = "ustreamer service";
wantedBy = [ "multi-user.target" ];
serviceConfig = {
DynamicUser = true;
ExecStart = "${pkgs.ustreamer}/bin/ustreamer --host=0.0.0.0 --port 8000 --device /dev/video9 --device-timeout=8";
PrivateTmp = true;
BindReadOnlyPaths = "/dev/video9";
SupplementaryGroups = [
"video"
];
Restart = "always";
};
services.ustreamer = {
enable = true;
device = "/dev/video9";
extraArgs = [ "--device-timeout=8" ];
};
networking.firewall.allowedTCPPorts = [ 8080 ];

boot.extraModulePackages = [ config.boot.kernelPackages.akvcam ];
boot.kernelModules = [ "akvcam" ];
boot.extraModprobeConfig = ''
Expand All @@ -74,10 +65,10 @@ import ./make-test-python.nix (
start_all()
camera.wait_for_unit("ustreamer.service")
camera.wait_for_open_port(8000)
camera.wait_for_open_port(8080)
client.wait_for_unit("multi-user.target")
client.succeed("curl http://camera:8000")
client.succeed("curl http://camera:8080")
'';
}
)
19 changes: 16 additions & 3 deletions pkgs/by-name/us/ustreamer/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,20 @@
jansson,
libopus,
nixosTests,
systemdLibs,
which,
withSystemd ? true,
withJanus ? true,
}:
stdenv.mkDerivation rec {
pname = "ustreamer";
version = "6.12";
version = "6.18";

src = fetchFromGitHub {
owner = "pikvm";
repo = "ustreamer";
rev = "v${version}";
hash = "sha256-iaCgPHgklk7tbhJhQmyjKggb1bMWBD+Zurgfk9sCQ3E=";
hash = "sha256-VzhTfr0Swrv3jZUvBYYy5l0+iSokIztpeyA1CuG/roY=";
};

buildInputs =
Expand All @@ -34,6 +37,9 @@ stdenv.mkDerivation rec {
libjpeg
libdrm
]
++ lib.optionals withSystemd [
systemdLibs
]
++ lib.optionals withJanus [
janus-gateway
glib
Expand All @@ -43,13 +49,19 @@ stdenv.mkDerivation rec {
libopus
];

nativeBuildInputs = [ pkg-config ];
nativeBuildInputs = [
pkg-config
which
];

makeFlags =
[
"PREFIX=${placeholder "out"}"
"WITH_V4P=1"
]
++ lib.optionals withSystemd [
"WITH_SYSTEMD=1"
]
++ lib.optionals withJanus [
"WITH_JANUS=1"
# Workaround issues with Janus C Headers
Expand Down Expand Up @@ -77,5 +89,6 @@ stdenv.mkDerivation rec {
matthewcroughan
];
platforms = platforms.linux;
mainProgram = "ustreamer";
};
}

0 comments on commit f6332c0

Please sign in to comment.