未验证 提交 34c4bd25 编写于 作者: Z Zhao Xiaojie 提交者: GitHub

Merge pull request #1 from LinuxSuRen/token-cmd

Add user cmd
......@@ -35,3 +35,4 @@ dep: ## Clean the generated artifacts
go get github.com/spf13/cobra
go get github.com/spf13/viper
go get gopkg.in/yaml.v2
go get github.com/Pallinder/go-randomdata
......@@ -13,6 +13,10 @@ type OutputOption struct {
Format string
}
type BatchOption struct {
Batch bool
}
type FormatOutput interface {
Output(obj interface{}, format string) (data []byte, err error)
}
......
package cmd
import (
"fmt"
"log"
"github.com/linuxsuren/jenkins-cli/client"
"github.com/spf13/cobra"
)
type UserOption struct {
OutputOption
}
var userOption UserOption
func init() {
rootCmd.AddCommand(userCmd)
userCmd.Flags().StringVarP(&userOption.Format, "output", "o", "json", "Format the output")
}
var userCmd = &cobra.Command{
Use: "user",
Short: "Print the user of your Jenkins",
Long: `Print 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 {
if data, err := userOption.Output(status); err == nil {
fmt.Println(string(data))
} else {
log.Fatal(err)
}
} else {
log.Fatal(err)
}
},
}
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)
}
},
}
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)
}
},
}
package client
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
"github.com/Pallinder/go-randomdata"
)
type UserClient struct {
JenkinsCore
}
type Token struct {
Status string
Data TokenData
}
type TokenData struct {
TokenName string
TokenUuid string
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())
}
api := fmt.Sprintf("%s/user/%s/descriptorByName/jenkins.security.ApiTokenProperty/generateNewToken", q.URL, q.UserName)
var (
req *http.Request
response *http.Response
)
formData := url.Values{}
formData.Add("newTokenName", newTokenName)
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 {
if err == nil {
status = &Token{}
err = json.Unmarshal(data, status)
}
} else {
log.Fatal(string(data))
}
} else {
log.Fatal(err)
}
return
}
type User struct {
AbsoluteUrl string
Description string
FullName string
ID string
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册