Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
94
Merge Requests
10
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
2ada70e6
authored
Oct 21, 2013
by
Kálmán Viktor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
network: add switch port management
parent
0eb6f901
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
291 additions
and
6 deletions
+291
-6
circle/firewall/models.py
+4
-0
circle/network/forms.py
+23
-1
circle/network/static/js/switch-port.js
+46
-0
circle/network/tables.py
+12
-1
circle/network/templates/network/menu.html
+3
-0
circle/network/templates/network/switch-port-create.html
+21
-0
circle/network/templates/network/switch-port-edit.html
+55
-0
circle/network/templates/network/switch-port-list.html
+16
-0
circle/network/urls.py
+20
-1
circle/network/views.py
+91
-3
No files found.
circle/firewall/models.py
View file @
2ada70e6
...
...
@@ -756,6 +756,10 @@ class SwitchPort(models.Model):
self
.
untagged_vlan
,
tagged_vlans
)
@models.permalink
def
get_absolute_url
(
self
):
return
(
'network.switch_port'
,
None
,
{
'pk'
:
self
.
pk
})
class
EthernetDevice
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
20
,
...
...
circle/network/forms.py
View file @
2ada70e6
...
...
@@ -6,7 +6,7 @@ from crispy_forms.layout import Layout, Fieldset, Div, Submit, BaseInput
from
crispy_forms.bootstrap
import
FormActions
from
firewall.models
import
(
Host
,
Vlan
,
Domain
,
Group
,
Record
,
Blacklist
,
Rule
,
VlanGroup
)
Rule
,
VlanGroup
,
SwitchPort
)
class
LinkButton
(
BaseInput
):
...
...
@@ -188,6 +188,28 @@ class RuleForm(ModelForm):
model
=
Rule
class
SwitchPortForm
(
ModelForm
):
helper
=
FormHelper
()
helper
.
layout
=
Layout
(
Div
(
Fieldset
(
''
,
'untagged_vlan'
,
'tagged_vlans'
,
'description'
,
)
),
FormActions
(
Submit
(
'submit'
,
'Save'
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.switch_port_list'
))
)
)
class
Meta
:
model
=
SwitchPort
class
VlanForm
(
ModelForm
):
helper
=
FormHelper
()
helper
.
layout
=
Layout
(
...
...
circle/network/static/js/switch-port.js
0 → 100644
View file @
2ada70e6
$
(
'i[class="icon-remove"]'
).
click
(
function
()
{
href
=
$
(
this
).
parent
(
'a'
).
attr
(
'href'
);
csrf
=
getCookie
(
'csrftoken'
);
var
click_this
=
this
;
group
=
$
(
this
).
closest
(
'h4'
).
text
();
s
=
gettext
(
'Are you sure you want to delete this device?'
);
bootbox
.
dialog
({
message
:
s
,
buttons
:
{
cancel
:
{
'label'
:
gettext
(
"Cancel"
),
'className'
:
"btn-info"
,
'callback'
:
function
()
{}
},
remove
:
{
'label'
:
gettext
(
"Remove"
),
'className'
:
"btn-danger"
,
'callback'
:
function
()
{
delete_device
(
click_this
);
}
}
}
});
return
false
;
});
function
delete_device
(
click_this
)
{
ajax
=
$
.
ajax
({
type
:
'POST'
,
url
:
href
,
headers
:
{
"X-CSRFToken"
:
csrf
},
context
:
click_this
,
success
:
function
(
data
,
textStatus
,
xhr
)
{
if
(
xhr
.
status
==
200
)
{
$
(
this
).
closest
(
'tr'
).
fadeOut
(
500
,
function
()
{
$
(
this
).
remove
();
});
}
}
});
return
false
;
}
circle/network/tables.py
View file @
2ada70e6
from
django_tables2
import
Table
,
A
from
django_tables2.columns
import
LinkColumn
,
TemplateColumn
from
firewall.models
import
Host
,
Vlan
,
Domain
,
Group
,
Record
,
Rule
from
firewall.models
import
Host
,
Vlan
,
Domain
,
Group
,
Record
,
Rule
,
SwitchPort
class
BlacklistTable
(
Table
):
...
...
@@ -129,6 +129,17 @@ class RuleTable(Table):
order_by
=
'direction'
class
SwitchPortTable
(
Table
):
pk
=
LinkColumn
(
'network.switch_port'
,
args
=
[
A
(
'pk'
)],
verbose_name
=
"ID"
)
class
Meta
:
model
=
SwitchPort
attrs
=
{
'class'
:
'table table-striped table-condensed'
}
fields
=
(
'pk'
,
'untagged_vlan'
,
'tagged_vlans'
,
'description'
,
)
order_by
=
'pk'
class
VlanTable
(
Table
):
name
=
LinkColumn
(
'network.vlan'
,
args
=
[
A
(
'vid'
)])
...
...
circle/network/templates/network/menu.html
View file @
2ada70e6
...
...
@@ -19,6 +19,9 @@
{% url "network.rule_list" as u %}
{% trans "Rules" as t %}
{% include "network/menu-item.html" with href=u text=t %}
{% url "network.switch_port_list" as u %}
{% trans "Switch ports" as t %}
{% include "network/menu-item.html" with href=u text=t %}
<li
class=
"dropdown{% if "
groups
"
in
request
.
path
%}
active
{%
endif
%}"
>
<a
href=
"#"
class=
"dropdown-toggle"
data-toggle=
"dropdown"
>
Groups
<b
class=
"caret"
></b></a>
...
...
circle/network/templates/network/switch-port-create.html
0 → 100644
View file @
2ada70e6
{% extends "network/base.html" %}
{% load render_table from django_tables2 %}
{% load i18n %}
{% load l10n %}
{% load staticfiles %}
{% load crispy_forms_tags %}
{% block content %}
<div
class=
"page-header"
>
<h2>
{% trans "Create a new switch port" %}
</h2>
</div>
<div
class=
"row"
>
<div
class=
"col-sm-8"
>
{% crispy form %}
</div>
<div
class=
"col-sm-4"
>
Halp
</div>
</div>
{% endblock %}
circle/network/templates/network/switch-port-edit.html
0 → 100644
View file @
2ada70e6
{% extends "network/base.html" %}
{% load render_table from django_tables2 %}
{% load i18n %}
{% load l10n %}
{% load staticfiles %}
{% load crispy_forms_tags %}
{% block content %}
<div
class=
"page-header"
>
<a
href=
"{% url "
network
.
switch_port_delete
"
pk=
switch_port_pk
%}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
{% trans "Delete this switchport" %}
</a>
<h2>
Welp
<small>
dunno what to write here
</small></h2>
</div>
<div
class=
"row"
>
<div
class=
"col-sm-5"
>
{% crispy form %}
</div>
<style>
.ethernet-devices-mini-table
tr
td
:last-child
{
width
:
1px
;
}
</style>
<div
class=
"col-sm-5 col-sm-offset-1"
>
<h3>
{% trans "Ethernet Devices" %}
</h3>
<hr
/>
{% if devices %}
<table
class=
"table table-condensed table-bordered ethernet-devices-mini-table"
>
{% for i in devices %}
<tr>
<td>
{{ i }}
</td>
<td>
<a
href=
"{% url "
network
.
remove_switch_port_device
"
pk=
switch_port_pk
device_pk=
i.pk
%}"
><i
class=
"icon-remove"
></i></a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
{% trans "No ethernet device" %}
{% endif %}
<hr
/>
<form
action=
"{% url "
network
.
add_switch_port_device
"
pk=
switch_port_pk
%}"
method=
"POST"
>
{% csrf_token %}
<div
class=
"input-group"
>
<input
type=
"text"
class=
"form-control"
name=
"device_name"
placeholder=
"{% trans "
Name
"
%}"
/>
<div
class=
"input-group-btn"
>
<input
type=
"submit"
value=
"{% trans "
Add
new
Ethernet
Device
"
%}"
class=
"btn btn-default"
></input>
</div>
</div>
<!-- input-group -->
</form>
</div>
</div>
{% endblock %}
{% block extra_etc %}
<script
src=
"{% static "
js
/
switch-port
.
js
"
%}"
></script>
{% endblock %}
circle/network/templates/network/switch-port-list.html
0 → 100644
View file @
2ada70e6
{% extends "network/base.html" %}
{% load render_table from django_tables2 %}
{% load i18n %}
{% load l10n %}
{% load staticfiles %}
{% block content %}
<div
class=
"page-header"
>
<a
href=
"{% url "
network
.
switch_port_create
"
%}"
class=
"btn btn-success pull-right"
><i
class=
"icon-plus-sign"
></i>
{% trans "Create a new switch port" %}
</a>
<h1>
{% trans "Switch ports" %}
<small></small></h1>
</div>
<div
class=
"table-responsive"
>
{% render_table table %}
</div>
{% endblock %}
circle/network/urls.py
View file @
2ada70e6
...
...
@@ -8,9 +8,12 @@ from .views import (IndexView,
BlacklistList
,
BlacklistDetail
,
BlacklistDelete
,
BlacklistCreate
,
RuleList
,
RuleDetail
,
RuleDelete
,
RuleCreate
,
SwitchPortList
,
SwitchPortDetail
,
SwitchPortCreate
,
SwitchPortDelete
,
VlanGroupList
,
VlanGroupDetail
,
VlanGroupDelete
,
VlanGroupCreate
,
remove_host_group
,
add_host_group
)
remove_host_group
,
add_host_group
,
remove_switch_port_device
,
add_switch_port_device
)
js_info_dict
=
{
'packages'
:
(
'network'
,
),
...
...
@@ -56,6 +59,14 @@ urlpatterns = patterns(
url
(
'^rules/create$'
,
RuleCreate
.
as_view
(),
name
=
'network.rule_create'
),
url
(
'^rules/(?P<pk>
\
d+)/$'
,
RuleDetail
.
as_view
(),
name
=
'network.rule'
),
url
(
'^switchports/$'
,
SwitchPortList
.
as_view
(),
name
=
'network.switch_port_list'
),
url
(
'^switchports/create$'
,
SwitchPortCreate
.
as_view
(),
name
=
'network.switch_port_create'
),
url
(
'^switchports/(?P<pk>
\
d+)/$'
,
SwitchPortDetail
.
as_view
(),
name
=
'network.switch_port'
),
url
(
'^switchports/delete/(?P<pk>
\
d+)/$'
,
SwitchPortDelete
.
as_view
(),
name
=
"network.switch_port_delete"
),
url
(
'^vlans/$'
,
VlanList
.
as_view
(),
name
=
'network.vlan_list'
),
url
(
'^vlans/create$'
,
VlanCreate
.
as_view
(),
name
=
'network.vlan_create'
),
url
(
'^vlans/(?P<vid>
\
d+)/$'
,
VlanDetail
.
as_view
(),
name
=
'network.vlan'
),
...
...
@@ -71,10 +82,18 @@ urlpatterns = patterns(
name
=
"network.vlan_group_delete"
),
url
(
'^rules/delete/(?P<pk>
\
d+)/$'
,
RuleDelete
.
as_view
(),
name
=
"network.rule_delete"
),
# non class based views
url
(
'^hosts/(?P<pk>
\
d+)/remove/(?P<group_pk>
\
d+)/$'
,
remove_host_group
,
name
=
'network.remove_host_group'
),
url
(
'^hosts/(?P<pk>
\
d+)/add/$'
,
add_host_group
,
name
=
'network.add_host_group'
),
url
(
'^switchports/(?P<pk>
\
d+)/remove/(?P<device_pk>
\
d+)/$'
,
remove_switch_port_device
,
name
=
'network.remove_switch_port_device'
),
url
(
'^switchports/(?P<pk>
\
d+)/add/$'
,
add_switch_port_device
,
name
=
'network.add_switch_port_device'
),
# js gettext catalog
url
(
r'^jsi18n/$'
,
'django.views.i18n.javascript_catalog'
,
js_info_dict
,
name
=
"network.js_catalog"
),
)
circle/network/views.py
View file @
2ada70e6
...
...
@@ -7,13 +7,13 @@ from django.http import HttpResponse
from
django_tables2
import
SingleTableView
from
firewall.models
import
(
Host
,
Vlan
,
Domain
,
Group
,
Record
,
Blacklist
,
Rule
,
VlanGroup
)
Rule
,
VlanGroup
,
SwitchPort
,
EthernetDevice
)
from
.tables
import
(
HostTable
,
VlanTable
,
SmallHostTable
,
DomainTable
,
GroupTable
,
RecordTable
,
BlacklistTable
,
RuleTable
,
VlanGroupTable
,
SmallRuleTable
,
SmallGroupRuleTable
,
SmallRecordTable
)
SmallRecordTable
,
SwitchPortTable
)
from
.forms
import
(
HostForm
,
VlanForm
,
DomainForm
,
GroupForm
,
RecordForm
,
BlacklistForm
,
RuleForm
,
VlanGroupForm
)
BlacklistForm
,
RuleForm
,
VlanGroupForm
,
SwitchPortForm
)
from
django.contrib
import
messages
from
django.views.generic.edit
import
FormMixin
...
...
@@ -530,6 +530,50 @@ class RuleDelete(DeleteView):
return
reverse_lazy
(
'network.rule_list'
)
class
SwitchPortList
(
SingleTableView
):
model
=
SwitchPort
table_class
=
SwitchPortTable
template_name
=
"network/switch-port-list.html"
table_pagination
=
False
class
SwitchPortDetail
(
UpdateView
,
SuccessMessageMixin
):
model
=
SwitchPort
template_name
=
"network/switch-port-edit.html"
form_class
=
SwitchPortForm
success_message
=
_
(
u'Succesfully modified switch port!'
)
def
get_success_url
(
self
):
if
'pk'
in
self
.
kwargs
:
return
reverse_lazy
(
'network.switch_port'
,
kwargs
=
self
.
kwargs
)
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
SwitchPortDetail
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'switch_port_pk'
]
=
self
.
object
.
pk
context
[
'devices'
]
=
EthernetDevice
.
objects
.
filter
(
switch_port
=
self
.
object
.
pk
)
return
context
class
SwitchPortCreate
(
CreateView
,
SuccessMessageMixin
):
model
=
SwitchPort
template_name
=
"network/switch-port-create.html"
form_class
=
SwitchPortForm
success_message
=
_
(
u'Successfully created switch port!'
)
class
SwitchPortDelete
(
DeleteView
):
model
=
SwitchPort
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
next
else
:
return
reverse_lazy
(
'network.switch_port_list'
)
class
VlanList
(
SingleTableView
):
model
=
Vlan
table_class
=
VlanTable
...
...
@@ -690,3 +734,47 @@ def add_host_group(request, **kwargs):
'group'
:
group
}))
return
redirect
(
reverse_lazy
(
'network.host'
,
kwargs
=
kwargs
))
def
remove_switch_port_device
(
request
,
**
kwargs
):
device
=
EthernetDevice
.
objects
.
get
(
pk
=
kwargs
[
'device_pk'
])
# for get we show the confirmation page
if
request
.
method
==
"GET"
:
return
render
(
request
,
'network/confirm/base_delete.html'
,
{
'object'
:
device
})
# for post we actually remove the group from the host
elif
request
.
method
==
"POST"
:
device
.
delete
()
if
not
request
.
is_ajax
():
messages
.
success
(
request
,
_
(
u"Successfully deleted ethernet device"
"
%(name)
s!"
%
{
'name'
:
device
.
name
,
}))
return
redirect
(
reverse_lazy
(
'network.switch_port'
,
kwargs
=
{
'pk'
:
kwargs
[
'pk'
]}))
def
add_switch_port_device
(
request
,
**
kwargs
):
device_name
=
request
.
POST
.
get
(
'device_name'
)
if
(
request
.
method
==
"POST"
and
device_name
and
len
(
device_name
)
>
0
and
EthernetDevice
.
objects
.
filter
(
name
=
device_name
)
.
count
()
==
0
):
switch_port
=
SwitchPort
.
objects
.
get
(
pk
=
kwargs
[
'pk'
])
new_device
=
EthernetDevice
(
name
=
device_name
,
switch_port
=
switch_port
)
new_device
.
save
()
if
not
request
.
is_ajax
():
messages
.
success
(
request
,
_
(
u"Successfully added
%(name)
s to this"
" switch port"
%
{
'name'
:
device_name
,
}))
return
redirect
(
reverse_lazy
(
'network.switch_port'
,
kwargs
=
kwargs
))
elif
not
len
(
device_name
)
>
0
:
messages
.
error
(
request
,
_
(
"Ethernet device name cannot be empty!"
))
return
redirect
(
reverse_lazy
(
'network.switch_port'
,
kwargs
=
kwargs
))
elif
EthernetDevice
.
objects
.
get
(
name
=
device_name
)
is
not
None
:
messages
.
error
(
request
,
_
(
"There is already an ethernet device with"
" that name!"
))
return
redirect
(
reverse_lazy
(
'network.switch_port'
,
kwargs
=
kwargs
))
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment