未验证 提交 914ebab2 编写于 作者: Z Zhao Xiaojie 提交者: GitHub

Merge pull request #54 from LinuxSuRen/fea/add-user

Add support to create and delete a user
package cmd
import (
"fmt"
"log"
"github.com/linuxsuren/jenkins-cli/client"
"github.com/spf13/cobra"
)
type UserCreateOption struct {
}
var userCreateOption UserCreateOption
func init() {
userCmd.AddCommand(userCreateCmd)
}
var userCreateCmd = &cobra.Command{
Use: "create",
Short: "Create a user for your Jenkins",
Long: `Create a user for your Jenkins`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
cmd.Help()
return
}
username := args[0]
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 user, err := jclient.Create(username); err == nil {
fmt.Printf("create user success. Password is: %s\n", user.Password1)
} else {
log.Fatal(err)
}
},
}
package cmd
import (
"fmt"
"log"
"github.com/linuxsuren/jenkins-cli/client"
"github.com/spf13/cobra"
)
type UserDeleteOption struct {
BatchOption
}
var userDeleteOption UserDeleteOption
func init() {
userCmd.AddCommand(userDeleteCmd)
userDeleteCmd.Flags().BoolVarP(&userDeleteOption.Batch, "batch", "b", false, "Batch mode, no need confirm")
}
var userDeleteCmd = &cobra.Command{
Use: "delete",
Short: "Delete a user for your Jenkins",
Long: `Delete a user for your Jenkins`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
cmd.Help()
return
}
username := args[0]
if !userDeleteOption.Confirm(fmt.Sprintf("Are you sure to delete user %s ?", username)) {
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
if err := jclient.Delete(username); err == nil {
fmt.Printf("delete user success.\n")
} else {
log.Fatal(err)
}
},
}
......@@ -40,7 +40,7 @@ var userTokenCmd = &cobra.Command{
jclient.ProxyAuth = jenkins.ProxyAuth
tokenName := userTokenOption.Name
if status, err := jclient.Create(tokenName); err == nil {
if status, err := jclient.CreateToken(tokenName); err == nil {
var data []byte
if data, err = userOption.Output(status); err == nil {
fmt.Printf("%s\n", string(data))
......
......@@ -10,6 +10,7 @@ import (
"strings"
"github.com/Pallinder/go-randomdata"
"github.com/linuxsuren/jenkins-cli/util"
)
type UserClient struct {
......@@ -98,7 +99,86 @@ func (q *UserClient) EditDesc(description string) (err error) {
return
}
func (q *UserClient) Create(newTokenName string) (status *Token, err error) {
func (q *UserClient) Delete(username string) (err error) {
api := fmt.Sprintf("%s/securityRealm/user/%s/doDelete", q.URL, username)
var (
req *http.Request
response *http.Response
)
req, err = http.NewRequest("POST", api, nil)
if err == nil {
q.AuthHandle(req)
} else {
return
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
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 && code != 302 {
log.Fatal(string(data))
}
} else {
log.Fatal(err)
}
return
}
func (q *UserClient) Create(username string) (user *UserForCreate, err error) {
api := fmt.Sprintf("%s/securityRealm/createAccountByAdmin", q.URL)
var (
req *http.Request
response *http.Response
)
passwd := util.GeneratePassword(8)
user = &UserForCreate{
User: User{FullName: username},
Username: username,
Password1: passwd,
Password2: passwd,
Email: fmt.Sprintf("%s@%s.com", username, username),
}
userData, _ := json.Marshal(user)
formData := url.Values{
"json": {string(userData)},
"username": {username},
"password1": {passwd},
"password2": {passwd},
"fullname": {username},
"email": {user.Email},
}
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")
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 && code != 302 {
log.Fatal(string(data))
}
} else {
log.Fatal(err)
}
return
}
func (q *UserClient) CreateToken(newTokenName string) (status *Token, err error) {
if newTokenName == "" {
newTokenName = fmt.Sprintf("jcli-%s", randomdata.SillyName())
}
......@@ -145,8 +225,16 @@ func (q *UserClient) Create(newTokenName string) (status *Token, err error) {
}
type User struct {
AbsoluteUrl string
AbsoluteURL string `json:"absoluteUrl"`
Description string
FullName string
FullName string `json:"fullname"`
ID string
}
type UserForCreate struct {
User `json:inline`
Username string `json:"username"`
Password1 string `json:"password1"`
Password2 string `json:"password2"`
Email string `json:"email"`
}
package util
import (
"math/rand"
"time"
)
func GeneratePassword(length int) string {
rand.Seed(time.Now().UnixNano())
digits := "0123456789"
specials := "~=+%^*/()[]{}/!@#$?|"
all := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
digits + specials
buf := make([]byte, length)
buf[0] = digits[rand.Intn(len(digits))]
buf[1] = specials[rand.Intn(len(specials))]
for i := 2; i < length; i++ {
buf[i] = all[rand.Intn(len(all))]
}
rand.Shuffle(len(buf), func(i, j int) {
buf[i], buf[j] = buf[j], buf[i]
})
return string(buf)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册