229 lines
7.3 KiB
Python
229 lines
7.3 KiB
Python
#coding: utf-8
|
||
#-------------------------------------------------------------------
|
||
# YakPanel
|
||
#-------------------------------------------------------------------
|
||
# Copyright (c) 2015-2017 YakPanel(www.yakpanel.com) All rights reserved.
|
||
#-------------------------------------------------------------------
|
||
# Author: hwliang <hwl@yakpanel.com>
|
||
#-------------------------------------------------------------------
|
||
|
||
#------------------------------
|
||
# 网站管理类
|
||
#------------------------------
|
||
import io,re,public,os,sys,shutil,files
|
||
from YakPanel import session
|
||
from flask import request
|
||
from json import loads,dumps
|
||
|
||
class sites:
|
||
__isNginx = None
|
||
__nginxVhost = None
|
||
__httpdVhost = None
|
||
__nginxRewrite = None
|
||
__certPath = None
|
||
def __init__(self):
|
||
self.__isNginx = ('nginx' == public.get_webserver())
|
||
self.__nginxVhost = 'vhost/nginx'
|
||
self.__httpdVhost = 'vhost/apache'
|
||
self.__nginxRewrite = 'vhost/rewrite'
|
||
self.__certPath = 'vhost/cert'
|
||
|
||
#添加网站
|
||
def create_site(self,get):
|
||
pdata = loads(get['data'])
|
||
|
||
#表单验证
|
||
checkRootPath = self.check_root_path(pdata['rootPath'])
|
||
if checkRootPath: return checkRootPath
|
||
domainFormat = self.domain_format(pdata['domains'])
|
||
if domainFormat: return public.ReturnMsg(False,'SITE_DOMAIN_FORMAT_ERR' , (domainFormat,))
|
||
domainExists = self.domain_exists(pdata['domains'])
|
||
if domainExists: return public.ReturnMsg(False,'SITE_DOMAIN_EXIST' , (domainExists,))
|
||
return self._generate_nginx_conf(pdata['siteName'])
|
||
|
||
|
||
r'''
|
||
server
|
||
{
|
||
listen 80;
|
||
server_name demo.example.com www.demo.example.com;
|
||
index index.php index.html index.htm default.php default.htm default.html;
|
||
root /www/wwwroot/demo.example.com;
|
||
|
||
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
|
||
#error_page 404/404.html;
|
||
#SSL-END
|
||
|
||
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
|
||
error_page 404 /404.html;
|
||
error_page 502 /502.html;
|
||
#ERROR-PAGE-END
|
||
|
||
#PHP-INFO-START PHP引用配置,可以注释或修改
|
||
include enable-php-70.conf;
|
||
#PHP-INFO-END
|
||
|
||
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
|
||
include /www/server/panel/vhost/rewrite/demo.example.com.conf;
|
||
#REWRITE-END
|
||
|
||
#禁止访问的文件或目录
|
||
location ~ ^/(\.user\.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README\.md)
|
||
{
|
||
return 404;
|
||
}
|
||
|
||
#一键申请SSL证书验证目录相关设置
|
||
location ~ \.well-known
|
||
{
|
||
allow all;
|
||
}
|
||
|
||
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
|
||
{
|
||
expires 30d;
|
||
error_log off;
|
||
access_log off;
|
||
}
|
||
|
||
location ~ .*\.(js|css)?$
|
||
{
|
||
expires 12h;
|
||
error_log off;
|
||
access_log off;
|
||
}
|
||
access_log /www/wwwlogs/demo.example.com.log;
|
||
error_log /www/wwwlogs/demo.example.com.error.log;
|
||
};'''
|
||
|
||
|
||
return pdata
|
||
#if pdata['siteName'].find('*') != -1: return public.returnMsg(False, public.lang("SITE_ADD_ERR_DOMAIN_TOW"));
|
||
|
||
|
||
|
||
|
||
|
||
#删除网站
|
||
def remove_site(self,get):
|
||
pass
|
||
|
||
#添加域名
|
||
def add_domain(self,get):
|
||
pass
|
||
|
||
#删除域名
|
||
def remove_domain(self,get):
|
||
pass
|
||
|
||
#打开SSL
|
||
def open_ssl(self,get):
|
||
pass
|
||
|
||
#关闭SSL
|
||
def close_ssl(self,get):
|
||
pass
|
||
|
||
#检查指定域名是否存在
|
||
def domain_exists(self,domains):
|
||
if type(domains) == str: domains = [domains]
|
||
sql = public.M('domain');
|
||
for domain in domains:
|
||
tmp = domain.split(':')
|
||
if len(tmp) == 1: tmp.append('80')
|
||
pid = sql.table('domain').where('name=? and port=?',(tmp[0],tmp[1])).getField('pid')
|
||
if pid:
|
||
if not sql.table('sites').where('id=?',(pid,)).count():
|
||
sql.table('domain').where('pid=?',(pid,)).delete()
|
||
else:
|
||
return domain
|
||
return False
|
||
|
||
#检查域名格式是否不正确
|
||
def domain_format(self,domains):
|
||
if type(domains) == str: domains = [domains]
|
||
reg = r"^([\w\-\*]{1,100}\.){1,8}([\w\-]{1,24}|[\w\-]{1,24}\.[\w\-]{1,24})$";
|
||
for domain in domains:
|
||
if not re.match(reg,domain): return domain
|
||
return False
|
||
|
||
#检查指定目录是否不合法
|
||
def check_root_path(self,rootPath):
|
||
if not files.files().CheckDir(rootPath): return public.returnMsg(False, public.lang("System critical directory cannot be used as site directory"));
|
||
return False
|
||
|
||
#重新生成配置文件
|
||
def generate_conf(self,get):
|
||
return self._generate_nginx_conf(get.siteName)
|
||
|
||
#生成配置文件
|
||
def _generate_nginx_conf(self,siteName):
|
||
siteInfo = public.M('sites').where('name=?',(siteName,)).field('id,name,path,status').find()
|
||
if siteInfo:
|
||
siteDomains = public.M('domain').where('pid=?',(siteInfo['id'],)).field('name,port').select()
|
||
siteBinding = public.M('binding').where('pid=?',(siteInfo['id'],)).field('domain,port,path').select()
|
||
siteConfig = {
|
||
"siteId": 2,
|
||
"defaultDoc": "index.php index.html index.htm default.php default.htm default.html",
|
||
"fpmConfig": {
|
||
"type": "PHP",
|
||
"version": "5.4"
|
||
},
|
||
"ssl": {
|
||
"open": False,
|
||
"cert": "",
|
||
"privateKey": "",
|
||
"pool": ""
|
||
},
|
||
|
||
"binDingSsl": {
|
||
"/www": {
|
||
"open": False,
|
||
"cert": "",
|
||
"privateKey": "",
|
||
"pool": ""
|
||
}
|
||
},
|
||
|
||
"redirect": [{
|
||
"code": 301,
|
||
"var": "$host",
|
||
"rule": "^yakpanel\\.com$",
|
||
"to": "https://www.yakpanel.com",
|
||
"args": "$request_uri"
|
||
}, {
|
||
"code": 302,
|
||
"var": "$uri",
|
||
"rule": "^/test/",
|
||
"to": "https://www.yakpanel.com",
|
||
"args": "$request_uri"
|
||
}],
|
||
"proxy": {
|
||
"open": False,
|
||
"url": "http://www.yakpanel.com",
|
||
"host": "www.yakpanel.com",
|
||
"subOpen": False,
|
||
"src": "",
|
||
"dst": "",
|
||
"cache": False
|
||
},
|
||
"antiStealingLink": {
|
||
"open": False,
|
||
"extName": ["jpg", "png", "gif", "js", "css"],
|
||
"domains": ["www.yakpanel.com", "yakpanel.com"],
|
||
"code": 404
|
||
},
|
||
"networkLimit": {
|
||
"open": False,
|
||
"perServer": 500,
|
||
"perIp": 25,
|
||
"rate": 512
|
||
}
|
||
}
|
||
|
||
|
||
return siteConfig
|
||
|
||
|
||
|