config.go 5.1 KB
Newer Older
1 2 3 4 5 6 7 8 9
package cmd

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

LinuxSuRen's avatar
LinuxSuRen 已提交
10
	"github.com/linuxsuren/jenkins-cli/util"
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
	"github.com/spf13/cobra"
	"gopkg.in/yaml.v2"
)

type ConfigOptions struct {
	Current  string
	Show     bool
	Generate bool
	List     bool

	ConfigFileLocation string
}

var configOptions ConfigOptions

func init() {
	rootCmd.AddCommand(configCmd)
	configCmd.PersistentFlags().StringVarP(&configOptions.Current, "current", "c", "", "Set the current Jenkins")
	configCmd.PersistentFlags().BoolVarP(&configOptions.Show, "show", "s", false, "Show the current Jenkins")
	configCmd.PersistentFlags().BoolVarP(&configOptions.Generate, "generate", "g", false, "Generate a sample config file for you")
	configCmd.PersistentFlags().BoolVarP(&configOptions.List, "list", "l", false, "Display all your Jenkins configs")
}

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 已提交
39
		current := getCurrentJenkins()
40 41 42 43 44
		if configOptions.Show {
			fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
		}

		if configOptions.List {
LinuxSuRen's avatar
LinuxSuRen 已提交
45 46
			table := util.CreateTable(os.Stdout)
			table.AddRow("number", "name", "url")
47
			for i, jenkins := range getConfig().JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
48 49 50 51
				name := jenkins.Name
				if name == current.Name {
					name = fmt.Sprintf("*%s", name)
				}
LinuxSuRen's avatar
LinuxSuRen 已提交
52
				table.AddRow(fmt.Sprintf("%d", i), name, jenkins.URL)
53
			}
LinuxSuRen's avatar
LinuxSuRen 已提交
54
			table.Render()
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
		}

		if configOptions.Generate {
			if data, err := generateSampleConfig(); err == nil {
				fmt.Print(string(data))
			} else {
				log.Fatal(err)
			}
		}

		if configOptions.Current != "" {
			found := false
			for _, jenkins := range getConfig().JenkinsServers {
				if jenkins.Name == configOptions.Current {
					found = true
					break
				}
			}

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

// JenkinsServer holds the configuration of your Jenkins
type JenkinsServer struct {
LinuxSuRen's avatar
LinuxSuRen 已提交
88 89 90 91 92 93
	Name      string `yaml:"name"`
	URL       string `yaml:"url"`
	UserName  string `yaml:"username"`
	Token     string `yaml:"token"`
	Proxy     string `yaml:"proxy"`
	ProxyAuth string `yaml:"proxyAuth"`
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
}

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

func generateSampleConfig() ([]byte, error) {
	sampleConfig := Config{
		Current: "yourServer",
		JenkinsServers: []JenkinsServer{
			{
				Name:     "yourServer",
				URL:      "http://localhost:8080/jenkins",
				UserName: "admin",
				Token:    "111e3a2f0231198855dceaff96f20540a9",
			},
		},
	}
	return yaml.Marshal(&sampleConfig)
}

var config Config

func getConfig() Config {
	return config
}

LinuxSuRen's avatar
LinuxSuRen 已提交
122
func getCurrentJenkins() (jenkinsServer *JenkinsServer) {
123 124
	config := getConfig()
	current := config.Current
LinuxSuRen's avatar
LinuxSuRen 已提交
125 126 127 128 129 130
	jenkinsServer = findJenkinsByName(current)

	return
}

func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) {
131
	for _, cfg := range config.JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
132 133
		if cfg.Name == name {
			jenkinsServer = &cfg
134 135 136 137 138 139
			break
		}
	}
	return
}

140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
func addJenkins(jenkinsServer JenkinsServer) (err error) {
	jenkinsName := jenkinsServer.Name
	if jenkinsName == "" {
		err = fmt.Errorf("Name cannot be empty")
		return
	}

	if findJenkinsByName(jenkinsName) != nil {
		err = fmt.Errorf("Jenkins %s is existed", jenkinsName)
		return
	}

	config.JenkinsServers = append(config.JenkinsServers, jenkinsServer)
	err = saveConfig()
	return
}

func removeJenkins(name string) (err error) {
	current := getCurrentJenkins()
	if name == current.Name {
		err = fmt.Errorf("You cannot remove current Jenkins")
	}

	index := -1
	config := getConfig()
	for i, jenkins := range config.JenkinsServers {
		if name == jenkins.Name {
			index = i
			break
		}
	}

	if index == -1 {
		err = fmt.Errorf("Cannot found by name %s", name)
	} else {
		config.JenkinsServers[index] = config.JenkinsServers[len(config.JenkinsServers)-1]
		config.JenkinsServers[len(config.JenkinsServers)-1] = JenkinsServer{}
		config.JenkinsServers = config.JenkinsServers[:len(config.JenkinsServers)-1]

		err = saveConfig()
	}
	return
}

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
func loadDefaultConfig() {
	userHome := userHomeDir()
	if err := loadConfig(fmt.Sprintf("%s/.jenkins-cli.yaml", userHome)); err != nil {
		log.Fatalf("error: %v", err)
	}
}

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")
}