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 |