timegen.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. '''
  2. main module to read and get informations about alarms
  3. '''
  4. from __future__ import print_function
  5. import sys
  6. from datetime import datetime
  7. import argparse
  8. import json
  9. from .entrypoints_utils import get_one_entrypoint
  10. from logging import getLogger
  11. log = getLogger('timegen')
  12. def get_timegenerator(kind):
  13. '''Messes with entrypoints to return an timegenerator function'''
  14. return get_one_entrypoint('larigira.timegenerators', kind)
  15. def get_parser():
  16. parser = argparse.ArgumentParser(
  17. description='Generate "ring times" from a timespec')
  18. parser.add_argument('timespec', metavar='TIMESPEC', type=str, nargs=1,
  19. help='filename for timespec, formatted in json')
  20. parser.add_argument('--now', metavar='NOW', type=int, nargs=1,
  21. default=None,
  22. help='Set a different "time", in unix epoch')
  23. parser.add_argument('--howmany', metavar='N', type=int, nargs=1,
  24. default=[1],
  25. help='Set a different "time", in unix epoch')
  26. return parser
  27. def read_spec(fname):
  28. try:
  29. if fname == '-':
  30. return json.load(sys.stdin)
  31. with open(fname) as buf:
  32. return json.load(buf)
  33. except ValueError:
  34. sys.stderr.write("Error: invalid JSON\n")
  35. sys.exit(1)
  36. def check_spec(spec):
  37. if 'kind' not in spec:
  38. yield "Missing field 'kind'"
  39. def timegenerate(spec, now=None, howmany=1):
  40. Alarm = get_timegenerator(spec['kind'])
  41. generator = Alarm(spec)
  42. if now is not None:
  43. if type(now) is not datetime:
  44. now = datetime.fromtimestamp(now)
  45. for _ in range(howmany):
  46. now = generator.next_ring(current_time=now)
  47. yield now
  48. def main():
  49. '''Main function for the "larigira-timegen" executable'''
  50. args = get_parser().parse_args()
  51. spec = read_spec(args.timespec[0])
  52. errors = tuple(check_spec(spec))
  53. if errors:
  54. log.error("Errors in timespec")
  55. for err in errors:
  56. sys.stderr.write('Error: {}\n'.format(err))
  57. sys.exit(1)
  58. now = None if args.now is None else args.now.pop()
  59. howmany = None if args.howmany is None else args.howmany.pop()
  60. for time in timegenerate(spec, now=now, howmany=howmany):
  61. print(time)