helper.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # -*- coding:utf-8 -*-
  2. import re
  3. import subprocess
  4. import uuid
  5. from datetime import datetime
  6. from zoneinfo import available_timezones
  7. import random
  8. import string
  9. from flask_restful import fields
  10. def run(script):
  11. return subprocess.getstatusoutput('source /root/.bashrc && ' + script)
  12. class TimestampField(fields.Raw):
  13. def format(self, value):
  14. return int(value.timestamp())
  15. def email(email):
  16. # Define a regex pattern for email addresses
  17. pattern = r"^[\w\.-]+@([\w-]+\.)+[\w-]{2,}$"
  18. # Check if the email matches the pattern
  19. if re.match(pattern, email) is not None:
  20. return email
  21. error = ('{email} is not a valid email.'
  22. .format(email=email))
  23. raise ValueError(error)
  24. def uuid_value(value):
  25. if value == '':
  26. return str(value)
  27. try:
  28. uuid_obj = uuid.UUID(value)
  29. return str(uuid_obj)
  30. except ValueError:
  31. error = ('{value} is not a valid uuid.'
  32. .format(value=value))
  33. raise ValueError(error)
  34. def timestamp_value(timestamp):
  35. try:
  36. int_timestamp = int(timestamp)
  37. if int_timestamp < 0:
  38. raise ValueError
  39. return int_timestamp
  40. except ValueError:
  41. error = ('{timestamp} is not a valid timestamp.'
  42. .format(timestamp=timestamp))
  43. raise ValueError(error)
  44. class str_len(object):
  45. """ Restrict input to an integer in a range (inclusive) """
  46. def __init__(self, max_length, argument='argument'):
  47. self.max_length = max_length
  48. self.argument = argument
  49. def __call__(self, value):
  50. length = len(value)
  51. if length > self.max_length:
  52. error = ('Invalid {arg}: {val}. {arg} cannot exceed length {length}'
  53. .format(arg=self.argument, val=value, length=self.max_length))
  54. raise ValueError(error)
  55. return value
  56. class float_range(object):
  57. """ Restrict input to an float in a range (inclusive) """
  58. def __init__(self, low, high, argument='argument'):
  59. self.low = low
  60. self.high = high
  61. self.argument = argument
  62. def __call__(self, value):
  63. value = _get_float(value)
  64. if value < self.low or value > self.high:
  65. error = ('Invalid {arg}: {val}. {arg} must be within the range {lo} - {hi}'
  66. .format(arg=self.argument, val=value, lo=self.low, hi=self.high))
  67. raise ValueError(error)
  68. return value
  69. class datetime_string(object):
  70. def __init__(self, format, argument='argument'):
  71. self.format = format
  72. self.argument = argument
  73. def __call__(self, value):
  74. try:
  75. datetime.strptime(value, self.format)
  76. except ValueError:
  77. error = ('Invalid {arg}: {val}. {arg} must be conform to the format {format}'
  78. .format(arg=self.argument, val=value, lo=self.format))
  79. raise ValueError(error)
  80. return value
  81. def _get_float(value):
  82. try:
  83. return float(value)
  84. except (TypeError, ValueError):
  85. raise ValueError('{0} is not a valid float'.format(value))
  86. def supported_language(lang):
  87. if lang in ['en-US', 'zh-Hans']:
  88. return lang
  89. error = ('{lang} is not a valid language.'
  90. .format(lang=lang))
  91. raise ValueError(error)
  92. def timezone(timezone_string):
  93. if timezone_string and timezone_string in available_timezones():
  94. return timezone_string
  95. error = ('{timezone_string} is not a valid timezone.'
  96. .format(timezone_string=timezone_string))
  97. raise ValueError(error)
  98. def generate_string(n):
  99. letters_digits = string.ascii_letters + string.digits
  100. result = ""
  101. for i in range(n):
  102. result += random.choice(letters_digits)
  103. return result
  104. def get_remote_ip(request):
  105. if request.headers.get('CF-Connecting-IP'):
  106. return request.headers.get('Cf-Connecting-Ip')
  107. elif request.headers.getlist("X-Forwarded-For"):
  108. return request.headers.getlist("X-Forwarded-For")[0]
  109. else:
  110. return request.remote_addr