admin.groovy 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // Licensed Materials - Property of IBM
  2. // BI and PM: Mobile
  3. // (C) Copyright IBM Corp. 2007, 2012
  4. // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  5. package processors
  6. import com.cognos.mobile.common.CMErrors;
  7. import com.cognos.mobile.common.CMException;
  8. import com.cognos.mobile.server.core.SCResponse;
  9. import com.cognos.mobile.xml.XMLHelper;
  10. import com.cognos.mobile.prompts.Prompt
  11. import groovy.xml.MarkupBuilder
  12. import com.cognos.mobile.standardedition.DOM4JUtil
  13. def dbg = { msg -> VM.log(this.class, VM.SEVERITY_ERROR, msg); }
  14. def err = { msg -> VM.log(this.class, VM.SEVERITY_ERROR, msg); }
  15. if (!session.isAdministrator()) { return SCResponse.fromException(new CMException(CMErrors.SERVER_AUTHENTICATION_FAILED, "You must have Server Administator Cognos8 Capability to use this feature.")); }
  16. switch( path ){
  17. // view the status log
  18. case ~/\/admin\/status\/.*/:
  19. def key
  20. (path =~ /\/admin\/status\/(.*)/).each{ full, k -> key = k }
  21. def writer = new StringWriter()
  22. def xml = new MarkupBuilder(writer)
  23. xml.msgs{
  24. status.list(key).each{ rr ->
  25. msg(rr)
  26. }
  27. }
  28. return writer.toString();
  29. // view the loggers or post messages to the status log
  30. case ~/\/admin\/status/:
  31. switch( method ){
  32. case "post":
  33. status.log(env["ORIGINAL_REMOTE_ADDR"], request.parameters["msg"].split("\\|\\|"))
  34. return
  35. default:
  36. def result = "["
  37. status.loggers.each{ result += "\"${it}\","}
  38. result += "]"
  39. return result
  40. }
  41. return "";
  42. case ~/\/admin\/prompts\/(.*)/:
  43. def promptFile;
  44. (path =~ /\/admin\/prompts\/(.*)/).each{ full, file -> promptFile = file }
  45. def prompt = ["id": "someid", "name": "somename"]
  46. def promptTemplate = DOM4JUtil.read( "<html><head></head><body>" + gte.createMobileTemplate( promptFile + ".html" ).make(["prompt": prompt]).toString() + "</body></html>" )
  47. def viewer = DOM4JUtil.read(gte.createMobileTemplate("prompt_viewer.html").make(["webRoot": webroot]).toString())
  48. return DOM4JUtil.prettyPrintAsXHTML(DOM4JUtil.mergeXHTML(viewer, promptTemplate))
  49. case ~/\/admin\/log/:
  50. def logFile = new File(scripthome + "../../../../../logs/mob.log")
  51. def raf = new RandomAccessFile(logFile, "r")
  52. def buffSize = 50000;
  53. if(args["buff"] != null ) buffSize = Integer.valueOf(args["buff"])
  54. if( buffSize < logFile.length()) raf.seek(logFile.length()-buffSize)
  55. def lines = []
  56. def result = '''
  57. <html>
  58. <head>
  59. <style>
  60. .logentry{
  61. clear: both;
  62. width: 100%;
  63. height: 16px;
  64. }
  65. .bright {
  66. background: #F3F3F3;
  67. }
  68. .DEBUG{
  69. color: gray;
  70. }
  71. .INFO{
  72. color: black;
  73. }
  74. .WARNING{
  75. color: orange;
  76. }
  77. .ERROR{
  78. color: red;
  79. }
  80. .datetime,
  81. .thread,
  82. .level,
  83. .message,
  84. .clazz {
  85. padding: 0px 0 0 3px;
  86. float: left;
  87. }
  88. .thread {
  89. width: 65px;
  90. white-space: nowrap;
  91. overflow: hidden;
  92. }
  93. .clazz {
  94. width: 350px;
  95. white-space: nowrap;
  96. overflow: hidden;
  97. }
  98. .level {
  99. width: 58px;
  100. white-space: nowrap;
  101. overflow: hidden;
  102. }
  103. .datetime {
  104. width: 145px;
  105. white-space: nowrap;
  106. overflow: hidden;
  107. }
  108. .message {
  109. font-weight: bold;
  110. white-space: pre;
  111. }
  112. </style>
  113. </head>
  114. <body>
  115. '''
  116. // datetime, thread, level, class, message
  117. def pattern = ~/^(.{23}) (\[.+\]) ([A-Z]+) (.+) ?- (.*)$/
  118. def bright = true;
  119. def logentry = ""
  120. def cssclass = "INFO"
  121. def encodedMessage = "";
  122. while(( line = raf.readLine()) != null ){
  123. try{
  124. def m = pattern.matcher(line)
  125. if( m.matches()){
  126. cssclass = m[0][3]
  127. if( bright ){
  128. logentry = "bright logentry"
  129. bright = false
  130. } else {
  131. logentry = "logentry"
  132. bright = true;
  133. }
  134. encodedMessage = XMLHelper.encodeXml(m[0][5]);
  135. result +=
  136. """
  137. <div class='$logentry $cssclass'>
  138. <div class='datetime'>${m[0][1]}</div><div class='thread'>${m[0][2]}</div><div class='level'>${m[0][3]}</div><div class='clazz'>${m[0][4]}</div><div class='message'>$encodedMessage</div>
  139. </div>
  140. """
  141. } else {
  142. line = XMLHelper.encodeXml(line)
  143. result +=
  144. """
  145. <div class='$logentry $cssclass'>
  146. <div class='datetime'></div><div class='thread'></div><div class='level'></div><div class='clazz'></div><div class='message'>$line</div>
  147. </div>
  148. """
  149. }
  150. } catch( Exception e ){
  151. println e
  152. }
  153. }
  154. result += "</body></html>"
  155. return SCResponse.fromBytes(result.getBytes(), "text/html")
  156. case ~/\/admin\/clog/:
  157. def logFile = new File(scripthome + "../../../../../logs/cogserver.log")
  158. def raf = new RandomAccessFile(logFile, "r")
  159. def buffSize = 50000;
  160. if(args["buff"] != null ) buffSize = Integer.valueOf(args["buff"])
  161. if( buffSize < logFile.length()) raf.seek(logFile.length()-buffSize)
  162. def lines = []
  163. def result = '''
  164. <html><head>
  165. <style>
  166. .bright {
  167. background: #F3F3F3;
  168. }
  169. </style>
  170. </head><body>
  171. '''
  172. def bright = true
  173. def logentry = ""
  174. while(( line = raf.readLine()) != null ){
  175. try{
  176. if( bright ){
  177. logentry = "bright clogentry"
  178. bright = false
  179. } else {
  180. logentry = "clogentry"
  181. bright = true
  182. }
  183. result += "<div class=\"$logentry\">" + line + "</div>"
  184. } catch( Exception e ){}
  185. }
  186. result += "</body></html>"
  187. return SCResponse.fromBytes(result.getBytes(), "text/html")
  188. case ~/\/admin\/init\/handlers/:
  189. println "resetting handlers..."
  190. controller.initHandlers()
  191. controller.listHandlers().each{ item -> println item.name }
  192. }
  193. return