page_module.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. // package page_module -- страница показа модуля.
  2. package page_module
  3. import (
  4. _ "embed"
  5. "fmt"
  6. "strings"
  7. "github.com/gofiber/fiber/v3"
  8. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  9. mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  11. )
  12. // PageModule -- страница показа модуля.
  13. type PageModule struct {
  14. ctx mKt.IKernelCtx
  15. }
  16. var page *PageModule
  17. // GetPageModule -- возвращает страницу модуля.
  18. func GetPageModule() *mL0.Result[*PageModule] {
  19. if page != nil {
  20. return mL0.NewRes(page)
  21. }
  22. resKernCtx := kctx.GetKernelCtx()
  23. if resKernCtx.IsErr() {
  24. err := fmt.Errorf("GetPageModule(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
  25. return mL0.NewErr[*PageModule](err)
  26. }
  27. kCtx := resKernCtx.Val()
  28. optFiber := kCtx.Get("fiberApp")
  29. if optFiber.IsNone() {
  30. err := fmt.Errorf("GetPageModule(): not found fiberApp in kernel ctx")
  31. return mL0.NewErr[*PageModule](err)
  32. }
  33. fiberApp := optFiber.Val().Val().(*fiber.App)
  34. resSet := kCtx.Set("fiberApp", fiberApp, "fiberApp in GetPageModule()")
  35. if resSet.IsErr() {
  36. err := fmt.Errorf("GetPageModule(): in set fiberApp from kernel ctx, err=\n\t%w", resSet.Err())
  37. return mL0.NewErr[*PageModule](err)
  38. }
  39. sf := &PageModule{
  40. ctx: kCtx,
  41. }
  42. fiberApp.Post("/module/:id", sf.postModule)
  43. fiberApp.Post("/module_state/:id", sf.postModuleState)
  44. fiberApp.Post("/module_ctx/:id", sf.postModuleCtx)
  45. fiberApp.Post("/module_log/:id", sf.postModuleLog)
  46. fiberApp.Post("/module_svg_sec/svg_sec_:id.svg", sf.postSvgSec)
  47. fiberApp.Post("/module_svg_min/svg_min_:id.svg", sf.postSvgMin)
  48. fiberApp.Post("/module_svg_day/svg_day_:id.svg", sf.postSvgDay)
  49. page = sf
  50. return mL0.NewRes(sf)
  51. }
  52. //go:embed log_block.html
  53. var strLogBlock string
  54. // Возвращает страницу лога модуля.
  55. func (sf *PageModule) postModuleLog(ctx fiber.Ctx) error {
  56. id := ctx.Params("id", "1")
  57. module, _ := sf.getModule(id)
  58. if module == nil {
  59. strOut := strings.ReplaceAll(strLogBlock, "{.id}", id)
  60. strOut = strings.ReplaceAll(strOut, "{.log}", strOut)
  61. strOut = strings.ReplaceAll(strOut, "{.name}", "not found")
  62. strOut = strings.ReplaceAll(strOut, "{.mod_state}", "")
  63. return ctx.SendString(strOut)
  64. }
  65. _log := module.Log()
  66. if module.Name().Get() == "kCtx" {
  67. _log = sf.ctx.Log()
  68. }
  69. strOut := ""
  70. for i := range 100 {
  71. msg := _log.Get(i).String()
  72. if strings.Contains(msg, "*no msg*") {
  73. continue
  74. }
  75. strOut += msg + "\n"
  76. }
  77. strOut = strings.ReplaceAll(strLogBlock, "{.log}", strOut)
  78. strOut = strings.ReplaceAll(strOut, "{.name}", module.Name().Get())
  79. strOut = strings.ReplaceAll(strOut, "{.id}", id)
  80. return ctx.SendString(strOut)
  81. }
  82. //go:embed ctx_row_val.html
  83. var strCtxRowVal string
  84. //go:embed ctx_row_block.html
  85. var strCtxRowBlock string
  86. // Возвращает блок контекста монолита.
  87. func (sf *PageModule) postModuleCtx(ctx fiber.Ctx) error {
  88. id := ctx.Params("id", "1")
  89. module, _ := sf.getModule(id)
  90. if module == nil {
  91. strOut := strings.ReplaceAll(strCtxRowBlock, "{.id}", id)
  92. strOut = strings.ReplaceAll(strOut, "{.name}", "not found")
  93. strOut = strings.ReplaceAll(strOut, "{.ctx_block}", "")
  94. return ctx.SendString(strOut)
  95. }
  96. mCtx := module.Ctx()
  97. lst := mCtx.SortedList()
  98. if module.Name().Get() == "kCtx" {
  99. lst = sf.ctx.SortedList()
  100. }
  101. strOut := ""
  102. for _, val := range lst {
  103. strRow := strCtxRowVal
  104. strRow = strings.ReplaceAll(strRow, "{.key}", val.Key())
  105. _val := val.Val()
  106. valShort := fmt.Sprint(_val)
  107. runes := []rune(valShort)
  108. if len(runes) > 20 {
  109. runes = runes[:20]
  110. valShort = string(runes)
  111. }
  112. strRow = strings.ReplaceAll(strRow, "{.value}", valShort)
  113. _type := fmt.Sprintf("%#T", _val)
  114. _type = strings.ReplaceAll(_type, ".", ".<br>")
  115. strRow = strings.ReplaceAll(strRow, "{.type}", _type)
  116. strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().Get())
  117. strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().Get())
  118. strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
  119. strOut += strRow
  120. }
  121. strOut = strings.ReplaceAll(strCtxRowBlock, "{.ctx_block}", strOut)
  122. strOut = strings.ReplaceAll(strOut, "{.id}", id)
  123. strOut = strings.ReplaceAll(strOut, "{.name}", module.Name().Get())
  124. return ctx.SendString(strOut)
  125. }
  126. //go:embed module_state.html
  127. var strStateModule string
  128. //go:embed module_state_block.html
  129. var strStateModuleBlock string
  130. // Показывает состояние модуля.
  131. func (sf *PageModule) postModuleState(ctx fiber.Ctx) error {
  132. id := ctx.Params("id", "1")
  133. module, modVal := sf.getModule(id)
  134. if module == nil {
  135. strOut := strings.ReplaceAll(strStateModuleBlock, "{.id}", "")
  136. return ctx.SendString(strOut)
  137. }
  138. dictState := map[string]any{}
  139. dictState["{.name}"] = module.Name()
  140. dictState["{.createAt}"] = modVal.CreateAt()
  141. dictState["{.updateAt}"] = modVal.UpdateAt()
  142. dictState["{.comment}"] = modVal.Comment()
  143. dictState["{.id}"] = id
  144. dictState["{.live}"] = module.Live()
  145. dictState["{.svg_sec}"] = module.Stat().SvgSec()
  146. strOut := strStateModuleBlock
  147. for key, val := range dictState {
  148. strOut = strings.ReplaceAll(strOut, key, fmt.Sprint(val))
  149. }
  150. return ctx.SendString(strOut)
  151. }
  152. // Показывает состояние модуля.
  153. func (sf *PageModule) postModule(ctx fiber.Ctx) error {
  154. id := ctx.Params("id", "1")
  155. module, modVal := sf.getModule(id)
  156. if module == nil {
  157. strOut := strings.ReplaceAll(strStateModule, "{.name}", "unknown")
  158. strOut = strings.ReplaceAll(strOut, "{.mod_state}", "")
  159. strOut = strings.ReplaceAll(strOut, "{.id}", "")
  160. return ctx.SendString(strOut)
  161. }
  162. dictState := map[string]any{}
  163. dictState["{.name}"] = module.Name()
  164. dictState["{.createAt}"] = modVal.CreateAt()
  165. dictState["{.updateAt}"] = modVal.UpdateAt()
  166. dictState["{.comment}"] = modVal.Comment()
  167. // dictState["{.id}"] = id
  168. dictState["{.live}"] = module.Live()
  169. dictState["{.svg_sec}"] = module.Stat().SvgSec()
  170. strOut := strStateModuleBlock
  171. for key, val := range dictState {
  172. strOut = strings.ReplaceAll(strOut, key, fmt.Sprint(val))
  173. }
  174. {
  175. strOut = strings.ReplaceAll(strStateModule, "{.mod_state}", strOut)
  176. strOut = strings.ReplaceAll(strOut, "{.name}", module.Name().Get())
  177. strOut = strings.ReplaceAll(strOut, "{.id}", id)
  178. }
  179. return ctx.SendString(strOut)
  180. }
  181. // Возвращает секундную статистику модуля.
  182. func (sf *PageModule) postSvgDay(ctx fiber.Ctx) error {
  183. id := ctx.Params("id", "1")
  184. module, _ := sf.getModule(id)
  185. if module == nil {
  186. return ctx.SendString("")
  187. }
  188. strSvgSec := module.Stat().SvgDay()
  189. ctx.Set("Content-Type", "image/svg+xml")
  190. return ctx.SendString(strSvgSec)
  191. }
  192. // Возвращает секундную статистику модуля.
  193. func (sf *PageModule) postSvgMin(ctx fiber.Ctx) error {
  194. id := ctx.Params("id", "1")
  195. module, _ := sf.getModule(id)
  196. if module == nil {
  197. return ctx.SendString("")
  198. }
  199. strSvgSec := module.Stat().SvgMin()
  200. ctx.Set("Content-Type", "image/svg+xml")
  201. return ctx.SendString(strSvgSec)
  202. }
  203. // Возвращает секундную статистику модуля.
  204. func (sf *PageModule) postSvgSec(ctx fiber.Ctx) error {
  205. id := ctx.Params("id", "1")
  206. module, _ := sf.getModule(id)
  207. if module == nil {
  208. return ctx.SendString("")
  209. }
  210. strSvgSec := module.Stat().SvgSec()
  211. ctx.Set("Content-Type", "image/svg+xml")
  212. return ctx.SendString(strSvgSec)
  213. }
  214. // Возвращает модуль.
  215. func (sf *PageModule) getModule(id string) (mKt.IKernelModule, mKt.ICtxValue) {
  216. optMonolit := sf.ctx.Get("monolit")
  217. if optMonolit.IsNone() {
  218. return nil, nil
  219. }
  220. mon := optMonolit.Val().Val().(mKt.IKernelMonolit)
  221. chLst := mon.Ctx().SortedList()
  222. var (
  223. val mKt.ICtxValue
  224. isFind bool
  225. )
  226. for _, val = range chLst {
  227. name := "module_" + id
  228. if name == val.Key() {
  229. isFind = true
  230. break
  231. }
  232. }
  233. if !isFind {
  234. return nil, nil
  235. }
  236. mod := val.Val().(mKt.IKernelModule)
  237. return mod, val
  238. }