Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
settingsd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
etersoft
settingsd
Commits
701cc7b8
Commit
701cc7b8
authored
Nov 01, 2010
by
Devaev Maxim
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Using closed variables instead private in classes, fixed small bugs in logger
parent
865e80a6
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
68 additions
and
67 deletions
+68
-67
fmod_statistics.py
plugins/functions/fmod_statistics.py
+12
-12
fmod_system_services.py
plugins/functions/fmod_system_services.py
+2
-2
settingsd-server.py
settingsd-server.py
+2
-3
application.py
settingsd/application.py
+22
-22
logger.py
settingsd/logger.py
+3
-1
server.py
settingsd/server.py
+18
-18
service.py
settingsd/service.py
+8
-8
service_decorators.py
settingsd/service_decorators.py
+1
-1
No files found.
plugins/functions/fmod_statistics.py
View file @
701cc7b8
...
@@ -93,14 +93,14 @@ class Cpu(service.FunctionObject) :
...
@@ -93,14 +93,14 @@ class Cpu(service.FunctionObject) :
def
__init__
(
self
,
cpu_name
,
object_path
,
service_object
=
None
)
:
def
__init__
(
self
,
cpu_name
,
object_path
,
service_object
=
None
)
:
service
.
FunctionObject
.
__init__
(
self
,
object_path
,
service_object
)
service
.
FunctionObject
.
__init__
(
self
,
object_path
,
service_object
)
self
.
_cpu_name
=
cpu_name
self
.
_
_
cpu_name
=
cpu_name
#####
#####
self
.
_previous_used
=
-
1
self
.
_
_
previous_used
=
-
1
self
.
_previous_full
=
-
1
self
.
_
_
previous_full
=
-
1
self
.
_cpuinfo_cache_dict
=
{}
self
.
_
_
cpuinfo_cache_dict
=
{}
#####
#####
...
@@ -145,13 +145,13 @@ class Cpu(service.FunctionObject) :
...
@@ -145,13 +145,13 @@ class Cpu(service.FunctionObject) :
used
=
cpu
+
system
+
nice
used
=
cpu
+
system
+
nice
full
=
cpu
+
nice
+
system
+
idle
full
=
cpu
+
nice
+
system
+
idle
if
self
.
_previous_full
==
-
1
:
if
self
.
_
_
previous_full
==
-
1
:
load_percent
=
0
load_percent
=
0
else
:
else
:
load_percent
=
(
100
*
(
used
-
self
.
_
previous_used
))
/
(
full
-
self
.
_previous_full
)
load_percent
=
(
100
*
(
used
-
self
.
_
_previous_used
))
/
(
full
-
self
.
_
_previous_full
)
self
.
_previous_used
=
used
self
.
_
_
previous_used
=
used
self
.
_previous_full
=
full
self
.
_
_
previous_full
=
full
return
load_percent
return
load_percent
return
-
1
return
-
1
...
@@ -160,13 +160,13 @@ class Cpu(service.FunctionObject) :
...
@@ -160,13 +160,13 @@ class Cpu(service.FunctionObject) :
### Private ###
### Private ###
def
cpuName
(
self
)
:
def
cpuName
(
self
)
:
return
self
.
_cpu_name
return
self
.
_
_
cpu_name
###
###
def
cpuinfoSection
(
self
,
section_name
,
use_cache_flag
=
False
)
:
def
cpuinfoSection
(
self
,
section_name
,
use_cache_flag
=
False
)
:
if
self
.
_cpuinfo_cache_dict
.
has_key
(
section_name
)
and
use_cache_flag
:
if
self
.
_
_
cpuinfo_cache_dict
.
has_key
(
section_name
)
and
use_cache_flag
:
return
self
.
_cpuinfo_cache_dict
[
section_name
]
return
self
.
_
_
cpuinfo_cache_dict
[
section_name
]
cpu_id
=
self
.
cpuName
()
.
split
(
"cpu"
)[
1
]
cpu_id
=
self
.
cpuName
()
.
split
(
"cpu"
)[
1
]
...
@@ -191,7 +191,7 @@ class Cpu(service.FunctionObject) :
...
@@ -191,7 +191,7 @@ class Cpu(service.FunctionObject) :
if
name
==
"processor"
and
value
!=
cpu_id
:
if
name
==
"processor"
and
value
!=
cpu_id
:
break
break
elif
name
==
section_name
:
elif
name
==
section_name
:
self
.
_cpuinfo_cache_dict
[
name
]
=
value
self
.
_
_
cpuinfo_cache_dict
[
name
]
=
value
return
value
return
value
return
""
return
""
...
...
plugins/functions/fmod_system_services.py
View file @
701cc7b8
...
@@ -33,7 +33,7 @@ class SystemService(service.FunctionObject) :
...
@@ -33,7 +33,7 @@ class SystemService(service.FunctionObject) :
def
__init__
(
self
,
system_service_name
,
object_path
,
service_object
=
None
)
:
def
__init__
(
self
,
system_service_name
,
object_path
,
service_object
=
None
)
:
service
.
FunctionObject
.
__init__
(
self
,
object_path
,
service_object
)
service
.
FunctionObject
.
__init__
(
self
,
object_path
,
service_object
)
self
.
_system_service_name
=
system_service_name
self
.
_
_
system_service_name
=
system_service_name
### DBus methods ###
### DBus methods ###
...
@@ -93,7 +93,7 @@ class SystemService(service.FunctionObject) :
...
@@ -93,7 +93,7 @@ class SystemService(service.FunctionObject) :
### Private ###
### Private ###
def
systemServiceName
(
self
)
:
def
systemServiceName
(
self
)
:
return
self
.
_system_service_name
return
self
.
_
_
system_service_name
###
###
...
...
settingsd-server.py
View file @
701cc7b8
...
@@ -29,7 +29,7 @@ def version() :
...
@@ -29,7 +29,7 @@ def version() :
print
"
%
s version
%
s"
%
(
const
.
MY_NAME
,
const
.
VERSION
)
print
"
%
s version
%
s"
%
(
const
.
MY_NAME
,
const
.
VERSION
)
##### Main #####
#
##### Main #####
if
__name__
==
"__main__"
:
if
__name__
==
"__main__"
:
log_level
=
None
log_level
=
None
use_syslog_flag
=
None
use_syslog_flag
=
None
...
@@ -94,6 +94,5 @@ if __name__ == "__main__" :
...
@@ -94,6 +94,5 @@ if __name__ == "__main__" :
#####
#####
app
=
application
.
Application
(
log_level
,
use_syslog_flag
,
bus_type
,
daemon_mode_flag
)
application
.
Application
(
log_level
,
use_syslog_flag
,
bus_type
,
daemon_mode_flag
)
.
run
()
app
.
run
()
settingsd/application.py
View file @
701cc7b8
...
@@ -20,21 +20,21 @@ class Application(object) :
...
@@ -20,21 +20,21 @@ class Application(object) :
#####
#####
self
.
_log_level
=
log_level
self
.
_
_
log_level
=
log_level
self
.
_use_syslog_flag
=
use_syslog_flag
self
.
_
_
use_syslog_flag
=
use_syslog_flag
self
.
_bus_type
=
bus_type
self
.
_
_
bus_type
=
bus_type
self
.
_daemon_mode_flag
=
daemon_mode_flag
self
.
_
_
daemon_mode_flag
=
daemon_mode_flag
#####
#####
self
.
_server
=
server
.
Server
()
self
.
_
_
server
=
server
.
Server
()
### Public ###
### Public ###
def
run
(
self
)
:
def
run
(
self
)
:
self
.
prepare
()
self
.
prepare
()
if
self
.
_daemon_mode_flag
:
if
self
.
_
_
daemon_mode_flag
:
logger
.
info
(
"Run server in daemon mode"
)
logger
.
info
(
"Run server in daemon mode"
)
self
.
runDaemon
()
self
.
runDaemon
()
else
:
else
:
...
@@ -42,7 +42,7 @@ class Application(object) :
...
@@ -42,7 +42,7 @@ class Application(object) :
self
.
runInteractive
()
self
.
runInteractive
()
def
server
(
self
)
:
def
server
(
self
)
:
return
self
.
_server
return
self
.
_
_
server
###
###
...
@@ -50,37 +50,37 @@ class Application(object) :
...
@@ -50,37 +50,37 @@ class Application(object) :
if
signum
!=
None
:
if
signum
!=
None
:
logger
.
info
(
"Recieved signal
%
d, closing..."
%
(
signum
))
logger
.
info
(
"Recieved signal
%
d, closing..."
%
(
signum
))
self
.
_server
.
closeServices
()
self
.
_
_
server
.
closeServices
()
self
.
_server
.
quitLoop
()
self
.
_
_
server
.
quitLoop
()
logger
.
info
(
"Closed"
)
logger
.
info
(
"Closed"
)
### Private ###
### Private ###
def
prepare
(
self
)
:
def
prepare
(
self
)
:
if
self
.
_use_syslog_flag
==
None
:
if
self
.
_
_
use_syslog_flag
==
None
:
if
self
.
_daemon_mode_flag
:
if
self
.
_
_
daemon_mode_flag
:
syslog
.
openlog
(
const
.
MY_NAME
,
syslog
.
LOG_PID
,
syslog
.
LOG_DAEMON
)
syslog
.
openlog
(
const
.
MY_NAME
,
syslog
.
LOG_PID
,
syslog
.
LOG_DAEMON
)
config
.
setValue
(
config
.
RUNTIME_SECTION
,
"use_syslog"
,
True
)
config
.
setValue
(
config
.
RUNTIME_SECTION
,
"use_syslog"
,
True
)
logger
.
verbose
(
"Logger used syslog"
)
logger
.
verbose
(
"Logger used syslog"
)
else
:
else
:
syslog
.
openlog
(
const
.
MY_NAME
,
syslog
.
LOG_PID
,
(
syslog
.
LOG_DAEMON
if
self
.
_daemon_mode_flag
else
syslog
.
LOG_USER
))
syslog
.
openlog
(
const
.
MY_NAME
,
syslog
.
LOG_PID
,
(
syslog
.
LOG_DAEMON
if
self
.
_
_
daemon_mode_flag
else
syslog
.
LOG_USER
))
config
.
setValue
(
config
.
RUNTIME_SECTION
,
"use_syslog"
,
True
)
config
.
setValue
(
config
.
RUNTIME_SECTION
,
"use_syslog"
,
True
)
logger
.
verbose
(
"Logger used syslog"
)
logger
.
verbose
(
"Logger used syslog"
)
try
:
try
:
self
.
_server
.
loadServerConfigs
()
self
.
_
_
server
.
loadServerConfigs
()
except
:
except
:
logger
.
error
(
"Initialization error"
)
logger
.
error
(
"Initialization error"
)
logger
.
attachException
()
logger
.
attachException
()
raise
raise
logger
.
verbose
(
"Preparing complete"
)
logger
.
verbose
(
"Preparing complete"
)
if
self
.
_bus_type
!=
None
:
if
self
.
_
_
bus_type
!=
None
:
config
.
setValue
(
config
.
APPLICATION_SECTION
,
"bus_type"
,
self
.
_bus_type
)
config
.
setValue
(
config
.
APPLICATION_SECTION
,
"bus_type"
,
self
.
_
_
bus_type
)
if
self
.
_log_level
!=
None
:
if
self
.
_
_
log_level
!=
None
:
config
.
setValue
(
config
.
APPLICATION_SECTION
,
"log_level"
,
self
.
_log_level
)
config
.
setValue
(
config
.
APPLICATION_SECTION
,
"log_level"
,
self
.
_
_
log_level
)
config
.
setValue
(
config
.
RUNTIME_SECTION
,
"application"
,
self
)
config
.
setValue
(
config
.
RUNTIME_SECTION
,
"application"
,
self
)
...
@@ -88,10 +88,10 @@ class Application(object) :
...
@@ -88,10 +88,10 @@ class Application(object) :
def
runInteractive
(
self
)
:
def
runInteractive
(
self
)
:
try
:
try
:
self
.
_server
.
loadModules
()
self
.
_
_
server
.
loadModules
()
self
.
_server
.
loadServicesConfigs
()
self
.
_
_
server
.
loadServicesConfigs
()
self
.
_server
.
initBus
()
self
.
_
_
server
.
initBus
()
self
.
_server
.
initServices
()
self
.
_
_
server
.
initServices
()
logger
.
info
(
"Initialized"
)
logger
.
info
(
"Initialized"
)
except
:
except
:
logger
.
error
(
"Initialization error"
)
logger
.
error
(
"Initialization error"
)
...
@@ -106,7 +106,7 @@ class Application(object) :
...
@@ -106,7 +106,7 @@ class Application(object) :
logger
.
attachException
()
logger
.
attachException
()
try
:
try
:
self
.
_server
.
runLoop
()
self
.
_
_
server
.
runLoop
()
except
(
SystemExit
,
KeyboardInterrupt
)
:
except
(
SystemExit
,
KeyboardInterrupt
)
:
self
.
quit
()
self
.
quit
()
except
:
except
:
...
...
settingsd/logger.py
View file @
701cc7b8
...
@@ -49,7 +49,7 @@ class UnknownMessageType(Exception) :
...
@@ -49,7 +49,7 @@ class UnknownMessageType(Exception) :
##### Private methods #####
##### Private methods #####
def
log
(
message_type
,
message
)
:
def
log
(
message_type
,
message
)
:
if
not
message_type
in
ALL_MESSAGES_LIST
:
if
not
message_type
in
ALL_MESSAGES_LIST
:
raise
UnknownMessageType
(
"Message type
\"
%
d
\"
not in list
%
s"
%
(
message_type
,
ALL_MESSAGES_LIST
))
raise
UnknownMessageType
(
"Message type
\"
%
s
\"
not in list
%
s"
%
(
str
(
message_type
)
,
ALL_MESSAGES_LIST
))
if
message_type
[
2
]
<=
config
.
value
(
config
.
APPLICATION_SECTION
,
"log_level"
)
:
if
message_type
[
2
]
<=
config
.
value
(
config
.
APPLICATION_SECTION
,
"log_level"
)
:
if
MODULE_CALLER_NAME_TAG
in
message
:
if
MODULE_CALLER_NAME_TAG
in
message
:
...
@@ -85,6 +85,8 @@ def verbose(message) :
...
@@ -85,6 +85,8 @@ def verbose(message) :
def
debug
(
message
)
:
def
debug
(
message
)
:
log
(
DEBUG_MESSAGE
,
message
)
log
(
DEBUG_MESSAGE
,
message
)
###
def
attachException
(
message_type
=
ERROR_MESSAGE
)
:
def
attachException
(
message_type
=
ERROR_MESSAGE
)
:
for
line
in
traceback
.
format_exc
()
.
splitlines
()
:
for
line
in
traceback
.
format_exc
()
.
splitlines
()
:
log
(
message_type
,
line
)
log
(
message_type
,
line
)
...
...
settingsd/server.py
View file @
701cc7b8
...
@@ -21,20 +21,20 @@ class Server(object) :
...
@@ -21,20 +21,20 @@ class Server(object) :
#####
#####
self
.
_modules_list
=
[]
self
.
_
_
modules_list
=
[]
self
.
_services_dict
=
{}
self
.
_
_
services_dict
=
{}
self
.
_main_loop
=
gobject
.
MainLoop
()
self
.
_
_
main_loop
=
gobject
.
MainLoop
()
### Public ###
### Public ###
def
runLoop
(
self
)
:
def
runLoop
(
self
)
:
logger
.
verbose
(
"Running GObject loop..."
)
logger
.
verbose
(
"Running GObject loop..."
)
self
.
_main_loop
.
run
()
self
.
_
_
main_loop
.
run
()
def
quitLoop
(
self
)
:
def
quitLoop
(
self
)
:
self
.
_main_loop
.
quit
()
self
.
_
_
main_loop
.
quit
()
logger
.
verbose
(
"GObject loop closed"
)
logger
.
verbose
(
"GObject loop closed"
)
###
###
...
@@ -48,14 +48,14 @@ class Server(object) :
...
@@ -48,14 +48,14 @@ class Server(object) :
if
item
.
endswith
(
".py"
)
and
not
item
.
startswith
(
"."
)
]
:
if
item
.
endswith
(
".py"
)
and
not
item
.
startswith
(
"."
)
]
:
try
:
try
:
self
.
_modules_list
.
append
(
__import__
(
module_name
,
globals
(),
locals
(),
[
""
]))
self
.
_
_
modules_list
.
append
(
__import__
(
module_name
,
globals
(),
locals
(),
[
""
]))
except
:
except
:
logger
.
error
(
"Import error on module
\"
%
s
\"
"
%
(
module_name
))
logger
.
error
(
"Import error on module
\"
%
s
\"
"
%
(
module_name
))
logger
.
attachException
()
logger
.
attachException
()
continue
continue
self
.
_
services_dict
[
self
.
_modules_list
[
-
1
]
.
Service
.
serviceName
()]
=
{
self
.
_
_services_dict
[
self
.
_
_modules_list
[
-
1
]
.
Service
.
serviceName
()]
=
{
"service_class"
:
self
.
_modules_list
[
-
1
]
.
Service
,
"service_class"
:
self
.
_
_
modules_list
[
-
1
]
.
Service
,
"service"
:
None
"service"
:
None
}
}
...
@@ -69,8 +69,8 @@ class Server(object) :
...
@@ -69,8 +69,8 @@ class Server(object) :
config
.
loadConfigs
(
only_sections_list
=
(
config
.
APPLICATION_SECTION
,))
config
.
loadConfigs
(
only_sections_list
=
(
config
.
APPLICATION_SECTION
,))
def
loadServicesConfigs
(
self
)
:
def
loadServicesConfigs
(
self
)
:
for
service_name
in
self
.
_services_dict
.
keys
()
:
for
service_name
in
self
.
_
_
services_dict
.
keys
()
:
service_options_list
=
list
(
self
.
_services_dict
[
service_name
][
"service_class"
]
.
options
())
service_options_list
=
list
(
self
.
_
_
services_dict
[
service_name
][
"service_class"
]
.
options
())
service_options_list
.
append
((
service_name
,
"enabled"
,
"no"
,
validators
.
validBool
))
service_options_list
.
append
((
service_name
,
"enabled"
,
"no"
,
validators
.
validBool
))
for
service_options_list_item
in
service_options_list
:
for
service_options_list_item
in
service_options_list
:
...
@@ -101,24 +101,24 @@ class Server(object) :
...
@@ -101,24 +101,24 @@ class Server(object) :
###
###
def
initServices
(
self
)
:
def
initServices
(
self
)
:
for
service_name
in
self
.
_services_dict
.
keys
()
:
for
service_name
in
self
.
_
_
services_dict
.
keys
()
:
if
config
.
value
(
service_name
,
"enabled"
)
:
if
config
.
value
(
service_name
,
"enabled"
)
:
try
:
try
:
self
.
_
services_dict
[
service_name
][
"service"
]
=
self
.
_services_dict
[
service_name
][
"service_class"
]()
self
.
_
_services_dict
[
service_name
][
"service"
]
=
self
.
_
_services_dict
[
service_name
][
"service_class"
]()
self
.
_services_dict
[
service_name
][
"service"
]
.
initService
()
self
.
_
_
services_dict
[
service_name
][
"service"
]
.
initService
()
except
:
except
:
logger
.
error
(
"Cannot initialize service
\"
%
s
\"
"
%
(
service_name
))
logger
.
error
(
"Cannot initialize service
\"
%
s
\"
"
%
(
service_name
))
logger
.
attachException
()
logger
.
attachException
()
logger
.
verbose
(
"Initialized service:
%
s"
%
(
service_name
))
logger
.
verbose
(
"Initialized service:
%
s"
%
(
service_name
))
def
closeServices
(
self
)
:
def
closeServices
(
self
)
:
for
service_name
in
self
.
_services_dict
.
keys
()
:
for
service_name
in
self
.
_
_
services_dict
.
keys
()
:
if
self
.
_services_dict
[
service_name
][
"service"
]
!=
None
:
if
self
.
_
_
services_dict
[
service_name
][
"service"
]
!=
None
:
try
:
try
:
self
.
_services_dict
[
service_name
][
"service"
]
.
closeService
()
self
.
_
_
services_dict
[
service_name
][
"service"
]
.
closeService
()
del
self
.
_services_dict
[
service_name
][
"service"
]
del
self
.
_
_
services_dict
[
service_name
][
"service"
]
except
:
except
:
logger
.
error
(
"Cannot close service
\"
%
s
\"
"
%
(
service_name
))
logger
.
error
(
"Cannot close service
\"
%
s
\"
"
%
(
service_name
))
logger
.
attachException
()
logger
.
attachException
()
self
.
_services_dict
[
service_name
][
"service"
]
=
None
self
.
_
_
services_dict
[
service_name
][
"service"
]
=
None
settingsd/service.py
View file @
701cc7b8
...
@@ -55,12 +55,12 @@ class CustomObject(dbus.service.Object) :
...
@@ -55,12 +55,12 @@ class CustomObject(dbus.service.Object) :
def
__init__
(
self
,
object_path
,
service_object
=
None
)
:
def
__init__
(
self
,
object_path
,
service_object
=
None
)
:
dbus
.
service
.
Object
.
__init__
(
self
,
config
.
value
(
config
.
RUNTIME_SECTION
,
"bus_name"
),
object_path
)
dbus
.
service
.
Object
.
__init__
(
self
,
config
.
value
(
config
.
RUNTIME_SECTION
,
"bus_name"
),
object_path
)
self
.
_object_path
=
object_path
self
.
_
_
object_path
=
object_path
self
.
_service_object
=
service_object
self
.
_
_
service_object
=
service_object
#####
#####
self
.
_shared
=
None
self
.
_
_
shared
=
None
### Public ###
### Public ###
...
@@ -82,21 +82,21 @@ class CustomObject(dbus.service.Object) :
...
@@ -82,21 +82,21 @@ class CustomObject(dbus.service.Object) :
return
build_path
(
self
.
shared
())
return
build_path
(
self
.
shared
())
def
objectPath
(
self
)
:
def
objectPath
(
self
)
:
return
self
.
_object_path
return
self
.
_
_
object_path
###
###
def
setService
(
self
,
service_object
)
:
def
setService
(
self
,
service_object
)
:
self
.
_service_object
=
service_object
self
.
_
_
service_object
=
service_object
def
service
(
self
)
:
def
service
(
self
)
:
return
self
.
_service_object
return
self
.
_
_
service_object
def
setShared
(
self
,
shared
)
:
def
setShared
(
self
,
shared
)
:
self
.
_shared
=
shared
self
.
_
_
shared
=
shared
def
shared
(
self
)
:
def
shared
(
self
)
:
return
self
.
_shared
return
self
.
_
_
shared
###
###
...
...
settingsd/service_decorators.py
View file @
701cc7b8
...
@@ -18,7 +18,7 @@ def tracer(function, statics_list=[0]) :
...
@@ -18,7 +18,7 @@ def tracer(function, statics_list=[0]) :
logger
.
debug
(
"
%
s
%
s
%
s::
%
s"
%
(
" "
*
statics_list
[
0
],
logger
.
debug
(
"
%
s
%
s
%
s::
%
s"
%
(
" "
*
statics_list
[
0
],
str
((
function
.
__dict__
.
has_key
(
"_dbus_is_method"
)
and
"Called method"
)
or
str
((
function
.
__dict__
.
has_key
(
"_dbus_is_method"
)
and
"Called method"
)
or
(
function
.
__dict__
.
has_key
(
"_dbus_is_signal"
)
and
"Emited signal"
)),
(
function
.
__dict__
.
has_key
(
"_dbus_is_signal"
)
and
"Emited signal"
)),
self
.
_object_path
,
dbus_tools
.
joinMethod
(
function
.
_dbus_interface
,
function
.
__name__
)
))
self
.
_
_
object_path
,
dbus_tools
.
joinMethod
(
function
.
_dbus_interface
,
function
.
__name__
)
))
statics_list
[
0
]
+=
1
statics_list
[
0
]
+=
1
try
:
try
:
...
...
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