import os
import pymongo
import subprocess
import time

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["int_details"]
coll_interface_info = db["ubuntu_interface_info"]
coll_vpp_pci_info = db["vpp_pci_info"]
coll_vpp_pci_info.delete_many({})


def int_conf():
  interface_details = subprocess.check_output(["sudo", "vppctl", "show", "hardware-interfaces"]).decode()
  with open("int_details.txt", "w") as f:
    f.write(interface_details)
  pci_out1 = subprocess.check_output(["awk", "/Gigabit/ {print $1} /pci/ {print $7}", "int_details.txt"]).decode()
  pci_out2 = pci_out1.split("\n")
  j=0
  list_len = int(len(pci_out2)/2)
  for i in range(list_len):
    colect = {"interface_name":pci_out2[j], "pci_address":pci_out2[j+1]}
    j = j+2
    coll_vpp_pci_info.insert_one(colect)
  k = 1
  for  i in coll_vpp_pci_info.find():
    for j in coll_interface_info.find():
      if "pci_address" in j:
        if i["pci_address"] == j["pci_address"]:
       
          query = {"pci_address":j["pci_address"]}
          update_data = {"$set": {"IPv4address": j["IPv4address"]}}
          coll_vpp_pci_info.update_many(query, update_data)
        
          update_data1 = {"$set": {"type": j["type"]}}
          coll_vpp_pci_info.update_many(query, update_data1)
          int_name = "Reach_int"+str(k)
          k = k+1
          with open("/etc/vpp/bootstrap.vpp", "a") as f:
            f.write(f"\nset int state {i['interface_name']} up\nset int mtu packet 1500 {i['interface_name']}\nset int ip address {i['interface_name']} {j['IPv4address']}\nlcp create {i['interface_name']} host-if {int_name}\nlcp lcp-sync on\nlcp lcp-auto-subint on\n")
          
          if "gateway" in j:
            with open("/etc/vpp/bootstrap.vpp", "a") as f:
              f.write(f"\nip route add 0.0.0.0/0 via {j['gateway']}\n")
            with open ("/etc/frr/frr.conf", "a") as f:
              f.write(f"\n!\nip route 0.0.0.0/0 {j['gateway']}\n!\n")
           
            query = {"pci_address":j["pci_address"]}
            update_data = {"$set": {"gateway": j["gateway"]}}
            coll_vpp_pci_info.update_many(query, update_data)
#---------------------------
#nat configuration 
def nat_conf():
  lan_count = 0
  wan_count = 0
  for  i in coll_vpp_pci_info.find():
    if "type" in i:
      if wan_count == 0:
        if i["type"] == "wan":
          nat_intfc_out = i["interface_name"]
          wan_count =1
      if lan_count == 0:
        if i["type"] == "lan":
          nat_intfc_in = i["interface_name"]
          lan_count = 1
         
  with open("/etc/vpp/bootstrap.vpp", "a") as f:
    f.write(f"\nnat44 plugin enable sessions 10000\nnat44 forwarding enable\nnat44 add interface address {nat_intfc_out}\nset int nat44 in {nat_intfc_in} out {nat_intfc_out}\n")


def run_command(command):
  try:
      out = subprocess.check_output(command.split()).decode()
      status = 0
  except subprocess.CalledProcessError:
      status = -1
  return status
    

def service_restart():
  status = run_command("sudo service vpp restart") 
  if status == -1:
    print("Error in VPP configuration")
    exit()  
  status = run_command("sudo service frr restart")
  if status == -1:
    print("Error in FRR configuration")
    exit()  
  os.system("sudo mv /etc/netplan/00-installer-config.yaml .") 
  time.sleep(180)

	     

