private bool CoverServ(WebSiteServer ServObj, TaskFileInfo FileObj, string SiteName, FtpAtomOperation ftpCmdV3) { string SrcUriStr = this.PreCoverSrcFile(ServObj, FileObj); string AimUriStr = this.PreCoverAimFile(ServObj, FileObj); if (ftpCmdV3.CreateFtpListDirectory(ServObj.BaseUri, "/" + ServObj.DIRPATH + FileObj.RelAimFolder, ServObj.USER, ServObj.PASS)) { this.dbLog.Trace("[级联检查/创建]覆盖目标目录", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + FileObj.RelAimFolder); if (ftpCmdV3.RenameFtpFile(ServObj.BaseUri, SrcUriStr, AimUriStr, ServObj.USER, ServObj.PASS)) { this.dbLog.Trace("[文件移动]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr); return(true); } else { this.dbLog.Trace("[文件移动]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr); return(false); } } else { this.dbLog.Trace("[级联检查/创建]覆盖目标目录", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + FileObj.RelAimFolder); return(false); } }
private bool BackupServ(WebSiteServer ServObj, byte[] FileBytes, string SiteName, TaskFileInfo FileObj, string BackupBlock, FtpAtomOperation ftpCmdV3) { string AimUriStr1 = this.PreBakAimFolder(ServObj, FileObj, BackupBlock); if (ftpCmdV3.CreateFtpListDirectory(ServObj.BaseUri, AimUriStr1, ServObj.USER, ServObj.PASS)) { this.dbLog.Trace("[创建备份目录]", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1); string AimUriStr2 = this.PreBakAimFile(ServObj, FileObj, BackupBlock); if (ftpCmdV3.UploadFtpFile(ServObj.BaseUri, AimUriStr2, ServObj.USER, ServObj.PASS, FileBytes)) { this.dbLog.Trace("[上传备份文件]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",备份路径:" + AimUriStr2); return(true); } else { this.dbLog.Trace("[上传备份文件]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",备份路径:" + AimUriStr2); return(false); } } else { this.dbLog.Trace("[创建备份目录]", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1); return(false); } }
private void CoverSiteThread(WebSiteServer ServObj) { string name = this.SiteObj.SiteBaseInfo.NAME; int count = this.SiteObj.SiteBaseInfo.SERVLIST.Count; foreach (TaskFileInfo filePair in this.SiteObj.FilePairList) { if (!this.hasError) { if (this.CoverServ(ServObj, filePair, name, new FtpAtomOperation(this.dbLog))) { this.dbLog.Trace("[覆盖]单个服务器", name, "[成功]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile); UploadTrace.AddLog(filePair, this.block, "覆盖文件:" + filePair.FileName + "到:" + ServObj.NAME + "成功."); ++this.successnum; UploadTrace.FileCoverSuccess(filePair, this.block, ""); } else { UploadTrace.FileCoverFail(filePair, this.block, ServObj.NAME, ""); this._coverErrorFile = filePair; this._coverErrorServer = ServObj; UploadTrace.AddLog(filePair, this.block, "覆盖文件:" + filePair.FileName + "到:" + ServObj.NAME + "出错.准备回滚"); this.dbLog.Trace("[覆盖]单个服务器", name, "[失败]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile); this.hasError = true; break; } } } }
private void AutoRollBackSuccess(WebSiteServer ServObj, TaskFileInfo FileObj, string SiteName, string MarkBlock, string RollOp, string block) { string str1 = FileObj.RelAimFolder + "/" + FileObj.FileName; string str2 = "/" + ServObj.BAKFOLDER + "/" + MarkBlock + str1; this.dbLog.RollBakAutoSuccess(MarkBlock, ServObj.IP.ToString(), ServObj.PORT, str2, str1, SiteName, RollOp, this.block); }
/// <summary> /// 上传文件到单个服务器 /// </summary> /// <param name="ServObj"></param> /// <param name="FileBytes"></param> /// <param name="SiteName"></param> /// <param name="FileObj"></param> /// <param name="ftpcmdv3"></param> /// <returns></returns> private bool UploadServ(WebSiteServer ServObj, byte[] FileBytes, string SiteName, TaskFileInfo FileObj, FtpAtomOperation ftpcmdv3) { string AimUriStr1 = this.PreUpAimFolder(ServObj, FileObj); string AimUriStr2 = this.PreUpAimFile(ServObj, FileObj); if (!ftpcmdv3.CreateFtpListDirectory(ServObj.BaseUri, AimUriStr1, ServObj.USER, ServObj.PASS)) { this.dbLog.Trace("[级联创建]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1); return(false); } else { try { this.dbLog.Trace("[级联创建]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1); if (!ftpcmdv3.UploadFtpFile(ServObj.BaseUri, AimUriStr2, ServObj.USER, ServObj.PASS, FileBytes)) { this.dbLog.Trace("[上传文件]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr2); return(false); } else { this.dbLog.Trace("[上传文件]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr2); return(true); } } catch (Exception ex) { this.dbLog.Trace("[上传文件]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr2 + ",错误信息:" + ex.Message); return(false); } } }
/// <summary> /// 任务控制:覆盖 /// </summary> /// <returns></returns> private bool CoverSite() { if (!this.multiCover) { string name = this.SiteObj.SiteBaseInfo.NAME; int count = this.SiteObj.SiteBaseInfo.SERVLIST.Count; int num = 0; foreach (WebSiteServer ServObj in this.SiteObj.SiteBaseInfo.SERVLIST) { string coverStatus = num.ToString() + (object)"/" + (string)(object)count; foreach (TaskFileInfo filePair in this.SiteObj.FilePairList) { if (this.CoverServ(ServObj, filePair, name, new FtpAtomOperation(this.dbLog))) { this.dbLog.Trace("[覆盖]单个服务器", name, "[成功]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile); UploadTrace.FileCoverSuccess(filePair, this.block, coverStatus); } else { UploadTrace.FileCoverFail(filePair, this.block, ServObj.NAME, coverStatus); this._coverErrorFile = filePair; this._coverErrorServer = ServObj; UploadTrace.AddLog(filePair, this.block, "覆盖文件:" + filePair.FileName + "到:" + ServObj.NAME + "出错.准备回滚"); this.dbLog.Trace("[覆盖]单个服务器", name, "[失败]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile); return(false); } } ++num; } return(true); } else { this.successnum = 0; if (UploadTrace.IsTaskCancel(this.block)) { return(false); } try { foreach (WebSiteServer serv in this.SiteObj.SiteBaseInfo.SERVLIST) { TaskWorker.doCover doCover = new TaskWorker.doCover(this.CoverSiteThread); doCover.BeginInvoke(serv, new AsyncCallback(this.doCoverCallBack), (object)doCover); } } catch { return(false); } while (!this.hasError && this.successnum != this.SiteObj.FilePairList.Count * this.SiteObj.SiteBaseInfo.SERVLIST.Count) { Thread.Sleep(100); } return(!this.hasError); } }
/// <summary> /// 生成覆盖操作目标文件路径 /// </summary> /// <param name="ServObj"></param> /// <param name="FileObj"></param> /// <returns></returns> private string PreCoverAimFile(WebSiteServer ServObj, TaskFileInfo FileObj) { if (!string.IsNullOrEmpty(ServObj.DIRPATH)) { return("/" + ServObj.DIRPATH + (string.IsNullOrEmpty(FileObj.RelAimFolder) ? "" : FileObj.RelAimFolder) + "/" + FileObj.FileName); } else { return((string.IsNullOrEmpty(FileObj.RelAimFolder) ? "" : FileObj.RelAimFolder) + "/" + FileObj.FileName); } }
/// <summary> /// 生成备份文件路径 /// </summary> /// <param name="ServObj"></param> /// <param name="FileObj"></param> /// <param name="BackBlock"></param> /// <returns></returns> private string PreBakAimFile(WebSiteServer ServObj, TaskFileInfo FileObj, string BackBlock) { if (!string.IsNullOrEmpty(ServObj.DIRPATH)) { return(ServObj.DIRPATH + "/" + ServObj.BAKFOLDER + "/" + BackBlock + FileObj.AimFile.Replace("../", "/")); } else { return(ServObj.BAKFOLDER + "/" + BackBlock + FileObj.AimFile.Replace("../", "/")); } }
/// <summary> /// 生成备份文件目录 /// </summary> /// <param name="ServObj"></param> /// <param name="FileObj"></param> /// <param name="BackBlock"></param> /// <returns></returns> private string PreBakAimFolder(WebSiteServer ServObj, TaskFileInfo FileObj, string BackBlock) { if (!string.IsNullOrEmpty(ServObj.DIRPATH)) { return(ServObj.DIRPATH + "/" + ServObj.BAKFOLDER + "/" + BackBlock + FileObj.RelAimFolder); } else { return(ServObj.BAKFOLDER + "/" + BackBlock + FileObj.RelAimFolder); } }
/// <summary> /// 生成上传文件路径 /// </summary> /// <param name="ServObj"></param> /// <param name="FileObj"></param> /// <returns></returns> private string PreUpAimFile(WebSiteServer ServObj, TaskFileInfo FileObj) { if (!string.IsNullOrEmpty(ServObj.DIRPATH)) { return(ServObj.DIRPATH + "/" + ServObj.TRANSFOLDER + "/" + this.block + FileObj.AimFile.Replace("../", "/")); } else { return(ServObj.TRANSFOLDER + "/" + this.block + FileObj.AimFile.Replace("../", "/")); } }
/// <summary> /// 生成上传目录 /// </summary> /// <param name="ServObj"></param> /// <param name="FileObj"></param> /// <returns></returns> private string PreUpAimFolder(WebSiteServer ServObj, TaskFileInfo FileObj) { if (!string.IsNullOrEmpty(ServObj.DIRPATH)) { return(ServObj.DIRPATH + "/" + ServObj.TRANSFOLDER + "/" + this.block + FileObj.RelAimFolder); } else { return(ServObj.TRANSFOLDER + "/" + this.block + FileObj.RelAimFolder); } }
private byte[] GetBackFileBytes(WebSiteServer ServObj, TaskFileInfo FileObj, string LocalTransFolder, string SiteName) { bool flag = false; string ServRelFilePath = "/" + ServObj.DIRPATH + FileObj.AimFile.Replace("../", "/"); if (this.ftpcmd.GetFtpFileSize(ServObj.BaseUri, ServRelFilePath, ServObj.USER, ServObj.PASS) != -1) { flag = true; } if (!flag) { return((byte[])null); } if (!Directory.Exists(LocalTransFolder)) { this.CreateLocalListDir(LocalTransFolder); } if (!Directory.Exists(LocalTransFolder + "/" + this.block)) { this.CreateLocalListDir(LocalTransFolder + "/" + this.block); } if (!Directory.Exists(LocalTransFolder + "/" + this.block + FileObj.RelAimFolder)) { this.CreateLocalListDir(LocalTransFolder + "/" + this.block + FileObj.RelAimFolder); } //备份转存本地临时文件路径 string str = LocalTransFolder + "/" + this.block + FileObj.RelAimFolder + "/" + FileObj.FileName; if (this.ftpcmd.DownLoadFtpFile(ServObj.BaseUri, ServRelFilePath, str, ServObj.USER, ServObj.PASS)) { FileStream fileStream = File.Open(str, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); fileStream.Close(); fileStream.Dispose(); this.dbLog.Trace("[备份下载]下载文件", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",文件名:" + ServRelFilePath); return(buffer); } else { this.dbLog.Trace("[备份下载]下载文件", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件名:" + ServRelFilePath); return((byte[])null); } }
private bool RollbackServ(WebSiteServer ServObj, TaskFileInfo FileObj, string SiteName, string block, string serverstatus) { string SrcUriStr = ""; //如果_BackupBlock不为空,则为同步任务失败的回滚,否则为延后回滚 if (!string.IsNullOrEmpty(this._BackupBlock)) { SrcUriStr = this.PreBakAimFile(ServObj, FileObj, this._BackupBlock).Replace("//", "/"); } else { SrcUriStr = this.PreBakAimFile(ServObj, FileObj, this.block).Replace("//", "/"); } string AimUriStr = this.PreCoverAimFile(ServObj, FileObj); try { this.dbLog.Trace("[级联检查/回滚]覆盖目标目录", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + FileObj.RelAimFolder); if (this.ftpcmd.RenameFtpFile(ServObj.BaseUri, SrcUriStr, AimUriStr, ServObj.USER, ServObj.PASS)) { UploadTrace.FileRollBackSuccess(FileObj, block, serverstatus); this.AutoRollBackSuccess(ServObj, FileObj, SiteName, this._BackupBlock, "COVER", block); this.dbLog.Trace("[文件回滚]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr); return(true); } else { UploadTrace.FileRollBackFail(FileObj, block, ServObj.NAME, serverstatus); UploadTrace.AddLog(FileObj, block, "文件回滚:" + FileObj.FileName + "到:" + ServObj.NAME + "出错."); this.dbLog.Trace("[文件回滚]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr); this._coverErrorServer = ServObj; this._coverErrorFile = FileObj; return(false); } } catch { UploadTrace.FileRollBackFail(FileObj, block, ServObj.NAME, serverstatus); UploadTrace.AddLog(FileObj, block, "文件回滚:" + FileObj.FileName + "到:" + ServObj.NAME + "出错."); this.dbLog.Trace("[文件回滚]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr); return(false); } }