diff --git a/doc/ChangeLog b/doc/ChangeLog index 79d3a2a93..30740becc 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,12 @@ +2008-05-22 Vadim Kurland + + * ipt.cpp (main): Poliucy compiler for iptables supports + IPv6. Added command line switches "-4" and "-6" which force + compiler to generate script for only one specified address + family (by default it does both). Compiler can generate simple + ipv6 iptables script. Generated script still can be improved but + seems to be formally correct at this time. + 2008-05-18 Vadim Kurland * OSConfigurator_linux24.cpp: compiler for iptables converted to diff --git a/doc/fwb_ipt.1 b/doc/fwb_ipt.1 index fe0bc172a..16ddce8dc 100644 --- a/doc/fwb_ipt.1 +++ b/doc/fwb_ipt.1 @@ -24,6 +24,20 @@ The data file and the name of the firewall objects must be specified on the command line. Other command line parameters are optional. .SH OPTIONS + +.IP "-4" +Generate iptables script for IPv4 part of the policy. If any rules of +the firewall refer to IPv6 addresses, compiler will skip these rules. +Options "-4" and "-6" are exclusive. If neither option is used, compiler +tries to generate both parts of the script, although generation of +the IPv6 part is controlled by the option "Enable IPv6 support" +in the "IPv6" tab of the firewall object advanced settings dialog. +This option is off by default. + +.IP "-6" +Generate iptables script for IPv6 part of the policy. If any rules of +the firewall refer to IPv6 addresses, compiler will skip these rules. + .IP "-f FILE" Specify the name of the data file to be processed. diff --git a/src/cisco_lib/PolicyCompiler_cisco.cpp b/src/cisco_lib/PolicyCompiler_cisco.cpp index 4c58cc6db..213795d55 100644 --- a/src/cisco_lib/PolicyCompiler_cisco.cpp +++ b/src/cisco_lib/PolicyCompiler_cisco.cpp @@ -62,8 +62,9 @@ string PolicyCompiler_cisco::myPlatformName() { return ""; } PolicyCompiler_cisco::PolicyCompiler_cisco(FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, OSConfigurator *_oscnf) : - PolicyCompiler(_db,fwname,_oscnf) , helper(this) + PolicyCompiler(_db, fwname, ipv6_policy, _oscnf) , helper(this) { } diff --git a/src/cisco_lib/PolicyCompiler_cisco.h b/src/cisco_lib/PolicyCompiler_cisco.h index 3fb30b481..a2b2e7add 100644 --- a/src/cisco_lib/PolicyCompiler_cisco.h +++ b/src/cisco_lib/PolicyCompiler_cisco.h @@ -434,8 +434,9 @@ protected: public: PolicyCompiler_cisco(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf); + const std::string &fwname, + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf); virtual ~PolicyCompiler_cisco() {} virtual std::string createRuleLabel(const std::string &txt, diff --git a/src/gui/ProjectPanel.cpp b/src/gui/ProjectPanel.cpp index 2a12755ac..99c848a08 100644 --- a/src/gui/ProjectPanel.cpp +++ b/src/gui/ProjectPanel.cpp @@ -1958,11 +1958,6 @@ void ProjectPanel::load(QWidget *dialogs_parent) if (fwbdebug) qDebug("ProjectPanel::load(): create RCS"); createRCS(""); -/* - * TODO: we should create new FWObjectDatabase object and assign db - * instead of using singleton - */ -// objdb = FWObjectDatabase::db; setWindowTitle( "Firewall Builder" ); @@ -1992,7 +1987,7 @@ void ProjectPanel::load(QWidget *dialogs_parent) } -void ProjectPanel::load(QWidget *dialogs_parent,RCS *_rcs) +void ProjectPanel::load(QWidget *dialogs_parent, RCS *_rcs) { QStatusBar *sb = mainW->statusBar(); @@ -2039,17 +2034,18 @@ void ProjectPanel::load(QWidget *dialogs_parent,RCS *_rcs) sb->showMessage( tr("Reading and parsing data file...") ); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - //QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput,100); FWObjectDatabase *ndb = new FWObjectDatabase(); - ndb->load(rcs->getFileName().toLatin1().constData(), &upgrade_predicate,librespath); - time_t oldtimestamp = ndb->getTimeLastModified(); + ndb->load(rcs->getFileName().toLatin1().constData(), + &upgrade_predicate,librespath); + time_t oldtimestamp = ndb->getTimeLastModified(); sb->clearMessage(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); /* loadingLib is true if user wants to open a library or master library file */ - bool loadingLib = editingLibrary(); + + bool loadingLib = editingLibrary(); if (fwbdebug) { @@ -2109,8 +2105,8 @@ void ProjectPanel::load(QWidget *dialogs_parent,RCS *_rcs) } sb->showMessage( tr("Merging with system objects...") ); - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 100); - //QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput,100); + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, + 100); MergeConflictRes mcr(dlgp); objdb->merge(ndb, &mcr); diff --git a/src/iosacl/OSConfigurator_ios.h b/src/iosacl/OSConfigurator_ios.h index 186477330..c3ffce9f4 100644 --- a/src/iosacl/OSConfigurator_ios.h +++ b/src/iosacl/OSConfigurator_ios.h @@ -44,8 +44,10 @@ namespace fwcompiler { public: virtual ~OSConfigurator_ios() {}; - OSConfigurator_ios(libfwbuilder::FWObjectDatabase *_db,const std::string &fwname) : - OSConfigurator(_db,fwname) {} + OSConfigurator_ios(libfwbuilder::FWObjectDatabase *_db, + const std::string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) {} virtual int prolog(); diff --git a/src/iosacl/PolicyCompiler_iosacl.cpp b/src/iosacl/PolicyCompiler_iosacl.cpp index 29926846a..086871eea 100644 --- a/src/iosacl/PolicyCompiler_iosacl.cpp +++ b/src/iosacl/PolicyCompiler_iosacl.cpp @@ -62,8 +62,9 @@ string PolicyCompiler_iosacl::myPlatformName() { return "iosacl"; } PolicyCompiler_iosacl::PolicyCompiler_iosacl(FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, OSConfigurator *_oscnf) : - PolicyCompiler_cisco(_db,fwname,_oscnf) + PolicyCompiler_cisco(_db, fwname, ipv6_policy, _oscnf) { resetinbound=false; fragguard=false; diff --git a/src/iosacl/PolicyCompiler_iosacl.h b/src/iosacl/PolicyCompiler_iosacl.h index 4c66476fd..0613e97b8 100644 --- a/src/iosacl/PolicyCompiler_iosacl.h +++ b/src/iosacl/PolicyCompiler_iosacl.h @@ -251,7 +251,8 @@ namespace fwcompiler { public: PolicyCompiler_iosacl(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname, + const std::string &fwname, + bool ipv6_policy, fwcompiler::OSConfigurator *_oscnf); virtual ~PolicyCompiler_iosacl() {} diff --git a/src/iosacl/iosacl.cpp b/src/iosacl/iosacl.cpp index 6b85b96ae..d0b927565 100644 --- a/src/iosacl/iosacl.cpp +++ b/src/iosacl/iosacl.cpp @@ -318,14 +318,14 @@ int main(int argc, char * const * argv) if (user_name==NULL) throw FWException("Can't figure out your user name, aborting"); - Preprocessor* prep=new Preprocessor(objdb , fwobjectname); + Preprocessor* prep=new Preprocessor(objdb , fwobjectname, false); prep->compile(); /* * Process firewall options, build OS network configuration script */ OSConfigurator *oscnf=NULL; - oscnf=new OSConfigurator_ios(objdb , fwobjectname); + oscnf=new OSConfigurator_ios(objdb , fwobjectname, false); oscnf->prolog(); oscnf->processFirewallOptions(); @@ -334,6 +334,7 @@ int main(int argc, char * const * argv) PolicyCompiler_iosacl *c = new PolicyCompiler_iosacl(objdb, fwobjectname, + false, oscnf); if (test_mode) c->setTestMode(); diff --git a/src/ipf/ipf.cpp b/src/ipf/ipf.cpp index 49569e21e..f7c3a211f 100644 --- a/src/ipf/ipf.cpp +++ b/src/ipf/ipf.cpp @@ -344,7 +344,7 @@ int main(int argc, char * const *argv) string shell_dbg=(debug)?"-x":"" ; string ipf_dbg=(debug)?"-v":""; - Preprocessor* prep=new Preprocessor(objdb , fwobjectname); + Preprocessor* prep=new Preprocessor(objdb , fwobjectname, false); prep->compile(); /* @@ -353,13 +353,13 @@ int main(int argc, char * const *argv) OSConfigurator *oscnf=NULL; string family=Resources::os_res[fw->getStr("host_OS")]->Resources::getResourceStr("/FWBuilderResources/Target/family"); if ( family=="solaris" ) - oscnf=new OSConfigurator_solaris(objdb , fwobjectname); + oscnf=new OSConfigurator_solaris(objdb , fwobjectname, false); if ( family=="openbsd") - oscnf=new OSConfigurator_openbsd(objdb , fwobjectname); + oscnf=new OSConfigurator_openbsd(objdb , fwobjectname, false); if ( family=="freebsd") - oscnf=new OSConfigurator_freebsd(objdb , fwobjectname); + oscnf=new OSConfigurator_freebsd(objdb , fwobjectname, false); if (oscnf==NULL) throw FWException(_("Unrecognized host OS ")+fw->getStr("host_OS")+" (family "+family+")"); @@ -369,7 +369,7 @@ int main(int argc, char * const *argv) /* * create compilers and run the whole thing */ - PolicyCompiler_ipf c( objdb , fwobjectname , oscnf ); + PolicyCompiler_ipf c( objdb , fwobjectname, false , oscnf ); c.setDebugLevel( dl ); c.setDebugRule( drp ); @@ -384,7 +384,7 @@ int main(int argc, char * const *argv) } - NATCompiler_ipf n( objdb , fwobjectname , oscnf ); + NATCompiler_ipf n( objdb , fwobjectname, false , oscnf ); n.setDebugLevel( dl ); n.setDebugRule( drn ); diff --git a/src/ipfw/ipfw.cpp b/src/ipfw/ipfw.cpp index f319aeb4c..29bb125d5 100644 --- a/src/ipfw/ipfw.cpp +++ b/src/ipfw/ipfw.cpp @@ -309,7 +309,7 @@ int main(int argc, char * const *argv) bool debug=options->getBool("debug"); string shell_dbg=(debug)?"-x":"" ; - Preprocessor* prep=new Preprocessor(objdb , fwobjectname); + Preprocessor* prep=new Preprocessor(objdb , fwobjectname, false); prep->compile(); /* @@ -318,10 +318,10 @@ int main(int argc, char * const *argv) OSConfigurator *oscnf=NULL; string family=Resources::os_res[fw->getStr("host_OS")]->Resources::getResourceStr("/FWBuilderResources/Target/family"); if ( family=="macosx") - oscnf=new OSConfigurator_macosx(objdb , fwobjectname); + oscnf=new OSConfigurator_macosx(objdb , fwobjectname, false); if ( family=="freebsd") - oscnf=new OSConfigurator_freebsd(objdb , fwobjectname); + oscnf=new OSConfigurator_freebsd(objdb , fwobjectname, false); if (oscnf==NULL) throw FWException(_("Unrecognized host OS ")+fw->getStr("host_OS")+" (family "+family+")"); @@ -330,7 +330,7 @@ int main(int argc, char * const *argv) /* * create compilers and run the whole thing */ - PolicyCompiler_ipfw c( objdb , fwobjectname , oscnf ); + PolicyCompiler_ipfw c( objdb , fwobjectname, false , oscnf ); c.setDebugLevel( dl ); c.setDebugRule( drp ); diff --git a/src/ipt/MangleTableCompiler_ipt.h b/src/ipt/MangleTableCompiler_ipt.h index bb29d5150..13c04e308 100644 --- a/src/ipt/MangleTableCompiler_ipt.h +++ b/src/ipt/MangleTableCompiler_ipt.h @@ -45,8 +45,10 @@ namespace fwcompiler { public: MangleTableCompiler_ipt(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : PolicyCompiler_ipt(_db,fwname,_oscnf) + const std::string &fwname, + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + PolicyCompiler_ipt(_db, fwname, ipv6_policy, _oscnf) { my_table = "mangle"; } diff --git a/src/ipt/NATCompiler_ipt.cpp b/src/ipt/NATCompiler_ipt.cpp index 8e26d8252..1ff73b126 100644 --- a/src/ipt/NATCompiler_ipt.cpp +++ b/src/ipt/NATCompiler_ipt.cpp @@ -2101,7 +2101,9 @@ void NATCompiler_ipt::compile() { // FWOptions* options=fw->getOptionsObject(); - cout << _(" Compiling rules for 'nat' table ...") << endl << flush; + cout << " Compiling rules for 'nat' table"; + if (ipv6) cout << ", IPv6"; + cout << endl << flush; try { @@ -2183,6 +2185,13 @@ void NATCompiler_ipt::compile() add( new splitOnDynamicInterfaceInTSrc("split rule if TSrc is dynamic interface" ) ); add( new ExpandMultipleAddresses("expand multiple addresses") ); + add( new dropRuleWithEmptyRE("drop rules with empty rule elements")); + + if (ipv6) + add( new DropIPv4Rules("drop ipv4 rules")); + else + add( new DropIPv6Rules("drop ipv6 rules")); + add( new dropRuleWithEmptyRE("drop rules with empty rule elements")); add( new specialCaseWithUnnumberedInterface("check for special cases with dynamic and unnumbered interfaces" ) ); add( new checkForDynamicInterfacesOfOtherObjects( "check for dynamic interfaces of other hosts and firewalls" ) ); @@ -2209,8 +2218,6 @@ void NATCompiler_ipt::compile() add( new dynamicInterfaceInTSrc("set target if dynamic interface in TSrc" ) ); add( new convertInterfaceIdToStr("prepare interface assignments") ); - add( new CheckIfIPv6Rule("find ipv6 rules")); - if (fwopt->getBool("use_iptables_restore")) { // bug #1812295: we should use PrintRuleIptRstEcho not only diff --git a/src/ipt/NATCompiler_ipt.h b/src/ipt/NATCompiler_ipt.h index 4e9f4ffd6..4bf605089 100644 --- a/src/ipt/NATCompiler_ipt.h +++ b/src/ipt/NATCompiler_ipt.h @@ -511,9 +511,14 @@ namespace fwcompiler { public: NATCompiler_ipt(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : NATCompiler(_db,fwname,_oscnf) - {have_dynamic_interfaces=false; printRule=NULL;} + const std::string &fwname, + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + NATCompiler(_db, fwname, ipv6_policy, _oscnf) + { + have_dynamic_interfaces=false; + printRule=NULL; + } virtual int prolog(); diff --git a/src/ipt/OSConfigurator_linux24.cpp b/src/ipt/OSConfigurator_linux24.cpp index 4046abb79..d9221d68b 100644 --- a/src/ipt/OSConfigurator_linux24.cpp +++ b/src/ipt/OSConfigurator_linux24.cpp @@ -61,8 +61,9 @@ using namespace std; string OSConfigurator_linux24::myPlatformName() { return "Linux24"; } OSConfigurator_linux24::OSConfigurator_linux24(FWObjectDatabase *_db, - const string &fwname) : - OSConfigurator(_db,fwname) , os_data(fw->getStr("host_OS")) + const string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) , os_data(fw->getStr("host_OS")) { } @@ -587,7 +588,7 @@ string OSConfigurator_linux24::printPathForAllTools(const string &os) FWOptions* options=fw->getOptionsObject(); string s, path_lsmod, path_modprobe, path_iptables, path_ip6tables; - string path_iptables_restore, path_ip, path_logger; + string path_iptables_restore, path_ip6tables_restore, path_ip, path_logger; s=options->getStr("linux24_path_lsmod"); if (!s.empty()) path_lsmod=s; @@ -609,6 +610,10 @@ string OSConfigurator_linux24::printPathForAllTools(const string &os) if (!s.empty()) path_iptables_restore=s; else path_iptables_restore=os_data.getPathForTool(os,OSData::IPTABLES_RESTORE); + s=options->getStr("linux24_path_ip6tables_restore"); + if (!s.empty()) path_ip6tables_restore=s; + else path_ip6tables_restore=os_data.getPathForTool(os,OSData::IP6TABLES_RESTORE); + s=options->getStr("linux24_path_ip"); if (!s.empty()) path_ip=s; else path_ip=os_data.getPathForTool(os,OSData::IP); diff --git a/src/ipt/OSConfigurator_linux24.h b/src/ipt/OSConfigurator_linux24.h index 36c88d17f..346d3b4f6 100644 --- a/src/ipt/OSConfigurator_linux24.h +++ b/src/ipt/OSConfigurator_linux24.h @@ -52,7 +52,7 @@ namespace fwcompiler { virtual ~OSConfigurator_linux24() {}; OSConfigurator_linux24(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname); + const std::string &fwname, bool ipv6_policy); virtual std::string myPlatformName(); diff --git a/src/ipt/OSData.cpp b/src/ipt/OSData.cpp index 4ab742b82..b7111d977 100644 --- a/src/ipt/OSData.cpp +++ b/src/ipt/OSData.cpp @@ -38,13 +38,14 @@ string OSData::getPathForTool(const string &distro,tools t) switch (t) { - case LSMOD: r+="path_lsmod"; break; - case MODPROBE: r+="path_modprobe"; break; - case IPTABLES: r+="path_iptables"; break; - case IP6TABLES: r+="path_ip6tables"; break; - case IPTABLES_RESTORE: r+="path_iptables_restore"; break; - case IP: r+="path_ip"; break; - case LOGGER: r+="path_logger"; break; + case LSMOD: r+="path_lsmod"; break; + case MODPROBE: r+="path_modprobe"; break; + case IPTABLES: r+="path_iptables"; break; + case IP6TABLES: r+="path_ip6tables"; break; + case IPTABLES_RESTORE: r+="path_iptables_restore"; break; + case IP6TABLES_RESTORE: r+="path_ip6tables_restore"; break; + case IP: r+="path_ip"; break; + case LOGGER: r+="path_logger"; break; } return Resources::os_res[host_os]->getResourceStr(r); } diff --git a/src/ipt/OSData.h b/src/ipt/OSData.h index 35a7dce9d..7f125c6ff 100644 --- a/src/ipt/OSData.h +++ b/src/ipt/OSData.h @@ -40,7 +40,14 @@ class OSData { OSData(const std::string &ho) { host_os=ho; } - typedef enum { LSMOD, MODPROBE, IPTABLES, IP6TABLES, IPTABLES_RESTORE, IP, LOGGER } tools; + typedef enum { LSMOD, + MODPROBE, + IPTABLES, + IP6TABLES, + IPTABLES_RESTORE, + IP6TABLES_RESTORE, + IP, + LOGGER } tools; std::string getPathForTool(const std::string &distro,tools t); }; diff --git a/src/ipt/PolicyCompiler_PrintRule.cpp b/src/ipt/PolicyCompiler_PrintRule.cpp index 11d8ee515..e3a0e7d43 100644 --- a/src/ipt/PolicyCompiler_PrintRule.cpp +++ b/src/ipt/PolicyCompiler_PrintRule.cpp @@ -79,15 +79,15 @@ using namespace std; /* * check and create new chain if needed */ -string PolicyCompiler_ipt::PrintRule::_createChain(const string &chain, - bool ipv6) +string PolicyCompiler_ipt::PrintRule::_createChain(const string &chain) { string res; - PolicyCompiler_ipt *ipt_comp=dynamic_cast(compiler); + PolicyCompiler_ipt *ipt_comp = dynamic_cast(compiler); if ( ! chains[chain] ) { - res = string((ipv6) ? "$IP6TABLES -N " : "$IPTABLES -N ") + chain; + res = string((ipt_comp->ipv6) ? "$IP6TABLES -N " : "$IPTABLES -N ") + + chain; if (ipt_comp->my_table != "filter") res += " -t " + ipt_comp->my_table; res += "\n"; chains[chain]=true; @@ -95,10 +95,10 @@ string PolicyCompiler_ipt::PrintRule::_createChain(const string &chain, return res; } -string PolicyCompiler_ipt::PrintRule::_startRuleLine(bool ipv6) +string PolicyCompiler_ipt::PrintRule::_startRuleLine() { - string res = (ipv6) ? "$IP6TABLES " : "$IPTABLES "; - PolicyCompiler_ipt *ipt_comp=dynamic_cast(compiler); + PolicyCompiler_ipt *ipt_comp = dynamic_cast(compiler); + string res = (ipt_comp->ipv6) ? "$IP6TABLES " : "$IPTABLES "; if (ipt_comp->my_table != "filter") res += "-t " + ipt_comp->my_table + " "; @@ -914,6 +914,14 @@ string PolicyCompiler_ipt::PrintRule::_printAddr(Address *o) const InetAddr *addr = o->getAddressPtr(); const InetAddr *mask = o->getNetmaskPtr(); + if (addr==NULL) + { + compiler->warning( + string("Empty inet address in object ") + + o->getId()); + return ostr.str(); + } + if (addr->isAny() && mask->isAny()) { ostr << "0/0 "; @@ -1064,6 +1072,7 @@ PolicyCompiler_ipt::PrintRule::PrintRule(const std::string &name) : PolicyRulePr bool PolicyCompiler_ipt::PrintRule::processNext() { + PolicyCompiler_ipt *ipt_comp=dynamic_cast(compiler); PolicyRule *rule =getNext(); if (rule==NULL) return false; @@ -1080,11 +1089,11 @@ bool PolicyCompiler_ipt::PrintRule::processNext() string PolicyCompiler_ipt::PrintRule::PolicyRuleToString(PolicyRule *rule) { + PolicyCompiler_ipt *ipt_comp=dynamic_cast(compiler); + FWOptions *ruleopt = rule->getOptionsObject(); FWObject *ref; - bool isIPv6 = rule->getBool("ipv6_rule"); - RuleElementSrc *srcrel=rule->getSrc(); ref=srcrel->front(); Address *src=Address::cast(FWReference::cast(ref)->getPointer()); @@ -1106,7 +1115,7 @@ string PolicyCompiler_ipt::PrintRule::PolicyRuleToString(PolicyRule *rule) std::ostringstream command_line; - command_line << _startRuleLine(isIPv6); + command_line << _startRuleLine(); command_line << _printChain(rule); command_line << _printDirectionAndInterface(rule); @@ -1212,12 +1221,12 @@ string PolicyCompiler_ipt::PrintRule::_declareTable() string PolicyCompiler_ipt::PrintRule::_flushAndSetDefaultPolicy() { -// PolicyCompiler_ipt *ipt_comp = dynamic_cast(compiler); + PolicyCompiler_ipt *ipt_comp = dynamic_cast(compiler); FWOptions *fwopt = compiler->getCachedFwOpt(); ostringstream res; -// if (ipt_comp->my_table=="filter") -// { + if (!ipt_comp->ipv6) + { res << "$IPTABLES -P OUTPUT DROP" << endl; res << "$IPTABLES -P INPUT DROP" << endl; res << "$IPTABLES -P FORWARD DROP" << endl; @@ -1237,32 +1246,31 @@ done\n"; res << endl; res << endl; + } + if (ipt_comp->ipv6) + { /* * test if ip6tables is installed and if it works. It may be installed * on the system but fail because ipv6 is not compiled into the * kernel. */ - res << "$IP6TABLES -L -n > /dev/null 2>&1 && {" << endl; - res << " $IP6TABLES -P OUTPUT DROP" << endl; - res << " $IP6TABLES -P INPUT DROP" << endl; - res << " $IP6TABLES -P FORWARD DROP" << endl; + res << "$IP6TABLES -P OUTPUT DROP" << endl; + res << "$IP6TABLES -P INPUT DROP" << endl; + res << "$IP6TABLES -P FORWARD DROP" << endl; res << "\n\ - cat /proc/net/ip6_tables_names | while read table; do\n\ - $IP6TABLES -t $table -L -n | while read c chain rest; do\n\ - if test \"X$c\" = \"XChain\" ; then\n\ - $IP6TABLES -t $table -F $chain\n\ - fi\n\ - done\n\ - $IP6TABLES -t $table -X\n\ +cat /proc/net/ip6_tables_names | while read table; do\n\ + $IP6TABLES -t $table -L -n | while read c chain rest; do\n\ + if test \"X$c\" = \"XChain\" ; then\n\ + $IP6TABLES -t $table -F $chain\n\ + fi\n\ done\n\ -\n\ -\n"; - res << "}"; + $IP6TABLES -t $table -X\n\ +done\n"; res << endl; res << endl; -// } + } return res.str(); } @@ -1271,10 +1279,11 @@ string PolicyCompiler_ipt::PrintRule::_commit() return ""; } -string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) +string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules() { PolicyCompiler_ipt *ipt_comp = dynamic_cast(compiler); ostringstream res; + bool isIPv6 = ipt_comp->ipv6; /* * bug #1092141: "irritating FORWARD rule for established connections" @@ -1287,7 +1296,7 @@ string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) if ( compiler->getCachedFwOpt()->getBool("clamp_mss_to_mtu") && ipforward) { - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu" << _endRuleLine(); @@ -1297,16 +1306,16 @@ string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) if ( compiler->getCachedFwOpt()->getBool("accept_established") && ipt_comp->my_table=="filter") { - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT" << _endRuleLine(); - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT" << _endRuleLine(); if (ipforward) - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT" << _endRuleLine(); @@ -1358,12 +1367,12 @@ string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) * Need to add rules with ESTABLISHED and RELATED to make sure backup ssh access * works even when global rule that accepts ESTABLISHED and RELATED is disabled */ - res << _startRuleLine(isIPv6) << "INPUT -p tcp -m tcp -s " + res << _startRuleLine() << "INPUT -p tcp -m tcp -s " << inet_addr->toString() << " --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT" << _endRuleLine(); - res << _startRuleLine(isIPv6) << "OUTPUT -p tcp -m tcp -d " + res << _startRuleLine() << "OUTPUT -p tcp -m tcp -d " << inet_addr->toString() << " --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT" << _endRuleLine(); @@ -1379,16 +1388,16 @@ string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) res << "#" << endl; - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "INPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP" << _endRuleLine(); - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "OUTPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP" << _endRuleLine(); if (ipforward) - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "FORWARD -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP" << _endRuleLine(); @@ -1403,37 +1412,37 @@ string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) if ( !compiler->getCachedFwOpt()->getBool("log_invalid")) { - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "OUTPUT -m state --state INVALID -j DROP" << _endRuleLine(); - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "INPUT -m state --state INVALID -j DROP" << _endRuleLine(); if (ipforward) - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "FORWARD -m state --state INVALID -j DROP" << _endRuleLine(); } else { - res << _createChain("drop_invalid", isIPv6); + res << _createChain("drop_invalid"); - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "OUTPUT -m state --state INVALID -j drop_invalid" << _endRuleLine(); - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "INPUT -m state --state INVALID -j drop_invalid" << _endRuleLine(); if (ipforward) - res << _startRuleLine(isIPv6) + res << _startRuleLine() << "FORWARD -m state --state INVALID -j drop_invalid" << _endRuleLine(); - res << _startRuleLine(isIPv6); + res << _startRuleLine(); if (compiler->getCachedFwOpt()->getBool("use_ULOG")) @@ -1465,7 +1474,7 @@ string PolicyCompiler_ipt::PrintRule::_printOptionalGlobalRules(bool isIPv6) res << _printLogPrefix("-1", "DENY","global","drop_invalid","BLOCK INVALID",s) << _endRuleLine() - << _startRuleLine(isIPv6) << "drop_invalid -j DROP" << _endRuleLine(); + << _startRuleLine() << "drop_invalid -j DROP" << _endRuleLine(); } res << endl; diff --git a/src/ipt/PolicyCompiler_PrintRuleIptRst.cpp b/src/ipt/PolicyCompiler_PrintRuleIptRst.cpp index 08d46810e..40c25f42d 100644 --- a/src/ipt/PolicyCompiler_PrintRuleIptRst.cpp +++ b/src/ipt/PolicyCompiler_PrintRuleIptRst.cpp @@ -57,8 +57,7 @@ using namespace std; /* * check and create new chain if needed */ -string PolicyCompiler_ipt::PrintRuleIptRst::_createChain(const string &chain, - bool) +string PolicyCompiler_ipt::PrintRuleIptRst::_createChain(const string &chain) { string res; if ( ! chains[chain] ) @@ -69,7 +68,7 @@ string PolicyCompiler_ipt::PrintRuleIptRst::_createChain(const string &chain, return res; } -string PolicyCompiler_ipt::PrintRuleIptRst::_startRuleLine(bool) +string PolicyCompiler_ipt::PrintRuleIptRst::_startRuleLine() { return string("-A "); } diff --git a/src/ipt/PolicyCompiler_PrintRuleIptRstEcho.cpp b/src/ipt/PolicyCompiler_PrintRuleIptRstEcho.cpp index 83d9e0e12..984e5d7af 100644 --- a/src/ipt/PolicyCompiler_PrintRuleIptRstEcho.cpp +++ b/src/ipt/PolicyCompiler_PrintRuleIptRstEcho.cpp @@ -57,8 +57,7 @@ using namespace std; /* * check and create new chain if needed */ -string PolicyCompiler_ipt::PrintRuleIptRstEcho::_createChain( - const string &chain, bool) +string PolicyCompiler_ipt::PrintRuleIptRstEcho::_createChain(const string &chain) { string res; if ( ! chains[chain] ) @@ -69,7 +68,7 @@ string PolicyCompiler_ipt::PrintRuleIptRstEcho::_createChain( return res; } -string PolicyCompiler_ipt::PrintRuleIptRstEcho::_startRuleLine(bool) +string PolicyCompiler_ipt::PrintRuleIptRstEcho::_startRuleLine() { return string("echo \"-A "); } diff --git a/src/ipt/PolicyCompiler_ipt.cpp b/src/ipt/PolicyCompiler_ipt.cpp index 37dba35d8..c54334e07 100644 --- a/src/ipt/PolicyCompiler_ipt.cpp +++ b/src/ipt/PolicyCompiler_ipt.cpp @@ -2535,28 +2535,20 @@ bool PolicyCompiler_ipt::checkForDynamicInterfacesOfOtherObjects::processNext() bool PolicyCompiler_ipt::expandMultipleAddressesIfNotFWinSrc::processNext() { PolicyRule *rule=getNext(); if (rule==NULL) return false; - RuleElementSrc *srcrel=rule->getSrc(); Address *src =compiler->getFirstSrc(rule); assert(src); - - if (Firewall::cast(src)==NULL) compiler->_expandAddr(rule,srcrel); - + if (Firewall::cast(src)==NULL) compiler->_expandAddr(rule, srcrel); tmp_queue.push_back(rule); - return true; } bool PolicyCompiler_ipt::expandMultipleAddressesIfNotFWinDst::processNext() { PolicyRule *rule=getNext(); if (rule==NULL) return false; - RuleElementDst *dstrel=rule->getDst(); Address *dst =compiler->getFirstDst(rule); assert(dst); - - if (Firewall::cast(dst)==NULL) compiler->_expandAddr(rule,dstrel); - + if (Firewall::cast(dst)==NULL) compiler->_expandAddr(rule, dstrel); tmp_queue.push_back(rule); - return true; } @@ -2860,9 +2852,16 @@ bool PolicyCompiler_ipt::finalizeChain::processNext() { // RuleElementSrc *srcrel=rule->getSrc(); - Address *src =compiler->getFirstSrc(rule); assert(src); + Address *src =compiler->getFirstSrc(rule); + if (src==NULL) + compiler->abort(string("finalizeChain: Empty Source rule element in rule ") + + rule->getLabel()); + // RuleElementDst *dstrel=rule->getDst(); - Address *dst =compiler->getFirstDst(rule); assert(dst); + Address *dst =compiler->getFirstDst(rule); + if (dst==NULL) + compiler->abort(string("finalizeChain: Empty Destination rule element in rule ") + + rule->getLabel()); bool b,m; /* @@ -2975,9 +2974,15 @@ bool PolicyCompiler_ipt::removeFW::processNext() ! rule->getBool("upstream_rule_neg") ) { RuleElementSrc *srcrel=rule->getSrc(); - Address *src =compiler->getFirstSrc(rule); assert(src); + Address *src =compiler->getFirstSrc(rule); + if (src==NULL) + compiler->abort(string("removeFW: Empty Source rule element in rule ") + + rule->getLabel()); RuleElementDst *dstrel=rule->getDst(); - Address *dst =compiler->getFirstDst(rule); assert(dst); + Address *dst =compiler->getFirstDst(rule); + if (dst==NULL) + compiler->abort(string("removeFW: Empty Destination rule element in rule ") + + rule->getLabel()); if (( rule->getStr("ipt_chain")=="INPUT" || rule->getStr("upstream_rule_chain")=="INPUT") && dst->getId()==compiler->getFwId() ) @@ -3623,8 +3628,9 @@ void PolicyCompiler_ipt::compile() { printRule=NULL; - cout << _(" Compiling rules for '") << my_table - << _("' table ...") << endl << flush; + cout << " Compiling rules for '" << my_table << "' table"; + if (ipv6) cout << ", IPv6"; + cout << endl << flush; try { @@ -3659,6 +3665,8 @@ void PolicyCompiler_ipt::compile() check_for_recursive_groups=false; add( new ExpandGroups("expand groups" ) ); + add( new dropRuleWithEmptyRE( + "drop rules with empty rule elements")); add( new eliminateDuplicatesInSRC("eliminate duplicates in SRC") ); add( new eliminateDuplicatesInDST("eliminate duplicates in DST") ); add( new eliminateDuplicatesInSRV("eliminate duplicates in SRV") ); @@ -3674,6 +3682,9 @@ void PolicyCompiler_ipt::compile() "expand objects with multiple addresses in SRC" ) ); add( new ExpandMultipleAddressesInDST( "expand objects with multiple addresses in DST" ) ); + add( new dropRuleWithEmptyRE( + "drop rules with empty rule elements")); + add( new ConvertToAtomic("convert to atomic rules" ) ); /* @@ -3801,6 +3812,8 @@ void PolicyCompiler_ipt::compile() add( new setChainPostroutingForTag("chain POSTROUTING for Tag")); add( new ExpandGroups( "expand all groups" )); + add( new dropRuleWithEmptyRE("drop rules with empty rule elements")); + add( new eliminateDuplicatesInSRC("eliminate duplicates in SRC" )); add( new eliminateDuplicatesInDST("eliminate duplicates in DST" )); add( new eliminateDuplicatesInSRV("eliminate duplicates in SRV" )); @@ -3852,6 +3865,17 @@ void PolicyCompiler_ipt::compile() add( new expandLoopbackInterfaceAddress( "check for loopback interface in the rule objects") ); + // processors that expand objects with multiple addresses + // check addresses against current address family using member + // ipv6. If all addresses do not match, we may end up with + // empty rule element. + add( new dropRuleWithEmptyRE("drop rules with empty rule elements")); + + if (ipv6) + add( new DropIPv4Rules("drop ipv4 rules")); + else + add( new DropIPv6Rules("drop ipv6 rules")); + add( new dropRuleWithEmptyRE("drop rules with empty rule elements")); // trying process rules with multiple interfaces as late as possible add( new InterfacePolicyRulesWithOptimization( @@ -3926,7 +3950,6 @@ void PolicyCompiler_ipt::compile() "drop rules with action Continue") ); add( new convertInterfaceIdToStr("prepare interface assignments") ); add( new optimize3("optimization 3") ); - add( new CheckIfIPv6Rule("find ipv6 rules")); add( createPrintRuleProcessor() ); @@ -4107,11 +4130,6 @@ string PolicyCompiler_ipt::flushAndSetDefaultPolicy() res += printRule->_declareTable(); res += printRule->_flushAndSetDefaultPolicy(); res += printRule->_printOptionalGlobalRules(); - if (haveIPv6Rules()) - { - // same rules for ipv6 - res += printRule->_printOptionalGlobalRules(true); - } return res; } diff --git a/src/ipt/PolicyCompiler_ipt.h b/src/ipt/PolicyCompiler_ipt.h index 253381fcb..c4a0ea51c 100644 --- a/src/ipt/PolicyCompiler_ipt.h +++ b/src/ipt/PolicyCompiler_ipt.h @@ -795,8 +795,7 @@ namespace fwcompiler { std::string current_rule_label; std::map chains; - virtual std::string _createChain(const std::string &chain, - bool ipv6=false); + virtual std::string _createChain(const std::string &chain); virtual std::string _printRuleLabel(libfwbuilder::PolicyRule *r); virtual std::string _printSrcService(libfwbuilder::RuleElementSrv *o); @@ -838,13 +837,13 @@ namespace fwcompiler { PrintRule(const std::string &name); virtual std::string _printGlobalLogParameters(); - virtual std::string _printOptionalGlobalRules(bool ipv6=false); + virtual std::string _printOptionalGlobalRules(); virtual std::string _declareTable(); virtual std::string _flushAndSetDefaultPolicy(); virtual std::string _commit(); virtual std::string _quote(const std::string &s); - virtual std::string _startRuleLine(bool ipv6=false); + virtual std::string _startRuleLine(); virtual std::string _endRuleLine(); virtual bool processNext(); @@ -856,9 +855,8 @@ namespace fwcompiler { class PrintRuleIptRst : public PrintRule { - virtual std::string _createChain(const std::string &chain, - bool ipv6=false); - virtual std::string _startRuleLine(bool ipv6=false); + virtual std::string _createChain(const std::string &chain); + virtual std::string _startRuleLine(); virtual std::string _endRuleLine(); virtual std::string _printRuleLabel(libfwbuilder::PolicyRule *r); @@ -875,9 +873,8 @@ namespace fwcompiler { class PrintRuleIptRstEcho : public PrintRuleIptRst { - virtual std::string _createChain(const std::string &chain, - bool ipv6=false); - virtual std::string _startRuleLine(bool ipv6=false); + virtual std::string _createChain(const std::string &chain); + virtual std::string _startRuleLine(); virtual std::string _endRuleLine(); public: @@ -906,8 +903,10 @@ namespace fwcompiler { public: PolicyCompiler_ipt(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : PolicyCompiler(_db,fwname,_oscnf) + const std::string &fwname, + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + PolicyCompiler(_db, fwname, ipv6_policy, _oscnf) { have_dynamic_interfaces = false; have_connmark = false; diff --git a/src/ipt/RoutingCompiler_ipt.h b/src/ipt/RoutingCompiler_ipt.h index 047a1ef11..6053ed0b6 100644 --- a/src/ipt/RoutingCompiler_ipt.h +++ b/src/ipt/RoutingCompiler_ipt.h @@ -158,8 +158,9 @@ namespace fwcompiler { public: RoutingCompiler_ipt(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : RoutingCompiler(_db,fwname,_oscnf) {} + const std::string &fwname, bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + RoutingCompiler(_db, fwname, ipv6_policy, _oscnf) {} virtual int prolog(); diff --git a/src/ipt/ipt.cpp b/src/ipt/ipt.cpp index 8ce6e9d5b..960ca6bba 100644 --- a/src/ipt/ipt.cpp +++ b/src/ipt/ipt.cpp @@ -96,6 +96,8 @@ static int drn = -1; static int verbose = 0; static bool have_dynamic_interfaces = false; static bool test_mode = false; +static bool ipv4_run = true; +static bool ipv6_run = true; FWObjectDatabase *objdb = NULL; @@ -133,11 +135,87 @@ string addPrologScript(bool nocomment,const string &script) return res; } +string dumpPolicies(bool nocomm, Firewall *fw, + MangleTableCompiler_ipt &m, + NATCompiler_ipt &n, + PolicyCompiler_ipt &c, + bool ipv6_policy) +{ + ostringstream script; + string prolog_place= fw->getOptionsObject()->getStr("prolog_place"); + + if (fw->getOptionsObject()->getBool("use_iptables_restore")) + { + script << "(" << endl; + + script << c.flushAndSetDefaultPolicy(); + + if (prolog_place == "after_flush") + { + script << addPrologScript( + nocomm, fw->getOptionsObject()->getStr("prolog_script")); + } + + script << c.getCompiledScript(); + script << c.commit(); + + if (m.getCompiledScriptLength()>0) + { + script << m.flushAndSetDefaultPolicy(); + script << m.getCompiledScript(); + script << m.commit(); + } + if (n.getCompiledScriptLength()>0) + { + script << n.flushAndSetDefaultPolicy(); + script << n.getCompiledScript(); + script << n.commit(); + } + script << "#" << endl; + if (ipv6_policy) + script << ") | $IP6TABLES_RESTORE; IPTABLES_RESTORE_RES=$?" << endl; + else + script << ") | $IPTABLES_RESTORE; IPTABLES_RESTORE_RES=$?" << endl; + } else + { + + script << c.flushAndSetDefaultPolicy(); + if (m.getCompiledScriptLength()>0) + script << m.flushAndSetDefaultPolicy(); + if (n.getCompiledScriptLength()>0) + script << n.flushAndSetDefaultPolicy(); + + if (prolog_place == "after_flush") + { + script << addPrologScript( + nocomm, fw->getOptionsObject()->getStr("prolog_script")); + } + + if (n.getCompiledScriptLength()>0) + { + script << n.getCompiledScript(); + script << n.commit(); + } + + if (m.getCompiledScriptLength()>0) + { + script << m.getCompiledScript(); + script << m.commit(); + } + + script << c.getCompiledScript(); + script << c.commit(); + } + + return script.str(); +} + + void usage(const char *name) { cout << _("Firewall Builder: policy compiler for Linux 2.4.x and 2.6.x iptables") << endl; cout << _("Version ") << VERSION << "-" << RELEASE_NUM << endl; - cout << _("Usage: ") << name << _(" [-x level] [-v] [-V] [-q] [-f filename.xml] [-d destdir] [-m] firewall_object_name") << endl; + cout << _("Usage: ") << name << _(" [-x level] [-v] [-V] [-q] [-f filename.xml] [-d destdir] [-m] [-4|-6] firewall_object_name") << endl; } int main(int argc, char * const *argv) @@ -163,10 +241,18 @@ int main(int argc, char * const *argv) int opt; - while( (opt=getopt(argc,argv,"x:vVqf:d:r:o:")) != EOF ) + while( (opt=getopt(argc,argv,"x:vVqf:d:r:o:46")) != EOF ) { switch(opt) { + case '4': + ipv4_run = true; + ipv6_run = false; + break; + case '6': + ipv4_run = false; + ipv6_run = true; + break; case 'd': wdir = strdup(optarg); break; @@ -377,24 +463,27 @@ _("Dynamic interface %s should not have an IP address object attached to it. Thi } } - string firewall_dir=options->getStr("firewall_dir"); + string firewall_dir = options->getStr("firewall_dir"); if (firewall_dir=="") firewall_dir="/etc"; bool debug=options->getBool("debug"); string shell_dbg=(debug)?"set -x":"" ; string pfctl_dbg=(debug)?"-v":""; - Preprocessor* prep=new Preprocessor(objdb , fwobjectname); - prep->compile(); - OSConfigurator_linux24 *oscnf=NULL; string family=Resources::os_res[fw->getStr("host_OS")]->Resources::getResourceStr("/FWBuilderResources/Target/family"); if ( family=="linux24" ) - oscnf=new OSConfigurator_linux24(objdb , fwobjectname); + oscnf = new OSConfigurator_linux24(objdb , fwobjectname, false); if (oscnf==NULL) throw FWException(_("Unrecognized host OS ")+fw->getStr("host_OS")+" (family "+family+")"); +/* do not put comment in the script if it is intended for linksys */ + bool nocomm = Resources::os_res[fw->getStr("host_OS")]-> + Resources::getResourceBool( + "/FWBuilderResources/Target/options/suppress_comments"); + + oscnf->prolog(); int policy_rules_count = 0; @@ -402,54 +491,97 @@ _("Dynamic interface %s should not have an IP address object attached to it. Thi int nat_rules_count = 0; int routing_rules_count = 0; - MangleTableCompiler_ipt m( objdb , fwobjectname , oscnf ); + vector ipv4_6_runs; + string generated_script; - m.setDebugLevel( dl ); - m.setDebugRule( drp ); - m.setVerbose( (bool)(verbose) ); - m.setHaveDynamicInterfaces(have_dynamic_interfaces); - if (test_mode) m.setTestMode(); + // command line options -4 and -6 control address family for which + // script will be generated. If "-4" is used, only ipv4 part will + // be generated. If "-6" is used, only ipv6 part will be generated. + // If neither is used, both parts will be done. - if ( (mangle_rules_count=m.prolog()) > 0 ) + if (options->getStr("ipv4_6_order").empty() || + options->getStr("ipv4_6_order") == "ipv4_first") { - m.compile(); - m.epilog(); - } + if (ipv4_run) ipv4_6_runs.push_back(false); + if (ipv6_run && options->getBool("enable_ipv6")) + ipv4_6_runs.push_back(true); + } -// compile NAT rules before policy rules because policy compiler -// needs to know the number of virtual addresses being created for NAT - - NATCompiler_ipt n( objdb , fwobjectname , oscnf ); - - n.setDebugLevel( dl ); - n.setDebugRule( drn ); - n.setVerbose( (bool)(verbose) ); - n.setHaveDynamicInterfaces(have_dynamic_interfaces); - if (test_mode) n.setTestMode(); - - if ( (nat_rules_count=n.prolog()) > 0 ) + if (options->getStr("ipv4_6_order") == "ipv6_first") { - oscnf->generateCodeForProtocolHandlers(true); - n.compile(); - n.epilog(); - } else - oscnf->generateCodeForProtocolHandlers(false); + if (ipv6_run && options->getBool("enable_ipv6")) + ipv4_6_runs.push_back(true); + if (ipv4_run) ipv4_6_runs.push_back(false); + } - PolicyCompiler_ipt c( objdb , fwobjectname , oscnf ); - - c.setDebugLevel( dl ); - c.setDebugRule( drp ); - c.setVerbose( (bool)(verbose) ); - c.setHaveDynamicInterfaces(have_dynamic_interfaces); - if (test_mode) c.setTestMode(); - - if ( (policy_rules_count=c.prolog()) > 0 ) + for (vector::iterator i=ipv4_6_runs.begin(); + i!=ipv4_6_runs.end(); ++i) { - c.compile(); - c.epilog(); - } + bool ipv6_policy = *i; - RoutingCompiler_ipt r( objdb , fwobjectname , oscnf ); + if (ipv6_policy) + { + generated_script += "\n\n"; + generated_script += "#================ IPv6 ================\n"; + generated_script += "\n\n"; + } + + Preprocessor* prep = new Preprocessor( + objdb , fwobjectname, ipv6_policy); + prep->compile(); + + MangleTableCompiler_ipt m( + objdb , fwobjectname, ipv6_policy , oscnf ); + + m.setDebugLevel( dl ); + m.setDebugRule( drp ); + m.setVerbose( (bool)(verbose) ); + m.setHaveDynamicInterfaces(have_dynamic_interfaces); + if (test_mode) m.setTestMode(); + + if ( (mangle_rules_count=m.prolog()) > 0 ) + { + m.compile(); + m.epilog(); + } + + // compile NAT rules before policy rules because policy + // compiler needs to know the number of virtual addresses + // being created for NAT + NATCompiler_ipt n(objdb, fwobjectname, ipv6_policy, oscnf); + + n.setDebugLevel( dl ); + n.setDebugRule( drn ); + n.setVerbose( (bool)(verbose) ); + n.setHaveDynamicInterfaces(have_dynamic_interfaces); + if (test_mode) n.setTestMode(); + + if ( (nat_rules_count=n.prolog()) > 0 ) + { + oscnf->generateCodeForProtocolHandlers(true); + n.compile(); + n.epilog(); + } else + oscnf->generateCodeForProtocolHandlers(false); + + PolicyCompiler_ipt c(objdb, fwobjectname, ipv6_policy, oscnf); + + c.setDebugLevel( dl ); + c.setDebugRule( drp ); + c.setVerbose( (bool)(verbose) ); + c.setHaveDynamicInterfaces(have_dynamic_interfaces); + if (test_mode) c.setTestMode(); + + if ( (policy_rules_count=c.prolog()) > 0 ) + { + c.compile(); + c.epilog(); + } + + generated_script += dumpPolicies(nocomm, fw, m, n, c, ipv6_policy); + } + + RoutingCompiler_ipt r( objdb , fwobjectname , false, oscnf ); r.setDebugLevel( dl ); r.setDebugRule( drp ); @@ -522,8 +654,6 @@ _("Dynamic interface %s should not have an IP address object attached to it. Thi script << "#" << endl; script << "#" << endl; -/* do not put comment in the script if it is intended for linksys */ - bool nocomm=Resources::os_res[fw->getStr("host_OS")]->Resources::getResourceBool("/FWBuilderResources/Target/options/suppress_comments"); if ( !nocomm ) { string fwcomment=fw->getComment(); @@ -559,8 +689,8 @@ _("Dynamic interface %s should not have an IP address object attached to it. Thi if (prolog_place == "top") { script << - addPrologScript(nocomm, - fw->getOptionsObject()->getStr("prolog_script")); + addPrologScript( + nocomm, fw->getOptionsObject()->getStr("prolog_script")); } script << oscnf->getCompiledScript(); @@ -570,8 +700,8 @@ _("Dynamic interface %s should not have an IP address object attached to it. Thi if (prolog_place == "after_interfaces") { script << - addPrologScript(nocomm, - fw->getOptionsObject()->getStr("prolog_script")); + addPrologScript( + nocomm, fw->getOptionsObject()->getStr("prolog_script")); } script << "log '"; @@ -596,70 +726,10 @@ _("Dynamic interface %s should not have an IP address object attached to it. Thi script << endl; - if (options->getBool("use_iptables_restore")) - { - script << "(" << endl; + script << generated_script; - script << c.flushAndSetDefaultPolicy(); - - if (prolog_place == "after_flush") - { - script << addPrologScript(nocomm, - fw->getOptionsObject()->getStr("prolog_script")); - } - - script << c.getCompiledScript(); - script << c.commit(); - - if (m.getCompiledScriptLength()>0) - { - script << m.flushAndSetDefaultPolicy(); - script << m.getCompiledScript(); - script << m.commit(); - } - if (n.getCompiledScriptLength()>0) - { - script << n.flushAndSetDefaultPolicy(); - script << n.getCompiledScript(); - script << n.commit(); - } - script << "#" << endl; - script << ") | $IPTABLES_RESTORE; IPTABLES_RESTORE_RES=$?" << endl; - } else - { - - script << c.flushAndSetDefaultPolicy(); - if (m.getCompiledScriptLength()>0) - script << m.flushAndSetDefaultPolicy(); - if (n.getCompiledScriptLength()>0) - script << n.flushAndSetDefaultPolicy(); - - if (prolog_place == "after_flush") - { - script << addPrologScript(nocomm, - fw->getOptionsObject()->getStr("prolog_script")); - } - - if (n.getCompiledScriptLength()>0) - { - script << n.getCompiledScript(); - script << n.commit(); - } - - if (m.getCompiledScriptLength()>0) - { - script << m.getCompiledScript(); - script << m.commit(); - } - - script << c.getCompiledScript(); - script << c.commit(); - } script << r.getCompiledScript(); - - - oscnf->epilog(); script << oscnf->getCompiledScript(); diff --git a/src/pf/pf.cpp b/src/pf/pf.cpp index cfa86517c..4821f91c3 100644 --- a/src/pf/pf.cpp +++ b/src/pf/pf.cpp @@ -99,6 +99,8 @@ static int drp = -1; static int drn = -1; static int verbose = 0; static bool test_mode = false; +static bool ipv4_run = true; +static bool ipv6_run = true; static map branches; static map anchor_files; @@ -136,7 +138,7 @@ void usage(const char *name) { cout << _("Firewall Builder: policy compiler for OpenBSD PF") << endl; cout << _("Version ") << VERSION << RELEASE_NUM << endl; - cout << _("Usage: ") << name << " [-x] [-v] [-V] [-f filename.xml] [-o output.fw] [-d destdir] [-m] firewall_object_name" << endl; + cout << _("Usage: ") << name << " [-x] [-v] [-V] [-f filename.xml] [-o output.fw] [-d destdir] [-m] [-4|-6] firewall_object_name" << endl; } @@ -189,10 +191,18 @@ int main(int argc, char * const *argv) int opt; - while( (opt=getopt(argc,argv,"x:vVf:d:r:o:")) != EOF ) + while( (opt=getopt(argc,argv,"x:vVf:d:r:o:46")) != EOF ) { switch(opt) { + case '4': + ipv4_run = true; + ipv6_run = false; + break; + case '6': + ipv4_run = false; + ipv6_run = true; + break; case 'd': wdir = strdup(optarg); break; @@ -381,9 +391,6 @@ int main(int argc, char * const *argv) // if (fw->getStr("version")=="obsd_3.2") pfctl_f_option="-f "; if (fw->getStr("version")=="obsd_lt_3.2") pfctl_f_option="-R "; - Preprocessor_pf* prep = new Preprocessor_pf(objdb , fwobjectname); - prep->compile(); - /* * Process firewall options, build OS network configuration script */ @@ -392,16 +399,16 @@ int main(int argc, char * const *argv) ]->Resources::getResourceStr("/FWBuilderResources/Target/family"); if (family=="solaris") - oscnf=new OSConfigurator_solaris(objdb , fwobjectname); + oscnf=new OSConfigurator_solaris(objdb , fwobjectname, false); if (family=="openbsd") { cerr << "Calling OSConfigurator_openbsd" << endl; - oscnf=new OSConfigurator_openbsd(objdb , fwobjectname); + oscnf=new OSConfigurator_openbsd(objdb , fwobjectname, false); } if (family=="freebsd") - oscnf=new OSConfigurator_freebsd(objdb , fwobjectname); + oscnf=new OSConfigurator_freebsd(objdb , fwobjectname, false); if (oscnf==NULL) throw FWException(_("Unrecognized host OS ") + @@ -409,70 +416,176 @@ int main(int argc, char * const *argv) oscnf->prolog(); - // find branching rules and store names of the branches and - // pointers to corresponding rule sets - // - FWObject *policy = fw->getFirstByType(Policy::TYPENAME); - for (FWObject::iterator i=policy->begin(); i!=policy->end(); i++) + + vector ipv4_6_runs; + string generated_script; + + // command line options -4 and -6 control address family for which + // script will be generated. If "-4" is used, only ipv4 part will + // be generated. If "-6" is used, only ipv6 part will be generated. + // If neither is used, both parts will be done. + + if (options->getStr("ipv4_6_order").empty() || + options->getStr("ipv4_6_order") == "ipv4_first") { - PolicyRule *rule = PolicyRule::cast(*i); - if (rule->getAction()==PolicyRule::Branch) - { - int parentRuleNum = rule->getPosition(); - RuleSet *subset = rule->getBranch(); - if (subset==NULL) - { - throw FWException( - _("Action 'Branch' but no branch policy in policy rule ") - +rule->getLabel()); - } - subset->setInt("parent_rule_num",parentRuleNum); - FWOptions *ropt = rule->getOptionsObject(); - string branchName = ropt->getStr("branch_name"); - branches[branchName] = subset; - subset->ref(); - rule->remove(subset); - } + if (ipv4_run) ipv4_6_runs.push_back(false); + if (ipv6_run && options->getBool("enable_ipv6")) + ipv4_6_runs.push_back(true); } - TableFactory *table_factory = new TableFactory(); - - NATCompiler_pf n( objdb, fwobjectname, oscnf, table_factory ); - - n.setDebugLevel( dl ); - n.setDebugRule( drn ); - n.setVerbose( verbose ); - if (test_mode) n.setTestMode(); - - bool have_nat=false; - if ( n.prolog() > 0 ) + if (options->getStr("ipv4_6_order") == "ipv6_first") { - have_nat=true; + if (ipv6_run && options->getBool("enable_ipv6")) + ipv4_6_runs.push_back(true); + if (ipv4_run) ipv4_6_runs.push_back(false); + } - n.compile(); - n.epilog(); - } - - PolicyCompiler_pf c( objdb, fwobjectname, oscnf, &n, table_factory ); - - c.setDebugLevel( dl ); - c.setDebugRule( drp ); - c.setVerbose( verbose ); - if (test_mode) c.setTestMode(); - - bool have_pf=false; - if ( c.prolog() > 0 ) + for (vector::iterator i=ipv4_6_runs.begin(); + i!=ipv4_6_runs.end(); ++i) { - have_pf=true; + bool ipv6_policy = *i; - cout << " Compiling policy rules for " - << fwobjectname - << " ..." << endl << flush; + if (ipv6_policy) + { + generated_script += "\n\n"; + generated_script += "#================ IPv6 ================\n"; + generated_script += "\n\n"; + } - c.compile(); - c.epilog(); - } + TableFactory *table_factory = new TableFactory(); + Preprocessor_pf* prep = new Preprocessor_pf( + objdb , fwobjectname, ipv6_policy); + prep->compile(); + + // find branching rules and store names of the branches and + // pointers to corresponding rule sets + // + FWObject *policy = fw->getFirstByType(Policy::TYPENAME); + for (FWObject::iterator i=policy->begin(); i!=policy->end(); i++) + { + PolicyRule *rule = PolicyRule::cast(*i); + if (rule->getAction()==PolicyRule::Branch) + { + int parentRuleNum = rule->getPosition(); + RuleSet *subset = rule->getBranch(); + if (subset==NULL) + { + throw FWException( + _("Action 'Branch' but no branch policy in policy rule ") + +rule->getLabel()); + } + subset->setInt("parent_rule_num",parentRuleNum); + FWOptions *ropt = rule->getOptionsObject(); + string branchName = ropt->getStr("branch_name"); + branches[branchName] = subset; + subset->ref(); + rule->remove(subset); + } + } + + NATCompiler_pf n( objdb, fwobjectname, ipv6_policy, oscnf, + table_factory ); + + n.setDebugLevel( dl ); + n.setDebugRule( drn ); + n.setVerbose( verbose ); + if (test_mode) n.setTestMode(); + + bool have_nat=false; + if ( n.prolog() > 0 ) + { + have_nat=true; + + n.compile(); + n.epilog(); + } + + PolicyCompiler_pf c( objdb, fwobjectname, ipv6_policy, oscnf, + &n, table_factory ); + + c.setDebugLevel( dl ); + c.setDebugRule( drp ); + c.setVerbose( verbose ); + if (test_mode) c.setTestMode(); + + bool have_pf=false; + if ( c.prolog() > 0 ) + { + have_pf=true; + + cout << " Compiling policy rules for " + << fwobjectname + << " ..." << endl << flush; + + c.compile(); + c.epilog(); + } + + generated_script += table_factory->PrintTables(); + generated_script += "\n"; + + if (have_nat) generated_script += n.getCompiledScript(); + if (have_pf) generated_script += c.getCompiledScript(); + + // run policy compiler for each branch we have found in the + // ruleset and store the result in a separate .conf file + // + map::iterator bi; + for (bi=branches.begin(); bi!=branches.end(); ++bi) + { + table_factory = new TableFactory(); + + string branchName = bi->first; + RuleSet *subset = bi->second; + PolicyCompiler_pf c( objdb , fwobjectname, ipv6_policy, + oscnf, &n, table_factory ); + c.setSourceRuleSet( subset ); + c.setRuleSetName(branchName); + + c.setDebugLevel( dl ); + c.setDebugRule( drp ); + c.setVerbose( verbose ); + if (test_mode) c.setTestMode(); + + if ( c.prolog() > 0 ) + { + cout << " Compiling rules for anchor " + << branchName + << " ..." << endl << flush; + + c.compile(); + c.epilog(); + + string anchor_file_name; + if (fw_file_name.empty()) + { + anchor_file_name=string(fwobjectname) + "-" + branchName + ".conf"; + } else + { + string::size_type n = fw_file_name.rfind("."); + anchor_file_name = fw_file_name; + anchor_file_name.erase(n); + anchor_file_name.append("-" + branchName + ".conf"); + } + anchor_files[branchName] = anchor_file_name; + + ofstream pf_file; + pf_file.exceptions(ofstream::eofbit|ofstream::failbit|ofstream::badbit); + +#ifdef _WIN32 + pf_file.open(anchor_file_name.c_str(), ios::out|ios::binary); +#else + pf_file.open(anchor_file_name.c_str()); +#endif + pf_file << endl; + pf_file << table_factory->PrintTables(); + pf_file << endl; + pf_file << c.getCompiledScript(); + pf_file.close(); + } + } + } /* * now write generated scripts to files @@ -594,7 +707,7 @@ int main(int argc, char * const *argv) // and generate 'set skip on ' commands if (fw->getStr("version")=="ge_3.7" || - fw->getStr("version")=="4.x") + fw->getStr("version")=="4.x") { for (list::iterator i=all_interfaces.begin(); i!=all_interfaces.end(); ++i) @@ -653,75 +766,16 @@ int main(int argc, char * const *argv) if (prolog_place == "pf_file_after_scrub") printProlog(pf_file, pre_hook); - pf_file << table_factory->PrintTables(); - pf_file << endl; + //pf_file << table_factory->PrintTables(); + //pf_file << endl; if (prolog_place == "pf_file_after_tables") printProlog(pf_file, pre_hook); - if (have_nat) pf_file << n.getCompiledScript(); - if (have_pf) pf_file << c.getCompiledScript(); + pf_file << generated_script; pf_file.close(); - // run policy compiler for each branch we have found in the - // ruleset and store the result in a separate .conf file - // - map::iterator bi; - for (bi=branches.begin(); bi!=branches.end(); ++bi) - { - table_factory = new TableFactory(); - - string branchName = bi->first; - RuleSet *subset = bi->second; - PolicyCompiler_pf c( objdb , fwobjectname , oscnf , &n, table_factory ); - c.setSourceRuleSet( subset ); - c.setRuleSetName(branchName); - - c.setDebugLevel( dl ); - c.setDebugRule( drp ); - c.setVerbose( verbose ); - if (test_mode) c.setTestMode(); - - if ( c.prolog() > 0 ) - { - cout << " Compiling rules for anchor " - << branchName - << " ..." << endl << flush; - - c.compile(); - c.epilog(); - - string anchor_file_name; - if (fw_file_name.empty()) - { - anchor_file_name=string(fwobjectname) + "-" + branchName + ".conf"; - } else - { - string::size_type n = fw_file_name.rfind("."); - anchor_file_name = fw_file_name; - anchor_file_name.erase(n); - anchor_file_name.append("-" + branchName + ".conf"); - } - anchor_files[branchName] = anchor_file_name; - - ofstream pf_file; - pf_file.exceptions(ofstream::eofbit|ofstream::failbit|ofstream::badbit); - -#ifdef _WIN32 - pf_file.open(anchor_file_name.c_str(), ios::out|ios::binary); -#else - pf_file.open(anchor_file_name.c_str()); -#endif - pf_file << endl; - pf_file << table_factory->PrintTables(); - pf_file << endl; - pf_file << c.getCompiledScript(); - pf_file.close(); - } - } - - char *timestr; time_t tm; struct tm *stm; diff --git a/src/pflib/NATCompiler_ipf.h b/src/pflib/NATCompiler_ipf.h index a0c70468b..46e67eba4 100644 --- a/src/pflib/NATCompiler_ipf.h +++ b/src/pflib/NATCompiler_ipf.h @@ -186,7 +186,9 @@ namespace fwcompiler { NATCompiler_ipf(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : NATCompiler_pf(_db,fwname,_oscnf) {} + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + NATCompiler_pf(_db, fwname, ipv6_policy, _oscnf) {} virtual int prolog(); diff --git a/src/pflib/NATCompiler_ipfw.h b/src/pflib/NATCompiler_ipfw.h index 880ffec5e..725f6ef5b 100644 --- a/src/pflib/NATCompiler_ipfw.h +++ b/src/pflib/NATCompiler_ipfw.h @@ -50,7 +50,9 @@ namespace fwcompiler { NATCompiler_ipfw(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : NATCompiler_pf(_db,fwname,_oscnf) {} + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + NATCompiler_pf(_db, fwname, ipv6_policy, _oscnf) {} virtual int prolog(); diff --git a/src/pflib/NATCompiler_pf.h b/src/pflib/NATCompiler_pf.h index 3d66a363a..63a1bf07c 100644 --- a/src/pflib/NATCompiler_pf.h +++ b/src/pflib/NATCompiler_pf.h @@ -365,8 +365,10 @@ namespace fwcompiler { NATCompiler_pf(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, fwcompiler::OSConfigurator *_oscnf, - TableFactory *tbf = NULL) : NATCompiler(_db,fwname,_oscnf) + TableFactory *tbf = NULL) : + NATCompiler(_db, fwname, ipv6_policy, _oscnf) { tables = tbf; } diff --git a/src/pflib/OSConfigurator_freebsd.h b/src/pflib/OSConfigurator_freebsd.h index 2d7c95000..5de37f7f8 100644 --- a/src/pflib/OSConfigurator_freebsd.h +++ b/src/pflib/OSConfigurator_freebsd.h @@ -46,8 +46,9 @@ namespace fwcompiler { virtual ~OSConfigurator_freebsd() {}; OSConfigurator_freebsd(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname) : - OSConfigurator(_db,fwname) , os_data() {} + const std::string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) , os_data() {} virtual int prolog(); diff --git a/src/pflib/OSConfigurator_macosx.h b/src/pflib/OSConfigurator_macosx.h index c33be2d02..dbf96f65a 100644 --- a/src/pflib/OSConfigurator_macosx.h +++ b/src/pflib/OSConfigurator_macosx.h @@ -44,8 +44,9 @@ namespace fwcompiler { virtual ~OSConfigurator_macosx() {}; OSConfigurator_macosx(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname) : - OSConfigurator(_db,fwname) , os_data() {} + const std::string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) , os_data() {} virtual int prolog(); diff --git a/src/pflib/OSConfigurator_openbsd.h b/src/pflib/OSConfigurator_openbsd.h index 5d7f50d7d..b4566266c 100644 --- a/src/pflib/OSConfigurator_openbsd.h +++ b/src/pflib/OSConfigurator_openbsd.h @@ -44,8 +44,9 @@ namespace fwcompiler { virtual ~OSConfigurator_openbsd() {}; OSConfigurator_openbsd(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname) : - OSConfigurator(_db,fwname) , os_data() {} + const std::string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) , os_data() {} virtual int prolog(); diff --git a/src/pflib/OSConfigurator_solaris.h b/src/pflib/OSConfigurator_solaris.h index 14fea09c8..906bc9cb5 100644 --- a/src/pflib/OSConfigurator_solaris.h +++ b/src/pflib/OSConfigurator_solaris.h @@ -47,8 +47,9 @@ namespace fwcompiler { virtual ~OSConfigurator_solaris() {}; OSConfigurator_solaris(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname) : - OSConfigurator(_db,fwname) , os_data() {} + const std::string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) , os_data() {} virtual int prolog(); diff --git a/src/pflib/PolicyCompiler_ipf.h b/src/pflib/PolicyCompiler_ipf.h index b7d92fd9f..9c47aed41 100644 --- a/src/pflib/PolicyCompiler_ipf.h +++ b/src/pflib/PolicyCompiler_ipf.h @@ -247,7 +247,9 @@ namespace fwcompiler { PolicyCompiler_ipf(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : PolicyCompiler_pf(_db,fwname,_oscnf,NULL) {} + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + PolicyCompiler_pf(_db, fwname, ipv6_policy, _oscnf, NULL) {} virtual int prolog(); diff --git a/src/pflib/PolicyCompiler_ipfw.h b/src/pflib/PolicyCompiler_ipfw.h index fae3e8c2b..c2f39cf3a 100644 --- a/src/pflib/PolicyCompiler_ipfw.h +++ b/src/pflib/PolicyCompiler_ipfw.h @@ -234,7 +234,9 @@ namespace fwcompiler { PolicyCompiler_ipfw(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, - fwcompiler::OSConfigurator *_oscnf) : PolicyCompiler_pf(_db,fwname,_oscnf,NULL) {} + bool ipv6_policy, + fwcompiler::OSConfigurator *_oscnf) : + PolicyCompiler_pf(_db, fwname, ipv6_policy, _oscnf, NULL) {} virtual int prolog(); diff --git a/src/pflib/PolicyCompiler_pf.h b/src/pflib/PolicyCompiler_pf.h index a99291d9b..fb2a6dd89 100644 --- a/src/pflib/PolicyCompiler_pf.h +++ b/src/pflib/PolicyCompiler_pf.h @@ -440,9 +440,11 @@ namespace fwcompiler { PolicyCompiler_pf(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, fwcompiler::OSConfigurator *_oscnf, NATCompiler_pf *_natcmp, - TableFactory *tbf = NULL) : PolicyCompiler(_db,fwname,_oscnf) + TableFactory *tbf = NULL) : + PolicyCompiler(_db, fwname, ipv6_policy, _oscnf) { natcmp=_natcmp; tables = tbf; diff --git a/src/pflib/Preprocessor_pf.h b/src/pflib/Preprocessor_pf.h index 52d2f530e..a1b73e7a7 100644 --- a/src/pflib/Preprocessor_pf.h +++ b/src/pflib/Preprocessor_pf.h @@ -41,7 +41,9 @@ namespace fwcompiler { public: Preprocessor_pf(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname) : Preprocessor(_db,fwname) + const std::string &fwname, + bool ipv6_policy) : + Preprocessor(_db, fwname, ipv6_policy) { } virtual void convertObject(libfwbuilder::FWObject *obj); diff --git a/src/pix/NATCompiler_pix.cpp b/src/pix/NATCompiler_pix.cpp index a8942d714..893eba4d4 100644 --- a/src/pix/NATCompiler_pix.cpp +++ b/src/pix/NATCompiler_pix.cpp @@ -54,8 +54,9 @@ string NATCompiler_pix::myPlatformName() { return "pix"; } NATCompiler_pix::NATCompiler_pix(FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, OSConfigurator *_oscnf) : - NATCompiler(_db,fwname,_oscnf) , helper(this) + NATCompiler(_db, fwname, ipv6_policy, _oscnf) , helper(this) { } diff --git a/src/pix/NATCompiler_pix.h b/src/pix/NATCompiler_pix.h index 62a835ffe..17a794135 100644 --- a/src/pix/NATCompiler_pix.h +++ b/src/pix/NATCompiler_pix.h @@ -461,6 +461,7 @@ namespace fwcompiler { NATCompiler_pix(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, fwcompiler::OSConfigurator *_oscnf); virtual int prolog(); diff --git a/src/pix/OSConfigurator_pix_os.h b/src/pix/OSConfigurator_pix_os.h index 1ab028e7a..75214a3d9 100644 --- a/src/pix/OSConfigurator_pix_os.h +++ b/src/pix/OSConfigurator_pix_os.h @@ -60,8 +60,9 @@ namespace fwcompiler { virtual ~OSConfigurator_pix_os() {}; OSConfigurator_pix_os(libfwbuilder::FWObjectDatabase *_db, - const std::string &fwname) : - OSConfigurator(_db,fwname) {} + const std::string &fwname, + bool ipv6_policy) : + OSConfigurator(_db, fwname, ipv6_policy) {} virtual int prolog(); diff --git a/src/pix/PolicyCompiler_pix.cpp b/src/pix/PolicyCompiler_pix.cpp index 47ddd9d86..88076d998 100644 --- a/src/pix/PolicyCompiler_pix.cpp +++ b/src/pix/PolicyCompiler_pix.cpp @@ -66,9 +66,10 @@ string PolicyCompiler_pix::myPlatformName() { return "pix"; } PolicyCompiler_pix::PolicyCompiler_pix(FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, OSConfigurator *_oscnf, NATCompiler_pix *_natcmp) : - PolicyCompiler_cisco(_db,fwname,_oscnf) + PolicyCompiler_cisco(_db, fwname, ipv6_policy, _oscnf) { natcmp=_natcmp; resetinbound=false; diff --git a/src/pix/PolicyCompiler_pix.h b/src/pix/PolicyCompiler_pix.h index 674f36d7a..2788baba1 100644 --- a/src/pix/PolicyCompiler_pix.h +++ b/src/pix/PolicyCompiler_pix.h @@ -311,6 +311,7 @@ namespace fwcompiler { PolicyCompiler_pix(libfwbuilder::FWObjectDatabase *_db, const std::string &fwname, + bool ipv6_policy, fwcompiler::OSConfigurator *_oscnf, NATCompiler_pix *_natcmp); virtual ~PolicyCompiler_pix() {} diff --git a/src/pix/pix.cpp b/src/pix/pix.cpp index 9733cf43c..9f21d3639 100644 --- a/src/pix/pix.cpp +++ b/src/pix/pix.cpp @@ -291,7 +291,7 @@ int main(int argc, char * const * argv) if (only_print_inspection_code) { OSConfigurator_pix_os *oscnf=NULL; - oscnf=new OSConfigurator_pix_os(objdb , fwobjectname); + oscnf = new OSConfigurator_pix_os(objdb , fwobjectname, false); oscnf->prolog(); cout << oscnf->getProtocolInspectionCommands(); @@ -490,14 +490,14 @@ int main(int argc, char * const * argv) if (user_name==NULL) throw FWException("Can't figure out your user name, aborting"); - Preprocessor* prep=new Preprocessor(objdb , fwobjectname); + Preprocessor* prep=new Preprocessor(objdb , fwobjectname, false); prep->compile(); /* * Process firewall options, build OS network configuration script */ OSConfigurator *oscnf=NULL; - oscnf=new OSConfigurator_pix_os(objdb , fwobjectname); + oscnf = new OSConfigurator_pix_os(objdb , fwobjectname, false); oscnf->prolog(); oscnf->processFirewallOptions(); @@ -505,8 +505,8 @@ int main(int argc, char * const * argv) /* create compilers and run the whole thing */ - NATCompiler_pix *n=new NATCompiler_pix( objdb , - fwobjectname, oscnf ); + NATCompiler_pix *n = new NATCompiler_pix( objdb , + fwobjectname, false, oscnf ); if (test_mode) n->setTestMode(); n->setDebugLevel( dl ); @@ -520,9 +520,10 @@ int main(int argc, char * const * argv) cout << " Nothing to compile in NAT \n" << flush; - PolicyCompiler_pix *c=new PolicyCompiler_pix( objdb , - fwobjectname , - oscnf , n); + PolicyCompiler_pix *c = new PolicyCompiler_pix( objdb , + fwobjectname , + false, + oscnf , n); if (test_mode) c->setTestMode(); c->setDebugLevel( dl ); diff --git a/test/ipt/objects-for-regression-tests.fwb b/test/ipt/objects-for-regression-tests.fwb index 1eaf181ae..23f67ba50 100644 --- a/test/ipt/objects-for-regression-tests.fwb +++ b/test/ipt/objects-for-regression-tests.fwb @@ -1,6 +1,6 @@ - + @@ -11,13 +11,13 @@ - - - - - - - + + + + + + + @@ -25,6 +25,9 @@ + + + @@ -107,6 +110,17 @@ + + + + + + + + + + + @@ -119,9 +133,9 @@ - + + @@ -136,9 +150,9 @@ - + + @@ -153,9 +167,9 @@ - + + @@ -170,9 +184,9 @@ - + + @@ -187,9 +201,9 @@ - + + @@ -204,9 +218,9 @@ - + + @@ -221,9 +235,9 @@ - + + @@ -252,9 +266,9 @@ - + + @@ -268,9 +282,9 @@ - + + @@ -284,9 +298,9 @@ - + + @@ -300,9 +314,9 @@ - + + @@ -317,9 +331,9 @@ - + + @@ -394,9 +408,9 @@ - + + @@ -413,9 +427,9 @@ - + + @@ -435,9 +449,9 @@ - + + @@ -451,9 +465,9 @@ - + + @@ -467,9 +481,9 @@ - + + @@ -484,9 +498,9 @@ - + + @@ -501,9 +515,9 @@ - + + @@ -518,9 +532,9 @@ - + + @@ -535,9 +549,9 @@ - + + @@ -552,9 +566,9 @@ - + + @@ -618,9 +632,9 @@ - + + @@ -678,9 +692,9 @@ - + + @@ -695,9 +709,9 @@ - + + @@ -711,9 +725,9 @@ - + + @@ -752,9 +766,9 @@ - + + @@ -803,6 +817,7 @@ + @@ -819,7 +834,8 @@ - + + @@ -909,14 +925,17 @@ - + + - + + - + + @@ -932,52 +951,54 @@ - + + - + + - - - - - + + + + + -m ip_conntrack_talk -m ip_nat_talk - - - + + + - - + + -p tcp -m state --state ESTABLISHED --tcp-flags SYN,ACK,RST,URG ACK - - - + + + - - + + -p tcp -m state --state ESTABLISHED --tcp-flags SYN,FIN,RST,URG,PSH RST - - - + + + -m string --string test_pattern - + -m string --string test_pattern - - - + + + - - + + -p tcp ! --syn -dport 5190 -m state --state NEW - - - + + + @@ -1005,7 +1026,8 @@ - + + @@ -1025,7 +1047,8 @@ - + + @@ -1045,7 +1068,8 @@ - + + @@ -1065,7 +1089,8 @@ - + + @@ -1085,7 +1110,8 @@ - + + @@ -1106,7 +1132,8 @@ - + + @@ -1126,7 +1153,8 @@ - + + @@ -1146,7 +1174,8 @@ - + + @@ -1166,7 +1195,8 @@ - + + @@ -1186,7 +1216,8 @@ - + + @@ -1206,7 +1237,8 @@ - + + @@ -1226,7 +1258,8 @@ - + + @@ -1246,7 +1279,8 @@ - + + @@ -1266,7 +1300,8 @@ - + + @@ -1286,7 +1321,8 @@ - + + @@ -1306,7 +1342,8 @@ - + + @@ -1326,7 +1363,8 @@ - + + @@ -1346,7 +1384,8 @@ - + + @@ -1366,7 +1405,8 @@ - + + @@ -1386,7 +1426,8 @@ - + + @@ -1406,7 +1447,8 @@ - + + @@ -1426,7 +1468,8 @@ - + + @@ -1446,18 +1489,23 @@ - - + + + - + + - + + - + + - + + @@ -1468,13 +1516,17 @@ - + + - + + - + + - + + @@ -1486,13 +1538,17 @@ - + + - + + - + + - + + @@ -1503,13 +1559,17 @@ - + + - + + - + + - + + @@ -1519,13 +1579,17 @@ - + + - + + - + + - + + @@ -1536,13 +1600,17 @@ - + + - + + - + + - + + @@ -1552,14 +1620,18 @@ - + + - + + - + + - + + @@ -1568,10 +1640,10 @@ - - + @@ -1579,14 +1651,18 @@ - + + - + + - + + - + + @@ -1600,10 +1676,10 @@ - - + @@ -1611,14 +1687,18 @@ - + + - + + - + + - + + @@ -1627,10 +1707,10 @@ - - + @@ -1638,13 +1718,17 @@ - + + - + + - + + - + + @@ -1658,15 +1742,15 @@ - - - - + @@ -1674,13 +1758,17 @@ - + + - + + - + + - + + @@ -1694,15 +1782,15 @@ - - - - + @@ -1710,13 +1798,17 @@ - + + - + + - + + - + + @@ -1730,15 +1822,15 @@ - - - - + @@ -1746,13 +1838,17 @@ - + + - + + - + + - + + @@ -1766,15 +1862,15 @@ - - - - + @@ -1782,13 +1878,17 @@ - + + - + + - + + - + + @@ -1802,15 +1902,15 @@ - - - - + @@ -1818,13 +1918,17 @@ - + + - + + - + + - + + @@ -1838,15 +1942,15 @@ - - - - + @@ -1854,38 +1958,46 @@ - + + - + + - + + - + + - - + - + + - + + - + + - + + @@ -1895,13 +2007,17 @@ - + + - + + - + + - + + @@ -1912,14 +2028,18 @@ - + + - + + - + + - + + @@ -1930,16 +2050,20 @@ - + + - + + - + + - + + @@ -1947,32 +2071,40 @@ - + + - + + - + + - + + - + - - + + - + + - + + - + + @@ -1980,32 +2112,40 @@ - + + - + + - + + - + + - + - - + + - + + - + + - + + @@ -2013,13 +2153,17 @@ - + + - + + - + + - + + @@ -2027,13 +2171,17 @@ - + + - + + - + + - + + @@ -2041,13 +2189,17 @@ - + + - + + - + + - + + @@ -2055,13 +2207,17 @@ - + + - + + - + + - + + @@ -2070,13 +2226,17 @@ - + + - + + - + + - + + @@ -2084,13 +2244,17 @@ - + + - + + - + + - + + @@ -2098,32 +2262,40 @@ - + + - + + - + + - + + - + - - + + - + + - + + - + + @@ -2131,13 +2303,17 @@ - + + - + + - + + - + + @@ -2146,37 +2322,45 @@ - + + - + + - + + - + + - + - - + + - + + - + + - + + @@ -2184,13 +2368,17 @@ - + + - + + - + + - + + @@ -2198,16 +2386,20 @@ - + + - + + - + + - + + @@ -2215,73 +2407,89 @@ - + + - + + - + + - + + - + - - + + - + + - + + - + + - + - - + + - + + - + + - + + - + - - + + - + + - + + - + + @@ -2289,13 +2497,17 @@ - + + - + + - + + - + + @@ -2303,13 +2515,17 @@ - + + - + + - + + - + + @@ -2317,13 +2533,17 @@ - + + - + + - + + - + + @@ -2332,32 +2552,40 @@ - + + - + + - + + - + + - + - - + + - + + - + + - + + @@ -2365,14 +2593,18 @@ - + + - + + - + + - + + @@ -2380,13 +2612,17 @@ - + + - + + - + + - + + @@ -2394,86 +2630,89 @@ - + + - + + - + + - + + - + - + - - - - - + + + - + + - + - + - + + - - + - + + - + + + + + - - - + + - + + + @@ -2491,15 +2730,15 @@ - - + + + + + @@ -2508,7 +2747,7 @@ - + @@ -2531,7 +2770,8 @@ - + + @@ -2551,7 +2791,8 @@ - + + @@ -2571,7 +2812,8 @@ - + + @@ -2591,7 +2833,8 @@ - + + @@ -2611,7 +2854,8 @@ - + + @@ -2632,7 +2876,8 @@ - + + @@ -2652,7 +2897,8 @@ - + + @@ -2672,7 +2918,8 @@ - + + @@ -2692,7 +2939,8 @@ - + + @@ -2713,7 +2961,8 @@ - + + @@ -2733,7 +2982,8 @@ - + + @@ -2753,7 +3003,8 @@ - + + @@ -2773,7 +3024,8 @@ - + + @@ -2793,7 +3045,8 @@ - + + @@ -2813,7 +3066,8 @@ - + + @@ -2833,7 +3087,8 @@ - + + @@ -2857,7 +3112,8 @@ - + + @@ -2878,7 +3134,8 @@ - + + @@ -2899,18 +3156,23 @@ - - + + + - + + - + + - + + - + + @@ -2920,13 +3182,17 @@ - + + - + + - + + - + + @@ -2937,13 +3203,17 @@ - + + - + + - + + - + + @@ -2953,13 +3223,17 @@ - + + - + + - + + - + + @@ -2970,13 +3244,17 @@ - + + - + + - + + - + + @@ -2986,13 +3264,17 @@ - + + - + + - + + - + + @@ -3000,13 +3282,17 @@ - + + - + + - + + - + + @@ -3017,14 +3303,18 @@ - + + - + + - + + - + + @@ -3034,13 +3324,17 @@ - + + - + + - + + - + + @@ -3049,14 +3343,18 @@ - + + - + + - + + - + + @@ -3067,14 +3365,18 @@ - + + - + + - + + - + + @@ -3082,13 +3384,17 @@ - + + - + + - + + - + + @@ -3098,13 +3404,17 @@ - + + - + + - + + - + + @@ -3114,13 +3424,17 @@ - + + - + + - + + - + + @@ -3130,13 +3444,17 @@ - + + - + + - + + - + + @@ -3145,13 +3463,17 @@ - + + - + + - + + - + + @@ -3160,20 +3482,24 @@ - + + - + + - + + - + + - - @@ -3181,24 +3507,28 @@ - + + - + + - + + - + + - - + @@ -3207,24 +3537,28 @@ - + + - + + - + + - + + - - + @@ -3233,13 +3567,17 @@ - + + - + + - + + - + + @@ -3250,13 +3588,17 @@ - + + - + + - + + - + + @@ -3267,13 +3609,17 @@ - + + - + + - + + - + + @@ -3284,14 +3630,18 @@ - + + - + + - + + - + + @@ -3302,14 +3652,18 @@ - + + - + + - + + - + + @@ -3319,15 +3673,19 @@ - + + - + + - + + - + + @@ -3337,15 +3695,19 @@ - + + - + + - + + - + + @@ -3353,14 +3715,18 @@ - + + - + + - + + - + + @@ -3368,14 +3734,18 @@ - + + - + + - + + - + + @@ -3383,14 +3753,18 @@ - + + - + + - + + - + + @@ -3398,14 +3772,18 @@ - + + - + + - + + - + + @@ -3413,14 +3791,18 @@ - + + - + + - + + - + + @@ -3428,14 +3810,18 @@ - + + - + + - + + - + + @@ -3443,13 +3829,17 @@ - + + - + + - + + - + + @@ -3458,14 +3848,18 @@ - + + - + + - + + - + + @@ -3473,13 +3867,17 @@ - + + - + + - + + - + + @@ -3489,13 +3887,17 @@ - + + - + + - + + - + + @@ -3505,14 +3907,18 @@ - + + - + + - + + - + + @@ -3521,13 +3927,17 @@ - + + - + + - + + - + + @@ -3535,13 +3945,17 @@ - + + - + + - + + - + + @@ -3550,13 +3964,17 @@ - + + - + + - + + - + + @@ -3564,13 +3982,17 @@ - + + - + + - + + - + + @@ -3578,96 +4000,102 @@ - + + - + + - + + - + + - - + + - - - - - + + + - + + - + + - + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -3677,24 +4105,24 @@ - - - - - + + + + @@ -3704,8 +4132,8 @@ - - + + @@ -3727,9 +4155,10 @@ - - + + @@ -3750,9 +4179,10 @@ - - + + @@ -3775,9 +4205,10 @@ - - + + @@ -3797,9 +4228,10 @@ - - + + @@ -3819,9 +4251,33 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3841,9 +4297,10 @@ - - + + @@ -3863,9 +4320,10 @@ - - + + @@ -3886,7 +4344,8 @@ - + + @@ -3910,7 +4369,8 @@ - + + @@ -3932,7 +4392,8 @@ - + + @@ -3956,7 +4417,8 @@ - + + @@ -3978,7 +4440,8 @@ - + + @@ -3999,7 +4462,8 @@ - + + @@ -4021,7 +4485,8 @@ - + + @@ -4042,7 +4507,8 @@ - + + @@ -4063,7 +4529,8 @@ - + + @@ -4083,7 +4550,8 @@ - + + @@ -4103,9 +4571,10 @@ - - + + @@ -4125,7 +4594,8 @@ - + + @@ -4145,7 +4615,8 @@ - + + @@ -4165,7 +4636,8 @@ - + + @@ -4185,7 +4657,8 @@ - + + @@ -4205,7 +4678,8 @@ - + + @@ -4226,7 +4700,8 @@ - + + @@ -4246,7 +4721,8 @@ - + + @@ -4267,7 +4743,8 @@ - + + @@ -4287,7 +4764,8 @@ - + + @@ -4311,7 +4789,8 @@ - + + @@ -4331,7 +4810,8 @@ - + + @@ -4352,7 +4832,8 @@ - + + @@ -4372,7 +4853,8 @@ - + + @@ -4392,7 +4874,8 @@ - + + @@ -4412,7 +4895,8 @@ - + + @@ -4432,7 +4916,8 @@ - + + @@ -4452,7 +4937,8 @@ - + + @@ -4472,7 +4958,8 @@ - + + @@ -4492,7 +4979,8 @@ - + + @@ -4514,7 +5002,8 @@ - + + @@ -4536,7 +5025,8 @@ - + + @@ -4558,7 +5048,8 @@ - + + @@ -4580,7 +5071,8 @@ - + + @@ -4602,7 +5094,8 @@ - + + @@ -4624,7 +5117,8 @@ - + + @@ -4646,7 +5140,8 @@ - + + @@ -4668,24 +5163,29 @@ - - + + + - + + - + + - + + - + + - + @@ -4695,18 +5195,22 @@ - + + - + + - + + - + + - + @@ -4715,30 +5219,34 @@ - + + - + + - + + - + + - - - - + @@ -4746,31 +5254,35 @@ - + + - + + - + + - + + - - - - + @@ -4778,14 +5290,18 @@ - + + - + + - + + - + + @@ -4793,14 +5309,18 @@ - + + - + + - + + - + + @@ -4808,14 +5328,18 @@ - + + - + + - + + - + + @@ -4823,13 +5347,17 @@ - + + - + + - + + - + + @@ -4839,35 +5367,43 @@ - + + - + + - + + - + + - - + + - + + - + + - + + - @@ -4876,34 +5412,42 @@ - + + - + + - + + - + + - - - + + - + + - + + - + + @@ -4912,13 +5456,17 @@ - + + - + + - + + - + + @@ -4926,14 +5474,18 @@ - + + - + + - + + - + + @@ -4942,13 +5494,17 @@ - + + - + + - + + - + + @@ -4959,13 +5515,17 @@ - + + - + + - + + - + + @@ -4973,13 +5533,17 @@ - + + - + + - + + - + + @@ -4989,34 +5553,42 @@ - + + - + + - + + - + + - - - + + - + + - + + - + + @@ -5024,92 +5596,98 @@ - + + - + + - + + - + + - - - - - - + + + - + + - + + - + + - + + - + - + - + + - + - + - - + + - - - + + + + - + - + + + @@ -5123,21 +5701,21 @@ - - - - + + + + @@ -5148,7 +5726,7 @@ - + @@ -5171,9 +5749,10 @@ - - + + @@ -5193,20 +5772,25 @@ - - - + + + - + + - + + - + + - + + @@ -5214,13 +5798,17 @@ - + + - + + - + + - + + @@ -5230,30 +5818,34 @@ - + + - + + - + + - + + - - - - + @@ -5261,31 +5853,35 @@ - + + - + + - + + - + + - - - - + @@ -5293,13 +5889,17 @@ - + + - + + - + + - + + @@ -5307,14 +5907,18 @@ - + + - + + - + + - + + @@ -5322,13 +5926,17 @@ - + + - + + - + + - + + @@ -5336,14 +5944,18 @@ - + + - + + - + + - + + @@ -5351,13 +5963,17 @@ - + + - + + - + + - + + @@ -5365,14 +5981,18 @@ - + + - + + - + + - + + @@ -5381,13 +6001,17 @@ - + + - + + - + + - + + @@ -5398,13 +6022,17 @@ - + + - + + - + + - + + @@ -5414,29 +6042,37 @@ - + + - + + - + + - + + - - + + - + + - + + - + + @@ -5445,30 +6081,38 @@ - + + - + + - + + - + + - - + + - + + - + + - + + @@ -5476,13 +6120,17 @@ - + + - + + - + + - + + @@ -5490,14 +6138,18 @@ - + + - + + - + + - + + @@ -5505,65 +6157,81 @@ - + + - + + - + + - + + - - + + - + + - + + - + + - - + + - + + - + + - + + - - + + - + + - + + - + + @@ -5571,13 +6239,17 @@ - + + - + + - + + - + + @@ -5585,88 +6257,93 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - + - + - + + - + - + - - + + + - + + + + + + + + + + + + + + + - + + + @@ -5676,24 +6353,24 @@ - - - - - + + + + @@ -5702,7 +6379,7 @@ - + @@ -5725,9 +6402,10 @@ - - + + @@ -5747,7 +6425,8 @@ - + + @@ -5767,7 +6446,8 @@ - + + @@ -5787,9 +6467,10 @@ - - + + @@ -5810,7 +6491,8 @@ - + + @@ -5830,7 +6512,8 @@ - + + @@ -5850,19 +6533,24 @@ - - + + + - + + - + + - + + - + + @@ -5873,13 +6561,17 @@ - + + - + + - + + - + + @@ -5889,13 +6581,17 @@ - + + - + + - + + - + + @@ -5905,13 +6601,17 @@ - + + - + + - + + - + + @@ -5919,13 +6619,17 @@ - + + - + + - + + - + + @@ -5935,13 +6639,17 @@ - + + - + + - + + - + + @@ -5955,15 +6663,15 @@ - - - - + @@ -5971,13 +6679,17 @@ - + + - + + - + + - + + @@ -5991,15 +6703,15 @@ - - - - + @@ -6007,13 +6719,17 @@ - + + - + + - + + - + + @@ -6027,15 +6743,15 @@ - - - - + @@ -6043,13 +6759,17 @@ - + + - + + - + + - + + @@ -6063,15 +6783,15 @@ - - - - + @@ -6079,13 +6799,17 @@ - + + - + + - + + - + + @@ -6099,15 +6823,15 @@ - - - - + @@ -6115,13 +6839,17 @@ - + + - + + - + + - + + @@ -6135,15 +6863,15 @@ - - - - + @@ -6152,17 +6880,21 @@ - + + - + + - + + - + + - @@ -6170,49 +6902,61 @@ - + + - + + - + + - + + - - + + - + + - + + - + + - - + + - + + - + + - + + @@ -6222,13 +6966,17 @@ - + + - + + - + + - + + @@ -6236,13 +6984,17 @@ - + + - + + - + + - + + @@ -6250,29 +7002,37 @@ - + + - + + - + + - + + - - + + - + + - + + - + + @@ -6280,90 +7040,96 @@ - + + - + + - + + - + + - - - - - - + + + - + + - + + - + + - + + - + - + - + + - + - + - - + + - + + + + + + + + + + + + + + + - + + + @@ -6373,25 +7139,25 @@ - - - - - + + + + @@ -6400,7 +7166,7 @@ - + @@ -6423,7 +7189,8 @@ - + + @@ -6443,7 +7210,8 @@ - + + @@ -6463,7 +7231,8 @@ - + + @@ -6483,19 +7252,24 @@ - - + + + - + + - + + - + + - + + @@ -6506,13 +7280,17 @@ - + + - + + - + + - + + @@ -6522,29 +7300,37 @@ - + + - + + - + + - + + - - + + - + + - + + - + + @@ -6552,13 +7338,17 @@ - + + - + + - + + - + + @@ -6566,13 +7356,17 @@ - + + - + + - + + - + + @@ -6580,14 +7374,18 @@ - + + - + + - + + - + + @@ -6595,14 +7393,18 @@ - + + - + + - + + - + + @@ -6610,14 +7412,18 @@ - + + - + + - + + - + + @@ -6625,13 +7431,17 @@ - + + - + + - + + - + + @@ -6639,13 +7449,17 @@ - + + - + + - + + - + + @@ -6653,13 +7467,17 @@ - + + - + + - + + - + + @@ -6668,13 +7486,17 @@ - + + - + + - + + - + + @@ -6682,100 +7504,105 @@ - + + - + + - + + - + + - + + - - - - - - + + + - + + - + + - - + + + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - - + + + @@ -6783,21 +7610,24 @@ - + - - - + + - + + - + + - + + - + + @@ -6807,13 +7637,17 @@ - + + - + + - + + - + + @@ -6821,13 +7655,17 @@ - + + - + + - + + - + + @@ -6835,13 +7673,17 @@ - + + - + + - + + - + + @@ -6849,13 +7691,17 @@ - + + - + + - + + - + + @@ -6865,18 +7711,22 @@ - + + - + + - + + - + + @@ -6884,13 +7734,17 @@ - + + - + + - + + - + + @@ -6898,13 +7752,17 @@ - + + - + + - + + - + + @@ -6912,101 +7770,104 @@ - + + - + + - + + - + + - - - - - - - + + + - + + - + - + - + - + + - + + + + + - + + + + + + + + - + + + - - - + + + @@ -7015,7 +7876,7 @@ - + @@ -7038,7 +7899,8 @@ - + + @@ -7058,7 +7920,8 @@ - + + @@ -7078,7 +7941,8 @@ - + + @@ -7099,7 +7963,8 @@ - + + @@ -7120,7 +7985,8 @@ - + + @@ -7141,7 +8007,8 @@ - + + @@ -7161,7 +8028,8 @@ - + + @@ -7181,7 +8049,8 @@ - + + @@ -7201,7 +8070,8 @@ - + + @@ -7221,18 +8091,23 @@ - - + + + - + + - + + - + + - + + @@ -7242,13 +8117,17 @@ - + + - + + - + + - + + @@ -7258,13 +8137,17 @@ - + + - + + - + + - + + @@ -7272,79 +8155,85 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -7361,10 +8250,10 @@ - + + + @@ -7373,7 +8262,7 @@ - + @@ -7396,18 +8285,23 @@ - - + + + - + + - + + - + + - + + @@ -7415,13 +8309,17 @@ - + + - + + - + + - + + @@ -7429,13 +8327,17 @@ - + + - + + - + + - + + @@ -7443,13 +8345,17 @@ - + + - + + - + + - + + @@ -7457,13 +8363,17 @@ - + + - + + - + + - + + @@ -7471,13 +8381,17 @@ - + + - + + - + + - + + @@ -7485,13 +8399,17 @@ - + + - + + - + + - + + @@ -7499,13 +8417,17 @@ - + + - + + - + + - + + @@ -7515,13 +8437,17 @@ - + + - + + - + + - + + @@ -7529,13 +8455,17 @@ - + + - + + - + + - + + @@ -7543,13 +8473,17 @@ - + + - + + - + + - + + @@ -7557,13 +8491,17 @@ - + + - + + - + + - + + @@ -7571,13 +8509,17 @@ - + + - + + - + + - + + @@ -7585,13 +8527,17 @@ - + + - + + - + + - + + @@ -7599,13 +8545,17 @@ - + + - + + - + + - + + @@ -7613,81 +8563,87 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -7696,7 +8652,7 @@ - @@ -7704,10 +8660,10 @@ - + + + @@ -7716,36 +8672,35 @@ - + - - - - - - - - + + + + - + + - + + - - + + + - + - + @@ -7753,28 +8708,28 @@ - + + + + + + + + + + + + + + + - + + + @@ -7786,10 +8741,10 @@ - + + + @@ -7797,199 +8752,234 @@ - + - - - + + - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - + @@ -7998,23 +8988,27 @@ - + + - + + - + + - + + - - + @@ -8023,24 +9017,28 @@ - + + - + + - + + - + + - - + @@ -8049,86 +9047,90 @@ - + + - + + - + + - + + - - + - - - - - + + + - + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -8146,9 +9148,9 @@ - + + @@ -8157,30 +9159,33 @@ - + - - - + + - + + - + + - + + - + + - - + @@ -8188,208 +9193,236 @@ - + + - + + - + + - + + - - - - + + - + + - + + - + + - - - - + + - + + - + + - + + - - - - + + - + + - + + - + + - - - - + + - + + - + + - + + - - - - + + - + + - + + - + + - - - - + + - + + - + + - + + - - - - - - - - + + + - + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -8398,7 +9431,7 @@ - @@ -8407,9 +9440,9 @@ - + + @@ -8418,7 +9451,7 @@ - + @@ -8441,7 +9474,8 @@ - + + @@ -8461,18 +9495,23 @@ - - + + + - + + - + + - + + - + + @@ -8480,13 +9519,17 @@ - + + - + + - + + - + + @@ -8494,13 +9537,17 @@ - + + - + + - + + - + + @@ -8508,13 +9555,17 @@ - + + - + + - + + - + + @@ -8522,13 +9573,17 @@ - + + - + + - + + - + + @@ -8536,23 +9591,27 @@ - + + - + + - + + - + + - - - + @@ -8560,13 +9619,17 @@ - + + - + + - + + - + + @@ -8574,14 +9637,18 @@ - + + - + + - + + - + + @@ -8589,13 +9656,17 @@ - + + - + + - + + - + + @@ -8603,14 +9674,18 @@ - + + - + + - + + - + + @@ -8618,13 +9693,17 @@ - + + - + + - + + - + + @@ -8632,13 +9711,17 @@ - + + - + + - + + - + + @@ -8646,13 +9729,17 @@ - + + - + + - + + - + + @@ -8660,13 +9747,17 @@ - + + - + + - + + - + + @@ -8676,13 +9767,17 @@ - + + - + + - + + - + + @@ -8690,13 +9785,17 @@ - + + - + + - + + - + + @@ -8704,13 +9803,17 @@ - + + - + + - + + - + + @@ -8718,13 +9821,17 @@ - + + - + + - + + - + + @@ -8732,13 +9839,17 @@ - + + - + + - + + - + + @@ -8748,89 +9859,96 @@ - + + - + + - + + - + + - - - + - - - - - + + + + + - + + + - - + + + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -8840,24 +9958,24 @@ - - - - - + + + + @@ -8867,7 +9985,7 @@ - + @@ -8890,7 +10008,8 @@ - + + @@ -8910,7 +10029,8 @@ - + + @@ -8930,7 +10050,8 @@ - + + @@ -8950,7 +10071,8 @@ - + + @@ -8970,7 +10092,8 @@ - + + @@ -8990,7 +10113,8 @@ - + + @@ -9010,7 +10134,8 @@ - + + @@ -9030,7 +10155,8 @@ - + + @@ -9050,7 +10176,8 @@ - + + @@ -9070,18 +10197,23 @@ - - + + + - + + - + + - + + - + + @@ -9089,70 +10221,73 @@ - + + - + + - + + - + + - - - - - + + + - + + - + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -9164,9 +10299,9 @@ - + + @@ -9174,7 +10309,7 @@ - + @@ -9197,7 +10332,8 @@ - + + @@ -9217,18 +10353,23 @@ - - + + + - + + - + + - + + - + + @@ -9236,13 +10377,17 @@ - + + - + + - + + - + + @@ -9250,70 +10395,73 @@ - + + - + + - + + - + + - - - - - + + + - + + - + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -9325,9 +10473,9 @@ - + + @@ -9335,7 +10483,7 @@ - + @@ -9358,7 +10506,8 @@ - + + @@ -9378,7 +10527,8 @@ - + + @@ -9398,7 +10548,8 @@ - + + @@ -9418,7 +10569,8 @@ - + + @@ -9438,7 +10590,8 @@ - + + @@ -9458,7 +10611,8 @@ - + + @@ -9478,62 +10632,62 @@ - - - - - - - + + + + + - + + - + + - + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -9545,9 +10699,9 @@ - + + @@ -9555,21 +10709,24 @@ - + - - - + + - + + - + + - + + - + + @@ -9577,72 +10734,76 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -9654,9 +10815,9 @@ - + + @@ -9664,7 +10825,7 @@ - + @@ -9687,7 +10848,8 @@ - + + @@ -9707,7 +10869,8 @@ - + + @@ -9727,7 +10890,8 @@ - + + @@ -9748,7 +10912,8 @@ - + + @@ -9768,7 +10933,8 @@ - + + @@ -9788,7 +10954,8 @@ - + + @@ -9808,7 +10975,8 @@ - + + @@ -9829,7 +10997,8 @@ - + + @@ -9849,7 +11018,8 @@ - + + @@ -9869,7 +11039,8 @@ - + + @@ -9889,7 +11060,8 @@ - + + @@ -9910,7 +11082,8 @@ - + + @@ -9930,7 +11103,8 @@ - + + @@ -9950,18 +11124,23 @@ - - + + + - + + - + + - + + - + + @@ -9969,78 +11148,82 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -10052,15 +11235,15 @@ - - - + + + @@ -10069,7 +11252,7 @@ - + @@ -10092,7 +11275,8 @@ - + + @@ -10112,18 +11296,23 @@ - - + + + - + + - + + - + + - + + @@ -10133,23 +11322,27 @@ - + + - + + - + + - + + - - - + @@ -10158,23 +11351,27 @@ - + + - + + - + + - + + - - - + @@ -10183,24 +11380,28 @@ - + + - + + - + + - + + - - - + + @@ -10208,14 +11409,18 @@ - + + - + + - + + - + + @@ -10225,13 +11430,17 @@ - + + - + + - + + - + + @@ -10241,81 +11450,87 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -10332,10 +11547,10 @@ - + + + @@ -10344,7 +11559,7 @@ - + @@ -10367,7 +11582,8 @@ - + + @@ -10387,7 +11603,8 @@ - + + @@ -10407,7 +11624,8 @@ - + + @@ -10427,7 +11645,8 @@ - + + @@ -10447,7 +11666,8 @@ - + + @@ -10467,7 +11687,8 @@ - + + @@ -10487,18 +11708,23 @@ - - + + + - + + - + + - + + - + + @@ -10508,13 +11734,17 @@ - + + - + + - + + - + + @@ -10522,13 +11752,17 @@ - + + - + + - + + - + + @@ -10538,13 +11772,17 @@ - + + - + + - + + - + + @@ -10552,78 +11790,84 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - - + + + - + - + + - + - - - + + + + + - + + + + + + + + - + + + @@ -10635,9 +11879,9 @@ - + + @@ -10645,21 +11889,24 @@ - + - - - + + - + + - + + - + + - + + @@ -10667,17 +11914,21 @@ - + + - + + - + + - + + @@ -10685,13 +11936,17 @@ - + + - + + - + + - + + @@ -10699,13 +11954,17 @@ - + + - + + - + + - + + @@ -10713,35 +11972,43 @@ - + + - + + - + + - + + - - + - + + - + + - + + - + + @@ -10751,35 +12018,43 @@ - + + - + + - + + - + + - - - + - + + - + + - + + - + + @@ -10787,13 +12062,17 @@ - + + - + + - + + - + + @@ -10803,13 +12082,17 @@ - + + - + + - + + - + + @@ -10819,22 +12102,26 @@ - + + - + + - + + - + + - - + @@ -10842,14 +12129,18 @@ - + + - + + - + + - + + @@ -10857,13 +12148,17 @@ - + + - + + - + + - + + @@ -10873,74 +12168,80 @@ - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - - + + + - + - + - - + + + + + - + + + + + + + + - + + + @@ -10952,9 +12253,9 @@ - + + @@ -10962,7 +12263,7 @@ - + @@ -10985,7 +12286,8 @@ - + + @@ -11005,7 +12307,8 @@ - + + @@ -11025,7 +12328,8 @@ - + + @@ -11045,18 +12349,23 @@ - - + + + - + + - + + - + + - + + @@ -11066,13 +12375,17 @@ - + + - + + - + + - + + @@ -11082,13 +12395,17 @@ - + + - + + - + + - + + @@ -11098,14 +12415,18 @@ - + + - + + - + + - + + @@ -11113,14 +12434,18 @@ - + + - + + - + + - + + @@ -11130,13 +12455,17 @@ - + + - + + - + + - + + @@ -11144,13 +12473,17 @@ - + + - + + - + + - + + @@ -11160,29 +12493,37 @@ - + + - + + - + + - + + - - + + - + + - + + - + + @@ -11190,13 +12531,17 @@ - + + - + + - + + - + + @@ -11204,13 +12549,17 @@ - + + - + + - + + - + + @@ -11218,14 +12567,18 @@ - + + - + + - + + - + + @@ -11233,14 +12586,18 @@ - + + - + + - + + - + + @@ -11248,14 +12605,18 @@ - + + - + + - + + - + + @@ -11263,13 +12624,17 @@ - + + - + + - + + - + + @@ -11277,13 +12642,17 @@ - + + - + + - + + - + + @@ -11291,13 +12660,17 @@ - + + - + + - + + - + + @@ -11306,13 +12679,17 @@ - + + - + + - + + - + + @@ -11320,100 +12697,104 @@ - + + - + + - + + - + + - + + - - - - - - + + + - + + - + + - + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - - + + + @@ -11421,7 +12802,7 @@ - + @@ -11445,18 +12826,23 @@ - - + + + - + + - + + - + + - + + @@ -11466,13 +12852,17 @@ - + + - + + - + + - + + @@ -11480,14 +12870,18 @@ - + + - + + - + + - + + @@ -11495,75 +12889,80 @@ - + + - + + - + + - + + - - - - - + + + + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -11580,10 +12979,10 @@ - + + + @@ -11592,7 +12991,7 @@ - + @@ -11615,7 +13014,8 @@ - + + @@ -11635,7 +13035,8 @@ - + + @@ -11655,18 +13056,23 @@ - - + + + - + + - + + - + + - + + @@ -11676,101 +13082,104 @@ - + + - + + - + + - + + - + - - - - - - - + + + - + + - + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - - + + + @@ -11778,21 +13187,24 @@ - + - - - + + - + + - + + - + + - + + @@ -11800,13 +13212,17 @@ - + + - + + - + + - + + @@ -11814,13 +13230,17 @@ - + + - + + - + + - + + @@ -11828,13 +13248,17 @@ - + + - + + - + + - + + @@ -11842,13 +13266,17 @@ - + + - + + - + + - + + @@ -11856,13 +13284,17 @@ - + + - + + - + + - + + @@ -11870,13 +13302,17 @@ - + + - + + - + + - + + @@ -11884,13 +13320,17 @@ - + + - + + - + + - + + @@ -11898,14 +13338,18 @@ - + + - + + - + + - + + @@ -11913,14 +13357,18 @@ - + + - + + - + + - + + @@ -11928,13 +13376,17 @@ - + + - + + - + + - + + @@ -11942,13 +13394,17 @@ - + + - + + - + + - + + @@ -11956,13 +13412,17 @@ - + + - + + - + + - + + @@ -11972,13 +13432,17 @@ - + + - + + - + + - + + @@ -11986,13 +13450,17 @@ - + + - + + - + + - + + @@ -12000,13 +13468,17 @@ - + + - + + - + + - + + @@ -12014,73 +13486,77 @@ - + + - + + - + + - + + - - - - - + + + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -12089,7 +13565,7 @@ - @@ -12097,10 +13573,10 @@ - + + + @@ -12109,21 +13585,24 @@ - + - - - + + - + + - + + - + + - + + @@ -12131,13 +13610,17 @@ - + + - + + - + + - + + @@ -12145,13 +13628,17 @@ - + + - + + - + + - + + @@ -12159,13 +13646,17 @@ - + + - + + - + + - + + @@ -12173,13 +13664,17 @@ - + + - + + - + + - + + @@ -12187,13 +13682,17 @@ - + + - + + - + + - + + @@ -12201,13 +13700,17 @@ - + + - + + - + + - + + @@ -12215,13 +13718,17 @@ - + + - + + - + + - + + @@ -12229,13 +13736,17 @@ - + + - + + - + + - + + @@ -12243,13 +13754,17 @@ - + + - + + - + + - + + @@ -12257,13 +13772,17 @@ - + + - + + - + + - + + @@ -12271,14 +13790,18 @@ - + + - + + - + + - + + @@ -12286,13 +13809,17 @@ - + + - + + - + + - + + @@ -12300,14 +13827,18 @@ - + + - + + - + + - + + @@ -12315,13 +13846,17 @@ - + + - + + - + + - + + @@ -12329,13 +13864,17 @@ - + + - + + - + + - + + @@ -12343,13 +13882,17 @@ - + + - + + - + + - + + @@ -12359,13 +13902,17 @@ - + + - + + - + + - + + @@ -12373,13 +13920,17 @@ - + + - + + - + + - + + @@ -12387,13 +13938,17 @@ - + + - + + - + + - + + @@ -12401,73 +13956,77 @@ - + + - + + - + + - + + - - - - - + + + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -12476,7 +14035,7 @@ - @@ -12484,10 +14043,10 @@ - + + + @@ -12496,21 +14055,24 @@ - + - - - + + - + + - + + - + + - + + @@ -12520,13 +14082,17 @@ - + + - + + - + + - + + @@ -12534,15 +14100,19 @@ - + + - + + - + + - + + @@ -12550,13 +14120,17 @@ - + + - + + - + + - + + @@ -12564,34 +14138,37 @@ - + + - + + - + + - + + - - - - - + + + - + + - + - + - + @@ -12713,7 +14290,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -12733,7 +14311,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -12753,7 +14332,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -12773,18 +14353,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -12794,13 +14379,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12810,13 +14399,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12826,14 +14419,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12841,14 +14438,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12858,13 +14459,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12874,29 +14479,37 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + + - + + - + + @@ -12904,13 +14517,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12918,13 +14535,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12932,14 +14553,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12947,14 +14572,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12962,14 +14591,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12977,13 +14610,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -12991,13 +14628,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13005,13 +14646,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13020,13 +14665,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13034,97 +14683,101 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + + - - - - - - + + + - + + - + + - + - + - + + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - @@ -13132,13 +14785,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + + @@ -13147,7 +14800,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -13170,7 +14823,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -13190,7 +14844,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -13210,7 +14865,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -13230,18 +14886,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -13251,13 +14912,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13267,13 +14932,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13283,14 +14952,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13298,14 +14971,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13315,13 +14992,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13331,29 +15012,37 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + + - + + - + + @@ -13361,13 +15050,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13375,13 +15068,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13389,14 +15086,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13404,14 +15105,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13419,14 +15124,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13434,13 +15143,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13448,13 +15161,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13462,13 +15179,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13477,13 +15198,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13491,95 +15216,99 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + + - - - - - - + + + + - + + - + - + - + + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - @@ -13587,13 +15316,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + + @@ -13602,7 +15331,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -13625,7 +15354,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -13645,7 +15375,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -13665,7 +15396,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -13685,18 +15417,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -13706,13 +15443,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13722,13 +15463,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13738,14 +15483,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13753,14 +15502,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13770,13 +15523,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13786,29 +15543,37 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + + - + + - + + @@ -13816,13 +15581,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13830,13 +15599,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13844,14 +15617,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13859,14 +15636,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13874,14 +15655,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13889,13 +15674,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13903,13 +15692,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13917,13 +15710,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13932,13 +15729,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -13946,97 +15747,101 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + + - - - - - - + + + - + + - + + - + - + - + + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - @@ -14044,13 +15849,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + + @@ -14059,7 +15864,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -14082,18 +15887,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -14101,13 +15911,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14117,13 +15931,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14131,76 +15949,79 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - + - + - + + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -14212,15 +16033,15 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + @@ -14229,7 +16050,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -14253,18 +16074,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -14274,13 +16100,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14288,14 +16118,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14303,75 +16137,80 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -14388,10 +16227,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + + @@ -14400,21 +16239,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -14422,13 +16264,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14436,77 +16282,81 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -14523,10 +16373,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + + @@ -14535,21 +16385,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -14559,13 +16412,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14573,13 +16430,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14587,13 +16448,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14601,13 +16466,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14615,13 +16484,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14630,77 +16503,81 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - - + + + - + - + + - + - + - + + + + + + + + + + + + + + + - + + + @@ -14712,17 +16589,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + + + @@ -14731,7 +16608,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -14754,19 +16631,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -14776,13 +16658,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14790,13 +16676,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -14804,81 +16694,85 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -14892,20 +16786,20 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - + + + + @@ -14915,7 +16809,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -14938,7 +16832,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -14958,7 +16853,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -14978,7 +16874,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -14999,7 +16896,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -15020,19 +16918,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -15042,13 +16945,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15056,13 +16963,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15070,13 +16981,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15084,13 +16999,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15098,13 +17017,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15114,13 +17037,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15130,13 +17057,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15144,13 +17075,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15158,14 +17093,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15173,14 +17112,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15188,14 +17131,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15203,13 +17150,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15220,81 +17171,85 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -15308,20 +17263,20 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - + + + + @@ -15331,7 +17286,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -15354,7 +17309,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -15374,18 +17330,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -15395,13 +17356,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + @@ -15409,13 +17370,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15425,13 +17390,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15441,14 +17410,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15458,14 +17431,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15475,13 +17452,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15492,13 +17473,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15509,13 +17494,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15523,14 +17512,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15538,13 +17531,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15552,13 +17549,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15566,13 +17567,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15582,13 +17587,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15598,13 +17607,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15614,13 +17627,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15630,79 +17647,79 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + - - - - - + + + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -15716,20 +17733,20 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - + + + + @@ -15739,7 +17756,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -15762,7 +17779,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -15782,18 +17800,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -15801,13 +17824,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15817,13 +17844,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15833,14 +17864,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15850,14 +17885,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15867,13 +17906,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15884,13 +17927,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15901,13 +17948,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15915,14 +17966,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15930,13 +17985,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15944,13 +18003,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -15958,81 +18021,85 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -16046,20 +18113,20 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - + + + + @@ -16069,7 +18136,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -16092,18 +18159,23 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + @@ -16111,212 +18183,235 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + + + + + + - + - + - - + + - + + - + + - + + - + + + + + + - + - + - - + + - + + - + + - + + - + + + + + + - - - + - - + + - + + - + + - + + - + + + + + + - - - + - - + + - + + - + + - + + - + + + + + + - - - + - - + + - + + - + + - + + - - - + + @@ -16328,7 +18423,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -16339,44 +18435,48 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + - + - + + + - + - - @@ -16391,10 +18491,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -16414,11 +18514,11 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -16427,7 +18527,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -16451,43 +18551,52 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + - - - + + - + + - + + - + + - - @@ -16495,126 +18604,150 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - - - + + - + + - + + - + + - + - - - + + - + + - + + - + + - + - - @@ -16622,88 +18755,104 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - - - + + - + + - + + - + + - + - - - + + - + + - + + - + + - + - - - + + - + + - + + - + + @@ -16713,17 +18862,21 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - @@ -16731,30 +18884,34 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - @@ -16762,13 +18919,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - @@ -16776,17 +18933,21 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - @@ -16794,13 +18955,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - @@ -16808,17 +18969,21 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - @@ -16826,30 +18991,34 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - @@ -16857,30 +19026,34 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - @@ -16888,30 +19061,34 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - @@ -16919,30 +19096,34 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - @@ -16950,89 +19131,97 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - - + + - + - - + - @@ -17040,38 +19229,42 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -17079,180 +19272,196 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - + - - - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -17264,15 +19473,15 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + @@ -17281,7 +19490,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -17305,7 +19514,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -17325,275 +19535,316 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + - + - + + - + + - + + - + + - + - + + - + + - + + - + + - + - + + - + + - + + - + + - + - + + - + + - + + - + + - + + + + - + - - + - - + + - + + - + + - + + - + + + + - + - - + - - + + - + + - + + - + + - + + + + - + - - + - - + + - + + - + + - + + - + + + + - + - - + - - + + - + + - + + - + + - + + + + - + - - + - - + + - + + - + + - + + @@ -17601,13 +19852,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17615,14 +19870,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17630,14 +19889,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17645,13 +19908,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17661,13 +19928,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17675,78 +19946,82 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -17758,16 +20033,16 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + + @@ -17776,22 +20051,25 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -17799,14 +20077,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17814,14 +20096,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17829,14 +20115,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17844,14 +20134,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17859,14 +20153,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17874,14 +20172,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17889,14 +20191,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17904,14 +20210,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17919,14 +20229,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -17936,85 +20250,101 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + - + + - + + - + + - - - - - + + - + + - + + - + + - - - - - + + - + + - + + - + + @@ -18022,14 +20352,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18037,14 +20371,18 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18052,13 +20390,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18066,13 +20408,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18080,13 +20426,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18096,13 +20446,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18110,13 +20464,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18124,13 +20482,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18138,73 +20500,78 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + + - + + - - + + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -18213,7 +20580,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - @@ -18221,10 +20588,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + + @@ -18233,7 +20600,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -18257,25 +20624,30 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + - - @@ -18283,20 +20655,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - @@ -18304,20 +20680,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - @@ -18325,20 +20705,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - @@ -18346,40 +20730,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + - - + - @@ -18387,13 +20775,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -18405,17 +20797,21 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - @@ -18424,53 +20820,57 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + - - + + - + + - + + - + + - - - + + - + - - + - @@ -18478,40 +20878,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + - - + - @@ -18519,40 +20923,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + - - + - @@ -18560,40 +20968,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + - - + - @@ -18601,40 +21013,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + - - + - @@ -18642,64 +21058,72 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + - + - - + - - + + - + + - + + - + + - - + @@ -18707,390 +21131,452 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + - + - - - + + - + + - + + - + + - + - - - + + - + + - + + - + + - + - + - + - - + - - + + - + + - + + - + + - - - + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + + - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - + + + + - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - - - - - - - - + + + + + + + + + + - + + - + + - + - + - + + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -19102,15 +21588,15 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + @@ -19119,7 +21605,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -19142,94 +21628,107 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + - + + + + + + - + - - + - - + + - + + - + + - + + - + + + + + + - + - - + - - + + - + + - + + - + + @@ -19237,136 +21736,149 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + + + + + + - + - + - - + + - + + - + + - + + - + + + + + + - + - + - - + + - + + - + + - + + - - - - - + + + - + + - + + - + + - + - + - + + + - + - - @@ -19381,10 +21893,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -19404,11 +21916,11 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -19417,21 +21929,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -19439,13 +21954,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19453,32 +21972,35 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - + - + @@ -19522,21 +22044,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -19544,13 +22069,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19560,13 +22089,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19576,13 +22109,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + @@ -19590,13 +22123,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19606,13 +22143,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19620,13 +22161,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19636,13 +22181,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19652,13 +22201,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19668,58 +22221,62 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + + + - - - @@ -19734,10 +22291,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -19757,11 +22314,11 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -19770,21 +22327,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -19792,13 +22352,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19808,13 +22372,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19824,13 +22392,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + @@ -19838,13 +22406,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19854,13 +22426,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19868,13 +22444,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -19884,58 +22464,62 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + - + + - + + - + - + - + + + - - - @@ -19950,10 +22534,10 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -19973,11 +22557,11 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - @@ -19986,7 +22570,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -20010,44 +22594,49 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + + - + + - + + - + + - + + - + - + + - + - - + - @@ -20055,39 +22644,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20096,39 +22689,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20136,39 +22733,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20176,39 +22777,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20216,39 +22821,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20256,39 +22865,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20297,39 +22910,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20337,39 +22954,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20377,39 +22998,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - + - + + - + - - + - @@ -20417,13 +23042,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -20433,39 +23062,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -20473,39 +23106,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -20514,39 +23151,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -20555,40 +23196,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -20596,40 +23241,44 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -20637,117 +23286,129 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - - + + - + - - + - @@ -20756,39 +23417,43 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - @@ -20796,278 +23461,307 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - - + + - + - - + - - + + - + + - + + - + + - - - + + - + - - + - - + + - + + - + + - + + - + - - - + + - + + - + + - + + - - - + + + - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - + + + - + + - + + - + - + - + + - + - + - - + + + + + + + + + + + + + + + - + + + @@ -21079,16 +23773,16 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + + @@ -21097,21 +23791,24 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -21119,13 +23816,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -21133,13 +23834,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -21147,13 +23852,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -21161,81 +23870,85 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - - - + + + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -21245,25 +23958,25 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - - + + + + @@ -21273,22 +23986,25 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + - - - + + - + + - + + - + + - + + @@ -21299,13 +24015,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -21316,13 +24036,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -21335,13 +24059,17 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + @@ -21351,103 +24079,112 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + - + + - + + - - - + + + - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - - - - + + + - + + - + + - + - + - + + - + - + - + + - + + + + + + + + + + + + + + + - + + + @@ -21457,25 +24194,25 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - - + + + + @@ -21485,7 +24222,303 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -21496,8 +24529,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - + + @@ -21517,7 +24550,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -21537,7 +24571,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -21557,7 +24592,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -21577,371 +24613,444 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - - + + + + + - + + - + + - + + - + + - + - - - + + + - + + - + + - + + - + + - + - - - + + + - + + - + + - + + - + + - + - - - + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - + - - - + + + - + + - + + - + + - + + - + - - - + + + - + + - + + - + + - + + - - - - + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - + + + + - + + - + + - + + - + + - - - - - - - + + + + + - + + - + - + - + + - + - + - - - + + + + + + + + + + + + + + + - + + + - + - - - - + + + + @@ -21950,7 +25059,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -21976,9 +25085,15 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - - - + + + + + + + + + @@ -21989,6 +25104,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% + @@ -22001,7 +25117,13 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + + + + + + @@ -22015,7 +25137,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -22052,13 +25175,15 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + - + + @@ -22073,7 +25198,8 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + + @@ -22081,7 +25207,6 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% -