2023-08-10 07:27:38 +00:00
# eg25-manager: <https://gitlab.com/mobian1/eg25-manager>
# - requires modemmanager (ModemManager.service)
{ config , lib , pkgs , . . . }:
let
cfg = config . sane . services . eg25-manager ;
2023-08-15 10:46:18 +00:00
eg25-config-toml = pkgs . writeText " e g 2 5 - m a n a g e r - c o n f i g . t o m l " ''
# config here is applied *on top of* the per-device configs shipped by eg25-manager.
# these values take precedence, but there's no need to redefine things if we don't want them changed
[ at ]
uart = " / d e v / t t y U S B 2 "
'' ;
2023-08-10 07:27:38 +00:00
in
{
2023-08-17 08:34:32 +00:00
options . sane . services . eg25-manager = with lib ; {
enable = mkEnableOption " Q u e c t e l E G 2 5 m o d e m m a n a g e r s e r v i c e " ;
package = mkOption {
type = types . package ;
default = pkgs . eg25-manager ;
} ;
2023-08-10 07:27:38 +00:00
} ;
config = lib . mkIf cfg . enable {
# eg25-manager package ships udev rules *and* a systemd service.
# for that reason, i think it needs to be on the system path for the systemd service to be enabled.
2023-08-17 08:34:32 +00:00
services . udev . packages = [ cfg . package ] ;
2023-08-15 10:46:18 +00:00
# but actually, let's define our own systemd service so that we can control config
systemd . services . eg25-manager = {
serviceConfig = {
Type = " s i m p l e " ;
2023-08-17 08:34:32 +00:00
ExecStart = " ${ cfg . package } / b i n / e g 2 5 - m a n a g e r - - c o n f i g ${ eg25-config-toml } " ;
2023-08-15 10:46:18 +00:00
ExecStartPre = pkgs . writeShellScript " u n l o a d - m o d e m - p o w e r " ''
2023-08-17 08:34:32 +00:00
# see issue: <https://gitlab.com/mobian1/eg25-manager/-/issues/38>
2023-08-15 10:46:18 +00:00
$ { pkgs . kmod } /bin/modprobe - r modem_power && echo " W A R N I N G : k e r n e l c o n f i g u r e d w i t h C O N F I G _ M O D E M _ P O W E R = y , m a y b e i n c o m p a t i b l e w i t h e g 2 5 - m a n a g e r " || true
'' ;
Restart = " o n - f a i l u r e " ;
2023-08-16 09:09:13 +00:00
RestartSec = " 6 0 s " ; # can make this more frequent once stable?
2023-08-15 10:46:18 +00:00
# sandboxing (taken from the service file shipped by eg25-manager):
2023-08-16 09:09:13 +00:00
# TODO: this is too strict and breaks access to e.g. /dev/ttyUSB2!
# ProtectControlGroups = true;
# ProtectHome = true;
# ProtectSystem = "strict";
# RestrictSUIDSGID = true;
# PrivateTmp = true;
# MemoryDenyWriteExecute = true;
# PrivateMounts = true;
# NoNewPrivileges = true;
# CapabilityBoundingSet = [ "" ];
# LockPersonality = true;
2023-08-15 10:46:18 +00:00
} ;
before = [ " M o d e m M a n a g e r . s e r v i c e " ] ;
wantedBy = [ " m u l t i - u s e r . t a r g e t " ] ;
} ;
# systemd.packages = [ pkgs.eg25-manager ];
# systemd.services.eg25-manager.wantedBy = [ "multi-user.target" ];
# systemd.services.prepare-eg25-manager = {
# description = "unload megi's modem_power module to provide gpio access to eg25-manager";
# serviceConfig.Type = "oneshot";
# wantedBy = [ "eg25-manager.service" ];
# before = [ "eg25-manager.service" ];
# script = ''
# ${pkgs.kmod}/bin/modprobe -r modem_power && echo "WARNING: kernel configured with CONFIG_MODEM_POWER=y, may be incompatible with eg25-manager" || true
# '';
# };
2023-08-10 07:27:38 +00:00
} ;
}