diff --git a/app/cmd/user.go b/app/cmd/user.go index b9a1c4b61b6634be595baa2a067bc18e4a1da82f..20476b87db73c89b27dd243135e07991b73f842e 100644 --- a/app/cmd/user.go +++ b/app/cmd/user.go @@ -32,15 +32,9 @@ var userCmd = &cobra.Command{ jclient.Proxy = jenkins.Proxy jclient.ProxyAuth = jenkins.ProxyAuth - var tokenName string - if len(args) > 0 { - tokenName = args[0] - } - - if status, err := jclient.Create(tokenName); err == nil { - var data []byte - if data, err = userOption.Output(status); err == nil { - fmt.Printf("%s\n", string(data)) + if status, err := jclient.Get(); err == nil { + if data, err := userOption.Output(status); err == nil { + fmt.Println(string(data)) } else { log.Fatal(err) } diff --git a/app/cmd/user_edit.go b/app/cmd/user_edit.go new file mode 100644 index 0000000000000000000000000000000000000000..c14f8f8f1515ea4f02caa12f7ea74895d07af4af --- /dev/null +++ b/app/cmd/user_edit.go @@ -0,0 +1,56 @@ +package cmd + +import ( + "log" + + "github.com/AlecAivazis/survey" + "github.com/linuxsuren/jenkins-cli/client" + "github.com/spf13/cobra" +) + +type UserEditOption struct { + Description bool +} + +var userEditOption UserEditOption + +func init() { + userCmd.AddCommand(userEditCmd) + userEditCmd.Flags().BoolVarP(&userEditOption.Description, "desc", "d", false, "Edit the description") +} + +var userEditCmd = &cobra.Command{ + Use: "edit", + Short: "Edit the user of your Jenkins", + Long: `Edit the user of your Jenkins`, + Run: func(cmd *cobra.Command, args []string) { + jenkins := getCurrentJenkins() + jclient := &client.UserClient{} + jclient.URL = jenkins.URL + jclient.UserName = jenkins.UserName + jclient.Token = jenkins.Token + jclient.Proxy = jenkins.Proxy + jclient.ProxyAuth = jenkins.ProxyAuth + + if status, err := jclient.Get(); err == nil { + description := status.Description + + prompt := &survey.Editor{ + Message: "Edit your pipeline script", + FileName: "*.sh", + Default: description, + AppendDefault: true, + } + + if err = survey.AskOne(prompt, &description); err != nil { + log.Fatal(err) + } else { + if err = jclient.EditDesc(description); err != nil { + log.Fatal(err) + } + } + } else { + log.Fatal(err) + } + }, +} diff --git a/app/cmd/user_token.go b/app/cmd/user_token.go new file mode 100644 index 0000000000000000000000000000000000000000..d849ce569dba7338c1a94d6758a684db05d6086d --- /dev/null +++ b/app/cmd/user_token.go @@ -0,0 +1,54 @@ +package cmd + +import ( + "fmt" + "log" + + "github.com/linuxsuren/jenkins-cli/client" + "github.com/spf13/cobra" +) + +type UserTokenOption struct { + Generate bool + Name string +} + +var userTokenOption UserTokenOption + +func init() { + userCmd.AddCommand(userTokenCmd) + userTokenCmd.Flags().BoolVarP(&userTokenOption.Generate, "generate", "g", false, "Generate the token") + userTokenCmd.Flags().StringVarP(&userTokenOption.Name, "name", "n", "", "Name of the token") +} + +var userTokenCmd = &cobra.Command{ + Use: "token", + Short: "Token the user of your Jenkins", + Long: `Token the user of your Jenkins`, + Run: func(cmd *cobra.Command, args []string) { + if !userTokenOption.Generate { + cmd.Help() + return + } + + jenkins := getCurrentJenkins() + jclient := &client.UserClient{} + jclient.URL = jenkins.URL + jclient.UserName = jenkins.UserName + jclient.Token = jenkins.Token + jclient.Proxy = jenkins.Proxy + jclient.ProxyAuth = jenkins.ProxyAuth + + tokenName := userTokenOption.Name + if status, err := jclient.Create(tokenName); err == nil { + var data []byte + if data, err = userOption.Output(status); err == nil { + fmt.Printf("%s\n", string(data)) + } else { + log.Fatal(err) + } + } else { + log.Fatal(err) + } + }, +} diff --git a/client/user.go b/client/user.go index 23c7fcdd46b3c425ca471523647619a100791ac6..3b2f3cae477b8ce2350e000039107bfcd6bf7211 100644 --- a/client/user.go +++ b/client/user.go @@ -27,6 +27,77 @@ type TokenData struct { TokenValue string } +func (q *UserClient) Get() (status *User, err error) { + api := fmt.Sprintf("%s/user/%s/api/json", q.URL, q.UserName) + var ( + req *http.Request + response *http.Response + ) + + req, err = http.NewRequest("GET", api, nil) + if err == nil { + q.AuthHandle(req) + } else { + return + } + + client := q.GetClient() + 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 = &User{} + err = json.Unmarshal(data, status) + } + } else { + log.Fatal(string(data)) + } + } else { + log.Fatal(err) + } + return +} + +func (q *UserClient) EditDesc(description string) (err error) { + api := fmt.Sprintf("%s/user/%s/submitDescription", q.URL, q.UserName) + var ( + req *http.Request + response *http.Response + ) + + formData := url.Values{} + formData.Add("description", description) + payload := strings.NewReader(formData.Encode()) + + req, err = http.NewRequest("POST", api, payload) + if err == nil { + q.AuthHandle(req) + } else { + return + } + + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + if err = q.CrumbHandle(req); err != nil { + log.Fatal(err) + } + + client := q.GetClient() + if response, err = client.Do(req); err == nil { + code := response.StatusCode + var data []byte + data, err = ioutil.ReadAll(response.Body) + if code == 200 { + } else { + log.Fatal(string(data)) + } + } else { + log.Fatal(err) + } + return +} + func (q *UserClient) Create(newTokenName string) (status *Token, err error) { if newTokenName == "" { newTokenName = fmt.Sprintf("jcli-%s", randomdata.SillyName()) @@ -72,3 +143,10 @@ func (q *UserClient) Create(newTokenName string) (status *Token, err error) { } return } + +type User struct { + AbsoluteUrl string + Description string + FullName string + ID string +}