GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - semcod/fixop: Infrastructure fix operations — detect and repair DNS, firewall, containers, TLS, systemd issues

BranchesTags
Open more actions menu

Latest commit

 

History

36 Commits
36 Commits

Folders and files

NameName
Last commit message
Last commit date
.github
.github
 
 
.governance
.governance
 
 
docs
docs
 
 
project
project
 
 
src/fixop
src/fixop
 
 
tests
tests
 
 
.gitignore
.gitignore
 
 
.nojekyll
.nojekyll
 
 
AGENTS.md
AGENTS.md
 
 
CHANGELOG.md
CHANGELOG.md
 
 
LICENSE
LICENSE
 
 
Makefile
Makefile
 
 
README.md
README.md
 
 
VERSION
VERSION
 
 
app.doql.less
app.doql.less
 
 
goal.yaml
goal.yaml
 
 
index.html
index.html
 
 
local.dev.txt
local.dev.txt
 
 
project.sh
project.sh
 
 
pyproject.toml
pyproject.toml
 
 
pyqual.yaml
pyqual.yaml
 
 
uv.lock
uv.lock
 
 

Repository files navigation

fixop — Infrastructure Fix Operations

AI Cost Tracking

PyPI Version Python License AI Cost Human Time Model

  • 🤖 LLM usage: $1.0518 (10 commits)
  • 👤 Human dev: ~$861 (8.6h @ $100/h, 30min dedup)

Generated on 2026-07-06 using openrouter/qwen/qwen3-coder-next


Detect and repair DNS, firewall, containers, TLS, systemd issues on local and remote servers. Zero external dependencies — uses only Python stdlib.

Install

pip install fixop

Usage as CLI

# Check remote server
fixop check --host myserver.com --user root

# Check specific categories
fixop check --host myserver.com --category dns,firewall,tls

# Auto-fix what can be fixed
fixop fix --host myserver.com --auto

# Interactive fix (confirm each)
fixop fix --host myserver.com --interactive

# Validate deploy artifacts locally
fixop validate deploy/

# Check TLS certificates
fixop check-tls app.example.com api.example.com

# Full diagnostic + fix pipeline
fixop doctor --host myserver.com --fix

# JSON output (for CI)
fixop check --host myserver.com --format json

Usage as Library

from fixop import HostContext, check_host_dns, check_ufw_forward_policy, fix_resolv_conf

ctx = HostContext(host="myserver.com", user="root")

# Detect issues
issues = check_host_dns(ctx)
for issue in issues:
    print(issue)  # [dns] Host DNS cannot resolve acme-v02.api.letsencrypt.org

# Run all checks at once
from fixop import check_all
issues = check_all(ctx, domains=["app.example.com"], containers=["traefik", "web"])

# Fix issues
result = fix_resolv_conf(ctx, nameservers=["8.8.8.8", "1.1.1.1"])
print(result)  # Set /etc/resolv.conf to 8.8.8.8, 1.1.1.1

# Classify runtime errors
from fixop import classify_error
issue = classify_error(exit_code=137, stderr="", cmd="podman run app")
print(issue)  # [container] Container killed (OOM or SIGKILL) (exit 137)

# Validate deploy files locally
from fixop import check_unresolved_vars, check_placeholders
issues = check_unresolved_vars(["deploy/traefik.yml", "deploy/web.container"])
issues += check_placeholders(["deploy/config.yml"])

Modules

Module Purpose
ssh.py SSH transport + connectivity checks
dns.py DNS resolution + resolv.conf + systemd-resolved
firewall.py UFW forward policy + iptables NAT masquerade
containers.py Podman/Docker: health, running status, disk, memory
systemd.py Unit management, graceful restart, daemon-reload
tls.py Certificate validation (Let's Encrypt, self-signed)
ports.py Port conflict detection + resolution
deploy.py Deploy artifact validation (unresolved vars, placeholders)
health.py HTTP/TCP endpoint health checks
classify.py Runtime error classification (exit codes, stderr patterns)
cli.py Standalone CLI

Key Design Principles

  • Zero dependencies — stdlib only (subprocess, socket, ssl, pathlib, re, json)
  • SSH via subprocess — uses the ssh command, not paramiko (optional extra)
  • Taskfile-agnostic — operates on infrastructure primitives, not Taskfile.yml format
  • Dispatch tables — uses data-driven classification instead of if/elif chains

License

Licensed under Apache-2.0.

Author

Tom Sapletta

Dependency maintenance

See internal dependency updates for daily updates, locked tests and Python support.

About

Infrastructure fix operations — detect and repair DNS, firewall, containers, TLS, systemd issues

semcod.github.io/fixop/

Topics

devopsdiagnosticsdnsdockerfirewallinfrastructurepodmanpythonsemcodsystemd

Resources

Readme
Apache-2.0 license
Activity
Custom properties

Stars

0 stars

Watchers

0 watching

Forks

0 forks
Report repository

Releases

Packages

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.