v1.0.0
This commit is contained in:
+213
@@ -0,0 +1,213 @@
|
||||
package hosts
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"runtime"
|
||||
"sync"
|
||||
|
||||
"b612.me/staros/sysconf"
|
||||
)
|
||||
|
||||
var hostsPath string
|
||||
var hostsCfg *sysconf.SysConf
|
||||
var haveError error
|
||||
var lock sync.Mutex
|
||||
var reverse bool = false
|
||||
|
||||
func init() {
|
||||
if runtime.GOOS == "windows" {
|
||||
hostsPath = `C:\Windows\System32\drivers\etc\hosts`
|
||||
} else {
|
||||
hostsPath = `/etc/hosts`
|
||||
}
|
||||
}
|
||||
|
||||
func SetHostsPath(path string) {
|
||||
hostsPath = path
|
||||
}
|
||||
|
||||
func GetHostsPath() string {
|
||||
return hostsPath
|
||||
}
|
||||
|
||||
func Parse() error {
|
||||
hostsCfg = new(sysconf.SysConf)
|
||||
hostsCfg.EqualFlag = ` `
|
||||
hostsCfg.HaveSegMent = false
|
||||
hostsCfg.CommentCR = true
|
||||
hostsCfg.CommentFlag = []string{"#"}
|
||||
data, haveError := ioutil.ReadFile(hostsPath)
|
||||
if haveError != nil {
|
||||
return haveError
|
||||
}
|
||||
data = bytes.ReplaceAll(data, []byte(` `), []byte(" "))
|
||||
haveError = hostsCfg.Parse(data)
|
||||
return haveError
|
||||
}
|
||||
|
||||
func GetIpByDomain(domainName string) []string {
|
||||
if haveError != nil {
|
||||
return []string{}
|
||||
}
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if !reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
return hostsCfg.Data[0].GetAll(domainName)
|
||||
}
|
||||
|
||||
func GetDomainByIp(IpAddr string) []string {
|
||||
if haveError != nil {
|
||||
return []string{}
|
||||
}
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
return hostsCfg.Data[0].GetAll(IpAddr)
|
||||
}
|
||||
|
||||
func AddHosts(ip, host string) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Data[0].AddValue(host, ip, "")
|
||||
} else {
|
||||
hostsCfg.Data[0].AddValue(ip, host, "")
|
||||
}
|
||||
}
|
||||
|
||||
func RemoveHost(ip, host string) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Data[0].DeleteValue(host, ip)
|
||||
} else {
|
||||
hostsCfg.Data[0].DeleteValue(ip, host)
|
||||
}
|
||||
}
|
||||
|
||||
func RemoveHostbyIp(ip string) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
hostsCfg.Data[0].Delete(ip)
|
||||
}
|
||||
|
||||
func RemoveHostbyHost(host string) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if !reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
hostsCfg.Data[0].Delete(host)
|
||||
}
|
||||
|
||||
// SetHost 设定唯一的Host对应值,一个host对应一个ip,其余的删除
|
||||
func SetHost(ip, host string) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if !reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
hostsCfg.Data[0].Set(host, ip, "")
|
||||
}
|
||||
|
||||
func SetHostbyIp(ip, host string) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
hostsCfg.Data[0].Set(ip, host, "")
|
||||
}
|
||||
|
||||
func Build() string {
|
||||
if reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
return string(hostsCfg.Build())
|
||||
}
|
||||
|
||||
func Write() error {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
data := []byte(Build())
|
||||
return ioutil.WriteFile(hostsPath, data, 0644)
|
||||
}
|
||||
|
||||
func GetHostList() []string {
|
||||
var res []string
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if !reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
for _, v := range hostsCfg.Data[0].NodeData {
|
||||
if v != nil {
|
||||
res = append(res, v.Key)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetIpList() []string {
|
||||
var res []string
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
for _, v := range hostsCfg.Data[0].NodeData {
|
||||
if v != nil {
|
||||
res = append(res, v.Key)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetAllListbyHost() map[string][]string {
|
||||
res := make(map[string][]string)
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if !reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
for _, v := range hostsCfg.Data[0].NodeData {
|
||||
if v != nil {
|
||||
res[v.Key] = v.Value
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetAllListbyIp() map[string][]string {
|
||||
res := make(map[string][]string)
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if reverse {
|
||||
hostsCfg.Reverse()
|
||||
reverse = !reverse
|
||||
}
|
||||
for _, v := range hostsCfg.Data[0].NodeData {
|
||||
if v != nil {
|
||||
res[v.Key] = v.Value
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package hosts
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test_Hosts(t *testing.T) {
|
||||
//RemoveHostbyIp("192.168.222.33")
|
||||
Parse()
|
||||
fmt.Println(GetAllListbyIp())
|
||||
}
|
||||
Reference in New Issue
Block a user