virtui-manager 1.4.0__py3-none-any.whl → 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtui-manager
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: Terminal-based interface to manage virtual machines using libvirt
5
5
  Home-page: https://aginies.github.io/virtui-manager/
6
6
  Author: Antoine Ginies
@@ -1,19 +1,20 @@
1
- virtui_manager-1.4.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1
+ virtui_manager-1.5.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
2
  vmanager/__init__.py,sha256=-gTpOgkPAOtbLwxz-U9i2uVtFW1SB9JhBguViXnQPJ8,15
3
3
  vmanager/config.py,sha256=OBMWtXBTnmws1ITjQ7D_C0LVMxzvGaRH8nZOlW9cbqk,3102
4
4
  vmanager/connection_manager.py,sha256=osk0EHJ0ua2wnDOu-9faK8fMd7s9TGsI6OtgxLAMTCI,12984
5
- vmanager/constants.py,sha256=Go5YTNzTlpxV9WZxB5njfDMQdwf8NnqGf4t08rhMuz4,48284
5
+ vmanager/constants.py,sha256=iynQh2ya31P0QMEdoUAVELtgCfZDx3p1mPYe-DWPfs0,48791
6
6
  vmanager/dialog.css,sha256=HhYqGy0U-R6Efig3JbyEmHJWiceL1Rh_hzpSaDewJro,11753
7
7
  vmanager/events.py,sha256=yvjcYHMoDnnDKsMjfweZYnu0-U7lxQlB2uuIbtK5FeY,1556
8
8
  vmanager/firmware_manager.py,sha256=bnjBnbT3iT-glKL0p6J14wbAcRIntksze8YnzgKmXNg,3481
9
- vmanager/i18n.py,sha256=-43SASKyq806Nkh4ITSq9wxLVbPxh4-YA-2NqeqeWEw,749
9
+ vmanager/gui_wrapper.py,sha256=olRqksAZr-mysAS3r-RGti9mkU1LNdVBQm346suPrJ8,3034
10
+ vmanager/i18n.py,sha256=a_3YCc5c4hDaj_oVCNB2u2W5Go7fzoNNXfuwyeFxva8,747
10
11
  vmanager/libvirt_error_handler.py,sha256=aDumo2yNv9_rsbWjYtglt0ixQx8T2WTvgdEF8Uuanqw,1797
11
12
  vmanager/libvirt_utils.py,sha256=eJML4YcmSxIUJWMi4_fzzG8nnCq97WH_Y5CEaLB35CY,20366
12
13
  vmanager/network_manager.py,sha256=0dlh9D-p4LlEfuiQnyd3s3lxhU1GjO4x89sCKVA3fzE,8748
13
14
  vmanager/remote_viewer.py,sha256=evFvp7ilKPuTf-YA4jCGMgO6dzdhbL1iea1lzETwWeU,89495
14
15
  vmanager/remote_viewer_gtk4.py,sha256=KIyejYq_PgmSL6yAUOnnloqpaIWdkYIPdoP6CmMaTOo,45994
15
16
  vmanager/storage_manager.py,sha256=MewZBTyBGUtKrVQpXH-DrQpr9CPIFi7VLE-8avrE8jw,46773
16
- vmanager/utils.py,sha256=mdcLp4zqDjx8BOs698I3kGFududHMxcrfR5oJNouATo,18914
17
+ vmanager/utils.py,sha256=9MM7_jyAiY4vDljIYWwVK8Kqtyxwk-NKK90D_dY0P4A,18985
17
18
  vmanager/virtui_dev.py,sha256=M2pJEZRNApqezkj4RdEJR9neEdc_7HV3KInVGy9QgiQ,3118
18
19
  vmanager/vm_actions.py,sha256=xDP3KTHsyavSttp7UrcV36_13aCpMXTqYvBLW1UChuM,118436
