SyncjobModel.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. from modules.Mailcow import Mailcow
  2. from models.BaseModel import BaseModel
  3. class SyncjobModel(BaseModel):
  4. parser_command = "syncjob"
  5. required_args = {
  6. "add": [["username", "host1", "port1", "user1", "password1", "enc1"]],
  7. "delete": [["id"]],
  8. "get": [["username"]],
  9. "edit": [["id"]],
  10. "run": [["id"]]
  11. }
  12. def __init__(
  13. self,
  14. id=None,
  15. username=None,
  16. host1=None,
  17. port1=None,
  18. user1=None,
  19. password1=None,
  20. enc1=None,
  21. mins_interval=None,
  22. subfolder2=None,
  23. maxage=None,
  24. maxbytespersecond=None,
  25. timeout1=None,
  26. timeout2=None,
  27. exclude=None,
  28. custom_parameters=None,
  29. delete2duplicates=None,
  30. delete1=None,
  31. delete2=None,
  32. automap=None,
  33. skipcrossduplicates=None,
  34. subscribeall=None,
  35. active=None,
  36. force=None,
  37. **kwargs
  38. ):
  39. self.mailcow = Mailcow()
  40. for key, value in kwargs.items():
  41. setattr(self, key, value)
  42. self.id = id
  43. self.username = username
  44. self.host1 = host1
  45. self.port1 = port1
  46. self.user1 = user1
  47. self.password1 = password1
  48. self.enc1 = enc1
  49. self.mins_interval = mins_interval
  50. self.subfolder2 = subfolder2
  51. self.maxage = maxage
  52. self.maxbytespersecond = maxbytespersecond
  53. self.timeout1 = timeout1
  54. self.timeout2 = timeout2
  55. self.exclude = exclude
  56. self.custom_parameters = custom_parameters
  57. self.delete2duplicates = delete2duplicates
  58. self.delete1 = delete1
  59. self.delete2 = delete2
  60. self.automap = automap
  61. self.skipcrossduplicates = skipcrossduplicates
  62. self.subscribeall = subscribeall
  63. self.active = active
  64. self.force = force
  65. @classmethod
  66. def from_dict(cls, data):
  67. return cls(
  68. username=data.get("username"),
  69. host1=data.get("host1"),
  70. port1=data.get("port1"),
  71. user1=data.get("user1"),
  72. password1=data.get("password1"),
  73. enc1=data.get("enc1"),
  74. mins_interval=data.get("mins_interval", None),
  75. subfolder2=data.get("subfolder2", None),
  76. maxage=data.get("maxage", None),
  77. maxbytespersecond=data.get("maxbytespersecond", None),
  78. timeout1=data.get("timeout1", None),
  79. timeout2=data.get("timeout2", None),
  80. exclude=data.get("exclude", None),
  81. custom_parameters=data.get("custom_parameters", None),
  82. delete2duplicates=data.get("delete2duplicates", None),
  83. delete1=data.get("delete1", None),
  84. delete2=data.get("delete2", None),
  85. automap=data.get("automap", None),
  86. skipcrossduplicates=data.get("skipcrossduplicates", None),
  87. subscribeall=data.get("subscribeall", None),
  88. active=data.get("active", None),
  89. )
  90. def getAdd(self):
  91. """
  92. Get the sync job details as a dictionary for adding, sets default values.
  93. :return: Dictionary containing sync job details.
  94. """
  95. syncjob = {
  96. "username": self.username,
  97. "host1": self.host1,
  98. "port1": self.port1,
  99. "user1": self.user1,
  100. "password1": self.password1,
  101. "enc1": self.enc1,
  102. "mins_interval": self.mins_interval if self.mins_interval is not None else 20,
  103. "subfolder2": self.subfolder2 if self.subfolder2 is not None else "",
  104. "maxage": self.maxage if self.maxage is not None else 0,
  105. "maxbytespersecond": self.maxbytespersecond if self.maxbytespersecond is not None else 0,
  106. "timeout1": self.timeout1 if self.timeout1 is not None else 600,
  107. "timeout2": self.timeout2 if self.timeout2 is not None else 600,
  108. "exclude": self.exclude if self.exclude is not None else "(?i)spam|(?i)junk",
  109. "custom_parameters": self.custom_parameters if self.custom_parameters is not None else "",
  110. "delete2duplicates": 1 if self.delete2duplicates else 0,
  111. "delete1": 1 if self.delete1 else 0,
  112. "delete2": 1 if self.delete2 else 0,
  113. "automap": 1 if self.automap else 0,
  114. "skipcrossduplicates": 1 if self.skipcrossduplicates else 0,
  115. "subscribeall": 1 if self.subscribeall else 0,
  116. "active": 1 if self.active else 0
  117. }
  118. return {key: value for key, value in syncjob.items() if value is not None}
  119. def getEdit(self):
  120. """
  121. Get the sync job details as a dictionary for editing, sets no default values.
  122. :return: Dictionary containing sync job details.
  123. """
  124. syncjob = {
  125. "username": self.username,
  126. "host1": self.host1,
  127. "port1": self.port1,
  128. "user1": self.user1,
  129. "password1": self.password1,
  130. "enc1": self.enc1,
  131. "mins_interval": self.mins_interval,
  132. "subfolder2": self.subfolder2,
  133. "maxage": self.maxage,
  134. "maxbytespersecond": self.maxbytespersecond,
  135. "timeout1": self.timeout1,
  136. "timeout2": self.timeout2,
  137. "exclude": self.exclude,
  138. "custom_parameters": self.custom_parameters,
  139. "delete2duplicates": self.delete2duplicates,
  140. "delete1": self.delete1,
  141. "delete2": self.delete2,
  142. "automap": self.automap,
  143. "skipcrossduplicates": self.skipcrossduplicates,
  144. "subscribeall": self.subscribeall,
  145. "active": self.active
  146. }
  147. return {key: value for key, value in syncjob.items() if value is not None}
  148. def get(self):
  149. """
  150. Get the sync job details from the mailcow API.
  151. :return: Response from the mailcow API.
  152. """
  153. return self.mailcow.getSyncjob(self.username)
  154. def delete(self):
  155. """
  156. Get the sync job details from the mailcow API.
  157. :return: Response from the mailcow API.
  158. """
  159. return self.mailcow.deleteSyncjob(self.id)
  160. def add(self):
  161. """
  162. Get the sync job details from the mailcow API.
  163. :return: Response from the mailcow API.
  164. """
  165. return self.mailcow.addSyncjob(self.getAdd())
  166. def edit(self):
  167. """
  168. Get the sync job details from the mailcow API.
  169. :return: Response from the mailcow API.
  170. """
  171. return self.mailcow.editSyncjob(self.id, self.getEdit())
  172. def run(self):
  173. """
  174. Run the sync job.
  175. :return: Response from the mailcow API.
  176. """
  177. return self.mailcow.runSyncjob(self.id, force=self.force)
  178. @classmethod
  179. def add_parser(cls, subparsers):
  180. parser = subparsers.add_parser(
  181. cls.parser_command,
  182. help="Manage sync jobs (add, delete, get, edit)"
  183. )
  184. parser.add_argument("object", choices=list(cls.required_args.keys()), help="Action to perform: add, delete, get, edit")
  185. parser.add_argument("--id", help="Syncjob object ID (required for edit, delete, run)")
  186. parser.add_argument("--username", help="Target mailbox username (e.g. user@example.com)")
  187. parser.add_argument("--host1", help="Source IMAP server hostname")
  188. parser.add_argument("--port1", help="Source IMAP server port")
  189. parser.add_argument("--user1", help="Source IMAP account username")
  190. parser.add_argument("--password1", help="Source IMAP account password")
  191. parser.add_argument("--enc1", choices=["PLAIN", "SSL", "TLS"], help="Encryption for source server connection")
  192. parser.add_argument("--mins-interval", help="Sync interval in minutes (default: 20)")
  193. parser.add_argument("--subfolder2", help="Destination subfolder (default: empty)")
  194. parser.add_argument("--maxage", help="Maximum mail age in days (default: 0 = unlimited)")
  195. parser.add_argument("--maxbytespersecond", help="Maximum bandwidth in bytes/sec (default: 0 = unlimited)")
  196. parser.add_argument("--timeout1", help="Timeout for source server in seconds (default: 600)")
  197. parser.add_argument("--timeout2", help="Timeout for destination server in seconds (default: 600)")
  198. parser.add_argument("--exclude", help="Regex pattern to exclude folders (default: (?i)spam|(?i)junk)")
  199. parser.add_argument("--custom-parameters", help="Additional imapsync parameters")
  200. parser.add_argument("--delete2duplicates", choices=["1", "0"], help="Delete duplicates on destination (1 = yes, 0 = no)")
  201. parser.add_argument("--del1", choices=["1", "0"], help="Delete mails on source after sync (1 = yes, 0 = no)")
  202. parser.add_argument("--del2", choices=["1", "0"], help="Delete mails on destination after sync (1 = yes, 0 = no)")
  203. parser.add_argument("--automap", choices=["1", "0"], help="Enable folder automapping (1 = yes, 0 = no)")
  204. parser.add_argument("--skipcrossduplicates", choices=["1", "0"], help="Skip cross-account duplicates (1 = yes, 0 = no)")
  205. parser.add_argument("--subscribeall", choices=["1", "0"], help="Subscribe to all folders (1 = yes, 0 = no)")
  206. parser.add_argument("--active", choices=["1", "0"], help="Activate syncjob (1 = yes, 0 = no)")
  207. parser.add_argument("--force", action="store_true", help="Force the syncjob to run even if it is not active")