Skip to main content

Collection of utils for systemctl related tasks

Project description

jps-systemctl-utils

Build Publish to PyPI codecov Python 3.10+ License: MIT

A Python utility for automating systemctl service management operations with comprehensive logging and reporting.

๐Ÿš€ Overview

jps-systemctl-utils provides a simple, sequential utility to manage systemd services in bulk. It automates the common workflow of checking status, stopping, starting, and verifying services, with full logging and detailed reports.

Features

  • โœ… YAML Configuration - Define services and safety checks in structured YAML format
  • ๐Ÿ”„ Automated Workflow - Runs status โ†’ stop โ†’ start โ†’ status for each service
  • ๐Ÿ›ก๏ธ Safety Checks - Configurable pre-restart checks to prevent unsafe operations
  • ๐Ÿ“Š Progress Tracking - Real-time progress bar using Rich
  • ๐Ÿ“ Comprehensive Logging - Dual logging to file (INFO) and stderr (WARNING+)
  • ๐Ÿ“‹ Detailed Reports - Timestamped reports with all command outputs
  • ๐Ÿงช Dry-run Mode - Test your workflow without executing commands
  • โš™๏ธ Flexible Configuration - Custom output directories, log files, and reports
  • ๐ŸŽฏ Smart Skipping - Automatically skip services with active jobs

Use Cases

  • Restarting multiple services after configuration changes
  • Performing routine service maintenance
  • Testing service restart procedures
  • Documenting service states before/after operations
  • Automating deployment workflows

๐Ÿ“ฆ Installation

From Source

git clone https://github.com/jai-python3/jps-systemctl-utils.git
cd jps-systemctl-utils
make install

For Development

make install-dev-tools

๐ŸŽฏ Usage

Basic Usage

Create a YAML configuration file with services and optional safety checks:

# services.yaml
---
nginx.service:
  # No safety checks - will always restart
apache2.service:
mysql.service:
postgresql.service:

Run the utility:

jps-systemctl-utils-restart-services --infile services.yaml

Advanced: YAML Configuration with Safety Checks

For more control, use a YAML configuration file with safety check commands:

# services.yaml
---
nginx.service:
  - pgrep -f nginx_backup
  - test -f /var/lock/nginx.lock
apache2.service:
  - systemctl is-active httpd-backup
mysql.service:
  - pgrep -f mysqldump
  - pgrep -f mysql_backup
postgresql.service:
  # No safety checks - will always restart

Run with safety checks:

jps-systemctl-utils-restart-services --infile services.yaml

How Safety Checks Work:

  • Each service can have a list of shell commands to execute before restarting
  • If ANY command returns output, the service restart is skipped
  • If all commands return no output, it's safe to restart
  • Services without safety checks are always restarted (if no jobs found)
  • Useful for checking if batch jobs, database operations, or critical processes are running

Dry-run Mode

Test without executing commands:

jps-systemctl-utils-restart-services --infile services.txt --dryrun

Custom Output Location

jps-systemctl-utils-restart-services --infile services.txt --outdir /var/log/service-ops

Full Control

jps-systemctl-utils-restart-services \
  --infile services.txt \
  --outdir /custom/output \
  --report-file /custom/report.txt \
  --logfile /custom/app.log \
  --dryrun

Example Output Structure

Default output location: /tmp/<username>/systemctl_runner/<timestamp>/

/tmp/myuser/systemctl_runner/2025-12-13-143000/
โ”œโ”€โ”€ systemctl_runner_report.txt    # Detailed command outputs
โ””โ”€โ”€ systemctl_runner.log            # Application logs

Report Format

The generated report includes safety check results and command outputs:

## method-created: /path/to/restart_services.py
## date-created: 2025-12-13 14:30:00
## created-by: myuser
## logfile: /tmp/myuser/restart_services/2025-12-13-143000/restart_services.log
## infile: /path/to/services.yaml

# Service: nginx.service
# Running safety checks for nginx.service:
$ pgrep -f nginx_backup
(exit: 0)
# Safety checks PASSED: Safe to restart nginx.service

$ systemctl status nginx.service
โ— nginx.service - A high performance web server
   Loaded: loaded (/etc/systemd/system/nginx.service)
   Active: active (running)
(exit: 0)

$ systemctl stop nginx.service
(exit: 0)

$ systemctl start nginx.service
(exit: 0)

$ systemctl status nginx.service
โ— nginx.service - A high performance web server
   Active: active (running)
(exit: 0)

# Service: mysql.service
# Running safety checks for mysql.service:
$ pgrep -f mysql_backup
12345
mysql_backup_process
(exit: 0)
# Safety check FAILED: Output detected, service has active jobs

โš ๏ธ  SKIPPING mysql.service: Safety check failed - jobs are still running