19
20
  vmanager/vm_cache.py,sha256=dxNj1TrkIAI8NW8SZj0QsfhHkjCrylQ5rgcvPN2zDnQ,1181
@@ -22,20 +23,20 @@ vmanager/vm_provisioner.py,sha256=ZOlwHQzsa1Ur90wWtFl8oBUTfozT9wjURV6Yk1O6H84,46
22
23
  vmanager/vm_queries.py,sha256=4yife9RymBqYR0Jk3NHJ7VYIQ0R5qdzb70OurlXDhtM,52776
23
24
  vmanager/vm_service.py,sha256=W_j4u5-I0ZujSho6ecC5NEapX5N4lzSWn8lR0ocr2RM,70819
24
25
  vmanager/vmanager.css,sha256=7HzaivsJ2lRMvbYP3QSqG2ZR8gwFdJr2hMBvjSu4WdI,14853
25
- vmanager/vmanager.py,sha256=eGJKPOBTTnwkgMDft47S-IF1oHmq9Lko6azLYef6YiM,82191
26
+ vmanager/vmanager.py,sha256=6eq5UiIwApWzG3HeBx2BGpYlVKueht_82TnpqcQN3FU,83037
26
27
  vmanager/vmanager_cmd.py,sha256=IQtCozK6OvdjpIgL_umuv8LkHNk-W9DsQtsxpZ5fQRk,32161
27
- vmanager/vmcard.css,sha256=UzaomqxOj0XqV-sSrYQSjltOGSMlq2pstGJEXHCTMco,3186
28
- vmanager/vmcard.py,sha256=kpfJli6vtfCiDo90pcV8BNq4vHhI6pBPE3A37quyl4I,101967
28
+ vmanager/vmcard.css,sha256=rHrDZftmwfnM5wjhZhLjSajnI3PRf8TW-ub3rG-Pqrg,3367
29
+ vmanager/vmcard.py,sha256=No9LsCCL08IK1cBQAHxOq4VG0l6pbwB4ntnvxKxXq6M,104016
29
30
  vmanager/vmcard_pool.py,sha256=IgZZIHNNt3t8CAiKalpQpEF69KY8MZ-csuBrh71AmKM,3514
30
31
  vmanager/webconsole_manager.py,sha256=3Coafu6SiPWMLB3fMTKvXPHQK3zVCkiUrYaQ-5Ka0sM,28910
31
32
  vmanager/wrapper.py,sha256=6aIz7YRN__Cl78XEBxqQ6g7tWMZ9S_8Nq6XaOtaivTM,1265
