import base64
import errno
+import hashlib
+import logging
import os
import os.path
+import re
import select
import signal
import socket
import subprocess
import time
-import traceback
-import re
import tempfile
-import hashlib
-TRACE = os.environ.get("NEPI_TRACE", "false").lower() in ("true", "1", "on")
+
+logger = logging.getLogger("sshfuncs")
+
+def log(msg, level, out = None, err = None):
+ if out:
+ msg += " - OUT: %s " % out
+
+ if err:
+ msg += " - ERROR: %s " % err
+
+ logger.log(level, msg)
+
if hasattr(os, "devnull"):
DEV_NULL = os.devnull
env = None,
tty = False,
timeout = None,
- retry = 0,
+ retry = 3,
err_on_timeout = True,
connect_timeout = 30,
persistent = True,
args.append(command)
- for x in xrange(retry or 3):
+ for x in xrange(retry):
# connects to the remote host and starts a remote connection
- proc = subprocess.Popen(args,
+ proc = subprocess.Popen(args,
+ env = env,
stdout = subprocess.PIPE,
stdin = subprocess.PIPE,
stderr = subprocess.PIPE)
try:
out, err = _communicate(proc, stdin, timeout, err_on_timeout)
- if TRACE:
- print "COMMAND host %s, command %s, out %s, error %s" % (host, " ".join(args), out, err)
+ msg = " rexec - host %s - command %s " % (host, " ".join(args))
+ log(msg, logging.DEBUG, out, err)
if proc.poll():
+ skip = False
+
if err.strip().startswith('ssh: ') or err.strip().startswith('mux_client_hello_exchange: '):
# SSH error, can safely retry
- continue
+ skip = True
elif retry:
# Probably timed out or plain failed but can retry
+ skip = True
+
+ if skip:
+ t = x*2
+ msg = "SLEEPING %d ... ATEMPT %d - host %s - command %s " % (
+ t, x, host, " ".join(args))
+ log(msg, logging.DEBUG)
+
+ time.sleep(t)
continue
break
except RuntimeError, e:
- if TRACE:
- print "EXCEPTION host %s, command %s, out %s, error %s, exception TIMEOUT -> %s" % (
- host, " ".join(args), out, err, e.args)
+ msg = " rexec EXCEPTION - host %s - command %s - TIMEOUT -> %s" % (host, " ".join(args), e.args)
+ log(msg, logging.DEBUG, out, err)
if retry <= 0:
raise
in which case it is advised that the destination be a folder.
"""
- if TRACE:
- print "scp", source, dest
+ msg = " rcopy - scp %s %s " % (source, dest)
+ log(msg, logging.DEBUG)
if isinstance(source, file) and source.tell() == 0:
source = source.name