diff --git a/README.md b/README.md index 1ba0a17..ea96e2f 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,7 @@ - Add and remove blacklist hosts, from your hosts file. - Possibility to customize your download blacklist links. - Possibility to esclude specific hosts. -- Only for Windows. -- *Linux version is wip...* +- Windows & Linux version. ### Use: @@ -26,9 +25,9 @@ Options: -v, --version view version Command: + load load custom hosts from external urls declared in the file: '/.pigHosts/pigHosts.urls' unload disable and remove custom hosts - load load custom hosts from external urls declared in the file: '.pigHosts/pigHosts.urls' - force_init delete and create a new set of configuration files: '.pigHosts/pigHosts.excluded' and '.pigHosts/pigHosts.urls' in your user/home folder + force_init delete and create a new set of configuration files: '/.pigHosts/pigHosts.excluded' and '/.pigHosts/pigHosts.urls' ``` diff --git a/Taskfile.yml b/Taskfile.yml index f04118c..3bc42f6 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -19,11 +19,11 @@ tasks: desc: Download modules and force a build of project using vendor folder. deps: [mod-vendor] cmds: - - go build -mod vendor -i -a -o $GOPATH/bin/pigHosts.exe ./cmd/... + - go build -mod vendor -i -a -o $GOPATH/bin/pigHosts{{exeExt}} ./cmd/... build: desc: Build project using vendor folder. cmds: - - go build -mod vendor -i -o $GOPATH/bin/pigHosts.exe ./cmd/... + - go build -mod vendor -i -o $GOPATH/bin/pigHosts{{exeExt}} ./cmd/... mod-vendor: desc: Download module into vendor folder. cmds: diff --git a/cmd/pighosts/main.go b/cmd/pighosts/main.go index 2d5095f..f6fb61c 100644 --- a/cmd/pighosts/main.go +++ b/cmd/pighosts/main.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "os" pighosts "pigHosts" "runtime/debug" @@ -26,7 +25,11 @@ func init() { } func main() { - usage := `pigHost + homeFolder, err := os.UserHomeDir() + ChkErr(err) + + usage := ` +pigHost Usage: pigHost [load | unload | force_init] [-h | -v | -o] pigHost (load) @@ -41,9 +44,10 @@ Options: -v, --version view version Command: + load load custom hosts from external urls declared in the file: '` + homeFolder + `/.pigHosts/pigHosts.urls' unload disable and remove custom hosts - load load custom hosts from external urls declared in the file: '.pigHosts/pigHosts.urls' - force_init delete and create a new set of configuration files: '.pigHosts/pigHosts.excluded' and '.pigHosts/pigHosts.urls' in your user/home folder` + force_init delete and create a new set of configuration files: '` + homeFolder + `/.pigHosts/pigHosts.excluded' and '` + homeFolder + `/.pigHosts/pigHosts.urls' + ` arguments, err := docopt.ParseDoc(usage) ChkErr(err) @@ -83,17 +87,16 @@ Command: r, err = arguments.Bool("load") ChkErr(err) if r { + logrus.Info("Start process...") err = pighosts.LoadHostsFile() ChkErr(err) logrus.Info("End process.") + os.Exit(0) } - docopt.PrintHelpAndExit(err, usage) - - err = fmt.Errorf("My Err: %v", "super error!") - ChkErr(err) + logrus.Info("Try to use: option -h or --help for help online.\n") os.Exit(0) } @@ -101,7 +104,7 @@ Command: func ChkErr(err error) { if err != nil { logrus.Error(err, "\n\n") - logrus.Errorf("Version : %v, commit %v, built at %v", version, commit, date) + logrus.Errorf("Version : %v - Commit: %v - Built: %v", version, commit, date) logrus.Errorf("Stack : %s", string(debug.Stack())) os.Exit(1) } diff --git a/go.mod b/go.mod index a41d51d..1564b35 100644 --- a/go.mod +++ b/go.mod @@ -5,3 +5,5 @@ go 1.12 require github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 require github.com/sirupsen/logrus v1.4.2 + +require github.com/briandowns/spinner v1.6.1 diff --git a/go.sum b/go.sum index 8b397cc..532e422 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,17 @@ +github.com/briandowns/spinner v1.6.1 h1:LBxHu5WLyVuVEtTD72xegiC7QJGx598LBpo3ywKTapA= +github.com/briandowns/spinner v1.6.1/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -11,5 +19,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/resource.go b/resource.go index 130b67e..839ac02 100644 --- a/resource.go +++ b/resource.go @@ -1,16 +1,24 @@ package pighosts -import "time" -import "os" +import ( + "os" + "runtime" + "time" + "github.com/briandowns/spinner" +) + +var spinnerInd = spinner.New(spinner.CharSets[9], 100*time.Millisecond) var pigHostsUrls = "" var pigHostsExcluded = "" -const numHostPerLine = 9 - const nonRoutable = "0.0.0.0" const localHostIP4 = "127.0.0.1" const localHostIP6 = "::1" +const hostFileWin = "/Windows/System32/drivers/etc/hosts" +const hostFileLinux = "/etc/hosts" +const numHostPerLineWin = 9 +const numHostPerLineLinux = 1 var filterSpecificHostDefault = []string{ "127.0.0.1 localhost", @@ -58,8 +66,8 @@ var filterSpecificHostTmp = []string{} const headerHostFile = "###--pigHost_START------------------------------------" const footerHostFile = "###--pigHosts_END-------------------------------------" -const hostFile = "/Windows/System32/drivers/etc/hosts" - +var hostFile = hostFileWin +var numHostPerLine = numHostPerLineWin var hostFileNew = os.TempDir() + "/pigHostBak/host.new" var hostFileEmpty = os.TempDir() + "/pigHostBak/host.empty" var hostFileBak = os.TempDir() + "/pigHostBak/host_" + time.Now().Format("20060201T1504") + ".bak" @@ -80,3 +88,10 @@ const manifest = ` ` + +func init() { + if runtime.GOOS != "windows" { + hostFile = hostFileLinux + numHostPerLine = numHostPerLineLinux + } +} diff --git a/utilsConfig.go b/utilsConfig.go index e8379ac..8c8dcde 100644 --- a/utilsConfig.go +++ b/utilsConfig.go @@ -46,7 +46,7 @@ func InitPigHosts(force bool) error { if _, err := os.Stat(homeFolder); os.IsNotExist(err) { err = nil - err = os.Mkdir(homeFolder, os.ModeDir) + err = os.Mkdir(homeFolder, os.ModePerm) if err != nil { return err } diff --git a/utilsHostFile.go b/utilsHostFile.go index 52394f4..80a0016 100644 --- a/utilsHostFile.go +++ b/utilsHostFile.go @@ -15,6 +15,7 @@ import ( func UnloadHostsFile() error { + spinnerInd.Restart() //prepare a new empty version of host file err := prepareHostFile(nil) if err != nil { @@ -29,6 +30,7 @@ func UnloadHostsFile() error { if err != nil { return err } + spinnerInd.Stop() return nil } @@ -38,12 +40,14 @@ func LoadHostsFile() error { logrus.Info("Download hosts list:") hosts := make([]string, 0) for _, k := range defaultHostsUrlsTmp { + logrus.Info("\t", k) + spinnerInd.Restart() z, err := downlaodRemoteList(k) if err != nil { return err } hosts = append(hosts, z...) - logrus.Info("\t", k, " -- Num. hosts download: ", len(z)) + spinnerInd.Stop() } a := prepareHostsList(hosts) @@ -61,12 +65,13 @@ func LoadHostsFile() error { if err != nil { return err } - logrus.Info("Host file updated.") + logrus.Info("Hosts file updated.") return nil } func downlaodRemoteList(url string) ([]string, error) { + if url == "" || (!strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://")) { return []string{}, nil } @@ -92,17 +97,19 @@ func downlaodRemoteList(url string) ([]string, error) { } r := strings.FieldsFunc(strings.ReplaceAll(string(b), "\r\n", "\n"), f) + return r, nil } func prepareHostFile(hosts []string) error { + header := "\n\n" + headerHostFile footer := "\n\n" + footerHostFile + "\n\n" dir := path.Dir(hostFileNew) if _, err := os.Stat(dir); os.IsNotExist(err) { err = nil - err = os.Mkdir(dir, os.ModeDir) + err = os.Mkdir(dir, os.ModePerm) if err != nil { return err } @@ -151,6 +158,7 @@ func prepareHostFile(hosts []string) error { } func readHostFile() (string, error) { + result := "" f, err := os.OpenFile(hostFile, os.O_RDONLY, os.ModeType) if err != nil { @@ -180,14 +188,16 @@ func readHostFile() (string, error) { b := make([]byte, startLine) f.ReadAt(b, 0) result = string(b) + return result, nil } func backupHostFile(s string) (int64, error) { + dir := path.Dir(hostFileBak) if _, err := os.Stat(dir); os.IsNotExist(err) { err = nil - err = os.Mkdir(dir, os.ModeDir) + err = os.Mkdir(dir, os.ModePerm) if err != nil { return 0, err } @@ -204,5 +214,6 @@ func backupHostFile(s string) (int64, error) { if err != nil { return 0, err } + return stat.Size(), nil } diff --git a/utilsHostString_test.go b/utilsHostString_test.go index 221ced8..ac0b5fb 100644 --- a/utilsHostString_test.go +++ b/utilsHostString_test.go @@ -2,6 +2,7 @@ package pighosts import ( "reflect" + "runtime" "strings" "testing" ) @@ -107,6 +108,10 @@ func Test_splitHostPerLine(t *testing.T) { type args struct { hosts map[string]int } + result := []int{10, 7} + if runtime.GOOS != "windows" { + result = []int{2, 2} + } tests := []struct { name string args args @@ -130,7 +135,7 @@ func Test_splitHostPerLine(t *testing.T) { "1phads7.com": 2, "test.test.io": 1}, }, - []int{10, 7}, + result, }, } for _, tt := range tests {