Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
R
re2o
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nounous
re2o
Commits
fbd7c3de
Commit
fbd7c3de
authored
May 14, 2018
by
chirac
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert "Merge branch 'fix_room_force_move_in' into 'master'"
This reverts merge request !161
parent
9d6562d1
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
93 additions
and
452 deletions
+93
-452
machines/migrations/0081_auto_20180511_1254.py
machines/migrations/0081_auto_20180511_1254.py
+0
-21
machines/models.py
machines/models.py
+4
-20
media/images/__init__.py
media/images/__init__.py
+0
-0
re2o/mixins.py
re2o/mixins.py
+0
-3
topologie/migrations/0060_server.py
topologie/migrations/0060_server.py
+0
-25
topologie/models.py
topologie/models.py
+3
-105
topologie/templates/topologie/graph_switch.dot
topologie/templates/topologie/graph_switch.dot
+0
-135
topologie/templates/topologie/index.html
topologie/templates/topologie/index.html
+1
-8
topologie/views.py
topologie/views.py
+84
-131
users/forms.py
users/forms.py
+1
-4
No files found.
machines/migrations/0081_auto_20180511_1254.py
deleted
100644 → 0
View file @
9d6562d1
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-05-11 17:54
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
import
django.db.models.deletion
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'machines'
,
'0080_auto_20180502_2334'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'service_link'
,
name
=
'server'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
to
=
'machines.Interface'
),
),
]
machines/models.py
View file @
fbd7c3de
...
...
@@ -1373,8 +1373,9 @@ class Service(RevMixin, AclMixin, models.Model):
def
regen
(
service
):
""" Fonction externe pour régérération d'un service, prend un objet service
en arg"""
obj
,
created
=
Service
.
objects
.
get_or_create
(
service_type
=
service
)
obj
.
ask_regen
()
obj
=
Service
.
objects
.
filter
(
service_type
=
service
)
if
obj
:
obj
[
0
].
ask_regen
()
return
...
...
@@ -1383,12 +1384,7 @@ class Service_link(RevMixin, AclMixin, models.Model):
PRETTY_NAME
=
"Relation entre service et serveur"
service
=
models
.
ForeignKey
(
'Service'
,
on_delete
=
models
.
CASCADE
)
server
=
models
.
ForeignKey
(
'Interface'
,
on_delete
=
models
.
CASCADE
,
null
=
True
,
blank
=
True
)
server
=
models
.
ForeignKey
(
'Interface'
,
on_delete
=
models
.
CASCADE
)
last_regen
=
models
.
DateTimeField
(
auto_now_add
=
True
)
asked_regen
=
models
.
BooleanField
(
default
=
False
)
...
...
@@ -1529,8 +1525,6 @@ def machine_post_save(**kwargs):
user
.
ldap_sync
(
base
=
False
,
access_refresh
=
False
,
mac_refresh
=
True
)
regen
(
'dhcp'
)
regen
(
'mac_ip_list'
)
if
user
==
preferences
.
models
.
OptionalMachine
.
get_cached_value
(
'utilisateur_asso'
):
regen
(
'graph_topo'
)
@
receiver
(
post_delete
,
sender
=
Machine
)
...
...
@@ -1555,8 +1549,6 @@ def interface_post_save(**kwargs):
# Regen services
regen
(
'dhcp'
)
regen
(
'mac_ip_list'
)
if
interface
.
machine
.
user
==
preferences
.
models
.
OptionalMachine
.
get_cached_value
(
'utilisateur_asso'
):
regen
(
'graph_topo'
)
@
receiver
(
post_delete
,
sender
=
Interface
)
...
...
@@ -1667,11 +1659,3 @@ def srv_post_save(**_kwargs):
def
srv_post_delete
(
**
_kwargs
):
"""Regeneration dns après modification d'un SRV"""
regen
(
'dns'
)
@
receiver
(
post_save
,
sender
=
Service
)
def
service_post_save
(
**
kwargs
):
"""Création d'un service_link si non existant"""
service
=
kwargs
[
'instance'
]
service_link
,
created
=
Service_link
.
objects
.
get_or_create
(
service
=
service
)
media/images/__init__.py
deleted
100644 → 0
View file @
9d6562d1
re2o/mixins.py
View file @
fbd7c3de
...
...
@@ -24,7 +24,6 @@ A set of mixins used all over the project to avoid duplicating code
"""
from
reversion
import
revisions
as
reversion
from
django.utils.functional
import
cached_property
from
django.db
import
transaction
...
...
@@ -162,5 +161,3 @@ class AclMixin(object):
),
u
"Vous n'avez pas le droit de voir des "
+
self
.
get_classname
()
)
topologie/migrations/0060_server.py
deleted
100644 → 0
View file @
9d6562d1
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-05-11 17:54
from
__future__
import
unicode_literals
from
django.db
import
migrations
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'machines'
,
'0081_auto_20180511_1254'
),
(
'topologie'
,
'0059_auto_20180415_2249'
),
]
operations
=
[
migrations
.
CreateModel
(
name
=
'Server'
,
fields
=
[
],
options
=
{
'proxy'
:
True
,
},
bases
=
(
'machines.machine'
,),
),
]
topologie/models.py
View file @
fbd7c3de
...
...
@@ -40,8 +40,7 @@ from __future__ import unicode_literals
import
itertools
from
django.db
import
models
from
django.db.models.signals
import
pre_save
,
post_save
,
post_delete
from
django.utils.functional
import
cached_property
from
django.db.models.signals
import
post_save
,
post_delete
from
django.dispatch
import
receiver
from
django.core.exceptions
import
ValidationError
from
django.db
import
IntegrityError
...
...
@@ -51,11 +50,6 @@ from reversion import revisions as reversion
from
machines.models
import
Machine
,
regen
from
re2o.mixins
import
AclMixin
,
RevMixin
from
os.path
import
isfile
from
os
import
remove
class
Stack
(
AclMixin
,
RevMixin
,
models
.
Model
):
"""Un objet stack. Regrouppe des switchs en foreign key
...
...
@@ -109,70 +103,6 @@ class AccessPoint(AclMixin, Machine):
(
"view_accesspoint"
,
"Peut voir une borne"
),
)
def
port
(
self
):
"""Return the queryset of ports for this device"""
return
Port
.
objects
.
filter
(
machine_interface__machine
=
self
)
def
switch
(
self
):
"""Return the switch where this is plugged"""
return
Switch
.
objects
.
filter
(
ports__machine_interface__machine
=
self
)
def
building
(
self
):
"""Return the building of the AP/Server (building of the switchs connected to...)"""
return
Building
.
objects
.
filter
(
switchbay__switch
=
self
.
switch
()
)
@
cached_property
def
short_name
(
self
):
return
str
(
self
.
interface_set
.
first
().
domain
.
name
)
@
classmethod
def
all_ap_in
(
cls
,
building_instance
):
"""Get a building as argument, returns all ap of a building"""
return
cls
.
objects
.
filter
(
interface__port__switch__switchbay__building
=
building_instance
)
def
__str__
(
self
):
return
str
(
self
.
interface_set
.
first
())
class
Server
(
Machine
):
"""Dummy class, to retrieve servers of a building, or get switch of a server"""
class
Meta
:
proxy
=
True
def
port
(
self
):
"""Return the queryset of ports for this device"""
return
Port
.
objects
.
filter
(
machine_interface__machine
=
self
)
def
switch
(
self
):
"""Return the switch where this is plugged"""
return
Switch
.
objects
.
filter
(
ports__machine_interface__machine
=
self
)
def
building
(
self
):
"""Return the building of the AP/Server (building of the switchs connected to...)"""
return
Building
.
objects
.
filter
(
switchbay__switch
=
self
.
switch
()
)
@
cached_property
def
short_name
(
self
):
return
str
(
self
.
interface_set
.
first
().
domain
.
name
)
@
classmethod
def
all_server_in
(
cls
,
building_instance
):
"""Get a building as argument, returns all server of a building"""
return
cls
.
objects
.
filter
(
interface__port__switch__switchbay__building
=
building_instance
).
exclude
(
accesspoint__isnull
=
False
)
def
__str__
(
self
):
return
str
(
self
.
interface_set
.
first
())
...
...
@@ -492,47 +422,15 @@ class Room(AclMixin, RevMixin, models.Model):
def
ap_post_save
(
**
_kwargs
):
"""Regeneration des noms des bornes vers le controleur"""
regen
(
'unifi-ap-names'
)
regen
(
"graph_topo"
)
@
receiver
(
post_delete
,
sender
=
AccessPoint
)
def
ap_post_delete
(
**
_kwargs
):
"""Regeneration des noms des bornes vers le controleur"""
regen
(
'unifi-ap-names'
)
regen
(
"graph_topo"
)
@
receiver
(
post_delete
,
sender
=
Stack
)
def
stack_post_delete
(
**
_kwargs
):
"""Vide les id des switches membres d'une stack supprimée"""
Switch
.
objects
.
filter
(
stack
=
None
).
update
(
stack_member_id
=
None
)
@
receiver
(
post_save
,
sender
=
Port
)
def
port_post_save
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_delete
,
sender
=
Port
)
def
port_post_delete
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_save
,
sender
=
ModelSwitch
)
def
modelswitch_post_save
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_delete
,
sender
=
ModelSwitch
)
def
modelswitch_post_delete
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_save
,
sender
=
Building
)
def
building_post_save
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_delete
,
sender
=
Building
)
def
building_post_delete
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_save
,
sender
=
Switch
)
def
switch_post_save
(
**
_kwargs
):
regen
(
"graph_topo"
)
@
receiver
(
post_delete
,
sender
=
Switch
)
def
switch_post_delete
(
**
_kwargs
):
regen
(
"graph_topo"
)
topologie/templates/topologie/graph_switch.dot
deleted
100644 → 0
View file @
9d6562d1
{
%
block
graph_dot
%
}
strict
digraph
{
graph
[
label
=
"TOPOLOGIE DU RÉSEAU"
,
labelloc
=
t
,
fontsize
=
40
]
;
node
[
fontname
=
Helvetica
fontsize
=
8
shape
=
plaintext
]
;
edge
[
arrowhead
=
none
]
;
{
%
block
subgraphs
%
}
{
%
for
sub
in
subs
%
}
subgraph
cluster_
{{
sub
.
bat_id
}}
{
fontsize
=
15
;
label
=
"Batiment {{ sub.bat_name }}"
;
{
%
if
sub
.
bornes
%
}
{
%
block
bornes
%
}
node
[
label
=<
<TABLE
BGCOLOR=
"{{ colors.back}}"
BORDER=
"0"
CELLBORDER=
"0"
CELLSPACING=
"0"
>
<TR>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head_bornes }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
Borne
</FONT></TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head_bornes }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
Switch
</FONT></TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head_bornes }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
Port
</FONT></TD>
</TR>
{% for borne in sub.bornes %}
<TR>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ borne.name }}
</FONT>
</TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ borne.switch }}
</FONT>
</TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ borne.port }}
</FONT>
</TD>
</TR>
{% endfor %}
</TABLE>
>
]
{{
sub
.
bat_name
}}
bornes
;
{
%
endblock
%
}
{
%
endif
%
}
{
%
if
sub
.
machines
%
}
{
%
block
machines
%
}
node
[
label
=<
<TABLE
BGCOLOR=
"{{ colors.back}}"
BORDER=
"0"
CELLBORDER=
"0"
CELLSPACING=
"0"
>
<TR>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head_server }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
Machine
</FONT></TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head_server }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
Switch
</FONT></TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head_server }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
Port
</FONT></TD>
</TR>
{% for machine in sub.machines %}
<TR>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ machine.name }}
</FONT>
</TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ machine.switch }}
</FONT>
</TD>
<TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ machine.port }}
</FONT>
</TD>
</TR>
{% endfor %}
</TABLE>
>
]
{{
sub
.
bat_name
}}
machines
;
{
%
endblock
%
}
{
%
endif
%
}
{
%
block
switchs
%
}
{
%
for
switch
in
sub
.
switchs
%
}
node
[
label
=<
<TABLE
BGCOLOR=
"{{ colors.back }}"
BORDER=
"0"
CELLBORDER=
"0"
CELLSPACING=
"0"
>
<TR><TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
{{ switch.name }}
</FONT></TD></TR>
<TR><TD
ALIGN=
"LEFT"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
Modèle
</FONT>
</TD>
<TD
ALIGN=
"LEFT"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ switch.model }}
</FONT>
</TD></TR>
<TR><TD
ALIGN=
"LEFT"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
Taille
</FONT>
</TD>
<TD
ALIGN=
"LEFT"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ switch.nombre }}
</FONT>
</TD></TR>
{% block liens %}
{% for port in switch.ports %}
<TR><TD
ALIGN=
"LEFT"
BORDER=
"0"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ port.numero }}
</FONT>
</TD>
<TD
ALIGN=
"LEFT"
>
<FONT
COLOR=
"{{ colors.texte }}"
>
{{ port.related }}
</FONT>
</TD></TR>
{% endfor %}
{% endblock %}
</TABLE>
>
]
"{{ switch.id }}"
;
{
%
endfor
%
}
{
%
endblock
%
}
}
{
%
endfor
%
}
{
%
endblock
%
}
{
%
block
isoles
%
}
{
%
for
switchs
in
alone
%
}
"{{switchs.id}}"
[
label
=<
<TABLE
BGCOLOR=
"{{ colors.back }}"
BORDER=
"0"
CELLBORDER=
"0"
CELLSPACING=
"0"
>
<TR><TD
COLSPAN=
"2"
CELLPADDING=
"4"
ALIGN=
"CENTER"
BGCOLOR=
"{{ colors.head }}"
>
<FONT
FACE=
"Helvetica Bold"
COLOR=
"white"
>
{{switchs.name}}
</FONT></TD></TR>
</TABLE>
>
]
{
%
endfor
%
}
{
%
endblock
%
}
{
%
block
links
%
}
{
%
for
link
in
links
%
}
"{{ link.depart }}"
->
"{{ link.arrive }}"
;
{
%
endfor
%
}
{
%
endblock
%
}
}
{
%
endblock
%
}
\ No newline at end of file
topologie/templates/topologie/index.html
View file @
fbd7c3de
...
...
@@ -29,17 +29,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% block title %}Switchs{% endblock %}
{% block content %}
<button
class=
"btn btn-primary"
type=
"button"
data-toggle=
"collapse"
data-target=
"#collImg"
aria-expanded=
"false"
aria-controls=
"collapse"
>
Topologie des Switchs
</button>
<div
id=
"collImg"
>
<img
id=
"zoom_01"
src=
"/media/images/switchs.png"
data-zoom-image=
"/media/images/switchs.png"
width=
100%
/>
</div>
<script
type=
"text/javascript"
src=
"/static/js/jquery.ez-plus.js"
></script>
<script>
$
(
"
#zoom_01
"
).
ezPlus
({
scrollZoom
:
true
,
...
...
topologie/views.py
View file @
fbd7c3de
...
...
@@ -43,10 +43,6 @@ from django.db import IntegrityError
from
django.db.models
import
ProtectedError
,
Prefetch
from
django.core.exceptions
import
ValidationError
from
django.contrib.staticfiles.storage
import
staticfiles_storage
from
django.template.loader
import
get_template
from
django.template
import
Context
,
Template
,
loader
import
pprint
from
users.views
import
form
from
re2o.utils
import
re2o_paginator
,
SortTable
...
...
@@ -57,14 +53,13 @@ from re2o.acl import (
can_view
,
can_view_all
,
)
from
re2o.settings
import
MEDIA_ROOT
from
machines.forms
import
(
DomainForm
,
EditInterfaceForm
,
AddInterfaceForm
)
from
machines.views
import
generate_ipv4_mbf_param
from
machines.models
import
Interface
,
Service_link
from
machines.models
import
Interface
from
preferences.models
import
AssoOption
,
GeneralOption
from
.models
import
(
...
...
@@ -76,8 +71,7 @@ from .models import (
ConstructorSwitch
,
AccessPoint
,
SwitchBay
,
Building
,
Server
Building
)
from
.forms
import
(
EditPortForm
,
...
...
@@ -118,12 +112,6 @@ def index(request):
)
pagination_number
=
GeneralOption
.
get_cached_value
(
'pagination_number'
)
switch_list
=
re2o_paginator
(
request
,
switch_list
,
pagination_number
)
if
any
(
service_link
.
need_regen
()
for
service_link
in
Service_link
.
objects
.
filter
(
service__service_type
=
'graph_topo'
)):
make_machine_graph
()
for
service_link
in
Service_link
.
objects
.
filter
(
service__service_type
=
'graph_topo'
):
service_link
.
done_regen
()
return
render
(
request
,
'topologie/index.html'
,
...
...
@@ -949,128 +937,93 @@ def make_machine_graph():
"""
Crée le fichier dot et l'image du graph des Switchs
"""
dico
=
{
'subs'
:
[],
'links'
:
[],
'alone'
:
[],
'colors'
:
{
'head'
:
"#7f0505"
,
'back'
:
"#b5adad"
,
'texte'
:
"#563d01"
,
'border_bornes'
:
"#02078e"
,
'head_bornes'
:
"#25771c"
,
'head_server'
:
"#1c3777"
}
}
missing
=
list
(
Switch
.
objects
.
all
())
detected
=
[]
#Parcours tous les batiments
#Syntaxe DOT temporaire, A mettre dans un template:
lignes
=
[
'''digraph Switchs {
node [
fontname=Helvetica
fontsize=8
shape=plaintext]
edge[arrowhead=odot,arrowtail=dot]'''
]
node_fixe
=
'''node [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
{}
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" >{}</FONT>
</TD>
<TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" >{}</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" >{}</FONT>
</TD>
<TD ALIGN="LEFT">
<FONT>{}</FONT>
</TD></TR>'''
node_ports
=
'''<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" >{}</FONT>
</TD>
<TD ALIGN="LEFT">
<FONT>{}</FONT>
</TD></TR>'''
cluster
=
'''subgraph cluster_{} {{
color=blue;
label="Batiment {}";'''
end_table
=
'''</TABLE>
>]
\"
{}_{}
\"
;'''
switch_alone
=
'''{} [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
{}
</FONT></TD></TR>
</TABLE>
>]'''
missing
=
[]
detected
=
[]
for
sw
in
Switch
.
objects
.
all
():
if
(
sw
not
in
detected
):
missing
.
append
(
sw
)
for
building
in
Building
.
objects
.
all
():
dico
[
'subs'
].
append
(
{
'bat_id'
:
building
.
id
,
'bat_name'
:
building
,
'switchs'
:
[],
'bornes'
:
[],
'machines'
:
[]
}
)
#Parcours tous les switchs de ce batiment
lignes
.
append
(
cluster
.
format
(
len
(
lignes
),
building
))
for
switch
in
Switch
.
objects
.
filter
(
switchbay__building
=
building
):
dico
[
'subs'
][
-
1
][
'switchs'
].
append
({
'name'
:
switch
.
main_interface
().
domain
.
name
,
'nombre'
:
switch
.
number
,
'model'
:
switch
.
model
,
'id'
:
switch
.
id
,
'batiment'
:
building
,
'ports'
:
[]
})
#Parcours tous les ports liés de ce switch, on ajoute les switchs relié à celui-ci
for
port
in
switch
.
ports
.
filter
(
related__isnull
=
False
):
dico
[
'subs'
][
-
1
][
'switchs'
][
-
1
][
'ports'
].
append
({
'numero'
:
port
.
port
,
'related'
:
port
.
related
.
switch
.
main_interface
().
domain
.
name
})
for
ap
in
AccessPoint
.
all_ap_in
(
building
):
dico
[
'subs'
][
-
1
][
'bornes'
].
append
({
'name'
:
ap
.
short_name
,
'switch'
:
ap
.
switch
()[
0
].
main_interface
().
domain
.
name
,
'port'
:
ap
.
switch
()[
0
].
ports
.
filter
(
machine_interface__machine
=
ap
)[
0
].
port
})
for
server
in
Server
.
all_server_in
(
building
):
dico
[
'subs'
][
-
1
][
'machines'
].
append
({
'name'
:
server
.
short_name
,
'switch'
:
server
.
switch
()[
0
].
main_interface
().
domain
.
name
,
'port'
:
Port
.
objects
.
filter
(
machine_interface__machine
=
server
)[
0
].
port
})
#Tant que la liste des oubliés n'est pas vide i.e on les a pas tous passer
while
missing
:
links
,
new_detected
=
recursive_switchs
(
missing
[
0
].
ports
.
filter
(
related
=
None
).
first
(),
None
,
[
missing
[
0
]])
for
link
in
links
:
dico
[
'links'
].
append
(
link
)
#On recrée la liste des oubliés et des detectés
lignes
.
append
(
node_fixe
.
format
(
switch
.
main_interface
().
domain
.
name
,
"Modèle"
,
switch
.
model
,
"Nombre de ports"
,
switch
.
number
))
for
p
in
switch
.
ports
.
all
().
filter
(
related__isnull
=
False
):
lignes
.
append
(
node_ports
.
format
(
p
.
port
,
p
.
related
.
switch
.
main_interface
().
domain
.
name
))
lignes
.
append
(
end_table
.
format
(
building
.
id
,
switch
.
id
))
lignes
.
append
(
"}"
)
while
(
missing
!=
[]):
lignes
,
new_detected
=
recursive_switchs
(
missing
[
0
].
ports
.
all
().
filter
(
related
=
None
).
first
(),
None
,
lignes
,[
missing
[
0
]])
missing
=
[
i
for
i
in
missing
if
i
not
in
new_detected
]
detected
+=
new_detected
#Tous ceux qui ne sont ni connectés ni dans un batiment
for
switch
in
Switch
.
objects
.
filter
(
switchbay__isnull
=
True
).
exclude
(
ports__related__isnull
=
False
):
dico
[
'alone'
].
append
({
'id'
:
switch
.
id
,
'name'
:
switch
.
main_interface
().
domain
.
name
})
#Exportation du dot et génération de l'image
dot_data
=
generate_image
(
dico
)
fichier
=
open
(
MEDIA_ROOT
+
"/images/switchs.dot"
,
"w"
,
encoding
=
'utf-8'
)
fichier
.
write
(
dot_data
)
detected
+=
new_detected
for
switch
in
Switch
.
objects
.
all
().
filter
(
switchbay__isnull
=
True
).
exclude
(
ports__related__isnull
=
False
):
lignes
.
append
(
switch_alone
.
format
(
switch
.
id
,
switch
.
main_interface
().
domain
.
name
))
lignes
.
append
(
"}"
)
fichier
=
open
(
"media/images/switchs.dot"
,
"w"
)
for
ligne
in
lignes
:
fichier
.
write
(
ligne
+
"
\n
"
)
fichier
.
close
()
unflatten
=
Popen
(
[
"unflatten"
,
"-l"
,
"3"
,
MEDIA_ROOT
+
"/images/switchs.dot"
],
stdout
=
PIPE
)
image
=
Popen
(
[
"dot"
,
"-Tpng"
,
"-o"
,
MEDIA_ROOT
+
"/images/switchs.png"
],
stdin
=
unflatten
.
stdout
,
stdout
=
PIPE
)
unflatten
=
Popen
([
"unflatten"
,
"-l"
,
"3"
,
"media/images/switchs.dot"
],
stdout
=
PIPE
)
image
=
Popen
([
"dot"
,
"-Tpng"
,
"-o"
,
"media/images/switchs.png"
],
stdin
=
unflatten
.
stdout
,
stdout
=
PIPE
)
def
generate_image
(
data
,
template
=
'topologie/graph_switch.dot'
):
t
=
loader
.
get_template
(
template
)
if
not
isinstance
(
t
,
Template
)
and
not
(
hasattr
(
t
,
'template'
)
and
isinstance
(
t
.
template
,
Template
)):
raise
Exception
(
"Le template par défaut de Django n'est pas utilisé."
"Cela peut mener à des erreurs de rendu."
"Vérifiez les paramètres"
)
c
=
Context
(
data
).
flatten
()
dot
=
t
.
render
(
c
)
return
(
dot
)
def
recursive_switchs
(
port_start
,
switch_before
,
detected
):