2024-04-18 13:53:32 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import base64
|
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import pickle
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from multiprocessing import Pool
|
|
|
|
from rt.rest1 import Rt
|
|
|
|
|
|
|
|
TEMPLATE = """{
|
|
|
|
"zammad_url": "",
|
|
|
|
"zammad_user": "",
|
|
|
|
"zammad_password": "",
|
|
|
|
"rt_url": "",
|
|
|
|
"rt_user": "",
|
|
|
|
"rt_pass": "",
|
|
|
|
"rt_start": 1,
|
|
|
|
"rt_end": 1000,
|
|
|
|
}
|
|
|
|
"""
|
|
|
|
|
|
|
|
### helpers ###
|
|
|
|
|
|
|
|
def maybe_dump_user(rt, username):
|
|
|
|
dumpfile = f"users/{username}"
|
|
|
|
if not os.path.exists(dumpfile):
|
|
|
|
user = rt.get_user(username)
|
|
|
|
with open(dumpfile, "wb") as handle:
|
|
|
|
pickle.dump(user, handle)
|
|
|
|
|
|
|
|
### main logic ###
|
|
|
|
|
|
|
|
if not os.path.exists("rt2zammad.json"):
|
|
|
|
print("Missing rt2zammad.json!")
|
|
|
|
print("Create one based on following template:")
|
|
|
|
print(TEMPLATE)
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
with open("rt2zammad.json") as handle:
|
|
|
|
config = json.load(handle)
|
|
|
|
|
|
|
|
rt = Rt(config["rt_url"], config["rt_user"], config["rt_pass"])
|
|
|
|
if not rt.login():
|
|
|
|
print("Failed to login to RT!")
|
|
|
|
sys.exit(2)
|
|
|
|
|
|
|
|
os.makedirs("users", exist_ok=True)
|
|
|
|
os.makedirs("tickets", exist_ok=True)
|
|
|
|
os.makedirs("attachments", exist_ok=True)
|
|
|
|
|
2024-08-02 07:27:51 +00:00
|
|
|
#ticket_ids = range(config["rt_start"], config["rt_end"])
|
|
|
|
if len(sys.argv) != 3:
|
|
|
|
print(len(sys.argv))
|
|
|
|
print("It needs ticket range to import ex. start, end")
|
|
|
|
sys.exit()
|
|
|
|
else:
|
|
|
|
export_start = int(sys.argv[1])
|
|
|
|
export_end = int(sys.argv[2])
|
|
|
|
print(f"start : {export_start} end : {export_end}")
|
2024-08-02 07:50:00 +00:00
|
|
|
ticket_ids = range(export_start, export_end + 1)
|
2024-08-02 07:27:51 +00:00
|
|
|
|
2024-04-18 13:53:32 +00:00
|
|
|
|
2024-04-22 09:52:28 +00:00
|
|
|
def dump(id, retries=3):
|
2024-04-18 13:53:32 +00:00
|
|
|
print(f"Dumping RT#{id}")
|
2024-04-22 09:52:28 +00:00
|
|
|
try:
|
|
|
|
ticket_dumpfile = f"tickets/{id}"
|
|
|
|
if not os.path.exists(ticket_dumpfile):
|
|
|
|
ticket = rt.get_ticket(id)
|
|
|
|
if ticket is None:
|
|
|
|
print("Got 'None' while fetching ticket")
|
|
|
|
os.exit(1)
|
|
|
|
ticket["original_id"] = str(id)
|
2024-04-22 11:33:13 +00:00
|
|
|
if ticket["Queue"] == 'spam':
|
|
|
|
print(f"Ignoring ticket #{id} (marked as SPAM)")
|
|
|
|
else:
|
2024-04-22 09:52:28 +00:00
|
|
|
maybe_dump_user(rt, ticket["Creator"])
|
|
|
|
maybe_dump_user(rt, ticket["Owner"])
|
2024-04-18 13:53:32 +00:00
|
|
|
|
2024-04-22 09:52:28 +00:00
|
|
|
if ticket["original_id"] != ticket["numerical_id"]:
|
|
|
|
# Merged ticket
|
|
|
|
history = []
|
|
|
|
else:
|
|
|
|
history = rt.get_history(id)
|
|
|
|
for item in history:
|
|
|
|
for a, title in item["Attachments"]:
|
|
|
|
attachment = rt.get_attachment(id, a)
|
|
|
|
os.makedirs(f"attachments/{id}", exist_ok=True)
|
|
|
|
with open(f"attachments/{id}/{a}", "wb") as handle:
|
|
|
|
pickle.dump(attachment, handle)
|
|
|
|
maybe_dump_user(rt, item["Creator"])
|
|
|
|
data = {"ticket": ticket, "history": history}
|
|
|
|
with open(ticket_dumpfile, "wb") as handle:
|
|
|
|
pickle.dump(data, handle)
|
|
|
|
except:
|
|
|
|
print(f"Failed to dump RT#{id}.. ({retries} retries left)")
|
|
|
|
if retries > 0:
|
|
|
|
dump(id, retries - 1)
|
2024-04-18 13:53:32 +00:00
|
|
|
|
|
|
|
worker_count = 4
|
|
|
|
with Pool(worker_count) as p:
|
|
|
|
p.map(dump, ticket_ids, chunksize=10)
|