From 21b8cc283d83d4e932899ced15ff3ade781b156c Mon Sep 17 00:00:00 2001 From: braniz Date: Thu, 16 Nov 2023 09:50:25 +0100 Subject: [PATCH] Initial --- README.md | 1 + __pycache__/create.cpython-311.pyc | Bin 0 -> 8659 bytes __pycache__/json.cpython-311.pyc | Bin 0 -> 3728 bytes __pycache__/lxc_ls.cpython-311.pyc | Bin 0 -> 12303 bytes __pycache__/lxc_ls1.cpython-311.pyc | Bin 0 -> 10141 bytes create.py | 128 ++++++++++++++++++++++ gui.py | 69 ++++++++++++ lxc_ls.py | 161 ++++++++++++++++++++++++++++ 8 files changed, 359 insertions(+) create mode 100644 README.md create mode 100644 __pycache__/create.cpython-311.pyc create mode 100644 __pycache__/json.cpython-311.pyc create mode 100644 __pycache__/lxc_ls.cpython-311.pyc create mode 100644 __pycache__/lxc_ls1.cpython-311.pyc create mode 100644 create.py create mode 100644 gui.py create mode 100644 lxc_ls.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..883a0f7 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# LXC Manage GUI diff --git a/__pycache__/create.cpython-311.pyc b/__pycache__/create.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b108b124edd006cde31956a259227a2c67aed32f GIT binary patch literal 8659 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 literal 0 HcmV?d00001 diff --git a/__pycache__/lxc_ls.cpython-311.pyc b/__pycache__/lxc_ls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d25272f8b0bc514863c7d1ec2b2387445fd417e GIT binary patch literal 12303 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", self.on_tree_double_click) + + self.refresh_button = ttk.Button(self.parent, text='Aktualisieren', command=self.refresh_info) + self.refresh_button.pack(pady=10) + + self.parent.after(10000, self.auto_refresh_info) + + self.refresh_info() + + self.context_menu = tk.Menu(self.parent, tearoff=0) + self.configure_context_menu() + + self.tree.bind("", self.show_context_menu) + + def configure_context_menu(self): + menu_items = [ + ("Start", self.start_container), + ("Stoppen", self.stop_container), + ("Löschen", self.delete_container), + None, # Separator + ("ProtecNO", self.set_protection_no), + ("ProtectYES", self.set_protection_yes) + ] + + for item in menu_items: + if item: + label, command = item + self.context_menu.add_command(label=label, command=command) + else: + self.context_menu.add_separator() + + def show_context_menu(self, event): + self.context_menu.post(event.x_root, event.y_root) + + def run_command(self, command): + try: + result = subprocess.run(command, stdout=subprocess.PIPE, text=True, shell=True, check=True) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + print(f"Fehler beim Ausführen des Befehls: {e}") + return "" + + def get_lxc_info(self): + command_output = self.run_command( + "lxc list -f json | jq -cr '(.[] | [.name, .expanded_devices.root.pool, " + "(.state.network.eth0.addresses // [] | map(select(.family == \"inet\").address) | join(\", \")), " + "(.config.\"security.nesting\" // false), (.config.\"security.protection.delete\" // false), " + ".config.\"image.os\", .config.\"image.release\", .state.status])'" + ) + try: + lxc_info = [json.loads(line) for line in command_output.splitlines()] + lxc_info.sort(key=lambda x: x[7] != 'Stopped') + return lxc_info + except json.JSONDecodeError as e: + print(f"Fehler beim Dekodieren von JSON: {e}") + return [] + + def refresh_info(self): + for item in self.tree.get_children(): + self.tree.delete(item) + + lxc_info = self.get_lxc_info() + + self.tree.tag_configure('oddrow', background='#f0f0f0') + self.tree.tag_configure('evenrow', background='white') + + for i, container_info in enumerate(lxc_info): + container_name, pool, ip_address, nesting, protection, os, release, status = container_info + tags = ('oddrow', 'evenrow')[i % 2] + self.tree.insert('', 'end', values=(container_name, pool, ip_address, f"{nesting}/{protection}", + f"{os} {release}", status), tags=tags) + + def auto_refresh_info(self): + self.refresh_info() + self.parent.after(10000, self.auto_refresh_info) + + def on_tree_double_click(self, event): + item = self.tree.selection()[0] + container_name = self.tree.item(item, 'values')[0] + status = self.tree.item(item, 'values')[5] + + if status == 'Running': + response = messagebox.askyesno("Container stoppen", f"Soll der Container '{container_name}' gestoppt werden?") + if response: + self.run_command(f"lxc stop {container_name}") + elif status == 'Stopped': + response = messagebox.askyesno("Container starten", f"Soll der Container '{container_name}' gestartet werden?") + if response: + self.run_command(f"lxc start {container_name}") + + def start_container(self): + item = self.tree.selection()[0] + container_name = self.tree.item(item, 'values')[0] + response = messagebox.askyesno("Container starten", f"Soll der Container '{container_name}' gestartet werden?") + if response: + self.run_command(f"lxc start {container_name}") + + def stop_container(self): + item = self.tree.selection()[0] + container_name = self.tree.item(item, 'values')[0] + response = messagebox.askyesno("Container stoppen", f"Soll der Container '{container_name}' gestoppt werden?") + if response: + self.run_command(f"lxc stop {container_name}") + + def delete_container(self): + item = self.tree.selection()[0] + container_name = self.tree.item(item, 'values')[0] + status = self.tree.item(item, 'values')[5] + + if status == 'Running': + response = messagebox.askyesno("Container löschen", f"Der Container '{container_name}' ist noch aktiv. Möchten Sie ihn trotzdem löschen?") + if response: + self.run_command(f"lxc stop {container_name}") + self.run_command(f"lxc delete {container_name}") + else: + response = messagebox.askyesno("Container löschen", f"Soll der Container '{container_name}' gelöscht werden?") + if response: + self.run_command(f"lxc delete {container_name}") + + def set_protection_no(self): + self.set_protection(False) + + def set_protection_yes(self): + self.set_protection(True) + + def set_protection(self, enable_protection): + item = self.tree.selection()[0] + container_name = self.tree.item(item, 'values')[0] + + protection_setting = "true" if enable_protection else "false" + self.run_command(f"lxc config set {container_name} security.protection.delete={protection_setting}") + + def column_sort(self, col, reverse): + l = [(self.tree.set(k, col), k) for k in self.tree.get_children('')] + l.sort(reverse=reverse) + + for index, (val, k) in enumerate(l): + self.tree.move(k, '', index) + +if __name__ == "__main__": + root = tk.Tk() + app = LXCInfoGUI(root) + root.mainloop()