| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | // +build ignore
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"crypto/md5" | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | 	"crypto/sha256" | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	"flag" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 	"io/ioutil" | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/exec" | 
					
						
							| 
									
										
										
										
											2017-03-21 17:35:18 +08:00
										 |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	"path/filepath" | 
					
						
							|  |  |  | 	"regexp" | 
					
						
							|  |  |  | 	"runtime" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 	versionRe = regexp.MustCompile(`-[0-9]{1,3}-g[0-9a-f]{5,10}`) | 
					
						
							|  |  |  | 	goarch    string | 
					
						
							|  |  |  | 	goos      string | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 	gocc      string | 
					
						
							|  |  |  | 	gocxx     string | 
					
						
							|  |  |  | 	cgo       string | 
					
						
							|  |  |  | 	pkgArch   string | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 	version   string = "v1" | 
					
						
							|  |  |  | 	// deb & rpm does not support semver so have to handle their version a little differently
 | 
					
						
							|  |  |  | 	linuxPackageVersion   string = "v1" | 
					
						
							|  |  |  | 	linuxPackageIteration string = "" | 
					
						
							|  |  |  | 	race                  bool | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 	phjsToRelease         string | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 	workingDir            string | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	includeBuildNumber    bool     = true | 
					
						
							| 
									
										
										
										
											2017-02-02 22:55:37 +08:00
										 |  |  | 	buildNumber           int      = 0 | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:03 +08:00
										 |  |  | 	binaries              []string = []string{"grafana-server", "grafana-cli"} | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-17 17:37:59 +08:00
										 |  |  | const minGoVersion = 1.8 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	log.SetOutput(os.Stdout) | 
					
						
							|  |  |  | 	log.SetFlags(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 	ensureGoPath() | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	flag.StringVar(&goarch, "goarch", runtime.GOARCH, "GOARCH") | 
					
						
							|  |  |  | 	flag.StringVar(&goos, "goos", runtime.GOOS, "GOOS") | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 	flag.StringVar(&gocc, "cc", "", "CC") | 
					
						
							|  |  |  | 	flag.StringVar(&gocxx, "cxx", "", "CXX") | 
					
						
							|  |  |  | 	flag.StringVar(&cgo, "cgo-enabled", "", "CGO_ENABLED") | 
					
						
							|  |  |  | 	flag.StringVar(&pkgArch, "pkg-arch", "", "PKG ARCH") | 
					
						
							|  |  |  | 	flag.StringVar(&phjsToRelease, "phjs", "", "PhantomJS binary") | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	flag.BoolVar(&race, "race", race, "Use race detector") | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	flag.BoolVar(&includeBuildNumber, "includeBuildNumber", includeBuildNumber, "IncludeBuildNumber in package name") | 
					
						
							| 
									
										
										
										
											2017-02-02 22:55:37 +08:00
										 |  |  | 	flag.IntVar(&buildNumber, "buildNumber", 0, "Build number from CI system") | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	flag.Parse() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	readVersionFromPackageJson() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	log.Printf("Version: %s, Linux Version: %s, Package Iteration: %s\n", version, linuxPackageVersion, linuxPackageIteration) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	if flag.NArg() == 0 { | 
					
						
							|  |  |  | 		log.Println("Usage: go run build.go build") | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 20:10:09 +08:00
										 |  |  | 	workingDir, _ = os.Getwd() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	for _, cmd := range flag.Args() { | 
					
						
							|  |  |  | 		switch cmd { | 
					
						
							|  |  |  | 		case "setup": | 
					
						
							|  |  |  | 			setup() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 21:42:19 +08:00
										 |  |  | 		case "build-cli": | 
					
						
							|  |  |  | 			clean() | 
					
						
							|  |  |  | 			build("grafana-cli", "./pkg/cmd/grafana-cli", []string{}) | 
					
						
							| 
									
										
										
										
											2016-12-09 22:25:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 		case "build": | 
					
						
							| 
									
										
										
										
											2015-03-04 01:11:16 +08:00
										 |  |  | 			clean() | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:03 +08:00
										 |  |  | 			for _, binary := range binaries { | 
					
						
							|  |  |  | 				build(binary, "./pkg/cmd/"+binary, []string{}) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case "test": | 
					
						
							| 
									
										
										
										
											2015-01-28 20:10:09 +08:00
										 |  |  | 			test("./pkg/...") | 
					
						
							| 
									
										
										
										
											2015-03-04 21:48:21 +08:00
										 |  |  | 			grunt("test") | 
					
						
							| 
									
										
										
										
											2015-01-28 20:10:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case "package": | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 			grunt(gruntBuildArg("release")...) | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 			createLinuxPackages() | 
					
						
							| 
									
										
										
										
											2015-01-28 20:10:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | 		case "pkg-rpm": | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 			grunt(gruntBuildArg("release")...) | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | 			createRpmPackages() | 
					
						
							| 
									
										
										
										
											2015-12-05 05:55:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | 		case "pkg-deb": | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 			grunt(gruntBuildArg("release")...) | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | 			createDebPackages() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | 		case "sha-dist": | 
					
						
							|  |  |  | 			shaFilesInDist() | 
					
						
							| 
									
										
										
										
											2016-10-18 16:54:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | 		case "latest": | 
					
						
							|  |  |  | 			makeLatestDistCopies() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 		case "clean": | 
					
						
							| 
									
										
										
										
											2015-03-03 01:26:43 +08:00
										 |  |  | 			clean() | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			log.Fatalf("Unknown command %q", cmd) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | func makeLatestDistCopies() { | 
					
						
							| 
									
										
										
										
											2017-02-28 16:09:49 +08:00
										 |  |  | 	files, err := ioutil.ReadDir("dist") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatalf("failed to create latest copies. Cannot read from /dist") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-21 17:35:18 +08:00
										 |  |  | 	latestMapping := map[string]string{ | 
					
						
							|  |  |  | 		".deb":    "dist/grafana_latest_amd64.deb", | 
					
						
							|  |  |  | 		".rpm":    "dist/grafana-latest-1.x86_64.rpm", | 
					
						
							| 
									
										
										
										
											2017-02-28 16:09:49 +08:00
										 |  |  | 		".tar.gz": "dist/grafana-latest.linux-x64.tar.gz", | 
					
						
							| 
									
										
										
										
											2015-10-17 00:26:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 16:09:49 +08:00
										 |  |  | 	for _, file := range files { | 
					
						
							|  |  |  | 		for extension, fullName := range latestMapping { | 
					
						
							|  |  |  | 			if strings.HasSuffix(file.Name(), extension) { | 
					
						
							|  |  |  | 				runError("cp", path.Join("dist", file.Name()), fullName) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 00:21:52 +08:00
										 |  |  | func readVersionFromPackageJson() { | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | 	reader, err := os.Open("package.json") | 
					
						
							| 
									
										
										
										
											2015-03-03 00:21:52 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | 		log.Fatal("Failed to open package.json") | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer reader.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	jsonObj := map[string]interface{}{} | 
					
						
							|  |  |  | 	jsonParser := json.NewDecoder(reader) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := jsonParser.Decode(&jsonObj); err != nil { | 
					
						
							|  |  |  | 		log.Fatal("Failed to decode package.json") | 
					
						
							| 
									
										
										
										
											2015-03-03 00:21:52 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	version = jsonObj["version"].(string) | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 	linuxPackageVersion = version | 
					
						
							|  |  |  | 	linuxPackageIteration = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// handle pre version stuff (deb / rpm does not support semver)
 | 
					
						
							| 
									
										
										
										
											2015-04-22 14:56:14 +08:00
										 |  |  | 	parts := strings.Split(version, "-") | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 14:56:14 +08:00
										 |  |  | 	if len(parts) > 1 { | 
					
						
							|  |  |  | 		linuxPackageVersion = parts[0] | 
					
						
							|  |  |  | 		linuxPackageIteration = parts[1] | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-11 19:20:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// add timestamp to iteration
 | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	if includeBuildNumber { | 
					
						
							| 
									
										
										
										
											2017-02-02 22:55:37 +08:00
										 |  |  | 		if buildNumber != 0 { | 
					
						
							|  |  |  | 			linuxPackageIteration = fmt.Sprintf("%d%s", buildNumber, linuxPackageIteration) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			linuxPackageIteration = fmt.Sprintf("%d%s", time.Now().Unix(), linuxPackageIteration) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-03 00:21:52 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | type linuxPackageOptions struct { | 
					
						
							|  |  |  | 	packageType            string | 
					
						
							|  |  |  | 	homeDir                string | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:03 +08:00
										 |  |  | 	binPath                string | 
					
						
							| 
									
										
										
										
											2016-02-15 21:58:16 +08:00
										 |  |  | 	serverBinPath          string | 
					
						
							|  |  |  | 	cliBinPath             string | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	configDir              string | 
					
						
							| 
									
										
										
										
											2015-07-15 16:08:23 +08:00
										 |  |  | 	ldapFilePath           string | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	etcDefaultPath         string | 
					
						
							|  |  |  | 	etcDefaultFilePath     string | 
					
						
							|  |  |  | 	initdScriptFilePath    string | 
					
						
							|  |  |  | 	systemdServiceFilePath string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	postinstSrc    string | 
					
						
							|  |  |  | 	initdScriptSrc string | 
					
						
							|  |  |  | 	defaultFileSrc string | 
					
						
							|  |  |  | 	systemdFileSrc string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	depends []string | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-08 22:58:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | func createDebPackages() { | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	createPackage(linuxPackageOptions{ | 
					
						
							|  |  |  | 		packageType:            "deb", | 
					
						
							|  |  |  | 		homeDir:                "/usr/share/grafana", | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:03 +08:00
										 |  |  | 		binPath:                "/usr/sbin", | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 		configDir:              "/etc/grafana", | 
					
						
							|  |  |  | 		etcDefaultPath:         "/etc/default", | 
					
						
							|  |  |  | 		etcDefaultFilePath:     "/etc/default/grafana-server", | 
					
						
							|  |  |  | 		initdScriptFilePath:    "/etc/init.d/grafana-server", | 
					
						
							|  |  |  | 		systemdServiceFilePath: "/usr/lib/systemd/system/grafana-server.service", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		postinstSrc:    "packaging/deb/control/postinst", | 
					
						
							|  |  |  | 		initdScriptSrc: "packaging/deb/init.d/grafana-server", | 
					
						
							|  |  |  | 		defaultFileSrc: "packaging/deb/default/grafana-server", | 
					
						
							|  |  |  | 		systemdFileSrc: "packaging/deb/systemd/grafana-server.service", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		depends: []string{"adduser", "libfontconfig"}, | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | func createRpmPackages() { | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	createPackage(linuxPackageOptions{ | 
					
						
							|  |  |  | 		packageType:            "rpm", | 
					
						
							|  |  |  | 		homeDir:                "/usr/share/grafana", | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:03 +08:00
										 |  |  | 		binPath:                "/usr/sbin", | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 		configDir:              "/etc/grafana", | 
					
						
							|  |  |  | 		etcDefaultPath:         "/etc/sysconfig", | 
					
						
							|  |  |  | 		etcDefaultFilePath:     "/etc/sysconfig/grafana-server", | 
					
						
							|  |  |  | 		initdScriptFilePath:    "/etc/init.d/grafana-server", | 
					
						
							|  |  |  | 		systemdServiceFilePath: "/usr/lib/systemd/system/grafana-server.service", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		postinstSrc:    "packaging/rpm/control/postinst", | 
					
						
							|  |  |  | 		initdScriptSrc: "packaging/rpm/init.d/grafana-server", | 
					
						
							|  |  |  | 		defaultFileSrc: "packaging/rpm/sysconfig/grafana-server", | 
					
						
							|  |  |  | 		systemdFileSrc: "packaging/rpm/systemd/grafana-server.service", | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 19:53:03 +08:00
										 |  |  | 		depends: []string{"/sbin/service", "fontconfig", "freetype", "urw-fonts"}, | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-08 22:58:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 05:36:38 +08:00
										 |  |  | func createLinuxPackages() { | 
					
						
							|  |  |  | 	createDebPackages() | 
					
						
							|  |  |  | 	createRpmPackages() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | func createPackage(options linuxPackageOptions) { | 
					
						
							|  |  |  | 	packageRoot, _ := ioutil.TempDir("", "grafana-linux-pack") | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-09 23:18:04 +08:00
										 |  |  | 	// create directories
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	runPrint("mkdir", "-p", filepath.Join(packageRoot, options.homeDir)) | 
					
						
							|  |  |  | 	runPrint("mkdir", "-p", filepath.Join(packageRoot, options.configDir)) | 
					
						
							| 
									
										
										
										
											2015-04-10 16:58:32 +08:00
										 |  |  | 	runPrint("mkdir", "-p", filepath.Join(packageRoot, "/etc/init.d")) | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	runPrint("mkdir", "-p", filepath.Join(packageRoot, options.etcDefaultPath)) | 
					
						
							| 
									
										
										
										
											2015-04-10 16:58:32 +08:00
										 |  |  | 	runPrint("mkdir", "-p", filepath.Join(packageRoot, "/usr/lib/systemd/system")) | 
					
						
							|  |  |  | 	runPrint("mkdir", "-p", filepath.Join(packageRoot, "/usr/sbin")) | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-09 23:18:04 +08:00
										 |  |  | 	// copy binary
 | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:03 +08:00
										 |  |  | 	for _, binary := range binaries { | 
					
						
							|  |  |  | 		runPrint("cp", "-p", filepath.Join(workingDir, "tmp/bin/"+binary), filepath.Join(packageRoot, "/usr/sbin/"+binary)) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-08 20:10:04 +08:00
										 |  |  | 	// copy init.d script
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	runPrint("cp", "-p", options.initdScriptSrc, filepath.Join(packageRoot, options.initdScriptFilePath)) | 
					
						
							| 
									
										
										
										
											2015-04-09 23:18:04 +08:00
										 |  |  | 	// copy environment var file
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	runPrint("cp", "-p", options.defaultFileSrc, filepath.Join(packageRoot, options.etcDefaultFilePath)) | 
					
						
							| 
									
										
										
										
											2015-04-08 22:58:05 +08:00
										 |  |  | 	// copy systemd file
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	runPrint("cp", "-p", options.systemdFileSrc, filepath.Join(packageRoot, options.systemdServiceFilePath)) | 
					
						
							| 
									
										
										
										
											2015-04-08 20:10:04 +08:00
										 |  |  | 	// copy release files
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	runPrint("cp", "-a", filepath.Join(workingDir, "tmp")+"/.", filepath.Join(packageRoot, options.homeDir)) | 
					
						
							| 
									
										
										
										
											2015-04-15 21:41:56 +08:00
										 |  |  | 	// remove bin path
 | 
					
						
							|  |  |  | 	runPrint("rm", "-rf", filepath.Join(packageRoot, options.homeDir, "bin")) | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	args := []string{ | 
					
						
							|  |  |  | 		"-s", "dir", | 
					
						
							|  |  |  | 		"--description", "Grafana", | 
					
						
							|  |  |  | 		"-C", packageRoot, | 
					
						
							|  |  |  | 		"--vendor", "Grafana", | 
					
						
							| 
									
										
										
										
											2017-03-21 22:37:55 +08:00
										 |  |  | 		"--url", "https://grafana.com", | 
					
						
							| 
									
										
										
										
											2016-01-17 02:16:49 +08:00
										 |  |  | 		"--license", "\"Apache 2.0\"", | 
					
						
							| 
									
										
										
										
											2017-03-21 22:37:55 +08:00
										 |  |  | 		"--maintainer", "contact@grafana.com", | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 		"--config-files", options.initdScriptFilePath, | 
					
						
							|  |  |  | 		"--config-files", options.etcDefaultFilePath, | 
					
						
							|  |  |  | 		"--config-files", options.systemdServiceFilePath, | 
					
						
							|  |  |  | 		"--after-install", options.postinstSrc, | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 		"--name", "grafana", | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 		"--version", linuxPackageVersion, | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 		"-p", "./dist", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-21 17:35:18 +08:00
										 |  |  | 	if options.packageType == "rpm" { | 
					
						
							|  |  |  | 		args = append(args, "--rpm-posttrans", "packaging/rpm/control/posttrans") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if options.packageType == "deb" { | 
					
						
							|  |  |  | 		args = append(args, "--deb-no-default-config-files") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 	if pkgArch != "" { | 
					
						
							|  |  |  | 		args = append(args, "-a", pkgArch) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 00:46:44 +08:00
										 |  |  | 	if linuxPackageIteration != "" { | 
					
						
							|  |  |  | 		args = append(args, "--iteration", linuxPackageIteration) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:20:01 +08:00
										 |  |  | 	// add dependenciesj
 | 
					
						
							|  |  |  | 	for _, dep := range options.depends { | 
					
						
							|  |  |  | 		args = append(args, "--depends", dep) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	args = append(args, ".") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fmt.Println("Creating package: ", options.packageType) | 
					
						
							|  |  |  | 	runPrint("fpm", append([]string{"-t", options.packageType}, args...)...) | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 01:26:43 +08:00
										 |  |  | func verifyGitRepoIsClean() { | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | 	rs, err := runError("git", "ls-files", "--modified") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatalf("Failed to check if git tree was clean, %v, %v\n", string(rs), err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	count := len(string(rs)) | 
					
						
							|  |  |  | 	if count > 0 { | 
					
						
							|  |  |  | 		log.Fatalf("Git repository has modified files, aborting") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 01:26:43 +08:00
										 |  |  | 	log.Println("Git repository is clean") | 
					
						
							| 
									
										
										
										
											2015-03-02 19:56:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ensureGoPath() { | 
					
						
							|  |  |  | 	if os.Getenv("GOPATH") == "" { | 
					
						
							|  |  |  | 		cwd, err := os.Getwd() | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			log.Fatal(err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		gopath := filepath.Clean(filepath.Join(cwd, "../../../../")) | 
					
						
							|  |  |  | 		log.Println("GOPATH is", gopath) | 
					
						
							|  |  |  | 		os.Setenv("GOPATH", gopath) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 20:10:09 +08:00
										 |  |  | func ChangeWorkingDir(dir string) { | 
					
						
							|  |  |  | 	os.Chdir(dir) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-04 14:09:59 +08:00
										 |  |  | func grunt(params ...string) { | 
					
						
							| 
									
										
										
										
											2016-04-26 00:44:26 +08:00
										 |  |  | 	runPrint("./node_modules/.bin/grunt", params...) | 
					
						
							| 
									
										
										
										
											2015-01-28 20:10:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | func gruntBuildArg(task string) []string { | 
					
						
							| 
									
										
										
										
											2017-01-31 00:27:12 +08:00
										 |  |  | 	args := []string{task} | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	if includeBuildNumber { | 
					
						
							| 
									
										
										
										
											2017-03-23 18:09:35 +08:00
										 |  |  | 		args = append(args, fmt.Sprintf("--pkgVer=%v-%v", linuxPackageVersion, linuxPackageIteration)) | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-02-28 16:09:49 +08:00
										 |  |  | 		args = append(args, fmt.Sprintf("--pkgVer=%v", version)) | 
					
						
							| 
									
										
										
										
											2017-01-30 22:21:39 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 	if pkgArch != "" { | 
					
						
							|  |  |  | 		args = append(args, fmt.Sprintf("--arch=%v", pkgArch)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if phjsToRelease != "" { | 
					
						
							|  |  |  | 		args = append(args, fmt.Sprintf("--phjsToRelease=%v", phjsToRelease)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return args | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | func setup() { | 
					
						
							| 
									
										
										
										
											2016-09-14 22:14:27 +08:00
										 |  |  | 	runPrint("go", "get", "-v", "github.com/kardianos/govendor") | 
					
						
							| 
									
										
										
										
											2016-09-22 16:33:43 +08:00
										 |  |  | 	runPrint("go", "install", "-v", "./pkg/cmd/grafana-server") | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func test(pkg string) { | 
					
						
							|  |  |  | 	setBuildEnv() | 
					
						
							|  |  |  | 	runPrint("go", "test", "-short", "-timeout", "60s", pkg) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-15 21:09:34 +08:00
										 |  |  | func build(binaryName, pkg string, tags []string) { | 
					
						
							|  |  |  | 	binary := "./bin/" + binaryName | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	if goos == "windows" { | 
					
						
							|  |  |  | 		binary += ".exe" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rmr(binary, binary+".md5") | 
					
						
							|  |  |  | 	args := []string{"build", "-ldflags", ldflags()} | 
					
						
							|  |  |  | 	if len(tags) > 0 { | 
					
						
							|  |  |  | 		args = append(args, "-tags", strings.Join(tags, ",")) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if race { | 
					
						
							|  |  |  | 		args = append(args, "-race") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	args = append(args, "-o", binary) | 
					
						
							|  |  |  | 	args = append(args, pkg) | 
					
						
							|  |  |  | 	setBuildEnv() | 
					
						
							| 
									
										
										
										
											2015-12-04 18:21:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	runPrint("go", "version") | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	runPrint("go", args...) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Create an md5 checksum of the binary, to be included in the archive for
 | 
					
						
							|  |  |  | 	// automatic upgrades.
 | 
					
						
							|  |  |  | 	err := md5File(binary) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ldflags() string { | 
					
						
							|  |  |  | 	var b bytes.Buffer | 
					
						
							|  |  |  | 	b.WriteString("-w") | 
					
						
							| 
									
										
										
										
											2015-12-01 16:23:30 +08:00
										 |  |  | 	b.WriteString(fmt.Sprintf(" -X main.version=%s", version)) | 
					
						
							|  |  |  | 	b.WriteString(fmt.Sprintf(" -X main.commit=%s", getGitSha())) | 
					
						
							|  |  |  | 	b.WriteString(fmt.Sprintf(" -X main.buildstamp=%d", buildStamp())) | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	return b.String() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func rmr(paths ...string) { | 
					
						
							|  |  |  | 	for _, path := range paths { | 
					
						
							|  |  |  | 		log.Println("rm -r", path) | 
					
						
							|  |  |  | 		os.RemoveAll(path) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func clean() { | 
					
						
							| 
									
										
										
										
											2015-03-03 01:26:43 +08:00
										 |  |  | 	rmr("dist") | 
					
						
							|  |  |  | 	rmr("tmp") | 
					
						
							| 
									
										
										
										
											2015-03-03 17:18:24 +08:00
										 |  |  | 	rmr(filepath.Join(os.Getenv("GOPATH"), fmt.Sprintf("pkg/%s_%s/github.com/grafana", goos, goarch))) | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func setBuildEnv() { | 
					
						
							|  |  |  | 	os.Setenv("GOOS", goos) | 
					
						
							|  |  |  | 	if strings.HasPrefix(goarch, "armv") { | 
					
						
							|  |  |  | 		os.Setenv("GOARCH", "arm") | 
					
						
							|  |  |  | 		os.Setenv("GOARM", goarch[4:]) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		os.Setenv("GOARCH", goarch) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if goarch == "386" { | 
					
						
							|  |  |  | 		os.Setenv("GO386", "387") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-18 18:07:12 +08:00
										 |  |  | 	if cgo != "" { | 
					
						
							|  |  |  | 		os.Setenv("CGO_ENABLED", cgo) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if gocc != "" { | 
					
						
							|  |  |  | 		os.Setenv("CC", gocc) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if gocxx != "" { | 
					
						
							|  |  |  | 		os.Setenv("CXX", gocxx) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func getGitSha() string { | 
					
						
							| 
									
										
										
										
											2017-01-30 15:08:37 +08:00
										 |  |  | 	v, err := runError("git", "rev-parse", "--short", "HEAD") | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "unknown-dev" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return string(v) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func buildStamp() int64 { | 
					
						
							|  |  |  | 	bs, err := runError("git", "show", "-s", "--format=%ct") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return time.Now().Unix() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	s, _ := strconv.ParseInt(string(bs), 10, 64) | 
					
						
							|  |  |  | 	return s | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func buildArch() string { | 
					
						
							|  |  |  | 	os := goos | 
					
						
							|  |  |  | 	if os == "darwin" { | 
					
						
							|  |  |  | 		os = "macosx" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return fmt.Sprintf("%s-%s", os, goarch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func run(cmd string, args ...string) []byte { | 
					
						
							|  |  |  | 	bs, err := runError(cmd, args...) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Println(cmd, strings.Join(args, " ")) | 
					
						
							|  |  |  | 		log.Println(string(bs)) | 
					
						
							|  |  |  | 		log.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return bytes.TrimSpace(bs) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func runError(cmd string, args ...string) ([]byte, error) { | 
					
						
							|  |  |  | 	ecmd := exec.Command(cmd, args...) | 
					
						
							|  |  |  | 	bs, err := ecmd.CombinedOutput() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-04 23:23:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 17:46:58 +08:00
										 |  |  | 	return bytes.TrimSpace(bs), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func runPrint(cmd string, args ...string) { | 
					
						
							|  |  |  | 	log.Println(cmd, strings.Join(args, " ")) | 
					
						
							|  |  |  | 	ecmd := exec.Command(cmd, args...) | 
					
						
							|  |  |  | 	ecmd.Stdout = os.Stdout | 
					
						
							|  |  |  | 	ecmd.Stderr = os.Stderr | 
					
						
							|  |  |  | 	err := ecmd.Run() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func md5File(file string) error { | 
					
						
							|  |  |  | 	fd, err := os.Open(file) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer fd.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	h := md5.New() | 
					
						
							|  |  |  | 	_, err = io.Copy(h, fd) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	out, err := os.Create(file + ".md5") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, err = fmt.Fprintf(out, "%x\n", h.Sum(nil)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return out.Close() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-10-06 16:53:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | func shaFilesInDist() { | 
					
						
							| 
									
										
										
										
											2016-10-06 16:53:24 +08:00
										 |  |  | 	filepath.Walk("./dist", func(path string, f os.FileInfo, err error) error { | 
					
						
							| 
									
										
										
										
											2017-01-27 19:41:05 +08:00
										 |  |  | 		if path == "./dist" { | 
					
						
							| 
									
										
										
										
											2017-01-30 15:08:37 +08:00
										 |  |  | 			return nil | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-27 19:41:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | 		if strings.Contains(path, ".sha256") == false { | 
					
						
							|  |  |  | 			err := shaFile(path) | 
					
						
							| 
									
										
										
										
											2017-01-30 15:08:37 +08:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				log.Printf("Failed to create sha file. error: %v\n", err) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-10-06 16:53:24 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | func shaFile(file string) error { | 
					
						
							| 
									
										
										
										
											2016-10-06 16:53:24 +08:00
										 |  |  | 	fd, err := os.Open(file) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer fd.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | 	h := sha256.New() | 
					
						
							| 
									
										
										
										
											2016-10-06 16:53:24 +08:00
										 |  |  | 	_, err = io.Copy(h, fd) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 03:48:31 +08:00
										 |  |  | 	out, err := os.Create(file + ".sha256") | 
					
						
							| 
									
										
										
										
											2016-10-06 16:53:24 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, err = fmt.Fprintf(out, "%x\n", h.Sum(nil)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return out.Close() | 
					
						
							|  |  |  | } |