firewall: add add_rule command
Showing
| # | ||
| # CIRCLE is free software: you can redistribute it and/or modify it under | ||
| # the terms of the GNU General Public License as published by the Free | ||
| # Software Foundation, either version 3 of the License, or (at your option) | ||
| # any later version. | ||
| # | ||
| # CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY | ||
| # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||
| # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | ||
| # details. | ||
| # | ||
| # You should have received a copy of the GNU General Public License along | ||
| # with CIRCLE. If not, see <http://www.gnu.org/licenses/>. | ||
| from __future__ import unicode_literals, absolute_import | ||
| from django.core.management.base import BaseCommand, CommandError | ||
| from firewall.models import Vlan, VlanGroup, Rule | ||
| from django.contrib.auth.models import User | ||
| class Command(BaseCommand): | ||
| def add_arguments(self, parser): | ||
| parser.add_argument('--port', | ||
| action='store', | ||
| dest='port', | ||
| type=int, | ||
| required=True, | ||
| help='port which will open (0-65535)') | ||
| parser.add_argument('--protocol', | ||
| action='store', | ||
| dest='proto', | ||
| default=False, | ||
| choices=('tcp', 'udp', 'icmp'), | ||
| help='protocol name') | ||
| parser.add_argument('--action', | ||
| action='store', | ||
| dest='action', | ||
| default='accept', | ||
| choices=('accept', 'drop', 'ignore'), | ||
| help='action of the rule') | ||
| parser.add_argument('--dir', | ||
| action='store', | ||
| dest='dir', | ||
| default='in', | ||
| choices=('in', 'out'), | ||
| help='direction of the rule') | ||
| parser.add_argument('--vlan', | ||
| action='store', | ||
| dest='vlan', | ||
| required=True, | ||
| help='vlan name where the port will open') | ||
| parser.add_argument('--vlan-group', | ||
| action='store', | ||
| dest='vlan_group', | ||
| required=True, | ||
| help='vlan group name where the port will open') | ||
| parser.add_argument('--owner', | ||
| action='store', | ||
| dest='owner', | ||
| required=True, | ||
| help='name of user who owns the rule') | ||
| def handle(self, *args, **options): | ||
| port = options['port'] | ||
| proto = options['proto'] | ||
| action = options['action'] | ||
| dir = options['dir'] | ||
| owner = options['owner'] | ||
| vlan = options['vlan'] | ||
| fnet = options['vlan_group'] | ||
| if port < 0 or port > 65535: | ||
| raise CommandError("Port '%i' not in range [0-65535]" % port) | ||
| try: | ||
| owner = User.objects.get(username=owner) | ||
| vlan = Vlan.objects.get(name=vlan) | ||
| fnet = VlanGroup.objects.get(name=fnet) | ||
| except User.DoesNotExist: | ||
| raise CommandError("User '%s' does not exist" % owner) | ||
| except Vlan.DoesNotExist: | ||
| raise CommandError("Vlan '%s' does not exist" % vlan) | ||
| except VlanGroup.DoesNotExist: | ||
| raise CommandError("VlanGroup '%s' does not exist" % fnet) | ||
| if proto: | ||
| self.add_rule(port, proto, action, dir, owner, vlan, fnet) | ||
| else: | ||
| self.add_rule(port, 'tcp', action, dir, owner, vlan, fnet) | ||
| self.add_rule(port, 'udp', action, dir, owner, vlan, fnet) | ||
| def add_rule(self, port, proto, action, dir, owner, vlan, fnet): | ||
| if self.is_exist(port, proto, action, dir, owner, vlan, fnet): | ||
| raise CommandError('Rule does exist, yet') | ||
| rule = Rule(direction=dir, dport=port, proto=proto, action=action, | ||
| vlan=vlan, foreign_network=fnet, owner=owner) | ||
Please
register
or
sign in
to reply
|
||
| rule.save() | ||
| def is_exist(self, port, proto, action, dir, owner, vlan, fnet): | ||
| try: | ||
| Rule.objects.get(direction=dir, dport=port, proto=proto, | ||
|
||
| action=action, vlan=vlan, | ||
| foreign_network=fnet, owner=owner) | ||
| except Rule.DoesNotExist: | ||
| return False | ||
| else: | ||
| return True | ||