| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- {
- inputs = {
- nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable;
- flake-utils.url = github:numtide/flake-utils;
- drawio2py.url = git+ssh://git@msdl.uantwerpen.be/jexelmans/drawio2py.git?ref=library;
- xopp2py.url = git+ssh://git@msdl.uantwerpen.be/jexelmans/xopp2py.git;
- drawio.url = git+ssh://git@msdl.uantwerpen.be/jexelmans/drawio.git;
- wee.url = git+ssh://git@msdl.uantwerpen.be/lucasalbertins/wee.git;
- };
- outputs = { self, nixpkgs, flake-utils, drawio2py, xopp2py, drawio, wee }:
- flake-utils.lib.eachDefaultSystem (system:
- let
- pkgs = nixpkgs.legacyPackages.${system};
- myLibs = {
- drawio2py = drawio2py.defaultPackage.${system};
- xopp2py = xopp2py.defaultPackage.${system};
- };
- in rec {
- packages = rec {
- # Python library
- drawio2oml =
- let
- drawioWebRoot = drawio.packages.${system}.webRoot;
- in
- pkgs.python3Packages.buildPythonPackage {
- pname = "drawio2oml";
- version = "1.0.0";
- src = ./.; # location of setup.py
- propagatedBuildInputs = [
- myLibs.drawio2py
- pkgs.python3Packages.jinja2
- pkgs.python3Packages.requests
- ];
- checkPhase = ''
- runHook preCheck
- DRAWIOSHAPELIBS="${drawioWebRoot}/share/myPlugins/shape_libs" ${pkgs.python3}/bin/python -m unittest test.run_tests
- runHook postCheck
- '';
- };
- # The backend script - to be called with PROJECTDIR argument
- backend =
- let
- # By default, gradle depends on 'full java'. For our purposes, this is not necessary:
- gradleHeadless = pkgs.gradle.override { java=pkgs.jdk19_headless; };
- in
- pkgs.python3Packages.buildPythonApplication {
- pname = "dtdesign-backend";
- version = "1.0.0";
- src = ./backend; # location of setup.py
- # The backend scripts needs the gradle binary in its PATH:
- makeWrapperArgs = [ "--set PATH \\$PATH:${gradleHeadless}/bin/" ];
- propagatedBuildInputs = [
- myLibs.drawio2py
- myLibs.xopp2py
- drawio2oml
- pkgs.python3Packages.flask
- pkgs.python3Packages.flask-cors
- ];
- };
- # Service monitor - PROJECTDIR needs to be passed as environment variable
- # Runs 4 services:
- # - Fuseki
- # - Lighttpd
- # - backend script (defined above)
- # - Workflow Enactment Engine (Wee™)
- serviceMonitor =
- let
- # Build the latest Fuseki version, and tell it to use headless Java:
- fusekiHeadless = (import ./backend/fuseki.nix) { pkgs=pkgs; java=pkgs.jdk19_headless; };
- drawioStaticServer = drawio.packages.${system}.staticServer;
- weeServer = wee.packages.${system}.wee;
- commonSettings = ''
- stdout_logfile=/dev/stdout
- stdout_logfile_maxbytes=0
- redirect_stderr=true
- startretries=1
- killasgroup=true
- '';
- supervisordConfigFile = pkgs.writeTextFile {
- name = "supervisord.conf";
- text = ''
- [supervisord]
- nodaemon=true
- logfile_maxbytes=0
- [program:fuseki]
- directory=%(ENV_PROJECTDIR)s/.fuseki
- command=${fusekiHeadless}/bin/fuseki run
- environment=FUSEKI_BASE="%(ENV_PROJECTDIR)s/.fuseki/run",PATH="${pkgs.which}/bin:${pkgs.coreutils}/bin:%(ENV_PATH)s",FUSEKI_CONF="%(ENV_PROJECTDIR)s/.fuseki.ttl"
- ${commonSettings}
- [program:lighttpd]
- command=${drawioStaticServer}/bin/drawio-msdl-staticserver
- ${commonSettings}
- [program:backend]
- command=${backend}/bin/dtdesign-backend %(ENV_PROJECTDIR)s
- ${commonSettings}
- [program:wee]
- command=${weeServer}/bin/wee
- ${commonSettings}
- '';
- };
- runner = pkgs.writeShellScript "dtdesign_service_monitor.sh" ''
- if [[ -z "''${PROJECTDIR}" ]]; then
- echo "Error: Please set the environment variable PROJECTDIR to the 'SystemDesignOntology2Layers' directory."
- exit 1
- fi
- exec ${pkgs.python3Packages.supervisor}/bin/supervisord -c ${supervisordConfigFile}
- '';
- in
- pkgs.stdenv.mkDerivation {
- name = "dtdesign-service-monitor";
- src = ./.;
- installPhase = ''
- mkdir -p $out/bin
- cp ${runner} $out/bin/serviceMonitor
- '';
- };
- # Docker container - no dependencies (contains its own PROJECTDIR clone)
- dockerContainer =
- let
- dtdesignRepo = builtins.fetchGit {
- url = "git@msdl.uantwerpen.be:lucasalbertins/DTDesign.git";
- rev = "795cb854077d82fa6370ad64b8b6f06530e11bbc";
- ref = "main";
- shallow = true;
- };
- in pkgs.dockerTools.buildImage {
- name = "dtdesign-backend";
- runAsRoot = ''
- #!${pkgs.runtimeShell}
- mkdir /tmp
- cp -r ${dtdesignRepo}/examples/oml/SystemDesignOntology2Layers /projectdir
- '';
- config = {
- Env = [ "PROJECTDIR=/projectdir" ]; # tell the script where the projectdir is at.
- Cmd = [ "${serviceMonitor}" ]; # ran when container starts
- ExposedPorts = {
- "5000/tcp" = {}; # python backend
- "3030/tcp" = {}; # fuseki
- "8700/tcp" = {}; # lightttp (serving drawio)
- };
- Volumes = {
- "/projectdir" = {}; # path to persist as Docker 'Volume'
- };
- };
- };
- };
- defaultPackage = packages.drawio2oml;
- apps = rec {
- # App that starts when invoking `nix run .#serviceMonitor`
- serviceMonitor = {
- type = "app";
- program = "${self.packages.${system}.serviceMonitor}/bin/serviceMonitor";
- };
- # App that starts when invoking `nix run .`
- default = serviceMonitor;
- };
- });
- nixConfig.bash-prompt-prefix = "\\e\[94;1m[drawio2oml]\\e\[m ";
- }
|