mirror of
https://github.com/foo-dogsquared/nixos-config.git
synced 2025-01-31 16:57:55 +00:00
105 lines
3.4 KiB
Nix
105 lines
3.4 KiB
Nix
|
# Essentially a poor man's version of NixOS filesystem module except that is
|
||
|
# made for Bubblewrap environment. Everything here should only make use of
|
||
|
# Bubblewrap's filesystem options from the command-line application.
|
||
|
{ config, lib, ... }:
|
||
|
|
||
|
let
|
||
|
cfg = config.sandboxing.bubblewrap;
|
||
|
|
||
|
bubblewrapModuleFactory = { isGlobal ? false }: let
|
||
|
filesystemSubmodule = { config, lib, name, ... }: {
|
||
|
options = {
|
||
|
source = lib.mkOption {
|
||
|
type = lib.types.path;
|
||
|
description = ''
|
||
|
The source of the path to be copied from.
|
||
|
'';
|
||
|
example = lib.literalExpression "./files/example.file";
|
||
|
};
|
||
|
|
||
|
perms = lib.mkOption {
|
||
|
type = with lib.types; nullOr (strMatch "[0-7]{0,4}");
|
||
|
description = ''
|
||
|
The permissions of the node in octal.
|
||
|
'';
|
||
|
default = null;
|
||
|
example = "0755";
|
||
|
};
|
||
|
|
||
|
symlink = lib.mkEnableOption "create the file as a symlink";
|
||
|
createDir = lib.mkEnableOption "create the directory in the Bubblewrap environment";
|
||
|
bindMount = lib.mkEnableOption "bind-mount the given source to the Bubblewrap environment";
|
||
|
bindMountReadOnly = lib.mkEnableOption "bind-mount read-only the given source to the Bubblewrap environment";
|
||
|
};
|
||
|
};
|
||
|
in {
|
||
|
options.filesystem = lib.mkOption {
|
||
|
type = with lib.types; attrsOf (submodule filesystemSubmodule);
|
||
|
description =
|
||
|
if isGlobal then ''
|
||
|
Set of filesystem configurations to be copied to per-wrapper.
|
||
|
'' else ''
|
||
|
Set of wrapper-specific filesystem configurations in the Bubblewrap
|
||
|
environment.
|
||
|
'';
|
||
|
default = if isGlobal then { } else cfg.filesystem;
|
||
|
example = lib.literalExpression ''
|
||
|
{
|
||
|
"/etc/hello" = {
|
||
|
source = ./files/hello;
|
||
|
perms = "0700";
|
||
|
};
|
||
|
|
||
|
"/etc/xdg" = {
|
||
|
source = ./configs;
|
||
|
perms = "0700";
|
||
|
};
|
||
|
|
||
|
"/srv/data" = {
|
||
|
source = "/srv/data";
|
||
|
symlink = true;
|
||
|
};
|
||
|
|
||
|
"/srv/logs".createDir = true;
|
||
|
}
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
in
|
||
|
{
|
||
|
options.sandboxing.bubblewrap = bubblewrapModuleFactory { isGlobal = true; };
|
||
|
|
||
|
options.wrappers =
|
||
|
let
|
||
|
bubblewrapModule = { config, lib, name, ... }: let
|
||
|
submoduleCfg = config;
|
||
|
in {
|
||
|
options.sandboxing.bubblewrap = bubblewrapModuleFactory { isGlobal = false; };
|
||
|
|
||
|
config = lib.mkIf (config.sandboxing.variant == "bubblewrap") {
|
||
|
bubblewrap.extraArgs =
|
||
|
lib.lists.flatten
|
||
|
(lib.mapAttrsToList
|
||
|
(dst: metadata:
|
||
|
lib.optionals (metadata.perms != null) [ "--perms ${metadata.perms}" ]
|
||
|
++ (let
|
||
|
inherit (metadata) source;
|
||
|
in
|
||
|
if metadata.createDir
|
||
|
then [ "--dir ${dst}"]
|
||
|
else if metadata.symlink
|
||
|
then [ "--symlink ${source} ${dst}"]
|
||
|
else if metadata.bindMount
|
||
|
then [ "--bind-data ${source} ${dst}" ]
|
||
|
else if metadata.bindMountReadOnly
|
||
|
then [ "--ro-bind-data ${source} ${dst}" ]
|
||
|
else [ "--file ${source} ${dst}"]))
|
||
|
submoduleCfg.filesystem);
|
||
|
};
|
||
|
};
|
||
|
in
|
||
|
lib.mkOption {
|
||
|
type = with lib.types; attrsOf (submodule bubblewrapModule);
|
||
|
};
|
||
|
}
|