diff --git a/netbox.go b/netbox.go index 5ee3965..8f7d2e2 100644 --- a/netbox.go +++ b/netbox.go @@ -1,15 +1,82 @@ package netboxgo +import ( + "crypto/tls" + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" + + "github.com/pkg/errors" +) + // NetBox settings struct type NetBox struct { RootURL string Token string + SessionKey string InsecureSkipVerify bool } +type NetBoxSessionKey struct { + XSessionKey string `json:"session_key"` +} + // New populates the NetBox settings struct func (n *NetBox) New(root, token string, TLSSkipVerify bool) { n.RootURL = root n.Token = token n.InsecureSkipVerify = TLSSkipVerify } + +func (n *NetBox) FetchSessionKey(privatekey string) error { + + form := url.Values{} + form.Add("private_key", privatekey) + query := form.Encode() + + transport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: n.InsecureSkipVerify}, + } + timeout := time.Duration(60 * time.Second) + client := &http.Client{ + Timeout: timeout, + Transport: transport, + } + request, err := http.NewRequest("POST", n.RootURL+"/api/secrets/get-session-key/", strings.NewReader(query)) + if err != nil { + return err + } + request.Header.Add("Accept", "application/json") + request.Header.Add("Content-Type", "application/x-www-form-urlencoded") + request.Header.Add("Authorization", " Token "+n.Token) + response, err := client.Do(request) + if err != nil { + return err + } + + if response.StatusCode != http.StatusOK { + return errors.Errorf("Error: response was: %d should be %d\n%s\n", response.StatusCode, http.StatusOK, response.Header) + } + + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return err + } + + err = response.Body.Close() + if err != nil { + return err + } + + var sessionkey NetBoxSessionKey + err = json.Unmarshal(data, &sessionkey) + if err != nil { + return err + } + n.SessionKey = sessionkey.XSessionKey + + return nil +} diff --git a/netbox_secrets.go b/netbox_secrets.go index 6af7393..6816e90 100644 --- a/netbox_secrets.go +++ b/netbox_secrets.go @@ -85,6 +85,7 @@ func (n *NetBox) ListSecrets(i *SecretsList, f *SecretFilter) error { } request.Header.Add("Accept", "application/json") request.Header.Add("Authorization", " Token "+n.Token) + request.Header.Add("X-Session-Key", n.SessionKey) response, err := client.Do(request) if err != nil { return err