import (
"io"
+ "log"
"os"
- "log"
- "sync"
+ "sync"
+
+ sys "github.com/qydysky/part/sys"
)
type logl struct {
- fileName string
- channelMax int
- level int
- levelName []string
- base []interface{}
- baset []int
-
- channelN chan int
- channel chan interface{}
- wantLog chan bool
- blog chan int
-
- sync.Mutex
-
- started bool
- logging bool
- pause bool
- fileonly bool
-
- sleep sync.Mutex
+ fileName string
+ channelMax int
+ level int
+ levelName []string
+ base []interface{}
+ baset []int
+
+ channelN chan int
+ channel chan interface{}
+ wantLog chan bool
+ blog chan int
+
+ sync.Mutex
+
+ started bool
+ logging bool
+ pause bool
+ fileonly bool
+
+ sleep sync.Mutex
}
const (
- defaultlevelName0 = "DEBUG"
- defaultlevelName1 = "INFO"
- defaultlevelName2 = "WARNING"
- defaultlevelName3 = "ERROR"
- defaultchannelMax = 1e4
+ defaultlevelName0 = "DEBUG"
+ defaultlevelName1 = "INFO"
+ defaultlevelName2 = "WARNING"
+ defaultlevelName3 = "ERROR"
+ defaultchannelMax = 1e4
)
const (
- blockErr = -3
- waitErr = -2
- nofileErr = -1
+ blockErr = -3
+ waitErr = -2
+ nofileErr = -1
)
-func Logf() (*logl) {
+func Logf() *logl {
return new(logl)
}
//New 初始化
func (I *logl) New() (O *logl) {
- O=I
- if O.channelMax == 0 {
- O.channelMax = defaultchannelMax
- }
- if len(O.levelName) == 0 {
- O.levelName = []string{defaultlevelName0,defaultlevelName1,defaultlevelName2,defaultlevelName3}
- }
-
- O.channelN = make(chan int,O.channelMax)
- O.channel = make(chan interface{},O.channelMax)
- O.wantLog = make(chan bool,10)
- O.blog = make(chan int,1)
- O.started = true
-
- go func(){
- for {
-
- O.logging = false
- for ;len(O.channelN) == 0;<- O.wantLog {}
- O.logging = true
-
- var (
- file *os.File
- err error
- )
-
- fileName := O.fileName
- if fileName != "" {
- O.Lock()
- File().NewPath(fileName)
- file, err = os.OpenFile(fileName,
- os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
- if err != nil {
- O.E("Failed to open log file:", err)
- }
- }
-
- tmpsign := O.logf(file)
-
- if fileName != "" {file.Close();O.Unlock()}
-
- switch tmpsign {
- case nofileErr:O.Close()
- case blockErr:O.CloseBlock()
- case waitErr:O.CloseWait()
- default:;
- }
-
- }
- }()
- return
+ O = I
+ if O.channelMax == 0 {
+ O.channelMax = defaultchannelMax
+ }
+ if len(O.levelName) == 0 {
+ O.levelName = []string{defaultlevelName0, defaultlevelName1, defaultlevelName2, defaultlevelName3}
+ }
+
+ O.channelN = make(chan int, O.channelMax)
+ O.channel = make(chan interface{}, O.channelMax)
+ O.wantLog = make(chan bool, 10)
+ O.blog = make(chan int, 1)
+ O.started = true
+
+ go func() {
+ for {
+
+ O.logging = false
+ for ; len(O.channelN) == 0; <-O.wantLog {
+ }
+ O.logging = true
+
+ var (
+ file *os.File
+ err error
+ )
+
+ fileName := O.fileName
+ if fileName != "" {
+ O.Lock()
+ File().NewPath(fileName)
+ file, err = os.OpenFile(fileName,
+ os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+ if err != nil {
+ O.E("Failed to open log file:", err)
+ }
+ }
+
+ tmpsign := O.logf(file)
+
+ if fileName != "" {
+ file.Close()
+ O.Unlock()
+ }
+
+ switch tmpsign {
+ case nofileErr:
+ O.Close()
+ case blockErr:
+ O.CloseBlock()
+ case waitErr:
+ O.CloseWait()
+ default:
+ }
+
+ }
+ }()
+ return
}
-func (O *logl) logf(file *os.File) (int) {
- var tmp int
- var showObj []io.Writer
-
- if file != nil {showObj = append(showObj, file)}
- if file == nil || !O.fileonly {showObj = append(showObj, os.Stdout)}
-
- for len(O.channelN) != 0 {
- channelN := <- O.channelN
-
- var msg []interface{}
- if l := len(O.baset);l != 0 {
- if t := O.baset[l - 1];t != 0 {
- if t > 0 {O.baset[l - 1] -= 1}
- } else {
- O.baset = O.baset[:l - 1]
- O.base = O.base[:l - 1]
- }
-
- if len(O.baset) != 0 {msg = append(msg, O.base)}
- }
- msg = append(msg, <- O.channel)
-
- if channelN >= 0 && channelN < O.level {continue}
-
- switch channelN {
- case blockErr:
- tmp = channelN
- case nofileErr, waitErr:
- return channelN
- case 0:
- log.New(io.MultiWriter(showObj...),
- O.levelName[0] + ": ",
- log.Ldate|log.Ltime).Println(msg...)
- case 1:
- log.New(io.MultiWriter(showObj...),
- O.levelName[1] + ": ",
- log.Ldate|log.Ltime).Println(msg...)
- case 2:
- log.New(io.MultiWriter(showObj...),
- O.levelName[2] + ": ",
- log.Ldate|log.Ltime).Println(msg...)
- case 3:
- log.New(io.MultiWriter(showObj...),
- O.levelName[3] + ": ",
- log.Ldate|log.Ltime).Println(msg...)
- default:;
- }
- }
- return tmp
+func (O *logl) logf(file *os.File) int {
+ var tmp int
+ var showObj []io.Writer
+
+ if file != nil {
+ showObj = append(showObj, file)
+ }
+ if file == nil || !O.fileonly {
+ showObj = append(showObj, os.Stdout)
+ }
+
+ for len(O.channelN) != 0 {
+ channelN := <-O.channelN
+
+ var msg []interface{}
+ if l := len(O.baset); l != 0 {
+ if t := O.baset[l-1]; t != 0 {
+ if t > 0 {
+ O.baset[l-1] -= 1
+ }
+ } else {
+ O.baset = O.baset[:l-1]
+ O.base = O.base[:l-1]
+ }
+
+ if len(O.baset) != 0 {
+ msg = append(msg, O.base)
+ }
+ }
+ msg = append(msg, <-O.channel)
+
+ if channelN >= 0 && channelN < O.level {
+ continue
+ }
+
+ switch channelN {
+ case blockErr:
+ tmp = channelN
+ case nofileErr, waitErr:
+ return channelN
+ case 0:
+ log.New(io.MultiWriter(showObj...),
+ O.levelName[0]+": ",
+ log.Ldate|log.Ltime).Println(msg...)
+ case 1:
+ log.New(io.MultiWriter(showObj...),
+ O.levelName[1]+": ",
+ log.Ldate|log.Ltime).Println(msg...)
+ case 2:
+ log.New(io.MultiWriter(showObj...),
+ O.levelName[2]+": ",
+ log.Ldate|log.Ltime).Println(msg...)
+ case 3:
+ log.New(io.MultiWriter(showObj...),
+ O.levelName[3]+": ",
+ log.Ldate|log.Ltime).Println(msg...)
+ default:
+ }
+ }
+ return tmp
}
//Level 设置之后日志等级
func (I *logl) Level(l int) (O *logl) {
- O=I
- if l < 0 {l = 0}
- if l > 3 {l = 4}
- O.Block().level = l
- return
+ O = I
+ if l < 0 {
+ l = 0
+ }
+ if l > 3 {
+ l = 4
+ }
+ O.Block().level = l
+ return
}
//BufSize 设置日志缓冲数量
func (I *logl) BufSize(s int) (O *logl) {
- O=I
- if O.started {O.E("BufSize() must be called before New()");return}
- if s < 1 {s = 1}
- O.channelMax = s
- return
+ O = I
+ if O.started {
+ O.E("BufSize() must be called before New()")
+ return
+ }
+ if s < 1 {
+ s = 1
+ }
+ O.channelMax = s
+ return
}
//LevelName 设置日志等级名
func (I *logl) LevelName(s []string) (O *logl) {
- O=I
- if O.started {O.E("LevelName() must be called before New()");return}
- if len(s) != 4 {O.E("len(LevelName) != 4");return}
- O.levelName = s
- return
+ O = I
+ if O.started {
+ O.E("LevelName() must be called before New()")
+ return
+ }
+ if len(s) != 4 {
+ O.E("len(LevelName) != 4")
+ return
+ }
+ O.levelName = s
+ return
}
//Len 获取日志缓冲数量
-func (O *logl) Len() (int) {
- return len(O.channelN)
+func (O *logl) Len() int {
+ return len(O.channelN)
}
//Open 立即将日志输出至文件
func (I *logl) Open(fileP string) (O *logl) {
- O=I
- O.fileName = fileP
- return
+ O = I
+ O.fileName = fileP
+ return
}
//Close 立即停止文件日志输出
func (I *logl) Close() (O *logl) {
- O=I
- O.Open("")
- return
+ O = I
+ O.Open("")
+ return
}
//NoFile 之后的日志不再输出至文件
func (I *logl) NoFile() (O *logl) {
- O=I
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- nofileErr
- O.channel <- []interface{}{}
- O.sleep.Unlock()
- if !O.logging {O.wantLog <- true}
- return
+ O = I
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- nofileErr
+ O.channel <- []interface{}{}
+ O.sleep.Unlock()
+ if !O.logging {
+ O.wantLog <- true
+ }
+ return
}
//Wait 阻塞直至(等待)日志到来
func (I *logl) Wait() (O *logl) {
- O=I
- for ;len(O.blog) != 0;<-O.blog {}
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- waitErr
- O.channel <- []interface{}{}
- O.sleep.Unlock()
- for <-O.blog != waitErr {}
- return
+ O = I
+ for ; len(O.blog) != 0; <-O.blog {
+ }
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- waitErr
+ O.channel <- []interface{}{}
+ O.sleep.Unlock()
+ for <-O.blog != waitErr {
+ }
+ return
}
//CloseWait 停止等待
func (I *logl) CloseWait() (O *logl) {
- O=I
- if len(O.blog) != 0 {O.E("Other Close-Function has been called! Cancel!");return}
- O.blog <- waitErr
- return
+ O = I
+ if len(O.blog) != 0 {
+ O.E("Other Close-Function has been called! Cancel!")
+ return
+ }
+ O.blog <- waitErr
+ return
}
//Block 阻塞直到本轮日志输出完毕
func (I *logl) Block() (O *logl) {
- O=I
- for ;len(O.blog) != 0;<-O.blog {}
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- blockErr
- O.channel <- []interface{}{}
- O.sleep.Unlock()
- if !O.logging {O.wantLog <- true}
- for <-O.blog != blockErr {}
- return
+ O = I
+ for ; len(O.blog) != 0; <-O.blog {
+ }
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- blockErr
+ O.channel <- []interface{}{}
+ O.sleep.Unlock()
+ if !O.logging {
+ O.wantLog <- true
+ }
+ for <-O.blog != blockErr {
+ }
+ return
}
//CloseBlock 停止阻塞
func (I *logl) CloseBlock() (O *logl) {
- O=I
- if len(O.blog) != 0 {O.E("Other Close-Function has been called! Cancel!");return}
- O.blog <- blockErr
- return
+ O = I
+ if len(O.blog) != 0 {
+ O.E("Other Close-Function has been called! Cancel!")
+ return
+ }
+ O.blog <- blockErr
+ return
}
//MTimeout 阻塞超时毫秒数
func (I *logl) MTimeout(t int) (O *logl) {
- O=I
- go func(O *logl){
- Sys().MTimeoutf(t);
- if len(O.blog) == 0 {
- O.blog <- blockErr
- O.blog <- waitErr
- }
- }(O)
- return
+ O = I
+ go func(O *logl) {
+ sys.Sys().MTimeoutf(t)
+ if len(O.blog) == 0 {
+ O.blog <- blockErr
+ O.blog <- waitErr
+ }
+ }(O)
+ return
}
//Pause 之后暂停输出,仅接受日志
func (I *logl) Pause(s bool) (O *logl) {
- O=I
- O.Block().pause = s
- if !O.logging && !O.pause {O.wantLog <- true}
- return
+ O = I
+ O.Block().pause = s
+ if !O.logging && !O.pause {
+ O.wantLog <- true
+ }
+ return
}
//Fileonly 不输出到屏幕
func (I *logl) Fileonly(s bool) (O *logl) {
- O=I
- if O.fileName == "" {O.E("No set filename yet! ignore!");return}
- O.Block().fileonly = s
- return
+ O = I
+ if O.fileName == "" {
+ O.E("No set filename yet! ignore!")
+ return
+ }
+ O.Block().fileonly = s
+ return
}
func (I *logl) checkDrop() (O *logl) {
- O=I
- if O.pause && len(O.channelN) == O.channelMax {<- O.channelN;<- O.channel}
- return
+ O = I
+ if O.pause && len(O.channelN) == O.channelMax {
+ <-O.channelN
+ <-O.channel
+ }
+ return
}
func (I *logl) clearup() (O *logl) {
- O=I
- for ;len(O.channelN) != 0;<-O.channelN {}
- for ;len(O.channel) != 0;<-O.channel {}
- return
+ O = I
+ for ; len(O.channelN) != 0; <-O.channelN {
+ }
+ for ; len(O.channel) != 0; <-O.channel {
+ }
+ return
}
//组合使用
func (I *logl) BC() (O *logl) {
- O=I
- O.Block().Close()
- return
+ O = I
+ O.Block().Close()
+ return
}
func (I *logl) NC() (O *logl) {
- O=I
- O.NoFile().Close()
- return
+ O = I
+ O.NoFile().Close()
+ return
}
-
//日志等级
//Base 追加到后续输出,t为操作数(正为可追加次数,负数为不计数追加,0为取消一层Base,每层独立)
func (I *logl) Base(t int, i ...interface{}) (O *logl) {
- O=I
- O.Block()
- if t == 0 && len(O.baset) != 0 {
- O.baset[len(O.baset) - 1] = 0
- }
- if len(i) == 0 {return}
-
- O.baset = append(O.baset, t)
- O.base = append(O.base, i...)
-
- return
+ O = I
+ O.Block()
+ if t == 0 && len(O.baset) != 0 {
+ O.baset[len(O.baset)-1] = 0
+ }
+ if len(i) == 0 {
+ return
+ }
+
+ O.baset = append(O.baset, t)
+ O.base = append(O.base, i...)
+
+ return
}
func (I *logl) T(i ...interface{}) (O *logl) {
- O=I
- if !O.started {log.New(io.MultiWriter(os.Stdout),defaultlevelName0 + ": ",log.Ldate|log.Ltime).Println(i...);return}
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- 0
- O.channel <- i
- O.sleep.Unlock()
- if !O.logging && !O.pause {O.wantLog <- true}
- return
+ O = I
+ if !O.started {
+ log.New(io.MultiWriter(os.Stdout), defaultlevelName0+": ", log.Ldate|log.Ltime).Println(i...)
+ return
+ }
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- 0
+ O.channel <- i
+ O.sleep.Unlock()
+ if !O.logging && !O.pause {
+ O.wantLog <- true
+ }
+ return
}
func (I *logl) I(i ...interface{}) (O *logl) {
- O=I
- if !O.started {log.New(io.MultiWriter(os.Stdout),defaultlevelName1 + ": ",log.Ldate|log.Ltime).Println(i...);return}
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- 1
- O.channel <- i
- O.sleep.Unlock()
- if !O.logging && !O.pause {O.wantLog <- true}
- return
+ O = I
+ if !O.started {
+ log.New(io.MultiWriter(os.Stdout), defaultlevelName1+": ", log.Ldate|log.Ltime).Println(i...)
+ return
+ }
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- 1
+ O.channel <- i
+ O.sleep.Unlock()
+ if !O.logging && !O.pause {
+ O.wantLog <- true
+ }
+ return
}
func (I *logl) W(i ...interface{}) (O *logl) {
- O=I
- if !O.started {log.New(io.MultiWriter(os.Stdout),defaultlevelName2 + ": ",log.Ldate|log.Ltime).Println(i...);return}
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- 2
- O.channel <- i
- O.sleep.Unlock()
- if !O.logging && !O.pause {O.wantLog <- true}
- return
+ O = I
+ if !O.started {
+ log.New(io.MultiWriter(os.Stdout), defaultlevelName2+": ", log.Ldate|log.Ltime).Println(i...)
+ return
+ }
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- 2
+ O.channel <- i
+ O.sleep.Unlock()
+ if !O.logging && !O.pause {
+ O.wantLog <- true
+ }
+ return
}
func (I *logl) E(i ...interface{}) (O *logl) {
- O=I
- if !O.started {log.New(io.MultiWriter(os.Stdout),defaultlevelName3 + ": ",log.Ldate|log.Ltime).Println(i...);return}
- O.sleep.Lock()
- O.checkDrop()
- O.channelN <- 3
- O.channel <- i
- O.sleep.Unlock()
- if !O.logging && !O.pause {O.wantLog <- true}
- return
-}
\ No newline at end of file
+ O = I
+ if !O.started {
+ log.New(io.MultiWriter(os.Stdout), defaultlevelName3+": ", log.Ldate|log.Ltime).Println(i...)
+ return
+ }
+ O.sleep.Lock()
+ O.checkDrop()
+ O.channelN <- 3
+ O.channel <- i
+ O.sleep.Unlock()
+ if !O.logging && !O.pause {
+ O.wantLog <- true
+ }
+ return
+}
package part
import (
- "sync"
- "os"
- "github.com/klauspost/compress/zip"
+ "bytes"
+ "errors"
"io"
- "path/filepath"
- "strings"
- "bytes"
- "time"
- "errors"
+ "os"
+ "path/filepath"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/klauspost/compress/zip"
+
+ sys "github.com/qydysky/part/sys"
)
-type lzip struct {sync.Mutex}
+type lzip struct{ sync.Mutex }
-func Zip() *lzip{
- return &lzip{}
+func Zip() *lzip {
+ return &lzip{}
}
func (this *lzip) InZip(srcFile string, destZip string) error {
- this.Lock()
+ this.Lock()
defer this.Unlock()
- zipfile, err := os.Create(destZip)
- if err != nil {
- return err
- }
- defer zipfile.Close()
+ zipfile, err := os.Create(destZip)
+ if err != nil {
+ return err
+ }
+ defer zipfile.Close()
- archive := zip.NewWriter(zipfile)
- defer archive.Close()
+ archive := zip.NewWriter(zipfile)
+ defer archive.Close()
- if Sys().GetSys("windows") {srcFile=strings.Replace(srcFile,"/","\\",-1)}
+ if sys.Sys().GetSys("windows") {
+ srcFile = strings.Replace(srcFile, "/", "\\", -1)
+ }
- filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
+ filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
}
-
+
var path_cut string = "/"
- if Sys().GetSys("windows") {path_cut="\\"}
-
- if path[len(path)-1:] == path_cut {return nil}
-
- header, err := zip.FileInfoHeader(info)
- if err != nil {
- return err
- }
-
- header.Name = strings.TrimPrefix(path, filepath.Dir(srcFile) + path_cut)
- // header.Name = path
- if info.IsDir() {
- header.Name += path_cut
- } else {
- header.Method = zip.Deflate
- }
-
- writer, err := archive.CreateHeader(header)
- if err != nil {
- return err
- }
-
- if ! info.IsDir() {
- file, err := os.Open(path)
- if err != nil {
- return err
- }
- defer file.Close()
- _, err = io.Copy(writer, file)
- }
- return err
- })
-
- return err
+ if sys.Sys().GetSys("windows") {
+ path_cut = "\\"
+ }
+
+ if path[len(path)-1:] == path_cut {
+ return nil
+ }
+
+ header, err := zip.FileInfoHeader(info)
+ if err != nil {
+ return err
+ }
+
+ header.Name = strings.TrimPrefix(path, filepath.Dir(srcFile)+path_cut)
+ // header.Name = path
+ if info.IsDir() {
+ header.Name += path_cut
+ } else {
+ header.Method = zip.Deflate
+ }
+
+ writer, err := archive.CreateHeader(header)
+ if err != nil {
+ return err
+ }
+
+ if !info.IsDir() {
+ file, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+ _, err = io.Copy(writer, file)
+ }
+ return err
+ })
+
+ return err
}
func (this *lzip) UnZip(zipFile string, destDir string) error {
- this.Lock()
+ this.Lock()
defer this.Unlock()
- r, err := zip.OpenReader(zipFile)
- if err != nil {
- return err
- }
- defer func() {
- if err := r.Close(); err != nil {
- panic(err)
- }
- }()
-
- os.MkdirAll(destDir, 0755)
-
- // Closure to address file descriptors issue with all the deferred .Close() methods
- extractAndWriteFile := func(f *zip.File) error {
- rc, err := f.Open()
- if err != nil {
- return err
- }
- defer func() {
- if err := rc.Close(); err != nil {
- panic(err)
- }
- }()
-
- path := filepath.Join(destDir, f.Name)
-
- if f.FileInfo().IsDir() {
- os.MkdirAll(path, f.Mode())
- } else {
- os.MkdirAll(filepath.Dir(path), f.Mode())
- f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
- if err != nil {
- return err
- }
- defer func() {
- if err := f.Close(); err != nil {
- panic(err)
- }
- }()
-
- _, err = io.Copy(f, rc)
- if err != nil {
- return err
- }
- }
- return nil
- }
-
- for _, f := range r.File {
- err := extractAndWriteFile(f)
- if err != nil {
- return err
- }
- }
-
- return nil
+ r, err := zip.OpenReader(zipFile)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := r.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ os.MkdirAll(destDir, 0755)
+
+ // Closure to address file descriptors issue with all the deferred .Close() methods
+ extractAndWriteFile := func(f *zip.File) error {
+ rc, err := f.Open()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := rc.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ path := filepath.Join(destDir, f.Name)
+
+ if f.FileInfo().IsDir() {
+ os.MkdirAll(path, f.Mode())
+ } else {
+ os.MkdirAll(filepath.Dir(path), f.Mode())
+ f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := f.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ _, err = io.Copy(f, rc)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ }
+
+ for _, f := range r.File {
+ err := extractAndWriteFile(f)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
}
type rZip struct {
- poit *zip.ReadCloser
- buf map[string]*zip.File
- sync.Mutex
+ poit *zip.ReadCloser
+ buf map[string]*zip.File
+ sync.Mutex
}
-func RZip() *rZip {return &rZip{}}
+func RZip() *rZip { return &rZip{} }
-func (t *rZip) New(zipFile string) (error) {
- t.Lock()
+func (t *rZip) New(zipFile string) error {
+ t.Lock()
defer t.Unlock()
- t.buf = make(map[string]*zip.File)
+ t.buf = make(map[string]*zip.File)
- var err error
- t.poit, err = zip.OpenReader(zipFile)
- if err != nil {return err}
+ var err error
+ t.poit, err = zip.OpenReader(zipFile)
+ if err != nil {
+ return err
+ }
- for _, _f := range t.poit.File {
- if _f.FileInfo().IsDir() {continue}
- t.buf[_f.Name] = _f
- }
-
- return nil
+ for _, _f := range t.poit.File {
+ if _f.FileInfo().IsDir() {
+ continue
+ }
+ t.buf[_f.Name] = _f
+ }
+
+ return nil
}
-func (t *rZip) Read(path string) (*bytes.Buffer,time.Time,error) {
- t.Lock()
- defer t.Unlock()
-
- var err error
-
- if f,ok := t.buf[path];ok {
- if rc, err := f.Open();err == nil {
- defer rc.Close();
-
- buf := new(bytes.Buffer)
- buf.ReadFrom(rc)
- return buf,f.FileHeader.Modified,nil
- }
- return &bytes.Buffer{},time.Now().UTC(),err
- }
- return &bytes.Buffer{},time.Now().UTC(),errors.New("not found")
+func (t *rZip) Read(path string) (*bytes.Buffer, time.Time, error) {
+ t.Lock()
+ defer t.Unlock()
+
+ var err error
+
+ if f, ok := t.buf[path]; ok {
+ if rc, err := f.Open(); err == nil {
+ defer rc.Close()
+
+ buf := new(bytes.Buffer)
+ buf.ReadFrom(rc)
+ return buf, f.FileHeader.Modified, nil
+ }
+ return &bytes.Buffer{}, time.Now().UTC(), err
+ }
+ return &bytes.Buffer{}, time.Now().UTC(), errors.New("not found")
}
func (t *rZip) List() []string {
- var list []string
- for k := range t.buf {
- list=append(list,k)
- }
- return list
+ var list []string
+ for k := range t.buf {
+ list = append(list, k)
+ }
+ return list
}
func (t *rZip) Close() {
- t.poit.Close()
- for k := range t.buf {
- delete(t.buf, k)
- }
-}
\ No newline at end of file
+ t.poit.Close()
+ for k := range t.buf {
+ delete(t.buf, k)
+ }
+}
default:
return fmt.Sprintf("%T", t)
}
- return ""
}
-func (this *sys) Cdir() string {
- this.Lock()
- defer this.Unlock()
+func (t *sys) Cdir() string {
+ t.Lock()
+ defer t.Unlock()
dir, _ := os.Executable()
exPath := filepath.Dir(dir)
s = "\\"
}
if p := strings.LastIndex(cdir, s); p == -1 {
- Logf().E(cdir, "LastIndex", s, "-1")
+ fmt.Println(cdir, "LastIndex", s, "-1")
} else {
return cdir[:p]
}
return p
}
-func (this *sys) Timeoutf(Timeout int) {
- this.Lock()
- defer this.Unlock()
+func (t *sys) Timeoutf(Timeout int) {
+ t.Lock()
+ defer t.Unlock()
time.Sleep(time.Duration(Timeout) * time.Second)
}
-func (this *sys) MTimeoutf(Millisecond int) {
- this.Lock()
- defer this.Unlock()
+func (t *sys) MTimeoutf(Millisecond int) {
+ t.Lock()
+ defer t.Unlock()
time.Sleep(time.Duration(Millisecond) * time.Millisecond)
}
-func (this *sys) GetSys(sys string) bool {
- this.RV = append(this.RV, runtime.GOOS)
+func (t *sys) GetSys(sys string) bool {
+ t.RV = append(t.RV, runtime.GOOS)
return runtime.GOOS == sys
}
-func (this *sys) GetTime() string {
+func (t *sys) GetTime() string {
now := strconv.FormatInt(time.Now().Unix(), 10)
return now[len(now)-4:]
}
-func (this *sys) GetMTime() int64 {
+func (t *sys) GetMTime() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
-func (this *sys) GetSTime() int64 {
+func (t *sys) GetSTime() int64 {
return time.Now().Unix()
}
-func (this *sys) GetFreePort() int {
+func (t *sys) GetFreePort() int {
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0")
if err != nil {
return 0
dir, err := ioutil.TempDir(pdir, "")
if err != nil {
- Logf().E(err.Error())
+ fmt.Println(err.Error())
return ""
}
tmpfile, err := ioutil.TempFile(pdir, "*.tmp")
if err != nil {
- Logf().E(err.Error())
+ fmt.Println(err.Error())
return ""
}
name := tmpfile.Name()
return name
}
-func (this *sys) GetIntranetIp() string {
+func GetIntranetIp(cidr string) (ips []string) {
netInterfaces, err := net.Interfaces()
if err != nil {
- Logf().E("net.Interfaces failed, err:", err.Error())
- Logf().E("[part]no loacl ip")
- return "127.0.0.1"
+ fmt.Println("net.Interfaces failed, err:", err.Error())
+ fmt.Println("[part]no loacl ip")
+ return []string{"127.0.0.1"}
+ }
+
+ var (
+ cidrN *net.IPNet
+ )
+ if cidr == `` {
+ cidr = `0.0.0.0/0`
+ }
+ _, cidrN, err = net.ParseCIDR(cidr)
+ if err != nil {
+ fmt.Println("[part]cidr incorrect")
}
for i := 0; i < len(netInterfaces); i++ {
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
- return ipnet.IP.String()
+ if cidrN != nil && cidrN.Contains(ipnet.IP) {
+ ips = append(ips, ipnet.IP.String())
+ }
}
}
}
}
}
- Logf().E("[part]no loacl ip")
- return "127.0.0.1"
+
+ if len(ips) != 0 {
+ return
+ }
+
+ fmt.Println("[part]no loacl ip")
+ return []string{"127.0.0.1"}
}
-func (this *sys) CheckProgram(pros ...string) []int {
+func (t *sys) CheckProgram(pros ...string) []int {
return Ppart.PCheck(pros)
}
-func (this *sys) SetProxy(s, pac string) error {
+func (t *sys) SetProxy(s, pac string) error {
return Ppart.PProxy(s, pac)
}
-func (this *sys) GetCpuPercent() (float64, error) {
+func (t *sys) GetCpuPercent() (float64, error) {
if a, e := gopsutilLoad.Avg(); e == nil {
if i, e := gopsutilCpu.Counts(true); e == nil {
return (*a).Load1 / float64(i), nil
} else {
- Logf().E(e.Error())
+ fmt.Println(e.Error())
}
} else {
- Logf().E(e.Error())
+ fmt.Println(e.Error())
}
return 0.0, errors.New("cant get CpuPercent")
}
-func (this *sys) PreventSleep() (stop *signal.Signal) {
+func (t *sys) PreventSleep() (stop *signal.Signal) {
return Ppart.PreventSleep()
}
--- /dev/null
+package part
+
+import (
+ "testing"
+)
+
+func Test_customMap(t *testing.T) {
+ t.Log(GetIntranetIp(`192.168.0.0/16`))
+}