[lxc-devel] [PATCH 1/2] add clonehostname hook

Dwight Engen dwight.engen at oracle.com
Tue Jul 9 20:19:10 UTC 2013


On Tue, 9 Jul 2013 14:56:20 -0400
Stéphane Graber <stgraber at ubuntu.com> wrote:

> On Tue, Jul 09, 2013 at 02:44:30PM -0400, Dwight Engen wrote:
> > This hook script updates the hostname in various files under /etc
> > in the cloned container. In order to do so, the old container name
> > is passed in the LXC_SRC_NAME environment variable.
> > 
> 
> Looks good, just a few comments below.
> 
> 
> > Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
> > ---
> >  doc/lxc-clone.sgml.in  |  3 ++-
> >  hooks/Makefile.am      |  1 +
> >  hooks/clonehostname    | 29 +++++++++++++++++++++++++++++
> >  src/lxc/lxccontainer.c |  9 +++++++--
> >  4 files changed, 39 insertions(+), 3 deletions(-)
> >  create mode 100755 hooks/clonehostname
> > 
> > diff --git a/doc/lxc-clone.sgml.in b/doc/lxc-clone.sgml.in
> > index 6885ff7..74982a1 100644
> > --- a/doc/lxc-clone.sgml.in
> > +++ b/doc/lxc-clone.sgml.in
> > @@ -255,7 +255,8 @@ Foundation, Inc., 59 Temple Place, Suite 330,
> > Boston, MA 02111-1307 USA argument 4.  The
> > <filename>LXC_ROOTFS_MOUNT</filename> environment variable gives
> > the path under which the container's root filesystem is mounted.
> > The configuration file pathname is stored in
> > <filename>LXC_CONFIG_FILE</filename>, the
> > -      container name in <filename>LXC_NAME</filename>, and the
> > path or device on which
> > +      new container name in <filename>LXC_NAME</filename>, the old
> > container name in
> > +      <filename>LXC_SRC_NAME</filename>, and the path or device on
> > which the rootfs is located is in
> > <filename>LXC_ROOTFS_PATH</filename>. </para>
> >    </refsect1>
> > diff --git a/hooks/Makefile.am b/hooks/Makefile.am
> > index 196e632..3e32ce0 100644
> > --- a/hooks/Makefile.am
> > +++ b/hooks/Makefile.am
> > @@ -1,6 +1,7 @@
> >  hooksdir=@LXCHOOKDIR@
> >  
> >  hooks_SCRIPTS = \
> > +	clonehostname \
> >  	mountcgroups \
> >  	mountecryptfsroot
> >  
> > diff --git a/hooks/clonehostname b/hooks/clonehostname
> > new file mode 100755
> > index 0000000..79d14a5
> > --- /dev/null
> > +++ b/hooks/clonehostname
> > @@ -0,0 +1,29 @@
> > +#!/bin/bash
> 
> Not seeing any bashism below, so could be "#!/bin/sh" which should be
> identical on RedHat-based distro and is recommended on Debian-based
> distros for performance reason (dash is faster than bash).

Sure, thats what I get for starting from hooks/mountcgroup without
realizing it had bashisms. Makes sense to use /bin/sh where possible.

> > +#
> > +# Update the hostname in the cloned container's scripts
> > +#
> > +# Copyright ©  2013 Oracle.
> > +#
> > +# This library is free software; you can redistribute it and/or
> > modify +# it under the terms of the GNU General Public License
> > version 2, as +# published by the Free Software Foundation.
> > +#
> > +# This program 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 General Public License for more details.
> > +#
> > +# You should have received a copy of the GNU General Public
> > License along +# with this program; if not, write to the Free
> > Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor,
> > Boston, MA 02110-1301 USA. +
> > +# Note that /etc/hostname is updated by lxc itself
> > +for file in \
> > +    $LXC_ROOTFS_PATH/etc/sysconfig/network \
> > +    $LXC_ROOTFS_PATH/etc/sysconfig/network-scripts/ifcfg-* ;
> > +do
> > +    if [ -f $file ]; then
> > +        sed -i "s|$LXC_SRC_NAME|$LXC_NAME|" $file
> > +    fi
> > +done
> > +exit 0
> > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> > index 4e71fb1..43acf47 100644
> > --- a/src/lxc/lxccontainer.c
> > +++ b/src/lxc/lxccontainer.c
> > @@ -1767,7 +1767,9 @@ static int copy_storage(struct lxc_container
> > *c0, struct lxc_container *c, return 0;
> >  }
> >  
> > -static int clone_update_rootfs(struct lxc_container *c, int flags,
> > char **hookargs) +static int clone_update_rootfs(struct
> > lxc_container *c0,
> > +			       struct lxc_container *c, int flags,
> > +			       char **hookargs)
> >  {
> >  	int ret = -1;
> >  	char path[MAXPATHLEN];
> > @@ -1797,6 +1799,9 @@ static int clone_update_rootfs(struct
> > lxc_container *c, int flags, char **hookar 
> >  	if (!lxc_list_empty(&conf->hooks[LXCHOOK_CLONE])) {
> >  		/* Start of environment variable setup for hooks */
> > +		if (setenv("LXC_SRC_NAME", c0->name, 1)) {
> > +			SYSERROR("failed to set environment
> > variable for container name");
> > +		}
> 
> "for source container name" maybe? that way it's different from the
> other error message.

Will change it in v2.
 
> >  		if (setenv("LXC_NAME", c->name, 1)) {
> >  			SYSERROR("failed to set environment
> > variable for container name"); }
> > @@ -1955,7 +1960,7 @@ struct lxc_container *lxcapi_clone(struct
> > lxc_container *c, const char *newname, if (!c2->save_config(c2,
> > NULL)) goto out;
> >  
> > -	if (clone_update_rootfs(c2, flags, hookargs) < 0)
> > +	if (clone_update_rootfs(c, c2, flags, hookargs) < 0)
> >  		goto out;
> >  
> >  	// TODO: update c's lxc.snapshot = count
> > -- 
> > 1.8.1.4
> > 
> > 
> > ------------------------------------------------------------------------------
> > See everything from the browser to the database with AppDynamics
> > Get end-to-end visibility with application monitoring from
> > AppDynamics Isolate bottlenecks and diagnose root cause in seconds.
> > Start your free trial of AppDynamics Pro today!
> > http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
> > _______________________________________________
> > Lxc-devel mailing list
> > Lxc-devel at lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/lxc-devel
> 





More information about the lxc-devel mailing list