Package Management¶
fscm provides cross-platform package management that automatically uses the right package manager for your system.
Basic Usage¶
import fscm
# Install a single package
fscm.s.pkgs_install("nginx")
# Install multiple packages
fscm.s.pkgs_install("nginx", "certbot", "python3")
# Space-separated packages also work
fscm.s.pkgs_install("nginx certbot python3")
System Detection¶
fscm automatically detects your operating system:
import fscm
# Check what system was detected
print(type(fscm.s)) # Debian, Arch, or MacOS
# Manual detection
system = fscm.detect_system()
print(system) # <Debian>, <Arch>, or <MacOS>
| System | Package Manager | Notes |
|---|---|---|
| Debian/Ubuntu | apt-get | Runs apt-get update first |
| Arch Linux | pacman | Uses pacman -Sy |
| macOS | Homebrew | Uses brew install |
Package Operations¶
Install Packages¶
import fscm
# Install with sudo (default for apt/pacman)
fscm.s.pkgs_install("nginx", sudo=True)
# Check what would be installed
fscm.settings.dry_run = True
fscm.s.pkgs_install("nginx") # Shows but doesn't install
Check If Installed¶
import fscm
if fscm.s.pkg_is_installed("nginx"):
print("nginx is already installed")
else:
fscm.s.pkgs_install("nginx")
Get Installed Version¶
import fscm
version = fscm.s.pkg_get_installed_version("nginx")
if version:
print(f"nginx version: {version}")
else:
print("nginx is not installed")
Platform-Specific Packages¶
Sometimes package names differ between platforms:
import fscm
# Map package names per platform
PACKAGES = {
"debian": ["nginx", "python3-dev", "libssl-dev"],
"arch": ["nginx", "python", "openssl"],
"macos": ["nginx", "python@3.11", "openssl"],
}
# Install for current platform
if isinstance(fscm.s, fscm.Debian):
fscm.s.pkgs_install(*PACKAGES["debian"])
elif isinstance(fscm.s, fscm.Arch):
fscm.s.pkgs_install(*PACKAGES["arch"])
elif isinstance(fscm.s, fscm.MacOS):
fscm.s.pkgs_install(*PACKAGES["macos"])
Arch Linux: AUR Packages¶
For Arch User Repository packages:
import fscm
# Assuming system is Arch
if isinstance(fscm.s, fscm.Arch):
fscm.s.install_from_aur(
command="yay", # Command to check for
git_url="https://aur.archlinux.org/yay.git"
)
Python Packages (pip)¶
fscm includes pip management:
import fscm
# Install pip packages
pip = fscm.Pip()
pip.install("requests", "flask")
# Install specific version
pip.install("django==4.2")
# Install from requirements file
fscm.run("pip install -r requirements.txt")
Virtual Environments¶
import fscm
# Create and use a virtualenv
fscm.run("python3 -m venv /opt/myapp/venv")
# Install in virtualenv
fscm.run("/opt/myapp/venv/bin/pip install -r requirements.txt")
Idempotency¶
Package installation is idempotent:
import fscm
# First call: installs nginx
fscm.s.pkgs_install("nginx") # PkgAdd recorded
# Second call: no-op
fscm.s.pkgs_install("nginx") # No change (already installed)
Change Tracking¶
import fscm
fscm.s.pkgs_install("nginx", "certbot")
# Check what was installed
for change in fscm.CHANGELIST:
if isinstance(change, fscm.PkgAdd):
print(f"Installed: {change.name} ({change.version})")
Example: Web Server Setup¶
import fscm
def setup_webserver():
"""Install and configure a web server."""
# Install packages
packages = ["nginx", "certbot", "python3-certbot-nginx"]
fscm.s.pkgs_install(*packages, sudo=True)
# Verify installation
for pkg in packages:
if fscm.s.pkg_is_installed(pkg):
version = fscm.s.pkg_get_installed_version(pkg)
print(f" {pkg}: {version}")
# Enable and start nginx
fscm.run("systemctl enable nginx", sudo=True)
fscm.run("systemctl start nginx", sudo=True)
Example: Development Environment¶
import fscm
def setup_dev_environment():
"""Set up a Python development environment."""
# System packages
if isinstance(fscm.s, fscm.Debian):
fscm.s.pkgs_install(
"python3", "python3-pip", "python3-venv",
"build-essential", "libffi-dev", "libssl-dev"
)
elif isinstance(fscm.s, fscm.Arch):
fscm.s.pkgs_install(
"python", "python-pip",
"base-devel", "libffi", "openssl"
)
# Create project virtualenv
project_dir = "/opt/myproject"
fscm.mkdir(project_dir)
fscm.run(f"python3 -m venv {project_dir}/venv")
# Install Python packages
fscm.run(f"{project_dir}/venv/bin/pip install --upgrade pip")
fscm.run(f"{project_dir}/venv/bin/pip install wheel setuptools")
Building Python from Source¶
For specific Python versions, use the contrib module:
from fscm.contrib.python import install_python3
# Install Python 3.11.5 from source
install_python3("3.11.5")
This: 1. Downloads Python source 2. Installs build dependencies 3. Compiles and installs 4. Creates symlinks
Next Steps¶
- Systemd Services — Managing services
- Remote Execution — Installing packages remotely