Se você não fizer algo especial, o vagrant é um wrapping para o virtualbox.
Você pode obter uma lista de caixas virtuais em execução:
vboxmanage list runningvms
e analise a saída para obter um vmname, faça:
VBoxManage controlvm <vmname> acpipowerbutton
É necessário fazer isso como o usuário que iniciou as VMs
Coloque um link para o script em /etc/rc0.d
e /etc/rc6.d
da mesma forma que outros softwares ( ls /etc/rc0.d /etc/rc6.d
).
Meu script:
# coding: utf-8
import os
import pwd
from subprocess import check_output, CalledProcessError
user_name = 'zelda'
def main():
os.chdir('/')
cmd = ["vboxmanage", "list", "runningvms"]
if os.getuid() == 0:
cmd = ['su', '-l', user_name, ] + cmd
try:
res = check_output(cmd)
except CalledProcessError:
return
for line in res.splitlines():
if not line.strip():
continue
# split on first char
vmname = line[1:].split(line[0])[0]
cmd = ["VBoxManage", "controlvm", vmname, "acpipowerbutton"]
if os.getuid() == 0:
cmd = ['su', '-l', user_name, ] + cmd
check_output(cmd)
if __name__ == "__main__":
main()