git://git.onelab.eu
/
bootmanager.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
breakpoint messages always show up
[bootmanager.git]
/
source
/
utils.py
diff --git
a/source/utils.py
b/source/utils.py
index
4f96fd2
..
e0f3c72
100644
(file)
--- a/
source/utils.py
+++ b/
source/utils.py
@@
-1,8
+1,5
@@
#!/usr/bin/python
#
#!/usr/bin/python
#
-# $Id$
-# $URL$
-#
# Copyright (c) 2003 Intel Corporation
# All rights reserved.
#
# Copyright (c) 2003 Intel Corporation
# All rights reserved.
#
@@
-10,6
+7,8
@@
# All rights reserved.
# expected /proc/partitions format
# All rights reserved.
# expected /proc/partitions format
+from __future__ import print_function
+
import os, sys, shutil
import subprocess
import shlex
import os, sys, shutil
import subprocess
import shlex
@@
-20,64
+19,73
@@
import exceptions
from Exceptions import *
from Exceptions import *
+####################
+# the simplest way to debug is to let the node take off,
+# ssh into it as root using the debug ssh key in /etc/planetlab
+# then go to /tmp/source
+# edit this file locally to turn on breakpoints if needed, then run
+# ./BootManager.py
+####################
### handling breakpoints in the startup process
import select, sys, string
### handling breakpoints in the startup process
import select, sys, string
-### global debug settings
-# NOTE. when BREAKPOINT_MODE turns out enabled,
-# you have to attend the boot phase, that would hang otherwise
+### global debugging settings
# enabling this will cause the node to ask for breakpoint-mode at startup
# production code should read False/False
# enabling this will cause the node to ask for breakpoint-mode at startup
# production code should read False/False
-PROMPT_MODE
=
False
+PROMPT_MODE
=
False
# default for when prompt is turned off, or it's on but the timeout triggers
# default for when prompt is turned off, or it's on but the timeout triggers
-BREAKPOINT_MODE=False
-VERBOSE_MODE=False
-VERBOSE_MODE=True
+BREAKPOINT_MODE = False
+
+# verbose mode is just fine
+VERBOSE_MODE = True
# in seconds : if no input, proceed
# in seconds : if no input, proceed
-PROMPT_TIMEOUT
=
5
+PROMPT_TIMEOUT
=
5
-def prompt_for_breakpoint_mode
():
+def prompt_for_breakpoint_mode():
global BREAKPOINT_MODE
if PROMPT_MODE:
global BREAKPOINT_MODE
if PROMPT_MODE:
- default_answer
=
BREAKPOINT_MODE
- answer
=
''
+ default_answer
=
BREAKPOINT_MODE
+ answer
=
''
if BREAKPOINT_MODE:
if BREAKPOINT_MODE:
- display
=
"[y]/n"
+ display
=
"[y]/n"
else:
else:
- display
=
"y/[n]"
- sys.stdout.write ("Want to run in breakpoint mode ?
%s "%display
)
+ display
=
"y/[n]"
+ sys.stdout.write ("Want to run in breakpoint mode ?
{} ".format(display)
)
sys.stdout.flush()
sys.stdout.flush()
- r,
w,e = select.select ([sys.stdin],[],[],
PROMPT_TIMEOUT)
+ r,
w, e = select.select ([sys.stdin], [], [],
PROMPT_TIMEOUT)
if r:
answer = string.strip(sys.stdin.readline())
else:
if r:
answer = string.strip(sys.stdin.readline())
else:
- sys.stdout.write("\nTimed-out (
%d s)"%PROMPT_TIMEOUT
)
+ sys.stdout.write("\nTimed-out (
{}s)".format(PROMPT_TIMEOUT)
)
if answer:
if answer:
- BREAKPOINT_MODE = (
answer == "y" or answer == "Y")
+ BREAKPOINT_MODE = (answer == "y" or answer == "Y")
else:
BREAKPOINT_MODE = default_answer
else:
BREAKPOINT_MODE = default_answer
- label
=
"Off"
+ label
=
"Off"
if BREAKPOINT_MODE:
if BREAKPOINT_MODE:
- label
=
"On"
- sys.stdout.write("\nCurrent BREAKPOINT_MODE is
%s\n"%label
)
+ label
=
"On"
+ sys.stdout.write("\nCurrent BREAKPOINT_MODE is
{}\n".format(label)
)
def breakpoint (message, cmd = None):
if BREAKPOINT_MODE:
if cmd is None:
def breakpoint (message, cmd = None):
if BREAKPOINT_MODE:
if cmd is None:
- cmd
=
"/bin/sh"
- message
=message+
" -- Entering bash - type ^D to proceed"
+ cmd
=
"/bin/sh"
+ message
= message +
" -- Entering bash - type ^D to proceed"
- print
message
+ print
(message)
os.system(cmd)
os.system(cmd)
+ else:
+ print("Ignoring breakpoint (BREAKPOINT_MODE=False) : {}".format(message))
+
########################################
########################################
-def makedirs(
path
):
+def makedirs(
path
):
"""
from python docs for os.makedirs:
Throws an error exception if the leaf directory
"""
from python docs for os.makedirs:
Throws an error exception if the leaf directory
@@
-90,38
+98,37
@@
def makedirs( path ):
otherwise. Does not test the writability of said directory.
"""
try:
otherwise. Does not test the writability of said directory.
"""
try:
- os.makedirs(
path
)
+ os.makedirs(
path
)
except OSError:
pass
try:
except OSError:
pass
try:
- os.listdir(
path
)
+ os.listdir(
path
)
except OSError:
except OSError:
- raise BootManagerException
, "Unable to create directory tree: %s" % path
+ raise BootManagerException
("Unable to create directory tree: {}".format(path))
return 1
return 1
-def removedir(
path
):
+def removedir(
path
):
"""
remove a directory tree, return 1 if successful, a BootManagerException
if failure.
"""
try:
"""
remove a directory tree, return 1 if successful, a BootManagerException
if failure.
"""
try:
- os.listdir(
path
)
+ os.listdir(
path
)
except OSError:
return 1
try:
except OSError:
return 1
try:
- shutil.rmtree(
path
)
- except OSError
,
desc:
- raise BootManagerException
, "Unable to remove directory tree: %s" % path
+ shutil.rmtree(
path
)
+ except OSError
as
desc:
+ raise BootManagerException
("Unable to remove directory tree: {}".format(path))
return 1
return 1
-
-def sysexec( cmd, log= None, fsck = False ):
+def sysexec(cmd, log=None, fsck=False, shell=False):
"""
execute a system command, output the results to the logger
if log <> None
"""
execute a system command, output the results to the logger
if log <> None
@@
-130,26
+137,38
@@
def sysexec( cmd, log= None, fsck = False ):
0 if failed. A BootManagerException is raised if the command
was unable to execute or was interrupted by the user with Ctrl+C
"""
0 if failed. A BootManagerException is raised if the command
was unable to execute or was interrupted by the user with Ctrl+C
"""
- if VERBOSE_MODE:
- print ("sysexec >>> %s" % cmd)
-
try:
try:
- if cmd.__contains__(">"):
+ # Thierry - Jan. 6 2011
+ # would probably make sense to look for | here as well
+ # however this is fragile and hard to test thoroughly
+ # let the caller set 'shell' when that is desirable
+ if shell or cmd.__contains__(">"):
prog = subprocess.Popen(cmd, shell=True)
prog = subprocess.Popen(cmd, shell=True)
+ if log is not None:
+ log.write("sysexec (shell mode) >>> {}".format(cmd))
+ if VERBOSE_MODE:
+ print("sysexec (shell mode) >>> {}".format(cmd))
else:
prog = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
prog = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ if log is not None:
+ log.write("sysexec >>> {}\n".format(cmd))
+ if VERBOSE_MODE:
+ print("sysexec >>> {}".format(cmd))
except OSError:
except OSError:
- raise BootManagerException
, \
- "Unable to create instance of subprocess.Popen "
\
- "for command:
%s" % cmd
+ raise BootManagerException
(
+ "Unable to create instance of subprocess.Popen "
+ "for command:
{}".format(cmd))
try:
(stdoutdata, stderrdata) = prog.communicate()
except KeyboardInterrupt:
try:
(stdoutdata, stderrdata) = prog.communicate()
except KeyboardInterrupt:
- raise BootManagerException
, "Interrupted by user"
+ raise BootManagerException
("Interrupted by user")
+ # log stdout & stderr
if log is not None:
if log is not None:
- if stdoutdata is not None:
- log.write(stdoutdata)
+ if stdoutdata:
+ log.write("==========stdout\n" + stdoutdata)
+ if stderrdata:
+ log.write("==========stderr\n" + stderrdata)
returncode = prog.wait()
returncode = prog.wait()
@@
-164,16
+183,16
@@
def sysexec( cmd, log= None, fsck = False ):
# 32 - Fsck canceled by user request
# 128 - Shared library error
if returncode != 0 and returncode != 1:
# 32 - Fsck canceled by user request
# 128 - Shared library error
if returncode != 0 and returncode != 1:
- raise BootManagerException
, "Running %s failed (rc=%d)" % (cmd,returncode
)
+ raise BootManagerException
("Running {} failed (rc={})".format(cmd, returncode)
)
else:
if returncode != 0:
else:
if returncode != 0:
- raise BootManagerException
, "Running %s failed (rc=%d)" % (cmd,returncode
)
+ raise BootManagerException
("Running {} failed (rc={})".format(cmd, returncode)
)
prog = None
return 1
prog = None
return 1
-def sysexec_chroot(
path, cmd, log= None
):
+def sysexec_chroot(
path, cmd, log=None, shell=False
):
"""
same as sysexec, but inside a chroot
"""
"""
same as sysexec, but inside a chroot
"""
@@
-181,61
+200,61
@@
def sysexec_chroot( path, cmd, log= None ):
release = os.uname()[2]
# 2.6.12 kernels need this
if release[:5] == "2.6.1":
release = os.uname()[2]
# 2.6.12 kernels need this
if release[:5] == "2.6.1":
- library = "
%s/lib/libc-opendir-hack.so" % path
+ library = "
{}/lib/libc-opendir-hack.so".format(path)
if not os.path.exists(library):
shutil.copy("./libc-opendir-hack.so", library)
preload = "/bin/env LD_PRELOAD=/lib/libc-opendir-hack.so"
if not os.path.exists(library):
shutil.copy("./libc-opendir-hack.so", library)
preload = "/bin/env LD_PRELOAD=/lib/libc-opendir-hack.so"
- sysexec("chroot
%s %s %s" % (path, preload, cmd), log
)
+ sysexec("chroot
{} {} {}".format(path, preload, cmd), log, shell=shell
)
-def sysexec_chroot_noerr(
path, cmd, log= None
):
+def sysexec_chroot_noerr(
path, cmd, log=None, shell=False
):
"""
same as sysexec_chroot, but capture boot manager exceptions
"""
try:
"""
same as sysexec_chroot, but capture boot manager exceptions
"""
try:
- rc= 0
- rc
= syexec_chroot( cmd, log
)
- except BootManagerException
,
e:
+ rc
= 0
+ rc
= sysexec_chroot(cmd, log, shell=shell
)
+ except BootManagerException
as
e:
pass
return rc
pass
return rc
-def sysexec_noerr(
cmd, log= None
):
+def sysexec_noerr(
cmd, log=None, shell=False
):
"""
same as sysexec, but capture boot manager exceptions
"""
try:
"""
same as sysexec, but capture boot manager exceptions
"""
try:
- rc= 0
- rc
= sysexec( cmd, log
)
- except BootManagerException
,
e:
+ rc
= 0
+ rc
= sysexec(cmd, log, shell=shell
)
+ except BootManagerException
as
e:
pass
return rc
pass
return rc
-def chdir(
dir
):
+def chdir(
dir
):
"""
change to a directory, return 1 if successful, a BootManagerException if failure
"""
try:
"""
change to a directory, return 1 if successful, a BootManagerException if failure
"""
try:
- os.chdir(
dir
)
+ os.chdir(
dir
)
except OSError:
except OSError:
- raise BootManagerException
, "Unable to change to directory: %s" % dir
+ raise BootManagerException
("Unable to change to directory: {}".format(dir))
return 1
return 1
-def removefile(
filepath
):
+def removefile(
filepath
):
"""
removes a file, return 1 if successful, 0 if failure
"""
try:
"""
removes a file, return 1 if successful, 0 if failure
"""
try:
- os.remove(
filepath
)
+ os.remove(
filepath
)
except OSError:
except OSError:
- raise BootManagerException
, "Unable to remove file: %s" % filepath
+ raise BootManagerException
("Unable to remove file: {}".format(filepath))
return 1
return 1
@@
-244,9
+263,6
@@
def removefile( filepath ):
# from: http://forums.devshed.com/archive/t-51149/
# Ethernet-card-address-Through-Python-or-C
# from: http://forums.devshed.com/archive/t-51149/
# Ethernet-card-address-Through-Python-or-C
-def hexy(n):
- return "%02x" % (ord(n))
-
def get_mac_from_interface(ifname):
"""
given a device name, like eth0, return its mac_address.
def get_mac_from_interface(ifname):
"""
given a device name, like eth0, return its mac_address.
@@
-255,15
+271,14
@@
def get_mac_from_interface(ifname):
SIOCGIFHWADDR = 0x8927 # magic number
SIOCGIFHWADDR = 0x8927 # magic number
- s
=
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
+ s
=
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ifname = string.strip(ifname)
ifr = ifname + '\0'*(32-len(ifname))
try:
ifname = string.strip(ifname)
ifr = ifname + '\0'*(32-len(ifname))
try:
- r= fcntl.ioctl(s.fileno(),SIOCGIFHWADDR,ifr)
- addr = map(hexy,r[18:24])
- ret = (':'.join(map(str, addr)))
- except IOError, e:
+ r = fcntl.ioctl(s.fileno(), SIOCGIFHWADDR,ifr)
+ ret = ':'.join(["{:02x}".format(ord(n)) for n in r[18:24]])
+ except IOError as e:
ret = None
return ret
ret = None
return ret
@@
-280,7
+295,7
@@
def sha1_file(filename):
m = hashlib.sha1()
except:
import sha
m = hashlib.sha1()
except:
import sha
- m
=
sha.new()
+ m
=
sha.new()
f = file(filename, 'rb')
while True:
# 256 KB seems ideal for speed/memory tradeoff
f = file(filename, 'rb')
while True:
# 256 KB seems ideal for speed/memory tradeoff
@@
-297,4
+312,4
@@
def sha1_file(filename):
del block
return m.hexdigest()
except IOError:
del block
return m.hexdigest()
except IOError:
- raise BootManagerException
, "Cannot calculate SHA1 hash of %s" % filename
+ raise BootManagerException
("Cannot calculate SHA1 hash of {}".format(filename))