Commit 57368483 authored by 黄大凯's avatar 黄大凯
Browse files

Supports minio & transfering a file to os

parent 3267a8c2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
module rsync2os

go 1.14

require (
	github.com/minio/minio-go/v6 v6.0.56
	golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
)
+5 −4
Original line number Diff line number Diff line
@@ -92,16 +92,17 @@ func Client() {
	ioerr := rsync.GetInteger(data)
	fmt.Println("IOERR", ioerr)

	// Sort it
	// Sort the filelist lexicographically
	sort.Sort(filelist)

	// Generate target file list
	rsync.Generate(conn, &filelist)

	fmt.Println(filelist)
	//fmt.Println(filelist)

	rsync.GetFiles(data, conn, &filelist)


	//fmt.Println(<-data)
	rsync.GetFiles(data, &filelist)

}

+55 −6
Original line number Diff line number Diff line
@@ -4,8 +4,11 @@ import (
	"bytes"
	"encoding/binary"
	"fmt"
	"golang.org/x/crypto/md4"
	"io"
	"io/ioutil"
	"github.com/minio/minio-go/v6"
	//"io/ioutil"
	"log"
	"net"
)

@@ -126,7 +129,7 @@ func DeMuxChan(conn net.Conn, data chan byte) {

		n, err := ReadExact(conn, header)
		if n != 4 || err != nil {

			//panic("Mulitplex: Check your wired protocol")
		}

		tag := header[3]	// Little Endian
@@ -196,14 +199,15 @@ func GetVarint(data chan byte) int64 {
	return GetLong(data)
}

func GetFiles(data chan byte, filelist *FileList) {
func GetFiles(data chan byte, conn net.Conn, filelist *FileList) {
	for {
		idx := GetInteger(data)
		if idx == -1 {
			return
		}
		fmt.Println(idx)
		// idx out of range?
		// TODO: idx out of range?

		GetFile(data, &((*filelist)[idx]), filelist)
	}
}
@@ -243,12 +247,57 @@ func GetFile(data chan byte, info *FileInfo, filelist *FileList) {
	}
	fmt.Println("Buff Total size:", buf.Len())
	lookup(int64(buf.Len()), filelist)
	ioutil.WriteFile("temp.txt", buf.Bytes(), 0644)

	//ioutil.WriteFile("temp.txt", buf.Bytes(), 0644)
	WriteOS(buf, path)

	lmd4 := md4.New()
	lmd4.Write(buf.Bytes())

	// Remote MD4
	md4 := make([]byte, 16)
	GetBytes(data, md4)
	fmt.Println("MD4", md4)
	fmt.Println("Compute MD4", lmd4.Sum(nil))
}

func WriteOS(buf *bytes.Buffer, fname string) {
	endpoint := "127.0.0.1:9000"
	accessKeyID := "minioadmin"
	secretAccessKey := "minioadmin"

	minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, false)
	if err != nil {
		log.Println("MINIO")
		return
	}

	// Make a new bucket called mymusic.
	bucketName := "test"
	//location := "cn"
	fmt.Println("MakeBucket")
	err = minioClient.MakeBucket(bucketName, "us-east-1")
	if err != nil {
		// Check to see if we already own this bucket (which happens if you run this twice)
		exists, errBucketExists := minioClient.BucketExists(bucketName)
		if errBucketExists == nil && exists {
			log.Printf("We already own %s\n", bucketName)
		} else {
			log.Fatalln(err)
		}
	} else {
		log.Printf("Successfully created %s\n", bucketName)
	}

	fmt.Println("Update")
	// Upload the zip file
	//objectName := "golden-oldies.zip"
	contentType := "application/x-rpm"

	// Upload the zip file with FPutObject
	n, err := minioClient.PutObject(bucketName, fname, buf, int64(buf.Len()), minio.PutObjectOptions{ContentType: contentType})
	if err != nil {
		log.Fatalln(err)
	}

	log.Printf("Successfully uploaded %s of size %d\n", fname, n)
}
 No newline at end of file
+10 −16
Original line number Diff line number Diff line
@@ -141,31 +141,25 @@ func Generate(conn net.Conn, filelist *FileList) {
	// Those files are `basis files`
	var idx int32
	for i:=0; i < len(*filelist); i++ {
		if strings.Index((*filelist)[i].Path, "SRPMS/Packages/0/0ad-0.0.22-1.el7.src.rpm") != -1 {	// 95533 SRPMS/Packages/z/zanata-python-client-1.5.1-1.el7.src.rpm
		if strings.Index((*filelist)[i].Path, "0ad-data-0.0.22-1.el7.src.rpm") != -1 {	// 95533 SRPMS/Packages/z/zanata-python-client-1.5.1-1.el7.src.rpmSRPMS/Packages/0/0ad-0.0.22-1.el7.src.rpm
			idx = int32(i)
			fmt.Println("Pick:", (*filelist)[i], idx)
			break
		}
	}
		//buf := new(bytes.Buffer)

	binary.Write(conn, binary.LittleEndian, idx)
		//fmt.Println(buf.Bytes())
		//conn.Write(buf.Bytes())
		//binary.Write(conn, binary.LittleEndian, uint16(0x8000))

	empty := []byte{0,0,0,0}

	// identifier, block count, block length, checksum length, block remainder, blocks(short+long)
	conn.Write(empty)
		binary.Write(conn, binary.LittleEndian, int32(32768))
		binary.Write(conn, binary.LittleEndian, int32(2))
	binary.Write(conn, binary.LittleEndian, int32(0))	// 32768
	binary.Write(conn, binary.LittleEndian, int32(0))	// 2
	conn.Write(empty)
	// Empty checksum


		//buf.Reset()
	binary.Write(conn, binary.LittleEndian, int32(-1))
		//conn.Write(buf.Bytes())


}