Code change:
Cockpit is a server manager that makes it easy to administer your GNU/Linux servers via a web browser. Website: http://cockpit- Upstream: License: LGPL2.1 Arch Linux package: !
Could be a lot of effort to port: ... I have not looked at the code how many assumption it makes about the system, but in terms of system configuration nixos is a special snow flake.
Probably only a subset will work. But I think there is some stuff in cockpit that is helpful even on NixOS: View journald logs and systemd services Manage virtual machines via libvirt Get a shell terminal from the Web UI Some general system information like disk usage etc. It's mostly read only stuff but I'm not sure how easy it is to only use parts of cockpit that would work.
+1, would love to have this
Given that NixOS is pitched as a server os first, this would be very helpful. I already tried to but got stuck because it requires a few npm packages
try with
Thank you for your contributions. This has been automatically marked as stale because it has had no activity for 180 days. If this is still important to you, we ask that you leave a comment below. Your comment can be as simple as "still important to me". This lets people see that at least one person still cares about this. Someone will have to do this at most twice a year if there is no other activity. Here are suggestions that might help resolve this more quickly: for maintainers and people that previously touched the related code and @ mention them in a comment. on the . 3. Ask on the on .
I still think it would be good to have this in NixOS.
Well as pointed out, there will be quite a lot of patching up paths to do, as well as the NPM packages that need installing (try yarn2nix or npm2nix for that) Seeing as it's non-trivial, it will have to be packaged by someone with real interest in getting it, and we can assist (make a draft PR and tag us on questions)
node is only required for the dev environment I have made packaging cockpit, it still fails to compile tho Any help would be greatly appreciated
building build flags: SHELL=/nix/store/5hplxs3kprdp6v62qk3di6a1m1s1paiq-bash-4.4-p23/bin/bash GEN src/ws/mock-dbus-tests.h Traceback (most recent call last): File "/nix/store/5zajbm8674d93nix4h8b0hxgglj2pbir-glib-2.64.3-dev/bin/gdbus-codegen", line 53, in <modulefrom codegen import codegenmain File "/nix/store/5zajbm8674d93nix4h8b0hxgglj2pbir-glib-2.64.3-dev/share/glib-", line 24, in <moduleimport argparse File "/nix/store/jli50q24fvik6pfsnjs1jd90g3dy4p6y-python3-", line 88, in <moduleimport re as _re File "/nix/store/jli50q24fvik6pfsnjs1jd90g3dy4p6y-python3-", line 145, in <moduleclass RegexFlag(enum.IntFlag): AttributeError: module 'enum' has no attribute 'IntFlag' make: * [Makefile:: src/ws/mock-dbus-tests.h] Error 1 error: --- Error
----------- nix-build error: --- Error --- nix-daemon builder for '/nix/store/mdiihwskfp862y17wp70skdy74kh33v5-cockpit-' failed with exit code 2; last 10 log lines: File "/nix/store/5zajbm8674d93nix4h8b0hxgglj2pbir-glib-2.64.3-dev/bin/gdbus-codegen", line 53, in <modulefrom codegen import codegenmain File "/nix/store/5zajbm8674d93nix4h8b0hxgglj2pbir-glib-2.64.3-dev/share/glib-", line 24, in <moduleimport argparse File "/nix/store/jli50q24fvik6pfsnjs1jd90g3dy4p6y-python3-", line 88, in <moduleimport re as _re File "/nix/store/jli50q24fvik6pfsnjs1jd90g3dy4p6y-python3-", line 145, in <moduleclass RegexFlag(enum.IntFlag): AttributeError: module 'enum' has no attribute 'IntFlag' make: * [Makefile:: src/ws/mock-dbus-tests.h] Error 1 Seems like an error in the package itself.
The enum thing is due to a stray enum34 dependency in - enum34 is a backport of the enum module, and breaks things if it's installed on Python = 3.4. You'll need to look at why pyscss is pulling in enum34 - it's not immediately obvious to me from pyscss's , it looks correct. A pthread link error happens if that's fixed or if Python is removed from the deps entirely. That pthread link error is, I believe, a problem with the Cockpit makefiles; I made to fix it. With that change applied, I get I don't know anything about the Javascript packaging, so no idea how to progress from here. Good luck!
It compiles but gets stuck writing it's systemd.service files. I don't have much experience packaging applications which hook into systemd
How’s the effort? :crossedfingers: :crossedfingers: :crossed_fingers:
If this gonna work I could start replacing my with
I have updated nix to solve the issue of beside updating the version and it built successfully
I built the derivation posted by by including in my . It built successfully, producing . The output includes many things for like systemd units that do not get installed on the system - I'm wondering if these should be symlinked in as-is, or do they need to be converted to Nix? Most systemd units look OK but will need a fix to replace a reference to :
If is changed to (in patch below), and is to , the units get installed but are not enabled. The package also has references to and , please let me know if you know how best to patch these: I patched the reference to , and replaced with just due to build warning. Here's what I have, building entirely on what others have contributed to this thread:
I considered running the docker container, but it requires and proceeds to modify the host's PAM config. Not something I personally like to see in a docker container... Back to the Nixpkgs. I was able to use so that has references to coreutils programs and patched the certificate paths to be . was because of patches to . Right now it fails running with SIGSEGV. I thought it might be systemd's setting, but it does the same outside invocation by systemd. I tried building newer versions of cockpit, but I kept running into There are some notes that might be helpful. Here's the latest packaging attempt: Even though I've posted like 4 times in a row, I think I'm done trying to do this. I hope someone else can pick up the effort.
I was able to get past this by changing the interpreter in from to . Note that, for some reason, doesn't work. You also have to run , because Nix resets its date and that breaks the "is packages- newer than " check. I also had to replace with in . What's odd is that all of the scripts run correctly when run from . When this is done, will just error with "Cannot find module stdio".
Spent some time learning nix by giving this a shot and actually ended up getting things to start. A lot of things are not working, but some might be possible to fix. For anyone interested I have left things here:
Another take on it Tested features: Logs Virtual Machines (cockpit-machines module, only managing works, creation of new VMs doesn't work) Services Terminal Code:
Tried to create a virtual machine, no luck, OS list is empty. Cannot create VM without choosing the operating system. I tried to fix it but I got the following error: !
I came across this discussion in the upstream project and figured it might be helpful to cross-reference:
You require libosinfo, and osinfo-db
I would to keep working on this issue, any hints you got for me would be welcomed. I do see any errors in my log
I am also working on this Here is what I have so far: It's building only. I was able to solve some documentation build bugs.
:eyes: !

Related discussion:
text: <ins> { pkgs, config, lib, ... }: let cfg = config.services.cockpit; inherit (lib) types mkEnableOption mkOption mkIf mdDoc literalMD mkPackageOptionMD; settingsFormat = pkgs.formats.ini {}; in { options = { services.cockpit = { enable = mkEnableOption (mdDoc "Cockpit"); package = mkPackageOptionMD pkgs "Cockpit" { default = [ "cockpit" ]; }; settings = lib.mkOption { type = settingsFormat.type; default = {}; description = mdDoc '' Settings for cockpit that will be saved in /etc/cockpit/cockpit.conf. See the [documentation](https://cockpit-project.org/guide/latest/cockpit.conf.5.html), that is also available with `man cockpit.conf.5` for details. ''; }; port = mkOption { description = mdDoc "Port where cockpit will listen."; type = types.port; default = 9090; }; openFirewall = mkOption { description = mdDoc "Open port for cockpit."; type = types.bool; default = false; }; }; }; config = mkIf cfg.enable { # expose cockpit-bridge system-wide environment.systemPackages = [ cfg.package ]; # allow cockpit to find its plugins environment.pathsToLink = [ "/share/cockpit" ]; # generate cockpit settings environment.etc."cockpit/cockpit.conf".source = settingsFormat.generate "cockpit.conf" cfg.settings; security.pam.services.cockpit = {}; networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.port ]; # units are in reverse sort order if you ls $out/lib/systemd/system # all these units are basically verbatim translated from upstream # Translation from $out/lib/systemd/system/systemd-cockpithttps.slice systemd.slices.system-cockpithttps = { description = "Resource limits for all cockpit-ws-https@.service instances"; sliceConfig = { TasksMax = 200; MemoryHigh = "75%"; MemoryMax = "90%"; }; }; # Translation from $out/lib/systemd/system/cockpit-wsinstance-https@.socket systemd.sockets."cockpit-wsinstance-https@" = { unitConfig = { Description = "Socket for Cockpit Web Service https instance %I"; BindsTo = [ "cockpit.service" "cockpit-wsinstance-https@%i.service" ]; # clean up the socket after the service exits, to prevent fd leak # this also effectively prevents a DoS by starting arbitrarily many sockets, as # the services are resource-limited by system-cockpithttps.slice Documentation = "man:cockpit-ws(8)"; }; socketConfig = { ListenStream = "/run/cockpit/wsinstance/https@%i.sock"; SocketUser = "root"; SocketMode = "0600"; }; }; # Translation from $out/lib/systemd/system/cockpit-wsinstance-https@.service systemd.services."cockpit-wsinstance-https@" = { description = "Cockpit Web Service https instance %I"; bindsTo = [ "cockpit.service"]; path = [ cfg.package ]; documentation = [ "man:cockpit-ws(8)" ]; serviceConfig = { Slice = "system-cockpithttps.slice"; ExecStart = "${cfg.package}/libexec/cockpit-ws --for-tls-proxy --port=0"; User = "root"; Group = ""; }; }; # Translation from $out/lib/systemd/system/cockpit-wsinstance-http.socket systemd.sockets.cockpit-wsinstance-http = { unitConfig = { Description = "Socket for Cockpit Web Service http instance"; BindsTo = "cockpit.service"; Documentation = "man:cockpit-ws(8)"; }; socketConfig = { ListenStream = "/run/cockpit/wsinstance/http.sock"; SocketUser = "root"; SocketMode = "0600"; }; }; # Translation from $out/lib/systemd/system/cockpit-wsinstance-https-factory.socket systemd.sockets.cockpit-wsinstance-https-factory = { unitConfig = { Description = "Socket for Cockpit Web Service https instance factory"; BindsTo = "cockpit.service"; Documentation = "man:cockpit-ws(8)"; }; socketConfig = { ListenStream = "/run/cockpit/wsinstance/https-factory.sock"; Accept = true; SocketUser = "root"; SocketMode = "0600"; }; }; # Translation from $out/lib/systemd/system/cockpit-wsinstance-https-factory@.service systemd.services."cockpit-wsinstance-https-factory@" = { description = "Cockpit Web Service https instance factory"; documentation = [ "man:cockpit-ws(8)" ]; path = [ cfg.package ]; serviceConfig = { ExecStart = "${cfg.package}/libexec/cockpit-wsinstance-factory"; User = "root"; }; }; # Translation from $out/lib/systemd/system/cockpit-wsinstance-http.service systemd.services."cockpit-wsinstance-http" = { description = "Cockpit Web Service http instance"; bindsTo = [ "cockpit.service" ]; path = [ cfg.package ]; documentation = [ "man:cockpit-ws(8)" ]; serviceConfig = { ExecStart = "${cfg.package}/libexec/cockpit-ws --no-tls --port=0"; User = "root"; Group = ""; }; }; # Translation from $out/lib/systemd/system/cockpit.socket systemd.sockets."cockpit" = { unitConfig = { Description = "Cockpit Web Service Socket"; Documentation = "man:cockpit-ws(8)"; Wants = "cockpit-motd.service"; }; socketConfig = { ListenStream = cfg.port; ExecStartPost = [ "-${cfg.package}/share/cockpit/motd/update-motd "" localhost" "-${pkgs.coreutils}/bin/ln -snf active.motd /run/cockpit/motd" ]; ExecStopPost = "-${pkgs.coreutils}/bin/ln -snf inactive.motd /run/cockpit/motd"; }; wantedBy = [ "sockets.target" ]; }; # Translation from $out/lib/systemd/system/cockpit.service systemd.services."cockpit" = { description = "Cockpit Web Service"; documentation = [ "man:cockpit-ws(8)" ]; restartIfChanged = true; path = with pkgs; [ coreutils cfg.package ]; requires = [ "cockpit.socket" "cockpit-wsinstance-http.socket" "cockpit-wsinstance-https-factory.socket" ]; after = [ "cockpit-wsinstance-http.socket" "cockpit-wsinstance-https-factory.socket" ]; environment = { G_MESSAGES_DEBUG = "cockpit-ws,cockpit-bridge"; }; serviceConfig = { RuntimeDirectory="cockpit/tls"; ExecStartPre = [ # cockpit-tls runs in a more constrained environment, these + means that these commands # will run with full privilege instead of inside that constrained environment # See https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart= for details "+${cfg.package}/libexec/cockpit-certificate-ensure --for-cockpit-tls" ]; ExecStart = "${cfg.package}/libexec/cockpit-tls"; User = "root"; Group = ""; NoNewPrivileges = true; ProtectSystem = "strict"; ProtectHome = true; PrivateTmp = true; PrivateDevices = true; ProtectKernelTunables = true; RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ]; MemoryDenyWriteExecute = true; }; }; # Translation from $out/lib/systemd/system/cockpit-motd.service # This part basically implements a motd state machine: # - If cockpit.socket is enabled then /run/cockpit/motd points to /run/cockpit/active.motd # - If cockpit.socket is disabled then /run/cockpit/motd points to /run/cockpit/inactive.motd # - As cockpit.socket is disabled by default, /run/cockpit/motd points to /run/cockpit/inactive.motd # /run/cockpit/active.motd is generated dynamically by cockpit-motd.service systemd.services."cockpit-motd" = { path = with pkgs; [ nettools ]; serviceConfig = { Type = "oneshot"; ExecStart = "${cfg.package}/share/cockpit/motd/update-motd"; }; description = "Cockpit motd updater service"; documentation = [ "man:cockpit-ws(8)" ]; wants = [ "network.target" ]; after = [ "network.target" "cockpit.socket" ]; }; systemd.tmpfiles.rules = [ # From $out/lib/tmpfiles.d/cockpit-tmpfiles.conf "C /run/cockpit/inactive.motd 0640 root root - ${cfg.package}/share/cockpit/motd/inactive.motd" "f /run/cockpit/active.motd   0640 root root -" "L+ /run/cockpit/motd - - - - inactive.motd" "d /etc/cockpit/ws-certs.d 0600 root root 0" ]; }; meta.maintainers = pkgs.cockpit.meta.maintainers; } </ins>