openwrt-build-gui.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/usr/bin/env python3
  2. import tkinter as tk
  3. from tkinter import filedialog
  4. from tkinter import ttk
  5. import os.path
  6. import pandas
  7. import gzip
  8. import urllib.request
  9. # This will enable file caching and some dev output
  10. debug=True
  11. class Main(tk.Frame):
  12. """This module generates information for the tkinter gui"""
  13. def __init__(self, parent, *args, **kwargs):
  14. super().__init__(parent, *args, **kwargs)
  15. # Get Table of Hardware (toh) from openwrt.org and save to a pandas df
  16. self.toh_df = self.get_toh_df()
  17. # Target menu
  18. self.target = tk.StringVar()
  19. self.targets, self.target_menu = self.gen_target_menu()
  20. self.target.set(self.targets[0])
  21. # Subtarget menu
  22. self.subtarget = tk.StringVar()
  23. self.subtargets, self.subtarget_menu = self.gen_subtarget_menu()
  24. self.subtarget.set(self.subtargets[0])
  25. self.target.trace("w", lambda var_name, var_index, operation: self.gen_subtarget_menu(regen=True))
  26. # Backup file
  27. self.backup_file = tk.StringVar()
  28. self.backup_file_entry = ttk.Entry(self, textvariable=self.backup_file)
  29. self.backup_file_button = ttk.Button(self, text="Select backup file", command=self.open_sysbackup)
  30. # Device Info
  31. self.device_info = tk.StringVar()
  32. # Layout
  33. self.target_menu.grid(row=0, column=0, sticky=(tk.W + tk.E))
  34. self.subtarget_menu.grid(row=0, column=1, sticky=(tk.W + tk.E))
  35. self.backup_file_entry.grid(row=1, column=1, sticky=(tk.W + tk.E))
  36. self.backup_file_button.grid(row=1, column=0, sticky=(tk.W))
  37. self.columnconfigure(1, weight=1)
  38. def get_toh_df(self):
  39. cache_file = "sources/toh.tsv"
  40. if debug is True and os.path.isfile(cache_file):
  41. with open(cache_file) as infile:
  42. try:
  43. toh_df = pandas.read_csv(infile)
  44. except:
  45. os.remove(cache_file)
  46. else:
  47. toh_gz_handle = urllib.request.urlopen("https://openwrt.org/_media/toh_dump_tab_separated.gz")
  48. toh_handle = gzip.open(toh_gz_handle)
  49. toh_df = pandas.read_csv(toh_handle, sep="\t", encoding = "ISO-8859-1")
  50. toh_df = toh_df[(toh_df.target.notnull()) &
  51. (toh_df.subtarget.notnull()) &
  52. (toh_df.target != '¿') &
  53. (toh_df.subtarget != '¿')]
  54. if debug is True:
  55. with open(cache_file, 'w') as outfile:
  56. toh_df.to_csv(outfile)
  57. return toh_df
  58. def gen_target_menu(self, *args, **kwargs):
  59. targets = sorted(set(self.toh_df.target.tolist()))
  60. target_menu = ttk.OptionMenu(self, self.target, targets[0], *targets)
  61. return targets, target_menu
  62. def gen_subtarget_menu(self, regen=False, *args, **kwargs):
  63. subtargets_df = self.toh_df[self.toh_df.target == self.target.get()]
  64. subtargets = sorted(set(subtargets_df.subtarget.tolist()))
  65. if regen is False:
  66. subtarget_menu = ttk.OptionMenu(self, self.subtarget, subtargets[0], *subtargets)
  67. return subtargets, subtarget_menu
  68. else: # Regen
  69. self.subtarget_menu["menu"].delete(0, "end")
  70. for subtarget in subtargets:
  71. self.subtarget_menu["menu"].add_command(label=subtarget, command=lambda value=subtarget: self.subtarget.set(subtarget))
  72. self.subtarget.set(subtargets[0])
  73. def open_sysbackup(self):
  74. file = filedialog.askopenfile(mode ='r', title="Select Backup File", filetypes=[("OpenWRT sysbackup file", ".tar.gz")])
  75. if file is not None:
  76. self.backup_file.set(file.name)
  77. class GUI(tk.Tk):
  78. """Create the GUI"""
  79. def __init__(self, *args, **kwargs):
  80. super().__init__(*args, **kwargs)
  81. # Set the window properties
  82. self.title("openwrt-build")
  83. self.geometry("1280x960")
  84. self.resizable(width=False, height=False)
  85. # Define the UI
  86. Main(self).grid(sticky=(tk.E + tk.W + tk.N + tk.S))
  87. self.columnconfigure(0, weight=1)
  88. if __name__ == '__main__':
  89. app = GUI()
  90. app.mainloop()
  91. #
  92. # , usecols=['brand',
  93. # 'model',
  94. # 'supportedsincerel',
  95. # 'supportedcurrentrel',
  96. # 'target',
  97. # 'subtarget']
  98. #