go-gin实现api更改文件配置

有两个测试环境dev和test,因为公众号设定的限制,只能设2个回调域名,生产环境占用了一个,测试就只能来回切换,老是被测试和前端问在哪个环境。 写个脚本,粗暴点,实现 接收参数、读文件并正则、执行linux命令。(没有错误处理是不可取的)

路由1:http://xx.com:8090/wechat 获取当前环境
路由2:http://xx.com:8090/wechat?env=XX 修改nginx配置文件的接口代理环境并重加载
程序后台挂起:nohup go run ./wechat_env.go &

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os/exec"
	"regexp"
	"github.com/gin-gonic/gin"
)

var r = gin.New()

func main() {
    
    
	gin.ForceConsoleColor()
	r.Use(gin.Logger())
	r.Use(gin.Recovery())

	r.GET("/wechat", func(c *gin.Context) {
    
    
		env := c.DefaultQuery("env", "")
		filePath := "/etc/nginx/sites-enabled/new_wechat.conf"
		msg := ""
		switch env {
    
    
		case "":
			env = GetEnv(filePath)
			msg = "当前环境为" + env
		case "dev":
			fallthrough
		case "test":
			// 修改配置
			conf := ModifyConfig(env)
			// 加载配置
			NginxReload(conf, filePath)
			msg = "环境切换" + env + "成功"
			break
		default:
			msg = "环境参数错误"
		}

		c.JSON(http.StatusOK, gin.H{
    
    
			"message": msg,
		})
		return
	})

	r.Run(":8090")
}

# 获取当前环境,使用正则匹配
func GetEnv(filePath string) string {
    
    
	conf, _ := ioutil.ReadFile(filePath)
	reg := regexp.MustCompile(`http://local\.yxt-up-api-([a-z]+)`)
	result := reg.FindAllStringSubmatch(string(conf), -1)
	log.Println("当前环境:" + result[0][1])
	return result[0][1]
}

# 修改配置文件,其实只是模板的sprintf
func ModifyConfig(env string) string {
    
    
	template := `
# %s
server {
	listen 80;
	server_name _;
	root /vda2/var/www/new-wechat/dist;

	location / {
		try_files \$uri \$uri/ /index.html;
	}

	location /api/ {
		proxy_pass http://local.yxt-up-api-%s/;
	}

}
	`
	log.Println("修改环境为:" + env)
	return fmt.Sprintf(template, env, env)
}

# 修改文件,并重加载nginx配置
func NginxReload(conf string, filePath string) {
    
    
	cmd1 := `echo "` + conf + `" > ` + filePath
	exec.Command("bash", "-c", cmd1).Run()
	err := exec.Command("bash", "-c", "nginx -s reload").Run()
	if err != nil {
    
    
		log.Println(err)
	}
}

猜你喜欢

转载自blog.csdn.net/z772532526/article/details/112479240