learn-pr-ovh-eco-autoorder/fetcher.py
2025-01-11 12:04:53 +01:00

163 lines
5.8 KiB
Python
Executable file

#!/usr/bin/python3
import urllib.request
import urllib.error
import errno
import time
import json
import datetime
import re
# OVH eco hunter (catalog fetcher)
server_catalog = {}
server_availabilities={}
offers = {}
try:
with open("offers.json") as ff:
offers = json.load(ff)
except Exception:
print("Error opening offers.json. However creating it.")
def save_file():
global offers
with open("offers.json","w") as ff:
json.dump(offers, ff, default=str,indent=2)
def search_addon(planCode):
global server_availabilities, server_catalog
data={}
for addon in server_catalog['addons']:
if planCode == addon['planCode']:
data['planCode']=addon["planCode"]
data['invoiceName']=addon["invoiceName"]
data['price']=(addon["pricings"][1]["price"]/100000000)
return data
return "unknown"
def search_cpu(planCode, invoiceName):
global server_availabilities, server_catalog
alter_cpu = "" # invoiceName.split("|")[1].strip()
for k in server_catalog['products']:
if k['name'] == planCode:
cpuinfo = k['blobs']['technical']['server']['cpu']
cpu_full_name = cpuinfo['brand']+" "+cpuinfo['model']
return cpu_full_name
return alter_cpu
def get_labels(configurations):
labels={}
for i in configurations:
labels[i["name"]]=i["values"]
return labels
def get_addons(addonFamilies, memory_code, storage_code):
ret_addons={}
ret_addons["price"]=0.0
for i in addonFamilies:
name = i["name"]
if "mandatory" in i and i["mandatory"] == True:
if name == "storage":
in_list=i["addons"]
if len(in_list) > 1:
r = re.compile(storage_code+".*")
out_list=list(filter(r.match, in_list))
elif len(in_list) == 1:
out_list = [in_list[0]]
if len(out_list) > 0:
ret_addons["storage"]=search_addon(out_list[0])
ret_addons["price"]+=ret_addons["storage"]["price"]
elif name == "memory":
in_list=i["addons"]
if len(in_list) > 1:
r = re.compile(memory_code+".*")
out_list=list(filter(r.match, in_list))
elif len(in_list) == 1:
out_list = [in_list[0]]
if len(out_list) > 0:
ret_addons["memory"]=search_addon(out_list[0])
ret_addons["price"]+=ret_addons["memory"]["price"]
else:
ret_addons[name]={}
ret_addons[name]["mandatory"]=i["mandatory"]
ret_addons[name]["default"]=i["default"]
ret_addons[name]["exclusive"]=i["exclusive"]
ret_addons[name]["defaultAddon"]=search_addon(i["default"])
tmp = []
for k in i["addons"]:
tmp.append(search_addon(k))
ret_addons[name]["items"]=tmp
return ret_addons
def get_range(planCode):
ranges={
"sk":"kimsufi",
"sys":"soyoustart",
"rise":"rise",
}
for i in ranges:
pattern = re.compile(".*"+i+".*")
if pattern.match(planCode):
return ranges[i]
return "unkown"
def search_server(planCode, memory_code, storage_code):
global server_availabilities, server_catalog
server = {}
for product in server_catalog['plans']:
if product['planCode'] == planCode:
server['invoiceName']=product['invoiceName']
server['addons'] = {}
server['labels'] = {}
server["sum_price"]=0.0
server['slug']=product['invoiceName'].split("|")[0].lower()
if "range" in product["blobs"]["commercial"]:
server["range"]=product["blobs"]["commercial"]["range"]
else:
server["range"]=get_range(planCode)
server['price']=(product['pricings'][1]['price']/100000000)
server["sum_price"]+=server['price']
server['planCode']=product['planCode']
server["cpu"]=search_cpu(product['planCode'], server['invoiceName'])
server["labels"]=get_labels(product["configurations"])
server["addons"] = get_addons(product["addonFamilies"], memory_code, storage_code)
server["sum_price"]+=server["addons"]["price"]
return server
def fetch_offers_and_servers():
global server_availabilities, server_catalog
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0'}
try:
req = urllib.request.Request(
url="https://www.ovh.ie/engine/apiv6/order/catalog/public/eco?ovhSubsidiary=IE",
data=None,
headers=headers
)
with urllib.request.urlopen(req,timeout=10) as response:
server_catalog =json.loads(response.read().decode("utf-8"))
except Exception as e:
print("error in fetch")
print(e)
pass
return True
def iterate_availabilities(server_availabilities):
global server_catalog, offers
for i in server_availabilities:
planCode=i["planCode"]
fqn=i["fqn"]
memory_code=i["memory"]
storage_code=i["storage"]
offers[fqn]={}
offers[fqn]["fqn"]=fqn
offers[fqn]["planCode"]=planCode
offers[fqn]["memory"]=memory_code
offers[fqn]["storage"]=storage_code
offers[fqn]["catalog"]=search_server(planCode, memory_code, storage_code)
def fetch_catalog(availabilities):
fetch_offers_and_servers()
iterate_availabilities(availabilities)
save_file()
return offers