~james-page/ubuntu/wily/juju-core/mir-fixes

« back to all changes in this revision

Viewing changes to src/launchpad.net/juju-core/cmd/plugins/juju-restore/restore.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2014-03-28 08:58:42 UTC
  • mfrom: (1.1.21)
  • Revision ID: package-import@ubuntu.com-20140328085842-cyzrgc120bdfxwj0
Tags: 1.17.7-0ubuntu1
* New upstream point release, including fixes for:
  - no debug log with all providers on Ubuntu 14.04 (LP: #1294776).
* d/control: Add cpu-checker dependency to juju-local (LP: #1297077).

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
        "io"
12
12
        "io/ioutil"
13
13
        "os"
14
 
        "os/exec"
15
14
        "path"
16
15
        "text/template"
17
16
 
31
30
        "launchpad.net/juju-core/state"
32
31
        "launchpad.net/juju-core/state/api"
33
32
        "launchpad.net/juju-core/utils"
 
33
        "launchpad.net/juju-core/utils/ssh"
34
34
)
35
35
 
36
36
func main() {
38
38
}
39
39
 
40
40
func Main(args []string) {
 
41
        ctx, err := cmd.DefaultContext()
 
42
        if err != nil {
 
43
                fmt.Fprintf(os.Stderr, "error: %v\n", err)
 
44
                os.Exit(2)
 
45
        }
41
46
        if err := juju.InitJujuHome(); err != nil {
42
47
                fmt.Fprintf(os.Stderr, "error: %s\n", err)
43
48
                os.Exit(2)
44
49
        }
45
 
        os.Exit(cmd.Main(&restoreCommand{}, cmd.DefaultContext(), args[1:]))
 
50
        os.Exit(cmd.Main(&restoreCommand{}, ctx, args[1:]))
46
51
}
47
52
 
48
53
var logger = loggo.GetLogger("juju.plugins.restore")
266
271
        newInstId = instance.Id(info.InstanceId)
267
272
 
268
273
        progress("copying backup file to bootstrap host")
269
 
        if err := scp(backupFile, addr, "~/juju-backup.tgz"); err != nil {
 
274
        if err := sendViaScp(backupFile, addr, "~/juju-backup.tgz"); err != nil {
270
275
                return "", "", fmt.Errorf("cannot copy backup file to bootstrap instance: %v", err)
271
276
        }
272
277
        progress("updating bootstrap machine")
273
 
        if err := ssh(addr, updateBootstrapMachineScript(newInstId, creds)); err != nil {
 
278
        if err := runViaSsh(addr, updateBootstrapMachineScript(newInstId, creds)); err != nil {
274
279
                return "", "", fmt.Errorf("update script failed: %v", err)
275
280
        }
276
281
        return newInstId, addr, nil
345
350
                n
346
351
                s/- .*(:[0-9]+)/- {{.Address}}\1/
347
352
        }" $agent/agent.conf
 
353
 
 
354
    # If we're processing a unit agent's directly
 
355
    # and it has some relations, reset
 
356
    # the stored version of all of them to
 
357
    # ensure that any relation hooks will
 
358
    # fire.
348
359
        if [[ $agent = unit-* ]]
349
360
        then
350
 
                sed -i -r 's/change-version: [0-9]+$/change-version: 0/' $agent/state/relations/*/* || true
 
361
        find $agent/state/relations -type f -exec sed -i -r 's/change-version: [0-9]+$/change-version: 0/' {} \;
351
362
        fi
352
363
        initctl start jujud-$agent
353
364
done
354
 
sed -i -r 's/^(:syslogtag, startswith, "juju-" @)(.*)(:[0-9]+.*)$/\1{{.Address}}\3/' /etc/rsyslog.d/*-juju*.conf
355
365
`)
356
366
 
357
367
// setAgentAddressScript generates an ssh script argument to update state addresses
404
414
        if addr == "" {
405
415
                return fmt.Errorf("no appropriate public address found")
406
416
        }
407
 
        return ssh(addr, sshArg)
408
 
}
409
 
 
410
 
func ssh(addr string, script string) error {
411
 
        args := []string{
412
 
                "-l", "ubuntu",
413
 
                "-T",
414
 
                "-o", "StrictHostKeyChecking no",
415
 
                "-o", "PasswordAuthentication no",
416
 
                addr,
417
 
                "sudo -n bash -c " + utils.ShQuote(script),
418
 
        }
419
 
        cmd := exec.Command("ssh", args...)
420
 
        logger.Debugf("ssh command: %s %q", cmd.Path, cmd.Args)
421
 
        data, err := cmd.CombinedOutput()
422
 
        if err != nil {
423
 
                return fmt.Errorf("ssh command failed: %v (%q)", err, data)
424
 
        }
425
 
        progress("ssh command succeeded: %q", data)
426
 
        return nil
427
 
}
428
 
 
429
 
func scp(file, host, destFile string) error {
430
 
        cmd := exec.Command(
431
 
                "scp",
432
 
                "-B",
433
 
                "-q",
434
 
                "-o", "StrictHostKeyChecking no",
435
 
                "-o", "PasswordAuthentication no",
436
 
                file,
437
 
                "ubuntu@"+host+":"+destFile)
438
 
        logger.Debugf("scp command: %s %q", cmd.Path, cmd.Args)
439
 
        out, err := cmd.CombinedOutput()
440
 
        if err == nil {
441
 
                return nil
442
 
        }
443
 
        if _, ok := err.(*exec.ExitError); ok {
444
 
                return fmt.Errorf("scp failed: %s", out)
445
 
        }
446
 
        return err
 
417
        return runViaSsh(addr, sshArg)
 
418
}
 
419
 
 
420
func runViaSsh(addr string, script string) error {
 
421
        // This is taken from cmd/juju/ssh.go there is no other clear way to set user
 
422
        userAddr := "ubuntu@" + addr
 
423
        cmd := ssh.Command(userAddr, []string{"sudo", "-n", "bash", "-c " + utils.ShQuote(script)}, nil)
 
424
        var stderrBuf bytes.Buffer
 
425
        var stdoutBuf bytes.Buffer
 
426
        cmd.Stderr = &stderrBuf
 
427
        cmd.Stdout = &stdoutBuf
 
428
        err := cmd.Run()
 
429
        if err != nil {
 
430
                return fmt.Errorf("ssh command failed: %v (%q)", err, stderrBuf.String())
 
431
        }
 
432
        progress("ssh command succedded: %q", stdoutBuf.String())
 
433
        return nil
 
434
}
 
435
 
 
436
func sendViaScp(file, host, destFile string) error {
 
437
        err := ssh.Copy([]string{file, "ubuntu@" + host + ":" + destFile}, nil, nil)
 
438
        if err != nil {
 
439
                return fmt.Errorf("scp command failed: %v", err)
 
440
        }
 
441
        return nil
447
442
}
448
443
 
449
444
func mustParseTemplate(templ string) *template.Template {