func (*progressSuite) TestProgressCmds(c *gc.C) { initCmd := cloudinit.InitProgressCmd() re := regexp.MustCompile(`test -e /proc/self/fd/([0-9]+) \|\| exec ([0-9]+)>&2`) submatch := re.FindStringSubmatch(initCmd) c.Assert(submatch, gc.HasLen, 3) c.Assert(submatch[0], gc.Equals, initCmd) c.Assert(submatch[1], gc.Equals, submatch[2]) logCmd := cloudinit.LogProgressCmd("he'llo\"!") c.Assert(logCmd, gc.Equals, `echo 'he'"'"'llo"!' >&`+submatch[1]) }
// ConfigureScript generates the bash script that applies // the specified cloud-config. func ConfigureScript(cloudcfg *cloudinit.Config) (string, error) { // TODO(axw): 2013-08-23 bug 1215777 // Carry out configuration for ssh-keys-per-user, // machine-updates-authkeys, using cloud-init config. // // We should work with smoser to get a supported // command in (or next to) cloud-init for manually // invoking cloud-config. This would address the // above comment by removing the need to generate a // script "by hand". // Bootcmds must be run before anything else, // as they may affect package installation. bootcmds, err := cmdlist(cloudcfg.BootCmds()) if err != nil { return "", err } // Add package sources and packages. pkgcmds, err := addPackageCommands(cloudcfg) if err != nil { return "", err } // Runcmds come last. runcmds, err := cmdlist(cloudcfg.RunCmds()) if err != nil { return "", err } // We prepend "set -xe". This is already in runcmds, // but added here to avoid relying on that to be // invariant. script := []string{"#!/bin/bash", "set -e"} // We must initialise progress reporting before entering // the subshell and redirecting stderr. script = append(script, cloudinit.InitProgressCmd()) stdout, stderr := cloudcfg.Output(cloudinit.OutAll) script = append(script, "(") if stderr != "" { script = append(script, "(") } script = append(script, bootcmds...) script = append(script, pkgcmds...) script = append(script, runcmds...) if stderr != "" { script = append(script, ") "+stdout) script = append(script, ") "+stderr) } else { script = append(script, ") "+stdout+" 2>&1") } return strings.Join(script, "\n"), nil }