Skip to content

Instantly share code, notes, and snippets.

@n-WN
Created December 31, 2025 02:50
Show Gist options
  • Select an option

  • Save n-WN/a81efaa7b776c8e6b674f5b4174613cb to your computer and use it in GitHub Desktop.

Select an option

Save n-WN/a81efaa7b776c8e6b674f5b4174613cb to your computer and use it in GitHub Desktop.
Sage version comparison and package recovery tools
#!/usr/bin/env python3
"""
Sage Version Analyzer - Compare package versions across Sage installations
Usage: python3 analyze_sage.py <path_to_sage_10_7> <path_to_sage_10_8>
"""
import os
import json
import sys
from collections import defaultdict
def get_packages(site_packages_path):
"""Extract package versions from dist-info METADATA files"""
packages = {}
if not os.path.exists(site_packages_path):
return packages
for dist_info in os.listdir(site_packages_path):
if dist_info.endswith('.dist-info'):
pkg_name = dist_info.replace('.dist-info', '')
metadata_file = os.path.join(site_packages_path, dist_info, 'METADATA')
if os.path.exists(metadata_file):
with open(metadata_file) as f:
for line in f:
if line.startswith('Version:'):
version = line.split(':', 1)[1].strip()
packages[pkg_name] = version
break
return packages
def categorize(packages):
"""Categorize packages by type"""
categories = {
'Security': ['pwntools', 'paramiko', 'capstone', 'ropgadget', 'pyelftools', 'unicorn', 'rpyc', 'cryptography', 'bcrypt', 'pycryptodome', 'pynacl', 'pysocks'],
'Optimization': ['z3', 'ortools', 'igraph', 'cuso', 'flatn', 'gf2bv', 'lll_cvp', 'pycryptosat'],
'Data': ['pandas', 'tqdm', 'rich', 'markdown'],
'Tools': ['mako', 'invoke', 'plumbum', 'protobuf', 'zstandard', 'pyserial'],
}
categorized = defaultdict(dict)
for pkg, version in packages.items():
found = False
for cat, keywords in categories.items():
if any(kw.lower() in pkg.lower() for kw in keywords):
categorized[cat][pkg] = version
found = True
break
if not found:
categorized['Other'][pkg] = version
return categorized
def main():
if len(sys.argv) != 3:
print("Usage: python3 analyze_sage.py <path_10_7> <path_10_8>")
sys.exit(1)
path_10_7 = sys.argv[1]
path_10_8 = sys.argv[2]
if not os.path.isdir(path_10_7) or not os.path.isdir(path_10_8):
print("Error: Invalid paths", file=sys.stderr)
sys.exit(1)
print("Analyzing Sage versions...", file=sys.stderr)
pkgs_10_7 = get_packages(path_10_7)
pkgs_10_8 = get_packages(path_10_8)
# Find packages only in 10.7
only_10_7 = {}
for pkg, version in pkgs_10_7.items():
if not any(pkg.split('-')[0].lower() == p.split('-')[0].lower() for p in pkgs_10_8):
only_10_7[pkg] = version
# Build result
result = {
'Sage_10.7_total': len(pkgs_10_7),
'Sage_10.8_total': len(pkgs_10_8),
'only_in_10.7_count': len(only_10_7),
'growth_rate': f"+{((len(pkgs_10_8) - len(pkgs_10_7)) / len(pkgs_10_7) * 100):.1f}%",
'packages_only_in_10.7': only_10_7,
'categorized': dict(categorize(only_10_7))
}
# Print summary to stderr
print(f"\n{'='*60}", file=sys.stderr)
print(f"Sage 10.7: {len(pkgs_10_7)} packages", file=sys.stderr)
print(f"Sage 10.8: {len(pkgs_10_8)} packages", file=sys.stderr)
print(f"Only in 10.7: {len(only_10_7)} packages", file=sys.stderr)
print(f"Growth: {result['growth_rate']}", file=sys.stderr)
print(f"\nTop packages removed:\n", file=sys.stderr)
for pkg, version in sorted(only_10_7.items())[:10]:
print(f" β€’ {pkg} ({version})", file=sys.stderr)
print(f"{'='*60}\n", file=sys.stderr)
# Output JSON to stdout
print(json.dumps(result, indent=2, ensure_ascii=False))
if __name__ == '__main__':
main()

Sage Version Comparison Tool

Analysis and recovery tools for comparing Sage package versions across different releases.

Files

  1. analyze_sage.py - Python analyzer script to compare package versions
  2. sage_install_recovery.sh - Shell script to recover/reinstall removed packages

Quick Start

Analyze versions:

python3 analyze_sage.py /path/to/sage-10.7/site-packages /path/to/sage-10.8/site-packages

Recover packages:

# CTF tools only
./sage_install_recovery.sh --ctf

# All data tools
./sage_install_recovery.sh --data

# Complete 10.7 environment
./sage_install_recovery.sh --all

Key Findings

  • Sage 10.7: 43 packages
  • Sage 10.8: 206 packages (+379%)
  • Only in 10.7: 39 packages (90.7%)

Most Important Removed Packages

  • pwntools 4.14.1 (CTF framework)
  • pandas 2.3.3 (data analysis)
  • z3-solver 4.15.4.0 (SMT solver)
  • capstone 6.0.0a5 (disassembly)
  • paramiko 4.0.0 (SSH client)

See included documentation for complete analysis.

#!/bin/bash
# Sage Package Recovery - Reinstall packages removed in newer versions
usage() {
cat << 'EOF'
Sage Package Recovery Tool - Restore removed packages in newer Sage versions
Usage: sage_install_recovery.sh [OPTIONS]
Options:
-c, --ctf Install CTF/security tools (pwntools + dependencies)
-d, --data Install data processing packages (pandas, etc)
-a, --all Install all 39 packages removed in Sage 10.8
-o, --optimize Install optimization/solver packages (z3, ortools, etc)
-s, --safe Install only stable, widely-used packages
Example:
sage_install_recovery.sh --ctf # Minimal CTF setup
sage_install_recovery.sh --all # Full 10.7 environment
sage_install_recovery.sh --data # Data analysis tools
EOF
exit 1
}
if [[ $# -eq 0 ]]; then
usage
fi
PACKAGES=""
case "$1" in
-c|--ctf)
echo "πŸ“¦ Installing CTF/Security Tools..."
PACKAGES="pwntools==4.14.1 paramiko capstone ropgadget pyelftools unicorn cryptography bcrypt"
;;
-d|--data)
echo "πŸ“¦ Installing Data Processing Packages..."
PACKAGES="pandas==2.3.3 tqdm rich markdown-it-py"
;;
-o|--optimize)
echo "πŸ“¦ Installing Optimization/Solver Packages..."
PACKAGES="z3-solver ortools python-igraph pycryptosat"
;;
-s|--safe)
echo "πŸ“¦ Installing Stable Packages..."
PACKAGES="pwntools==4.14.1 paramiko capstone pyelftools unicorn pandas==2.3.3 z3-solver protobuf"
;;
-a|--all)
echo "πŸ“¦ Installing ALL 39 Removed Packages..."
PACKAGES="pwntools==4.14.1 paramiko capstone ropgadget pyelftools unicorn rpyc z3-solver \
ortools python-igraph pycryptosat pandas==2.3.3 tqdm rich mako protobuf zstandard \
cryptography bcrypt pycryptodome pynacl invoke plumbum pyserial markdown-it-py \
texttable immutabledict absl-py intervaltree unix_ar mdurl colored-traceback"
;;
*)
usage
;;
esac
echo "Installing packages..."
echo "$PACKAGES" | xargs pip install
echo "βœ… Installation complete!"
echo "Run: pip list | grep -E 'pwntools|paramiko|pandas|z3' to verify"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment