diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 976714b..f2a5dc3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,7 @@ on: paths-ignore: - "**/*.md" - "**/*.yml" + - "**/*.sh" workflow_dispatch: jobs: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d10a94b..d53a889 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,11 +17,15 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Zip NixOS Config + run: zip -rj nixos.zip nixos/ + - name: Release uses: softprops/action-gh-release@v2 with: name: PLG-MuDiCS ${{ github.ref_name }} body_path: CHANGELOG.md + files: nixos.zip build: name: Build and Upload Assets diff --git a/nixos/configuration.nix b/nixos/configuration.nix new file mode 100644 index 0000000..01546ca --- /dev/null +++ b/nixos/configuration.nix @@ -0,0 +1,140 @@ +{ + config, + pkgs, + ... +}: { + imports = [ + ./hardware-configuration.nix + ]; + + ## System Config + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + networking.networkmanager.enable = true; + + nix.settings.experimental-features = ["nix-command" "flakes"]; + + time.timeZone = "Europe/Berlin"; + + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_DE.UTF-8"; + LC_IDENTIFICATION = "de_DE.UTF-8"; + LC_MEASUREMENT = "de_DE.UTF-8"; + LC_MONETARY = "de_DE.UTF-8"; + LC_NAME = "de_DE.UTF-8"; + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TELEPHONE = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + + services.xserver.enable = true; + + services.xserver.displayManager.lightdm.enable = true; + services.xserver.desktopManager.xfce.enable = true; + + services.xserver.xkb = { + layout = "de"; + variant = ""; + }; + + console.keyMap = "de"; + + services.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + users.users.mudics = { + isNormalUser = true; + description = "mudics"; + extraGroups = ["networkmanager" "wheel"]; + }; + + nixpkgs.config.allowUnfree = true; + + system.stateVersion = "25.05"; # Don't change + + ## User Config + + programs.nix-ld = { + enable = true; + libraries = with pkgs; [ + stdenv.cc.cc + zlib + ]; + }; + + services.displayManager.autoLogin = { + enable = true; + user = "mudics"; + }; + + networking.hostName = "plg-mudics"; + + environment.systemPackages = with pkgs; [ + # Programs + libreoffice + #rustdesk + ungoogled-chromium + xfce.thunar-archive-plugin + git + nushell + + # Libraries + imagemagick + ffmpeg + ghostscript + ]; + + systemd.services.update-mudics = { + wantedBy = ["multi-user.target"]; + after = ["network-online.target"]; + wants = ["network-online.target"]; + path = with pkgs; [nushell unzip]; + script = "nu ${./update.sh}"; + serviceConfig = { + WorkingDirectory = "/home/mudics/plg-mudics"; + User = "mudics"; + Type = "oneshot"; + }; + }; + + systemd.services.run-mudics = { + wantedBy = ["default.target"]; + after = ["update-mudics.service" "graphical.target"]; + wants = ["graphical.target"]; + path = with pkgs; [ungoogled-chromium]; + script = "./plg-mudics-display"; + serviceConfig = { + WorkingDirectory = "/home/mudics/plg-mudics"; + User = "mudics"; + Type = "simple"; + }; + environment = { + DISPLAY = ":0"; + XDG_RUNTIME_DIR = "/run/user/1000"; + }; + }; + + systemd.services.build-mudics-system = { + wantedBy = ["default.target"]; + after = ["update-mudics.service"]; + path = with pkgs; [nixos-rebuild]; + script = "nixos-rebuild boot --flake .#plg-mudics"; + serviceConfig = { + WorkingDirectory = "/home/mudics/plg-mudics/nixos"; + }; + }; + + systemd.tmpfiles.rules = [ + "d /home/mudics/plg-mudics 0755 mudics - -" + ]; +} diff --git a/nixos/flake.lock b/nixos/flake.lock new file mode 100644 index 0000000..c3856f0 --- /dev/null +++ b/nixos/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1761999846, + "narHash": "sha256-IYlYnp4O4dzEpL77BD/lj5NnJy2J8qbHkNSFiPBCbqo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3de8f8d73e35724bf9abef41f1bdbedda1e14a31", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nixos/flake.nix b/nixos/flake.nix new file mode 100644 index 0000000..c4ebea9 --- /dev/null +++ b/nixos/flake.nix @@ -0,0 +1,21 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + }; + + outputs = { + self, + nixpkgs, + ... + } @ inputs: { + nixosConfigurations.plg-mudics = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = { + inherit inputs; + }; + modules = [ + ./configuration.nix + ]; + }; + }; +} diff --git a/nixos/update.sh b/nixos/update.sh new file mode 100644 index 0000000..5004313 --- /dev/null +++ b/nixos/update.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env nu + +print "Checking for new version of PLG-MuDiCS ..." +if (new_version_available) { + print "New version available. Trying to update ..." + + get_new_display_file + get_new_nixos_config +} + +print "Done" + +def get_new_nixos_config [] { + let temp_folder_path = (mktemp -d "nixos-temp-XXXXXX") + let temp_file_path = (mktemp "nixos-temp-XXXXXX") + let nixos_config_path = "nixos" + + http get https://github.com/PLG-Development/PLG-MuDiCS/releases/latest/download/nixos.zip --max-time 5sec | save -p -f $temp_file_path + + unzip $temp_file_path -d $temp_folder_path + rm -rf $nixos_config_path + mv $temp_folder_path $nixos_config_path + + rm $temp_file_path + + cp /etc/nixos/hardware-configuration.nix $"($nixos_config_path)/hardware-configuration.nix" +} + +def get_new_display_file [] { + let temp_file_path = (mktemp "display-temp-XXXXXX") + + http get https://github.com/PLG-Development/PLG-MuDiCS/releases/latest/download/plg-mudics-display --max-time 5sec | save -p -f $temp_file_path + + chmod +x $temp_file_path + mv $temp_file_path plg-mudics-display +} + +def new_version_available [] { + let file_path = "version.json" + if not ($file_path | path exists) { + { "version": ""} | to json | save version.json + } + + let current_version = open $file_path | get version + + let new_version = http get https://api.github.com/repos/PLG-Development/PLG-MuDiCS/releases/latest --max-time 5sec | get tag_name + # TODO: only write when all operations were successful + { "version": $new_version} | to json | save version.json -f + + if $current_version == $new_version { + false + } else { + true + } +} \ No newline at end of file