config.go 2.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
package cmd

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"runtime"

	"github.com/spf13/cobra"
	"gopkg.in/yaml.v2"
)

type ConfigOptions struct {
	ConfigFileLocation string
}

var configOptions ConfigOptions

func init() {
	rootCmd.AddCommand(configCmd)
}

var configCmd = &cobra.Command{
	Use:   "config",
	Short: "Manage the config of jcli",
	Long:  `Manage the config of jcli`,
	Run: func(cmd *cobra.Command, args []string) {
LinuxSuRen's avatar
LinuxSuRen 已提交
29
		current := getCurrentJenkins()
LinuxSuRen's avatar
LinuxSuRen 已提交
30
		fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
31
	},
32
	Example: "jcli config -l",
33 34 35 36
}

// JenkinsServer holds the configuration of your Jenkins
type JenkinsServer struct {
LinuxSuRen's avatar
LinuxSuRen 已提交
37 38 39 40 41 42
	Name      string `yaml:"name"`
	URL       string `yaml:"url"`
	UserName  string `yaml:"username"`
	Token     string `yaml:"token"`
	Proxy     string `yaml:"proxy"`
	ProxyAuth string `yaml:"proxyAuth"`
43 44 45 46 47 48 49
}

type Config struct {
	Current        string          `yaml:"current"`
	JenkinsServers []JenkinsServer `yaml:"jenkins_servers"`
}

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
func setCurrentJenkins(name string) {
	found := false
	for _, jenkins := range getConfig().JenkinsServers {
		if jenkins.Name == name {
			found = true
			break
		}
	}

	if found {
		config.Current = name
		if err := saveConfig(); err != nil {
			log.Fatal(err)
		}
	} else {
		log.Fatalf("Cannot found Jenkins by name %s", name)
	}
}

69 70 71 72 73 74
var config Config

func getConfig() Config {
	return config
}

75 76 77 78 79 80 81 82 83
func getJenkinsNames() []string {
	config := getConfig()
	names := make([]string, 0)
	for _, j := range config.JenkinsServers {
		names = append(names, j.Name)
	}
	return names
}

LinuxSuRen's avatar
LinuxSuRen 已提交
84
func getCurrentJenkins() (jenkinsServer *JenkinsServer) {
85 86
	config := getConfig()
	current := config.Current
LinuxSuRen's avatar
LinuxSuRen 已提交
87 88 89 90 91 92
	jenkinsServer = findJenkinsByName(current)

	return
}

func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) {
93
	for _, cfg := range config.JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
94 95
		if cfg.Name == name {
			jenkinsServer = &cfg
96 97 98 99 100 101
			break
		}
	}
	return
}

102
func loadDefaultConfig() (err error) {
103
	userHome := userHomeDir()
104 105 106
	configPath := fmt.Sprintf("%s/.jenkins-cli.yaml", userHome)
	if _, err = os.Stat(configPath); err == nil {
		err = loadConfig(configPath)
107
	}
108 109

	return
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
}

func loadConfig(path string) (err error) {
	configOptions.ConfigFileLocation = path

	var content []byte
	if content, err = ioutil.ReadFile(path); err == nil {
		err = yaml.Unmarshal([]byte(content), &config)
	}
	return
}

func saveConfig() (err error) {
	var data []byte
	config := getConfig()

	if data, err = yaml.Marshal(&config); err == nil {
		err = ioutil.WriteFile(configOptions.ConfigFileLocation, data, 0644)
	}
	return
}

func userHomeDir() string {
	if runtime.GOOS == "windows" {
		home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
		if home == "" {
			home = os.Getenv("USERPROFILE")
		}
		return home
	} else if runtime.GOOS == "linux" {
		home := os.Getenv("XDG_CONFIG_HOME")
		if home != "" {
			return home
		}
	}
	return os.Getenv("HOME")
}