lijian před 6 roky
rodič
revize
f7ab84a96d

+ 42 - 0
pkg/models/alarmrule.go

@@ -0,0 +1,42 @@
+package models
+
+import (
+	"errors"
+
+	"github.com/jinzhu/gorm"
+)
+
+// AlarmRule 报警规则
+// 为某个产品增加一个告警规则,平台可以根据设备的实时数据产生一个告警信息,并推送给用户
+// 用来监控设备的状态异常等
+type AlarmRule struct {
+	gorm.Model
+
+	AlertName      string `gorm:"size:30;not null"` //规则名称
+	ProtocalID     int    //所属数据点ID
+	ProtocalName   string //协议名称
+	AlertCondition int    //对应触发条件的属性编号
+	// |1|小于|
+	// |2|等于|
+	// |3|大于|
+	// |4|小于等于|
+	// |5|大于等于|
+	// |6|不等于|
+	AlertValue   int    //触发对比数值
+	AlertContent string `gorm:"size:500;not null"` // 告警内容
+	AlertType    int    // 告警类型:1:设备异常 2:设备警告
+	NoticeType   int    // 通知类型:1:通知型<br>2:告警型
+	NoticeWay    int    //通知方式 1:短信通知<br>2:极光推送<br>3:微信通知<br>
+	ProductID    int    //关联的产品ID
+	VendorID     uint   //关联厂商ID
+}
+
+// Validate 验证
+func (a *AlarmRule) Validate() error {
+	if a.AlertName == "" ||
+		a.AlertCondition == 0 || a.AlertValue == 0 || a.AlertContent == "" ||
+		a.AlertType == 0 || a.NoticeType == 0 || a.ProductID == 0 {
+		return errors.New("非法参数")
+	}
+	return nil
+}

+ 1 - 1
pkg/models/rule.go

