Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
38ab9b50
Commit
38ab9b50
authored
Mar 01, 2013
by
Michael DeHaan
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'setup_network2' of
git://github.com/nigelm/ansible
into devel
parents
c92bfb72
e2643cb5
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
215 additions
and
0 deletions
+215
-0
library/setup
+215
-0
No files found.
library/setup
View file @
38ab9b50
...
...
@@ -944,6 +944,221 @@ class LinuxNetwork(Network):
return
interfaces
,
ips
class
GenericBsdIfconfigNetwork
(
Network
):
"""
This is a generic BSD subclass of Network using the ifconfig command.
It defines
- interfaces (a list of interface names)
- interface_<name> dictionary of ipv4, ipv6, and mac address information.
- all_ipv4_addresses and all_ipv6_addresses: lists of all configured addresses.
It currently does not define
- default_ipv4 and default_ipv6
- type, mtu and network on interfaces
"""
platform
=
'Generic_BSD_Ifconfig'
def
__init__
(
self
):
Network
.
__init__
(
self
)
def
populate
(
self
):
ifconfig_path
=
module
.
get_bin_path
(
'ifconfig'
)
if
ifconfig_path
is
None
:
return
self
.
facts
route_path
=
module
.
get_bin_path
(
'route'
)
if
route_path
is
None
:
return
self
.
facts
default_ipv4
,
default_ipv6
=
self
.
get_default_interfaces
(
route_path
)
interfaces
,
ips
=
self
.
get_interfaces_info
(
ifconfig_path
)
self
.
merge_default_interface
(
default_ipv4
,
interfaces
,
'ipv4'
)
self
.
merge_default_interface
(
default_ipv6
,
interfaces
,
'ipv6'
)
self
.
facts
[
'interfaces'
]
=
interfaces
.
keys
()
for
iface
in
interfaces
:
self
.
facts
[
iface
]
=
interfaces
[
iface
]
self
.
facts
[
'default_ipv4'
]
=
default_ipv4
self
.
facts
[
'default_ipv6'
]
=
default_ipv6
self
.
facts
[
'all_ipv4_addresses'
]
=
ips
[
'all_ipv4_addresses'
]
self
.
facts
[
'all_ipv6_addresses'
]
=
ips
[
'all_ipv6_addresses'
]
return
self
.
facts
def
get_default_interfaces
(
self
,
route_path
):
# Use the commands:
# route -n get 8.8.8.8 -> Google public DNS
# route -n get 2404:6800:400a:800::1012 -> ipv6.google.com
# to find out the default outgoing interface, address, and gateway
command
=
dict
(
v4
=
[
route_path
,
'-n'
,
'get'
,
'8.8.8.8'
],
v6
=
[
route_path
,
'-n'
,
'get'
,
'2404:6800:400a:800::1012'
]
)
interface
=
dict
(
v4
=
{},
v6
=
{})
for
v
in
'v4'
,
'v6'
:
if
v
==
'v6'
and
not
socket
.
has_ipv6
:
continue
rc
,
out
,
err
=
module
.
run_command
(
command
[
v
])
if
not
out
:
# v6 routing may result in
# RTNETLINK answers: Invalid argument
continue
lines
=
out
.
split
(
'
\n
'
)
for
line
in
lines
:
words
=
line
.
split
()
# look for first word starting interface
if
len
(
words
)
>
0
and
words
[
0
]
==
'interface:'
:
interface
[
v
][
'interface'
]
=
words
[
1
]
return
interface
[
'v4'
],
interface
[
'v6'
]
def
get_interfaces_info
(
self
,
ifconfig_path
):
interfaces
=
{}
current_if
=
{}
ips
=
dict
(
all_ipv4_addresses
=
[],
all_ipv6_addresses
=
[],
)
rc
,
out
,
err
=
module
.
run_command
([
ifconfig_path
])
for
line
in
out
.
split
(
'
\n
'
):
if
line
:
words
=
line
.
split
()
if
re
.
match
(
'^
\
S'
,
line
)
and
len
(
words
)
>
3
:
current_if
=
self
.
parse_interface_line
(
words
)
interfaces
[
current_if
[
'device'
]
]
=
current_if
elif
words
[
0
]
.
startswith
(
'options='
):
self
.
parse_options_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'nd6'
:
self
.
parse_nd6_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'ether'
:
self
.
parse_ether_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'media:'
:
self
.
parse_media_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'status:'
:
self
.
parse_status_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'lladdr'
:
self
.
parse_lladdr_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'inet'
:
self
.
parse_inet_line
(
words
,
current_if
,
ips
)
elif
words
[
0
]
==
'inet6'
:
self
.
parse_inet6_line
(
words
,
current_if
,
ips
)
else
:
self
.
parse_unknown_line
(
words
,
current_if
,
ips
)
return
interfaces
,
ips
def
parse_interface_line
(
self
,
words
):
device
=
words
[
0
][
0
:
-
1
]
current_if
=
{
'device'
:
device
,
'ipv4'
:
[],
'ipv6'
:
[],
'type'
:
'unknown'
}
current_if
[
'flags'
]
=
self
.
get_options
(
words
[
1
])
current_if
[
'mtu'
]
=
words
[
3
]
current_if
[
'macaddress'
]
=
'unknown'
# will be overwritten later
return
current_if
def
parse_options_line
(
self
,
words
,
current_if
,
ips
):
# Mac has options like this...
current_if
[
'options'
]
=
self
.
get_options
(
words
[
0
])
def
parse_nd6_line
(
self
,
words
,
current_if
,
ips
):
# FreBSD has options like this...
current_if
[
'options'
]
=
self
.
get_options
(
words
[
1
])
def
parse_ether_line
(
self
,
words
,
current_if
,
ips
):
current_if
[
'macaddress'
]
=
words
[
1
]
def
parse_media_line
(
self
,
words
,
current_if
,
ips
):
# not sure if this is useful - we also drop information
current_if
[
'media'
]
=
words
[
1
]
if
len
(
words
)
>
2
:
current_if
[
'media_select'
]
=
words
[
2
]
if
len
(
words
)
>
3
:
current_if
[
'media_type'
]
=
words
[
3
][
1
:]
if
len
(
words
)
>
4
:
current_if
[
'media_options'
]
=
self
.
get_options
(
words
[
4
])
def
parse_status_line
(
self
,
words
,
current_if
,
ips
):
current_if
[
'status'
]
=
words
[
1
]
def
parse_lladdr_line
(
self
,
words
,
current_if
,
ips
):
current_if
[
'lladdr'
]
=
words
[
1
]
def
parse_inet_line
(
self
,
words
,
current_if
,
ips
):
address
=
{
'address'
:
words
[
1
]}
# deal with hex netmask
if
words
[
3
]
.
startswith
(
'0x'
):
address
[
'netmask'
]
=
socket
.
inet_ntoa
(
struct
.
pack
(
'!L'
,
int
(
words
[
3
],
base
=
16
)))
else
:
# otherwise assume this is a dotted quad
address
[
'netmask'
]
=
words
[
3
]
# calculate the network
address_bin
=
struct
.
unpack
(
'!L'
,
socket
.
inet_aton
(
address
[
'address'
]))[
0
]
netmask_bin
=
struct
.
unpack
(
'!L'
,
socket
.
inet_aton
(
address
[
'netmask'
]))[
0
]
address
[
'network'
]
=
socket
.
inet_ntoa
(
struct
.
pack
(
'!L'
,
address_bin
&
netmask_bin
))
# broadcast may be given or we need to calculate
if
len
(
words
)
>
5
:
address
[
'broadcast'
]
=
words
[
5
]
else
:
address
[
'broadcast'
]
=
socket
.
inet_ntoa
(
struct
.
pack
(
'!L'
,
address_bin
|
(
~
netmask_bin
&
0xffffffff
)))
# add to our list of addresses
if
not
words
[
1
]
.
startswith
(
'127.'
):
ips
[
'all_ipv4_addresses'
]
.
append
(
address
[
'address'
])
current_if
[
'ipv4'
]
.
append
(
address
)
def
parse_inet6_line
(
self
,
words
,
current_if
,
ips
):
address
=
{
'address'
:
words
[
1
]}
if
(
len
(
words
)
>=
4
)
and
(
words
[
2
]
==
'prefixlen'
):
address
[
'prefix'
]
=
words
[
3
]
if
(
len
(
words
)
>=
6
)
and
(
words
[
4
]
==
'scopeid'
):
address
[
'scope'
]
=
words
[
5
]
if
not
address
[
'address'
]
==
'::1'
and
not
address
[
'address'
]
==
'fe80::1
%
lo0'
:
ips
[
'all_ipv6_addresses'
]
.
append
(
address
[
'address'
])
current_if
[
'ipv6'
]
.
append
(
address
)
def
parse_unknown_line
(
self
,
words
,
current_if
,
ips
):
# we are going to ignore unknown lines here - this may be
# a bad idea - but you can override it in your subclass
pass
def
get_options
(
self
,
option_string
):
start
=
option_string
.
find
(
'<'
)
+
1
end
=
option_string
.
rfind
(
'>'
)
if
(
start
>
0
)
and
(
end
>
0
)
and
(
end
>
start
+
1
):
option_csv
=
option_string
[
start
:
end
]
return
option_csv
.
split
(
','
)
else
:
return
[]
def
merge_default_interface
(
self
,
defaults
,
interfaces
,
ip_type
):
if
not
'interface'
in
defaults
.
keys
():
return
ifinfo
=
interfaces
[
defaults
[
'interface'
]]
# copy all the interface values across except addresses
for
item
in
ifinfo
.
keys
():
if
item
!=
'ipv4'
and
item
!=
'ipv6'
:
defaults
[
item
]
=
ifinfo
[
item
]
if
len
(
ifinfo
[
ip_type
])
>
0
:
for
item
in
ifinfo
[
ip_type
][
0
]
.
keys
():
defaults
[
item
]
=
ifinfo
[
ip_type
][
0
][
item
]
class
DarwinNetwork
(
GenericBsdIfconfigNetwork
,
Network
):
"""
This is the Mac OS X/Darwin Network Class.
It uses the GenericBsdIfconfigNetwork unchanged
"""
platform
=
'Darwin'
# media line is different to the default FreeBSD one
def
parse_media_line
(
self
,
words
,
current_if
,
ips
):
# not sure if this is useful - we also drop information
current_if
[
'media'
]
=
'Unknown'
# Mac does not give us this
current_if
[
'media_select'
]
=
words
[
1
]
if
len
(
words
)
>
2
:
current_if
[
'media_type'
]
=
words
[
2
][
1
:]
if
len
(
words
)
>
3
:
current_if
[
'media_options'
]
=
self
.
get_options
(
words
[
3
])
class
FreeBSDNetwork
(
GenericBsdIfconfigNetwork
,
Network
):
"""
This is the FreeBSD Network Class.
It uses the GenericBsdIfconfigNetwork unchanged
"""
platform
=
'FreeBSD'
class
Virtual
(
Facts
):
"""
This is a generic Virtual subclass of Facts. This should be further
...
...
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