def set_loglevel(logger, level): logging.getLogger().setLevel(level) logger.setLevel(level) for mname, mlogger in logging.Logger.manager.loggerDict.iteritems(): if getattr(mlogger, 'setLevel', None): logger.debug('setting loglevel on %s' % mname) mlogger.setLevel(level) # handle paramiko separately, its logs at INFO way too liberally paramiko_logger = logging.getLogger("paramiko") if len(paramiko_logger.handlers) == 0: util.setup_logger("paramiko") if (level == logging.INFO): paramiko_logger.setLevel(logging.ERROR) logging.getLogger("paramiko.transport").setLevel(logging.ERROR) elif (level == logging.DEBUG): paramiko_logger.setLevel(logging.DEBUG) logging.getLogger("paramiko.transport").setLevel(logging.DEBUG)
from collections import defaultdict from cmd import Cmd from EC2 import EC2Config import paramiko from dustcluster import commands, lineterm from dustcluster import __version__ from dustcluster.cluster import ClusterCommandEngine from dustcluster.config import DustConfig import atexit import shlex from dustcluster import util logger = util.setup_logger( __name__ ) if os.environ.get('COLORTERM') or 'color' in os.environ.get('TERM'): colorama.Fore.CYAN = '\x1b[38;5;75m' colorama.Fore.GREEN = '\x1b[38;5;76m' class Console(Cmd): ''' command line tool to control a cloud cluster ''' dustintro = "Dust cluster shell, version %s. Type %s?%s for help." % (__version__, colorama.Fore.GREEN, colorama.Style.RESET_ALL) def __init__(self): util.intro() logger.setLevel(logging.INFO)
# ''' invoke commands or a shell over ssh sessions, demultiplex the ssh output ''' import getpass from threading import Thread import select import socket import sys import os, struct, fcntl from paramiko.py3compat import u import paramiko from dustcluster.util import setup_logger logger = setup_logger( __name__ ) # Once a session has been setup a program at the remote end can be # executed with SSH_MSG_CHANNEL_REQUEST, with string 'shell', 'exec', or # 'subsystem' for a default shell, single command, or subsystem. # Here we start a full interactive shell and invoke commands on it, # demultiplexing the output from all chanells onto stdout locally. # This allows us to execute arbitrarily interactive scripts. class ReceiveDemux(object): ''' receive demultiplexer for all open ssh interactive shells ''' def __init__(self, session_mgr): self.refresh_callback = None self.chans = {} # { chan : receive_buffer }
from dustcluster.config import DustConfig import shutil import unittest import mock import os from dustcluster import util logger = util.setup_logger(__name__) import logging class TestConfig(unittest.TestCase): testdirs = '/tmp/dusttest' def setUp(self): logger.setLevel(logging.DEBUG) logging.getLogger('dustcluster.config').setLevel(logging.DEBUG) DustConfig.dust_dir = self.testdirs @unittest.skip("port to v0.2") def test_first_use(self): if os.path.exists(self.testdirs) and self.testdirs.startswith('/tmp'): shutil.rmtree(self.testdirs) config = DustConfig() @unittest.skip("port to v0.2")
import re import fnmatch import os import yaml import colorama import sys from copy import deepcopy from dustcluster.lineterm import LineTerm from pkgutil import walk_packages from dustcluster import commands from dustcluster.config import DustConfig from dustcluster.util import setup_logger logger = setup_logger( __name__ ) import glob from dustcluster.EC2 import EC2Cloud class CommandState(object): ''' Commands can store arbitrary state here. ''' def __init__(self): self.global_state = {} # { command_name.var : value, where command_name can also be 'global_state' } def get(self, state_var):