@@ -1,4 +1,3 @@
-// rule is used for automated works such as timers, ifttts.
 package models
 
 import (
@@ -6,6 +5,7 @@ import (
 )
 
 // Rule rule
+// rule is used for automated works such as timers, ifttts.
 type Rule struct {
 	gorm.Model
 	// which device the rule belongs to

+ 1 - 0
pkg/mysql/migrate.go

@@ -42,6 +42,7 @@ func MigrateDatabase(dbhost, dbport, dbname, dbuser, dbpass string) error {
 		&models.Privilege{},
 		&models.Role{},
 		&models.Protocal{},
+		&models.AlarmRule{},
 	).Error
 	if err != nil {
 		fmt.Printf("%s", err.Error())

+ 3 - 3
publish.sh

@@ -2,8 +2,8 @@ git add .
 git commit -m $1
 git push
 
-#ssh root@192.168.175.60 -p kaiwu123
+ssh root@192.168.175.60
 
-#git pull
+git pull
 
-#./install.sh
+./install.sh

+ 1 - 1
run.sh

@@ -6,7 +6,7 @@ sudo killall -9 httpaccess registry apiprovider devicemanager controller mqttacc
 #$GOPATH/bin/httpaccess -etcd http://localhost:2379 -httphost internal:443 -loglevel debug -usehttps -keyfile $GOPATH/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile $GOPATH/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem &
 $GOPATH/bin/httpaccess -etcd http://192.168.175.60:2379 -httphost localhost:8088 -loglevel debug &
 $GOPATH/bin/registry -etcd http://192.168.175.60:2379 -rpchost localhost:20034 -aeskey ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP -dbhost 192.168.175.60 -dbname SparrowCloud -dbport 3306 -dbuser SparrowCloud -dbpass 123456 -loglevel debug &
-$GOPATH/bin/apiprovider -etcd http://192.168.175.60:2379 -loglevel debug  -httphost localhost:8888 -dbhost 192.168.175.60 -dbname SparrowCloud -dbport 3306 -dbuser SparrowCloud -dbpass 123456 &
+$GOPATH/bin/apiprovider -etcd http://192.168.175.60:2379 -loglevel debug  -httphost localhost:8888 &
 $GOPATH/bin/devicemanager -etcd http://192.168.175.60:2379 -loglevel debug  -rpchost localhost:20033 &
 $GOPATH/bin/controller -etcd http://192.168.175.60:2379 -loglevel debug  -rpchost localhost:20032 &
 #$GOPATH/bin/mqttaccess -etcd http://localhost:2379 -loglevel debug  -rpchost localhost:20030 -tcphost internal:1883 -usetls -keyfile $GOPATH/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile $GOPATH/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem &

+ 0 - 16
services/apiprovider/flags.go

@@ -7,24 +7,8 @@ import (
 const (
 	flagRabbitHost    = "rabbithost"
 	defaultRabbitHost = "amqp://knowocloud:123456@192.168.175.60:5672/"
-
-	flagDBHost = "dbhost"
-	flagDBPort = "dbport"
-	flagDBName = "dbname"
-	flagDBUser = "dbuser"
-	flagDBPass = "dbpass"
-
-	defaultDBHost = "192.168.175.60"
-	defaultDBPort = "3306"
-	defaultDBName = "SparrowCloud"
-	defaultDBUser = "SparrowCloud"
 )
 
 var (
-	confDBHost     = flag.String(flagDBHost, defaultDBHost, "database host address.")
-	confDBPort     = flag.String(flagDBPort, defaultDBPort, "database host port.")
-	confDBName     = flag.String(flagDBName, defaultDBName, "database name.")
-	confDBUser     = flag.String(flagDBUser, defaultDBUser, "database user.")
-	confDBPass     = flag.String(flagDBPass, "", "databse password.")
 	confRabbitHost = flag.String(flagRabbitHost, defaultRabbitHost, "rabbitmq host address, amqp://user:password@ip:port/")
 )

+ 2 - 33
services/apiprovider/main.go

@@ -1,14 +1,10 @@
 package main
 
 import (
-	"net/http"
-	"sparrow/pkg/mysql"
 	"sparrow/pkg/server"
 
 	"github.com/go-martini/martini"
-	"github.com/jinzhu/gorm"
 	"github.com/martini-contrib/render"
-	"github.com/xyproto/permissionsql"
 )
 
 func main() {
@@ -18,30 +14,17 @@ func main() {
 		server.Log.Fatal(err)
 		return
 	}
-	DSN := *confDBUser + ":" + *confDBPass + "@tcp(" + *confDBHost + ":" + *confDBPort + ")/" + *confDBName + "?charset=utf8&parseTime=True"
 	// martini setup
 
 	martini.Env = martini.Prod
 	handler := martini.Classic()
-	perm, err := permissionsql.NewWithDSN(DSN, *confDBName)
+
 	if err != nil {
 		server.Log.Fatal(err)
 		return
 	}
 	handler.Use(render.Renderer())
-	permissionHandler := func(w http.ResponseWriter, req *http.Request, c martini.Context) {
-		// Check if the user has the right admin/user rights
-		if perm.Rejected(w, req) {
-			// Deny the request
-			http.Error(w, "Permission denied!", http.StatusForbidden)
-			// Reject the request by not calling the next handler below
-			return
-		}
-		// Call the next middleware handler
-		c.Next()
-	}
-	handler.Use(permissionHandler)
-	route(handler, perm)
+	route(handler)
 
 	// register a http handler
 	err = server.RegisterHTTPHandler(handler)
@@ -62,17 +45,3 @@ func main() {
 		server.Log.Fatal(err)
 	}
 }
-
-func getDB() (*gorm.DB, error) {
-	db, err := mysql.GetClient(*confDBHost, *confDBPort, *confDBName, *confDBUser, *confDBPass)
-	if err != nil {
-		return nil, err
-	}
-	gormdb, err := gorm.Open("mysql", db)
-	if err != nil {
-		return nil, err
-	}
-	gormdb.SingularTable(true)
-	gormdb.LogMode(true)
-	return gormdb, nil
-}

+ 1 - 2
services/apiprovider/router.go

@@ -2,11 +2,10 @@ package main
 
 import (
 	"github.com/go-martini/martini"
-	"github.com/xyproto/permissionsql"
 )
 
 // martini router
-func route(m *martini.ClassicMartini, perm *permissionsql.Permissions) {
+func route(m *martini.ClassicMartini) {
 
 	// jwt handler
 	// handler := New(Config{

+ 10 - 0
services/knowoapi/main.go

@@ -5,6 +5,7 @@ import (
 	"sparrow/pkg/server"
 	"sparrow/services/knowoapi/model"
 
+	"github.com/iris-contrib/middleware/cors"
 	"github.com/kataras/iris"
 )
 
@@ -29,6 +30,15 @@ func main() {
 	if err != nil {
 		server.Log.Fatal(err)
 	}
+	//cors
+	opts := cors.Options{
+		AllowedOrigins: []string{"*"},
+		AllowedHeaders: []string{"Content-Type"},
+		AllowedMethods: []string{"POST,GET,DELETE,PUT"},
+		ExposedHeaders: []string{"X-Header"},
+	}
+	app.Use(cors.New(opts))
+	app.AllowMethods(iris.MethodOptions)
 	registerErrors(app)
 	//注册路由
 	registerRouters(app, models, gen)

+ 100 - 0
services/knowoapi/model/alert.go

@@ -0,0 +1,100 @@
+package model
+
+import (
+	"fmt"
+	"sparrow/pkg/models"
+
+	"github.com/jinzhu/gorm"
+)
+
+// Alert model
+type Alert struct {
+	db *gorm.DB
+}
+
+// Init init Alert
+func (a *Alert) Init(db *gorm.DB) *Alert {
+	a.db = db
+	return a
+}
+
+// Create create a alert rule
+func (a *Alert) Create(alert *models.AlarmRule) error {
+	err := a.db.Create(alert).Error
+	if err == nil {
+		cache := getCache()
+		key := fmt.Sprintf("Alert:%d", alert.ID)
+		cache.Set(key, &alert)
+	}
+	return err
+}
+
+// Delete delete a alert rule
+func (a *Alert) Delete(alert *models.AlarmRule) error {
+	cache := getCache()
+	key := fmt.Sprintf("Alert:%d", alert.ID)
+	if _, ok := cache.Get(key); ok {
+		cache.Delete(key)
+	}
+	return a.db.Delete(alert).Error
+}
+
+// Update 指定厂商ID
+func (a *Alert) Update(vendorid uint, alert *models.AlarmRule) (data models.AlarmRule, err error) {
+	cache := getCache()
+	key := fmt.Sprintf("Alert:%d", alert.ID)
+	if _, ok := cache.Get(key); ok {
+		cache.Delete(key)
+	}
+	err = a.db.Model(&data).Update(alert).Where("vendor_id = ?", vendorid).Error
+	if err == nil {
+		cache.Set(key, &data)
+	}
+	return
+}
+
+// GetRules 获取告警列表
+// vendorid:厂商ID
+// proid:产品ID,可选
+// procalid:协议ID, 可选
+// name: 规则名称,可选,模糊搜索
+func (a *Alert) GetRules(vendorid uint, pi, ps, proid, protocalid int, name string) (datas []models.AlarmRule, total int, err error) {
+	tx := a.db.Where("vendor_id = ? and 1=1")
+	if proid != 0 {
+		tx = tx.Where("product_id = ?")
+	}
+	if protocalid != 0 {
+		tx = tx.Where("protocal_id = ?", protocalid)
+	}
+	if name != "" {
+		tx = tx.Where("alert_name = ?", name)
+	}
+	err = tx.Limit(ps).Offset((pi - 1) * ps).Find(&datas).Error
+	err = tx.Model(&models.AlarmRule{}).Count(&total).Error
+	return
+}
+
+// GetAlarmRule 获取数据内容
+func (a *Alert) GetAlarmRule(vendorid uint, alertid int) (data models.AlarmRule, err error) {
+	cache := getCache()
+	key := fmt.Sprintf("Alert:%d", alertid)
+	if v, ok := cache.Get(key); ok {
+		_d := v.(*models.AlarmRule)
+		data = *_d
+	} else {
+		err = a.db.Where("vendor_id = ? and id = ?", vendorid, alertid).First(&data).Error
+		if err == nil {
+			cache.Set(key, &data)
+		}
+	}
+	return
+}
+
+// CheckProtocalRuleCount 返回数据点已经添加的告警数量
+func (a *Alert) CheckProtocalRuleCount(vendorid uint, protocalID int) (total int, err error) {
+	err = a.db.Model(&models.AlarmRule{}).
+		Where("vendor_id = ? and protocal_id = ?", vendorid, protocalID).
+		Count(&total).
+		Error
+	return
+}

+ 2 - 0
services/knowoapi/model/all.go

@@ -9,6 +9,7 @@ type All struct {
 	User        *User
 	Application *Application
 	Protocal    *Protocal
+	Alert       *Alert
 }
 
 // Init 初始化所有model
@@ -18,5 +19,6 @@ func (a *All) Init(db *gorm.DB) *All {
 	a.User = new(User).Init(db)
 	a.Application = new(Application).Init(db)
 	a.Protocal = new(Protocal).Init(db)
+	a.Alert = new(Alert).Init(db)
 	return a
 }

+ 2 - 0
services/knowoapi/model/protocal.go

@@ -80,3 +80,5 @@ func (a *Protocal) GetProtocalInfo(pid uint) (data models.Protocal, err error) {
 	}
 	return
 }
+
+// TODO 查询某个产品所有上报类型的数据点

+ 53 - 0
services/knowoapi/services/alert.go

@@ -0,0 +1,53 @@
+package services
+
+import (
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/model"
+)
+
+// AlertService 业务接口
+type AlertService interface {
+	Create(*models.AlarmRule) error
+	Delete(*models.AlarmRule) error
+	Update(uint, *models.AlarmRule) (models.AlarmRule, error)
+	// GetAlarmRules 获取告警列表
+	// vendorid:厂商ID
+	// proid:产品ID,可选
+	// procalid:协议ID, 可选
+	// name: 规则名称,可选,模糊搜索
+	GetAlarmRules(vendorid uint, pi, ps, proid, protocalid int, name string) ([]models.AlarmRule, int, error)
+	GetRule(vendorid uint, alertid int) (models.AlarmRule, error)
+}
+
+type alert struct {
+	model *model.All
+}
+
+// NewAlert create a alert back a  AlertService interface
+func NewAlert(model *model.All) AlertService {
+	return alert{
+		model: model,
+	}
+}
+
+func (a alert) Create(alert *models.AlarmRule) error {
+	_, err := a.model.Alert.CheckProtocalRuleCount(alert.VendorID, alert.ProtocalID)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (a alert) Delete(alert *models.AlarmRule) error {
+	return nil
+}
+
+func (a alert) Update(vendorid uint, alert *models.AlarmRule) (models.AlarmRule, error) {
+	return models.AlarmRule{}, nil
+}
+func (a alert) GetAlarmRules(vendorid uint, pi, ps, proid, protocalid int, name string) ([]models.AlarmRule, int, error) {
+	return a.model.Alert.GetRules(vendorid, pi, ps, proid, protocalid, name)
+}
+func (a alert) GetRule(vendorid uint, alertid int) (models.AlarmRule, error) {
+	return a.model.Alert.GetAlarmRule(vendorid, alertid)
+}