|
@@ -0,0 +1,330 @@
|
|
|
+package weixin
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ . "gopkg.in/mgo.v2/bson"
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
+ "os/exec"
|
|
|
+ "qfw/util"
|
|
|
+ "qfw/util/mongodb"
|
|
|
+ "qfw/util/redis"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func processWxAdmin(openid, content string, w ResponseWriter, r *Request) {
|
|
|
+ util.Try(func() {
|
|
|
+
|
|
|
+ if openid != "" {
|
|
|
+ b, cmd, qleng, unit, var1, var2 := checkContent(content)
|
|
|
+ if b {
|
|
|
+ resStr := "无结果"
|
|
|
+ switch cmd {
|
|
|
+ case "f":
|
|
|
+ //查看抽奖模式
|
|
|
+ resStr = getMode()
|
|
|
+ case "c":
|
|
|
+ //切换抽奖模式
|
|
|
+ if var1 >= 0 && var1 <= 3 {
|
|
|
+ br := redis.Put("other", "s_luckydraw_mode", fmt.Sprintf("%d", var1), 0)
|
|
|
+ if br {
|
|
|
+ resStr = "模式已切换:" + getMode()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case "tjr":
|
|
|
+ //数据库抽奖查看
|
|
|
+ var1, var2 = getTimes(qleng, unit, var1, var2)
|
|
|
+ qu1 := M{"$gte": var1}
|
|
|
+ if qleng == 2 { //取区间
|
|
|
+ qu1 = M{"$gte": var2, "$lte": var1}
|
|
|
+ } else {
|
|
|
+ w.ReplyText("指令异常,请重新输入。")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ util.Try(func() {
|
|
|
+ sess := mongodb.GetMgoConn()
|
|
|
+ defer mongodb.DestoryMongoConn(sess)
|
|
|
+ var res []M
|
|
|
+ sess.DB("qfw").C("winningrecord").Pipe([]M{M{"$match": M{"l_timestamp": qu1}},
|
|
|
+ M{"$group": M{"_id": "$s_prize", "count": M{"$sum": 1}}}}).All(&res)
|
|
|
+ if res != nil && len(res) > 0 {
|
|
|
+ sum := 0
|
|
|
+ for _, v := range res {
|
|
|
+ resStr += "\n" + v["_id"].(string) + ":" + fmt.Sprintf("%x", v["count"])
|
|
|
+ sum += v["count"].(int)
|
|
|
+ }
|
|
|
+ resStr += "\n" + "总数:" + fmt.Sprintf("%d", sum)
|
|
|
+ }
|
|
|
+ }, func(e interface{}) {})
|
|
|
+ case "tju":
|
|
|
+ //新用户查看
|
|
|
+ var1, var2 = getTimes(qleng, unit, var1, var2)
|
|
|
+ qu1 := M{"$gte": var1}
|
|
|
+ if qleng == 2 { //取区间
|
|
|
+ qu1 = M{"$gte": var2, "$lte": var1}
|
|
|
+ } else {
|
|
|
+ w.ReplyText("指令异常,请重新输入。")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ util.Try(func() {
|
|
|
+ sess := mongodb.GetMgoConn()
|
|
|
+ defer mongodb.DestoryMongoConn(sess)
|
|
|
+ var res []M
|
|
|
+ sess.DB("qfw").C("user").Pipe([]M{M{"$match": M{"l_registedate": qu1}},
|
|
|
+ M{"$group": M{"_id": "$black", "count": M{"$sum": 1}}}}).All(&res)
|
|
|
+ if res != nil && len(res) > 0 {
|
|
|
+ sum := 0
|
|
|
+ for _, v := range res {
|
|
|
+ resStr += "\n" + util.If(v["_id"] == nil, "黑名单用户", "正常用户").(string) + ":" + fmt.Sprintf("%x", v["count"])
|
|
|
+ sum += v["count"].(int)
|
|
|
+ }
|
|
|
+ resStr += "\n" + "总数:" + fmt.Sprintf("%d", sum)
|
|
|
+ }
|
|
|
+ }, func(e interface{}) {})
|
|
|
+ case "ser":
|
|
|
+ //服务器实时统计情况
|
|
|
+ //各端口,及连接数
|
|
|
+ //总连接数
|
|
|
+ resStr = getServer()
|
|
|
+ case "man":
|
|
|
+ switch var1 {
|
|
|
+ case 1:
|
|
|
+ //重启core
|
|
|
+ cmdstr := getNewCmd(DIR, "core2016")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR, "core2016", cmdstr, true)
|
|
|
+ }
|
|
|
+ resStr = "重启主程序完成"
|
|
|
+ case 11:
|
|
|
+ //关闭core
|
|
|
+ cmdstr := getNewCmd(DIR, "core2016")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR, "core2016", cmdstr, false)
|
|
|
+ }
|
|
|
+ resStr = "关闭主程序完成"
|
|
|
+ case 2:
|
|
|
+ //重启weixin
|
|
|
+ cmdstr := getNewCmd(DIR+"/weixin", "weixin")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR+"/weixin", "weixin", cmdstr, true)
|
|
|
+ }
|
|
|
+ resStr = "重启微信程序完成"
|
|
|
+ case 22:
|
|
|
+ //不能关闭微信
|
|
|
+ break
|
|
|
+ case 3:
|
|
|
+ //重启积分
|
|
|
+ cmdstr := getNewCmd(DIR+"/credit", "credit")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR+"/credit", "credit", cmdstr, true)
|
|
|
+ }
|
|
|
+ resStr = "重启积分程序完成"
|
|
|
+ case 33:
|
|
|
+ cmdstr := getNewCmd(DIR+"/credit", "credit")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR+"/credit", "credit", cmdstr, false)
|
|
|
+ }
|
|
|
+ resStr = "关闭积分程序完成"
|
|
|
+ //关闭积分
|
|
|
+ case 4:
|
|
|
+ //重启oauth
|
|
|
+ cmdstr := getNewCmd(DIR+"/proxy", "oauth")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR+"/proxy", "oauth", cmdstr, true)
|
|
|
+ }
|
|
|
+ resStr = "重启微信程认证序完成"
|
|
|
+ case 44:
|
|
|
+ //关闭oauth
|
|
|
+ cmdstr := getNewCmd(DIR+"/proxy", "oauth")
|
|
|
+ if len(cmdstr) > 0 {
|
|
|
+ execCmd(DIR+"/proxy", "oauth", cmdstr, false)
|
|
|
+ }
|
|
|
+ resStr = "关闭微信程认证序完成"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println("res str", resStr)
|
|
|
+ w.ReplyText(resStr)
|
|
|
+ } else {
|
|
|
+ w.ReplyText("指令不存在,请重新输入。")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ w.ReplyText("用户信息不存在,请重新进入。")
|
|
|
+ delete(UserSession, openid)
|
|
|
+ }
|
|
|
+ }, func(e interface{}) {})
|
|
|
+}
|
|
|
+
|
|
|
+func getNewCmd(dir, substr string) string {
|
|
|
+ return getServerCmd(fmt.Sprintf(`ls -lt %s | grep %s |awk '{print $9}' |head -1`, dir, substr))
|
|
|
+}
|
|
|
+
|
|
|
+func execCmd(dir, subcmdstr, cmdstr string, bstart bool) bool {
|
|
|
+ exec.Command("/bin/sh", "-c", fmt.Sprintf(`ps -ef | grep %s | grep -v "grep" | awk '{print $2}' |xargs kill -9`, subcmdstr)).Run()
|
|
|
+ if bstart {
|
|
|
+ cmd := exec.Command("/bin/sh", "-c", fmt.Sprintf(`cd %s&& nohup ./%s &`, dir, cmdstr))
|
|
|
+ err := cmd.Run()
|
|
|
+ if err != nil {
|
|
|
+ return false
|
|
|
+ } else {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//获取服务器状态
|
|
|
+func getServer() (str string) {
|
|
|
+ util.Try(func() {
|
|
|
+ tmpStr := getServerCmd(`lsof -i|awk '{print $1}' | uniq -c | sort -nr`)
|
|
|
+ str = tmpStr
|
|
|
+ strs := strings.Split(tmpStr, "\n")
|
|
|
+ n := 0
|
|
|
+ for _, v := range strs {
|
|
|
+ tmps := strings.Split(strings.TrimSpace(v), " ")
|
|
|
+ if len(tmps) == 2 {
|
|
|
+ v, _ := strconv.Atoi(tmps[0])
|
|
|
+ n += v
|
|
|
+ }
|
|
|
+ }
|
|
|
+ str += "\n总连接数:" + fmt.Sprintf("%d", n)
|
|
|
+ }, func(e interface{}) {})
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func getServerCmd(c string) (str string) {
|
|
|
+ cmd := exec.Command("/bin/bash", "-c", c)
|
|
|
+ stdout, err := cmd.StdoutPipe()
|
|
|
+ if err != nil {
|
|
|
+ str = "StdoutPipe: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ stderr, err := cmd.StderrPipe()
|
|
|
+ if err != nil {
|
|
|
+ str = "StderrPipe: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if err := cmd.Start(); err != nil {
|
|
|
+ str = "Start: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ bytesErr, err := ioutil.ReadAll(stderr)
|
|
|
+ if err != nil {
|
|
|
+ str = "ReadAll stderr: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(bytesErr) != 0 {
|
|
|
+ str = fmt.Sprintf("stderr is not nil: %s", bytesErr)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ bytes, err := ioutil.ReadAll(stdout)
|
|
|
+ if err != nil {
|
|
|
+ str = "ReadAll stdout: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if err := cmd.Wait(); err != nil {
|
|
|
+ str = "Wait: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tmpStr := string(bytes)
|
|
|
+ str = strings.Trim(tmpStr, "\n")
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//根据区间算时间0没取
|
|
|
+func getTimes(qlen int, unit string, var1, var2 int64) (v1, v2 int64) {
|
|
|
+ now := time.Now().Unix()
|
|
|
+ switch unit {
|
|
|
+ case "m":
|
|
|
+ var1 = var1 * 60
|
|
|
+ var2 = var2 * 60
|
|
|
+ case "h":
|
|
|
+ var1 = var1 * 3600
|
|
|
+ var2 = var2 * 3600
|
|
|
+ case "d":
|
|
|
+ var1 = var1 * 86400
|
|
|
+ var2 = var2 * 86400
|
|
|
+ }
|
|
|
+ v1 = now - var1
|
|
|
+ v2 = now - var2
|
|
|
+ return
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//取抽奖模式
|
|
|
+func getMode() (resStr string) {
|
|
|
+ mode := redis.GetStr("other", "s_luckydraw_mode")
|
|
|
+ if mode == "0" {
|
|
|
+ resStr = "自动模式"
|
|
|
+ } else {
|
|
|
+ if mode == "" {
|
|
|
+ mode = "3"
|
|
|
+ }
|
|
|
+ resStr = "手动模式-" + mode
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//解析内容
|
|
|
+func checkContent(con string) (b bool, cmd string, qleng int, unit string, var1, var2 int64) {
|
|
|
+ conOne := reg.FindSubmatch([]byte(con))
|
|
|
+ if len(conOne) == 3 {
|
|
|
+ str2 := strings.Split(string(conOne[2]), "-")
|
|
|
+ cmd = string(conOne[1])
|
|
|
+ if len(str2) == 1 {
|
|
|
+ qleng = 1
|
|
|
+ conTwo := subreg.FindSubmatch([]byte(str2[0]))
|
|
|
+ if len(conTwo) == 2 {
|
|
|
+ unit = "s"
|
|
|
+ } else if len(conTwo) == 3 {
|
|
|
+ if len(conTwo[2]) > 0 {
|
|
|
+ unit = string(conTwo[2])
|
|
|
+ } else if unit == "" {
|
|
|
+ unit = "s"
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ b = true
|
|
|
+ vartemp, _ := strconv.Atoi(string(conTwo[1]))
|
|
|
+ var1 = int64(vartemp)
|
|
|
+ } else if len(str2) == 2 {
|
|
|
+ qleng = 2
|
|
|
+ conTwo := subreg.FindSubmatch([]byte(str2[0]))
|
|
|
+ if len(conTwo) == 2 {
|
|
|
+ unit = "s"
|
|
|
+ } else if len(conTwo) == 3 {
|
|
|
+ if len(conTwo[2]) > 0 {
|
|
|
+ unit = string(conTwo[2])
|
|
|
+ } else if unit == "" {
|
|
|
+ unit = "s"
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ vartemp, _ := strconv.Atoi(string(conTwo[1]))
|
|
|
+ var1 = int64(vartemp)
|
|
|
+
|
|
|
+ conTwo2 := subreg.FindSubmatch([]byte(str2[1]))
|
|
|
+ if len(conTwo2) == 2 && unit == "" {
|
|
|
+ unit = "s"
|
|
|
+ } else if len(conTwo2) == 3 {
|
|
|
+ if len(conTwo2[2]) > 0 {
|
|
|
+ unit = string(conTwo2[2])
|
|
|
+ } else if unit == "" {
|
|
|
+ unit = "s"
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ vartemp2, _ := strconv.Atoi(string(conTwo2[1]))
|
|
|
+ var2 = int64(vartemp2)
|
|
|
+ b = true
|
|
|
+ } else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|