package auth import ( "fmt" "io/ioutil" "log" "os" "strings" "sync" "github.com/mitchellh/go-homedir" ) // This is copied directly from Terraform in order to remove a single legacy // vendor dependency. func pathOrContents(poc string) (string, bool, error) { if len(poc) == 0 { return poc, false, nil } path := poc if path[0] == '~' { var err error path, err = homedir.Expand(path) if err != nil { return path, true, err } } if _, err := os.Stat(path); err == nil { contents, err := ioutil.ReadFile(path) if err != nil { return string(contents), true, err } return string(contents), true, nil } return poc, false, nil } // MutexKV is a simple key/value store for arbitrary mutexes. It can be used to // serialize changes across arbitrary collaborators that share knowledge of the // keys they must serialize on. // // The initial use case is to let aws_security_group_rule resources serialize // their access to individual security groups based on SG ID. type mutexKV struct { lock sync.Mutex store map[string]*sync.Mutex } // Locks the mutex for the given key. Caller is responsible for calling Unlock // for the same key func (m *mutexKV) Lock(key string) { log.Printf("[DEBUG] Locking %q", key) m.get(key).Lock() log.Printf("[DEBUG] Locked %q", key) } // Unlock the mutex for the given key. Caller must have called Lock for the same key first func (m *mutexKV) Unlock(key string) { log.Printf("[DEBUG] Unlocking %q", key) m.get(key).Unlock() log.Printf("[DEBUG] Unlocked %q", key) } // Returns a mutex for the given key, no guarantee of its lock status func (m *mutexKV) get(key string) *sync.Mutex { m.lock.Lock() defer m.lock.Unlock() mutex, ok := m.store[key] if !ok { mutex = &sync.Mutex{} m.store[key] = mutex } return mutex } // Returns a properly initalized MutexKV func newMutexKV() *mutexKV { return &mutexKV{ store: make(map[string]*sync.Mutex), } } const uaEnvVar = "TF_APPEND_USER_AGENT" func terraformUserAgent(version, sdkVersion string) string { ua := fmt.Sprintf("HashiCorp Terraform/%s (+https://www.terraform.io)", version) if sdkVersion != "" { ua += " " + fmt.Sprintf("Terraform Plugin SDK/%s", sdkVersion) } if add := os.Getenv(uaEnvVar); add != "" { add = strings.TrimSpace(add) if len(add) > 0 { ua += " " + add log.Printf("[DEBUG] Using modified User-Agent: %s", ua) } } return ua }