]> 127.0.0.1 Git - part/.git/commitdiff
GetIntranetIp v0.9.8
authorqydysky <qydysky@foxmail.com>
Thu, 12 May 2022 16:18:11 +0000 (00:18 +0800)
committerqydysky <qydysky@foxmail.com>
Thu, 12 May 2022 16:18:11 +0000 (00:18 +0800)
Log.go
Zip.go
sys/Sys.go [moved from Sys.go with 65% similarity]
sys/Sys_test.go [new file with mode: 0644]

diff --git a/Log.go b/Log.go
index dddbb6e9fcaebdd25b0071da3534250352348fc9..95e97f98cc5306a760fad134c2af5310053aace4 100644 (file)
--- a/Log.go
+++ b/Log.go
@@ -2,372 +2,451 @@ package part
 
 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
+}
diff --git a/Zip.go b/Zip.go
index ece5659b9bb4255047bdd1a2335516686addf63e..7d5c137bd3e5f341f3813e080fb822d8c1cc2253 100644 (file)
--- a/Zip.go
+++ b/Zip.go
 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)
+       }
+}
similarity index 65%
rename from Sys.go
rename to sys/Sys.go
index 92117cc60717db8c1b030423889e71fd36440375..e9f33b337f2fd99777ab39e00e144d9799534204 100644 (file)
--- a/Sys.go
@@ -36,12 +36,11 @@ func (*sys) Type(s ...interface{}) string {
        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)
@@ -54,7 +53,7 @@ func (t *sys) Pdir(cdir string) string {
                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]
        }
@@ -67,38 +66,38 @@ func GetRV(i *[]interface{}, num int) []interface{} {
        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
@@ -119,7 +118,7 @@ func (t *sys) GetTmpDir(pdir string) string {
 
        dir, err := ioutil.TempDir(pdir, "")
        if err != nil {
-               Logf().E(err.Error())
+               fmt.Println(err.Error())
                return ""
        }
 
@@ -132,7 +131,7 @@ func (t *sys) GetTmpFile(pdir string) string {
 
        tmpfile, err := ioutil.TempFile(pdir, "*.tmp")
        if err != nil {
-               Logf().E(err.Error())
+               fmt.Println(err.Error())
                return ""
        }
        name := tmpfile.Name()
@@ -140,12 +139,23 @@ func (t *sys) GetTmpFile(pdir string) string {
        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++ {
@@ -155,37 +165,44 @@ func (this *sys) GetIntranetIp() string {
                        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()
 }
diff --git a/sys/Sys_test.go b/sys/Sys_test.go
new file mode 100644 (file)
index 0000000..7134203
--- /dev/null
@@ -0,0 +1,9 @@
+package part
+
+import (
+       "testing"
+)
+
+func Test_customMap(t *testing.T) {
+       t.Log(GetIntranetIp(`192.168.0.0/16`))
+}