~rogpeppe/juju-core/azure

« back to all changes in this revision

Viewing changes to utils/trivial.go

  • Committer: Roger Peppe
  • Date: 2011-12-07 17:03:34 UTC
  • mto: (25.3.4 go-trunk)
  • mto: This revision was merged to the branch mainline in revision 27.
  • Revision ID: roger.peppe@canonical.com-20111207170334-soasb88g2x5mpkf5
add cloudinit package

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright 2012, 2013 Canonical Ltd.
2
 
// Licensed under the AGPLv3, see LICENCE file for details.
3
 
 
4
 
package utils
5
 
 
6
 
import (
7
 
        "bytes"
8
 
        "compress/gzip"
9
 
        "errors"
10
 
        "fmt"
11
 
        "io/ioutil"
12
 
        "os"
13
 
        "strings"
14
 
 
15
 
        "launchpad.net/goyaml"
16
 
)
17
 
 
18
 
// WriteYaml marshals obj as yaml and then writes it to a file, atomically,
19
 
// by first writing a sibling with the suffix ".preparing" and then moving
20
 
// the sibling to the real path.
21
 
func WriteYaml(path string, obj interface{}) error {
22
 
        data, err := goyaml.Marshal(obj)
23
 
        if err != nil {
24
 
                return err
25
 
        }
26
 
        prep := path + ".preparing"
27
 
        f, err := os.OpenFile(prep, os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0644)
28
 
        if err != nil {
29
 
                return err
30
 
        }
31
 
        defer f.Close()
32
 
        if _, err = f.Write(data); err != nil {
33
 
                return err
34
 
        }
35
 
        return os.Rename(prep, path)
36
 
}
37
 
 
38
 
// ReadYaml unmarshals the yaml contained in the file at path into obj. See
39
 
// goyaml.Unmarshal.
40
 
func ReadYaml(path string, obj interface{}) error {
41
 
        data, err := ioutil.ReadFile(path)
42
 
        if err != nil {
43
 
                return err
44
 
        }
45
 
        return goyaml.Unmarshal(data, obj)
46
 
}
47
 
 
48
 
// ErrorContextf prefixes any error stored in err with text formatted
49
 
// according to the format specifier. If err does not contain an error,
50
 
// ErrorContextf does nothing.
51
 
func ErrorContextf(err *error, format string, args ...interface{}) {
52
 
        if *err != nil {
53
 
                *err = errors.New(fmt.Sprintf(format, args...) + ": " + (*err).Error())
54
 
        }
55
 
}
56
 
 
57
 
// ShQuote quotes s so that when read by bash, no metacharacters
58
 
// within s will be interpreted as such.
59
 
func ShQuote(s string) string {
60
 
        // single-quote becomes single-quote, double-quote, single-quote, double-quote, single-quote
61
 
        return `'` + strings.Replace(s, `'`, `'"'"'`, -1) + `'`
62
 
}
63
 
 
64
 
// Gzip compresses the given data.
65
 
func Gzip(data []byte) []byte {
66
 
        var buf bytes.Buffer
67
 
        w := gzip.NewWriter(&buf)
68
 
        if _, err := w.Write(data); err != nil {
69
 
                // Compression should never fail unless it fails
70
 
                // to write to the underlying writer, which is a bytes.Buffer
71
 
                // that never fails.
72
 
                panic(err)
73
 
        }
74
 
        if err := w.Close(); err != nil {
75
 
                panic(err)
76
 
        }
77
 
        return buf.Bytes()
78
 
}
79
 
 
80
 
// Gunzip uncompresses the given data.
81
 
func Gunzip(data []byte) ([]byte, error) {
82
 
        r, err := gzip.NewReader(bytes.NewReader(data))
83
 
        if err != nil {
84
 
                return nil, err
85
 
        }
86
 
        return ioutil.ReadAll(r)
87
 
}