diff --git a/.gitea/workflows/disk_report.yaml b/.gitea/workflows/disk_report.yaml new file mode 100644 index 0000000..ec66806 --- /dev/null +++ b/.gitea/workflows/disk_report.yaml @@ -0,0 +1,30 @@ +name: Disk Report Image +run-name: Build and Push the Disk Report Application Image +on: + push: + paths: + - disk_report.py + - .gitea/workflows/disk_report.yaml + schedule: + - cron: '@daily' +jobs: + build-and-push-ddns: + runs-on: ubuntu-latest + if: gitea.ref == 'refs/heads/main' + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Login to Gitea Registry + uses: docker/login-action@v2 + with: + registry: gitea.reeseapps.com + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_PASSWORD }} + - name: Build and push Docker image + uses: https://github.com/docker/build-push-action@v5 + with: + context: ${{ gitea.workspace }} + file: ${{ gitea.workspace }}/disk_report.Containerfile + push: true + tags: "gitea.reeseapps.com/services/disk_report:latest,gitea.reeseapps.com/services/disk_report:${{gitea.sha}}" + no-cache: true diff --git a/.python-version b/.python-version index c8cfe39..6324d40 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.10 +3.14 diff --git a/README.md b/README.md index 28917d5..6233892 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,21 @@ # LLM Server Monitor -## summarize.sh +## Disk Report + +### Run with UV + +Make sure you have python uv installed. ```bash -python post_llama.py --message "summarize this document" ./example.txt +btrfs filesystem usage /btrfs/pool0 | grep 'Overall:' -A 12 > /tmp/input.txt +uv run disk_report.py --message "summarize this document" /tmp/input.txt +``` + +### Run with container + +```bash +btrfs filesystem usage /btrfs/pool0 | grep 'Overall:' -A 12 > /tmp/input.txt +podman run -it --rm -v /tmp/input.txt:/input/input.txt:z gitea.reeseapps.com/services/disk_report:latest ``` ## Prompts diff --git a/disk_report.Containerfile b/disk_report.Containerfile new file mode 100644 index 0000000..12a6aab --- /dev/null +++ b/disk_report.Containerfile @@ -0,0 +1,14 @@ +FROM ghcr.io/astral-sh/uv:alpine3.22 + +# Copy the project into the image +COPY . /app +COPY example.txt /input/input.txt + +# Disable development dependencies +ENV UV_NO_DEV=1 + +# Sync the project into a new environment, asserting the lockfile is up to date +WORKDIR /app +RUN uv sync --locked + +CMD ["uv", "run", "post_llama.py", "/input/input.txt"] \ No newline at end of file diff --git a/post_llama.py b/disk_report.py similarity index 88% rename from post_llama.py rename to disk_report.py index b5acf0e..ba085fb 100755 --- a/post_llama.py +++ b/disk_report.py @@ -92,7 +92,13 @@ def main() -> None: parser.add_argument( "-m", "--message", - default="Please analyse the attached file.", + default=""" + You are an expert BTRFS system administrator. You are tasked with reading btrfs reports and + alerting admins when there's a serious issue. Attached is a btrfs summary. If everything looks + good reply with a short message saying as such. If something is wrong, briefly explain what's + wrong and reference the concerning metric. Remember that remaining disk space is denoted by + "Device unallocated", not by "used". High used percentages in Data and Metadata (>90%) are expected and normal. + """, help="User message to send alongside the file.", ) parser.add_argument( @@ -139,7 +145,7 @@ def main() -> None: # ------------------------------------------------------------------ try: json_resp = resp.json() - print(json.dumps(json_resp["choices"][0]["message"]["content"], indent=2, ensure_ascii=False)) + print(json_resp["choices"][0]["message"]["content"]) except ValueError: # Not JSON – just dump raw text print(resp.text) diff --git a/example.txt b/example.txt index 1f4690e..3fe3732 100644 --- a/example.txt +++ b/example.txt @@ -1,114 +1,80 @@ Pool 0 -Overall: - Device size: 34.57TiB - Device allocated: 22.82TiB - Device unallocated: 11.75TiB - Device missing: 0.00B - Device slack: 0.00B - Used: 22.75TiB - Free (estimated): 5.90TiB (min: 5.90TiB) - Free (statfs, df): 4.97TiB - Data ratio: 2.00 - Metadata ratio: 2.00 - Global reserve: 512.00MiB (used: 0.00B) - Multiple profiles: no - -Data,RAID1: Size:11.38TiB, Used:11.35TiB (99.74%) - /dev/dm-10 5.43TiB - /dev/dm-15 3.62TiB - /dev/dm-9 7.00TiB - /dev/dm-5 286.00GiB - /dev/dm-6 284.00GiB - /dev/dm-8 3.88TiB - /dev/dm-4 2.27TiB - -Metadata,RAID1: Size:27.00GiB, Used:21.15GiB (78.34%) - /dev/dm-10 15.00GiB - /dev/dm-15 10.00GiB - /dev/dm-9 12.00GiB - /dev/dm-8 8.00GiB - /dev/dm-4 9.00GiB - -System,RAID1: Size:32.00MiB, Used:1.61MiB (5.03%) - /dev/dm-8 32.00MiB - /dev/dm-4 32.00MiB - -Unallocated: - /dev/dm-10 1.83TiB - /dev/dm-15 1.83TiB - /dev/dm-9 2.08TiB - /dev/dm-5 1.54TiB - /dev/dm-6 1.54TiB - /dev/dm-8 1.57TiB - /dev/dm-4 1.36TiB +[/dev/mapper/luks-pool0-5dbed936-760e-487e-911a-a5f0239aa2ad].write_io_errs 0 +[/dev/mapper/luks-pool0-5dbed936-760e-487e-911a-a5f0239aa2ad].read_io_errs 0 +[/dev/mapper/luks-pool0-5dbed936-760e-487e-911a-a5f0239aa2ad].flush_io_errs 0 +[/dev/mapper/luks-pool0-5dbed936-760e-487e-911a-a5f0239aa2ad].corruption_errs 0 +[/dev/mapper/luks-pool0-5dbed936-760e-487e-911a-a5f0239aa2ad].generation_errs 0 +[/dev/mapper/luks-pool0-e0bdc76d-d4c6-4273-8ac5-21bbc768134c].write_io_errs 0 +[/dev/mapper/luks-pool0-e0bdc76d-d4c6-4273-8ac5-21bbc768134c].read_io_errs 0 +[/dev/mapper/luks-pool0-e0bdc76d-d4c6-4273-8ac5-21bbc768134c].flush_io_errs 0 +[/dev/mapper/luks-pool0-e0bdc76d-d4c6-4273-8ac5-21bbc768134c].corruption_errs 0 +[/dev/mapper/luks-pool0-e0bdc76d-d4c6-4273-8ac5-21bbc768134c].generation_errs 0 +[/dev/mapper/luks-pool0-193fa31b-5399-41ab-90dc-495143b4a5f1].write_io_errs 0 +[/dev/mapper/luks-pool0-193fa31b-5399-41ab-90dc-495143b4a5f1].read_io_errs 0 +[/dev/mapper/luks-pool0-193fa31b-5399-41ab-90dc-495143b4a5f1].flush_io_errs 0 +[/dev/mapper/luks-pool0-193fa31b-5399-41ab-90dc-495143b4a5f1].corruption_errs 0 +[/dev/mapper/luks-pool0-193fa31b-5399-41ab-90dc-495143b4a5f1].generation_errs 0 +[/dev/mapper/luks-pool0-2781f419-ce60-4d5c-b584-147865a991a9].write_io_errs 0 +[/dev/mapper/luks-pool0-2781f419-ce60-4d5c-b584-147865a991a9].read_io_errs 0 +[/dev/mapper/luks-pool0-2781f419-ce60-4d5c-b584-147865a991a9].flush_io_errs 0 +[/dev/mapper/luks-pool0-2781f419-ce60-4d5c-b584-147865a991a9].corruption_errs 0 +[/dev/mapper/luks-pool0-2781f419-ce60-4d5c-b584-147865a991a9].generation_errs 0 +[/dev/mapper/luks-pool0-1c9a755a-2a81-4a2f-9bd7-6b6d7caaa523].write_io_errs 0 +[/dev/mapper/luks-pool0-1c9a755a-2a81-4a2f-9bd7-6b6d7caaa523].read_io_errs 0 +[/dev/mapper/luks-pool0-1c9a755a-2a81-4a2f-9bd7-6b6d7caaa523].flush_io_errs 0 +[/dev/mapper/luks-pool0-1c9a755a-2a81-4a2f-9bd7-6b6d7caaa523].corruption_errs 0 +[/dev/mapper/luks-pool0-1c9a755a-2a81-4a2f-9bd7-6b6d7caaa523].generation_errs 0 +[/dev/mapper/luks-pool0-0ccc4298-d949-4c58-bd19-804f06d18e8a].write_io_errs 0 +[/dev/mapper/luks-pool0-0ccc4298-d949-4c58-bd19-804f06d18e8a].read_io_errs 0 +[/dev/mapper/luks-pool0-0ccc4298-d949-4c58-bd19-804f06d18e8a].flush_io_errs 0 +[/dev/mapper/luks-pool0-0ccc4298-d949-4c58-bd19-804f06d18e8a].corruption_errs 0 +[/dev/mapper/luks-pool0-0ccc4298-d949-4c58-bd19-804f06d18e8a].generation_errs 0 +[/dev/mapper/luks-pool0-058dd176-2958-4c99-a7e6-4cc3b0ed7875].write_io_errs 0 +[/dev/mapper/luks-pool0-058dd176-2958-4c99-a7e6-4cc3b0ed7875].read_io_errs 0 +[/dev/mapper/luks-pool0-058dd176-2958-4c99-a7e6-4cc3b0ed7875].flush_io_errs 0 +[/dev/mapper/luks-pool0-058dd176-2958-4c99-a7e6-4cc3b0ed7875].corruption_errs 0 +[/dev/mapper/luks-pool0-058dd176-2958-4c99-a7e6-4cc3b0ed7875].generation_errs 0 Pool 1 -Overall: - Device size: 7.28TiB - Device allocated: 722.02GiB - Device unallocated: 6.57TiB - Device missing: 0.00B - Device slack: 0.00B - Used: 692.25GiB - Free (estimated): 3.30TiB (min: 3.30TiB) - Free (statfs, df): 2.56TiB - Data ratio: 2.00 - Metadata ratio: 2.00 - Global reserve: 512.00MiB (used: 0.00B) - Multiple profiles: no - -Data,RAID1: Size:357.00GiB, Used:343.92GiB (96.34%) - /dev/dm-2 60.00GiB - /dev/dm-14 60.00GiB - /dev/dm-13 60.00GiB - /dev/dm-1 60.00GiB - /dev/dm-12 357.00GiB - /dev/dm-7 59.00GiB - /dev/dm-3 58.00GiB - -Metadata,RAID1: Size:4.00GiB, Used:2.21GiB (55.25%) - /dev/dm-2 1.00GiB - /dev/dm-14 1.00GiB - /dev/dm-12 3.00GiB - /dev/dm-7 1.00GiB - /dev/dm-3 2.00GiB - -System,RAID1: Size:8.00MiB, Used:80.00KiB (0.98%) - /dev/dm-7 8.00MiB - /dev/dm-3 8.00MiB - -Unallocated: - /dev/dm-2 870.50GiB - /dev/dm-14 870.50GiB - /dev/dm-13 871.50GiB - /dev/dm-1 871.50GiB - /dev/dm-12 1.47TiB - /dev/dm-7 871.49GiB - /dev/dm-3 871.49GiB +[/dev/mapper/luks-pool1-e81bbc30-30e8-4deb-a0bf-b475cc157e54].write_io_errs 0 +[/dev/mapper/luks-pool1-e81bbc30-30e8-4deb-a0bf-b475cc157e54].read_io_errs 0 +[/dev/mapper/luks-pool1-e81bbc30-30e8-4deb-a0bf-b475cc157e54].flush_io_errs 0 +[/dev/mapper/luks-pool1-e81bbc30-30e8-4deb-a0bf-b475cc157e54].corruption_errs 0 +[/dev/mapper/luks-pool1-e81bbc30-30e8-4deb-a0bf-b475cc157e54].generation_errs 0 +[/dev/mapper/luks-pool1-1efde407-1875-4f41-a25d-2b1d001003fb].write_io_errs 0 +[/dev/mapper/luks-pool1-1efde407-1875-4f41-a25d-2b1d001003fb].read_io_errs 0 +[/dev/mapper/luks-pool1-1efde407-1875-4f41-a25d-2b1d001003fb].flush_io_errs 0 +[/dev/mapper/luks-pool1-1efde407-1875-4f41-a25d-2b1d001003fb].corruption_errs 0 +[/dev/mapper/luks-pool1-1efde407-1875-4f41-a25d-2b1d001003fb].generation_errs 0 +[/dev/mapper/luks-pool1-1012ac86-2be3-4146-912d-17f2df2b9383].write_io_errs 0 +[/dev/mapper/luks-pool1-1012ac86-2be3-4146-912d-17f2df2b9383].read_io_errs 0 +[/dev/mapper/luks-pool1-1012ac86-2be3-4146-912d-17f2df2b9383].flush_io_errs 0 +[/dev/mapper/luks-pool1-1012ac86-2be3-4146-912d-17f2df2b9383].corruption_errs 0 +[/dev/mapper/luks-pool1-1012ac86-2be3-4146-912d-17f2df2b9383].generation_errs 0 +[/dev/mapper/luks-pool1-16625cef-acf0-40f3-badc-57c7f8cd9750].write_io_errs 0 +[/dev/mapper/luks-pool1-16625cef-acf0-40f3-badc-57c7f8cd9750].read_io_errs 0 +[/dev/mapper/luks-pool1-16625cef-acf0-40f3-badc-57c7f8cd9750].flush_io_errs 0 +[/dev/mapper/luks-pool1-16625cef-acf0-40f3-badc-57c7f8cd9750].corruption_errs 0 +[/dev/mapper/luks-pool1-16625cef-acf0-40f3-badc-57c7f8cd9750].generation_errs 0 +[/dev/mapper/luks-pool1-d03204fe-3121-4e20-9396-3fa73b836dbe].write_io_errs 0 +[/dev/mapper/luks-pool1-d03204fe-3121-4e20-9396-3fa73b836dbe].read_io_errs 0 +[/dev/mapper/luks-pool1-d03204fe-3121-4e20-9396-3fa73b836dbe].flush_io_errs 0 +[/dev/mapper/luks-pool1-d03204fe-3121-4e20-9396-3fa73b836dbe].corruption_errs 0 +[/dev/mapper/luks-pool1-d03204fe-3121-4e20-9396-3fa73b836dbe].generation_errs 0 +[/dev/mapper/luks-pool1-ca9e67e6-f652-4a54-851e-8e5d785554d0].write_io_errs 0 +[/dev/mapper/luks-pool1-ca9e67e6-f652-4a54-851e-8e5d785554d0].read_io_errs 0 +[/dev/mapper/luks-pool1-ca9e67e6-f652-4a54-851e-8e5d785554d0].flush_io_errs 0 +[/dev/mapper/luks-pool1-ca9e67e6-f652-4a54-851e-8e5d785554d0].corruption_errs 0 +[/dev/mapper/luks-pool1-ca9e67e6-f652-4a54-851e-8e5d785554d0].generation_errs 0 +[/dev/mapper/luks-pool1-08ddca5a-06ff-4b2b-a272-3c95c68142b3].write_io_errs 0 +[/dev/mapper/luks-pool1-08ddca5a-06ff-4b2b-a272-3c95c68142b3].read_io_errs 0 +[/dev/mapper/luks-pool1-08ddca5a-06ff-4b2b-a272-3c95c68142b3].flush_io_errs 0 +[/dev/mapper/luks-pool1-08ddca5a-06ff-4b2b-a272-3c95c68142b3].corruption_errs 0 +[/dev/mapper/luks-pool1-08ddca5a-06ff-4b2b-a272-3c95c68142b3].generation_errs 0 Backup 0 -Overall: - Device size: 16.37TiB - Device allocated: 14.42TiB - Device unallocated: 1.95TiB - Device missing: 0.00B - Device slack: 0.00B - Used: 14.37TiB - Free (estimated): 2.00TiB (min: 1.03TiB) - Free (statfs, df): 2.00TiB - Data ratio: 1.00 - Metadata ratio: 2.00 - Global reserve: 512.00MiB (used: 0.00B) - Multiple profiles: no - -Data,single: Size:14.38TiB, Used:14.33TiB (99.64%) - /dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1 14.38TiB - -Metadata,DUP: Size:22.00GiB, Used:21.01GiB (95.51%) - /dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1 44.00GiB - -System,DUP: Size:8.00MiB, Used:1.52MiB (18.95%) - /dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1 16.00MiB - -Unallocated: - /dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1 1.95TiB \ No newline at end of file +[/dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1].write_io_errs 0 +[/dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1].read_io_errs 0 +[/dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1].flush_io_errs 0 +[/dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1].corruption_errs 0 +[/dev/mapper/luks-backup0-4ade71f9-e9fe-4a9c-84ea-12fc716626c1].generation_errs 0 \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 5629020..0000000 --- a/main.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - print("Hello from llm-server-monitor!") - - -if __name__ == "__main__": - main()