// 发生错误,锁定程序并退出执行,哦,还要发邮件通知管理员 func (c *ACST) lockQuit(msg string) { if ok, _ := util.IsExist(c.Pwd + util.ACS_LOCKFILE); !ok { os.Create(c.Pwd + util.ACS_LOCKFILE) } // 发送邮件 mailConfig := &util.MailT{ Addr: c.Config["mailHost"], User: c.Config["mailUser"], Pass: c.Config["mailPass"], From: c.Config["mailFrom"], To: c.Config["mailTo"], Title: c.Config["mailTitle"], Type: "", } if mailConfig.Title == "" { mailConfig.Title = "9466代码机器人" } mailConfig.Body = "acs is locked, please check! " + time.Now().Format("2006-01-02 15:04:05") + "\r\n\r\n" + msg err := util.SendMail(mailConfig) if err != nil { c.Logger.Println(mailConfig.Body) c.Logger.Println("acs warning send error: ", err.Error()) } c.Logger.Println(msg) c.Logger.Fatalln("acs stopped!") }
// 标记跳过的处理 func (c *ACST) markBlank(rev int) (err error) { file := c.Config["commitDir"] + MARK_FILE if ok, _ := util.IsExist(file); !ok { // 创建 _, err = os.Create(file) if err != nil { return err } // 添加到svn err = c.svn.Add(c.Config["commitDir"], MARK_FILE) if err != nil { err = errors.New(MARK_FILE + " " + err.Error()) return } } // 更新 err = ioutil.WriteFile(file, []byte(strconv.Itoa(rev)+"\n"), 0644) return err }
// 文件编码处理 // 判断文件类型,如果是php,js要处理,如果是目录,跳过处理,直接创建 func (c *ACST) encodeFile(spath string) error { // for debug c.Logger.Println("beggin encode file: " + spath) // 排除处理,默认需要处理 need := true for _, item := range c.excludeList { if strings.Contains(spath, item) { // 发现排除,设为false need = false break } } var err error fileExt := util.GetExt(spath) fileDir := path.Dir(spath) if ok, _ := util.IsExist(c.Config["commitDir"] + fileDir); !ok { err = os.MkdirAll(c.Config["commitDir"]+fileDir, 0755) if err != nil { return err } } if need && fileExt != "" && strings.Contains(c.Config["encodeExt"], fileExt) { switch fileExt { case "php": err = util.EncodePhp(c.Config["encodeBinPHP"], c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) if err != nil { return errors.New(c.Config["checkoutDir"] + spath + " encodePHP error: " + err.Error()) } case "js": //err = util.EncodeJs(c.Config["encodeBinJAVA"], c.Config["encodeLibCompiler"], c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) err = util.EncodeJsUglifyJS(c.Config["encodeBinUglifyJS"], c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) if err != nil { if err.Error() == "exit status 127" { // 这个错误未知,重试一下看看 c.Logger.Println(c.Config["checkoutDir"] + spath + " encodeJS error: " + err.Error()) c.Logger.Println("encodeJS retry") err = util.EncodeJsUglifyJS(c.Config["encodeBinUglifyJS"], c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) if err != nil { return errors.New(c.Config["checkoutDir"] + spath + " encodeJS error: " + err.Error()) } // end retry } return errors.New(c.Config["checkoutDir"] + spath + " encodeJS error: " + err.Error()) } case "css": err = util.EncodeCss(c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) if err != nil { return errors.New(c.Config["checkoutDir"] + spath + " encodeCss error: " + err.Error()) } default: // 其它类型暂不支持,直接将文件COPY过去 err = util.CopyFile(c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) if err != nil { return errors.New(c.Config["checkoutDir"] + spath + " copy file error: " + err.Error()) } } } else { // 不进行处理的文件,直接COPY过去 util.CopyFile(c.Config["checkoutDir"]+spath, c.Config["commitDir"]+spath) if err != nil { return errors.New(c.Config["checkoutDir"] + spath + " copy file error: " + err.Error()) } } return nil }
func main() { var err error // 先设定工作目录 var dir string dir, err = util.GetDir() if err != nil { log.Fatalln("My God, GetDir Fatal!") } acs := new(ACST) acs.Pwd = dir // 检测是否存在错误锁定 if ok, _ := util.IsExist(acs.Pwd + util.ACS_LOCKFILE); ok { log.Fatalln("Sorry, acs had locked, please check error!") } // 启动daemon模式 if len(os.Args) > 1 && os.Args[1] == "-d" { _, err = daemon.Daemon(1, 0) if err != nil { log.Fatalln(err) } } // 加载配置文件 var conFile string conFile = "/conf/acs.conf" acs.parseConfig(acs.Pwd + conFile) // 加载过滤列表 conFile = "/conf/exclude.conf" acs.parseExcludeList(acs.Pwd + conFile) // 初始化日志 logFileHandle, err := os.OpenFile(acs.Config["logFile"], os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666) defer logFileHandle.Close() if err != nil { log.Fatalln(err.Error()) } acs.Logger = log.New(logFileHandle, "", log.Ldate|log.Ltime) // 判断工作目录是否存在,如果不存在则创建 if ok, err := util.IsExist(acs.Config["checkoutDir"]); !ok { err = os.Mkdir(acs.Config["checkoutDir"], 0777) if err != nil { log.Fatalln("checkoutDir create error: " + err.Error()) } } if ok, err := util.IsExist(acs.Config["commitDir"]); !ok { err = os.Mkdir(acs.Config["commitDir"], 0777) if err != nil { log.Fatalln("commitDir create error: " + err.Error()) } } // 初始化SVN结构 acs.svn = new(util.SVNT) acs.svn.Bin = acs.Config["svnBin"] // 初始化SVN目录 if ok, err := util.IsExist(acs.Config["checkoutDir"] + ".svn"); !ok { err = acs.svn.Checkout(acs.Config["checkoutDir"], acs.Config["svnReposCheckout"], 0) if err != nil { log.Fatalln("checkoutDir init svn error: " + err.Error()) } } if ok, err := util.IsExist(acs.Config["commitDir"] + ".svn"); !ok { err = acs.svn.Checkout(acs.Config["commitDir"], acs.Config["svnReposCommit"], 0) if err != nil { log.Fatalln("commitDir init svn error: " + err.Error()) } } // 检查错误是否已经被修正 if ok, err := acs.svn.Status(acs.Config["commitDir"]); ok { log.Fatalln("oh! there's some error need you check, to be use [svn status] error: " + err.Error()) } // 获取当前的工作的SVN版本 var svnInfo = new(util.SvnInfo) svnInfo, err = acs.svn.Info(acs.Config["checkoutDir"]) if err != nil { log.Fatalln("checkoutDir init svn info error: " + err.Error()) } acs.CheckoutRev = svnInfo.Rev svnInfo, err = acs.svn.Info(acs.Config["commitDir"]) if err != nil { log.Fatalln("commitDir init svn info error: " + err.Error()) } acs.CommitRev = svnInfo.Rev // 开始工作啦 for { time.Sleep(time.Second) acs.run() } }