internal/apiclient/clifile.go (237 lines of code) (raw):
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package apiclient
import (
"encoding/json"
"fmt"
"internal/clilog"
"os"
"os/user"
"path"
"strconv"
"time"
)
const (
integrationcliFile = "config.json"
integrationcliPath = ".integrationcli"
)
type integrationCLI struct {
Token string `json:"token,omitempty"`
LastCheck string `json:"lastCheck,omitempty"`
Project string `json:"defaultProject,omitempty"`
Region string `json:"region,omitempty"`
ProxyUrl string `json:"proxyUrl,omitempty"`
Nocheck bool `json:"nocheck,omitempty" default:"false"`
Api API `json:"api,omitempty" default:"prod"`
BasicInfo string `json:"basicInfo,omitempty" default:"false"`
}
func readPreferencesFile() (cliPref *integrationCLI, err error) {
cliPref = new(integrationCLI)
usr, err := user.Current()
if err != nil {
clilog.Debug.Println(err)
return cliPref, err
}
prefFile, err := os.ReadFile(path.Join(usr.HomeDir, integrationcliPath, integrationcliFile))
if err != nil {
clilog.Debug.Println("Cached preferences was not found")
return cliPref, err
}
err = json.Unmarshal(prefFile, &cliPref)
clilog.Debug.Printf("Token %s, lastCheck: %s", cliPref.Token, cliPref.LastCheck)
clilog.Debug.Printf("DefaultProject %s", cliPref.Project)
clilog.Debug.Printf("Region %s", cliPref.Region)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return cliPref, DeletePreferencesFile()
}
if cliPref.Api != "" {
if cliPref.Api != PROD && cliPref.Api != STAGING && cliPref.Api != AUTOPUSH {
return cliPref, fmt.Errorf("invalid api settings in configuration file")
}
}
return cliPref, nil
}
func DeletePreferencesFile() (err error) {
usr, err := user.Current()
if err != nil {
clilog.Debug.Println(err)
return err
}
if _, err := os.Stat(path.Join(usr.HomeDir, integrationcliPath, integrationcliFile)); os.IsNotExist(err) {
clilog.Debug.Println(err)
return err
}
return os.Remove(path.Join(usr.HomeDir, integrationcliPath, integrationcliFile))
}
func writeToken(token string) (err error) {
if IsSkipCache() {
return nil
}
cliPref, err := readPreferencesFile()
if err != nil {
return err
}
clilog.Debug.Println("Cache access token: ", token)
cliPref.Token = token
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func getToken() (token string) {
cliPref, err := readPreferencesFile()
if err != nil {
return ""
}
return cliPref.Token
}
func GetNoCheck() bool {
cliPref, err := readPreferencesFile()
if err != nil {
return false
}
return cliPref.Nocheck
}
func SetNoCheck(nocheck bool) (err error) {
clilog.Debug.Println("Nocheck set to: ", nocheck)
cliPref, err := readPreferencesFile()
cliPref.Nocheck = nocheck
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func GetBasicInfo() string {
cliPref, err := readPreferencesFile()
if err != nil {
return ""
}
return cliPref.BasicInfo
}
func SetBasicInfo(basicInfo string) (err error) {
clilog.Debug.Println("BasicInfo set to: ", basicInfo)
if _, err = strconv.ParseBool(basicInfo); err != nil {
return err
}
clilog.Debug.Println("BasicInfo set to: ", basicInfo)
cliPref, err := readPreferencesFile()
cliPref.BasicInfo = basicInfo
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func SetAPIPref(a API) (err error) {
clilog.Debug.Println("API is set to: ", a)
cliPref, err := readPreferencesFile()
cliPref.Api = a
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func TestAndUpdateLastCheck() (updated bool, err error) {
currentTime := time.Now()
currentDate := currentTime.Format("01-02-2006")
cliPref, err := readPreferencesFile()
clilog.Debug.Println(err)
if currentDate == cliPref.LastCheck {
return true, nil
}
cliPref.LastCheck = currentDate
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Warning.Printf("Error marshalling: %v\n", err)
return false, err
}
clilog.Debug.Println("Writing ", string(data))
if err = writePerferencesFile(data); err != nil {
return false, err
}
return false, nil
}
func GetDefaultProject() string {
cliPref, _ := readPreferencesFile()
return cliPref.Project
}
func WriteDefaultProject(project string) (err error) {
clilog.Debug.Println("Default project: ", project)
cliPref, err := readPreferencesFile()
cliPref.Project = project
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func SetProxy(url string) (err error) {
if url == "" {
return nil
}
cliPref, err := readPreferencesFile()
cliPref.ProxyUrl = url
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func SetDefaultRegion(region string) (err error) {
if region == "" {
return nil
}
cliPref, err := readPreferencesFile()
cliPref.Region = region
data, err := json.Marshal(&cliPref)
if err != nil {
clilog.Debug.Printf("Error marshalling: %v\n", err)
return err
}
clilog.Debug.Println("Writing ", string(data))
return writePerferencesFile(data)
}
func GetPreferences() (err error) {
cliPref, err := readPreferencesFile()
output, err := json.Marshal(&cliPref)
if err != nil {
clilog.Error.Println(err)
return err
}
PrettyPrint(output)
return nil
}
// WritePreferencesFile
func writePerferencesFile(payload []byte) (err error) {
usr, err := user.Current()
if err != nil {
clilog.Warning.Println(err)
return err
}
_, err = os.Stat(path.Join(usr.HomeDir, integrationcliPath, integrationcliFile))
if err == nil {
return WriteByteArrayToFile(path.Join(usr.HomeDir, integrationcliPath, integrationcliFile), false, payload)
} else if os.IsNotExist(err) {
if err = os.MkdirAll(path.Join(usr.HomeDir, integrationcliPath), 0o755); err != nil {
return err
}
return WriteByteArrayToFile(path.Join(usr.HomeDir, integrationcliPath, integrationcliFile), false, payload)
} else if err != nil {
clilog.Warning.Println(err)
return err
}
return nil
}