shouldreload=false; } // launched for each FQDN for which we want a new vhost template function hook_updatedomains_web_add($subdomid) { global $msg,$db,$ssl,$L_FQDN; $db->query("SELECT sd.*, dt.only_dns, dt.has_https_option, m.login FROM domaines_type dt, sub_domaines sd LEFT JOIN membres m ON m.uid=sd.compte WHERE dt.name=sd.type AND sd.web_action!='OK' AND id=?;",array($subdomid)); $db->next_record(); $subdom=$db->Record; // security : only AlternC account's UIDs if ($subdom["compte"]<1999) { $msg->raise("ERROR","apache","Subdom ".$subdom["id"]." for domain ".$subdom["sub"].".".$subdom["domaine"]." has id ".$subdom["compte"].". Skipped"); return 1; } // search for the template file: $template = $this->templatedir."/".strtolower($subdom["type"]); if ($subdom["has_https_option"] && in_array($subdom["https"],$this->httpsmodes)) { $template.="-".$subdom["https"]; } $template.=".conf"; if (!is_file($template)) { $msg->raise("ERROR","apache","Template $template not found for subdom ".$subdom["id"]." for domain ".$subdom["sub"].".".$subdom["domaine"].". Skipped"); return 1; } $subdom["fqdn"]=$subdom["sub"].(($subdom["sub"])?".":"").$subdom["domaine"]; // SSL information $subdom["certificate_id"] may be ZERO => it means "take id 0 which is snakeoil cert" $cert = $ssl->get_certificate_path($subdom["certificate_id"]); if ($cert["chain"]) { $chainline="SSLCertificateChainFile ".$cert["chain"]; } else { $chainline=""; } // Replace needed vars in template file $tpl=file_get_contents($template); $tpl = strtr($tpl, array( "%%LOGIN%%" => $subdom['login'], "%%fqdn%%" => $subdom['fqdn'], "%%document_root%%" => getuserpath($subdom['login']) . $subdom['valeur'], "%%account_root%%" => getuserpath($subdom['login']), "%%redirect%%" => $subdom['valeur'], "%%UID%%" => $subdom['compte'], "%%GID%%" => $subdom['compte'], "%%mail_account%%" => $subdom['login']."@".$L_FQDN, "%%user%%" => "FIXME", "%%CRT%%" => $cert["cert"], "%%KEY%%" => $cert["key"], "%%CHAINLINE%%" => $chainline, )); // and write the template $confdir = $this->vhostroot."/".substr($subdom["compte"],-1)."/".$subdom["compte"]; @mkdir($confdir,0755,true); file_put_contents($confdir."/".$subdom["fqdn"].".conf",$tpl); $this->shouldreload=true; return 0; // shell meaning => OK ;) } // hook_updatedomains_web_add // ------------------------------------------------------------ /** * launched for each FQDN for which we want to delete a vhost template */ function hook_updatedomains_web_del($subdomid) { global $db,$msg; $db->query("SELECT sd.*, dt.only_dns, dt.has_https_option, m.login FROM domaines_type dt, sub_domaines sd LEFT JOIN membres m ON m.uid=sd.compte WHERE dt.name=sd.type AND sd.web_action!='OK' AND id=?;",array($subdomid)); $db->next_record(); $subdom=$db->Record; $confdir = $this->vhostroot."/".substr($subdom["compte"],-1)."/".$subdom["compte"]; $deleteme= $subdom["sub"].(($subdom["sub"])?".":"").$subdom["domaine"].".conf"; @unlink($confdir."/".$deleteme); $this->shouldreload=true; } // ------------------------------------------------------------ /** * launched at the very end of updatedomains */ function hook_updatedomains_web_post() { global $msg; if ($this->shouldreload) { // concatenate all files into one $this->concat(); // reload apache $ret=0; exec("apache2ctl graceful 2>&1",$out,$ret); touch($this->reloadfile); if ($ret!=0) { $msg->raise("ERROR","apache","Error while reloading apache, error code is $ret\n".implode("\n",$out)); } else { $msg->raise("INFO","apache","Apache reloaded"); } } } // ------------------------------------------------------------ /** * Concatenate all files under $this->vhostroot * into one (mindepth=2 though), * this function is faster than any shell stuff :D */ private function concat() { global $msg; $d=opendir($this->vhostroot); $f=fopen($this->vhostroot."/vhosts_all.conf.new","wb"); if (!$f) { $msg->raise("FATAL","apache","Can't write vhosts_all file"); return false; } while (($c=readdir($d))!==false) { if (substr($c,0,1)!="." && is_dir($this->vhostroot."/".$c)) { $this->subconcat($f,$this->vhostroot."/".$c); } } closedir($d); fclose($f); rename($this->vhostroot."/vhosts_all.conf.new", $this->vhostroot."/vhosts_all.conf"); } private function subconcat($f,$root) { // recursive cat :) $d=opendir($root); while (($c=readdir($d))!==false) { if (substr($c,0,1)!=".") { if (is_dir($root."/".$c)) { $this->subconcat($f,$root."/".$c); // RECURSIVE CALL } if (is_file($root."/".$c)) { fputs($f,file_get_contents($root."/".$c)."\n"); } } } closedir($d); } } // m_apache