aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/sarg/sarg.inc403
-rw-r--r--config/sarg/sarg.php46
-rw-r--r--config/sarg/sarg.template793
-rw-r--r--config/sarg/sarg.xml243
-rwxr-xr-xconfig/sarg/sarg_about.php110
-rwxr-xr-xconfig/sarg/sarg_realtime.php244
-rw-r--r--config/sarg/sarg_schedule.xml171
-rwxr-xr-xconfig/sarg/sarg_sync.xml120
8 files changed, 2130 insertions, 0 deletions
diff --git a/config/sarg/sarg.inc b/config/sarg/sarg.inc
new file mode 100644
index 00000000..93126def
--- /dev/null
+++ b/config/sarg/sarg.inc
@@ -0,0 +1,403 @@
+<?php
+/* ========================================================================== */
+/*
+ sarg.inc
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Joao Henrique F. Freitas
+ Copyright (C) 2012 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 sarg_install() {
+ // reserved
+}
+
+function sarg_deinstall() {
+ // reserved
+}
+
+function sarg_start() {
+ global $g, $config;
+
+ // reserved
+}
+
+function sarg_text_area_decode($text){
+ return preg_replace('/\r\n/', "\n",base64_decode($text));
+}
+
+function sarg_resync() {
+ global $config;
+ if (($_POST['Submit'] == 'Save') || !isset($_POST['Submit']))
+ sync_package_sarg();
+ if ($_POST['Submit'] == 'Force udpate now')
+ run_sarg();
+
+}
+function log_rotate($log_file){
+ global $config, $g;
+
+ #remove .10 rotate log file
+ unlink_if_exists($log_file.".10");
+
+ #rotate logs from 0 to 9
+ for ($i = 9; $i < 0; $i--)
+ if (file_exists($log_file.".$i"))
+ rename ($log_file,$log_file.".".($i+1));
+
+ #rotate current log
+ rename ($log_file,$log_file.".0");
+}
+function run_sarg($id=-1) {
+ global $config, $g;
+ #mount filesystem writeable
+ conf_mount_rw();
+ $cmd = "/usr/local/bin/sarg";
+ if ($id > 0 && is_array($config['installedpackages']['sargschedule']['config'])){
+ $args=$config['installedpackages']['sargschedule']['config'][$id]['args'];
+ $action=$config['installedpackages']['sargschedule']['config'][$id]['action'];
+ }
+ else{
+ $args=$_POST['args'];
+ $action=$post['action'];
+ }
+ log_error("Sarg: force refresh now with '".$args."' args.");
+
+ mwexec($cmd. " ".$args);
+ #check if there is a script to run after file save
+ if (is_array($config['installedpackages']['sarg']))
+ switch ($config['installedpackages']['sarg']['config'][0]['proxy_server']){
+ case "squid":
+ if ($action =="both" || $action=="rotate")
+ mwexec('squid -k rotate');
+ if ($action =="both" || $action=="restart")
+ mwexec_bg('/usr/local/etc/rc.d/squid restart');
+ break;
+ case "dansguardian":
+ if ($action !="none"){
+ log_rotate('/var/log/dansguardian/access.log');
+ mwexec('/usr/local/sbin/dansguardian -r');
+ }
+ break;
+ /*case "squidguard":
+ #todo
+ if ($action !="xnonex"){
+ log_rotate('/var/log/dansguardian/access.log');
+ mwexec('/usr/local/sbin/dansguardian -r');
+ }
+ break;
+ */
+ }
+ #mount filesystem readonly
+ conf_mount_ro();
+}
+
+function sync_package_sarg() {
+ global $config, $g;
+ $update_conf=0;
+ #mount filesystem writeable
+ conf_mount_rw();
+ if (!is_array($config['installedpackages']['sarg']['config']))
+ $config['installedpackages']['sarg']['config'][0]=array('report_options'=>'use_graphs,remove_temp_files,main_index,use_comma,overwrite_report',
+ 'user_sort_field'=>'BYTES',
+ 'report_type'=>'topusers,topsites,sites_users,users_sites,date_time,denied,auth_failures,site_user_time_date,downloads');
+ $sarg=$config['installedpackages']['sarg']['config'][0];
+
+ switch ($sarg['proxy_server']){
+ case 'dansguardian':
+ $access_log='/var/log/dansguardian/access.log';
+ $dansguardian_conf='/usr/local/etc/dansguardian/dansguardian.conf';
+ $dansguardian_filter_out_date="dansguardian_filter_out_date on";
+ $squidguard_conf='none';
+ break;
+ case 'squid':
+ $access_log='/var/squid/logs/access.log';
+ break;
+ case 'squidguard':
+ $access_log='/var/squid/logs/access.log';
+ break;
+ }
+
+ $graphs=(preg_match('/use_graphs/',$sarg['report_options'])?"yes":"no");
+ $anonymous_output_files=(preg_match('/anonymous_output_files/',$sarg['report_options'])?"yes":"no");
+ $resolve_ip=(preg_match('/resolve_ip/',$sarg['report_options'])?"yes":"no");
+ $user_ip=(preg_match('/user_ip/',$sarg['report_options'])?"yes":"no");
+ $sort_order=(preg_match('/user_ip/',$sarg['report_options'])?"REVERSE":"NORMAL");
+ $remove_temp_files=(preg_match('/remove_temp_files/',$sarg['report_options'])?"yes":"no");
+ $main_index=(preg_match('/main_index/',$sarg['report_options'])?"yes":"no");
+ $index_tree=(preg_match('/index_tree/',$sarg['report_options'])?"file":"date");
+ $overwrite_report=(preg_match('/overwrite_report/',$sarg['report_options'])?"yes":"no");
+ $use_comma=(preg_match('/use_comma/',$sarg['report_options'])?"yes":"no");
+ $long_url=(preg_match('/long_url/',$sarg['report_options'])?"yes":"no");
+ $privacy=(preg_match('/privacy/',$sarg['report_options'])?"yes":"no");
+
+ $report_type=preg_replace('/,/',' ',$sarg['report_type']);
+ if(!empty($sarg['include_userlist']))
+ $include_users="$include_users ".$sarg['include_userlist'];
+
+ include("/usr/local/pkg/sarg.template");
+ file_put_contents("/usr/local/etc/sarg/sarg.conf", $sg, LOCK_EX);
+
+ file_put_contents('/usr/local/etc/sarg/exclude_users.conf', sarg_text_area_decode($sarg['exclude_userlist']),LOCK_EX);
+ if(empty($sarg['include_userlist'])){
+ $usertab="none";
+ }
+ else{
+ $usertab="/usr/local/etc/sarg/usertab.conf";
+ file_put_contents('/usr/local/etc/sarg/usertab.conf', sarg_text_area_decode($sarg['usertab']),LOCK_EX);
+ }
+ $dirs=array("/usr/local/www/sarg-reports");
+ foreach ($dirs as $dir)
+ if (!is_dir($dir))
+ mkdir ($dir,0755,true);
+
+ #check cron_tab
+ $new_cron=array();
+ $cron_found=0;
+ if (is_array($config['cron']['item']))
+ foreach($config['cron']['item'] as $cron){
+ if (preg_match("/usr.local.www.sarg.php/",$cron["command"]))
+ $cron_found++;
+ else
+ $new_cron['item'][]=$cron;
+ }
+ $cron_cmd="/usr/local/bin/php /usr/local/www/sarg.php";
+ $sarg_schedule_id=0;
+ if (is_array($config['installedpackages']['sargschedule']['config']))
+ foreach ($config['installedpackages']['sargschedule']['config'] as $sarg_schedule){
+ if(preg_match('/(\d+)m/',$sarg_schedule['frequency'],$matches) && $sarg_schedule['enable']){
+ $new_cron['item'][]=array( "minute" => "*/".$matches[1],
+ "hour" => "*",
+ "mday" => "*",
+ "month" => "*",
+ "wday" => "*",
+ "who" => "root",
+ "command"=> $cron_cmd." ".$sarg_schedule_id);
+ $config['cron']=$new_cron;
+ $cron_found++;
+ }
+ if(preg_match('/(\d+)h/',$sarg_schedule['frequency'],$matches) && $sarg_schedule['enable']){
+ $new_cron['item'][]=array( "minute" => "0",
+ "hour" => "*/".$matches[1],
+ "mday" => "*",
+ "month" => "*",
+ "wday" => "*",
+ "who" => "root",
+ "command"=> $cron_cmd." ".$sarg_schedule_id);
+ $config['cron']=$new_cron;
+ $cron_found++;
+ }
+ if(preg_match('/(\d+)d/',$sarg_schedule['frequency'],$matches) && $sarg_schedule['enable']){
+ $new_cron['item'][]=array( "minute" => "0",
+ "hour" => "0",
+ "mday" => "*/".$matches[1],
+ "month" => "*",
+ "wday" => "*",
+ "who" => "root",
+ "command"=> $cron_cmd." ".$sarg_schedule_id);
+ $config['cron']=$new_cron;
+ $cron_found++;
+ }
+ $sarg_schedule_id++;
+ }
+
+ #update cron
+ if ($cron_found > 0){
+ $config['cron']=$new_cron;
+ write_config();
+ configure_cron();
+ }
+ #Write config if any file from filesystem was loaded
+ if ($update_conf > 0)
+ write_config();
+
+ #mount filesystem readonly
+ conf_mount_ro();
+
+ sarg_sync_on_changes();
+}
+
+function sarg_validate_input($post, &$input_errors) {
+ global $config,$g;
+ foreach ($post as $key => $value) {
+ if (empty($value))
+ continue;
+ # check dansguardian
+ if (substr($key, 0, 12) == "proxy_server" && $value == "dansguardian"){
+ if (is_array($config['installedpackages']['dansguardianlog'])){
+ if ($config['installedpackages']['dansguardianlog']['config'][0]['logfileformat']!=3){
+ $input_errors[]='Sarg is only compatible with dansguardian log squid mode';
+ $input_errors[]='Please change it on service -> dansguarian -> report and log -> log file format';
+ }
+ }
+ else
+ $input_errors[]='dansguardian package not detected';
+ }
+
+ # check squidguard
+ if (substr($key, 0, 10) == "proxy_server" && $value == "squidguard")
+ if (!is_array($config['installedpackages']['squidguardgeneral']))
+ $input_errors[]='squidguard package not detected';
+
+ # check squid
+ if (substr($key, 0, 5) == "proxy_server" && $value == "squid"){
+ if (is_array($config['installedpackages']['squid']))
+ if (!$config['installedpackages']['squid']['log_enabled'])
+ $input_errors[]='squidlogs not enabled';
+ else
+ $input_errors[]='squid package not installed';
+ }
+
+ if (substr($key, 0, 11) == "description" && !preg_match("@^[a-zA-Z0-9 _/.-]+$@", $value))
+ $input_errors[] = "Do not use special characters on description";
+ if (substr($key, 0, 8) == "fullfile" && !preg_match("@^[a-zA-Z0-9_/.-]+$@", $value))
+ $input_errors[] = "Do not use special characters on filename";
+ #check cron option
+ if($key == "frequency" && (!preg_match("/^\d+(h|m|d)$/",$value) || $value == 0))
+ $input_errors[] = "A valid number with a time reference is required for the field 'Update Frequency'";
+ }
+}
+
+
+/* Uses XMLRPC to synchronize the changes to a remote node */
+function sarg_sync_on_changes() {
+ global $config, $g;
+
+ log_error("[sarg] sarg_xmlrpc_sync.php is starting.");
+ $synconchanges = $config['installedpackages']['sargsync']['config'][0]['synconchanges'];
+ if(!$synconchanges)
+ return;
+ foreach ($config['installedpackages']['sargsync']['config'] as $rs ){
+ foreach($rs['row'] as $sh){
+ $sync_to_ip = $sh['ipaddress'];
+ $password = $sh['password'];
+ if($sh['username'])
+ $username = $sh['username'];
+ else
+ $username = 'admin';
+ if($password && $sync_to_ip)
+ sarg_do_xmlrpc_sync($sync_to_ip, $username, $password);
+ }
+ }
+ log_error("[sarg] sarg_xmlrpc_sync.php is ending.");
+}
+/* Do the actual XMLRPC sync */
+function sarg_do_xmlrpc_sync($sync_to_ip, $username, $password) {
+ global $config, $g;
+
+ if(!$username)
+ return;
+
+ 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['sarg'] = $config['installedpackages']['sarg'];
+
+ /* 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 sarg 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($username, $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 sarg XMLRPC sync with {$url}:{$port}.";
+ log_error($error);
+ file_notice("sync_settings", $error, "sarg Settings Sync", "");
+ } elseif($resp->faultCode()) {
+ $cli->setDebug(1);
+ $resp = $cli->send($msg, "250");
+ $error = "An error code was received while attempting sarg XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("sync_settings", $error, "sarg Settings Sync", "");
+ } else {
+ log_error("sarg XMLRPC sync successfully completed with {$url}:{$port}.");
+ }
+
+ /* tell sarg to reload our settings on the destionation sync host. */
+ $method = 'pfsense.exec_php';
+ $execcmd = "require_once('/usr/local/pkg/sarg.inc');\n";
+ $execcmd .= "sync_package_sarg();";
+ /* assemble xmlrpc payload */
+ $params = array(
+ XML_RPC_encode($password),
+ XML_RPC_encode($execcmd)
+ );
+
+ log_error("sarg XMLRPC reload data {$url}:{$port}.");
+ $msg = new XML_RPC_Message($method, $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($username, $password);
+ $resp = $cli->send($msg, "250");
+ if(!$resp) {
+ $error = "A communications error occurred while attempting sarg XMLRPC sync with {$url}:{$port} (pfsense.exec_php).";
+ log_error($error);
+ file_notice("sync_settings", $error, "sarg Settings Sync", "");
+ } elseif($resp->faultCode()) {
+ $cli->setDebug(1);
+ $resp = $cli->send($msg, "250");
+ $error = "An error code was received while attempting sarg XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("sync_settings", $error, "sarg Settings Sync", "");
+ } else {
+ log_error("sarg XMLRPC reload data success with {$url}:{$port} (pfsense.exec_php).");
+ }
+
+}
+
+?>
diff --git a/config/sarg/sarg.php b/config/sarg/sarg.php
new file mode 100644
index 00000000..c2ec00c2
--- /dev/null
+++ b/config/sarg/sarg.php
@@ -0,0 +1,46 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ sarg.php
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2012 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.
+ */
+/* ========================================================================== */
+
+require_once("/etc/inc/util.inc");
+require_once("/etc/inc/functions.inc");
+require_once("/etc/inc/pkg-utils.inc");
+require_once("/etc/inc/globals.inc");
+require_once("/usr/local/pkg/sarg.inc");
+
+if (preg_match ("/(\d+)/",$argv[1],$matches))
+ run_sarg($matches[1]);
+
+
+?> \ No newline at end of file
diff --git a/config/sarg/sarg.template b/config/sarg/sarg.template
new file mode 100644
index 00000000..560d0c10
--- /dev/null
+++ b/config/sarg/sarg.template
@@ -0,0 +1,793 @@
+<?php
+/*
+ sag.conf.template
+ part of the Dansguardian package for pfSense
+ Copyright (C) 2012 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.
+
+*/
+
+#create sarg.conf
+ $sg=<<<EOF
+# sarg.conf
+#
+# TAG: access_log file
+# Where is the access.lo
+# sarg -l file
+#
+access_log {$access_log}
+
+# TAG: graphs yes|no
+# Use graphics where is possible.
+# graph_days_bytes_bar_color blue|green|yellow|orange|brown|red
+#
+graphs ${graphs}
+#graph_days_bytes_bar_color orange
+
+# TAG: graph_font
+# The full path to the TTF font file to use to create the graphs. It is required
+# if graphs is set to yes.
+#
+#graph_font /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
+
+# TAG: title
+# Especify the title for html page.
+#
+#title "Squid User Access Reports"
+
+# TAG: font_face
+# Especify the font for html page.
+#
+#font_face Tahoma,Verdana,Arial
+
+# TAG: header_color
+# Especify the header color
+#
+#header_color darkblue
+
+# TAG: header_bgcolor
+# Especify the header bgcolor
+#
+#header_bgcolor blanchedalmond
+
+# TAG: font_size
+# Especify the text font size
+#
+#font_size 9px
+
+# TAG: header_font_size
+# Especify the header font size
+#
+#header_font_size 9px
+
+# TAG: title_font_size
+# Especify the title font size
+#
+#title_font_size 11px
+
+# TAG: background_color
+# TAG: background_color
+# Html page background color
+#
+# background_color white
+
+# TAG: text_color
+# Html page text color
+#
+#text_color #000000
+
+# TAG: text_bgcolor
+# Html page text background color
+#
+#text_bgcolor lavender
+
+# TAG: title_color
+# Html page title color
+#
+#title_color green
+
+# TAG: logo_image
+# Html page logo.
+#
+#logo_image none
+
+# TAG: logo_text
+# Html page logo text.
+#
+#logo_text ""
+
+# TAG: logo_text_color
+# Html page logo texti color.
+#
+#logo_text_color #000000
+
+# TAG: logo_image_size
+# Html page logo image size.
+# width height
+#
+#image_size 80 45
+
+# TAG: background_image
+# Html page background image
+#
+#background_image none
+
+# TAG: password
+# User password file used by Squid authentication scheme
+# If used, generate reports just for that users.
+#
+#password none
+
+# TAG: temporary_dir
+# Temporary directory name for work files
+# sarg -w dir
+#
+#temporary_dir /tmp
+
+# TAG: output_dir
+# The reports will be saved in that directory
+# sarg -o dir
+#
+output_dir /usr/local/www/sarg-reports
+
+# TAG: anonymous_output_files yes/no
+# Use anonymous file and directory names in the report. If it is set to
+# no (the default), the user id/ip/name is slightly mangled to create a
+# suitable file name to store the report of the user but the user's
+# identity can easily be guessed from the mangled name. If this option is
+# set, any file or directory belonging to the user is replaced by a short
+# number. The purpose is to hide the identity of the user when looking
+# at the report file names but it may serve to shorten the path too.
+#
+anonymous_output_files {$anonymous_output_files}
+
+# TAG: output_email
+# Email address to send the reports. If you use this tag, no html reports will be generated.
+# sarg -e email
+#
+#output_email none
+
+# TAG: resolve_ip yes/no
+# Convert ip address to dns name
+# sarg -n
+resolve_ip {$resolve_ip}
+
+# TAG: user_ip yes/no
+# Use Ip Address instead userid in reports.
+# sarg -p
+user_ip {$user_ip}
+
+# TAG: topuser_sort_field field normal/reverse
+# Sort field for the Topuser Report.
+# Allowed fields: USER CONNECT BYTES TIME
+#
+topuser_sort_field {$sarg['user_sort_field']} {$sort_order}
+
+# TAG: user_sort_field field normal/reverse
+# Sort field for the User Report.
+# Allowed fields: SITE CONNECT BYTES TIME
+#
+user_sort_field {$sarg['user_sort_field']} {$sort_order}
+
+# TAG: exclude_users file
+# users within the file will be excluded from reports.
+# you can use indexonly to have only index.html file.
+#
+exclude_users /usr/local/etc/sarg/exclude_users.conf
+
+# TAG: exclude_hosts file
+# Hosts, domains or subnets will be excluded from reports.
+#
+# Eg.: 192.168.10.10 - exclude ip address only
+# 192.168.10.0/24 - exclude full C class
+# s1.acme.foo - exclude hostname only
+# *.acme.foo - exclude full domain name
+#
+#exclude_hosts none
+
+# TAG: useragent_log file
+# useragent.log file patch to generate useragent report.
+#
+#useragent_log none
+
+# TAG: date_format
+# Date format in reports: e (European=dd/mm/yy), u (American=mm/dd/yy), w (Weekly=yy.ww)
+#
+#date_format u
+
+# TAG: per_user_limit file MB
+# Saves userid on file if download exceed n MB.
+# This option allow you to disable user access if user exceed a download limit.
+#
+#per_user_limit none
+
+# TAG: lastlog n
+# How many reports files must be keept in reports directory.
+# The oldest report file will be automatically removed.
+# 0 - no limit.
+#
+#lastlog 0
+
+# TAG: remove_temp_files yes
+# Remove temporary files: geral, usuarios, top, periodo from root report directory.
+#
+remove_temp_files {$remove_temp_files}
+
+# TAG: index yes|no|only
+# Generate the main index.html.
+# only - generate only the main index.html
+#
+index {$main_index}
+
+# TAG: index_tree date|file
+# How to generate the index.
+#
+index_tree {$index_tree}
+
+# TAG: index_fields
+# The columns to show in the index of the reports
+# Columns are: dirsize
+#
+#index_fields dirsize
+
+# TAG: overwrite_report yes|no
+# yes - if report date already exist then will be overwrited.
+# no - if report date already exist then will be renamed to filename.n, filename.n+1
+#
+overwrite_report {$overwrite_report}
+
+# TAG: records_without_userid ignore|ip|everybody
+# What can I do with records without user id (no authentication) in access.log file ?
+#
+# ignore - This record will be ignored.
+# ip - Use ip address instead. (default)
+# everybody - Use "everybody" instead.
+#
+#records_without_userid ip
+
+# TAG: use_comma no|yes
+# Use comma instead point in reports.
+# Eg.: use_comma yes => 23,450,110
+# use_comma no => 23.450.110
+#
+use_comma {$use_comma}
+
+# TAG: mail_utility
+# Mail command to use to send reports via SMTP. Sarg calls it like this:
+# mail_utility -s "SARG report, date" "output_email" <"mail_content"
+#
+# Therefore, it is possible to add more arguments to the command by specifying them
+# here.
+#
+# If you need too, you can use a shell script to process the content of /dev/stdin
+# (/dev/stdin is the mail_content passed by sarg to the script) and call whatever
+# command you like. It is not limited to mailing the report via SMTP.
+#
+# Don't forget to quote the command if necessary (i.e. if the path contains
+# characters that must be quoted).
+#
+#mail_utility mailx
+
+# TAG: topsites_num n
+# How many sites in topsites report.
+#
+#topsites_num 100
+
+# TAG: topsites_sort_order CONNECT|BYTES|TIME A|D
+# Sort for topsites report, where A=Ascendent, D=Descendent
+#
+#topsites_sort_order CONNECT D
+
+# TAG: index_sort_order A/D
+# Sort for index.html, where A=Ascendent, D=Descendent
+#
+#index_sort_order D
+
+# TAG: exclude_codes file
+# Ignore records with these codes. Eg.: NONE/400
+# Write one code per line. Lines starting with a # are ignored.
+# Only codes matching exactly one of the line is rejected. The
+# comparison is not case sensitive.
+#
+#exclude_codes /usr/local/sarg/exclude_codes
+
+# TAG: replace_index string
+# Replace "index.html" in the main index file with this string
+# If null "index.html" is used
+#
+#replace_index <?php echo str_replace(".", "_", $REMOTE_ADDR); echo ".html"; ?>
+
+# TAG: max_elapsed milliseconds
+# If elapsed time is recorded in log is greater than max_elapsed use 0 for elapsed time.
+# Use 0 for no checking
+#
+#max_elapsed 28800000
+# 8 Hours
+
+# TAG: report_type type
+# What kind of reports to generate.
+# topusers - users, sites, times, bytes, connects, links to accessed sites, etc
+# topsites - site, connect and bytes report
+# sites_users - users and sites report
+# users_sites - accessed sites by the user report
+# date_time - bytes used per day and hour report
+# denied - denied sites with full URL report
+# auth_failures - autentication failures report
+# site_user_time_date - sites, dates, times and bytes report
+# downloads - downloads per user report
+#
+# Eg.: report_type topsites denied
+#
+#report_type topusers topsites sites_users users_sites date_time denied auth_failures site_user_time_date downloads
+report_type {$report_type}
+
+# TAG: usertab filename
+# You can change the "userid" or the "ip address" to be a real user name on the reports.
+# If resolve_ip is active, the ip address is resolved before being looked up into this
+# file. That is, if you want to map the ip address, be sure to set resolv_ip to no or
+# the resolved name will be looked into the file instead of the ip address. Note that
+# it can be used to resolve any ip address known to the dns and then map the unresolved
+# ip addresses to a name found in the usertab file.
+# Table syntax:
+# userid name or ip address name
+# Eg:
+# SirIsaac Isaac Newton
+# vinci Leonardo da Vinci
+# 192.168.10.1 Karol Wojtyla
+#
+# Each line must be terminated with '\ n'
+# If usertab have value "ldap" (case ignoring), user names
+# will be taken from LDAP server. This method as approaches for reception
+# of usernames from Active Didectory
+#
+#usertab none
+usertab {$usertab}
+
+# TAG: LDAPHost hostname
+# FQDN or IP address of host with LDAP service or AD DC
+# default is '127.0.0.1'
+#LDAPHost 127.0.0.1
+
+# TAG: LDAPPort port
+# LDAP service port number
+# default is '389'
+#LDAPPort 389
+
+# TAG: LDAPBindDN CN=username,OU=group,DC=mydomain,DC=com
+# DN of LDAP user, who is authorized to read user's names from LDAP base
+# default is empty line
+#LDAPBindDN cn=proxy,dc=mydomain,dc=local
+
+# TAG: LDAPBindPW secret
+# Password of DN, who is authorized to read user's names from LDAP base
+# default is empty line
+#LDAPBindPW secret
+
+# TAG: LDAPBaseSearch OU=users,DC=mydomain,DC=com
+# LDAP search base
+# default is empty line
+#LDAPBaseSearch ou=users,dc=mydomain,dc=local
+
+# TAG: LDAPFilterSearch (uid=%s)
+# User search filter by user's logins in LDAP
+# First founded record will be used
+# %s - will be changed to userlogins from access.log file
+# filter string can have up to 5 '%s' tags
+# default value is '(uid=%s)'
+#LDAPFilterSearch (uid=%s)
+
+# TAG: LDAPTargetAttr attributename
+# Name of the attribute containing a name of the user
+# default value is 'cn'
+#LDAPTargetAttr cn
+
+# TAG: long_url yes|no
+# If yes, the full url is showed in report.
+# If no, only the site will be showed
+#
+# YES option generate very big sort files and reports.
+#
+long_url {$long_url}
+
+# TAG: date_time_by bytes|elap
+# Date/Time reports show the downloaded volume or the elapsed time or both.
+#
+#date_time_by bytes
+
+# TAG: charset name
+# ISO 8859 is a full series of 10 standardized multilingual single-byte coded (8bit)
+# graphic character sets for writing in alphabetic languages
+# You can use the following charsets:
+# Latin1 - West European
+# Latin2 - East European
+# Latin3 - South European
+# Latin4 - North European
+# Cyrillic
+# Arabic
+# Greek
+# Hebrew
+# Latin5 - Turkish
+# Latin6
+# Windows-1251
+# Japan
+# Koi8-r
+# UTF-8
+#
+#charset Latin1
+charset UTF-8
+# TAG: user_invalid_char "&/"
+# Records that contain invalid characters in userid will be ignored by Sarg.
+#
+#user_invalid_char "&/"
+
+# TAG: privacy yes|no
+# privacy_string "***.***.***.***"
+# privacy_string_color blue
+# In some countries the sysadm cannot see the visited sites by a restrictive law.
+# Using privacy yes the visited url will be changes by privacy_string and the link
+# will be removed from reports.
+#
+privacy {$privacy}
+#privacy_string "***.***.***.***"
+#privacy_string_color blue
+
+# TAG: include_users "user1:user2:...:usern"
+# Reports will be generated only for listed users.
+#
+#include_users none
+{$include_users}
+
+# TAG: exclude_string "string1:string2:...:stringn"
+# Records from access.log file that contain one of listed strings will be ignored.
+#
+#exclude_string none
+
+# TAG: show_successful_message yes|no
+# Shows "Successful report generated on dir" at end of process.
+#
+#show_successful_message yes
+
+# TAG: show_read_statistics yes|no
+# Shows some reading statistics.
+#
+#show_read_statistics yes
+
+# TAG: topuser_fields
+# Which fields must be in Topuser report.
+#
+#topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
+
+# TAG: user_report_fields
+# Which fields must be in User report.
+#
+#user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
+
+# TAG: bytes_in_sites_users_report yes|no
+# Bytes field must be in Site & Users Report ?
+#
+#bytes_in_sites_users_report no
+
+# TAG: topuser_num n
+# How many users in topsites report. 0 = no limit
+#
+#topuser_num 0
+
+# TAG: datafile file
+# Save the report results in a file to populate some database
+#
+#datafile none
+
+# TAG: datafile_delimiter " "
+# ascii character to use as a field separator in datafile
+#
+#datafile_delimiter ""
+{$datafile_delimiter}
+# TAG: datafile_fields all
+# Which data fields must be in datafile
+# user;date;time;url;connect;bytes;in_cache;out_cache;elapsed
+#
+#datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed
+{$datafile_fields}
+
+# TAG: datafile_url ip|name
+# Saves the URL as ip or name in datafile
+#
+#datafile_url ip
+
+# TAG: weekdays
+# The weekdays to take into account ( Sunday->0, Saturday->6 )
+# Example:
+#weekdays 1-3,5
+# Default:
+#weekdays 0-6
+
+# TAG: hours
+# The hours to take into account
+# Example:
+#hours 7-12,14,16,18-20
+# Default:
+#hours 0-23
+
+# TAG: dansguardian_conf file
+# DansGuardian.conf file path
+# Generate reports from DansGuardian logs.
+# Use 'none' to disable it.
+# dansguardian_conf /usr/dansguardian/dansguardian.conf
+#
+dansguardian_conf {$dansguardian_conf}
+
+# TAG: dansguardian_filter_out_date on|off
+# This option replaces dansguardian_ignore_date whose name was not appropriate with respect to its action.
+# Note the change of parameter value compared with the old option.
+# 'off' use the record even if its date is outside of the range found in the input log file.
+# 'on' use the record only if its date is in the range found in the input log file.
+#
+${dansguardian_filter_out_date}
+
+# TAG: squidguard_conf file
+# path to squidGuard.conf file
+# Generate reports from SquidGuard logs.
+# Use 'none' to disable.
+# You can use sarg -L filename to use an alternate squidGuard log.
+# squidguard_conf /usr/local/squidGuard/squidGuard.conf
+#
+squidguard_conf {$squidguard_conf}
+
+# TAG: redirector_log file
+# the location of the web proxy redirector log such as one created by squidGuard or Rejik. The option
+# may be repeated up to 64 times to read multiple files.
+# If this option is specified, it takes precedence over squidguard_conf.
+# The command line option -L override this option.
+#
+#redirector_log /usr/local/squidGuard/var/logs/urls.log
+
+# TAG: redirector_filter_out_date on|off
+# This option replaces squidguard_ignore_date and redirector_ignore_date whose names were not
+# appropriate with respect to their action.
+# Note the change of parameter value compared with the old options.
+# 'off' use the record even if its date is outside of the range found in the input log file.
+# 'on' use the record only if its date is in the range found in the input log file.
+#
+#redirector_filter_out_date on
+
+# TAG: redirector_log_format
+# Format string for web proxy redirector logs.
+# This option was named squidguard_log_format before sarg 2.3.
+# REJIK #year#-#mon#-#day# #hour# #list#:#tmp# #ip# #user# #tmp#/#tmp#/#url#/#end#
+# SQUIDGUARD #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end#
+#redirector_log_format #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end#
+
+# TAG: show_sarg_info yes|no
+# shows sarg information and site path on each report bottom
+#
+#show_sarg_info yes
+
+# TAG: show_sarg_logo yes|no
+# shows sarg logo
+#
+#show_sarg_logo yes
+
+# TAG: parsed_output_log directory
+# Saves the processed log in a sarg format after parsing the squid log file.
+# This is a way to dump all of the data structures out, after parsing from
+# the logs (presumably this data will be much smaller than the log files themselves),
+# and pull them back in for later processing and merging with data from previous logs.
+#
+#parsed_output_log none
+
+# TAG: parsed_output_log_compress /bin/gzip|/usr/bin/bzip2|nocompress
+# Command to run to compress sarg parsed output log. It may contain
+# options (such as -f to overwrite existing target file). The name of
+# the file to compresse is provided at the end of this
+# command line. Don't forget to quote things appropriately.
+#
+#parsed_output_log_compress /bin/gzip
+
+# TAG: displayed_values bytes|abbreviation
+# how the values will be displayed in reports.
+# eg. bytes - 209.526
+# abbreviation - 210K
+#
+#displayed_values bytes
+
+# Report limits
+# TAG: authfail_report_limit n
+# TAG: denied_report_limit n
+# TAG: siteusers_report_limit n
+# TAG: squidguard_report_limit n
+# TAG: user_report_limit n
+# TAG: dansguardian_report_limit n
+# TAG: download_report_limit n
+# report limits (lines).
+# '0' no limit
+#
+#authfail_report_limit 10
+#denied_report_limit 10
+#siteusers_report_limit 0
+#squidguard_report_limit 10
+#dansguardian_report_limit 10
+#user_report_limit 10
+#user_report_limit 50
+
+# TAG: www_document_root dir
+# Where is your Web DocumentRoot
+# Sarg will create sarg-php directory with some PHP modules:
+# - sarg-squidguard-block.php - add urls from user reports to squidGuard DB
+#
+#www_document_root /var/www/html
+www_document_root /usr/local/www
+
+# TAG: block_it module_url
+# This tag allow you to pass urls from user reports to a cgi or php module,
+# to be blocked by some Squid acl
+#
+# Eg.: block_it /sarg-php/sarg-block-it.php
+# sarg-block-it is a php that will append a url to a flat file.
+# You must change /var/www/html/sarg-php/sarg-block-it to point to your file
+# in $filename variable, and chown to a httpd owner.
+#
+# sarg will pass http://module_url?url=url
+#
+#block_it none
+
+# TAG: external_css_file path
+# Provide the path to an external css file to link into the HTML reports instead of
+# the inline css written by sarg when this option is not set.
+#
+# In versions prior to 2.3, this used to be an absolute file name to
+# a file to include verbatim in each HTML page but, as it takes a lot of
+# space, version 2.3 switched to a link to an external css file.
+# Therefore, this option must contain the HTTP server path on which a client
+# browser may find the css file.
+#
+# Sarg use theses style classes:
+# .logo logo class
+# .info sarg information class, align=center
+# .title_c title class, align=center
+# .header_c header class, align:center
+# .header_l header class, align:left
+# .header_r header class, align:right
+# .text text class, align:right
+# .data table text class, align:right
+# .data2 table text class, align:left
+# .data3 table text class, align:center
+# .link link class
+#
+# Sarg can be instructed to output the internal css it inline
+# into the reports with this command:
+#
+# sarg --css
+#
+# You can redirect the output to a file of your choice and edit
+# it to your liking.
+#
+#external_css_file none
+
+# TAG: user_authentication yes|no
+# Allow user authentication in User Reports using .htaccess
+# Parameters:
+# AuthUserTemplateFile - The template to use to create the
+# .htaccess file. In the template, %u is replaced by the
+# user's ID for which the report is generated. The path of the
+# template is relative to the directory containing sarg
+# configuration file.
+#
+# user_authentication no
+# AuthUserTemplateFile sarg_htaccess
+
+# TAG: download_suffix "suffix,suffix,...,suffix"
+# file suffix to be considered as "download" in Download report.
+# Use 'none' to disable.
+#
+#download_suffix "zip,arj,bzip,gz,ace,doc,iso,adt,bin,cab,com,dot,drv$,lha,lzh,mdb,mso,ppt,rtf,src,shs,sys,exe,dll,mp3,avi,mpg,mpeg"
+
+# TAG: ulimit n
+# The maximum number of open file descriptors to avoid "Too many open files" error message.
+# You need to run sarg as root to use ulimit tag.
+# If you run sarg with a low privilege user, set to 'none' to disable ulimit
+#
+#ulimit 20000
+
+# TAG: ntlm_user_format username|domainname+username
+# NTLM users format.
+#
+#ntlm_user_format domainname+username
+
+# TAG: realtime_refresh_time num sec
+# How many time to auto refresh the realtime report
+# 0 = disable
+#
+realtime_refresh_time 0
+
+# TAG: realtime_access_log_lines num
+# How many last lines to get from access.log file
+#
+# realtime_access_log_lines 1000
+
+# TAG: realtime_types: GET,PUT,CONNECT,ICP_QUERY,POST
+# Which records must be in realtime report.
+#
+realtime_types GET,PUT,CONNECT
+
+# TAG: realtime_unauthenticated_records: ignore|show
+# What to do with unauthenticated records in realtime report.
+#
+#
+realtime_unauthenticated_records show
+
+# TAG: byte_cost value no_cost_limit
+# Cost per byte.
+# Eg. byte_cost 0.01 100000000
+# per byte cost = 0.01
+# bytes with no cost = 100 Mb
+# 0 = disable
+#
+# byte_cost 0.01 50000000
+
+# TAG: squid24 on|off
+# Compatilibity with squid version <= 2.4 when using emulate_http_log on
+#
+# squid24 off
+
+# TAG: sorttable path
+# The path to a javascript script to dynamically sort the tables.
+# The path is the link a browser must follow to find the script. For instance,
+# it may be http://www.myproxy.org/sorttable.js or just /sorttable.js if the script
+# is at the root of your web site.
+#
+# If the path starts with "../" then it is assumed to be a relative
+# path and sarg adds as many "../" as necessary to locate the js script from
+# the output directory. Therefore, ../../sorttable.js links to the javascript
+# one level above output_dir.
+#
+# If this entry is set, each sortable table will have the "sortable" class set.
+# You may have a look at http://www.kryogenix.org/code/browser/sorttable/
+# for the implementation on which sarg is based.
+#
+# sorttable /sorttable.js
+
+# TAG: hostalias
+# The name of a text file containing the host names one per line and the
+# optional alias to use in the report instead of that host name.
+# Host names may contain up to one wildcard denoted by a *. The wildcard
+# must not end the host name.
+# The host name may be followed by an optional alias but if no alias is
+# provided, the host name, including the wildcard, replaces any matching
+# host name found in the log.
+# Host names replaced by identical aliases are grouped together in the
+# reports.
+# IP addresses are supported and accept the CIDR notation both for IPv4 and
+# IPv6 addresses.
+#
+# Example:
+# *.gstatic.com
+# mt*.google.com
+# *.myphone.microsoft.com
+# *.myphone.microsoft.com:443 *.myphone.microsoft.com:secure
+# *.freeav.net antivirus:freeav
+# *.mail.live.com
+# 65.52.00.00/14 *.mail.live.com
+#hostalias /usr/local/sarg/hostalias
+EOF;
+?>
diff --git a/config/sarg/sarg.xml b/config/sarg/sarg.xml
new file mode 100644
index 00000000..5e1ea455
--- /dev/null
+++ b/config/sarg/sarg.xml
@@ -0,0 +1,243 @@
+<?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[
+/* $Id$ */
+/* ========================================================================== */
+/*
+ sarg.xml
+ part of the sarg for pfSense
+ Copyright (C) 2012 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>sarg</name>
+ <version>1.0</version>
+ <title>Services: sarg</title>
+ <include_file>/usr/local/pkg/sarg.inc</include_file>
+ <menu>
+ <name>Sarg Reports</name>
+ <tooltiptext>Configure sarg</tooltiptext>
+ <section>Status</section>
+ <url>/pkg_edit.php?xml=sarg.xml</url>
+ </menu>
+ <service>
+ <name>sarg</name>
+ <rcfile>sarg</rcfile>
+ <executable>sarg</executable>
+ <description><![CDATA[Squid Analysis Report Generator is a tool that allow you to view "where" your users are going to on the Internet.]]></description>
+ </service>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/sarg/sarg.inc</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/sarg/sarg_schedule.inc</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/sarg/sarg_sync.xml</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/sarg/sarg_realtime.php</item>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/sarg/sarg_about.php</item>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/sarg/sarg.php</item>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <tabs>
+ <tab>
+ <text>Settings</text>
+ <url>/pkg_edit.php?xml=sarg.xml&amp;id=0</url>
+ <active/>
+ </tab>
+ <tab>
+ <text>Schedule</text>
+ <url>/pkg.php?xml=sarg_schedule.xml&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>View Report</text>
+ <url>/sarg-reports/</url>
+ </tab>
+ <tab>
+ <text>Realtime</text>
+ <url>/sarg_realtime.php</url>
+ </tab>
+ <tab>
+ <text>XMLRPC Sync</text>
+ <url>/pkg_edit.php?xml=sarg_sync.xml&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>Help</text>
+ <url>/sarg_about.php</url>
+ </tab>
+</tabs>
+ <fields>
+ <field>
+ <name>Log Settings</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>Proxy server</fielddescr>
+ <fieldname>proxy_server</fieldname>
+ <description><![CDATA[Select proxy server to read logs from]]></description>
+ <type>select</type>
+ <options>
+ <option><name>Dansguardian</name><value>dansguardian</value></option>
+ <option><name>Squidguard</name><value>squidguard</value></option>
+ <option><name>Squid</name><value>squid</value></option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Report Options</fielddescr>
+ <fieldname>report_options</fieldname>
+ <description><![CDATA[Sarg report options. Default values are in ( )<br>
+ If you select any option, it will be enabled on conf file.<br>
+ Use CTRL + click on this field]]></description>
+ <type>select</type>
+ <options>
+ <option><name>Use graphics where is possible. (yes)</name><value>use_graphs</value></option>
+ <option><name>Use anonymous file and directory names in the report. (no)</name><value>anonymous_output_files </value></option>
+ <option><name>Convert ip address to dns name (no)</name><value>resolve_ip</value></option>
+ <option><name>Use Ip Address instead userid in reports. (no)</name><value>user_ip</value></option>
+ <option><name>Sort Fields in Reverse order (no)</name><value>user_sort_field_order</value></option>
+ <option><name>Remove temporary files from root report directory (yes)</name><value>remove_temp_files</value></option>
+ <option><name>Generate the main index.html (yes)</name><value>main_index</value></option>
+ <option><name>Generate the index tree by file (on)</name><value>index_tree</value></option>
+ <option><name>Overwrite report (yes)</name><value>overwrite_report</value></option>
+ <option><name>Use comma instead point in reports (yes)</name><value>use_comma</value></option>
+ <option><name>Show full url in report (no)</name><value>long_url</value></option>
+ <option><name>Privacy (no)</name><value>privacy</value></option>
+ </options>
+ <multiple/>
+ <size>13</size>
+ </field>
+ <field>
+ <fielddescr>Report to generate</fielddescr>
+ <fieldname>report_type</fieldname>
+ <description><![CDATA[Sarg report type. All are enabled by default<br>
+ Use CTRL + click on this field]]></description>
+ <type>select</type>
+ <options>
+ <option><name>topusers - users, sites, times, bytes, connects, links to accessed sites, etc</name><value>topusers</value></option>
+ <option><name>topsites - site, connect and bytes report</name><value>topsites</value></option>
+ <option><name>sites_users - users and sites report</name><value>sites_users</value></option>
+ <option><name>users_sites - accessed sites by the user report</name><value>users_sites</value></option>
+ <option><name>date_time - bytes used per day and hour report</name><value>date_time</value></option>
+ <option><name>denied - denied sites with full URL report</name><value>denied</value></option>
+ <option><name>auth_failures - autentication failures report</name><value>auth_failures</value></option>
+ <option><name>site_user_time_date - sites, dates, times and bytes report</name><value>site_user_time_date</value></option>
+ <option><name>downloads - downloads per user report</name><value>downloads</value></option>
+ </options>
+ <multiple/>
+ <size>10</size>
+ </field>
+ <field>
+ <name>User Settings</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>User Sort Field</fielddescr>
+ <fieldname>user_sort_field</fieldname>
+ <description><![CDATA[Sort field for the User Report.]]></description>
+ <type>select</type>
+ <options>
+ <option><name>BYTES(default)</name><value>BYTES</value></option>
+ <option><name>SITE normal</name><value>SITE</value></option>
+ <option><name>CONNECT</name><value>CONNECT</value></option>
+ <option><name>TIME</name><value>TIME</value></option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Exclude users</fielddescr>
+ <fieldname>exclude_userlist</fieldname>
+ <description><![CDATA[Users within the file will be excluded from reports.<br>
+ You can use indexonly to have only index.html file.<br>
+ <strong>Format: one user per line.</strong>]]></description>
+ <type>textarea</type>
+ <cols>70</cols>
+ <rows>10</rows>
+ <encoding>base64</encoding>
+ </field>
+ <field>
+ <fielddescr>Include users</fielddescr>
+ <fieldname>include_userlist</fieldname>
+ <description><![CDATA[Reports will be generated only for listed users.<br>
+ <strong>Format: user1:user2:...:usern</strong>]]></description>
+ <type>input</type>
+ <size>70</size>
+ </field>
+ <field>
+ <fielddescr>Users association</fielddescr>
+ <fieldname>usertab</fieldname>
+ <description><![CDATA[You can change the "userid" or the "ip address" to be a real user name on the reports.<br>
+ If resolve_ip is active, the ip address is resolved before being looked up into this file.<br>
+ That is, if you want to map the ip address, be sure to set resolv_ip to no or the resolved name will be looked into the file instead of the ip address.<br>
+ Note that it can be used to resolve any ip address known to the dns and then map the unresolved ip addresses to a name found in the usertab file.<br>
+ <strong>Table syntax: userid name or ip address name</strong><br>
+ Eg:<br>SirIsaac Isaac Newton<br>
+ vinci Leonardo da Vinci<br>
+ 192.168.10.1 Karol Wojtyla]]></description>
+ <type>textarea</type>
+ <cols>70</cols>
+ <rows>10</rows>
+ <encoding>base64</encoding>
+ </field>
+
+ </fields>
+ <custom_php_install_command>
+ sarg_php_install_command();
+ </custom_php_install_command>
+ <custom_php_deinstall_command>
+ sarg_php_deinstall_command();
+ </custom_php_deinstall_command>
+ <custom_php_validation_command>
+ sarg_validate_input($_POST, &amp;$input_errors);
+ </custom_php_validation_command>
+ <custom_php_resync_config_command>
+ sync_package_sarg();
+ </custom_php_resync_config_command>
+</packagegui>
diff --git a/config/sarg/sarg_about.php b/config/sarg/sarg_about.php
new file mode 100755
index 00000000..81a4fa8b
--- /dev/null
+++ b/config/sarg/sarg_about.php
@@ -0,0 +1,110 @@
+<?php
+/*
+ sarg_about.php
+ part of pfSense (http://www.pfsense.com/)
+ Copyright (C) 2012 Marcello Coutinho <marcellocoutinho@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 = "About: Sarg Package";
+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 ($input_errors) print_input_errors($input_errors); ?>
+<?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("Settings"), false, "/pkg_edit.php?xml=sarg.xml&id=0");
+ $tab_array[] = array(gettext("Schedule"), false, "/pkg.php?xml=sarg_schedule.xml");
+ $tab_array[] = array(gettext("View Report"), false, "/sarg-reports/");
+ $tab_array[] = array(gettext("Realtime"), false, "/sarg_realtime.php");
+ $tab_array[] = array(gettext("XMLRPC Sync"), false, "/pkg_edit.php?xml=sarg_sync.xml&id=0");
+ $tab_array[] = array(gettext("Help"), true, "/sarg_about.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="8" cellspacing="0">
+ <tr><td></td></tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Help docs"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Copyright");?></td>
+ <td width="78%" class="vtable"><?=gettext("<a target=_new href='http://dansguardian.org/?page=copyright2'>Copyright and licensing for Dansguardian 2</a><br><br>");?>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Blacklists");?></td>
+ <td width="78%" class="vtable"><?=gettext("<a target=_new href='http://www.squidguard.org/blacklists.html'>Dansguardian Blacklists</a><br><br>");?>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Whatis");?></td>
+ <td width="78%" class="vtable"><?=gettext("<a target=_new href='http://dansguardian.org/?page=whatisdg'>What is Dansguardian</a><br><br>");?>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("About sarg package"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Credits ");?></td>
+ <td width="78%" class="vtable"><?=gettext("Package Created by <a target=_new href='http://forum.pfsense.org/index.php?action=profile;u=4710'>Marcello Coutinho</a><br><br>");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Donatios ");?></td>
+ <td width="78%" class="vtable"><?=gettext("If you like this package, please <a target=_new href='http://www.pfsense.org/index.php?option=com_content&task=view&id=47&Itemid=77'>donate to pfSense project</a>.<br><br>
+ If you want that your donation goes to this package developer, make a note on donation forwarding it to me.<br><br>");?></td>
+ </tr>
+ </table>
+
+ </div>
+ </td>
+ </tr>
+
+
+ </table>
+ <br>
+ <div id="search_results"></div>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/config/sarg/sarg_realtime.php b/config/sarg/sarg_realtime.php
new file mode 100755
index 00000000..f585889b
--- /dev/null
+++ b/config/sarg/sarg_realtime.php
@@ -0,0 +1,244 @@
+<?php
+/*
+ postfix_view_config.php
+ part of pfSense (http://www.pfsense.com/)
+ Copyright (C) 2011 Marcello Coutinho <marcellocoutinho@gmail.com>
+ based on varnish_view_config.
+ 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");
+function get_cmd(){
+ global $config,$g;
+ #print $_REQUEST['type'];
+ if ($_REQUEST['cmd'] =='sarg'){
+ $update_config=0;
+ #Check report xml info
+ if (!is_array($config['installedpackages']['sargrealtime'])){
+ $config['installedpackages']['sargrealtime']['config'][0]['realtime_types']= "";
+ $config['installedpackages']['sargrealtime']['config'][0]['realtime_users']= "";
+ }
+ #Check report http actions to show
+ if ($config['installedpackages']['sargrealtime']['config'][0]['realtime_types'] != $_REQUEST['qshape']){
+ $config['installedpackages']['sargrealtime']['config'][0]['realtime_types']= $_REQUEST['qshape'];
+ $update_config++;
+ }
+
+ #Check report users show
+ if ($config['installedpackages']['sargrealtime']['config'][0]['realtime_users'] != $_REQUEST['type']){
+ $config['installedpackages']['sargrealtime']['config'][0]['realtime_users']= $_REQUEST['type'];
+ $update_config++;
+ }
+
+ if($update_config > 0){
+ write_config();
+ #write changes to sarg_file
+ $sarg_config=file_get_contents('/usr/local/etc/sarg/sarg.conf');
+ $pattern[0]='/realtime_types\s+[A-Z,,]+/';
+ $replace[0]="realtime_types ".$_REQUEST['qshape'];
+ $pattern[1]='/realtime_unauthenticated_records\s+\w+/';
+ $replace[1]="realtime_unauthenticated_records ".$_REQUEST['type'];
+ file_put_contents('/usr/local/etc/sarg/sarg.conf', preg_replace($pattern,$replace,$sarg_config),LOCK_EX);
+ }
+ exec("/usr/local/bin/sarg -r", $sarg);
+ $pattern[0]="/<?(html|head|style)>/";
+ $replace[0]="";
+ $pattern[1]="/header_\w/";
+ $replace[1]="listtopic";
+ $pattern[2]="/class=.data./";
+ $replace[2]='class="listlr"';
+ $pattern[3]="/cellpadding=.\d./";
+ $replace[3]='cellpadding="0"';
+ $pattern[4]="/cellspacing=.\d./";
+ $replace[4]='cellspacing="0"';
+ $pattern[5]="/sarg/";
+ $replace[5]='cellspacing="0"';
+
+ foreach ($sarg as $line){
+ if (preg_match("/<.head>/",$line))
+ $print ="ok";
+ if ($print =="ok" && !preg_match("/(sarg realtime|Auto Refresh)/i",$line))
+ print preg_replace($pattern,$replace,$line);
+ }
+ }
+}
+
+if ($_REQUEST['cmd']!=""){
+ get_cmd();
+ }
+else{
+ $pfSversion = str_replace("\n", "", file_get_contents("/etc/version"));
+ if(strstr($pfSversion, "1.2"))
+ $one_two = true;
+
+ $pgtitle = "Status: Postfix Mail Queue";
+ 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="postfix_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("Settings"), false, "/pkg_edit.php?xml=sarg.xml&id=0");
+ $tab_array[] = array(gettext("Schedule"), false, "/pkg.php?xml=sarg_schedule.xml");
+ $tab_array[] = array(gettext("View Report"), false, "/sarg-reports/");
+ $tab_array[] = array(gettext("Realtime"), true, "/sarg_realtime.php");
+ $tab_array[] = array(gettext("XMLRPC Sync"), false, "/pkg_edit.php?xml=sarg_sync.xml&id=0");
+ $tab_array[] = array(gettext("Help"), false, "/sarg_about.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="8" cellspacing="0">
+ <tr><td></td></tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Postfix Queue"); ?></td></tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Log command: ");?></td>
+ <td width="78%" class="vtable">
+ <select name="drop3" id="cmd">
+ <option value="sarg" selected="selected">Sarg Realtime</option>
+ </select><br><?=gettext("Select queue command to run.");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("update frequency: ");?></td>
+ <td width="78%" class="vtable">
+ <select name="drop3" id="updatef">
+ <option value="1">01 second</option>
+ <option value="3" selected="selected">03 seconds</option>
+ <option value="5">05 seconds</option>
+ <option value="15">15 Seconds</option>
+ <option value="30">30 Seconds</option>
+ <option value="60">One minute</option>
+ <option value="1">Never</option>
+ </select><br><?=gettext("Select how often queue cmd will run.");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Report Types: ");?></td>
+ <td width="78%" class="vtable">
+ <select name="drop3" id="qshape" multiple="multiple" size="5">
+ <option value="GET" selected="selected">GET</option>
+ <option value="PUT" selected="selected">PUT</option>
+ <option value="CONNECT" selected="selected">CONNECT</option>
+ <option value="ICP_QUERY">ICP_QUERY</option>
+ <option value="POST">POST</option>
+ </select><br><?=gettext("Which records must be in realtime report.");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("unauthenticated_records: ");?></td>
+ <td width="78%" class="vtable">
+ <select name="drop3" id="qtype">
+ <option value="show" selected>show</option>
+ <option value="hide">hide</option>
+ </select><br><?=gettext("What to do with unauthenticated records in realtime report.");?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top"></td>
+ <td width="78%"><input name="Submit" type="button" class="formbtn" id="run" value="<?=gettext("show log");?>" onclick="get_queue('mailq')"><div id="search_help"></div></td>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <div>
+ <table class="tabcont" width="100%" border="0" cellpadding="8" cellspacing="0">
+ <tr>
+ <td class="tabcont" >
+ <div id="file_div"></div>
+
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </form>
+ <script type="text/javascript">
+ function loopSelected(id)
+ {
+ var selectedArray = new Array();
+ var selObj = document.getElementById(id);
+ var i;
+ var count = 0;
+ for (i=0; i<selObj.options.length; i++) {
+ if (selObj.options[i].selected) {
+ selectedArray[count] = selObj.options[i].value;
+ count++;
+ }
+ }
+ return(selectedArray);
+ }
+
+ function get_queue(loop) {
+ //prevent multiple instances
+ if ($('run').value=="show log" || loop== 'running'){
+ $('run').value="running...";
+ $('search_help').innerHTML ="<br><strong>You can change options while running.<br>To Stop seach, change update frequency to Never.</strong>";
+ var q_args=loopSelected('qshape');
+ var pars = 'cmd='+$('cmd').options[$('cmd').selectedIndex].value;
+ var pars = pars + '&qshape='+q_args;
+ var pars = pars + '&type='+$('qtype').options[$('qtype').selectedIndex].value;
+ var url = "/sarg_queue.php";
+ var myAjax = new Ajax.Request(
+ url,
+ {
+ method: 'post',
+ parameters: pars,
+ onComplete: activitycallback_queue_file
+ });
+ }
+ }
+ function activitycallback_queue_file(transport) {
+ $('file_div').innerHTML = transport.responseText;
+ var update=$('updatef').options[$('updatef').selectedIndex].value * 1000;
+ if (update > 999){
+ setTimeout('get_queue("running")', update);
+ }
+ else{
+ $('run').value="show log";
+ $('search_help').innerHTML ="";
+ }
+ }
+ </script>
+ <?php
+ include("fend.inc");
+ }
+ ?>
+ </body>
+ </html>
diff --git a/config/sarg/sarg_schedule.xml b/config/sarg/sarg_schedule.xml
new file mode 100644
index 00000000..b2a6ccc1
--- /dev/null
+++ b/config/sarg/sarg_schedule.xml
@@ -0,0 +1,171 @@
+<?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[
+/* ========================================================================== */
+/*
+ sarg_schedule.xml
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2012 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>sargschedule</name>
+ <version>0.5</version>
+ <title>sarg</title>
+ <include_file>/usr/local/pkg/sarg.inc</include_file>
+ <additional_files_needed>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ <item>http://www.pfsense.com/packages/config/sarg/sarg.inc</item>
+ </additional_files_needed>
+ <additional_files_needed>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ <item>http://www.pfsense.com/packages/config/sarg/sarg_sync.xml</item>
+ </additional_files_needed>
+ <menu>
+ <name>sarg</name>
+ <tooltiptext>sarg</tooltiptext>
+ <section>Diagnostics</section>
+ <configfile>sarg.xml</configfile>
+ </menu>
+ <tabs>
+ <tab>
+ <text>Settings</text>
+ <url>/pkg_edit.php?xml=sarg.xml&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>Schedule</text>
+ <url>/pkg.php?xml=sarg_schedule.xml&amp;id=0</url>
+ <active/>
+ </tab>
+ <tab>
+ <text>View Report</text>
+ <url>/sarg-reports/</url>
+ </tab>
+ <tab>
+ <text>Realtime</text>
+ <url>/sarg_realtime.php</url>
+ </tab>
+ <tab>
+ <text>XMLRPC Sync</text>
+ <url>/pkg_edit.php?xml=sarg_sync.xml&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>Help</text>
+ <url>/sarg_about.php</url>
+ </tab>
+ </tabs>
+ <adddeleteeditpagefields>
+ <columnitem>
+ <fielddescr>Status</fielddescr>
+ <fieldname>enable</fieldname>
+ </columnitem>
+ <columnitem>
+ <fielddescr>Update Frequency</fielddescr>
+ <fieldname>frequency</fieldname>
+ </columnitem>
+ <columnitem>
+ <fielddescr>args</fielddescr>
+ <fieldname>mod</fieldname>
+ </columnitem>
+ <columnitem>
+ <fielddescr>Description</fielddescr>
+ <fieldname>description</fieldname>
+ </columnitem>
+ </adddeleteeditpagefields>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <fieldname>temp</fieldname>
+ <name>Schedule Options</name>
+ </field>
+ <field>
+ <fielddescr>Enable</fielddescr>
+ <fieldname>enable</fieldname>
+ <type>checkbox</type>
+ <description>Enable this schedule</description>
+ </field>
+ <field>
+ <fielddescr>Description</fielddescr>
+ <fieldname>description</fieldname>
+ <description>Enter a description for this file.</description>
+ <type>input</type>
+ <size>60</size>
+ </field>
+ <field>
+ <fielddescr>Sarg args</fielddescr>
+ <fieldname>args</fieldname>
+ <description>Enter sarg extra args to run on this schedule.</description>
+ <type>input</type>
+ <size>25</size>
+ </field>
+ <field>
+ <fielddescr>frequency</fielddescr>
+ <fieldname>frequency</fieldname>
+ <type>input</type>
+ <size>10</size>
+ <description><![CDATA[How often extract users from active directory and verify changes<br>
+ Valid options are minutes(m), hours(h), days(d)<br>
+ Sample: To update every hour, use 1h<br><br>]]>&lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;Force udpate now&quot;&gt;&lt;br&gt;</description>
+ <required/>
+ </field>
+ <field>
+ <fielddescr>Action after sarg</fielddescr>
+ <fieldname>action</fieldname>
+ <type>select</type>
+ <options>
+ <option><name>None(default)</name><value>none</value></option>
+ <option><name>rotate logs</name><value>rotate</value></option>
+ <option><name>Restart proxy daemon</name><value>restart</value></option>
+ <option><name>Rotate log and restart proxy daemon</name><value>both</value></option>
+ </options>
+ <description>Choose an action after sarg finishes</description>
+ </field>
+ </fields>
+ <custom_php_install_command>
+ sarg_install();
+ </custom_php_install_command>
+ <custom_php_command_before_form>
+ </custom_php_command_before_form>
+ <custom_php_validation_command>
+ sarg_validate_input($_POST, &amp;$input_errors);
+ </custom_php_validation_command>
+ <custom_delete_php_command>
+ sync_package_sarg();
+ </custom_delete_php_command>
+ <custom_php_resync_config_command>
+ sarg_resync();
+ </custom_php_resync_config_command>
+</packagegui> \ No newline at end of file
diff --git a/config/sarg/sarg_sync.xml b/config/sarg/sarg_sync.xml
new file mode 100755
index 00000000..5e744e58
--- /dev/null
+++ b/config/sarg/sarg_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[
+/* $Id$ */
+/* ========================================================================== */
+/*
+ sarg_sync.xml
+ part of the sarg package for pfSense
+ Copyright (C) 2012 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>sargsync</name>
+ <version>1.0</version>
+ <title>Services: sarg</title>
+ <include_file>/usr/local/pkg/sarg.inc</include_file>
+ <tabs>
+ <tab>
+ <text>Settings</text>
+ <url>/pkg_edit.php?xml=sarg.xml&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>Schedule</text>
+ <url>/pkg.php?xml=sarg_schedule.xml&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>View Report</text>
+ <url>/sarg-reports/</url>
+ </tab>
+ <tab>
+ <text>Realtime</text>
+ <url>/sarg_realtime.php</url>
+ </tab>
+ <tab>
+ <text>XMLRPC Sync</text>
+ <url>/pkg_edit.php?xml=sarg_sync.xml&amp;id=0</url>
+ <active/>
+ </tab>
+ <tab>
+ <text>Help</text>
+ <url>/sarg_about.php</url>
+ </tab>
+</tabs>
+ <fields>
+ <field>
+ <name>XMLRPC Sync</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>Automatically sync sarg 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_install_command>
+ sarg_php_install_command();
+ </custom_php_install_command>
+ <custom_php_deinstall_command>
+ sarg_php_deinstall_command();
+ </custom_php_deinstall_command>
+ <custom_php_validation_command>
+ sarg_validate_input($_POST, &amp;$input_errors);
+ </custom_php_validation_command>
+ <custom_php_resync_config_command>
+ sarg_resync();
+ </custom_php_resync_config_command>
+</packagegui>