Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 1 | package modules |
| 2 | |
| 3 | import ( |
Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 4 | "fmt" |
Bogdan Caprita | 490a451 | 2014-11-20 21:12:19 -0800 | [diff] [blame] | 5 | "hash/adler32" |
Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 6 | "io" |
| 7 | "io/ioutil" |
| 8 | "os" |
Cosmos Nicolaou | 2cb05fb | 2014-10-23 13:37:32 -0700 | [diff] [blame] | 9 | "strings" |
Bogdan Caprita | 490a451 | 2014-11-20 21:12:19 -0800 | [diff] [blame] | 10 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 11 | vsecurity "v.io/core/veyron/security" |
Ankur | 9f95794 | 2014-11-24 16:34:18 -0800 | [diff] [blame] | 12 | |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame^] | 13 | "v.io/v23/security" |
| 14 | "v.io/v23/vlog" |
Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 15 | ) |
| 16 | |
Bogdan Caprita | 490a451 | 2014-11-20 21:12:19 -0800 | [diff] [blame] | 17 | func newLogfile(prefix, name string) (*os.File, error) { |
| 18 | nameHash := adler32.Checksum([]byte(name)) |
Robin Thellend | 1c8a828 | 2014-12-09 10:38:36 -0800 | [diff] [blame] | 19 | f, err := ioutil.TempFile("", fmt.Sprintf("__modules__%s-%x-", prefix, nameHash)) |
Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 20 | if err != nil { |
| 21 | return nil, err |
| 22 | } |
| 23 | return f, nil |
| 24 | } |
| 25 | |
Bogdan Caprita | 490a451 | 2014-11-20 21:12:19 -0800 | [diff] [blame] | 26 | func outputFromFile(f *os.File, out io.Writer) { |
| 27 | f.Close() |
| 28 | fName := f.Name() |
| 29 | defer os.Remove(fName) |
| 30 | if out == nil { |
Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 31 | return |
| 32 | } |
Bogdan Caprita | 490a451 | 2014-11-20 21:12:19 -0800 | [diff] [blame] | 33 | 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 Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 37 | } |
Bogdan Caprita | 490a451 | 2014-11-20 21:12:19 -0800 | [diff] [blame] | 38 | io.Copy(out, f) |
| 39 | f.Close() |
Cosmos Nicolaou | bbae388 | 2014-10-02 22:58:19 -0700 | [diff] [blame] | 40 | } |
Cosmos Nicolaou | 2cb05fb | 2014-10-23 13:37:32 -0700 | [diff] [blame] | 41 | |
| 42 | // envSliceToMap returns a map representation of a string slive |
| 43 | // of environment variables. |
| 44 | func 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. |
| 65 | func 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 | } |
Ankur | 9f95794 | 2014-11-24 16:34:18 -0800 | [diff] [blame] | 78 | |
| 79 | func 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 | } |