mirror of
https://github.com/ostreedev/ostree.git
synced 2025-01-09 01:18:35 +03:00
Move "ostadmin" => "ostree admin"
This helps us avoid polluting the global binary namespace.
This commit is contained in:
parent
2ddbeb1f71
commit
fa5485c6c4
@ -1,48 +0,0 @@
|
||||
# Copyright (C) 2012 Colin Walters <walters@verbum.org>
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the
|
||||
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
if !TRIGGERS_ONLY
|
||||
bin_PROGRAMS += ostadmin
|
||||
endif
|
||||
|
||||
ostadmin_SOURCES = src/ostadmin/main.c \
|
||||
src/ostadmin/ot-admin-builtins.h \
|
||||
src/ostadmin/ot-admin-builtin-init.c \
|
||||
src/ostadmin/ot-admin-builtin-diff.c \
|
||||
src/ostadmin/ot-admin-builtin-deploy.c \
|
||||
src/ostadmin/ot-admin-builtin-update-kernel.c \
|
||||
src/ostadmin/ot-admin-functions.h \
|
||||
src/ostadmin/ot-admin-functions.c \
|
||||
src/ostadmin/ot-admin-main.h \
|
||||
src/ostadmin/ot-admin-main.c \
|
||||
$(NULL)
|
||||
|
||||
ostadmin_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/src/libgsystem -I$(srcdir)/src/libotutil -I$(srcdir)/src/libostree -I$(srcdir)/src/ostadmin -DLOCALEDIR=\"$(datadir)/locale\" $(OT_INTERNAL_GIO_UNIX_CFLAGS)
|
||||
ostadmin_LDADD = libgsystem.la libotutil.la libostree.la $(OT_INTERNAL_GIO_UNIX_LIBS)
|
||||
|
||||
if ENABLE_KERNEL_UPDATES
|
||||
|
||||
grub2dir = $(sysconfdir)/grub.d
|
||||
grub2_SCRIPTS = src/ostadmin/grub2/15_ostree
|
||||
|
||||
kernelpostinstdir = $(sysconfdir)/kernel/postinst.d
|
||||
kernelpostinst_SCRIPTS = src/ostadmin/kernel/15_ostree_update
|
||||
|
||||
kernelprermdir = $(sysconfdir)/kernel/prerm.d
|
||||
kernelprerm_SCRIPTS = src/ostadmin/kernel/15_ostree_remove
|
||||
|
||||
endif
|
@ -23,6 +23,7 @@ endif
|
||||
|
||||
ostree_SOURCES = src/ostree/main.c \
|
||||
src/ostree/ot-builtins.h \
|
||||
src/ostree/ot-builtin-admin.c \
|
||||
src/ostree/ot-builtin-cat.c \
|
||||
src/ostree/ot-builtin-config.c \
|
||||
src/ostree/ot-builtin-checkout.c \
|
||||
@ -45,6 +46,16 @@ ostree_SOURCES = src/ostree/main.c \
|
||||
src/ostree/ot-main.c \
|
||||
$(NULL)
|
||||
|
||||
# Admin subcommand
|
||||
ostree_SOURCES += \
|
||||
src/ostree/ot-admin-builtin-init.c \
|
||||
src/ostree/ot-admin-builtin-diff.c \
|
||||
src/ostree/ot-admin-builtin-deploy.c \
|
||||
src/ostree/ot-admin-builtin-update-kernel.c \
|
||||
src/ostree/ot-admin-functions.h \
|
||||
src/ostree/ot-admin-functions.c \
|
||||
$(NULL)
|
||||
|
||||
ostree_bin_shared_cflags = $(AM_CFLAGS) -I$(srcdir)/src/libgsystem -I$(srcdir)/src/libotutil -I$(srcdir)/src/libostree -I$(srcdir)/src/ostree -DLOCALEDIR=\"$(datadir)/locale\"
|
||||
ostree_bin_shared_ldadd = libotutil.la libostree.la
|
||||
|
||||
@ -64,3 +75,16 @@ ostree_pull_LDADD = $(ostree_bin_shared_ldadd) $(OT_INTERNAL_SOUP_LIBS)
|
||||
endif
|
||||
|
||||
MANPAGES += doc/ostree.1
|
||||
|
||||
if ENABLE_KERNEL_UPDATES
|
||||
|
||||
grub2dir = $(sysconfdir)/grub.d
|
||||
grub2_SCRIPTS = src/ostree/grub2/15_ostree
|
||||
|
||||
kernelpostinstdir = $(sysconfdir)/kernel/postinst.d
|
||||
kernelpostinst_SCRIPTS = src/ostree/kernel/15_ostree_update
|
||||
|
||||
kernelprermdir = $(sysconfdir)/kernel/prerm.d
|
||||
kernelprerm_SCRIPTS = src/ostree/kernel/15_ostree_remove
|
||||
|
||||
endif
|
||||
|
@ -78,7 +78,6 @@ include Makefile-daemon.am
|
||||
include Makefile-otutil.am
|
||||
include Makefile-libostree.am
|
||||
include Makefile-ostree.am
|
||||
include Makefile-ostadmin.am
|
||||
include Makefile-switchroot.am
|
||||
include Makefile-triggers.am
|
||||
|
||||
|
@ -1,45 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
||||
*
|
||||
* Copyright (C) 2012 Colin Walters <walters@verbum.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Author: Colin Walters <walters@verbum.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "ot-admin-main.h"
|
||||
#include "ot-admin-builtins.h"
|
||||
|
||||
static OtAdminBuiltin builtins[] = {
|
||||
{ "deploy", ot_admin_builtin_deploy, 0 },
|
||||
{ "diff", ot_admin_builtin_diff, 0 },
|
||||
{ "init", ot_admin_builtin_init, 0 },
|
||||
{ "update-kernel", ot_admin_builtin_update_kernel, 0 },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char **argv)
|
||||
{
|
||||
return ot_admin_main (argc, argv, builtins);
|
||||
}
|
@ -1,141 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
||||
*
|
||||
* Copyright (C) 2011 Colin Walters <walters@verbum.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Author: Colin Walters <walters@verbum.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "ot-admin-main.h"
|
||||
#include "otutil.h"
|
||||
|
||||
static int
|
||||
usage (char **argv, OtAdminBuiltin *builtins, gboolean is_error)
|
||||
{
|
||||
OtAdminBuiltin *builtin = builtins;
|
||||
void (*print_func) (const gchar *format, ...);
|
||||
|
||||
if (is_error)
|
||||
print_func = g_printerr;
|
||||
else
|
||||
print_func = g_print;
|
||||
|
||||
print_func ("usage: %s COMMAND [options]\n",
|
||||
argv[0]);
|
||||
print_func ("Builtin commands:\n");
|
||||
|
||||
while (builtin->name)
|
||||
{
|
||||
print_func (" %s\n", builtin->name);
|
||||
builtin++;
|
||||
}
|
||||
return (is_error ? 1 : 0);
|
||||
}
|
||||
|
||||
static void
|
||||
prep_builtin_argv (const char *builtin,
|
||||
int argc,
|
||||
char **argv,
|
||||
int *out_argc,
|
||||
char ***out_argv)
|
||||
{
|
||||
int i;
|
||||
char **cmd_argv;
|
||||
|
||||
/* Should be argc - 1 + 1, to account for
|
||||
the first argument (removed) and for NULL pointer */
|
||||
cmd_argv = g_new0 (char *, argc);
|
||||
|
||||
for (i = 0; i < argc-1; i++)
|
||||
cmd_argv[i] = argv[i+1];
|
||||
cmd_argv[i] = NULL;
|
||||
*out_argc = argc-1;
|
||||
*out_argv = cmd_argv;
|
||||
}
|
||||
|
||||
static void
|
||||
set_error_print_usage (GError **error, OtAdminBuiltin *builtins, const char *msg, char **argv)
|
||||
{
|
||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg);
|
||||
usage (argv, builtins, TRUE);
|
||||
}
|
||||
|
||||
int
|
||||
ot_admin_main (int argc,
|
||||
char **argv,
|
||||
OtAdminBuiltin *builtins)
|
||||
{
|
||||
OtAdminBuiltin *builtin;
|
||||
GError *error = NULL;
|
||||
int cmd_argc;
|
||||
char **cmd_argv = NULL;
|
||||
const char *cmd = NULL;
|
||||
|
||||
/* avoid gvfs (http://bugzilla.gnome.org/show_bug.cgi?id=526454) */
|
||||
g_setenv ("GIO_USE_VFS", "local", TRUE);
|
||||
|
||||
g_type_init ();
|
||||
|
||||
g_set_prgname (argv[0]);
|
||||
|
||||
if (argc < 2)
|
||||
return usage (argv, builtins, 1);
|
||||
|
||||
if (geteuid () != 0)
|
||||
{
|
||||
g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"ostadmin: Can only be run as root");
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd = argv[1];
|
||||
|
||||
builtin = builtins;
|
||||
while (builtin->name)
|
||||
{
|
||||
if (g_strcmp0 (cmd, builtin->name) == 0)
|
||||
break;
|
||||
builtin++;
|
||||
}
|
||||
|
||||
if (!builtin->name)
|
||||
{
|
||||
set_error_print_usage (&error, builtins, "Unknown command", argv);
|
||||
goto out;
|
||||
}
|
||||
|
||||
prep_builtin_argv (cmd, argc, argv, &cmd_argc, &cmd_argv);
|
||||
|
||||
if (!builtin->fn (cmd_argc, cmd_argv, &error))
|
||||
goto out;
|
||||
|
||||
out:
|
||||
g_free (cmd_argv);
|
||||
if (error)
|
||||
{
|
||||
g_printerr ("%s\n", error->message);
|
||||
g_clear_error (&error);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
||||
*
|
||||
* Copyright (C) 2011 Colin Walters <walters@verbum.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Author: Colin Walters <walters@verbum.org>
|
||||
*/
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
gboolean (*fn) (int argc, char **argv, GError **error);
|
||||
int flags;
|
||||
} OtAdminBuiltin;
|
||||
|
||||
int ot_admin_main (int argc, char **argv, OtAdminBuiltin *builtins);
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "ot-builtins.h"
|
||||
|
||||
static OstreeCommand commands[] = {
|
||||
{ "admin", ostree_builtin_admin, OSTREE_BUILTIN_FLAG_NO_REPO },
|
||||
{ "cat", ostree_builtin_cat, 0 },
|
||||
{ "commit", ostree_builtin_commit, 0 },
|
||||
{ "config", ostree_builtin_config, 0 },
|
||||
|
@ -35,10 +35,8 @@ typedef struct {
|
||||
|
||||
static gboolean opt_no_kernel;
|
||||
static gboolean opt_force;
|
||||
static char *opt_ostree_dir = "/ostree";
|
||||
|
||||
static GOptionEntry options[] = {
|
||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory (default: /ostree)", NULL },
|
||||
{ "no-kernel", 0, 0, G_OPTION_ARG_NONE, &opt_no_kernel, "Don't update kernel related config (initramfs, bootloader)", NULL },
|
||||
{ "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Overwrite any existing deployment", NULL },
|
||||
{ NULL }
|
||||
@ -195,27 +193,30 @@ ensure_unlinked (GFile *path,
|
||||
*/
|
||||
static gboolean
|
||||
copy_one_config_file (OtAdminDeploy *self,
|
||||
GFile *orig_etc,
|
||||
GFile *modified_etc,
|
||||
GFile *new_etc,
|
||||
GFile *file,
|
||||
GFile *src,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
ot_lobj GFile *target_file = NULL;
|
||||
ot_lobj GFile *target_parent = NULL;
|
||||
ot_lfree char *path = NULL;
|
||||
ot_lobj GFile *dest = NULL;
|
||||
ot_lobj GFile *parent = NULL;
|
||||
ot_lfree char *relative_path = NULL;
|
||||
ot_lobj GFile *modified_path = NULL;
|
||||
|
||||
relative_path = g_file_get_relative_path (orig_etc, src);
|
||||
modified_path = g_file_resolve_relative_path (modified_etc, relative_path);
|
||||
dest = g_file_resolve_relative_path (new_etc, relative_path);
|
||||
|
||||
path = g_file_get_relative_path (modified_etc, file);
|
||||
g_assert (path);
|
||||
target_file = g_file_resolve_relative_path (new_etc, path);
|
||||
target_parent = g_file_get_parent (target_file);
|
||||
parent = g_file_get_parent (dest);
|
||||
|
||||
/* FIXME actually we need to copy permissions and xattrs */
|
||||
if (!ot_gfile_ensure_directory (target_parent, TRUE, error))
|
||||
if (!ot_gfile_ensure_directory (parent, TRUE, error))
|
||||
goto out;
|
||||
|
||||
if (!g_file_copy (file, target_file, G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA,
|
||||
if (!g_file_copy (src, dest, G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA,
|
||||
cancellable, NULL, NULL, error))
|
||||
goto out;
|
||||
|
||||
@ -251,7 +252,7 @@ merge_etc_changes (OtAdminDeploy *self,
|
||||
ot_lptrarray GPtrArray *added = NULL;
|
||||
guint i;
|
||||
|
||||
modified = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
modified = g_ptr_array_new_with_free_func ((GDestroyNotify) ostree_diff_item_unref);
|
||||
removed = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
added = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
|
||||
@ -287,14 +288,23 @@ merge_etc_changes (OtAdminDeploy *self,
|
||||
for (i = 0; i < modified->len; i++)
|
||||
{
|
||||
OstreeDiffItem *diff = modified->pdata[i];
|
||||
if (!copy_one_config_file (self, modified_etc, new_etc, diff->src,
|
||||
ot_lfree char *relative_path = NULL;
|
||||
ot_lobj GFile *modified_path = NULL;
|
||||
ot_lobj GFile *target_path = NULL;
|
||||
|
||||
relative_path = g_file_get_relative_path (orig_etc, diff->src);
|
||||
modified_path = g_file_resolve_relative_path (modified_etc, relative_path);
|
||||
target_path = g_file_resolve_relative_path (new_etc, relative_path);
|
||||
|
||||
if (!copy_one_config_file (self, orig_etc, modified_etc, new_etc, diff->src,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
}
|
||||
for (i = 0; i < added->len; i++)
|
||||
{
|
||||
GFile *file = added->pdata[i];
|
||||
if (!copy_one_config_file (self, modified_etc, new_etc, file,
|
||||
|
||||
if (!copy_one_config_file (self, orig_etc, modified_etc, new_etc, file,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
}
|
||||
@ -505,8 +515,9 @@ do_update_kernel (OtAdminDeploy *self,
|
||||
ot_lptrarray GPtrArray *args = NULL;
|
||||
|
||||
args = g_ptr_array_new ();
|
||||
ot_ptrarray_add_many (args, "ostadmin", "update-kernel",
|
||||
ot_ptrarray_add_many (args, "ostree", "admin",
|
||||
"--ostree-dir", ot_gfile_get_path_cached (self->ostree_dir),
|
||||
"update-kernel",
|
||||
ot_gfile_get_path_cached (deploy_path), NULL);
|
||||
g_ptr_array_add (args, NULL);
|
||||
|
||||
@ -522,7 +533,7 @@ do_update_kernel (OtAdminDeploy *self,
|
||||
|
||||
|
||||
gboolean
|
||||
ot_admin_builtin_deploy (int argc, char **argv, GError **error)
|
||||
ot_admin_builtin_deploy (int argc, char **argv, GFile *ostree_dir, GError **error)
|
||||
{
|
||||
GOptionContext *context;
|
||||
OtAdminDeploy self_data;
|
||||
@ -549,7 +560,7 @@ ot_admin_builtin_deploy (int argc, char **argv, GError **error)
|
||||
goto out;
|
||||
}
|
||||
|
||||
self->ostree_dir = g_file_new_for_path (opt_ostree_dir);
|
||||
self->ostree_dir = g_object_ref (ostree_dir);
|
||||
|
||||
if (!ot_admin_ensure_initialized (self->ostree_dir, cancellable, error))
|
||||
goto out;
|
@ -28,19 +28,15 @@
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
static char *opt_ostree_dir = "/ostree";
|
||||
|
||||
static GOptionEntry options[] = {
|
||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory (default: /ostree)", NULL },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
gboolean
|
||||
ot_admin_builtin_diff (int argc, char **argv, GError **error)
|
||||
ot_admin_builtin_diff (int argc, char **argv, GFile *ostree_dir, GError **error)
|
||||
{
|
||||
GOptionContext *context;
|
||||
gboolean ret = FALSE;
|
||||
ot_lobj GFile *ostree_dir = NULL;
|
||||
ot_lobj GFile *repo_path = NULL;
|
||||
ot_lobj GFile *deployment = NULL;
|
||||
ot_lobj GFile *deploy_parent = NULL;
|
||||
@ -58,7 +54,6 @@ ot_admin_builtin_diff (int argc, char **argv, GError **error)
|
||||
if (!g_option_context_parse (context, &argc, &argv, error))
|
||||
goto out;
|
||||
|
||||
ostree_dir = g_file_new_for_path (opt_ostree_dir);
|
||||
repo_path = g_file_get_child (ostree_dir, "repo");
|
||||
|
||||
if (argc > 1)
|
||||
@ -84,7 +79,7 @@ ot_admin_builtin_diff (int argc, char **argv, GError **error)
|
||||
ot_gfile_get_basename_cached (deployment),
|
||||
"-etc", NULL);
|
||||
|
||||
modified = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
modified = g_ptr_array_new_with_free_func ((GDestroyNotify) ostree_diff_item_unref);
|
||||
removed = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
added = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
if (!ostree_diff_dirs (orig_etc_path, new_etc_path, modified, removed, added,
|
||||
@ -95,7 +90,6 @@ ot_admin_builtin_diff (int argc, char **argv, GError **error)
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
||||
g_clear_object (&ostree_dir);
|
||||
if (context)
|
||||
g_option_context_free (context);
|
||||
return ret;
|
@ -28,16 +28,12 @@
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
static char *opt_ostree_dir = "/ostree";
|
||||
|
||||
static GOptionEntry options[] = {
|
||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory (default: /ostree)", NULL },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
||||
gboolean
|
||||
ot_admin_builtin_init (int argc, char **argv, GError **error)
|
||||
ot_admin_builtin_init (int argc, char **argv, GFile *ostree_dir, GError **error)
|
||||
{
|
||||
GOptionContext *context;
|
||||
gboolean ret = FALSE;
|
||||
@ -50,12 +46,10 @@ ot_admin_builtin_init (int argc, char **argv, GError **error)
|
||||
if (!g_option_context_parse (context, &argc, &argv, error))
|
||||
goto out;
|
||||
|
||||
dir = g_file_new_for_path (opt_ostree_dir);
|
||||
|
||||
if (!ot_admin_ensure_initialized (dir, cancellable, error))
|
||||
if (!ot_admin_ensure_initialized (ostree_dir, cancellable, error))
|
||||
goto out;
|
||||
|
||||
g_print ("%s initialized as OSTree root\n", opt_ostree_dir);
|
||||
g_print ("%s initialized as OSTree root\n", ot_gfile_get_path_cached (ostree_dir));
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
@ -29,20 +29,18 @@
|
||||
#include <sys/utsname.h>
|
||||
|
||||
typedef struct {
|
||||
OstreeRepo *repo;
|
||||
GFile *ostree_dir;
|
||||
} OtAdminUpdateKernel;
|
||||
|
||||
static char *opt_ostree_dir = "/ostree";
|
||||
|
||||
static GOptionEntry options[] = {
|
||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory", NULL },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
static gboolean
|
||||
copy_modules (const char *release,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
copy_modules (OtAdminUpdateKernel *self,
|
||||
const char *release,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
ot_lobj GFile *src_modules_file = NULL;
|
||||
@ -50,7 +48,7 @@ copy_modules (const char *release,
|
||||
ot_lobj GFile *dest_modules_file = NULL;
|
||||
|
||||
src_modules_file = ot_gfile_from_build_path ("/lib/modules", release, NULL);
|
||||
dest_modules_file = ot_gfile_from_build_path (opt_ostree_dir, "modules", release, NULL);
|
||||
dest_modules_file = ot_gfile_get_child_build_path (self->ostree_dir, "modules", release, NULL);
|
||||
dest_modules_parent = g_file_get_parent (dest_modules_file);
|
||||
if (!ot_gfile_ensure_directory (dest_modules_parent, FALSE, error))
|
||||
goto out;
|
||||
@ -69,10 +67,11 @@ copy_modules (const char *release,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_initramfs (const char *release,
|
||||
const char *deploy_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
update_initramfs (OtAdminUpdateKernel *self,
|
||||
const char *release,
|
||||
const char *deploy_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
ot_lfree char *initramfs_name = NULL;
|
||||
@ -85,8 +84,8 @@ update_initramfs (const char *release,
|
||||
ot_lptrarray GPtrArray *mkinitramfs_args = NULL;
|
||||
ot_lobj GFile *tmpdir = NULL;
|
||||
ot_lfree char *initramfs_tmp_path = NULL;
|
||||
ot_lfree char *ostree_vardir = NULL;
|
||||
ot_lfree char *ostree_moduledir = NULL;
|
||||
ot_lfree GFile *ostree_vardir = NULL;
|
||||
ot_lfree GFile *ostree_moduledir = NULL;
|
||||
ot_lobj GFile *initramfs_tmp_file = NULL;
|
||||
ot_lobj GFileInfo *initramfs_tmp_info = NULL;
|
||||
|
||||
@ -94,8 +93,8 @@ update_initramfs (const char *release,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
|
||||
ostree_vardir = g_build_filename (opt_ostree_dir, "var", NULL);
|
||||
ostree_moduledir = g_build_filename (opt_ostree_dir, "modules", NULL);
|
||||
ostree_vardir = g_file_get_child (self->ostree_dir, "var");
|
||||
ostree_moduledir = g_file_get_child (self->ostree_dir, "modules");
|
||||
|
||||
mkinitramfs_args = g_ptr_array_new ();
|
||||
/* Note: the hardcoded /tmp path below is not actually a
|
||||
@ -107,9 +106,9 @@ update_initramfs (const char *release,
|
||||
"--mount-readonly", "/",
|
||||
"--mount-proc", "/proc",
|
||||
"--mount-bind", "/dev", "/dev",
|
||||
"--mount-bind", ostree_vardir, "/var",
|
||||
"--mount-bind", ot_gfile_get_path_cached (ostree_vardir), "/var",
|
||||
"--mount-bind", ot_gfile_get_path_cached (tmpdir), "/tmp",
|
||||
"--mount-bind", ostree_moduledir, "/lib/modules",
|
||||
"--mount-bind", ot_gfile_get_path_cached (ostree_moduledir), "/lib/modules",
|
||||
deploy_path,
|
||||
"dracut", "-f", "/tmp/initramfs-ostree.img", release,
|
||||
NULL);
|
||||
@ -188,10 +187,11 @@ grep_literal (GFile *f,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_kernel_path_from_release (const char *release,
|
||||
GFile **out_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
get_kernel_path_from_release (OtAdminUpdateKernel *self,
|
||||
const char *release,
|
||||
GFile **out_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
ot_lfree char *name = NULL;
|
||||
@ -211,9 +211,10 @@ get_kernel_path_from_release (const char *release,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_grub (const char *release,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
update_grub (OtAdminUpdateKernel *self,
|
||||
const char *release,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
ot_lobj GFile *grub_path = g_file_new_for_path ("/boot/grub/grub.conf");
|
||||
@ -232,7 +233,8 @@ update_grub (const char *release,
|
||||
ot_lfree char *initramfs_arg = NULL;
|
||||
ot_lobj GFile *kernel_path = NULL;
|
||||
|
||||
if (!get_kernel_path_from_release (release, &kernel_path, cancellable, error))
|
||||
if (!get_kernel_path_from_release (self, release, &kernel_path,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
|
||||
if (kernel_path == NULL)
|
||||
@ -268,7 +270,7 @@ update_grub (const char *release,
|
||||
}
|
||||
|
||||
gboolean
|
||||
ot_admin_builtin_update_kernel (int argc, char **argv, GError **error)
|
||||
ot_admin_builtin_update_kernel (int argc, char **argv, GFile *ostree_dir, GError **error)
|
||||
{
|
||||
GOptionContext *context;
|
||||
OtAdminUpdateKernel self_data;
|
||||
@ -304,18 +306,21 @@ ot_admin_builtin_update_kernel (int argc, char **argv, GError **error)
|
||||
release = utsname.release;
|
||||
if (argc > 2)
|
||||
release = argv[2];
|
||||
|
||||
self->ostree_dir = g_object_ref (ostree_dir);
|
||||
|
||||
if (!copy_modules (release, cancellable, error))
|
||||
if (!copy_modules (self, release, cancellable, error))
|
||||
goto out;
|
||||
|
||||
if (!update_initramfs (release, deploy_path, cancellable, error))
|
||||
if (!update_initramfs (self, release, deploy_path, cancellable, error))
|
||||
goto out;
|
||||
|
||||
if (!update_grub (release, cancellable, error))
|
||||
if (!update_grub (self, release, cancellable, error))
|
||||
goto out;
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
||||
g_clear_object (&self->ostree_dir);
|
||||
if (context)
|
||||
g_option_context_free (context);
|
||||
return ret;
|
@ -27,10 +27,10 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
gboolean ot_admin_builtin_init (int argc, char **argv, GError **error);
|
||||
gboolean ot_admin_builtin_deploy (int argc, char **argv, GError **error);
|
||||
gboolean ot_admin_builtin_diff (int argc, char **argv, GError **error);
|
||||
gboolean ot_admin_builtin_update_kernel (int argc, char **argv, GError **error);
|
||||
gboolean ot_admin_builtin_init (int argc, char **argv, GFile *ostree_dir, GError **error);
|
||||
gboolean ot_admin_builtin_deploy (int argc, char **argv, GFile *ostree_dir, GError **error);
|
||||
gboolean ot_admin_builtin_diff (int argc, char **argv, GFile *ostree_dir, GError **error);
|
||||
gboolean ot_admin_builtin_update_kernel (int argc, char **argv, GFile *ostree_dir, GError **error);
|
||||
|
||||
G_END_DECLS
|
||||
|
105
src/ostree/ot-builtin-admin.c
Normal file
105
src/ostree/ot-builtin-admin.c
Normal file
@ -0,0 +1,105 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
||||
*
|
||||
* Copyright (C) 2011 Colin Walters <walters@verbum.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Author: Colin Walters <walters@verbum.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "ot-builtins.h"
|
||||
#include "ot-admin-builtins.h"
|
||||
#include "ot-main.h"
|
||||
#include "ostree.h"
|
||||
#include "ostree-repo-file.h"
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
static char *opt_ostree_dir = "/ostree";
|
||||
|
||||
static GOptionEntry options[] = {
|
||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory (default: /ostree)", NULL },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
gboolean (*fn) (int argc, char **argv, GFile *ostree_dir, GError **error);
|
||||
} OstreeAdminCommand;
|
||||
|
||||
static OstreeAdminCommand admin_subcommands[] = {
|
||||
{ "init", ot_admin_builtin_init },
|
||||
{ "deploy", ot_admin_builtin_deploy },
|
||||
{ "update-kernel", ot_admin_builtin_update_kernel },
|
||||
{ "config-diff", ot_admin_builtin_diff },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
gboolean
|
||||
ostree_builtin_admin (int argc, char **argv, GFile *repo_path, GError **error)
|
||||
{
|
||||
GOptionContext *context;
|
||||
gboolean ret = FALSE;
|
||||
__attribute__((unused)) GCancellable *cancellable = NULL;
|
||||
const char *subcommand_name;
|
||||
OstreeAdminCommand *subcommand;
|
||||
int subcmd_argc;
|
||||
char **subcmd_argv = NULL;
|
||||
ot_lobj GFile *ostree_dir = NULL;
|
||||
|
||||
context = g_option_context_new ("[OPTIONS] SUBCOMMAND - Run an administrative subcommand");
|
||||
g_option_context_add_main_entries (context, options, NULL);
|
||||
|
||||
if (!g_option_context_parse (context, &argc, &argv, error))
|
||||
goto out;
|
||||
|
||||
if (argc <= 1)
|
||||
{
|
||||
ot_util_usage_error (context, "A valid SUBCOMMAND is required", error);
|
||||
goto out;
|
||||
}
|
||||
subcommand_name = argv[1];
|
||||
|
||||
subcommand = admin_subcommands;
|
||||
while (subcommand->name)
|
||||
{
|
||||
if (g_strcmp0 (subcommand_name, subcommand->name) == 0)
|
||||
break;
|
||||
subcommand++;
|
||||
}
|
||||
|
||||
if (!subcommand->name)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
"Unknown command '%s'", subcommand_name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ostree_dir = g_file_new_for_path (opt_ostree_dir);
|
||||
|
||||
ostree_prep_builtin_argv (subcommand_name, argc-2, argv+2, &subcmd_argc, &subcmd_argv);
|
||||
|
||||
if (!subcommand->fn (subcmd_argc, subcmd_argv, ostree_dir, error))
|
||||
goto out;
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
||||
if (context)
|
||||
g_option_context_free (context);
|
||||
return ret;
|
||||
}
|
@ -27,6 +27,7 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
gboolean ostree_builtin_admin (int argc, char **argv, GFile *repo_path, GError **error);
|
||||
gboolean ostree_builtin_cat (int argc, char **argv, GFile *repo_path, GError **error);
|
||||
gboolean ostree_builtin_config (int argc, char **argv, GFile *repo_path, GError **error);
|
||||
gboolean ostree_builtin_checkout (int argc, char **argv, GFile *repo_path, GError **error);
|
||||
|
@ -54,12 +54,12 @@ ostree_usage (char **argv,
|
||||
return (is_error ? 1 : 0);
|
||||
}
|
||||
|
||||
static void
|
||||
prep_builtin_argv (const char *builtin,
|
||||
int argc,
|
||||
char **argv,
|
||||
int *out_argc,
|
||||
char ***out_argv)
|
||||
void
|
||||
ostree_prep_builtin_argv (const char *builtin,
|
||||
int argc,
|
||||
char **argv,
|
||||
int *out_argc,
|
||||
char ***out_argv)
|
||||
{
|
||||
int i;
|
||||
char **cmd_argv;
|
||||
@ -165,7 +165,7 @@ ostree_run (int argc,
|
||||
goto out;
|
||||
}
|
||||
|
||||
prep_builtin_argv (cmd, argc-arg_off, argv+arg_off, &cmd_argc, &cmd_argv);
|
||||
ostree_prep_builtin_argv (cmd, argc-arg_off, argv+arg_off, &cmd_argc, &cmd_argv);
|
||||
|
||||
if (!command->fn (cmd_argc, cmd_argv, repo_file, &error))
|
||||
goto out;
|
||||
|
@ -33,6 +33,13 @@ typedef struct {
|
||||
int flags; /* OstreeBuiltinFlags */
|
||||
} OstreeCommand;
|
||||
|
||||
void
|
||||
ostree_prep_builtin_argv (const char *builtin,
|
||||
int argc,
|
||||
char **argv,
|
||||
int *out_argc,
|
||||
char ***out_argv);
|
||||
|
||||
int ostree_main (int argc, char **argv, OstreeCommand *commands);
|
||||
|
||||
int ostree_run (int argc, char **argv, OstreeCommand *commands, GError **error);
|
||||
|
Loading…
Reference in New Issue
Block a user