forked from sanbornm/go-selfupdate
/
main.go
138 lines (123 loc) · 3.32 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"bytes"
"flag"
"fmt"
"github.com/bnulwh/go-selfupdate/selfupdate"
"io"
"io/ioutil"
"log"
"mime/multipart"
"net/http"
"os"
"path/filepath"
"runtime"
)
const (
DefaultToken = "ap_pJSFC5wQYkAyI0FIVwKYs9h1hW"
)
func uploadFile(url, filename, platform, version string) error {
fmt.Println("upload to", url)
var buf bytes.Buffer
signature := selfupdate.GenerateSha256(filename)
writer := multipart.NewWriter(&buf)
part, err := writer.CreateFormFile("file", filepath.Base(filename))
if err != nil {
log.Println("创建表单失败: ", err)
return err
}
reader, err := os.Open(filename)
if err != nil {
log.Println("打开文件失败: ", err)
return err
}
defer reader.Close()
_, err = io.Copy(part, reader)
if err != nil {
log.Println("复制文件内容失败:", err)
return err
}
writer.WriteField("folder", filepath.Dir(filename))
writer.WriteField("filename", filename)
writer.WriteField("platform", platform)
writer.WriteField("version", version)
writer.WriteField("signature", signature)
//writer.WriteField("genDir", genDir)
err = writer.Close()
if err != nil {
log.Println("关闭写入失败:", err)
return err
}
req, err := http.NewRequest("POST", url, &buf)
if err != nil {
log.Println("创建请求失败:", err)
return err
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", DefaultToken))
client := http.DefaultClient
resp, err := client.Do(req)
if err != nil {
log.Println("发送请求失败:", err)
return err
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("读取响应失败:", err)
return err
}
log.Println("Response:", string(respBody))
return nil
}
func printUsage() {
fmt.Println("")
fmt.Println("Positional arguments:")
fmt.Println("\tSingle platform: go-selfupdate myapp 1.2")
fmt.Println("\tCross platform: go-selfupdate /tmp/mybinares/ 1.2")
}
func main() {
//outputDirFlag := flag.String("o", "public", "Output directory for writing updates")
var defaultPlatform string
goos := os.Getenv("GOOS")
goarch := os.Getenv("GOARCH")
if goos != "" && goarch != "" {
defaultPlatform = goos + "-" + goarch
} else {
defaultPlatform = runtime.GOOS + "-" + runtime.GOARCH
}
platformFlag := flag.String("platform", defaultPlatform,
"Target platform in the form OS-ARCH. Defaults to running os/arch or the combination of the environment variables GOOS and GOARCH if both are set.")
uploadFlag := flag.String("dest", "http://updates.chinahuik.com/upload", "upload url")
flag.Parse()
if flag.NArg() < 2 {
flag.Usage()
printUsage()
os.Exit(0)
}
platform := *platformFlag
appPath := flag.Arg(0)
version := flag.Arg(1)
uploadUrl := *uploadFlag
//genDir = filepath.Join(*outputDirFlag, appPath)
log.Println("platform:", platform)
log.Println("app path:", appPath)
log.Println("version:", version)
//log.Println("gen dir:", genDir)
//createBuildDir()
// If dir is given create update for each file
fi, err := os.Stat(appPath)
if err != nil {
panic(err)
}
if fi.IsDir() {
files, err := ioutil.ReadDir(appPath)
if err == nil {
for _, file := range files {
uploadFile(uploadUrl, filepath.Join(appPath, file.Name()), platform, version)
}
os.Exit(0)
}
}
uploadFile(uploadUrl, appPath, platform, version)
}