docs: def upload_etc():
      """
      Upload and render all templates in the woven/etc directory to the respective directories on the nodes
      
      Only configuration for installed packages will be uploaded where that package creates it's own subdirectory
      in /etc/ ie /etc/apache2.
      
      For configuration that falls in some other non package directories ie init.d, logrotate.d etc
      it is intended that this function only replace existing configuration files. To ensure we don't upload 
      etc files that are intended to accompany a particular package.
      """
      role = env.role_lookup[env.host_string]
      packages = env.packages[role]
      #determine the templatedir
      if env.verbosity:
          print "UPLOAD ETC configuration templates"
      if not hasattr(env, 'project_template_dir'):
          #the normal pattern would mean the shortest path is the main one.
          #its probably the last listed
          length = 1000
          env.project_template_dir = ''
          for dir in env.TEMPLATE_DIRS:
              if dir:
                  len_dir = len(dir)
                  if len_dir < length:
                      length = len_dir
                      env.project_template_dir = dir
  
      template_dir = os.path.join(os.path.split(os.path.realpath(__file__))[0],'templates','')
      default_templates = _get_template_files(template_dir)
      if env.project_template_dir: user_templates = _get_template_files(os.path.join(env.project_template_dir,''))
      else: user_templates = set([])
      etc_templates = user_templates | default_templates
  
      context = {'host_ip':socket.gethostbyname(env.host)}
      if env.overwrite or env.installed_packages[env.host]: mod_only = False
      else: mod_only = True
      for t in etc_templates:
          dest = t.replace('woven','',1)
          directory,filename = os.path.split(dest)
          package_name = filename.split('.')[0]
          if directory in ['/etc','/etc/init.d','/etc/init','/etc/logrotate.d','/etc/rsyslog.d']:
              #must be replacing an existing file
              if not exists(dest) and package_name not in packages: continue
          elif directory == '/etc/ufw/applications.d':
              #must be a package name
              if filename not in packages: continue
          elif not exists(directory, use_sudo=True): continue
          uploaded = upload_template(t,dest,context=context,use_sudo=True, modified_only=mod_only)
              
          if uploaded:
              sudo(' '.join(["chown root:root",dest]))
              if 'init.d' in dest: sudo(' '.join(["chmod ugo+rx",dest]))
              else: sudo(' '.join(["chmod ugo+r",dest]))
              if env.verbosity:
                  print " * uploaded",dest