feat: add redis support
This commit is contained in:
		
							
								
								
									
										18
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
module docker-image-sync
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/cweill/gotests v1.5.2 // indirect
 | 
			
		||||
	github.com/go-redis/redis v6.14.2+incompatible
 | 
			
		||||
	github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3 // indirect
 | 
			
		||||
	github.com/lukehoban/go-find-references v0.0.0-20150918174914-42505ef666d1 // indirect
 | 
			
		||||
	github.com/lukehoban/go-outline v0.0.0-20161011150102-e78556874252 // indirect
 | 
			
		||||
	github.com/lukehoban/ident v0.0.0-20161021214352-ec6acfba39eb // indirect
 | 
			
		||||
	github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23 // indirect
 | 
			
		||||
	github.com/nsf/gocode v0.0.0-20180902125341-7b1d4e18cdc5 // indirect
 | 
			
		||||
	github.com/onsi/gomega v1.4.2 // indirect
 | 
			
		||||
	github.com/rogpeppe/godef v1.0.0 // indirect
 | 
			
		||||
	github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518 // indirect
 | 
			
		||||
	github.com/tpng/gopkgs v0.0.0-20180428091733-81e90e22e204 // indirect
 | 
			
		||||
	sourcegraph.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518 // indirect
 | 
			
		||||
	yumc.pw/cloud/docker-image-sync v0.0.0-20181029103637-0be3e70228f3 // indirect
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										53
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
9fans.net/go v0.0.0-20150709035532-65b8cf069318/go.mod h1:diCsxrliIURU9xsYtjCp5AbpQKqdhKmf0ujWDUSkfoY=
 | 
			
		||||
github.com/cweill/gotests v1.5.2 h1:kKqmKmS2wCV3tuLnfpbiuN8OlkosQZTpCfiqmiuNAsA=
 | 
			
		||||
github.com/cweill/gotests v1.5.2/go.mod h1:XZYOJkGVkCRoymaIzmp9Wyi3rUgfA3oOnkuljYrjFV8=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0=
 | 
			
		||||
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 | 
			
		||||
github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3 h1:I4BOK3PBMjhWfQM2zPJKK7lOBGsrsvOB7kBELP33hiE=
 | 
			
		||||
github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
 | 
			
		||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
			
		||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
			
		||||
github.com/lukehoban/go-find-references v0.0.0-20150918174914-42505ef666d1 h1:F7r7JiLNObE2d4z82V3/cUfW5alV6YY89LQtK0qcUQc=
 | 
			
		||||
github.com/lukehoban/go-find-references v0.0.0-20150918174914-42505ef666d1/go.mod h1:T8xMbBjUvlaQRNZdgSoPLks3kZlAemyqb6HJPHyOUek=
 | 
			
		||||
github.com/lukehoban/go-outline v0.0.0-20161011150102-e78556874252 h1:D2VNityLQ1srKF+MSllSGQ4NwMci20llMkvVAmU2aCk=
 | 
			
		||||
github.com/lukehoban/go-outline v0.0.0-20161011150102-e78556874252/go.mod h1:O9bIJ6BRFBmP3AKTW8cqESVbauSmifSrRB/n9zq6x9Q=
 | 
			
		||||
github.com/lukehoban/ident v0.0.0-20161021214352-ec6acfba39eb h1:hLP73jhKhyayGVSX48TiA1qjMatiBpG7uc2zIsqy7yk=
 | 
			
		||||
github.com/lukehoban/ident v0.0.0-20161021214352-ec6acfba39eb/go.mod h1:Znk/A72lIyE/q043nd5s5tg63q2rCEohe6Gn8Yo4VdU=
 | 
			
		||||
github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23 h1:bXKgb2O/gIrZd/smUeP3OJcAt1ey3UV+cPYT+mRUNzs=
 | 
			
		||||
github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23/go.mod h1:9RIESfVnNNAkdTKNuEYS0rEkXXM2HYfchPD4xXNx1CU=
 | 
			
		||||
github.com/nsf/gocode v0.0.0-20180902125341-7b1d4e18cdc5 h1:V2BSh6DxcqZrEId1t9k3V7CXJQEpu50cVko4PyrwDb4=
 | 
			
		||||
github.com/nsf/gocode v0.0.0-20180902125341-7b1d4e18cdc5/go.mod h1:6Q8/OMaaKAgTX7/jt2bOXVDrm1eJhoNd+iwzghR7jvs=
 | 
			
		||||
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
 | 
			
		||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
			
		||||
github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
 | 
			
		||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
			
		||||
github.com/rogpeppe/godef v1.0.0 h1:+3JM5juQRFS/Vifg5lMHkAtRELpcGicuZXdBmf7NIhE=
 | 
			
		||||
