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 \
|
ostree_SOURCES = src/ostree/main.c \
|
||||||
src/ostree/ot-builtins.h \
|
src/ostree/ot-builtins.h \
|
||||||
|
src/ostree/ot-builtin-admin.c \
|
||||||
src/ostree/ot-builtin-cat.c \
|
src/ostree/ot-builtin-cat.c \
|
||||||
src/ostree/ot-builtin-config.c \
|
src/ostree/ot-builtin-config.c \
|
||||||
src/ostree/ot-builtin-checkout.c \
|
src/ostree/ot-builtin-checkout.c \
|
||||||
|
|
@ -45,6 +46,16 @@ ostree_SOURCES = src/ostree/main.c \
|
||||||
src/ostree/ot-main.c \
|
src/ostree/ot-main.c \
|
||||||
$(NULL)
|
$(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_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
|
ostree_bin_shared_ldadd = libotutil.la libostree.la
|
||||||
|
|
||||||
|
|
@ -64,3 +75,16 @@ ostree_pull_LDADD = $(ostree_bin_shared_ldadd) $(OT_INTERNAL_SOUP_LIBS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
MANPAGES += doc/ostree.1
|
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-otutil.am
|
||||||
include Makefile-libostree.am
|
include Makefile-libostree.am
|
||||||
include Makefile-ostree.am
|
include Makefile-ostree.am
|
||||||
include Makefile-ostadmin.am
|
|
||||||
include Makefile-switchroot.am
|
include Makefile-switchroot.am
|
||||||
include Makefile-triggers.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"
|
#include "ot-builtins.h"
|
||||||
|
|
||||||
static OstreeCommand commands[] = {
|
static OstreeCommand commands[] = {
|
||||||
|
{ "admin", ostree_builtin_admin, OSTREE_BUILTIN_FLAG_NO_REPO },
|
||||||
{ "cat", ostree_builtin_cat, 0 },
|
{ "cat", ostree_builtin_cat, 0 },
|
||||||
{ "commit", ostree_builtin_commit, 0 },
|
{ "commit", ostree_builtin_commit, 0 },
|
||||||
{ "config", ostree_builtin_config, 0 },
|
{ "config", ostree_builtin_config, 0 },
|
||||||
|
|
|
||||||
|
|
@ -35,10 +35,8 @@ typedef struct {
|
||||||
|
|
||||||
static gboolean opt_no_kernel;
|
static gboolean opt_no_kernel;
|
||||||
static gboolean opt_force;
|
static gboolean opt_force;
|
||||||
static char *opt_ostree_dir = "/ostree";
|
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
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 },
|
{ "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 },
|
{ "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Overwrite any existing deployment", NULL },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
|
|
@ -195,27 +193,30 @@ ensure_unlinked (GFile *path,
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
copy_one_config_file (OtAdminDeploy *self,
|
copy_one_config_file (OtAdminDeploy *self,
|
||||||
|
GFile *orig_etc,
|
||||||
GFile *modified_etc,
|
GFile *modified_etc,
|
||||||
GFile *new_etc,
|
GFile *new_etc,
|
||||||
GFile *file,
|
GFile *src,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
ot_lobj GFile *target_file = NULL;
|
ot_lobj GFile *dest = NULL;
|
||||||
ot_lobj GFile *target_parent = NULL;
|
ot_lobj GFile *parent = NULL;
|
||||||
ot_lfree char *path = 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);
|
parent = g_file_get_parent (dest);
|
||||||
g_assert (path);
|
|
||||||
target_file = g_file_resolve_relative_path (new_etc, path);
|
|
||||||
target_parent = g_file_get_parent (target_file);
|
|
||||||
|
|
||||||
/* FIXME actually we need to copy permissions and xattrs */
|
/* 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;
|
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))
|
cancellable, NULL, NULL, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
@ -251,7 +252,7 @@ merge_etc_changes (OtAdminDeploy *self,
|
||||||
ot_lptrarray GPtrArray *added = NULL;
|
ot_lptrarray GPtrArray *added = NULL;
|
||||||
guint i;
|
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);
|
removed = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||||
added = 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++)
|
for (i = 0; i < modified->len; i++)
|
||||||
{
|
{
|
||||||
OstreeDiffItem *diff = modified->pdata[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))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
for (i = 0; i < added->len; i++)
|
for (i = 0; i < added->len; i++)
|
||||||
{
|
{
|
||||||
GFile *file = added->pdata[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))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
@ -505,8 +515,9 @@ do_update_kernel (OtAdminDeploy *self,
|
||||||
ot_lptrarray GPtrArray *args = NULL;
|
ot_lptrarray GPtrArray *args = NULL;
|
||||||
|
|
||||||
args = g_ptr_array_new ();
|
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),
|
"--ostree-dir", ot_gfile_get_path_cached (self->ostree_dir),
|
||||||
|
"update-kernel",
|
||||||
ot_gfile_get_path_cached (deploy_path), NULL);
|
ot_gfile_get_path_cached (deploy_path), NULL);
|
||||||
g_ptr_array_add (args, NULL);
|
g_ptr_array_add (args, NULL);
|
||||||
|
|
||||||
|
|
@ -522,7 +533,7 @@ do_update_kernel (OtAdminDeploy *self,
|
||||||
|
|
||||||
|
|
||||||
gboolean
|
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;
|
GOptionContext *context;
|
||||||
OtAdminDeploy self_data;
|
OtAdminDeploy self_data;
|
||||||
|
|
@ -549,7 +560,7 @@ ot_admin_builtin_deploy (int argc, char **argv, GError **error)
|
||||||
goto out;
|
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))
|
if (!ot_admin_ensure_initialized (self->ostree_dir, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -28,19 +28,15 @@
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
static char *opt_ostree_dir = "/ostree";
|
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory (default: /ostree)", NULL },
|
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
gboolean
|
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;
|
GOptionContext *context;
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
ot_lobj GFile *ostree_dir = NULL;
|
|
||||||
ot_lobj GFile *repo_path = NULL;
|
ot_lobj GFile *repo_path = NULL;
|
||||||
ot_lobj GFile *deployment = NULL;
|
ot_lobj GFile *deployment = NULL;
|
||||||
ot_lobj GFile *deploy_parent = 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))
|
if (!g_option_context_parse (context, &argc, &argv, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ostree_dir = g_file_new_for_path (opt_ostree_dir);
|
|
||||||
repo_path = g_file_get_child (ostree_dir, "repo");
|
repo_path = g_file_get_child (ostree_dir, "repo");
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
|
|
@ -84,7 +79,7 @@ ot_admin_builtin_diff (int argc, char **argv, GError **error)
|
||||||
ot_gfile_get_basename_cached (deployment),
|
ot_gfile_get_basename_cached (deployment),
|
||||||
"-etc", NULL);
|
"-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);
|
removed = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||||
added = 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,
|
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;
|
ret = TRUE;
|
||||||
out:
|
out:
|
||||||
g_clear_object (&ostree_dir);
|
|
||||||
if (context)
|
if (context)
|
||||||
g_option_context_free (context);
|
g_option_context_free (context);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -28,16 +28,12 @@
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
static char *opt_ostree_dir = "/ostree";
|
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory (default: /ostree)", NULL },
|
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
gboolean
|
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;
|
GOptionContext *context;
|
||||||
gboolean ret = FALSE;
|
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))
|
if (!g_option_context_parse (context, &argc, &argv, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
dir = g_file_new_for_path (opt_ostree_dir);
|
if (!ot_admin_ensure_initialized (ostree_dir, cancellable, error))
|
||||||
|
|
||||||
if (!ot_admin_ensure_initialized (dir, cancellable, error))
|
|
||||||
goto out;
|
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;
|
ret = TRUE;
|
||||||
out:
|
out:
|
||||||
|
|
@ -29,20 +29,18 @@
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
OstreeRepo *repo;
|
GFile *ostree_dir;
|
||||||
} OtAdminUpdateKernel;
|
} OtAdminUpdateKernel;
|
||||||
|
|
||||||
static char *opt_ostree_dir = "/ostree";
|
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "ostree-dir", 0, 0, G_OPTION_ARG_STRING, &opt_ostree_dir, "Path to OSTree root directory", NULL },
|
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
copy_modules (const char *release,
|
copy_modules (OtAdminUpdateKernel *self,
|
||||||
GCancellable *cancellable,
|
const char *release,
|
||||||
GError **error)
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
ot_lobj GFile *src_modules_file = NULL;
|
ot_lobj GFile *src_modules_file = NULL;
|
||||||
|
|
@ -50,7 +48,7 @@ copy_modules (const char *release,
|
||||||
ot_lobj GFile *dest_modules_file = NULL;
|
ot_lobj GFile *dest_modules_file = NULL;
|
||||||
|
|
||||||
src_modules_file = ot_gfile_from_build_path ("/lib/modules", release, 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);
|
dest_modules_parent = g_file_get_parent (dest_modules_file);
|
||||||
if (!ot_gfile_ensure_directory (dest_modules_parent, FALSE, error))
|
if (!ot_gfile_ensure_directory (dest_modules_parent, FALSE, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -69,10 +67,11 @@ copy_modules (const char *release,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
update_initramfs (const char *release,
|
update_initramfs (OtAdminUpdateKernel *self,
|
||||||
const char *deploy_path,
|
const char *release,
|
||||||
GCancellable *cancellable,
|
const char *deploy_path,
|
||||||
GError **error)
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
ot_lfree char *initramfs_name = NULL;
|
ot_lfree char *initramfs_name = NULL;
|
||||||
|
|
@ -85,8 +84,8 @@ update_initramfs (const char *release,
|
||||||
ot_lptrarray GPtrArray *mkinitramfs_args = NULL;
|
ot_lptrarray GPtrArray *mkinitramfs_args = NULL;
|
||||||
ot_lobj GFile *tmpdir = NULL;
|
ot_lobj GFile *tmpdir = NULL;
|
||||||
ot_lfree char *initramfs_tmp_path = NULL;
|
ot_lfree char *initramfs_tmp_path = NULL;
|
||||||
ot_lfree char *ostree_vardir = NULL;
|
ot_lfree GFile *ostree_vardir = NULL;
|
||||||
ot_lfree char *ostree_moduledir = NULL;
|
ot_lfree GFile *ostree_moduledir = NULL;
|
||||||
ot_lobj GFile *initramfs_tmp_file = NULL;
|
ot_lobj GFile *initramfs_tmp_file = NULL;
|
||||||
ot_lobj GFileInfo *initramfs_tmp_info = NULL;
|
ot_lobj GFileInfo *initramfs_tmp_info = NULL;
|
||||||
|
|
||||||
|
|
@ -94,8 +93,8 @@ update_initramfs (const char *release,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ostree_vardir = g_build_filename (opt_ostree_dir, "var", NULL);
|
ostree_vardir = g_file_get_child (self->ostree_dir, "var");
|
||||||
ostree_moduledir = g_build_filename (opt_ostree_dir, "modules", NULL);
|
ostree_moduledir = g_file_get_child (self->ostree_dir, "modules");
|
||||||
|
|
||||||
mkinitramfs_args = g_ptr_array_new ();
|
mkinitramfs_args = g_ptr_array_new ();
|
||||||
/* Note: the hardcoded /tmp path below is not actually a
|
/* Note: the hardcoded /tmp path below is not actually a
|
||||||
|
|
@ -107,9 +106,9 @@ update_initramfs (const char *release,
|
||||||
"--mount-readonly", "/",
|
"--mount-readonly", "/",
|
||||||
"--mount-proc", "/proc",
|
"--mount-proc", "/proc",
|
||||||
"--mount-bind", "/dev", "/dev",
|
"--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", 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,
|
deploy_path,
|
||||||
"dracut", "-f", "/tmp/initramfs-ostree.img", release,
|
"dracut", "-f", "/tmp/initramfs-ostree.img", release,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
@ -188,10 +187,11 @@ grep_literal (GFile *f,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
get_kernel_path_from_release (const char *release,
|
get_kernel_path_from_release (OtAdminUpdateKernel *self,
|
||||||
GFile **out_path,
|
const char *release,
|
||||||
GCancellable *cancellable,
|
GFile **out_path,
|
||||||
GError **error)
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
ot_lfree char *name = NULL;
|
ot_lfree char *name = NULL;
|
||||||
|
|
@ -211,9 +211,10 @@ get_kernel_path_from_release (const char *release,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
update_grub (const char *release,
|
update_grub (OtAdminUpdateKernel *self,
|
||||||
GCancellable *cancellable,
|
const char *release,
|
||||||
GError **error)
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
ot_lobj GFile *grub_path = g_file_new_for_path ("/boot/grub/grub.conf");
|
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_lfree char *initramfs_arg = NULL;
|
||||||
ot_lobj GFile *kernel_path = 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;
|
goto out;
|
||||||
|
|
||||||
if (kernel_path == NULL)
|
if (kernel_path == NULL)
|
||||||
|
|
@ -268,7 +270,7 @@ update_grub (const char *release,
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
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;
|
GOptionContext *context;
|
||||||
OtAdminUpdateKernel self_data;
|
OtAdminUpdateKernel self_data;
|
||||||
|
|
@ -304,18 +306,21 @@ ot_admin_builtin_update_kernel (int argc, char **argv, GError **error)
|
||||||
release = utsname.release;
|
release = utsname.release;
|
||||||
if (argc > 2)
|
if (argc > 2)
|
||||||
release = argv[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;
|
goto out;
|
||||||
|
|
||||||
if (!update_initramfs (release, deploy_path, cancellable, error))
|
if (!update_initramfs (self, release, deploy_path, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!update_grub (release, cancellable, error))
|
if (!update_grub (self, release, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
out:
|
out:
|
||||||
|
g_clear_object (&self->ostree_dir);
|
||||||
if (context)
|
if (context)
|
||||||
g_option_context_free (context);
|
g_option_context_free (context);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -27,10 +27,10 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
gboolean ot_admin_builtin_init (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, 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, 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, GError **error);
|
gboolean ot_admin_builtin_update_kernel (int argc, char **argv, GFile *ostree_dir, GError **error);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
@ -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
|
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_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_config (int argc, char **argv, GFile *repo_path, GError **error);
|
||||||
gboolean ostree_builtin_checkout (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);
|
return (is_error ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
prep_builtin_argv (const char *builtin,
|
ostree_prep_builtin_argv (const char *builtin,
|
||||||
int argc,
|
int argc,
|
||||||
char **argv,
|
char **argv,
|
||||||
int *out_argc,
|
int *out_argc,
|
||||||
char ***out_argv)
|
char ***out_argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char **cmd_argv;
|
char **cmd_argv;
|
||||||
|
|
@ -165,7 +165,7 @@ ostree_run (int argc,
|
||||||
goto out;
|
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))
|
if (!command->fn (cmd_argc, cmd_argv, repo_file, &error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,13 @@ typedef struct {
|
||||||
int flags; /* OstreeBuiltinFlags */
|
int flags; /* OstreeBuiltinFlags */
|
||||||
} OstreeCommand;
|
} 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_main (int argc, char **argv, OstreeCommand *commands);
|
||||||
|
|
||||||
int ostree_run (int argc, char **argv, OstreeCommand *commands, GError **error);
|
int ostree_run (int argc, char **argv, OstreeCommand *commands, GError **error);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue