[go: nahoru, domu]

Skip to content

Commit

Permalink
feat: support apisix 3.x
Browse files Browse the repository at this point in the history
  • Loading branch information
TMaize committed Sep 23, 2023
1 parent 247a5a5 commit a1f910e
Show file tree
Hide file tree
Showing 8 changed files with 676 additions and 551 deletions.
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
registry=https://registry.npmmirror.com
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
image=apisix-acme:2.1.1
image=apisix-acme:2.2.0

input=$1

Expand Down
4 changes: 2 additions & 2 deletions config.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
# 必填,本应用接口调用token
verify_token: custom_token

# 必填,apisix 接口地址
apisix_host: http://apisix:9080
# 必填,apisix admin host
apisix_host: http://apisix:9180
apisix_token: '******'

# 必填,将自身服务注册到apisix的地址
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"dependencies": {
"@koa/router": "^10.1.1",
"axios": "^0.25.0",
"compare-versions": "^6.1.0",
"koa": "^2.13.4",
"koa-body": "^4.2.0",
"moment": "^2.29.1",
Expand All @@ -23,4 +24,4 @@
"devDependencies": {
"@types/node": "16.18.3"
}
}
}
77 changes: 52 additions & 25 deletions src/apisix.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,36 @@
import axios from 'axios'
import { compareVersions } from 'compare-versions'
import v2 from './apisix/v2.js'
import v3 from './apisix/v3.js'
import common from './common.js'
import config from './config.js'

async function getVersion() {
const headers = await axios
.request({
method: 'GET',
headers: {
'X-API-KEY': config.apisix_token
},
url: `${config.apisix_host}/apisix/admin/routes`
})
.then(resp => resp.headers)
.catch(err => {
return (err.response || {}).headers || {}
})

const server = headers['server'] || ''
const version = server.replace('APISIX/', '') || '0.0.0'
return version
}

// 把自己注册到 apisix
async function addSelfRoute() {
async function add() {
const id = `apisix_acme`
await axios.request({
method: 'PUT',
timeout: 5 * 1000,
headers: {
'X-API-KEY': config.apisix_token
},
Expand Down Expand Up @@ -55,15 +78,15 @@ async function addSelfRoute() {
await add()
break
} catch (error) {
if (i >= 3) console.error('addSelfRoute fail:', error.message || error, 'retrying ...')
if (i >= 3) console.error('init acme route fail:', error.message || error, 'retrying ...')
if (i == 6) {
common.sendMsg(`addSelfRoute fail: ${error.message || error}`)
return Promise.reject(new Error('addSelfRoute fail: ' + error.message || error))
common.sendMsg(`init acme route fail: ${error.message || error}`)
return Promise.reject(new Error('init acme route fail: ' + error.message || error))
}
}
await common.sleep(3000)
}
console.log('addSelfRoute success')
console.log('init acme route success')
}

// 添加文件验证路由
Expand Down Expand Up @@ -125,34 +148,37 @@ async function removeVerifyRoute(domain) {
})
}

// 列出指定单sni的证书,不传列出所有单sni的证书
/**
* 列出指定单sni的证书,不传列出所有单sni的证书
* @typedef {{id: string, domain: string, validity_start: number, validity_end: number}} Item
* @param {string|undefined} sni
* @returns {Promise<Array<Item>>}
*/
async function listSSL(sni) {
const resp = await axios.request({
method: 'GET',
headers: { 'X-API-KEY': config.apisix_token },
url: `${config.apisix_host}/apisix/admin/ssl`
})
const version = await getVersion()

const { data } = resp
if (!data.count) return []
let list = []
if (compareVersions(version, '3.0.0') >= 0) {
list = await v3.sslList()
} else {
list = await v2.sslList()
}

const nodes = data.node.nodes || []
const list = []
const results = []

nodes.forEach(node => {
const item = node.value || {}
if (!item.snis || item.snis.length > 1) return
list.forEach(item => {
if (item.snis.length > 1) return
if (sni && sni !== item.snis[0]) return

list.push({
results.push({
id: item.id,
domain: item.snis[0],
validity_start: item.validity_start,
validity_end: item.validity_end
})
})

return list
return results
}

// 导入证书
Expand All @@ -170,14 +196,15 @@ async function applySSL(domain, sslInfo) {
idList.push(String(Date.now()))
}

const version = await getVersion()

for (let i = 0; i < idList.length; i++) {
const id = idList[i]
await axios.request({
method: 'PUT',
headers: { 'X-API-KEY': config.apisix_token },
url: `${config.apisix_host}/apisix/admin/ssl/${id}`,
data: sslInfo
})
if (compareVersions(version, '3.0.0') >= 0) {
await v3.setupSsl(id, sslInfo)
} else {
await v2.setupSsl(id, sslInfo)
}
}
}

Expand Down
57 changes: 57 additions & 0 deletions src/apisix/v2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import axios from 'axios'
import config from '../config.js'

/**
* 列出所有证书
* @typedef {{id: string, snis: Array<string>, validity_start: number, validity_end: number}} Item
* @returns {Promise<Array<Item>>}
*/
async function sslList() {
const resp = await axios.request({
method: 'GET',
headers: { 'X-API-KEY': config.apisix_token },
url: `${config.apisix_host}/apisix/admin/ssl`
})

const { data } = resp
const nodes = []
const results = []

if (data.node && data.node.nodes) {
nodes.push(...data.node.nodes)
}

nodes.forEach(node => {
const item = node.value || {}
if (!item.snis) return

results.push({
id: item.id,
snis: item.snis,
validity_start: item.validity_start,
validity_end: item.validity_end
})
})

return results
}

/**
* 设置证书
* @param {string} id
* @param {{snis: Array<string>, cert: string, key: string, validity_start: number, validity_end: number}} data
* @returns {Promise<void>}
*/
async function setupSsl(id, data) {
return axios.request({
method: 'PUT',
headers: { 'X-API-KEY': config.apisix_token },
url: `${config.apisix_host}/apisix/admin/ssl/${id}`,
data
})
}

export default {
sslList,
setupSsl
}
57 changes: 57 additions & 0 deletions src/apisix/v3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import axios from 'axios'
import config from '../config.js'

/**
* 列出所有证书
* @typedef {{id: string, snis: Array<string>, validity_start: number, validity_end: number}} Item
* @returns {Promise<Array<Item>>}
*/
async function sslList() {
const resp = await axios.request({
method: 'GET',
headers: { 'X-API-KEY': config.apisix_token },
url: `${config.apisix_host}/apisix/admin/ssls`
})

const { data } = resp
const nodes = []
const results = []

if (Array.isArray(data.list)) {
nodes.push(...data.list)
}

nodes.forEach(node => {
const item = node.value || {}
if (!item.snis) return

results.push({
id: item.id,
snis: item.snis,
validity_start: item.validity_start,
validity_end: item.validity_end
})
})

return results
}

/**
* 设置证书
* @param {string} id
* @param {{snis: Array<string>, cert: string, key: string, validity_start: number, validity_end: number}} data
* @returns {Promise<void>}
*/
async function setupSsl(id, data) {
return axios.request({
method: 'PUT',
headers: { 'X-API-KEY': config.apisix_token },
url: `${config.apisix_host}/apisix/admin/ssls/${id}`,
data
})
}

export default {
sslList,
setupSsl
}
Loading

0 comments on commit a1f910e

Please sign in to comment.