Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
8b8f5fac69 | |||
424ccce43c | |||
ad41cc985d | |||
981d5a199f | |||
48f2bb4cd8 | |||
aa270925e9 | |||
3836f7c40a | |||
9fcd32c2ca | |||
2657bcf30c | |||
86ad7d6238 | |||
c97e6ada5b | |||
cd40ca7f0a | |||
e2ac3b4880 | |||
7f8b185e48 |
@ -1,4 +1,4 @@
|
|||||||
FROM jc21/nginx-proxy-manager-base:armhf
|
FROM jc21/nginx-proxy-manager-base:latest-armhf
|
||||||
|
|
||||||
MAINTAINER Jamie Curnow <jc@jc21.com>
|
MAINTAINER Jamie Curnow <jc@jc21.com>
|
||||||
LABEL maintainer="Jamie Curnow <jc@jc21.com>"
|
LABEL maintainer="Jamie Curnow <jc@jc21.com>"
|
||||||
|
53
Jenkinsfile
vendored
53
Jenkinsfile
vendored
@ -6,7 +6,7 @@ pipeline {
|
|||||||
agent any
|
agent any
|
||||||
environment {
|
environment {
|
||||||
IMAGE_NAME = "nginx-proxy-manager"
|
IMAGE_NAME = "nginx-proxy-manager"
|
||||||
BASE_IMAGE_NAME = "jc21/nginx-proxy-manager-base:v2"
|
BASE_IMAGE_NAME = "jc21/nginx-proxy-manager-base:latest"
|
||||||
TEMP_IMAGE_NAME = "nginx-proxy-manager-build_${BUILD_NUMBER}"
|
TEMP_IMAGE_NAME = "nginx-proxy-manager-build_${BUILD_NUMBER}"
|
||||||
TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}"
|
TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}"
|
||||||
TAG_VERSION = getPackageVersion()
|
TAG_VERSION = getPackageVersion()
|
||||||
@ -34,10 +34,6 @@ pipeline {
|
|||||||
// Docker Build
|
// Docker Build
|
||||||
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .'
|
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .'
|
||||||
|
|
||||||
// Private Registry
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop'
|
|
||||||
|
|
||||||
// Dockerhub
|
// Dockerhub
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:develop'
|
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:develop'
|
||||||
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
||||||
@ -45,6 +41,13 @@ pipeline {
|
|||||||
sh 'docker push docker.io/jc21/$IMAGE_NAME:develop'
|
sh 'docker push docker.io/jc21/$IMAGE_NAME:develop'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Private Registry
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop'
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
||||||
|
sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY"
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop'
|
||||||
|
}
|
||||||
|
|
||||||
sh 'docker rmi $TEMP_IMAGE_NAME'
|
sh 'docker rmi $TEMP_IMAGE_NAME'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,14 +70,6 @@ pipeline {
|
|||||||
// Docker Build
|
// Docker Build
|
||||||
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .'
|
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .'
|
||||||
|
|
||||||
// Private Registry
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION'
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION'
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest'
|
|
||||||
|
|
||||||
// Dockerhub
|
// Dockerhub
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$TAG_VERSION'
|
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$TAG_VERSION'
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION'
|
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION'
|
||||||
@ -87,6 +82,18 @@ pipeline {
|
|||||||
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest'
|
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Private Registry
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION'
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION'
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest'
|
||||||
|
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
||||||
|
sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY"
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION'
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION'
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest'
|
||||||
|
}
|
||||||
|
|
||||||
sh 'docker rmi $TEMP_IMAGE_NAME'
|
sh 'docker rmi $TEMP_IMAGE_NAME'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -109,14 +116,6 @@ pipeline {
|
|||||||
// Docker Build
|
// Docker Build
|
||||||
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM -f Dockerfile.armhf .'
|
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM -f Dockerfile.armhf .'
|
||||||
|
|
||||||
// Private Registry
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf'
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf'
|
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf'
|
|
||||||
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf'
|
|
||||||
|
|
||||||
// Dockerhub
|
// Dockerhub
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-armhf'
|
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-armhf'
|
||||||
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-armhf'
|
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-armhf'
|
||||||
@ -129,6 +128,18 @@ pipeline {
|
|||||||
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-armhf'
|
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-armhf'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Private Registry
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf'
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf'
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf'
|
||||||
|
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
||||||
|
sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY"
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf'
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf'
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf'
|
||||||
|
}
|
||||||
|
|
||||||
sh 'docker rmi $TEMP_IMAGE_NAME_ARM'
|
sh 'docker rmi $TEMP_IMAGE_NAME_ARM'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
README.md
16
README.md
@ -2,20 +2,22 @@
|
|||||||
|
|
||||||
# Nginx Proxy Manager
|
# Nginx Proxy Manager
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
This project comes as a pre-built docker image that enables you to easily forward to your websites
|
This project comes as a pre-built docker image that enables you to easily forward to your websites
|
||||||
running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.
|
running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.
|
||||||
|
|
||||||
----------
|
|
||||||
|
|
||||||
**WARNING: Version 2 a complete rewrite!** If you are using the `latest` docker tag and update to version 2
|
|
||||||
without preparation, horrible things might happen. Refer to the [Importing Documentation](doc/IMPORTING.md).
|
|
||||||
|
|
||||||
----------
|
|
||||||
|
|
||||||
|
## Project Goal
|
||||||
|
|
||||||
|
I created this project to fill a personal need to provide users with a easy way to accomplish reverse
|
||||||
|
proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed.
|
||||||
|
While there might be advanced options they are optional and the project should be as simple as possible
|
||||||
|
so that the barrier for entry here is low.
|
||||||
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/)
|
- Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Nginx Proxy Manager
|
# Nginx Proxy Manager
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
db:
|
db:
|
||||||
image: mariadb
|
image: jc21/mariadb-aria
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ROOT_PASSWORD: "password123"
|
MYSQL_ROOT_PASSWORD: "password123"
|
||||||
|
@ -17,7 +17,7 @@ services:
|
|||||||
# if you want pretty colors in your docker logs:
|
# if you want pretty colors in your docker logs:
|
||||||
- FORCE_COLOR=1
|
- FORCE_COLOR=1
|
||||||
db:
|
db:
|
||||||
image: mariadb
|
image: jc21/mariadb-aria
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ROOT_PASSWORD: "password123"
|
MYSQL_ROOT_PASSWORD: "password123"
|
||||||
|
@ -11,6 +11,7 @@ services:
|
|||||||
- NODE_ENV=development
|
- NODE_ENV=development
|
||||||
- FORCE_COLOR=1
|
- FORCE_COLOR=1
|
||||||
volumes:
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
- ./data/letsencrypt:/etc/letsencrypt
|
- ./data/letsencrypt:/etc/letsencrypt
|
||||||
- .:/app
|
- .:/app
|
||||||
- ./rootfs/etc/nginx:/etc/nginx
|
- ./rootfs/etc/nginx:/etc/nginx
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "nginx-proxy-manager",
|
"name": "nginx-proxy-manager",
|
||||||
"version": "2.0.6",
|
"version": "2.0.8",
|
||||||
"description": "A beautiful interface for creating Nginx endpoints",
|
"description": "A beautiful interface for creating Nginx endpoints",
|
||||||
"main": "src/backend/index.js",
|
"main": "src/backend/index.js",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -8,8 +8,9 @@ server {
|
|||||||
|
|
||||||
include conf.d/include/block-exploits.conf;
|
include conf.d/include/block-exploits.conf;
|
||||||
|
|
||||||
set $server 127.0.0.1;
|
set $forward_scheme http;
|
||||||
set $port 81;
|
set $server 127.0.0.1;
|
||||||
|
set $port 81;
|
||||||
|
|
||||||
location /health {
|
location /health {
|
||||||
access_log off;
|
access_log off;
|
||||||
@ -46,7 +47,7 @@ server {
|
|||||||
|
|
||||||
ssl_certificate /data/nginx/dummycert.pem;
|
ssl_certificate /data/nginx/dummycert.pem;
|
||||||
ssl_certificate_key /data/nginx/dummykey.pem;
|
ssl_certificate_key /data/nginx/dummykey.pem;
|
||||||
include conf.d/include/ssl-ciphers.conf;
|
ssl_ciphers aNULL;
|
||||||
|
|
||||||
return 444;
|
return 444;
|
||||||
}
|
}
|
||||||
|
2
rootfs/etc/nginx/conf.d/include/ip_ranges.conf
Normal file
2
rootfs/etc/nginx/conf.d/include/ip_ranges.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Intentionally left blank
|
||||||
|
|
@ -3,4 +3,4 @@ proxy_set_header Host $host;
|
|||||||
proxy_set_header X-Forwarded-Scheme $scheme;
|
proxy_set_header X-Forwarded-Scheme $scheme;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_set_header X-Forwarded-For $remote_addr;
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
proxy_pass http://$server:$port;
|
proxy_pass $forward_scheme://$server:$port;
|
||||||
|
@ -54,6 +54,20 @@ http {
|
|||||||
# Dynamically generated resolvers file
|
# Dynamically generated resolvers file
|
||||||
include /etc/nginx/conf.d/include/resolvers.conf;
|
include /etc/nginx/conf.d/include/resolvers.conf;
|
||||||
|
|
||||||
|
# Default upstream scheme
|
||||||
|
map $host $forward_scheme {
|
||||||
|
default http;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Real IP Determination
|
||||||
|
# Docker subnet:
|
||||||
|
set_real_ip_from 172.0.0.0/8;
|
||||||
|
# NPM generated CDN ip ranges:
|
||||||
|
include conf.d/include/ip_ranges.conf;
|
||||||
|
# always put the following 2 lines after ip subnets:
|
||||||
|
real_ip_header X-Forwarded-For;
|
||||||
|
real_ip_recursive on;
|
||||||
|
|
||||||
# Files generated by NPM
|
# Files generated by NPM
|
||||||
include /etc/nginx/conf.d/*.conf;
|
include /etc/nginx/conf.d/*.conf;
|
||||||
include /data/nginx/proxy_host/*.conf;
|
include /data/nginx/proxy_host/*.conf;
|
||||||
|
@ -11,6 +11,7 @@ function appStart () {
|
|||||||
const app = require('./app');
|
const app = require('./app');
|
||||||
const apiValidator = require('./lib/validator/api');
|
const apiValidator = require('./lib/validator/api');
|
||||||
const internalCertificate = require('./internal/certificate');
|
const internalCertificate = require('./internal/certificate');
|
||||||
|
const internalIpRanges = require('./internal/ip_ranges');
|
||||||
|
|
||||||
return migrate.latest()
|
return migrate.latest()
|
||||||
.then(setup)
|
.then(setup)
|
||||||
@ -18,9 +19,11 @@ function appStart () {
|
|||||||
.then(() => {
|
.then(() => {
|
||||||
return apiValidator.loadSchemas;
|
return apiValidator.loadSchemas;
|
||||||
})
|
})
|
||||||
|
.then(internalIpRanges.fetch)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|
||||||
internalCertificate.initTimer();
|
internalCertificate.initTimer();
|
||||||
|
internalIpRanges.initTimer();
|
||||||
|
|
||||||
const server = app.listen(81, () => {
|
const server = app.listen(81, () => {
|
||||||
logger.info('PID ' + process.pid + ' listening on port 81 ...');
|
logger.info('PID ' + process.pid + ' listening on port 81 ...');
|
||||||
|
@ -103,7 +103,7 @@ const internalDeadHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
*/
|
*/
|
||||||
update: (access, data) => {
|
update: (access, data) => {
|
||||||
@ -201,7 +201,7 @@ const internalDeadHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {Array} [data.expand]
|
* @param {Array} [data.expand]
|
||||||
* @param {Array} [data.omit]
|
* @param {Array} [data.omit]
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
@ -248,7 +248,7 @@ const internalDeadHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {String} [data.reason]
|
* @param {String} [data.reason]
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -290,6 +290,104 @@ const internalDeadHost = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: (access, data) => {
|
||||||
|
return access.can('dead_hosts:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalDeadHost.get(access, {
|
||||||
|
id: data.id,
|
||||||
|
expand: ['certificate', 'owner']
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 1;
|
||||||
|
|
||||||
|
return deadHostModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 1
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Configure nginx
|
||||||
|
return internalNginx.configure(deadHostModel, 'dead_host', row);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'enabled',
|
||||||
|
object_type: 'dead-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: (access, data) => {
|
||||||
|
return access.can('dead_hosts:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalDeadHost.get(access, {id: data.id});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (!row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 0;
|
||||||
|
|
||||||
|
return deadHostModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 0
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Delete Nginx Config
|
||||||
|
return internalNginx.deleteConfig('dead_host', row)
|
||||||
|
.then(() => {
|
||||||
|
return internalNginx.reload();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'disabled',
|
||||||
|
object_type: 'dead-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All Hosts
|
* All Hosts
|
||||||
*
|
*
|
||||||
@ -338,7 +436,7 @@ const internalDeadHost = {
|
|||||||
/**
|
/**
|
||||||
* Report use
|
* Report use
|
||||||
*
|
*
|
||||||
* @param {Integer} user_id
|
* @param {Number} user_id
|
||||||
* @param {String} visibility
|
* @param {String} visibility
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
|
150
src/backend/internal/ip_ranges.js
Normal file
150
src/backend/internal/ip_ranges.js
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const https = require('https');
|
||||||
|
const fs = require('fs');
|
||||||
|
const _ = require('lodash');
|
||||||
|
const logger = require('../logger').ip_ranges;
|
||||||
|
const error = require('../lib/error');
|
||||||
|
const internalNginx = require('./nginx');
|
||||||
|
const Liquid = require('liquidjs');
|
||||||
|
|
||||||
|
const CLOUDFRONT_URL = 'https://ip-ranges.amazonaws.com/ip-ranges.json';
|
||||||
|
const CLOUDFARE_V4_URL = 'https://www.cloudflare.com/ips-v4';
|
||||||
|
const CLOUDFARE_V6_URL = 'https://www.cloudflare.com/ips-v6';
|
||||||
|
|
||||||
|
const internalIpRanges = {
|
||||||
|
|
||||||
|
interval_timeout: 1000 * 60 * 60 * 6, // 6 hours
|
||||||
|
interval: null,
|
||||||
|
interval_processing: false,
|
||||||
|
iteration_count: 0,
|
||||||
|
|
||||||
|
initTimer: () => {
|
||||||
|
logger.info('IP Ranges Renewal Timer initialized');
|
||||||
|
internalIpRanges.interval = setInterval(internalIpRanges.fetch, internalIpRanges.interval_timeout);
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchUrl: url => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
logger.info('Fetching ' + url);
|
||||||
|
return https.get(url, res => {
|
||||||
|
res.setEncoding('utf8');
|
||||||
|
let raw_data = '';
|
||||||
|
res.on('data', chunk => {
|
||||||
|
raw_data += chunk;
|
||||||
|
});
|
||||||
|
|
||||||
|
res.on('end', () => {
|
||||||
|
resolve(raw_data);
|
||||||
|
});
|
||||||
|
}).on('error', err => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered at startup and then later by a timer, this will fetch the ip ranges from services and apply them to nginx.
|
||||||
|
*/
|
||||||
|
fetch: () => {
|
||||||
|
if (!internalIpRanges.interval_processing) {
|
||||||
|
internalIpRanges.interval_processing = true;
|
||||||
|
logger.info('Fetching IP Ranges from online services...');
|
||||||
|
|
||||||
|
let ip_ranges = [];
|
||||||
|
|
||||||
|
return internalIpRanges.fetchUrl(CLOUDFRONT_URL)
|
||||||
|
.then(cloudfront_data => {
|
||||||
|
let data = JSON.parse(cloudfront_data);
|
||||||
|
|
||||||
|
if (data && typeof data.prefixes !== 'undefined') {
|
||||||
|
data.prefixes.map(item => {
|
||||||
|
if (item.service === 'CLOUDFRONT') {
|
||||||
|
ip_ranges.push(item.ip_prefix);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data && typeof data.ipv6_prefixes !== 'undefined') {
|
||||||
|
data.ipv6_prefixes.map(item => {
|
||||||
|
if (item.service === 'CLOUDFRONT') {
|
||||||
|
ip_ranges.push(item.ipv6_prefix);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return internalIpRanges.fetchUrl(CLOUDFARE_V4_URL);
|
||||||
|
})
|
||||||
|
.then(cloudfare_data => {
|
||||||
|
let items = cloudfare_data.split('\n');
|
||||||
|
ip_ranges = [... ip_ranges, ... items];
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return internalIpRanges.fetchUrl(CLOUDFARE_V6_URL);
|
||||||
|
})
|
||||||
|
.then(cloudfare_data => {
|
||||||
|
let items = cloudfare_data.split('\n');
|
||||||
|
ip_ranges = [... ip_ranges, ... items];
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
let clean_ip_ranges = [];
|
||||||
|
ip_ranges.map(range => {
|
||||||
|
if (range) {
|
||||||
|
clean_ip_ranges.push(range);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return internalIpRanges.generateConfig(clean_ip_ranges)
|
||||||
|
.then(() => {
|
||||||
|
if (internalIpRanges.iteration_count) {
|
||||||
|
// Reload nginx
|
||||||
|
return internalNginx.reload();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
internalIpRanges.interval_processing = false;
|
||||||
|
internalIpRanges.iteration_count++;
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
logger.error(err.message);
|
||||||
|
internalIpRanges.interval_processing = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array} ip_ranges
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
generateConfig: (ip_ranges) => {
|
||||||
|
let renderEngine = Liquid({
|
||||||
|
root: __dirname + '/../templates/'
|
||||||
|
});
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let template = null;
|
||||||
|
let filename = '/etc/nginx/conf.d/include/ip_ranges.conf';
|
||||||
|
try {
|
||||||
|
template = fs.readFileSync(__dirname + '/../templates/ip_ranges.conf', {encoding: 'utf8'});
|
||||||
|
} catch (err) {
|
||||||
|
reject(new error.ConfigurationError(err.message));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderEngine
|
||||||
|
.parseAndRender(template, {ip_ranges: ip_ranges})
|
||||||
|
.then(config_text => {
|
||||||
|
fs.writeFileSync(filename, config_text, {encoding: 'utf8'});
|
||||||
|
resolve(true);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
logger.warn('Could not write ' + filename + ':', err.message);
|
||||||
|
reject(new error.ConfigurationError(err.message));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = internalIpRanges;
|
@ -104,7 +104,7 @@ const internalProxyHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
*/
|
*/
|
||||||
update: (access, data) => {
|
update: (access, data) => {
|
||||||
@ -163,7 +163,7 @@ const internalProxyHost = {
|
|||||||
// Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here.
|
// Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here.
|
||||||
data = _.assign({}, {
|
data = _.assign({}, {
|
||||||
domain_names: row.domain_names
|
domain_names: row.domain_names
|
||||||
},data);
|
}, data);
|
||||||
|
|
||||||
return proxyHostModel
|
return proxyHostModel
|
||||||
.query()
|
.query()
|
||||||
@ -192,7 +192,7 @@ const internalProxyHost = {
|
|||||||
return internalNginx.configure(proxyHostModel, 'proxy_host', row)
|
return internalNginx.configure(proxyHostModel, 'proxy_host', row)
|
||||||
.then(new_meta => {
|
.then(new_meta => {
|
||||||
row.meta = new_meta;
|
row.meta = new_meta;
|
||||||
row = internalHost.cleanRowCertificateMeta(row);
|
row = internalHost.cleanRowCertificateMeta(row);
|
||||||
return _.omit(row, omissions());
|
return _.omit(row, omissions());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -202,7 +202,7 @@ const internalProxyHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {Array} [data.expand]
|
* @param {Array} [data.expand]
|
||||||
* @param {Array} [data.omit]
|
* @param {Array} [data.omit]
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
@ -249,7 +249,7 @@ const internalProxyHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {String} [data.reason]
|
* @param {String} [data.reason]
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -291,6 +291,104 @@ const internalProxyHost = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: (access, data) => {
|
||||||
|
return access.can('proxy_hosts:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalProxyHost.get(access, {
|
||||||
|
id: data.id,
|
||||||
|
expand: ['certificate', 'owner', 'access_list']
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 1;
|
||||||
|
|
||||||
|
return proxyHostModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 1
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Configure nginx
|
||||||
|
return internalNginx.configure(proxyHostModel, 'proxy_host', row);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'enabled',
|
||||||
|
object_type: 'proxy-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: (access, data) => {
|
||||||
|
return access.can('proxy_hosts:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalProxyHost.get(access, {id: data.id});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (!row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 0;
|
||||||
|
|
||||||
|
return proxyHostModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 0
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Delete Nginx Config
|
||||||
|
return internalNginx.deleteConfig('proxy_host', row)
|
||||||
|
.then(() => {
|
||||||
|
return internalNginx.reload();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'disabled',
|
||||||
|
object_type: 'proxy-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All Hosts
|
* All Hosts
|
||||||
*
|
*
|
||||||
@ -339,7 +437,7 @@ const internalProxyHost = {
|
|||||||
/**
|
/**
|
||||||
* Report use
|
* Report use
|
||||||
*
|
*
|
||||||
* @param {Integer} user_id
|
* @param {Number} user_id
|
||||||
* @param {String} visibility
|
* @param {String} visibility
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
|
@ -103,7 +103,7 @@ const internalRedirectionHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
*/
|
*/
|
||||||
update: (access, data) => {
|
update: (access, data) => {
|
||||||
@ -201,7 +201,7 @@ const internalRedirectionHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {Array} [data.expand]
|
* @param {Array} [data.expand]
|
||||||
* @param {Array} [data.omit]
|
* @param {Array} [data.omit]
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
@ -248,7 +248,7 @@ const internalRedirectionHost = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {String} [data.reason]
|
* @param {String} [data.reason]
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -290,6 +290,104 @@ const internalRedirectionHost = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: (access, data) => {
|
||||||
|
return access.can('redirection_hosts:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalRedirectionHost.get(access, {
|
||||||
|
id: data.id,
|
||||||
|
expand: ['certificate', 'owner']
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 1;
|
||||||
|
|
||||||
|
return redirectionHostModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 1
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Configure nginx
|
||||||
|
return internalNginx.configure(redirectionHostModel, 'redirection_host', row);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'enabled',
|
||||||
|
object_type: 'redirection-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: (access, data) => {
|
||||||
|
return access.can('redirection_hosts:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalRedirectionHost.get(access, {id: data.id});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (!row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 0;
|
||||||
|
|
||||||
|
return redirectionHostModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 0
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Delete Nginx Config
|
||||||
|
return internalNginx.deleteConfig('redirection_host', row)
|
||||||
|
.then(() => {
|
||||||
|
return internalNginx.reload();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'disabled',
|
||||||
|
object_type: 'redirection-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All Hosts
|
* All Hosts
|
||||||
*
|
*
|
||||||
@ -338,7 +436,7 @@ const internalRedirectionHost = {
|
|||||||
/**
|
/**
|
||||||
* Report use
|
* Report use
|
||||||
*
|
*
|
||||||
* @param {Integer} user_id
|
* @param {Number} user_id
|
||||||
* @param {String} visibility
|
* @param {String} visibility
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
|
@ -56,7 +56,7 @@ const internalStream = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
*/
|
*/
|
||||||
update: (access, data) => {
|
update: (access, data) => {
|
||||||
@ -75,6 +75,12 @@ const internalStream = {
|
|||||||
.query()
|
.query()
|
||||||
.omit(omissions())
|
.omit(omissions())
|
||||||
.patchAndFetchById(row.id, data)
|
.patchAndFetchById(row.id, data)
|
||||||
|
.then(saved_row => {
|
||||||
|
return internalNginx.configure(streamModel, 'stream', saved_row)
|
||||||
|
.then(() => {
|
||||||
|
return internalStream.get(access, {id: row.id, expand: ['owner']});
|
||||||
|
});
|
||||||
|
})
|
||||||
.then(saved_row => {
|
.then(saved_row => {
|
||||||
// Add to audit log
|
// Add to audit log
|
||||||
return internalAuditLog.add(access, {
|
return internalAuditLog.add(access, {
|
||||||
@ -93,7 +99,7 @@ const internalStream = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {Array} [data.expand]
|
* @param {Array} [data.expand]
|
||||||
* @param {Array} [data.omit]
|
* @param {Array} [data.omit]
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
@ -139,7 +145,7 @@ const internalStream = {
|
|||||||
/**
|
/**
|
||||||
* @param {Access} access
|
* @param {Access} access
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @param {String} [data.reason]
|
* @param {String} [data.reason]
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -181,6 +187,104 @@ const internalStream = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: (access, data) => {
|
||||||
|
return access.can('streams:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalStream.get(access, {
|
||||||
|
id: data.id,
|
||||||
|
expand: ['owner']
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 1;
|
||||||
|
|
||||||
|
return streamModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 1
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Configure nginx
|
||||||
|
return internalNginx.configure(streamModel, 'stream', row);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'enabled',
|
||||||
|
object_type: 'stream',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Access} access
|
||||||
|
* @param {Object} data
|
||||||
|
* @param {Number} data.id
|
||||||
|
* @param {String} [data.reason]
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: (access, data) => {
|
||||||
|
return access.can('streams:update', data.id)
|
||||||
|
.then(() => {
|
||||||
|
return internalStream.get(access, {id: data.id});
|
||||||
|
})
|
||||||
|
.then(row => {
|
||||||
|
if (!row) {
|
||||||
|
throw new error.ItemNotFoundError(data.id);
|
||||||
|
} else if (!row.enabled) {
|
||||||
|
throw new error.ValidationError('Host is already disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
row.enabled = 0;
|
||||||
|
|
||||||
|
return streamModel
|
||||||
|
.query()
|
||||||
|
.where('id', row.id)
|
||||||
|
.patch({
|
||||||
|
enabled: 0
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Delete Nginx Config
|
||||||
|
return internalNginx.deleteConfig('stream', row)
|
||||||
|
.then(() => {
|
||||||
|
return internalNginx.reload();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// Add to audit log
|
||||||
|
return internalAuditLog.add(access, {
|
||||||
|
action: 'disabled',
|
||||||
|
object_type: 'stream-host',
|
||||||
|
object_id: row.id,
|
||||||
|
meta: _.omit(row, omissions())
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All Streams
|
* All Streams
|
||||||
*
|
*
|
||||||
@ -222,7 +326,7 @@ const internalStream = {
|
|||||||
/**
|
/**
|
||||||
* Report use
|
* Report use
|
||||||
*
|
*
|
||||||
* @param {Integer} user_id
|
* @param {Number} user_id
|
||||||
* @param {String} visibility
|
* @param {String} visibility
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
const {Signale} = require('signale');
|
const {Signale} = require('signale');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
global: new Signale({scope: 'Global '}),
|
global: new Signale({scope: 'Global '}),
|
||||||
migrate: new Signale({scope: 'Migrate '}),
|
migrate: new Signale({scope: 'Migrate '}),
|
||||||
express: new Signale({scope: 'Express '}),
|
express: new Signale({scope: 'Express '}),
|
||||||
access: new Signale({scope: 'Access '}),
|
access: new Signale({scope: 'Access '}),
|
||||||
nginx: new Signale({scope: 'Nginx '}),
|
nginx: new Signale({scope: 'Nginx '}),
|
||||||
ssl: new Signale({scope: 'SSL '}),
|
ssl: new Signale({scope: 'SSL '}),
|
||||||
import: new Signale({scope: 'Importer'}),
|
import: new Signale({scope: 'Importer '}),
|
||||||
setup: new Signale({scope: 'Setup '})
|
setup: new Signale({scope: 'Setup '}),
|
||||||
|
ip_ranges: new Signale({scope: 'IP Ranges'})
|
||||||
};
|
};
|
||||||
|
36
src/backend/migrations/20181213013211_forward_scheme.js
Normal file
36
src/backend/migrations/20181213013211_forward_scheme.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const migrate_name = 'forward_scheme';
|
||||||
|
const logger = require('../logger').migrate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate
|
||||||
|
*
|
||||||
|
* @see http://knexjs.org/#Schema
|
||||||
|
*
|
||||||
|
* @param {Object} knex
|
||||||
|
* @param {Promise} Promise
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
exports.up = function (knex/*, Promise*/) {
|
||||||
|
logger.info('[' + migrate_name + '] Migrating Up...');
|
||||||
|
|
||||||
|
return knex.schema.table('proxy_host', function (proxy_host) {
|
||||||
|
proxy_host.string('forward_scheme').notNull().defaultTo('http');
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] proxy_host Table altered');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undo Migrate
|
||||||
|
*
|
||||||
|
* @param {Object} knex
|
||||||
|
* @param {Promise} Promise
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
exports.down = function (knex, Promise) {
|
||||||
|
logger.warn('[' + migrate_name + '] You can\'t migrate down this one.');
|
||||||
|
return Promise.resolve(true);
|
||||||
|
};
|
57
src/backend/migrations/20190104035154_disabled.js
Normal file
57
src/backend/migrations/20190104035154_disabled.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const migrate_name = 'disabled';
|
||||||
|
const logger = require('../logger').migrate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate
|
||||||
|
*
|
||||||
|
* @see http://knexjs.org/#Schema
|
||||||
|
*
|
||||||
|
* @param {Object} knex
|
||||||
|
* @param {Promise} Promise
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
exports.up = function (knex/*, Promise*/) {
|
||||||
|
logger.info('[' + migrate_name + '] Migrating Up...');
|
||||||
|
|
||||||
|
return knex.schema.table('proxy_host', function (proxy_host) {
|
||||||
|
proxy_host.integer('enabled').notNull().unsigned().defaultTo(1);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] proxy_host Table altered');
|
||||||
|
|
||||||
|
return knex.schema.table('redirection_host', function (redirection_host) {
|
||||||
|
redirection_host.integer('enabled').notNull().unsigned().defaultTo(1);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] redirection_host Table altered');
|
||||||
|
|
||||||
|
return knex.schema.table('dead_host', function (dead_host) {
|
||||||
|
dead_host.integer('enabled').notNull().unsigned().defaultTo(1);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] dead_host Table altered');
|
||||||
|
|
||||||
|
return knex.schema.table('stream', function (stream) {
|
||||||
|
stream.integer('enabled').notNull().unsigned().defaultTo(1);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] stream Table altered');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undo Migrate
|
||||||
|
*
|
||||||
|
* @param {Object} knex
|
||||||
|
* @param {Promise} Promise
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
exports.down = function (knex, Promise) {
|
||||||
|
logger.warn('[' + migrate_name + '] You can\'t migrate down this one.');
|
||||||
|
return Promise.resolve(true);
|
||||||
|
};
|
@ -20,7 +20,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/access-lists
|
* GET /api/nginx/access-lists
|
||||||
@ -79,7 +79,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/access-lists/123
|
* GET /api/nginx/access-lists/123
|
||||||
|
@ -20,7 +20,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/certificates
|
* GET /api/nginx/certificates
|
||||||
@ -79,7 +79,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/certificates/123
|
* GET /api/nginx/certificates/123
|
||||||
@ -157,7 +157,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POST /api/nginx/certificates/123/upload
|
* POST /api/nginx/certificates/123/upload
|
||||||
@ -191,7 +191,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POST /api/nginx/certificates/validate
|
* POST /api/nginx/certificates/validate
|
||||||
|
@ -20,7 +20,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/dead-hosts
|
* GET /api/nginx/dead-hosts
|
||||||
@ -79,7 +79,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/dead-hosts/123
|
* GET /api/nginx/dead-hosts/123
|
||||||
@ -147,4 +147,52 @@ router
|
|||||||
.catch(next);
|
.catch(next);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable dead-host
|
||||||
|
*
|
||||||
|
* /api/nginx/dead-hosts/123/enable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/enable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/dead-hosts/123/enable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalDeadHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable dead-host
|
||||||
|
*
|
||||||
|
* /api/nginx/dead-hosts/123/disable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/disable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/dead-hosts/123/disable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalDeadHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
@ -20,7 +20,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/proxy-hosts
|
* GET /api/nginx/proxy-hosts
|
||||||
@ -79,7 +79,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/proxy-hosts/123
|
* GET /api/nginx/proxy-hosts/123
|
||||||
@ -147,4 +147,52 @@ router
|
|||||||
.catch(next);
|
.catch(next);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable proxy-host
|
||||||
|
*
|
||||||
|
* /api/nginx/proxy-hosts/123/enable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/enable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/proxy-hosts/123/enable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalProxyHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable proxy-host
|
||||||
|
*
|
||||||
|
* /api/nginx/proxy-hosts/123/disable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/disable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/proxy-hosts/123/disable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalProxyHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
@ -20,7 +20,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/redirection-hosts
|
* GET /api/nginx/redirection-hosts
|
||||||
@ -79,7 +79,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/nginx/redirection-hosts/123
|
* GET /api/nginx/redirection-hosts/123
|
||||||
@ -147,4 +147,52 @@ router
|
|||||||
.catch(next);
|
.catch(next);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable redirection-host
|
||||||
|
*
|
||||||
|
* /api/nginx/redirection-hosts/123/enable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/enable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/redirection-hosts/123/enable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalRedirectionHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable redirection-host
|
||||||
|
*
|
||||||
|
* /api/nginx/redirection-hosts/123/disable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/disable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/redirection-hosts/123/disable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalRedirectionHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
@ -147,4 +147,52 @@ router
|
|||||||
.catch(next);
|
.catch(next);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable stream
|
||||||
|
*
|
||||||
|
* /api/nginx/streams/123/enable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/enable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/streams/123/enable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalStream.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable stream
|
||||||
|
*
|
||||||
|
* /api/nginx/streams/123/disable
|
||||||
|
*/
|
||||||
|
router
|
||||||
|
.route('/:host_id/disable')
|
||||||
|
.options((req, res) => {
|
||||||
|
res.sendStatus(204);
|
||||||
|
})
|
||||||
|
.all(jwtdecode())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/nginx/streams/123/disable
|
||||||
|
*/
|
||||||
|
.post((req, res, next) => {
|
||||||
|
internalStream.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)})
|
||||||
|
.then(result => {
|
||||||
|
res.status(200)
|
||||||
|
.send(result);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
@ -21,7 +21,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/users
|
* GET /api/users
|
||||||
@ -80,7 +80,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
.all(userIdFromMe)
|
.all(userIdFromMe)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -160,7 +160,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
.all(userIdFromMe)
|
.all(userIdFromMe)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -191,7 +191,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
.all(userIdFromMe)
|
.all(userIdFromMe)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -222,7 +222,7 @@ router
|
|||||||
.options((req, res) => {
|
.options((req, res) => {
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
})
|
})
|
||||||
.all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes
|
.all(jwtdecode())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POST /api/users/123/login
|
* POST /api/users/123/login
|
||||||
|
@ -172,6 +172,11 @@
|
|||||||
"pattern": "^(?:\\*\\.)?(?:[^.*]+\\.?)+[^.]$"
|
"pattern": "^(?:\\*\\.)?(?:[^.*]+\\.?)+[^.]$"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"description": "Is Enabled",
|
||||||
|
"example": true,
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"ssl_enabled": {
|
"ssl_enabled": {
|
||||||
"description": "Is SSL Enabled",
|
"description": "Is SSL Enabled",
|
||||||
"example": true,
|
"example": true,
|
||||||
|
@ -30,6 +30,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "../definitions.json#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
}
|
}
|
||||||
@ -59,6 +62,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"$ref": "#/definitions/meta"
|
"$ref": "#/definitions/meta"
|
||||||
}
|
}
|
||||||
@ -177,6 +183,34 @@
|
|||||||
"targetSchema": {
|
"targetSchema": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Enable",
|
||||||
|
"description": "Enables a existing 404 Host",
|
||||||
|
"href": "/nginx/dead-hosts/{definitions.identity.example}/enable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Disable",
|
||||||
|
"description": "Disables a existing 404 Host",
|
||||||
|
"href": "/nginx/dead-hosts/{definitions.identity.example}/disable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,10 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "../definitions.json#/definitions/domain_names"
|
"$ref": "../definitions.json#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
|
"forward_scheme": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["http", "https"]
|
||||||
|
},
|
||||||
"forward_host": {
|
"forward_host": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"minLength": 1,
|
"minLength": 1,
|
||||||
@ -54,6 +58,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "../definitions.json#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
}
|
}
|
||||||
@ -71,6 +78,9 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "#/definitions/domain_names"
|
"$ref": "#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
|
"forward_scheme": {
|
||||||
|
"$ref": "#/definitions/forward_scheme"
|
||||||
|
},
|
||||||
"forward_host": {
|
"forward_host": {
|
||||||
"$ref": "#/definitions/forward_host"
|
"$ref": "#/definitions/forward_host"
|
||||||
},
|
},
|
||||||
@ -101,6 +111,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"$ref": "#/definitions/meta"
|
"$ref": "#/definitions/meta"
|
||||||
}
|
}
|
||||||
@ -138,6 +151,7 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
"domain_names",
|
"domain_names",
|
||||||
|
"forward_scheme",
|
||||||
"forward_host",
|
"forward_host",
|
||||||
"forward_port"
|
"forward_port"
|
||||||
],
|
],
|
||||||
@ -145,6 +159,9 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "#/definitions/domain_names"
|
"$ref": "#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
|
"forward_scheme": {
|
||||||
|
"$ref": "#/definitions/forward_scheme"
|
||||||
|
},
|
||||||
"forward_host": {
|
"forward_host": {
|
||||||
"$ref": "#/definitions/forward_host"
|
"$ref": "#/definitions/forward_host"
|
||||||
},
|
},
|
||||||
@ -175,6 +192,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"$ref": "#/definitions/meta"
|
"$ref": "#/definitions/meta"
|
||||||
}
|
}
|
||||||
@ -203,6 +223,9 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "#/definitions/domain_names"
|
"$ref": "#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
|
"forward_scheme": {
|
||||||
|
"$ref": "#/definitions/forward_scheme"
|
||||||
|
},
|
||||||
"forward_host": {
|
"forward_host": {
|
||||||
"$ref": "#/definitions/forward_host"
|
"$ref": "#/definitions/forward_host"
|
||||||
},
|
},
|
||||||
@ -233,6 +256,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"$ref": "#/definitions/meta"
|
"$ref": "#/definitions/meta"
|
||||||
}
|
}
|
||||||
@ -257,6 +283,34 @@
|
|||||||
"targetSchema": {
|
"targetSchema": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Enable",
|
||||||
|
"description": "Enables a existing Proxy Host",
|
||||||
|
"href": "/nginx/proxy-hosts/{definitions.identity.example}/enable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Disable",
|
||||||
|
"description": "Disables a existing Proxy Host",
|
||||||
|
"href": "/nginx/proxy-hosts/{definitions.identity.example}/disable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "../definitions.json#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
}
|
}
|
||||||
@ -79,6 +82,9 @@
|
|||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"$ref": "#/definitions/meta"
|
"$ref": "#/definitions/meta"
|
||||||
}
|
}
|
||||||
@ -216,6 +222,34 @@
|
|||||||
"targetSchema": {
|
"targetSchema": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Enable",
|
||||||
|
"description": "Enables a existing Redirection Host",
|
||||||
|
"href": "/nginx/redirection-hosts/{definitions.identity.example}/enable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Disable",
|
||||||
|
"description": "Disables a existing Redirection Host",
|
||||||
|
"href": "/nginx/redirection-hosts/{definitions.identity.example}/disable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,9 @@
|
|||||||
"udp_forwarding": {
|
"udp_forwarding": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "../definitions.json#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
}
|
}
|
||||||
@ -64,6 +67,9 @@
|
|||||||
"udp_forwarding": {
|
"udp_forwarding": {
|
||||||
"$ref": "#/definitions/udp_forwarding"
|
"$ref": "#/definitions/udp_forwarding"
|
||||||
},
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/definitions/enabled"
|
||||||
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"$ref": "#/definitions/meta"
|
"$ref": "#/definitions/meta"
|
||||||
}
|
}
|
||||||
@ -184,6 +190,34 @@
|
|||||||
"targetSchema": {
|
"targetSchema": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Enable",
|
||||||
|
"description": "Enables a existing Stream",
|
||||||
|
"href": "/nginx/streams/{definitions.identity.example}/enable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Disable",
|
||||||
|
"description": "Disables a existing Stream",
|
||||||
|
"href": "/nginx/streams/{definitions.identity.example}/disable",
|
||||||
|
"access": "private",
|
||||||
|
"method": "POST",
|
||||||
|
"rel": "update",
|
||||||
|
"http_header": {
|
||||||
|
"$ref": "../examples.json#/definitions/auth_header"
|
||||||
|
},
|
||||||
|
"targetSchema": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{% include "_header_comment.conf" %}
|
{% include "_header_comment.conf" %}
|
||||||
|
|
||||||
|
{% if enabled %}
|
||||||
server {
|
server {
|
||||||
{% include "_listen.conf" %}
|
{% include "_listen.conf" %}
|
||||||
{% include "_certificates.conf" %}
|
{% include "_certificates.conf" %}
|
||||||
@ -10,3 +11,4 @@ server {
|
|||||||
|
|
||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
{% endif %}
|
||||||
|
3
src/backend/templates/ip_ranges.conf
Normal file
3
src/backend/templates/ip_ranges.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{% for range in ip_ranges %}
|
||||||
|
set_real_ip_from {{ range }};
|
||||||
|
{% endfor %}
|
@ -1,8 +1,10 @@
|
|||||||
{% include "_header_comment.conf" %}
|
{% include "_header_comment.conf" %}
|
||||||
|
|
||||||
|
{% if enabled %}
|
||||||
server {
|
server {
|
||||||
set $server "{{ forward_host }}";
|
set $forward_scheme {{ forward_scheme }};
|
||||||
set $port {{ forward_port }};
|
set $server "{{ forward_host }}";
|
||||||
|
set $port {{ forward_port }};
|
||||||
|
|
||||||
{% include "_listen.conf" %}
|
{% include "_listen.conf" %}
|
||||||
{% include "_certificates.conf" %}
|
{% include "_certificates.conf" %}
|
||||||
@ -22,13 +24,14 @@ server {
|
|||||||
|
|
||||||
{% include "_forced_ssl.conf" %}
|
{% include "_forced_ssl.conf" %}
|
||||||
|
|
||||||
{% if allow_websocket_upgrade == 1 or allow_websocket_upgrade == true %}
|
{% if allow_websocket_upgrade == 1 or allow_websocket_upgrade == true %}
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
proxy_set_header Connection "upgrade";
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Proxy!
|
# Proxy!
|
||||||
include conf.d/include/proxy.conf;
|
include conf.d/include/proxy.conf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{% endif %}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{% include "_header_comment.conf" %}
|
{% include "_header_comment.conf" %}
|
||||||
|
|
||||||
|
{% if enabled %}
|
||||||
server {
|
server {
|
||||||
{% include "_listen.conf" %}
|
{% include "_listen.conf" %}
|
||||||
{% include "_certificates.conf" %}
|
{% include "_certificates.conf" %}
|
||||||
@ -22,3 +23,4 @@ server {
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{% endif %}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# {{ incoming_port }} TCP: {{ tcp_forwarding }} UDP: {{ udp_forwarding }}
|
# {{ incoming_port }} TCP: {{ tcp_forwarding }} UDP: {{ udp_forwarding }}
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
{% if enabled %}
|
||||||
{% if tcp_forwarding == 1 or tcp_forwarding == true -%}
|
{% if tcp_forwarding == 1 or tcp_forwarding == true -%}
|
||||||
server {
|
server {
|
||||||
listen {{ incoming_port }};
|
listen {{ incoming_port }};
|
||||||
@ -14,3 +15,4 @@ server {
|
|||||||
proxy_pass {{ forward_ip }}:{{ forwarding_port }};
|
proxy_pass {{ forward_ip }}:{{ forwarding_port }};
|
||||||
}
|
}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% endif %}
|
@ -7,7 +7,7 @@ const Tokens = require('./tokens');
|
|||||||
/**
|
/**
|
||||||
* @param {String} message
|
* @param {String} message
|
||||||
* @param {*} debug
|
* @param {*} debug
|
||||||
* @param {Integer} code
|
* @param {Number} code
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
const ApiError = function (message, debug, code) {
|
const ApiError = function (message, debug, code) {
|
||||||
@ -129,7 +129,7 @@ function getAllObjects (path, expand, query) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} path
|
* @param {String} path
|
||||||
* @param {FormData} form_data
|
* @param {FormData} form_data
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -241,7 +241,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -251,7 +251,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
@ -260,7 +260,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @param {Object} auth
|
* @param {Object} auth
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -269,7 +269,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
loginAs: function (id) {
|
loginAs: function (id) {
|
||||||
@ -278,7 +278,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @param {Object} perms
|
* @param {Object} perms
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
@ -308,7 +308,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -318,11 +318,35 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
return fetch('delete', 'nginx/proxy-hosts/' + id);
|
return fetch('delete', 'nginx/proxy-hosts/' + id);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
get: function (id) {
|
||||||
|
return fetch('get', 'nginx/proxy-hosts/' + id);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: function (id) {
|
||||||
|
return fetch('post', 'nginx/proxy-hosts/' + id + '/enable');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: function (id) {
|
||||||
|
return fetch('post', 'nginx/proxy-hosts/' + id + '/disable');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -345,7 +369,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -355,7 +379,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
@ -363,12 +387,36 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
get: function (id) {
|
||||||
|
return fetch('get', 'nginx/redirection-hosts/' + id);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
* @param {FormData} form_data
|
* @param {FormData} form_data
|
||||||
* @params {Promise}
|
* @params {Promise}
|
||||||
*/
|
*/
|
||||||
setCerts: function (id, form_data) {
|
setCerts: function (id, form_data) {
|
||||||
return FileUpload('nginx/redirection-hosts/' + id + '/certificates', form_data);
|
return FileUpload('nginx/redirection-hosts/' + id + '/certificates', form_data);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: function (id) {
|
||||||
|
return fetch('post', 'nginx/redirection-hosts/' + id + '/enable');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: function (id) {
|
||||||
|
return fetch('post', 'nginx/redirection-hosts/' + id + '/disable');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -391,7 +439,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -401,11 +449,35 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
return fetch('delete', 'nginx/streams/' + id);
|
return fetch('delete', 'nginx/streams/' + id);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
get: function (id) {
|
||||||
|
return fetch('get', 'nginx/streams/' + id);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: function (id) {
|
||||||
|
return fetch('post', 'nginx/streams/' + id + '/enable');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: function (id) {
|
||||||
|
return fetch('post', 'nginx/streams/' + id + '/disable');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -428,7 +500,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -438,7 +510,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
@ -446,12 +518,36 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
get: function (id) {
|
||||||
|
return fetch('get', 'nginx/dead-hosts/' + id);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
* @param {FormData} form_data
|
* @param {FormData} form_data
|
||||||
* @params {Promise}
|
* @params {Promise}
|
||||||
*/
|
*/
|
||||||
setCerts: function (id, form_data) {
|
setCerts: function (id, form_data) {
|
||||||
return FileUpload('nginx/dead-hosts/' + id + '/certificates', form_data);
|
return FileUpload('nginx/dead-hosts/' + id + '/certificates', form_data);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
enable: function (id) {
|
||||||
|
return fetch('post', 'nginx/dead-hosts/' + id + '/enable');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} id
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
disable: function (id) {
|
||||||
|
return fetch('post', 'nginx/dead-hosts/' + id + '/disable');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -474,7 +570,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -484,7 +580,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
@ -511,7 +607,7 @@ module.exports = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
* @param {Integer} data.id
|
* @param {Number} data.id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
update: function (data) {
|
update: function (data) {
|
||||||
@ -521,7 +617,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
delete: function (id) {
|
delete: function (id) {
|
||||||
@ -529,7 +625,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Integer} id
|
* @param {Number} id
|
||||||
* @param {FormData} form_data
|
* @param {FormData} form_data
|
||||||
* @params {Promise}
|
* @params {Promise}
|
||||||
*/
|
*/
|
||||||
|
@ -83,7 +83,7 @@ module.exports = Mn.View.extend({
|
|||||||
|
|
||||||
data.meta.letsencrypt_agree = data.meta.letsencrypt_agree === '1';
|
data.meta.letsencrypt_agree = data.meta.letsencrypt_agree === '1';
|
||||||
} else {
|
} else {
|
||||||
data.certificate_id = parseInt(data.certificate_id, 0);
|
data.certificate_id = parseInt(data.certificate_id, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
let method = App.Api.Nginx.DeadHosts.create;
|
let method = App.Api.Nginx.DeadHosts.create;
|
||||||
|
@ -28,7 +28,9 @@
|
|||||||
<td>
|
<td>
|
||||||
<%
|
<%
|
||||||
var o = isOnline();
|
var o = isOnline();
|
||||||
if (o === true) { %>
|
if (!enabled) { %>
|
||||||
|
<span class="status-icon bg-warning"></span> <%- i18n('str', 'disabled') %>
|
||||||
|
<% } else if (o === true) { %>
|
||||||
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
||||||
<% } else if (o === false) { %>
|
<% } else if (o === false) { %>
|
||||||
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
||||||
@ -42,7 +44,7 @@
|
|||||||
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
||||||
<!--<a href="#" class="logs dropdown-item"><i class="dropdown-icon fe fe-book"></i> <%- i18n('str', 'logs') %></a>-->
|
<a href="#" class="able dropdown-item"><i class="dropdown-icon fe fe-power"></i> <%- i18n('str', enabled ? 'disable' : 'enable') %></a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,12 +9,25 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
|
able: 'a.able',
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete',
|
delete: 'a.delete',
|
||||||
host_link: '.host-link'
|
host_link: '.host-link'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
'click @ui.able': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let id = this.model.get('id');
|
||||||
|
App.Api.Nginx.DeadHosts[this.model.get('enabled') ? 'disable' : 'enable'](id)
|
||||||
|
.then(() => {
|
||||||
|
return App.Api.Nginx.DeadHosts.get(id)
|
||||||
|
.then(row => {
|
||||||
|
this.model.set(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
'click @ui.edit': function (e) {
|
'click @ui.edit': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxDeadForm(this.model);
|
App.Controller.showNginxDeadForm(this.model);
|
||||||
|
@ -20,7 +20,16 @@
|
|||||||
<input type="text" name="domain_names" class="form-control" id="input-domains" value="<%- domain_names.join(',') %>" required>
|
<input type="text" name="domain_names" class="form-control" id="input-domains" value="<%- domain_names.join(',') %>" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8 col-md-8">
|
<div class="col-sm-3 col-md-3">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label"><%- i18n('proxy-hosts', 'forward-scheme') %><span class="form-required">*</span></label>
|
||||||
|
<select name="forward_scheme" class="form-control custom-select" placeholder="http">
|
||||||
|
<option value="http" <%- forward_scheme === 'http' ? 'selected' : '' %>>http</option>
|
||||||
|
<option value="https" <%- forward_scheme === 'https' ? 'selected' : '' %>>https</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-5 col-md-5">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label"><%- i18n('proxy-hosts', 'forward-host') %><span class="form-required">*</span></label>
|
<label class="form-label"><%- i18n('proxy-hosts', 'forward-host') %><span class="form-required">*</span></label>
|
||||||
<input type="text" name="forward_host" class="form-control text-monospace" placeholder="" value="<%- forward_host %>" autocomplete="off" maxlength="50" required>
|
<input type="text" name="forward_host" class="form-control text-monospace" placeholder="" value="<%- forward_host %>" autocomplete="off" maxlength="50" required>
|
||||||
@ -59,6 +68,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-12 col-md-12">
|
<div class="col-sm-12 col-md-12">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label"><%- i18n('proxy-hosts', 'access-list') %></label>
|
<label class="form-label"><%- i18n('proxy-hosts', 'access-list') %></label>
|
||||||
|
@ -26,6 +26,7 @@ module.exports = Mn.View.extend({
|
|||||||
access_list_select: 'select[name="access_list_id"]',
|
access_list_select: 'select[name="access_list_id"]',
|
||||||
ssl_forced: 'input[name="ssl_forced"]',
|
ssl_forced: 'input[name="ssl_forced"]',
|
||||||
http2_support: 'input[name="http2_support"]',
|
http2_support: 'input[name="http2_support"]',
|
||||||
|
forward_scheme: 'select[name="forward_scheme"]',
|
||||||
letsencrypt: '.letsencrypt'
|
letsencrypt: '.letsencrypt'
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -43,8 +44,6 @@ module.exports = Mn.View.extend({
|
|||||||
.prop('disabled', !enabled)
|
.prop('disabled', !enabled)
|
||||||
.parents('.form-group')
|
.parents('.form-group')
|
||||||
.css('opacity', enabled ? 1 : 0.5);
|
.css('opacity', enabled ? 1 : 0.5);
|
||||||
|
|
||||||
this.ui.http2_support.prop('disabled', !enabled);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
'click @ui.save': function (e) {
|
'click @ui.save': function (e) {
|
||||||
@ -59,10 +58,10 @@ module.exports = Mn.View.extend({
|
|||||||
let data = this.ui.form.serializeJSON();
|
let data = this.ui.form.serializeJSON();
|
||||||
|
|
||||||
// Manipulate
|
// Manipulate
|
||||||
data.forward_port = parseInt(data.forward_port, 10);
|
data.forward_port = parseInt(data.forward_port, 10);
|
||||||
data.block_exploits = !!data.block_exploits;
|
data.block_exploits = !!data.block_exploits;
|
||||||
data.caching_enabled = !!data.caching_enabled;
|
data.caching_enabled = !!data.caching_enabled;
|
||||||
data.allow_websocket_upgrade = !!data.allow_websocket_upgrade;
|
data.allow_websocket_upgrade = !!data.allow_websocket_upgrade;
|
||||||
|
|
||||||
if (typeof data.ssl_forced !== 'undefined' && data.ssl_forced === '1') {
|
if (typeof data.ssl_forced !== 'undefined' && data.ssl_forced === '1') {
|
||||||
data.ssl_forced = true;
|
data.ssl_forced = true;
|
||||||
@ -92,7 +91,7 @@ module.exports = Mn.View.extend({
|
|||||||
|
|
||||||
data.meta.letsencrypt_agree = data.meta.letsencrypt_agree === '1';
|
data.meta.letsencrypt_agree = data.meta.letsencrypt_agree === '1';
|
||||||
} else {
|
} else {
|
||||||
data.certificate_id = parseInt(data.certificate_id, 0);
|
data.certificate_id = parseInt(data.certificate_id, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
let method = App.Api.Nginx.ProxyHosts.create;
|
let method = App.Api.Nginx.ProxyHosts.create;
|
||||||
@ -147,7 +146,6 @@ module.exports = Mn.View.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Access Lists
|
// Access Lists
|
||||||
this.ui.letsencrypt.hide();
|
|
||||||
this.ui.access_list_select.selectize({
|
this.ui.access_list_select.selectize({
|
||||||
valueField: 'id',
|
valueField: 'id',
|
||||||
labelField: 'name',
|
labelField: 'name',
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="text-monospace"><%- forward_host %>:<%- forward_port %></div>
|
<div class="text-monospace"><%- forward_scheme %>://<%- forward_host %>:<%- forward_port %></div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div><%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %></div>
|
<div><%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %></div>
|
||||||
@ -34,7 +34,9 @@
|
|||||||
<td>
|
<td>
|
||||||
<%
|
<%
|
||||||
var o = isOnline();
|
var o = isOnline();
|
||||||
if (o === true) { %>
|
if (!enabled) { %>
|
||||||
|
<span class="status-icon bg-warning"></span> <%- i18n('str', 'disabled') %>
|
||||||
|
<% } else if (o === true) { %>
|
||||||
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
||||||
<% } else if (o === false) { %>
|
<% } else if (o === false) { %>
|
||||||
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
||||||
@ -48,7 +50,7 @@
|
|||||||
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
||||||
<!--<a href="#" class="logs dropdown-item"><i class="dropdown-icon fe fe-book"></i> <%- i18n('str', 'logs') %></a>-->
|
<a href="#" class="able dropdown-item"><i class="dropdown-icon fe fe-power"></i> <%- i18n('str', enabled ? 'disable' : 'enable') %></a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,12 +9,25 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
|
able: 'a.able',
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete',
|
delete: 'a.delete',
|
||||||
host_link: '.host-link'
|
host_link: '.host-link'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
'click @ui.able': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let id = this.model.get('id');
|
||||||
|
App.Api.Nginx.ProxyHosts[this.model.get('enabled') ? 'disable' : 'enable'](id)
|
||||||
|
.then(() => {
|
||||||
|
return App.Api.Nginx.ProxyHosts.get(id)
|
||||||
|
.then(row => {
|
||||||
|
this.model.set(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
'click @ui.edit': function (e) {
|
'click @ui.edit': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxProxyForm(this.model);
|
App.Controller.showNginxProxyForm(this.model);
|
||||||
|
@ -86,7 +86,7 @@ module.exports = Mn.View.extend({
|
|||||||
|
|
||||||
data.meta.letsencrypt_agree = data.meta.letsencrypt_agree === '1';
|
data.meta.letsencrypt_agree = data.meta.letsencrypt_agree === '1';
|
||||||
} else {
|
} else {
|
||||||
data.certificate_id = parseInt(data.certificate_id, 0);
|
data.certificate_id = parseInt(data.certificate_id, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
let method = App.Api.Nginx.RedirectionHosts.create;
|
let method = App.Api.Nginx.RedirectionHosts.create;
|
||||||
|
@ -31,7 +31,9 @@
|
|||||||
<td>
|
<td>
|
||||||
<%
|
<%
|
||||||
var o = isOnline();
|
var o = isOnline();
|
||||||
if (o === true) { %>
|
if (!enabled) { %>
|
||||||
|
<span class="status-icon bg-warning"></span> <%- i18n('str', 'disabled') %>
|
||||||
|
<% } else if (o === true) { %>
|
||||||
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
||||||
<% } else if (o === false) { %>
|
<% } else if (o === false) { %>
|
||||||
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
||||||
@ -45,7 +47,7 @@
|
|||||||
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
||||||
<!--<a href="#" class="logs dropdown-item"><i class="dropdown-icon fe fe-book"></i> <%- i18n('str', 'logs') %></a>-->
|
<a href="#" class="able dropdown-item"><i class="dropdown-icon fe fe-power"></i> <%- i18n('str', enabled ? 'disable' : 'enable') %></a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,12 +9,25 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
|
able: 'a.able',
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete',
|
delete: 'a.delete',
|
||||||
host_link: '.host-link'
|
host_link: '.host-link'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
'click @ui.able': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let id = this.model.get('id');
|
||||||
|
App.Api.Nginx.RedirectionHosts[this.model.get('enabled') ? 'disable' : 'enable'](id)
|
||||||
|
.then(() => {
|
||||||
|
return App.Api.Nginx.RedirectionHosts.get(id)
|
||||||
|
.then(row => {
|
||||||
|
this.model.set(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
'click @ui.edit': function (e) {
|
'click @ui.edit': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxRedirectionForm(this.model);
|
App.Controller.showNginxRedirectionForm(this.model);
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
<td>
|
<td>
|
||||||
<%
|
<%
|
||||||
var o = isOnline();
|
var o = isOnline();
|
||||||
if (o === true) { %>
|
if (!enabled) { %>
|
||||||
|
<span class="status-icon bg-warning"></span> <%- i18n('str', 'disabled') %>
|
||||||
|
<% } else if (o === true) { %>
|
||||||
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
<span class="status-icon bg-success"></span> <%- i18n('str', 'online') %>
|
||||||
<% } else if (o === false) { %>
|
<% } else if (o === false) { %>
|
||||||
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
<span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span>
|
||||||
@ -41,6 +43,7 @@
|
|||||||
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
<a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a>
|
||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
<a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a>
|
||||||
|
<a href="#" class="able dropdown-item"><i class="dropdown-icon fe fe-power"></i> <%- i18n('str', enabled ? 'disable' : 'enable') %></a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
<a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,11 +9,24 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
|
able: 'a.able',
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete'
|
delete: 'a.delete'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
'click @ui.able': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let id = this.model.get('id');
|
||||||
|
App.Api.Nginx.Streams[this.model.get('enabled') ? 'disable' : 'enable'](id)
|
||||||
|
.then(() => {
|
||||||
|
return App.Api.Nginx.Streams.get(id)
|
||||||
|
.then(row => {
|
||||||
|
this.model.set(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
'click @ui.edit': function (e) {
|
'click @ui.edit': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxStreamForm(this.model);
|
App.Controller.showNginxStreamForm(this.model);
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
"save": "Save",
|
"save": "Save",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
|
"enable": "Enable",
|
||||||
|
"disable": "Disable",
|
||||||
"sure": "Yes I'm Sure",
|
"sure": "Yes I'm Sure",
|
||||||
"disabled": "Disabled",
|
"disabled": "Disabled",
|
||||||
"choose-file": "Choose file",
|
"choose-file": "Choose file",
|
||||||
@ -93,6 +95,7 @@
|
|||||||
"empty": "There are no Proxy Hosts",
|
"empty": "There are no Proxy Hosts",
|
||||||
"add": "Add Proxy Host",
|
"add": "Add Proxy Host",
|
||||||
"form-title": "{id, select, undefined{New} other{Edit}} Proxy Host",
|
"form-title": "{id, select, undefined{New} other{Edit}} Proxy Host",
|
||||||
|
"forward-scheme": "Scheme",
|
||||||
"forward-host": "Forward Hostname / IP",
|
"forward-host": "Forward Hostname / IP",
|
||||||
"forward-port": "Forward Port",
|
"forward-port": "Forward Port",
|
||||||
"delete": "Delete Proxy Host",
|
"delete": "Delete Proxy Host",
|
||||||
@ -100,7 +103,8 @@
|
|||||||
"help-title": "What is a Proxy Host?",
|
"help-title": "What is a Proxy Host?",
|
||||||
"help-content": "A Proxy Host is the incoming endpoint for a web service that you want to forward.\nIt provides optional SSL termination for your service that might not have SSL support built in.\nProxy Hosts are the most common use for the Nginx Proxy Manager.",
|
"help-content": "A Proxy Host is the incoming endpoint for a web service that you want to forward.\nIt provides optional SSL termination for your service that might not have SSL support built in.\nProxy Hosts are the most common use for the Nginx Proxy Manager.",
|
||||||
"access-list": "Access List",
|
"access-list": "Access List",
|
||||||
"allow-websocket-upgrade": "Allow Websocket HTTP Upgrades"
|
"allow-websocket-upgrade": "Websockets Support",
|
||||||
|
"ignore-invalid-upstream-ssl": "Ignore Invalid SSL"
|
||||||
},
|
},
|
||||||
"redirection-hosts": {
|
"redirection-hosts": {
|
||||||
"title": "Redirection Hosts",
|
"title": "Redirection Hosts",
|
||||||
@ -211,6 +215,8 @@
|
|||||||
"created": "Created {name}",
|
"created": "Created {name}",
|
||||||
"updated": "Updated {name}",
|
"updated": "Updated {name}",
|
||||||
"deleted": "Deleted {name}",
|
"deleted": "Deleted {name}",
|
||||||
|
"enabled": "Enabled {name}",
|
||||||
|
"disabled": "Disabled {name}",
|
||||||
"meta-title": "Details for Event",
|
"meta-title": "Details for Event",
|
||||||
"view-meta": "View Details",
|
"view-meta": "View Details",
|
||||||
"date": "Date"
|
"date": "Date"
|
||||||
|
@ -14,6 +14,7 @@ const model = Backbone.Model.extend({
|
|||||||
certificate_id: 0,
|
certificate_id: 0,
|
||||||
ssl_forced: false,
|
ssl_forced: false,
|
||||||
http2_support: false,
|
http2_support: false,
|
||||||
|
enabled: true,
|
||||||
meta: {},
|
meta: {},
|
||||||
advanced_config: '',
|
advanced_config: '',
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
|
@ -11,6 +11,7 @@ const model = Backbone.Model.extend({
|
|||||||
created_on: null,
|
created_on: null,
|
||||||
modified_on: null,
|
modified_on: null,
|
||||||
domain_names: [],
|
domain_names: [],
|
||||||
|
forward_scheme: 'http',
|
||||||
forward_host: '',
|
forward_host: '',
|
||||||
forward_port: null,
|
forward_port: null,
|
||||||
access_list_id: 0,
|
access_list_id: 0,
|
||||||
@ -21,6 +22,7 @@ const model = Backbone.Model.extend({
|
|||||||
block_exploits: false,
|
block_exploits: false,
|
||||||
http2_support: false,
|
http2_support: false,
|
||||||
advanced_config: '',
|
advanced_config: '',
|
||||||
|
enabled: true,
|
||||||
meta: {},
|
meta: {},
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
owner: null,
|
owner: null,
|
||||||
|
@ -18,6 +18,7 @@ const model = Backbone.Model.extend({
|
|||||||
block_exploits: false,
|
block_exploits: false,
|
||||||
http2_support: false,
|
http2_support: false,
|
||||||
advanced_config: '',
|
advanced_config: '',
|
||||||
|
enabled: true,
|
||||||
meta: {},
|
meta: {},
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
owner: null,
|
owner: null,
|
||||||
|
@ -15,6 +15,7 @@ const model = Backbone.Model.extend({
|
|||||||
forwarding_port: null,
|
forwarding_port: null,
|
||||||
tcp_forwarding: true,
|
tcp_forwarding: true,
|
||||||
udp_forwarding: false,
|
udp_forwarding: false,
|
||||||
|
enabled: true,
|
||||||
meta: {},
|
meta: {},
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
owner: null
|
owner: null
|
||||||
|
Reference in New Issue
Block a user