mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-14 06:00:33 +03:00
Merge remote-tracking branch 'origin/master' into staging-next
This commit is contained in:
commit
51fcbf5bb7
127 changed files with 2887 additions and 1362 deletions
|
@ -225,6 +225,13 @@
|
|||
<link xlink:href="options.html#opt-services.hadoop.hbase.enable">services.hadoop.hbase</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://github.com/edneville/please">Please</link>,
|
||||
a Sudo clone written in Rust. Available as
|
||||
<link linkend="opt-security.please.enable">security.please</link>
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://github.com/messagebird/sachet/">Sachet</link>,
|
||||
|
@ -611,6 +618,27 @@
|
|||
module removed, due to lack of maintainers.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>generateOptparseApplicativeCompletions</literal> and
|
||||
<literal>generateOptparseApplicativeCompletion</literal> from
|
||||
<literal>haskell.lib.compose</literal> (and
|
||||
<literal>haskell.lib</literal>) have been deprecated in favor
|
||||
of <literal>generateOptparseApplicativeCompletions</literal>
|
||||
(plural!) as provided by the haskell package sets (so
|
||||
<literal>haskellPackages.generateOptparseApplicativeCompletions</literal>
|
||||
etc.). The latter allows for cross-compilation (by
|
||||
automatically disabling generation of completion in the cross
|
||||
case). For it to work properly you need to make sure that the
|
||||
function comes from the same context as the package you are
|
||||
trying to override, i.e. always use the same package set as
|
||||
your package is coming from or – even better – use
|
||||
<literal>self.generateOptparseApplicativeCompletions</literal>
|
||||
if you are overriding a haskell package set. The old functions
|
||||
are retained for backwards compatibility, but yield are
|
||||
warning.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>services.graphite.api</literal> and
|
||||
|
@ -684,6 +712,12 @@
|
|||
system timezone.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The top-level <literal>termonad-with-packages</literal> alias
|
||||
for <literal>termonad</literal> has been removed.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
(Neo)Vim can not be configured with
|
||||
|
|
|
@ -81,6 +81,8 @@ In addition to numerous new and upgraded packages, this release has the followin
|
|||
|
||||
- [HBase cluster](https://hbase.apache.org/), a distributed, scalable, big data store. Available as [services.hadoop.hbase](options.html#opt-services.hadoop.hbase.enable).
|
||||
|
||||
- [Please](https://github.com/edneville/please), a Sudo clone written in Rust. Available as [security.please](#opt-security.please.enable)
|
||||
|
||||
- [Sachet](https://github.com/messagebird/sachet/), an SMS alerting tool for the Prometheus Alertmanager. Available as [services.prometheus.sachet](#opt-services.prometheus.sachet.enable).
|
||||
|
||||
- [infnoise](https://github.com/leetronics/infnoise), a hardware True Random Number Generator dongle.
|
||||
|
@ -200,6 +202,15 @@ Available as [services.patroni](options.html#opt-services.patroni.enable).
|
|||
|
||||
- virtlyst package and `services.virtlyst` module removed, due to lack of maintainers.
|
||||
|
||||
- `generateOptparseApplicativeCompletions` and `generateOptparseApplicativeCompletion` from `haskell.lib.compose`
|
||||
(and `haskell.lib`) have been deprecated in favor of `generateOptparseApplicativeCompletions` (plural!) as
|
||||
provided by the haskell package sets (so `haskellPackages.generateOptparseApplicativeCompletions` etc.).
|
||||
The latter allows for cross-compilation (by automatically disabling generation of completion in the cross case).
|
||||
For it to work properly you need to make sure that the function comes from the same context as the package
|
||||
you are trying to override, i.e. always use the same package set as your package is coming from or – even
|
||||
better – use `self.generateOptparseApplicativeCompletions` if you are overriding a haskell package set.
|
||||
The old functions are retained for backwards compatibility, but yield are warning.
|
||||
|
||||
- The `services.graphite.api` and `services.graphite.beacon` NixOS options, and
|
||||
the `python3.pkgs.graphite_api`, `python3.pkgs.graphite_beacon` and
|
||||
`python3.pkgs.influxgraph` packages, have been removed due to lack of upstream
|
||||
|
@ -217,6 +228,8 @@ Available as [services.patroni](options.html#opt-services.patroni.enable).
|
|||
|
||||
- The `paperless` module now defaults `PAPERLESS_TIME_ZONE` to your configured system timezone.
|
||||
|
||||
- The top-level `termonad-with-packages` alias for `termonad` has been removed.
|
||||
|
||||
- (Neo)Vim can not be configured with `configure.pathogen` anymore to reduce maintainance burden.
|
||||
Use `configure.packages` instead.
|
||||
- Neovim can not be configured with plug anymore (still works for vim).
|
||||
|
|
|
@ -263,6 +263,7 @@
|
|||
./security/pam.nix
|
||||
./security/pam_usb.nix
|
||||
./security/pam_mount.nix
|
||||
./security/please.nix
|
||||
./security/polkit.nix
|
||||
./security/rngd.nix
|
||||
./security/rtkit.nix
|
||||
|
|
122
nixos/modules/security/please.nix
Normal file
122
nixos/modules/security/please.nix
Normal file
|
@ -0,0 +1,122 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.security.please;
|
||||
ini = pkgs.formats.ini { };
|
||||
in
|
||||
{
|
||||
options.security.please = {
|
||||
enable = mkEnableOption (mdDoc ''
|
||||
please, a Sudo clone which allows a users to execute a command or edit a
|
||||
file as another user
|
||||
'');
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.please;
|
||||
defaultText = literalExpression "pkgs.please";
|
||||
description = mdDoc ''
|
||||
Which package to use for {command}`please`.
|
||||
'';
|
||||
};
|
||||
|
||||
wheelNeedsPassword = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = lib.mdDoc ''
|
||||
Whether users of the `wheel` group must provide a password to run
|
||||
commands or edit files with {command}`please` and
|
||||
{command}`pleaseedit` respectively.
|
||||
'';
|
||||
};
|
||||
|
||||
settings = mkOption {
|
||||
type = ini.type;
|
||||
default = { };
|
||||
example = {
|
||||
jim_run_any_as_root = {
|
||||
name = "jim";
|
||||
type = "run";
|
||||
target = "root";
|
||||
rule = ".*";
|
||||
require_pass = false;
|
||||
};
|
||||
jim_edit_etc_hosts_as_root = {
|
||||
name = "jim";
|
||||
type = "edit";
|
||||
target = "root";
|
||||
rule = "/etc/hosts";
|
||||
editmode = 644;
|
||||
require_pass = true;
|
||||
};
|
||||
};
|
||||
description = mdDoc ''
|
||||
Please configuration. Refer to
|
||||
<https://github.com/edneville/please/blob/master/please.ini.md> for
|
||||
details.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
security.wrappers =
|
||||
let
|
||||
owner = "root";
|
||||
group = "root";
|
||||
setuid = true;
|
||||
in
|
||||
{
|
||||
please = {
|
||||
source = "${cfg.package}/bin/please";
|
||||
inherit owner group setuid;
|
||||
};
|
||||
pleaseedit = {
|
||||
source = "${cfg.package}/bin/pleaseedit";
|
||||
inherit owner group setuid;
|
||||
};
|
||||
};
|
||||
|
||||
security.please.settings = rec {
|
||||
# The "wheel" group is allowed to do anything by default but this can be
|
||||
# overridden.
|
||||
wheel_run_as_any = {
|
||||
type = "run";
|
||||
group = true;
|
||||
name = "wheel";
|
||||
target = ".*";
|
||||
rule = ".*";
|
||||
require_pass = cfg.wheelNeedsPassword;
|
||||
};
|
||||
wheel_edit_as_any = wheel_run_as_any // { type = "edit"; };
|
||||
wheel_list_as_any = wheel_run_as_any // { type = "list"; };
|
||||
};
|
||||
|
||||
environment = {
|
||||
systemPackages = [ cfg.package ];
|
||||
|
||||
etc."please.ini".source = ini.generate "please.ini"
|
||||
(cfg.settings // (rec {
|
||||
# The "root" user is allowed to do anything by default and this cannot
|
||||
# be overridden.
|
||||
root_run_as_any = {
|
||||
type = "run";
|
||||
name = "root";
|
||||
target = ".*";
|
||||
rule = ".*";
|
||||
require_pass = false;
|
||||
};
|
||||
root_edit_as_any = root_run_as_any // { type = "edit"; };
|
||||
root_list_as_any = root_run_as_any // { type = "list"; };
|
||||
}));
|
||||
};
|
||||
|
||||
security.pam.services.please = {
|
||||
sshAgentAuth = true;
|
||||
usshAuth = true;
|
||||
};
|
||||
|
||||
meta.maintainers = with maintainers; [ azahi ];
|
||||
};
|
||||
}
|
|
@ -175,22 +175,22 @@ def get_specialisations(profile: Optional[str], generation: int, _: Optional[str
|
|||
|
||||
def remove_old_entries(gens: List[SystemIdentifier]) -> None:
|
||||
rex_profile = re.compile("^@efiSysMountPoint@/loader/entries/nixos-(.*)-generation-.*\.conf$")
|
||||
rex_generation = re.compile("^@efiSysMountPoint@/loader/entries/nixos.*-generation-(.*)\.conf$")
|
||||
rex_generation = re.compile("^@efiSysMountPoint@/loader/entries/nixos.*-generation-([0-9]+)(-specialisation-.*)?\.conf$")
|
||||
known_paths = []
|
||||
for gen in gens:
|
||||
known_paths.append(copy_from_profile(*gen, "kernel", True))
|
||||
known_paths.append(copy_from_profile(*gen, "initrd", True))
|
||||
for path in glob.iglob("@efiSysMountPoint@/loader/entries/nixos*-generation-[1-9]*.conf"):
|
||||
if rex_profile.match(path):
|
||||
prof = rex_profile.sub(r"\1", path)
|
||||
else:
|
||||
prof = None
|
||||
try:
|
||||
if rex_profile.match(path):
|
||||
prof = rex_profile.sub(r"\1", path)
|
||||
else:
|
||||
prof = "system"
|
||||
gen_number = int(rex_generation.sub(r"\1", path))
|
||||
if not (prof, gen_number) in gens:
|
||||
os.unlink(path)
|
||||
except ValueError:
|
||||
pass
|
||||
continue
|
||||
if not (prof, gen_number, None) in gens:
|
||||
os.unlink(path)
|
||||
for path in glob.iglob("@efiSysMountPoint@/efi/nixos/*"):
|
||||
if not path in known_paths and not os.path.isdir(path):
|
||||
os.unlink(path)
|
||||
|
|
|
@ -227,6 +227,7 @@ let
|
|||
|
||||
mkService = name: container: let
|
||||
dependsOn = map (x: "${cfg.backend}-${x}.service") container.dependsOn;
|
||||
escapedName = escapeShellArg name;
|
||||
in {
|
||||
wantedBy = [] ++ optional (container.autoStart) "multi-user.target";
|
||||
after = lib.optionals (cfg.backend == "docker") [ "docker.service" "docker.socket" ] ++ dependsOn;
|
||||
|
@ -250,16 +251,25 @@ let
|
|||
${optionalString (container.imageFile != null) ''
|
||||
${cfg.backend} load -i ${container.imageFile}
|
||||
''}
|
||||
${optionalString (cfg.backend == "podman") ''
|
||||
rm -f /run/podman-${escapedName}.ctr-id
|
||||
''}
|
||||
'';
|
||||
|
||||
script = concatStringsSep " \\\n " ([
|
||||
"exec ${cfg.backend} run"
|
||||
"--rm"
|
||||
"--name=${escapeShellArg name}"
|
||||
"--name=${escapedName}"
|
||||
"--log-driver=${container.log-driver}"
|
||||
] ++ optional (container.entrypoint != null)
|
||||
"--entrypoint=${escapeShellArg container.entrypoint}"
|
||||
++ (mapAttrsToList (k: v: "-e ${escapeShellArg k}=${escapeShellArg v}") container.environment)
|
||||
++ lib.optionals (cfg.backend == "podman") [
|
||||
"--cidfile=/run/podman-${escapedName}.ctr-id"
|
||||
"--cgroups=no-conmon"
|
||||
"--sdnotify=conmon"
|
||||
"-d"
|
||||
"--replace"
|
||||
] ++ (mapAttrsToList (k: v: "-e ${escapeShellArg k}=${escapeShellArg v}") container.environment)
|
||||
++ map (f: "--env-file ${escapeShellArg f}") container.environmentFiles
|
||||
++ map (p: "-p ${escapeShellArg p}") container.ports
|
||||
++ optional (container.user != null) "-u ${escapeShellArg container.user}"
|
||||
|
@ -270,8 +280,12 @@ let
|
|||
++ map escapeShellArg container.cmd
|
||||
);
|
||||
|
||||
preStop = "[ $SERVICE_RESULT = success ] || ${cfg.backend} stop ${name}";
|
||||
postStop = "${cfg.backend} rm -f ${name} || true";
|
||||
preStop = if cfg.backend == "podman"
|
||||
then "[ $SERVICE_RESULT = success ] || podman stop --ignore --cidfile=/run/podman-${escapedName}.ctr-id"
|
||||
else "[ $SERVICE_RESULT = success ] || ${cfg.backend} stop ${name}";
|
||||
postStop = if cfg.backend == "podman"
|
||||
then "podman rm -f --ignore --cidfile=/run/podman-${escapedName}.ctr-id"
|
||||
else "${cfg.backend} rm -f ${name} || true";
|
||||
|
||||
serviceConfig = {
|
||||
### There is no generalized way of supporting `reload` for docker
|
||||
|
@ -290,6 +304,9 @@ let
|
|||
# ExecReload = ...;
|
||||
###
|
||||
|
||||
Environment=if cfg.backend == "podman" then "PODMAN_SYSTEMD_UNIT=podman-${name}.service" else {};
|
||||
Type=if cfg.backend == "podman" then "notify" else {};
|
||||
NotifyAccess=if cfg.backend == "podman" then "all" else {};
|
||||
TimeoutStartSec = 0;
|
||||
TimeoutStopSec = 120;
|
||||
Restart = "always";
|
||||
|
|
|
@ -491,6 +491,7 @@ in {
|
|||
plasma5 = handleTest ./plasma5.nix {};
|
||||
plasma5-systemd-start = handleTest ./plasma5-systemd-start.nix {};
|
||||
plausible = handleTest ./plausible.nix {};
|
||||
please = handleTest ./please.nix {};
|
||||
pleroma = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./pleroma.nix {};
|
||||
plikd = handleTest ./plikd.nix {};
|
||||
plotinus = handleTest ./plotinus.nix {};
|
||||
|
|
|
@ -12,7 +12,7 @@ let
|
|||
name = "oci-containers-${backend}";
|
||||
|
||||
meta = {
|
||||
maintainers = with lib.maintainers; [ adisbladis benley ] ++ lib.teams.serokell.members;
|
||||
maintainers = with lib.maintainers; [ adisbladis benley mkaito ] ++ lib.teams.serokell.members;
|
||||
};
|
||||
|
||||
nodes = {
|
||||
|
|
66
nixos/tests/please.nix
Normal file
66
nixos/tests/please.nix
Normal file
|
@ -0,0 +1,66 @@
|
|||
import ./make-test-python.nix ({ lib, ... }:
|
||||
{
|
||||
name = "please";
|
||||
meta.maintainers = with lib.maintainers; [ azahi ];
|
||||
|
||||
nodes.machine =
|
||||
{ ... }:
|
||||
{
|
||||
users.users = with lib; mkMerge [
|
||||
(listToAttrs (map
|
||||
(n: nameValuePair n { isNormalUser = true; })
|
||||
(genList (x: "user${toString x}") 6)))
|
||||
{
|
||||
user0.extraGroups = [ "wheel" ];
|
||||
}
|
||||
];
|
||||
|
||||
security.please = {
|
||||
enable = true;
|
||||
wheelNeedsPassword = false;
|
||||
settings = {
|
||||
user2_run_true_as_root = {
|
||||
name = "user2";
|
||||
target = "root";
|
||||
rule = "/run/current-system/sw/bin/true";
|
||||
require_pass = false;
|
||||
};
|
||||
user4_edit_etc_hosts_as_root = {
|
||||
name = "user4";
|
||||
type = "edit";
|
||||
target = "root";
|
||||
rule = "/etc/hosts";
|
||||
editmode = 644;
|
||||
require_pass = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
with subtest("root: can run anything by default"):
|
||||
machine.succeed('please true')
|
||||
with subtest("root: can edit anything by default"):
|
||||
machine.succeed('EDITOR=cat pleaseedit /etc/hosts')
|
||||
|
||||
with subtest("user0: can run as root because it's in the wheel group"):
|
||||
machine.succeed('su - user0 -c "please -u root true"')
|
||||
with subtest("user1: cannot run as root because it's not in the wheel group"):
|
||||
machine.fail('su - user1 -c "please -u root true"')
|
||||
|
||||
with subtest("user0: can edit as root"):
|
||||
machine.succeed('su - user0 -c "EDITOR=cat pleaseedit /etc/hosts"')
|
||||
with subtest("user1: cannot edit as root"):
|
||||
machine.fail('su - user1 -c "EDITOR=cat pleaseedit /etc/hosts"')
|
||||
|
||||
with subtest("user2: can run 'true' as root"):
|
||||
machine.succeed('su - user2 -c "please -u root true"')
|
||||
with subtest("user3: cannot run 'true' as root"):
|
||||
machine.fail('su - user3 -c "please -u root true"')
|
||||
|
||||
with subtest("user4: can edit /etc/hosts"):
|
||||
machine.succeed('su - user4 -c "EDITOR=cat pleaseedit /etc/hosts"')
|
||||
with subtest("user5: cannot edit /etc/hosts"):
|
||||
machine.fail('su - user5 -c "EDITOR=cat pleaseedit /etc/hosts"')
|
||||
'';
|
||||
})
|
|
@ -70,15 +70,15 @@ let
|
|||
|
||||
# Save the file
|
||||
machine.send_key('ctrl-s')
|
||||
machine.wait_for_text('Save')
|
||||
machine.wait_for_text('(Save|Desktop|alice|Size)')
|
||||
machine.screenshot('save_window')
|
||||
machine.send_key('ret')
|
||||
|
||||
# (the default filename is the first line of the file)
|
||||
machine.wait_for_file(f'/home/alice/{test_string}')
|
||||
|
||||
machine.send_key('ctrl-q')
|
||||
machine.wait_until_fails('pgrep -x codium')
|
||||
# machine.send_key('ctrl-q')
|
||||
# machine.wait_until_fails('pgrep -x codium')
|
||||
'';
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue