on_Binary__15_env_install.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/env python3
  2. """
  3. Check if a binary is already available in the system PATH.
  4. This is the simplest "provider" - it doesn't install anything,
  5. it just discovers binaries that are already installed.
  6. Usage: on_Binary__install_using_env_provider.py --binary-id=<uuid> --machine-id=<uuid> --name=<name>
  7. Output: Binary JSONL record to stdout if binary found in PATH
  8. Environment variables:
  9. MACHINE_ID: Machine UUID (set by orchestrator)
  10. """
  11. import json
  12. import os
  13. import sys
  14. import rich_click as click
  15. from abx_pkg import Binary, EnvProvider
  16. @click.command()
  17. @click.option('--machine-id', required=True, help="Machine UUID")
  18. @click.option('--binary-id', required=True, help="Dependency UUID")
  19. @click.option('--name', required=True, help="Binary name to find")
  20. @click.option('--binproviders', default='*', help="Allowed providers (comma-separated)")
  21. @click.option('--overrides', default=None, help="JSON-encoded overrides dict (unused)")
  22. def main(binary_id: str, machine_id: str, name: str, binproviders: str, overrides: str | None):
  23. """Check if binary is available in PATH and record it."""
  24. # Check if env provider is allowed
  25. if binproviders != '*' and 'env' not in binproviders.split(','):
  26. click.echo(f"env provider not allowed for {name}", err=True)
  27. sys.exit(0) # Not an error, just skip
  28. # Use abx-pkg EnvProvider to find binary
  29. provider = EnvProvider()
  30. try:
  31. binary = Binary(name=name, binproviders=[provider]).load()
  32. except Exception as e:
  33. click.echo(f"{name} not found in PATH: {e}", err=True)
  34. sys.exit(1)
  35. if not binary.abspath:
  36. click.echo(f"{name} not found in PATH", err=True)
  37. sys.exit(1)
  38. machine_id = os.environ.get('MACHINE_ID', '')
  39. # Output Binary JSONL record to stdout
  40. record = {
  41. 'type': 'Binary',
  42. 'name': name,
  43. 'abspath': str(binary.abspath),
  44. 'version': str(binary.version) if binary.version else '',
  45. 'sha256': binary.sha256 or '',
  46. 'binprovider': 'env',
  47. 'machine_id': machine_id,
  48. 'binary_id': binary_id,
  49. }
  50. print(json.dumps(record))
  51. # Log human-readable info to stderr
  52. click.echo(f"Found {name} at {binary.abspath}", err=True)
  53. click.echo(f" version: {binary.version}", err=True)
  54. sys.exit(0)
  55. if __name__ == '__main__':
  56. main()