Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F3155381
fence_vbox.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
fence_vbox.py
View Options
#!@PYTHON@ -tt
# The Following Agent Has Been Tested On:
#
# VirtualBox 5.0.4 x64 on openSUSE 13.2
#
import
sys
import
re
import
time
import
atexit
sys
.
path
.
append
(
"@FENCEAGENTSLIBDIR@"
)
from
fencing
import
*
from
fencing
import
fail_usage
def
_invoke
(
conn
,
options
,
*
cmd
):
prefix
=
options
[
"--sudo-path"
]
+
" "
if
"--use-sudo"
in
options
else
""
conn
.
send_eol
(
prefix
+
options
[
"--vboxmanage-path"
]
+
" "
+
" "
.
join
(
cmd
))
conn
.
log_expect
(
options
[
"--command-prompt"
],
int
(
options
[
"--shell-timeout"
]))
def
get_outlets_status
(
conn
,
options
):
_domain_re
=
re
.
compile
(
r'^\"(.*)\" \{(.*)\}$'
)
result
=
{}
_invoke
(
conn
,
options
,
"list"
,
"vms"
)
for
line
in
conn
.
before
.
splitlines
():
# format: "<domain>" {<uuid>}
domain
=
_domain_re
.
search
(
line
.
strip
())
if
domain
is
not
None
:
result
[
domain
.
group
(
1
)]
=
(
domain
.
group
(
2
),
"off"
)
_invoke
(
conn
,
options
,
"list"
,
"runningvms"
)
for
line
in
conn
.
before
.
splitlines
():
# format: "<domain>" {<uuid>}
domain
=
_domain_re
.
search
(
line
.
strip
())
if
domain
is
not
None
:
result
[
domain
.
group
(
1
)]
=
(
domain
.
group
(
2
),
"on"
)
return
result
def
get_power_status
(
conn
,
options
):
outlets
=
get_outlets_status
(
conn
,
options
)
if
options
[
"--plug"
]
in
outlets
:
return
outlets
[
options
[
"--plug"
]][
1
]
right_uuid_line
=
[
outlets
[
o
]
for
o
in
outlets
.
keys
()
if
outlets
[
o
][
0
]
==
options
[
"--plug"
]]
if
len
(
right_uuid_line
):
return
right_uuid_line
[
0
][
1
]
if
"--missing-as-off"
in
options
:
return
"off"
fail_usage
(
"Failed: You have to enter existing name/UUID of virtual machine!"
)
def
set_power_status
(
conn
,
options
):
if
options
[
"--action"
]
==
"on"
:
_invoke
(
conn
,
options
,
"startvm"
,
'"
%s
"'
%
options
[
"--plug"
],
"--type"
,
"headless"
)
else
:
_invoke
(
conn
,
options
,
"controlvm"
,
'"
%s
"'
%
options
[
"--plug"
],
"poweroff"
)
def
define_new_opts
():
all_opt
[
"vboxmanage_path"
]
=
{
"getopt"
:
":"
,
"longopt"
:
"vboxmanage-path"
,
"help"
:
"--vboxmanage-path=[path] Path to VBoxManage on the host"
,
"required"
:
"0"
,
"shortdesc"
:
"Path to VBoxManage on the host"
,
"default"
:
"VBoxManage"
,
"order"
:
200
}
all_opt
[
"host_os"
]
=
{
"getopt"
:
":"
,
"longopt"
:
"host-os"
,
"help"
:
"--host-os=[os] Operating system of the host"
,
"required"
:
"0"
,
"shortdesc"
:
"Operating system of the host"
,
"choices"
:
[
"linux"
,
"macos"
,
"windows"
],
"default"
:
"linux"
,
"order"
:
200
}
def
main
():
device_opt
=
[
"ipaddr"
,
"login"
,
"passwd"
,
"cmd_prompt"
,
"secure"
,
"port"
,
"sudo"
,
"missing_as_off"
,
"vboxmanage_path"
,
"host_os"
]
define_new_opts
()
atexit
.
register
(
atexit_handler
)
all_opt
[
"secure"
][
"default"
]
=
"1"
all_opt
[
"cmd_prompt"
][
"default"
]
=
[
r"\[EXPECT\]#\ "
]
all_opt
[
"ssh_options"
][
"default"
]
=
"-t '/bin/bash -c
\"
"
+
r"PS1=\\[EXPECT\\]#\ "
+
"/bin/bash --noprofile --norc
\"
'"
opt
=
process_input
(
device_opt
)
opt
[
"logout_string"
]
=
"quit"
if
"--host-os"
in
opt
and
"--vboxmanage-path"
not
in
opt
:
if
opt
[
"--host-os"
]
==
"linux"
:
opt
[
"--vboxmanage-path"
]
=
"VBoxManage"
elif
opt
[
"--host-os"
]
==
"macos"
:
opt
[
"--vboxmanage-path"
]
=
"/Applications/VirtualBox.app/Contents/MacOS/VBoxManage"
opt
[
"logout_string"
]
=
"exit"
elif
opt
[
"--host-os"
]
==
"windows"
:
opt
[
"--vboxmanage-path"
]
=
"
\"
/Program Files/Oracle/VirtualBox/VBoxManage.exe"
opt
[
"--command-prompt"
]
=
""
opt
[
"--ssh-options"
]
=
""
options
=
check_input
(
device_opt
,
opt
)
options
[
"eol"
]
=
"
\n
"
docs
=
{}
docs
[
"shortdesc"
]
=
"Fence agent for VirtualBox"
docs
[
"longdesc"
]
=
"fence_vbox is an I/O Fencing agent
\
which can be used with the virtual machines managed by VirtualBox.
\
It logs via ssh to a dom0 where it runs VBoxManage to do all of
\
the work.
\
\n
.P
\n\
By default, vbox needs to log in as a user that is a member of the
\
vboxusers group. Also, you must allow ssh login in your sshd_config."
docs
[
"vendorurl"
]
=
"https://www.virtualbox.org/"
show_docs
(
options
,
docs
)
# Operate the fencing device
conn
=
fence_login
(
options
)
result
=
fence_action
(
conn
,
options
,
set_power_status
,
get_power_status
,
get_outlets_status
)
fence_logout
(
conn
,
opt
[
"logout_string"
])
sys
.
exit
(
result
)
if
__name__
==
"__main__"
:
main
()
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Wed, Feb 26, 10:00 PM (6 h, 30 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1447894
Default Alt Text
fence_vbox.py (4 KB)
Attached To
Mode
rF Fence Agents
Attached
Detach File
Event Timeline
Log In to Comment