apple 4 роки тому
батько
коміт
e153db6f23

+ 42 - 0
data_monitoring/vpn_client/src/main.go

@@ -0,0 +1,42 @@
+package main
+
+import (
+	"flag"
+	"github.com/cron"
+	"log"
+	"net/url"
+	"os"
+	"time"
+)
+
+var (
+	id	string
+)
+
+func init()  {
+	flag.StringVar(&id, "id", "", "唯一标识")
+}
+
+
+func main() {
+	//临时测试
+	id = "测试标识1"
+
+	if id=="" {
+		log.Println("传参不能为空......")
+		os.Exit(1)
+	}
+	c := cron.New()
+
+	c.AddFunc("0 */5 * * * ?", func() { task() })
+	c.Start()
+	time.Sleep(99999 * time.Hour)
+}
+
+func task()  {
+	u, _ := url.Parse("http://127.0.0.1:7811")
+	//u, _ := url.Parse("http://monitor.spdata.jianyu360.com")
+	q := u.Query()
+	q.Set("id", id)
+	u.RawQuery = q.Encode()
+}

+ 17 - 0
data_monitoring/vpn_server/src/config.json

@@ -0,0 +1,17 @@
+{
+  "port": "7811",
+  "ids" : [
+    "测试标识1",
+    "测试标识2"
+  ],
+  "during": 1,
+  "isErr" : 6,
+  "smtpMail": {
+    "from": "zhengkun@topnet.net.cn",
+    "to": "zhengkun@topnet.net.cn",
+    "smtpHost": "smtp.qq.com",
+    "smtpPort": "465",
+    "user":     "920032221@qq.com",
+    "pwd":      "xomkphsjsamybdbj"
+  }
+}

+ 115 - 0
data_monitoring/vpn_server/src/main.go

@@ -0,0 +1,115 @@
+package main
+
+import (
+	"fmt"
+	"github.com/cron"
+	"log"
+	"net/http"
+	qu "qfw/util"
+	"strings"
+	"time"
+)
+var (
+	sysconfig			map[string]interface{} //配置文件
+	port				string
+	idsArr				[]string
+	dataTmp				map[string]map[string]interface{}
+	during,isErr		int64
+)
+func init()  {
+	//加载配置文件Tmp
+	log.Println("加载...")
+	qu.ReadConfig(&sysconfig)
+	port = sysconfig["port"].(string)
+	arr := sysconfig["ids"].([]interface{})
+	idsArr = qu.ObjArrToStringArr(arr)
+	dataTmp = make(map[string]map[string]interface{},0)
+	for _,v := range idsArr{
+		id := qu.ObjToString(v)
+		dataTmp[id] = map[string]interface{}{
+			"isHeart":0, 		//是否发过mail
+			"isErrNum":0,		//错误次数
+			"isSendMail" : 0,   //是否发送过
+		}
+	}
+	during = qu.Int64All(sysconfig["during"])
+	isErr = qu.Int64All(sysconfig["isErr"])
+
+	log.Println("准备完毕...")
+}
+
+func main() {
+	//http://monitor.spdata.jianyu360.com/,程序端口7811
+	addr := ":"+port
+	http.HandleFunc("/", handler)
+	go http.ListenAndServe(addr, nil)
+
+	//每隔1分钟执行一次:0 */1 * * * ?
+	spec :=fmt.Sprintf("0 */%d * * * ?",during)
+	c := cron.New()
+	c.AddFunc(spec, func() { taskFinishing()})
+	c.Start()
+	time.Sleep(99999 * time.Hour)
+}
+
+func handler(w http.ResponseWriter, r *http.Request) {
+	r.ParseForm() //解析参数,默认是不会解析的
+	if r.Method == "GET" {
+		id := ""
+		for _, v := range r.Form {
+			id = strings.Join(v, "")
+		}
+		if id!="" { //改变-就状态
+			dataTmp[id] = map[string]interface{}{
+				"isHeart":1,
+				"isErrNum":0,
+				"isSendMail":0,
+			}
+		}
+	} else if r.Method == "POST" {
+
+	} else {
+
+	}
+}
+
+//不断监听处理
+func taskFinishing()  {
+	log.Println("执行...处理一次...")
+	isMailContent := ""
+	for _ , id := range idsArr {
+		//此标识-是否正常
+		isHeart ,isErrNum , isSendMail := qu.Int64All(dataTmp[id]["isHeart"]),int64(0),qu.Int64All(dataTmp[id]["isSendMail"])
+		if isSendMail == 1 { //送过邮件了
+			continue
+		}
+		if isHeart == 0 {
+			isErrNum = qu.Int64All(dataTmp[id]["isErrNum"])
+			isErrNum ++
+		}
+		//超过一定次数
+		if isErrNum > isErr { //发邮件
+			isErrNum = 0
+			if isMailContent == ""{
+				isMailContent = id
+			}else {
+				isMailContent = isMailContent+","+id
+			}
+			isSendMail = 1
+		}
+
+		dataTmp[id] = map[string]interface{}{
+			"isHeart":0,
+			"isErrNum":isErrNum,
+			"isSendMail":isSendMail,
+		}
+		//log.Println("处理:",dataTmp[id])
+	}
+
+	if isMailContent!=""{
+		log.Println("发邮件... ...",isMailContent)
+		sendErrMail("vpn异常",isMailContent)
+		//os.Exit(1)
+	}
+
+}

