From 68803624825a1746bb89970868c5f0f75a70c980 Mon Sep 17 00:00:00 2001 From: Zhao Xiaojie Date: Wed, 26 Jun 2019 18:05:48 +0800 Subject: [PATCH] Add a sub-cmd to print status of Jenkins update center --- app/cmd/center.go | 37 +++++++++++++++++++++ client/updateCenter.go | 74 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 app/cmd/center.go create mode 100644 client/updateCenter.go diff --git a/app/cmd/center.go b/app/cmd/center.go new file mode 100644 index 0000000..8a92353 --- /dev/null +++ b/app/cmd/center.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "fmt" + "log" + + "github.com/linuxsuren/jenkins-cli/client" + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(centerCmd) +} + +var centerCmd = &cobra.Command{ + Use: "center", + Short: "Manage your update center", + Long: `Manage your update center`, + Run: func(cmd *cobra.Command, args []string) { + jenkins := getCurrentJenkins() + jclient := &client.UpdateCenterManager{} + jclient.URL = jenkins.URL + jclient.UserName = jenkins.UserName + jclient.Token = jenkins.Token + + if status, err := jclient.Status(); err == nil { + fmt.Println("RestartRequiredForCompletion:", status.RestartRequiredForCompletion) + if status.Jobs != nil { + for i, job := range status.Jobs { + fmt.Printf("%d, %s, %s\n", i, job.Type, job.ErrorMessage) + } + } + } else { + log.Fatal(err) + } + }, +} diff --git a/client/updateCenter.go b/client/updateCenter.go new file mode 100644 index 0000000..bc08d5e --- /dev/null +++ b/client/updateCenter.go @@ -0,0 +1,74 @@ +package client + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" +) + +// UpdateCenterManager manages the UpdateCenter +type UpdateCenterManager struct { + JenkinsCore +} + +// UpdateCenter represents the update center of Jenkins +type UpdateCenter struct { + Availables []Plugin + Jobs []UpdateCenterJob + RestartRequiredForCompletion bool + Sites []CenterSite +} + +// UpdateCenterJob represents the job for updateCenter which execute a task +type UpdateCenterJob struct { + ErrorMessage string + ID int `json:"id"` + Type string +} + +// CenterSite represents the site of update center +type CenterSite struct { + ConnectionCheckURL string `json:"connectionCheckUrl"` + HasUpdates bool + ID string `json:"id"` + URL string `json:"url"` +} + +func (u *UpdateCenterManager) Status() (status *UpdateCenter, err error) { + api := fmt.Sprintf("%s/updateCenter/api/json?pretty=false&depth=1", u.URL) + var ( + req *http.Request + response *http.Response + ) + + req, err = http.NewRequest("GET", api, nil) + if err == nil { + u.AuthHandle(req) + } else { + return + } + + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + client := &http.Client{Transport: tr} + if response, err = client.Do(req); err == nil { + code := response.StatusCode + var data []byte + data, err = ioutil.ReadAll(response.Body) + if code == 200 { + if err == nil { + status = &UpdateCenter{} + err = json.Unmarshal(data, status) + } + } else { + log.Fatal(string(data)) + } + } else { + log.Fatal(err) + } + return +} -- GitLab