blob: c14ccce37d57950cc4c300cee4514923846a76e6 [file] [log] [blame]
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -07001package modules
2
3import (
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -07004 "fmt"
Bogdan Caprita490a4512014-11-20 21:12:19 -08005 "hash/adler32"
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -07006 "io"
7 "io/ioutil"
8 "os"
Cosmos Nicolaou2cb05fb2014-10-23 13:37:32 -07009 "strings"
Bogdan Caprita490a4512014-11-20 21:12:19 -080010
Jiri Simsa764efb72014-12-25 20:57:03 -080011 vsecurity "v.io/core/veyron/security"
Ankur9f957942014-11-24 16:34:18 -080012
Jiri Simsa6ac95222015-02-23 16:11:49 -080013 "v.io/v23/security"
14 "v.io/v23/vlog"
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -070015)
16
Bogdan Caprita490a4512014-11-20 21:12:19 -080017func newLogfile(prefix, name string) (*os.File, error) {
18 nameHash := adler32.Checksum([]byte(name))
Robin Thellend1c8a8282014-12-09 10:38:36 -080019 f, err := ioutil.TempFile("", fmt.Sprintf("__modules__%s-%x-", prefix, nameHash))
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -070020 if err != nil {
21 return nil, err
22 }
23 return f, nil
24}
25
Bogdan Caprita490a4512014-11-20 21:12:19 -080026func outputFromFile(f *os.File, out io.Writer) {
27 f.Close()
28 fName := f.Name()
29 defer os.Remove(fName)
30 if out == nil {
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -070031 return
32 }
Bogdan Caprita490a4512014-11-20 21:12:19 -080033 var err error
34 if f, err = os.Open(fName); err != nil {
35 vlog.VI(1).Infof("failed to open %q: %s\n", fName, err)
36 return
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -070037 }
Bogdan Caprita490a4512014-11-20 21:12:19 -080038 io.Copy(out, f)
39 f.Close()
Cosmos Nicolaoubbae3882014-10-02 22:58:19 -070040}
Cosmos Nicolaou2cb05fb2014-10-23 13:37:32 -070041
42// envSliceToMap returns a map representation of a string slive
43// of environment variables.
44func envSliceToMap(env []string) map[string]string {
45 m := make(map[string]string)
46 if env == nil {
47 return m
48 }
49 for _, osv := range env {
50 if len(osv) == 0 {
51 continue
52 }
53 parts := strings.SplitN(osv, "=", 2)
54 key := parts[0]
55 if len(parts) == 2 {
56 m[key] = parts[1]
57 } else {
58 m[key] = ""
59 }
60 }
61 return m
62}
63
64// mergeMaps merges two maps, a & b, with b taking preference over a.
65func mergeMaps(a, b map[string]string) map[string]string {
66 if len(b) == 0 {
67 return a
68 }
69 merged := make(map[string]string)
70 for k, v := range a {
71 merged[k] = v
72 }
73 for k, v := range b {
74 merged[k] = v
75 }
76 return merged
77}
Ankur9f957942014-11-24 16:34:18 -080078
79func principalFromDir(dir string) (security.Principal, error) {
80 p, err := vsecurity.LoadPersistentPrincipal(dir, nil)
81 if err == nil {
82 return p, nil
83 }
84 if !os.IsNotExist(err) {
85 return nil, err
86 }
87 p, err = vsecurity.CreatePersistentPrincipal(dir, nil)
88 if err != nil {
89 return nil, err
90 }
91 if err := vsecurity.InitDefaultBlessings(p, shellBlessingExtension); err != nil {
92 return nil, err
93 }
94 return p, nil
95}