127.0.0.1 port 16667\n"; } function imspector_pf_rule($iface, $port) { return "pass in quick on {$iface} inet proto tcp from any to any port {$port} keep state\n"; } function imspector_proto_to_port ($proto) { switch ($proto) { case "msn": return 1863; case "icqaim": return 5190; case "yahoo": return 5050; case "irc": return 6667; default: return NULL; } } function imspector_remove_rules() { $anchor = "imspector"; exec("/sbin/pfctl -a " . $anchor . " -Fr"); exec("/sbin/pfctl -a " . $anchor . " -Fn"); } function before_form_imspector($pkg) { global $config; } function validate_form_imspector($post, $input_errors) { } function sync_package_imspector() { global $config; global $input_errors; $configfile = "/usr/local/etc/imspector.conf"; $proto=""; $pf_rules=""; imspector_notice("Syncing package"); imspector_remove_rules(); conf_mount_rw(); config_lock(); if(imspector_config("proto_msn")) $proto .= "msn,"; if(imspector_config("proto_icqaim")) $proto .= "icqaim,"; if(imspector_config("proto_yahoo")) $proto .= "yahoo,"; if(imspector_config("proto_irc")) $proto .= "irc,"; if($proto != "") $proto_array = explode(",",$proto); if(imspector_config("iface_array")) $iface_array = explode(",",imspector_config("iface_array")); if($iface_array && $proto_array) { for($i=1;$i<=2;$i++) { foreach($iface_array as $iface) { $if = convert_friendly_interface_to_real_interface_name($iface); /* above function returns iface if fail */ if($if!=$iface) { $addr = find_interface_ip($if); /* non enabled interfaces are displayed in list on imspector settings page */ /* check that the interface has an ip address before adding parameters */ if($addr) { foreach($proto_array as $proto) { if($i==1 && imspector_proto_to_port($proto)) $pf_rules .= imspector_pf_rdr($if,imspector_proto_to_port($proto)); elseif ($i==2 && imspector_proto_to_port($proto)) $pf_rules .= imspector_pf_rule($if,imspector_proto_to_port($proto)); } } } } } if($pf_rules != "") { exec("echo \"{$pf_rules}\" | /sbin/pfctl -a imspector -f -"); $configtext = "plugin_dir=/usr/local/lib/imspector\n"; if(imspector_config("log_file")) $configtext .= "file_logging_dir=/var/log/imspector\n"; write_imspector_config($configfile,$configtext); $stop = << "imspector.sh", "start" => $start, "stop" => $stop ) ); } if((int)exec("pgrep imspector | wc -l") == 0 || $_POST['iface_array']) { imspector_notice("Starting service"); if(imspector_config("log_file")) exec("mkdir -p /var/log/imspector"); start_service("imspector"); } } if(!$iface_array || !$proto_array || $pf_rules = "") { /* no parameters user does not want imspector running */ /* lets stop the service and remove the rc file */ stop_service("imspector"); imspector_warn("No interfaces and/or protocols stopping service"); exec("rm -f /usr/local/etc/rc.d/imspector*"); exec("rm -f {$configfile}"); } config_unlock(); conf_mount_ro(); } ?>