mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	
		
			
	
	
		
			80 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package installers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"crypto/md5"
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"io"
							 | 
						||
| 
								 | 
							
									"os"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// DeployFile 部署文件描述
							 | 
						||
| 
								 | 
							
								type DeployFile struct {
							 | 
						||
| 
								 | 
							
									OS      string
							 | 
						||
| 
								 | 
							
									Arch    string
							 | 
						||
| 
								 | 
							
									Version string
							 | 
						||
| 
								 | 
							
									Path    string
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Sum 计算概要
							 | 
						||
| 
								 | 
							
								func (this *DeployFile) Sum() (string, error) {
							 | 
						||
| 
								 | 
							
									fp, err := os.Open(this.Path)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return "", err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										_ = fp.Close()
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									m := md5.New()
							 | 
						||
| 
								 | 
							
									buffer := make([]byte, 128*1024)
							 | 
						||
| 
								 | 
							
									for {
							 | 
						||
| 
								 | 
							
										n, err := fp.Read(buffer)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											if err == io.EOF {
							 | 
						||
| 
								 | 
							
												break
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return "", err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										_, err = m.Write(buffer[:n])
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return "", err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									sum := m.Sum(nil)
							 | 
						||
| 
								 | 
							
									return fmt.Sprintf("%x", sum), nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Read 读取一个片段数据
							 | 
						||
| 
								 | 
							
								func (this *DeployFile) Read(offset int64) (data []byte, newOffset int64, err error) {
							 | 
						||
| 
								 | 
							
									fp, err := os.Open(this.Path)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, offset, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										_ = fp.Close()
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									stat, err := fp.Stat()
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, offset, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if offset >= stat.Size() {
							 | 
						||
| 
								 | 
							
										return nil, offset, io.EOF
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_, err = fp.Seek(offset, io.SeekStart)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, offset, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									buffer := make([]byte, 128*1024)
							 | 
						||
| 
								 | 
							
									n, err := fp.Read(buffer)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, offset, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return buffer[:n], offset + int64(n), nil
							 | 
						||
| 
								 | 
							
								}
							 |