[ostree] admin: Add -r option to upgrade to initiate a reboot if tree changes
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] admin: Add -r option to upgrade to initiate a reboot if tree changes
- Date: Thu, 16 May 2013 13:30:38 +0000 (UTC)
commit f9484e9bab5d559e96ecd6ae48f6f411b8760be2
Author: Colin Walters <walters verbum org>
Date: Thu May 16 08:29:20 2013 -0400
admin: Add -r option to upgrade to initiate a reboot if tree changes
$ ostree admin upgrade -r
is convenient to fire off inside a VM and come back to it later.
src/ostree/ot-admin-builtin-pull-deploy.c | 35 ++------------------
src/ostree/ot-admin-builtin-upgrade.c | 46 ++++++++++++++++++++++++---
src/ostree/ot-admin-functions.c | 48 ++++++++++++++++++++++++++--
src/ostree/ot-admin-functions.h | 17 ++++++++++
4 files changed, 105 insertions(+), 41 deletions(-)
---
diff --git a/src/ostree/ot-admin-builtin-pull-deploy.c b/src/ostree/ot-admin-builtin-pull-deploy.c
index 08d3958..cfdd9e6 100644
--- a/src/ostree/ot-admin-builtin-pull-deploy.c
+++ b/src/ostree/ot-admin-builtin-pull-deploy.c
@@ -35,21 +35,6 @@ static GOptionEntry options[] = {
{ NULL }
};
-static char *
-parse_deploy_name_from_path (GFile *osdir,
- GFile *path)
-{
- ot_lfree char *relpath = g_file_get_relative_path (osdir, path);
- const char *last_dash;
-
- g_assert (relpath);
- last_dash = strrchr (relpath, '-');
- if (!last_dash)
- g_error ("Failed to parse deployment name %s", relpath);
-
- return g_strndup (relpath, last_dash - relpath);
-}
-
static gboolean
ensure_remote_branch (OstreeRepo *repo,
const char *remote,
@@ -116,7 +101,6 @@ ot_admin_builtin_pull_deploy (int argc, char **argv, OtAdminBuiltinOpts *admin_o
ot_lobj GFile *current_deployment = NULL;
ot_lfree char *deploy_name = NULL;
ot_lobj GFile *deploy_dir = NULL;
- ot_lobj GFile *os_dir = NULL;
ot_lfree char *remote_name = NULL;
ot_lptrarray GPtrArray *subproc_args = NULL;
__attribute__((unused)) GCancellable *cancellable = NULL;
@@ -142,9 +126,6 @@ ot_admin_builtin_pull_deploy (int argc, char **argv, OtAdminBuiltinOpts *admin_o
if (!ostree_repo_check (repo, error))
goto out;
- deploy_dir = g_file_get_child (ostree_dir, "deploy");
- os_dir = g_file_get_child (deploy_dir, osname);
-
if (argc > 2)
{
target = argv[2];
@@ -167,20 +148,12 @@ ot_admin_builtin_pull_deploy (int argc, char **argv, OtAdminBuiltinOpts *admin_o
goto out;
}
- deploy_name = parse_deploy_name_from_path (os_dir, current_deployment);
+ ot_admin_parse_deploy_name (ostree_dir, osname, current_deployment,
+ &deploy_name, NULL);
}
- {
- ot_lfree char *repo_arg = g_strconcat ("--repo=",
- gs_file_get_path_cached (repo_path),
- NULL);
-
- if (!gs_subprocess_simple_run_sync (gs_file_get_path_cached (ostree_dir),
- GS_SUBPROCESS_STREAM_DISPOSITION_INHERIT,
- cancellable, error,
- "ostree", "pull", repo_arg, osname, NULL))
- goto out;
- }
+ if (!ot_admin_pull (ostree_dir, osname, cancellable, error))
+ goto out;
{
ot_lfree char *opt_ostree_dir_arg = g_strconcat ("--ostree-dir=",
diff --git a/src/ostree/ot-admin-builtin-upgrade.c b/src/ostree/ot-admin-builtin-upgrade.c
index 60def83..b060fbb 100644
--- a/src/ostree/ot-admin-builtin-upgrade.c
+++ b/src/ostree/ot-admin-builtin-upgrade.c
@@ -24,13 +24,17 @@
#include "ot-admin-builtins.h"
#include "ot-admin-functions.h"
+#include "ostree.h"
#include "otutil.h"
#include <unistd.h>
#include <stdlib.h>
#include <glib/gi18n.h>
+static gboolean opt_reboot;
+
static GOptionEntry options[] = {
+ { "reboot", 'r', 0, G_OPTION_ARG_NONE, &opt_reboot, "Reboot after a successful upgrade", NULL },
{ NULL }
};
@@ -42,6 +46,12 @@ ot_admin_builtin_upgrade (int argc, char **argv, OtAdminBuiltinOpts *admin_opts,
GFile *ostree_dir = admin_opts->ostree_dir;
gs_free char *booted_osname = NULL;
const char *osname = NULL;
+ gs_unref_object GFile *deployment = NULL;
+ gs_unref_object GFile *repo_path = NULL;
+ gs_unref_object OstreeRepo *repo = NULL;
+ gs_free char *deploy_name = NULL;
+ gs_free char *current_rev = NULL;
+ gs_free char *new_rev = NULL;
gs_free char *ostree_dir_arg = NULL;
__attribute__((unused)) GCancellable *cancellable = NULL;
@@ -57,7 +67,8 @@ ot_admin_builtin_upgrade (int argc, char **argv, OtAdminBuiltinOpts *admin_opts,
}
else
{
- if (!ot_admin_get_active_deployment (NULL, &booted_osname, NULL, cancellable, error))
+ if (!ot_admin_get_booted_os (&booted_osname, NULL,
+ cancellable, error))
goto out;
if (booted_osname == NULL)
{
@@ -67,15 +78,18 @@ ot_admin_builtin_upgrade (int argc, char **argv, OtAdminBuiltinOpts *admin_opts,
}
osname = booted_osname;
}
+
+ if (!ot_admin_get_current_deployment (ostree_dir, osname, &deployment,
+ cancellable, error))
+ goto out;
+
+ ot_admin_parse_deploy_name (ostree_dir, osname, deployment, &deploy_name, ¤t_rev);
ostree_dir_arg = g_strconcat ("--ostree-dir=",
gs_file_get_path_cached (ostree_dir),
NULL);
-
- if (!gs_subprocess_simple_run_sync (gs_file_get_path_cached (ostree_dir),
- GS_SUBPROCESS_STREAM_DISPOSITION_INHERIT,
- cancellable, error,
- "ostree", "admin", ostree_dir_arg, "pull-deploy", osname, NULL))
+
+ if (!ot_admin_pull (ostree_dir, osname, cancellable, error))
goto out;
if (!gs_subprocess_simple_run_sync (gs_file_get_path_cached (ostree_dir),
@@ -84,6 +98,26 @@ ot_admin_builtin_upgrade (int argc, char **argv, OtAdminBuiltinOpts *admin_opts,
"ostree", "admin", ostree_dir_arg, "prune", osname, NULL))
goto out;
+ if (opt_reboot)
+ {
+ repo_path = g_file_get_child (ostree_dir, "repo");
+
+ repo = ostree_repo_new (repo_path);
+ if (!ostree_repo_check (repo, error))
+ goto out;
+
+ if (!ostree_repo_resolve_rev (repo, deploy_name, TRUE, &new_rev,
+ error))
+ goto out;
+
+ if (strcmp (current_rev, new_rev) != 0 && opt_reboot)
+ {
+ gs_subprocess_simple_run_sync (NULL, GS_SUBPROCESS_STREAM_DISPOSITION_INHERIT,
+ cancellable, error,
+ "systemctl", "reboot", NULL);
+ }
+ }
+
ret = TRUE;
out:
if (context)
diff --git a/src/ostree/ot-admin-functions.c b/src/ostree/ot-admin-functions.c
index cc0d3b3..736c230 100644
--- a/src/ostree/ot-admin-functions.c
+++ b/src/ostree/ot-admin-functions.c
@@ -313,11 +313,11 @@ ot_admin_list_deployments (GFile *ostree_dir,
return ret;
}
-static gboolean
-ot_admin_get_booted_os (char **out_osname,
- char **out_tree,
+gboolean
+ot_admin_get_booted_os (char **out_osname,
+ char **out_tree,
GCancellable *cancellable,
- GError **error)
+ GError **error)
{
gboolean ret = FALSE;
gs_free char *ret_osname = NULL;
@@ -467,3 +467,43 @@ ot_admin_get_default_ostree_dir (GFile **out_ostree_dir,
ot_transfer_out_value (out_ostree_dir, &ret_ostree_dir);
return ret;
}
+
+gboolean
+ot_admin_pull (GFile *ostree_dir,
+ const char *osname,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gs_unref_object GFile *repo_path = g_file_get_child (ostree_dir, "repo");
+ gs_free char *repo_arg = g_strconcat ("--repo=",
+ gs_file_get_path_cached (repo_path),
+ NULL);
+
+ return gs_subprocess_simple_run_sync (gs_file_get_path_cached (ostree_dir),
+ GS_SUBPROCESS_STREAM_DISPOSITION_INHERIT,
+ cancellable, error,
+ "ostree", "pull", repo_arg, osname, NULL);
+}
+
+void
+ot_admin_parse_deploy_name (GFile *ostree_dir,
+ const char *osname,
+ GFile *deployment,
+ char **out_name,
+ char **out_rev)
+{
+ gs_unref_object GFile *deploy_dir = g_file_get_child (ostree_dir, "deploy");
+ gs_unref_object GFile *os_dir = g_file_get_child (deploy_dir, osname);
+ gs_free char *relpath = g_file_get_relative_path (os_dir, deployment);
+ const char *last_dash;
+
+ g_assert (relpath);
+ last_dash = strrchr (relpath, '-');
+ if (!last_dash)
+ g_error ("Failed to parse deployment name %s", relpath);
+
+ if (out_name)
+ *out_name = g_strndup (relpath, last_dash - relpath);
+ if (out_rev)
+ *out_rev = g_strdup (last_dash + 1);
+}
diff --git a/src/ostree/ot-admin-functions.h b/src/ostree/ot-admin-functions.h
index d74d768..a03ef59 100644
--- a/src/ostree/ot-admin-functions.h
+++ b/src/ostree/ot-admin-functions.h
@@ -31,6 +31,11 @@ gboolean ot_admin_ensure_initialized (GFile *ostree_dir,
GCancellable *cancellable,
GError **error);
+gboolean ot_admin_get_booted_os (char **out_osname,
+ char **out_tree,
+ GCancellable *cancellable,
+ GError **error);
+
gboolean ot_admin_get_current_deployment (GFile *ostree_dir,
const char *osname,
GFile **out_deployment,
@@ -58,6 +63,18 @@ gboolean ot_admin_get_default_ostree_dir (GFile **out_ostree_dir,
GCancellable *cancellable,
GError **error);
+gboolean ot_admin_pull (GFile *ostree_dir,
+ const char *osname,
+ GCancellable *cancellable,
+ GError **error);
+
+void
+ot_admin_parse_deploy_name (GFile *ostree_dir,
+ const char *osname,
+ GFile *deployment,
+ char **out_name,
+ char **out_rev);
+
G_END_DECLS
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]