Commit b6c875d1 by 浔阳陌客

init

parents
# 知微资产信息自动同步工具
为了提高效率,为了准确收集资产信息,为了一劳永逸,为了知微!
## 一、收集信息到[CMDB](http://cmdb.zhiweidata.top/relation_views)
1. 公司主机资产(IP地址、MAC地址、CPU配置、内存、硬盘)
2. 个人笔记本(IP地址、MAC地址)
## 二、运行方式
Windows主机:通过脚本自动创建开机自启任务并运行工具
Linux主机:通过脚本自动添加开机运行的命令,并运行工具
个人macbook:初始化运行一次,每当IP地址更换时再运行一次。
## 三、运行逻辑
通过go代码获取到信息后,传输到主要域控制器(192.168.0.20)。[daemon进程](http://git.zhiweidata.top/taotengfei/AD-Control-Golang)控制所有不同的来源并上传到[cmdb](http://cmdb.zhiweidata.top/relation_views)
## 四、其他说明
本工具由[Golang](https://go.dev)强力驱动,支持的操作系统:Windows、Linux、macOS
## 五、编译方式
```
git clone git@git.zhiweidata.top:taotengfei/AD-Control-Golang.git
git clone git@git.zhiweidata.top:taotengfei/caut.git
cd caut
# 以下命令仅支持在mac或linux上运行
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
```
#!/bin/bash
os=(windows darwin linux)
for i in "${os[@]}" ;do
test "$i" == "windows" && ext="${i}.exe"
test "$i" == "darwin" && ext="macos"
test "$i" == "linux" && ext=$i
CGO_ENABLED=0 GOOS="$i" GOARCH=amd64 go build -o release/caut_"$ext" -a *.go
openssl sha256 release/caut_"$ext" >release/caut_"$ext"_sha.txt
done
\ No newline at end of file
package main
import (
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
)
func envCheck(ip string) {
if pub.User_computername == "" {
pub.User_computername = ip
}
}
module caut
go 1.18
require git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0
require (
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect
github.com/go-ldap/ldap/v3 v3.4.2 // indirect
github.com/gookit/color v1.5.0 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
golang.org/x/text v0.3.7 // indirect
)
replace git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0 => ../AD-Control-Golang/public
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-asn1-ber/asn1-ber v1.5.3 h1:u7utq56RUFiynqUzgVMFDymapcOtQ/MZkh3H4QYkxag=
github.com/go-asn1-ber/asn1-ber v1.5.3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-ldap/ldap/v3 v3.4.2 h1:zFZKcXKLqZpFMrMQGHeHWKXbDTdNCmhGY9AK41zPh+8=
github.com/go-ldap/ldap/v3 v3.4.2/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg=
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 h1:PgUUmg0gNMIPY2WafhL/oLyQGw+kdTNPlVWOjltpp3w=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
package main
import (
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
"fmt"
"net"
"strings"
)
type information struct {
ips []string
IP string
macaddresses []string
Macaddress string
Dept string
Name string
Region string
}
func (info *information) Check() bool {
if info.Region == "" {
LOG(ERROR, "FLAG", fmt.Sprint("地区信息未输入\n具体参数 --regsion=宁波\n有效值:宁波、郑州"))
return false
}
if info.Region == "" {
LOG(ERROR, "FLAG", fmt.Sprint("部门信息未输入\n具体参数 --dept=技术部门\n有效值:人事部门、培训部门、产品部门、技术部门"))
return false
}
if info.Name == "" {
LOG(ERROR, "FLAG", fmt.Sprint("姓名未输入\n具体参数 --name=xxx"))
return false
}
return true
}
func (info *information) GetIP() {
switch pub.OS_Type {
case pub.OS_Type_Windows:
info.ips = pub.GetMultiIPFromNslookup()
default:
info.ips = info.getIPFromInterface()
}
info.ipString()
}
func (info *information) getIPFromInterface() []string {
addrs, err := net.InterfaceAddrs()
if err != nil {
LOG(ERROR, "IP", err)
return nil
}
ips := make([]string, 0)
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip_string := ipnet.IP.String()
switch info.Region {
case pub.Region_nb:
if strings.Index(ip_string, "192.168.0.") != -1 {
ips = append(ips, ip_string)
}
}
}
}
}
return ips
}
func (info *information) ipString() string {
var r string
for _, j := range info.ips {
r += fmt.Sprintf("%s,", j)
}
r = r[0 : len(r)-1]
info.IP = r
return r
}
func (info *information) GetMACAddress() {
for _, ip := range info.ips {
fmt.Println(ip)
switch pub.OS_Type {
case pub.OS_Type_Windows:
info.macaddresses = append(info.macaddresses, pub.GetMacaddressFromIP(ip))
default:
info.macaddresses = append(info.macaddresses, string(pub.Execcmd_output(fmt.Sprintf(`arp %s | awk '{print $4}'`, ip))))
}
}
info.macString()
}
func (info *information) macString() {
LOG(INFO, "MAC", info.macaddresses)
}
//go:build linux || darwin || windows
// +build linux darwin windows
package main
import (
"flag"
"fmt"
"os"
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
)
const INFO = pub.INFO
const ERROR = pub.ERROR
func basicInfo() {
if !pub.Zhiweireach() {
pub.ADServerDaemon = pub.Host_adserver_ip + pub.DaemonLogListen
pub.ADServerLogDaemon = pub.Host_adserver_ip + pub.DaemonLogListen
}
fmt.Println("欢迎使用 知微资产信息自动同步工具")
fmt.Println("该工具将为知微所有主机资产自动同步到CMDB,个人macbook仅仅记录IP和mac地址。")
fmt.Println("程序开源,项目地址: http://git.zhiweidata.top/taotengfei/caut")
fmt.Println("----------------------------------------------------------")
}
func parseFlag() information {
var info information
flag.StringVar(&info.Region, "region", "", "地区信息,有效值:宁波、郑州")
flag.StringVar(&info.Dept, "dept", "", "部门信息,有效值:人事部门、培训部门、产品部门、技术部门")
flag.StringVar(&info.Name, "name", "", "姓名")
flag.Parse()
if !info.Check() {
os.Exit(-1)
}
return info
}
func main() {
basicInfo()
info := parseFlag()
info.GetIP()
//LOGS(INFO, "FLAG", fmt.Sprintf("版本:%s\n地区:%s\n部门:%s\n姓名:%s", pub.Version, info.Region, info.Dept, info.Name))
envCheck(info.ips[0])
info.GetMACAddress()
}
func LOG(level string, msg_type string, args ...any) {
fmt.Println(args...)
}
func LOGS(level string, msg_type string, args ...any) {
fmt.Println(args...)
pub.LOG(level, msg_type, args...)
}
SHA256(release/caut_linux)= 971badc4bab8e2dada03d2044e4ec0cf7901224edfbacde1c82c60891d535f5a
SHA256(release/caut_macos)= 10d4bd5ab3fe52679c9c5bea271da5838909cd4dbfd0a81f7283a1a0328886a8
SHA256(release/caut_windows.exe)= 19627948a5d9486bd3f6c1055dfabcfe55bcaefe0913d9de473a6874a38dd6e5
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment