Added better logging
parent
7f25fe3abb
commit
80e1bc75b3
50
app/add.js
50
app/add.js
|
@ -19,7 +19,6 @@ let axios; (async()=>{
|
|||
} catch (err) { console.error(err) }
|
||||
})()
|
||||
const dns_key = `hmac-sha512:wgapi-${env.LOCAL_SERVER}:${env.DNS_KEY}`
|
||||
let config_queue = []
|
||||
|
||||
module.exports = async (req, res) => {
|
||||
|
||||
|
@ -41,7 +40,7 @@ module.exports = async (req, res) => {
|
|||
console.error(`Failed to get user from ${req.requester}`)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(403).send('User not found!')
|
||||
} console.log(`${req.requester} must be ${user.name}`)
|
||||
} console.log(`${req.requester} identified as ${user.name}`)
|
||||
|
||||
// Check token
|
||||
if (req.query['token']!==helper.getToken(req.requester)) {
|
||||
|
@ -59,8 +58,8 @@ module.exports = async (req, res) => {
|
|||
.status(409).send(`You already have a peer named ${new_hostname}`)
|
||||
}
|
||||
|
||||
|
||||
// Find next available host part
|
||||
// Create IP Addresses and keys
|
||||
console.log(`Generating new IP addresses and keys...`)
|
||||
const used_ipv4_hosts = user.peers
|
||||
.map((host) => host.ipv4).map((found_ipv4) =>
|
||||
found_ipv4.toString().split('.')[3])
|
||||
|
@ -70,22 +69,22 @@ module.exports = async (req, res) => {
|
|||
let host = 1
|
||||
while ([...used_ipv4_hosts,...used_ipv6_hosts].includes(host.toString())) host++
|
||||
if (host>9999) {
|
||||
console.error(`New host part for ${user.name} is higher than 9999: ${host}`)
|
||||
console.error(`ERROR! New host part for ${user.name} is higher than 9999: ${host}`)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(507).send('No more numeric IPv6 addresses available. Try deleting an old peer first. ')
|
||||
}
|
||||
|
||||
// Create IP Addresses and keys
|
||||
let ipv4_addr; if (host<254)
|
||||
ipv4_addr = `${env.IPV4_NET}.${user.subnet}.${host}`
|
||||
const ipv6_addr = `${env.IPV6_NET}:${user.subnet}:${host}`
|
||||
let keypair; try {
|
||||
keypair = await wg.generateKeypair()
|
||||
} catch (err) {
|
||||
console.error(`Unable to generateKeypair:\n${err}`)
|
||||
console.error(`ERROR! Unable to generateKeypair.`)
|
||||
if (err) console.error(err)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(500).send('Server failed to generate a keypair. Something is broken so your peer was not created.')
|
||||
}
|
||||
console.log(`Generated IP addresses and keys.`)
|
||||
|
||||
// Peer with each server
|
||||
let client_peers = []
|
||||
|
@ -122,28 +121,33 @@ AllowedIPs = ${allowed_ips}
|
|||
|
||||
// Add server_config to local wg0.conf
|
||||
if (server.host===env.LOCAL_SERVER) {
|
||||
console.log(`Adding config to local wg.conf at ${env.WG_CONFIG_FILE}...`)
|
||||
try { await fs.appendFile(env.WG_CONFIG_FILE, server_config) }
|
||||
catch (err) { return console.error(err) }
|
||||
catch (err) {
|
||||
console.error(`ERROR! Failed to write to config file!`)
|
||||
if (err) console.error(err)
|
||||
}
|
||||
console.log(`Added new peer to local wg.conf file.`)
|
||||
|
||||
// Remote server: send config
|
||||
} else {
|
||||
console.log(`Sending config to ${server.host}.gf4`)
|
||||
console.log(`Sending config to ${server.host}.${env.TLD}...`)
|
||||
try {
|
||||
await axios.post(`${server.admin_endpoint}/add?secret=${server.secret}`, server_config, {
|
||||
headers: {'Content-Type': 'text/plain'},
|
||||
})
|
||||
} catch (err) {
|
||||
if (err.message==='Request failed with status code 403')
|
||||
console.error(`Received 403 from ${server.admin_endpoint}/add`)
|
||||
console.error(`Failed to add peer to ${server.host}:\n${server_config}
|
||||
But the peer was created locally.`)
|
||||
console.error(`ERROR! Failed to add peer to ${server.host}:\n${server_config} but the peer was created locally.`)
|
||||
if (err) console.error(err.message)
|
||||
}
|
||||
console.log(`Config sent to ${server.host}.${env.TLD}.`)
|
||||
}
|
||||
}
|
||||
|
||||
// Update nameserver
|
||||
if (env.ENV==='prod') {
|
||||
if (env.ENV!=='prod') console.log(`Skipping nameserver updates because env.ENV != 'prod'`)
|
||||
else {
|
||||
console.log(`Sending nsupdate to ${env.DNS_MASTER}...`)
|
||||
try {
|
||||
await helper.nsUpdate(dns_key, env.DNS_MASTER,
|
||||
`update add ${domain}. ${env.DNS_TTL} A ${ipv4_addr}
|
||||
|
@ -151,25 +155,23 @@ update add ${domain}. ${env.DNS_TTL} AAAA ${ipv6_addr}
|
|||
update add *.${domain}. ${env.DNS_TTL} CNAME ${domain}.`)
|
||||
}
|
||||
catch (err) {
|
||||
console.error(`Failed to add ns record.`)
|
||||
console.error(`ERROR! Failed to add ns record.`)
|
||||
if (err) console.error(err)
|
||||
}
|
||||
console.log(`Updated nameserver to add ${domain}.`)
|
||||
console.log(`Added ${domain} to nameserver.`)
|
||||
}
|
||||
|
||||
// Generate user config
|
||||
// Generate user config and send it back to the user
|
||||
console.log(`Sending config back to user...`)
|
||||
const config_address = ipv4_addr
|
||||
? `${ipv4_addr}/${env.IPV4_CIDR}, ${ipv6_addr}/${env.IPV6_CIDR}`
|
||||
: `${ipv6_addr}/${env.IPV6_CIDR}`
|
||||
const config = `[Interface] # ${domain}
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(201).send(`[Interface] # ${domain}
|
||||
PrivateKey = ${keypair[1]}
|
||||
Address = ${config_address}
|
||||
DNS = ${res.locals.DNS_SERVERS_STRING}
|
||||
PostUp = resolvectl domain ${env.TLD} ${env.TLD}
|
||||
${client_peers.join('\n')}`
|
||||
|
||||
// Send config to user
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(201).send(config)
|
||||
${client_peers.join('\n')}`)
|
||||
|
||||
}
|
31
app/del.js
31
app/del.js
|
@ -35,7 +35,7 @@ module.exports = async (req, res) => {
|
|||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(404).send(`User for ${req.requester} not found`)
|
||||
}
|
||||
console.log(`${req.requester} must be ${user.name}`)
|
||||
console.log(`${req.requester} identified as ${user.name}`)
|
||||
|
||||
// Check token
|
||||
if (req.query['token']!==helper.getToken(req.requester)) {
|
||||
|
@ -57,6 +57,7 @@ module.exports = async (req, res) => {
|
|||
// Search for peer
|
||||
let peer_pubkey
|
||||
const config = config_file.toString()
|
||||
console.log(`Checking ${env.WG_CONFIG_FILE} for peer to be deleted...`)
|
||||
const peer = config.split('\n\n')
|
||||
.filter( (paragraph) => {
|
||||
return paragraph.includes('[Peer]')
|
||||
|
@ -81,15 +82,15 @@ module.exports = async (req, res) => {
|
|||
return peer.includes(`PublicKey = ${pubkey}`)
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error(`Failed to generate public key from private key during delete request`)
|
||||
console.error(`ERROR! Failed to generate public key from private key during delete request`)
|
||||
if (err) console.error(err)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(500).send('Server error. Something is broken!')
|
||||
res.setHeader('content-type', 'text/plain')
|
||||
.status(500).send('Failed to generate public key to delete host. Something is broken!')
|
||||
})
|
||||
} else {
|
||||
console.error(`${req.requester} sent delete request without specifying a peer`)
|
||||
console.error(`ERROR! ${req.requester} sent delete request without specifying a peer`)
|
||||
res.setHeader('content-type', 'text/plain')
|
||||
.status(400).send('Peer not specified.')
|
||||
.status(400).send('Peer not specified!')
|
||||
}
|
||||
})[0]
|
||||
if (peer===undefined) {
|
||||
|
@ -101,6 +102,7 @@ module.exports = async (req, res) => {
|
|||
// Parse peer
|
||||
const peer_lines = peer.split('\n')
|
||||
const peer_name = peer_lines
|
||||
console.log(`Found peer: ${peer_name}.`)
|
||||
.filter( (line) => line.includes('[Peer] # ') )[0]
|
||||
.split(' # ')[1]
|
||||
const peer_ips = peer_lines
|
||||
|
@ -120,37 +122,41 @@ module.exports = async (req, res) => {
|
|||
}
|
||||
|
||||
// Delete from local wg config
|
||||
console.log(`Deleting ${peer_name}`); try {
|
||||
console.log(`Deleting ${peer_name} from ${env.WG_CONFIG_FILE}...`); try {
|
||||
await fs.writeFile(env.WG_CONFIG_FILE,
|
||||
config.replace(`\n${peer}`,'')
|
||||
.replace('\n\n\n','\n\n')
|
||||
)
|
||||
} catch (err) {
|
||||
console.error(`Failed to delete ${peer_name}`)
|
||||
console.error(`ERROR! Failed to delete ${peer_name}`)
|
||||
if (err) console.error(err)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(500).send('Failed to delete! Try again?')
|
||||
}
|
||||
console.log(`${peer_name} deleted. `)
|
||||
|
||||
// Inform other servers
|
||||
for (const server of env.SERVERS) {
|
||||
if (server.host!==env.LOCAL_SERVER) {
|
||||
try {
|
||||
console.log(`Informing ${server.host} to delete ${peer_name}`)
|
||||
console.log(`Informing ${server.host} to delete ${peer_name}...`)
|
||||
await axios.post(`${server.admin_endpoint}/del?secret=${server.secret}`, peer_pubkey, {
|
||||
headers: {'Content-Type': 'text/plain'},
|
||||
})
|
||||
} catch (err) {
|
||||
console.error(`ERROR! Failed to inform ${server.host} to delete ${peer_name}!`)
|
||||
if (err) console.error(err)
|
||||
console.error(`Failed to inform ${server.host} to delete ${peer_name}!`)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(500).send('Peer was added but did not propogate to the other server')
|
||||
}
|
||||
console.log(`Informed ${server.host} to delete ${peer_name}.`)
|
||||
}
|
||||
}
|
||||
|
||||
// Delete domains from nameserver
|
||||
if (env.ENV==='prod') {
|
||||
if (env.ENV!=='prod') console.log(`Skipping nameserver updates because env.ENV != 'prod'`)
|
||||
else {
|
||||
console.log(`Sending nsupdate to ${env.DNS_MASTER}...`)
|
||||
try {
|
||||
await helper.nsUpdate(dns_key, env.DNS_MASTER,
|
||||
`update delete ${peer_name}. A
|
||||
|
@ -158,7 +164,7 @@ update delete ${peer_name}. AAAA
|
|||
update delete *.${peer_name}. CNAME`)
|
||||
}
|
||||
catch (err) {
|
||||
console.error(`Failed to delete ns record`)
|
||||
console.error(`ERROR! Failed to delete ns record`)
|
||||
if (err) console.error(err)
|
||||
return res.setHeader('content-type', 'text/plain')
|
||||
.status(500).send('Peer was added to all servers, but nameservers were not updated. You can use your peer but need to set its domain name by hand.')
|
||||
|
@ -167,5 +173,4 @@ update delete *.${peer_name}. CNAME`)
|
|||
}
|
||||
|
||||
return res.sendStatus(200)
|
||||
|
||||
}
|
|
@ -102,19 +102,21 @@ module.exports = {
|
|||
|
||||
// Handle exit
|
||||
nsupdate.on('error', (err) => {
|
||||
console.error(`nsupdate threw an error`)
|
||||
console.error(`ERROR! nsupdate threw an error.`)
|
||||
if (err) console.error(err)
|
||||
reject(err)
|
||||
})
|
||||
nsupdate.on('exit', (status) => {
|
||||
console.log(`nsupdate exited with status: ${status}`)
|
||||
if (status!==0) reject(errors)
|
||||
if (status!==0) {
|
||||
console.error(`ERROR! nsupdate threw a nonzero exit code.`)
|
||||
reject(errors)
|
||||
}
|
||||
else resolve()
|
||||
})
|
||||
|
||||
// Something went wrong with the spawn?
|
||||
} catch (err) {
|
||||
console.error('nsupdate failed to spawn or something')
|
||||
console.error('ERROR! nsupdate failed to spawn or something.')
|
||||
if (err) console.error(err)
|
||||
reject(err)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue