diff --git a/openwrt-build-gui.py b/openwrt-build-gui.py new file mode 100644 index 0000000..30bea55 --- /dev/null +++ b/openwrt-build-gui.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 + +import tkinter as tk +from tkinter import filedialog +from tkinter import ttk +import pandas +import gzip +import urllib.request + + +class Main(tk.Frame): + """This module generates information for the tkinter gui""" + + def __init__(self, parent, *args, **kwargs): + super().__init__(parent, *args, **kwargs) + + # Get Table of Hardware (toh) from openwrt.org and save to a pandas df + self.toh_df = self.get_toh_df() + + # Target menu + self.target = tk.StringVar() + self.targets, self.target_menu = self.gen_target_menu() + self.target.set(self.targets[0]) + + # Subtarget menu + self.subtarget = tk.StringVar() + self.subtargets, self.subtarget_menu = self.gen_subtarget_menu() + self.subtarget.set(self.subtargets[0]) + self.target.trace("w", lambda var_name, var_index, operation: self.gen_subtarget_menu(regen=True)) + + # Backup file + self.backup_file = tk.StringVar() + self.backup_file_entry = ttk.Entry(self, textvariable=self.backup_file) + self.backup_file_button = ttk.Button(self, text="Select backup file", command=self.open_sysbackup) + + # Device Info + self.device_info = tk.StringVar() + + + # Layout + self.target_menu.grid(row=0, column=0, sticky=(tk.W + tk.E)) + self.subtarget_menu.grid(row=0, column=1, sticky=(tk.W + tk.E)) + self.backup_file_entry.grid(row=1, column=1, sticky=(tk.W + tk.E)) + self.backup_file_button.grid(row=1, column=0, sticky=(tk.W)) + self.columnconfigure(1, weight=1) + + + def get_toh_df(self): + toh_gz_handle = urllib.request.urlopen("https://openwrt.org/_media/toh_dump_tab_separated.gz") + toh_handle = gzip.open(toh_gz_handle) + toh_df = pandas.read_csv(toh_handle, sep="\t", encoding = "ISO-8859-1") + toh_df = toh_df[(toh_df.target.notnull()) & + (toh_df.subtarget.notnull()) & + (toh_df.target != '¿') & + (toh_df.subtarget != '¿')] + return toh_df + + + def gen_target_menu(self, *args, **kwargs): + targets = sorted(set(self.toh_df.target.tolist())) + target_menu = ttk.OptionMenu(self, self.target, targets[0], *targets) + return targets, target_menu + + + def gen_subtarget_menu(self, regen=False, *args, **kwargs): + subtargets_df = self.toh_df[self.toh_df.target == self.target.get()] + subtargets = sorted(set(subtargets_df.subtarget.tolist())) + if regen is False: + subtarget_menu = ttk.OptionMenu(self, self.subtarget, subtargets[0], *subtargets) + return subtargets, subtarget_menu + else: # Regen + self.subtarget_menu["menu"].delete(0, "end") + for subtarget in subtargets: + self.subtarget_menu["menu"].add_command(label=subtarget, command=lambda value=subtarget: self.subtarget.set(subtarget)) + self.subtarget.set(subtargets[0]) + + + def open_sysbackup(self): + file = filedialog.askopenfile(mode ='r', title="Select Backup File", filetypes=[("OpenWRT sysbackup file", ".tar.gz")]) + if file is not None: + self.backup_file.set(file.name) + + + + +class GUI(tk.Tk): + """Create the GUI""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Set the window properties + self.title("openwrt-build") + self.geometry("1280x960") + self.resizable(width=False, height=False) + + # Define the UI + Main(self).grid(sticky=(tk.E + tk.W + tk.N + tk.S)) + self.columnconfigure(0, weight=1) + + +if __name__ == '__main__': + app = GUI() + app.mainloop() + + + +# +# , usecols=['brand', +# 'model', +# 'supportedsincerel', +# 'supportedcurrentrel', +# 'target', +# 'subtarget'] +# \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1411a4a --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pandas \ No newline at end of file