package org.batfish.grammar.flatjuniper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.batfish.grammar.flatjuniper.FlatJuniperCombinedParser;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.*;
import org.batfish.common.BatfishException;
import org.batfish.common.util.JuniperUtils;
import org.batfish.common.util.CommonUtil;
import org.batfish.datamodel.AsPath;
import org.batfish.datamodel.AsSet;
import org.batfish.datamodel.DiffieHellmanGroup;
import org.batfish.datamodel.EncryptionAlgorithm;
import org.batfish.datamodel.ExtendedCommunity;
import org.batfish.datamodel.IcmpCode;
import org.batfish.datamodel.IcmpType;
import org.batfish.datamodel.IkeAuthenticationAlgorithm;
import org.batfish.datamodel.IkeAuthenticationMethod;
import org.batfish.datamodel.IkeProposal;
import org.batfish.datamodel.Ip;
import org.batfish.datamodel.IpProtocol;
import org.batfish.datamodel.IpsecAuthenticationAlgorithm;
import org.batfish.datamodel.IpsecProposal;
import org.batfish.datamodel.IpsecProtocol;
import org.batfish.datamodel.IsoAddress;
import org.batfish.datamodel.LineAction;
import org.batfish.datamodel.NamedPort;
import org.batfish.datamodel.Prefix;
import org.batfish.datamodel.Prefix6;
import org.batfish.datamodel.RoutingProtocol;
import org.batfish.datamodel.SnmpCommunity;
import org.batfish.datamodel.SnmpHost;
import org.batfish.datamodel.SnmpServer;
import org.batfish.datamodel.SubRange;
import org.batfish.datamodel.TcpFlags;
import org.batfish.datamodel.VrrpGroup;
import org.batfish.common.Warnings;
import org.batfish.representation.juniper.*;
import org.batfish.representation.juniper.BaseApplication.Term;
import org.batfish.representation.juniper.BgpGroup.BgpGroupType;
public class ConfigurationBuilder extends FlatJuniperParserBaseListener {
private static final boolean DEFAULT_VRRP_PREEMPT = true;
private static final int DEFAULT_VRRP_PRIORITY = 100;
private static final AggregateRoute DUMMY_AGGREGATE_ROUTE = new AggregateRoute(
Prefix.ZERO);
private static final BgpGroup DUMMY_BGP_GROUP = new BgpGroup();
private static final StaticRoute DUMMY_STATIC_ROUTE = new StaticRoute(
Prefix.ZERO);
private static final String F_BGP_LOCAL_AS_LOOPS = "protocols - bgp - group? - local-as - loops - currently we allow infinite occurences of local as";
private static final String F_BGP_LOCAL_AS_PRIVATE = "protocols - bgp - group? - local-as - private";
private static final String F_FIREWALL_TERM_THEN_ROUTING_INSTANCE = "firewall - filter - term - then - routing-instance";
private static final String F_IPV6 = "ipv6 - other";
private static final String F_PERMIT_TUNNEL = "security - policies - from-zone - to-zone - policy - then - permit - tunnel";
private static final String F_POLICY_TERM_THEN_NEXT_HOP = "policy-statement - term - then - next-hop";
public static NamedPort getNamedPort(PortContext ctx) {
if (ctx.AFS() != null) {
return NamedPort.AFS;
}
else if (ctx.BGP() != null) {
return NamedPort.BGP;
}
else if (ctx.BIFF() != null) {
return NamedPort.BIFFudp_OR_EXECtcp;
}
else if (ctx.BOOTPC() != null) {
return NamedPort.BOOTPC;
}
else if (ctx.BOOTPS() != null) {
return NamedPort.BOOTPS_OR_DHCP;
}
else if (ctx.CMD() != null) {
return NamedPort.CMDtcp_OR_SYSLOGudp;
}
else if (ctx.CVSPSERVER() != null) {
return NamedPort.CVSPSERVER;
}
else if (ctx.DHCP() != null) {
return NamedPort.BOOTPS_OR_DHCP;
}
else if (ctx.DOMAIN() != null) {
return NamedPort.DOMAIN;
}
else if (ctx.EKLOGIN() != null) {
return NamedPort.EKLOGIN;
}
else if (ctx.EKSHELL() != null) {
return NamedPort.EKSHELL;
}
else if (ctx.EXEC() != null) {
return NamedPort.BIFFudp_OR_EXECtcp;
}
else if (ctx.FINGER() != null) {
return NamedPort.FINGER;
}
else if (ctx.FTP() != null) {
return NamedPort.FTP;
}
else if (ctx.FTP_DATA() != null) {
return NamedPort.FTP_DATA;
}
else if (ctx.HTTP() != null) {
return NamedPort.HTTP;
}
else if (ctx.HTTPS() != null) {
return NamedPort.HTTPS;
}
else if (ctx.IDENT() != null) {
return NamedPort.IDENT;
}
else if (ctx.IMAP() != null) {
return NamedPort.IMAP;
}
else if (ctx.KERBEROS_SEC() != null) {
return NamedPort.KERBEROS_SEC;
}
else if (ctx.KLOGIN() != null) {
return NamedPort.KLOGIN;
}
else if (ctx.KPASSWD() != null) {
return NamedPort.KPASSWD;
}
else if (ctx.KRB_PROP() != null) {
return NamedPort.KRB_PROP;
}
else if (ctx.KRBUPDATE() != null) {
return NamedPort.KRBUPDATE;
}
else if (ctx.KSHELL() != null) {
return NamedPort.KSHELL;
}
else if (ctx.LDAP() != null) {
return NamedPort.LDAP;
}
else if (ctx.LDP() != null) {
return NamedPort.LDP;
}
else if (ctx.LOGIN() != null) {
return NamedPort.LOGINtcp_OR_WHOudp;
}
else if (ctx.MOBILEIP_AGENT() != null) {
return NamedPort.MOBILE_IP_AGENT;
}
else if (ctx.MOBILIP_MN() != null) {
return NamedPort.MOBILE_IP_MN;
}
else if (ctx.MSDP() != null) {
return NamedPort.MSDP;
}
else if (ctx.NETBIOS_DGM() != null) {
return NamedPort.NETBIOS_DGM;
}
else if (ctx.NETBIOS_NS() != null) {
return NamedPort.NETBIOS_NS;
}
else if (ctx.NETBIOS_SSN() != null) {
return NamedPort.NETBIOS_SSN;
}
else if (ctx.NFSD() != null) {
return NamedPort.NFSD;
}
else if (ctx.NNTP() != null) {
return NamedPort.NNTP;
}
else if (ctx.NTALK() != null) {
return NamedPort.NTALK;
}
else if (ctx.NTP() != null) {
return NamedPort.NTP;
}
else if (ctx.POP3() != null) {
return NamedPort.POP3;
}
else if (ctx.PPTP() != null) {
return NamedPort.PPTP;
}
else if (ctx.PRINTER() != null) {
return NamedPort.LDP;
}
else if (ctx.RADACCT() != null) {
return NamedPort.RADIUS_JUNIPER;
}
else if (ctx.RADIUS() != null) {
return NamedPort.RADIUS_JUNIPER;
}
else if (ctx.RIP() != null) {
return NamedPort.RIP;
}
else if (ctx.RKINIT() != null) {
return NamedPort.RKINIT;
}
else if (ctx.SMTP() != null) {
return NamedPort.SMTP;
}
else if (ctx.SNMP() != null) {
return NamedPort.SNMP;
}
else if (ctx.SNMPTRAP() != null) {
return NamedPort.SNMPTRAP;
}
else if (ctx.SNPP() != null) {
return NamedPort.SNPP;
}
else if (ctx.SOCKS() != null) {
return NamedPort.SOCKS;
}
else if (ctx.SSH() != null) {
return NamedPort.SSH;
}
else if (ctx.SUNRPC() != null) {
return NamedPort.SUNRPC;
}
else if (ctx.SYSLOG() != null) {
return NamedPort.CMDtcp_OR_SYSLOGudp;
}
else if (ctx.TACACS() != null) {
return NamedPort.TACACS;
}
else if (ctx.TACACS_DS() != null) {
return NamedPort.TACACS_DS;
}
else if (ctx.TALK() != null) {
return NamedPort.TALK;
}
else if (ctx.TELNET() != null) {
return NamedPort.TELNET;
}
else if (ctx.TFTP() != null) {
return NamedPort.TFTP;
}
else if (ctx.TIMED() != null) {
return NamedPort.TIMED;
}
else if (ctx.WHO() != null) {
return NamedPort.LOGINtcp_OR_WHOudp;
}
else if (ctx.XDMCP() != null) {
return NamedPort.XDMCP;
}
else {
throw new BatfishException("missing port-number mapping for port: \""
+ ctx.getText() + "\"");
}
}
public static int getPortNumber(PortContext ctx) {
if (ctx.DEC() != null) {
int port = toInt(ctx.DEC());
return port;
}
else {
NamedPort namedPort = getNamedPort(ctx);
return namedPort.number();
}
}
private static Application toApplication(Junos_applicationContext ctx) {
if (ctx.JUNOS_AOL() != null) {
return JunosApplication.JUNOS_AOL;
}
else if (ctx.JUNOS_BGP() != null) {
return JunosApplication.JUNOS_BGP;
}
else if (ctx.JUNOS_BIFF() != null) {
return JunosApplication.JUNOS_BIFF;
}
else if (ctx.JUNOS_BOOTPC() != null) {
return JunosApplication.JUNOS_BOOTPC;
}
else if (ctx.JUNOS_BOOTPS() != null) {
return JunosApplication.JUNOS_BOOTPS;
}
else if (ctx.JUNOS_CHARGEN() != null) {
return JunosApplication.JUNOS_CHARGEN;
}
else if (ctx.JUNOS_CIFS() != null) {
return JunosApplication.JUNOS_CIFS;
}
else if (ctx.JUNOS_CVSPSERVER() != null) {
return JunosApplication.JUNOS_CVSPSERVER;
}
else if (ctx.JUNOS_DHCP_CLIENT() != null) {
return JunosApplication.JUNOS_DHCP_CLIENT;
}
else if (ctx.JUNOS_DHCP_RELAY() != null) {
return JunosApplication.JUNOS_DHCP_RELAY;
}
else if (ctx.JUNOS_DHCP_SERVER() != null) {
return JunosApplication.JUNOS_DHCP_SERVER;
}
else if (ctx.JUNOS_DISCARD() != null) {
return JunosApplication.JUNOS_DISCARD;
}
else if (ctx.JUNOS_DNS_TCP() != null) {
return JunosApplication.JUNOS_DNS_TCP;
}
else if (ctx.JUNOS_DNS_UDP() != null) {
return JunosApplication.JUNOS_DNS_UDP;
}
else if (ctx.JUNOS_ECHO() != null) {
return JunosApplication.JUNOS_ECHO;
}
else if (ctx.JUNOS_FINGER() != null) {
return JunosApplication.JUNOS_FINGER;
}
else if (ctx.JUNOS_FTP() != null) {
return JunosApplication.JUNOS_FTP;
}
else if (ctx.JUNOS_GNUTELLA() != null) {
return JunosApplication.JUNOS_GNUTELLA;
}
else if (ctx.JUNOS_GOPHER() != null) {
return JunosApplication.JUNOS_GOPHER;
}
else if (ctx.JUNOS_GRE() != null) {
return JunosApplication.JUNOS_GRE;
}
else if (ctx.JUNOS_GTP() != null) {
return JunosApplication.JUNOS_GTP;
}
else if (ctx.JUNOS_H323() != null) {
return JunosApplication.JUNOS_H323;
}
else if (ctx.JUNOS_HTTP() != null) {
return JunosApplication.JUNOS_HTTP;
}
else if (ctx.JUNOS_HTTP_EXT() != null) {
return JunosApplication.JUNOS_HTTP_EXT;
}
else if (ctx.JUNOS_HTTPS() != null) {
return JunosApplication.JUNOS_HTTPS;
}
else if (ctx.JUNOS_ICMP_ALL() != null) {
return JunosApplication.JUNOS_ICMP_ALL;
}
else if (ctx.JUNOS_ICMP_PING() != null) {
return JunosApplication.JUNOS_ICMP_PING;
}
else if (ctx.JUNOS_ICMP6_ALL() != null) {
return JunosApplication.JUNOS_ICMP6_ALL;
}
else if (ctx.JUNOS_ICMP6_DST_UNREACH_ADDR() != null) {
return JunosApplication.JUNOS_ICMP6_DST_UNREACH_ADDR;
}
else if (ctx.JUNOS_ICMP6_DST_UNREACH_ADMIN() != null) {
return JunosApplication.JUNOS_ICMP6_DST_UNREACH_ADMIN;
}
else if (ctx.JUNOS_ICMP6_DST_UNREACH_BEYOND() != null) {
return JunosApplication.JUNOS_ICMP6_DST_UNREACH_BEYOND;
}
else if (ctx.JUNOS_ICMP6_DST_UNREACH_PORT() != null) {
return JunosApplication.JUNOS_ICMP6_DST_UNREACH_PORT;
}
else if (ctx.JUNOS_ICMP6_DST_UNREACH_ROUTE() != null) {
return JunosApplication.JUNOS_ICMP6_DST_UNREACH_ROUTE;
}
else if (ctx.JUNOS_ICMP6_ECHO_REPLY() != null) {
return JunosApplication.JUNOS_ICMP6_ECHO_REPLY;
}
else if (ctx.JUNOS_ICMP6_ECHO_REQUEST() != null) {
return JunosApplication.JUNOS_ICMP6_ECHO_REQUEST;
}
else if (ctx.JUNOS_ICMP6_PACKET_TO_BIG() != null) {
return JunosApplication.JUNOS_ICMP6_PACKET_TO_BIG;
}
else if (ctx.JUNOS_ICMP6_PARAM_PROB_HEADER() != null) {
return JunosApplication.JUNOS_ICMP6_PARAM_PROB_HEADER;
}
else if (ctx.JUNOS_ICMP6_PARAM_PROB_NEXTHDR() != null) {
return JunosApplication.JUNOS_ICMP6_PARAM_PROB_NEXTHDR;
}
else if (ctx.JUNOS_ICMP6_PARAM_PROB_OPTION() != null) {
return JunosApplication.JUNOS_ICMP6_PARAM_PROB_OPTION;
}
else if (ctx.JUNOS_ICMP6_TIME_EXCEED_REASSEMBLY() != null) {
return JunosApplication.JUNOS_ICMP6_TIME_EXCEED_REASSEMBLY;
}
else if (ctx.JUNOS_ICMP6_TIME_EXCEED_TRANSIT() != null) {
return JunosApplication.JUNOS_ICMP6_TIME_EXCEED_TRANSIT;
}
else if (ctx.JUNOS_IDENT() != null) {
return JunosApplication.JUNOS_IDENT;
}
else if (ctx.JUNOS_IKE() != null) {
return JunosApplication.JUNOS_IKE;
}
else if (ctx.JUNOS_IKE_NAT() != null) {
return JunosApplication.JUNOS_IKE_NAT;
}
else if (ctx.JUNOS_IMAP() != null) {
return JunosApplication.JUNOS_IMAP;
}
else if (ctx.JUNOS_IMAPS() != null) {
return JunosApplication.JUNOS_IMAPS;
}
else if (ctx.JUNOS_INTERNET_LOCATOR_SERVICE() != null) {
return JunosApplication.JUNOS_INTERNET_LOCATOR_SERVICE;
}
else if (ctx.JUNOS_IRC() != null) {
return JunosApplication.JUNOS_IRC;
}
else if (ctx.JUNOS_L2TP() != null) {
return JunosApplication.JUNOS_L2TP;
}
else if (ctx.JUNOS_LDAP() != null) {
return JunosApplication.JUNOS_LDAP;
}
else if (ctx.JUNOS_LDP_TCP() != null) {
return JunosApplication.JUNOS_LDP_TCP;
}
else if (ctx.JUNOS_LDP_UDP() != null) {
return JunosApplication.JUNOS_LDP_UDP;
}
else if (ctx.JUNOS_LPR() != null) {
return JunosApplication.JUNOS_LPR;
}
else if (ctx.JUNOS_MAIL() != null) {
return JunosApplication.JUNOS_MAIL;
}
else if (ctx.JUNOS_MGCP() != null) {
return JunosApplication.JUNOS_MGCP;
}
else if (ctx.JUNOS_MGCP_CA() != null) {
return JunosApplication.JUNOS_MGCP_CA;
}
else if (ctx.JUNOS_MGCP_UA() != null) {
return JunosApplication.JUNOS_MGCP_UA;
}
else if (ctx.JUNOS_MS_RPC() != null) {
return JunosApplication.JUNOS_MS_RPC;
}
else if (ctx.JUNOS_MS_RPC_ANY() != null) {
return JunosApplication.JUNOS_MS_RPC_ANY;
}
else if (ctx.JUNOS_MS_RPC_EPM() != null) {
return JunosApplication.JUNOS_MS_RPC_EPM;
}
else if (ctx.JUNOS_MS_RPC_IIS_COM() != null) {
return JunosApplication.JUNOS_MS_RPC_IIS_COM;
}
else if (ctx.JUNOS_MS_RPC_IIS_COM_1() != null) {
return JunosApplication.JUNOS_MS_RPC_IIS_COM_1;
}
else if (ctx.JUNOS_MS_RPC_IIS_COM_ADMINBASE() != null) {
return JunosApplication.JUNOS_MS_RPC_IIS_COM_ADMINBASE;
}
else if (ctx.JUNOS_MS_RPC_MSEXCHANGE() != null) {
return JunosApplication.JUNOS_MS_RPC_MSEXCHANGE;
}
else if (ctx.JUNOS_MS_RPC_MSEXCHANGE_DIRECTORY_NSP() != null) {
return JunosApplication.JUNOS_MS_RPC_MSEXCHANGE_DIRECTORY_NSP;
}
else if (ctx.JUNOS_MS_RPC_MSEXCHANGE_DIRECTORY_RFR() != null) {
return JunosApplication.JUNOS_MS_RPC_MSEXCHANGE_DIRECTORY_RFR;
}
else if (ctx.JUNOS_MS_RPC_MSEXCHANGE_INFO_STORE() != null) {
return JunosApplication.JUNOS_MS_RPC_MSEXCHANGE_INFO_STORE;
}
else if (ctx.JUNOS_MS_RPC_TCP() != null) {
return JunosApplication.JUNOS_MS_RPC_TCP;
}
else if (ctx.JUNOS_MS_RPC_UDP() != null) {
return JunosApplication.JUNOS_MS_RPC_UDP;
}
else if (ctx.JUNOS_MS_RPC_UUID_ANY_TCP() != null) {
return JunosApplication.JUNOS_MS_RPC_UUID_ANY_TCP;
}
else if (ctx.JUNOS_MS_RPC_UUID_ANY_UDP() != null) {
return JunosApplication.JUNOS_MS_RPC_UUID_ANY_UDP;
}
else if (ctx.JUNOS_MS_RPC_WMIC() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC;
}
else if (ctx.JUNOS_MS_RPC_WMIC_ADMIN() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_ADMIN;
}
else if (ctx.JUNOS_MS_RPC_WMIC_ADMIN2() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_ADMIN2;
}
else if (ctx.JUNOS_MS_RPC_WMIC_MGMT() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_MGMT;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_CALLRESULT() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_CALLRESULT;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_CLASSOBJECT() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_CLASSOBJECT;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_LEVEL1LOGIN() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_LEVEL1LOGIN;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_LOGIN_CLIENTID() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_LOGIN_CLIENTID;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_LOGIN_HELPER() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_LOGIN_HELPER;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_OBJECTSINK() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_OBJECTSINK;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_REFRESHING_SERVICES() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_REFRESHING_SERVICES;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_REMOTE_REFRESHER() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_REMOTE_REFRESHER;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_SERVICES() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_SERVICES;
}
else if (ctx.JUNOS_MS_RPC_WMIC_WEBM_SHUTDOWN() != null) {
return JunosApplication.JUNOS_MS_RPC_WMIC_WEBM_SHUTDOWN;
}
else if (ctx.JUNOS_MS_SQL() != null) {
return JunosApplication.JUNOS_MS_SQL;
}
else if (ctx.JUNOS_MSN() != null) {
return JunosApplication.JUNOS_MSN;
}
else if (ctx.JUNOS_NBDS() != null) {
return JunosApplication.JUNOS_NBDS;
}
else if (ctx.JUNOS_NBNAME() != null) {
return JunosApplication.JUNOS_NBNAME;
}
else if (ctx.JUNOS_NETBIOS_SESSION() != null) {
return JunosApplication.JUNOS_NETBIOS_SESSION;
}
else if (ctx.JUNOS_NFS() != null) {
return JunosApplication.JUNOS_NFS;
}
else if (ctx.JUNOS_NFSD_TCP() != null) {
return JunosApplication.JUNOS_NFSD_TCP;
}
else if (ctx.JUNOS_NFSD_UDP() != null) {
return JunosApplication.JUNOS_NFSD_UDP;
}
else if (ctx.JUNOS_NNTP() != null) {
return JunosApplication.JUNOS_NNTP;
}
else if (ctx.JUNOS_NS_GLOBAL() != null) {
return JunosApplication.JUNOS_NS_GLOBAL;
}
else if (ctx.JUNOS_NS_GLOBAL_PRO() != null) {
return JunosApplication.JUNOS_NS_GLOBAL_PRO;
}
else if (ctx.JUNOS_NSM() != null) {
return JunosApplication.JUNOS_NSM;
}
else if (ctx.JUNOS_NTALK() != null) {
return JunosApplication.JUNOS_NTALK;
}
else if (ctx.JUNOS_NTP() != null) {
return JunosApplication.JUNOS_NTP;
}
else if (ctx.JUNOS_OSPF() != null) {
return JunosApplication.JUNOS_OSPF;
}
else if (ctx.JUNOS_PC_ANYWHERE() != null) {
return JunosApplication.JUNOS_PC_ANYWHERE;
}
else if (ctx.JUNOS_PERSISTENT_NAT() != null) {
return JunosApplication.JUNOS_PERSISTENT_NAT;
}
else if (ctx.JUNOS_PING() != null) {
return JunosApplication.JUNOS_PING;
}
else if (ctx.JUNOS_PINGV6() != null) {
return JunosApplication.JUNOS_PINGV6;
}
else if (ctx.JUNOS_POP3() != null) {
return JunosApplication.JUNOS_POP3;
}
else if (ctx.JUNOS_PPTP() != null) {
return JunosApplication.JUNOS_PPTP;
}
else if (ctx.JUNOS_PRINTER() != null) {
return JunosApplication.JUNOS_PRINTER;
}
else if (ctx.JUNOS_R2CP() != null) {
return JunosApplication.JUNOS_R2CP;
}
else if (ctx.JUNOS_RADACCT() != null) {
return JunosApplication.JUNOS_RADACCT;
}
else if (ctx.JUNOS_RADIUS() != null) {
return JunosApplication.JUNOS_RADIUS;
}
else if (ctx.JUNOS_REALAUDIO() != null) {
return JunosApplication.JUNOS_REALAUDIO;
}
else if (ctx.JUNOS_RIP() != null) {
return JunosApplication.JUNOS_RIP;
}
else if (ctx.JUNOS_ROUTING_INBOUND() != null) {
return JunosApplication.JUNOS_ROUTING_INBOUND;
}
else if (ctx.JUNOS_RSH() != null) {
return JunosApplication.JUNOS_RSH;
}
else if (ctx.JUNOS_RTSP() != null) {
return JunosApplication.JUNOS_RTSP;
}
else if (ctx.JUNOS_SCCP() != null) {
return JunosApplication.JUNOS_SCCP;
}
else if (ctx.JUNOS_SCTP_ANY() != null) {
return JunosApplication.JUNOS_SCTP_ANY;
}
else if (ctx.JUNOS_SIP() != null) {
return JunosApplication.JUNOS_SIP;
}
else if (ctx.JUNOS_SMB() != null) {
return JunosApplication.JUNOS_SMB;
}
else if (ctx.JUNOS_SMB_SESSION() != null) {
return JunosApplication.JUNOS_SMB_SESSION;
}
else if (ctx.JUNOS_SMTP() != null) {
return JunosApplication.JUNOS_SMTP;
}
else if (ctx.JUNOS_SNMP_AGENTX() != null) {
return JunosApplication.JUNOS_SNMP_AGENTX;
}
else if (ctx.JUNOS_SNPP() != null) {
return JunosApplication.JUNOS_SNPP;
}
else if (ctx.JUNOS_SQL_MONITOR() != null) {
return JunosApplication.JUNOS_SQL_MONITOR;
}
else if (ctx.JUNOS_SQLNET_V1() != null) {
return JunosApplication.JUNOS_SQLNET_V1;
}
else if (ctx.JUNOS_SQLNET_V2() != null) {
return JunosApplication.JUNOS_SQLNET_V2;
}
else if (ctx.JUNOS_SSH() != null) {
return JunosApplication.JUNOS_SSH;
}
else if (ctx.JUNOS_STUN() != null) {
return JunosApplication.JUNOS_STUN;
}
else if (ctx.JUNOS_SUN_RPC() != null) {
return JunosApplication.JUNOS_SUN_RPC;
}
else if (ctx.JUNOS_SUN_RPC_ANY() != null) {
return JunosApplication.JUNOS_SUN_RPC_ANY;
}
else if (ctx.JUNOS_SUN_RPC_ANY_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_ANY_TCP;
}
else if (ctx.JUNOS_SUN_RPC_ANY_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_ANY_UDP;
}
else if (ctx.JUNOS_SUN_RPC_MOUNTD() != null) {
return JunosApplication.JUNOS_SUN_RPC_MOUNTD;
}
else if (ctx.JUNOS_SUN_RPC_MOUNTD_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_MOUNTD_TCP;
}
else if (ctx.JUNOS_SUN_RPC_MOUNTD_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_MOUNTD_UDP;
}
else if (ctx.JUNOS_SUN_RPC_NFS() != null) {
return JunosApplication.JUNOS_SUN_RPC_NFS;
}
else if (ctx.JUNOS_SUN_RPC_NFS_ACCESS() != null) {
return JunosApplication.JUNOS_SUN_RPC_NFS_ACCESS;
}
else if (ctx.JUNOS_SUN_RPC_NFS_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_NFS_TCP;
}
else if (ctx.JUNOS_SUN_RPC_NFS_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_NFS_UDP;
}
else if (ctx.JUNOS_SUN_RPC_NLOCKMGR() != null) {
return JunosApplication.JUNOS_SUN_RPC_NLOCKMGR;
}
else if (ctx.JUNOS_SUN_RPC_NLOCKMGR_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_NLOCKMGR_TCP;
}
else if (ctx.JUNOS_SUN_RPC_NLOCKMGR_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_NLOCKMGR_UDP;
}
else if (ctx.JUNOS_SUN_RPC_PORTMAP() != null) {
return JunosApplication.JUNOS_SUN_RPC_PORTMAP;
}
else if (ctx.JUNOS_SUN_RPC_PORTMAP_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_PORTMAP_TCP;
}
else if (ctx.JUNOS_SUN_RPC_PORTMAP_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_PORTMAP_UDP;
}
else if (ctx.JUNOS_SUN_RPC_RQUOTAD() != null) {
return JunosApplication.JUNOS_SUN_RPC_RQUOTAD;
}
else if (ctx.JUNOS_SUN_RPC_RQUOTAD_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_RQUOTAD_TCP;
}
else if (ctx.JUNOS_SUN_RPC_RQUOTAD_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_RQUOTAD_UDP;
}
else if (ctx.JUNOS_SUN_RPC_RUSERD() != null) {
return JunosApplication.JUNOS_SUN_RPC_RUSERD;
}
else if (ctx.JUNOS_SUN_RPC_RUSERD_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_RUSERD_TCP;
}
else if (ctx.JUNOS_SUN_RPC_RUSERD_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_RUSERD_UDP;
}
else if (ctx.JUNOS_SUN_RPC_SADMIND() != null) {
return JunosApplication.JUNOS_SUN_RPC_SADMIND;
}
else if (ctx.JUNOS_SUN_RPC_SADMIND_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_SADMIND_TCP;
}
else if (ctx.JUNOS_SUN_RPC_SADMIND_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_SADMIND_UDP;
}
else if (ctx.JUNOS_SUN_RPC_SPRAYD() != null) {
return JunosApplication.JUNOS_SUN_RPC_SPRAYD;
}
else if (ctx.JUNOS_SUN_RPC_SPRAYD_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_SPRAYD_TCP;
}
else if (ctx.JUNOS_SUN_RPC_SPRAYD_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_SPRAYD_UDP;
}
else if (ctx.JUNOS_SUN_RPC_STATUS() != null) {
return JunosApplication.JUNOS_SUN_RPC_STATUS;
}
else if (ctx.JUNOS_SUN_RPC_STATUS_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_STATUS_TCP;
}
else if (ctx.JUNOS_SUN_RPC_STATUS_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_STATUS_UDP;
}
else if (ctx.JUNOS_SUN_RPC_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_TCP;
}
else if (ctx.JUNOS_SUN_RPC_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_UDP;
}
else if (ctx.JUNOS_SUN_RPC_WALLD() != null) {
return JunosApplication.JUNOS_SUN_RPC_WALLD;
}
else if (ctx.JUNOS_SUN_RPC_WALLD_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_WALLD_TCP;
}
else if (ctx.JUNOS_SUN_RPC_WALLD_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_WALLD_UDP;
}
else if (ctx.JUNOS_SUN_RPC_YPBIND() != null) {
return JunosApplication.JUNOS_SUN_RPC_YPBIND;
}
else if (ctx.JUNOS_SUN_RPC_YPBIND_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_YPBIND_TCP;
}
else if (ctx.JUNOS_SUN_RPC_YPBIND_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_YPBIND_UDP;
}
else if (ctx.JUNOS_SUN_RPC_YPSERV() != null) {
return JunosApplication.JUNOS_SUN_RPC_YPSERV;
}
else if (ctx.JUNOS_SUN_RPC_YPSERV_TCP() != null) {
return JunosApplication.JUNOS_SUN_RPC_YPSERV_TCP;
}
else if (ctx.JUNOS_SUN_RPC_YPSERV_UDP() != null) {
return JunosApplication.JUNOS_SUN_RPC_YPSERV_UDP;
}
else if (ctx.JUNOS_SYSLOG() != null) {
return JunosApplication.JUNOS_SYSLOG;
}
else if (ctx.JUNOS_TACACS() != null) {
return JunosApplication.JUNOS_TACACS;
}
else if (ctx.JUNOS_TACACS_DS() != null) {
return JunosApplication.JUNOS_TACACS_DS;
}
else if (ctx.JUNOS_TALK() != null) {
return JunosApplication.JUNOS_TALK;
}
else if (ctx.JUNOS_TCP_ANY() != null) {
return JunosApplication.JUNOS_TCP_ANY;
}
else if (ctx.JUNOS_TELNET() != null) {
return JunosApplication.JUNOS_TELNET;
}
else if (ctx.JUNOS_TFTP() != null) {
return JunosApplication.JUNOS_TFTP;
}
else if (ctx.JUNOS_UDP_ANY() != null) {
return JunosApplication.JUNOS_UDP_ANY;
}
else if (ctx.JUNOS_UUCP() != null) {
return JunosApplication.JUNOS_UUCP;
}
else if (ctx.JUNOS_VDO_LIVE() != null) {
return JunosApplication.JUNOS_VDO_LIVE;
}
else if (ctx.JUNOS_VNC() != null) {
return JunosApplication.JUNOS_VNC;
}
else if (ctx.JUNOS_WAIS() != null) {
return JunosApplication.JUNOS_WAIS;
}
else if (ctx.JUNOS_WHO() != null) {
return JunosApplication.JUNOS_WHO;
}
else if (ctx.JUNOS_WHOIS() != null) {
return JunosApplication.JUNOS_WHOIS;
}
else if (ctx.JUNOS_WINFRAME() != null) {
return JunosApplication.JUNOS_WINFRAME;
}
else if (ctx.JUNOS_WXCONTROL() != null) {
return JunosApplication.JUNOS_WXCONTROL;
}
else if (ctx.JUNOS_X_WINDOWS() != null) {
return JunosApplication.JUNOS_X_WINDOWS;
}
else if (ctx.JUNOS_XNM_CLEAR_TEXT() != null) {
return JunosApplication.JUNOS_XNM_CLEAR_TEXT;
}
else if (ctx.JUNOS_XNM_SSL() != null) {
return JunosApplication.JUNOS_XNM_SSL;
}
else if (ctx.JUNOS_YMSG() != null) {
return JunosApplication.JUNOS_YMSG;
}
else {
throw new BatfishException(
"missing application mapping for application: \"" + ctx.getText()
+ "\"");
}
}
private static long toCommunityLong(Sc_literalContext sc_literal) {
String text = sc_literal.COMMUNITY_LITERAL().getText();
return CommonUtil.communityStringToLong(text);
}
private static long toCommunityLong(Sc_namedContext ctx) {
if (ctx.NO_ADVERTISE() != null) {
return 0xFFFFFF02l;
}
if (ctx.NO_EXPORT() != null) {
return 0xFFFFFF01l;
}
else {
throw new BatfishException(
"missing named-community-to-long mapping for: \"" + ctx.getText()
+ "\"");
}
}
private static long toCommunityLong(Standard_communityContext ctx) {
if (ctx.sc_literal() != null) {
return toCommunityLong(ctx.sc_literal());
}
else if (ctx.sc_named() != null) {
return toCommunityLong(ctx.sc_named());
}
else {
throw new BatfishException("Cannot convert to community long");
}
}
private static EncryptionAlgorithm toEncryptionAlgorithm(
Encryption_algorithmContext ctx) {
if (ctx.THREEDES_CBC() != null) {
return EncryptionAlgorithm.THREEDES_CBC;
}
else if (ctx.AES_128_CBC() != null) {
return EncryptionAlgorithm.AES_128_CBC;
}
else if (ctx.AES_192_CBC() != null) {
return EncryptionAlgorithm.AES_192_CBC;
}
else if (ctx.AES_256_CBC() != null) {
return EncryptionAlgorithm.AES_256_CBC;
}
else if (ctx.DES_CBC() != null) {
return EncryptionAlgorithm.DES_CBC;
}
else {
throw new BatfishException(
"Invalid encryption algorithm: " + ctx.getText());
}
}
private static HostProtocol toHostProtocol(Hib_protocolContext ctx) {
if (ctx.ALL() != null) {
return HostProtocol.ALL;
}
else if (ctx.BFD() != null) {
return HostProtocol.BFD;
}
else if (ctx.BGP() != null) {
return HostProtocol.BGP;
}
else if (ctx.DVMRP() != null) {
return HostProtocol.DVMRP;
}
else if (ctx.IGMP() != null) {
return HostProtocol.IGMP;
}
else if (ctx.LDP() != null) {
return HostProtocol.LDP;
}
else if (ctx.MSDP() != null) {
return HostProtocol.MSDP;
}
else if (ctx.NHRP() != null) {
return HostProtocol.NHRP;
}
else if (ctx.OSPF() != null) {
return HostProtocol.OSPF;
}
else if (ctx.OSPF3() != null) {
return HostProtocol.OSPF3;
}
else if (ctx.PGM() != null) {
return HostProtocol.PGM;
}
else if (ctx.PIM() != null) {
return HostProtocol.PIM;
}
else if (ctx.RIP() != null) {
return HostProtocol.RIP;
}
else if (ctx.RIPNG() != null) {
return HostProtocol.RIPNG;
}
else if (ctx.ROUTER_DISCOVERY() != null) {
return HostProtocol.ROUTER_DISCOVERY;
}
else if (ctx.RSVP() != null) {
return HostProtocol.RSVP;
}
else if (ctx.SAP() != null) {
return HostProtocol.SAP;
}
else if (ctx.VRRP() != null) {
return HostProtocol.VRRP;
}
else {
throw new BatfishException("Invalid host protocol");
}
}
private static HostSystemService toHostSystemService(
Hib_system_serviceContext ctx) {
if (ctx.ALL() != null) {
return HostSystemService.ALL;
}
else if (ctx.ANY_SERVICE() != null) {
return HostSystemService.ANY_SERVICE;
}
else if (ctx.DHCP() != null) {
return HostSystemService.DHCP;
}
else if (ctx.DNS() != null) {
return HostSystemService.DNS;
}
else if (ctx.FINGER() != null) {
return HostSystemService.FINGER;
}
else if (ctx.FTP() != null) {
return HostSystemService.FTP;
}
else if (ctx.HTTP() != null) {
return HostSystemService.HTTP;
}
else if (ctx.HTTPS() != null) {
return HostSystemService.HTTPS;
}
else if (ctx.IDENT_RESET() != null) {
return HostSystemService.IDENT_RESET;
}
else if (ctx.IKE() != null) {
return HostSystemService.IKE;
}
else if (ctx.LSPING() != null) {
return HostSystemService.LSPING;
}
else if (ctx.NETCONF() != null) {
return HostSystemService.NETCONF;
}
else if (ctx.NTP() != null) {
return HostSystemService.NTP;
}
else if (ctx.PING() != null) {
return HostSystemService.PING;
}
else if (ctx.R2CP() != null) {
return HostSystemService.R2CP;
}
else if (ctx.REVERSE_SSH() != null) {
return HostSystemService.REVERSE_SSH;
}
else if (ctx.REVERSE_TELNET() != null) {
return HostSystemService.REVERSE_TELNET;
}
else if (ctx.RLOGIN() != null) {
return HostSystemService.RLOGIN;
}
else if (ctx.RPM() != null) {
return HostSystemService.RPM;
}
else if (ctx.RSH() != null) {
return HostSystemService.RSH;
}
else if (ctx.SIP() != null) {
return HostSystemService.SIP;
}
else if (ctx.SNMP() != null) {
return HostSystemService.SNMP;
}
else if (ctx.SNMP_TRAP() != null) {
return HostSystemService.SNMP_TRAP;
}
else if (ctx.SSH() != null) {
return HostSystemService.SSH;
}
else if (ctx.TELNET() != null) {
return HostSystemService.TELNET;
}
else if (ctx.TFTP() != null) {
return HostSystemService.TFTP;
}
else if (ctx.TRACEROUTE() != null) {
return HostSystemService.TRACEROUTE;
}
else if (ctx.XNM_CLEAR_TEXT() != null) {
return HostSystemService.XNM_CLEAR_TEXT;
}
else if (ctx.XNM_SSL() != null) {
return HostSystemService.XNM_SSL;
}
else {
throw new BatfishException("Invalid host system service");
}
}
private static int toIcmpCode(Icmp_codeContext ctx) {
if (ctx.FRAGMENTATION_NEEDED() != null) {
return IcmpCode.PACKET_TOO_BIG;
}
else if (ctx.HOST_UNREACHABLE() != null) {
return IcmpCode.DESTINATION_HOST_UNREACHABLE;
}
else {
throw new BatfishException(
"Missing mapping for icmp-code: '" + ctx.getText() + "'");
}
}
private static int toIcmpType(Icmp_typeContext ctx) {
if (ctx.ECHO_REPLY() != null) {
return IcmpType.ECHO_REPLY;
}
else if (ctx.ECHO_REQUEST() != null) {
return IcmpType.ECHO_REQUEST;
}
else if (ctx.PARAMETER_PROBLEM() != null) {
return IcmpType.PARAMETER_PROBLEM;
}
else if (ctx.SOURCE_QUENCH() != null) {
return IcmpType.SOURCE_QUENCH;
}
else if (ctx.TIME_EXCEEDED() != null) {
return IcmpType.TIME_EXCEEDED;
}
else if (ctx.UNREACHABLE() != null) {
return IcmpType.DESTINATION_UNREACHABLE;
}
else {
throw new BatfishException(
"Missing mapping for icmp-type: '" + ctx.getText() + "'");
}
}
private static IkeAuthenticationAlgorithm toIkeAuthenticationAlgorithm(
Ike_authentication_algorithmContext ctx) {
if (ctx.MD5() != null) {
return IkeAuthenticationAlgorithm.MD5;
}
else if (ctx.SHA1() != null) {
return IkeAuthenticationAlgorithm.SHA1;
}
else if (ctx.SHA_256() != null) {
return IkeAuthenticationAlgorithm.SHA_256;
}
else if (ctx.SHA_384() != null) {
return IkeAuthenticationAlgorithm.SHA_384;
}
else {
throw new BatfishException(
"invalid ike authentication algorithm: " + ctx.getText());
}
}
private static IkeAuthenticationMethod toIkeAuthenticationMethod(
Ike_authentication_methodContext ctx) {
if (ctx.DSA_SIGNATURES() != null) {
return IkeAuthenticationMethod.DSA_SIGNATURES;
}
else if (ctx.PRE_SHARED_KEYS() != null) {
return IkeAuthenticationMethod.PRE_SHARED_KEYS;
}
else if (ctx.RSA_SIGNATURES() != null) {
return IkeAuthenticationMethod.RSA_SIGNATURES;
}
else {
throw new BatfishException(
"Invalid ike authentication method: " + ctx.getText());
}
}
private static Integer toInt(TerminalNode node) {
return toInt(node.getSymbol());
}
private static int toInt(Token token) {
return Integer.parseInt(token.getText());
}
private static IpProtocol toIpProtocol(Ip_protocolContext ctx) {
if (ctx.DEC() != null) {
int protocolNum = toInt(ctx.DEC());
return IpProtocol.fromNumber(protocolNum);
}
else if (ctx.AH() != null) {
return IpProtocol.AHP;
}
else if (ctx.DSTOPTS() != null) {
return IpProtocol.IPV6_OPTS;
}
else if (ctx.EGP() != null) {
return IpProtocol.EGP;
}
else if (ctx.ESP() != null) {
return IpProtocol.ESP;
}
else if (ctx.FRAGMENT() != null) {
return IpProtocol.IPV6_FRAG;
}
else if (ctx.GRE() != null) {
return IpProtocol.GRE;
}
else if (ctx.HOP_BY_HOP() != null) {
return IpProtocol.HOPOPT;
}
else if (ctx.ICMP() != null) {
return IpProtocol.ICMP;
}
else if (ctx.ICMP6() != null) {
return IpProtocol.IPV6_ICMP;
}
else if (ctx.ICMPV6() != null) {
return IpProtocol.IPV6_ICMP;
}
else if (ctx.IGMP() != null) {
return IpProtocol.IGMP;
}
else if (ctx.IPIP() != null) {
return IpProtocol.IPINIP;
}
else if (ctx.IPV6() != null) {
return IpProtocol.IPV6;
}
else if (ctx.OSPF() != null) {
return IpProtocol.OSPF;
}
else if (ctx.PIM() != null) {
return IpProtocol.PIM;
}
else if (ctx.RSVP() != null) {
return IpProtocol.RSVP;
}
else if (ctx.SCTP() != null) {
return IpProtocol.SCTP;
}
else if (ctx.TCP() != null) {
return IpProtocol.TCP;
}
else if (ctx.UDP() != null) {
return IpProtocol.UDP;
}
else if (ctx.VRRP() != null) {
return IpProtocol.VRRP;
}
else {
throw new BatfishException(
"missing protocol-enum mapping for protocol: \"" + ctx.getText()
+ "\"");
}
}
private static IpsecAuthenticationAlgorithm toIpsecAuthenticationAlgorithm(
Ipsec_authentication_algorithmContext ctx) {
if (ctx.HMAC_MD5_96() != null) {
return IpsecAuthenticationAlgorithm.HMAC_MD5_96;
}
else if (ctx.HMAC_SHA1_96() != null) {
return IpsecAuthenticationAlgorithm.HMAC_SHA1_96;
}
else {
throw new BatfishException(
"invalid ipsec authentication algorithm: " + ctx.getText());
}
}
private static IpsecProtocol toIpsecProtocol(Ipsec_protocolContext ctx) {
if (ctx.AH() != null) {
return IpsecProtocol.AH;
}
else if (ctx.ESP() != null) {
return IpsecProtocol.ESP;
}
else {
throw new BatfishException("invalid ipsec protocol: " + ctx.getText());
}
}
private static List<SubRange> toRange(RangeContext ctx) {
List<SubRange> range = new ArrayList<>();
for (SubrangeContext sc : ctx.range_list) {
SubRange sr = toSubRange(sc);
range.add(sr);
}
return range;
}
private static RoutingProtocol toRoutingProtocol(
Routing_protocolContext ctx) {
if (ctx.AGGREGATE() != null) {
return RoutingProtocol.AGGREGATE;
}
else if (ctx.BGP() != null) {
return RoutingProtocol.BGP;
}
else if (ctx.DIRECT() != null) {
return RoutingProtocol.CONNECTED;
}
else if (ctx.ISIS() != null) {
return RoutingProtocol.ISIS;
}
else if (ctx.LDP() != null) {
return RoutingProtocol.LDP;
}
else if (ctx.LOCAL() != null) {
return RoutingProtocol.LOCAL;
}
else if (ctx.OSPF() != null) {
return RoutingProtocol.OSPF;
}
else if (ctx.OSPF3() != null) {
return RoutingProtocol.OSPF3;
}
else if (ctx.RSVP() != null) {
return RoutingProtocol.RSVP;
}
else if (ctx.STATIC() != null) {
return RoutingProtocol.STATIC;
}
else {
throw new BatfishException("missing routing protocol-enum mapping");
}
}
private static SubRange toSubRange(SubrangeContext ctx) {
int low = toInt(ctx.low);
int high = (ctx.high != null) ? toInt(ctx.high) : low;
return new SubRange(low, high);
}
private static TcpFlags toTcpFlags(Tcp_flags_alternativeContext ctx) {
TcpFlags tcpFlags = new TcpFlags();
for (Tcp_flags_literalContext literalCtx : ctx.literals) {
boolean value = literalCtx.BANG() == null;
Tcp_flags_atomContext atom = literalCtx.tcp_flags_atom();
if (atom.ACK() != null) {
tcpFlags.setUseAck(true);
tcpFlags.setAck(value);
}
else if (atom.CWR() != null) {
tcpFlags.setUseCwr(true);
tcpFlags.setCwr(value);
}
else if (atom.ECE() != null) {
tcpFlags.setUseEce(true);
tcpFlags.setEce(value);
}
else if (atom.FIN() != null) {
tcpFlags.setUseFin(true);
tcpFlags.setFin(value);
}
else if (atom.PSH() != null) {
tcpFlags.setUsePsh(true);
tcpFlags.setPsh(value);
}
else if (atom.RST() != null) {
tcpFlags.setUseRst(true);
tcpFlags.setRst(value);
}
else if (atom.SYN() != null) {
tcpFlags.setUseSyn(true);
tcpFlags.setSyn(value);
}
else if (atom.URG() != null) {
tcpFlags.setUseUrg(true);
tcpFlags.setUrg(value);
}
else {
throw new BatfishException(
"Invalid tcp-flags atom: " + atom.getText());
}
}
return tcpFlags;
}
private static List<TcpFlags> toTcpFlags(Tcp_flagsContext ctx) {
List<TcpFlags> tcpFlagsList = new ArrayList<>();
for (Tcp_flags_alternativeContext alternativeCtx : ctx.alternatives) {
TcpFlags tcpFlags = toTcpFlags(alternativeCtx);
tcpFlagsList.add(tcpFlags);
}
return tcpFlagsList;
}
private static String unquote(String text) {
if (text.length() == 0) {
return text;
}
if (text.charAt(0) != '"') {
return text;
}
else if (text.charAt(text.length() - 1) != '"') {
throw new BatfishException("Improperly-quoted string");
}
else {
return text.substring(1, text.length() - 1);
}
}
private JuniperConfiguration _configuration;
private int _conjunctionPolicyIndex;
private AddressBook _currentAddressBook;
private AddressSetAddressBookEntry _currentAddressSetAddressBookEntry;
private AggregateRoute _currentAggregateRoute;
private BaseApplication _currentApplication;
private Term _currentApplicationTerm;
private OspfArea _currentArea;
private BgpGroup _currentBgpGroup;
private CommunityList _currentCommunityList;
private FirewallFilter _currentFilter;
private Family _currentFirewallFamily;
private Zone _currentFromZone;
private FwTerm _currentFwTerm;
private GeneratedRoute _currentGeneratedRoute;
private IkeGateway _currentIkeGateway;
private IkePolicy _currentIkePolicy;
private IkeProposal _currentIkeProposal;
private Interface _currentInterface;
private Prefix _currentInterfacePrefix;
private IpsecPolicy _currentIpsecPolicy;
private IpsecProposal _currentIpsecProposal;
private IpsecVpn _currentIpsecVpn;
private Interface _currentIsisInterface;
private IsisInterfaceLevelSettings _currentIsisInterfaceLevelSettings;
private IsisLevelSettings _currentIsisLevelSettings;
private Interface _currentMasterInterface;
private Interface _currentOspfInterface;
private PolicyStatement _currentPolicyStatement;
private PrefixList _currentPrefixList;
private PsTerm _currentPsTerm;
private Set<PsThen> _currentPsThens;
private RoutingInformationBase _currentRib;
private Route6FilterLine _currentRoute6FilterLine;
private Prefix6 _currentRoute6FilterPrefix;
private RouteFilter _currentRouteFilter;
private Route4FilterLine _currentRouteFilterLine;
private Prefix _currentRouteFilterPrefix;
private RoutingInstance _currentRoutingInstance;
private SnmpCommunity _currentSnmpCommunity;
private SnmpServer _currentSnmpServer;
private StaticRoute _currentStaticRoute;
private Zone _currentToZone;
private VrrpGroup _currentVrrpGroup;
private Zone _currentZone;
private FirewallFilter _currentZoneInboundFilter;
private Interface _currentZoneInterface;
private LineAction _defaultCrossZoneAction;
private int _disjunctionPolicyIndex;
private boolean _hasZones;
private FlatJuniperCombinedParser _parser;
private final Map<PsTerm, RouteFilter> _termRouteFilters;
private final String _text;
private final Set<String> _unimplementedFeatures;
private final Warnings _w;
public ConfigurationBuilder(FlatJuniperCombinedParser parser, String text,
Warnings warnings, Set<String> unimplementedFeatures) {
_parser = parser;
_text = text;
_configuration = new JuniperConfiguration(unimplementedFeatures);
_currentRoutingInstance = _configuration.getDefaultRoutingInstance();
_termRouteFilters = new HashMap<>();
_unimplementedFeatures = unimplementedFeatures;
_w = warnings;
_conjunctionPolicyIndex = 0;
_disjunctionPolicyIndex = 0;
}
@Override
public void enterA_application(A_applicationContext ctx) {
String name = ctx.name.getText();
_currentApplication = _configuration.getApplications().get(name);
if (_currentApplication == null) {
_currentApplication = new BaseApplication(name);
_configuration.getApplications().put(name, _currentApplication);
}
_currentApplicationTerm = _currentApplication.getMainTerm();
}
@Override
public void enterAa_term(Aa_termContext ctx) {
String name = ctx.name.getText();
_currentApplicationTerm = _currentApplication.getTerms().get(name);
if (_currentApplicationTerm == null) {
_currentApplicationTerm = new Term(name);
_currentApplication.getTerms().put(name, _currentApplicationTerm);
}
}
@Override
public void enterB_group(B_groupContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
Map<String, NamedBgpGroup> namedBgpGroups = _currentRoutingInstance
.getNamedBgpGroups();
NamedBgpGroup namedBgpGroup = namedBgpGroups.get(name);
if (namedBgpGroup == null) {
namedBgpGroup = new NamedBgpGroup(name, definitionLine);
namedBgpGroup.setParent(_currentBgpGroup);
namedBgpGroups.put(name, namedBgpGroup);
}
_currentBgpGroup = namedBgpGroup;
}
@Override
public void enterB_neighbor(B_neighborContext ctx) {
if (ctx.IP_ADDRESS() != null) {
Ip remoteAddress = new Ip(ctx.IP_ADDRESS().getText());
Map<Ip, IpBgpGroup> ipBgpGroups = _currentRoutingInstance
.getIpBgpGroups();
IpBgpGroup ipBgpGroup = ipBgpGroups.get(remoteAddress);
if (ipBgpGroup == null) {
ipBgpGroup = new IpBgpGroup(remoteAddress);
ipBgpGroup.setParent(_currentBgpGroup);
ipBgpGroups.put(remoteAddress, ipBgpGroup);
}
_currentBgpGroup = ipBgpGroup;
}
else if (ctx.IPV6_ADDRESS() != null) {
_currentBgpGroup.setIpv6(true);
_currentBgpGroup = DUMMY_BGP_GROUP;
}
}
@Override
public void enterF_family(F_familyContext ctx) {
if (ctx.INET() != null) {
_currentFirewallFamily = Family.INET;
}
else if (ctx.INET6() != null) {
_currentFirewallFamily = Family.INET6;
}
else if (ctx.MPLS() != null) {
_currentFirewallFamily = Family.MPLS;
}
}
@Override
public void enterF_filter(F_filterContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
Map<String, FirewallFilter> filters = _configuration.getFirewallFilters();
_currentFilter = filters.get(name);
if (_currentFirewallFamily == null) {
_currentFirewallFamily = Family.INET;
}
if (_currentFilter == null) {
_currentFilter = new FirewallFilter(name, _currentFirewallFamily,
definitionLine);
filters.put(name, _currentFilter);
}
}
@Override
public void enterFf_term(Ff_termContext ctx) {
String name = ctx.name.getText();
Map<String, FwTerm> terms = _currentFilter.getTerms();
_currentFwTerm = terms.get(name);
if (_currentFwTerm == null) {
_currentFwTerm = new FwTerm(name);
terms.put(name, _currentFwTerm);
}
}
@Override
public void enterI_unit(I_unitContext ctx) {
String unit = ctx.num.getText();
int definitionLine = ctx.num.getLine();
String unitFullName = _currentMasterInterface.getName() + "." + unit;
Map<String, Interface> units = _currentMasterInterface.getUnits();
_currentInterface = units.get(unitFullName);
if (_currentInterface == null) {
_currentInterface = new Interface(unitFullName, definitionLine);
_currentInterface
.setRoutingInstance(_currentRoutingInstance.getName());
_currentInterface.setParent(_currentMasterInterface);
units.put(unitFullName, _currentInterface);
}
}
@Override
public void enterIfi_address(Ifi_addressContext ctx) {
Set<Prefix> allPrefixes = _currentInterface.getAllPrefixes();
Prefix prefix;
if (ctx.IP_PREFIX() != null) {
prefix = new Prefix(ctx.IP_PREFIX().getText());
}
else if (ctx.IP_ADDRESS() != null) {
Ip ip = new Ip(ctx.IP_ADDRESS().getText());
prefix = new Prefix(ip, 32);
}
else {
throw new BatfishException("Invalid or missing address");
}
_currentInterfacePrefix = prefix;
if (_currentInterface.getPrimaryPrefix() == null) {
_currentInterface.setPrimaryPrefix(prefix);
}
if (_currentInterface.getPreferredPrefix() == null) {
_currentInterface.setPreferredPrefix(prefix);
}
allPrefixes.add(prefix);
Ip ip = prefix.getAddress();
_currentInterface.getAllPrefixIps().add(ip);
}
@Override
public void enterIfia_vrrp_group(Ifia_vrrp_groupContext ctx) {
int group = toInt(ctx.number);
VrrpGroup currentVrrpGroup = _currentInterface.getVrrpGroups().get(group);
if (currentVrrpGroup == null) {
currentVrrpGroup = new VrrpGroup(group);
currentVrrpGroup.setPreempt(DEFAULT_VRRP_PREEMPT);
currentVrrpGroup.setPriority(DEFAULT_VRRP_PRIORITY);
_currentInterface.getVrrpGroups().put(group, currentVrrpGroup);
}
_currentVrrpGroup = currentVrrpGroup;
}
@Override
public void enterInt_named(Int_namedContext ctx) {
Interface currentInterface;
if (ctx.interface_id() == null) {
currentInterface = _configuration.getGlobalMasterInterface();
}
else {
String ifaceName = getInterfaceName(ctx.interface_id());
Map<String, Interface> interfaces;
String nodeDevicePrefix = "";
if (ctx.interface_id().node == null) {
interfaces = _configuration.getInterfaces();
}
else {
String nodeDeviceName = ctx.interface_id().node.getText();
nodeDevicePrefix = nodeDeviceName + ":";
NodeDevice nodeDevice = _configuration.getNodeDevices()
.get(nodeDeviceName);
if (nodeDevice == null) {
nodeDevice = new NodeDevice(nodeDeviceName);
_configuration.getNodeDevices().put(nodeDeviceName, nodeDevice);
}
interfaces = nodeDevice.getInterfaces();
}
currentInterface = interfaces.get(ifaceName);
if (currentInterface == null) {
String fullIfaceName = nodeDevicePrefix + ifaceName;
int definitionLine = ctx.interface_id().getStart().getLine();
currentInterface = new Interface(fullIfaceName, definitionLine);
currentInterface
.setRoutingInstance(_currentRoutingInstance.getName());
currentInterface
.setParent(_configuration.getGlobalMasterInterface());
interfaces.put(fullIfaceName, currentInterface);
}
}
_currentInterface = currentInterface;
_currentMasterInterface = currentInterface;
}
@Override
public void enterIs_interface(Is_interfaceContext ctx) {
Map<String, Interface> interfaces = _configuration.getInterfaces();
String unitFullName = null;
String name = ctx.id.name.getText();
int definitionLine = ctx.id.name.getLine();
String unit = null;
if (ctx.id.unit != null) {
unit = ctx.id.unit.getText();
}
unitFullName = name + "." + unit;
_currentIsisInterface = interfaces.get(name);
if (_currentIsisInterface == null) {
_currentIsisInterface = new Interface(name, definitionLine);
_currentIsisInterface
.setRoutingInstance(_currentRoutingInstance.getName());
interfaces.put(name, _currentIsisInterface);
}
if (unit != null) {
definitionLine = ctx.id.unit.getLine();
Map<String, Interface> units = _currentIsisInterface.getUnits();
_currentIsisInterface = units.get(unitFullName);
if (_currentIsisInterface == null) {
_currentIsisInterface = new Interface(unitFullName, definitionLine);
_currentIsisInterface
.setRoutingInstance(_currentRoutingInstance.getName());
units.put(unitFullName, _currentIsisInterface);
}
}
_currentIsisInterface.getIsisSettings().setEnabled(true);
}
@Override
public void enterIs_level(Is_levelContext ctx) {
IsisSettings isisSettings = _currentRoutingInstance.getIsisSettings();
int level = toInt(ctx.DEC());
switch (level) {
case 1:
_currentIsisLevelSettings = isisSettings.getLevel1Settings();
break;
case 2:
_currentIsisLevelSettings = isisSettings.getLevel2Settings();
break;
default:
throw new BatfishException("invalid level: " + level);
}
_currentIsisLevelSettings.setEnabled(true);
}
@Override
public void enterIsi_level(Isi_levelContext ctx) {
int level = toInt(ctx.DEC());
switch (level) {
case 1:
_currentIsisInterfaceLevelSettings = _currentIsisInterface
.getIsisSettings().getLevel1Settings();
break;
case 2:
_currentIsisInterfaceLevelSettings = _currentIsisInterface
.getIsisSettings().getLevel2Settings();
break;
default:
throw new BatfishException("invalid IS-IS level: " + level);
}
_currentIsisInterfaceLevelSettings.setEnabled(true);
}
@Override
public void enterO_area(O_areaContext ctx) {
Ip areaIp = new Ip(ctx.area.getText());
Map<Ip, OspfArea> areas = _currentRoutingInstance.getOspfAreas();
_currentArea = areas.get(areaIp);
if (_currentArea == null) {
_currentArea = new OspfArea(areaIp);
areas.put(areaIp, _currentArea);
}
}
@Override
public void enterOa_interface(Oa_interfaceContext ctx) {
Map<String, Interface> interfaces = _configuration.getInterfaces();
String unitFullName = null;
if (ctx.ALL() != null) {
_currentOspfInterface = _currentRoutingInstance
.getGlobalMasterInterface();
}
else if (ctx.ip != null) {
Ip ip = new Ip(ctx.ip.getText());
for (Interface iface : interfaces.values()) {
for (Interface unit : iface.getUnits().values()) {
if (unit.getAllPrefixIps().contains(ip)) {
_currentOspfInterface = unit;
unitFullName = unit.getName();
}
}
}
if (_currentOspfInterface == null) {
throw new BatfishException(
"Could not find interface with ip address: " + ip.toString());
}
}
else {
_currentOspfInterface = initInterface(ctx.id);
unitFullName = _currentOspfInterface.getName();
}
Ip currentArea = _currentArea.getAreaIp();
if (ctx.oai_passive() != null) {
_currentOspfInterface.getOspfPassiveAreas().add(currentArea);
}
else {
Ip interfaceActiveArea = _currentOspfInterface.getOspfActiveArea();
if (interfaceActiveArea != null
&& !currentArea.equals(interfaceActiveArea)) {
throw new BatfishException("Interface: \"" + unitFullName.toString()
+ "\" assigned to multiple active areas");
}
_currentOspfInterface.setOspfActiveArea(currentArea);
}
}
@Override
public void enterP_bgp(P_bgpContext ctx) {
_currentBgpGroup = _currentRoutingInstance.getMasterBgpGroup();
}
@Override
public void enterPo_community(Po_communityContext ctx) {
String name = ctx.name.getText();
Map<String, CommunityList> communityLists = _configuration
.getCommunityLists();
_currentCommunityList = communityLists.get(name);
if (_currentCommunityList == null) {
_currentCommunityList = new CommunityList(name);
communityLists.put(name, _currentCommunityList);
}
}
@Override
public void enterPo_policy_statement(Po_policy_statementContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
Map<String, PolicyStatement> policyStatements = _configuration
.getPolicyStatements();
_currentPolicyStatement = policyStatements.get(name);
if (_currentPolicyStatement == null) {
_currentPolicyStatement = new PolicyStatement(name, definitionLine);
policyStatements.put(name, _currentPolicyStatement);
}
_currentPsTerm = _currentPolicyStatement.getDefaultTerm();
_currentPsThens = _currentPsTerm.getThens();
}
@Override
public void enterPo_prefix_list(Po_prefix_listContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
Map<String, PrefixList> prefixLists = _configuration.getPrefixLists();
_currentPrefixList = prefixLists.get(name);
if (_currentPrefixList == null) {
_currentPrefixList = new PrefixList(name, definitionLine);
prefixLists.put(name, _currentPrefixList);
}
}
@Override
public void enterPops_term(Pops_termContext ctx) {
String name = ctx.name.getText();
Map<String, PsTerm> terms = _currentPolicyStatement.getTerms();
_currentPsTerm = terms.get(name);
if (_currentPsTerm == null) {
_currentPsTerm = new PsTerm(name);
terms.put(name, _currentPsTerm);
}
_currentPsThens = _currentPsTerm.getThens();
}
@Override
public void enterPopsf_route_filter(Popsf_route_filterContext ctx) {
_currentRouteFilter = _termRouteFilters.get(_currentPsTerm);
if (_currentRouteFilter == null) {
String rfName = _currentPolicyStatement.getName() + ":"
+ _currentPsTerm.getName();
_currentRouteFilter = new RouteFilter(rfName);
_termRouteFilters.put(_currentPsTerm, _currentRouteFilter);
_configuration.getRouteFilters().put(rfName, _currentRouteFilter);
PsFromRouteFilter from = new PsFromRouteFilter(rfName);
_currentPsTerm.getFroms().add(from);
}
if (ctx.IP_PREFIX() != null) {
_currentRouteFilterPrefix = new Prefix(ctx.IP_PREFIX().getText());
_currentRouteFilter.setIpv4(true);
}
else if (ctx.IPV6_PREFIX() != null) {
_currentRoute6FilterPrefix = new Prefix6(ctx.IPV6_PREFIX().getText());
_currentRouteFilter.setIpv6(true);
}
}
@Override
public void enterPopsfrf_exact(Popsfrf_exactContext ctx) {
if (_currentRouteFilterPrefix != null) { // ipv4
Route4FilterLine line = new Route4FilterLineExact(
_currentRouteFilterPrefix);
_currentRouteFilterLine = _currentRouteFilter.insertLine(line,
Route4FilterLine.class);
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Route6FilterLine line = new Route6FilterLineExact(
_currentRoute6FilterPrefix);
_currentRoute6FilterLine = _currentRouteFilter.insertLine(line,
Route6FilterLine.class);
}
}
@Override
public void enterPopsfrf_longer(Popsfrf_longerContext ctx) {
if (_currentRouteFilterPrefix != null) { // ipv4
Route4FilterLine line = new Route4FilterLineLonger(
_currentRouteFilterPrefix);
_currentRouteFilterLine = _currentRouteFilter.insertLine(line,
Route4FilterLine.class);
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Route6FilterLine line = new Route6FilterLineLonger(
_currentRoute6FilterPrefix);
_currentRoute6FilterLine = _currentRouteFilter.insertLine(line,
Route6FilterLine.class);
}
}
@Override
public void enterPopsfrf_orlonger(Popsfrf_orlongerContext ctx) {
if (_currentRouteFilterPrefix != null) { // ipv4
Route4FilterLine line = new Route4FilterLineOrLonger(
_currentRouteFilterPrefix);
_currentRouteFilterLine = _currentRouteFilter.insertLine(line,
Route4FilterLine.class);
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Route6FilterLine line = new Route6FilterLineOrLonger(
_currentRoute6FilterPrefix);
_currentRoute6FilterLine = _currentRouteFilter.insertLine(line,
Route6FilterLine.class);
}
}
@Override
public void enterPopsfrf_prefix_length_range(
Popsfrf_prefix_length_rangeContext ctx) {
int minPrefixLength = toInt(ctx.low);
int maxPrefixLength = toInt(ctx.high);
if (_currentRouteFilterPrefix != null) { // ipv4
Route4FilterLine line = new Route4FilterLineLengthRange(
_currentRouteFilterPrefix, minPrefixLength, maxPrefixLength);
_currentRouteFilterLine = _currentRouteFilter.insertLine(line,
Route4FilterLine.class);
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Route6FilterLine line = new Route6FilterLineLengthRange(
_currentRoute6FilterPrefix, minPrefixLength, maxPrefixLength);
_currentRoute6FilterLine = _currentRouteFilter.insertLine(line,
Route6FilterLine.class);
}
}
@Override
public void enterPopsfrf_then(Popsfrf_thenContext ctx) {
if (_currentRouteFilterPrefix != null) { // ipv4
Route4FilterLine line = _currentRouteFilterLine;
_currentPsThens = line.getThens();
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Route6FilterLine line = _currentRoute6FilterLine;
_currentPsThens = line.getThens();
}
}
@Override
public void enterPopsfrf_through(Popsfrf_throughContext ctx) {
if (_currentRouteFilterPrefix != null) { // ipv4
Prefix throughPrefix = new Prefix(ctx.IP_PREFIX().getText());
Route4FilterLine line = new Route4FilterLineThrough(
_currentRouteFilterPrefix, throughPrefix);
_currentRouteFilterLine = _currentRouteFilter.insertLine(line,
Route4FilterLine.class);
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Prefix6 throughPrefix6 = new Prefix6(ctx.IPV6_PREFIX().getText());
Route6FilterLine line = new Route6FilterLineThrough(
_currentRoute6FilterPrefix, throughPrefix6);
_currentRoute6FilterLine = _currentRouteFilter.insertLine(line,
Route6FilterLine.class);
}
}
@Override
public void enterPopsfrf_upto(Popsfrf_uptoContext ctx) {
int maxPrefixLength = toInt(ctx.high);
if (_currentRouteFilterPrefix != null) { // ipv4
Route4FilterLine line = new Route4FilterLineUpTo(
_currentRouteFilterPrefix, maxPrefixLength);
_currentRouteFilterLine = _currentRouteFilter.insertLine(line,
Route4FilterLine.class);
}
else if (_currentRoute6FilterPrefix != null) { // ipv6
Route6FilterLine line = new Route6FilterLineUpTo(
_currentRoute6FilterPrefix, maxPrefixLength);
_currentRoute6FilterLine = _currentRouteFilter.insertLine(line,
Route6FilterLine.class);
}
}
@Override
public void enterRi_named_routing_instance(
Ri_named_routing_instanceContext ctx) {
String name;
name = ctx.name.getText();
_currentRoutingInstance = _configuration.getRoutingInstances().get(name);
if (_currentRoutingInstance == null) {
_currentRoutingInstance = new RoutingInstance(name);
_configuration.getRoutingInstances().put(name,
_currentRoutingInstance);
}
}
@Override
public void enterRo_aggregate(Ro_aggregateContext ctx) {
if (ctx.prefix != null) {
Prefix prefix = new Prefix(ctx.IP_PREFIX().getText());
Map<Prefix, AggregateRoute> aggregateRoutes = _currentRib
.getAggregateRoutes();
_currentAggregateRoute = aggregateRoutes.get(prefix);
if (_currentAggregateRoute == null) {
_currentAggregateRoute = new AggregateRoute(prefix);
aggregateRoutes.put(prefix, _currentAggregateRoute);
}
}
else {
_currentAggregateRoute = DUMMY_AGGREGATE_ROUTE;
}
}
@Override
public void enterRo_generate(Ro_generateContext ctx) {
if (ctx.IP_PREFIX() != null) {
Prefix prefix = new Prefix(ctx.IP_PREFIX().getText());
Map<Prefix, GeneratedRoute> generatedRoutes = _currentRib
.getGeneratedRoutes();
_currentGeneratedRoute = generatedRoutes.get(prefix);
if (_currentGeneratedRoute == null) {
_currentGeneratedRoute = new GeneratedRoute(prefix);
generatedRoutes.put(prefix, _currentGeneratedRoute);
}
}
else if (ctx.IPV6_PREFIX() != null) {
// dummy generated route not added to configuration
_currentGeneratedRoute = new GeneratedRoute(null);
todo(ctx, F_IPV6);
}
}
@Override
public void enterRo_rib(Ro_ribContext ctx) {
String name = ctx.name.getText();
Map<String, RoutingInformationBase> ribs = _currentRoutingInstance
.getRibs();
_currentRib = ribs.get(name);
if (_currentRib == null) {
_currentRib = new RoutingInformationBase(name);
ribs.put(name, _currentRib);
}
}
@Override
public void enterRos_route(Ros_routeContext ctx) {
if (ctx.IP_PREFIX() != null) {
Prefix prefix = new Prefix(ctx.IP_PREFIX().getText());
Map<Prefix, StaticRoute> staticRoutes = _currentRib.getStaticRoutes();
_currentStaticRoute = staticRoutes.get(prefix);
if (_currentStaticRoute == null) {
_currentStaticRoute = new StaticRoute(prefix);
staticRoutes.put(prefix, _currentStaticRoute);
}
}
else if (ctx.IPV6_PREFIX() != null) {
_currentStaticRoute = DUMMY_STATIC_ROUTE;
}
}
@Override
public void enterS_firewall(S_firewallContext ctx) {
_currentFirewallFamily = Family.INET;
}
@Override
public void enterS_routing_options(S_routing_optionsContext ctx) {
_currentRib = _currentRoutingInstance.getRibs()
.get(RoutingInformationBase.RIB_IPV4_UNICAST);
}
@Override
public void enterS_snmp(S_snmpContext ctx) {
SnmpServer snmpServer = _currentRoutingInstance.getSnmpServer();
if (snmpServer == null) {
snmpServer = new SnmpServer();
snmpServer.setVrf(_currentRoutingInstance.getName());
_currentRoutingInstance.setSnmpServer(snmpServer);
}
_currentSnmpServer = snmpServer;
}
@Override
public void enterSeik_gateway(Seik_gatewayContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
_currentIkeGateway = _configuration.getIkeGateways().get(name);
if (_currentIkeGateway == null) {
_currentIkeGateway = new IkeGateway(name, definitionLine);
_configuration.getIkeGateways().put(name, _currentIkeGateway);
}
}
@Override
public void enterSeik_policy(Seik_policyContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
_currentIkePolicy = _configuration.getIkePolicies().get(name);
if (_currentIkePolicy == null) {
_currentIkePolicy = new IkePolicy(name, definitionLine);
_configuration.getIkePolicies().put(name, _currentIkePolicy);
}
}
@Override
public void enterSeik_proposal(Seik_proposalContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
_currentIkeProposal = _configuration.getIkeProposals().get(name);
if (_currentIkeProposal == null) {
_currentIkeProposal = new IkeProposal(name, definitionLine);
_configuration.getIkeProposals().put(name, _currentIkeProposal);
}
}
@Override
public void enterSeip_policy(Seip_policyContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
_currentIpsecPolicy = _configuration.getIpsecPolicies().get(name);
if (_currentIpsecPolicy == null) {
_currentIpsecPolicy = new IpsecPolicy(name, definitionLine);
_configuration.getIpsecPolicies().put(name, _currentIpsecPolicy);
}
}
@Override
public void enterSeip_proposal(Seip_proposalContext ctx) {
String name = ctx.name.getText();
int definitionLine = ctx.name.getStart().getLine();
_currentIpsecProposal = _configuration.getIpsecProposals().get(name);
if (_currentIpsecProposal == null) {
_currentIpsecProposal = new IpsecProposal(name, definitionLine);
_configuration.getIpsecProposals().put(name, _currentIpsecProposal);
}
}
@Override
public void enterSeip_vpn(Seip_vpnContext ctx) {
String name = ctx.name.getText();
_currentIpsecVpn = _configuration.getIpsecVpns().get(name);
if (_currentIpsecVpn == null) {
_currentIpsecVpn = new IpsecVpn(name);
_configuration.getIpsecVpns().put(name, _currentIpsecVpn);
}
}
@Override
public void enterSep_from_zone(Sep_from_zoneContext ctx) {
if (ctx.from.JUNOS_HOST() != null && ctx.to.JUNOS_HOST() != null) {
_w.redFlag(
"Cannot create security policy from junos-host to junos-host");
}
else {
String fromName = ctx.from.getText();
String toName = ctx.to.getText();
String policyName = "~FROM_ZONE~" + fromName + "~TO_ZONE~" + toName;
if (ctx.from.JUNOS_HOST() == null) {
_currentFromZone = _configuration.getZones().get(fromName);
if (_currentFromZone == null) {
_currentFromZone = new Zone(fromName,
_configuration.getGlobalAddressBooks());
_configuration.getZones().put(fromName, _currentFromZone);
_configuration.getFirewallFilters().put(
_currentFromZone.getInboundFilter().getName(),
_currentFromZone.getInboundFilter());
}
}
if (ctx.to.JUNOS_HOST() == null) {
_currentToZone = _configuration.getZones().get(toName);
if (_currentToZone == null) {
_currentToZone = new Zone(toName,
_configuration.getGlobalAddressBooks());
_configuration.getFirewallFilters().put(
_currentToZone.getInboundFilter().getName(),
_currentToZone.getInboundFilter());
_configuration.getZones().put(toName, _currentToZone);
}
}
if (ctx.from.JUNOS_HOST() != null) {
_currentFilter = _currentToZone.getFromHostFilter();
if (_currentFilter == null) {
_currentFilter = new FirewallFilter(policyName, Family.INET, -1);
_configuration.getFirewallFilters().put(policyName,
_currentFilter);
_currentToZone.setFromHostFilter(_currentFilter);
}
}
else if (ctx.to.JUNOS_HOST() != null) {
_currentFilter = _currentFromZone.getToHostFilter();
if (_currentFilter == null) {
_currentFilter = new FirewallFilter(policyName, Family.INET, -1);
_configuration.getFirewallFilters().put(policyName,
_currentFilter);
_currentFromZone.setToHostFilter(_currentFilter);
}
}
else {
_currentFilter = _currentFromZone.getToZonePolicies().get(toName);
if (_currentFilter == null) {
_currentFilter = new FirewallFilter(policyName, Family.INET, -1);
_configuration.getFirewallFilters().put(policyName,
_currentFilter);
_currentFromZone.getToZonePolicies().put(toName, _currentFilter);
}
}
}
}
@Override
public void enterSepf_policy(Sepf_policyContext ctx) {
String termName = ctx.name.getText();
_currentFwTerm = _currentFilter.getTerms().get(termName);
if (_currentFwTerm == null) {
_currentFwTerm = new FwTerm(termName);
_currentFilter.getTerms().put(termName, _currentFwTerm);
}
}
@Override
public void enterSez_security_zone(Sez_security_zoneContext ctx) {
String zoneName = ctx.zone().getText();
_currentZone = _configuration.getZones().get(zoneName);
if (_currentZone == null) {
_currentZone = new Zone(zoneName,
_configuration.getGlobalAddressBooks());
_configuration.getFirewallFilters().put(
_currentZone.getInboundFilter().getName(),
_currentZone.getInboundFilter());
_configuration.getZones().put(zoneName, _currentZone);
}
_currentZoneInboundFilter = _currentZone.getInboundFilter();
}
@Override
public void enterSezs_address_book(Sezs_address_bookContext ctx) {
_currentAddressBook = _currentZone.getAddressBook();
}
@Override
public void enterSezs_host_inbound_traffic(
Sezs_host_inbound_trafficContext ctx) {
if (_currentZoneInterface != null) {
_currentZoneInboundFilter = _currentZone.getInboundInterfaceFilters()
.get(_currentZoneInterface);
if (_currentZoneInboundFilter == null) {
String name = "~ZONE_INTERFACE_FILTER~" + _currentZone.getName()
+ "~INTERFACE~" + _currentZoneInterface.getName();
_currentZoneInboundFilter = new FirewallFilter(name, Family.INET,
-1);
_configuration.getFirewallFilters().put(name,
_currentZoneInboundFilter);
_currentZone.getInboundInterfaceFilters().put(_currentZoneInterface,
_currentZoneInboundFilter);
}
}
}
@Override
public void enterSezs_interfaces(Sezs_interfacesContext ctx) {
_currentZoneInterface = initInterface(ctx.interface_id());
_currentZone.getInterfaces().add(_currentZoneInterface);
}
@Override
public void enterSezsa_address_set(Sezsa_address_setContext ctx) {
String name = ctx.name.getText();
AddressBookEntry entry = _currentAddressBook.getEntries().get(name);
if (entry == null) {
entry = new AddressSetAddressBookEntry(name);
_currentAddressBook.getEntries().put(name, entry);
}
try {
_currentAddressSetAddressBookEntry = (AddressSetAddressBookEntry) entry;
}
catch (ClassCastException e) {
throw new BatfishException(
"Cannot create address-set address-book entry \"" + name
+ "\" because a different type of address-book entry with that name already exists",
e);
}
}
@Override
public void enterSnmp_community(Snmp_communityContext ctx) {
String community = ctx.comm.getText();
SnmpCommunity snmpCommunity = _currentSnmpServer.getCommunities()
.get(community);
if (snmpCommunity == null) {
snmpCommunity = new SnmpCommunity(community);
_currentSnmpServer.getCommunities().put(community, snmpCommunity);
}
_currentSnmpCommunity = snmpCommunity;
}
@Override
public void enterSy_tacplus_server(Sy_tacplus_serverContext ctx) {
String hostname = ctx.hostname.getText();
_configuration.getTacplusServers().add(hostname);
}
@Override
public void enterSyn_server(Syn_serverContext ctx) {
String hostname = ctx.hostname.getText();
_configuration.getNtpServers().add(hostname);
}
@Override
public void enterSys_host(Sys_hostContext ctx) {
String hostname = ctx.hostname.getText();
_configuration.getSyslogHosts().add(hostname);
}
@Override
public void exitA_application(A_applicationContext ctx) {
_currentApplication = null;
_currentApplicationTerm = null;
}
@Override
public void exitAa_term(Aa_termContext ctx) {
_currentApplicationTerm = _currentApplication.getMainTerm();
}
@Override
public void exitAat_destination_port(Aat_destination_portContext ctx) {
SubRange subrange = toSubRange(ctx.subrange());
_currentApplicationTerm.getLine().getDstPorts().add(subrange);
}
@Override
public void exitAat_protocol(Aat_protocolContext ctx) {
IpProtocol protocol = toIpProtocol(ctx.ip_protocol());
_currentApplicationTerm.getLine().getIpProtocols().add(protocol);
}
@Override
public void exitAat_source_port(Aat_source_portContext ctx) {
SubRange subrange = toSubRange(ctx.subrange());
_currentApplicationTerm.getLine().getSrcPorts().add(subrange);
}
@Override
public void exitB_advertise_external(B_advertise_externalContext ctx) {
_currentBgpGroup.setAdvertiseExternal(true);
}
@Override
public void exitB_advertise_inactive(B_advertise_inactiveContext ctx) {
_currentBgpGroup.setAdvertiseInactive(true);
}
@Override
public void exitB_advertise_peer_as(B_advertise_peer_asContext ctx) {
_currentBgpGroup.setAdvertisePeerAs(true);
}
@Override
public void exitB_description(B_descriptionContext ctx) {
String description = ctx.description().text.getText();
_currentBgpGroup.setDescription(description);
}
@Override
public void exitB_export(B_exportContext ctx) {
Policy_expressionContext expr = ctx.expr;
String name;
int line;
if (expr.variable() != null) {
name = expr.variable().getText();
line = expr.variable().getStart().getLine();
}
else {
name = toComplexPolicyStatement(expr);
line = expr.getStart().getLine();
}
_currentBgpGroup.getExportPolicies().put(name, line);
}
@Override
public void exitB_import(B_importContext ctx) {
Policy_expressionContext expr = ctx.expr;
String name;
int line;
if (expr.variable() != null) {
name = expr.variable().getText();
line = expr.variable().getStart().getLine();
}
else {
name = toComplexPolicyStatement(expr);
line = expr.getStart().getLine();
}
_currentBgpGroup.getImportPolicies().put(name, line);
}
@Override
public void exitB_local_address(B_local_addressContext ctx) {
if (ctx.IP_ADDRESS() != null) {
Ip localAddress = new Ip(ctx.IP_ADDRESS().getText());
_currentBgpGroup.setLocalAddress(localAddress);
}
}
@Override
public void exitB_multihop(B_multihopContext ctx) {
_currentBgpGroup.setEbgpMultihop(true);
}
@Override
public void exitB_remove_private(B_remove_privateContext ctx) {
_currentBgpGroup.setRemovePrivate(true);
}
@Override
public void exitB_type(B_typeContext ctx) {
if (ctx.INTERNAL() != null) {
_currentBgpGroup.setType(BgpGroupType.INTERNAL);
}
else if (ctx.EXTERNAL() != null) {
_currentBgpGroup.setType(BgpGroupType.EXTERNAL);
}
}
@Override
public void exitBl_loops(Bl_loopsContext ctx) {
todo(ctx, F_BGP_LOCAL_AS_LOOPS);
int loops = toInt(ctx.DEC());
_currentBgpGroup.setLoops(loops);
}
@Override
public void exitBl_number(Bl_numberContext ctx) {
int localAs = toInt(ctx.as);
_currentBgpGroup.setLocalAs(localAs);
}
@Override
public void exitBl_private(Bl_privateContext ctx) {
todo(ctx, F_BGP_LOCAL_AS_PRIVATE);
}
@Override
public void exitBpa_as(Bpa_asContext ctx) {
int peerAs = toInt(ctx.as);
_currentBgpGroup.setPeerAs(peerAs);
}
@Override
public void exitF_filter(F_filterContext ctx) {
_currentFilter = null;
}
@Override
public void exitFf_term(Ff_termContext ctx) {
_currentFwTerm = null;
}
@Override
public void exitFftf_destination_address(
Fftf_destination_addressContext ctx) {
if (ctx.IP_ADDRESS() != null || ctx.IP_PREFIX() != null) {
Prefix prefix;
if (ctx.IP_PREFIX() != null) {
prefix = new Prefix(ctx.IP_PREFIX().getText());
}
else {
prefix = new Prefix(new Ip(ctx.IP_ADDRESS().getText()),
Prefix.MAX_PREFIX_LENGTH);
}
FwFrom from;
if (ctx.EXCEPT() != null) {
from = new FwFromDestinationAddressExcept(prefix);
}
else {
from = new FwFromDestinationAddress(prefix);
}
_currentFwTerm.getFroms().add(from);
}
}
@Override
public void exitFftf_destination_port(Fftf_destination_portContext ctx) {
if (ctx.port() != null) {
int port = getPortNumber(ctx.port());
SubRange subrange = new SubRange(port, port);
FwFrom from = new FwFromDestinationPort(subrange);
_currentFwTerm.getFroms().add(from);
}
else if (ctx.range() != null) {
for (SubrangeContext subrangeContext : ctx.range().range_list) {
SubRange subrange = toSubRange(subrangeContext);
FwFrom from = new FwFromDestinationPort(subrange);
_currentFwTerm.getFroms().add(from);
}
}
}
@Override
public void exitFftf_destination_prefix_list(
Fftf_destination_prefix_listContext ctx) {
String name = ctx.name.getText();
// temporary
if (_currentFilter.getFamily() != Family.INET) {
_configuration.getIgnoredPrefixLists().add(name);
}
FwFrom from;
if (ctx.EXCEPT() != null) {
from = new FwFromDestinationPrefixListExcept(name);
}
else {
from = new FwFromDestinationPrefixList(name);
}
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_first_fragment(Fftf_first_fragmentContext ctx) {
SubRange subRange = new SubRange(0, 0);
FwFrom from = new FwFromFragmentOffset(subRange, false);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_fragment_offset(Fftf_fragment_offsetContext ctx) {
SubRange subRange = toSubRange(ctx.subrange());
FwFrom from = new FwFromFragmentOffset(subRange, false);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_fragment_offset_except(
Fftf_fragment_offset_exceptContext ctx) {
SubRange subRange = toSubRange(ctx.subrange());
FwFrom from = new FwFromFragmentOffset(subRange, true);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_icmp_code(Fftf_icmp_codeContext ctx) {
if (_currentFirewallFamily == Family.INET6) {
// TODO: support icmpv6
return;
}
SubRange icmpCodeRange;
if (ctx.subrange() != null) {
icmpCodeRange = toSubRange(ctx.subrange());
}
else if (ctx.icmp_code() != null) {
int icmpCode = toIcmpCode(ctx.icmp_code());
icmpCodeRange = new SubRange(icmpCode, icmpCode);
}
else {
throw new BatfishException("Invalid icmp-code");
}
FwFrom from = new FwFromIcmpCode(icmpCodeRange);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_icmp_type(Fftf_icmp_typeContext ctx) {
if (_currentFirewallFamily == Family.INET6) {
// TODO: support icmpv6
return;
}
SubRange icmpTypeRange;
if (ctx.subrange() != null) {
icmpTypeRange = toSubRange(ctx.subrange());
}
else if (ctx.icmp_type() != null) {
int icmpType = toIcmpType(ctx.icmp_type());
icmpTypeRange = new SubRange(icmpType, icmpType);
}
else {
throw new BatfishException("Invalid icmp-type");
}
FwFrom from = new FwFromIcmpType(icmpTypeRange);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_is_fragment(Fftf_is_fragmentContext ctx) {
SubRange subRange = new SubRange(0, 0);
FwFrom from = new FwFromFragmentOffset(subRange, true);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_packet_length(Fftf_packet_lengthContext ctx) {
List<SubRange> range = toRange(ctx.range());
FwFrom from = new FwFromPacketLength(range, false);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_packet_length_except(
Fftf_packet_length_exceptContext ctx) {
List<SubRange> range = toRange(ctx.range());
FwFrom from = new FwFromPacketLength(range, true);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_port(Fftf_portContext ctx) {
if (ctx.port() != null) {
int port = getPortNumber(ctx.port());
SubRange subrange = new SubRange(port, port);
FwFrom from = new FwFromPort(subrange);
_currentFwTerm.getFroms().add(from);
}
else if (ctx.range() != null) {
for (SubrangeContext subrangeContext : ctx.range().range_list) {
SubRange subrange = toSubRange(subrangeContext);
FwFrom from = new FwFromPort(subrange);
_currentFwTerm.getFroms().add(from);
}
}
}
@Override
public void exitFftf_prefix_list(Fftf_prefix_listContext ctx) {
String name = ctx.name.getText();
// temporary
if (_currentFilter.getFamily() != Family.INET) {
_configuration.getIgnoredPrefixLists().add(name);
}
FwFromPrefixList from = new FwFromPrefixList(name);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_protocol(Fftf_protocolContext ctx) {
IpProtocol protocol = toIpProtocol(ctx.ip_protocol());
FwFrom from = new FwFromProtocol(protocol);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_source_address(Fftf_source_addressContext ctx) {
if (ctx.IP_ADDRESS() != null || ctx.IP_PREFIX() != null) {
Prefix prefix;
if (ctx.IP_PREFIX() != null) {
prefix = new Prefix(ctx.IP_PREFIX().getText());
}
else {
prefix = new Prefix(new Ip(ctx.IP_ADDRESS().getText()),
Prefix.MAX_PREFIX_LENGTH);
}
FwFrom from;
if (ctx.EXCEPT() != null) {
from = new FwFromSourceAddressExcept(prefix);
}
else {
from = new FwFromSourceAddress(prefix);
}
_currentFwTerm.getFroms().add(from);
}
}
@Override
public void exitFftf_source_port(Fftf_source_portContext ctx) {
if (ctx.port() != null) {
int port = getPortNumber(ctx.port());
SubRange subrange = new SubRange(port, port);
FwFrom from = new FwFromSourcePort(subrange);
_currentFwTerm.getFroms().add(from);
}
else if (ctx.range() != null) {
for (SubrangeContext subrangeContext : ctx.range().range_list) {
SubRange subrange = toSubRange(subrangeContext);
FwFrom from = new FwFromSourcePort(subrange);
_currentFwTerm.getFroms().add(from);
}
}
}
@Override
public void exitFftf_source_prefix_list(Fftf_source_prefix_listContext ctx) {
String name = ctx.name.getText();
// temporary
if (_currentFilter.getFamily() != Family.INET) {
_configuration.getIgnoredPrefixLists().add(name);
}
FwFrom from;
if (ctx.EXCEPT() != null) {
from = new FwFromSourcePrefixListExcept(name);
}
else {
from = new FwFromSourcePrefixList(name);
}
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_tcp_established(Fftf_tcp_establishedContext ctx) {
List<TcpFlags> tcpFlags = new ArrayList<>();
TcpFlags alt1 = new TcpFlags();
alt1.setUseAck(true);
alt1.setAck(true);
tcpFlags.add(alt1);
TcpFlags alt2 = new TcpFlags();
alt2.setUseRst(true);
alt2.setRst(true);
tcpFlags.add(alt2);
FwFrom from = new FwFromTcpFlags(tcpFlags);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_tcp_flags(Fftf_tcp_flagsContext ctx) {
List<TcpFlags> tcpFlags = toTcpFlags(ctx.tcp_flags());
FwFrom from = new FwFromTcpFlags(tcpFlags);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftf_tcp_initial(Fftf_tcp_initialContext ctx) {
List<TcpFlags> tcpFlags = new ArrayList<>();
TcpFlags alt1 = new TcpFlags();
alt1.setUseAck(true);
alt1.setAck(false);
alt1.setUseSyn(true);
alt1.setSyn(true);
tcpFlags.add(alt1);
FwFrom from = new FwFromTcpFlags(tcpFlags);
_currentFwTerm.getFroms().add(from);
}
@Override
public void exitFftt_accept(Fftt_acceptContext ctx) {
_currentFwTerm.getThens().add(FwThenAccept.INSTANCE);
}
@Override
public void exitFftt_discard(Fftt_discardContext ctx) {
_currentFwTerm.getThens().add(FwThenDiscard.INSTANCE);
}
@Override
public void exitFftt_next_ip(Fftt_next_ipContext ctx) {
Prefix nextPrefix;
if (ctx.ip != null) {
Ip nextIp = new Ip(ctx.ip.getText());
nextPrefix = new Prefix(nextIp, 32);
}
else {
nextPrefix = new Prefix(ctx.prefix.getText());
}
FwThenNextIp then = new FwThenNextIp(nextPrefix);
_currentFwTerm.getThens().add(then);
_currentFwTerm.getThens().add(FwThenAccept.INSTANCE);
_currentFilter.setRoutingPolicy(true);
}
@Override
public void exitFftt_next_term(Fftt_next_termContext ctx) {
_currentFwTerm.getThens().add(FwThenNextTerm.INSTANCE);
}
@Override
public void exitFftt_nop(Fftt_nopContext ctx) {
_currentFwTerm.getThens().add(FwThenNop.INSTANCE);
}
@Override
public void exitFftt_reject(Fftt_rejectContext ctx) {
_currentFwTerm.getThens().add(FwThenDiscard.INSTANCE);
}
@Override
public void exitFftt_routing_instance(Fftt_routing_instanceContext ctx) {
// TODO: implement
_w.unimplemented(
ConfigurationBuilder.F_FIREWALL_TERM_THEN_ROUTING_INSTANCE);
_currentFwTerm.getThens().add(FwThenDiscard.INSTANCE);
}
@Override
public void exitFlat_juniper_configuration(
Flat_juniper_configurationContext ctx) {
if (_hasZones) {
if (_defaultCrossZoneAction == null) {
_defaultCrossZoneAction = LineAction.REJECT;
}
_configuration.setDefaultCrossZoneAction(_defaultCrossZoneAction);
_configuration.setDefaultInboundAction(LineAction.REJECT);
}
else {
_configuration.setDefaultInboundAction(LineAction.ACCEPT);
}
}
@Override
public void exitI_disable(I_disableContext ctx) {
_currentInterface.setActive(false);
}
@Override
public void exitI_enable(I_enableContext ctx) {
_currentInterface.setActive(true);
}
@Override
public void exitI_mtu(I_mtuContext ctx) {
int size = toInt(ctx.size);
_currentInterface.setMtu(size);
}
@Override
public void exitI_unit(I_unitContext ctx) {
_currentInterface = _currentMasterInterface;
}
@Override
public void exitIfi_address(Ifi_addressContext ctx) {
_currentInterfacePrefix = null;
}
@Override
public void exitIfi_filter(Ifi_filterContext ctx) {
FilterContext filter = ctx.filter();
if (filter.direction() != null) {
String name = filter.name.getText();
int line = filter.name.getStart().getLine();
DirectionContext direction = filter.direction();
if (direction.INPUT() != null) {
_currentInterface.setIncomingFilter(name);
_currentInterface.setIncomingFilterLine(line);
}
else if (direction.OUTPUT() != null) {
_currentInterface.setOutgoingFilter(name);
_currentInterface.setOutgoingFilterLine(line);
}
}
}
@Override
public void exitIfia_preferred(Ifia_preferredContext ctx) {
_currentInterface.setPreferredPrefix(_currentInterfacePrefix);
}
@Override
public void exitIfia_primary(Ifia_primaryContext ctx) {
_currentInterface.setPrimaryPrefix(_currentInterfacePrefix);
}
@Override
public void exitIfia_vrrp_group(Ifia_vrrp_groupContext ctx) {
_currentVrrpGroup = null;
}
@Override
public void exitIfiav_preempt(Ifiav_preemptContext ctx) {
_currentVrrpGroup.setPreempt(true);
}
@Override
public void exitIfiav_priority(Ifiav_priorityContext ctx) {
int priority = toInt(ctx.priority);
_currentVrrpGroup.setPriority(priority);
}
@Override
public void exitIfiav_virtual_address(Ifiav_virtual_addressContext ctx) {
Ip virtualAddress = new Ip(ctx.IP_ADDRESS().getText());
int prefixLength = _currentInterfacePrefix.getPrefixLength();
_currentVrrpGroup
.setVirtualAddress(new Prefix(virtualAddress, prefixLength));
}
@Override
public void exitIfiso_address(Ifiso_addressContext ctx) {
IsoAddress address = new IsoAddress(ctx.ISO_ADDRESS().getText());
_currentInterface.setIsoAddress(address);
}
@Override
public void exitInt_named(Int_namedContext ctx) {
_currentInterface = null;
_currentMasterInterface = null;
}
@Override
public void exitIs_export(Is_exportContext ctx) {
Set<String> policies = new LinkedHashSet<>();
for (VariableContext policy : ctx.policies) {
policies.add(policy.getText());
}
_currentRoutingInstance.getIsisSettings().getExportPolicies()
.addAll(policies);
}
@Override
public void exitIs_interface(Is_interfaceContext ctx) {
_currentIsisInterface = null;
}
@Override
public void exitIs_level(Is_levelContext ctx) {
_currentIsisLevelSettings = null;
}
@Override
public void exitIs_no_ipv4_routing(Is_no_ipv4_routingContext ctx) {
_currentRoutingInstance.getIsisSettings().setNoIpv4Routing(true);
}
@Override
public void exitIsi_level(Isi_levelContext ctx) {
_currentIsisInterfaceLevelSettings = null;
}
@Override
public void exitIsi_passive(Isi_passiveContext ctx) {
_currentIsisInterface.getIsisSettings().setPassive(true);
}
@Override
public void exitIsi_point_to_point(Isi_point_to_pointContext ctx) {
_currentIsisInterface.getIsisSettings().setPointToPoint(true);
}
@Override
public void exitIsil_enable(Isil_enableContext ctx) {
_currentIsisInterfaceLevelSettings.setEnabled(true);
}
@Override
public void exitIsil_metric(Isil_metricContext ctx) {
int metric = toInt(ctx.DEC());
_currentIsisInterfaceLevelSettings.setMetric(metric);
}
@Override
public void exitIsil_te_metric(Isil_te_metricContext ctx) {
int teMetric = toInt(ctx.DEC());
_currentIsisInterfaceLevelSettings.setTeMetric(teMetric);
}
@Override
public void exitIsl_disable(Isl_disableContext ctx) {
_currentIsisLevelSettings.setEnabled(false);
}
@Override
public void exitIsl_wide_metrics_only(Isl_wide_metrics_onlyContext ctx) {
_currentIsisLevelSettings.setWideMetricsOnly(true);
}
@Override
public void exitIst_credibility_protocol_preference(
Ist_credibility_protocol_preferenceContext ctx) {
_currentRoutingInstance.getIsisSettings()
.setTrafficEngineeringCredibilityProtocolPreference(true);
}
@Override
public void exitIst_family_shortcuts(Ist_family_shortcutsContext ctx) {
if (ctx.INET6() != null) {
todo(ctx, F_IPV6);
}
else { // ipv4
_currentRoutingInstance.getIsisSettings()
.setTrafficEngineeringShortcuts(true);
}
}
@Override
public void exitO_area(O_areaContext ctx) {
_currentArea = null;
}
@Override
public void exitO_export(O_exportContext ctx) {
String name = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentRoutingInstance.getOspfExportPolicies().put(name, line);
}
@Override
public void exitOa_interface(Oa_interfaceContext ctx) {
_currentOspfInterface = null;
}
@Override
public void exitP_bgp(P_bgpContext ctx) {
_currentBgpGroup = null;
}
@Override
public void exitPo_community(Po_communityContext ctx) {
_currentCommunityList = null;
}
@Override
public void exitPo_policy_statement(Po_policy_statementContext ctx) {
_currentPolicyStatement = null;
}
public void exitPo_prefix_list(Po_prefix_listContext ctx) {
_currentPrefixList = null;
}
@Override
public void exitPoc_invert_match(Poc_invert_matchContext ctx) {
_currentCommunityList.setInvertMatch(true);
}
@Override
public void exitPoc_members(Poc_membersContext ctx) {
if (ctx.community_regex() != null) {
String text = ctx.community_regex().getText();
_currentCommunityList.getLines().add(new CommunityListLine(text));
if (text.matches("[0-9]+:[0-9]+")) {
long communityVal = CommonUtil.communityStringToLong(text);
_configuration.getAllStandardCommunities().add(communityVal);
}
}
else if (ctx.extended_community_regex() != null) {
String text = ctx.extended_community_regex().getText();
_currentCommunityList.getLines().add(new CommunityListLine(text));
}
else if (ctx.standard_community() != null) {
long communityVal = toCommunityLong(ctx.standard_community());
_configuration.getAllStandardCommunities().add(communityVal);
String communityStr = org.batfish.common.util.CommonUtil
.longToCommunity(communityVal);
_currentCommunityList.getLines()
.add(new CommunityListLine(communityStr));
}
else if (ctx.extended_community() != null) {
long communityVal = toCommunityLong(ctx.extended_community());
String communityStr = org.batfish.common.util.CommonUtil
.longToCommunity(communityVal);
_currentCommunityList.getLines()
.add(new CommunityListLine(communityStr));
}
else if (ctx.invalid_community_regex() != null) {
String text = ctx.invalid_community_regex().getText();
_currentCommunityList.getLines().add(new CommunityListLine(text));
_w.redFlag(ctx.getStart().getLine() + ": In community-list '"
+ _currentCommunityList.getName()
+ "': Invalid or unsupported community regex: '" + text + "'");
}
}
@Override
public void exitPoplt_ip6(Poplt_ip6Context ctx) {
_currentPrefixList.setIpv6(true);
todo(ctx, F_IPV6);
}
@Override
public void exitPoplt_network(Poplt_networkContext ctx) {
Prefix prefix = new Prefix(ctx.network.getText());
_currentPrefixList.getPrefixes().add(prefix);
}
@Override
public void exitPoplt_network6(Poplt_network6Context ctx) {
_currentPrefixList.setIpv6(true);
todo(ctx, F_IPV6);
}
@Override
public void exitPops_common(Pops_commonContext ctx) {
_currentPsTerm = null;
_currentPsThens = null;
}
@Override
public void exitPopsf_as_path(Popsf_as_pathContext ctx) {
String name = ctx.name.getText();
PsFromAsPath fromAsPath = new PsFromAsPath(name);
_currentPsTerm.getFroms().add(fromAsPath);
}
@Override
public void exitPopsf_color(Popsf_colorContext ctx) {
int color = toInt(ctx.color);
PsFromColor fromColor = new PsFromColor(color);
_currentPsTerm.getFroms().add(fromColor);
}
@Override
public void exitPopsf_community(Popsf_communityContext ctx) {
String name = ctx.name.getText();
PsFromCommunity fromCommunity = new PsFromCommunity(name);
_currentPsTerm.getFroms().add(fromCommunity);
}
@Override
public void exitPopsf_family(Popsf_familyContext ctx) {
PsFrom from;
if (ctx.INET() != null) {
from = new PsFromFamilyInet();
}
else if (ctx.INET6() != null) {
from = new PsFromFamilyInet6();
}
else {
throw new BatfishException("Unsupported family: " + ctx.getText());
}
_currentPsTerm.getFroms().add(from);
}
@Override
public void exitPopsf_interface(Popsf_interfaceContext ctx) {
String name = ctx.id.name.getText();
int definitionLine = ctx.id.name.getLine();
String unit = null;
if (ctx.id.unit != null) {
unit = ctx.id.unit.getText();
definitionLine = ctx.id.unit.getLine();
}
String unitFullName = name + "." + unit;
Map<String, Interface> interfaces = _configuration.getInterfaces();
Interface iface = interfaces.get(name);
if (iface == null) {
iface = new Interface(name, definitionLine);
iface.setRoutingInstance(_currentRoutingInstance.getName());
interfaces.put(name, iface);
}
PsFrom from;
if (unit != null) {
Map<String, Interface> units = iface.getUnits();
iface = units.get(unitFullName);
if (iface == null) {
iface = new Interface(unitFullName, definitionLine);
iface.setRoutingInstance(_currentRoutingInstance.getName());
units.put(unitFullName, iface);
}
from = new PsFromInterface(unitFullName);
}
else {
from = new PsFromInterface(name);
}
_currentPsTerm.getFroms().add(from);
}
@Override
public void exitPopsf_local_preference(Popsf_local_preferenceContext ctx) {
int localPreference = toInt(ctx.localpref);
PsFromLocalPreference fromLocalPreference = new PsFromLocalPreference(
localPreference);
_currentPsTerm.getFroms().add(fromLocalPreference);
}
@Override
public void exitPopsf_metric(Popsf_metricContext ctx) {
int metric = toInt(ctx.metric);
PsFromMetric fromMetric = new PsFromMetric(metric);
_currentPsTerm.getFroms().add(fromMetric);
}
@Override
public void exitPopsf_policy(Popsf_policyContext ctx) {
String policyName = toComplexPolicyStatement(ctx.policy_expression());
PsFrom from = new PsFromPolicyStatement(policyName);
_currentPsTerm.getFroms().add(from);
}
@Override
public void exitPopsf_prefix_list(Popsf_prefix_listContext ctx) {
String name = ctx.name.getText();
PsFrom from = new PsFromPrefixList(name);
_currentPsTerm.getFroms().add(from);
}
@Override
public void exitPopsf_prefix_list_filter(
Popsf_prefix_list_filterContext ctx) {
String name = ctx.name.getText();
PsFrom from;
if (ctx.popsfpl_exact() != null) {
from = new PsFromPrefixList(name);
}
else if (ctx.popsfpl_longer() != null) {
from = new PsFromPrefixListFilterLonger(name);
}
else if (ctx.popsfpl_orlonger() != null) {
from = new PsFromPrefixListFilterOrLonger(name);
}
else {
throw new BatfishException(
"Invalid prefix-list-filter length specification");
}
_currentPsTerm.getFroms().add(from);
}
@Override
public void exitPopsf_protocol(Popsf_protocolContext ctx) {
RoutingProtocol protocol = toRoutingProtocol(ctx.protocol);
PsFromProtocol fromProtocol = new PsFromProtocol(protocol);
_currentPsTerm.getFroms().add(fromProtocol);
}
@Override
public void exitPopsf_route_filter(Popsf_route_filterContext ctx) {
_currentRouteFilterPrefix = null;
_currentRoute6FilterPrefix = null;
_currentRouteFilter = null;
_currentRouteFilterLine = null;
_currentRoute6FilterLine = null;
}
@Override
public void exitPopsfrf_then(Popsfrf_thenContext ctx) {
_currentPsThens = _currentPsTerm.getThens();
}
@Override
public void exitPopst_accept(Popst_acceptContext ctx) {
_currentPsThens.add(PsThenAccept.INSTANCE);
}
@Override
public void exitPopst_community_add(Popst_community_addContext ctx) {
String name = ctx.name.getText();
PsThenCommunityAdd then = new PsThenCommunityAdd(name, _configuration);
_currentPsThens.add(then);
}
@Override
public void exitPopst_community_delete(Popst_community_deleteContext ctx) {
String name = ctx.name.getText();
PsThenCommunityDelete then = new PsThenCommunityDelete(name,
_configuration);
_currentPsThens.add(then);
}
@Override
public void exitPopst_community_set(Popst_community_setContext ctx) {
String name = ctx.name.getText();
PsThenCommunitySet then = new PsThenCommunitySet(name, _configuration);
_currentPsThens.add(then);
}
@Override
public void exitPopst_local_preference(Popst_local_preferenceContext ctx) {
int localPreference = toInt(ctx.localpref);
PsThenLocalPreference then = new PsThenLocalPreference(localPreference);
_currentPsThens.add(then);
}
@Override
public void exitPopst_metric(Popst_metricContext ctx) {
int metric = toInt(ctx.metric);
PsThenMetric then = new PsThenMetric(metric);
_currentPsThens.add(then);
}
@Override
public void exitPopst_next_hop(Popst_next_hopContext ctx) {
PsThen then;
if (ctx.IP_ADDRESS() != null) {
Ip nextHopIp = new Ip(ctx.IP_ADDRESS().getText());
then = new PsThenNextHopIp(nextHopIp);
}
else {
todo(ctx, F_POLICY_TERM_THEN_NEXT_HOP);
return;
}
_currentPsThens.add(then);
}
@Override
public void exitPopst_next_policy(Popst_next_policyContext ctx) {
_currentPsThens.add(PsThenNextPolicy.INSTANCE);
}
@Override
public void exitPopst_reject(Popst_rejectContext ctx) {
_currentPsThens.add(PsThenReject.INSTANCE);
}
@Override
public void exitRi_interface(Ri_interfaceContext ctx) {
Interface iface = initInterface(ctx.id);
iface.setRoutingInstance(_currentRoutingInstance.getName());
}
@Override
public void exitRi_named_routing_instance(
Ri_named_routing_instanceContext ctx) {
_currentRoutingInstance = _configuration.getDefaultRoutingInstance();
}
@Override
public void exitRo_aggregate(Ro_aggregateContext ctx) {
_currentAggregateRoute = null;
}
@Override
public void exitRo_autonomous_system(Ro_autonomous_systemContext ctx) {
if (ctx.as != null) {
int as = toInt(ctx.as);
_currentRoutingInstance.setAs(as);
}
}
@Override
public void exitRo_generate(Ro_generateContext ctx) {
_currentGeneratedRoute = null;
}
@Override
public void exitRo_router_id(Ro_router_idContext ctx) {
Ip id = new Ip(ctx.id.getText());
_currentRoutingInstance.setRouterId(id);
}
@Override
public void exitRo_static(Ro_staticContext ctx) {
_currentStaticRoute = null;
}
@Override
public void exitRoa_community(Roa_communityContext ctx) {
long community = CommonUtil
.communityStringToLong(ctx.COMMUNITY_LITERAL().getText());
_configuration.getAllStandardCommunities().add(community);
_currentAggregateRoute.getCommunities().add(community);
}
@Override
public void exitRoa_preference(Roa_preferenceContext ctx) {
int preference = toInt(ctx.preference);
_currentAggregateRoute.setPreference(preference);
}
@Override
public void exitRoa_tag(Roa_tagContext ctx) {
int tag = toInt(ctx.tag);
_currentAggregateRoute.setTag(tag);
}
@Override
public void exitRoaa_path(Roaa_pathContext ctx) {
AsPath asPath = toAsPath(ctx.path);
_currentAggregateRoute.setAsPath(asPath);
}
@Override
public void exitRof_export(Rof_exportContext ctx) {
String name = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_configuration.getDefaultRoutingInstance()
.setForwardingTableExportPolicy(name);
_configuration.getDefaultRoutingInstance()
.setForwardingTableExportPolicyLine(line);
}
@Override
public void exitRog_metric(Rog_metricContext ctx) {
int metric = toInt(ctx.metric);
_currentGeneratedRoute.setMetric(metric);
}
@Override
public void exitRog_policy(Rog_policyContext ctx) {
if (_currentGeneratedRoute != null) { // not ipv6
String policy = ctx.policy.getText();
int line = ctx.policy.getStart().getLine();
_currentGeneratedRoute.getPolicies().put(policy, line);
}
}
@Override
public void exitRosr_discard(Rosr_discardContext ctx) {
_currentStaticRoute.setDrop(true);
}
@Override
public void exitRosr_metric(Rosr_metricContext ctx) {
int metric = toInt(ctx.metric);
_currentStaticRoute.setMetric(metric);
}
@Override
public void exitRosr_next_hop(Rosr_next_hopContext ctx) {
if (ctx.IP_ADDRESS() != null) {
Ip nextHopIp = new Ip(ctx.IP_ADDRESS().getText());
_currentStaticRoute.setNextHopIp(nextHopIp);
}
else if (ctx.interface_id() != null) {
initInterface(ctx.interface_id());
_currentStaticRoute.setNextHopInterface(ctx.interface_id().getText());
}
}
@Override
public void exitRosr_reject(Rosr_rejectContext ctx) {
_currentStaticRoute.setDrop(true);
}
@Override
public void exitRosr_tag(Rosr_tagContext ctx) {
int tag = toInt(ctx.tag);
_currentStaticRoute.setTag(tag);
}
@Override
public void exitS_firewall(S_firewallContext ctx) {
_currentFirewallFamily = null;
}
@Override
public void exitS_routing_options(S_routing_optionsContext ctx) {
_currentRib = null;
}
@Override
public void exitS_snmp(S_snmpContext ctx) {
_currentSnmpServer = null;
}
@Override
public void exitSe_zones(Se_zonesContext ctx) {
_hasZones = true;
}
@Override
public void exitSeik_gateway(Seik_gatewayContext ctx) {
_currentIkeGateway = null;
}
@Override
public void exitSeik_policy(Seik_policyContext ctx) {
_currentIkePolicy = null;
}
@Override
public void exitSeik_proposal(Seik_proposalContext ctx) {
_currentIkeProposal = null;
}
@Override
public void exitSeikg_address(Seikg_addressContext ctx) {
Ip ip = new Ip(ctx.IP_ADDRESS().getText());
_currentIkeGateway.setAddress(ip);
}
@Override
public void exitSeikg_external_interface(
Seikg_external_interfaceContext ctx) {
Interface_idContext interfaceId = ctx.interface_id();
int line = ctx.interface_id().getStart().getLine();
Interface iface = initInterface(interfaceId);
_currentIkeGateway.setExternalInterface(iface);
_currentIkeGateway.setExternalInterfaceLine(line);
}
@Override
public void exitSeikg_ike_policy(Seikg_ike_policyContext ctx) {
String name = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentIkeGateway.setIkePolicy(name);
_currentIkeGateway.setIkePolicyLine(line);
}
@Override
public void exitSeikg_local_address(Seikg_local_addressContext ctx) {
Ip ip = new Ip(ctx.IP_ADDRESS().getText());
_currentIkeGateway.setLocalAddress(ip);
}
@Override
public void exitSeikp_pre_shared_key(Seikp_pre_shared_keyContext ctx) {
String key = unquote(ctx.key.getText());
String decodedKeyHash = JuniperUtils
.decryptAndHashJuniper9CipherText(key);
_currentIkePolicy.setPreSharedKeyHash(decodedKeyHash);
}
@Override
public void exitSeikp_proposal_set(Seikp_proposal_setContext ctx) {
Set<String> proposalsInSet = initIkeProposalSet(ctx.proposal_set_type());
for (String proposal : proposalsInSet) {
_currentIkePolicy.getProposals().put(proposal, -1);
}
}
@Override
public void exitSeikp_proposals(Seikp_proposalsContext ctx) {
String proposal = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentIkePolicy.getProposals().put(proposal, line);
}
@Override
public void exitSeikpr_authentication_algorithm(
Seikpr_authentication_algorithmContext ctx) {
IkeAuthenticationAlgorithm alg = toIkeAuthenticationAlgorithm(
ctx.ike_authentication_algorithm());
_currentIkeProposal.setAuthenticationAlgorithm(alg);
}
@Override
public void exitSeikpr_authentication_method(
Seikpr_authentication_methodContext ctx) {
IkeAuthenticationMethod authenticationMethod = toIkeAuthenticationMethod(
ctx.ike_authentication_method());
_currentIkeProposal.setAuthenticationMethod(authenticationMethod);
}
@Override
public void exitSeikpr_dh_group(Seikpr_dh_groupContext ctx) {
DiffieHellmanGroup group = toDhGroup(ctx.dh_group());
_currentIkeProposal.setDiffieHellmanGroup(group);
}
@Override
public void exitSeikpr_encryption_algorithm(
Seikpr_encryption_algorithmContext ctx) {
EncryptionAlgorithm alg = toEncryptionAlgorithm(
ctx.encryption_algorithm());
_currentIkeProposal.setEncryptionAlgorithm(alg);
}
@Override
public void exitSeikpr_lifetime_seconds(Seikpr_lifetime_secondsContext ctx) {
int lifetimeSeconds = toInt(ctx.seconds);
_currentIkeProposal.setLifetimeSeconds(lifetimeSeconds);
}
@Override
public void exitSeip_policy(Seip_policyContext ctx) {
_currentIpsecPolicy = null;
}
@Override
public void exitSeip_proposal(Seip_proposalContext ctx) {
_currentIpsecProposal = null;
}
@Override
public void exitSeip_vpn(Seip_vpnContext ctx) {
_currentIpsecVpn = null;
}
@Override
public void exitSeipp_perfect_forward_secrecy(
Seipp_perfect_forward_secrecyContext ctx) {
DiffieHellmanGroup dhGroup = toDhGroup(ctx.dh_group());
_currentIpsecPolicy.setPfsKeyGroup(dhGroup);
}
@Override
public void exitSeipp_proposal_set(Seipp_proposal_setContext ctx) {
Set<String> proposalsInSet = initIpsecProposalSet(
ctx.proposal_set_type());
for (String proposal : proposalsInSet) {
_currentIpsecPolicy.getProposals().put(proposal, -1);
}
}
@Override
public void exitSeipp_proposals(Seipp_proposalsContext ctx) {
String name = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentIpsecPolicy.getProposals().put(name, line);
}
@Override
public void exitSeippr_authentication_algorithm(
Seippr_authentication_algorithmContext ctx) {
IpsecAuthenticationAlgorithm alg = toIpsecAuthenticationAlgorithm(
ctx.ipsec_authentication_algorithm());
_currentIpsecProposal.setAuthenticationAlgorithm(alg);
}
@Override
public void exitSeippr_encryption_algorithm(
Seippr_encryption_algorithmContext ctx) {
EncryptionAlgorithm alg = toEncryptionAlgorithm(
ctx.encryption_algorithm());
_currentIpsecProposal.setEncryptionAlgorithm(alg);
}
@Override
public void exitSeippr_lifetime_kilobytes(
Seippr_lifetime_kilobytesContext ctx) {
int lifetimeKilobytes = toInt(ctx.kilobytes);
_currentIpsecProposal.setLifetimeKilobytes(lifetimeKilobytes);
}
@Override
public void exitSeippr_lifetime_seconds(Seippr_lifetime_secondsContext ctx) {
int lifetimeSeconds = toInt(ctx.seconds);
_currentIpsecProposal.setLifetimeSeconds(lifetimeSeconds);
}
@Override
public void exitSeippr_protocol(Seippr_protocolContext ctx) {
IpsecProtocol protocol = toIpsecProtocol(ctx.ipsec_protocol());
_currentIpsecProposal.setProtocol(protocol);
}
@Override
public void exitSeipv_bind_interface(Seipv_bind_interfaceContext ctx) {
Interface iface = initInterface(ctx.interface_id());
int line = ctx.interface_id().getStart().getLine();
_currentIpsecVpn.setBindInterface(iface);
_currentIpsecVpn.setBindInterfaceLine(line);
}
@Override
public void exitSeipvi_gateway(Seipvi_gatewayContext ctx) {
String name = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentIpsecVpn.setGateway(name);
_currentIpsecVpn.setGatewayLine(line);
}
@Override
public void exitSeipvi_ipsec_policy(Seipvi_ipsec_policyContext ctx) {
String name = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentIpsecVpn.setIpsecPolicy(name);
_currentIpsecVpn.setIpsecPolicyLine(line);
}
@Override
public void exitSep_default_policy(Sep_default_policyContext ctx) {
if (ctx.PERMIT_ALL() != null) {
_defaultCrossZoneAction = LineAction.ACCEPT;
}
else if (ctx.DENY_ALL() != null) {
_defaultCrossZoneAction = LineAction.REJECT;
}
}
@Override
public void exitSep_from_zone(Sep_from_zoneContext ctx) {
_currentFilter = null;
}
@Override
public void exitSepf_policy(Sepf_policyContext ctx) {
_currentFwTerm = null;
}
@Override
public void exitSepfpm_application(Sepfpm_applicationContext ctx) {
if (ctx.ANY() != null) {
return;
}
else if (ctx.junos_application() != null) {
Application application = toApplication(ctx.junos_application());
if (application.getIpv6()) {
_currentFwTerm.setIpv6(true);
}
else {
FwFromApplication from = new FwFromApplication(application);
_currentFwTerm.getFromApplications().add(from);
}
}
else {
String name = ctx.name.getText();
FwFromApplication from = new FwFromApplication(name,
_configuration.getApplications());
_currentFwTerm.getFromApplications().add(from);
}
}
@Override
public void exitSepfpm_destination_address(
Sepfpm_destination_addressContext ctx) {
if (ctx.address_specifier().ANY() != null) {
return;
}
else if (ctx.address_specifier().ANY_IPV4() != null) {
return;
}
else if (ctx.address_specifier().ANY_IPV6() != null) {
_currentFwTerm.setIpv6(true);
return;
}
else if (ctx.address_specifier().variable() != null) {
String addressBookEntryName = ctx.address_specifier().variable()
.getText();
FwFrom match = new FwFromDestinationAddressBookEntry(
_currentToZone.getAddressBook(), addressBookEntryName);
_currentFwTerm.getFroms().add(match);
}
else {
throw new BatfishException("Invalid address-specifier");
}
}
@Override
public void exitSepfpm_source_address(Sepfpm_source_addressContext ctx) {
if (ctx.address_specifier().ANY() != null) {
return;
}
else if (ctx.address_specifier().ANY_IPV4() != null) {
return;
}
else if (ctx.address_specifier().ANY_IPV6() != null) {
_currentFwTerm.setIpv6(true);
return;
}
else if (ctx.address_specifier().variable() != null) {
String addressBookEntryName = ctx.address_specifier().variable()
.getText();
FwFrom match = new FwFromSourceAddressBookEntry(
_currentFromZone.getAddressBook(), addressBookEntryName);
_currentFwTerm.getFroms().add(match);
}
else {
throw new BatfishException("Invalid address-specifier");
}
}
@Override
public void exitSepfpm_source_identity(Sepfpm_source_identityContext ctx) {
if (ctx.ANY() != null) {
return;
}
else {
throw new UnsupportedOperationException(
"no implementation for generated method"); // TODO Auto-generated
// method stub
}
}
@Override
public void exitSepfpt_deny(Sepfpt_denyContext ctx) {
_currentFwTerm.getThens().add(FwThenDiscard.INSTANCE);
}
@Override
public void exitSepfpt_permit(Sepfpt_permitContext ctx) {
if (ctx.sepfptp_tunnel() != null) {
// Used for dynamic VPNs (no bind interface tied to a zone)
// TODO: change from deny to appropriate action when implemented
todo(ctx, F_PERMIT_TUNNEL);
_currentFwTerm.getThens().add(FwThenDiscard.INSTANCE);
}
else {
_currentFwTerm.getThens().add(FwThenAccept.INSTANCE);
}
}
@Override
public void exitSez_security_zone(Sez_security_zoneContext ctx) {
_currentZone = null;
_currentZoneInboundFilter = null;
}
@Override
public void exitSezs_address_book(Sezs_address_bookContext ctx) {
_currentAddressBook = null;
}
@Override
public void exitSezs_interfaces(Sezs_interfacesContext ctx) {
_currentZoneInterface = null;
}
@Override
public void exitSezsa_address(Sezsa_addressContext ctx) {
String name = ctx.name.getText();
Prefix prefix = new Prefix(ctx.IP_PREFIX().getText());
AddressBookEntry addressEntry = new AddressAddressBookEntry(name, prefix);
_currentZone.getAddressBook().getEntries().put(name, addressEntry);
}
@Override
public void exitSezsa_address_set(Sezsa_address_setContext ctx) {
_currentAddressSetAddressBookEntry = null;
}
@Override
public void exitSezsaa_address(Sezsaa_addressContext ctx) {
String name = ctx.name.getText();
_currentAddressSetAddressBookEntry.getEntries()
.add(new AddressSetEntry(name, _currentAddressBook));
}
@Override
public void exitSezsaa_address_set(Sezsaa_address_setContext ctx) {
String name = ctx.name.getText();
_currentAddressSetAddressBookEntry.getEntries()
.add(new AddressSetEntry(name, _currentAddressBook));
}
@Override
public void exitSezsh_protocols(Sezsh_protocolsContext ctx) {
HostProtocol protocol = toHostProtocol(ctx.hib_protocol());
String termName = protocol.name();
FwTerm newTerm = new FwTerm(termName);
_currentZoneInboundFilter.getTerms().put(termName, newTerm);
newTerm.getFromHostProtocols().add(new FwFromHostProtocol(protocol));
newTerm.getThens().add(FwThenAccept.INSTANCE);
}
@Override
public void exitSezsh_system_services(Sezsh_system_servicesContext ctx) {
HostSystemService service = toHostSystemService(ctx.hib_system_service());
String termName = service.name();
FwTerm newTerm = new FwTerm(termName);
_currentZoneInboundFilter.getTerms().put(termName, newTerm);
newTerm.getFromHostServices().add(new FwFromHostService(service));
newTerm.getThens().add(FwThenAccept.INSTANCE);
}
@Override
public void exitSnmp_community(Snmp_communityContext ctx) {
_currentSnmpCommunity = null;
}
@Override
public void exitSnmpc_authorization(Snmpc_authorizationContext ctx) {
if (ctx.READ_ONLY() != null) {
_currentSnmpCommunity.setRo(true);
}
else if (ctx.READ_WRITE() != null) {
_currentSnmpCommunity.setRw(true);
}
else {
throw new BatfishException("Invalid authorization");
}
}
@Override
public void exitSnmpc_client_list_name(Snmpc_client_list_nameContext ctx) {
String list = ctx.name.getText();
int line = ctx.name.getStart().getLine();
_currentSnmpCommunity.setAccessList(list);
_currentSnmpCommunity.setAccessListLine(line);
// TODO: verify whether both ipv4 and ipv6 list should be set with this
// command
_currentSnmpCommunity.setAccessList6(list);
_currentSnmpCommunity.setAccessList6Line(line);
}
@Override
public void exitSnmptg_targets(Snmptg_targetsContext ctx) {
Ip ip = new Ip(ctx.target.getText());
String name = ip.toString();
SnmpHost host = _currentSnmpServer.getHosts().get(name);
if (host == null) {
host = new SnmpHost(ip.toString());
_currentSnmpServer.getHosts().put(name, host);
}
}
@Override
public void exitSy_default_address_selection(
Sy_default_address_selectionContext ctx) {
_configuration.setDefaultAddressSelection(true);
}
@Override
public void exitSy_domain_name(Sy_domain_nameContext ctx) {
String domainName = ctx.variable().getText();
_currentRoutingInstance.setDomainName(domainName);
}
@Override
public void exitSy_host_name(Sy_host_nameContext ctx) {
String hostname = ctx.variable().getText();
_currentRoutingInstance.setHostname(hostname);
}
@Override
public void exitSy_name_server(Sy_name_serverContext ctx) {
Set<String> dnsServers = _configuration.getDnsServers();
String hostname = ctx.hostname.getText();
dnsServers.add(hostname);
}
public JuniperConfiguration getConfiguration() {
return _configuration;
}
private String getInterfaceName(Interface_idContext ctx) {
String name = ctx.name.getText();
if (ctx.suffix != null) {
name += ":" + ctx.suffix.getText();
}
return name;
}
private String initIkeProposal(IkeProposal proposal) {
String name = proposal.getName();
_configuration.getIkeProposals().put(name, proposal);
return name;
}
private Set<String> initIkeProposalSet(Proposal_set_typeContext ctx) {
Set<String> proposals = new HashSet<>();
if (ctx.BASIC() != null) {
proposals.add(initIkeProposal(IkeProposal.PSK_DES_DH1_SHA1));
proposals.add(initIkeProposal(IkeProposal.PSK_DES_DH1_MD5));
}
else if (ctx.COMPATIBLE() != null) {
proposals.add(initIkeProposal(IkeProposal.PSK_3DES_DH2_MD5));
proposals.add(initIkeProposal(IkeProposal.PSK_DES_DH2_SHA1));
proposals.add(initIkeProposal(IkeProposal.PSK_DES_DH2_MD5));
}
else if (ctx.STANDARD() != null) {
proposals.add(initIkeProposal(IkeProposal.PSK_3DES_DH2_SHA1));
proposals.add(initIkeProposal(IkeProposal.PSK_AES128_DH2_SHA1));
}
return proposals;
}
private Interface initInterface(Interface_idContext id) {
String currentRoutingInstance = _currentRoutingInstance.getName();
Map<String, Interface> interfaces;
if (id.node != null) {
String nodeDeviceName = id.node.getText();
NodeDevice nodeDevice = _configuration.getNodeDevices()
.get(nodeDeviceName);
if (nodeDevice == null) {
nodeDevice = new NodeDevice(nodeDeviceName);
_configuration.getNodeDevices().put(nodeDeviceName, nodeDevice);
}
interfaces = nodeDevice.getInterfaces();
}
else {
interfaces = _configuration.getInterfaces();
}
String name = id.name.getText();
int definitionLine = id.name.getLine();
String unit = null;
if (id.unit != null) {
unit = id.unit.getText();
definitionLine = id.unit.getLine();
}
String unitFullName = name + "." + unit;
Interface iface = interfaces.get(name);
if (iface == null) {
iface = new Interface(name, definitionLine);
iface.setRoutingInstance(currentRoutingInstance);
interfaces.put(name, iface);
}
if (unit != null) {
Map<String, Interface> units = iface.getUnits();
iface = units.get(unitFullName);
if (iface == null) {
iface = new Interface(unitFullName, definitionLine);
iface.setRoutingInstance(currentRoutingInstance);
units.put(unitFullName, iface);
}
}
return iface;
}
private String initIpsecProposal(IpsecProposal proposal) {
String name = proposal.getName();
_configuration.getIpsecProposals().put(name, proposal);
return name;
}
private Set<String> initIpsecProposalSet(Proposal_set_typeContext ctx) {
Set<String> proposals = new HashSet<>();
if (ctx.BASIC() != null) {
proposals.add(initIpsecProposal(IpsecProposal.NOPFS_ESP_DES_SHA));
proposals.add(initIpsecProposal(IpsecProposal.NOPFS_ESP_DES_MD5));
}
else if (ctx.COMPATIBLE() != null) {
proposals.add(initIpsecProposal(IpsecProposal.NOPFS_ESP_3DES_SHA));
proposals.add(initIpsecProposal(IpsecProposal.NOPFS_ESP_3DES_MD5));
proposals.add(initIpsecProposal(IpsecProposal.NOPFS_ESP_DES_SHA));
proposals.add(initIpsecProposal(IpsecProposal.NOPFS_ESP_DES_MD5));
}
else if (ctx.STANDARD() != null) {
proposals.add(initIpsecProposal(IpsecProposal.G2_ESP_3DES_SHA));
proposals.add(initIpsecProposal(IpsecProposal.G2_ESP_AES128_SHA));
}
return proposals;
}
private AsPath toAsPath(As_path_exprContext path) {
AsPath asPath = new AsPath();
for (As_unitContext ctx : path.items) {
AsSet asSet = new AsSet();
if (ctx.DEC() != null) {
asSet.add(toInt(ctx.DEC()));
}
else {
for (Token token : ctx.as_set().items) {
asSet.add(toInt(token));
}
}
asPath.add(asSet);
}
return asPath;
}
private long toCommunityLong(Ec_literalContext ctx) {
String[] parts = ctx.getText().split(":");
int part1 = Integer.parseInt(parts[0]);
long part2 = Long.parseLong(parts[1]);
int part3 = Integer.parseInt(parts[2]);
ExtendedCommunity c = new ExtendedCommunity(part1, part2, part3);
return c.asLong();
}
private long toCommunityLong(Ec_namedContext ctx) {
ExtendedCommunity ec = new ExtendedCommunity(ctx.getText());
return ec.asLong();
}
private long toCommunityLong(Extended_communityContext ctx) {
if (ctx.ec_literal() != null) {
return toCommunityLong(ctx.ec_literal());
}
else if (ctx.ec_named() != null) {
return toCommunityLong(ctx.ec_named());
}
else {
throw new BatfishException("invalid extended community");
}
}
private String toComplexPolicyStatement(Policy_expressionContext expr) {
if (expr.pe_nested() != null) {
return toComplexPolicyStatement(expr.pe_nested().policy_expression());
}
else if (expr.variable() != null) {
String name = expr.variable().getText();
return name;
}
else if (expr.pe_conjunction() != null) {
Set<String> conjuncts = new LinkedHashSet<>();
for (Policy_expressionContext conjunctCtx : expr.pe_conjunction()
.policy_expression()) {
String conjunctName = toComplexPolicyStatement(conjunctCtx);
conjuncts.add(conjunctName);
}
String conjunctionPolicyName = "~CONJUNCTION_POLICY_"
+ _conjunctionPolicyIndex + "~";
_conjunctionPolicyIndex++;
PolicyStatement conjunctionPolicy = new PolicyStatement(
conjunctionPolicyName, -1);
PsTerm conjunctionPolicyTerm = conjunctionPolicy.getDefaultTerm();
PsFromPolicyStatementConjunction from = new PsFromPolicyStatementConjunction(
conjuncts);
conjunctionPolicyTerm.getFroms().add(from);
conjunctionPolicyTerm.getThens().add(PsThenAccept.INSTANCE);
_configuration.getPolicyStatements().put(conjunctionPolicyName,
conjunctionPolicy);
return conjunctionPolicyName;
}
else if (expr.pe_disjunction() != null) {
Set<String> disjuncts = new LinkedHashSet<>();
for (Policy_expressionContext disjunctCtx : expr.pe_disjunction()
.policy_expression()) {
String disjunctName = toComplexPolicyStatement(disjunctCtx);
disjuncts.add(disjunctName);
}
String disjunctionPolicyName = "~DISJUNCTION_POLICY_"
+ _disjunctionPolicyIndex + "~";
_disjunctionPolicyIndex++;
PolicyStatement disjunctionPolicy = new PolicyStatement(
disjunctionPolicyName, -1);
PsTerm disjunctionPolicyTerm = disjunctionPolicy.getDefaultTerm();
for (String disjunct : disjuncts) {
PsFromPolicyStatement from = new PsFromPolicyStatement(disjunct);
disjunctionPolicyTerm.getFroms().add(from);
}
disjunctionPolicyTerm.getThens().add(PsThenAccept.INSTANCE);
_configuration.getPolicyStatements().put(disjunctionPolicyName,
disjunctionPolicy);
return disjunctionPolicyName;
}
else {
throw new BatfishException("Invalid policy expression");
}
}
private DiffieHellmanGroup toDhGroup(Dh_groupContext ctx) {
if (ctx.GROUP1() != null) {
return DiffieHellmanGroup.GROUP1;
}
else if (ctx.GROUP14() != null) {
return DiffieHellmanGroup.GROUP14;
}
else if (ctx.GROUP2() != null) {
return DiffieHellmanGroup.GROUP2;
}
else if (ctx.GROUP5() != null) {
return DiffieHellmanGroup.GROUP5;
}
else {
throw new BatfishException("invalid dh-group");
}
}
private void todo(ParserRuleContext ctx, String feature) {
_w.todo(ctx, feature, _parser, _text);
_unimplementedFeatures.add("Juniper: " + feature);
}
}