dev privileges, db
[arvados.git] / services / boot / write_file.go
1 package main
2
3 import (
4         "encoding/json"
5         "io/ioutil"
6         "os"
7         "path"
8 )
9
10 func atomicWriteFile(name string, data []byte, mode os.FileMode) error {
11         if err := os.MkdirAll(path.Dir(name), 0755); err != nil {
12                 return err
13         }
14         tmp, err := ioutil.TempFile(path.Dir(name), path.Base(name)+"~")
15         if err != nil {
16                 return err
17         }
18         defer func() {
19                 if tmp != nil {
20                         os.Remove(tmp.Name())
21                 }
22         }()
23         _, err = tmp.Write(data)
24         if err != nil {
25                 return err
26         }
27         err = tmp.Close()
28         if err != nil {
29                 return err
30         }
31         err = os.Chmod(tmp.Name(), mode)
32         if err != nil {
33                 return err
34         }
35         err = os.Rename(tmp.Name(), name)
36         if err != nil {
37                 return err
38         }
39         tmp = nil
40         return nil
41 }
42
43 func atomicWriteJSON(name string, data interface{}, mode os.FileMode) error {
44         j, err := json.MarshalIndent(data, "", "  ")
45         if err != nil {
46                 return err
47         }
48         return atomicWriteFile(name, j, mode)
49 }