32
- vmanager/locales/virtui-manager.pot,sha256=t6r3sYHkTntGSbA5NsXmkj5NGvS3GCQ8pROLevcPR4Y,54901
33
- vmanager/locales/de/LC_MESSAGES/virtui-manager.mo,sha256=oHx4ieR-HQ1gQfaEpU8-5yt8VNNkZtiXKkTY1aimCBc,62677
34
- vmanager/locales/de/LC_MESSAGES/virtui-manager.po,sha256=DE9GR5XCc-1osvzhx6TCB0S7xpY8vRysqVkESIPFd5o,81724
35
- vmanager/locales/fr/LC_MESSAGES/virtui-manager.mo,sha256=h_wYYkPJkNUl2ZlQOTaMmKx-uTaMHp05fAygzSnZoEM,63605
36
- vmanager/locales/fr/LC_MESSAGES/virtui-manager.po,sha256=VMo794veB369TPjlyzJH_wOfnqobx4QdnPjyL1l-JgY,83054
37
- vmanager/locales/it/LC_MESSAGES/virtui-manager.mo,sha256=KTEXpHlHEO3CM4dns8TbkrPqPNluahBUlLQtHw1YkJQ,60691
38
- vmanager/locales/it/LC_MESSAGES/virtui-manager.po,sha256=__qwKYImH1n-KGx6DjYrr1Yu6hyhUd6FPVp7XRJR9BE,79591
33
+ vmanager/locale/virtui-manager.pot,sha256=-aTS8Pci22WF3wnnjP5JhVNY5h07Pz6wcHvj4brUZww,55619
34
+ vmanager/locale/de/LC_MESSAGES/virtui-manager.mo,sha256=x48qmzKkXVWPlDdICY8ElZ2QxIEXPRFzZmCd4TK7SSg,63051
35
+ vmanager/locale/de/LC_MESSAGES/virtui-manager.po,sha256=oNOV-POIwDSD27psnJ2gYe2QNRtaynAEa2GVsBP2AZE,82660
36
+ vmanager/locale/fr/LC_MESSAGES/virtui-manager.mo,sha256=FIdsflho_pCD_qBqc4U4JdPpp_y4IghhH-6QgjzHd6M,64260
37
+ vmanager/locale/fr/LC_MESSAGES/virtui-manager.po,sha256=3IvnbIFEAAtNZMTbgaxXh8B4YK0_wAWsbUK1N4fRGmo,83899
38
+ vmanager/locale/it/LC_MESSAGES/virtui-manager.mo,sha256=Z0A8fuXZUHuZo-qJ3dMJMvzOvdUjv-f3wJ5tV0DnsKU,62432
39
+ vmanager/locale/it/LC_MESSAGES/virtui-manager.po,sha256=qJ0OKZHLd7XaBxna_vVTBGGrmrywNVncVH0AHPARDNs,80727
39
40
  vmanager/modals/__init__.py,sha256=Os1P7i7chUJCxGu4LOC_LJaJgpVOiOhxYzWNoW9Ubuw,36
40
41
  vmanager/modals/base_modals.py,sha256=quGmI_FnoD7UVemruvYsvtz1whhJCNVr2hzQ3tl0hak,1263
41
42
  vmanager/modals/bulk_modals.py,sha256=zlH5WxVFouJBJrchVLY3uAj3nl6NWC4PvWHhNH1cDFw,3172
@@ -69,8 +70,8 @@ vmanager/modals/vmanager_modals.py,sha256=UL2nS5ZH3ik8wEALXptNL22xMsGhime2vX73HX
69
70
  vmanager/modals/vmcard_dialog.py,sha256=NP4qVYfZC58FF0_dXiI-2Q_XqZ1wfGcya1cKnYzBZTw,18848
70
71
  vmanager/modals/vmdetails_modals.py,sha256=VcNq2NZ9JUvfNufrQc4YnbwsxzS1ZoXw91AR3KGSN9Y,151040
71
72
  vmanager/modals/xml_modals.py,sha256=8lVJFqXM42w2kzCGyVa0Xks8-EfwMLHgkU_U6aqFnLY,1712
72
- virtui_manager-1.4.0.dist-info/METADATA,sha256=aQk1gWdWw5Ju-fSLlgBO_559C9gbAsPNn_nM0kmMGZE,5329
73
- virtui_manager-1.4.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
74
- virtui_manager-1.4.0.dist-info/entry_points.txt,sha256=hnJHxJyDFPSNdOaxmMYikXeoJMXG2llKG-l_Ygv7ges,163
75
- virtui_manager-1.4.0.dist-info/top_level.txt,sha256=fQ1nwH-4wZrf6Rc9HEHbudVahpy3TqeuMxgaaNHevxM,9
76
- virtui_manager-1.4.0.dist-info/RECORD,,
73
+ virtui_manager-1.5.0.dist-info/METADATA,sha256=yTO_cOBEu6FoDHJCZeHfum5l8r5fqc1xQtl3Yik8KLk,5329
74
+ virtui_manager-1.5.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
75
+ virtui_manager-1.5.0.dist-info/entry_points.txt,sha256=SrZ_7U4R3gPInnJ8Ia2i6yuM7lJ1lMDcnLomIVR3jFA,202
76
+ virtui_manager-1.5.0.dist-info/top_level.txt,sha256=fQ1nwH-4wZrf6Rc9HEHbudVahpy3TqeuMxgaaNHevxM,9
77
+ virtui_manager-1.5.0.dist-info/RECORD,,
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ virtui-gui = vmanager.gui_wrapper:main
2
3
  virtui-manager = vmanager.wrapper:main
