예제 #1
0
// 发生错误,锁定程序并退出执行,哦,还要发邮件通知管理员
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!")
}
예제 #2
0
// 标记跳过的处理
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
}
예제 #3
0
// 文件编码处理
// 判断文件类型,如果是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
}
예제 #4
0
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()
	}
}