Skip to content

Commit 7b39eb0

Browse files
committed
use $HOME/.gmac as config directory
1 parent fd1cdf6 commit 7b39eb0

File tree

6 files changed

+141
-27
lines changed

6 files changed

+141
-27
lines changed

commands/apply.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import (
44
"context"
55
"errors"
66
"fmt"
7-
"log"
7+
"io"
8+
"os"
89

910
"github.com/goccy/go-yaml"
1011
"github.com/jessevdk/go-flags"
1112

1213
"github.com/nasa9084/gmac/gmail"
14+
"github.com/nasa9084/gmac/log"
1315
)
1416

1517
var applyCommand *flags.Command
@@ -19,22 +21,30 @@ func init() {
1921
}
2022

2123
type ApplyCommand struct {
22-
Target string `short:"f" long:"filename"`
24+
Target string `short:"f" long:"filename" required:"yes"`
2325
}
2426

2527
func (cmd *ApplyCommand) Execute([]string) error {
26-
rc, err := openOrStdin(cmd.Target)
27-
if err != nil {
28-
return err
28+
var r io.Reader
29+
switch cmd.Target {
30+
case "-":
31+
r = os.Stdin
32+
default:
33+
f, err := os.Open(cmd.Target)
34+
if err != nil {
35+
return err
36+
}
37+
defer f.Close()
38+
39+
r = f
2940
}
30-
defer rc.Close()
3141

3242
var proxy struct {
3343
Kind string `yaml:"kind"`
3444
Rest map[string]raw `yaml:",inline"`
3545
}
3646
log.Println("unmarshalYAML")
37-
if err := yaml.NewDecoder(rc).Decode(&proxy); err != nil {
47+
if err := yaml.NewDecoder(r).Decode(&proxy); err != nil {
3848
return err
3949
}
4050
if proxy.Kind == "" {

commands/auth.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import (
66
"encoding/json"
77
"fmt"
88
"io/ioutil"
9-
"log"
109
"net/http"
10+
"os"
11+
"path/filepath"
1112
"strconv"
1213

1314
"github.com/google/uuid"
1415
"github.com/jessevdk/go-flags"
16+
"github.com/nasa9084/gmac/log"
1517
"golang.org/x/oauth2"
1618
)
1719

@@ -46,12 +48,18 @@ func (cmd *AuthCommand) Execute(args []string) error {
4648
if err != nil {
4749
return err
4850
}
49-
fmt.Printf("Reflesh Token: %s\n", token.RefreshToken)
51+
log.Printf("Reflesh Token: %s\n", token.RefreshToken)
5052
var buf bytes.Buffer
5153
if err := json.NewEncoder(&buf).Encode(token); err != nil {
5254
return err
5355
}
54-
return ioutil.WriteFile("./token.json", buf.Bytes(), 0644)
56+
if err := os.MkdirAll(configDir, 0755); err != nil {
57+
return err
58+
}
59+
if err := ioutil.WriteFile(filepath.Join(configDir, "token.json"), buf.Bytes(), 0644); err != nil {
60+
return err
61+
}
62+
return nil
5563
}
5664

5765
func listenCallback(ctx context.Context, port int, csrfState string) <-chan string {
@@ -69,7 +77,7 @@ func oauthCallbackHandler(csrfState string) (<-chan string, http.HandlerFunc) {
6977
future := make(chan string, 1)
7078
return future, func(w http.ResponseWriter, r *http.Request) {
7179
if r.FormValue("state") != csrfState {
72-
log.Print("state mismatch")
80+
log.Print("CSRF state mismatch")
7381
w.WriteHeader(http.StatusForbidden)
7482
return
7583
}

commands/main.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,22 @@ package commands
33
import (
44
"fmt"
55
"os"
6+
"path/filepath"
67

78
"github.com/jessevdk/go-flags"
9+
"github.com/nasa9084/gmac/log"
810
)
911

1012
var (
1113
Version, Revision string
1214
)
1315

1416
var parser = flags.NewParser(&Command{
17+
Verbose: func() error {
18+
log.SetVerbose(true)
19+
return nil
20+
},
21+
1522
ShowVersion: func() error {
1623
fmt.Printf("Version: %s\nRevision: %s\n", Version, Revision)
1724
return &flags.Error{
@@ -20,12 +27,24 @@ var parser = flags.NewParser(&Command{
2027
},
2128
}, flags.HelpFlag)
2229

30+
var configDir string
31+
32+
func init() {
33+
home, err := os.UserHomeDir()
34+
if err != nil {
35+
log.Print("WARN: cannot detect user home directory")
36+
}
37+
configDir = filepath.Join(home, ".gmac")
38+
}
39+
2340
type Command struct {
2441
OutputFormat string `short:"o" long:"output" choice:"yaml" choice:"wide"`
2542

2643
CredentialsFilePath string `short:"c" long:"credentials-file" description:"path to OAuth credentials file"`
2744
RefreshToken string `short:"t" long:"refresh-token" description:"OAuth reflesh token"`
2845

46+
Verbose func() error `long:"verbose" description:"show verbose log"`
47+
2948
ShowVersion func() error `short:"v" long:"version"`
3049
}
3150

commands/util.go

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,21 @@ import (
77
"io/ioutil"
88
"os"
99
"os/exec"
10+
"path/filepath"
1011
"runtime"
1112

1213
"golang.org/x/oauth2"
1314
"golang.org/x/oauth2/google"
1415
"google.golang.org/api/gmail/v1"
16+
17+
"github.com/nasa9084/gmac/log"
1518
)
1619

20+
var oauthScope = []string{
21+
gmail.GmailLabelsScope,
22+
gmail.GmailSettingsBasicScope,
23+
}
24+
1725
type raw []byte
1826

1927
func (r *raw) UnmarshalYAML(data []byte) error {
@@ -24,37 +32,62 @@ func (r *raw) UnmarshalYAML(data []byte) error {
2432
return nil
2533
}
2634

27-
func openOrStdin(filename string) (io.ReadCloser, error) {
28-
if filename == "-" {
29-
return ioutil.NopCloser(os.Stdin), nil
30-
}
31-
return os.Open(filename)
32-
}
35+
func getOAuthConfig(credentialsFilepath string) (*oauth2.Config, error) {
36+
defaultCredentialsFilepath := filepath.Join(configDir, "credentials.json")
3337

34-
func getOAuthConfig(credentialsFilePath string) (*oauth2.Config, error) {
35-
rc, err := openOrStdin(credentialsFilePath)
36-
if err != nil {
37-
return nil, err
38+
var r io.Reader
39+
switch credentialsFilepath {
40+
case "-": // read from stdin
41+
log.Vprint("read OAuth config from stdin")
42+
r = os.Stdin
43+
case "": // read from default config path
44+
log.Vprintf("read OAuth config from %s", defaultCredentialsFilepath)
45+
f, err := os.Open(defaultCredentialsFilepath)
46+
if err != nil {
47+
return nil, err
48+
}
49+
defer f.Close()
50+
51+
r = f
52+
default: // read from specified filepath
53+
log.Vprintf("read OAuthconfig from %s", credentialsFilepath)
54+
f, err := os.Open(credentialsFilepath)
55+
if err != nil {
56+
return nil, err
57+
}
58+
defer f.Close()
59+
60+
r = f
3861
}
39-
defer rc.Close()
40-
b, err := ioutil.ReadAll(rc)
62+
b, err := ioutil.ReadAll(r)
4163
if err != nil {
4264
return nil, err
4365
}
44-
oauthConfig, err := google.ConfigFromJSON(b, gmail.GmailLabelsScope, gmail.GmailSettingsBasicScope)
66+
oauthConfig, err := google.ConfigFromJSON(b, oauthScope...)
4567
if err != nil {
4668
return nil, err
4769
}
70+
if credentialsFilepath != "" {
71+
log.Vprint("OAuth config is not read from config directory: save into config directory")
72+
if err := os.MkdirAll(configDir, 0755); err != nil {
73+
log.Printf("WARN: cannot create config directory: %s", configDir)
74+
} else if err := ioutil.WriteFile(defaultCredentialsFilepath, b, 0644); err != nil {
75+
log.Printf("WARN: %+v", err)
76+
}
77+
}
4878
return oauthConfig, nil
4979
}
5080

5181
func getToken(refreshToken string) (*oauth2.Token, error) {
5282
if refreshToken != "" {
83+
log.Vprint("refresh token is passed")
5384
return &oauth2.Token{
5485
RefreshToken: refreshToken,
5586
}, nil
5687
}
57-
b, err := ioutil.ReadFile("./token.json")
88+
tokenFilepath := filepath.Join(configDir, "token.json")
89+
log.Vprintf("refresh token is not passed, read OAuth token from %s", tokenFilepath)
90+
b, err := ioutil.ReadFile(tokenFilepath)
5891
if err != nil {
5992
return nil, err
6093
}
@@ -67,6 +100,7 @@ func getToken(refreshToken string) (*oauth2.Token, error) {
67100

68101
func open(url string) error {
69102
var cmd string
103+
log.Vprintf("detected OS: %s", runtime.GOOS)
70104
switch runtime.GOOS {
71105
case "darwin":
72106
cmd = "open"

log/log.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package log
2+
3+
import (
4+
"log"
5+
"os"
6+
"sync"
7+
)
8+
9+
var (
10+
mu sync.Mutex
11+
isVerbose bool
12+
verboseLogger *log.Logger
13+
)
14+
15+
func init() {
16+
verboseLogger = log.New(os.Stderr, "", log.LstdFlags)
17+
}
18+
19+
func SetVerbose(v bool) {
20+
mu.Lock()
21+
defer mu.Unlock()
22+
23+
isVerbose = v
24+
}
25+
26+
var (
27+
Fatal = log.Fatal
28+
29+
Print = log.Print
30+
Printf = log.Printf
31+
Println = log.Println
32+
)
33+
34+
func Vprint(v ...interface{}) {
35+
if isVerbose {
36+
verboseLogger.Print(v...)
37+
}
38+
}
39+
40+
func Vprintf(format string, v ...interface{}) {
41+
if isVerbose {
42+
verboseLogger.Printf(format, v...)
43+
}
44+
}

main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package main
22

33
import (
4-
"log"
5-
64
"github.com/nasa9084/gmac/commands"
5+
"github.com/nasa9084/gmac/log"
76
)
87

98
func main() {

0 commit comments

Comments
 (0)