3
4
  virtui-manager-cmd = vmanager.wrapper:cmd_main
4
5
  virtui-remote-viewer = vmanager.wrapper:remote_viewer_main
vmanager/constants.py CHANGED
@@ -38,7 +38,7 @@ class AppInfo:
38
38
  """Define app data"""
39
39
  name = "virtui-manager"
40
40
  namecase = "VirtUI Manager"
41
- version = "1.4.0"
41
+ version = "1.5.0"
42
42
 
43
43
  class VmAction:
44
44
  """Defines constants for VM action types."""
@@ -407,6 +407,9 @@ class StaticText:
407
407
  WAITING_TO_START_COLLECTION = _("Waiting to start collection...")
408
408
  COLLECTING_VM_INFO = _("Collecting VM info: {current}/{total}")
409
409
  EDIT_VIRTIOFS_MOUNT = _("Edit VirtIO-FS")
410
+ LATEST_SNAPSHOT = _("Latest Snapshot:")
411
+ NO_SNAPSHOTS_CREATED = _("No Snapshots created")
412
+ SELECT_OVERLAY_DISCARD = _("Select overlay disk to discard:")
410
413
 
411
414
  class SparklineLabels:
412
415
  """Constants for sparkline labels"""
@@ -685,11 +688,13 @@ class DialogMessages:
685
688
  CONFIRM_REMOVE_USB_DEVICE_TEMPLATE = _("Are you sure you want to remove USB device '{description}'?")
686
689
  CONFIRM_REMOVE_SCSI_CONTROLLER_TEMPLATE = _("Are you sure you want to remove SCSI controller '{model}' at index '{index}'?")
687
690
  CONFIRM_REMOVE_VIRTIOFS_TEMPLATE = _("Are you sure you want to remove VirtIO-FS mount '{target_path}'?")
691
+ CONFIRM_DISCARD_CHANGES = _("Are you sure you want to discard changes in '{target_disk}' and revert t o its backing file? This action cannot be undone.")
692
+ CONFIRM_MERGE_CHANGES = _("Are you sure you want to merge changes from '{target_disk}' into its backing file?")
688
693
 
689
694
 
690
695
  class QuickMessages:
691
696
  """Constants for quick messages"""
692
- REMOTE_VIEWER_SELECTED = _("The remove viewer {viewer} has been selected.")
697
+ REMOTE_VIEWER_SELECTED = _("The remote viewer {viewer} has been selected.")
693
698
  VM_DATA_LOADED = _("VM data loaded. Displaying VMs...")
694
699
  FILTER_RUNNING_VMS = _("Filter: Running VMs")
695
700
  FILTER_ALL_VMS = _("Filter: All VMs")
@@ -813,3 +818,4 @@ class ProgressMessages:
813
818
  CONNECTING_TO_SERVER = _("Connecting to [b]{uri}[/b]...")
814
819
  CONFIG_UPDATED_REFRESHING_VM_LIST = _("Configuration updated. Refreshing VM list...")
815
820
  LOADING_VM_DATA_FROM_REMOTE_SERVERS = _("Loading VM data from remote server(s)...")
