|
42 | 42 |
|
43 | 43 | def is_table_available(name): |
44 | 44 | try: |
| 45 | + if name in Table.existing_table_names: |
| 46 | + return Table.existing_table_names[name] |
45 | 47 | Table(name) |
| 48 | + Table.existing_table_names[name] = True |
46 | 49 | return True |
47 | 50 | except IPTCError: |
48 | 51 | pass |
| 52 | + Table.existing_table_names[name] = False |
49 | 53 | return False |
50 | 54 |
|
51 | 55 |
|
@@ -669,6 +673,11 @@ class Target(IPTCModule): |
669 | 673 | does not take any value in the iptables extension, an empty string i.e. "" |
670 | 674 | should be used. |
671 | 675 | """ |
| 676 | + |
| 677 | + STANDARD_TARGETS = ["", "ACCEPT", "DROP", "REJECT", "RETURN", "REDIRECT", "SNAT", "DNAT", \ |
| 678 | + "MASQUERADE", "MIRROR", "TOS", "MARK", "QUEUE", "LOG"] |
| 679 | + """This is the constant for all standard targets.""" |
| 680 | + |
672 | 681 | def __init__(self, rule, name=None, target=None, revision=None, goto=None): |
673 | 682 | """ |
674 | 683 | *rule* is the Rule object this match belongs to; it can be changed |
@@ -784,6 +793,8 @@ def _create_buffer(self, target): |
784 | 793 | self.reset() |
785 | 794 |
|
786 | 795 | def _is_standard_target(self): |
| 796 | + if self._name in Target.STANDARD_TARGETS: |
| 797 | + return False |
787 | 798 | for t in self._rule.tables: |
788 | 799 | if t.is_chain(self._name): |
789 | 800 | return True |
@@ -1572,6 +1583,8 @@ class Table(object): |
1572 | 1583 | """This is the constant for all tables.""" |
1573 | 1584 |
|
1574 | 1585 | _cache = dict() |
| 1586 | + existing_table_names = dict() |
| 1587 | + """Dictionary to check faster if a table is available.""" |
1575 | 1588 |
|
1576 | 1589 | def __new__(cls, name, autocommit=None): |
1577 | 1590 | obj = Table._cache.get(name, None) |
|
0 commit comments