Commit cd9ec223 by 陶腾飞

2022-03-29 全新2.0

parent 6b6b8c89
...@@ -2,7 +2,9 @@ test/ ...@@ -2,7 +2,9 @@ test/
testwalk/ testwalk/
testmain/ testmain/
exe/ exe/
pkg/
catHardware/
.vscode/
*.bat *.bat
*.ps1 *.ps1
*.exe *.exe
.vscode/
# AD-Control-Golang # AD-Control-Golang 2.0
## 程序简介 ## 一、程序简介
本程序是从AD-Control升级而来,并融合了在AD上经常使用的工具. 本程序是从AD-Control升级而来,并融合了在AD上经常使用的工具.
## 程序作用简要 ## 二、程序作用简要
### 1. Users.exe - 域用户使用的程序 ### 1. Users.exe - 域用户的小工具
UI: 在域计算机上以用户方式运行在任务栏托盘的位置上
在域计算机上以用户权限运行在任务栏托盘的位置上
启动说明: 启动说明:
在开机时,由组策略的文件替换功能,从文件共享中复制到C:\Windows\System32下,并运行。 在开机时,由GPO的开机启动策略从主控的smb中复制到%tmp%后运行
具体功能: 具体功能:
1. 电源选项
2. 软件安装
3. 实用工具
3. 文件共享
> 1. 账号管理
> 2. 用户管理
> 3. 电源选项
> 4. 实用工具(软件安装等)
> 5. 文件共享
### 2. 域控制器使用的Daemon.exe ### 2. Daemon.exe 域控制器守护进程
运行方式: 运行方式:
`go run .\daemon.go` ```
.\daemon.exe
```
主要功能: 主要功能:
接收域和企业微信的消息并处理与反馈 接收域和企业微信的消息并处理与反馈、接受小工具的日志并存储
### 3. adct.exe 域控制工具 ### 3. adct.exe 域控制工具
...@@ -35,14 +37,19 @@ UI: ...@@ -35,14 +37,19 @@ UI:
通过adct来控制域用户、域计算机来完成部分功能 通过adct来控制域用户、域计算机来完成部分功能
具体功能: 具体功能:
1. 定时操作
2. 汇报情况
3. 强制备份
4. 主机唤醒
> 1. 定时操作
> 2. 汇报情况
> 3. 主机唤醒
> 4. 同步cmdb
> 5. 硬件信息收集
> 6. 获取token
## 三、[cmdb](http://cmdb.zhiweidata.top/instances/types/28)
## 更新情况 通过daemon和users配合GPO一起同步更新。登录时用的token通过任务计划每间隔1小时自动获取。
## 四、更新说明
- 2020/05/15 v0.7 加入Error Json,walk.Resouce.Icon()使用绝对路径,修改users.exe的报错机制 - 2020/05/15 v0.7 加入Error Json,walk.Resouce.Icon()使用绝对路径,修改users.exe的报错机制
- 2020/05/18 v0.8 更新 大屏主机的文件共享,取消TXHD的凌晨关机. - 2020/05/18 v0.8 更新 大屏主机的文件共享,取消TXHD的凌晨关机.
...@@ -73,10 +80,11 @@ UI: ...@@ -73,10 +80,11 @@ UI:
- 2020/10/26 v1.10.1 修复批量打开失败问题 - 2020/10/26 v1.10.1 修复批量打开失败问题
- 2020/10/27 v1.10.2 优化软件安装和重启小工具的程序逻辑,更新64位的程序清单和新ico文件 - 2020/10/27 v1.10.2 优化软件安装和重启小工具的程序逻辑,更新64位的程序清单和新ico文件
- 2020/11/05 v1.10.3 更新备份策略 - 2020/11/05 v1.10.3 更新备份策略
- 2022/03/29 v2.0.0 删除备份策略,同步域计算机信息到cmdb,添加账户、主机管理管理,唤醒策略更新,日志统一收集处理,运维平台添加管理员指令
## 其他说明 ## 五、其他说明
### lxn/walk的修改 ### [lxn/walk](https://github.com/lxn/walk)的修改
1. 解决托盘菜单中按钮点击一次,会跳出2次的问题 1. 解决托盘菜单中按钮点击一次,会跳出2次的问题
......
package main package main
import ( import (
pub "AD-Control-Golang/public" pub "AD-Control-Golang/public"
"encoding/json"
"flag" "flag"
"fmt"
"os"
"strings"
) )
func initLog(){ const INFO = pub.INFO
var logpath string const ERROR = pub.ERROR
const NULL = pub.NULL
func main() {
var reportText = flag.String(pub.Msg_Report, "", "report to AD")
var wolMacText = flag.String("wolmac", "", "input MACAddress for waking pc")
var wolHostText = flag.String("wolhost", "", "input hostname for waking pc")
var wolAllText = flag.Bool("wolall", false, "wake all Domain Computer")
var hourText = flag.Bool("hour", false, "exec task at the time")
var cmdbtokenText = flag.Bool("cmdbtoken", false, "")
var loglevel = flag.String("loglevel", INFO, "")
// 作为PC启动
if pub.RunAsPC(pub.User_computername){
logpath = `C:\windows\system32\`
// 作为用户启动
}else{
logpath = pub.Dir_userprofile + `\`
}
pub.Loger = pub.NewLoger(logpath + "adct.log")
}
func main(){
initLog()
var reportText = flag.String( pub.Msg_Report ,"" ,"report to AD")
var passText = flag.String( "pass" ,"" ,"input passwork,but not need")
var wolmacText = flag.String( "wolmac" ,"" ,"input MACAddress for waking pc")
var wolhostText = flag.String( "wolhost" ,"" ,"input hostname for waking pc")
var wolallText = flag.Bool( "wolall" ,false ,"wake all Domain Computer")
var hourText = flag.Bool( "hour" ,false ,"exec task at the time")
flag.Parse() flag.Parse()
if *hourText { flag_hour( );return} if *loglevel != "" {
if *reportText != "" { flag_report( reportText );return} loglevelSet(strings.ToLower(*loglevel))
if *wolmacText != "" { flag_wolmac( wolmacText );return} }
if *wolhostText != "" { flag_wolhost( wolhostText );return}
if *wolallText { flag_wolall( passText );return} if *hourText {
hour()
} else if *reportText != "" {
pub.DomainComputer()
flag_report(*reportText)
return } else if *wolMacText != "" {
pub.DomainCotroller()
wolMac(wolMacText)
} else if *wolHostText != "" {
pub.DomainCotroller()
wolHost(wolHostText)
} else if *wolAllText {
pub.DomainCotroller()
wolALL()
} else if *cmdbtokenText {
pub.DomainCotroller()
pub.CmdbTokenUpdate()
}
return
} }
func flag_report(s *string){ func loglevelSet(l string) {
// 发送消息 switch l {
pub.SendServerReport(*s) case pub.INFO:
pub.Loglevel = l
case pub.DEBUG:
pub.Loglevel = l
case "debu":
pub.Loglevel = pub.DEBUG
default:
os.Exit(-1)
}
} }
func flag_hour(){ // 发送消息
func flag_report(s string) {
var d []byte
var err error
switch s {
case pub.Msg_Report_WillTurnOnPC:
var cir pub.CIRecordStartup
cir.Bumen, err = cir.GetDept()
if err != nil {
os.Exit(-1)
}
cir.GetHardWare()
cir.Ip = pub.GetIPFromNslookup()
cir.Mac = pub.GetMacaddressFromIP(cir.Ip)
cir.Start_time = pub.GetNowTimeString()
d, err = json.Marshal(cir)
if err != nil {
pub.LOG(ERROR, s, err.Error())
os.Exit(-1)
}
case pub.Msg_Report_WillTurnOffPC:
var cir pub.CIRecordShutdown
cir.Shutdown_time = pub.GetNowTimeString()
d, err = json.Marshal(cir)
if err != nil {
pub.LOG(ERROR, s, err.Error())
os.Exit(-1)
}
}
pub.SendADMsg(pub.Msg_Report, pub.GJreportString(s, string(d)))
}
// 定点执行
func hour() {
nh := pub.GetHour() nh := pub.GetHour()
switch nh{ switch nh {
default : default:
//pub.Execcmd_nowait(`即将关机,如需取消,点击小工具-电源管理-取消自动关机 或运行Z:\tools\【工具】取消关机.bat`) break
//pub.Execcmd_nowait(`shutdown -s -t 300`)
break
} }
} }
func flag_wolmac(mac * string){
//直接指定mac地址,不带主机名参数 //直接指定mac地址,不带主机名参数
pub.Wol_enter("",mac)
func wolMac(mac *string) {
pub.LOG(INFO, "wol_mac", fmt.Sprintf("mac:%s", *mac))
pub.Wol_enter("", mac)
} }
func flag_wolhost(pc *string){ func wolHost(pc *string) {
mac := pub.Reg_query_key_one( // coding
pub.Reg_Root_ac, var mac string
pub.Reg_Path_home_ac+*pc, pub.LOG(INFO, "wol_host", fmt.Sprintf("pc:%s,mac:%s", *pc, mac))
pub.Reg_Name_MACaddress) pub.Wol_enter(*pc, &mac)
pub.PntInfof("pc:%s,mac:%s",*pc,mac)
pub.Wol_enter(*pc,&mac)
//暂未开发 //暂未开发
} }
func flag_wolall(pass * string){ func wolALL() {
pclist,err :=pub.Reg_query_list(pub.Reg_Root_ac,pub.Reg_Path_home_ac) // coding get pclist
if err != nil{ // limit :=1
pub.PntError(err) //for _, pc := range pclist {
}
//limit :=1 // 没有主机信息没有记录到注册表
for _,pc := range pclist{ //pub.LOG(ERROR, "wol_all", fmt.Sprintf("%s查找失败", pc))
mac := pub.Reg_query_key_one(
pub.Reg_Root_ac, // else{
pub.Reg_Path_home_ac+pc, // // 延时计数重置
pub.Reg_Name_MACaddress) // if limit <= 10 {
// pub.Delay(10)
// 没有主机信息没有记录到注册表 // limit=0
if mac == ""{ // }
pub.PntError(pc,"查找注册表失败")
continue // // 唤醒入口
}else{ // pub.Wol_enter(pc, &mac)
// 延时计数重置
// if limit <= 10 { // // 随机延时
// pub.Delay(10) // pub.RandDelay(10)
// limit=0 // limit +=1
// } // }
//}
// 唤醒入口
pub.Wol_enter(pc,&mac) }
// 随机延时
//pub.RandDelay(10)
//limit +=1
}
}
}
\ No newline at end of file
...@@ -2,16 +2,50 @@ package main ...@@ -2,16 +2,50 @@ package main
import ( import (
pub "AD-Control-Golang/public" pub "AD-Control-Golang/public"
"net"
"net/http" "net/http"
"os"
) )
var l *os.File
func main() { func main() {
l, _ = os.OpenFile(`H:\logs\users.log`, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
// 在家目录中写入日志 //pub.Loglevel = pub.DEBUG
pub.Loger = pub.NewLoger(pub.Dir_userprofile + `\daemon.log`) go listenLog()
listenMsg()
}
func listenMsg() {
http.HandleFunc("/", pub.DealMsgEnter)
http.ListenAndServe(pub.DaemonListen, nil)
}
func listenLog() {
addr, err := net.ResolveUDPAddr("udp", "0.0.0.0"+pub.DaemonLogListen)
if err != nil {
pub.LOG(pub.ERROR, pub.ERROR, err)
return
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
pub.LOG(pub.ERROR, pub.ERROR, err)
}
pub.PrintLog("start daemon!") defer conn.Close()
pub.LOG(pub.INFO, pub.NULL, "start LOG daemon!")
for {
data := make([]byte, 2000)
n, _, err := conn.ReadFromUDP(data)
if err != nil {
pub.LOG(pub.ERROR, pub.ERROR, err)
continue
}
data[n] = byte('\n')
l.Write(data[0 : n+1])
http.HandleFunc("/", pub.DealMsgEnter) }
http.ListenAndServe(pub.DaemonListen,nil) }
}
\ No newline at end of file
package public
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"strings"
)
var client = http.Client{}
const cmdb_Dept string = "bumen"
const cmdb_Product_name string = "product_name"
const cmdb_Username string = "username"
func cmdbKVtoJSON(k, v string) (string, error) {
var err error
var b []byte
switch k {
case cmdb_Product_name:
var a CIRecorProduct_name
a.Product_name = v
b, err = json.Marshal(&a)
case cmdb_Username:
var a CIRecordUsername
a.Username = v
b, err = json.Marshal(&a)
}
return string(b), err
}
func cmdbExistRecord(k, v string) (int, bool) {
var count string = "1"
var cmdbPath string = "api/v0.1/ci/s?q="
search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search, count)
LOG(DEBUG, CMDB, url)
var cir CIRecordReq
data, err := cmdbGET(url)
if err != nil {
LOG(ERROR, CMDB, err)
return 0, false
}
if err := json.Unmarshal(data, &cir); err != nil {
LOG(ERROR, CMDB, err)
return 0, false
}
LOG(DEBUG, "CMDB_EXITE", string(data))
switch cir.Numfound {
case 0:
var cir CIRecordResult
if err := cir.BasicInfo(v); err != nil {
LOG(ERROR, CMDB, err)
return 0, false
}
cir.Uni_one = fmt.Sprintf("%v", NowTimestampNano())
cmdbPath = "api/v0.1/ci"
url = fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath)
jsondata, jsonerr := cir.String()
LOG(DEBUG, "CMDB_NEW", fmt.Sprintf("路径:%s\n参数:%s", url, string(jsondata)))
if jsonerr != nil {
LOG(ERROR, CMDB, jsonerr)
return 0, false
}
if _, err := cmdbPOST(url, jsondata); err != nil {
LOG(ERROR, CMDB, err)
return 0, false
} else {
l := fmt.Sprintf("CMDB\nnew host %s:%s", k, v)
LOG(INFO, "CMDB_NEW", l)
SendWxworkTextToAdmins(l)
}
case 1:
LOG(DEBUG, "CMDB_NEW", fmt.Sprintf("存在%s:%d", v, cir.R[0].Ci_id))
return cir.R[0].Ci_id, true
default:
LOG(ERROR, "CMDB_NEW", v+"存在多条记录")
return 0, false
}
return 0, false
}
func cmdbUpdateRecordFromJSON(datastr string, ci int) error {
var cmdbPath string = fmt.Sprintf("api/v0.1/ci/%d", ci)
url := fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath)
LOG(DEBUG, CMDB, url)
data, err := cmdbPUT(url, []byte(datastr))
if err != nil {
LOG(ERROR, "CMDB_UPDATE", err)
return err
}
var cirr CIRecordUpdateReq
if err := json.Unmarshal(data, &cirr); err != nil {
LOG(ERROR, "CMDB_UPDATE_UNMARSHAL", err)
return err
}
if cirr.Ci_id == ci {
return nil
}
return nil
}
func CmdbTokenUpdate() {
type res struct {
Token string `json:"token"`
}
var r res
msg_type := CMDB + "_TOKEN"
cmdbPath := "api/login"
url := fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath)
LOG(DEBUG, CMDB, url)
data, err := cmdbPOST(url, []byte(cmdbPass))
if err != nil {
LOG(ERROR, msg_type, err)
return
}
if err := json.Unmarshal(data, &r); err != nil {
LOG(ERROR, msg_type, err)
return
}
if len(r.Token) == 0 {
LOG(ERROR, msg_type, "token获取失败")
} else {
Reg_Write_DC(Reg_Key_cmdbtoken, string(r.Token))
LOG(INFO, msg_type, "token更新完成")
}
}
func cmdbGetCI(k, v string) (int, error) {
var count string = "1"
var cmdbPath string = "api/v0.1/ci/s?q="
search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search, count)
LOG(DEBUG, CMDB, url)
var cir CIRecordReq
data, err := cmdbGET(url)
if err != nil {
LOG(ERROR, CMDB, err)
return 0, err
}
if err := json.Unmarshal(data, &cir); err != nil {
LOG(ERROR, CMDB, err)
return 0, err
}
LOG(DEBUG, "CMDB_EXITE", string(data))
switch cir.Numfound {
case 0:
return 0, fmt.Errorf("不存在记录")
case 1:
return cir.R[0].Ci_id, nil
default:
return 0, fmt.Errorf("存在多条记录")
}
}
func cmdbPOST(url string, reqdata []byte) ([]byte, error) {
buf := bytes.NewBuffer(nil)
buf.Write(reqdata)
h, err := http.NewRequest("POST", url, buf)
if err != nil {
return nil, err
}
h.Header.Add("Content-Type", "application/json")
// 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新
// 如果,仅仅访问api/login,则不需要去获取token
if strings.Index(url, "api/login") == -1 {
h.Header.Add("Access-Token", Reg_Query_DC(Reg_Key_cmdbtoken))
}
res, err := (&client).Do(h)
if err != nil {
return nil, err
}
defer res.Body.Close()
data, errdata := ioutil.ReadAll(res.Body)
if res.StatusCode != 200 {
LOG(ERROR, "CMDB_POST", fmt.Sprintf("状态码:%d,路径:%s,返回数据:%s,参数:%s", res.StatusCode, url, string(data), string(reqdata)))
return nil, err
}
if errdata != nil && errdata == io.EOF {
return data, nil
} else if errdata != nil {
return nil, err
}
return data, nil
}
func cmdbPUT(url string, reqdata []byte) ([]byte, error) {
buf := bytes.NewBuffer(nil)
buf.Write(reqdata)
h, err := http.NewRequest("PUT", url, buf)
if err != nil {
return nil, err
}
h.Header.Add("Content-Type", "application/json")
// 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新
// 如果,仅仅访问api/login,则不需要去获取token
if strings.Index(url, "api/login") == -1 {
h.Header.Add("Access-Token", Reg_Query_DC(Reg_Key_cmdbtoken))
}
res, err := (&client).Do(h)
if err != nil {
return nil, err
}
defer res.Body.Close()
data, errdata := ioutil.ReadAll(res.Body)
if res.StatusCode != 200 {
LOG(ERROR, "CMDB_PUT", fmt.Sprintf("状态码:%d,路径:%s,返回数据:%s,参数:%s", res.StatusCode, url, string(data), string(reqdata)))
return nil, err
}
if errdata != nil && errdata == io.EOF {
return data, nil
} else if errdata != nil {
return nil, err
}
return data, nil
}
func cmdbGET(url string) ([]byte, error) {
h, err := http.NewRequest("GET", url, nil)
if err != nil {
LOG(ERROR, "CMDB_GET", err)
return nil, err
}
res, err := (&client).Do(h)
if err != nil {
LOG(ERROR, "CMDB_GET", fmt.Sprintf("状态码:%d,路径:%s", res.StatusCode, url))
return nil, err
}
defer res.Body.Close()
if res.StatusCode != 200 {
LOG(ERROR, "CMDB_GET", fmt.Sprintf("状态码:%d,路径:%s", res.StatusCode, url))
return nil, err
}
data, errdata := ioutil.ReadAll(res.Body)
if errdata != nil && errdata == io.EOF {
return nil, nil
} else if errdata != nil {
return nil, err
}
return data, nil
}
package public
import (
"encoding/json"
"fmt"
"sync"
)
type CIRecordReq struct {
Counter CIRecordComputer `json:"counter"`
Facet CIRecordFacet `json:"facet"`
Numfound int `json:"numfound"`
Page int `json:"page"`
R []CIRecordResult `json:"result"`
Total int `json:"total"`
}
type CIRecordComputer struct {
Computer int `json:"Computer"`
}
type CIRecordFacet struct {
}
type CIRecordResult struct {
Bumen string `json:"bumen"` // 部门
Username string `json:"username"` // 姓名
Position string `json:"position"` // 具体位置
Seat string `json:"seat"` // 主机座位坐标
Product_name string `json:"product_name"` // 主机名
Ip string `json:"ip"` // ip
Mac string `json:"mac"` // mac地址
Start_time string `json:"start_time"` // 启动时间
Shutdown_time string `json:"shutdown_time"` // 关机时间
Cpu string `json:"cpu"` // cpu
Disk string `json:"disk"` // 硬盘
Memory string `json:"memory"` // 内存
Flag string `json:"flag"` // 标签
Buy_time string `json:"buy_time"`
Ci_id int `json:"ci_id"`
Ci_type string `json:"ci_type"`
Get_time string `json:"get_time"`
Mark string `json:"mark"`
Screen_info string `json:"screen_info"`
Type_id int `json:"type_id"`
Uni_one string `json:"uni_one"`
Unique string `json:"unique"`
Zcbh_pm string `json:"zcbh_pm"`
}
type CIRecordStartup struct {
Bumen string `json:"bumen"` // 部门
Ip string `json:"ip"` // ip
Mac string `json:"mac"` // mac地址
Start_time string `json:"start_time"` // 启动时间
Cpu string `json:"cpu"` // cpu
Disk string `json:"disk"` // 硬盘
Memory string `json:"memory"` // 内存
}
type CIRecord struct {
Bumen string `json:"bumen"` // 部门
Username string `json:"username"` // 姓名
Position string `json:"position"` // 具体位置
Seat string `json:"seat"` // 主机座位坐标
Product_name string `json:"product_name"` // 主机名
Ip string `json:"ip"` // ip
Mac string `json:"mac"` // mac地址
Start_time string `json:"start_time"` // 启动时间
Shutdown_time string `json:"shutdown_time"` // 关机时间
Cpu string `json:"cpu"` // cpu
Disk string `json:"disk"` // 硬盘
Memory string `json:"memory"` // 内存
}
type CIRecordUpdateReq struct {
Ci_id int `json:"ci_id"`
}
type CIRecordShutdown struct {
Shutdown_time string `json:"shutdown_time"` // 关机时间
}
type CIRecorProduct_name struct {
Product_name string `json:"product_name"` // 主机名
}
type CIRecordUsername struct {
Username string `json:"username"` // 姓名
}
func (cir *CIRecordResult) BasicInfo(v string) error {
var err error
cir.Product_name = v
hostnameSplit, err := GetHostnamePart(cir.Product_name)
if err != nil {
return err
}
cir.Position = cir.position(hostnameSplit[0], hostnameSplit[1])
if cir.Position == ERROR {
return fmt.Errorf("主机命令错误")
}
cir.Seat = hostnameSplit[2]
cir.Ci_type = cmdbCITypeComputer
return err
}
func (cir *CIRecordStartup) GetHardWare() {
var wg sync.WaitGroup
wg.Add(3)
// cpu
go func() {
defer wg.Done()
cpuCount, cpuName, cpuCores, cpuLogicalProcessors := getHardwareCPUForPS()
cir.Cpu = fmt.Sprintf("%s * %s %s核 %s线程", cpuCount, cpuName, cpuCores, cpuLogicalProcessors)
}()
// 内存
go func() {
defer wg.Done()
Capacity, Speed, MemoryType, mCount := getHardwareMemoryForPS()
for i := 0; i <= mCount; i++ {
cir.Memory += fmt.Sprintf("%dGB %sMhz %s,", Capacity[i], Speed[i], MemoryType[i])
}
cir.Memory = cir.Memory[0 : len(cir.Memory)-1]
}()
// 硬盘
go func() {
defer wg.Done()
_, Sizen, MediaType, hCount := getHardwareHardDiskForPS(false)
for i := 0; i <= hCount; i++ {
cir.Disk += fmt.Sprintf("%dGB %s,", Sizen[i], MediaType[i])
}
cir.Disk = cir.Disk[0 : len(cir.Disk)-1]
}()
wg.Wait()
}
func (cir *CIRecordResult) position(location, dept string) string {
const cmdbPosition1 string = "7"
const cmdbPosition2 string = "12"
const cmdbPosition3 string = "zhengzhou"
var resutlt string
switch location {
case "NB":
switch dept {
case "JL":
resutlt = cmdbPosition1
case "ZJ":
resutlt = cmdbPosition1
case "MT":
resutlt = cmdbPosition1
case "DD":
resutlt = cmdbPosition1
case "JR":
resutlt = cmdbPosition1
case "TXHD":
resutlt = cmdbPosition1
case "TXMT":
resutlt = cmdbPosition1
case "JS":
resutlt = cmdbPosition1
case "JD":
resutlt = cmdbPosition2
case "HW":
resutlt = cmdbPosition2
case "BGYJ":
resutlt = cmdbPosition2
default:
resutlt = ERROR
}
case "ZZ":
resutlt = cmdbPosition3
default:
resutlt = ERROR
}
return resutlt
}
func (cir *CIRecordStartup) GetDept() (string, error) {
hostnameSplit, err := GetHostnamePart(User_computername)
var result string
if err != nil {
LOG(ERROR, "", err)
return "", err
}
switch hostnameSplit[1] {
case "JL":
result = "巨量组"
case "ZJ":
result = "字节组"
case "MT":
result = "美团组"
case "DD":
result = "滴滴组"
case "JR":
result = "金融组"
case "TXHD":
result = "腾讯互动组"
case "TXMT":
result = "腾讯危机组"
case "JS":
result = "技术组"
case "JD":
result = "京东组"
case "HW":
result = "华为组"
case "BGYJ":
result = "报告研究中心"
default:
result = ERROR
}
return result, nil
}
func (cir *CIRecordResult) String() ([]byte, error) {
return json.Marshal(cir)
}
package public package public
// AD-Control // // other //
const Host_adserver string = "ADSERVER" var Active bool = true
const Host_thserver string = "THSERVER"
const DaemonListen string = ":16823"
const ADServerDaemon string = Host_adserver + DaemonListen
const THServerDaemon string = Host_thserver + DaemonListen
const Version string = "1.10.2"
const Bak_Version string = "1105"
var Active bool = true
const SymbolHostname = "-"
// user // // AD-Control //
var User_computername string = GetEnv("COMPUTERNAME") const Version string = "2.0.0"
var User_homeshare string = GetEnv("HOMESHARE") const Host_adserver string = "ADSERVER"
var User_userdomain string = GetEnv("USERDOMAIN") const Host_thserver string = "THSERVER"
var User_name string = GetEnv("USERNAME") const Host_zzserver string = "ZZSERVER"
var User_dept string = GetEnv("DEPT") const DaemonListen string = ":16823"
var User_tmp string = GetEnv("tmp") const DaemonLogListen string = ":16824"
var User_sid string = Reg_query_key_one(HKCU,`Software\Microsoft\Windows\CurrentVersion\FileAssociations`,"UserSid") const ADServerDaemon string = Host_adserver + DaemonListen
var User_sessionID string = Reg_query_item_one(HKU,User_sid+`\Volatile Environment`) const ADServerLogDaemon string = Host_adserver + DaemonLogListen
//var User_name_display string = GetEnvFqdn("CN") const THServerDaemon string = Host_thserver + DaemonListen
// user //
var User_computername string = GetEnv("COMPUTERNAME")
var User_homeshare string = GetEnv("HOMESHARE")
var User_userdomain string = GetEnv("USERDOMAIN")
var User_name string = GetEnv("USERNAME")
var User_tmp string = GetEnv("tmp")
var User_sid string = reg_query_key_one(HKCU, `Software\Microsoft\Windows\CurrentVersion\FileAssociations`, "UserSid")
var User_sessionID string = Reg_query_item_one(HKU, User_sid+`\Volatile Environment`)
var User_name_display string = GetEnvFqdn("CN")
// SMB Folder// // SMB Folder//
const SMB_adserver string = `\\` + Host_adserver + `\` const SMB_adserver string = `\\` + Host_adserver + `\`
const SMB_ADSoft string = SMB_adserver + `software\` const SMB_ADSoft string = SMB_adserver + `software\`
const SMB_ADMain string = SMB_adserver + `ADMAIN\` const SMB_ADSoftlike string = SMB_ADSoft + "softlike"
var SMB_ADMainDept string = SMB_ADMain + User_dept const SMB_ADSoftApplication string = SMB_ADSoft + `application\`
var SMB_ADMainDeptShare string = SMB_ADMain + User_dept + `\` + "部门共享" const SMB_ADSoftTool string = SMB_ADSoft + `tools\`
const SMB_ADSoftlike string = SMB_ADSoft + "softlike" const SMB_ADSoftOthTool string = SMB_ADSoft + `othtools\`
const SMB_ADSoftApplication string = SMB_ADSoft + `application\` const SMB_ADSoftPlus string = SMB_ADSoft + `plus\`
const SMB_ADSoftTool string = SMB_ADSoft + `tools\`
const SMB_ADSoftOthTool string = SMB_ADSoft + `othtools\`
const SMB_ADSoftPlusSync string = SMB_ADSoft + `plus\sync\`
// Local Folder // // Local Folder //
var Dir_userprofile string = GetEnv("USERPROFILE") var Dir_userprofile string = GetEnv("USERPROFILE")
var Dir_appdata string = GetEnv("appdata") var Dir_appdata string = GetEnv("appdata")
var Dir_tmp string = GetEnv("tmp") var Dir_tmp string = GetEnv("tmp")
var Dir_Windows string = GetEnv("windir") + `\` var Dir_Windows string = GetEnv("windir") + `\`
const Dir_DocuBase string = `C:\Users\Public\Documents\AD-Control\`
const Dir_ADsoftware_local string = `H:\software\softlike\`
const Dir_DCSave string = `D:\DomainUserBackupV2`
var Dir_WeDrive = [2] string {Dir_appdata + `\Tencent\WXWork\Data`,Dir_userprofile + `\Documents\WXWork`}
var Dir_Be = []string {Dir_DocuBase}
var Dir_Sync_Config string = Dir_appdata + `\Sync App Settings\_SYNCAPP\`
// Local File //
var File_Sync_profile string = "default profile.xml"
var File_Sync_profile_full string = Dir_Sync_Config + "default profile.xml"
var File_Sync_settings string = "default settings.xml"
var File_Sync_settings_full string = Dir_Sync_Config + "default settings.xml"
const Dir_ADsoftware_local string = `H:\software\softlike\`
// application //// // application //
const App_adct string = SMB_ADSoftApplication + "adct.exe" const App_adct string = SMB_ADSoftApplication + "adct.exe"
const App_MultiSplit string = SMB_ADSoftOthTool + "win_MultiSplit.exe" const App_MultiSplit string = SMB_ADSoftOthTool + "win_MultiSplit.exe"
const App_SyncExe string = App_Sync + `.exe`
const App_Sync string = `syncappw`
const App_Sync_full string = `C:\Progra~1\zhiwei\AllWay_Sync\Bin\` + App_SyncExe
// reg info // // reg info //
const ( const (
HKCU = iota HKCU = iota
HKLM HKLM
HKU HKU
) )
const reg_LM_ADCONTROL string = `software\AD-Control`
const Reg_Root_ac int = HKLM
const Reg_Root_dc int = HKCU
const Reg_Path_home string = `SOFTWARE\ADControl`
const Reg_Path_home_ac string = Reg_Path_home + `\DomainComputer\` // use for adserver,not for dc
const Reg_Path_home_du string = Reg_Path_home + `\DomainUsers\` // use for adserver,not for dc
const Reg_Path_home_zhu string = Reg_Path_home + `\ZhiWeiUsers\` // use for adserver,not for dc
const Reg_Name_TurnOnTime string = "TurnOnTime"
const Reg_Name_TurnOffTime string = "TurnOffTime"
const Reg_Name_LoginUserName string = "loginUser"
const Reg_Name_LoginTime string = "loginTime"
const Reg_Name_LogOffTime string = "LogOffTime"
const Reg_Name_BackupOverTime string = "BackupOverTime"
const Reg_Name_WeDriveDir string = "WeDriveDir"
const Reg_Name_MACaddress string = "MACaddress"
const Reg_Name_MACAddress string = "MACAddress"
const Reg_Name_PrimaryUser string = "PrimaryUser"
const Reg_Name_PowerStatus string = "PowerStatus"
const Reg_Name_LogStatus string = "LogStatus"
const Reg_Name_BackupVersion string = "BackupVersion"
const Reg_Name_PrimayComputerName string = "PrimayComputerName"
const Reg_Name_BeWakedID string = "BeWakedID"
const Reg_Name_CloseView string = "CloseView"
// reg value // // reg value //
var Reg_Value_WeDriveDir string = Reg_query_key_one(HKCU,Reg_Path_home,Reg_Name_WeDriveDir) const Reg_Key_cmdbtoken string = "cmdb_token"
var Reg_Value_ON string = "ON" const Reg_Value_ON string = "ON"
var Reg_Value_OFF string = "OFF" const Reg_Value_OFF string = "OFF"
var Reg_Value_LogStatus_IN string = "IN"
var Reg_Value_LogStatus_OUT string = "OUT"
// other // // other //
const Link_WxworkBot string = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6` const Link_WxworkBot string = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
const Cmd_c string = "cmd /c " const Cmd_c string = "cmd /c "
const Cmd_k string = "cmd /k " const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start " const Cmd_K_Start string = "cmd /k start "
// wxwork key // // wxwork key //
const WxworkTokenMsgSend string = "AvAQlFNxy1UQB3CjRml3GfKf7Y" const WxworkTokenMsgSend string = "AvAQlFNxy1UQB3CjRml3GfKf7Y"
const WxworkEncodingAseKey string = "AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy" const WxworkEncodingAseKey string = "AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy"
const WxworkReceiverId string = "ww49cfd580625083c9" const WxworkReceiverId string = "ww49cfd580625083c9"
const WxworkCorid string = "ww49cfd580625083c9" const WxworkCorid string = "ww49cfd580625083c9"
const WxworkCorpSecret string = "ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I" const WxworkCorpSecret string = "ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I"
const WxWorkAgentID string = "1000014" const WxWorkAgentID string = "1000014"
// log level //
var Loglevel string = INFO
const INFO string = "info"
const ERROR string = "error"
const DEBUG string = "debug"
const NULL string = ""
// log type //
const CMDB string = "cmdb"
// cmdb //
const cmdbUrl string = "http://192.168.0.21:5000"
const cmdbCITypeComputer string = "28"
const cmdbPass string = `{"password":"3f7eba3920866b2c2375ba61117c42bf","username":"tengfei"}`
...@@ -2,30 +2,27 @@ package public ...@@ -2,30 +2,27 @@ package public
import ( import (
"errors" "errors"
) )
var Error_Lost_Parameter = errors.New("Lost Paramter") var Error_Json_Parse = errors.New("ERROR JSON PARSE")
var Error_Lost_Parameter = errors.New("Lost Paramter")
var Error_Null_Command = errors.New("NULL COMMAND")
var Error_Null_RegQuery = errors.New("Null Reg Query")
var Error_Null_File = errors.New("Not Find File")
var Error_Null_Folder = errors.New("Not File Folder")
var Error_Null_Icon_File = errors.New("Not File Icon File")
var Error_Null_Reg_Query = errors.New("Not Found Reg Query Result")
var Error_Null_Command = errors.New("NULL COMMAND") var Error_Fail_File_Open = errors.New("Fail File Open")
var Error_Null_RegQuery = errors.New("Null Reg Query") var Error_Fail_Token = errors.New("Get Token Fail")
var Error_Null_Folder_WeDrive = errors.New("Not Find Folder WxDrive ") var Error_Fail_File_Write = errors.New("Fail File Write")
var Error_Null_App_Sync = errors.New("Not Find Application AllWay Sync") var Error_Not_Msg = errors.New("isn't defined msg")
var Error_Null_File = errors.New("Not Find File")
var Error_Null_Folder = errors.New("Not File Folder")
var Error_Null_Icon_File = errors.New("Not File Icon File")
var Error_Null_Reg_Query = errors.New("Not Found Reg Query Result")
var Error_Fail_File_Open = errors.New("Fail File Open") var Error_WXWork_Down = errors.New(Error_WXWork_Down_STR)
var Error_Fail_Token = errors.New("Get Token Fail") var Error_WXWork_Down_STR = "后台更新中..."
var Error_Fail_File_Write = errors.New("Fail File Write")
var Error_Fail_TCP_STR = "ERROR"
var Error_Not_Msg = errors.New("isn't defined msg")
var Error_WXWork_Down = errors.New(Error_WXWork_Down_STR) var Error_WXWork_NotDominUser_STR = "您的主机暂时不支持该功能"
var Error_WXWork_Down_STR = "后台错误"
var Error_WXWork_NotDominUser_STR = "您的主机暂时不支持该功能" const Error_CMDB_UPDATE_REQ = "更新失败"
func NewError(s string) error{ const Sccessful_CMDB_UPDATE_REQ = "更新成功"
return errors.New(s)
}
\ No newline at end of file
package public
import (
"bytes"
"encoding/json"
"fmt"
)
// 获取 消息类型
func GetMsgType(b []byte) string {
//{"msgtype":"report","...":"..."}
// 提取第一个冒号后的第二位和第一个逗号的前一位
// 也就是msgtype的内容
return string(b[bytes.IndexByte(b, ':')+2 : bytes.IndexByte(b, ',')-1])
}
// 解析Json 并放到变量中
func ParseJson(unmsg []byte, v interface{}) {
if err := json.Unmarshal(unmsg, v); err != nil {
LOG(ERROR, "Parse Json Error", fmt.Sprintf("%v %v", err, v))
}
}
// Json 转 Byte
func ReParseJson(v *interface{}) []byte {
textbyte, err := json.Marshal(*v)
if err != nil {
LOG(ERROR, "Json to byte Error", fmt.Sprintf("%v %v", err, v))
}
return textbyte
}
...@@ -7,26 +7,26 @@ import ( ...@@ -7,26 +7,26 @@ import (
func LDAP_Get_PCGroup() []string { func LDAP_Get_PCGroup() []string {
l, err := ldap.DialURL("ldap://127.0.0.1:389") l, err := ldap.DialURL("ldap://127.0.0.1:389")
if err != nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
defer l.Close() defer l.Close()
if err = l.Bind(AD_User_zhiwei, "1Q2W3e4r");err != nil { if err = l.Bind(AD_User_zhiwei, "1Q2W3e4r"); err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
searchRequest := ldap.NewSearchRequest( searchRequest := ldap.NewSearchRequest(
"ou=情报部门,dc=zhiweireach,dc=com", "ou=情报部门,dc=zhiweireach,dc=com",
ldap.ScopeWholeSubtree,ldap.NeverDerefAliases, 0, 0, false, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
"(cn=*-PC)", "(cn=*-PC)",
//"(&(objectClass=organizationalPerson))", //"(&(objectClass=organizationalPerson))",
[]string{"cn"}, []string{"cn"},
nil, nil,
) )
sr, err := l.Search(searchRequest) sr, err := l.Search(searchRequest)
if err != nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
pcgroup := make([]string,len(sr.Entries)) pcgroup := make([]string, len(sr.Entries))
for i, entry := range sr.Entries { for i, entry := range sr.Entries {
// 完整输出 entry.DN // 完整输出 entry.DN
// 输出特定目录 entry.GetAttributeValue("cn") // 输出特定目录 entry.GetAttributeValue("cn")
...@@ -34,28 +34,28 @@ func LDAP_Get_PCGroup() []string { ...@@ -34,28 +34,28 @@ func LDAP_Get_PCGroup() []string {
} }
return pcgroup return pcgroup
} }
func LDAP_nameTopinyin(name string) string{ func LDAP_nameTopinyin(name string) string {
l, err := ldap.DialURL("ldap://127.0.0.1:389") l, err := ldap.DialURL("ldap://127.0.0.1:389")
if err != nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
defer l.Close() defer l.Close()
if err = l.Bind(AD_User_zhiwei, "1Q2W3e4r");err != nil { if err = l.Bind(AD_User_zhiwei, "1Q2W3e4r"); err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
searchRequest := ldap.NewSearchRequest( searchRequest := ldap.NewSearchRequest(
//"ou=情报部门,dc=zhiweireach,dc=com", //"ou=情报部门,dc=zhiweireach,dc=com",
"ou=情报部门,dc=zhiweireach,dc=com", "ou=情报部门,dc=zhiweireach,dc=com",
ldap.ScopeWholeSubtree,ldap.NeverDerefAliases, 0, 0, false, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
"(cn="+name+")", "(cn="+name+")",
//"(&(objectClass=organizationalPerson))", //"(&(objectClass=organizationalPerson))",
[]string{"sAMAccountName"}, []string{"sAMAccountName"},
nil, nil,
) )
sr, err := l.Search(searchRequest) sr, err := l.Search(searchRequest)
if err != nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
return sr.Entries[0].GetAttributeValue("sAMAccountName") return sr.Entries[0].GetAttributeValue("sAMAccountName")
} }
\ No newline at end of file
package public
import (
"encoding/json"
"fmt"
"path/filepath"
"runtime"
"strings"
"time"
"github.com/color-master"
)
type logs struct {
Time string `json:"_Time"`
Hook string `json:"_Hook"`
Version string `json:"_Version"`
Host string `json:"_Host"`
Level string `json:"Level"`
MsgType string `json:"MsgType"`
Message string `json:"Message"`
}
func logBase() logs {
var l logs
filename, line, funcname := "???", 0, "???"
pc, filename, line, ok := runtime.Caller(2)
if ok {
funcname = runtime.FuncForPC(pc).Name() // main.(*MyStruct).foo
funcname = filepath.Ext(funcname) // .foo
funcname = strings.TrimPrefix(funcname, ".") // foo
filename = filepath.Base(filename) // /full/path/basename.go => basename.go
}
l.Time = time.Now().Format("2006-01-02 15:04:05 Monday")
l.Hook = fmt.Sprintf("%s:%d:%s", filename, line, funcname)
l.Version = Version
return l
}
func logDeal(level string, l *logs) {
textbyte, err := json.Marshal(l)
if err != nil {
SendWxworkTextToAdmins(err.Error())
}
if DomainComputer() {
SendLog(string(textbyte))
return
}
if DomainCotroller() {
switch level {
// 绿色
case INFO:
color.Info.Println(string(textbyte))
// 红色
case ERROR:
color.Error.Println(string(textbyte))
// 蓝色
case DEBUG:
color.Debug.Println(string(textbyte))
// 绿色
default:
color.Info.Println(string(textbyte))
}
return
}
}
func LOG(level string, msgtype string, args ...interface{}) {
if (Loglevel != DEBUG) && (level == DEBUG) {
return
}
l := logBase()
l.Host = User_computername
l.Level = level
l.MsgType = msgtype
l.Message = fmt.Sprint(fmt.Sprint(args...))
logDeal(level, &l)
}
package public
import (
"log"
"os"
"fmt"
)
var Loger * log.Logger
func NewLoger(s string) * log.Logger{
var Log_file_obj * os.File
var err error
if Log_file_obj,err = os.OpenFile(
s,os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766);
err !=nil && DomainComputer(){
PrintLog(fmt.Errorf("%s %v-%v",s,Error_Fail_File_Open,err))
}
return log.New(Log_file_obj,"",log.LstdFlags)
}
func Sprintf(f string,v ...interface{})string {
return fmt.Sprintf(f,v ...)
}
//
//
// Print Type
//
func PrintLog(v ...interface{}){
log.SetPrefix("Output ")
log.Println(v ...)
}
func PntInfo(v ...interface{}){
Loger.SetPrefix("Info ")
Loger.Println(v ...)
}
func PntInfof(f string,v ...interface{}){
Loger.SetPrefix("Info ")
Loger.Printf(f,v ...)
}
func PntReport(v ...interface{}){
Loger.SetPrefix("Report ")
Loger.Println(v ...)
}
func PntExec(v ...interface{}){
Loger.SetPrefix("Exec ")
Loger.Println(v ...)
}
func PntBackup(v ...interface{}){
Loger.SetPrefix("Bakcup ")
Loger.Println(v ...)
}
func PntError(v ...interface{}){
Loger.SetPrefix("Error ")
PrintLog(v ...)
Loger.Println(v ...)
}
func PntErrorf(f string,v ...interface{}){
Loger.SetPrefix("Error ")
PrintLog(v ...)
Loger.Printf(f,v ...)
}
func PntOth(v ...interface{}){
Loger.SetPrefix("Other ")
Loger.Println(v ...)
}
func PntWol(v ...interface{}){
Loger.SetPrefix("WOL ")
Loger.Println(v ...)
}
func PntWolRemote(v ...interface{}){
Loger.SetPrefix("WOLREMOTE ")
Loger.Println(v ...)
}
func PntSend(v ...interface{}){
Loger.SetPrefix("Send ")
Loger.Println(v ...)
}
func PntWXRec(v ...interface{}){
log.SetPrefix("WXRec ")
log.Println(v ...)
Loger.SetPrefix("WXRec ")
Loger.Println(v ...)
}
func PntWxSend(v ...interface{}){
Loger.SetPrefix("WxSend ")
Loger.Println(v ...)
log.SetPrefix("WxSend ")
log.Println(v ...)
}
package public
import (
"encoding/json"
"bytes"
)
// 获取 消息类型
func GetMsgType(b []byte)string{
//{"msgtype":"report","...":"..."}
// 提取第一个冒号后的第二位和第一个逗号的前一位
// 也就是msgtype的内容
return string(b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1])
}
// 解析Json 并放到变量中
func ParseJson(unmsg []byte,v interface{}){
// 填写
if err := json.Unmarshal(unmsg,v) ;err != nil{
PntError("Parse Json Error",err)
PntError("Parse Json Error",string(unmsg))
}
}
// Json 转 Byte
func ReParseJson(v * interface{}) []byte{
textbyte,err := json.Marshal(*v)
if err !=nil {
PntError("Json to byte Error ",v,err)
}
return textbyte
}
func AutoGetWeDriveDir() (string,error) {
for _,i := range Dir_WeDrive{
if NotExist(i){
continue
}
i += `\`
n := GetNewFolder(i,"Global")
f := i + n + `\WeDrive\知微数据`
if Exist(f){
return f,nil
}
}
return "",Error_Null_Folder_WeDrive
}
func AutoFillInWeDriveDir() {
if RunAsPC(User_name){Exit() }
d := Reg_Query_DC(Reg_Name_WeDriveDir)
if d == "" || NotExist(d){
if a,err := AutoGetWeDriveDir(); err != nil{
SendServerError(err)
} else {
Reg_Write_DC(Reg_Name_WeDriveDir,a)
}
}
}
package public package public
import ( import (
"encoding/json"
"net/http"
"io/ioutil"
"bytes" "bytes"
"encoding/json"
"fmt" "fmt"
"io/ioutil"
"net"
"net/http"
) )
func SendServerReport(s string) { func SendServerReport(s string) {
SendADMsg(Msg_Report,GJreport(s)) SendADMsg(Msg_Report, GJreport(s))
} }
func SendServerExec(v interface{}) { func SendServerExec(v interface{}) {
SendADMsg(Msg_Exec,v) SendADMsg(Msg_Exec, v)
} }
func SendServerError(err error) { func SendServerError(err error) {
SendADMsg(Msg_Error,GJerror(err)) SendADMsg(Msg_Error, GJerror(err))
} }
// base server msg // base server msg
func SendADMsg(msgtype string ,v interface{}){ func SendADMsg(msgtype string, v interface{}) {
SendMsg(ADServerDaemon,msgtype,v) SendMsg(ADServerDaemon, msgtype, v)
} }
func SendTHMsg(msgtype string ,v interface{}){ func SendTHMsg(msgtype string, v interface{}) {
SendMsg(THServerDaemon,msgtype,v) SendMsg(THServerDaemon, msgtype, v)
} }
// base msg // base msg
func SendMsg(server,msgtype string ,v interface{}) { func SendMsg(server, msgtype string, v interface{}) {
//将结构体 转化成 byte // 将结构体 转化成 byte
textbyte,err := json.Marshal(v) textbyte, err := json.Marshal(v)
if err !=nil { if err != nil {
PntError("Json to String Error ",v,err) LOG(ERROR, "Json to byte Error", fmt.Sprintf("%v %v", err, v))
} }
link := fmt.Sprintf("http://%s/%s",server,msgtype) link := fmt.Sprintf("http://%s/%s", server, msgtype)
PntSend(link,string(textbyte)) // 发送数据
//发送数据
resp, err := http.Post( resp, err := http.Post(
link, link,
"application/json; charset=utf-8", "application/json; charset=utf-8",
bytes.NewReader(textbyte)) bytes.NewReader(textbyte))
if err != nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
defer resp.Body.Close() defer resp.Body.Close()
// 读取数据 // 读取数据
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
} }
// 处理数据 // 处理数据
DealMsg(GetMsgType(body),"",body) if len(body) > 0 {
DealMsg(GetMsgType(body), "", body)
}
}
func SendLog(message string) {
conn, err := net.Dial("udp", ADServerLogDaemon)
if err != nil {
SendWxworkTextToAdmins(fmt.Sprintf("主机名:%s\n错误:%s\n发送数据%s", User_computername, err.Error(), message))
}
defer conn.Close()
if _, err := conn.Write([]byte(message)); err != nil {
SendWxworkTextToAdmins(fmt.Sprintf("主机名:%s\n错误:%s\n发送数据%s", User_computername, err.Error(), message))
}
// lineLen := len(message)
// n := 0
// for written := 0; written < lineLen; written += n {
// // 消息长度
// // if lineLen-written > config.SERVER_RECV_LEN {
// // toWrite = line[written : written+config.SERVER_RECV_LEN]
// // } else {
// // toWrite = line[written:]
// // }
// }
} }
// 发送Get请求 // 发送Get请求
func SendGetRequest(link * string) ([]byte,error){ func SendGetRequest(link *string) ([]byte, error) {
resp, err := http.Get(*link) resp, err := http.Get(*link)
if err != nil { if err != nil {
return nil,err return nil, err
} }
defer resp.Body.Close() defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
return body,err return body, err
} }
// 发送 带Data的Post请求 // 发送 带Data的Post请求
func SendPostRequestWithData(link * string,data interface {}) ([]byte,error){ func SendPostRequestWithData(link *string, data interface{}) ([]byte, error) {
resp, err := http.Post( resp, err := http.Post(
*link, *link,
"application/json; charset=utf-8", "application/json; charset=utf-8",
bytes.NewReader(ReParseJson(&data))) bytes.NewReader(ReParseJson(&data)))
if err != nil { if err != nil {
return nil,err return nil, err
} }
defer resp.Body.Close() defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
return body,err return body, err
} }
// 发送 到 微信机器人 // 发送 到 微信机器人
func SendWX(Content string){ func SendWX(Content string) {
if Adserver() { if Adserver() {
if GetEnv("sendwx")!="1"{return} if GetEnv("sendwx") != "1" {
return
}
} }
// Content不支持发送Json, // Content不支持发送Json,
w := []byte(` w := []byte(`
{ {
"msgtype": "text", "msgtype": "text",
"text": { "text": {
"content": "`+Content+`" "content": "` + Content + `"
} }
}`) }`)
http.Post(Link_WxworkBot,"application/json; charset=utf-8",bytes.NewBuffer(w)) http.Post(Link_WxworkBot, "application/json; charset=utf-8", bytes.NewBuffer(w))
} }
func SendWxworkTextToAUser(id,text string) error{ func SendWxworkTextToAUser(id, text string) error {
// 获取 最新 token // 获取 最新 token
t,err := GetWXWorkToken() t, err := GetWXWorkToken()
if err !=nil{ if err != nil {
return err return err
} }
// 初始化 消息推送 结构体 // 初始化 消息推送 结构体
var wsmt WxSendMsgText var wsmt WxSendMsgText
wsmt.Init() wsmt.Init()
wsmt.Touser=id wsmt.Touser = id
wsmt.Text.Content=text wsmt.Text.Content = text
link:=fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s",t) link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s", t)
// 发送 Post 请求 // 发送 Post 请求
res,err := SendPostRequestWithData(&link,&wsmt) res, err := SendPostRequestWithData(&link, &wsmt)
if err !=nil { if err != nil {
return err return err
} }
// 解析 Post 响应 数据 // 解析 Post 响应 数据
var wsmr WxSendMsgRec var wsmr WxSendMsgRec
ParseJson(res,&wsmr) ParseJson(res, &wsmr)
if wsmr.ErrCode != 0{ if wsmr.ErrCode != 0 {
return NewError(wsmr.ErrMsg) return fmt.Errorf("%s", wsmr.ErrMsg)
} }
return nil return nil
} }
func SendWxworkTextToAUserWithName(name ,id,text string) error{ func SendWxworkTextToAdmins(text string) error {
PntWxSend(name,text) return SendWxworkTextToAUser("TaoTengFei", text)
return SendWxworkTextToAUser(id,text)
} }
package public
import (
"strings"
)
var punctuationMap = map[rune]rune{
8216: 39, // '
8217: 39, // '
8220: 34, // "
8221: 34, // "
12290: 46, // .
12304: 91, // [
12305: 93, // ]
65281: 33, // !
65288: 40, // (
65289: 41, // )
65292: 44, // ,
65306: 58, // :
65307: 59, // ;
65311: 63, // ?
}
func ToEnglishSymbol(text string) string {
text = strings.Map(func(r rune) rune {
if v, ok := punctuationMap[r]; ok {
return v
}
return r
}, text)
return text
}
package public package public
import ( import (
"time"
"math/rand" "math/rand"
"time"
) )
// //
// //
// time func // time func
...@@ -15,27 +14,34 @@ import ( ...@@ -15,27 +14,34 @@ import (
func NowTimestamp() int64 { func NowTimestamp() int64 {
return time.Now().Unix() return time.Now().Unix()
} }
func NowTimestampNano() int64 {
return time.Now().UnixNano()
}
// 将时间戳解析成字符串 // 将时间戳解析成字符串
func UnixTimeParse(t *int64) string { func UnixTimeParse(t *int64) string {
return time.Unix(*t,0).String() return time.Unix(*t, 0).String()
} }
// 获取 字符串格式化 时间 // 获取 字符串格式化 时间
func GetStrTime() string{ func GetNowTimeString() string {
return time.Now().String() return time.Now().Format("2006-01-02 15:04:05 Monday")
} }
// 输出当前小时 // 输出当前小时
func GetHour() int{ func GetHour() int {
return time.Now().Hour() return time.Now().Hour()
} }
// 输出当前小时 // 输出当前小时
func GetDateHour() (int,int) { func GetDateHour() (int, int) {
t:=time.Now() t := time.Now()
_,_,d := t.Date() _, _, d := t.Date()
h,_,_ := t.Clock() h, _, _ := t.Clock()
return d,h return d, h
} }
func ParseTime(s string) (time.Time,error) { func ParseTime(s string) (time.Time, error) {
return time.Parse("2006-01-02 15:04:05.999999999 -0700 MST",s) return time.Parse("2006-01-02 15:04:05 Monday", s)
} }
// //
...@@ -44,16 +50,18 @@ func ParseTime(s string) (time.Time,error) { ...@@ -44,16 +50,18 @@ func ParseTime(s string) (time.Time,error) {
// //
// 返回 随机数 // 返回 随机数
func Rand(i * int)int{ func Rand(i *int) int {
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
return rand.Intn(*i) return rand.Intn(*i)
} }
// 程序挂起 i 秒 // 程序挂起 i 秒
func Delay(i int){ func Delay(i int) {
<-time.After(time.Duration(i)*time.Second) <-time.After(time.Duration(i) * time.Second)
} }
// 随机挂起 x 秒 // 随机挂起 x 秒
func RandDelay(i int){ func RandDelay(i int) {
ri := Rand(&i) ri := Rand(&i)
time.Sleep(time.Duration(ri) * time.Second) time.Sleep(time.Duration(ri) * time.Second)
} }
package public package public
import(
import (
"fmt"
"strings" "strings"
) )
// //
// //
// AD User env // // AD User env //
// //
const AD_User_main_admin string = "zhiweiadserver" const AD_User_main_admin string = "zhiweiadserver"
const AD_User_tengfei string = "tengfei" const AD_User_tengfei string = "tengfei"
const AD_User_taotengfei string = "taotengfei" const AD_User_taotengfei string = "taotengfei"
const AD_User_zhiwei string = "zhiwei@zhiweireach.com" const AD_User_zhiwei string = "zhiwei@zhiweireach.com"
// //
// //
// User // User
// //
func GetPrimaryUser(pc string) string { func GetPrimaryUser(pc string) string {
name := Reg_query_key_one( // coding
Reg_Root_ac, // LOG(INFO, "GetPrimaryUser", fmt.Sprintf("pc:%s,name:%s", pc, name))
Reg_Path_home_ac + pc, return ""
Reg_Name_PrimaryUser)
PntInfo(pc,name)
return name
} }
func IsPrimaryUser(s string) bool{ func IsPrimaryUser(s string) bool {
if strings.Index(s,"zhiwei") == -1{ if strings.Index(s, "zhiwei") == -1 {
return true return true
} }
return false return false
} }
func AdminUser( user * string )bool{ func AdminUser(user *string) bool {
switch *user{ switch *user {
case AD_User_taotengfei: case AD_User_taotengfei:
return true return true
case AD_User_tengfei: case AD_User_tengfei:
...@@ -45,49 +42,57 @@ func AdminUser( user * string )bool{ ...@@ -45,49 +42,57 @@ func AdminUser( user * string )bool{
} }
return false return false
} }
func TheUser(s string)bool{
if s == User_name || AdminUser(&s) { return true} func PublicUser() bool {
return false if strings.Index(User_name_display, "专用账户") != -1 {
}
func RunAsUser(s string)bool{
if s[len(s)-1] != '$' {
return true
} else {
return false
}
}
func RunAsPC(s string)bool{
if s[len(s)-1] == '$' {
return true return true
} else {
return false
} }
return false
} }
// //
// //
// If computer // If computer
// //
func DomainComputer() bool{ func DomainComputer() bool {
if Host_adserver != User_computername {return true} return !DomainCotroller()
return false
} }
func Adserver() bool{ func Adserver() bool {
if Host_adserver == User_computername {return true} if Host_adserver == User_computername {
return true
}
return false return false
} }
func BeSecNetwork(hostname * string) bool{ func DomainCotroller() bool {
var r bool
switch User_computername {
case Host_adserver:
r = true
case Host_thserver:
r = true
case Host_zzserver:
r = true
}
return r
}
func BeSecNetwork(hostname *string) bool {
//自动转大写 //自动转大写
*hostname = strings.ToUpper(*hostname) *hostname = strings.ToUpper(*hostname)
//京东和HB组报告研究中心组,是第二个网络 //京东和HB组报告研究中心组,是第二个网络
if strings.HasPrefix(*hostname,"HB") || strings.HasPrefix(*hostname,"JD") || strings.HasPrefix(*hostname,"BGYJZX"){ if strings.HasPrefix(*hostname, "HB") || strings.HasPrefix(*hostname, "JD") || strings.HasPrefix(*hostname, "BGYJZX") {
return true return true
} }
return false return false
} }
\ No newline at end of file func GetHostnamePart(hostname string) ([]string, error) {
n := strings.Split(strings.ToUpper(hostname), SymbolHostname)
if len(n) != 4 {
return nil, fmt.Errorf("错误的主机格式:%s", hostname)
}
return n, nil
}
package public package public
import ( import (
"bytes" "bytes"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
"net" "net"
"strings" "strings"
) )
// 源码地址 // 源码地址
// https://github.com/zzustu/wol // https://github.com/zzustu/wol
// 网络唤醒魔包技术白皮书地址 // 网络唤醒魔包技术白皮书地址
// https://www.amd.com/system/files/TechDocs/20213.pdf // https://www.amd.com/system/files/TechDocs/20213.pdf
func Wol_enter(pc string, mac *string) {
LOG(INFO, "WOL", fmt.Sprintf("pc:%s,mac:%s", pc, *mac))
func Wol_enter(pc string,mac *string ){ if err := wol(*mac); err != nil {
LOG(ERROR, NULL, err)
// 如果是704,且只有主控进行唤醒操作
if BeSecNetwork(&pc) && Adserver(){
SendTHMsg(Msg_Wake,GJwake(pc,*mac))
// 否则本地直接唤醒(用于辅控在其他的网络唤醒)
// 如果测试其他网络的滑行情况,需要注释else代码块
}else {
PntWol(pc,*mac)
if err := wol(*mac); err != nil{
PntError(err)
}
} }
// 如果是704,且只有主控进行唤醒操作
// if BeSecNetwork(&pc) && Adserver(){
// SendTHMsg(Msg_Wake,GJwake(pc,*mac))
// // 否则本地直接唤醒(用于辅控在其他的网络唤醒)
// // 如果测试其他网络的滑行情况,需要注释else代码块
// }else {
// PntWol(pc,*mac)
// if err := wol(*mac); err != nil{
// LOG(ERROR,NULL,err)
// }
// }
} }
func wol(mac string) error{ func wol(mac string) error {
hw := strings.Replace(strings.Replace(mac, ":", "", -1), "-", "", -1)
if len(hw) != 12 {
return fmt.Errorf("MAC: [%s] 输入不正确.\n", mac)
}
hw := strings.Replace(strings.Replace(mac, ":", "", -1), "-", "", -1) macHex, err := hex.DecodeString(hw)
if len(hw) != 12 { if err != nil {
return fmt.Errorf("MAC: [%s] 输入不正确.\n", mac) return fmt.Errorf("MAC: [%s] 输入不正确.\n", mac)
} }
macHex, err := hex.DecodeString(hw) // 广播MAC地址 FF:FF:FF:FF:FF:FF
if err != nil { var bcast = []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
return fmt.Errorf("MAC: [%s] 输入不正确.\n", mac) var buff bytes.Buffer
} buff.Write(bcast)
for i := 0; i < 16; i++ {
// 广播MAC地址 FF:FF:FF:FF:FF:FF buff.Write(macHex)
var bcast = []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} }
var buff bytes.Buffer
buff.Write(bcast) // 获得唤醒魔包
for i := 0; i < 16; i++ { mp := buff.Bytes()
buff.Write(macHex) if len(mp) != 102 {
} return fmt.Errorf("MAC: [%s] 输入不正确.\n", mac)
}
// 获得唤醒魔包
mp := buff.Bytes() return sendMagicPacket(mp, "")
if len(mp) != 102 {
return fmt.Errorf("MAC: [%s] 输入不正确.\n", mac)
}
return sendMagicPacket(mp, "")
} }
// 向指定网卡发送唤醒魔包 // 向指定网卡发送唤醒魔包
func sendMagicPacket(mp []byte, nic string)error{ func sendMagicPacket(mp []byte, nic string) error {
sender := net.UDPAddr{} sender := net.UDPAddr{}
if len(nic) != 0 { if len(nic) != 0 {
ip, err := interfaceIPv4ByName(nic) ip, err := interfaceIPv4ByName(nic)
if err != nil { if err != nil {
return fmt.Errorf("网卡[%s]错误: %s", nic, err) return fmt.Errorf("网卡[%s]错误: %s", nic, err)
} }
sender.IP = ip sender.IP = ip
} }
target := net.UDPAddr{ target := net.UDPAddr{
IP: net.IPv4bcast, IP: net.IPv4bcast,
} }
conn, err := net.DialUDP("udp", &sender, &target) conn, err := net.DialUDP("udp", &sender, &target)
if err != nil { if err != nil {
return fmt.Errorf("创建UDP错误:%v", err) return fmt.Errorf("创建UDP错误:%v", err)
} }
defer func() { defer func() {
_ = conn.Close() _ = conn.Close()
}() }()
_, err = conn.Write(mp) _, err = conn.Write(mp)
if err != nil { if err != nil {
return fmt.Errorf("唤醒失败:[%s]", err) return fmt.Errorf("唤醒失败:[%s]", err)
} else { } else {
return nil return nil
} }
} }
// 通过网卡名称获取该网卡绑定的IPv4 // 通过网卡名称获取该网卡绑定的IPv4
func interfaceIPv4ByName(nic string) (net.IP, error) { func interfaceIPv4ByName(nic string) (net.IP, error) {
inter, err := net.InterfaceByName(nic) inter, err := net.InterfaceByName(nic)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// 检查网卡是否正在工作 // 检查网卡是否正在工作
if (inter.Flags & net.FlagUp) == 0 { if (inter.Flags & net.FlagUp) == 0 {
return nil, errors.New("网卡未工作") return nil, errors.New("网卡未工作")
} }
addrs, err := inter.Addrs() addrs, err := inter.Addrs()
if err != nil { if err != nil {
return nil, err return nil, err
} }
for _, addr := range addrs { for _, addr := range addrs {
if ip, ok := addr.(*net.IPNet); ok { if ip, ok := addr.(*net.IPNet); ok {
if ipv4 := ip.IP.To4(); ipv4 != nil { if ipv4 := ip.IP.To4(); ipv4 != nil {
return ipv4, nil return ipv4, nil
} }
} }
} }
return nil, errors.New("找不到网卡绑定的IP") return nil, errors.New("找不到网卡绑定的IP")
} }
\ No newline at end of file
package public package public
import(
"encoding/xml" import (
"net/url"
"AD-Control-Golang/wxbizmsgcrypt" "AD-Control-Golang/wxbizmsgcrypt"
"encoding/xml"
"fmt" "fmt"
"net/url"
) )
func ParseWX(d string, byteBody *[]byte) MJwxwork {
func ParseWX(d string,byteBody* []byte) MJwxwork{
var err error var err error
var wxmsg wxXml var wxmsg wxXml
var w MJwxwork var w MJwxwork
// 建立 企业微信 加密方法 // 建立 企业微信 加密方法
wxcpt := wxbizmsgcrypt.NewWXBizMsgCrypt(WxworkTokenMsgSend, WxworkEncodingAseKey, WxworkReceiverId, wxbizmsgcrypt.XmlType) wxcpt := wxbizmsgcrypt.NewWXBizMsgCrypt(WxworkTokenMsgSend, WxworkEncodingAseKey, WxworkReceiverId, wxbizmsgcrypt.XmlType)
// 解析 地址 参数 // 解析 地址 参数
// ?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3&timestamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D // ?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3&timestamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
m,_ := url.ParseQuery(d) m, _ := url.ParseQuery(d)
// 验证消息 // 验证消息
// res, cryptErr := wxcpt.VerifyURL(m["msg_signature"][0],m["timestamp"][0], m["nonce"][0],m["echostr"][0]) // res, cryptErr := wxcpt.VerifyURL(m["msg_signature"][0],m["timestamp"][0], m["nonce"][0],m["echostr"][0])
// if nil != cryptErr { // if nil != cryptErr {
// PrintLog("verifyUrl fail", cryptErr) // LogInfo("verifyUrl fail", cryptErr)
// } // }
// PrintLog("verifyUrl success code:", string(res)) // LogInfo("verifyUrl success code:", string(res))
// fmt.Fprintf(w,string(res)) // fmt.Fprintf(w,string(res))
// return // return
...@@ -36,35 +36,34 @@ func ParseWX(d string,byteBody* []byte) MJwxwork{ ...@@ -36,35 +36,34 @@ func ParseWX(d string,byteBody* []byte) MJwxwork{
m["nonce"][0], m["nonce"][0],
*byteBody) *byteBody)
if err != nil { if err != nil {
PntError("DecryptMsg fail", cerr) LOG(ERROR, NULL, "DecryptMsg fail", cerr)
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Down_STR
return w return w
} }
// 解析具体消息 // 解析具体消息
if nil != xml.Unmarshal(msg,&wxmsg){ if nil != xml.Unmarshal(msg, &wxmsg) {
PntError("Unmarshal fail") LOG(ERROR, NULL, "Unmarshal fail")
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Down_STR
return w return w
} }
// 获取 查阅同事的token // 获取 查阅同事的token
wtBricklayer,err := GetWXWorkToken() wtBricklayer, err := GetWXWorkToken()
if err != nil{ if err != nil {
PntError(err) LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Down_STR
return w return w
} }
// 查询 姓名 // 查询 姓名
name,err := GetBricklayerName(wtBricklayer,wxmsg.FromUsername) name, err := GetBricklayerName(wtBricklayer, wxmsg.FromUsername)
if err !=nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Down_STR
return w return w
} }
// 企业微信 消息 处理 // 企业微信 消息 处理
// wxmsg.Content是接收到的文本消息ID // wxmsg.Content是接收到的文本消息ID
// wxmsg.EventKey是菜单事件 // wxmsg.EventKey是菜单事件
...@@ -75,9 +74,8 @@ func ParseWX(d string,byteBody* []byte) MJwxwork{ ...@@ -75,9 +74,8 @@ func ParseWX(d string,byteBody* []byte) MJwxwork{
w.Name = name w.Name = name
w.Content = wxmsg.Content w.Content = wxmsg.Content
return w
// 先回复空,再异步发送处理结果 // 先回复空,再异步发送处理结果
return w
// // 建立 回复消息模板 // // 建立 回复消息模板
// xml,t,nonce := wxmsg.createXML(result) // xml,t,nonce := wxmsg.createXML(result)
...@@ -87,57 +85,57 @@ func ParseWX(d string,byteBody* []byte) MJwxwork{ ...@@ -87,57 +85,57 @@ func ParseWX(d string,byteBody* []byte) MJwxwork{
// nonce := strconv.Itoa(t.Nanosecond()) // nonce := strconv.Itoa(t.Nanosecond())
// timestamp := strconv.FormatInt(t.Unix(),10) // timestamp := strconv.FormatInt(t.Unix(),10)
// wxmsg.Content = res // wxmsg.Content = res
// xml,err := xml.Marshal(&wxmsg) // xml,err := xml.Marshal(&wxmsg)
// if err != nil { // if err != nil {
// PntError(err) // LOG(ERROR,NULL,err)
// } // }
// return string(xml),timestamp,nonce // return string(xml),timestamp,nonce
// } // }
// // 加密消息 // // 加密消息
// cryptMsg, cryptErr := wxcpt.EncryptMsg(xml, t, nonce) // cryptMsg, cryptErr := wxcpt.EncryptMsg(xml, t, nonce)
// if nil != cryptErr { // if nil != cryptErr {
// PntError("DecryptMsg fail", cryptErr) // LOG(ERROR,NULL,"DecryptMsg fail", cryptErr)
// return Error_WXWork_Down_STR // return Error_WXWork_Down_STR
// } // }
// return string(cryptMsg) // return string(cryptMsg)
} }
// 读取企业通讯录的成员信息 // 读取企业通讯录的成员信息
// 官方说明: https://work.weixin.qq.com/api/doc/90000/90135/90196 // 官方说明: https://work.weixin.qq.com/api/doc/90000/90135/90196
func GetBricklayerName(token, userid string) (string,error) { func GetBricklayerName(token, userid string) (string, error) {
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",token,userid) link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s", token, userid)
data,err := SendGetRequest(&link) data, err := SendGetRequest(&link)
if err !=nil { if err != nil {
PntError(err) LOG(ERROR, NULL, err)
return "",Error_WXWork_Down return "", Error_WXWork_Down
} }
var bi wxJsonBricklayerInfo var bi wxJsonBricklayerInfo
ParseJson(data,&bi) ParseJson(data, &bi)
if bi.Errcode !=0 { if bi.Errcode != 0 {
PntError(bi.Errmsg) LOG(ERROR, NULL, bi.Errmsg)
return "",Error_WXWork_Down return "", Error_WXWork_Down
} }
return bi.Name,nil return bi.Name, nil
} }
func GetWXWorkToken() (string,error) { func GetWXWorkToken() (string, error) {
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",WxworkCorid,WxworkCorpSecret) link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", WxworkCorid, WxworkCorpSecret)
data,err := SendGetRequest(&link) data, err := SendGetRequest(&link)
if err !=nil { if err != nil {
return "",err return "", err
} }
var wt WxToken var wt WxToken
ParseJson(data,&wt) ParseJson(data, &wt)
if wt.Errcode== 0 { if wt.Errcode == 0 {
return wt.Access_token,nil return wt.Access_token, nil
} else { } else {
PntError(err) LOG(ERROR, NULL, err)
return "",Error_Fail_File_Write return "", Error_Fail_File_Write
} }
} }
\ No newline at end of file
...@@ -10,59 +10,73 @@ void getMouse() ...@@ -10,59 +10,73 @@ void getMouse()
*/ */
import "C" import "C"
import ( import (
"github.com/lxn/walk"
pub "AD-Control-Golang/public" pub "AD-Control-Golang/public"
"fmt"
"os"
"github.com/lxn/walk"
) )
func GetMousePos() (int,int) { const INFO = pub.INFO
const ERROR = pub.ERROR
const NULL = pub.NULL
// 由windows SDK(C语言)获取鼠标坐标
func GetMousePos() (int, int) {
C.getMouse() C.getMouse()
x :=int(C.point.x) x := int(C.point.x)
y := int(C.point.y) y := int(C.point.y)
return x,y return x, y
} }
func userInit() string{ // Users程序初始化函数
pub.Loger = pub.NewLoger(pub.Dir_appdata + `\users.log`) func userInit() string {
pub.PntInfo("start users!")
pub.Reg_Exist_item(pub.HKCU,pub.Reg_Path_home)
userEnvInit()
// 获取 图标文件 路径 // 获取并返回 图标文件 路径
var icoDir =[]string { var icoDir = []string{
`AD-Control.ico`, `AD-Control.ico`,
pub.Dir_tmp + `\AD-Control.ico`,
`C:\windows\system32\AD-Control.ico`, `C:\windows\system32\AD-Control.ico`,
`C:\Users\Public\Documents\AD-Control\AD-Control.ico`} `C:\Users\Public\Documents\AD-Control\AD-Control.ico`}
for _,i := range icoDir{ for _, i := range icoDir {
if pub.Exist(i){ if pub.Exist(i) {
return i return i
} }
} }
pub.SendServerError(pub.Error_Null_Icon_File) pub.LOG(ERROR, "ICON", fmt.Sprintf("主机名:%s\n错误:%s", pub.User_computername, pub.Error_Null_Icon_File))
return "" return ""
} }
func menuInit(ni * walk.NotifyIcon){
// 菜单初始化
// 这些函数位于menu.go
func menuInit(ni *walk.NotifyIcon) {
menuInitName(ni)
menuInitAccountManager(ni)
menuInitHostManager(ni)
menuInitPower(ni) menuInitPower(ni)
menuInitTools(ni)
menuInitFileShares(ni) menuInitFileShares(ni)
menuInitMyShares(ni) menuInitTools(ni)
} }
func isActive(){
// 鼠标活动检测
// 检测方式,每隔一小时判断鼠标坐标是否与之前相
func isActive() {
for { for {
d,h := pub.GetDateHour() d, h := pub.GetDateHour()
ox,oy := GetMousePos() ox, oy := GetMousePos()
pub.Delay(3602) pub.Delay(3602)
// 新的一天 // 新的一天
// 如果是早上9点,重置鼠标活动检测状态
if d == 9 { if d == 9 {
pub.Active = true pub.Active = true
} }
// 非工作时间的新的一小时 // 非工作时间的新的一小时
if (h >=19 || h<8) && pub.Active{ if (h >= 19 || h < 8) && pub.Active {
x,y := GetMousePos() x, y := GetMousePos()
// 如果处于闲置状态 // 如果处于闲置状态
if ox == x && oy == y { if ox == x && oy == y {
...@@ -72,52 +86,60 @@ func isActive(){ ...@@ -72,52 +86,60 @@ func isActive(){
} }
} }
} }
func userEnvInit(){
if pub.Reg_Query_DC(pub.Reg_Name_CloseView) != pub.Reg_Value_ON { // 用户环境初始化(对于新用户)
pub.Execcmd_nowait(pub.Cmd_c + pub.SMB_ADSoftTool+`【修复】关闭excel和word保护视图.bat`) func userEnvInit() {
pub.Reg_Write_DC(pub.Reg_Name_CloseView,pub.Reg_Value_OFF)
} // 关闭保护视图
// if pub.Reg_Query_DC(pub.Reg_Name_CloseView) != pub.Reg_Value_ON {
// pub.Execcmd_nowait(pub.Cmd_c + pub.SMB_ADSoftTool + `【修复】关闭excel和word保护视图.bat`)
// pub.Reg_Write_DC(pub.Reg_Name_CloseView, pub.Reg_Value_ON)
// }
} }
func main() { func main() {
if pub.Adserver() {
os.Exit(-1)
}
// 用户 初始化 // 用户 初始化
icodir := userInit() icodir := userInit()
userEnvInit()
go isActive() go isActive()
// 程序 初始化 // 程序 初始化
mw,err := walk.NewMainWindow() mw, err := walk.NewMainWindow()
if err != nil { if err != nil {
pub.PntError(err) pub.LOG(ERROR, NULL, err)
} }
// 图标资源 初始化 // 图标资源 初始化
icon, err := walk.Resources.Icon(icodir) icon, err := walk.Resources.Icon(icodir)
if err != nil { if err != nil {
pub.PntError(err) pub.LOG(ERROR, NULL, err)
} }
// 后台图标应用 初始化 // 后台图标应用 初始化
ni, err := walk.NewNotifyIcon(mw) ni, err := walk.NewNotifyIcon(mw)
if err != nil { if err != nil {
pub.PntError(err) pub.LOG(ERROR, NULL, err)
} }
defer ni.Dispose() defer ni.Dispose()
// Set the icon and a tool tip text. // Set the icon and a tool tip text.
if err := ni.SetIcon(icon); err != nil { if err := ni.SetIcon(icon); err != nil {
pub.PntError(err) pub.LOG(ERROR, NULL, err)
}
if err := ni.SetToolTip("Click for info or use the context menu to exit."); err != nil {
pub.PntError(err)
} }
menuInit(ni) menuInit(ni)
// The notify icon is hidden initially, so we have to make it visible. // The notify icon is hidden initially, so we have to make it visible.
if err := ni.SetVisible(true); err != nil { if err := ni.SetVisible(true); err != nil {
pub.PntError(err) pub.LOG(ERROR, NULL, err)
} }
pub.MsgAdvUI(ni, "运维小工具已运行")
pub.LOG(INFO, NULL, "start!")
// 循环 运行窗体 // 循环 运行窗体
mw.Run() mw.Run()
} }
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