Compare commits
8 Commits
2389757581
...
39d31c3ffd
Author | SHA1 | Date |
---|---|---|
Colin | 39d31c3ffd | |
Colin | c50ef59102 | |
Colin | 5fc4ca6dad | |
Colin | 35c7527946 | |
Colin | 7e8a014f37 | |
Colin | 4ce951bbed | |
Colin | f784550b9b | |
Colin | 1f2bbd4aec |
|
@ -116,14 +116,6 @@
|
||||||
# enable rotation sensor
|
# enable rotation sensor
|
||||||
hardware.sensor.iio.enable = true;
|
hardware.sensor.iio.enable = true;
|
||||||
|
|
||||||
# TODO: move elsewhere...
|
|
||||||
systemd.services.ModemManager.serviceConfig = {
|
|
||||||
# N.B.: the extra "" in ExecStart serves to force upstream ExecStart to be ignored
|
|
||||||
ExecStart = [ "" "${pkgs.modemmanager}/bin/ModemManager --debug" ];
|
|
||||||
# --debug sets DEBUG level logging: so reset
|
|
||||||
ExecStartPost = [ "${pkgs.modemmanager}/bin/mmcli --set-logging=INFO" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.udev.extraRules = let
|
services.udev.extraRules = let
|
||||||
chmod = "${pkgs.coreutils}/bin/chmod";
|
chmod = "${pkgs.coreutils}/bin/chmod";
|
||||||
chown = "${pkgs.coreutils}/bin/chown";
|
chown = "${pkgs.coreutils}/bin/chown";
|
||||||
|
@ -134,8 +126,5 @@
|
||||||
|
|
||||||
# make Pinephone front LEDs writable by user.
|
# make Pinephone front LEDs writable by user.
|
||||||
SUBSYSTEM=="leds", DEVPATH=="*/*:indicator", RUN+="${chmod} g+w /sys%p/brightness", RUN+="${chown} :video /sys%p/brightness"
|
SUBSYSTEM=="leds", DEVPATH=="*/*:indicator", RUN+="${chmod} g+w /sys%p/brightness", RUN+="${chown} :video /sys%p/brightness"
|
||||||
|
|
||||||
# make Modem controllable by user
|
|
||||||
DRIVER=="modem-power", RUN+="${chmod} g+w /sys%p/powered", RUN+="${chown} :networkmanager /sys%p/powered"
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,11 +74,13 @@
|
||||||
./megapixels.nix
|
./megapixels.nix
|
||||||
./mepo.nix
|
./mepo.nix
|
||||||
./mimeo
|
./mimeo
|
||||||
|
./modemmanager.nix
|
||||||
./mopidy.nix
|
./mopidy.nix
|
||||||
./mpv
|
./mpv
|
||||||
./msmtp.nix
|
./msmtp.nix
|
||||||
./nautilus.nix
|
./nautilus.nix
|
||||||
./neovim.nix
|
./neovim.nix
|
||||||
|
./networkmanager.nix
|
||||||
./newsflash.nix
|
./newsflash.nix
|
||||||
./nheko.nix
|
./nheko.nix
|
||||||
./nicotine-plus.nix
|
./nicotine-plus.nix
|
||||||
|
@ -130,6 +132,7 @@
|
||||||
./wine.nix
|
./wine.nix
|
||||||
./wireplumber.nix
|
./wireplumber.nix
|
||||||
./wireshark.nix
|
./wireshark.nix
|
||||||
|
./wpa_supplicant.nix
|
||||||
./wvkbd.nix
|
./wvkbd.nix
|
||||||
./xarchiver.nix
|
./xarchiver.nix
|
||||||
./xdg-desktop-portal.nix
|
./xdg-desktop-portal.nix
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
{ config, lib, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
let
|
let
|
||||||
cfg = config.sane.programs.eg25-control;
|
cfg = config.sane.programs.eg25-control;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
sane.programs.eg25-control = {
|
sane.programs.eg25-control = {
|
||||||
|
suggestedPrograms = [ "modemmanager" ];
|
||||||
|
|
||||||
services.eg25-control-powered = {
|
services.eg25-control-powered = {
|
||||||
description = "eg25-control-powered: power to the Qualcomm eg25 modem used by PinePhone";
|
description = "eg25-control-powered: power to the Qualcomm eg25 modem used by PinePhone";
|
||||||
startCommand = "eg25-control --power-on --verbose";
|
startCommand = "eg25-control --power-on --verbose";
|
||||||
|
@ -45,6 +47,7 @@ in
|
||||||
requires = [ "network-online.target" ];
|
requires = [ "network-online.target" ];
|
||||||
# wantedBy = [ "network-online.target" ]; # auto-start immediately after boot
|
# wantedBy = [ "network-online.target" ]; # auto-start immediately after boot
|
||||||
};
|
};
|
||||||
|
|
||||||
users = lib.mkIf cfg.enabled {
|
users = lib.mkIf cfg.enabled {
|
||||||
groups.eg25-control = {};
|
groups.eg25-control = {};
|
||||||
users.eg25-control = {
|
users.eg25-control = {
|
||||||
|
@ -61,4 +64,11 @@ in
|
||||||
# to persist agps data, i think.
|
# to persist agps data, i think.
|
||||||
{ user = "eg25-control"; group = "eg25-control"; path = "/var/lib/eg25-control"; }
|
{ user = "eg25-control"; group = "eg25-control"; path = "/var/lib/eg25-control"; }
|
||||||
];
|
];
|
||||||
|
services.udev.extraRules = let
|
||||||
|
chmod = "${pkgs.coreutils}/bin/chmod";
|
||||||
|
chown = "${pkgs.coreutils}/bin/chown";
|
||||||
|
in ''
|
||||||
|
# make Modem controllable by user
|
||||||
|
DRIVER=="modem-power", RUN+="${chmod} g+w /sys%p/powered", RUN+="${chown} :networkmanager /sys%p/powered"
|
||||||
|
'';
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.sane.programs.modemmanager;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
sane.programs.modemmanager = {
|
||||||
|
# mmcli needs /run/current-system/sw/share/dbus-1 files to function
|
||||||
|
enableFor.system = lib.mkIf (builtins.any (en: en) (builtins.attrValues cfg.enableFor.user)) true;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.ModemManager = lib.mkIf cfg.enabled {
|
||||||
|
aliases = [ "dbus-org.freedesktop.ModemManager1.service" ];
|
||||||
|
after = [ "polkit.service" ];
|
||||||
|
requires = [ "polkit.service" ];
|
||||||
|
wantedBy = [ "network.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "dbus";
|
||||||
|
BusName = "org.freedesktop.ModemManager1";
|
||||||
|
# only if started with `--debug` does mmcli let us issue AT commands like
|
||||||
|
# `mmcli --modem any --command=<AT_CMD>`
|
||||||
|
ExecStart = "${cfg.package}/bin/ModemManager --debug";
|
||||||
|
# --debug sets DEBUG level logging: so reset
|
||||||
|
ExecStartPost = "${cfg.package}/bin/mmcli --set-logging=INFO";
|
||||||
|
|
||||||
|
Restart = "on-abort";
|
||||||
|
StandardError = "null";
|
||||||
|
CapabilityBoundingSet = "CAP_SYS_ADMIN CAP_NET_ADMIN";
|
||||||
|
ProtectSystem = true;
|
||||||
|
ProtectHome = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
RestrictAddressFamilies = "AF_NETLINK AF_UNIX AF_QIPCRTR";
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# so that ModemManager can discover when the modem appears
|
||||||
|
services.udev.packages = lib.mkIf cfg.enabled [ cfg.package ];
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
# Network Manager:
|
||||||
|
# i manage this myself because the nixos service is not flexible enough.
|
||||||
|
# - it unconditionally puts modemmanager onto the system path, preventing me from patching modemmanager's service file (without an overlay).
|
||||||
|
#
|
||||||
|
# XXX: it's normal to see error messages on an ethernet-only host, even when using nixos' official networkmanager service:
|
||||||
|
# - `Couldn't initialize supplicant interface: Failed to D-Bus activate wpa_supplicant service`
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.sane.programs.networkmanager;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
sane.programs.networkmanager = {
|
||||||
|
suggestedPrograms = [ "wpa_supplicant" ];
|
||||||
|
enableFor.system = lib.mkIf (builtins.any (en: en) (builtins.attrValues cfg.enableFor.user)) true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# add to systemd.packages so we get the service file it ships, then override what we need to customize (taken from nixpkgs)
|
||||||
|
systemd.packages = lib.mkIf cfg.enabled [ cfg.package ];
|
||||||
|
systemd.services.NetworkManager = lib.mkIf cfg.enabled {
|
||||||
|
wantedBy = [ "network.target" ];
|
||||||
|
aliases = [ "dbus-org.freedesktop.NetworkManager.service" ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
StateDirectory = "NetworkManager";
|
||||||
|
StateDirectoryMode = 755; # not sure if this really needs to be 755
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.NetworkManager-wait-online = lib.mkIf cfg.enabled{
|
||||||
|
wantedBy = [ "network-online.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.etc."NetworkManager/NetworkManager.conf".text = lib.mkIf cfg.enabled ''
|
||||||
|
# TODO: much of this is likely not needed.
|
||||||
|
[connection]
|
||||||
|
ethernet.cloned-mac-address=preserve
|
||||||
|
wifi.cloned-mac-address=preserve
|
||||||
|
wifi.powersave=null
|
||||||
|
|
||||||
|
[device]
|
||||||
|
wifi.backend=wpa_supplicant
|
||||||
|
wifi.scan-rand-mac-address=true
|
||||||
|
|
||||||
|
[keyfile]
|
||||||
|
# keyfile.path: where to check for connection credentials
|
||||||
|
path=/var/lib/NetworkManager/system-connections
|
||||||
|
unmanaged-devices=null
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
audit=false
|
||||||
|
level=WARN
|
||||||
|
|
||||||
|
[main]
|
||||||
|
dhcp=internal
|
||||||
|
dns=systemd-resolved
|
||||||
|
plugins=keyfile
|
||||||
|
rc-manager=unmanaged
|
||||||
|
'';
|
||||||
|
hardware.wirelessRegulatoryDatabase = lib.mkIf cfg.enabled true;
|
||||||
|
networking.useDHCP = lib.mkIf cfg.enabled false;
|
||||||
|
users.groups = lib.mkIf cfg.enabled {
|
||||||
|
networkmanager.gid = config.ids.gids.networkmanager;
|
||||||
|
};
|
||||||
|
services.udev.packages = lib.mkIf cfg.enabled [ cfg.package ];
|
||||||
|
security.polkit.enable = lib.mkIf cfg.enabled true;
|
||||||
|
security.polkit.extraConfig = ''
|
||||||
|
polkit.addRule(function(action, subject) {
|
||||||
|
if (
|
||||||
|
subject.isInGroup("networkmanager")
|
||||||
|
&& (action.id.indexOf("org.freedesktop.NetworkManager.") == 0
|
||||||
|
|| action.id.indexOf("org.freedesktop.ModemManager") == 0
|
||||||
|
))
|
||||||
|
{ return polkit.Result.YES; }
|
||||||
|
});
|
||||||
|
'';
|
||||||
|
|
||||||
|
boot.kernelModules = [ "ctr" ]; #< TODO: needed (what even is this)?
|
||||||
|
# TODO: polkit?
|
||||||
|
# TODO: NetworkManager-ensure-profiles?
|
||||||
|
}
|
|
@ -130,6 +130,7 @@ in
|
||||||
"fontconfig"
|
"fontconfig"
|
||||||
# "gnome.gnome-bluetooth" # XXX(2023/05/14): broken
|
# "gnome.gnome-bluetooth" # XXX(2023/05/14): broken
|
||||||
# "gnome.gnome-control-center" # XXX(2023/06/28): depends on webkitgtk4_1
|
# "gnome.gnome-control-center" # XXX(2023/06/28): depends on webkitgtk4_1
|
||||||
|
"networkmanager"
|
||||||
"pipewire"
|
"pipewire"
|
||||||
"playerctl" # for waybar & particularly to have playerctld running
|
"playerctl" # for waybar & particularly to have playerctld running
|
||||||
"rofi" # menu/launcher
|
"rofi" # menu/launcher
|
||||||
|
@ -258,7 +259,6 @@ in
|
||||||
|
|
||||||
|
|
||||||
# TODO: this can go elsewhere
|
# TODO: this can go elsewhere
|
||||||
networking.networkmanager.enable = lib.mkIf cfg.enabled true;
|
|
||||||
hardware.bluetooth.enable = lib.mkIf cfg.enabled true;
|
hardware.bluetooth.enable = lib.mkIf cfg.enabled true;
|
||||||
services.blueman.enable = lib.mkIf cfg.enabled true;
|
services.blueman.enable = lib.mkIf cfg.enabled true;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,9 @@ checkActive() {
|
||||||
systemctl is-active "$service.service" > /dev/null && echo true || echo false
|
systemctl is-active "$service.service" > /dev/null && echo true || echo false
|
||||||
;;
|
;;
|
||||||
s6)
|
s6)
|
||||||
s6-svstat -o wantedup "$XDG_RUNTIME_DIR/s6/live/servicedirs/$service"
|
# simulate a dry-run start. if no actions would be performed, then the service is up.
|
||||||
|
# alternative is s6-svstat, but that doesn't support oneshots
|
||||||
|
test -z "$(s6-rc -n 0 -b start "$service")" && echo true || echo false
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
@ -32,7 +34,7 @@ startService() {
|
||||||
/run/wrappers/bin/sudo systemctl start "$service"
|
/run/wrappers/bin/sudo systemctl start "$service"
|
||||||
;;
|
;;
|
||||||
s6)
|
s6)
|
||||||
s6-rc start "$service"
|
s6-rc -b start "$service"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
@ -43,7 +45,7 @@ stopService() {
|
||||||
/run/wrappers/bin/sudo systemctl stop "$service"
|
/run/wrappers/bin/sudo systemctl stop "$service"
|
||||||
;;
|
;;
|
||||||
s6)
|
s6)
|
||||||
s6-rc stop "$service"
|
s6-rc -b stop "$service"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.sane.programs.wpa_supplicant;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
sane.programs.wpa_supplicant = {};
|
||||||
|
services.udev.packages = lib.mkIf cfg.enabled [ cfg.package ];
|
||||||
|
# need to be on systemd.packages so we get its service file
|
||||||
|
systemd.packages = lib.mkIf cfg.enabled [ cfg.package ];
|
||||||
|
}
|
Loading…
Reference in New Issue