<?php
|
|
class nginx_plugin {
|
|
var $plugin_name = 'nginx_plugin';
|
var $class_name = 'nginx_plugin';
|
|
// private variables
|
var $action = '';
|
|
//* This function is called during ispconfig installation to determine
|
// if a symlink shall be created for this plugin.
|
function onInstall() {
|
global $conf;
|
|
if($conf['services']['proxy'] == true && $conf['nginx']['installed'] == true) {
|
return true;
|
} else {
|
return false;
|
}
|
|
}
|
|
|
/*
|
This function is called when the plugin is loaded
|
*/
|
|
function onLoad() {
|
global $app;
|
|
/*
|
Register for the events
|
*/
|
|
$app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'ssl');
|
$app->plugins->registerEvent('web_domain_update',$this->plugin_name,'ssl');
|
$app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'ssl');
|
|
$app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert');
|
$app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update');
|
$app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'delete');
|
|
// $app->plugins->registerEvent('proxy_reverse_insert',$this->plugin_name,'rewrite_insert');
|
// $app->plugins->registerEvent('proxy_reverse_update',$this->plugin_name,'rewrite_update');
|
// $app->plugins->registerEvent('proxy_reverse_delete',$this->plugin_name,'rewrite_delete');
|
|
|
|
}
|
|
|
function insert($event_name,$data) {
|
global $app, $conf;
|
|
// just run the update function
|
$this->update($event_name,$data);
|
}
|
|
|
function update($event_name,$data) {
|
global $app, $conf;
|
|
if($this->action != 'insert') $this->action = 'update';
|
|
if($data['new']['type'] != 'vhost' && $data['new']['parent_domain_id'] > 0) {
|
|
$old_parent_domain_id = intval($data['old']['parent_domain_id']);
|
$new_parent_domain_id = intval($data['new']['parent_domain_id']);
|
|
// If the parent_domain_id has been chenged, we will have to update the old site as well.
|
if($this->action == 'update' && $data['new']['parent_domain_id'] != $data['old']['parent_domain_id']) {
|
$tmp = $app->dbmaster->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = '.$old_parent_domain_id." AND active = 'y'");
|
$data['new'] = $tmp;
|
$data['old'] = $tmp;
|
$this->action = 'update';
|
$this->update($event_name,$data);
|
}
|
|
// This is not a vhost, so we need to update the parent record instead.
|
$tmp = $app->dbmaster->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = '.$new_parent_domain_id." AND active = 'y'");
|
$data['new'] = $tmp;
|
$data['old'] = $tmp;
|
$this->action = 'update';
|
}
|
|
|
|
|
// load the server configuration options
|
$app->uses('getconf');
|
$nginx_config = $app->getconf->get_server_config($conf['server_id'], 'nginx');
|
|
// Create group and user, if not exist
|
$app->uses('system');
|
|
//* Create the vhost config file
|
$app->load('tpl');
|
|
$tpl = new tpl();
|
$tpl->newTemplate('nginx_vhost.conf.master');
|
|
$vhost_data = $data['new'];
|
$vhost_data['config_dir'] = $config['nginx']['config_dir'];
|
|
$vhost_data['ssl_domain'] = $data['new']['ssl_domain'];
|
// Check if a SSL cert exists
|
$ssl_dir = $config['nginx']['config_dir'].'/ssl';
|
$domain = $data['new']['ssl_domain'];
|
$key_file = $ssl_dir.'/'.$domain.'.key';
|
$crt_file = $ssl_dir.'/'.$domain.'.crt';
|
$bundle_file = $ssl_dir.'/'.$domain.'.bundle';
|
|
$vhost_data['nginx_directives'] = preg_replace("/\[IP\]/", $vhost_data['ip_address'], $vhost_data['nginx_directives']);
|
|
|
if($data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file)) {
|
$vhost_data['ssl_enabled'] = 1;
|
$app->log('Enable SSL for: '.$domain,LOGLEVEL_DEBUG);
|
} else {
|
$vhost_data['ssl_enabled'] = 0;
|
$app->log('Disable SSL for: '.$domain,LOGLEVEL_DEBUG);
|
}
|
|
if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1;
|
|
|
$tpl->setVar($vhost_data);
|
|
|
|
// get alias domains (co-domains and subdomains)
|
$aliases = $app->dbmaster->queryAllRecords('SELECT * FROM web_domain WHERE parent_domain_id = '.$data['new']['domain_id']." AND active = 'y'");
|
$server_alias = array();
|
switch($data['new']['subdomain']) {
|
case 'www':
|
$server_alias[] .= 'www.'.$data['new']['domain'].' ';
|
break;
|
case '*':
|
$server_alias[] .= '*.'.$data['new']['domain'].' ';
|
break;
|
}
|
if(is_array($aliases)) {
|
foreach($aliases as $alias) {
|
switch($alias['subdomain']) {
|
case 'www':
|
$server_alias[] .= 'www.'.$alias['domain'].' '.$alias['domain'].' ';
|
break;
|
case '*':
|
$server_alias[] .= '*.'.$alias['domain'].' '.$alias['domain'].' ';
|
break;
|
default:
|
$server_alias[] .= $alias['domain'].' ';
|
break;
|
}
|
$app->log('Add server alias: '.$alias['domain'],LOGLEVEL_DEBUG);
|
|
}
|
}
|
|
//* If we have some alias records
|
if(count($server_alias) > 0) {
|
$server_alias_str = '';
|
$n = 0;
|
|
// begin a new ServerAlias line after 30 alias domains
|
foreach($server_alias as $tmp_alias) {
|
if($n % 30 == 0) $server_alias_str .= " ";
|
$server_alias_str .= $tmp_alias;
|
}
|
unset($tmp_alias);
|
|
$tpl->setVar('alias',trim($server_alias_str));
|
} else {
|
$tpl->setVar('alias','');
|
}
|
|
|
$vhost_file = escapeshellcmd($nginx_config['vhost_conf_dir'].'/'.$data['new']['domain'].'.vhost');
|
//* Make a backup copy of vhost file
|
copy($vhost_file,$vhost_file.'~');
|
|
//* Write vhost file
|
file_put_contents($vhost_file,$tpl->grab());
|
$app->log('Writing the vhost file: '.$vhost_file,LOGLEVEL_DEBUG);
|
unset($tpl);
|
|
|
// Set the symlink to enable the vhost
|
$vhost_symlink = escapeshellcmd($nginx_config['vhost_conf_enabled_dir'].'/'.$data['new']['domain'].'.vhost');
|
if($data['new']['active'] == 'y' && !is_link($vhost_symlink)) {
|
symlink($vhost_file,$vhost_symlink);
|
$app->log('Creating symlink: '.$vhost_symlink.'->'.$vhost_file,LOGLEVEL_DEBUG);
|
}
|
|
// Remove the symlink, if site is inactive
|
if($data['new']['active'] == 'n' && is_link($vhost_symlink)) {
|
unlink($vhost_symlink);
|
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file,LOGLEVEL_DEBUG);
|
}
|
|
if(!is_dir('/var/log/ispconfig/nginx/'.$data['new']['domain'])) exec('mkdir -p /var/log/ispconfig/nginx/'.$data['new']['domain']);
|
|
// remove old symlink and vhost file, if domain name of the site has changed
|
if($this->action == 'update' && $data['old']['domain'] != '' && $data['new']['domain'] != $data['old']['domain']) {
|
$vhost_symlink = escapeshellcmd($nginx_config['vhost_conf_enabled_dir'].'/'.$data['old']['domain'].'.vhost');
|
unlink($vhost_symlink);
|
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file,LOGLEVEL_DEBUG);
|
$vhost_file = escapeshellcmd($nginx_config['vhost_conf_dir'].'/'.$data['old']['domain'].'.vhost');
|
unlink($vhost_file);
|
$app->log('Removing file: '.$vhost_file,LOGLEVEL_DEBUG);
|
|
if(is_dir('/var/log/ispconfig/nginx/'.$data['old']['domain'])) exec('rm -rf /var/log/ispconfig/nginx/'.$data['old']['domain']);
|
}
|
|
// request a httpd reload when all records have been processed
|
$app->services->restartServiceDelayed('nginx','restart');
|
|
// Remove the backup copy of the config file.
|
if(@is_file($vhost_file.'~')) unlink($vhost_file.'~');
|
|
|
//* Unset action to clean it for next processed vhost.
|
$this->action = '';
|
|
}
|
|
|
|
|
// Handle the creation of SSL certificates
|
function ssl($event_name,$data) {
|
global $app, $conf;
|
|
if(!is_dir($conf['nginx']['config_dir'].'/ssl')) exec('mkdir -p '.$conf['nginx']['config_dir'].'/ssl');
|
$ssl_dir = $conf['nginx']['config_dir'].'/ssl';
|
$domain = $data['new']['ssl_domain'];
|
$key_file = $ssl_dir.'/'.$domain.'.key.org';
|
$key_file2 = $ssl_dir.'/'.$domain.'.key';
|
$csr_file = $ssl_dir.'/'.$domain.'.csr';
|
$crt_file = $ssl_dir.'/'.$domain.'.crt';
|
|
|
//* Save a SSL certificate to disk
|
if($data["new"]["ssl_action"] == 'save') {
|
$web = $app->masterdb->queryOneRecord("select wd.document_root, sp.ip_address from web_domain wd INNER JOIN server_ip sp USING(server_id) WHERE domain = '".$data['new']['domain']."'");
|
|
$src_ssl_dir = $web["document_root"]."/ssl";
|
//$domain = $data["new"]["ssl_domain"];
|
//$csr_file = $ssl_dir.'/'.$domain.".csr";
|
//$crt_file = $ssl_dir.'/'.$domain.".crt";
|
//$bundle_file = $ssl_dir.'/'.$domain.".bundle";
|
$this->_exec('rsync -v -e ssh root@'.$web['ip_address'].':~/$src_ssl_dir '.$ssl_dir);
|
|
$app->log('Syncing SSL Cert for: '.$domain,LOGLEVEL_DEBUG);
|
}
|
|
//* Delete a SSL certificate
|
if($data['new']['ssl_action'] == 'del') {
|
//$ssl_dir = $data['new']['document_root'].'/ssl';
|
$domain = $data['new']['ssl_domain'];
|
$csr_file = $ssl_dir.'/'.$domain.'.csr';
|
$crt_file = $ssl_dir.'/'.$domain.'.crt';
|
$bundle_file = $ssl_dir.'/'.$domain.'.bundle';
|
unlink($csr_file);
|
unlink($crt_file);
|
unlink($bundle_file);
|
$app->log('Deleting SSL Cert for: '.$domain,LOGLEVEL_DEBUG);
|
}
|
|
|
}
|
|
|
function delete($event_name,$data) {
|
global $app, $conf;
|
|
// load the server configuration options
|
$app->uses('getconf');
|
$nginx_config = $app->getconf->get_server_config($conf['server_id'], 'nginx');
|
|
|
if($data['old']['type'] == 'vhost') {
|
|
//* This is a website
|
// Deleting the vhost file, symlink and the data directory
|
$vhost_symlink = escapeshellcmd($nginx_config['vhost_conf_enabled_dir'].'/'.$data['old']['domain'].'.vhost');
|
unlink($vhost_symlink);
|
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file,LOGLEVEL_DEBUG);
|
|
$vhost_file = escapeshellcmd($nginx_config['vhost_conf_dir'].'/'.$data['old']['domain'].'.vhost');
|
unlink($vhost_file);
|
$app->log('Removing vhost file: '.$vhost_file,LOGLEVEL_DEBUG);
|
|
|
|
// Delete the log file directory
|
$vhost_logfile_dir = escapeshellcmd('/var/log/ispconfig/nginx/'.$data['old']['domain']);
|
if($data['old']['domain'] != '' && !stristr($vhost_logfile_dir,'..')) exec('rm -rf '.$vhost_logfile_dir);
|
$app->log('Removing website logfile directory: '.$vhost_logfile_dir,LOGLEVEL_DEBUG);
|
|
}
|
}
|
|
//* Wrapper for exec function for easier debugging
|
private function _exec($command) {
|
global $app;
|
$app->log('exec: '.$command,LOGLEVEL_DEBUG);
|
exec($command);
|
}
|
|
function rewrite_insert($event_name,$data) {
|
global $app, $conf;
|
|
// just run the update function
|
$this->update($event_name,$data);
|
}
|
|
function rewrite_update($event_name,$data) {
|
global $app, $conf;
|
|
$rules = $this->_getRewriteRules($app);
|
|
$app->uses('getconf');
|
$nginx_config = $app->getconf->get_server_config($conf['server_id'], 'nginx');
|
|
$app->load('tpl');
|
$tpl = new tpl();
|
$tpl->newTemplate("nginx-rewrites.conf.master");
|
if (!empty($rules))$tpl->setLoop('nginx_rewrite_rules',$rules);
|
|
$rewrites_file = escapeshellcmd($nginx_config['vhost_conf_dir'].'/default.rewrites.conf');
|
//* Make a backup copy of vhost file
|
copy($rewrites_file,$rewrites_file.'~');
|
|
//* Write vhost file
|
file_put_contents($rewrites_file,$tpl->grab());
|
$app->log('Writing the nginx rewrites file: '.$rewrites_file,LOGLEVEL_DEBUG);
|
unset($tpl);
|
|
|
// Set the symlink to enable the vhost
|
$rewrite_symlink = escapeshellcmd($nginx_config['vhost_conf_enabled_dir'].'/default.rewrites.conf');
|
|
if(!is_link($rewrite_symlink)) {
|
symlink($rewrites_file,$rewrite_symlink);
|
$app->log('Creating symlink for nginx rewrites: '.$rewrite_symlink.'->'.$rewrites_file,LOGLEVEL_DEBUG);
|
}
|
}
|
|
function rewrite_delete($event_name,$data) {
|
global $app, $conf;
|
|
// just run the update function
|
$this->rewrite_update($event_name,$data);
|
}
|
|
|
function _getRewriteRules($app)
|
{
|
$rules = array();
|
$rules = $app->db->queryAllRecords("SELECT rewrite_url_src, rewrite_url_dst FROM proxy_reverse ORDER BY rewrite_id ASC");
|
return $rules;
|
}
|
|
} // end class
|
|
?>
|