← Back to team overview

cloud-init-dev team mailing list archive

[Merge] lp:~harlowja/cloud-init/pylint-join-cleanup into lp:cloud-init

 

Joshua Harlow has proposed merging lp:~harlowja/cloud-init/pylint-join-cleanup into lp:cloud-init.

Requested reviews:
  cloud init development team (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~harlowja/cloud-init/pylint-join-cleanup/+merge/131765
-- 
https://code.launchpad.net/~harlowja/cloud-init/pylint-join-cleanup/+merge/131765
Your team cloud init development team is requested to review the proposed merge of lp:~harlowja/cloud-init/pylint-join-cleanup into lp:cloud-init.
=== modified file 'Makefile'
--- Makefile	2012-08-09 17:42:55 +0000
+++ Makefile	2012-10-28 02:29:21 +0000
@@ -1,20 +1,20 @@
 CWD=$(shell pwd)
-PY_FILES=$(shell find cloudinit bin tests tools -name "*.py")
+PY_FILES=$(shell find cloudinit bin tests tools -type f -name "*.py")
 PY_FILES+="bin/cloud-init"
 
 all: test
 
 pep8:
-	$(CWD)/tools/run-pep8 $(PY_FILES)
+	@$(CWD)/tools/run-pep8 $(PY_FILES)
 
 pylint:
-	$(CWD)/tools/run-pylint $(PY_FILES)
+	@$(CWD)/tools/run-pylint $(PY_FILES)
 
 pyflakes:
 	pyflakes $(PY_FILES)
 
 test:
-	nosetests $(noseopts) tests/unittests/
+	@nosetests $(noseopts) tests/
 
 2to3:
 	2to3 $(PY_FILES)

=== modified file 'cloudinit/config/cc_apt_pipelining.py'
--- cloudinit/config/cc_apt_pipelining.py	2012-08-22 18:12:32 +0000
+++ cloudinit/config/cc_apt_pipelining.py	2012-10-28 02:29:21 +0000
@@ -34,26 +34,24 @@
 # on TCP connections - otherwise data corruption will occur.
 
 
-def handle(_name, cfg, cloud, log, _args):
+def handle(_name, cfg, _cloud, log, _args):
 
     apt_pipe_value = util.get_cfg_option_str(cfg, "apt_pipelining", False)
     apt_pipe_value_s = str(apt_pipe_value).lower().strip()
 
     if apt_pipe_value_s == "false":
-        write_apt_snippet(cloud, "0", log, DEFAULT_FILE)
+        write_apt_snippet("0", log, DEFAULT_FILE)
     elif apt_pipe_value_s in ("none", "unchanged", "os"):
         return
     elif apt_pipe_value_s in [str(b) for b in xrange(0, 6)]:
-        write_apt_snippet(cloud, apt_pipe_value_s, log, DEFAULT_FILE)
+        write_apt_snippet(apt_pipe_value_s, log, DEFAULT_FILE)
     else:
         log.warn("Invalid option for apt_pipeling: %s", apt_pipe_value)
 
 
-def write_apt_snippet(cloud, setting, log, f_name):
+def write_apt_snippet(setting, log, f_name):
     """Writes f_name with apt pipeline depth 'setting'."""
 
     file_contents = APT_PIPE_TPL % (setting)
-
-    util.write_file(cloud.paths.join(False, f_name), file_contents)
-
+    util.write_file(f_name, file_contents)
     log.debug("Wrote %s with apt pipeline depth setting %s", f_name, setting)

=== modified file 'cloudinit/config/cc_apt_update_upgrade.py'
--- cloudinit/config/cc_apt_update_upgrade.py	2012-08-22 21:02:54 +0000
+++ cloudinit/config/cc_apt_update_upgrade.py	2012-10-28 02:29:21 +0000
@@ -78,8 +78,7 @@
         try:
             # See man 'apt.conf'
             contents = PROXY_TPL % (proxy)
-            util.write_file(cloud.paths.join(False, proxy_filename),
-                            contents)
+            util.write_file(proxy_filename, contents)
         except Exception as e:
             util.logexc(log, "Failed to write proxy to %s", proxy_filename)
     elif os.path.isfile(proxy_filename):
@@ -90,7 +89,7 @@
         params = mirrors
         params['RELEASE'] = release
         params['MIRROR'] = mirror
-        errors = add_sources(cloud, cfg['apt_sources'], params)
+        errors = add_sources(cfg['apt_sources'], params)
         for e in errors:
             log.warn("Source Error: %s", ':'.join(e))
 
@@ -196,11 +195,10 @@
     params = {'codename': codename}
     for k in mirrors:
         params[k] = mirrors[k]
-    out_fn = cloud.paths.join(False, '/etc/apt/sources.list')
-    templater.render_to_file(template_fn, out_fn, params)
-
-
-def add_sources(cloud, srclist, template_params=None):
+    templater.render_to_file(template_fn, '/etc/apt/sources.list', params)
+
+
+def add_sources(srclist, template_params=None):
     """
     add entries in /etc/apt/sources.list.d for each abbreviated
     sources.list entry in 'srclist'.  When rendering template, also
@@ -250,8 +248,7 @@
 
         try:
             contents = "%s\n" % (source)
-            util.write_file(cloud.paths.join(False, ent['filename']),
-                            contents, omode="ab")
+            util.write_file(ent['filename'], contents, omode="ab")
         except:
             errorlist.append([source,
                              "failed write to file %s" % ent['filename']])

=== modified file 'cloudinit/config/cc_ca_certs.py'
--- cloudinit/config/cc_ca_certs.py	2012-06-23 03:59:23 +0000
+++ cloudinit/config/cc_ca_certs.py	2012-10-28 02:29:21 +0000
@@ -22,6 +22,7 @@
 CA_CERT_FILENAME = "cloud-init-ca-certs.crt"
 CA_CERT_CONFIG = "/etc/ca-certificates.conf"
 CA_CERT_SYSTEM_PATH = "/etc/ssl/certs/"
+CA_CERT_FULL_PATH = os.path.join(CA_CERT_PATH, CA_CERT_FILENAME)
 
 distros = ['ubuntu', 'debian']
 
@@ -33,7 +34,7 @@
     util.subp(["update-ca-certificates"], capture=False)
 
 
-def add_ca_certs(paths, certs):
+def add_ca_certs(certs):
     """
     Adds certificates to the system. To actually apply the new certificates
     you must also call L{update_ca_certs}.
@@ -43,27 +44,24 @@
     if certs:
         # First ensure they are strings...
         cert_file_contents = "\n".join([str(c) for c in certs])
-        cert_file_fullpath = os.path.join(CA_CERT_PATH, CA_CERT_FILENAME)
-        cert_file_fullpath = paths.join(False, cert_file_fullpath)
-        util.write_file(cert_file_fullpath, cert_file_contents, mode=0644)
+        util.write_file(CA_CERT_FULL_PATH, cert_file_contents, mode=0644)
         # Append cert filename to CA_CERT_CONFIG file.
-        util.write_file(paths.join(False, CA_CERT_CONFIG),
-                        "\n%s" % CA_CERT_FILENAME, omode="ab")
-
-
-def remove_default_ca_certs(paths):
+        util.write_file(CA_CERT_CONFIG, "\n%s" % CA_CERT_FILENAME, omode="ab")
+
+
+def remove_default_ca_certs():
     """
     Removes all default trusted CA certificates from the system. To actually
     apply the change you must also call L{update_ca_certs}.
     """
-    util.delete_dir_contents(paths.join(False, CA_CERT_PATH))
-    util.delete_dir_contents(paths.join(False, CA_CERT_SYSTEM_PATH))
-    util.write_file(paths.join(False, CA_CERT_CONFIG), "", mode=0644)
+    util.delete_dir_contents(CA_CERT_PATH)
+    util.delete_dir_contents(CA_CERT_SYSTEM_PATH)
+    util.write_file(CA_CERT_CONFIG, "", mode=0644)
     debconf_sel = "ca-certificates ca-certificates/trust_new_crts select no"
     util.subp(('debconf-set-selections', '-'), debconf_sel)
 
 
-def handle(name, cfg, cloud, log, _args):
+def handle(name, cfg, _cloud, log, _args):
     """
     Call to handle ca-cert sections in cloud-config file.
 
@@ -85,14 +83,14 @@
     # default trusted CA certs first.
     if ca_cert_cfg.get("remove-defaults", False):
         log.debug("Removing default certificates")
-        remove_default_ca_certs(cloud.paths)
+        remove_default_ca_certs()
 
     # If we are given any new trusted CA certs to add, add them.
     if "trusted" in ca_cert_cfg:
         trusted_certs = util.get_cfg_option_list(ca_cert_cfg, "trusted")
         if trusted_certs:
             log.debug("Adding %d certificates" % len(trusted_certs))
-            add_ca_certs(cloud.paths, trusted_certs)
+            add_ca_certs(trusted_certs)
 
     # Update the system with the new cert configuration.
     log.debug("Updating certificates")

=== modified file 'cloudinit/config/cc_chef.py'
--- cloudinit/config/cc_chef.py	2012-06-23 06:26:50 +0000
+++ cloudinit/config/cc_chef.py	2012-10-28 02:29:21 +0000
@@ -26,6 +26,15 @@
 
 RUBY_VERSION_DEFAULT = "1.8"
 
+CHEF_DIRS = [
+    '/etc/chef',
+    '/var/log/chef',
+    '/var/lib/chef',
+    '/var/cache/chef',
+    '/var/backups/chef',
+    '/var/run/chef',
+]
+
 
 def handle(name, cfg, cloud, log, _args):
 
@@ -37,24 +46,15 @@
     chef_cfg = cfg['chef']
 
     # Ensure the chef directories we use exist
-    c_dirs = [
-        '/etc/chef',
-        '/var/log/chef',
-        '/var/lib/chef',
-        '/var/cache/chef',
-        '/var/backups/chef',
-        '/var/run/chef',
-    ]
-    for d in c_dirs:
-        util.ensure_dir(cloud.paths.join(False, d))
+    for d in CHEF_DIRS:
+        util.ensure_dir(d)
 
     # Set the validation key based on the presence of either 'validation_key'
     # or 'validation_cert'. In the case where both exist, 'validation_key'
     # takes precedence
     for key in ('validation_key', 'validation_cert'):
         if key in chef_cfg and chef_cfg[key]:
-            v_fn = cloud.paths.join(False, '/etc/chef/validation.pem')
-            util.write_file(v_fn, chef_cfg[key])
+            util.write_file('/etc/chef/validation.pem', chef_cfg[key])
             break
 
     # Create the chef config from template
@@ -68,8 +68,7 @@
                                                    '_default'),
             'validation_name': chef_cfg['validation_name']
         }
-        out_fn = cloud.paths.join(False, '/etc/chef/client.rb')
-        templater.render_to_file(template_fn, out_fn, params)
+        templater.render_to_file(template_fn, '/etc/chef/client.rb', params)
     else:
         log.warn("No template found, not rendering to /etc/chef/client.rb")
 
@@ -81,8 +80,7 @@
         initial_attributes = chef_cfg['initial_attributes']
         for k in list(initial_attributes.keys()):
             initial_json[k] = initial_attributes[k]
-    firstboot_fn = cloud.paths.join(False, '/etc/chef/firstboot.json')
-    util.write_file(firstboot_fn, json.dumps(initial_json))
+    util.write_file('/etc/chef/firstboot.json', json.dumps(initial_json))
 
     # If chef is not installed, we install chef based on 'install_type'
     if not os.path.isfile('/usr/bin/chef-client'):

=== modified file 'cloudinit/config/cc_landscape.py'
--- cloudinit/config/cc_landscape.py	2012-10-23 10:57:26 +0000
+++ cloudinit/config/cc_landscape.py	2012-10-28 02:29:21 +0000
@@ -66,22 +66,16 @@
 
     merge_data = [
         LSC_BUILTIN_CFG,
-        cloud.paths.join(True, LSC_CLIENT_CFG_FILE),
+        LSC_CLIENT_CFG_FILE,
         ls_cloudcfg,
     ]
     merged = merge_together(merge_data)
-
-    lsc_client_fn = cloud.paths.join(False, LSC_CLIENT_CFG_FILE)
-    lsc_dir = cloud.paths.join(False, os.path.dirname(lsc_client_fn))
-    if not os.path.isdir(lsc_dir):
-        util.ensure_dir(lsc_dir)
-
     contents = StringIO()
     merged.write(contents)
-    contents.flush()
 
-    util.write_file(lsc_client_fn, contents.getvalue())
-    log.debug("Wrote landscape config file to %s", lsc_client_fn)
+    util.ensure_dir(os.path.dirname(LSC_CLIENT_CFG_FILE))
+    util.write_file(LSC_CLIENT_CFG_FILE, contents.getvalue())
+    log.debug("Wrote landscape config file to %s", LSC_CLIENT_CFG_FILE)
 
     util.write_file(LS_DEFAULT_FILE, "RUN=1\n")
     util.subp(["service", "landscape-client", "restart"])

=== modified file 'cloudinit/config/cc_mcollective.py'
--- cloudinit/config/cc_mcollective.py	2012-06-22 15:48:18 +0000
+++ cloudinit/config/cc_mcollective.py	2012-10-28 02:29:21 +0000
@@ -29,6 +29,7 @@
 
 PUBCERT_FILE = "/etc/mcollective/ssl/server-public.pem"
 PRICERT_FILE = "/etc/mcollective/ssl/server-private.pem"
+SERVER_CFG = '/etc/mcollective/server.cfg'
 
 
 def handle(name, cfg, cloud, log, _args):
@@ -48,26 +49,23 @@
     if 'conf' in mcollective_cfg:
         # Read server.cfg values from the
         # original file in order to be able to mix the rest up
-        server_cfg_fn = cloud.paths.join(True, '/etc/mcollective/server.cfg')
-        mcollective_config = ConfigObj(server_cfg_fn)
+        mcollective_config = ConfigObj(SERVER_CFG)
         # See: http://tiny.cc/jh9agw
         for (cfg_name, cfg) in mcollective_cfg['conf'].iteritems():
             if cfg_name == 'public-cert':
-                pubcert_fn = cloud.paths.join(True, PUBCERT_FILE)
-                util.write_file(pubcert_fn, cfg, mode=0644)
-                mcollective_config['plugin.ssl_server_public'] = pubcert_fn
+                util.write_file(PUBCERT_FILE, cfg, mode=0644)
+                mcollective_config['plugin.ssl_server_public'] = PUBCERT_FILE
                 mcollective_config['securityprovider'] = 'ssl'
             elif cfg_name == 'private-cert':
-                pricert_fn = cloud.paths.join(True, PRICERT_FILE)
-                util.write_file(pricert_fn, cfg, mode=0600)
-                mcollective_config['plugin.ssl_server_private'] = pricert_fn
+                util.write_file(PRICERT_FILE, cfg, mode=0600)
+                mcollective_config['plugin.ssl_server_private'] = PRICERT_FILE
                 mcollective_config['securityprovider'] = 'ssl'
             else:
                 if isinstance(cfg, (basestring, str)):
                     # Just set it in the 'main' section
                     mcollective_config[cfg_name] = cfg
                 elif isinstance(cfg, (dict)):
-                    # Iterate throug the config items, create a section
+                    # Iterate through the config items, create a section
                     # if it is needed and then add/or create items as needed
                     if cfg_name not in mcollective_config.sections:
                         mcollective_config[cfg_name] = {}
@@ -78,14 +76,12 @@
                     mcollective_config[cfg_name] = str(cfg)
         # We got all our config as wanted we'll rename
         # the previous server.cfg and create our new one
-        old_fn = cloud.paths.join(False, '/etc/mcollective/server.cfg.old')
-        util.rename(server_cfg_fn, old_fn)
+        util.rename(SERVER_CFG, "%s.old" % (SERVER_CFG))
         # Now we got the whole file, write to disk...
         contents = StringIO()
         mcollective_config.write(contents)
         contents = contents.getvalue()
-        server_cfg_rw = cloud.paths.join(False, '/etc/mcollective/server.cfg')
-        util.write_file(server_cfg_rw, contents, mode=0644)
+        util.write_file(SERVER_CFG, contents, mode=0644)
 
     # Start mcollective
     util.subp(['service', 'mcollective', 'start'], capture=False)

=== modified file 'cloudinit/config/cc_mounts.py'
--- cloudinit/config/cc_mounts.py	2012-09-06 18:52:53 +0000
+++ cloudinit/config/cc_mounts.py	2012-10-28 02:29:21 +0000
@@ -28,6 +28,7 @@
 SHORTNAME_FILTER = r"^[x]{0,1}[shv]d[a-z][0-9]*$"
 SHORTNAME = re.compile(SHORTNAME_FILTER)
 WS = re.compile("[%s]+" % (whitespace))
+FSTAB_PATH = "/etc/fstab"
 
 
 def is_mdname(name):
@@ -167,8 +168,7 @@
         cc_lines.append('\t'.join(line))
 
     fstab_lines = []
-    fstab = util.load_file(cloud.paths.join(True, "/etc/fstab"))
-    for line in fstab.splitlines():
+    for line in util.load_file(FSTAB_PATH).splitlines():
         try:
             toks = WS.split(line)
             if toks[3].find(comment) != -1:
@@ -179,7 +179,7 @@
 
     fstab_lines.extend(cc_lines)
     contents = "%s\n" % ('\n'.join(fstab_lines))
-    util.write_file(cloud.paths.join(False, "/etc/fstab"), contents)
+    util.write_file(FSTAB_PATH, contents)
 
     if needswap:
         try:
@@ -188,9 +188,8 @@
             util.logexc(log, "Activating swap via 'swapon -a' failed")
 
     for d in dirs:
-        real_dir = cloud.paths.join(False, d)
         try:
-            util.ensure_dir(real_dir)
+            util.ensure_dir(d)
         except:
             util.logexc(log, "Failed to make '%s' config-mount", d)
 

=== modified file 'cloudinit/config/cc_phone_home.py'
--- cloudinit/config/cc_phone_home.py	2012-06-23 05:04:37 +0000
+++ cloudinit/config/cc_phone_home.py	2012-10-28 02:29:21 +0000
@@ -84,10 +84,10 @@
 
     for (n, path) in pubkeys.iteritems():
         try:
-            all_keys[n] = util.load_file(cloud.paths.join(True, path))
+            all_keys[n] = util.load_file(path)
         except:
             util.logexc(log, ("%s: failed to open, can not"
-                              " phone home that data"), path)
+                              " phone home that data!"), path)
 
     submit_keys = {}
     for k in post_list:

=== modified file 'cloudinit/config/cc_puppet.py'
--- cloudinit/config/cc_puppet.py	2012-08-22 18:12:32 +0000
+++ cloudinit/config/cc_puppet.py	2012-10-28 02:29:21 +0000
@@ -21,12 +21,32 @@
 from StringIO import StringIO
 
 import os
-import pwd
 import socket
 
 from cloudinit import helpers
 from cloudinit import util
 
+PUPPET_CONF_PATH = '/etc/puppet/puppet.conf'
+PUPPET_SSL_CERT_DIR = '/var/lib/puppet/ssl/certs/'
+PUPPET_SSL_DIR = '/var/lib/puppet/ssl'
+PUPPET_SSL_CERT_PATH = '/var/lib/puppet/ssl/certs/ca.pem'
+
+
+def _autostart_puppet(log):
+    # Set puppet to automatically start
+    if os.path.exists('/etc/default/puppet'):
+        util.subp(['sed', '-i',
+                  '-e', 's/^START=.*/START=yes/',
+                  '/etc/default/puppet'], capture=False)
+    elif os.path.exists('/bin/systemctl'):
+        util.subp(['/bin/systemctl', 'enable', 'puppet.service'],
+                  capture=False)
+    elif os.path.exists('/sbin/chkconfig'):
+        util.subp(['/sbin/chkconfig', 'puppet', 'on'], capture=False)
+    else:
+        log.warn(("Sorry we do not know how to enable"
+                  " puppet services on this system"))
+
 
 def handle(name, cfg, cloud, log, _args):
     # If there isn't a puppet key in the configuration don't do anything
@@ -43,8 +63,7 @@
     # ... and then update the puppet configuration
     if 'conf' in puppet_cfg:
         # Add all sections from the conf object to puppet.conf
-        puppet_conf_fn = cloud.paths.join(True, '/etc/puppet/puppet.conf')
-        contents = util.load_file(puppet_conf_fn)
+        contents = util.load_file(PUPPET_CONF_PATH)
         # Create object for reading puppet.conf values
         puppet_config = helpers.DefaultingConfigParser()
         # Read puppet.conf values from original file in order to be able to
@@ -53,28 +72,19 @@
         cleaned_lines = [i.lstrip() for i in contents.splitlines()]
         cleaned_contents = '\n'.join(cleaned_lines)
         puppet_config.readfp(StringIO(cleaned_contents),
-                             filename=puppet_conf_fn)
+                             filename=PUPPET_CONF_PATH)
         for (cfg_name, cfg) in puppet_cfg['conf'].iteritems():
             # Cert configuration is a special case
             # Dump the puppet master ca certificate in the correct place
             if cfg_name == 'ca_cert':
                 # Puppet ssl sub-directory isn't created yet
                 # Create it with the proper permissions and ownership
-                pp_ssl_dir = cloud.paths.join(False, '/var/lib/puppet/ssl')
-                util.ensure_dir(pp_ssl_dir, 0771)
-                util.chownbyid(pp_ssl_dir,
-                               pwd.getpwnam('puppet').pw_uid, 0)
-                pp_ssl_certs = cloud.paths.join(False,
-                                                '/var/lib/puppet/ssl/certs/')
-                util.ensure_dir(pp_ssl_certs)
-                util.chownbyid(pp_ssl_certs,
-                               pwd.getpwnam('puppet').pw_uid, 0)
-                pp_ssl_ca_certs = cloud.paths.join(False,
-                                                   ('/var/lib/puppet/'
-                                                    'ssl/certs/ca.pem'))
-                util.write_file(pp_ssl_ca_certs, cfg)
-                util.chownbyid(pp_ssl_ca_certs,
-                               pwd.getpwnam('puppet').pw_uid, 0)
+                util.ensure_dir(PUPPET_SSL_DIR, 0771)
+                util.chownbyname(PUPPET_SSL_DIR, 'puppet', 'root')
+                util.ensure_dir(PUPPET_SSL_CERT_DIR)
+                util.chownbyname(PUPPET_SSL_CERT_DIR, 'puppet', 'root')
+                util.write_file(PUPPET_SSL_CERT_PATH, str(cfg))
+                util.chownbyname(PUPPET_SSL_CERT_PATH, 'puppet', 'root')
             else:
                 # Iterate throug the config items, we'll use ConfigParser.set
                 # to overwrite or create new items as needed
@@ -90,25 +100,11 @@
                     puppet_config.set(cfg_name, o, v)
             # We got all our config as wanted we'll rename
             # the previous puppet.conf and create our new one
-            conf_old_fn = cloud.paths.join(False,
-                                           '/etc/puppet/puppet.conf.old')
-            util.rename(puppet_conf_fn, conf_old_fn)
-            puppet_conf_rw = cloud.paths.join(False, '/etc/puppet/puppet.conf')
-            util.write_file(puppet_conf_rw, puppet_config.stringify())
+            util.rename(PUPPET_CONF_PATH, "%s.old" % (PUPPET_CONF_PATH))
+            util.write_file(PUPPET_CONF_PATH, puppet_config.stringify())
 
-    # Set puppet to automatically start
-    if os.path.exists('/etc/default/puppet'):
-        util.subp(['sed', '-i',
-                  '-e', 's/^START=.*/START=yes/',
-                  '/etc/default/puppet'], capture=False)
-    elif os.path.exists('/bin/systemctl'):
-        util.subp(['/bin/systemctl', 'enable', 'puppet.service'],
-                  capture=False)
-    elif os.path.exists('/sbin/chkconfig'):
-        util.subp(['/sbin/chkconfig', 'puppet', 'on'], capture=False)
-    else:
-        log.warn(("Sorry we do not know how to enable"
-                  " puppet services on this system"))
+    # Set it up so it autostarts
+    _autostart_puppet(log)
 
     # Start puppetd
     util.subp(['service', 'puppet', 'start'], capture=False)

=== modified file 'cloudinit/config/cc_resizefs.py'
--- cloudinit/config/cc_resizefs.py	2012-08-22 18:12:32 +0000
+++ cloudinit/config/cc_resizefs.py	2012-10-28 02:29:21 +0000
@@ -62,7 +62,7 @@
         raise
 
 
-def handle(name, cfg, cloud, log, args):
+def handle(name, cfg, _cloud, log, args):
     if len(args) != 0:
         resize_root = args[0]
     else:
@@ -74,11 +74,10 @@
 
     # TODO(harlowja) is the directory ok to be used??
     resize_root_d = util.get_cfg_option_str(cfg, "resize_rootfs_tmp", "/run")
-    resize_root_d = cloud.paths.join(False, resize_root_d)
     util.ensure_dir(resize_root_d)
 
     # TODO(harlowja): allow what is to be resized to be configurable??
-    resize_what = cloud.paths.join(False, "/")
+    resize_what = "/"
     with util.ExtendedTemporaryFile(prefix="cloudinit.resizefs.",
                                     dir=resize_root_d, delete=True) as tfh:
         devpth = tfh.name

=== modified file 'cloudinit/config/cc_rsyslog.py'
--- cloudinit/config/cc_rsyslog.py	2012-06-21 16:12:16 +0000
+++ cloudinit/config/cc_rsyslog.py	2012-10-28 02:29:21 +0000
@@ -71,8 +71,7 @@
 
         try:
             contents = "%s\n" % (content)
-            util.write_file(cloud.paths.join(False, filename),
-                            contents, omode=omode)
+            util.write_file(filename, contents, omode=omode)
         except Exception:
             util.logexc(log, "Failed to write to %s", filename)
 

=== modified file 'cloudinit/config/cc_runcmd.py'
--- cloudinit/config/cc_runcmd.py	2012-06-21 16:12:16 +0000
+++ cloudinit/config/cc_runcmd.py	2012-10-28 02:29:21 +0000
@@ -33,6 +33,6 @@
     cmd = cfg["runcmd"]
     try:
         content = util.shellify(cmd)
-        util.write_file(cloud.paths.join(False, out_fn), content, 0700)
+        util.write_file(out_fn, content, 0700)
     except:
         util.logexc(log, "Failed to shellify %s into file %s", cmd, out_fn)

=== modified file 'cloudinit/config/cc_salt_minion.py'
--- cloudinit/config/cc_salt_minion.py	2012-09-28 13:03:54 +0000
+++ cloudinit/config/cc_salt_minion.py	2012-10-28 02:29:21 +0000
@@ -34,8 +34,7 @@
     cloud.distro.install_packages(["salt-minion"])
 
     # Ensure we can configure files at the right dir
-    config_dir = cloud.paths.join(False, salt_cfg.get("config_dir",
-                                                      '/etc/salt'))
+    config_dir = salt_cfg.get("config_dir", '/etc/salt')
     util.ensure_dir(config_dir)
 
     # ... and then update the salt configuration
@@ -47,8 +46,7 @@
 
     # ... copy the key pair if specified
     if 'public_key' in salt_cfg and 'private_key' in salt_cfg:
-        pki_dir = cloud.paths.join(False, salt_cfg.get('pki_dir',
-                                                       '/etc/salt/pki'))
+        pki_dir = salt_cfg.get('pki_dir', '/etc/salt/pki')
         with util.umask(077):
             util.ensure_dir(pki_dir)
             pub_name = os.path.join(pki_dir, 'minion.pub')

=== modified file 'cloudinit/config/cc_set_passwords.py'
--- cloudinit/config/cc_set_passwords.py	2012-09-28 21:06:22 +0000
+++ cloudinit/config/cc_set_passwords.py	2012-10-28 02:29:21 +0000
@@ -114,8 +114,7 @@
         replaced_auth = False
 
         # See: man sshd_config
-        conf_fn = cloud.paths.join(True, ssh_util.DEF_SSHD_CFG)
-        old_lines = ssh_util.parse_ssh_config(conf_fn)
+        old_lines = ssh_util.parse_ssh_config(ssh_util.DEF_SSHD_CFG)
         new_lines = []
         i = 0
         for (i, line) in enumerate(old_lines):
@@ -134,8 +133,7 @@
                                                      pw_auth))
 
         lines = [str(e) for e in new_lines]
-        ssh_rw_fn = cloud.paths.join(False, ssh_util.DEF_SSHD_CFG)
-        util.write_file(ssh_rw_fn, "\n".join(lines))
+        util.write_file(ssh_util.DEF_SSHD_CFG, "\n".join(lines))
 
         try:
             cmd = ['service']

=== modified file 'cloudinit/config/cc_ssh.py'
--- cloudinit/config/cc_ssh.py	2012-09-28 21:06:22 +0000
+++ cloudinit/config/cc_ssh.py	2012-10-28 02:29:21 +0000
@@ -59,7 +59,7 @@
 
     # remove the static keys from the pristine image
     if cfg.get("ssh_deletekeys", True):
-        key_pth = cloud.paths.join(False, "/etc/ssh/", "ssh_host_*key*")
+        key_pth = os.path.join("/etc/ssh/", "ssh_host_*key*")
         for f in glob.glob(key_pth):
             try:
                 util.del_file(f)
@@ -72,8 +72,7 @@
             if key in KEY_2_FILE:
                 tgt_fn = KEY_2_FILE[key][0]
                 tgt_perms = KEY_2_FILE[key][1]
-                util.write_file(cloud.paths.join(False, tgt_fn),
-                                val, tgt_perms)
+                util.write_file(tgt_fn, val, tgt_perms)
 
         for (priv, pub) in PRIV_2_PUB.iteritems():
             if pub in cfg['ssh_keys'] or not priv in cfg['ssh_keys']:
@@ -94,7 +93,7 @@
                                            'ssh_genkeytypes',
                                            GENERATE_KEY_NAMES)
         for keytype in genkeys:
-            keyfile = cloud.paths.join(False, KEY_FILE_TPL % (keytype))
+            keyfile = KEY_FILE_TPL % (keytype)
             util.ensure_dir(os.path.dirname(keyfile))
             if not os.path.exists(keyfile):
                 cmd = ['ssh-keygen', '-t', keytype, '-N', '', '-f', keyfile]
@@ -118,17 +117,16 @@
             cfgkeys = cfg["ssh_authorized_keys"]
             keys.extend(cfgkeys)
 
-        apply_credentials(keys, user, cloud.paths,
-                          disable_root, disable_root_opts)
+        apply_credentials(keys, user, disable_root, disable_root_opts)
     except:
         util.logexc(log, "Applying ssh credentials failed!")
 
 
-def apply_credentials(keys, user, paths, disable_root, disable_root_opts):
+def apply_credentials(keys, user, disable_root, disable_root_opts):
 
     keys = set(keys)
     if user:
-        ssh_util.setup_user_keys(keys, user, '', paths)
+        ssh_util.setup_user_keys(keys, user, '')
 
     if disable_root:
         if not user:
@@ -137,4 +135,4 @@
     else:
         key_prefix = ''
 
-    ssh_util.setup_user_keys(keys, 'root', key_prefix, paths)
+    ssh_util.setup_user_keys(keys, 'root', key_prefix)

=== modified file 'cloudinit/config/cc_ssh_authkey_fingerprints.py'
--- cloudinit/config/cc_ssh_authkey_fingerprints.py	2012-09-28 21:21:02 +0000
+++ cloudinit/config/cc_ssh_authkey_fingerprints.py	2012-10-28 02:29:21 +0000
@@ -97,9 +97,8 @@
                    "logging of ssh fingerprints disabled"), name)
 
     hash_meth = util.get_cfg_option_str(cfg, "authkey_hash", "md5")
-    extract_func = ssh_util.extract_authorized_keys
     (users, _groups) = ds.normalize_users_groups(cfg, cloud.distro)
     for (user_name, _cfg) in users.items():
-        (auth_key_fn, auth_key_entries) = extract_func(user_name, cloud.paths)
-        _pprint_key_entries(user_name, auth_key_fn,
-                            auth_key_entries, hash_meth)
+        (key_fn, key_entries) = ssh_util.extract_authorized_keys(user_name)
+        _pprint_key_entries(user_name, key_fn,
+                            key_entries, hash_meth)

=== modified file 'cloudinit/config/cc_update_etc_hosts.py'
--- cloudinit/config/cc_update_etc_hosts.py	2012-08-22 18:12:32 +0000
+++ cloudinit/config/cc_update_etc_hosts.py	2012-10-28 02:29:21 +0000
@@ -42,8 +42,7 @@
             raise RuntimeError(("No hosts template could be"
                                 " found for distro %s") % (cloud.distro.name))
 
-        out_fn = cloud.paths.join(False, '/etc/hosts')
-        templater.render_to_file(tpl_fn_name, out_fn,
+        templater.render_to_file(tpl_fn_name, '/etc/hosts',
                                 {'hostname': hostname, 'fqdn': fqdn})
 
     elif manage_hosts == "localhost":

=== modified file 'cloudinit/distros/__init__.py'
--- cloudinit/distros/__init__.py	2012-10-23 16:58:32 +0000
+++ cloudinit/distros/__init__.py	2012-10-28 02:29:21 +0000
@@ -122,8 +122,7 @@
         new_etchosts = StringIO()
         need_write = False
         need_change = True
-        hosts_ro_fn = self._paths.join(True, "/etc/hosts")
-        for line in util.load_file(hosts_ro_fn).splitlines():
+        for line in util.load_file("/etc/hosts").splitlines():
             if line.strip().startswith(header):
                 continue
             if not line.strip() or line.strip().startswith("#"):
@@ -147,8 +146,7 @@
             need_write = True
         if need_write:
             contents = new_etchosts.getvalue()
-            util.write_file(self._paths.join(False, "/etc/hosts"),
-                            contents, mode=0644)
+            util.write_file("/etc/hosts", contents, mode=0644)
 
     def _bring_up_interface(self, device_name):
         cmd = ['ifup', device_name]
@@ -262,7 +260,7 @@
         # Import SSH keys
         if 'ssh_authorized_keys' in kwargs:
             keys = set(kwargs['ssh_authorized_keys']) or []
-            ssh_util.setup_user_keys(keys, name, None, self._paths)
+            ssh_util.setup_user_keys(keys, name, key_prefix=None)
 
         return True
 

=== modified file 'cloudinit/distros/debian.py'
--- cloudinit/distros/debian.py	2012-09-20 22:55:52 +0000
+++ cloudinit/distros/debian.py	2012-10-28 02:29:21 +0000
@@ -43,7 +43,7 @@
 
     def apply_locale(self, locale, out_fn=None):
         if not out_fn:
-            out_fn = self._paths.join(False, '/etc/default/locale')
+            out_fn = '/etc/default/locale'
         util.subp(['locale-gen', locale], capture=False)
         util.subp(['update-locale', locale], capture=False)
         lines = ["# Created by cloud-init", 'LANG="%s"' % (locale), ""]
@@ -54,8 +54,7 @@
         self.package_command('install', pkglist)
 
     def _write_network(self, settings):
-        net_fn = self._paths.join(False, "/etc/network/interfaces")
-        util.write_file(net_fn, settings)
+        util.write_file("/etc/network/interfaces", settings)
         return ['all']
 
     def _bring_up_interfaces(self, device_names):
@@ -69,12 +68,9 @@
             return distros.Distro._bring_up_interfaces(self, device_names)
 
     def set_hostname(self, hostname):
-        out_fn = self._paths.join(False, "/etc/hostname")
-        self._write_hostname(hostname, out_fn)
-        if out_fn == '/etc/hostname':
-            # Only do this if we are running in non-adjusted root mode
-            LOG.debug("Setting hostname to %s", hostname)
-            util.subp(['hostname', hostname])
+        self._write_hostname(hostname, "/etc/hostname")
+        LOG.debug("Setting hostname to %s", hostname)
+        util.subp(['hostname', hostname])
 
     def _write_hostname(self, hostname, out_fn):
         # "" gives trailing newline.
@@ -82,16 +78,14 @@
 
     def update_hostname(self, hostname, prev_fn):
         hostname_prev = self._read_hostname(prev_fn)
-        read_fn = self._paths.join(True, "/etc/hostname")
-        hostname_in_etc = self._read_hostname(read_fn)
+        hostname_in_etc = self._read_hostname("/etc/hostname")
         update_files = []
         if not hostname_prev or hostname_prev != hostname:
             update_files.append(prev_fn)
         if (not hostname_in_etc or
             (hostname_in_etc == hostname_prev and
              hostname_in_etc != hostname)):
-            write_fn = self._paths.join(False, "/etc/hostname")
-            update_files.append(write_fn)
+            update_files.append("/etc/hostname")
         for fn in update_files:
             try:
                 self._write_hostname(hostname, fn)
@@ -103,7 +97,6 @@
             LOG.debug(("%s differs from /etc/hostname."
                         " Assuming user maintained hostname."), prev_fn)
         if "/etc/hostname" in update_files:
-            # Only do this if we are running in non-adjusted root mode
             LOG.debug("Setting hostname to %s", hostname)
             util.subp(['hostname', hostname])
 
@@ -130,9 +123,8 @@
                                 " no file found at %s") % (tz, tz_file))
         # "" provides trailing newline during join
         tz_lines = ["# Created by cloud-init", str(tz), ""]
-        tz_fn = self._paths.join(False, "/etc/timezone")
-        util.write_file(tz_fn, "\n".join(tz_lines))
-        util.copy(tz_file, self._paths.join(False, "/etc/localtime"))
+        util.write_file("/etc/timezone", "\n".join(tz_lines))
+        util.copy(tz_file, "/etc/localtime")
 
     def package_command(self, command, args=None):
         e = os.environ.copy()

=== modified file 'cloudinit/helpers.py'
--- cloudinit/helpers.py	2012-07-10 03:34:10 +0000
+++ cloudinit/helpers.py	2012-10-28 02:29:21 +0000
@@ -302,14 +302,10 @@
     def __init__(self, path_cfgs, ds=None):
         self.cfgs = path_cfgs
         # Populate all the initial paths
-        self.cloud_dir = self.join(False,
-                                   path_cfgs.get('cloud_dir',
-                                                 '/var/lib/cloud'))
+        self.cloud_dir = path_cfgs.get('cloud_dir', '/var/lib/cloud')
         self.instance_link = os.path.join(self.cloud_dir, 'instance')
         self.boot_finished = os.path.join(self.instance_link, "boot-finished")
         self.upstart_conf_d = path_cfgs.get('upstart_dir')
-        if self.upstart_conf_d:
-            self.upstart_conf_d = self.join(False, self.upstart_conf_d)
         self.seed_dir = os.path.join(self.cloud_dir, 'seed')
         # This one isn't joined, since it should just be read-only
         template_dir = path_cfgs.get('templates_dir', '/etc/cloud/templates/')
@@ -328,29 +324,6 @@
         # Set when a datasource becomes active
         self.datasource = ds
 
-    # joins the paths but also appends a read
-    # or write root if available
-    def join(self, read_only, *paths):
-        if read_only:
-            root = self.cfgs.get('read_root')
-        else:
-            root = self.cfgs.get('write_root')
-        if not paths:
-            return root
-        if len(paths) > 1:
-            joined = os.path.join(*paths)
-        else:
-            joined = paths[0]
-        if root:
-            pre_joined = joined
-            # Need to remove any starting '/' since this
-            # will confuse os.path.join
-            joined = joined.lstrip("/")
-            joined = os.path.join(root, joined)
-            LOG.debug("Translated %s to adjusted path %s (read-only=%s)",
-                      pre_joined, joined, read_only)
-        return joined
-
     # get_ipath_cur: get the current instance path for an item
     def get_ipath_cur(self, name=None):
         ipath = self.instance_link

=== modified file 'cloudinit/sources/__init__.py'
--- cloudinit/sources/__init__.py	2012-10-05 20:38:54 +0000
+++ cloudinit/sources/__init__.py	2012-10-28 02:29:21 +0000
@@ -20,8 +20,6 @@
 #    You should have received a copy of the GNU General Public License
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from email.mime.multipart import MIMEMultipart
-
 import abc
 import os
 

=== modified file 'cloudinit/ssh_util.py'
--- cloudinit/ssh_util.py	2012-08-19 04:15:52 +0000
+++ cloudinit/ssh_util.py	2012-10-28 02:29:21 +0000
@@ -212,17 +212,15 @@
     return '\n'.join(lines)
 
 
-def users_ssh_info(username, paths):
+def users_ssh_info(username):
     pw_ent = pwd.getpwnam(username)
-    if not pw_ent:
+    if not pw_ent or not pw_ent.pw_dir:
         raise RuntimeError("Unable to get ssh info for user %r" % (username))
-    ssh_dir = paths.join(False, os.path.join(pw_ent.pw_dir, '.ssh'))
-    return (ssh_dir, pw_ent)
-
-
-def extract_authorized_keys(username, paths):
-    (ssh_dir, pw_ent) = users_ssh_info(username, paths)
-    sshd_conf_fn = paths.join(True, DEF_SSHD_CFG)
+    return (os.path.join(pw_ent.pw_dir, '.ssh'), pw_ent)
+
+
+def extract_authorized_keys(username):
+    (ssh_dir, pw_ent) = users_ssh_info(username)
     auth_key_fn = None
     with util.SeLinuxGuard(ssh_dir, recursive=True):
         try:
@@ -231,7 +229,7 @@
             # The following tokens are defined: %% is replaced by a literal
             # '%', %h is replaced by the home directory of the user being
             # authenticated and %u is replaced by the username of that user.
-            ssh_cfg = parse_ssh_config_map(sshd_conf_fn)
+            ssh_cfg = parse_ssh_config_map(DEF_SSHD_CFG)
             auth_key_fn = ssh_cfg.get("authorizedkeysfile", '').strip()
             if not auth_key_fn:
                 auth_key_fn = "%h/.ssh/authorized_keys"
@@ -240,7 +238,6 @@
             auth_key_fn = auth_key_fn.replace("%%", '%')
             if not auth_key_fn.startswith('/'):
                 auth_key_fn = os.path.join(pw_ent.pw_dir, auth_key_fn)
-            auth_key_fn = paths.join(False, auth_key_fn)
         except (IOError, OSError):
             # Give up and use a default key filename
             auth_key_fn = os.path.join(ssh_dir, 'authorized_keys')
@@ -248,14 +245,13 @@
                               " in ssh config"
                               " from %r, using 'AuthorizedKeysFile' file"
                               " %r instead"),
-                        sshd_conf_fn, auth_key_fn)
-    auth_key_entries = parse_authorized_keys(auth_key_fn)
-    return (auth_key_fn, auth_key_entries)
-
-
-def setup_user_keys(keys, username, key_prefix, paths):
+                        DEF_SSHD_CFG, auth_key_fn)
+    return (auth_key_fn, parse_authorized_keys(auth_key_fn))
+
+
+def setup_user_keys(keys, username, key_prefix):
     # Make sure the users .ssh dir is setup accordingly
-    (ssh_dir, pwent) = users_ssh_info(username, paths)
+    (ssh_dir, pwent) = users_ssh_info(username)
     if not os.path.isdir(ssh_dir):
         util.ensure_dir(ssh_dir, mode=0700)
         util.chownbyid(ssh_dir, pwent.pw_uid, pwent.pw_gid)
@@ -267,7 +263,7 @@
         key_entries.append(parser.parse(str(k), def_opt=key_prefix))
 
     # Extract the old and make the new
-    (auth_key_fn, auth_key_entries) = extract_authorized_keys(username, paths)
+    (auth_key_fn, auth_key_entries) = extract_authorized_keys(username)
     with util.SeLinuxGuard(ssh_dir, recursive=True):
         content = update_authorized_keys(auth_key_entries, key_entries)
         util.ensure_dir(os.path.dirname(auth_key_fn), mode=0700)

=== added file 'pylintrc'
--- pylintrc	1970-01-01 00:00:00 +0000
+++ pylintrc	2012-10-28 02:29:21 +0000
@@ -0,0 +1,19 @@
+[General]
+init-hook='import sys; sys.path.append("tests/")'
+
+[MESSAGES CONTROL]
+# See: http://pylint-messages.wikidot.com/all-codes
+# W0142: *args and **kwargs are fine.
+# W0511: TODOs in code comments are fine.
+# W0702: No exception type(s) specified
+# W0703: Catch "Exception"
+# C0103: Invalid name
+# C0111: Missing docstring
+disable=W0142,W0511,W0702,W0703,C0103,C0111
+
+[REPORTS]
+reports=no
+include-ids=yes
+
+[FORMAT]
+max-line-length=79

=== added file 'tests/__init__.py'
=== added file 'tests/unittests/__init__.py'
=== added file 'tests/unittests/test_datasource/__init__.py'
=== added file 'tests/unittests/test_distros/__init__.py'
=== added file 'tests/unittests/test_filters/__init__.py'
=== modified file 'tests/unittests/test_filters/test_launch_index.py'
--- tests/unittests/test_filters/test_launch_index.py	2012-09-26 23:40:07 +0000
+++ tests/unittests/test_filters/test_launch_index.py	2012-10-28 02:29:21 +0000
@@ -1,14 +1,6 @@
 import copy
-import os
-import sys
-
-top_dir = os.path.join(os.path.dirname(__file__), os.pardir, "helpers.py")
-top_dir = os.path.abspath(top_dir)
-if os.path.exists(top_dir):
-    sys.path.insert(0, os.path.dirname(top_dir))
-
-
-import helpers
+
+from tests.unittests import helpers
 
 import itertools
 

=== added file 'tests/unittests/test_handler/__init__.py'
=== modified file 'tests/unittests/test_handler/test_handler_ca_certs.py'
--- tests/unittests/test_handler/test_handler_ca_certs.py	2012-08-22 18:12:32 +0000
+++ tests/unittests/test_handler/test_handler_ca_certs.py	2012-10-28 02:29:21 +0000
@@ -77,7 +77,7 @@
         """Test that a single cert gets passed to add_ca_certs."""
         config = {"ca-certs": {"trusted": ["CERT1"]}}
 
-        self.mock_add(self.paths, ["CERT1"])
+        self.mock_add(["CERT1"])
         self.mock_update()
         self.mocker.replay()
 
@@ -87,7 +87,7 @@
         """Test that multiple certs get passed to add_ca_certs."""
         config = {"ca-certs": {"trusted": ["CERT1", "CERT2"]}}
 
-        self.mock_add(self.paths, ["CERT1", "CERT2"])
+        self.mock_add(["CERT1", "CERT2"])
         self.mock_update()
         self.mocker.replay()
 
@@ -97,7 +97,7 @@
         """Test remove_defaults works as expected."""
         config = {"ca-certs": {"remove-defaults": True}}
 
-        self.mock_remove(self.paths)
+        self.mock_remove()
         self.mock_update()
         self.mocker.replay()
 
@@ -116,8 +116,8 @@
         """Test remove_defaults is not called when config value is False."""
         config = {"ca-certs": {"remove-defaults": True, "trusted": ["CERT1"]}}
 
-        self.mock_remove(self.paths)
-        self.mock_add(self.paths, ["CERT1"])
+        self.mock_remove()
+        self.mock_add(["CERT1"])
         self.mock_update()
         self.mocker.replay()
 
@@ -136,7 +136,7 @@
         """Test that no certificate are written if not provided."""
         self.mocker.replace(util.write_file, passthrough=False)
         self.mocker.replay()
-        cc_ca_certs.add_ca_certs(self.paths, [])
+        cc_ca_certs.add_ca_certs([])
 
     def test_single_cert(self):
         """Test adding a single certificate to the trusted CAs."""
@@ -149,7 +149,7 @@
                    "\ncloud-init-ca-certs.crt", omode="ab")
         self.mocker.replay()
 
-        cc_ca_certs.add_ca_certs(self.paths, [cert])
+        cc_ca_certs.add_ca_certs([cert])
 
     def test_multiple_certs(self):
         """Test adding multiple certificates to the trusted CAs."""
@@ -163,7 +163,7 @@
                    "\ncloud-init-ca-certs.crt", omode="ab")
         self.mocker.replay()
 
-        cc_ca_certs.add_ca_certs(self.paths, certs)
+        cc_ca_certs.add_ca_certs(certs)
 
 
 class TestUpdateCaCerts(MockerTestCase):
@@ -198,4 +198,4 @@
                   "ca-certificates ca-certificates/trust_new_crts select no")
         self.mocker.replay()
 
-        cc_ca_certs.remove_default_ca_certs(self.paths)
+        cc_ca_certs.remove_default_ca_certs()

=== added file 'tests/unittests/test_runs/__init__.py'
=== modified file 'tests/unittests/test_runs/test_simple_run.py'
--- tests/unittests/test_runs/test_simple_run.py	2012-10-23 16:58:32 +0000
+++ tests/unittests/test_runs/test_simple_run.py	2012-10-28 02:29:21 +0000
@@ -1,14 +1,6 @@
 import os
-import sys
-
-# Allow running this test individually
-top_dir = os.path.join(os.path.dirname(__file__), os.pardir, "helpers.py")
-top_dir = os.path.abspath(top_dir)
-if os.path.exists(top_dir):
-    sys.path.insert(0, os.path.dirname(top_dir))
-
-
-import helpers
+
+from tests.unittests import helpers
 
 from cloudinit.settings import (PER_INSTANCE)
 from cloudinit import stages

=== modified file 'tools/run-pylint'
--- tools/run-pylint	2012-07-09 17:33:26 +0000
+++ tools/run-pylint	2012-10-28 02:29:21 +0000
@@ -6,23 +6,16 @@
    files=( "$@" );
 fi 
 
+RC_FILE="pylintrc"
+if [ ! -f $RC_FILE ]; then
+    RC_FILE="../pylintrc"
+fi
+
 cmd=(
     pylint
-    --reports=n
-    --include-ids=y
-    --max-line-length=79
-
+    --rcfile=$RC_FILE
     --disable=R
     --disable=I
-
-    --disable=W0142 # Used * or ** magic
-    --disable=W0511 # TODO/FIXME note
-    --disable=W0702 # No exception type(s) specified
-    --disable=W0703 # Catch "Exception"
-
-    --disable=C0103 # Invalid name
-    --disable=C0111 # Missing docstring
-
     "${files[@]}"
 )
 


Follow ups