Merge branch 'system-upgrade-mode' into 'master'

Add new reboot and system-upgrade modes

See merge request plymouth/plymouth!29
This commit is contained in:
Hans de Goede 2019-02-26 16:03:19 +00:00
commit 8cc301ef79
12 changed files with 134 additions and 104 deletions

View file

@ -782,38 +782,42 @@ static void
on_change_mode_request (state_t *state,
const char *command)
{
bool boot_up;
bool shutdown;
bool updates;
bool boot_up = false;
bool shutdown = false;
bool reboot = false;
bool updates = false;
bool system_upgrade = false;
const char *mode = NULL;
boot_up = false;
shutdown = false;
updates = false;
ply_command_parser_get_command_options (state->command_parser,
command,
"boot-up", &boot_up,
"shutdown", &shutdown,
"reboot", &reboot,
"updates", &updates,
"system-upgrade", &system_upgrade,
NULL);
if (boot_up) {
ply_boot_client_change_mode (state->client, "boot-up",
(ply_boot_client_response_handler_t)
on_success,
(ply_boot_client_response_handler_t)
on_failure, state);
} else if (shutdown) {
ply_boot_client_change_mode (state->client, "shutdown",
(ply_boot_client_response_handler_t)
on_success,
(ply_boot_client_response_handler_t)
on_failure, state);
} else if (updates) {
ply_boot_client_change_mode (state->client, "updates",
if (boot_up)
mode = "boot-up";
else if (shutdown)
mode = "shutdown";
else if (reboot)
mode = "reboot";
else if (updates)
mode = "updates";
else if (system_upgrade)
mode = "system-upgrade";
if (mode) {
ply_boot_client_change_mode (state->client, mode,
(ply_boot_client_response_handler_t)
on_success,
(ply_boot_client_response_handler_t)
on_failure, state);
} else {
ply_error ("Error no mode specified for 'change-mode' command");
ply_event_loop_exit (state->loop, 1);
}
}
@ -891,8 +895,12 @@ main (int argc,
PLY_COMMAND_OPTION_TYPE_FLAG,
"shutdown", "Shutting the system down",
PLY_COMMAND_OPTION_TYPE_FLAG,
"reboot", "Rebooting the system",
PLY_COMMAND_OPTION_TYPE_FLAG,
"updates", "Applying updates",
PLY_COMMAND_OPTION_TYPE_FLAG,
"system-upgrade", "Upgrading the OS to a new version",
PLY_COMMAND_OPTION_TYPE_FLAG,
NULL);
ply_command_parser_add_command (state.command_parser,

View file

@ -38,9 +38,11 @@ typedef enum
{
PLY_BOOT_SPLASH_MODE_BOOT_UP,
PLY_BOOT_SPLASH_MODE_SHUTDOWN,
PLY_BOOT_SPLASH_MODE_REBOOT,
PLY_BOOT_SPLASH_MODE_UPDATES,
PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE,
PLY_BOOT_SPLASH_MODE_INVALID,
PLY_BOOT_SPLASH_MODE_COUNT = PLY_BOOT_SPLASH_MODE_UPDATES + 1,
PLY_BOOT_SPLASH_MODE_COUNT = PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE + 1,
} ply_boot_splash_mode_t;
typedef struct _ply_boot_splash_plugin ply_boot_splash_plugin_t;

View file

@ -58,13 +58,6 @@
#define BOOT_DURATION_FILE PLYMOUTH_TIME_DIRECTORY "/boot-duration"
#define SHUTDOWN_DURATION_FILE PLYMOUTH_TIME_DIRECTORY "/shutdown-duration"
typedef enum
{
PLY_MODE_BOOT,
PLY_MODE_SHUTDOWN,
PLY_MODE_UPDATES
} ply_mode_t;
typedef struct
{
const char *keys;
@ -93,7 +86,7 @@ typedef struct
ply_buffer_t *entry_buffer;
ply_list_t *messages;
ply_command_parser_t *command_parser;
ply_mode_t mode;
ply_boot_splash_mode_t mode;
ply_terminal_t *local_console_terminal;
ply_device_manager_t *device_manager;
@ -149,7 +142,7 @@ static void toggle_between_splash_and_details (state_t *state);
static void tell_systemd_to_print_details (state_t *state);
static void tell_systemd_to_stop_printing_details (state_t *state);
#endif
static const char *get_cache_file_for_mode (ply_mode_t mode);
static const char *get_cache_file_for_mode (ply_boot_splash_mode_t mode);
static void on_escape_pressed (state_t *state);
static void on_enter (state_t *state,
const char *line);
@ -163,30 +156,6 @@ static void on_quit (state_t *state,
static bool sh_is_init (state_t *state);
static void cancel_pending_delayed_show (state_t *state);
static ply_boot_splash_mode_t
get_splash_mode_from_mode (ply_mode_t mode)
{
ply_boot_splash_mode_t splash_mode;
switch (mode) {
case PLY_MODE_BOOT:
splash_mode = PLY_BOOT_SPLASH_MODE_BOOT_UP;
break;
case PLY_MODE_SHUTDOWN:
splash_mode = PLY_BOOT_SPLASH_MODE_SHUTDOWN;
break;
case PLY_MODE_UPDATES:
splash_mode = PLY_BOOT_SPLASH_MODE_UPDATES;
break;
default:
splash_mode = PLY_BOOT_SPLASH_MODE_INVALID;
break;
}
assert (splash_mode != PLY_BOOT_SPLASH_MODE_INVALID);
return splash_mode;
}
static void
on_session_output (state_t *state,
const char *output,
@ -220,8 +189,6 @@ static void
on_change_mode (state_t *state,
const char *mode)
{
ply_boot_splash_mode_t splash_mode;
if (state->boot_splash == NULL) {
ply_trace ("no splash set");
return;
@ -229,17 +196,19 @@ on_change_mode (state_t *state,
ply_trace ("updating mode to '%s'", mode);
if (strcmp (mode, "boot-up") == 0)
state->mode = PLY_MODE_BOOT;
state->mode = PLY_BOOT_SPLASH_MODE_BOOT_UP;
else if (strcmp (mode, "shutdown") == 0)
state->mode = PLY_MODE_SHUTDOWN;
state->mode = PLY_BOOT_SPLASH_MODE_SHUTDOWN;
else if (strcmp (mode, "reboot") == 0)
state->mode = PLY_BOOT_SPLASH_MODE_REBOOT;
else if (strcmp (mode, "updates") == 0)
state->mode = PLY_MODE_UPDATES;
state->mode = PLY_BOOT_SPLASH_MODE_UPDATES;
else if (strcmp (mode, "system-upgrade") == 0)
state->mode = PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE;
else
return;
splash_mode = get_splash_mode_from_mode (state->mode);
if (!ply_boot_splash_show (state->boot_splash, splash_mode)) {
if (!ply_boot_splash_show (state->boot_splash, state->mode)) {
ply_trace ("failed to update splash");
return;
}
@ -689,20 +658,23 @@ on_newroot (state_t *state,
}
static const char *
get_cache_file_for_mode (ply_mode_t mode)
get_cache_file_for_mode (ply_boot_splash_mode_t mode)
{
const char *filename;
switch ((int) mode) {
case PLY_MODE_BOOT:
switch (mode) {
case PLY_BOOT_SPLASH_MODE_BOOT_UP:
filename = BOOT_DURATION_FILE;
break;
case PLY_MODE_SHUTDOWN:
case PLY_BOOT_SPLASH_MODE_SHUTDOWN:
case PLY_BOOT_SPLASH_MODE_REBOOT:
filename = SHUTDOWN_DURATION_FILE;
break;
case PLY_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE:
filename = NULL;
break;
case PLY_BOOT_SPLASH_MODE_INVALID:
default:
ply_error ("Unhandled case in %s line %d\n", __FILE__, __LINE__);
abort ();
@ -718,17 +690,20 @@ get_log_file_for_state (state_t *state)
{
const char *filename;
switch ((int) state->mode) {
case PLY_MODE_BOOT:
switch (state->mode) {
case PLY_BOOT_SPLASH_MODE_BOOT_UP:
if (state->no_boot_log)
filename = NULL;
else
filename = PLYMOUTH_LOG_DIRECTORY "/boot.log";
break;
case PLY_MODE_SHUTDOWN:
case PLY_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_SHUTDOWN:
case PLY_BOOT_SPLASH_MODE_REBOOT:
case PLY_BOOT_SPLASH_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE:
filename = _PATH_DEVNULL;
break;
case PLY_BOOT_SPLASH_MODE_INVALID:
default:
ply_error ("Unhandled case in %s line %d\n", __FILE__, __LINE__);
abort ();
@ -740,18 +715,21 @@ get_log_file_for_state (state_t *state)
}
static const char *
get_log_spool_file_for_mode (ply_mode_t mode)
get_log_spool_file_for_mode (ply_boot_splash_mode_t mode)
{
const char *filename;
switch ((int) mode) {
case PLY_MODE_BOOT:
switch (mode) {
case PLY_BOOT_SPLASH_MODE_BOOT_UP:
filename = PLYMOUTH_SPOOL_DIRECTORY "/boot.log";
break;
case PLY_MODE_SHUTDOWN:
case PLY_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_SHUTDOWN:
case PLY_BOOT_SPLASH_MODE_REBOOT:
case PLY_BOOT_SPLASH_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE:
filename = NULL;
break;
case PLY_BOOT_SPLASH_MODE_INVALID:
default:
ply_error ("Unhandled case in %s line %d\n", __FILE__, __LINE__);
abort ();
@ -841,7 +819,7 @@ static bool
plymouth_should_ignore_show_splash_calls (state_t *state)
{
ply_trace ("checking if plymouth should be running");
if (state->mode != PLY_MODE_BOOT || ply_kernel_command_line_has_argument ("plymouth.force-splash"))
if (state->mode != PLY_BOOT_SPLASH_MODE_BOOT_UP || ply_kernel_command_line_has_argument ("plymouth.force-splash"))
return false;
if (ply_kernel_command_line_has_argument ("plymouth.ignore-show-splash"))
@ -1213,7 +1191,7 @@ quit_program (state_t *state)
#ifdef PLY_ENABLE_DEPRECATED_GDM_TRANSITION
if (state->should_retain_splash &&
state->mode == PLY_MODE_BOOT)
state->mode == PLY_BOOT_SPLASH_MODE_BOOT_UP)
tell_gdm_to_transition ();
#endif
@ -1737,7 +1715,6 @@ static ply_boot_splash_t *
show_theme (state_t *state,
const char *theme_path)
{
ply_boot_splash_mode_t splash_mode;
ply_boot_splash_t *splash;
if (theme_path != NULL)
@ -1752,9 +1729,7 @@ show_theme (state_t *state,
if (ply_boot_splash_uses_pixel_displays (splash))
ply_device_manager_activate_renderers (state->device_manager);
splash_mode = get_splash_mode_from_mode (state->mode);
if (!ply_boot_splash_show (splash, splash_mode)) {
if (!ply_boot_splash_show (splash, state->mode)) {
ply_save_errno ();
ply_boot_splash_free (splash);
ply_restore_errno ();
@ -1985,7 +1960,8 @@ initialize_environment (state_t *state)
if (getenv ("DISPLAY") != NULL && access (PLYMOUTH_PLUGIN_PATH "renderers/x11.so", F_OK) == 0)
state->default_tty = "/dev/tty";
if (!state->default_tty) {
if (state->mode == PLY_MODE_SHUTDOWN)
if (state->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
state->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
state->default_tty = SHUTDOWN_TTY;
else
state->default_tty = BOOT_TTY;
@ -2181,11 +2157,15 @@ main (int argc,
if (mode_string != NULL) {
if (strcmp (mode_string, "shutdown") == 0)
state.mode = PLY_MODE_SHUTDOWN;
state.mode = PLY_BOOT_SPLASH_MODE_SHUTDOWN;
else if (strcmp (mode_string, "reboot") == 0)
state.mode = PLY_BOOT_SPLASH_MODE_REBOOT;
else if (strcmp (mode_string, "updates") == 0)
state.mode = PLY_MODE_UPDATES;
state.mode = PLY_BOOT_SPLASH_MODE_UPDATES;
else if (strcmp (mode_string, "system-upgrade") == 0)
state.mode = PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE;
else
state.mode = PLY_MODE_BOOT;
state.mode = PLY_BOOT_SPLASH_MODE_BOOT_UP;
free (mode_string);
}

View file

@ -468,7 +468,8 @@ view_animate_at_time (view_t *view,
logo_opacity = .5 * sin ((time / 5) * (2 * M_PI)) + .8;
logo_opacity = CLAMP (logo_opacity, 0, 1.0);
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
logo_opacity = 1.0;
if (fabs (logo_opacity - view->logo_opacity) <= DBL_MIN)
@ -579,7 +580,8 @@ start_animation (ply_boot_splash_plugin_t *plugin)
plugin->start_time = ply_get_timestamp ();
animate_at_time (plugin, plugin->start_time);
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
return;
ply_event_loop_watch_for_timeout (plugin->loop,

View file

@ -70,9 +70,15 @@ static script_return_t plymouth_get_mode (script_state_t *state,
case PLY_BOOT_SPLASH_MODE_SHUTDOWN:
obj = script_obj_new_string ("shutdown");
break;
case PLY_BOOT_SPLASH_MODE_REBOOT:
obj = script_obj_new_string ("reboot");
break;
case PLY_BOOT_SPLASH_MODE_UPDATES:
obj = script_obj_new_string ("updates");
break;
case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE:
obj = script_obj_new_string ("system-upgrade");
break;
case PLY_BOOT_SPLASH_MODE_INVALID:
default:
obj = script_obj_new_string ("unknown");

View file

@ -184,7 +184,8 @@ view_start_animation (view_t *view)
ply_text_display_clear_screen (view->display);
ply_text_display_hide_cursor (view->display);
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) {
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT) {
ply_text_step_bar_hide (view->step_bar);
return;
}

View file

@ -302,7 +302,8 @@ view_start_animation (view_t *view)
ply_pixel_display_draw_area (view->display, 0, 0,
screen_width, screen_height);
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
return;
plugin->is_idle = false;
@ -528,7 +529,8 @@ start_animation (ply_boot_splash_plugin_t *plugin)
plugin->is_animating = true;
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
plugin->is_idle = true;
}
@ -720,7 +722,8 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin,
ply_list_node_t *node;
double total_duration;
if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES ||
plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE)
return;
total_duration = duration / percent_done;
@ -931,7 +934,8 @@ system_update (ply_boot_splash_plugin_t *plugin,
{
ply_list_node_t *node;
if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES)
if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES &&
plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE)
return;
node = ply_list_get_first_node (plugin->views);

View file

@ -190,7 +190,8 @@ view_start_animation (view_t *view)
ply_text_display_clear_screen (view->display);
ply_text_display_hide_cursor (view->display);
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) {
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT) {
ply_text_progress_bar_hide (view->progress_bar);
return;
}

View file

@ -107,6 +107,7 @@ typedef struct
typedef struct
{
bool suppress_messages;
bool progress_bar_show_percent_complete;
bool use_progress_bar;
bool use_firmware_background;
char *title;
@ -166,7 +167,6 @@ struct _ply_boot_splash_plugin
uint32_t use_firmware_background : 1;
uint32_t dialog_clears_firmware_background : 1;
uint32_t message_below_animation : 1;
uint32_t progress_bar_show_percent_complete : 1;
};
ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void);
@ -251,9 +251,11 @@ view_load_end_animation (view_t *view)
switch (plugin->mode) {
case PLY_BOOT_SPLASH_MODE_BOOT_UP:
case PLY_BOOT_SPLASH_MODE_UPDATES:
case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE:
animation_prefix = "startup-animation-";
break;
case PLY_BOOT_SPLASH_MODE_SHUTDOWN:
case PLY_BOOT_SPLASH_MODE_REBOOT:
animation_prefix = "shutdown-animation-";
break;
case PLY_BOOT_SPLASH_MODE_INVALID:
@ -723,7 +725,8 @@ view_start_progress_animation (view_t *view)
/* We don't really know how long shutdown will so
* don't show the progress animation
*/
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
return;
if (view->progress_animation != NULL) {
@ -823,6 +826,8 @@ load_mode_settings (ply_boot_splash_plugin_t *plugin,
settings->suppress_messages =
ply_key_file_get_bool (key_file, group_name, "SuppressMessages");
settings->progress_bar_show_percent_complete =
ply_key_file_get_bool (key_file, group_name, "ProgressBarShowPercentComplete");
settings->use_progress_bar =
ply_key_file_get_bool (key_file, group_name, "UseProgressBar");
settings->use_firmware_background =
@ -994,11 +999,12 @@ create_plugin (ply_key_file_t *key_file)
free (color);
plugin->progress_bar_show_percent_complete = ply_key_file_get_bool (key_file, "two-step", "ProgressBarShowPercentComplete");
load_mode_settings (plugin, key_file, "boot-up", PLY_BOOT_SPLASH_MODE_BOOT_UP);
load_mode_settings (plugin, key_file, "shutdown", PLY_BOOT_SPLASH_MODE_SHUTDOWN);
load_mode_settings (plugin, key_file, "reboot", PLY_BOOT_SPLASH_MODE_REBOOT);
load_mode_settings (plugin, key_file, "updates", PLY_BOOT_SPLASH_MODE_UPDATES);
load_mode_settings (plugin, key_file, "system-upgrade", PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE);
if (plugin->use_firmware_background)
plugin->background_bgrt_image = ply_image_new ("/sys/firmware/acpi/bgrt/image");
@ -1184,7 +1190,8 @@ start_progress_animation (ply_boot_splash_plugin_t *plugin)
* but it's normally really fast, so just jump to
* the end animation
*/
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN ||
plugin->mode == PLY_BOOT_SPLASH_MODE_REBOOT)
become_idle (plugin, NULL);
}
@ -1574,7 +1581,8 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin,
double duration,
double percent_done)
{
if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES)
if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES ||
plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE)
return;
if (plugin->state != PLY_BOOT_SPLASH_DISPLAY_NORMAL)
@ -1781,7 +1789,8 @@ system_update (ply_boot_splash_plugin_t *plugin,
ply_list_node_t *node;
char buf[64];
if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES)
if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES &&
plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE)
return;
node = ply_list_get_first_node (plugin->views);
@ -1795,7 +1804,7 @@ system_update (ply_boot_splash_plugin_t *plugin,
ply_progress_animation_set_percent_done (view->progress_animation, (double) progress / 100.f);
ply_progress_bar_set_percent_done (view->progress_bar, (double) progress / 100.f);
if (!ply_progress_bar_is_hidden (view->progress_bar) &&
plugin->progress_bar_show_percent_complete) {
plugin->mode_settings[plugin->mode].progress_bar_show_percent_complete) {
snprintf (buf, sizeof(buf), "%d%% complete", progress);
view_show_message (view, buf);
}

View file

@ -7,6 +7,6 @@ ConditionKernelCommandLine=!plymouth.enable=0
ConditionVirtualization=!container
[Service]
ExecStart=@PLYMOUTH_DAEMON_DIR@/plymouthd --mode=shutdown --attach-to-session
ExecStart=@PLYMOUTH_DAEMON_DIR@/plymouthd --mode=reboot --attach-to-session
ExecStartPost=-@PLYMOUTH_CLIENT_DIR@/plymouth show-splash
Type=forking

View file

@ -21,7 +21,6 @@ BackgroundStartColor=0x202020
BackgroundEndColor=0x202020
ProgressBarBackgroundColor=0x606060
ProgressBarForegroundColor=0xffffff
ProgressBarShowPercentComplete=true
DialogClearsFirmwareBackground=true
MessageBelowAnimation=true
@ -31,8 +30,19 @@ UseFirmwareBackground=true
[shutdown]
UseFirmwareBackground=true
[reboot]
UseFirmwareBackground=true
[updates]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Installing Updates...
SubTitle=Do not turn off your computer
[system-upgrade]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Upgrading System...
SubTitle=Do not turn off your computer

View file

@ -21,11 +21,18 @@ BackgroundStartColor=0x202020
BackgroundEndColor=0x202020
ProgressBarBackgroundColor=0x606060
ProgressBarForegroundColor=0xffffff
ProgressBarShowPercentComplete=true
MessageBelowAnimation=true
[updates]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Installing Updates...
SubTitle=Do not turn off your computer
[system-upgrade]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Upgrading System...
SubTitle=Do not turn off your computer