Skip to content

Commit d5b0e15

Browse files
authored
Merge pull request #1 from bmaximilian/plg_jira_cli
Plg jira cli
2 parents e4eafa5 + 89d1bcd commit d5b0e15

36 files changed

+1032
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ build/
1919
*.out
2020

2121
*.log
22+
gutils.config.development.yaml
23+
gutils.config.local.yaml
24+
*.xslx

Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ build:
2222
rm -rf ${PROJECT_PATH}/${PROJECT_BUILD_FOLDER}
2323
cd ${PROJECT_PATH} && go mod tidy
2424
cd ${PROJECT_PATH} && go mod verify
25+
cd ${PROJECT_PATH} && go fmt
2526
cd ${PROJECT_PATH} && env go build ${LDFLAGS} -o ${BUILD_FULL_PATH}/${BINARY} ${ENTRY_FILE_PATH}
2627
cd ${PROJECT_PATH} && env GOOS=darwin go build ${LDFLAGS} -o ${BUILD_FULL_PATH}/darwin/${BINARY} ${ENTRY_FILE_PATH}
2728
cd ${PROJECT_PATH} && env GOOS=linux go build ${LDFLAGS} -o ${BUILD_FULL_PATH}/linux/${BINARY} ${ENTRY_FILE_PATH}
@@ -47,6 +48,11 @@ clean:
4748
test:
4849
cd ${PROJECT_PATH}/pkg/calculate/scale/length && go test
4950