๐Ÿ“š API Documentation

Command-line Options

Option Type Required Description
--infile Path Yes YAML file with service configurations and safety checks
--outdir Path No Output directory for logs and reports
--report-file Path No Custom path for the report file
--logfile Path No Custom path for the log file
--dryrun Flag No If set, no systemctl commands are executed (safety checks bypassed)

Input File Format

YAML Format:

---
service_name.service:
  - safety_check_command_1
  - safety_check_command_2
another_service.service:
  # Empty list, null, or omitted means no safety checks
third_service.service: null
fourth_service.service: []

Safety Check Examples:

  • pgrep -f process_name - Check for running processes
  • pgrep -f backup_script - Check if backup is running
  • systemctl is-active dependent-service - Check dependent services
  • curl -s http://localhost/health | grep OK - Health check endpoints
  • test -f /var/lock/myservice.lock - Check for lock files
  • ps aux | grep 'my_job' | grep -v grep - Check for specific jobs

๐Ÿงช Development

Running Tests

# Run all tests with coverage
make test

# Run specific test file
pytest tests/test_processor.py -v

# Run with detailed coverage report
pytest tests/ -v --cov=src/jps_systemctl_utils --cov-report=html

Code Quality

# Auto-fix code issues
make fix

# Format code with black
make format

# Run linting
make lint

# Run all quality checks
make fix && make format && make lint

Pre-commit Hooks

# Install pre-commit hooks
make precommit

Building and Publishing

# Build distribution packages
make build

# Check built packages
make check-build

# Publish to PyPI (with dry-run option)
make publish DRYRUN=1
make publish

๐Ÿ—๏ธ Project Structure

jps-systemctl-utils/
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ jps_systemctl_utils/
โ”‚       โ”œโ”€โ”€ __init__.py           # Package version
โ”‚       โ”œโ”€โ”€ constants.py          # Logging constants
โ”‚       โ”œโ”€โ”€ logging_helper.py     # Logging configuration
โ”‚       โ”œโ”€โ”€ processor.py          # Core service processing logic
โ”‚       โ”œโ”€โ”€ report_writer.py      # Report generation
โ”‚       โ””โ”€โ”€ systemctl_runner.py   # CLI entry point
โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ conftest.py               # Shared fixtures
โ”‚   โ”œโ”€โ”€ test_constants.py         # Constants tests
โ”‚   โ”œโ”€โ”€ test_logging_helper.py    # Logging tests
โ”‚   โ”œโ”€โ”€ test_processor.py         # Processor tests
โ”‚   โ”œโ”€โ”€ test_report_writer.py     # Report writer tests
โ”‚   โ””โ”€โ”€ test_systemctl_runner.py  # CLI tests
โ”œโ”€โ”€ pyproject.toml                # Project metadata
โ”œโ”€โ”€ Makefile                      # Development commands
โ””โ”€โ”€ README.md                     # This file

๐Ÿงฉ Requirements

  • Python 3.10+
  • typer >= 0.12.3
  • rich >= 13.0.0
  • pyyaml >= 6.0.0

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Run tests (make test)
  4. Commit your changes (git commit -m 'Add some AmazingFeature')
  5. Push to the branch (git push origin feature/AmazingFeature)
  6. Open a Pull Request

๐Ÿ“ Changelog

See CHANGELOG.md for version history.

๐Ÿ“„ License

MIT License ยฉ Jaideep Sundaram

๐Ÿ”— Links

โš ๏ธ Disclaimer

This tool executes systemctl commands that affect system services. Always:

  • Test with --dryrun first
  • Review the service list carefully
  • Have appropriate system permissions
  • Back up important configurations
  • Use in controlled environments

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jps_systemctl_utils-0.3.0.tar.gz (20.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jps_systemctl_utils-0.3.0-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file jps_systemctl_utils-0.3.0.tar.gz.

File metadata

  • Download URL: jps_systemctl_utils-0.3.0.tar.gz
  • Upload date:
  • Size: 20.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for jps_systemctl_utils-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e4e41ab4c065528c59b3c1122a38c1e18e8a7c3859bc2716c4668e1d33e84c66
MD5 ddec3e3536fd9e2b521b3e1b3957e13e
BLAKE2b-256 c3426ef085746e0648135439e877539e34b0fb3db04834d93f2c4ef74c0f1735

See more details on using hashes here.

File details

Details for the file jps_systemctl_utils-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for jps_systemctl_utils-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 281dc663099cb27a03eb878ac9ccaa212e605802cbcd6865659a362053a8e26b
MD5 6d1ad5678767b26c7ac89ea35239f7ff
BLAKE2b-256 b7d1b49327ce81539a901bfc7530cf528950a98f1307b46a8250f15c422c9c2f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page