github.com/rogpeppe/godef v1.0.0/go.mod h1:FWOCnfqToTbJkUGS32JdUoCuBBjtBQ3ZawrP7InscsM=
 | 
			
		||||
github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518 h1:iD+PFTQwKEmbwSdwfvP5ld2WEI/g7qbdhmHJ2ASfYGs=
 | 
			
		||||
github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A=
 | 
			
		||||
github.com/tpng/gopkgs v0.0.0-20180428091733-81e90e22e204 h1:nQYpoEpKTbArT17ogHCrMfsM4CCGiOdtQMuZJxeu8lQ=
 | 
			
		||||
github.com/tpng/gopkgs v0.0.0-20180428091733-81e90e22e204/go.mod h1:MwY6Iwya1EJi2InQFe7g/J3Qr7eik70yycN5+sw03hQ=
 | 
			
		||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
 | 
			
		||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 | 
			
		||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
			
		||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 | 
			
		||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
sourcegraph.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518 h1:hK6WwmQDFDRBBDeN/+3lcp1NoDn0ptGiJhxIpvzpqCw=
 | 
			
		||||
sourcegraph.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:Hm3i1Xmrc6guw1/fGxmO0PIGpbmXAQsJ8LhIQncGYwo=
 | 
			
		||||
yumc.pw/cloud/docker-image-sync v0.0.0-20181029103637-0be3e70228f3 h1:963GsCDM0C1wNTG/UBDQ4aYCPvkFRnj4YSce5pj5whw=
 | 
			
		||||
yumc.pw/cloud/docker-image-sync v0.0.0-20181029103637-0be3e70228f3/go.mod h1:ZY9otb70bNCEGplod222rkpZ6P5ilIDxOUs5BIPUAjg=
 | 
			
		||||
							
								
								
									
										26
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								main.go
									
									
									
									
									
								
							@@ -9,12 +9,16 @@ import (
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-redis/redis"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	cache  = map[string]string{}
 | 
			
		||||
	target string
 | 
			
		||||
	client = &http.Client{}
 | 
			
		||||
	rc     *redis.Client
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -26,6 +30,7 @@ func main() {
 | 
			
		||||
	t := flag.String("t", "registry.cn-hangzhou.aliyuncs.com/miaowoo", "Target Repo")
 | 
			
		||||
	u := flag.String("u", "", "Target Repo UserName")
 | 
			
		||||
	p := flag.String("p", "", "Target Repo Password")
 | 
			
		||||
	r := flag.String("r", "127.0.0.1:6379", "Redis Server Host")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	target = *t
 | 
			
		||||
@@ -36,14 +41,23 @@ func main() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	loginResult, err := exec.Command(docker, "login", *t, "-u", *u, "-p", *p).Output()
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("Error Can't Login To %s Username %s Password %s ...\nError: %s", *t, *u, *p, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Printf(string(loginResult))
 | 
			
		||||
 | 
			
		||||
	rc = redis.NewClient(&redis.Options{
 | 
			
		||||
		Addr: *r,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	_, err = rc.Ping().Result()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("Redis Connect Error: %s\n", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Printf("Redis Server %s Connect Success\n", *r)
 | 
			
		||||
 | 
			
		||||
	startServer(*b)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -115,7 +129,7 @@ func handleNormal(resp http.ResponseWriter, req *http.Request) {
 | 
			
		||||
	out := `<html><body>`
 | 
			
		||||
	out += `<h3>Image ` + origin + ` Is Tag to ` + image + ` And Push Success</h3>`
 | 
			
		||||
 | 
			
		||||
	if checkMirror(name) {
 | 
			
		||||
	if checkMirrorFromRedis(name) || checkMirror(name) {
 | 
			
		||||
		out += "Alread Transfer"
 | 
			
		||||
	} else {
 | 
			
		||||
		cache[origin] = "0"
 | 
			
		||||
@@ -125,6 +139,7 @@ func handleNormal(resp http.ResponseWriter, req *http.Request) {
 | 
			
		||||
</pre>`
 | 
			
		||||
		delete(cache, origin)
 | 
			
		||||
	}
 | 
			
		||||
	rc.Set(name, time.Now().Unix(), 0)
 | 
			
		||||
	out += `<h3>You Can Use below Command To Pull...</h3>
 | 
			
		||||
<pre>
 | 
			
		||||
docker pull ` + image + `
 | 
			
		||||
@@ -135,6 +150,11 @@ docker rmi ` + image + `
 | 
			
		||||
	resp.Write([]byte(out))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkMirrorFromRedis(image string) bool {
 | 
			
		||||
	_, err := rc.Get(image).Result()
 | 
			
		||||
	return err != redis.Nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func transferImage(origin string, image string) string {
 | 
			
		||||
	out := ""
 | 
			
		||||
	cache[origin] = "10"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user