system.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const _ = require('lodash')
  2. const Promise = require('bluebird')
  3. const getos = Promise.promisify(require('getos'))
  4. const os = require('os')
  5. const filesize = require('filesize')
  6. const path = require('path')
  7. const fs = require('fs-extra')
  8. const moment = require('moment')
  9. const graphHelper = require('../../helpers/graph')
  10. const request = require('request-promise')
  11. /* global WIKI */
  12. const dbTypes = {
  13. mysql: 'MySQL',
  14. mariadb: 'MariaDB',
  15. postgres: 'PostgreSQL',
  16. sqlite: 'SQLite',
  17. mssql: 'MS SQL Server'
  18. }
  19. module.exports = {
  20. Query: {
  21. async system () { return {} }
  22. },
  23. Mutation: {
  24. async system () { return {} }
  25. },
  26. SystemQuery: {
  27. flags () {
  28. return _.transform(WIKI.config.flags, (result, value, key) => {
  29. result.push({ key, value })
  30. }, [])
  31. },
  32. async info() { return {} }
  33. },
  34. SystemMutation: {
  35. async updateFlags (obj, args, context) {
  36. WIKI.config.flags = _.transform(args.flags, (result, row) => {
  37. _.set(result, row.key, row.value)
  38. }, {})
  39. await WIKI.configSvc.applyFlags()
  40. await WIKI.configSvc.saveToDb(['flags'])
  41. return {
  42. responseResult: graphHelper.generateSuccess('System Flags applied successfully')
  43. }
  44. },
  45. async resetTelemetryClientId (obj, args, context) {
  46. try {
  47. WIKI.telemetry.generateClientId()
  48. await WIKI.configSvc.saveToDb(['telemetry'])
  49. return {
  50. responseResult: graphHelper.generateSuccess('Telemetry state updated successfully')
  51. }
  52. } catch (err) {
  53. return graphHelper.generateError(err)
  54. }
  55. },
  56. async setTelemetry (obj, args, context) {
  57. try {
  58. _.set(WIKI.config, 'telemetry.isEnabled', args.enabled)
  59. WIKI.telemetry.enabled = args.enabled
  60. await WIKI.configSvc.saveToDb(['telemetry'])
  61. return {
  62. responseResult: graphHelper.generateSuccess('Telemetry Client ID has been reset successfully')
  63. }
  64. } catch (err) {
  65. return graphHelper.generateError(err)
  66. }
  67. },
  68. async performUpgrade (obj, args, context) {
  69. try {
  70. if (process.env.UPGRADE_COMPANION) {
  71. await request({
  72. method: 'POST',
  73. uri: 'http://wiki-update-companion/upgrade'
  74. })
  75. return {
  76. responseResult: graphHelper.generateSuccess('Upgrade has started.')
  77. }
  78. } else {
  79. throw new Error('You must run the wiki-update-companion container and pass the UPGRADE_COMPANION env var in order to use this feature.')
  80. }
  81. } catch (err) {
  82. return graphHelper.generateError(err)
  83. }
  84. }
  85. },
  86. SystemInfo: {
  87. configFile () {
  88. return path.join(process.cwd(), 'config.yml')
  89. },
  90. cpuCores () {
  91. return os.cpus().length
  92. },
  93. currentVersion () {
  94. return WIKI.version
  95. },
  96. dbType () {
  97. return _.get(dbTypes, WIKI.config.db.type, 'Unknown DB')
  98. },
  99. async dbVersion () {
  100. let version = 'Unknown Version'
  101. switch (WIKI.config.db.type) {
  102. case 'mariadb':
  103. case 'mysql':
  104. const resultMYSQL = await WIKI.models.knex.raw('SELECT VERSION() as version;')
  105. version = _.get(resultMYSQL, '[0][0].version', 'Unknown Version')
  106. break
  107. case 'mssql':
  108. const resultMSSQL = await WIKI.models.knex.raw('SELECT @@VERSION as version;')
  109. version = _.get(resultMSSQL, '[0].version', 'Unknown Version')
  110. break
  111. case 'postgres':
  112. version = _.get(WIKI.models, 'knex.client.version', 'Unknown Version')
  113. break
  114. case 'sqlite':
  115. version = _.get(WIKI.models, 'knex.client.driver.VERSION', 'Unknown Version')
  116. break
  117. }
  118. return version
  119. },
  120. dbHost () {
  121. if (WIKI.config.db.type === 'sqlite') {
  122. return WIKI.config.db.storage
  123. } else {
  124. return WIKI.config.db.host
  125. }
  126. },
  127. hostname () {
  128. return os.hostname()
  129. },
  130. latestVersion () {
  131. return WIKI.system.updates.version
  132. },
  133. latestVersionReleaseDate () {
  134. return moment.utc(WIKI.system.updates.releaseDate)
  135. },
  136. nodeVersion () {
  137. return process.version.substr(1)
  138. },
  139. async operatingSystem () {
  140. let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
  141. if (os.platform() === 'linux') {
  142. const osInfo = await getos()
  143. osLabel = `${os.type()} - ${osInfo.dist} (${osInfo.codename || os.platform()}) ${osInfo.release || os.release()} ${os.arch()}`
  144. }
  145. return osLabel
  146. },
  147. async platform () {
  148. const isDockerized = await fs.pathExists('/.dockerenv')
  149. if (isDockerized) {
  150. return 'docker'
  151. }
  152. return os.platform()
  153. },
  154. ramTotal () {
  155. return filesize(os.totalmem())
  156. },
  157. telemetry () {
  158. return WIKI.telemetry.enabled
  159. },
  160. telemetryClientId () {
  161. return WIKI.config.telemetry.clientId
  162. },
  163. async upgradeCapable () {
  164. return !_.isNil(process.env.UPGRADE_COMPANION)
  165. },
  166. workingDirectory () {
  167. return process.cwd()
  168. },
  169. async groupsTotal () {
  170. const total = await WIKI.models.groups.query().count('* as total').first().pluck('total')
  171. return _.toSafeInteger(total)
  172. },
  173. async pagesTotal () {
  174. const total = await WIKI.models.pages.query().count('* as total').first().pluck('total')
  175. return _.toSafeInteger(total)
  176. },
  177. async usersTotal () {
  178. const total = await WIKI.models.users.query().count('* as total').first().pluck('total')
  179. return _.toSafeInteger(total)
  180. }
  181. }
  182. }