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
Labels
Merge Requests
18
Merge Requests
18
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
slapos.core
Commits
c7083252
Commit
c7083252
authored
Jan 26, 2012
by
Cédric de Saint Martin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor to use 'interface' name where 'bridge' was used
parent
4be336e6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
60 deletions
+61
-60
slapos.cfg.example
slapos.cfg.example
+1
-1
slapos/format.py
slapos/format.py
+60
-59
No files found.
slapos.cfg.example
View file @
c7083252
...
@@ -9,7 +9,7 @@ buildout = /path/to/buildout/binary
...
@@ -9,7 +9,7 @@ buildout = /path/to/buildout/binary
computer_xml = /opt/slapos/slapos.xml
computer_xml = /opt/slapos/slapos.xml
log_file = /opt/slapos/slapformat.log
log_file = /opt/slapos/slapformat.log
partition_amount = 200
partition_amount = 200
bridg
e_name = br0
interfac
e_name = br0
partition_base_name = slappart
partition_base_name = slappart
user_base_name = slapuser
user_base_name = slapuser
tap_base_name = slaptap
tap_base_name = slaptap
...
...
slapos/format.py
View file @
c7083252
...
@@ -144,22 +144,22 @@ class Error(Exception):
...
@@ -144,22 +144,22 @@ class Error(Exception):
def
__str__
(
self
):
def
__str__
(
self
):
return
self
.
message
return
self
.
message
class
NoAddressOn
Bridg
e
(
Error
):
class
NoAddressOn
Interfac
e
(
Error
):
"""
"""
Exception raised if there's not address on the
bridg
e to construct IPv6
Exception raised if there's not address on the
interfac
e to construct IPv6
address with.
address with.
Attributes:
Attributes:
brige: String, the name of the
bridg
e.
brige: String, the name of the
interfac
e.
"""
"""
def
__init__
(
self
,
bridg
e
):
def
__init__
(
self
,
interfac
e
):
self
.
message
=
'No IPv6 found on
bridge %s to construct IPv6 with.'
%
bridg
e
self
.
message
=
'No IPv6 found on
interface %s to construct IPv6 with.'
%
interfac
e
class
AddressGenerationError
(
Error
):
class
AddressGenerationError
(
Error
):
"""
"""
Exception raised if the generation of an IPv6 based on the prefix obtained
Exception raised if the generation of an IPv6 based on the prefix obtained
from the
bridg
e failed.
from the
interfac
e failed.
Attributes:
Attributes:
addr: String, the invalid address the exception is raised for.
addr: String, the invalid address the exception is raised for.
...
@@ -170,32 +170,32 @@ class AddressGenerationError(Error):
...
@@ -170,32 +170,32 @@ class AddressGenerationError(Error):
class
Computer
:
class
Computer
:
"Object representing the computer"
"Object representing the computer"
def
__init__
(
self
,
reference
,
bridg
e
=
None
,
addr
=
None
,
netmask
=
None
,
def
__init__
(
self
,
reference
,
interfac
e
=
None
,
addr
=
None
,
netmask
=
None
,
ipv6_interface
=
None
):
ipv6_interface
=
None
):
"""
"""
Attributes:
Attributes:
reference: String, the reference of the computer.
reference: String, the reference of the computer.
bridge: String, if it has one, the name of the computer's bridge
.
interface: String, if it has one, the name of the interface to be used
.
"""
"""
self
.
reference
=
str
(
reference
)
self
.
reference
=
str
(
reference
)
self
.
bridge
=
bridg
e
self
.
interface
=
interfac
e
self
.
partition_list
=
[]
self
.
partition_list
=
[]
self
.
address
=
addr
self
.
address
=
addr
self
.
netmask
=
netmask
self
.
netmask
=
netmask
self
.
ipv6_interface
=
ipv6_interface
self
.
ipv6_interface
=
ipv6_interface
def
__getinitargs__
(
self
):
def
__getinitargs__
(
self
):
return
(
self
.
reference
,
self
.
bridg
e
)
return
(
self
.
reference
,
self
.
interfac
e
)
def
getAddress
(
self
):
def
getAddress
(
self
):
"""
"""
Return a list of the
bridg
e address not attributed to any partition, (which
Return a list of the
interfac
e address not attributed to any partition, (which
are therefore free for the computer itself).
are therefore free for the computer itself).
Returns:
Returns:
False if the
bridg
e isn't available, else the list of the free addresses.
False if the
interfac
e isn't available, else the list of the free addresses.
"""
"""
if
self
.
bridg
e
is
None
:
if
self
.
interfac
e
is
None
:
return
dict
(
addr
=
self
.
address
,
netmask
=
self
.
netmask
)
return
dict
(
addr
=
self
.
address
,
netmask
=
self
.
netmask
)
computer_partition_address_list
=
[]
computer_partition_address_list
=
[]
...
@@ -203,8 +203,8 @@ class Computer:
...
@@ -203,8 +203,8 @@ class Computer:
for
address
in
partition
.
address_list
:
for
address
in
partition
.
address_list
:
if
netaddr
.
valid_ipv6
(
address
[
'addr'
]):
if
netaddr
.
valid_ipv6
(
address
[
'addr'
]):
computer_partition_address_list
.
append
(
address
[
'addr'
])
computer_partition_address_list
.
append
(
address
[
'addr'
])
# Going through addresses of the
computer's bridge
interface
# Going through addresses of the interface
for
address_dict
in
self
.
bridg
e
.
getGlobalScopeAddressList
():
for
address_dict
in
self
.
interfac
e
.
getGlobalScopeAddressList
():
# Comparing with computer's partition addresses
# Comparing with computer's partition addresses
if
address_dict
[
'addr'
]
not
in
computer_partition_address_list
:
if
address_dict
[
'addr'
]
not
in
computer_partition_address_list
:
return
address_dict
return
address_dict
...
@@ -212,8 +212,8 @@ class Computer:
...
@@ -212,8 +212,8 @@ class Computer:
# all addresses on interface are for partition, so lets add new one
# all addresses on interface are for partition, so lets add new one
computer_tap
=
Tap
(
'compdummy'
)
computer_tap
=
Tap
(
'compdummy'
)
computer_tap
.
createWithOwner
(
User
(
'root'
),
attach_to_tap
=
True
)
computer_tap
.
createWithOwner
(
User
(
'root'
),
attach_to_tap
=
True
)
self
.
bridg
e
.
addTap
(
computer_tap
)
self
.
interfac
e
.
addTap
(
computer_tap
)
return
self
.
bridg
e
.
addAddr
()
return
self
.
interfac
e
.
addAddr
()
def
send
(
self
,
config
):
def
send
(
self
,
config
):
"""
"""
...
@@ -304,7 +304,7 @@ class Computer:
...
@@ -304,7 +304,7 @@ class Computer:
Construct the computer object as it is.
Construct the computer object as it is.
"""
"""
if
alter_network
and
self
.
address
is
not
None
:
if
alter_network
and
self
.
address
is
not
None
:
self
.
bridg
e
.
addAddr
(
self
.
address
,
self
.
netmask
)
self
.
interfac
e
.
addAddr
(
self
.
address
,
self
.
netmask
)
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
):
...
@@ -338,13 +338,13 @@ class Computer:
...
@@ -338,13 +338,13 @@ class Computer:
if
alter_network
:
if
alter_network
:
# In case it has to be attached to the TAP network device, only one
# In case it has to be attached to the TAP network device, only one
# is necessary for the
bridg
e to assert carrier
# is necessary for the
interfac
e to assert carrier
if
self
.
bridg
e
.
attach_to_tap
and
partition_index
==
0
:
if
self
.
interfac
e
.
attach_to_tap
and
partition_index
==
0
:
partition
.
tap
.
createWithOwner
(
owner
,
attach_to_tap
=
True
)
partition
.
tap
.
createWithOwner
(
owner
,
attach_to_tap
=
True
)
else
:
else
:
partition
.
tap
.
createWithOwner
(
owner
)
partition
.
tap
.
createWithOwner
(
owner
)
self
.
bridg
e
.
addTap
(
partition
.
tap
)
self
.
interfac
e
.
addTap
(
partition
.
tap
)
# Reconstructing partition's directory
# Reconstructing partition's directory
partition
.
createPath
(
alter_user
)
partition
.
createPath
(
alter_user
)
...
@@ -355,8 +355,8 @@ class Computer:
...
@@ -355,8 +355,8 @@ class Computer:
# * local IPv4, took from slapformat:ipv4_local_network
# * local IPv4, took from slapformat:ipv4_local_network
if
len
(
partition
.
address_list
)
==
0
:
if
len
(
partition
.
address_list
)
==
0
:
# regenerate
# regenerate
partition
.
address_list
.
append
(
self
.
bridg
e
.
addIPv4LocalAddress
())
partition
.
address_list
.
append
(
self
.
interfac
e
.
addIPv4LocalAddress
())
partition
.
address_list
.
append
(
self
.
bridg
e
.
addAddr
())
partition
.
address_list
.
append
(
self
.
interfac
e
.
addAddr
())
elif
alter_network
:
elif
alter_network
:
# regenerate list of addresses
# regenerate list of addresses
old_partition_address_list
=
partition
.
address_list
old_partition_address_list
=
partition
.
address_list
...
@@ -369,14 +369,14 @@ class Computer:
...
@@ -369,14 +369,14 @@ class Computer:
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
:
if
netaddr
.
valid_ipv6
(
address
[
'addr'
]):
if
netaddr
.
valid_ipv6
(
address
[
'addr'
]):
partition
.
address_list
.
append
(
self
.
bridg
e
.
addAddr
(
address
[
'addr'
],
partition
.
address_list
.
append
(
self
.
interfac
e
.
addAddr
(
address
[
'addr'
],
address
[
'netmask'
]))
address
[
'netmask'
]))
elif
netaddr
.
valid_ipv4
(
address
[
'addr'
]):
elif
netaddr
.
valid_ipv4
(
address
[
'addr'
]):
partition
.
address_list
.
append
(
self
.
bridg
e
.
addIPv4LocalAddress
(
address
[
'addr'
]))
partition
.
address_list
.
append
(
self
.
interfac
e
.
addIPv4LocalAddress
(
address
[
'addr'
]))
else
:
else
:
raise
ValueError
(
'Address %r is incorrect'
%
address
[
'addr'
])
raise
ValueError
(
'Address %r is incorrect'
%
address
[
'addr'
])
finally
:
finally
:
if
alter_network
and
self
.
bridg
e
.
attach_to_tap
:
if
alter_network
and
self
.
interfac
e
.
attach_to_tap
:
try
:
try
:
self
.
partition_list
[
0
].
tap
.
detach
()
self
.
partition_list
[
0
].
tap
.
detach
()
except
IndexError
:
except
IndexError
:
...
@@ -516,6 +516,7 @@ class Tap:
...
@@ -516,6 +516,7 @@ class Tap:
there is carrier, e.g. the network cable is plugged into a switch for
there is carrier, e.g. the network cable is plugged into a switch for
example).
example).
In case of bridge :
In order to be able to check the uniqueness of IPv6 address assigned to
In order to be able to check the uniqueness of IPv6 address assigned to
the bridge, the network interface must be up from an administrative *and*
the bridge, the network interface must be up from an administrative *and*
operational point of view.
operational point of view.
...
@@ -581,13 +582,13 @@ class Tap:
...
@@ -581,13 +582,13 @@ class Tap:
return
True
return
True
class
Bridg
e
:
class
Interfac
e
:
"
Bridge represent a bridg
e on the system"
"
Interface represent a interfac
e on the system"
def
__init__
(
self
,
name
,
ipv4_local_network
,
ipv6_interface
=
None
):
def
__init__
(
self
,
name
,
ipv4_local_network
,
ipv6_interface
=
None
):
"""
"""
Attributes:
Attributes:
name: String, the name of the
bridg
e
name: String, the name of the
interfac
e
"""
"""
self
.
name
=
str
(
name
)
self
.
name
=
str
(
name
)
...
@@ -633,19 +634,19 @@ class Bridge:
...
@@ -633,19 +634,19 @@ class Bridge:
return
address_list
return
address_list
def
getInterfaceList
(
self
):
def
getInterfaceList
(
self
):
"""Returns list of interfaces already present on
bridg
e"""
"""Returns list of interfaces already present on
interfac
e"""
interface_list
=
[]
interface_list
=
[]
returncode
,
result
=
callAndRead
([
'brctl'
,
'show'
])
returncode
,
result
=
callAndRead
([
'brctl'
,
'show'
])
in_
bridg
e
=
False
in_
interfac
e
=
False
for
line
in
result
.
split
(
'
\
n
'
):
for
line
in
result
.
split
(
'
\
n
'
):
if
len
(
line
.
split
())
>
1
:
if
len
(
line
.
split
())
>
1
:
if
self
.
name
in
line
:
if
self
.
name
in
line
:
interface_list
.
append
(
line
.
split
()[
-
1
])
interface_list
.
append
(
line
.
split
()[
-
1
])
in_
bridg
e
=
True
in_
interfac
e
=
True
continue
continue
if
in_
bridg
e
:
if
in_
interfac
e
:
break
break
elif
in_
bridg
e
:
elif
in_
interfac
e
:
if
line
.
strip
():
if
line
.
strip
():
interface_list
.
append
(
line
.
strip
())
interface_list
.
append
(
line
.
strip
())
...
@@ -662,7 +663,7 @@ class Bridge:
...
@@ -662,7 +663,7 @@ class Bridge:
callAndRead
([
'brctl'
,
'addif'
,
self
.
name
,
tap
.
name
])
callAndRead
([
'brctl'
,
'addif'
,
self
.
name
,
tap
.
name
])
def
_addSystemAddress
(
self
,
address
,
netmask
,
ipv6
=
True
):
def
_addSystemAddress
(
self
,
address
,
netmask
,
ipv6
=
True
):
"""Adds system address to
bridg
e
"""Adds system address to
interfac
e
Returns True if address was added successfully.
Returns True if address was added successfully.
...
@@ -739,15 +740,15 @@ class Bridge:
...
@@ -739,15 +740,15 @@ class Bridge:
def
addAddr
(
self
,
addr
=
None
,
netmask
=
None
):
def
addAddr
(
self
,
addr
=
None
,
netmask
=
None
):
"""
"""
Adds IP address to
bridg
e.
Adds IP address to
interfac
e.
If addr is specified and exists already on
bridg
e does nothing.
If addr is specified and exists already on
interfac
e does nothing.
If addr is specified and does not exists on
bridg
e, tries to add given address.
If addr is specified and does not exists on
interfac
e, tries to add given address.
In case if it is not possible (ex. because network changed) calculates new address.
In case if it is not possible (ex. because network changed) calculates new address.
Args:
Args:
addr: Wished address to be added to
bridg
e.
addr: Wished address to be added to
interfac
e.
netmask: Wished netmask to be used.
netmask: Wished netmask to be used.
Returns:
Returns:
...
@@ -755,32 +756,32 @@ class Bridge:
...
@@ -755,32 +756,32 @@ class Bridge:
Raises:
Raises:
AddressGenerationError: Couldn't construct valid address with existing
AddressGenerationError: Couldn't construct valid address with existing
one's on the
bridg
e.
one's on the
interfac
e.
NoAddressOn
Bridge: There's no address on the bridg
e to construct
NoAddressOn
Interface: There's no address on the interfac
e to construct
an address with.
an address with.
"""
"""
# Getting one address of the
bridg
e as base of the next addresses
# Getting one address of the
interfac
e as base of the next addresses
if
self
.
ipv6_interface
:
if
self
.
ipv6_interface
:
interface_name
=
self
.
ipv6_interface
interface_name
=
self
.
ipv6_interface
else
:
else
:
interface_name
=
self
.
name
interface_name
=
self
.
name
bridg
e_addr_list
=
self
.
getGlobalScopeAddressList
()
interfac
e_addr_list
=
self
.
getGlobalScopeAddressList
()
# No address found
# No address found
if
len
(
bridg
e_addr_list
)
==
0
:
if
len
(
interfac
e_addr_list
)
==
0
:
raise
NoAddressOn
Bridg
e
(
interface_name
)
raise
NoAddressOn
Interfac
e
(
interface_name
)
address_dict
=
bridg
e_addr_list
[
0
]
address_dict
=
interfac
e_addr_list
[
0
]
if
addr
is
not
None
:
if
addr
is
not
None
:
if
dict
(
addr
=
addr
,
netmask
=
netmask
)
in
bridg
e_addr_list
:
if
dict
(
addr
=
addr
,
netmask
=
netmask
)
in
interfac
e_addr_list
:
# confirmed to be configured
# confirmed to be configured
return
dict
(
addr
=
addr
,
netmask
=
netmask
)
return
dict
(
addr
=
addr
,
netmask
=
netmask
)
if
netmask
==
address_dict
[
'netmask'
]:
if
netmask
==
address_dict
[
'netmask'
]:
# same netmask, so there is a chance to add good one
# same netmask, so there is a chance to add good one
bridg
e_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
address_dict
[
'addr'
],
interfac
e_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
address_dict
[
'addr'
],
netmaskToPrefixIPv6
(
address_dict
[
'netmask'
])))
netmaskToPrefixIPv6
(
address_dict
[
'netmask'
])))
requested_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
addr
,
netmaskToPrefixIPv6
(
netmask
)))
requested_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
addr
,
netmaskToPrefixIPv6
(
netmask
)))
if
bridg
e_network
.
network
==
requested_network
.
network
:
if
interfac
e_network
.
network
==
requested_network
.
network
:
# same network, try to add
# same network, try to add
if
self
.
_addSystemAddress
(
addr
,
netmask
):
if
self
.
_addSystemAddress
(
addr
,
netmask
):
# succeed, return it
# succeed, return it
...
@@ -866,18 +867,18 @@ def run(config):
...
@@ -866,18 +867,18 @@ def run(config):
config
.
logger
.
info
(
'Using definition file %r'
%
filepath
)
config
.
logger
.
info
(
'Using definition file %r'
%
filepath
)
computer_definition
=
ConfigParser
.
RawConfigParser
()
computer_definition
=
ConfigParser
.
RawConfigParser
()
computer_definition
.
read
(
filepath
)
computer_definition
.
read
(
filepath
)
bridg
e
=
None
interfac
e
=
None
address
=
None
address
=
None
netmask
=
None
netmask
=
None
if
computer_definition
.
has_option
(
'computer'
,
'address'
):
if
computer_definition
.
has_option
(
'computer'
,
'address'
):
address
,
netmask
=
computer_definition
.
get
(
'computer'
,
'address'
).
split
(
'/'
)
address
,
netmask
=
computer_definition
.
get
(
'computer'
,
'address'
).
split
(
'/'
)
if
config
.
alter_network
and
config
.
bridg
e_name
is
not
None
\
if
config
.
alter_network
and
config
.
interfac
e_name
is
not
None
\
and
config
.
ipv4_local_network
is
not
None
:
and
config
.
ipv4_local_network
is
not
None
:
bridge
=
Bridge
(
config
.
bridg
e_name
,
config
.
ipv4_local_network
,
interface
=
Interface
(
config
.
interfac
e_name
,
config
.
ipv4_local_network
,
config
.
ipv6_interface
)
config
.
ipv6_interface
)
computer
=
Computer
(
computer
=
Computer
(
reference
=
config
.
computer_id
,
reference
=
config
.
computer_id
,
bridge
=
bridg
e
,
interface
=
interfac
e
,
addr
=
address
,
addr
=
address
,
netmask
=
netmask
,
netmask
=
netmask
,
ipv6_interface
=
config
.
ipv6_interface
ipv6_interface
=
config
.
ipv6_interface
...
@@ -903,15 +904,15 @@ def run(config):
...
@@ -903,15 +904,15 @@ def run(config):
if
os
.
path
.
exists
(
config
.
computer_xml
):
if
os
.
path
.
exists
(
config
.
computer_xml
):
config
.
logger
.
info
(
'Loading previous computer data from %r'
%
config
.
computer_xml
)
config
.
logger
.
info
(
'Loading previous computer data from %r'
%
config
.
computer_xml
)
computer
=
Computer
.
load
(
config
.
computer_xml
,
reference
=
config
.
computer_id
,
ipv6_interface
=
config
.
ipv6_interface
)
computer
=
Computer
.
load
(
config
.
computer_xml
,
reference
=
config
.
computer_id
,
ipv6_interface
=
config
.
ipv6_interface
)
# Connect to the
bridg
e interface defined by the configuration
# Connect to the
interfac
e interface defined by the configuration
computer
.
bridge
=
Bridge
(
config
.
bridg
e_name
,
config
.
ipv4_local_network
,
computer
.
interface
=
Interface
(
config
.
interfac
e_name
,
config
.
ipv4_local_network
,
config
.
ipv6_interface
)
config
.
ipv6_interface
)
else
:
else
:
# If no pre-existent configuration found, creating a new computer object
# If no pre-existent configuration found, creating a new computer object
config
.
logger
.
warning
(
'Creating new data computer with id %r'
%
config
.
computer_id
)
config
.
logger
.
warning
(
'Creating new data computer with id %r'
%
config
.
computer_id
)
computer
=
Computer
(
computer
=
Computer
(
reference
=
config
.
computer_id
,
reference
=
config
.
computer_id
,
bridge
=
Bridge
(
config
.
bridg
e_name
,
config
.
ipv4_local_network
,
interface
=
Interface
(
config
.
interfac
e_name
,
config
.
ipv4_local_network
,
config
.
ipv6_interface
),
config
.
ipv6_interface
),
addr
=
None
,
addr
=
None
,
netmask
=
None
,
netmask
=
None
,
...
@@ -1019,7 +1020,7 @@ class Config:
...
@@ -1019,7 +1020,7 @@ class Config:
setattr
(
self
,
key
,
configuration_dict
[
key
])
setattr
(
self
,
key
,
configuration_dict
[
key
])
# setup some nones
# setup some nones
for
parameter
in
[
'
bridg
e_name'
,
'partition_base_name'
,
'user_base_name'
,
for
parameter
in
[
'
interfac
e_name'
,
'partition_base_name'
,
'user_base_name'
,
'tap_base_name'
,
'ipv4_local_network'
,
'ipv6_interface'
]:
'tap_base_name'
,
'ipv4_local_network'
,
'ipv6_interface'
]:
if
getattr
(
self
,
parameter
,
None
)
is
None
:
if
getattr
(
self
,
parameter
,
None
)
is
None
:
setattr
(
self
,
parameter
,
None
)
setattr
(
self
,
parameter
,
None
)
...
@@ -1117,12 +1118,12 @@ def main(*args):
...
@@ -1117,12 +1118,12 @@ def main(*args):
else
:
else
:
return
0
,
''
return
0
,
''
callAndRead
=
dry_callAndRead
callAndRead
=
dry_callAndRead
real_addSystemAddress
=
Bridg
e
.
_addSystemAddress
real_addSystemAddress
=
Interfac
e
.
_addSystemAddress
def
fake_addSystemAddress
(
*
args
,
**
kw
):
def
fake_addSystemAddress
(
*
args
,
**
kw
):
real_addSystemAddress
(
*
args
,
**
kw
)
real_addSystemAddress
(
*
args
,
**
kw
)
# Fake success
# Fake success
return
True
return
True
Bridg
e
.
_addSystemAddress
=
fake_addSystemAddress
Interfac
e
.
_addSystemAddress
=
fake_addSystemAddress
def
fake_getpwnam
(
user
):
def
fake_getpwnam
(
user
):
class
result
:
class
result
:
pw_uid
=
12345
pw_uid
=
12345
...
...
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