You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
staros/hosts/hosts.go

214 lines
3.6 KiB
Go

4 years ago
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
}