diff --git a/hosts/rx4/services/default.nix b/hosts/rx4/services/default.nix index 3814e36..8db7081 100644 --- a/hosts/rx4/services/default.nix +++ b/hosts/rx4/services/default.nix @@ -10,7 +10,6 @@ inputs.clients.nixosModules.syncthing outputs.nixosModules.tailscale - outputs.nixosModules.journald-upload ./forgejo.nix ./jirafeau.nix diff --git a/hosts/sid/services/default.nix b/hosts/sid/services/default.nix index 521af0b..7ca9678 100644 --- a/hosts/sid/services/default.nix +++ b/hosts/sid/services/default.nix @@ -9,7 +9,6 @@ inputs.synix.nixosModules.openssh outputs.nixosModules.tailscale - outputs.nixosModules.journald-remote ./headscale.nix ./mailserver.nix diff --git a/modules/nixos/common/default.nix b/modules/nixos/common/default.nix index eba84dd..075c2dd 100644 --- a/modules/nixos/common/default.nix +++ b/modules/nixos/common/default.nix @@ -2,6 +2,7 @@ { imports = [ + # ./journald.nix # FIXME: start systemd-journal-upload.service after tailscaled ./nix.nix ./overlays.nix diff --git a/modules/nixos/journald-upload/default.nix b/modules/nixos/common/journald.nix similarity index 52% rename from modules/nixos/journald-upload/default.nix rename to modules/nixos/common/journald.nix index 9d8c0c5..d31ada4 100644 --- a/modules/nixos/journald-upload/default.nix +++ b/modules/nixos/common/journald.nix @@ -1,6 +1,6 @@ { services.journald.upload = { enable = true; - settings.Upload.URL = "http://100.64.0.6:19532"; + settings.Upload.URL = "http://100.64.0.5:19532"; }; } diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 2e35096..f831ea8 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -5,8 +5,6 @@ forgejo = import ./forgejo; forgejo-runner = import ./forgejo-runner; gnome = import ./gnome; - journald-remote = import ./journald-remote; - journald-upload = import ./journald-upload; monero = import ./monero; rsshub-oci = import ./rsshub-oci; tailscale = import ./tailscale; diff --git a/modules/nixos/journald-remote/default.nix b/modules/nixos/journald-remote/default.nix deleted file mode 100644 index 17012a6..0000000 --- a/modules/nixos/journald-remote/default.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ - pkgs, - lib, - ... -}: - -let - python = pkgs.python3Packages; - - mcp-log-server = python.buildPythonApplication { - pname = "mcp-log-server"; - version = "1.0.0"; - - src = ./.; - - pyproject = true; - build-system = [ python.setuptools ]; - - propagatedBuildInputs = with python; [ - fastmcp - ]; - - meta.mainProgram = "mcp-log-server"; - }; -in -{ - services.journald.remote = { - enable = true; - listen = "http"; - port = 19532; - settings.Remote.SplitMode = "host"; - }; - - users.users.sid.extraGroups = [ - "systemd-journal" - "systemd-journal-remote" - ]; - - systemd.services.mcp-log-server = { - description = "AI Log Access MCP Server"; - after = [ - "network.target" - "multi-user.target" - "systemd-journald.service" - ]; - wantedBy = [ "multi-user.target" ]; - - script = lib.getExe mcp-log-server; - - serviceConfig = { - User = "root"; - Group = "root"; - Environment = "PYTHONUNBUFFERED=1"; - Restart = "on-failure"; - }; - }; -} diff --git a/modules/nixos/journald-remote/pyproject.toml b/modules/nixos/journald-remote/pyproject.toml deleted file mode 100644 index 809656b..0000000 --- a/modules/nixos/journald-remote/pyproject.toml +++ /dev/null @@ -1,9 +0,0 @@ -[build-system] -requires = ["setuptools"] - -[project] -name = "mcp-log-server" -version = "1.0.0" - -[project.scripts] -mcp-log-server = "server:main" diff --git a/modules/nixos/journald-remote/server.py b/modules/nixos/journald-remote/server.py deleted file mode 100644 index 39c8f28..0000000 --- a/modules/nixos/journald-remote/server.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -import json -import subprocess -from fastmcp import FastMCP - -mcp = FastMCP('ClusterLogQuery') - -@mcp.tool() -async def search_cluster_logs(keyword: str, unit: str = '*', limit: int = 500): - """ - Search centralized systemd logs collected on this server. - - Args: - keyword: The string to search for (e.g. 'oom-kill', 'failed'). - unit: The systemd unit to filter (e.g. 'sshd'). If '*', matches all. - limit: The number of log lines to return (Max 1000). - """ - - limit = min(max(limit, 10), 1000) - - cmd = [ - 'journalctl', - '-n', str(limit), - '-o', 'json', - '--no-pager', - '--directory', '/var/log/journal/remote' - ] - - if unit != '*': - cmd.append(f'UNIT={unit}') - if keyword: - cmd.append(keyword) - - try: - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, _ = proc.communicate() - - logs = [] - for line in stdout.decode('utf-8').strip().split('\n'): - if not line: continue - try: - log = json.loads(line) - logs.append({ - 'timestamp': log.get('TIME_ISO8601'), - 'hostname': log.get('_HOSTNAME'), - 'unit': log.get('_COMM'), - 'message': log.get('MESSAGE') - }) - except: pass - - return json.dumps(logs) - - except Exception as e: - return f'Error querying logs: {str(e)}' - -def main(): - mcp.run(transport='sse', host='0.0.0.0', port=9500) - -if __name__ == '__main__': - main()