Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
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
Léo-Paul Géneau
slapos.core
Commits
42d75411
Commit
42d75411
authored
May 21, 2013
by
Marco Mariani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
overall readability
parent
6ebf13bb
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
57 additions
and
48 deletions
+57
-48
slapos/format.py
slapos/format.py
+57
-48
No files found.
slapos/format.py
View file @
42d75411
...
@@ -294,7 +294,7 @@ class Computer(object):
...
@@ -294,7 +294,7 @@ class Computer(object):
except
:
except
:
# might be a corrupted zip file. let's move it out of the way and retry.
# might be a corrupted zip file. let's move it out of the way and retry.
shutil
.
move
(
path_to_archive
,
shutil
.
move
(
path_to_archive
,
path_to_archive
+
time
.
strftime
(
'_broken_%Y%m%d-%H:%M'
))
path_to_archive
+
time
.
strftime
(
'_broken_%Y%m%d-%H:%M'
))
try
:
try
:
self
.
backup_xml
(
path_to_archive
,
path_to_xml
)
self
.
backup_xml
(
path_to_archive
,
path_to_xml
)
except
:
except
:
...
@@ -376,9 +376,9 @@ class Computer(object):
...
@@ -376,9 +376,9 @@ class Computer(object):
for
path
in
self
.
instance_root
,
self
.
software_root
:
for
path
in
self
.
instance_root
,
self
.
software_root
:
if
not
os
.
path
.
exists
(
path
):
if
not
os
.
path
.
exists
(
path
):
os
.
makedirs
(
path
,
0755
)
os
.
makedirs
(
path
,
0
o
755
)
else
:
else
:
os
.
chmod
(
path
,
0755
)
os
.
chmod
(
path
,
0
o
755
)
# own self.software_root by software user
# own self.software_root by software user
slapsoft
=
User
(
self
.
software_user
)
slapsoft
=
User
(
self
.
software_user
)
...
@@ -387,7 +387,7 @@ class Computer(object):
...
@@ -387,7 +387,7 @@ class Computer(object):
slapsoft
.
create
()
slapsoft
.
create
()
slapsoft_pw
=
pwd
.
getpwnam
(
slapsoft
.
name
)
slapsoft_pw
=
pwd
.
getpwnam
(
slapsoft
.
name
)
os
.
chown
(
self
.
software_root
,
slapsoft_pw
.
pw_uid
,
slapsoft_pw
.
pw_gid
)
os
.
chown
(
self
.
software_root
,
slapsoft_pw
.
pw_uid
,
slapsoft_pw
.
pw_gid
)
os
.
chmod
(
self
.
software_root
,
0755
)
os
.
chmod
(
self
.
software_root
,
0
o
755
)
# Speed hack:
# Speed hack:
# Blindly add all IPs from existing configuration, just to speed up actual
# Blindly add all IPs from existing configuration, just to speed up actual
...
@@ -437,7 +437,7 @@ class Computer(object):
...
@@ -437,7 +437,7 @@ class Computer(object):
# There should be two addresses on each Computer Partition:
# There should be two addresses on each Computer Partition:
# * global IPv6
# * global IPv6
# * local IPv4, took from slapformat:ipv4_local_network
# * local IPv4, took from slapformat:ipv4_local_network
if
len
(
partition
.
address_list
)
==
0
:
if
not
partition
.
address_list
:
# regenerate
# regenerate
partition
.
address_list
.
append
(
self
.
interface
.
addIPv4LocalAddress
())
partition
.
address_list
.
append
(
self
.
interface
.
addIPv4LocalAddress
())
partition
.
address_list
.
append
(
self
.
interface
.
addAddr
())
partition
.
address_list
.
append
(
self
.
interface
.
addAddr
())
...
@@ -449,11 +449,11 @@ class Computer(object):
...
@@ -449,11 +449,11 @@ class Computer(object):
raise
ValueError
(
raise
ValueError
(
'There should be exactly 2 stored addresses. Got: %r'
%
'There should be exactly 2 stored addresses. Got: %r'
%
(
old_partition_address_list
,))
(
old_partition_address_list
,))
if
not
any
(
[
netaddr
.
valid_ipv6
(
q
[
'addr'
])
if
not
any
(
netaddr
.
valid_ipv6
(
q
[
'addr'
])
for
q
in
old_partition_address_list
]
):
for
q
in
old_partition_address_list
):
raise
ValueError
(
'Not valid ipv6 addresses loaded'
)
raise
ValueError
(
'Not valid ipv6 addresses loaded'
)
if
not
any
(
[
netaddr
.
valid_ipv4
(
q
[
'addr'
])
if
not
any
(
netaddr
.
valid_ipv4
(
q
[
'addr'
])
for
q
in
old_partition_address_list
]
):
for
q
in
old_partition_address_list
):
raise
ValueError
(
'Not valid ipv6 addresses loaded'
)
raise
ValueError
(
'Not valid ipv6 addresses loaded'
)
for
address
in
old_partition_address_list
:
for
address
in
old_partition_address_list
:
...
@@ -505,11 +505,11 @@ class Partition(object):
...
@@ -505,11 +505,11 @@ class Partition(object):
self
.
path
=
os
.
path
.
abspath
(
self
.
path
)
self
.
path
=
os
.
path
.
abspath
(
self
.
path
)
owner
=
self
.
user
if
self
.
user
else
User
(
'root'
)
owner
=
self
.
user
if
self
.
user
else
User
(
'root'
)
if
not
os
.
path
.
exists
(
self
.
path
):
if
not
os
.
path
.
exists
(
self
.
path
):
os
.
mkdir
(
self
.
path
,
0750
)
os
.
mkdir
(
self
.
path
,
0
o
750
)
if
alter_user
:
if
alter_user
:
owner_pw
=
pwd
.
getpwnam
(
owner
.
name
)
owner_pw
=
pwd
.
getpwnam
(
owner
.
name
)
os
.
chown
(
self
.
path
,
owner_pw
.
pw_uid
,
owner_pw
.
pw_gid
)
os
.
chown
(
self
.
path
,
owner_pw
.
pw_uid
,
owner_pw
.
pw_gid
)
os
.
chmod
(
self
.
path
,
0750
)
os
.
chmod
(
self
.
path
,
0
o
750
)
class
User
(
object
):
class
User
(
object
):
...
@@ -700,10 +700,15 @@ class Interface(object):
...
@@ -700,10 +700,15 @@ class Interface(object):
"""
"""
if
not
socket
.
AF_INET
in
netifaces
.
ifaddresses
(
self
.
name
):
if
not
socket
.
AF_INET
in
netifaces
.
ifaddresses
(
self
.
name
):
return
[]
return
[]
return
[
dict
(
addr
=
q
[
'addr'
],
netmask
=
q
[
'netmask'
])
for
q
in
return
[
netifaces
.
ifaddresses
(
self
.
name
)[
socket
.
AF_INET
]
if
netaddr
.
IPAddress
(
{
q
[
'addr'
],
4
)
in
netaddr
.
glob_to_iprange
(
'addr'
:
q
[
'addr'
],
netaddr
.
cidr_to_glob
(
self
.
ipv4_local_network
))]
'netmask'
:
q
[
'netmask'
]
}
for
q
in
netifaces
.
ifaddresses
(
self
.
name
)[
socket
.
AF_INET
]
if
netaddr
.
IPAddress
(
q
[
'addr'
],
4
)
in
netaddr
.
glob_to_iprange
(
netaddr
.
cidr_to_glob
(
self
.
ipv4_local_network
))
]
def
getGlobalScopeAddressList
(
self
):
def
getGlobalScopeAddressList
(
self
):
"""Returns currently configured global scope IPv6 addresses"""
"""Returns currently configured global scope IPv6 addresses"""
...
@@ -712,9 +717,11 @@ class Interface(object):
...
@@ -712,9 +717,11 @@ class Interface(object):
else
:
else
:
interface_name
=
self
.
name
interface_name
=
self
.
name
try
:
try
:
address_list
=
[
q
address_list
=
[
for
q
in
netifaces
.
ifaddresses
(
interface_name
)[
socket
.
AF_INET6
]
q
if
isGlobalScopeAddress
(
q
[
'addr'
].
split
(
'%'
)[
0
])]
for
q
in
netifaces
.
ifaddresses
(
interface_name
)[
socket
.
AF_INET6
]
if
isGlobalScopeAddress
(
q
[
'addr'
].
split
(
'%'
)[
0
])
]
except
KeyError
:
except
KeyError
:
raise
ValueError
(
"%s must have at least one IPv6 address assigned"
%
\
raise
ValueError
(
"%s must have at least one IPv6 address assigned"
%
\
interface_name
)
interface_name
)
...
@@ -851,7 +858,7 @@ class Interface(object):
...
@@ -851,7 +858,7 @@ class Interface(object):
# confirmed to be configured
# confirmed to be configured
return
dict
(
addr
=
addr
,
netmask
=
netmask
)
return
dict
(
addr
=
addr
,
netmask
=
netmask
)
def
addAddr
(
self
,
addr
=
None
,
netmask
=
None
):
def
addAddr
(
self
,
addr
=
None
,
netmask
=
None
):
"""
"""
Adds IP address to interface.
Adds IP address to interface.
...
@@ -935,8 +942,10 @@ def parse_computer_definition(conf, definition_path):
...
@@ -935,8 +942,10 @@ def parse_computer_definition(conf, definition_path):
address
,
netmask
=
computer_definition
.
get
(
'computer'
,
'address'
).
split
(
'/'
)
address
,
netmask
=
computer_definition
.
get
(
'computer'
,
'address'
).
split
(
'/'
)
if
conf
.
alter_network
and
conf
.
interface_name
is
not
None
\
if
conf
.
alter_network
and
conf
.
interface_name
is
not
None
\
and
conf
.
ipv4_local_network
is
not
None
:
and
conf
.
ipv4_local_network
is
not
None
:
interface
=
Interface
(
conf
.
logger
,
conf
.
interface_name
,
conf
.
ipv4_local_network
,
interface
=
Interface
(
logger
=
conf
.
logger
,
conf
.
ipv6_interface
)
name
=
conf
.
interface_name
,
ipv4_local_network
=
conf
.
ipv4_local_network
,
ipv6_interface
=
conf
.
ipv6_interface
)
computer
=
Computer
(
computer
=
Computer
(
reference
=
conf
.
computer_id
,
reference
=
conf
.
computer_id
,
interface
=
interface
,
interface
=
interface
,
...
@@ -966,21 +975,24 @@ def parse_computer_definition(conf, definition_path):
...
@@ -966,21 +975,24 @@ def parse_computer_definition(conf, definition_path):
def
parse_computer_xml
(
conf
,
xml_path
):
def
parse_computer_xml
(
conf
,
xml_path
):
interface
=
Interface
(
logger
=
conf
.
logger
,
name
=
conf
.
interface_name
,
ipv4_local_network
=
conf
.
ipv4_local_network
,
ipv6_interface
=
conf
.
ipv6_interface
)
if
os
.
path
.
exists
(
xml_path
):
if
os
.
path
.
exists
(
xml_path
):
conf
.
logger
.
info
(
'Loading previous computer data from %r'
%
xml_path
)
conf
.
logger
.
info
(
'Loading previous computer data from %r'
%
xml_path
)
computer
=
Computer
.
load
(
xml_path
,
computer
=
Computer
.
load
(
xml_path
,
reference
=
conf
.
computer_id
,
reference
=
conf
.
computer_id
,
ipv6_interface
=
conf
.
ipv6_interface
)
ipv6_interface
=
conf
.
ipv6_interface
)
# Connect to the interface defined by the configuration
# Connect to the interface defined by the configuration
computer
.
interface
=
Interface
(
conf
.
logger
,
conf
.
interface_name
,
conf
.
ipv4_local_network
,
computer
.
interface
=
interface
conf
.
ipv6_interface
)
else
:
else
:
# If no pre-existent configuration found, create a new computer object
# If no pre-existent configuration found, create a new computer object
conf
.
logger
.
warning
(
'Creating new data computer with id %r'
%
conf
.
computer_id
)
conf
.
logger
.
warning
(
'Creating new data computer with id %r'
%
conf
.
computer_id
)
computer
=
Computer
(
computer
=
Computer
(
reference
=
conf
.
computer_id
,
reference
=
conf
.
computer_id
,
interface
=
Interface
(
conf
.
logger
,
conf
.
interface_name
,
conf
.
ipv4_local_network
,
interface
=
interface
,
conf
.
ipv6_interface
),
addr
=
None
,
addr
=
None
,
netmask
=
None
,
netmask
=
None
,
ipv6_interface
=
conf
.
ipv6_interface
,
ipv6_interface
=
conf
.
ipv6_interface
,
...
@@ -989,29 +1001,25 @@ def parse_computer_xml(conf, xml_path):
...
@@ -989,29 +1001,25 @@ def parse_computer_xml(conf, xml_path):
partition_amount
=
int
(
conf
.
partition_amount
)
partition_amount
=
int
(
conf
.
partition_amount
)
existing_partition_amount
=
len
(
computer
.
partition_list
)
existing_partition_amount
=
len
(
computer
.
partition_list
)
if
existing_partition_amount
>
partition_amount
:
if
partition_amount
<
existing_
partition_amount
:
raise
ValueError
(
'Requested amount of computer partitions (%s) is lower '
raise
ValueError
(
'Requested amount of computer partitions (%s) is lower '
'then already configured (%s), cannot continue'
%
(
partition_amount
,
'then already configured (%s), cannot continue'
%
(
partition_amount
,
len
(
computer
.
partition_list
)
))
existing_partition_amount
))
conf
.
logger
.
info
(
'Adding %s new partitions'
%
conf
.
logger
.
info
(
'Adding %s new partitions'
%
(
partition_amount
-
existing_partition_amount
))
(
partition_amount
-
existing_partition_amount
))
for
nb_iter
in
range
(
existing_partition_amount
,
partition_amount
):
# add new ones
for
i
in
range
(
existing_partition_amount
,
partition_amount
):
user
=
User
(
"%s%s"
%
(
conf
.
user_base_name
,
nb_iter
))
# add new partitions
partition
=
Partition
(
tap
=
Tap
(
"%s%s"
%
(
conf
.
tap_base_name
,
nb_iter
))
reference
=
'%s%s'
%
(
conf
.
partition_base_name
,
i
),
path
=
os
.
path
.
join
(
conf
.
instance_root
,
'%s%s'
%
(
path
=
os
.
path
.
join
(
conf
.
instance_root
,
"%s%s"
%
(
conf
.
partition_base_name
,
i
)),
conf
.
partition_base_name
,
nb_iter
))
user
=
User
(
'%s%s'
%
(
conf
.
user_base_name
,
i
)),
computer
.
partition_list
.
append
(
address_list
=
None
,
Partition
(
tap
=
Tap
(
'%s%s'
%
(
conf
.
tap_base_name
,
i
))
reference
=
"%s%s"
%
(
conf
.
partition_base_name
,
nb_iter
),
)
path
=
path
,
computer
.
partition_list
.
append
(
partition
)
user
=
user
,
address_list
=
None
,
tap
=
tap
,
))
return
computer
return
computer
...
@@ -1165,17 +1173,17 @@ class FormatConfig(object):
...
@@ -1165,17 +1173,17 @@ class FormatConfig(object):
self
.
create_tap
=
True
self
.
create_tap
=
True
# Convert strings to booleans
# Convert strings to booleans
for
o
in
[
'alter_network'
,
'alter_user'
,
'create_tap'
]:
for
o
ption
in
[
'alter_network'
,
'alter_user'
,
'create_tap'
]:
attr
=
getattr
(
self
,
o
)
attr
=
getattr
(
self
,
o
ption
)
if
isinstance
(
attr
,
str
):
if
isinstance
(
attr
,
str
):
if
attr
.
lower
()
==
'true'
:
if
attr
.
lower
()
==
'true'
:
root_needed
=
True
root_needed
=
True
setattr
(
self
,
o
,
True
)
setattr
(
self
,
o
ption
,
True
)
elif
attr
.
lower
()
==
'false'
:
elif
attr
.
lower
()
==
'false'
:
setattr
(
self
,
o
,
False
)
setattr
(
self
,
o
ption
,
False
)
else
:
else
:
message
=
'Option %r needs to be "True" or "False", wrong value: '
\
message
=
'Option %r needs to be "True" or "False", wrong value: '
\
'%r'
%
(
o
,
getattr
(
self
,
o
))
'%r'
%
(
o
ption
,
getattr
(
self
,
option
))
self
.
logger
.
error
(
message
)
self
.
logger
.
error
(
message
)
raise
UsageError
(
message
)
raise
UsageError
(
message
)
...
@@ -1198,6 +1206,7 @@ class FormatConfig(object):
...
@@ -1198,6 +1206,7 @@ class FormatConfig(object):
root_needed
=
False
root_needed
=
False
# check root
# check root
# XXX in the new CLI, this is checked by the @must_be_root decorator.
if
root_needed
and
os
.
getuid
()
!=
0
:
if
root_needed
and
os
.
getuid
()
!=
0
:
message
=
"Root rights are needed"
message
=
"Root rights are needed"
self
.
logger
.
error
(
message
)
self
.
logger
.
error
(
message
)
...
...
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