123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- package utils
- import (
- "bytes"
- "crypto/md5"
- "encoding/gob"
- "encoding/hex"
- "fmt"
- "log"
- "net"
- "os"
- "os/exec"
- "os/user"
- "path/filepath"
- "runtime"
- "strings"
- "sync"
- "time"
- "github.com/eiannone/keyboard"
- "github.com/teris-io/shortid"
- "github.com/go-ini/ini"
- )
- func LocalIP() string {
- ip := ""
- if addrs, err := net.InterfaceAddrs(); err == nil {
- for _, addr := range addrs {
- if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && !ipnet.IP.IsMulticast() && !ipnet.IP.IsLinkLocalUnicast() && !ipnet.IP.IsLinkLocalMulticast() && ipnet.IP.To4() != nil {
- ip = ipnet.IP.String()
- }
- }
- }
- return ip
- }
- func MD5(str string) string {
- encoder := md5.New()
- encoder.Write([]byte(str))
- return hex.EncodeToString(encoder.Sum(nil))
- }
- func CWD() string {
- path, err := os.Executable()
- if err != nil {
- return ""
- }
- return filepath.Dir(path)
- }
- var workInDirLock sync.Mutex
- func WorkInDir(f func(), dir string) {
- wd, _ := os.Getwd()
- workInDirLock.Lock()
- defer workInDirLock.Unlock()
- os.Chdir(dir)
- defer os.Chdir(wd)
- f()
- }
- func EXEName() string {
- path, err := os.Executable()
- if err != nil {
- return ""
- }
- return strings.TrimSuffix(filepath.Base(path), filepath.Ext(path))
- }
- func HomeDir() string {
- u, err := user.Current()
- if err != nil {
- return ""
- }
- return u.HomeDir
- }
- func LogDir() string {
- dir := filepath.Join(CWD(), "logs")
- EnsureDir(dir)
- return dir
- }
- func ErrorLogFilename() string {
- return filepath.Join(LogDir(), fmt.Sprintf("%s-error.log", strings.ToLower(EXEName())))
- }
- func DataDir() string {
- dir := CWD()
- _dir := Conf().Section("").Key("data_dir").Value()
- if _dir != "" {
- dir = _dir
- }
- dir = ExpandHomeDir(dir)
- EnsureDir(dir)
- return dir
- }
- var FlagVarConfFile string
- func ConfFile() string {
- if FlagVarConfFile != "" {
- return FlagVarConfFile
- }
- if Exist(ConfFileDev()) {
- return ConfFileDev()
- }
- return filepath.Join(CWD(), strings.ToLower(EXEName())+".ini")
- }
- func ConfFileDev() string {
- return filepath.Join(CWD(), strings.ToLower(EXEName())+".dev.ini")
- }
- var FlagVarDBFile string
- func DBFile() string {
- if FlagVarDBFile != "" {
- return FlagVarDBFile
- }
- if Exist(DBFileDev()) {
- return DBFileDev()
- }
- return filepath.Join(CWD(), strings.ToLower(EXEName()+".db"))
- }
- func DBFileDev() string {
- return filepath.Join(CWD(), strings.ToLower(EXEName())+".dev.db")
- }
- var conf *ini.File
- func Conf() *ini.File {
- if conf != nil {
- return conf
- }
- if _conf, err := ini.InsensitiveLoad(ConfFile()); err != nil {
- _conf, _ = ini.LoadSources(ini.LoadOptions{Insensitive: true}, []byte(""))
- conf = _conf
- } else {
- conf = _conf
- }
- return conf
- }
- func ReloadConf() *ini.File {
- if _conf, err := ini.InsensitiveLoad(ConfFile()); err != nil {
- _conf, _ = ini.LoadSources(ini.LoadOptions{Insensitive: true}, []byte(""))
- conf = _conf
- } else {
- conf = _conf
- }
- return conf
- }
- func SaveToConf(section string, kvmap map[string]string) error {
- var _conf *ini.File
- var err error
- if _conf, err = ini.InsensitiveLoad(ConfFile()); err != nil {
- if _conf, err = ini.LoadSources(ini.LoadOptions{Insensitive: true}, []byte("")); err != nil {
- return err
- }
- }
- sec := _conf.Section(section)
- for k, v := range kvmap {
- sec.Key(k).SetValue(v)
- }
- _conf.SaveTo(ConfFile())
- conf = _conf
- return nil
- }
- func ExpandHomeDir(path string) string {
- if len(path) == 0 {
- return path
- }
- if path[0] != '~' {
- return path
- }
- if len(path) > 1 && path[1] != '/' && path[1] != '\\' {
- return path
- }
- return filepath.Join(HomeDir(), path[1:])
- }
- func EnsureDir(dir string) (err error) {
- if _, err = os.Stat(dir); os.IsNotExist(err) {
- err = os.MkdirAll(dir, 0755)
- if err != nil {
- return
- }
- }
- return
- }
- func Exist(path string) bool {
- if _, err := os.Stat(path); os.IsNotExist(err) {
- return false
- }
- return true
- }
- func DeepCopy(dst, src interface{}) error {
- var buf bytes.Buffer
- if err := gob.NewEncoder(&buf).Encode(src); err != nil {
- return err
- }
- return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
- }
- func Open(url string) error {
- var cmd string
- var args []string
- switch runtime.GOOS {
- case "windows":
- cmd = "cmd"
- args = []string{"/c", "start"}
- case "darwin":
- cmd = "open"
- default: // "linux", "freebsd", "openbsd", "netbsd"
- cmd = "xdg-open"
- }
- args = append(args, url)
- return exec.Command(cmd, args...).Start()
- }
- func ShortID() string {
- return shortid.MustGenerate()
- }
- func PauseExit() {
- log.Println("Press any to exit")
- keyboard.GetSingleKey()
- os.Exit(0)
- }
- func PauseGo(msg ...interface{}) {
- log.Println(msg...)
- keyboard.GetSingleKey()
- }
- func IsPortInUse(port int) bool {
- if conn, err := net.DialTimeout("tcp", net.JoinHostPort("", fmt.Sprintf("%d", port)), 3*time.Second); err == nil {
- conn.Close()
- return true
- }
- return false
- }
- func init() {
- gob.Register(map[string]interface{}{})
- gob.Register(StringArray(""))
- ini.PrettyFormat = false
- }
|