@@ -103,13 +103,16 @@ def __init__(self):
103103 "Halted" : QIcon (":/blank" )
104104 }
105105 self .outdatedIcons = {
106+ "blocked" : QIcon (":/ban" ),
106107 "update" : QIcon (":/updateable" ),
107108 "outdated" : QIcon (":/outdated" ),
108109 "to-be-outdated" : QIcon (":/outdated" ),
109110 "eol" : QIcon (':/warning' ),
110111 "skipped" : QIcon (':/skipped' )
111112 }
112113 self .outdatedTooltips = {
114+ "blocked" : self .tr (
115+ "The qube is prohibited from being started" ),
113116 "update" : self .tr ("Updates available" ),
114117 "outdated" : self .tr (
115118 "The qube must be restarted for recent changes in "
@@ -239,6 +242,12 @@ def update_power_state(self):
239242
240243 self .state ['outdated' ] = ""
241244 try :
245+ if self .vm .klass != "AdminVM" and manager_utils .get_feature (
246+ self .vm , 'prohibit-start' , False ):
247+ # Special case where being outdated, eol & skipped is irrelevant
248+ self .state ['outdated' ] = 'blocked'
249+ return
250+
242251 if manager_utils .is_running (self .vm , False ):
243252 if hasattr (self .vm , 'template' ) and \
244253 manager_utils .is_running (self .vm .template , False ):
@@ -253,6 +262,9 @@ def update_power_state(self):
253262
254263 if self .vm .klass in {'TemplateVM' , 'StandaloneVM' }:
255264 if manager_utils .get_feature (
265+ self .vm , 'prohibit-start' , False ):
266+ self .state ['outdated' ] = 'ban'
267+ elif manager_utils .get_feature (
256268 self .vm , 'skip-update' , False ):
257269 self .state ['outdated' ] = 'skipped'
258270 elif manager_utils .get_feature (
@@ -264,6 +276,8 @@ def update_power_state(self):
264276 eol = datetime .strptime (eol_string , '%Y-%m-%d' )
265277 if datetime .now () > eol :
266278 self .state ['outdated' ] = 'eol'
279+ else :
280+ self .state ['outdated' ] = None
267281 except exc .QubesDaemonAccessError :
268282 pass
269283
@@ -879,6 +893,10 @@ def __init__(self, qt_app, qubes_app, dispatcher, _parent=None):
879893 self .on_domain_updates_available )
880894 dispatcher .add_handler ('domain-feature-delete:skip-update' ,
881895 self .on_domain_updates_available )
896+ dispatcher .add_handler ('domain-feature-set:prohibit-start' ,
897+ self .on_domain_updates_available )
898+ dispatcher .add_handler ('domain-feature-delete:prohibit-start' ,
899+ self .on_domain_updates_available )
882900
883901 self .installEventFilter (self )
884902
@@ -1125,11 +1143,16 @@ def check_updates(self, info=None):
11251143 try :
11261144 if info .vm .klass in {'TemplateVM' , 'StandaloneVM' }:
11271145 if manager_utils .get_feature (
1146+ info .vm , 'prohibit-start' , False ):
1147+ info .state ['outdated' ] = 'blocked'
1148+ elif manager_utils .get_feature (
11281149 info .vm , 'skip-update' , False ):
11291150 info .state ['outdated' ] = 'skipped'
11301151 elif manager_utils .get_feature (
11311152 info .vm , 'updates-available' , False ):
11321153 info .state ['outdated' ] = 'update'
1154+ else :
1155+ info .state ['outdated' ] = None
11331156 except exc .QubesDaemonAccessError :
11341157 return
11351158
@@ -1352,6 +1375,17 @@ def table_selection_changed(self):
13521375 if not vm .updateable and vm .klass != 'AdminVM' :
13531376 self .action_updatevm .setEnabled (False )
13541377
1378+ if vm .vm .features .get ('prohibit-start' , False ):
1379+ self .action_open_console .setEnabled (False )
1380+ self .action_resumevm .setEnabled (False )
1381+ self .action_startvm_tools_install .setEnabled (False )
1382+ self .action_pausevm .setEnabled (False )
1383+ self .action_restartvm .setEnabled (False )
1384+ self .action_killvm .setEnabled (False )
1385+ self .action_shutdownvm .setEnabled (False )
1386+ self .action_updatevm .setEnabled (False )
1387+ self .action_run_command_in_vm .setEnabled (False )
1388+
13551389 self .update_template_menu ()
13561390 self .update_network_menu ()
13571391
0 commit comments