Skip to main content

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

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.

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

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