getBootstrapDirectory(); foreach (self::$lessFiles as $file) { $less->addFile($basedir . '/' . $file); } $less->addLoadedModules(); $less->addFile($basedir . '/css/pdf/pdfprint.less'); return $less->compile(); } public static function sendMinified() { self::send(true); } protected static function fixModuleLayoutCss($css) { return preg_replace( '/(\.icinga-module\.module-[^\s]+) (#layout\.[^\s]+)/m', '\2 \1', $css ); } protected static function checkPhp() { // PHP had a rather conservative PCRE backtrack limit unless 5.3.7 if (version_compare(PHP_VERSION, '5.3.7') <= 0) { ini_set('pcre.backtrack_limit', 1000000); } } public static function send($minified = false) { self::checkPhp(); $app = Icinga::app(); $basedir = $app->getBootstrapDirectory(); foreach (self::$lessFiles as $file) { $lessFiles[] = $basedir . '/' . $file; } $files = $lessFiles; foreach ($app->getModuleManager()->getLoadedModules() as $name => $module) { if ($module->hasCss()) { $files[] = $module->getCssFilename(); } } if ($etag = FileCache::etagMatchesFiles($files)) { header("HTTP/1.1 304 Not Modified"); return; } else { $etag = FileCache::etagForFiles($files); } header('Cache-Control: public'); header('ETag: "' . $etag . '"'); header('Content-Type: text/css'); $min = $minified ? '.min' : ''; $cacheFile = 'icinga-' . $etag . $min . '.css'; $cache = FileCache::instance(); if ($cache->has($cacheFile)) { $cache->send($cacheFile); return; } $less = new LessCompiler(); foreach ($lessFiles as $file) { $less->addFile($file); } $less->addLoadedModules(); if ($minified) { $less->compress(); } $out = self::fixModuleLayoutCss($less->compile()); $cache->store($cacheFile, $out); echo $out; } }