mirror of
https://github.com/NotAShelf/air-quality-monitor.git
synced 2024-11-22 13:20:48 +00:00
create dummy serial ports for the systemd service
This commit is contained in:
parent
13feebd493
commit
f13b8bc45d
7 changed files with 118 additions and 21 deletions
|
@ -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": {
|
||||||
|
|
11
flake.nix
11
flake.nix
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
63
nix/packages/air-quality-monitor.nix
Normal file
63
nix/packages/air-quality-monitor.nix
Normal 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];
|
||||||
|
};
|
||||||
|
}
|
30
nix/packages/dummy-serial.nix
Normal file
30
nix/packages/dummy-serial.nix
Normal 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";
|
||||||
|
};
|
||||||
|
}
|
|
@ -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")
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue