Roberto Berto пре 4 година
родитељ
комит
ec4531849e

+ 1 - 0
README.md

@@ -88,6 +88,7 @@ http://127.0.0.1:8000/
 - [ ] Discussion VyControl at VyOS forum https://forum.vyos.io/t/vycenter-alpha-stage-announcement-vyos-web-interface/5221/4
 - [ ] Discussion VyControl at VyOS forum https://forum.vyos.io/t/vycenter-alpha-stage-announcement-vyos-web-interface/5221/4
 
 
 # changelog
 # changelog
+- [x] edit interfaces
 - [x] lost password recovery using external SMTP server
 - [x] lost password recovery using external SMTP server
 - [x] NTP servers add/list/delete
 - [x] NTP servers add/list/delete
 - [x] zone based firewall
 - [x] zone based firewall

+ 35 - 36
vycontrol/interface/templates/interface/show.html

@@ -16,14 +16,11 @@
 
 
 {% if interface %}
 {% if interface %}
 
 
-{% if interface_type == "loopback" %}
-<form action="{% url 'interface:interface-show' interface_type=interface_type interface_name=interface_type %}" method="post">
-{% else %}
-<form action="{% url 'interface:interface-show' interface_type=interface_type interface_name=interface_name %}" method="post">
-{% endif %}
+    <form action="{% url 'interface:interface-set' interface_type=interface_type interface_name=interface_name %}" method="post">  
+    {% csrf_token %}
 
 
     <table border="1" width="100%">
     <table border="1" width="100%">
-        <tr>
+            <tr>
             <th width="30%">dhcp</th>
             <th width="30%">dhcp</th>
             <td width="70%">
             <td width="70%">
                 <input type="checkbox" name="dhcp" value="1" {% if interface.address == "dhcp" %}checked{% endif %} id="dhcp">
                 <input type="checkbox" name="dhcp" value="1" {% if interface.address == "dhcp" %}checked{% endif %} id="dhcp">
@@ -42,47 +39,49 @@
 
 
     <input type="submit" value="Save">
     <input type="submit" value="Save">
 
 
-</form>
-
-{% else %}
-    <p>Invalid interface.</p>
-{% endif %}
+    </form>
 
 
 
 
-<div class="separe-form">
-<h2>Set Interface Firewall</h2>
-<form action="{% url 'interface:interface-show' interface_type interface_name %}" method="post">
-    {% csrf_token %}
+    <div class="separe-form">
+    <h2>Set Interface Firewall</h2>
+    <form action="{% url 'interface:interface-set-firewall' interface_type=interface_type interface_name=interface_name %}" method="post">
+        {% csrf_token %}
+        
+        <p>
+            <label for="alias">IPv4 Inbound</label><br>
+            <select id="firewall-ipv4-in" name="firewall-ipv4-in"><option value="">None</option>
+                {% if firewall_all != False %}
+                    {% for fkey, fvalue in firewall_all.items %}    
+                        {% for fitemkey, fitemvalue in fvalue.items %}
+                        <option value="{{ fitemkey }}" {% if fitemkey == interface.firewall.in.name %}selected{% endif %}>{{ fitemkey }}</option>
+                        {% endfor %}
+                    {% endfor %}
+                {% endif %}
+            </select>
+        </p>
     
     
-    <p>
-        <label for="alias">IPv4 Inbound</label><br>
-        <select id="firewall-ipv4-in" name="firewall-ipv4-in"><option value="">None</option>
+        <p>
+            <label for="alias">IPv4 Outbound</label><br>
+            <select id="firewall-ipv4-out" name="firewall-ipv4-out"><option value="">None</option>
             {% if firewall_all != False %}
             {% if firewall_all != False %}
                 {% for fkey, fvalue in firewall_all.items %}    
                 {% for fkey, fvalue in firewall_all.items %}    
                     {% for fitemkey, fitemvalue in fvalue.items %}
                     {% for fitemkey, fitemvalue in fvalue.items %}
-                    <option value="{{ fitemkey }}">{{ fitemkey }}</option>
+                    <option value="{{ fitemkey }}" {% if fitemkey == interface.firewall.out.name %}selected{% endif %}>{{ fitemkey }}</option>
                     {% endfor %}
                     {% endfor %}
                 {% endfor %}
                 {% endfor %}
             {% endif %}
             {% endif %}
         </select>
         </select>
-    </p>
-
-    <p>
-        <label for="alias">IPv4 Outbound</label><br>
-        <select id="firewall-ipv4-out" name="firewall-ipv4-out"><option value="">None</option>
-        {% if firewall_all != False %}
-            {% for fkey, fvalue in firewall_all.items %}    
-                {% for fitemkey, fitemvalue in fvalue.items %}
-                <option value="{{ fitemkey }}">{{ fitemkey }}</option>
-                {% endfor %}
-            {% endfor %}
-        {% endif %}
-    </select>
-    </p>    
+        </p>    
+        
+        <input type="submit" value="Set Interface Firewall">
+        </form>
+    </div>
+
     
     
-    <input type="submit" value="Set Interface Firewall">
-    </form>
-</div>
+{% else %}
+    <p>Invalid interface.</p>
+{% endif %}
+
 
 
 
 
 <script>
 <script>

+ 2 - 0
vycontrol/interface/urls.py

@@ -8,5 +8,7 @@ urlpatterns = [
     path('', views.index, name='interface-list'),
     path('', views.index, name='interface-list'),
     path('interface-show/<slug:interface_type>/<str:interface_name>', views.interfaceshow, name='interface-show'),
     path('interface-show/<slug:interface_type>/<str:interface_name>', views.interfaceshow, name='interface-show'),
     path('interface-firewall/<slug:interface_type>/<str:interface_name>', views.interfacefirewall, name='interface-firewall'),
     path('interface-firewall/<slug:interface_type>/<str:interface_name>', views.interfacefirewall, name='interface-firewall'),
+    path('interface-set-firewall/<slug:interface_type>/<str:interface_name>', views.interface_set_firewall, name='interface-set-firewall'),
+    path('interface-set/<slug:interface_type>/<str:interface_name>', views.interface_set, name='interface-set'),
 
 
 ]
 ]

+ 67 - 1
vycontrol/interface/views.py

@@ -213,7 +213,8 @@ def interfaceshow(request, interface_type, interface_name):
         
         
     all_instances = vyos.instance_getall()
     all_instances = vyos.instance_getall()
     hostname_default = vyos.get_hostname_prefered(request)
     hostname_default = vyos.get_hostname_prefered(request)
-    firewall_all = vyos.get_firewall_all(hostname_default)   
+    firewall_all = vyos.get_firewall_all(hostname_default)  
+
     interface = vyos.get_interface(interface_type, interface_name, hostname=hostname_default)
     interface = vyos.get_interface(interface_type, interface_name, hostname=hostname_default)
     is_superuser = perms.get_is_superuser(request.user)
     is_superuser = perms.get_is_superuser(request.user)
   
   
@@ -254,3 +255,68 @@ def interfacefirewall(request, interface_type, interface_name):
     return HttpResponse(template.render(context, request))
     return HttpResponse(template.render(context, request))
 
 
 
 
+@is_authenticated    
+def interface_set_firewall(request, interface_type, interface_name):
+    hostname_default = vyos.get_hostname_prefered(request)
+    
+    interface = vyos.get_interface(interface_type, interface_name, hostname=hostname_default)
+    interface_detail = vyos.detail_interface(interface_type, interface_name)
+    interface_vif = interface_detail['vlan_id']
+    interface_name_short = interface_detail['interface_name']
+
+    actual_firewall_in = None
+    if 'firewall' in interface:
+        if 'in' in interface['firewall']:
+            if 'name' in interface['firewall']['in']:
+                actual_firewall_in = interface['firewall']['in']['name']
+
+    actual_firewall_out = None
+    if 'firewall' in interface:
+        if 'out' in interface['firewall']:
+            if 'name' in interface['firewall']['out']:
+                actual_firewall_out = interface['firewall']['out']['name']                
+
+    if request.POST.get('firewall-ipv4-in', None) != None and request.POST.get('firewall-ipv4-out', None) != None:
+        if request.POST.get('firewall-ipv4-in') == '':
+            v = vapi.delete_interface_firewall_ipv4(hostname_default, interface_type, interface_name_short, "in", interface_vif)
+        elif actual_firewall_in == None or request.POST.get('firewall-ipv4-in') != interface['firewall']['in']['name']:
+            v = vapi.set_interface_firewall_ipv4(hostname_default, interface_type, interface_name_short, "in", request.POST.get('firewall-ipv4-in'), interface_vif) 
+
+        if request.POST.get('firewall-ipv4-out') == '':
+            v = vapi.delete_interface_firewall_ipv4(hostname_default, interface_type, interface_name_short, "out", interface_vif)
+        elif actual_firewall_out == None or request.POST.get('firewall-ipv4-out') != interface['firewall']['out']['name']:
+            v = vapi.set_interface_firewall_ipv4(hostname_default, interface_type, interface_name_short, "out", request.POST.get('firewall-ipv4-out'), interface_vif)       
+            
+    return redirect('interface:interface-show', interface_type=interface_type, interface_name=interface_name)
+
+@is_authenticated    
+def interface_set(request, interface_type, interface_name):
+    hostname_default = vyos.get_hostname_prefered(request)   
+    #interface = vyos.get_interface(interface_type, interface_name, hostname=hostname_default)
+    interface_detail = vyos.detail_interface(interface_type, interface_name)
+    interface_vif = interface_detail['vlan_id']
+    interface_name_short = interface_detail['interface_name']   
+
+    address = 'dhcp'
+    if request.POST.get('dhcp', None) != "1":
+        address = request.POST.get('address', None)
+        if address != None:
+            address = address.strip()
+
+
+    mtu = None
+    if request.POST.get('mtu','').strip().isdigit():
+        mtu = request.POST.get('mtu').strip()
+    
+    if mtu == None:
+        v = vapi.delete_interface_mtu(hostname_default, interface_type, interface_name_short, vif=interface_vif)
+    else:
+        v = vapi.set_interface_mtu(hostname_default, interface_type, interface_name_short, mtu, vif=interface_vif)
+
+    v = vapi.delete_interface_address(hostname_default, interface_type, interface_name_short, vif=interface_vif)
+    v = vapi.set_interface_address(hostname_default, interface_type, interface_name_short, address, vif=interface_vif)
+
+
+
+    return redirect('interface:interface-show', interface_type=interface_type, interface_name=interface_name)
+

+ 2 - 3
vycontrol/perms.py

@@ -15,8 +15,7 @@ def is_authenticated(func):
     def wrapper_perm(*args, **kwargs):
     def wrapper_perm(*args, **kwargs):
         request = args[0]
         request = args[0]
         if not request.user.is_authenticated:
         if not request.user.is_authenticated:
-           return redirect('%s?next=%s' % (reverse('registration-login'), request.path))
-           #return redirect('registration-login')
+           return redirect('%s?next=%s' % (reverse('accounts-login'), request.path))
 
 
         hostname_default = vyos.get_hostname_prefered(request)
         hostname_default = vyos.get_hostname_prefered(request)
 
 
@@ -46,7 +45,7 @@ def is_superuser(func):
 
 
         if is_admin == False:
         if is_admin == False:
             auth.logout(request)
             auth.logout(request)
-            return redirect('registration-login')
+            return redirect('accounts-login')
 
 
         value = func(*args, **kwargs)
         value = func(*args, **kwargs)
         return value
         return value

+ 81 - 1
vycontrol/vycontrol_vyos_api.py

@@ -559,4 +559,84 @@ def set_ntp(hostname, server):
         cmd =       ["system","ntp","server",server],
         cmd =       ["system","ntp","server",server],
         description = "set_ntp",
         description = "set_ntp",
     )
     )
-    return v  
+    return v  
+
+def set_interface_address(hostname, interface_type, interface_name, address, vif=None):
+    if vif == None:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "set",
+            cmd =       ["interfaces", interface_type, interface_name, "address", address],
+            description = "set_interface_dhcp",
+        )
+    else:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "set",
+            cmd =       ["interfaces", interface_type, interface_name, "vif", vif, "address", address],
+            description = "set_interface_dhcp",
+        )
+    return v    
+
+
+def delete_interface_address(hostname, interface_type, interface_name, vif=None):
+    if vif == None:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "delete",
+            cmd =       ["interfaces", interface_type, interface_name, "address"],
+            description = "delete_interface_address",
+        )
+    else:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "delete",
+            cmd =       ["interfaces", interface_type, interface_name, "vif", vif, "address"],
+            description = "delete_interface_address",
+        )
+    return v      
+
+
+
+def set_interface_mtu(hostname, interface_type, interface_name, mtu, vif=None):
+    if vif == None:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "set",
+            cmd =       ["interfaces", interface_type, interface_name, "mtu", mtu],
+            description = "set_interface_mtu",
+        )
+    else:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "set",
+            cmd =       ["interfaces", interface_type, interface_name, "vif", vif, "mtu", mtu],
+            description = "set_interface_mtu",
+        )
+    return v    
+
+
+def delete_interface_mtu(hostname, interface_type, interface_name, vif=None):
+    if vif == None:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "delete",
+            cmd =       ["interfaces", interface_type, interface_name, "mtu"],
+            description = "delete_interface_mtu",
+        )
+    else:
+        v = vapilib.api (
+            hostname=   hostname,
+            api =       "post",
+            op =        "delete",
+            cmd =       ["interfaces", interface_type, interface_name, "vif", vif, "mtu"],
+            description = "delete_interface_mtu",
+        )
+    return v        

+ 24 - 1
vycontrol/vyos.py

@@ -178,9 +178,32 @@ def get_interfaces_all_names(hostname):
     
     
     return all_names
     return all_names
 
 
+def detail_interface(interface_type, interface_name):
+    vlan = False
+    vlan_id = None
+
+    if interface_type == "ethernet":
+        isplit = interface_name.split(".")
+        if len(isplit) == 2:
+            vlan = True
+            vlan_id = isplit[1]
+            interface_name = isplit[0]
+
+    return {
+        "interface_name":   interface_name,
+        "vlan":             vlan,
+        "vlan_id":          vlan_id,
+        "interface_type":   interface_type
+    }
 
 
 def get_interface(interface_type, interface_name, hostname):
 def get_interface(interface_type, interface_name, hostname):
-    cmd = {"op": "showConfig", "path": ["interfaces", interface_type, interface_name]}
+    inteface_detail = detail_interface(interface_type, interface_name)
+
+        
+    if inteface_detail['vlan'] == True:
+        cmd = {"op": "showConfig", "path": ["interfaces", inteface_detail['interface_type'], inteface_detail['interface_name'], "vif", inteface_detail['vlan_id']]}
+    else:
+        cmd = {"op": "showConfig", "path": ["interfaces", inteface_detail['interface_type'], inteface_detail['interface_name']]}
 
 
     result1 = api_get(hostname, cmd)
     result1 = api_get(hostname, cmd)
     return result1
     return result1