NgxConfigEditor.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <script setup lang="ts">
  2. import DirectiveEditor from '@/views/domain/ngx_conf/directive/DirectiveEditor.vue'
  3. import LocationEditor from '@/views/domain/ngx_conf/LocationEditor.vue'
  4. import {computed, ref} from 'vue'
  5. import {useRoute} from 'vue-router'
  6. import {useGettext} from 'vue3-gettext'
  7. import Cert from '@/views/domain/cert/Cert.vue'
  8. const {$gettext} = useGettext()
  9. const props = defineProps(['ngx_config', 'auto_cert', 'enabled', 'cert_info'])
  10. const emit = defineEmits(['callback', 'update:auto_cert'])
  11. const route = useRoute()
  12. const current_server_index = ref(0)
  13. const name = ref(route.params.name)
  14. function change_tls(r: any) {
  15. if (r) {
  16. // deep copy servers[0] to servers[1]
  17. const server = JSON.parse(JSON.stringify(props.ngx_config.servers[0]))
  18. props.ngx_config.servers.push(server)
  19. current_server_index.value = 1
  20. const servers = props.ngx_config.servers
  21. let i = 0
  22. while (i < servers[1].directives.length) {
  23. const v = servers[1].directives[i]
  24. if (v.directive === 'listen') {
  25. servers[1].directives.splice(i, 1)
  26. } else {
  27. i++
  28. }
  29. }
  30. servers[1].directives.splice(0, 0, {
  31. directive: 'listen',
  32. params: '443 ssl http2'
  33. }, {
  34. directive: 'listen',
  35. params: '[::]:443 ssl http2'
  36. })
  37. const server_name = directivesMap.value['server_name'][0]
  38. if (!directivesMap.value['ssl_certificate']) {
  39. servers[1].directives.splice(server_name.idx + 1, 0, {
  40. directive: 'ssl_certificate',
  41. params: ''
  42. })
  43. }
  44. setTimeout(() => {
  45. if (!directivesMap.value['ssl_certificate_key']) {
  46. servers[1].directives.splice(server_name.idx + 2, 0, {
  47. directive: 'ssl_certificate_key',
  48. params: ''
  49. })
  50. }
  51. }, 100)
  52. } else {
  53. // remove servers[1]
  54. current_server_index.value = 0
  55. if (props.ngx_config.servers.length === 2) {
  56. props.ngx_config.servers.splice(1, 1)
  57. }
  58. }
  59. }
  60. const current_server_directives = computed(() => {
  61. return props.ngx_config.servers[current_server_index.value].directives
  62. })
  63. const directivesMap = computed(() => {
  64. const map = <any>{}
  65. current_server_directives.value.forEach((v: any, k: any) => {
  66. v.idx = k
  67. if (map[v.directive]) {
  68. map[v.directive].push(v)
  69. } else {
  70. map[v.directive] = [v]
  71. }
  72. })
  73. return map
  74. })
  75. const support_ssl = computed(() => {
  76. const servers = props.ngx_config.servers
  77. for (const server_key in servers) {
  78. for (const k in servers[server_key].directives) {
  79. const v = servers[server_key].directives[k]
  80. if (v.directive === 'listen' && v.params.indexOf('ssl') > 0) {
  81. return true
  82. }
  83. }
  84. }
  85. return false
  86. })
  87. const current_support_ssl = computed(() => {
  88. if (directivesMap.value.listen) {
  89. for (const v of directivesMap.value.listen) {
  90. if (v?.params.indexOf('ssl') > 0) {
  91. return true
  92. }
  93. }
  94. }
  95. return false
  96. })
  97. const autoCertRef = computed({
  98. get() {
  99. return props.auto_cert
  100. },
  101. set(value) {
  102. emit('update:auto_cert', value)
  103. }
  104. })
  105. </script>
  106. <template>
  107. <div>
  108. <a-form-item :label="$gettext('Enable TLS')" v-if="!support_ssl">
  109. <a-switch @change="change_tls"/>
  110. </a-form-item>
  111. <a-tabs v-model:activeKey="current_server_index">
  112. <a-tab-pane :tab="'Server '+(k+1)" v-for="(v,k) in props.ngx_config.servers" :key="k">
  113. <div class="tab-content">
  114. <template v-if="current_support_ssl&&enabled">
  115. <cert
  116. v-if="current_support_ssl"
  117. :cert_info="props.cert_info?.[k]"
  118. :current_server_directives="current_server_directives"
  119. :directives-map="directivesMap"
  120. v-model:enabled="autoCertRef"
  121. @callback="$emit('callback')"
  122. />
  123. </template>
  124. <template v-if="v.comments">
  125. <h3 v-translate>Comments</h3>
  126. <a-textarea v-model:value="v.comments" :bordered="false"/>
  127. </template>
  128. <directive-editor :ngx_directives="v.directives"/>
  129. <br/>
  130. <location-editor :locations="v.locations"/>
  131. </div>
  132. </a-tab-pane>
  133. </a-tabs>
  134. </div>
  135. </template>
  136. <style scoped>
  137. </style>