registry.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "sparrow/pkg/generator"
  7. "sparrow/pkg/models"
  8. "sparrow/pkg/rpcs"
  9. )
  10. const (
  11. flagAESKey = "aeskey"
  12. )
  13. var confAESKey = flag.String(flagAESKey, "", "use your own aes encryting key.")
  14. var errDbActFailt = errors.New("数据库操作失败")
  15. type Registry struct {
  16. keygen *generator.KeyGenerator
  17. }
  18. func NewRegistry() (*Registry, error) {
  19. gen, err := generator.NewKeyGenerator(*confAESKey)
  20. if err != nil {
  21. return nil, err
  22. }
  23. return &Registry{
  24. keygen: gen,
  25. }, nil
  26. }
  27. func setVendor(target *models.Vendor, src *models.Vendor) {
  28. target.ID = src.ID
  29. target.VendorName = src.VendorName
  30. target.VendorDescription = src.VendorDescription
  31. target.VendorKey = src.VendorKey
  32. target.CreatedAt = src.CreatedAt
  33. target.UpdatedAt = src.UpdatedAt
  34. }
  35. func setProduct(target *models.Product, src *models.Product) {
  36. target.ID = src.ID
  37. target.ProductName = src.ProductName
  38. target.ProductDescription = src.ProductDescription
  39. target.ProductKey = src.ProductKey
  40. target.ProductConfig = src.ProductConfig
  41. target.VendorID = src.VendorID
  42. target.CreatedAt = src.CreatedAt
  43. target.UpdatedAt = src.UpdatedAt
  44. }
  45. func setApplication(target *models.Application, src *models.Application) {
  46. target.ID = src.ID
  47. target.AppName = src.AppName
  48. target.AppDescription = src.AppDescription
  49. target.AppKey = src.AppKey
  50. target.ReportUrl = src.ReportUrl
  51. target.AppToken = src.AppToken
  52. target.AppDomain = src.AppDomain
  53. target.CreatedAt = src.CreatedAt
  54. target.UpdatedAt = src.UpdatedAt
  55. }
  56. func setDevice(target *models.Device, src *models.Device) {
  57. target.ID = src.ID
  58. target.ProductID = src.ProductID
  59. target.DeviceIdentifier = src.DeviceIdentifier
  60. target.DeviceSecret = src.DeviceIdentifier
  61. target.DeviceKey = src.DeviceKey
  62. target.DeviceName = src.DeviceName
  63. target.DeviceDescription = src.DeviceDescription
  64. target.DeviceVersion = src.DeviceVersion
  65. target.CreatedAt = src.CreatedAt
  66. target.UpdatedAt = src.UpdatedAt
  67. }
  68. // SaveVendor will create a vendor if the ID field is not initialized
  69. // if ID field is initialized, it will update the conresponding vendor.
  70. func (r *Registry) SaveVendor(vendor *models.Vendor, reply *models.Vendor) error {
  71. db, err := getDB()
  72. if err != nil {
  73. return err
  74. }
  75. if vendor.ID == 0 {
  76. // if ID field is not initialized, will generate key first
  77. err = db.Save(vendor).Error
  78. if err != nil {
  79. return err
  80. }
  81. key, err := r.keygen.GenRandomKey(vendor.ID)
  82. if err != nil {
  83. return err
  84. }
  85. vendor.VendorKey = key
  86. }
  87. err = db.Save(vendor).Error
  88. if err != nil {
  89. return err
  90. }
  91. cache := getCache()
  92. cacheKey := fmt.Sprintf("Vendor:%v", vendor.ID)
  93. if _, ok := cache.Get(cacheKey); ok {
  94. cache.Delete(cacheKey)
  95. }
  96. // write cache
  97. cache.Set(cacheKey, vendor)
  98. setVendor(reply, vendor)
  99. return nil
  100. }
  101. // SaveApplication will create a application if the ID field is not initialized
  102. // if ID field is initialized, it will update the conresponding application.
  103. func (r *Registry) SaveApplication(app *models.Application, reply *models.Application) error {
  104. db, err := getDB()
  105. if err != nil {
  106. return err
  107. }
  108. if app.ID == 0 {
  109. err = db.Save(app).Error
  110. if err != nil {
  111. return err
  112. }
  113. key, err := r.keygen.GenRandomKey(app.ID)
  114. if err != nil {
  115. return err
  116. }
  117. app.AppKey = key
  118. }
  119. err = db.Save(app).Error
  120. if err != nil {
  121. return err
  122. }
  123. cache := getCache()
  124. cacheKey := fmt.Sprintf("Application:%v", app.ID)
  125. if _, ok := cache.Get(cacheKey); ok {
  126. cache.Delete(cacheKey)
  127. }
  128. setApplication(reply, app)
  129. return nil
  130. }
  131. // ValidateApplication try to validate the given app key.
  132. // if success, it will reply the corresponding application
  133. func (r *Registry) ValidateApplication(key string, reply *models.Application) error {
  134. db, err := getDB()
  135. if err != nil {
  136. return err
  137. }
  138. id, err := r.keygen.DecodeIdFromRandomKey(key)
  139. if err != nil {
  140. return err
  141. }
  142. cache := getCache()
  143. cacheKey := fmt.Sprintf("Application:%v", id)
  144. if cacheValue, ok := cache.Get(cacheKey); ok {
  145. app := cacheValue.(*models.Application)
  146. setApplication(reply, app)
  147. } else {
  148. err = db.First(reply, id).Error
  149. if err != nil {
  150. return err
  151. }
  152. var storage models.Application
  153. storage = *reply
  154. cache.Set(cacheKey, &storage)
  155. }
  156. if reply.AppKey != key {
  157. return errors.New("app key not match.")
  158. }
  159. return nil
  160. }
  161. // FindVendor will find product by specified ID
  162. func (r *Registry) FindVendor(id int32, reply *models.Vendor) error {
  163. db, err := getDB()
  164. if err != nil {
  165. return err
  166. }
  167. cache := getCache()
  168. cacheKey := fmt.Sprintf("Vendor:%v", id)
  169. if cacheValue, ok := cache.Get(cacheKey); ok {
  170. vendor := cacheValue.(*models.Vendor)
  171. setVendor(reply, vendor)
  172. } else {
  173. err = db.First(reply, id).Error
  174. if err != nil {
  175. return err
  176. }
  177. var storage models.Vendor
  178. storage = *reply
  179. cache.Set(cacheKey, &storage)
  180. }
  181. return nil
  182. }
  183. // GetVendors will get all vendors in the platform.
  184. func (r *Registry) GetVendors(noarg int, reply *[]models.Vendor) error {
  185. db, err := getDB()
  186. if err != nil {
  187. return err
  188. }
  189. return db.Find(reply).Error
  190. }
  191. // GetApplications will get all applications in the platform.
  192. func (r *Registry) GetApplications(noarg int, reply *[]models.Application) error {
  193. db, err := getDB()
  194. if err != nil {
  195. return err
  196. }
  197. return db.Find(reply).Error
  198. }
  199. // FindAppliation will find product by specified ID
  200. func (r *Registry) FindApplication(id int32, reply *models.Application) error {
  201. db, err := getDB()
  202. if err != nil {
  203. return err
  204. }
  205. cache := getCache()
  206. cacheKey := fmt.Sprintf("Application:%v", id)
  207. if cacheValue, ok := cache.Get(cacheKey); ok {
  208. app := cacheValue.(*models.Application)
  209. setApplication(reply, app)
  210. } else {
  211. err = db.First(reply, id).Error
  212. if err != nil {
  213. return err
  214. }
  215. var storage models.Application
  216. storage = *reply
  217. cache.Set(cacheKey, &storage)
  218. }
  219. return nil
  220. }
  221. // RegisterDevice try to register a device to our platform.
  222. // if the device has already been registered,
  223. // the registration will success return the registered device before.
  224. func (r *Registry) RegisterDevice(args *rpcs.ArgsDeviceRegister, reply *models.Device) error {
  225. db, err := getDB()
  226. if err != nil {
  227. return err
  228. }
  229. product := &models.Product{}
  230. err = r.ValidateProduct(args.ProductKey, product)
  231. if err != nil {
  232. return err
  233. }
  234. identifier := genDeviceIdentifier(product.VendorID, product.ID, args.DeviceCode)
  235. if db.Where(&models.Device{DeviceIdentifier: identifier}).First(reply).RecordNotFound() {
  236. // device is not registered yet.
  237. reply.ProductID = int32(product.ID)
  238. reply.DeviceIdentifier = identifier
  239. reply.DeviceName = product.ProductName // product name as default device name.
  240. reply.DeviceDescription = product.ProductDescription
  241. reply.DeviceVersion = args.DeviceVersion
  242. err = db.Save(reply).Error
  243. if err != nil {
  244. return err
  245. }
  246. // generate a random device key with hex encoding.
  247. reply.DeviceKey, err = r.keygen.GenRandomKey(reply.ID)
  248. if err != nil {
  249. return err
  250. }
  251. // generate a random password with base64 encoding.
  252. reply.DeviceSecret, err = generator.GenRandomPassword()
  253. if err != nil {
  254. return err
  255. }
  256. err = db.Save(reply).Error
  257. if err != nil {
  258. return err
  259. }
  260. } else {
  261. //delete cache
  262. cache := getCache()
  263. cacheKey := fmt.Sprintf("Device:%v", identifier)
  264. if _, ok := cache.Get(cacheKey); ok {
  265. cache.Delete(cacheKey)
  266. }
  267. // device has aleady been saved. just update version info.
  268. reply.DeviceVersion = args.DeviceVersion
  269. err = db.Save(reply).Error
  270. if err != nil {
  271. return err
  272. }
  273. }
  274. return nil
  275. }
  276. // FindDeviceByIdentifier will find the device by indentifier
  277. func (r *Registry) FindDeviceByIdentifier(identifier string, reply *models.Device) error {
  278. db, err := getDB()
  279. if err != nil {
  280. return err
  281. }
  282. cache := getCache()
  283. cacheKey := fmt.Sprintf("Device:%v", identifier)
  284. if cacheValue, ok := cache.Get(identifier); ok {
  285. device := cacheValue.(*models.Device)
  286. setDevice(reply, device)
  287. } else {
  288. err = db.Where(&models.Device{
  289. DeviceIdentifier: identifier,
  290. }).First(reply).Error
  291. if err != nil {
  292. return err
  293. }
  294. var storage models.Device
  295. storage = *reply
  296. cache.Set(cacheKey, &storage)
  297. }
  298. return nil
  299. }
  300. // FindDeviceById will find the device with given id
  301. func (r *Registry) FindDeviceById(id int64, reply *models.Device) error {
  302. db, err := getDB()
  303. if err != nil {
  304. return err
  305. }
  306. d := &models.Device{}
  307. d.ID = uint(id)
  308. err = db.Where(d).First(reply).Error
  309. if err != nil {
  310. return err
  311. }
  312. return nil
  313. }
  314. // ValidateDevice will validate a device key and return the model if success.
  315. func (r *Registry) ValidateDevice(key string, device *models.Device) error {
  316. id, err := r.keygen.DecodeIdFromRandomKey(key)
  317. if err != nil {
  318. return err
  319. }
  320. err = r.FindDeviceById(id, device)
  321. if err != nil {
  322. return err
  323. }
  324. if device.DeviceKey != key {
  325. return errors.New("device key not match.")
  326. }
  327. return nil
  328. }
  329. // UpdateDevice will update a device info by identifier
  330. func (r *Registry) UpdateDeviceInfo(args *rpcs.ArgsDeviceUpdate, reply *models.Device) error {
  331. db, err := getDB()
  332. if err != nil {
  333. return err
  334. }
  335. err = r.FindDeviceByIdentifier(args.DeviceIdentifier, reply)
  336. if err != nil {
  337. return err
  338. }
  339. //delete cache
  340. cache := getCache()
  341. cacheKey := fmt.Sprintf("Device:%v", args.DeviceIdentifier)
  342. if _, ok := cache.Get(cacheKey); ok {
  343. cache.Delete(cacheKey)
  344. }
  345. reply.DeviceName = args.DeviceName
  346. reply.DeviceDescription = args.DeviceDescription
  347. err = db.Save(reply).Error
  348. if err != nil {
  349. return err
  350. }
  351. return nil
  352. }
  353. // createRule create a new rule with specified parameters.
  354. func (r *Registry) CreateRule(args *models.Rule, reply *rpcs.ReplyEmptyResult) error {
  355. db, err := getDB()
  356. if err != nil {
  357. return err
  358. }
  359. return db.Save(args).Error
  360. }
  361. // queryRules queries rules by trigger and rule type.
  362. func (r *Registry) QueryRules(args *models.Rule, reply *[]models.Rule) error {
  363. db, err := getDB()
  364. if err != nil {
  365. return err
  366. }
  367. err = db.Where(args).Find(reply).Error
  368. if err != nil {
  369. return err
  370. }
  371. return nil
  372. }