Commit 99fb8965 by 陶腾飞

v10.2第二版用户备份方案更新完成

parent 8d8ab1a4
logs/
test/ test/
exe/
*.bat *.bat
*.ps1 *.ps1
*.exe *.exe
\ No newline at end of file
*.log
\ No newline at end of file
...@@ -6,13 +6,15 @@ import ( ...@@ -6,13 +6,15 @@ import (
func main(){ func main(){
pub.AutoGetWeDriveDir() pub.Loger = pub.NewLoger(pub.Dir_userprofile + `\adct.log`)
pub.Loger = pub.NewLoger(pub.Dir_tmp + `\adct.log`)
pub.AutoFillInWeDriveDir()
var backupText = flag.String( pub.Msg_Backup ,"" ,"backup status to AD") var backupText = flag.String( pub.Msg_Backup ,"" ,"backup status to AD")
var reportText = flag.String( pub.Msg_Report ,"" ,"report to AD") var reportText = flag.String( pub.Msg_Report ,"" ,"report to AD")
var execText = flag.String( pub.Msg_Exec ,"" ,"exec to LocalDaemon") var execText = flag.String( pub.Msg_Exec ,"" ,"exec to LocalDaemon")
var regText = flag.String( pub.Msg_Reg ,"" ,"mod reg") var regText = flag.String( pub.Msg_Reg ,"" ,"mod reg")
var userText = flag.String( "user" ,"" ,"who is running me") //var userText = flag.String( "user" ,"" ,"who is running me")
var passText = flag.String( "pass" ,"" ,"input passwork,but not need") var passText = flag.String( "pass" ,"" ,"input passwork,but not need")
var wolmacText = flag.String( "wolmac" ,"" ,"input mac address for wake pc") var wolmacText = flag.String( "wolmac" ,"" ,"input mac address for wake pc")
var woluserText = flag.String( "woluser" ,"" ,"input name for walk pc") var woluserText = flag.String( "woluser" ,"" ,"input name for walk pc")
...@@ -27,8 +29,8 @@ func main(){ ...@@ -27,8 +29,8 @@ func main(){
if *execText != "" { flag_exec( execText );return} if *execText != "" { flag_exec( execText );return}
if *regText != "" { flag_reg( regText );return} if *regText != "" { flag_reg( regText );return}
if *wolmacText != "" { flag_wolmac( wolmacText );return} if *wolmacText != "" { flag_wolmac( wolmacText );return}
if *woluserText != "" { flag_woluser( woluserText );return} if *woluserText != "" { flag_woluser( woluserText,passText);return}
if *wolallText { flag_wolall( userText,passText );return} if *wolallText { flag_wolall( passText );return}
return return
} }
...@@ -44,45 +46,50 @@ func flag_exec(s * string){ ...@@ -44,45 +46,50 @@ func flag_exec(s * string){
func flag_reg(s * string){ func flag_reg(s * string){
; ;
} }
func flag_wolmac(mac * string){
if err := pub.Wol(*mac); err != nil{
pub.PntError(err)
} else {
pub.PntWol(*mac)
}
}
func flag_woluser(user * string){
pub.PntWol("暂未开发")
}
func flag_hour(){ func flag_hour(){
nh := pub.GetHour() nh := pub.GetHour()
switch nh{ switch nh{
case 0: case 0:
pub.SendServerReport(pub.Msg_Report_StartBak) pub.Execcmd_nowait(`即将关机,如需取消,点击小工具-电源管理-取消自动关机 或运行Z:\tools\【工具】取消关机.bat`)
pub.Execcmd_nowait(`shutdown -s -t 300`)
break //pub.SendServerReport(pub.Msg_Report_StartBak)
case 1:
pub.SendServerExec(pub.Msg_Report_TurnOffPC)
break
case 2:
pub.SendServerExec(pub.Msg_Report_TurnOffPC)
break
case 3:
pub.SendServerExec(pub.Msg_Report_TurnOffPC)
break
case 4:
pub.SendServerExec(pub.Msg_Report_TurnOffPC)
break break
default : default :
pub.SendServerExec(pub.Msg_Report_TurnOffPC) pub.Execcmd_nowait(`即将关机,如需取消,点击小工具-电源管理-取消自动关机 或运行Z:\tools\【工具】取消关机.bat`)
pub.Execcmd_nowait(`shutdown -s -t 300`)
break break
} }
} }
func flag_wolall(user* string,pass * string){ func flag_wolmac(mac * string){
if *user != pub.AD_User_wol {return} if err := pub.Wol(*mac); err != nil{
pcgroup := pub.LDAP_Get_PCGroup(user,pass) pub.PntError(err)
} else {
pub.PntWol(*mac)
}
}
func flag_woluser(user,pass * string){
pcgroup := pub.Reg_query_item(
pub.Reg_Root_ac,
pub.Reg_Path_home_ac)
pub.PrintLog(pcgroup)
for _,pc := range pcgroup{
priuser:= pub.Reg_query_key_one(
pub.Reg_Root_ac,
pub.Reg_Path_home_ac+pc,
pub.Reg_Name_PrimaryUser)
if priuser == *user {
mac := pub.Reg_query_key_one(pub.Reg_Root_ac,
pub.Reg_Path_home_ac+pc,
pub.Reg_Name_MACaddress)
flag_wolmac(&mac)
pub.PntInfof("Primary User: %s,hostname:%s\n", *user,mac)
}
}
}
func flag_wolall(pass * string){
pcgroup := pub.LDAP_Get_PCGroup(pass)
limit :=0
for i,pc := range pcgroup{ for i,pc := range pcgroup{
mac := pub.Reg_query_key_one( mac := pub.Reg_query_key_one(
pub.Reg_Root_ac, pub.Reg_Root_ac,
...@@ -92,9 +99,15 @@ func flag_wolall(user* string,pass * string){ ...@@ -92,9 +99,15 @@ func flag_wolall(user* string,pass * string){
pub.PntError(pc,"查找注册表失败") pub.PntError(pc,"查找注册表失败")
continue continue
}else{ }else{
pub.PntInfo(i,pc) if limit == 9 {
pub.Delay(300)
limit=0
}
pub.PntInfo(i,pc,mac)
pub.RandDelay(10) pub.RandDelay(10)
flag_wolmac(&mac) flag_wolmac(&mac)
limit +=1
} }
} }
} }
\ No newline at end of file
...@@ -30,7 +30,7 @@ func daemonInit(){ ...@@ -30,7 +30,7 @@ func daemonInit(){
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_TECH] = true pub.CopyStatusWeDrive[pub.Zhiwei_Dept_TECH] = true
// 日志文件位置:主控源文件的源文件目录 // 日志文件位置:主控源文件的源文件目录
logpath = `C:\Users\Administrator\go\src\AD-Control\logs\daemon.log` logpath = `F:\logs\daemon.log`
} else { } else {
// 日志文件位置:域计算机的备份目录:C:\windows\temp // 日志文件位置:域计算机的备份目录:C:\windows\temp
logpath = pub.Dir_tmp + `\daemon.log` logpath = pub.Dir_tmp + `\daemon.log`
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -9,84 +9,70 @@ const DaemonListen string = ":" + DaemonPort ...@@ -9,84 +9,70 @@ const DaemonListen string = ":" + DaemonPort
const ADServerDaemon string = Host_adserver + DaemonListen const ADServerDaemon string = Host_adserver + DaemonListen
var LocalDaemon string = User_computername + DaemonListen var LocalDaemon string = User_computername + DaemonListen
const RandMax int = 60 const RandMax int = 60
const Version string = "1.0.1" const Version string = "1.0.2"
// user // // user //
var User_profile string = GetEnv("USERPROFILE")
var User_computername string = GetEnv("COMPUTERNAME") var User_computername string = GetEnv("COMPUTERNAME")
var User_homeshare string = GetEnv("HOMESHARE") var User_homeshare string = GetEnv("HOMESHARE")
var User_userdomain string = GetEnv("USERDOMAIN") var User_userdomain string = GetEnv("USERDOMAIN")
var User_appdata string = GetEnv("appdata")
var User_name string = GetEnv("USERNAME") var User_name string = GetEnv("USERNAME")
var User_name_display string = GetEnvFqdn("CN") var User_name_display string = GetEnvFqdn("CN")
var User_dept string = GetEnv("DEPT") 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_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_sessionID string = Reg_query_item_one(HKU,User_sid+`\Volatile Environment`)
// SMB // // 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_ADMain string = SMB_adserver + `ADMAIN\`
var SMB_ADMainDept string = SMB_ADMain + User_dept_display var SMB_ADMainDept string = SMB_ADMain + User_dept
var SMB_ADMainDeptShare string = SMB_ADMain + User_dept_display + `\` + "部门共享" var SMB_ADMainDeptShare string = SMB_ADMain + User_dept + `\` + "部门共享"
const SMB_ADSoftlike string = SMB_ADSoft + "softlike" const SMB_ADSoftlike string = SMB_ADSoft + "softlike"
const SMB_ADSoftApplication string = SMB_ADSoft + `application\` const SMB_ADSoftApplication string = SMB_ADSoft + `application\`
const SMB_ADSoftTool string = SMB_ADSoft + `tools\` const SMB_ADSoftTool string = SMB_ADSoft + `tools\`
const SMB_ADSoftOthTool string = SMB_ADSoft + `othtools\` 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_appdata string = GetEnv("appdata")
var Dir_tmp string = GetEnv("tmp")
var Dir_Windows string = GetEnv("windir") + `\`
const Dir_DocuBase string = `C:\Users\Public\Documents\AD-Control\` const Dir_DocuBase string = `C:\Users\Public\Documents\AD-Control\`
const Dir_ADsoftware_local string = `F:\software\softlike\` const Dir_ADsoftware_local string = `F:\software\softlike\`
var Dir_Windows string = GetEnv("windir") + `\`
const Dir_dept_share string = "办公室部门内部共享" const Dir_dept_share string = "办公室部门内部共享"
var Dir_dept_share_full string = Reg_Value_WeDriveDir + `\` + Dir_dept_share var Dir_dept_share_full string = Reg_Value_WeDriveDir + `\` + Dir_dept_share
const Dir_DCSave string = `D:\DomainUserBackupV2` const Dir_DCSave string = `D:\DomainUserBackupV2`
var Dir_WeDrive = [2] string {User_appdata + `\Tencent\WXWork\Data`,User_profile + `\Documents\WXWork`} var Dir_WeDrive = [2] string {Dir_appdata + `\Tencent\WXWork\Data`,Dir_userprofile + `\Documents\WXWork`}
var Dir_Be = []string {Dir_DocuBase} var Dir_Be = []string {Dir_DocuBase}
var Dir_tmp string = GetEnv("tmp") var Dir_Sync_Config string = Dir_appdata + `\Sync App Settings\_SYNCAPP\`
// 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"
// Local File //
// AD User env // 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 AD_User_main_admin string = "zhiweiadserver"
const AD_User_tengfei string = "tengfei"
const AD_User_taotengfei string = "taotengfei"
const AD_User_huyibo string = "huyibo"
const AD_User_xuwenqiang string = "xuwenqiang"
const AD_User_wol string = "wol@zhiweireach.com"
// application ////
const Zhiwei_Dept_HB string = "HB" const App_adct string = SMB_ADSoftApplication + "adct.exe"
const Zhiwei_Dept_LP string = "LP" const App_MultiSplit string = SMB_ADSoftOthTool + "win_MultiSplit.exe"
const Zhiwei_Dept_MT string = "MT" const App_Sync string = `syncappw.exe`
const Zhiwei_Dept_JR string = "JR" const App_Sync_dir string = `C:\Progra~1\zhiwei\AllWay_Sync\Bin\syncappw.exe`
const Zhiwei_Dept_JD string = "JD" //const App_MulitOpenPages string = SMB_ADOtherTool + "MultiOpenPages.bat"
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 // // backup //
var BackupVersion string = "0611B" var Bak_Version string = "0612"
var BackupExtFile string = ".ffs_batch"
var BackupReplaceKey =[]byte("-tengfei-")
// reg info // // reg info //
...@@ -105,12 +91,12 @@ const Reg_Name_TurnOffTime string = "TurnOffTime" ...@@ -105,12 +91,12 @@ const Reg_Name_TurnOffTime string = "TurnOffTime"
const Reg_Name_LoginUserName string = "loginUser" const Reg_Name_LoginUserName string = "loginUser"
const Reg_Name_LoginTime string = "loginTime" const Reg_Name_LoginTime string = "loginTime"
const Reg_Name_LogOffTime string = "LogOffTime" const Reg_Name_LogOffTime string = "LogOffTime"
const Reg_Name_BackupUserName string = "BackupUserName"
const Reg_Name_BackupOverTime string = "BackupOverTime" const Reg_Name_BackupOverTime string = "BackupOverTime"
const Reg_Name_WeDriveDir string = "WeDriveDir" 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_PrimaryUser string = "PrimaryUser"
const Reg_Name_PowerStatus string = "PowerStatus" const Reg_Name_PowerStatus string = "PowerStatus"
const Reg_Name_BackupVersion string = "BackupVersion"
// reg value // // reg value //
......
...@@ -9,5 +9,8 @@ var Error_NullRegQuery = errors.New("Null Reg Query") ...@@ -9,5 +9,8 @@ var Error_NullRegQuery = errors.New("Null Reg Query")
var Error_Null_Folder_WeDrive = errors.New("Not Find Folder WxDrive ") var Error_Null_Folder_WeDrive = errors.New("Not Find Folder WxDrive ")
var Error_Null_App_Sync = errors.New("Not Find Application AllWay Sync") var Error_Null_App_Sync = errors.New("Not Find Application AllWay Sync")
var Error_Null_File = errors.New("Not Find File") 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_Fail_File_Open = errors.New("Fail File Open") var Error_Fail_File_Open = errors.New("Fail File Open")
var Error_Fail_File_Write = errors.New("Fail File Write") var Error_Fail_File_Write = errors.New("Fail File Write")
var Error_Not_Msg = errors.New("isn't defined msg")
\ No newline at end of file
package public package public
import( import (
ldap "gopkg.in/ldap.v3" ldap "gopkg.in/ldap.v3"
) )
func LDAP_Get_PCGroup(user ,pass * string) []string { func LDAP_Get_PCGroup(pass * string) []string {
user := AD_User_zhiwei
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) PntError(err)
} }
defer l.Close() defer l.Close()
if err = l.Bind(*user, *pass);err != nil { if err = l.Bind(user, *pass);err != nil {
//if err = l.Bind("zhiweiadserver@zhiweireach.com", "if(hdc==DOMAIN20)");err != nil {
PntError(err) PntError(err)
} }
searchRequest := ldap.NewSearchRequest( searchRequest := ldap.NewSearchRequest(
......
package public package public
// //
//
// 消息入口 // 消息入口
// //
...@@ -48,7 +49,7 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte { ...@@ -48,7 +49,7 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
} }
//
// //
// 具体消息实现 // 具体消息实现
// //
...@@ -60,42 +61,66 @@ func (rep *MJreport)Msg_Deal() interface{} { ...@@ -60,42 +61,66 @@ func (rep *MJreport)Msg_Deal() interface{} {
switch rep.Instruction{ switch rep.Instruction{
case Msg_Report_StartBak: case Msg_Report_StartBak:
return GJbackup(rep.Computername) isbak := false
time:= rep.Reg_Query_AC(Reg_Name_BackupOverTime)
// 通常是第一次备份
if time == "" {
isbak= true
}
if s,err := ParseTime(time);err !=nil{
isbak= false
PntError(err)
} else {
// 下班点之后吗?
if s.Hour() >= 15{
isbak= true
}else {
isbak= false
}
}
if isbak {
return GJbackup()
}else{
return GJexecAck(Msg_Exec_TurnOffPC)
}
case Msg_Report_OverBak: case Msg_Report_OverBak:
rep.Reg_Write_AC(Reg_Name_BackupOverTime,UnixTimeParse(&rep.Timestamp))
rep.Pskill(App_Sync)
SysMsgBox(rep.Computername,`即将关机,如需取消关机,运行Z:\tools\【工具】取消关机.bat或在小工具-电源管理-取消自动关机`) SysMsgBox(rep.Computername,`即将关机,如需取消关机,运行Z:\tools\【工具】取消关机.bat或在小工具-电源管理-取消自动关机`)
return GJexecAck(Msg_Exec_TurnOffPC) return GJexecAck(Msg_Exec_TurnOffPC)
case Msg_Report_WillTurnOffPC: case Msg_Report_WillTurnOffPC:
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_TurnOffTime, Reg_Name_TurnOffTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_PowerStatus, Reg_Name_PowerStatus,
Reg_Value_PowerStatus_OFF) Reg_Value_PowerStatus_OFF)
case Msg_Report_WillTurnOnPC: case Msg_Report_WillTurnOnPC:
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_TurnOffTime, Reg_Name_TurnOffTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_PowerStatus, Reg_Name_PowerStatus,
Reg_Value_PowerStatus_ON) Reg_Value_PowerStatus_ON)
case Msg_Report_WillLogInUser: case Msg_Report_WillLogInUser:
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_LoginUserName, Reg_Name_LoginUserName,
rep.Username) rep.Username)
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_LoginTime, Reg_Name_LoginTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
case Msg_Report_WillLogOutUser: case Msg_Report_WillLogOutUser:
rep.Reg_Write_Key_one_AC( rep.Reg_Write_AC(
Reg_Name_LogOffTime, Reg_Name_LogOffTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
case Msg_Report_OverCopyToWeDrive: case Msg_Report_OverCopyToWeDrive:
go func() { go func() {
Delay(600) Delay(600)
...@@ -199,74 +224,69 @@ func (exec *MJexec)Msg_Deal()interface{}{ ...@@ -199,74 +224,69 @@ func (exec *MJexec)Msg_Deal()interface{}{
func (bak * MJbackup)Msg_Deal() interface{}{ func (bak * MJbackup)Msg_Deal() interface{}{
switch bak.Status{ switch bak.Instruction{
case Msg_Backup_Status_Start: case Msg_Backup_Status_Start:
bak.Timestamp = NowTimestamp()
//bak.Username = User_name bak.Username = User_name
bak.Computername = User_computername bak.Computername = User_computername
bak.Explain = "Backup Start" bak.Explain = "Backup Start"
bak.Status = Msg_Backup_Status_If bak.Instruction = Msg_Backup_Status_Continue
bak.Version = BackupVersion wetype,weid,err := GetWeDriveVersion()
bak.BatchFileName = Dir_DocuBase + bak.Version + bak.Username + BackupExtFile if err !=nil{
return GJerror(err)
// maybe:收集D盘剩余空间 }
PntReport(bak.Explain) var filename string
switch wetype{
case 1:
filename = "profile_vdocu.xml"
case 2:
filename = "profile_vappdata.xml"
default:
return GJerror(Error_Null_Folder_WeDrive)
}
//如果Start可以,并且得到了主用户 // 如果版本不是最新
currentVersion := Reg_Query_DC(Reg_Name_BackupVersion)
if (bak.Version != currentVersion) ||
NotExist(File_Sync_profile) ||
NotExist(File_Sync_settings) {
//判断是否有最新版本的文件是否存在 // 2 复制 最新文件
if NotExist(App_FreeFileSyncExe){ if _,err := CopyFile(Dir_Sync_Config + filename ,SMB_ADSoftPlusSync + filename);err !=nil{
SendServerError(Error_Null_App_Sync) return GJerror(err)
return nil }
if _,err := CopyFile(File_Sync_settings_full, SMB_ADSoftPlusSync + File_Sync_settings);err !=nil{
return GJerror(err)
}
// 3 生成 个性 文件
if err := CreateSelfXML(Dir_Sync_Config + filename,wetype,weid);err != nil {
return GJerror(err)
} }
//判断是否有最新版本的文件是否存在 // 4 更新 新版本
//C:\Users\Public\Documents\AD-Control\0416tengfei.ffs_batch Reg_Write_DC(Reg_Name_BackupVersion,bak.Version)
if NotExist(bak.BatchFileName){
bak.BatchFileExist = false bak.Explain = "Backup update config"
}else{
bak.BatchFileExist = true
} }
PntInfo(bak.Explain)
SendServer(bak) SendServer(bak)
return nil return nil
// 判断是否能进行备份 // 判断是否能进行备份
case Msg_Backup_Status_If:
bak.Username = HostnameToUsername(&bak.Username)
// 如果ffs的配置文件不存在 或者 是旧版本
// 读取新文件
if !bak.BatchFileExist || bak.Version != BackupVersion{
bak.BatchFileData = CreateExtTempate(&bak.Username)
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: case Msg_Backup_Status_Continue:
// 生成新FFS所使用的batch文件 bak.Timestamp = NowTimestamp()
bak.BatchFileName = Dir_DocuBase + bak.Version + bak.Username + BackupExtFile bak.Instruction = Msg_Backup_Status_Run
if !bak.BatchFileExist{
PntReport("init ",string(bak.BatchFileName))
if err := WriteBytesFile(bak.BatchFileName,bak.BatchFileData);err !=nil{
SendServerErrorf("%s %v-%v",bak.BatchFileName,Error_Fail_File_Write,err.Error())
}
}
bak.Status = Msg_Backup_Status_Run
bak.Explain = "Backup Ready"
return bak return bak
case Msg_Backup_Status_Run: case Msg_Backup_Status_Run:
SysMsgBox(bak.Computername,bak.Username + " 开始备份")
PsExec_sd(bak.Computername,App_FreeFileSyncExe + " "+ bak.BatchFileName)
}
Execcmd_nowait_noargs(App_Sync_dir)
default:
PntErrorf("%s %v",bak.Instruction,Error_Not_Msg)
}
return nil return nil
} }
...@@ -287,6 +307,6 @@ func (reg * MJreg)Msg_Deal() interface{}{ ...@@ -287,6 +307,6 @@ func (reg * MJreg)Msg_Deal() interface{}{
// 关于 error 错误 的 消息处理 // 关于 error 错误 的 消息处理
func (err * MJerror)Msg_Deal() interface{}{ func (err * MJerror)Msg_Deal() interface{}{
SendWX(err.Instruction) //SendWX(err.Instruction)
return nil return nil
} }
\ No newline at end of file
...@@ -42,14 +42,13 @@ const Msg_Report_OverCopyToWeDrive string = "overcopytowedrive" ...@@ -42,14 +42,13 @@ const Msg_Report_OverCopyToWeDrive string = "overcopytowedrive"
const Msg_Report_OverCopyToDeptShare string = "OverCopyToDeptShare" const Msg_Report_OverCopyToDeptShare string = "OverCopyToDeptShare"
const Msg_Report_StartBak string = "startbak" const Msg_Report_StartBak string = "startbak"
const Msg_Report_OverBak string = "overbak" const Msg_Report_OverBak string = "overbak"
const Msg_Report_DCInfo string = "DCInfo"
// msg backup type ////////////////////////////////////////////////////////////// // msg backup type //////////////////////////////////////////////////////////////
const Msg_Backup_Status_Start string = "start" const Msg_Backup_Status_Start string = "start"
const Msg_Backup_Status_If string = "if"
const Msg_Backup_Status_Continue string = "Continue" const Msg_Backup_Status_Continue string = "Continue"
const Msg_Backup_Status_Run string = "run" const Msg_Backup_Status_Run string = "run"
const Msg_Backup_Status_Error string = msgerror
// msg exec type //////////////////////////////////////////////////////////////// // msg exec type ////////////////////////////////////////////////////////////////
...@@ -75,8 +74,6 @@ const Msg_Exec_CopyDeptShare string = "copydeptshare" ...@@ -75,8 +74,6 @@ const Msg_Exec_CopyDeptShare string = "copydeptshare"
const Msg_Exec_GUIExec string = "guiexec" const Msg_Exec_GUIExec string = "guiexec"
// msg error type ///////////////////////////////////////////////////////////////
// //
const ( const (
Msg_Reg_Query = iota Msg_Reg_Query = iota
...@@ -119,11 +116,8 @@ type MJexec struct { ...@@ -119,11 +116,8 @@ type MJexec struct {
type MJbackup struct{ type MJbackup struct{
MJbase MJbase
Version string `json:"version"` Version string `json:"version"`
DiskFree string `json:"diskfree"`
//BatchFileExist bool `json:"batchfileexist"`
//BatchFileData []byte `json:"batchfiledata"`
//BatchFileName string `json:"batchfilename"`
} }
// registry Json Format /////////////////////////////////////////////////////
type MJreg struct{ type MJreg struct{
MJbase MJbase
Action int `json:"action"` Action int `json:"action"`
...@@ -133,6 +127,7 @@ type MJreg struct{ ...@@ -133,6 +127,7 @@ type MJreg struct{
DataType int `json:"datatype"` DataType int `json:"datatype"`
} }
// error Json Format /////////////////////////////////////////////////////
type MJerror struct{ type MJerror struct{
MJbase MJbase
} }
...@@ -152,13 +147,28 @@ func GJreport(s string) interface{}{ ...@@ -152,13 +147,28 @@ func GJreport(s string) interface{}{
rep.init(s) rep.init(s)
return rep return rep
} }
func (rep * MJreport)Reg_Write_Key_one_AC(key , value string){ func GJreport_DCInfo(s string) interface{}{
var rep MJreport
rep.init(Msg_Report_DCInfo)
rep.Explain = s
return rep
}
func (rep * MJreport)Reg_Write_AC(key , value string){
Reg_Write_key_one( Reg_Write_key_one(
Reg_Root_ac, Reg_Root_ac,
Reg_Path_home_ac + rep.Computername, Reg_Path_home_ac + rep.Computername,
key, key,
value) value)
} }
func (rep * MJreport)Reg_Query_AC(key string) string{
return Reg_query_key_one(
Reg_Root_ac,
Reg_Path_home_ac + rep.Computername,
key)
}
func (rep * MJreport)Pskill(cmd string){
Pskill(rep.Computername,cmd)
}
func (rep * MJreport)init(Report string) { func (rep * MJreport)init(Report string) {
rep.Computername = User_computername rep.Computername = User_computername
rep.Timestamp = NowTimestamp() rep.Timestamp = NowTimestamp()
...@@ -228,18 +238,16 @@ func (exec * MJexec)init(s string){ ...@@ -228,18 +238,16 @@ func (exec * MJexec)init(s string){
// Backup // Backup
func GJbackup(pc string)interface{}{ func GJbackup()interface{}{
var bak MJbackup var bak MJbackup
bak.init(pc) bak.init()
return bak return bak
} }
func (bak * MJbackup)init(pc string) { func (bak * MJbackup)init() {
//bak.Dept = User_dept
bak.Timestamp = NowTimestamp() bak.Timestamp = NowTimestamp()
bak.MsgType = Msg_Backup bak.MsgType = Msg_Backup
bak.Version = BackupVersion bak.Version = Bak_Version
bak.Status = Msg_Backup_Status_Start bak.Instruction = Msg_Backup_Status_Start
bak.Username = GetPrimaryUser(pc)
} }
......
...@@ -10,10 +10,18 @@ func PrintLog(v ...interface{}){ ...@@ -10,10 +10,18 @@ func PrintLog(v ...interface{}){
log.SetPrefix("Output ") log.SetPrefix("Output ")
log.Println(v ...) log.Println(v ...)
} }
func PrintLogPre(pre string,v ...interface{}){
log.SetPrefix(pre)
log.Println(v ...)
}
func PntInfo(v ...interface{}){ func PntInfo(v ...interface{}){
Loger.SetPrefix("Info ") Loger.SetPrefix("Info ")
Loger.Println(v ...) Loger.Println(v ...)
} }
func PntInfof(f string,v ...interface{}){
Loger.SetPrefix("Info ")
Loger.Printf(f,v ...)
}
func PntReport(v ...interface{}){ func PntReport(v ...interface{}){
Loger.SetPrefix("Report ") Loger.SetPrefix("Report ")
Loger.Println(v ...) Loger.Println(v ...)
...@@ -32,8 +40,14 @@ func PntReg(v ...interface{}){ ...@@ -32,8 +40,14 @@ func PntReg(v ...interface{}){
} }
func PntError(v ...interface{}){ func PntError(v ...interface{}){
Loger.SetPrefix("Error ") Loger.SetPrefix("Error ")
PrintLog(v ...)
Loger.Println(v ...) Loger.Println(v ...)
} }
func PntErrorf(f string,v ...interface{}){
Loger.SetPrefix("Error ")
PrintLog(v ...)
Loger.Printf(f,v ...)
}
func PntOth(v ...interface{}){ func PntOth(v ...interface{}){
Loger.SetPrefix("Other ") Loger.SetPrefix("Other ")
Loger.Println(v ...) Loger.Println(v ...)
......
...@@ -41,25 +41,55 @@ func JsonToByte(v interface{}) []byte{ ...@@ -41,25 +41,55 @@ func JsonToByte(v interface{}) []byte{
func WriteBytesFile(file string ,data []byte)error{ func WriteBytesFile(file string ,data []byte)error{
return ioutil.WriteFile(file,data,os.ModeSetuid) return ioutil.WriteFile(file,data,os.ModeSetuid)
} }
func CreateExtTempate(dist*string) []byte { func CreateSelfXML(filename string,wetype int,weid string) error {
base := BackupReplaceKey index := strings.Index(weid,"WeDrive")-1
var ret bytes.Buffer //var ret bytes.Buffer
file, err := os.Open(Dir_DocuBase + BackupVersion + "base"+BackupExtFile)
var user_source_homedir_re = []byte(strings.TrimPrefix(Dir_userprofile,`C:\Users\`))
var wedrive_source_id_re = []byte(weid[index-16:index])
var wedrive_dist_dept_re = []byte(User_dept)
var wedrive_dist_user_re = []byte(User_name_display)
var user_source_homedir = []byte("-tengfei-") // 源值,用户文件备份,源地址,家文件名,C:\Users\-tengfei-
//var user_dist_homedir = []byte("-tengfei-") // 源值,用户文件备份,目标地址,家文件名,D:\DomainUserBakcupV2\-tengfei-
//var wedrive_source_homedir = []byte("-tengfei-") // 源值,微盘文件备份,源地址,家文件名,C:\Users\-tengfei-\AppData\Roaming\Tencent\WXWork\Data\1688854025201314\WeDrive\知微数据
var wedrive_source_id = []byte("-1688854025201314-") // 源值,微盘文件备份,源标地址,微信ID,C:\Users\tengfei\AppData\Roaming\Tencent\WXWork\Data\-1688854025201314-\WeDrive\知微数据
var wedrive_dist_dept = []byte("-技术-") // 源值,微盘文件备份,目标地址,部门,\\adserver\ADMAIN\-技术-\陶腾飞\wedrive
var wedrive_dist_user = []byte("-陶腾飞-") // 源值,微盘文件备份,目标地址,\\adserver\ADMAIN\技术\-陶腾飞-\wedrive
if obj,err := os.OpenFile(filename,os.O_RDONLY,0755); err ==nil{
defult, err := os.OpenFile(File_Sync_profile_full, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0755)
scanner := bufio.NewScanner(obj)
defer obj.Close()
defer defult.Close()
for scanner.Scan() {
lineText := scanner.Bytes()
if bytes.Contains(lineText,user_source_homedir){
lineText = bytes.Replace(lineText,user_source_homedir, user_source_homedir_re,1)
}else if bytes.Contains(lineText,wedrive_source_id){
lineText = bytes.Replace(lineText,wedrive_source_id, wedrive_source_id_re,1)
}else if bytes.Contains(lineText,wedrive_dist_dept){
lineText = bytes.Replace(lineText,wedrive_dist_dept, wedrive_dist_dept_re,1)
}else if bytes.Contains(lineText,wedrive_dist_user){
lineText = bytes.Replace(lineText,wedrive_dist_user, wedrive_dist_user_re,1)
}
_, err = defult.Write(lineText)
if err != nil { if err != nil {
PntError(err) PntError(err)
return nil
} }
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lineText := scanner.Bytes()
if bytes.Index(lineText,base) != -1 {
lineText = bytes.Replace(lineText,base, []byte(*dist),1)
} }
ret.Write(lineText) }else{
ret.Write([]byte("\n")) SendServerErrorf("%s %v",filename,err)
} }
return ret.Bytes()
return nil
} }
// 从连接中 获取ip // 从连接中 获取ip
...@@ -73,6 +103,9 @@ func HasSuffix(str * string,sub string)bool{ ...@@ -73,6 +103,9 @@ func HasSuffix(str * string,sub string)bool{
func TrimSuffix(str ,s string)string{ func TrimSuffix(str ,s string)string{
return strings.TrimSuffix(str,s) return strings.TrimSuffix(str,s)
} }
func IndexString(str,sub string)int{
return strings.Index(str,sub)
}
func Exit(){ func Exit(){
os.Exit(0) os.Exit(0)
} }
...@@ -86,17 +119,41 @@ func HostnameToUsername(hostname * string)string { ...@@ -86,17 +119,41 @@ func HostnameToUsername(hostname * string)string {
} }
return *hostname return *hostname
} }
func AutoGetWeDriveDir()string{ func AutoGetWeDriveDir() (string,error) {
for _,i := range Dir_WeDrive{ for _,i := range Dir_WeDrive{
if NotExist(i){
continue
}
i += `\` i += `\`
PrintLog("开始读取",i)
n := GetNewFolder(i,"Global") n := GetNewFolder(i,"Global")
f := i + n + `\WeDrive\知微数据` f := i + n + `\WeDrive\知微数据`
if Exist(f){ if Exist(f){
PrintLog(f) return f,nil
return f }
} }
return "",Error_Null_Folder_WeDrive
}
func AutoFillInWeDriveDir() {
ADserverPanic()
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)
SendServerDCInfo(a)
}
}
}
func GetWeDriveVersion() (int,string,error) {
d := Reg_Query_DC(Reg_Name_WeDriveDir)
if strings.Contains(d, "Documents"){
return 2,d,nil
} else if strings.Contains(d, "AppData"){
return 1,d,nil
}else {
return 0,"",Error_Null_Folder_WeDrive
} }
SendServerError(Error_Null_Folder_WeDrive)
return ""
} }
\ No newline at end of file
...@@ -20,6 +20,9 @@ func SendDaemonExec(s string){ ...@@ -20,6 +20,9 @@ func SendDaemonExec(s string){
func SendServerReport(s string)[]byte{ func SendServerReport(s string)[]byte{
return SendServer(GJreport(s)) return SendServer(GJreport(s))
} }
func SendServerDCInfo(s string)[]byte{
return SendServer(GJreport_DCInfo(s))
}
func SendServerExec(s string)[]byte{ func SendServerExec(s string)[]byte{
return SendServer(GJexec(s)) return SendServer(GJexec(s))
} }
...@@ -35,6 +38,7 @@ func SendServerErrorf(f string, a ...interface{}) []byte { ...@@ -35,6 +38,7 @@ func SendServerErrorf(f string, a ...interface{}) []byte {
// send to server // send to server
func SendServer(v interface{})[]byte{ func SendServer(v interface{})[]byte{
if Adserver() {return nil}
return SendMsg(ADServerDaemon,v) return SendMsg(ADServerDaemon,v)
} }
// base // base
...@@ -74,8 +78,10 @@ func SendMsg(you string ,v interface{})[]byte{ ...@@ -74,8 +78,10 @@ func SendMsg(you string ,v interface{})[]byte{
// 发送 到 微信机器人 // 发送 到 微信机器人
func SendWX(Content string){ func SendWX(Content string){
if Adserver() {
if GetEnv("sendwx")!="1"{return}
}
// Content不支持发送Json, // Content不支持发送Json,
w := []byte(` w := []byte(`
{ {
"msgtype": "text", "msgtype": "text",
......
...@@ -27,7 +27,9 @@ func GetStrTime() string{ ...@@ -27,7 +27,9 @@ func GetStrTime() string{
func GetHour() int{ func GetHour() int{
return time.Now().Hour() return time.Now().Hour()
} }
func ParseTime(s string) (time.Time,error) {
return time.Parse("2006-01-02 15:04:05.999999999 -0700 MST",s)
}
// //
// //
......
...@@ -2,6 +2,31 @@ package public ...@@ -2,6 +2,31 @@ package public
// //
// //
// AD User env //
//
const AD_User_main_admin string = "zhiweiadserver"
const AD_User_tengfei string = "tengfei"
const AD_User_taotengfei string = "taotengfei"
const AD_User_huyibo string = "huyibo"
const AD_User_xuwenqiang string = "xuwenqiang"
const AD_User_zhiwei string = "zhiwei@zhiweireach.com"
const Zhiwei_Dept_HB string = "HB"
const Zhiwei_Dept_LP string = "LP"
const Zhiwei_Dept_MT string = "MT"
const Zhiwei_Dept_JR string = "JR"
const Zhiwei_Dept_JD string = "JD"
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
//
//
// If User // If User
// //
...@@ -11,11 +36,10 @@ func GetPrimaryUser(pc string) string { ...@@ -11,11 +36,10 @@ func GetPrimaryUser(pc string) string {
Reg_Path_home_ac + pc, Reg_Path_home_ac + pc,
Reg_Name_PrimaryUser) Reg_Name_PrimaryUser)
PntInfo(pc,name) PntInfo(pc,name)
return name return name
} }
func IsPrimaryUser(s string) bool{ func IsPrimaryUser(s string) bool{
if strings.Index(s,"zhiwei") == -1{ if IndexString(s,"zhiwei") == -1{
return true return true
} }
return false return false
...@@ -49,3 +73,8 @@ func Adserver() bool{ ...@@ -49,3 +73,8 @@ func Adserver() bool{
if Host_adserver == User_computername {return true} if Host_adserver == User_computername {return true}
return false return false
} }
func ADserverPanic() {
if Host_adserver == User_computername {
panic("no should run me in this env")
}
}
\ No newline at end of file
...@@ -2,9 +2,11 @@ package public ...@@ -2,9 +2,11 @@ package public
import( import(
"os" "os"
"io"
"os/exec" "os/exec"
"github.com/lxn/walk" "github.com/lxn/walk"
"strings" "strings"
"io/ioutil"
registry "github.com/golang/sys/windows/registry" registry "github.com/golang/sys/windows/registry"
"golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/simplifiedchinese"
) )
...@@ -72,6 +74,16 @@ func Execcmd_nowait(cmdargs string){ ...@@ -72,6 +74,16 @@ func Execcmd_nowait(cmdargs string){
PntError(err) PntError(err)
} }
} }
func Execcmd_copy(source,target string){
cmd := exec.Command("cmd", "/k", "copy","/y",`"`+source+`"` ,`"`+target+`"`)
if err := cmd.Start();err !=nil {
PntError(err)
}
if err := cmd.Wait() ;err !=nil{
PntError("Command finished with error: ",err)
}
}
func Execcmd_wait(cmdargs string,){ func Execcmd_wait(cmdargs string,){
app,appargs,err :=execcmd_base(cmdargs) app,appargs,err :=execcmd_base(cmdargs)
if err !=nil{ if err !=nil{
...@@ -84,7 +96,7 @@ func Execcmd_wait(cmdargs string,){ ...@@ -84,7 +96,7 @@ func Execcmd_wait(cmdargs string,){
} }
err = cmd.Wait() err = cmd.Wait()
if err !=nil{ if err !=nil{
PntError("Command finished with error: ",err) PntError(err)
} }
} }
func Execcmd_output(cmdargs string)[]byte{ func Execcmd_output(cmdargs string)[]byte{
...@@ -100,7 +112,20 @@ func Execcmd_output(cmdargs string)[]byte{ ...@@ -100,7 +112,20 @@ func Execcmd_output(cmdargs string)[]byte{
} }
return nil return nil
} }
func Execcmd_wait_noargs(app string){
cmd := exec.Command(app)
if err := cmd.Start(); err != nil {
PntError(err)
}
if err := cmd.Wait();err !=nil{
PntError(err)
}
}
func Execcmd_nowait_noargs(app string){
if err := exec.Command(app).Start(); err != nil {
PntError(err)
}
}
// //
// //
...@@ -140,6 +165,11 @@ func PsExec_sdic(pc ,cmd ,sessionid string) { ...@@ -140,6 +165,11 @@ func PsExec_sdic(pc ,cmd ,sessionid string) {
Execcmd_nowait(psExecCommand) Execcmd_nowait(psExecCommand)
} }
// 以管理员,立刻返回
func Pskill(pc ,cmd string) {
psExecCommand := `pskill \\` + pc + " "+cmd
Execcmd_nowait(psExecCommand)
}
// //
// //
...@@ -198,6 +228,18 @@ func Reg_query_item_one(root int ,path string) string { ...@@ -198,6 +228,18 @@ func Reg_query_item_one(root int ,path string) string {
return "" return ""
} }
} }
func Reg_query_item(root int ,path string) []string {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{
defer k.Close()
if sk,err := k.ReadSubKeyNames(0); err ==nil{
return sk
} else{
return nil
}
} else {
return nil
}
}
func Reg_query_key_one(root int, path, key string) string { func Reg_query_key_one(root int, path, key string) string {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{ if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{
defer k.Close() defer k.Close()
...@@ -279,8 +321,32 @@ func IsDir(path string) bool { ...@@ -279,8 +321,32 @@ func IsDir(path string) bool {
func IsFile(path string) bool { func IsFile(path string) bool {
return !IsDir(path) return !IsDir(path)
} }
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
srcFile, err := os.Open(srcFileName)
if err != nil {
PntErrorf("open file err = %v\n", err)
return
}
defer srcFile.Close()
// dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0755)
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0755)
if err != nil {
PntErrorf("open file err = %v\n", err)
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
func RemoveFile(name string)error{
return os.Remove(name)
}
// //
// //
// Folder operate // Folder operate
...@@ -300,7 +366,6 @@ func GetNewFolder(rdir ,extdir string) string { ...@@ -300,7 +366,6 @@ func GetNewFolder(rdir ,extdir string) string {
f,err := ioutil.ReadDir(rdir) f,err := ioutil.ReadDir(rdir)
if err !=nil{ if err !=nil{
PntError(err) PntError(err)
} }
firstModTime := f[0].ModTime() firstModTime := f[0].ModTime()
firstName := f[0].Name() firstName := f[0].Name()
......
...@@ -331,7 +331,7 @@ func tMultiSplit(){ ...@@ -331,7 +331,7 @@ func tMultiSplit(){
} }
// 其他工具 备份用户文件 // 其他工具 备份用户文件
func tBakcupUser(){ func tBakcupUser(){
if pub.Msg_YesNo("是否执行一次手动备份用户文件夹。目标文件夹:"+pub.User_profile)==1{ if pub.Msg_YesNo("是否执行一次手动备份用户文件夹。目标文件夹:"+pub.Dir_userprofile)==1{
pub.SendServerReport(pub.Msg_Report_StartBak) pub.SendServerReport(pub.Msg_Report_StartBak)
} }
} }
......
...@@ -5,34 +5,22 @@ import ( ...@@ -5,34 +5,22 @@ import (
pub "AD-Control/public" pub "AD-Control/public"
) )
func userInit() string{ func userInit() string{
pub.Loger = pub.NewLoger(pub.User_appdata+ `\users.log`) pub.Loger = pub.NewLoger(pub.Dir_appdata + `\users.log`)
pub.Reg_Exist_item(pub.HKCU,pub.Reg_Path_home) pub.Reg_Exist_item(pub.HKCU,pub.Reg_Path_home)
// 微盘备份步骤
if pub.Reg_Value_WeDriveDir != ""{
// && pub.Exist(pub.Dir_dept_share_full)
// 如果微盘的文件夹存在
// 则,重复执行
// 随机延迟300s,进行复制,固定延迟2h
go func (){
for{
pub.RandDelay(300)
pub.SendServer(pub.GJexecCopyWeDrive(pub.Msg_Exec_CopyWeDrive))
pub.Delay(7200)
}
}()
}
// 初始化 图标文件 // 初始化 图标文件
var icoDir =[]string {`AD-Control.ico`,`C:\windows\system32\AD-Control.ico`,`C:\Users\Public\Documents\AD-Control\AD-Control.ico`} 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{ for _,i := range icoDir{
if pub.Exist(i){ if pub.Exist(i){
return i return i
} }
} }
pub.SendServerErrorf("icon %v",pub.Error_Null_File) pub.SendServerError(pub.Error_Null_Icon_File)
return "" return ""
} }
......
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