821
+ COMMITTING_CHANGES_FOR = _("Committing changes for {name}...")
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env python3
2
+ import sys
3
+ import os
4
+ import gi
5
+
6
+ # Require GTK 3.0 and Vte 2.91
7
+ try:
8
+ gi.require_version('Gtk', '3.0')
9
+ gi.require_version('Vte', '2.91')
10
+ except ValueError as e:
11
+ print(f"Error: Missing required libraries. {e}")
12
+ sys.exit(1)
13
+
14
+ from gi.repository import Gtk, Vte, GLib, Pango
15
+
16
+ class VirtuiWrapper(Gtk.Window):
17
+ def __init__(self):
18
+ super().__init__(title="Virtui Manager Console")
19
+
20
+ self.set_default_size(1200, 1024)
21
+ self.terminal = Vte.Terminal()
22
+ self.terminal.set_size(92, 34)
23
+
24
+ font_desc = Pango.FontDescription("Monospace 12")
25
+ self.terminal.set_font(font_desc)
26
+
27
+ self.terminal.set_scrollback_lines(10000)
28
+
29
+ self.terminal.connect("child-exited", self.on_child_exited)
30
+
31
+ # Add terminal to a ScrolledWindow to handle scrolling
32
+ scrolled_window = Gtk.ScrolledWindow()
33
+ scrolled_window.set_hexpand(True)
34
+ scrolled_window.set_vexpand(True)
35
+ scrolled_window.add(self.terminal)
36
+
37
+ self.add(scrolled_window)
38
+
39
+ self.connect("destroy", Gtk.main_quit)
40
+ self.spawn_app()
41
+
42
+ def spawn_app(self):
43
+ # python3 -m vmanager.wrapper
44
+ cmd = [sys.executable, "-m", "vmanager.wrapper"]
45
+ env = os.environ.copy()
46
+
47
+ # Calculate src directory relative to this script
48
+ # This script is in src/vmanager/gui_wrapper.py
49
+ script_dir = os.path.dirname(os.path.realpath(__file__))
50
+ src_dir = os.path.dirname(script_dir)
51
+
52
+ current_pythonpath = env.get("PYTHONPATH", "")
53
+ if src_dir not in current_pythonpath:
54
+ env["PYTHONPATH"] = f"{src_dir}:{current_pythonpath}" if current_pythonpath else src_dir
55
+
56
+ # Convert env to list of strings "KEY=VALUE" for spawn_async
57
+ envv = [f"{k}={v}" for k, v in env.items()]
58
+
59
+ try:
60
+ # Vte.Terminal.spawn_async(pty_flags, working_directory, argv, envv, spawn_flags, child_setup, child_setup_data, timeout, cancellable, callback, user_data)
61
+ self.terminal.spawn_async(
62
+ Vte.PtyFlags.DEFAULT,
63
+ os.getcwd(), # Working directory
64
+ cmd, # Command arguments
65
+ envv, # Environment
66
+ GLib.SpawnFlags.DEFAULT,
67
+ None, # child_setup
68
+ None, # child_setup_data
69
+ -1, # timeout
70
+ None, # cancellable
71
+ None, # callback
72
+ None # user_data
73
+ )
74
+ except Exception as e:
75
+ error_msg = f"Error spawning application: {e}\n"
76
+ self.terminal.feed(error_msg.encode('utf-8'))
77
+ print(error_msg)
78
+
79
+ def on_child_exited(self, terminal, status):
80
+ print(f"Child exited with status: {status}")
81
+ Gtk.main_quit()
82
+
83
+ def main():
84
+ app = VirtuiWrapper()
85
+ app.show_all()
86
+ Gtk.main()
87
+
88
+ if __name__ == "__main__":
89
+ main()
vmanager/i18n.py CHANGED
@@ -3,9 +3,9 @@ import os
3
3
  import locale
4
4
  import logging
5
5
 
6
- # Setup path to locales
6
+ # Setup path to locale
7
7
  # This assumes the 'locales' directory is next to this file
8
- LOCALE_DIR = os.path.join(os.path.dirname(__file__), 'locales')
8
+ LOCALE_DIR = os.path.join(os.path.dirname(__file__), 'locale')
9
9
  DOMAIN = 'virtui-manager'
10
10
 
11
11
  _ = lambda s: s