diff options
Diffstat (limited to 'config')
-rw-r--r-- | config/varnish3/varnish.inc | 757 | ||||
-rwxr-xr-x | config/varnish3/varnish.widget.php | 126 | ||||
-rw-r--r-- | config/varnish3/varnish_backends.xml | 286 | ||||
-rw-r--r-- | config/varnish3/varnish_custom_vcl.xml | 142 | ||||
-rw-r--r-- | config/varnish3/varnish_lb_directors.xml | 258 | ||||
-rw-r--r-- | config/varnish3/varnish_settings.xml | 290 | ||||
-rw-r--r-- | config/varnish3/varnish_sync.xml | 120 | ||||
-rw-r--r-- | config/varnish3/varnish_view_config.php | 89 | ||||
-rw-r--r-- | config/varnish3/varnishstat.php | 111 |
9 files changed, 2179 insertions, 0 deletions
diff --git a/config/varnish3/varnish.inc b/config/varnish3/varnish.inc new file mode 100644 index 00000000..91d09413 --- /dev/null +++ b/config/varnish3/varnish.inc @@ -0,0 +1,757 @@ +<?php +/* ========================================================================== */ +/* + varnish.inc + part of pfSense (http://www.pfSense.com) + Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com> + Copyright (C) 2011 Marcello Coutinho + All rights reserved. + */ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + +function varnish_settings_post_validate($post, $input_errors) { + if($post['storagesize'] && !is_numeric($post['storagesize'])) + $input_errors[] = "A valid number is required for the field 'Storage size'"; + if($post['listeningport'] && !is_numeric($post['listeningport'])) + $input_errors[] = "A valid number is required for the field 'Listening port'"; + if($post['minworkers'] && !is_numeric($post['minworkers'])) + $input_errors[] = "A valid number is required for the field 'Minimum worker threads'"; + if($post['maxworkers'] && !is_numeric($post['maxworkers'])) + $input_errors[] = "A valid number is required for the field 'Maximum worker threads'"; + if($post['timeoutworkers'] && !is_numeric($post['timeoutworkers'])) + $input_errors[] = "A valid number is required for the field 'Worker thread timeout'"; + if($post['managment']){ + $mgm= explode(":",$post['managment']); + if(!is_ipaddr($mgm[0]) || !is_numeric($mgm[1])) + $input_errors[] = "A valid ip:port is required for the field 'managment'"; + } + if($post['grace'] && ! preg_match("/^\d+(h|m|s)$/",$post['grace'])) + $input_errors[] = "A valid number with a time reference is required for the field 'Fetch grace'"; + if($post['saint'] && ! preg_match("/^\d+(h|m|s)$/",$post['saint'])) + $input_errors[] = "A valid number with a time reference is required for the field 'Saint mode'"; + +} + +function varnish_lb_directors_post_validate($post, $input_errors) { + if (preg_match("/[^a-zA-Z0-9]/", $post['directorname'])) + $input_errors[] = "The directorname name must only contain the characters a-Z or 0-9"; + if(stristr($post['directorurl'], 'http')) + $input_errors[] = "You do not need to include the http:// string in the director URL"; + if($post['grace'] && ! preg_match("/^\d+(h|m|s)$/",$post['grace'])) + $input_errors[] = "A valid number with a time reference is required for the field 'Req grace'"; +} + +function varnish_backends_post_validate($post, $input_errors) { + if (!$post['backendname'] || preg_match("/[^a-zA-Z0-9]/", $post['backendname'])) + $input_errors[] = "The backend name must only contain the characters a-Z or 0-9"; + if(!is_ipaddr($post['ipaddress'])) + $input_errors[] = "A valid IP address is required for the field 'IPAddress'"; + if($post['first_byte_timeout'] && !is_numeric($post['first_byte_timeout'])) + $input_errors[] = "A valid number is required for the field 'first byte timeout'"; + if($post['connect_timeout'] && !is_numeric($post['connect_timeout'])) + $input_errors[] = "A valid number is required for the field 'connect timeout'"; + if($post['probe_interval'] && !is_numeric($post['probe_interval'])) + $input_errors[] = "A valid number is required for the field 'probe interval'"; + if($post['probe_interval'] && !is_numeric($post['probe_interval'])) + $input_errors[] = "A valid number is required for the field 'probe interval'"; + if($post['probe_timeout'] && !is_numeric($post['probe_timeout'])) + $input_errors[] = "A valid number is required for the field 'probe timeout'"; + if($post['probe_window'] && !is_numeric($post['probe_window'])) + $input_errors[] = "A valid number is required for the field 'probe window'"; + if($post['probe_threshold'] && !is_numeric($post['probe_threshold'])) + $input_errors[] = "A valid number is required for the field 'probe threshold'"; + $x=0; + while ($post['maptype'.$x] != ""){ + if($post['grace'.$x] && ! preg_match("/^\d+(h|m|s)$/",$post['grace'.$x])){ + $input_errors[] = "A valid number with a time reference is required for the field 'grace' in map ".($x +1); + } + $x++; + +} + +} + +function varnish_install() { + create_varnish_rcd_file(); +} + +function varnish_deinstall() { + create_varnish_rcd_file(); +} + +function text_area_decode($text){ + return preg_replace('/\r\n/', "\n",base64_decode($text)); +} +function varnish_start() { + global $g, $config; + if ($config['installedpackages']['varnishsettings']['config'][0]['enablevarnish']){ + exec("chmod +x /usr/local/etc/rc.d/varnish.sh"); + mwexec("/usr/local/etc/rc.d/varnish.sh");} + else{ + exec("chmod -x /usr/local/etc/rc.d/varnish.sh"); + mwexec("/usr/bin/killall varnishd");} +} + +/* Build the URL mappings logic VCL config txt */ +function varnish_get_url_mappings_txt() { + global $g, $config, $urlmappings,$backends_in_use; + $catch_all= "unset"; + $isfirst = true; + if($config['installedpackages']['varnishlbdirectors']['config'] != "") { + foreach($config['installedpackages']['varnishlbdirectors']['config'] as $url) { + #check options + $directo_grace_time=""; + if ($url['customapping']) + $directo_grace_time.=text_area_decode($url['customapping'])."\n\t\t"; + if($url['grace']) + $directo_grace_time.=($url['grace']=="0s"?"return(pass);":"set req.grace=".$url['grace'].";"); + $fieldtype = ($url['fieldtype']?$url['fieldtype']:"=="); + $req=($url['directorurl2']?"url":"http.host"); + $director_prefix=($url['directorurl'] && $url['directorurl2']?"^http://":""); + #check url + if ( $url['directorurl'] || $url['directorurl2'] || $catch_all == "unset" ){ + if ( $url['directorurl']== "" && $url['directorurl2']== "" ){ + #director with no host or url, so director for catch all traffic not specified in config + $lasturlmappings = "\telse\t{\n\t\tset req.backend = ".$url['directorname'].";\n\t\t}\n"; + $catch_all = "set"; + $isfirst = false; + } + else{ + if(!$isfirst) + $urlmappings .= "\telse "; + $urlmappings .= "if (req.$req $fieldtype ".'"'.$url['directorurl'].$url['directorurl2'].'") {'."\n"; + #check failover + $urlbackend = "\t\t\tset req.backend = ".$url['directorname'].";"; + if ($url['failover'] && $url['failover'] != $url['directorname']){ + $tabs=($url['grace']?"\n\t\t\t":""); + $urlfailover = "\t\t\tset req.backend = ".$url['failover'].";"; + $urlmappings .= "\t\tif (req.restarts == 0) {\n".$urlbackend.$tabs.$directo_grace_time.$tabs."}"; + $urlmappings .= "\n\t\telse\t{\n".$urlfailover.$tabs.$directo_grace_time.$tabs."}\n\t\t}\n"; + $isfirst = false; + } + else{ + $tabs=($url['grace']?"\n\t\t":""); + $urlmappings .= $urlbackend.$tabs.$directo_grace_time."\n\t\t}\n"; + $isfirst = false; + } + } + } + } + } + if($config['installedpackages']['varnishbackends']['config']) + foreach($config['installedpackages']['varnishbackends']['config'] as $urlmapping) { + if($urlmapping['row']) + foreach($urlmapping['row'] as $url) { + $directo_grace_time=""; + if($url['grace']) + $directo_grace_time=($url['grace']=="0s"?"\n\t\t return(pass);":"\n\t\tset req.grace=".$url['grace'].";"); + $req=($url['maptype']?$url['maptype']:"http.host"); + $fieldtype=($url['fieldtype']?$url['fieldtype']:"=="); + if ($url['urlmapping'] != "" || $catch_all == 'unset'){ + if($url['urlmapping'] == ""){ + $catch_all = "set"; + $lasturlmappings = "\telse\t{\n\t\tset req.backend = ".$urlmapping['backendname']."BACKEND;\n\t\t}\n"; + } + else{ + if(!$isfirst) + $urlmappings .= "\telse "; + $urlmappings .= <<<EOAU +if (req.{$req} {$fieldtype} "{$url['urlmapping']}") { + set req.backend = {$urlmapping['backendname']}BACKEND;{$directo_grace_time} + } + +EOAU; + } + $backends_in_use[$urlmapping['backendname']].=($url['directorurl'] == ""?"catch_all ":"url_map "); + $isfirst = false; + } + } + } + + return $urlmappings.$lasturlmappings; +} + +function create_varnish_rcd_file() { + global $config, $g; + if($config['installedpackages']['varnishsettings']['config'] != "") { + foreach($config['installedpackages']['varnishsettings']['config'] as $vs) { + if($vs['storagetype'] == "malloc") + $storage_type = "-s malloc,{$vs['storagesize']}MB"; + else + $storage_type = "-s file,/var/varnish/storage.bin,{$vs['storagesize']}MB"; + if($vs['listeningport']) + $listeningport = "-a :{$vs['listeningport']}"; + else + $listeningport = "-a :80"; + if($vs['managment']) + $advancedstartup = "-T {$vs['managment']} "; + else + $advancedstartup = ""; + if($vs['advancedstartup']) + $advancedstartup .= text_area_decode($vs['advancedstartup'])."\n"; + if($vs['minworkers']) + $minworkers = "{$vs['minworkers']}"; + else + $minworkers = "200"; + if($vs['maxworkers']) + $maxworkers = "{$vs['maxworkers']}"; + else + $maxworkers = "4000"; + if($vs['timeoutworkers']) + $timeoutworkers = "{$vs['timeoutworkers']}"; + else + $timeoutworkers = "50"; + } + } + $fd = fopen("/usr/local/etc/rc.d/varnish.sh", "w"); + $rc_file = <<<EOF +#!/bin/sh +mkdir -p /var/varnish +rm /var/varnish/storage.bin 2>/dev/null +killall varnishd 2>/dev/null +sleep 1 +sysctl kern.ipc.nmbclusters=65536 +sysctl kern.ipc.somaxconn=16384 +sysctl kern.maxfiles=131072 +sysctl kern.maxfilesperproc=104856 +sysctl kern.threads.max_threads_per_proc=4096 +/usr/bin/env \ +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ +/usr/local/bin/php -q -d auto_prepend_file=config.inc <<ENDOFF +<?php + require_once("globals.inc"); + require_once("functions.inc"); + require_once("pkg-utils.inc"); + require_once("varnish.inc"); + sync_package_varnish(); + #varnish_start(); + +?> +ENDOFF + +/usr/local/sbin/varnishd \ + {$listeningport} \ + -f /var/etc/default.vcl \ + {$storage_type} \ + -w {$minworkers},{$maxworkers},{$timeoutworkers} \ + {$advancedstartup} + +EOF; + + fwrite($fd, $rc_file); + fclose($fd); + exec("chmod a+rx /usr/local/etc/rc.d/varnish.sh"); +} + +function get_backend_config_txt() { + global $config, $g, $backends_in_use; + $backends=""; + if($config['installedpackages']['varnishbackends']['config'] != "") { + foreach($config['installedpackages']['varnishbackends']['config'] as $backend) { + if($backend['connect_timeout']) + $connect_timeout = $backend['connect_timeout'] . "s"; + else + $connect_timeout = "25s"; + if($backend['port']) + $connect_port = $backend['port']; + else + $connect_port = "80"; + if($backend['first_byte_timeout']) + $first_byte_timeout = $backend['first_byte_timeout'] . "s"; + else + $first_byte_timeout = "300s"; + if($backend['probe_url']) + if (preg_match("@^(http)://([a-zA-Z0-9.-]*)/(.*)$@",$backend['probe_url'],$matches)){ + $probe_url=".request =\n"; + $probe_url.="\t\t\t".'"GET /'.$matches[3].' HTTP/1.1"'."\n"; + $probe_url.="\t\t\t".'"Accept: text/*"'."\n"; + $probe_url.="\t\t\t".'"User-Agent: Varnish"'."\n"; + $probe_url.="\t\t\t".'"Host: '.$matches[2].'"'."\n"; + $probe_url.="\t\t\t".'"Connection: Close";'; + } + else{ + $probe_url = '.url = "'.$backend['probe_url'].'";'; + } + else + $probe_url ='.url = "/";'; + if($backend['probe_interval']) + $probe_interval = $backend['probe_interval'] . "s"; + else + $probe_interval = "1s"; + if($backend['probe_timeout']) + $probe_timeout = $backend['probe_timeout'] . "s"; + else + $probe_timeout = "1s"; + if($backend['probe_window']) + $probe_window = $backend['probe_window']; + else + $probe_window = "5"; + if($backend['probe_threshold']) + $probe_threshold = $backend['probe_threshold']; + else + $probe_threshold = "5"; + if (isset($probe_threshold)){ + #last parameter set ,so write conf if backend is in use + if ($backends_in_use[$backend['backendname']] != ""){ + $backends .= <<<EOFA + +backend {$backend['backendname']}BACKEND { + # used in {$backends_in_use[$backend['backendname']]} + .host = "{$backend['ipaddress']}"; + .port = "{$backend['port']}"; + .first_byte_timeout = {$first_byte_timeout}; + .connect_timeout = {$connect_timeout}; + .probe = { + {$probe_url} + .interval = {$probe_interval}; + .timeout = {$probe_timeout}; + .window = {$probe_window}; + .threshold = {$probe_threshold}; + } +} + + +EOFA; + } + else { + $backends .= "\n".'# backend '.$backend['backendname']." not in use.\n"; + } + } + } + } + return $backends; +} + +function get_lb_directors_config_txt() { + global $config, $g, $backends_in_use; + $backends=""; + if($config['installedpackages']['varnishlbdirectors']['config'] != "") { + foreach($config['installedpackages']['varnishlbdirectors']['config'] as $backend) { + $director = ""; + if($backend['directortype'] == "round-robin" ){$weight=" ";} + if($backend['row']){ + foreach($backend['row'] as $be) { + if($be['weight'] && $weight != " ") + $weight = "\t\t.weight = {$be['weight']};\n"; + elseif($weight != " ") + $weight = "\t\t.weight = 100;\n"; + + $director .= "\t{\n\t\t.backend = {$be['backendname']}BACKEND;\n{$weight}\t}"; + $backends_in_use[$be['backendname']].= $backend['directorname']." "; + } + $backends .= <<<EOFA +director {$backend['directorname']} {$backend['directortype']} { +{$director} +} + + +EOFA; + + } + } + } + return $backends; +} + +function sync_package_varnish() { + global $config, $g; + if($config['installedpackages']['varnishcustomvcl']['config'] != "") { + foreach($config['installedpackages']['varnishcustomvcl']['config'] as $vcl) { + if($vcl['vcl_recv_early']) + $vcl_recv_early = text_area_decode($vcl['vcl_recv_early']); + if($vcl['vcl_recv_late']) + $vcl_recv_late = text_area_decode($vcl['vcl_recv_late']); + if($vcl['vcl_fetch_early']) + $vcl_fetch_early = text_area_decode($vcl['vcl_fetch_early']); + if($vcl['vcl_fetch_late']) + $vcl_fetch_late = text_area_decode($vcl['vcl_fetch_late']); + if($vcl['vcl_pipe_early']) + $vcl_pipe_early = text_area_decode($vcl['vcl_pipe_early']); + if($vcl['vcl_pipe_late']) + $vcl_pipe_late = text_area_decode($vcl['vcl_pipe_late']); + } + } + $vcl_recv_set_basic='#BASIC VCL RULES SETTING'."\n"; + $vcl_recv_action_basic='#BASIC VCL RULES ACTIONS'."\n"; + #$plataform=posix_uname(); + foreach($config['installedpackages']['varnishsettings']['config'] as $vcl) { + if($vcl['streaming']){ + $vcl_fetch_stream="set beresp.do_stream = true;\n"; + } + if($vcl['fixgzip']){ + $vcl_recv_set_basic.="\t#Fix gzip compression\n"; + $vcl_recv_set_basic.="\t".'if (req.http.Accept-Encoding) {'."\n"; + $vcl_recv_set_basic.="\t".'if (req.url ~ "\.(gif|jpg|jpeg|bmp|png|ico|img|tga|wmf|gz|tgz|bz2|tbz|mp3|ogg)$") {'."\n\t\tunset req.http.Accept-Encoding;\n\t\t}\n"; + $vcl_recv_set_basic.="\t".'else if (req.http.Accept-Encoding ~ "gzip") {'."\n\t\tset req.http.Accept-Encoding = ".'"gzip"'.";\n\t\t}\n"; + $vcl_recv_set_basic.="\t".'else if (req.http.Accept-Encoding ~ "deflate") {'."\n\t\tset req.http.Accept-Encoding = ".'"deflate"'.";\n\t\t}\n"; + $vcl_recv_set_basic.="\telse\t{\n\t\tunset req.http.Accept-Encoding;\n\t\t}\n\t}\n"; + } + #if($vcl['clientbalance'] && $plataform['machine'] == 'amd64'){ + $vcl_recv_set_basic.="\t#set client balance identity\n"; + switch ($vcl['clientbalance']){ + case 'url': + $vcl_recv_set_basic.="\t".'set client.identity = req.url;'."\n\n"; + break; + case 'ip': + $vcl_recv_set_basic.="\t".'set client.identity = client.ip;'."\n\n"; + break; + case 'agent': + $vcl_recv_set_basic.="\t".'set client.identity = req.http.user-agent;'."\n\n"; + break; + } + #} + if($vcl['grace'] ){ + $vcl_grace_time="set beresp.grace = ".$vcl['grace'].";\n\t\t"; + } + if($vcl['saint'] ){ + $vcl_saint_mode="set beresp.saintmode = ".$vcl['saint'].";\n\t\t"; + } + if($vcl['xforward']){ + $vcl_recv_set_basic.="\t#set X-forward\n"; + switch ($vcl['xforward']){ + case 'set': + $vcl_recv_set_basic.="\t".'set req.http.X-Forwarded-For = client.ip;'."\n\n"; + break; + case 'append': + $vcl_recv_set_basic.="\t".'set req.http.X-Forwarded-For = req.http.X-Forwarded-For "," client.ip;'."\n\n"; + break; + case 'create': + $vcl_recv_set_basic.="\t".'set req.http.X-Forwarded-Varnish = client.ip;'."\n\n"; + break; + case 'unset': + $vcl_recv_set_basic.="\t".'unset req.http.X-Forwarded-For;'."\n\n"; + break; + } + } + if($vcl['postcache']){ + $vcl_recv_action_basic.="\t#Disable post cache\n"; + $vcl_recv_action_basic.="\t".'if (req.request == "POST") {'."\n\t\treturn(pass);\n\t\t}\n"; + } + + $vcl_fetch_session ="#Disable cache when backend is starting a session\n"; + $vcl_fetch_session.="\t".'if (beresp.http.Set-Cookie && beresp.http.Set-Cookie ~ "(PHPSESSID|phpsessid)") {'."\n\t\treturn(hit_for_pass);\n\t\t}\n"; + $vcl_fetch_session.="\t".'if (beresp.http.Set-Cookie && beresp.http.Set-Cookie ~ "(JSESSION|jsession)") {'."\n\t\treturn(hit_for_pass);\n\t\t}\n"; + + if($vcl['sessioncache']== "never"){ + $vcl_recv_session ="\t#Disable session cache\n"; + $vcl_recv_session.="\t".'if (req.http.Cookie && req.http.Cookie ~ "(PHPSESSID|phpsessid)") {'."\n\t\treturn(pass);\n\t\t}\n"; + $vcl_recv_session.="\t".'if (req.http.Cookie && req.http.Cookie ~ "(JSESSION|jsession)") {'."\n\t\treturn(pass);\n\t\t}\n"; + $vcl_recv_session.="\t".'if (req.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache") {'."\n\t\treturn(pass);\n\t\t}\n"; + $vcl_fetch_session.="\t".'if (beresp.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache") {'."\n\t\treturn(hit_for_pass);\n\t\t}\n"; + $vcl_recv_static_prefix=($vcl['staticache']=="no"?"":"\n\t\tunset req.http.cookie;"); + } + else + { + $vcl_hash = "#Enable Per user session cache.\n"; + $vcl_hash.= "sub vcl_hash {\n\thash_data(req.http.cookie);\n}\n"; + } + #set static content var + $vcl_recv_static_sufix=($vcl['staticache']=='no'?"pass":"lookup"); + $vcl_recv_static ="\t#Enable static cache\n"; + $vcl_recv_static.="\t".'if (req.request=="GET" && req.url ~ "\.(css|js|txt|zip|pdf|rtf|flv|swf|html|htm)$") {'.$vcl_recv_static_prefix."\n\t\treturn($vcl_recv_static_sufix);\n\t\t}\n"; + $vcl_recv_static.="\t".'if (req.request=="GET" && req.url ~ "\.(gif|jpg|jpeg|bmp|png|ico|img|tga|wmf|mp3|ogg)$") {'.$vcl_recv_static_prefix."\n\t\treturn($vcl_recv_static_sufix);\n\t\t}\n"; + $vcl_fetch_static ="#Enable static cache\n"; + $vcl_fetch_static.='if (req.url ~ "\.(css|js|txt|zip|pdf|rtf|flv|swf|html|htm)$") {'."\n\tunset beresp.http.set-cookie;\n\t}\n"; + $vcl_fetch_static.='if (req.url ~ "\.(gif|jpg|jpeg|bmp|png|ico|img|tga|wmf|mp3|ogg)$") {'."\n\tunset beresp.http.set-cookie;\n\t}\n"; + + switch ($vcl['staticache']){ + case "all": + # cache all static content, unseting cookie when present + $vcl_recv_action_basic.=($vcl['sessioncache']=="never"?$vcl_recv_static.$vcl_recv_session:$vcl_recv_static); + $vcl_fetch_action=($vcl['sessioncache']=="never"?$vcl_fetch_static.$vcl_fetch_session:$vcl_fetch_static); + break; + case "yes": + # cache only object without cookie set + $vcl_recv_action_basic.=($vcl['sessioncache']=="never"?$vcl_recv_session.$vcl_recv_static:$vcl_recv_static); + $vcl_fetch_action=$vcl_fetch_session; + break; + default: + # no static cache at all + $vcl_recv_action_basic.=$vcl_recv_static.$vcl_recv_session; + $vcl_fetch_action=$vcl_fetch_session; + } + + if($vcl['rfc2616']){ + $vcl_recv_action_basic.="\t#Be rfc2616 compliant\n"; + $vcl_recv_action_basic.="\t".'if (req.request ~ "^(GET|HEAD|PUT|POST|TRACE|OPTIONS|DELETE)$") {'."\n\t\treturn(lookup);\n\t\t}\n\telse\t{\n\t\treturn(pipe);\n\t\t}\n"; + #$vcl_recv_action_basic.="\t".'if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && reqa.request != "POST" &&'."\n"; + #$vcl_recv_action_basic.="\t".' req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") {return(pipe);}'."\n\n"; + } + else { + $vcl_recv_action_basic.="\t".'if (req.request != "GET" && req.request != "HEAD") {return(pipe);}'."\n"; + } + if($vcl['restarts']){ + $vcl_restarts=$vcl['restarts']; + } + if($vcl['htmlerror']){ + $errorvcl=text_area_decode($vcl['htmlerror']); + } + } + + if(!$errorvcl) + $errorvcl = <<<EOF +<html> +<head> +<title>"} + obj.status + " " + obj.response + {"</title> +</head> +<body> +<h1>Error "} + obj.status + " " + obj.response + {"</h1> +<p>"} + obj.response + {"</p> +<h3>Guru Meditation:</h3> +<p>XID: "} + req.xid + {"</p> +<hr> +<p>Varnish cache server</p> +</body> +138 </html> +EOF; + +/* Grab configuration txt blocks */ +/* Please keep this sequence to determine witch backends are in use */ +$backends_in_use=array(); +$lb_config= get_lb_directors_config_txt(); +$urlmappings = varnish_get_url_mappings_txt(); +$backends = get_backend_config_txt() . $lb_config ; +#$backends .= get_lb_directors_config_txt(); + + +/* Start to build varnish default.vcl configurationf file */ +$varnish_config_file = <<<EOF +# Varnish configuration file +# Automatically generated by the pfSense package system + +# This file is located in /var/etc/default.vcl + +sub vcl_error { + if (obj.status == 503 && req.restarts < {$vcl_restarts}) { + return(restart); + } + + set obj.http.Content-Type = "text/html; charset=utf-8"; + synthetic {"<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +{$errorvcl}"}; + return(deliver); + +} + +{$backends} +{$vcl_hash} +sub vcl_recv { + {$vcl_recv_early} + {$vcl_recv_set_basic} + {$urlmappings} + {$vcl_recv_late} + #respect client wish to refresh the page + if (req.http.Pragma ~ "no-cache") + { + return(pass); + } + + {$vcl_recv_action_basic} + return(lookup); +} + +sub vcl_pipe { + {$vcl_pipe_early} + # If we don't set the Connection: close header, any following + # requests from the client will also be piped through and + # left untouched by varnish. We don't want that. + set req.http.connection = "close"; + # Note: no "pipe" action here - we'll fall back to the default + # pipe method so that when any changes are made there, we + # still inherit them. + {$vcl_pipe_late} +} +sub vcl_hit { + return (deliver); +} + +sub vcl_miss { + return (fetch); +} + +sub vcl_fetch { + {$vcl_fetch_stream}{$vcl_fetch_early} + {$vcl_fetch_action} + # Varnish respects the wishes of the backend application. + if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "(no-cache|no-store|private)") { + return(hit_for_pass); + } + ## If the request to the backend returns a code other than 200, restart the loop + ## If the number of restarts reaches the value of the parameter max_restarts, + ## the request will be error'ed. max_restarts defaults to 4. This prevents + ## an eternal loop in the event that, e.g., the object does not exist at all. + if (beresp.status != 200 && beresp.status != 403 && beresp.status != 404 && + beresp.status != 303 && beresp.status != 302 && beresp.status != 301 && beresp.status != 401 ) { + {$vcl_saint_mode}return(restart); + } + + + {$vcl_fetch_late} + {$vcl_grace_time}return(deliver); +} + +sub vcl_deliver { + ##set resp.http.X-Served-By = server.hostname; + if (obj.hits > 0) { + set resp.http.X-Cache = "HIT"; + set resp.http.X-Cache-Hits = obj.hits; + } else { + set resp.http.X-Cache = "MISS"; + } + return(deliver); +} + +sub vcl_init { + return (ok); +} + +sub vcl_fini { + return (ok); +} + +EOF; + + $fd = fopen("/var/etc/default.vcl", "w"); + fwrite($fd, $varnish_config_file); + fclose($fd); + + varnish_sync_on_changes(); +} + +/* Uses XMLRPC to synchronize the changes to a remote node */ +function varnish_sync_on_changes() { + global $config, $g; + log_error("[varnish] varnish_xmlrpc_sync.php is starting."); + $synconchanges = $config['installedpackages']['varnishsync']['config'][0]['synconchanges']; + if(!$synconchanges) + return; + foreach ($config['installedpackages']['varnishsync']['config'] as $rs ){ + foreach($rs['row'] as $sh){ + $sync_to_ip = $sh['ipaddress']; + $password = $sh['password']; + if($password && $sync_to_ip) + varnish_do_xmlrpc_sync($sync_to_ip, $password); + } + } + log_error("[varnish] varnish_xmlrpc_sync.php is ending."); +} +/* Do the actual XMLRPC sync */ +function varnish_do_xmlrpc_sync($sync_to_ip, $password) { + global $config, $g; + + if(!$password) + return; + + if(!$sync_to_ip) + return; + + $xmlrpc_sync_neighbor = $sync_to_ip; + if($config['system']['webgui']['protocol'] != "") { + $synchronizetoip = $config['system']['webgui']['protocol']; + $synchronizetoip .= "://"; + } + $port = $config['system']['webgui']['port']; + /* if port is empty lets rely on the protocol selection */ + if($port == "") { + if($config['system']['webgui']['protocol'] == "http") + $port = "80"; + else + $port = "443"; + } + $synchronizetoip .= $sync_to_ip; + + /* xml will hold the sections to sync */ + $xml = array(); + $xml['varnishcustomvcl'] = $config['installedpackages']['varnishcustomvcl']; + $xml['varnishbackends'] = $config['installedpackages']['varnishbackends']; + $xml['varnishlbdirectors'] = $config['installedpackages']['varnishlbdirectors']; + $xml['varnishsettings'] = $config['installedpackages']['varnishsettings']; + + /* assemble xmlrpc payload */ + $params = array( + XML_RPC_encode($password), + XML_RPC_encode($xml) + ); + + /* set a few variables needed for sync code borrowed from filter.inc */ + $url = $synchronizetoip; + log_error("Beginning Varnish XMLRPC sync to {$url}:{$port}."); + $method = 'pfsense.merge_installedpackages_section_xmlrpc'; + $msg = new XML_RPC_Message($method, $params); + $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port); + $cli->setCredentials('admin', $password); + if($g['debug']) + $cli->setDebug(1); + /* send our XMLRPC message and timeout after 250 seconds */ + $resp = $cli->send($msg, "250"); + if(!$resp) { + $error = "A communications error occurred while attempting varnish XMLRPC sync with {$url}:{$port}."; + log_error($error); + file_notice("sync_settings", $error, "varnish Settings Sync", ""); + } elseif($resp->faultCode()) { + $cli->setDebug(1); + $resp = $cli->send($msg, "250"); + $error = "An error code was received while attempting varnish XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); + log_error($error); + file_notice("sync_settings", $error, "varnish Settings Sync", ""); + } else { + log_error("varnish XMLRPC sync successfully completed with {$url}:{$port}."); + } + + /* tell varnish to reload our settings on the destionation sync host. */ + $method = 'pfsense.exec_php'; + $execcmd = "require_once('/usr/local/pkg/varnish.inc');\n"; + $execcmd .= "sync_package_varnish();\nvarnish_start();"; + /* assemble xmlrpc payload */ + $params = array( + XML_RPC_encode($password), + XML_RPC_encode($execcmd) + ); + + log_error("varnish XMLRPC reload data {$url}:{$port}."); + $msg = new XML_RPC_Message($method, $params); + $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port); + $cli->setCredentials('admin', $password); + $resp = $cli->send($msg, "250"); + if(!$resp) { + $error = "A communications error occurred while attempting varnish XMLRPC sync with {$url}:{$port} (pfsense.exec_php)."; + log_error($error); + file_notice("sync_settings", $error, "varnish Settings Sync", ""); + } elseif($resp->faultCode()) { + $cli->setDebug(1); + $resp = $cli->send($msg, "250"); + $error = "An error code was received while attempting varnish XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); + log_error($error); + file_notice("sync_settings", $error, "varnish Settings Sync", ""); + } else { + log_error("varnish XMLRPC reload data success with {$url}:{$port} (pfsense.exec_php)."); + } + +} + +?> diff --git a/config/varnish3/varnish.widget.php b/config/varnish3/varnish.widget.php new file mode 100755 index 00000000..f2b68aec --- /dev/null +++ b/config/varnish3/varnish.widget.php @@ -0,0 +1,126 @@ +<?php +/* + Copyright 2011 Thomas Schaefer - Tomschaefer.org + Copyright 2011 Marcello Coutinho + Part of pfSense widgets (www.pfsense.com) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +@require_once("guiconfig.inc"); +@require_once("pfsense-utils.inc"); +@require_once("functions.inc"); +function open_table(){ + echo "<table style=\"padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"; + echo" <tr>"; +} +function close_table(){ + echo" </tr>"; + echo"</table>"; + echo "<br>"; +} + +$pfb_table=array(); +$img['Sick']="<img src ='/themes/{$g['theme']}/images/icons/icon_interface_down.gif'>"; +$img['Healthy']="<img src ='/themes/{$g['theme']}/images/icons/icon_interface_up.gif'>"; + + +#var_dump($pfb_table); +#exit; +?><div id='varnish'><?php +open_table(); + +if ($config['installedpackages']['varnishsettings']['config'][0]) + $mgm=$config['installedpackages']['varnishsettings']['config'][0]['managment']; +if ($mgm != ""){ + print "<pre>"; + print "<td class=\"vncellt\"width=30%><strong>Cache hits</strong></td>"; + print "<td class=\"vncellt\"width=30%><strong>Cache hits pass</strong></td>"; + print "<td class=\"vncellt\"width=30%><strong>Cache Missed</strong></td></tr>"; + + $backends=exec("varnishadm -T " . escapeshellarg($mgm) . " stats",$debug); + foreach ($debug as $line){ + if (preg_match("/(\d+)\s+Cache\s+(hits.for|hits|misses)/",$line,$matches)) + $cache[preg_replace("/\s+/","",$matches[2])]=$matches[1]; + if (preg_match("/(\d+)\s+Client\s+(\w+)/",$line,$matches)) + $client[$matches[2]]=$matches[1]; + } + print "<td class=\"listlr\">".$cache['hits'] ."</td>"; + print "<td class=\"listlr\">".$cache['hitsfor'] ."</td>"; + print "<td class=\"listlr\">".$cache['misses']."</td></tr>"; + close_table(); + + open_table(); + print "<td class=\"vncellt\" width=30%><strong>Conn. Accepted</strong></td>"; + print "<td class=\"vncellt\" width=30%><strong>Req. received</strong></td>"; + print "<td class=\"vncellt\" width=30%><strong>Uptime</strong></td></tr>"; + print "<td class=\"listlr\">".$client['connections'] ."</td>"; + print "<td class=\"listlr\">".$client['requests'] ."</td>"; + print "<td class=\"listlr\">".$client['uptime']."</td></tr>"; + close_table(); + + open_table(); + print "<td class=\"vncellt\" width=30%><strong>Backend</strong></td>"; + print "<td class=\"vncellt\" width=30%><strong>LB applied</strong></td>"; + print "<td class=\"vncellt\" width=30%><strong>Status</strong></td></tr>"; + if (is_array($config['installedpackages']['varnishlbdirectors']['config'])) + foreach($config['installedpackages']['varnishlbdirectors']['config'] as $lb){ + foreach ($lb['row'] as $lb_backend){ + ${$lb_backend['backendname']}++; + } + } + $backends=exec("varnishadm -T " . escapeshellarg($mgm) . " debug.health",$debug); + foreach ($debug as $line){ + if (preg_match("/Backend (.*) is (\w+)/",$line,$matches)){ + $backend=preg_replace("/BACKEND$/","",$matches[1]); + print "<td class=\"listlr\">". $backend ."</td>"; + print "<td class=\"listlr\">". ${$backend} ."</td>"; + print "<td class=\"listlr\">".$img[$matches[2]]."</td></tr>"; + } + } + } +else{ + print "<td class=\"listlr\">Varnish Managment interface not set in config.</td></tr>"; +} +echo" </tr>"; +echo"</table></div>"; + +?> +<script type="text/javascript"> + function getstatus_varnish() { + scroll(0,0); + var url = "/widgets/widgets/varnish.widget.php"; + var pars = 'getupdatestatus=yes'; + var myAjax = new Ajax.Request( + url, + { + method: 'get', + parameters: pars, + onComplete: activitycallback_varnish + }); + //I know it's ugly but works. + setTimeout('getstatus_varnish()', 10000); + } + function activitycallback_varnish(transport) { + $('varnish').innerHTML = transport.responseText; + } + getstatus_varnish(); +</script> diff --git a/config/varnish3/varnish_backends.xml b/config/varnish3/varnish_backends.xml new file mode 100644 index 00000000..d9597dd3 --- /dev/null +++ b/config/varnish3/varnish_backends.xml @@ -0,0 +1,286 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE packagegui SYSTEM "./schema/packages.dtd"> +<?xml-stylesheet type="text/xsl" href="./xsl/package.xsl"?> +<packagegui> + <copyright> + <![CDATA[ +/* ========================================================================== */ +/* + varnish_backends.xml + part of pfSense (http://www.pfSense.com) + Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com> + Copyright (C) 2011 Marcello Coutinho + All rights reserved. +*/ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + ]]> + </copyright> + <description>Describe your package here</description> + <requirements>Describe your package requirements here</requirements> + <faq>Currently there are no FAQ items provided.</faq> + <name>varnishbackends</name> + <version>0.0.5</version> + <title>Varnish: Backends</title> + <include_file>/usr/local/pkg/varnish.inc</include_file> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_lb_directors.xml</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_settings.xml</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_custom_vcl.xml</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/www/widgets/widgets</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish.widget.php</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish.inc</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_sync.xml</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/www/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_view_config.php</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/www/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnishstat.php</item> + </additional_files_needed> + <menu> + <name>Varnish</name> + <tooltiptext>Varnish</tooltiptext> + <section>Services</section> + <configfile>varnish_backends.xml</configfile> + </menu> + <service> + <name>varnish</name> + <rcfile>varnish.sh</rcfile> + <executable>varnishd</executable> + <description>Varnish HTTP accelerator</description> + </service> + <tabs> + <tab> + <text>Backends</text> + <url>/pkg.php?xml=varnish_backends.xml</url> + <active/> + </tab> + <tab> + <text>Settings</text> + <url>/pkg_edit.php?xml=varnish_settings.xml&id=0</url> + </tab> + <tab> + <text>Custom VCL</text> + <url>/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0</url> + </tab> + <tab> + <text>LB Directors</text> + <url>/pkg.php?xml=varnish_lb_directors.xml</url> + </tab> + <tab> + <text>XMLRPC Sync</text> + <url>/pkg_edit.php?xml=varnish_sync.xml&id=0</url> + </tab> + <tab> + <text>View Configuration</text> + <url>/varnish_view_config.php</url> + </tab> + <tab> + <text>VarnishSTAT</text> + <url>/varnishstat.php</url> + </tab> + </tabs> + <adddeleteeditpagefields> + <columnitem> + <fielddescr>IPAddress</fielddescr> + <fieldname>ipaddress</fieldname> + </columnitem> + <columnitem> + <fielddescr>Name</fielddescr> + <fieldname>backendname</fieldname> + </columnitem> + </adddeleteeditpagefields> + <fields> + <field> + <fielddescr>BackendSettings</fielddescr> + <fieldname>BackendSettings</fieldname> + <type>listtopic</type> + <name>Backend settings</name> + </field> + <field> + <fielddescr>Backend name</fielddescr> + <fieldname>backendname</fieldname> + <description>Enter the name of this backend web server.</description> + <type>input</type> + <validate>^[a-z0-9.|-]+$</validate> + </field> + <field> + <fielddescr>IPAddress</fielddescr> + <fieldname>ipaddress</fieldname> + <description>Enter the IP Address of the backend web server.</description> + <type>input</type> + </field> + <field> + <fielddescr>Port</fielddescr> + <fieldname>port</fieldname> + <description>Enter the TCP/IP port of the webserver.</description> + <type>input</type> + <validate>^[0-9]+$</validate> + </field> + <field> + <fielddescr>PerformanceMetrics</fielddescr> + <fieldname>PerformanceMetrics</fieldname> + <type>listtopic</type> + <name>Performance metrics</name> + </field> + <field> + <fielddescr>First byte timeout</fielddescr> + <fieldname>first_byte_timeout</fieldname> + <description> time to wait for the first byte from the backend and .between_bytes_timeout for time to wait between each received byte.</description> + <type>input</type> + </field> + <field> + <fielddescr>Connect timeout</fielddescr> + <fieldname>connect_timeout</fieldname> + <description>The time to wait for a backend connection.</description> + <type>input</type> + </field> + <field> + <fielddescr>ProbeInfo</fielddescr> + <fieldname>ProbeInfo</fieldname> + <type>listtopic</type> + <name>Probe settings</name> + </field> + <field> + <fielddescr>Probe URL</fielddescr> + <fieldname>probe_url</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/BackendPolling">Enter the URL that varnish will use to ensure that this backend is healthy.</a><BR>It can be a url like "/", "/teste.htm" or a request "http://www.mysite.com/index.htm"]]></description> + <type>input</type> + <size>40</size> + </field> + <field> + <fielddescr>Probe Interval</fielddescr> + <fieldname>probe_interval</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/BackendPolling">Enter the frequency in seconds that varnish will check the probe url.</a>]]></description> + <type>input</type> + </field> + <field> + <fielddescr>Probe Timeout</fielddescr> + <fieldname>probe_timeout</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/BackendPolling">Enter the frequency in seconds that varnish will wait for a backend probe response.</a>]]></description> + <type>input</type> + </field> + <field> + <fielddescr>Probe Window</fielddescr> + <fieldname>probe_window</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/BackendPolling">Enter the value of how many of the latest polls that should be examined.</a>]]></description> + <type>input</type> + </field> + <field> + <fielddescr>Probe Threshold</fielddescr> + <fieldname>probe_threshold</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/BackendPolling">Enter the value of how many of those must have succeeded for us to consider the backend healthy.</a>]]></description> + <type>input</type> + </field> + <field> + <fielddescr>Mappings</fielddescr> + <fieldname>Mappings</fieldname> + <type>listtopic</type> + <name>Backend Mappings</name> + </field> + <field> + <fielddescr><![CDATA[<a href="https://www.varnish-cache.org/docs/master/tutorial/advanced_backend_servers.html">Leave empty if you plan to include this server in Load Balance (LB Directors)</a><br><br>use 0s grace time to force no cache.]]></fielddescr> + <fieldname>MapURLs</fieldname> + <type>rowhelper</type> + <rowhelper> + <rowhelperfield> + <fielddescr>Map</fielddescr> + <fieldname>maptype</fieldname> + <description>Select the field type that you would like to use in matching the URL.</description> + <type>select</type> + <options> + <option><name>Host</name><value>http.host</value></option> + <option><name>URL</name><value>url</value></option> + </options> + </rowhelperfield> + <rowhelperfield> + <fielddescr>Match</fielddescr> + <fieldname>fieldtype</fieldname> + <type>select</type> + <options> + <option><name>Equals</name><value>==</value></option> + <option><name>Regex</name><value>~</value></option> + </options> + </rowhelperfield> + <rowhelperfield> + <fielddescr>expression</fielddescr> + <fieldname>urlmapping</fieldname> + <type>input</type> + <size>30</size> + </rowhelperfield> + <rowhelperfield> + <fielddescr><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/VCLExampleGrace">grace</a>]]></fielddescr> + <fieldname>grace</fieldname> + <type>input</type> + <size>5</size> + </rowhelperfield> + </rowhelper> + </field> + </fields> + <custom_php_install_command> + varnish_install(); + </custom_php_install_command> + <custom_php_command_before_form> + </custom_php_command_before_form> + <custom_delete_php_command> + sync_package_varnish(); + create_varnish_rcd_file(); + varnish_start(); + </custom_delete_php_command> + <custom_php_resync_config_command> + sync_package_varnish(); + create_varnish_rcd_file(); + varnish_start(); + </custom_php_resync_config_command> + <custom_php_validation_command> + varnish_backends_post_validate($_POST, &$input_errors); + </custom_php_validation_command> +</packagegui>
\ No newline at end of file diff --git a/config/varnish3/varnish_custom_vcl.xml b/config/varnish3/varnish_custom_vcl.xml new file mode 100644 index 00000000..ba6d4a51 --- /dev/null +++ b/config/varnish3/varnish_custom_vcl.xml @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE packagegui SYSTEM "./schema/packages.dtd"> +<?xml-stylesheet type="text/xsl" href="./xsl/package.xsl"?> +<packagegui> + <copyright> + <![CDATA[ +/* ========================================================================== */ +/* + varnish_settings.xml + part of pfSense (http://www.pfSense.com) + Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com> + All rights reserved. + */ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + ]]> + </copyright> + <description>Describe your package here</description> + <requirements>Describe your package requirements here</requirements> + <faq>Currently there are no FAQ items provided.</faq> + <name>varnishcustomvcl</name> + <version>0.0.2</version> + <title>Varnish custom VCL</title> + <aftersaveredirect>pkg_edit.php?xml=varnish_settings.xml&id=0</aftersaveredirect> + <include_file>/usr/local/pkg/varnish.inc</include_file> + <tabs> + <tab> + <text>Backends</text> + <url>/pkg.php?xml=varnish_backends.xml</url> + </tab> + <tab> + <text>Settings</text> + <url>/pkg_edit.php?xml=varnish_settings.xml&id=0</url> + </tab> + <tab> + <text>Custom VCL</text> + <url>/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0</url> + <active/> + </tab> + <tab> + <text>LB Directors</text> + <url>/pkg.php?xml=varnish_lb_directors.xml</url> + </tab> + <tab> + <text>XMLRPC Sync</text> + <url>/pkg_edit.php?xml=varnish_sync.xml&id=0</url> + </tab> + <tab> + <text>View Configuration</text> + <url>/varnish_view_config.php</url> + </tab> + <tab> + <text>VarnishSTAT</text> + <url>/varnishstat.php</url> + </tab> + </tabs> + <fields> + <field> + <fielddescr>vcl_recv_early</fielddescr> + <fieldname>vcl_recv_early</fieldname> + <description>Paste your custom <![CDATA[<a target=_new href='http://varnish-cache.org/wiki/VCL'>vcl_recv</a>]]> code here. This code will be included at the beginning of the vcl_recv function.</description> + <type>textarea</type> + <cols>50</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>vcl_recv_late</fielddescr> + <fieldname>vcl_recv_late</fieldname> + <description>Paste your custom <![CDATA[<a target=_new href='http://varnish-cache.org/wiki/VCL'>vcl_recv</a>]]> code here. This code will be included at the end of the vcl_recv function.</description> + <type>textarea</type> + <cols>50</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>vcl_fetch_early</fielddescr> + <fieldname>vcl_fetch_early</fieldname> + <description>Paste your custom <![CDATA[<a target=_new href='http://varnish-cache.org/wiki/VCL'>vcl_fetch</a>]]> code here. This code will be included at the beginning of the vcl_fetch function.</description> + <type>textarea</type> + <cols>50</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>vcl_fetch_late</fielddescr> + <fieldname>vcl_fetch_late</fieldname> + <description>Paste your custom <![CDATA[<a target=_new href='http://varnish-cache.org/wiki/VCL'>vcl_fetch</a>]]> code here. This code will be included at the end of the vcl_fetch function.</description> + <type>textarea</type> + <cols>50</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>vcl_pipe_early</fielddescr> + <fieldname>vcl_fetch_early</fieldname> + <description>Paste your custom <![CDATA[<a target=_new href='http://varnish-cache.org/wiki/VCL'>vcl_pipe</a>]]> code here. This code will be included at the beginning of the vcl_pipe function.</description> + <type>textarea</type> + <cols>50</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>vcl_pipe_late</fielddescr> + <fieldname>vcl_fetch_late</fieldname> + <description>Paste your custom <![CDATA[<a target=_new href='http://varnish-cache.org/wiki/VCL'>vcl_pipe</a>]]> code here. This code will be included at the end of the vcl_pipe function.</description> + <type>textarea</type> + <cols>50</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + </fields> + <custom_php_validation_command> + </custom_php_validation_command> + <custom_php_resync_config_command> + sync_package_varnish(); + create_varnish_rcd_file(); + varnish_start(); + </custom_php_resync_config_command> +</packagegui>
\ No newline at end of file diff --git a/config/varnish3/varnish_lb_directors.xml b/config/varnish3/varnish_lb_directors.xml new file mode 100644 index 00000000..994320f3 --- /dev/null +++ b/config/varnish3/varnish_lb_directors.xml @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE packagegui SYSTEM "./schema/packages.dtd"> +<?xml-stylesheet type="text/xsl" href="./xsl/package.xsl"?> +<packagegui> + <copyright> + <![CDATA[ +/* ========================================================================== */ +/* + varnish_lb_directors.xml + part of pfSense (http://www.pfSense.com) + Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com> + Copyright (C) 2011 Marcello Coutinho + + All rights reserved. +*/ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + ]]> + </copyright> + <description>Describe your package here</description> + <requirements>Describe your package requirements here</requirements> + <faq>Currently there are no FAQ items provided.</faq> + <name>varnishlbdirectors</name> + <version>0.0.6</version> + <title>Varnish: Backends</title> + <include_file>/usr/local/pkg/varnish.inc</include_file> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_settings.xml</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish_custom_vcl.xml</item> + </additional_files_needed> + <additional_files_needed> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + <item>http://www.pfsense.com/packages/config/varnish64/varnish.inc</item> + </additional_files_needed> + <menu> + <name>Varnish </name> + <tooltiptext></tooltiptext> + <section>Services</section> + <configfile>varnish_lb_directors.xml</configfile> + </menu> + <tabs> + <tab> + <text>Backends</text> + <url>/pkg.php?xml=varnish_backends.xml</url> + </tab> + <tab> + <text>Settings</text> + <url>/pkg_edit.php?xml=varnish_settings.xml&id=0</url> + </tab> + <tab> + <text>Custom VCL</text> + <url>/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0</url> + </tab> + <tab> + <text>LB Directors</text> + <url>/pkg.php?xml=varnish_lb_directors.xml</url> + <active/> + </tab> + <tab> + <text>XMLRPC Sync</text> + <url>/pkg_edit.php?xml=varnish_sync.xml&id=0</url> + </tab> + <tab> + <text>View Configuration</text> + <url>/varnish_view_config.php</url> + </tab> + <tab> + <text>VarnishSTAT</text> + <url>/varnishstat.php</url> + </tab> + </tabs> + <adddeleteeditpagefields> + <columnitem> + <fielddescr>Director name</fielddescr> + <fieldname>directorname</fieldname> + </columnitem> + <columnitem> + <fielddescr>HOST</fielddescr> + <fieldname>directorurl</fieldname> + </columnitem> + <columnitem> + <fielddescr>URL</fielddescr> + <fieldname>directorurl2</fieldname> + </columnitem> + + <columnitem> + <fielddescr>Type</fielddescr> + <fieldname>directortype</fieldname> + </columnitem> + <columnitem> + <fielddescr>Grace</fielddescr> + <fieldname>grace</fieldname> + </columnitem> + <columnitem> + <fielddescr>Failover</fielddescr> + <fieldname>failover</fieldname> + </columnitem> + </adddeleteeditpagefields> + <fields> + <field> + <fielddescr>DirectorSettings</fielddescr> + <fieldname>Director Settings</fieldname> + <type>listtopic</type> + <name>Director settings</name> + </field> + <field> + <fielddescr>Director name</fielddescr> + <fieldname>directorname</fieldname> + <type>input</type> + <size>40</size> + </field> + <field> + <fielddescr>Match type</fielddescr> + <fieldname>fieldtype</fieldname> + <description>Select the field type that you would like to use in matching the HOST/URL.</description> + <type>select</type> + <options> + <option> + <name>Equals</name> + <value>==</value> + </option> + <option> + <name>Regex</name> + <value>~</value> + </option> + </options> + </field> + <field> + <fielddescr>Host</fielddescr> + <fieldname>directorurl</fieldname> + <description>Hint www.mysite.com</description> + <type>input</type> + <size>40</size> + </field> + <field> + <fielddescr>URL</fielddescr> + <fieldname>directorurl2</fieldname> + <description>Hint /images</description> + <type>input</type> + <size>40</size> + </field> + <field> + <fielddescr>Req Grace</fielddescr> + <fieldname>grace</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/VCLExampleGrace">How many time varnish will keep cached objects for this director.</a> HINT 60s, 30m, 1h<br>Use 0s grace time to force no cache.]]></description> + <type>input</type> + <size>5</size> + </field> + <field> + <fielddescr>Additions options</fielddescr> + <fieldname>customapping</fieldname> + <description>Paste your custom varnish code for this host/url.</description> + <type>textarea</type> + <cols>70</cols> + <rows>3</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>Backendlist</fielddescr> + <fieldname>Backendlist</fieldname> + <type>listtopic</type> + <name>Backend Settings</name> + </field> + <field> + <fielddescr>Algorithms</fielddescr> + <fieldname>directortype</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/docs/2.1/reference/vcl.html#the-client-director">Choose how varnish will balance clientes.</a>]]></description> + <type>select</type> + <options> + <option><name>Round-robin</name><value>round-robin</value></option> + <option><name>Random</name><value>random</value></option> + <option><name>Client</name><value>client</value></option> + <option><name>Hash</name><value>hash</value></option> + </options> + </field> + <field> + <fielddescr>Backend</fielddescr> + <fieldname>Backend</fieldname> + <type>rowhelper</type> + <rowhelper> + <rowhelperfield> + <fielddescr>Backend</fielddescr> + <fieldname>backendname</fieldname> + <description>Enter the URL that will be mapped to this lb_directors.</description> + <source><![CDATA[$config['installedpackages']['varnishbackends']['config']]]></source> + <source_name>backendname</source_name> + <source_value>backendname</source_value> + <type>select_source</type> + </rowhelperfield> + <rowhelperfield> + <fielddescr>Weight</fielddescr> + <fieldname>weight</fieldname> + <description>Enter the weight of this backend.</description> + <type>input</type> + </rowhelperfield> + </rowhelper> + </field> + <field> + <fielddescr>FailoverSettings</fielddescr> + <fieldname>FailoverSettings</fieldname> + <type>listtopic</type> + <name>Failover Settings</name> + </field> + <field> + <fielddescr>Failover Director</fielddescr> + <fieldname>failover</fieldname> + <description>Select a Director for failover or choose same director to do not configure it.</description> + <source><![CDATA[$config['installedpackages']['varnishlbdirectors']['config']]]></source> + <source_name>directorname</source_name> + <source_value>directorname</source_value> + <type>select_source</type> + </field> + </fields> + <custom_php_command_before_form> + </custom_php_command_before_form> + <custom_delete_php_command> + sync_package_varnish(); + create_varnish_rcd_file(); + varnish_start(); + </custom_delete_php_command> + <custom_php_resync_config_command> + sync_package_varnish(); + create_varnish_rcd_file(); + varnish_start(); + </custom_php_resync_config_command> + <custom_php_validation_command> + varnish_lb_directors_post_validate($_POST, &$input_errors); + </custom_php_validation_command> +</packagegui>
\ No newline at end of file diff --git a/config/varnish3/varnish_settings.xml b/config/varnish3/varnish_settings.xml new file mode 100644 index 00000000..38c68a03 --- /dev/null +++ b/config/varnish3/varnish_settings.xml @@ -0,0 +1,290 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE packagegui SYSTEM "./schema/packages.dtd"> +<?xml-stylesheet type="text/xsl" href="./xsl/package.xsl"?> +<packagegui> + <copyright> + <![CDATA[ +/* ========================================================================== */ +/* + varnish_settings.xml + part of pfSense (http://www.pfSense.com) + Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com> + Copyright (C) 2011 Marcello Coutinho + All rights reserved. + */ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + ]]> + </copyright> + <description>Describe your package here</description> + <requirements>Describe your package requirements here</requirements> + <faq>Currently there are no FAQ items provided.</faq> + <name>varnishsettings</name> + <version>0.0.6</version> + <title>Varnish Settings</title> + <aftersaveredirect>pkg_edit.php?xml=varnish_settings.xml&id=0</aftersaveredirect> + <include_file>/usr/local/pkg/varnish.inc</include_file> + <tabs> + <tab> + <text>Backends</text> + <url>/pkg.php?xml=varnish_backends.xml</url> + </tab> + <tab> + <text>Settings</text> + <url>/pkg_edit.php?xml=varnish_settings.xml&id=0</url> + <active/> + </tab> + <tab> + <text>Custom VCL</text> + <url>/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0</url> + </tab> + <tab> + <text>LB Directors</text> + <url>/pkg.php?xml=varnish_lb_directors.xml</url> + </tab> + <tab> + <text>XMLRPC Sync</text> + <url>/pkg_edit.php?xml=varnish_sync.xml&id=0</url> + </tab> + <tab> + <text>View Configuration</text> + <url>/varnish_view_config.php</url> + </tab> + <tab> + <text>VarnishSTAT</text> + <url>/varnishstat.php</url> + </tab> + </tabs> + <fields> + <field> + <fielddescr>Listening</fielddescr> + <fieldname>Listening</fieldname> + <type>listtopic</type> + <name>Daemon options</name> + </field> + <field> + <fielddescr>Enable Varnish</fielddescr> + <fieldname>enablevarnish</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Listening port</fielddescr> + <fieldname>listeningport</fieldname> + <description><![CDATA[Enter the port you would like varnish to listen on. Defaults to 80.<BR><BR><strong>Before listening on port 80, you must check 'Disable webConfigurator redirect rule' in system advanced options.</strong>]]></description> + <type>input</type> + </field> + <field> + <fielddescr>Managment interface</fielddescr> + <fieldname>managment</fieldname> + <description>Enter the Ip address and port for managment interface. HINT 127.0.0.1:81</description> + <type>input</type> + </field> + <field> + <fielddescr>Advanced startup options</fielddescr> + <fieldname>advancedstartup</fieldname> + <description>Enter advanced startup options to include in rc.d file</description> + <type>textarea</type> + <cols>70</cols> + <rows>2</rows> + <encoding>base64</encoding> + </field> + <field> + <fielddescr>StorageTypeLT</fielddescr> + <fieldname>StorageTypeLT</fieldname> + <type>listtopic</type> + <name>Storage type</name> + </field> + <field> + <fielddescr>Storage type</fielddescr> + <fieldname>storagetype</fieldname> + <description>Select which storage type you would like to use.</description> + <type>select</type> + <options> + <option><name>Memory</name><value>malloc</value></option> + <option><name>Disk</name><value>ondisk</value></option> + </options> + </field> + <field> + <fielddescr>Cache storage size in megabytes</fielddescr> + <fieldname>storagesize</fieldname> + <description>Enter the size of the varnish cache in megabytes. HINT: 1024 == 1 Gigabyte</description> + <type>input</type> + </field> + + <field> + <fielddescr>WorkerThreadLT</fielddescr> + <fieldname>WorkerThreadLT</fieldname> + <type>listtopic</type> + <name>Worker thread configuration</name> + </field> + <field> + <fielddescr>Minimum worker threads</fielddescr> + <fieldname>minworkers</fieldname> + <description>Enter the minimum number of varnish worker threads.</description> + <type>input</type> + </field> + <field> + <fielddescr>Maximum worker threads</fielddescr> + <fieldname>maxworkers</fieldname> + <description>Enter the maximum number of varnish worker threads.</description> + <type>input</type> + </field> + <field> + <fielddescr>Worker thread timeout</fielddescr> + <fieldname>timeoutworkers</fieldname> + <description>Enter the timeout time for the worker threads.</description> + <type>input</type> + </field> + <field> + <fielddescr>BasicVCLLT</fielddescr> + <fieldname>BasicVCLLT</fieldname> + <type>listtopic</type> + <name>General VCL Settings</name> + </field> + <field> + <fielddescr>Client identity method</fielddescr> + <fieldname>clientbalance</fieldname> + <description><![CDATA[Select how varnish will balance clients when using client Load Balance method.]]></description> + <type>select</type> + <options> + <option><name>IP address (keep sessions working)</name><value>ip</value></option> + <option><name>Requested url</name><value>url</value></option> + <option><name>User Agent</name><value>agent</value></option> + </options> + </field> + <field> + <fielddescr>Don't cache posts</fielddescr> + <fieldname>postcache</fieldname> + <description>Don't cache posts</description> + <type>checkbox</type> + </field> + <field> + <fielddescr>streaming support</fielddescr> + <fieldname>streaming</fieldname> + <description>Enable streaming support</description> + <type>checkbox</type> + </field> + <field> + <fielddescr>Session Cache</fielddescr> + <fieldname>sessioncache</fieldname> + <description><![CDATA[<strong>Never</strong> Don't cache anything with JSESSION,PHPSESSID set.<br> + <strong>Per User</strong><a href="https://www.varnish-cache.org/trac/wiki/VCLExampleCacheCookies"> This causes a lookup for a given object to include the Cookie.</a><br><br> + Note: <strong>no-cache no-store private</strong> header directives are respected by default.]]></description> + <type>select</type> + <options> + <option><name>Never</name><value>never</value></option> + <option><name>Per User</name><value>user</value></option> + </options> + </field> + <field> + <fielddescr>Cache static content</fielddescr> + <fieldname>staticache</fieldname> + <description><![CDATA[cache images, css and javascript files (.css .js .txt .gif .jpg .jpeg .bmp .png .ico .img .tga and .wmf .mp3 .ogg)<BR> + <strong>Always</strong><a href="https://www.varnish-cache.org/trac/wiki/VCLExampleCacheCookies"> Cache all static content. When cookies are present, varnish will unset it from object before caching.</a><br> + <strong>Never</strong> Do not cache static content.<br> + <strong>When possible</strong> Cache only static content and per user objects when session cache is set to it.<br>]]></description> + <type>select</type> + <options> + <option><name>When Possible</name><value>yes</value></option> + <option><name>Always</name><value>all</value></option> + <option><name>Never</name><value>no</value></option> + </options> + </field> + <field> + <fielddescr>Fix gzip compression</fielddescr> + <fieldname>fixgzip</fieldname> + <description>Ignore compression for images files and unknow compression algorithm</description> + <type>checkbox</type> + </field> + <field> + <fielddescr>Be RFC2616 compliant</fielddescr> + <fieldname>rfc2616</fieldname> + <description>Ignore request different form GET HEAD PUT POST TRACE OPTIONS DELETE</description> + <type>checkbox</type> + </field> + <field> + <fielddescr>Foward client IP</fielddescr> + <fieldname>xforward</fieldname> + <description>Select how to forward clients real IP.</description> + <type>select</type> + <options> + <option><name>set X-Forwarded-For</name><value>set</value></option> + <option><name>append X-Forwarded-For</name><value>append</value></option> + <option><name>set X-Forwarded-Varnish</name><value>create</value></option> + <option><name>Unset</name><value>unset</value></option> + </options> + </field> + <field> + <fielddescr>Fetch Grace</fielddescr> + <fieldname>grace</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/VCLExampleGrace">How many time varnish will keep cached objects.</a> HINT 60s, 30m, 1h]]></description> + <type>input</type> + <size>5</size> + </field> + <field> + <fielddescr>ErrorVCLLT</fielddescr> + <fieldname>ErrorVCLLT</fieldname> + <type>listtopic</type> + <name>Error Settings</name> + </field> + <field> + <fielddescr>Retries</fielddescr> + <fieldname>restarts</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/VCLExampleRestarts">How many times restart loop until Error messages.</a>]]></description> + <type>select</type> + <options> + <option><name>1</name><value>1</value></option> + <option><name>2</name><value>2</value></option> + <option><name>3</name><value>3</value></option> + <option><name>4</name><value>4</value></option> + <option><name>5</name><value>5</value></option> + </options> + </field> + <field> + <fielddescr>Saintmode</fielddescr> + <fieldname>saint</fieldname> + <description><![CDATA[<a href="https://www.varnish-cache.org/trac/wiki/VCLExampleSaintMode">How many time varnish will send cached objects from a down backend to client.</a> HINT 60s, 30m, 1h]]></description> + <type>input</type> + <size>5</size> + </field> + <field> + <fielddescr>Custom Html error message</fielddescr> + <fieldname>htmlerror</fieldname> + <description>Paste your custom html error page code here.</description> + <type>textarea</type> + <cols>70</cols> + <rows>10</rows> + <encoding>base64</encoding> + </field> + </fields> + <custom_php_resync_config_command> + sync_package_varnish(); + create_varnish_rcd_file(); + varnish_start(); + </custom_php_resync_config_command> + <custom_php_validation_command> + varnish_settings_post_validate($_POST, &$input_errors); + </custom_php_validation_command> +</packagegui>
\ No newline at end of file diff --git a/config/varnish3/varnish_sync.xml b/config/varnish3/varnish_sync.xml new file mode 100644 index 00000000..02434389 --- /dev/null +++ b/config/varnish3/varnish_sync.xml @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE packagegui SYSTEM "../schema/packages.dtd"> +<?xml-stylesheet type="text/xsl" href="../xsl/package.xsl"?> +<packagegui> + <copyright> + <![CDATA[ +/* ========================================================================== */ +/* + varnish_sync.xml + part of pfSense (http://www.pfSense.com) + Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com> + Copyright (C) 2011 Marcello Coutinho + All rights reserved. + */ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + ]]> + </copyright> + <description>Describe your package here</description> + <requirements>Describe your package requirements here</requirements> + <faq>Currently there are no FAQ items provided.</faq> + <name>varnishsync</name> + <version>1.1</version> + <title>Varnish: Manual Sync</title> + <include_file>/usr/local/pkg/varnish.inc</include_file> + <tabs> + <tab> + <text>Backends</text> + <url>/pkg.php?xml=varnish_backends.xml</url> + </tab> + <tab> + <text>Settings</text> + <url>/pkg_edit.php?xml=varnish_settings.xml&id=0</url> + </tab> + <tab> + <text>Custom VCL</text> + <url>/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0</url> + </tab> + <tab> + <text>LB Directors</text> + <url>/pkg.php?xml=varnish_lb_directors.xml</url> + </tab> + <tab> + <text>XMLRPC Sync</text> + <url>/pkg_edit.php?xml=varnish_sync.xml&id=0</url> + <active/> + </tab> + <tab> + <text>View Configuration</text> + <url>/varnish_view_config.php</url> + </tab> + <tab> + <text>VarnishSTAT</text> + <url>/varnishstat.php</url> + </tab> + </tabs> + <configpath>installedpackages->package->varnish</configpath> + <fields> + <field> + <type>listtopic</type> + <fieldname>temp</fieldname> + <name>Enable Varnish configuration sync</name> + </field> + <field> + <fielddescr>Automatically sync Varnish configuration changes</fielddescr> + <fieldname>synconchanges</fieldname> + <description>pfSense will automatically sync changes to the hosts defined below.</description> + <type>checkbox</type> + </field> + <field> + <fielddescr>Remote Server</fielddescr> + <fieldname>none</fieldname> + <type>rowhelper</type> + <rowhelper> + <rowhelperfield> + <fielddescr>IP Address</fielddescr> + <fieldname>ipaddress</fieldname> + <description>IP Address of remote server</description> + <type>input</type> + <size>20</size> + </rowhelperfield> + <rowhelperfield> + <fielddescr>Password</fielddescr> + <fieldname>password</fieldname> + <description>Password for remote server.</description> + <type>password</type> + <size>20</size> + </rowhelperfield> + </rowhelper> + </field> + </fields> + <custom_php_resync_config_command> + varnish_sync_on_changes(); + </custom_php_resync_config_command> + <custom_php_command_before_form> + unset($_POST['temp']); + </custom_php_command_before_form> +</packagegui>
\ No newline at end of file diff --git a/config/varnish3/varnish_view_config.php b/config/varnish3/varnish_view_config.php new file mode 100644 index 00000000..2e449b51 --- /dev/null +++ b/config/varnish3/varnish_view_config.php @@ -0,0 +1,89 @@ +<?php +/* + varnish_view_config.php + part of pfSense (http://www.pfsense.com/) + Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com> + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require("guiconfig.inc"); + +$pfSversion = str_replace("\n", "", file_get_contents("/etc/version")); +if(strstr($pfSversion, "1.2")) + $one_two = true; + +$pgtitle = "Varnish: View Configuration"; +include("head.inc"); + +?> +<body link="#0000CC" vlink="#0000CC" alink="#0000CC"> +<?php include("fbegin.inc"); ?> + +<?php if($one_two): ?> +<p class="pgtitle"><?=$pgtitle?></font></p> +<?php endif; ?> + +<?php if ($savemsg) print_info_box($savemsg); ?> + +<form action="varnishstat_view_config.php" method="post"> + +<div id="mainlevel"> + <table width="100%" border="0" cellpadding="0" cellspacing="0"> + <tr><td> +<?php + $tab_array = array(); + $tab_array[] = array(gettext("Backends"), false, "/pkg.php?xml=varnish_backends.xml"); + $tab_array[] = array(gettext("Settings"), false, "/pkg_edit.php?xml=varnish_settings.xml&id=0"); + $tab_array[] = array(gettext("Custom VCL"), false, "/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0"); + $tab_array[] = array(gettext("LB Directors"), false, "/pkg.php?xml=varnish_lb_directors.xml"); + $tab_array[] = array(gettext("XMLRPC Sync"), false, "/pkg_edit.php?xml=varnish_sync.xml&id=0"); + $tab_array[] = array(gettext("View Configuration"), true, "/varnish_view_config.php"); + $tab_array[] = array(gettext("VarnishSTAT"), false, "/varnishstat.php"); + display_top_tabs($tab_array); +?> + </td></tr> + <tr> + <td> + <div id="mainarea"> + <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td class="tabcont" > + <textarea id="varnishlogs" rows="50" cols="100%"> +<?php + $config_file = file_get_contents("/var/etc/default.vcl"); + echo $config_file; +?> + </textarea> + </td> + </tr> + </table> + </div> + </td> + </tr> + </table> +</div> +</form> +<?php include("fend.inc"); ?> +</body> +</html> diff --git a/config/varnish3/varnishstat.php b/config/varnish3/varnishstat.php new file mode 100644 index 00000000..6374525a --- /dev/null +++ b/config/varnish3/varnishstat.php @@ -0,0 +1,111 @@ +<?php +/* + varnishstat_view_logs.php + part of pfSense (http://www.pfsense.com/) + Copyright (C) 2006 Scott Ullrich <sullrich@gmail.com> + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require("guiconfig.inc"); + +if($_REQUEST['getactivity']) { + $varnishstatlogs = `varnishstat -1`; + echo "<h2>VarnishSTAT Server logs as of " . date("D M j G:i:s T Y") . "</h2>"; + echo $varnishstatlogs; + exit; +} + +$pfSversion = str_replace("\n", "", file_get_contents("/etc/version")); +if(strstr($pfSversion, "1.2")) + $one_two = true; + +$pgtitle = "Varnish: VarnishSTAT"; +include("head.inc"); + +?> +<body link="#0000CC" vlink="#0000CC" alink="#0000CC"> +<script src="/javascript/scriptaculous/prototype.js" type="text/javascript"></script> + <script type="text/javascript"> + function getlogactivity() { + var url = "/varnishstat.php"; + var pars = 'getactivity=yes'; + var myAjax = new Ajax.Request( + url, + { + method: 'post', + parameters: pars, + onComplete: activitycallback + }); + } + function activitycallback(transport) { + $('varnishstatlogs').innerHTML = '<font face="Courier"><pre>' + transport.responseText + '</pre></font>'; + setTimeout('getlogactivity()', 2500); + } + setTimeout('getlogactivity()', 1000); + </script> +<?php include("fbegin.inc"); ?> + +<?php if($one_two): ?> +<p class="pgtitle"><?=$pgtitle?></font></p> +<?php endif; ?> + +<?php if ($savemsg) print_info_box($savemsg); ?> + +<div id="mainlevel"> + <table width="100%" border="0" cellpadding="0" cellspacing="0"> + <tr><td> +<?php + $tab_array = array(); + $tab_array[] = array(gettext("Backends"), false, "/pkg.php?xml=varnish_backends.xml"); + $tab_array[] = array(gettext("Settings"), false, "/pkg_edit.php?xml=varnish_settings.xml&id=0"); + $tab_array[] = array(gettext("Custom VCL"), false, "/pkg_edit.php?xml=varnish_custom_vcl.xml&id=0"); + $tab_array[] = array(gettext("LB Directors"), false, "/pkg.php?xml=varnish_lb_directors.xml"); + $tab_array[] = array(gettext("XMLRPC Sync"), false, "/pkg_edit.php?xml=varnish_sync.xml&id=0"); + $tab_array[] = array(gettext("View Configuration"), false, "/varnish_view_config.php"); + $tab_array[] = array(gettext("VarnishSTAT"), true, "/varnishstat.php"); + display_top_tabs($tab_array); +?> + </td></tr> + <tr> + <td> + <div id="mainarea"> + <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td class="tabcont" > + <form action="varnishstat_view_logs.php" method="post"> + <div id="varnishstatlogs"> + <pre>One moment please, loading VarnishSTAT...</pre> + </div> + </td> + </tr> + </table> + </div> + </td> + </tr> + </table> +</div> +</form> +<?php include("fend.inc"); ?> +</body> +</html> |