+ 315 - 0
data_monitoring/vpn_server/src/mgo.go

@@ -0,0 +1,315 @@
+package main
+
+import (
+	"context"
+	"log"
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type MgoSess struct {
+	Db     string
+	Coll   string
+	Query  interface{}
+	Sorts  []string
+	fields interface{}
+	limit  int64
+	skip   int64
+	M      *MongodbSim
+}
+
+type MgoIter struct {
+	Cursor *mongo.Cursor
+}
+
+func (mt *MgoIter) Next(result interface{}) bool {
+	if mt.Cursor != nil {
+		if mt.Cursor.Next(nil) {
+			err := mt.Cursor.Decode(result)
+			if err != nil {
+				log.Println("mgo cur err", err.Error())
+				mt.Cursor.Close(nil)
+				return false
+			}
+			return true
+		} else {
+			mt.Cursor.Close(nil)
+			return false
+		}
+	} else {
+		return false
+	}
+
+}
+
+func (ms *MgoSess) DB(name string) *MgoSess {
+	ms.Db = name
+	return ms
+}
+
+func (ms *MgoSess) C(name string) *MgoSess {
+	ms.Coll = name
+	return ms
+}
+
+func (ms *MgoSess) Find(q interface{}) *MgoSess {
+	ms.Query = q
+	return ms
+}
+
+func (ms *MgoSess) Select(fields interface{}) *MgoSess {
+	ms.fields = fields
+	return ms
+}
+
+func (ms *MgoSess) Limit(limit int64) *MgoSess {
+	ms.limit = limit
+	return ms
+}
+func (ms *MgoSess) Skip(skip int64) *MgoSess {
+	ms.skip = skip
+	return ms
+}
+
+func (ms *MgoSess) Sort(sorts ...string) *MgoSess {
+	ms.Sorts = sorts
+	return ms
+}
+
+func (ms *MgoSess) Iter() *MgoIter {
+	it := &MgoIter{}
+	find := options.Find()
+	if ms.skip > 0 {
+		find.SetSkip(ms.skip)
+	}
+	if ms.limit > 0 {
+		find.SetLimit(ms.limit)
+	}
+	find.SetBatchSize(100)
+	if len(ms.Sorts) > 0 {
+		sort := bson.M{}
+		for _, k := range ms.Sorts {
+			switch k[:1] {
+			case "-":
+				sort[k[1:]] = -1
+			case "+":
+				sort[k[1:]] = 1
+			default:
+				sort[k] = 1
+			}
+		}
+		find.SetSort(sort)
+	}
+	if ms.fields != nil {
+		find.SetProjection(ms.fields)
+	}
+	cur, err := ms.M.C.Database(ms.Db).Collection(ms.Coll).Find(ms.M.Ctx, ms.Query, find)
+	if err != nil {
+		log.Println("mgo find err", err.Error())
+	} else {
+		it.Cursor = cur
+	}
+	return it
+}
+
+type MongodbSim struct {
+	MongodbAddr string
+	Size        int
+	//	MinSize     int
+	DbName   string
+	C        *mongo.Client
+	Ctx      context.Context
+	ShortCtx context.Context
+	pool     chan bool
+}
+
+func (m *MongodbSim) GetMgoConn() *MgoSess {
+	//m.Open()
+	ms := &MgoSess{}
+	ms.M = m
+	return ms
+}
+
+func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
+	//m.Close()
+	ms.M = nil
+	ms = nil
+}
+
+func (m *MongodbSim) InitPool() {
+	opts := options.Client()
+	opts.SetConnectTimeout(3 * time.Second)
+	opts.ApplyURI("mongodb://" + m.MongodbAddr)
+	opts.SetMaxPoolSize(uint64(m.Size))
+	m.pool = make(chan bool, m.Size)
+	opts.SetMaxConnIdleTime(2 * time.Hour)
+	m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)
+	m.ShortCtx, _ = context.WithTimeout(context.Background(), 1*time.Minute)
+	client, err := mongo.Connect(m.ShortCtx, opts)
+	if err != nil {
+		log.Println("mgo init error:", err.Error())
+	} else {
+		m.C = client
+		log.Println("init success")
+	}
+}
+
+func (m *MongodbSim) Open() {
+	m.pool <- true
+}
+func (m *MongodbSim) Close() {
+	<-m.pool
+}
+
+//批量插入
+func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewUpdateOneModel()
+		write.SetFilter(d[0])
+		write.SetUpdate(d[1])
+		write.SetUpsert(true)
+		writes = append(writes, write)
+	}
+	r, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		log.Println("mgo upsert error:", e.Error())
+		return nil, false
+	}
+	//	else {
+	//		if r.UpsertedCount != int64(len(doc)) {
+	//			log.Println("mgo upsert uncomplete:uc/dc", r.UpsertedCount, len(doc))
+	//		}
+	//		return true
+	//	}
+	return r.UpsertedIDs, true
+}
+
+//批量插入
+func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewInsertOneModel()
+		write.SetDocument(d)
+		writes = append(writes, write)
+	}
+	_, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		log.Println("mgo savebulk error:", e.Error())
+		return false
+	}
+	return true
+}
+
+//保存
+func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r, err := coll.InsertOne(m.Ctx, doc)
+	if err != nil {
+		return nil
+	}
+	return r.InsertedID
+}
+
+//更新by Id
+func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)}, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+//删除by id
+func (m *MongodbSim) DeleteById(c, id string) int64 {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r, err := coll.DeleteOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)})
+	if err != nil {
+		return 0
+	}
+	return r.DeletedCount
+}
+
+//通过条件删除
+func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r, err := coll.DeleteMany(m.Ctx, query)
+	if err != nil {
+		return 0
+	}
+	return r.DeletedCount
+}
+
+//findbyid
+func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r := coll.FindOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)})
+	v := map[string]interface{}{}
+	r.Decode(&v)
+	return v
+}
+
+//findone
+func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r := coll.FindOne(m.Ctx, query)
+	v := map[string]interface{}{}
+	r.Decode(&v)
+	return v
+}
+
+//find
+func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	op := options.Find()
+	r, err := coll.Find(m.Ctx, query, op.SetSort(sort), op.SetProjection(fields))
+	if err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+	var results []map[string]interface{}
+	if err = r.All(m.Ctx, &results); err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+	return results, nil
+}
+
+//创建_id
+func NewObjectId() primitive.ObjectID {
+	return primitive.NewObjectID()
+}
+
+func StringTOBsonId(id string) primitive.ObjectID {
+	objectId, _ := primitive.ObjectIDFromHex(id)
+	return objectId
+}
+
+func BsonTOStringId(id interface{}) string {
+	return id.(primitive.ObjectID).Hex()
+}

+ 39 - 0
data_monitoring/vpn_server/src/sendmail.go

@@ -0,0 +1,39 @@
+package main
+
+import (
+	"log"
+	qu "qfw/util"
+	"qfw/util/mail"
+)
+
+var from,to, smtpHost,user,pwd string
+var smtpPort int
+
+
+func sendErrMail(title,body string) {
+
+
+	smtpMail, _ := sysconfig["smtpMail"].(map[string]interface{})
+
+	if smtpMail != nil {
+		from, _ = smtpMail["from"].(string)
+		to, _ = smtpMail["to"].(string)
+		smtpHost, _ = smtpMail["smtpHost"].(string)
+		smtpPort= qu.IntAll(smtpMail["smtpPort"])
+		user, _ = smtpMail["user"].(string)
+		pwd, _ = smtpMail["pwd"].(string)
+	}
+	ok := mail.GSendMail_B(user, from, from, from, title, body, "", nil, &mail.GmailAuth{
+		SmtpHost: smtpHost,
+		SmtpPort: smtpPort,
+		User:     user,
+		Pwd:      pwd,
+	})
+	if ok {
+		log.Println("邮件发送-成功...")
+	}else {
+		log.Println("邮件发送-失败...")
+	}
+
+}
+