Commit 8d592ff9 by 陶腾飞

v1.0:强制备份用文件,输出日志并由filebeat发送到elk,修复一堆错误

parent 120e6a71
......@@ -2,3 +2,4 @@
*.ps1
/*test
/*.exe
/logs
\ No newline at end of file
No preview for this file type
No preview for this file type
package main
import (
"AD-Control/public"
"time"
"flag"
)
func main(){
var reportText = flag.String(public.Msg_Report,"","report to AD")
public.Loger = public.NewLoger(public.Dir_tmp + `\adct.log`)
var backupText = flag.String(public.Msg_Backup,"","backup status to AD")
var reportText = flag.String(public.Msg_Report,"","report to AD")
var execText = flag.String(public.Msg_Exec,"","exec to LocalDaemon")
var regText = flag.String(public.Msg_Reg,"","mod reg")
var userText = flag.String("user","","who is running me")
var wolmacText = flag.String("wolmac","","input mac address for wake pc")
var woluserText = flag.String("woluser","","input name for walk pc")
......@@ -22,12 +25,14 @@ func main(){
if *reportText != "" { flag_report(reportText,userText)}
if *backupText != "" { flag_bakcup(backupText)}
if *execText != "" { flag_exec(execText)}
if *regText != "" { flag_reg(regText)}
if *wolmacText != "" { flag_wolmac(wolmacText)}
if *woluserText != "" { flag_woluser(woluserText)}
return
}
func flag_report(s *string,user * string){
switch *s {
case public.Msg_Report_UserStart:
public.Reg_Write_DC(
......@@ -36,85 +41,65 @@ func flag_report(s *string,user * string){
public.Reg_Write_DC(
public.Reg_Name_loginTime,
public.GetStrTime())
public.SendServer(public.GJreport(*s,*user))
case public.Msg_Report_StartBak:
lastLoginUser := public.Reg_Query_DC(public.Reg_Name_loginUserName)
lastBackupUser := public.Reg_Query_DC(public.Reg_Name_BackupUserName)
lasttime := public.Reg_Query_DC(public.Reg_Name_BackupOverTime)
var name string
if lastBackupUser == ""{
if lastLoginUser == ""{
return
} else {
name = lastLoginUser
}
}else{
name = lastBackupUser
}
var dt public.DoTime
dt.Str = lasttime
// 如果不存在上次登录 或者 超过5小时备份时间
if dt.BeforeHour(5){
var name string = public.Reg_Query_DC(public.Reg_Name_loginUserName)
public.SendServer(public.GJreport(public.Msg_Report_StartBak,name))
}
case public.Msg_Report_OverBak:
public.Reg_Write_DC(public.Reg_Name_loginUserName,*user)
var name string = public.Reg_Query_DC(public.Reg_Name_loginUserName)
public.Reg_Write_DC(public.Reg_Name_BackupUserName,name)
public.Reg_Write_DC(public.Reg_Name_BackupOverTime,public.GetStrTime())
public.SendServer(public.GJreport(public.Msg_Report_OverBak,name))
}
public.SendServer(public.GJreport(*s,*user))
}
func flag_bakcup(s *string){
;
}
func flag_exec(s * string){
public.SendServerExec(*s)
}
func flag_reg(s * string){
;
}
func flag_wolmac(mac * string){
if err := public.Wol(*mac); err != nil{
public.PrintLog(err)
public.PntWol(err)
} else {
public.PrintLog(*mac)
public.PntWol(*mac)
}
}
func flag_woluser(user * string){
public.PrintLog("暂未开发")
public.PntWol("暂未开发")
}
func flag_hour(){
nh := time.Now().Hour()
nh := public.GetHour()
switch nh{
case 0:
shutdown()
public.SendServerExec(public.Msg_Exec_CloseWindows)
break
case 1:
shutdown()
public.SendServerExec(public.Msg_Exec_CloseWindows)
break
case 2:
shutdown()
public.SendServerExec(public.Msg_Exec_CloseWindows)
break
case 3:
shutdown()
public.SendServerExec(public.Msg_Exec_CloseWindows)
break
case 4:
shutdown()
break
case 5:
shutdown()
public.SendServerExec(public.Msg_Exec_CloseWindows)
break
case 6:
default :
break
}
}
\ No newline at end of file
func shutdown(){
public.MsgBox(`5分钟后,即将关机,或者运行Z:\tools\【工具】取消关机.bat`)
public.Execcmd_nowait("shutdown -s -t 300")
}
func reboot(){
public.MsgBox(`5分钟后,即将重启,或者运行Z:\tools\【工具】取消关机.bat`)
public.Execcmd_nowait("shutdown -r -t 300")
}
\ No newline at end of file
No preview for this file type
......@@ -10,16 +10,13 @@ import (
// 守护进程 初始化
func daemonInit(){
// 1 创建文件夹
for _,i := range public.User_Dir_Be{
for _,i := range public.Dir_Be{
if public.NotExist(i){
public.Mkdir(i)
}
}
public.PrintLog(public.Msg_Report_DaemonStart)
if adserver() {
if public.Adserver() {
// 2 初始化 微盘复制状态
public.CopyStatusWeDrive = make(map[string]bool)
public.CopyStatusWeDrive[public.Zhiwei_Dept_HB] = true
......@@ -31,10 +28,16 @@ func daemonInit(){
public.CopyStatusWeDrive[public.Zhiwei_Dept_BGYJZX] = true
public.CopyStatusWeDrive[public.Zhiwei_Dept_TECH] = true
// 日志文件位置:主控源文件的源文件目录
public.Loger = public.NewLoger(`C:\Users\Administrator\go\src\AD-Control\logs\daemon.log`)
} else {
// 2 发送 Daemon Start
// 日志文件位置:域计算机的备份目录:C:\windows\temp
public.Loger = public.NewLoger(public.Dir_tmp + `\daemon.log`)
// 发送 Daemon Start
public.SendServerReport(public.Msg_Report_DaemonStart)
}
}
// 守护进程 运行
......@@ -42,18 +45,15 @@ func deamonRun(){
daemonHost := public.User_computername
listener, err := net.Listen("tcp", public.DaemonListen)
if err != nil {
public.PrintLog("Listen Error ", err)
public.PntInfo("Listen Error ", err)
return
}
defer listener.Close()
for{
//public.PrintLog(daemonHost," Conn Listen")
if conn, err := listener.Accept(); err == nil {
// 新建 读取流
if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(public.EndSign) ; cerr != io.EOF {
// 测试消息流
//public.PrintLog(string(bmsg))
// 获取ip
ip := public.GetConnIP(conn.RemoteAddr())
......@@ -67,15 +67,15 @@ func deamonRun(){
// 写入连接
conn.Write(rec)
}else{
public.PrintLog(daemonHost," Conn Read Error ", cerr)
public.PntInfo(daemonHost," Conn Read Error ", cerr)
}
// 关闭连接
if err := conn.Close() ; err!= nil{
public.PrintLog(err)
public.PntInfo(err)
}
continue
}else{
public.PrintLog(daemonHost," Listen Error ", err)
public.PntInfo(daemonHost," Listen Error ", err)
}
}
......@@ -85,11 +85,4 @@ func main() {
daemonInit()
deamonRun()
}
func adserver() bool{
if public.Env_MainADHostname == public.User_computername {return true}
return false
}
func notadserver() bool{
if public.Env_MainADHostname != public.User_computername {return true}
return false
}
This source diff could not be displayed because it is too large. You can view the blob instead.
package public
// AD-Control env
// AD-Control //
const Host_adserver string = "ADSERVER"
const DaemonPort string = "16823"
const DaemonListen string = ":" + DaemonPort
const ADServerDaemon string = Env_MainADHostname + DaemonListen
const ADServerDaemon string = Host_adserver + DaemonListen
var LocalDaemon string = User_computername + DaemonListen
const DocuBase string = `C:\Users\Public\Documents\AD-Control\`
const RandMax int = 60
const Version string = "0.9"
const Application string = "AD-Control-Log"
const Version string = "10.0"
// user env ///////////////////////////////////////////////////////////////
// user //
var User_profile string = GetEnv("USERPROFILE")
var User_name string = GetEnv("USERNAME")
var User_computername string = GetEnv("COMPUTERNAME")
var User_homeshare string = GetEnv("HOMESHARE")
var User_userdomain string = GetEnv("USERDOMAIN")
var User_fqdn_cn string = GetEnvFqdn("CN")
var User_dept_str string = GetEnvFqdn("OU")
var User_dept string = GetEnv("DEPT")
var User_appdata string = GetEnv("appdata")
var User_name string = GetEnv("USERNAME")
var User_name_display string = GetEnvFqdn("CN")
var User_dept string = GetEnv("DEPT")
var User_dept_display string = GetEnvFqdn("OU")
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_Dir_WeDrive = [2] string {User_appdata + `\Tencent\WXWork\Data`,User_profile + `\Documents\WXWork`}
const User_Dir_DCSave string = `D:\DomainUserBackup`
var User_Die_WeDriveBackup string = User_Dir_DCSave + `\` + User_name + `\WeDriveBackup`
var User_Dir_Be =[2]string {DocuBase,User_Die_WeDriveBackup}
// win-computer env /////////////////////////////////////////////////////
const Env_FreeFileSyncExe string = `C:\Progra~2\zhiwei\FreeFileSync_10.22\FreeFileSync.exe`
// SMB //
// AD env ///////////////////////////////////////////////////////////
const SMB_adserver string = `\\` + Host_adserver + `\`
const SMB_ADSoft string = SMB_adserver + `software\`
const SMB_ADMain string = SMB_adserver + `ADMAIN\`
var SMB_ADMainDept string = SMB_ADMain + User_dept_display
var SMB_ADMainDeptShare string = SMB_ADMain + User_dept_display + `\` + "部门共享"
const SMB_ADSoftlike string = SMB_ADSoft + "softlike"
const SMB_ADSoftApplication string = SMB_ADSoft + `application\`
const SMB_ADSoftTool string = SMB_ADSoft + `tools\`
const SMB_ADSoftOthTool string = SMB_ADSoft + `othtools\`
const Env_MainADHostname string = "ADSERVER"
const Env_SMBAdserver string = `\\` + Env_MainADHostname + `\`
const Env_ADSoft string = Env_SMBAdserver + "software"
const Env_ADMain string = Env_SMBAdserver + "ADMAIN"
var Env_ADMainDept string = Env_ADMain + `\` + User_dept_str
var Env_ADMainDeptShare string = Env_ADMain + `\` + User_dept_str + `\` + "部门共享"
const Env_ADSoftlike string = Env_ADSoft + `\` + "softlike"
const Env_ADSoftApplication string = Env_ADSoft + `\` + "application" + `\`
const Env_ADSoftTool string = Env_ADSoft + `\` + "tools" + `\`
const Env_ADSoftOthTool string = Env_ADSoft + `\` + `othtools\`
const Env_ADsoftware_local string = `F:\software\softlike\`
// Local Folder //
const Dir_DocuBase string = `C:\Users\Public\Documents\AD-Control\`
const Dir_ADsoftware_local string = `F:\software\softlike\`
var Dir_Windows string = GetEnv("windir") + `\`
const Dir_dept_share string = "办公室部门内部共享"
var Dir_dept_share_full string = Reg_Value_WeDriveDir + `\` + Dir_dept_share
const Dir_DCSave string = `D:\DomainUserBackup`
var Dir_WeDrive = [2] string {User_appdata + `\Tencent\WXWork\Data`,User_profile + `\Documents\WXWork`}
var Dir_WeDriveBackup string = Dir_DCSave + `\` + User_name + `\WeDriveBackup`
var Dir_Be = [2]string {Dir_DocuBase,Dir_WeDriveBackup}
var Dir_tmp string = GetEnv("tmp")
// application ////
// application ////////////////////////////////////////////////////////////////
const App_adct string = SMB_ADSoftApplication + "adct.exe"
const App_MultiSplit string = SMB_ADSoftOthTool + "win_MultiSplit.exe"
const App_FreeFileSyncExe string = `C:\Progra~2\zhiwei\FreeFileSync_10.22\FreeFileSync.exe`
//const App_MulitOpenPages string = SMB_ADOtherTool + "MultiOpenPages.bat"
const App_adct string = Env_ADSoftApplication + "adct.exe"
const App_MultiSplit string = Env_ADSoftOthTool + "win_MultiSplit.exe"
//const App_MulitOpenPages string = Env_ADOtherTool + "MultiOpenPages.bat"
// AD User env ////////////////////////////////////////////////////////////////
// AD User env //
const AD_User_main_admin string = "zhiweiadserver"
const AD_User_tengfei string = "tengfei"
......@@ -79,18 +79,17 @@ const Zhiwei_Dept_TXHD string = "TXHD"
const Zhiwei_Dept_TXWJ string = "TXWJ"
const Zhiwei_Dept_BGYJZX string = "BGYJZX"
const Zhiwei_Dept_TECH string = "TECH"
const Zhiwei_Dept_Count = 9
// backup env //////////////////////////////////////////////////////////////
// backup //
var BackupVersion string = "0428"
var BackupVersion string = "0603"
var BackupExtFile string = ".ffs_batch"
var BackupReplaceKey =[]byte("-tengfei-")
// reg ////////////////////////////////////////////////////////////////////
// reg info //
const (
HKCU = iota
......@@ -108,19 +107,21 @@ const Reg_Name_loginUserName string = "loginUser"
const Reg_Name_loginTime string = "loginTime"
const Reg_Name_BackupUserName string = "BackupUserName"
const Reg_Name_BackupOverTime string = "BackupOverTime"
// const Reg_Name_BackupSyncAppName string = "FreeFileSync"
// const Reg_Name_BackupSyncAppParm string = "FreeFileSyncParm"
const Reg_Name_WeDriveDir string = "WeDriveDir"
// reg value /////////////////////////////////////////////////////////////////
// reg value //
var Reg_Value_WeDriveDir string = Reg_query_key_one(HKCU,Reg_Path_home,Reg_Name_WeDriveDir)
// other env ///////////////////////////////////////////////////////////////
// other //
const Link_WxworkBot string = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
const Cmdk string = "cmd /k "
const Startk string = "cmd /k start "
var Dir_Windows string = GetEnv("windir") + `\`
const Zhiwei_WxDrive_Folder string = "办公室部门内部共享"
var Zhiwei_WxDrive_Full_Folder string = Reg_Value_WeDriveDir + `\`+Zhiwei_WxDrive_Folder
const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start "
var CopyStatusWeDrive map [string]bool
\ No newline at end of file
......@@ -5,35 +5,42 @@ package public
//
func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
PrintLog("DEAL ",string(unmsg))
var ret interface{}
switch msgtype{
// 报告 消息
case Msg_Report:
var pmsg MJreport
PntReport(string(unmsg))
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
// 执行 消息
case Msg_Exec:
var pmsg MJexec
PntExec(string(unmsg))
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
// 备份 消息
case Msg_Backup:
var pmsg MJbackup
PntBackup(string(unmsg))
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
// 注册表 消息
case Msg_Reg:
var pmsg MJreg
PntReg(string(unmsg))
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
// 错误 消息
case Msg_Error:
SendWX(string(unmsg))
PntError(string(unmsg))
var pmsg MJerror
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
return nil
}
......@@ -50,27 +57,15 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
func (rep *MJreport)Msg_Deal() interface{} {
switch rep.Report{
switch rep.Instruction{
case Msg_Report_Offwork:
return GJbackup()
case Msg_Report_StartBak:
return GJbackup()
case Msg_Report_OverBak:
SysMsgBox(rep.Computername,"备份结束")
Reg_Write_key_one(
Reg_Root_ac,
Reg_Path_home_dc + rep.Computername,
Reg_Name_BackupUserName,
UnixTimeParse(&rep.Timestamp))
Reg_Write_key_one(
Reg_Root_ac,
Reg_Path_home_dc + rep.Computername,
Reg_Name_BackupOverTime,
UnixTimeParse(&rep.Timestamp))
SysMsgBox(rep.Computername,`即将关机,如需取消关机,运行Z:\tools\【工具】取消关机.bat或在小工具-电源管理-取消自动关机`)
return GJexecAck(Msg_Exec_CloseWindows)
case Msg_Report_CloseWindows:
Reg_Write_key_one(
Reg_Root_ac,
......@@ -106,7 +101,7 @@ func (rep *MJreport)Msg_Deal() interface{} {
}()
default:
PrintLog("Default Report Json ",rep.Report)
PntOth("Default Report Json ",rep.Instruction)
}
return nil
......@@ -132,8 +127,7 @@ func (exec *MJexec)Msg_Deal()interface{}{
case Msg_Exec_RebootWindows:
exec.Command = Msg_Exec_RebootWindows_cmd
case Msg_Exec_UpdateVersion:
Exit()
}
......@@ -150,6 +144,7 @@ func (exec *MJexec)Msg_Deal()interface{}{
return nil
}
}
exec.Status = Msg_Exec_State_Ack
return exec
case Msg_Exec_State_Ack:
......@@ -166,7 +161,7 @@ func (exec *MJexec)Msg_Deal()interface{}{
// 从\\adserver安装
// 共享则需要everyone的读取权限
if HasSuffix(&exec.Command,".msi"){
full_cmd := "msiexec /i " + Env_ADSoftlike + `\` + exec.Command + " /qb"
full_cmd := "msiexec /i " + SMB_ADSoftlike + `\` + exec.Command + " /qb"
PsExec_sdi(exec.Computername,full_cmd,exec.SessionID)
// 对于 exe 格式
......@@ -176,7 +171,7 @@ func (exec *MJexec)Msg_Deal()interface{}{
PsExec_sdi(exec.Computername,Dir_Windows + exec.Command,exec.SessionID)
// 如果文件不存在,从 ADMIN$ 复制到C:\windows,再执行
} else {
PsExec_sdic(exec.Computername,Env_ADsoftware_local + exec.Command,exec.SessionID)
PsExec_sdic(exec.Computername,Dir_ADsoftware_local + exec.Command,exec.SessionID)
}
}
}
......@@ -190,7 +185,7 @@ func (exec *MJexec)Msg_Deal()interface{}{
case Msg_Exec_CopyWeDrive:
reg_Value_WeDriveDir := Reg_query_key_one(HKCU,Reg_Path_home,Reg_Name_WeDriveDir)
cmd := `cmd /c xcopy ` + Env_ADMainDeptShare + " /D " + reg_Value_WeDriveDir + `\` + Zhiwei_WxDrive_Folder + " /S /T /E /C /y"
cmd := `cmd /c xcopy ` + SMB_ADMainDeptShare + " /D " + reg_Value_WeDriveDir + `\` + Dir_dept_share + " /S /T /E /C /y"
Execcmd_wait(cmd)
SendServerReport(Msg_Report_OverCopyToWeDrive)
......@@ -215,15 +210,15 @@ func (bak * MJbackup)Msg_Deal() interface{}{
bak.Explain = "Backup Start"
bak.Status = Msg_Backup_Status_If
bak.Version = BackupVersion
bak.BatchFileName = DocuBase + bak.Version + bak.Username + BackupExtFile
bak.BatchFileName = Dir_DocuBase + bak.Version + bak.Username + BackupExtFile
//PrintLog("收集D盘剩余空间,查询主用户")
PrintLog(bak.Explain)
// maybe:收集D盘剩余空间
PntReport(bak.Explain)
//如果Start可以,并且得到了主用户
//判断是否有最新版本的文件是否存在
if NotExist(Env_FreeFileSyncExe){
if NotExist(App_FreeFileSyncExe){
SendServerError("FreeFileSync hasn't been installed")
return nil
}
......@@ -247,32 +242,32 @@ func (bak * MJbackup)Msg_Deal() interface{}{
bak.Version = BackupVersion
}
bak.Explain = "Backup Fill In BatchFile"
bak.Status = Msg_Backup_Status_Continue
// 交给daemon 处理 Msg_Backup_Status_Continue
SendMsg(bak.Computername + DaemonListen,bak)
return nil
case Msg_Backup_Status_Continue:
// 生成新FFS所使用的batch文件
bak.BatchFileName = DocuBase + bak.Version + bak.Username + BackupExtFile
bak.BatchFileName = Dir_DocuBase + bak.Version + bak.Username + BackupExtFile
if !bak.BatchFileExist{
PrintLog("init ",string(bak.BatchFileName))
PntReport("init ",string(bak.BatchFileName))
if err := WriteBytesFile(bak.BatchFileName,bak.BatchFileData);err !=nil{
SendServerError("Write Batch File Error "+err.Error())
return bak
}
}
bak.Status = Msg_Backup_Status_Run
bak.Explain = "Backup Ready"
return bak
case Msg_Backup_Status_Run:
//SysMsgBox(bak.Computername,bak.Username + " 开始备份")
PsExec_sd(bak.Computername,Env_FreeFileSyncExe + " "+ bak.BatchFileName)
SysMsgBox(bak.Computername,bak.Username + " 开始备份")
PsExec_sd(bak.Computername,App_FreeFileSyncExe + " "+ bak.BatchFileName)
}
return nil
return nil
}
......@@ -290,6 +285,27 @@ func (reg * MJreg)Msg_Deal() interface{}{
// 关于 error 错误 的 消息处理
// func (err * MJerror)Msg_Deal() interface{}{
// return nil
// }
\ No newline at end of file
func (err * MJerror)Msg_Deal() interface{}{
// 为了降低在企业微信的消息频率
// 选择部分主机进行发送消息
send := false
switch err.Computername{
case "LP66-pc":
send =true
case "HB166-pc":
send =true
case "JD138-PC":
send =true
case "TXHD17-PC":
send =true
}
if send{ SendWX(err.Instruction) }
return nil
}
\ No newline at end of file
......@@ -47,7 +47,7 @@ const (
const Msg_Exec_State_Request string = "request"
const Msg_Exec_State_Ack string = "ack"
const Msg_Exec_CloseWindows string = "closewindow"
const Msg_Exec_CloseWindows_cmd string = "shutdown -s -t 15"
const Msg_Exec_CloseWindows_cmd string = "shutdown -s -t 300"
const Msg_Exec_CancelCloseWindows string = "cancelclosewindows"
const Msg_Exec_CancelCloseWindows_cmd string = "shutdown -a"
const Msg_Exec_LogOffUser string = "logoffuser"
......@@ -87,18 +87,17 @@ type MJbase struct{
Timestamp int64 `json:"timestamp"`
DataBool bool `json:"databool"`
DataStr string `json:"datastr"`
Instruction string `json:"instruction"`
}
// report Json Format //////////////////////////////////////////////////////
type MJreport struct {
MJbase
Report string `json:"report"`
Version string `json:"version"`
}
// Exec Json Fromat ///////////////////////////////////////////////////////
type MJexec struct {
MJbase
Instruction string `json:"instruction"`
Command string `json:"command"`
Cmder int `josn:"cmder"`
SessionID string `json:"sessionid"`
......@@ -110,7 +109,6 @@ type MJbackup struct{
MJbase
Version string `json:"version"`
DiskFree string `json:"diskfree"`
//Error bool `json:"error"`
BatchFileExist bool `json:"batchfileexist"`
BatchFileData []byte `json:"batchfiledata"`
BatchFileName string `json:"batchfilename"`
......@@ -150,7 +148,7 @@ func (rep * MJreport)init(Report string) {
rep.Timestamp = NowTimestamp()
rep.Computername = User_computername
rep.MsgType = Msg_Report
rep.Report = Report
rep.Instruction = Report
rep.Version = Version
}
......@@ -215,9 +213,9 @@ func (exec * MJexec)init(s string){
// Backup
func GJbackup()interface{}{
var rep MJbackup
rep.init()
return rep
var bak MJbackup
bak.init()
return bak
}
func (bak * MJbackup)init() {
bak.Dept = User_dept
......@@ -227,18 +225,19 @@ func (bak * MJbackup)init() {
bak.Status = Msg_Backup_Status_Start
}
// error
func GJerror(s * string) interface{}{
func GJerror(s string)interface{}{
var err MJerror
err.init(s)
return err
}
func (err * MJerror)init(s* string ){
func (err * MJerror)init (s string){
err.Username = User_name
err.Dept = User_dept
err.Timestamp = NowTimestamp()
err.Computername = User_computername
err.MsgType = Msg_Error
err.DataStr = *s
err.Instruction = s
}
package public
import (
"log"
"os"
"fmt"
)
var Loger * log.Logger
func PrintLog(v ...interface{}){
log.SetPrefix("Output ")
log.Println(v ...)
}
func PntInfo(v ...interface{}){
Loger.SetPrefix("Info ")
Loger.Println(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 PntReg(v ...interface{}){
Loger.SetPrefix("Reg ")
Loger.Println(v ...)
}
func PntError(v ...interface{}){
Loger.SetPrefix("Error ")
Loger.Println(v ...)
}
func PntOth(v ...interface{}){
Loger.SetPrefix("Other ")
Loger.Println(v ...)
}
func PntWol(v ...interface{}){
Loger.SetPrefix("WOL ")
Loger.Println(v ...)
}
func PntSend(v ...interface{}){
Loger.SetPrefix("Send ")
Loger.Println(v ...)
}
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(){
SendServerError(fmt.Sprintf("%s 's %s open file error",User_computername,s))
}
return log.New(Log_file_obj,"",log.LstdFlags)
}
\ No newline at end of file
......@@ -17,22 +17,18 @@ import (
// 如果空 输出错误
// 但不退出
func GetEnv(e string) string{
r := os.Getenv(e)
r:= os.Getenv(e)
PrintLog(e,"->",r)
// 获取为空
if r == "" {
PrintLog("环境错误!")
}
return r
}
func GetEnvFqdn(s string)string{
cmd,err := exec.Command("whoami","/fqdn").Output()
if err !=nil {
PrintLog(err)
PntError(err)
}
out,err := simplifiedchinese.GBK.NewDecoder().Bytes(cmd)
if err !=nil {
PrintLog(err)
PntError(err)
}
for _,each := range strings.Split(string(out),","){
......@@ -56,7 +52,7 @@ func ParseJsonHead(b []byte)string{
func ParseJsonBody(unmsg []byte,v interface{}){
// 填写
if err := json.Unmarshal(unmsg,v) ;err != nil{
PrintLog("Parse Json Error ",err)
PntError("Parse Json Error ",err)
}
}
......@@ -64,7 +60,7 @@ func ParseJsonBody(unmsg []byte,v interface{}){
func JsonToByte(v interface{}) []byte{
textbyte,err := json.Marshal(v)
if err !=nil {
PrintLog("Json to String Error ",v,err)
PntError("Json to String Error ",v,err)
}
return textbyte
}
......@@ -103,9 +99,9 @@ func WriteBytesFile(file string ,data []byte)error{
func CreateExtTempate(dist*string) []byte {
base := BackupReplaceKey
var ret bytes.Buffer
file, err := os.Open(DocuBase + BackupVersion + "base"+BackupExtFile)
file, err := os.Open(Dir_DocuBase + BackupVersion + "base"+BackupExtFile)
if err != nil {
PrintLog(err)
PntError(err)
return nil
}
defer file.Close()
......@@ -118,7 +114,6 @@ func CreateExtTempate(dist*string) []byte {
ret.Write(lineText)
ret.Write([]byte("\n"))
}
//PrintLog(ret.String())
return ret.Bytes()
}
......@@ -139,12 +134,12 @@ func Rand(i * int)int{
return rand.Intn(*i)
}
func Delay(i int){
PrintLog("Delay ",i)
PntInfo("Delay ",i)
time.Sleep(time.Duration(i) * time.Second)
}
func RandDelay(i int){
ri := Rand(&i)
PrintLog("RandDelay ",ri)
PntInfo("RandDelay ",ri)
time.Sleep(time.Duration(ri) * time.Second)
}
......@@ -170,7 +165,7 @@ func ReadDir(s string) ([]os.FileInfo,error){
func GetNewestDir(rdir ,extdir string) string {
f,err := ioutil.ReadDir(rdir)
if err !=nil{
PrintLog(err)
PntError(err)
}
//var filearge := []byte
......@@ -198,12 +193,11 @@ func TrimSuffix(str ,s string)string{
func Exit(){
os.Exit(0)
}
func NowTimestamp() int64 {
return time.Now().Unix()
}
func UnixTimeParse(t *int64) string {
return time.Unix(*t,0).String()
func DomainComputer() bool{
if Host_adserver != User_computername {return true}
return false
}
func GetStrTime() string{
return time.Now().String()
func Adserver() bool{
if Host_adserver == User_computername {return true}
return false
}
\ No newline at end of file
......@@ -26,8 +26,9 @@ func SendServerGUIExec(s string){
SendServer(GJexecGUI(s))
}
func SendServerError(s string)[]byte{
return SendServer(GJerror(&s))
return SendServer(GJerror(s))
}
// send to server
func SendServer(v interface{})[]byte{
return SendMsg(ADServerDaemon,v)
......@@ -37,17 +38,17 @@ func SendMsg(you string ,v interface{})[]byte{
textbyte,err := json.Marshal(v)
if err !=nil {
PrintLog("Json to String Error ",v,err)
PntError("Json to String Error ",v,err)
}
conn, err := net.Dial("tcp", you)
if err != nil {
PrintLog("err = ", err)
PntError("err = ", err)
}
//发送数据
conn.Write(textbyte)
PrintLog("SEND ",string(textbyte))
PntSend(string(textbyte))
bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign)
var rec []byte
if cerr != io.EOF {
......@@ -61,7 +62,7 @@ func SendMsg(you string ,v interface{})[]byte{
rec = DealMsgEnter(ip,msgtype,bmsg)
}
if err := conn.Close();err !=nil{
PrintLog("Conn Close ",err)
PntError("Conn Close ",err)
}
return rec
}
......@@ -69,6 +70,8 @@ func SendMsg(you string ,v interface{})[]byte{
// 发送 到 微信机器人
func SendWX(Content string){
// Content不支持发送Json,
w := []byte(`
{
"msgtype": "text",
......
......@@ -3,31 +3,15 @@ package public
import (
"time"
)
// 关于 操作时间 的 结构体
type DoTime struct{
Str string
T time.Time
func NowTimestamp() int64 {
return time.Now().Unix()
}
func UnixTimeParse(t *int64) string {
return time.Unix(*t,0).String()
}
// 判断 是否早于i小时
// 返回 是:早于i小时
// 返回 否:晚于i小时
func (dt * DoTime) base(){
if dt.Str != ""{
time.Parse("2020-05-24 17:06:47 +0800 CST",dt.Str)
}
func GetStrTime() string{
return time.Now().String()
}
func (dt * DoTime) BeforeHour(i int) bool{
var err error
if dt.Str != ""{
dt.T,err = time.Parse("2006-01-02 15:04:05.999999999 -0700 MST",dt.Str)
if err !=nil {
PrintLog(err)
return false
}
}
if dt.T.Add(time.Duration(5)*time.Hour).Before(time.Now()){
return true
}
return false
func GetHour() int{
return time.Now().Hour()
}
\ No newline at end of file
......@@ -28,42 +28,43 @@ func execcmd_base(cmdargs string) (string,[]string,error){
app = cmdargs
appargs[0] = ""
}
PrintLog(app,appargs)
PntInfo(app,appargs)
return app,appargs,nil
}
func Execcmd_nowait(cmdargs string){
app,appargs,err :=execcmd_base(cmdargs)
if err !=nil{
PrintLog(err)
PntError(err)
return
}
if err := exec.Command(app,appargs...).Start();err !=nil {
PrintLog(err)
PntError(err)
}
}
func Execcmd_wait(cmdargs string){
app,appargs,err :=execcmd_base(cmdargs)
if err !=nil{
PrintLog(err)
PntError(err)
return
}
cmd := exec.Command(app,appargs...)
if err := cmd.Start(); err != nil {
PrintLog(err)
PntError(err)
}
PrintLog("Waiting for command to finish...")
err = cmd.Wait()
PrintLog("Command finished with error: ",err)
if err !=nil{
PntError("Command finished with error: ",err)
}
}
func Execcmd_output(cmdargs string)[]byte{
app,appargs,err :=execcmd_base(cmdargs)
if err !=nil{
PrintLog(err)
PntError(err)
return nil
}
if out,err2 := exec.Command(app,appargs...).CombinedOutput();err2 !=nil {
PrintLog(err2)
PntError(err2)
}else{
return out
}
......@@ -86,6 +87,7 @@ func OpenWindow(s string){
Execcmd_nowait("explorer "+s)
}
//
//
// remote exec
......@@ -119,9 +121,11 @@ func Msg(message string) {
func Msg_YesNo(message string) int {
return walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxOKCancel)
}
// 调用外部命令的MsgBox
func MsgBox(message string){
Execcmd_nowait("msg * /TIME:60 "+ message)
}
// 调用外部命令的指定计算机的消息的MsgBox
func SysMsgBox(pc,message string){
Execcmd_nowait("msg * /SERVER:"+pc+" /TIME:60 "+ message)
}
......@@ -129,7 +133,7 @@ func SysMsgBox(pc,message string){
//
//
// regedit
// regedit base
//
func reg_prase(root * int) registry.Key{
switch *root{
......@@ -143,13 +147,8 @@ func reg_prase(root * int) registry.Key{
return registry.LOCAL_MACHINE
}
func Reg_Exist_item(root int,path string ) {
_,exist,err := registry.CreateKey(reg_prase(&root),path,registry.ALL_ACCESS)
if err !=nil {
PrintLog(err)
}
if !exist {
PrintLog("Create ",path)
}
//_,exist,err :=
registry.CreateKey(reg_prase(&root),path,registry.ALL_ACCESS)
}
func Reg_query_item_one(root int ,path string) string {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{
......@@ -157,11 +156,9 @@ func Reg_query_item_one(root int ,path string) string {
if sk,err := k.ReadSubKeyNames(1); err ==nil{
return sk[0]
} else{
PrintLog(err)
return ""
}
} else {
PrintLog(kerr)
return ""
}
}
......@@ -169,34 +166,26 @@ func Reg_query_key_one(root int, path, key string) string {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{
defer k.Close()
if sk,_,err := k.GetStringValue(key); err ==nil{
PrintLog(root,path,key,` -> `,sk)
return sk
} else{
PrintLog(err)
return ""
}
} else {
PrintLog(kerr)
return ""
}
}
func Reg_Write_key_one(root int, path, name, value string) {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.WRITE);kerr==nil{
defer k.Close()
if err := k.SetStringValue(name, value); err !=nil{
PrintLog(err)
}
} else {
PrintLog(kerr)
k.SetStringValue(name, value)
}
}
// func Reg_Write_AD(key , value * string){
// Reg_Write_key_one(
// Reg_Root_achome,
// Reg_Path_achome,
// *key,
// *value)
// }
//
//
// regedit ext
//
func Reg_Write_DC(key , value string){
Reg_Write_key_one(
Reg_Root_dc,
......
No preview for this file type
......@@ -5,26 +5,31 @@ import (
"AD-Control/public"
)
func userInit() string{
public.Loger = public.NewLoger(public.User_appdata+ `\users.log`)
public.Reg_Exist_item(public.HKCU,public.Reg_Path_home)
// 1 同步服务器文件共享到为微盘
if public.Reg_Value_WeDriveDir != "" && public.Exist(public.Zhiwei_WxDrive_Full_Folder){
// 微盘备份步骤
if public.Reg_Value_WeDriveDir != ""{
// && public.Exist(public.Dir_dept_share_full)
// 如果微盘的文件夹存在
// 则,重复执行
// 随机延迟300s,进行复制,固定延迟2h
go func (){
for{
public.RandDelay(300)
public.SendServer(public.GJexecCopyWeDrive(public.Msg_Exec_CopyWeDrive))
public.Delay(7200)
}
}()
}else{
wxdsInit()
}
// 2 备份微盘文件到本地
go wxdsToLocal(false)
// 3 初始化 图标文件
// 初始化 图标文件
var icoDir =[]string {`AD-Control.ico`,`C:\windows\system32\AD-Control.ico`,`C:\Users\Public\Documents\AD-Control\AD-Control.ico`}
for _,i := range icoDir{
if public.Exist(i){
......@@ -52,33 +57,39 @@ func main() {
// 程序初始化
mw,err := walk.NewMainWindow()
if err != nil {
public.PrintLog(err)
public.PntError(err)
}
icon, err := walk.Resources.Icon(icodir)
if err != nil {
public.PrintLog(err)
public.PntError(err)
}
// 后台图标应用初始化
ni, err := walk.NewNotifyIcon(mw)
if err != nil {
public.PrintLog(err)
public.PntError(err)
}
defer ni.Dispose()
// Set the icon and a tool tip text.
if err := ni.SetIcon(icon); err != nil {
public.PrintLog(err)
public.PntError(err)
}
if err := ni.SetToolTip("Click for info or use the context menu to exit."); err != nil {
public.PrintLog(err)
public.PntError(err)
}
menuInit(ni)
// 为了防止ADServer的Daemon.exem没有运行而导致
// 域计算机运行users.exe失败,
// 需要取消由users.exe向ADServer报告
// 交给组策略中adct.exe进行报告
// public.SendServerReport(public.Msg_Report_UserStart)
// The notify icon is hidden initially, so we have to make it visible.
if err := ni.SetVisible(true); err != nil {
public.PrintLog(err)
public.PntError(err)
}
// 循环 运行窗体
......
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