create dummy serial ports for the systemd service

This commit is contained in:
raf 2023-11-29 06:36:39 +03:00
parent 13feebd493
commit f13b8bc45d
No known key found for this signature in database
GPG key ID: 02D1DD3FA08B6B29
7 changed files with 118 additions and 21 deletions

View file

@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1701189068, "lastModified": 1701222237,
"narHash": "sha256-Z84Km4ILllusI9IPI9qFRKN4Ss5893Ntbp1TcMCFIds=", "narHash": "sha256-e2oXDUi3SO6dz2s0bElojErRcblOGYwMnpcJE93lWTI=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "6fc4c1c40c98de86565acdb3fe43c6ba3efb3115", "rev": "32d235daa928ec3d31ec3f601486d38b580e809d",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -22,14 +22,15 @@
formatter = pkgs.alejandra; formatter = pkgs.alejandra;
packages = { packages = {
default = self'.packages.pi-air-quality-monitor; default = self'.packages.air-quality-monitor;
pi-air-quality-monitor = pkgs.callPackage ./nix/default.nix {}; air-quality-monitor = pkgs.callPackage ./nix/packages/air-quality-monitor.nix {inherit self;};
dummy-serial = pkgs.callPackage ./nix/packages/dummy-serial.nix {};
}; };
devShells = { devShells = {
default = self'.packages.pi-air-quality-monitor; default = self'.devShells.air-quality-monitor;
pi-air-quality-monitor = pkgs.mkShell { air-quality-monitor = pkgs.mkShell {
inputsFrom = self'.packages.pi-air-quality-monitor.pythonPath; inputsFrom = self'.packages.air-quality-monitor.pythonPath;
}; };
}; };
}; };

View file

@ -12,7 +12,7 @@ in {
enable = mkEnableOption "pi-air-quality-monitor"; enable = mkEnableOption "pi-air-quality-monitor";
package = mkOption { package = mkOption {
type = types.package; type = types.package;
default = self.packages.${pkgs.system}.pi-air-quality-monitor; default = self.packages.${pkgs.system}.air-quality-monitor;
}; };
openFirewall = mkOption { openFirewall = mkOption {

View file

@ -0,0 +1,63 @@
{
self,
lib,
python3Packages,
makeWrapper,
python3,
...
}: let
pname = "pi_air_quality_monitor";
version = "0.0.1";
in
python3Packages.buildPythonApplication {
inherit pname version;
format = "other";
src = self + /src;
pythonPath = with python3Packages; [
pyserial
flask
redis
ipython
apscheduler
flask-cors
(
buildPythonPackage rec {
pname = "python-aqi";
version = "0.6.1";
src = fetchPypi {
inherit pname version;
hash = "sha256-FBoDoP7UiIDchwbKV7A/MPqRq2DpMwR0v5yaj7m5YCA=";
};
}
)
];
nativeBuildInputs = [makeWrapper];
installFlags = ["prefix=$(out/bin)"];
postUnpack = ''
mkdir -p $out/bin
cp -rvf $src/* $out
'';
preFixup = ''
buildPythonPath "$pythonPath"
gappsWrapperArgs+=(
--prefix PYTHONPATH : "$program_PYTHONPATH"
)
makeWrapper ${lib.getExe python3} $out/bin/${pname} \
--add-flags $out/app.py \
--prefix PYTHONPATH : "$program_PYTHONPATH" \
--chdir $out/bin
'';
meta = {
description = "An air quality monitoring service with a Raspberry Pi and a SDS011 sensor. ";
homepage = "https://github.com/rydercalmdown/pi_air_quality_monitor";
mainProgram = pname;
platforms = ["aarch64-linux" "x86_64-linux"];
maintainers = with lib.maintainers; [NotAShelf];
};
}

View file

@ -0,0 +1,30 @@
{
stdenv,
fetchFromGitHub,
...
}:
stdenv.mkDerivation {
pname = "dummy-serial";
version = "0.1.0";
src = fetchFromGitHub {
owner = "notashelf";
repo = "dummy-serial";
rev = "v0.1.0";
hash = "sha256-+zXA5Ko8ikgkmkm1eyx2VMQQjp61osSpq4K+d9WEqq8=";
};
makeFlags = ["TARGET=main"];
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp -rvf main $out/bin/dummy-serial
runHook postInstall
'';
meta = {
description = "Create dummy serial ports through PseudoTTYs";
mainProgram = "dummy-serial";
};
}

View file

@ -1,9 +1,11 @@
{ {
nixosTest, nixosTest,
self, self,
self',
lib,
... ...
}: let }: let
serialPort = "/dev/ttyS0"; serialPort = "/dev/pts/2";
in in
nixosTest { nixosTest {
name = "basic"; name = "basic";
@ -50,24 +52,25 @@ in
testScript = '' testScript = ''
server.start() server.start()
server.wait_for_unit("default.target") server.wait_for_unit("network.target")
log.info("Checking if configured serial port exists") log.info("Checking if configured serial port exists")
server.succeed("ls -lah ${serialPort}") serialPort = server.succeed("${lib.getExe self'.packages.dummy-serial} --quiet")
if any(serialPort):
log.info("Serial port exists!")
else:
log.info("Serial port does not exist")
log.info("Check if unit is running correctly") log.info("Check if unit is running correctly")
server.wait_for_unit("pi-air-quality-monitor.service") server.wait_for_unit("pi-air-quality-monitor.service")
server.succeed("systemctl status pi-air-quality-monitor.service | grep 'Active: active (running)' >&2") server.succeed("systemctl status pi-air-quality-monitor.service | grep 'Active: active (running)'")
server.fail("journalctl -u pi-air-quality-monitor.service | grep 'RuntimeError'") server.fail("journalctl -xeu pi-air-quality-monitor.service | grep 'RuntimeError'")
log.info("Showing units content")
server.succeed("systemctl status pi-air-quality-monitor.service >&2")
server.succeed("systemctl cat pi-air-quality-monitor.service >&2")
log.info("Checking if service is accessible locally") log.info("Checking if service is accessible locally")
server.succeed("nc -vz localhost 8080") server.succeed("curl --fail http://localhost:8080 | grep 'Air'")
client.start() client.start()
client.wait_for_unit("default.target") client.wait_for_unit("network.target")
client.succeed("nc -vz server 8080") client.succeed("nc -vz server 8080")
''; '';
} }

View file

@ -19,7 +19,7 @@
packages.test = self'.checks.basic.driverInteractive; packages.test = self'.checks.basic.driverInteractive;
checks = { checks = {
basic = callPackage ./checks/basic.nix {inherit self;}; basic = callPackage ./checks/basic.nix {inherit self self';};
default = self'.checks.basic; default = self'.checks.basic;
}; };
}; };