[ostree] Move "ostadmin" => "ostree admin"



commit fa5485c6c4e77a0d161a502d3efb806d6d803f19
Author: Colin Walters <walters verbum org>
Date:   Sat Sep 8 18:46:50 2012 -0400

    Move "ostadmin" => "ostree admin"
    
    This helps us avoid polluting the global binary namespace.

 Makefile-ostadmin.am                               |   48 -------
 Makefile-ostree.am                                 |   24 ++++
 Makefile.am                                        |    1 -
 src/ostadmin/main.c                                |   45 ------
 src/ostadmin/ot-admin-main.c                       |  141 --------------------
 src/ostadmin/ot-admin-main.h                       |   32 -----
 src/{ostadmin => ostree}/grub2/15_ostree           |    0
 src/{ostadmin => ostree}/kernel/15_ostree_remove   |    0
 src/{ostadmin => ostree}/kernel/15_ostree_update   |    0
 src/ostree/main.c                                  |    1 +
 src/{ostadmin => ostree}/ot-admin-builtin-deploy.c |   47 ++++---
 src/{ostadmin => ostree}/ot-admin-builtin-diff.c   |   10 +-
 src/{ostadmin => ostree}/ot-admin-builtin-init.c   |   12 +--
 .../ot-admin-builtin-update-kernel.c               |   65 +++++----
 src/{ostadmin => ostree}/ot-admin-builtins.h       |    8 +-
 src/{ostadmin => ostree}/ot-admin-functions.c      |    0
 src/{ostadmin => ostree}/ot-admin-functions.h      |    0
 src/ostree/ot-builtin-admin.c                      |  105 +++++++++++++++
 src/ostree/ot-builtins.h                           |    1 +
 src/ostree/ot-main.c                               |   14 +-
 src/ostree/ot-main.h                               |    7 +
 21 files changed, 218 insertions(+), 343 deletions(-)
---
diff --git a/Makefile-ostree.am b/Makefile-ostree.am
index 571b07f..59b4775 100644
--- a/Makefile-ostree.am
+++ b/Makefile-ostree.am
@@ -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
diff --git a/Makefile.am b/Makefile.am
index b8a99b4..55b04b1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
 
diff --git a/src/ostadmin/grub2/15_ostree b/src/ostree/grub2/15_ostree
similarity index 100%
rename from src/ostadmin/grub2/15_ostree
rename to src/ostree/grub2/15_ostree
diff --git a/src/ostadmin/kernel/15_ostree_remove b/src/ostree/kernel/15_ostree_remove
similarity index 100%
rename from src/ostadmin/kernel/15_ostree_remove
rename to src/ostree/kernel/15_ostree_remove
diff --git a/src/ostadmin/kernel/15_ostree_update b/src/ostree/kernel/15_ostree_update
similarity index 100%
rename from src/ostadmin/kernel/15_ostree_update
rename to src/ostree/kernel/15_ostree_update
diff --git a/src/ostree/main.c b/src/ostree/main.c
index 72231ab..994a837 100644
--- a/src/ostree/main.c
+++ b/src/ostree/main.c
@@ -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 },
diff --git a/src/ostadmin/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c
similarity index 92%
rename from src/ostadmin/ot-admin-builtin-deploy.c
rename to src/ostree/ot-admin-builtin-deploy.c
index 6322f2c..f81404f 100644
--- a/src/ostadmin/ot-admin-builtin-deploy.c
+++ b/src/ostree/ot-admin-builtin-deploy.c
@@ -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;
diff --git a/src/ostadmin/ot-admin-builtin-diff.c b/src/ostree/ot-admin-builtin-diff.c
similarity index 87%
rename from src/ostadmin/ot-admin-builtin-diff.c
rename to src/ostree/ot-admin-builtin-diff.c
index c828f8e..a5c347d 100644
--- a/src/ostadmin/ot-admin-builtin-diff.c
+++ b/src/ostree/ot-admin-builtin-diff.c
@@ -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;
diff --git a/src/ostadmin/ot-admin-builtin-init.c b/src/ostree/ot-admin-builtin-init.c
similarity index 79%
rename from src/ostadmin/ot-admin-builtin-init.c
rename to src/ostree/ot-admin-builtin-init.c
index 703e14f..f433176 100644
--- a/src/ostadmin/ot-admin-builtin-init.c
+++ b/src/ostree/ot-admin-builtin-init.c
@@ -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:
diff --git a/src/ostadmin/ot-admin-builtin-update-kernel.c b/src/ostree/ot-admin-builtin-update-kernel.c
similarity index 81%
rename from src/ostadmin/ot-admin-builtin-update-kernel.c
rename to src/ostree/ot-admin-builtin-update-kernel.c
index d8edad5..d69b57b 100644
--- a/src/ostadmin/ot-admin-builtin-update-kernel.c
+++ b/src/ostree/ot-admin-builtin-update-kernel.c
@@ -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;
diff --git a/src/ostadmin/ot-admin-builtins.h b/src/ostree/ot-admin-builtins.h
similarity index 77%
rename from src/ostadmin/ot-admin-builtins.h
rename to src/ostree/ot-admin-builtins.h
index 4ceca2a..f9e60d7 100644
--- a/src/ostadmin/ot-admin-builtins.h
+++ b/src/ostree/ot-admin-builtins.h
@@ -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
 
diff --git a/src/ostadmin/ot-admin-functions.c b/src/ostree/ot-admin-functions.c
similarity index 100%
rename from src/ostadmin/ot-admin-functions.c
rename to src/ostree/ot-admin-functions.c
diff --git a/src/ostadmin/ot-admin-functions.h b/src/ostree/ot-admin-functions.h
similarity index 100%
rename from src/ostadmin/ot-admin-functions.h
rename to src/ostree/ot-admin-functions.h
diff --git a/src/ostree/ot-builtin-admin.c b/src/ostree/ot-builtin-admin.c
new file mode 100644
index 0000000..f8aa8f9
--- /dev/null
+++ b/src/ostree/ot-builtin-admin.c
@@ -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;
+}
diff --git a/src/ostree/ot-builtins.h b/src/ostree/ot-builtins.h
index b380190..aa7a645 100644
--- a/src/ostree/ot-builtins.h
+++ b/src/ostree/ot-builtins.h
@@ -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);
diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c
index 90f3209..554307f 100644
--- a/src/ostree/ot-main.c
+++ b/src/ostree/ot-main.c
@@ -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;
diff --git a/src/ostree/ot-main.h b/src/ostree/ot-main.h
index 4deb086..f7e632b 100644
--- a/src/ostree/ot-main.h
+++ b/src/ostree/ot-main.h
@@ -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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]