From d4c87848bdcf8fc603a68511651b1209fd4e336c Mon Sep 17 00:00:00 2001 From: qydysky Date: Fri, 13 May 2022 00:18:11 +0800 Subject: [PATCH] GetIntranetIp --- Log.go | 617 ++++++++++++++++++++++++------------------- Zip.go | 329 ++++++++++++----------- Sys.go => sys/Sys.go | 81 +++--- sys/Sys_test.go | 9 + 4 files changed, 577 insertions(+), 459 deletions(-) rename Sys.go => sys/Sys.go (65%) create mode 100644 sys/Sys_test.go diff --git a/Log.go b/Log.go index dddbb6e..95e97f9 100644 --- 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 ece5659..7d5c137 100644 --- a/Zip.go +++ b/Zip.go @@ -1,198 +1,211 @@ 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) + } +} diff --git a/Sys.go b/sys/Sys.go similarity index 65% rename from Sys.go rename to sys/Sys.go index 92117cc..e9f33b3 100644 --- a/Sys.go +++ b/sys/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 index 0000000..7134203 --- /dev/null +++ b/sys/Sys_test.go @@ -0,0 +1,9 @@ +package part + +import ( + "testing" +) + +func Test_customMap(t *testing.T) { + t.Log(GetIntranetIp(`192.168.0.0/16`)) +} -- 2.39.2