Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-09 10:47:24

0001 #!/usr/bin/env python3
0002 """propose-credential-pings.py — the credential expiry proposer: a ping
0003 on the expiry of each production credential whose date can be read, and
0004 a fulfilment proposal for an open ping whose credential has since been
0005 renewed (swf-monitor docs/PINGS.md, docs/AI_PROPOSALS.md category
0006 ``ping``). Logic in ``swf_epicprod.credential_proposer``; the prod-ops
0007 agent's doer for the ``credential_ping_propose`` chain step, also
0008 runnable by hand.
0009 
0010 Usage::
0011 
0012     cd /data/wenauseic/github/swf-monitor/src
0013     source ../../swf-testbed/.venv/bin/activate && source ~/.env
0014     python ../scripts/propose-credential-pings.py [--apply] [--created-by X]
0015 
0016 Dry run by default: the findings are printed and nothing is proposed.
0017 """
0018 import argparse
0019 import json
0020 import os
0021 import sys
0022 
0023 THIS_DIR = os.path.dirname(os.path.abspath(__file__))
0024 sys.path.insert(0, os.path.join(THIS_DIR, '..', 'src'))
0025 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'swf_monitor_project.settings')
0026 
0027 import django  # noqa: E402
0028 django.setup()
0029 
0030 from swf_epicprod.credential_proposer import (  # noqa: E402
0031     propose_credential_pings)
0032 
0033 
0034 def main():
0035     parser = argparse.ArgumentParser()
0036     parser.add_argument('--apply', action='store_true',
0037                         help='submit the proposals (default: report only)')
0038     parser.add_argument('--created-by', default='prodops_agent')
0039     args = parser.parse_args()
0040     result = propose_credential_pings(created_by=args.created_by,
0041                                       apply=args.apply)
0042     for f in result['findings']:
0043         print(f"finding: {f['label']} expires {f['due']} "
0044               f"({f['days_left']:.1f} days left, {f['status']})")
0045     if not result['findings']:
0046         print('no credential expiry could be read')
0047     pings = result['pings'] or {}
0048     summary = {
0049         'findings': len(result['findings']),
0050         'applied': bool(args.apply),
0051         'proposed': pings.get('proposed', []),
0052         'noop': pings.get('noop', []),
0053         'denied': pings.get('denied', []),
0054         'invalid': pings.get('invalid', []),
0055         'fulfil_proposed': result['fulfil_proposed'],
0056         'withdrawn': result['withdrawn'],
0057         'errors': result['errors'],
0058     }
0059     print('SUMMARY ' + json.dumps(summary))
0060     return 0
0061 
0062 
0063 if __name__ == '__main__':
0064     sys.exit(main())