On Tue, May 25, 2010 at 5:18 PM, Michael Hanselmann <[email protected]> wrote:
> Instead of passing around many variables for building the executed
> command, they're now kept as instance variables.
>
> Signed-off-by: Michael Hanselmann <[email protected]>
> ---
>  daemons/import-export |  208 
> ++++++++++++++++++++++++++-----------------------
>  1 files changed, 109 insertions(+), 99 deletions(-)
>
> diff --git a/daemons/import-export b/daemons/import-export
> index 134b3e9..7e9b265 100755
> --- a/daemons/import-export
> +++ b/daemons/import-export
> @@ -291,138 +291,148 @@ def ProcessOutput(line, status_file, logger, socat):
>   status_file.Update(force_update)
>
>
> -def GetBashCommand(cmd):
> -  """Prepares a command to be run in Bash.
> +class CommandBuilder(object):
> +  def __init__(self, mode, opts, socat_stderr_fd):
> +    """Initializes this class.
>
> -  """
> -  return ["bash", "-o", "errexit", "-o", "pipefail", "-c", cmd]
> +   �...@param mode: Daemon mode (import or export)
> +   �...@param opts: Options object
> +   �...@type socat_stderr_fd: int
> +   �...@param socat_stderr_fd: File descriptor socat should write its stderr 
> to
>
> +    """
> +    self._opts = opts
> +    self._mode = mode

Could you check that the mode is in the valid set of modes here?
assert mode in constants.IEMS or something similar :)

> +    self._socat_stderr_fd = socat_stderr_fd
>
> -def GetSocatCommand(mode):
> -  """Returns the socat command.
> + �...@staticmethod
> +  def GetBashCommand(cmd):
> +    """Prepares a command to be run in Bash.
>
> -  """
> -  common_addr_opts = SOCAT_TCP_OPTS + SOCAT_OPENSSL_OPTS + [
> -    "key=%s" % options.key,
> -    "cert=%s" % options.cert,
> -    "cafile=%s" % options.ca,
> -    ]
> -
> -  if options.bind is not None:
> -    common_addr_opts.append("bind=%s" % options.bind)
> -
> -  if mode == constants.IEM_IMPORT:
> -    if options.port is None:
> -      port = 0
> -    else:
> -      port = options.port
> +    """
> +    return ["bash", "-o", "errexit", "-o", "pipefail", "-c", cmd]
>
> -    addr1 = [
> -      "OPENSSL-LISTEN:%s" % port,
> -      "reuseaddr",
> +  def _GetSocatCommand(self):
> +    """Returns the socat command.
>
> -      # Retry to listen if connection wasn't established successfully, up to
> -      # 100 times a second. Note that this still leaves room for DoS attacks.
> -      "forever",
> -      "intervall=0.01",
> -      ] + common_addr_opts
> -    addr2 = ["stdout"]
> +    """
> +    common_addr_opts = SOCAT_TCP_OPTS + SOCAT_OPENSSL_OPTS + [
> +      "key=%s" % self._opts.key,
> +      "cert=%s" % self._opts.cert,
> +      "cafile=%s" % self._opts.ca,
> +      ]
> +
> +    if self._opts.bind is not None:
> +      common_addr_opts.append("bind=%s" % self._opts.bind)
> +
> +    if self._mode == constants.IEM_IMPORT:
> +      if self._opts.port is None:
> +        port = 0
> +      else:
> +        port = self._opts.port
>
> -  elif mode == constants.IEM_EXPORT:
> -    addr1 = ["stdin"]
> -    addr2 = [
> -      "OPENSSL:%s:%s" % (options.host, options.port),
> +      addr1 = [
> +        "OPENSSL-LISTEN:%s" % port,
> +        "reuseaddr",
>
> -      # How long to wait per connection attempt
> -      "connect-timeout=%s" % options.connect_timeout,
> +        # Retry to listen if connection wasn't established successfully, up 
> to
> +        # 100 times a second. Note that this still leaves room for DoS 
> attacks.
> +        "forever",
> +        "intervall=0.01",
> +        ] + common_addr_opts
> +      addr2 = ["stdout"]
>
> -      # Retry a few times before giving up to connect (once per second)
> -      "retry=%s" % options.connect_retries,
> -      "intervall=1",
> -      ] + common_addr_opts
> +    elif self._mode == constants.IEM_EXPORT:
> +      addr1 = ["stdin"]
> +      addr2 = [
> +        "OPENSSL:%s:%s" % (self._opts.host, self._opts.port),
>
> -  else:
> -    raise Error("Invalid mode")
> +        # How long to wait per connection attempt
> +        "connect-timeout=%s" % self._opts.connect_timeout,
>
> -  for i in [addr1, addr2]:
> -    for value in i:
> -      if "," in value:
> -        raise Error("Comma not allowed in socat option value: %r" % value)
> +        # Retry a few times before giving up to connect (once per second)
> +        "retry=%s" % self._opts.connect_retries,
> +        "intervall=1",
> +        ] + common_addr_opts
>
> -  return [
> -    constants.SOCAT_PATH,
> +    else:
> +      raise Error("Invalid mode '%s'" % self._mode)
>
> -    # Log to stderr
> -    "-ls",
> +    for i in [addr1, addr2]:
> +      for value in i:
> +        if "," in value:
> +          raise Error("Comma not allowed in socat option value: %r" % value)
>

Wouldn't it be better to check for commas in the host/port arguments
that go forming the addresses, rather than now after we built them?

> -    # Log level
> -    "-d", "-d",
> +    return [
> +      constants.SOCAT_PATH,
>
> -    # Buffer size
> -    "-b%s" % SOCAT_BUFSIZE,
> +      # Log to stderr
> +      "-ls",
>
> -    # Unidirectional mode, the first address is only used for reading, and 
> the
> -    # second address is only used for writing
> -    "-u",
> +      # Log level
> +      "-d", "-d",
>
> -    ",".join(addr1), ",".join(addr2)
> -    ]
> +      # Buffer size
> +      "-b%s" % SOCAT_BUFSIZE,
>
> +      # Unidirectional mode, the first address is only used for reading, and 
> the
> +      # second address is only used for writing
> +      "-u",
>
> -def GetTransportCommand(mode, socat_stderr_fd):
> -  """Returns the command for the transport part of the daemon.
> +      ",".join(addr1), ",".join(addr2)
> +      ]
>
> - �...@param mode: Daemon mode (import or export)
> - �...@type socat_stderr_fd: int
> - �...@param socat_stderr_fd: File descriptor socat should write its stderr to
> +  def _GetTransportCommand(self):
> +    """Returns the command for the transport part of the daemon.
>
> -  """
> -  socat_cmd = ("%s 2>&%d" %
> -               (utils.ShellQuoteArgs(GetSocatCommand(mode)),
> -                socat_stderr_fd))
> +    """
> +    socat_cmd = ("%s 2>&%d" %
> +                 (utils.ShellQuoteArgs(self._GetSocatCommand()),
> +                  self._socat_stderr_fd))
>
> -  compr = options.compress
> +    compr = self._opts.compress
>
> -  assert compr in constants.IEC_ALL
> +    assert compr in constants.IEC_ALL
>
> -  if mode == constants.IEM_IMPORT:
> -    if compr == constants.IEC_GZIP:
> -      transport_cmd = "%s | gunzip -c" % socat_cmd
> -    else:
> -      transport_cmd = socat_cmd
> -  elif mode == constants.IEM_EXPORT:
> -    if compr == constants.IEC_GZIP:
> -      transport_cmd = "gzip -c | %s" % socat_cmd
> +    if self._mode == constants.IEM_IMPORT:
> +      if compr == constants.IEC_GZIP:
> +        transport_cmd = "%s | gunzip -c" % socat_cmd
> +      else:
> +        transport_cmd = socat_cmd
> +    elif self._mode == constants.IEM_EXPORT:
> +      if compr == constants.IEC_GZIP:
> +        transport_cmd = "gzip -c | %s" % socat_cmd
> +      else:
> +        transport_cmd = socat_cmd
>     else:
> -      transport_cmd = socat_cmd
> -  else:
> -    raise Error("Invalid mode")
> +      raise Error("Invalid mode '%s'" % self._mode)
>
> -  # TODO: Use "dd" to measure processed data (allows to give an ETA)
> +    # TODO: Use "dd" to measure processed data (allows to give an ETA)
>
> -  # TODO: Run transport as separate user
> -  # The transport uses its own shell to simplify running it as a separate 
> user
> -  # in the future.
> -  return GetBashCommand(transport_cmd)
> +    # TODO: Run transport as separate user
> +    # The transport uses its own shell to simplify running it as a separate 
> user
> +    # in the future.
> +    return self.GetBashCommand(transport_cmd)
>
> +  def GetCommand(self):
> +    """Returns the complete child process command.
>
> -def GetCommand(mode, socat_stderr_fd):
> -  """Returns the complete child process command.
> +    """
> +    transport_cmd = self._GetTransportCommand()
>
> -  """
> -  buf = StringIO()
> +    buf = StringIO()
>
> -  if options.cmd_prefix:
> -    buf.write(options.cmd_prefix)
> -    buf.write(" ")
> +    if self._opts.cmd_prefix:
> +      buf.write(self._opts.cmd_prefix)
> +      buf.write(" ")
>
> -  buf.write(utils.ShellQuoteArgs(GetTransportCommand(mode, socat_stderr_fd)))
> +    buf.write(utils.ShellQuoteArgs(transport_cmd))
>
> -  if options.cmd_suffix:
> -    buf.write(" ")
> -    buf.write(options.cmd_suffix)
> +    if self._opts.cmd_suffix:
> +      buf.write(" ")
> +      buf.write(self._opts.cmd_suffix)
>
> -  return GetBashCommand(buf.getvalue())
> +    return self.GetBashCommand(buf.getvalue())
>
>
>  def ProcessChildIO(child, socat_stderr_read_fd, status_file, child_logger,
> @@ -663,7 +673,7 @@ def main():
>       (socat_stderr_read_fd, socat_stderr_write_fd) = os.pipe()
>
>       # Get child process command
> -      cmd = GetCommand(mode, socat_stderr_write_fd)
> +      cmd = CommandBuilder(mode, options, socat_stderr_write_fd).GetCommand()
>

LGTM, for the rest

Thanks,

Guido

Reply via email to