#! /usr/bin/python
"""
cbrs_backup.py

a tool to download log file from target eNB devices
"""

# SPDX-FileCopyrightText: © 2022 Open Networking Foundation <support@opennetworking.org>
# SPDX-License-Identifier: Apache-2.0

import argparse
import base64
import datetime
import requests
from lxml import etree

parser = argparse.ArgumentParser()
parser.add_argument("address", help="eNB IP address", type=str)
parser.add_argument(
    "-u", "--username", help="eNB UI login username", type=str, default="sc_femto"
)
parser.add_argument(
    "-p", "--password", help="eNB UI login password", type=str, default="scHt3pp"
)
args = parser.parse_args()

ENB_DOMAIN = f"https://{args.address}/"
CGI_URL = ENB_DOMAIN + "setup.cgi"

USERNAME = bytes(args.username.encode())
PASSWORD = bytes(args.password.encode())

# Disable SSL verification since we signed the certificate by our own
session = requests.session()
session.verify = False

# The login payload passed to cgi gateway
login_payload = {
    "un": base64.b64encode(USERNAME).decode(),
    "pw": base64.b64encode(PASSWORD).decode(),
    "this_file": "logon.htm",
    "next_file": "status.htm",
    "todo": "login",
}

r = session.post(CGI_URL, data=login_payload)
e = etree.HTML(r.text)

serial_number = e.xpath("//td")[4].text

download_payload = {
    "this_file": "logsave.htm",
    "next_file": "logsave.htm",
    "todo": "logdownLoad",
}

with session.post(CGI_URL, data=download_payload, stream=True) as r:
    r.raise_for_status()
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    filename = f"{serial_number}_{timestamp}_binary.zip"

    with open(filename, "wb") as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

    print(f"{filename} log backup at {timestamp}.")


text_download_payload = {
    "this_file": "logsave.htm",
    "next_file": "logsave.htm",
    "todo": "TxtlogdownLoad",
}

with session.post(CGI_URL, data=text_download_payload, stream=True) as r:
    r.raise_for_status()
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    filename = f"{serial_number}_{timestamp}_text.zip"

    with open(filename, "wb") as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

    print(f"{filename} log backup at {timestamp}.")


clean_payload = {
    "this_file": "logsave.htm",
    "next_file": "logsave.htm",
    "todo": "logClear",
}

r = session.post(CGI_URL, data=clean_payload)
print(f"{serial_number} log cleared.")
