page_module.go 9.0 KB

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