51+
EXPORT_NAME=${BINARY}_${VERSION}_${BUILD}.zip
52+
export: test build
53+
cd ${PROJECT_PATH} && zip ${BUILD_FULL_PATH}/${EXPORT_NAME} gutils.config.yaml ${BUILD_FULL_PATH}/darwin/* ${BUILD_FULL_PATH}/linux/* ${BUILD_FULL_PATH}/windows/* README.md
54+
@echo "\n\nExport available at ${PROJECT_PATH}/${BUILD_FULL_PATH}/${EXPORT_NAME}"
55+
5056
%:
5157
@:
5258

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
11
# G-Utils
22
Some CLI Tools written in Go.
33
> Mainly for private purposes
4+
5+
## Jira CLI instructions
6+
```bash
7+
# Convert PKCS12 Cert to pem key and cert
8+
openssl pkcs12 -in <username>.p12 -nokeys -out <username>.cer.pem
9+
openssl pkcs12 -in <username>.p12 -nodes -nocerts -out <username>.key.pem
10+
11+
# Add path of <username>.cer.pem (as jira.cert) and <username>.key.pem (as jira.key) to config file
12+
13+
# Generate an auth token for jira
14+
gutils jira token get -u <jira_username>
15+
16+
# Add token as jira.token to config file
17+
18+
# run your "gutils jira ..." commands
19+
```

cmd/jira/JiraCommand.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package jira
2+
3+
import (
4+
"github.com/bmaximilian/gutils/cmd/jira/token"
5+
"github.com/bmaximilian/gutils/cmd/jira/worklogs"
6+
"github.com/spf13/cobra"
7+
"github.com/spf13/viper"
8+
)
9+
10+
var Command = &cobra.Command{
11+
Use: "jira",
12+
Short: "CLI Tools for Jira actions",
13+
}
14+
15+
// Set the default viper values
16+
func SetDefaults() {
17+
viper.SetDefault("jira.url", "https://jira.atlassian.com")
18+
viper.SetDefault("jira.apiPrefix", "/rest/api/2")
19+
viper.SetDefault("jira.cert", nil)
20+
viper.SetDefault("jira.key", nil)
21+
viper.SetDefault("jira.token", nil)
22+
worklogs.SetDefaults()
23+
token.SetDefaults()
24+
}
25+
26+
// Initializes the command line tool
27+
func InitCommand() {
28+
worklogs.InitCommand()
29+
Command.AddCommand(worklogs.Command)
30+
31+
token.InitCommand()
32+
Command.AddCommand(token.Command)
33+
}

cmd/jira/token/TokenCommand.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package token
2+
3+
import (
4+
"github.com/bmaximilian/gutils/cmd/jira/token/get"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
var Command = &cobra.Command{
9+
Use: "token",
10+
Short: "Do something to get a JIRA Authorization token",
11+
}
12+
13+
// Set the default viper values
14+
func SetDefaults() {
15+
get.SetDefaults()
16+
}
17+
18+
// Initializes the command line tool
19+
func InitCommand() {
20+
get.InitCommand()
21+
Command.AddCommand(get.Command)
22+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package get
2+
3+
import (
4+
"fmt"
5+
"github.com/bmaximilian/gutils/pkg/jira/connect"
6+
"github.com/bmaximilian/gutils/pkg/util/logger"
7+
"github.com/fatih/color"
8+
googleLogger "github.com/google/logger"
9+
"github.com/spf13/cobra"
10+
"golang.org/x/crypto/ssh/terminal"
11+
"log"
12+
"syscall"
13+
)
14+
15+
var username string
16+
var password string
17+
18+
var Command = &cobra.Command{
19+
Use: "get",
20+
Short: "Get a authorization token from username and password",
21+
Run: func(cmd *cobra.Command, args []string) {
22+
l := logger.GetLogger()
23+
googleLogger.SetFlags(log.LUTC)
24+
pwd := cmd.Flag("password").Value.String()
25+
usr := cmd.Flag("user").Value.String()
26+
if pwd == "" {
27+
l.Info("Please enter your JIRA Password: ")
28+
bytePwd, readErr := terminal.ReadPassword(int(syscall.Stdin))
29+
if readErr != nil {
30+
l.Fatalln(readErr)
31+
}
32+
33+
pwd = string(bytePwd)
34+
fmt.Println()
35+
}
36+
37+
token, err := connect.GetTokenFromUserNameAndPassword(
38+
usr,
39+
pwd,
40+
)
41+
42+
if err != nil {
43+
l.Fatalln(err)
44+
}
45+
46+
//jiraUserRequestService := user.NewJiraUserRequestService(util.GetJiraRequestService())
47+
//
48+
//res, getUserErr := jiraUserRequestService.GetUser(usr, token)
49+
//if getUserErr != nil {
50+
// l.Fatalln(getUserErr)
51+
//}
52+
//l.Infoln(res)
53+
54+
l.Infof(
55+
"Jira Token : %v\n",
56+
color.CyanString("%v", token),
57+
)
58+
},
59+
}
60+
61+
// Set the default viper values
62+
func SetDefaults() {}
63+
64+
// Initializes the command line tool
65+
func InitCommand() {
66+
Command.Flags().StringVarP(
67+
&username,
68+
"user",
69+
"u",
70+
"",
71+
"The username for the token",
72+
)
73+
74+
Command.Flags().StringVarP(
75+
&password,
76+
"password",
77+
"p",
78+
"",
79+
"The password for the token",
80+
)
81+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package worklogs
2+
3+
import (
4+
"github.com/bmaximilian/gutils/cmd/jira/worklogs/list"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
var Command = &cobra.Command{
9+
Use: "worklogs",
10+
Short: "CRUD Jira Worklogs",
11+
}
12+
13+
// Set the default viper values
14+
func SetDefaults() {
15+
list.SetDefaults()
16+
}
17+
18+
// Initializes the command line tool
19+
func InitCommand() {
20+
list.InitCommand()
21+
Command.AddCommand(list.Command)
22+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package list
2+
3+
import (
4+
"github.com/bmaximilian/gutils/internal/jira/util"
5+
jiraUtil "github.com/bmaximilian/gutils/pkg/jira/util"
6+
"github.com/bmaximilian/gutils/pkg/util/logger"
7+
googleLogger "github.com/google/logger"
8+
"github.com/olekukonko/tablewriter"
9+
"github.com/spf13/cobra"
10+
"github.com/tealeg/xlsx"
11+
"log"
12+
"os"
13+
"time"
14+
)
15+
16+
var projectsFilter string
17+
var user string
18+
var generateReportFlag bool
19+
var startDateFlag string
20+
var endDateFlag string
21+
22+
var Command = &cobra.Command{
23+
Use: "list",
24+
Short: "List all worklogs of a given user",
25+
Run: func(cmd *cobra.Command, _ []string) {
26+
l := logger.GetLogger()
27+
googleLogger.SetFlags(log.LUTC)
28+
29+
projectKeys := cmd.Flag("projects").Value.String()
30+
userNameFilter := cmd.Flag("user").Value.String()
31+
fromDateFilter := cmd.Flag("from").Value.String()
32+
toDateFilter := cmd.Flag("to").Value.String()
33+
34+
table := tablewriter.NewWriter(os.Stdout)
35+
36+
workLogReportItemsRaw, fetchWorkLogItemsErr := jiraUtil.GetWorkLogReportForProjectsAndUser(util.GetJiraRequestService(), projectKeys, userNameFilter)
37+
if fetchWorkLogItemsErr != nil {
38+
l.Fatalln(fetchWorkLogItemsErr)
39+
}
40+
41+
workLogReportItems := *workLogReportItemsRaw
42+
43+
jiraUtil.SortWorklogsByStartDate(workLogReportItems)
44+
45+
var filterErr error = nil
46+
if fromDateFilter != "" {
47+
workLogReportItems, filterErr = jiraUtil.OnlyWorkLogsStartDateAfterDate(workLogReportItems, fromDateFilter+" 00:00:01+0100")
48+
}
49+
50+
if toDateFilter != "" {
51+
workLogReportItems, filterErr = jiraUtil.OnlyWorkLogsStartDateBeforeDate(workLogReportItems, toDateFilter+" 23:59:59+0100")
52+
}
53+
54+
if filterErr != nil {
55+
l.Fatalln(filterErr)
56+
}
57+
58+
jiraUtil.GenerateWorklogTable(table, workLogReportItems, &jiraUtil.TableOptions{WithAuthor: userNameFilter == ""})
59+
60+
table.Render()
61+
62+
if cmd.Flag("report").Value.String() == "true" {
63+
file := xlsx.NewFile()
64+
xlsxCreateErr := jiraUtil.GenerateWorklogXLSXExportSheet(file, workLogReportItems, &jiraUtil.XLSXExportOptions{
65+
WithAuthor: userNameFilter == "",
66+
})
67+
if xlsxCreateErr != nil {
68+
l.Fatalln(xlsxCreateErr.Error())
69+
}
70+
71+
xlsxWriteErr := file.Save("report_" + userNameFilter + "_" + time.Now().Format(time.RFC3339) + ".xlsx")
72+
if xlsxWriteErr != nil {
73+
l.Fatalln(xlsxWriteErr.Error())
74+
}
75+
}
76+
},
77+
}
78+
79+
// Set the default viper values
80+
func SetDefaults() {}
81+
82+
// Initializes the command line tool
83+
func InitCommand() {
84+
Command.Flags().StringVarP(
85+
&user,
86+
"user",
87+
"u",
88+
"",
89+
"The username to get the worklog for",
90+
)
91+
92+
Command.Flags().StringVarP(
93+
&projectsFilter,
94+
"projects",
95+
"p",
96+
"all",
97+
"The projects that should be looked up",
98+
)
99+
100+
Command.Flags().StringVarP(
101+
&startDateFlag,
102+
"from",
103+
"s",
104+
"",
105+
"The start date",
106+
)
107+
108+
Command.Flags().StringVarP(
109+
&endDateFlag,
110+
"to",
111+
"t",
112+
"",
113+
"The end date",
114+
)
115+
Command.Flags().BoolVarP(
116+
&generateReportFlag,
117+
"report",
118+
"r",
119+
false,
120+
"Pass that flag to generate an xslx report",
121+
)
122+
}

cmd/root.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"fmt"
55
"github.com/bmaximilian/gutils/cmd/calculate"
6+
"github.com/bmaximilian/gutils/cmd/jira"
67
"github.com/bmaximilian/gutils/cmd/version"
78
"github.com/spf13/cobra"
89
"os"
@@ -13,6 +14,7 @@ var rootCmd = &cobra.Command{Use: "gutils"}
1314
// Set the default viper values
1415
func SetDefaults() {
1516
calculate.SetDefaults()
17+
jira.SetDefaults()
1618
}
1719

1820
// Initializes the command line tool
@@ -21,6 +23,9 @@ func init() {
2123

2224
calculate.InitCalculateCommand()
2325
rootCmd.AddCommand(calculate.CalculateCommand)
26+
27+
jira.InitCommand()
28+
rootCmd.AddCommand(jira.Command)
2429
}
2530

2631
// Executes the root command

go.mod

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,27 @@ module github.com/bmaximilian/gutils
22

33
require (
44
github.com/BurntSushi/toml v0.3.1 // indirect
5+
github.com/araddon/dateparse v0.0.0-20190329160016-74dc0e29b01f
56
github.com/fatih/color v1.7.0
7+
github.com/google/go-querystring v1.0.0 // indirect
68
github.com/google/logger v1.0.1
79
github.com/inconshreveable/mousetrap v1.0.0 // indirect
810
github.com/kr/pretty v0.1.0 // indirect
11+
github.com/levigross/grequests v0.0.0-20190130132859-37c80f76a0da
912
github.com/mattn/go-colorable v0.1.1 // indirect
1013
github.com/mattn/go-isatty v0.0.7 // indirect
14+
github.com/mattn/go-runewidth v0.0.4 // indirect
15+
github.com/olekukonko/tablewriter v0.0.1
1116
github.com/onsi/ginkgo v1.8.0
1217
github.com/onsi/gomega v1.5.0
18+
github.com/simplereach/timeutils v1.2.0 // indirect
1319
github.com/spf13/afero v1.2.1 // indirect
1420
github.com/spf13/cobra v0.0.3
1521
github.com/spf13/viper v1.3.1
1622
github.com/stretchr/testify v1.3.0 // indirect
23+
github.com/tealeg/xlsx v1.0.3
24+
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9
1725
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 // indirect
1826
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
27+
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce // indirect
1928
)

0 commit comments

Comments
 (0)