예제 #1
0
  def action_create(self):
    path = self.resource.path

    if sudo.path_lexists(path):
      oldpath = os.path.realpath(path)
      if oldpath == self.resource.to:
        return
      if not sudo.path_lexists(path):
        raise Fail(
          "%s trying to create a symlink with the same name as an existing file or directory" % self.resource)
      Logger.info("%s replacing old symlink to %s" % (self.resource, oldpath))
      sudo.unlink(path)
      
    if self.resource.hard:
      if not sudo.path_exists(self.resource.to):
        raise Fail("Failed to apply %s, linking to nonexistent location %s" % (self.resource, self.resource.to))
      if sudo.path_isdir(self.resource.to):
        raise Fail("Failed to apply %s, cannot create hard link to a directory (%s)" % (self.resource, self.resource.to))
      
      Logger.info("Creating hard %s" % self.resource)
      sudo.link(self.resource.to, path)
    else:
      if not sudo.path_exists(self.resource.to):
        Logger.info("Warning: linking to nonexistent location %s" % self.resource.to)
        
      Logger.info("Creating symbolic %s to %s" % (self.resource, self.resource.to))
      sudo.symlink(self.resource.to, path)
예제 #2
0
  def action_create(self):
    path = self.resource.path
    
    if sudo.path_isdir(path):
      raise Fail("Applying %s failed, directory with name %s exists" % (self.resource, path))
    
    dirname = os.path.dirname(path)
    if not sudo.path_isdir(dirname):
      raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname))
    
    write = False
    content = self._get_content()
    if not sudo.path_exists(path):
      write = True
      reason = "it doesn't exist"
    elif self.resource.replace:
      if content is not None:
        old_content = sudo.read_file(path, encoding=self.resource.encoding)
        if content != old_content:
          write = True
          reason = "contents don't match"
          if self.resource.backup:
            self.resource.env.backup_file(path)

    if write:
      Logger.info("Writing %s because %s" % (self.resource, reason))
      sudo.create_file(path, content, encoding=self.resource.encoding)

    _ensure_metadata(self.resource.path, self.resource.owner,
                        self.resource.group, mode=self.resource.mode, cd_access=self.resource.cd_access)
예제 #3
0
  def action_create(self):
    path = self.resource.path

    if not sudo.path_exists(path):
      Logger.info("Creating directory %s since it doesn't exist." % self.resource)
      
      # dead links should be followed, else we gonna have failures on trying to create directories on top of them.
      if self.resource.follow:
        # Follow symlink until the tail.
        followed_links = set()
        while sudo.path_lexists(path):
          if path in followed_links:
            raise Fail("Applying %s failed, looped symbolic links found while resolving %s" % (self.resource, path))
          followed_links.add(path)
          path = sudo.readlink(path)
          
        if path != self.resource.path:
          Logger.info("Following the link {0} to {1} to create the directory".format(self.resource.path, path))

      if self.resource.recursive:
        sudo.makedirs(path, self.resource.mode or 0755)
      else:
        dirname = os.path.dirname(path)
        if not sudo.path_isdir(dirname):
          raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname))
        
        sudo.makedir(path, self.resource.mode or 0755)
      
    if not sudo.path_isdir(path):
      raise Fail("Applying %s failed, file %s already exists" % (self.resource, path))
    
    _ensure_metadata(path, self.resource.owner, self.resource.group,
                        mode=self.resource.mode, cd_access=self.resource.cd_access)
예제 #4
0
    def run_command(self,
                    target,
                    operation,
                    method='POST',
                    assertable_result=True,
                    file_to_put=None,
                    ignore_status_codes=[],
                    **kwargs):
        """
    assertable_result - some POST requests return '{"boolean":false}' or '{"boolean":true}'
    depending on if query was successful or not, we can assert this for them
    """
        target = self.parse_path(target)

        url = format(
            "{address}/webhdfs/v1{target}?op={operation}&user.name={run_user}",
            address=self.address,
            run_user=self.run_user)
        for k, v in kwargs.iteritems():
            url = format("{url}&{k}={v}")

        if file_to_put and not os.path.exists(file_to_put):
            raise Fail(format("File {file_to_put} is not found."))

        cmd = ["curl", "-sS", "-L", "-w", "%{http_code}", "-X", method]

        if file_to_put:
            cmd += ["-T", file_to_put]
        if self.security_enabled:
            cmd += ["--negotiate", "-u", ":"]
        if self.is_https_enabled:
            cmd += ["-k"]

        cmd.append(url)
        _, out, err = shell.checked_call(cmd,
                                         user=self.run_user,
                                         logoutput=self.logoutput,
                                         quiet=False,
                                         stderr=subprocess.PIPE)
        status_code = out[-3:]
        out = out[:-3]  # remove last line from output which is status code

        try:
            result_dict = json.loads(out)
        except ValueError:
            result_dict = out

        if status_code not in WebHDFSUtil.valid_status_codes + ignore_status_codes or assertable_result and result_dict and not result_dict[
                'boolean']:
            formatted_output = json.dumps(result_dict, indent=2) if isinstance(
                result_dict, dict) else result_dict
            formatted_output = err + "\n" + formatted_output
            err_msg = "Execution of '%s' returned status_code=%s. %s" % (
                shell.string_cmd_from_args_list(cmd), status_code,
                formatted_output)
            raise Fail(err_msg)

        return result_dict
예제 #5
0
    def action_create(self):
        path = self.resource.path

        if not sudo.path_exists(path):
            Logger.info("Creating directory %s since it doesn't exist." %
                        self.resource)

            # dead links should be followed, else we gonna have failures on trying to create directories on top of them.
            if self.resource.follow:
                # Follow symlink until the tail.
                followed_links = set()
                while sudo.path_islink(path):
                    if path in followed_links:
                        raise Fail(
                            "Applying %s failed, looped symbolic links found while resolving %s"
                            % (self.resource, path))
                    followed_links.add(path)
                    path = sudo.readlink(path)

                if path != self.resource.path:
                    Logger.info(
                        "Following the link {0} to {1} to create the directory"
                        .format(self.resource.path, path))

            if self.resource.create_parents:
                sudo.makedirs(path, self.resource.mode or 0755)
            else:
                dirname = os.path.dirname(path)
                if not sudo.path_isdir(dirname):
                    raise Fail(
                        "Applying %s failed, parent directory %s doesn't exist"
                        % (self.resource, dirname))

                try:
                    sudo.makedir(path, self.resource.mode or 0755)
                except Exception as ex:
                    # race condition (somebody created the file before us)
                    if "File exists" in str(ex):
                        sudo.makedirs(path, self.resource.mode or 0755)
                    else:
                        raise

        if not sudo.path_isdir(path):
            raise Fail("Applying %s failed, file %s already exists" %
                       (self.resource, path))

        _ensure_metadata(
            path,
            self.resource.owner,
            self.resource.group,
            mode=self.resource.mode,
            cd_access=self.resource.cd_access,
            recursive_ownership=self.resource.recursive_ownership,
            recursive_mode_flags=self.resource.recursive_mode_flags,
            recursion_follow_links=self.resource.recursion_follow_links,
            safemode_folders=self.resource.safemode_folders)
예제 #6
0
def post_metrics_to_collector(ams_metrics_post_url,
                              metric_collector_host,
                              metric_collector_port,
                              metric_collector_https_enabled,
                              metric_json,
                              headers,
                              ca_certs,
                              tries=1,
                              connect_timeout=10):
    for i in xrange(0, tries):
        try:
            Logger.info("Generated metrics for host %s :\n%s" %
                        (metric_collector_host, metric_json))

            Logger.info("Connecting (POST) to %s:%s%s" %
                        (metric_collector_host, metric_collector_port,
                         ams_metrics_post_url))
            conn = network.get_http_connection(
                metric_collector_host,
                int(metric_collector_port),
                metric_collector_https_enabled,
                ca_certs,
                ssl_version=Script.get_force_https_protocol_value())
            conn.request("POST", ams_metrics_post_url, metric_json, headers)

            response = conn.getresponse()
            Logger.info(
                "Http response for host %s: %s %s" %
                (metric_collector_host, response.status, response.reason))
        except (httplib.HTTPException, socket.error) as ex:
            if i < tries - 1:  #range/xrange returns items from start to end-1
                time.sleep(connect_timeout)
                Logger.info(
                    "Connection failed for host %s. Next retry in %s seconds."
                    % (metric_collector_host, connect_timeout))
                continue
            else:
                raise Fail("Metrics were not saved. Connection failed.")

        data = response.read()
        Logger.info("Http data: %s" % data)
        conn.close()

        if response.status == 200:
            Logger.info("Metrics were saved.")
            break
        else:
            Logger.info("Metrics were not saved.")
            if i < tries - 1:  #range/xrange returns items from start to end-1
                time.sleep(tries)
                Logger.info("Next retry in %s seconds." % (tries))
            else:
                raise Fail(
                    "Metrics were not saved. POST request status: %s %s \n%s" %
                    (response.status, response.reason, data))
예제 #7
0
def _set_file_acl(file, user, rights):
  acls_modify_cmd = "icacls {0} /grant {1}:{2}".format(file, user, rights)
  acls_remove_cmd = "icacls {0} /remove {1}".format(file, user)
  code, out, err = _call_command(acls_remove_cmd)
  if code != 0:
    raise Fail("Can not remove rights for path {0} and user {1}".format(file, user))
  code, out, err = _call_command(acls_modify_cmd)
  if code != 0:
    raise Fail("Can not set rights {0} for path {1} and user {2}".format(rights, file, user))
  else:
    return
예제 #8
0
파일: system.py 프로젝트: maduhu/HDP-slider
def _coerce_uid(user):
    try:
        uid = int(user)
    except ValueError:
        if not IS_WINDOWS:
            try:
                uid = pwd.getpwnam(user).pw_uid
            except KeyError:
                raise Fail("User %s doesn't exist." % user)
        else:
            raise Fail("User %s doesn't exist." % user)
    return uid
예제 #9
0
파일: system.py 프로젝트: maduhu/HDP-slider
def _coerce_gid(group):
    try:
        gid = int(group)
    except ValueError:
        if not IS_WINDOWS:
            try:
                gid = grp.getgrnam(group).gr_gid
            except KeyError:
                raise Fail("Group %s doesn't exist." % group)
        else:
            raise Fail("User %s doesn't exist." % user)
    return gid
예제 #10
0
  def _run_command(self, target, operation, method='POST', assertable_result=True, file_to_put=None, ignore_status_codes=[], **kwargs):
    """
    assertable_result - some POST requests return '{"boolean":false}' or '{"boolean":true}'
    depending on if query was successful or not, we can assert this for them
    """
    target = HdfsResourceProvider.parse_path(target)
    if not target:
      raise Fail("Target cannot be empty")

    url = format("{address}/webhdfs/v1{target}?op={operation}", address=self.address)
    request_args = kwargs

    if not self.security_enabled:
      request_args['user.name'] = self.run_user
    
    for k,v in request_args.iteritems():
      url = format("{url}&{k}={v}")
    
    cmd = ["curl", "-sS","-L", "-w", "%{http_code}", "-X", method]

    # When operation is "OPEN" the target is actually the DFS file to download and the file_to_put is actually the target see _download_file
    if operation == "OPEN":
      cmd += ["-o", file_to_put]
    else:
      if file_to_put and not os.path.exists(file_to_put):
        raise Fail(format("File {file_to_put} is not found."))

      if file_to_put:
        cmd += ["--data-binary", "@"+file_to_put, "-H", "Content-Type: application/octet-stream"]

    if self.security_enabled:
      cmd += ["--negotiate", "-u", ":"]
    if self.is_https_enabled:
      cmd += ["-k"]
      
    cmd.append(url)
    _, out, err = get_user_call_output(cmd, user=self.run_user, logoutput=self.logoutput, quiet=False)
    status_code = out[-3:]
    out = out[:-3] # remove last line from output which is status code
    
    try:
      result_dict = json.loads(out)
    except ValueError:
      result_dict = out
          
    if status_code not in WebHDFSUtil.valid_status_codes+ignore_status_codes or assertable_result and result_dict and not result_dict['boolean']:
      formatted_output = json.dumps(result_dict, indent=2) if isinstance(result_dict, dict) else result_dict
      formatted_output = err + "\n" + formatted_output
      err_msg = "Execution of '%s' returned status_code=%s. %s" % (shell.string_cmd_from_args_list(cmd), status_code, formatted_output)
      raise WebHDFSCallException(err_msg, result_dict)
    
    return result_dict
예제 #11
0
def get_name_service_by_hostname(hdfs_site, host_name):
    """
   Finds the name service which the name node belongs to in an HA or federated setup.
  :param hdfs_site: the hdfs config
  :param host_name: the host name of the name node, can be None if there is only 1 name service
  :return: the name service
  """
    #there has to be a name service - we are in HA at least
    name_services_string = hdfs_site['dfs.internal.nameservices']
    if not name_services_string:
        raise Fail('Not a HA setup')
    name_services = name_services_string.split(',')
    if len(name_services) == 1:
        return name_services[0]

    if not host_name:
        raise ValueError('Host name required when using namenode federation')

    for ns in name_services:
        ha_name_nodes = hdfs_site['dfs.ha.namenodes.{0}'.format(ns)].split(',')
        for nn in ha_name_nodes:
            nn_rpc_port = hdfs_site['dfs.namenode.rpc-address.{0}.{1}'.format(
                ns, nn)]
            nn_rpc = nn_rpc_port.split(':')[0]
            if nn_rpc == host_name:
                return ns
예제 #12
0
 def check_zeppelin_server(self):
   import params
   path = params.conf_dir + "/interpreter.json"
   if os.path.exists(path) and os.path.getsize(path):
     Logger.info("interpreter.json found. Zeppelin server started.")
   else:
     raise Fail("interpreter.json not found. waiting for Zeppelin server to start...")
예제 #13
0
    def action_delayed(self, action_name, main_resource):
        dfs_type = main_resource.resource.dfs_type

        if main_resource.resource.nameservices is None:  # all nameservices
            nameservices = namenode_ha_utils.get_nameservices(
                main_resource.resource.hdfs_site)
        else:
            nameservices = main_resource.resource.nameservices

        # non-federated cluster
        if not nameservices:
            self.action_delayed_for_nameservice(None, action_name,
                                                main_resource)
        else:
            for nameservice in nameservices:
                try:
                    if not dfs_type:
                        raise Fail(
                            "<serviceType> for fileSystem service should be set in metainfo.xml"
                        )
                    nameservice = dfs_type.lower() + "://" + nameservice

                    self.action_delayed_for_nameservice(
                        nameservice, action_name, main_resource)
                except namenode_ha_utils.NoActiveNamenodeException as ex:
                    # one of ns can be down (during initial start forexample) no need to worry for federated cluster
                    if len(nameservices) > 1:
                        Logger.exception(
                            "Cannot run HdfsResource for nameservice {0}. Due to no active namenode present"
                            .format(nameservice))
                    else:
                        raise
예제 #14
0
  def action_run(self):
    if self.resource.creates:
      if os.path.exists(self.resource.creates):
        return

    Logger.debug("Executing %s" % self.resource)
    
    if self.resource.path != []:
      if not self.resource.environment:
        self.resource.environment = {}
      
      self.resource.environment['PATH'] = os.pathsep.join(self.resource.path) 
    
    for i in range (0, self.resource.tries):
      try:
        shell.checked_call(self.resource.command, logoutput=self.resource.logoutput,
                            cwd=self.resource.cwd, env=self.resource.environment,
                            preexec_fn=_preexec_fn(self.resource), user=self.resource.user,
                            wait_for_finish=self.resource.wait_for_finish, timeout=self.resource.timeout)
        break
      except Fail as ex:
        if i == self.resource.tries-1: # last try
          raise ex
        else:
          Logger.info("Retrying after %d seconds. Reason: %s" % (self.resource.try_sleep, str(ex)))
          time.sleep(self.resource.try_sleep)
      except ExecuteTimeoutException:
        err_msg = ("Execution of '%s' was killed due timeout after %d seconds") % (self.resource.command, self.resource.timeout)
        
        if self.resource.on_timeout:
          Logger.info("Executing '%s'. Reason: %s" % (self.resource.on_timeout, err_msg))
          shell.checked_call(self.resource.on_timeout)
        else:
          raise Fail(err_msg)
예제 #15
0
def get_property_for_active_namenode(hdfs_site, property_name,
                                     security_enabled, run_user):
    """
  For dfs.namenode.rpc-address:
    - In non-ha mode it will return hdfs_site[dfs.namenode.rpc-address]
    - In ha-mode it will return hdfs_site[dfs.namenode.rpc-address.nnha.nn2], where nnha is the name of HA, and nn2 is id of active NN
  """
    value = None
    rpc_key = None
    if is_ha_enabled(hdfs_site):
        name_service = hdfs_site['dfs.nameservices']
        active_namenodes = get_namenode_states(hdfs_site, security_enabled,
                                               run_user)[0]

        if not len(active_namenodes):
            raise Fail("There is no active namenodes.")

        active_namenode_id = active_namenodes[0][0]
        value = hdfs_site[format(
            "{property_name}.{name_service}.{active_namenode_id}")]
        rpc_key = NAMENODE_RPC_FRAGMENT.format(name_service,
                                               active_namenode_id)
    else:
        value = hdfs_site[property_name]
        rpc_key = NAMENODE_RPC_NON_HA

    if INADDR_ANY in value and rpc_key in hdfs_site:
        rpc_value = str(hdfs_site[rpc_key])
        if INADDR_ANY not in rpc_value:
            rpc_host = rpc_value.split(":")[0]
            value = value.replace(INADDR_ANY, rpc_host)

    return value
예제 #16
0
def _ensure_metadata(path, user, group, mode=None, cd_access=None):
    stat = sudo.stat(path)

    if user:
        uid = _coerce_uid(user)
        if stat.st_uid != uid:
            Logger.info("Changing owner for %s from %d to %s" %
                        (path, stat.st_uid, user))

            sudo.chown(path, user, None)

    if group:
        gid = _coerce_gid(group)
        if stat.st_gid != gid:
            Logger.info("Changing group for %s from %d to %s" %
                        (path, stat.st_gid, group))
            sudo.chown(path, None, group)

    if mode:
        if stat.st_mode != mode:
            Logger.info("Changing permission for %s from %o to %o" %
                        (path, stat.st_mode, mode))
            sudo.chmod(path, mode)

    if cd_access:
        if not re.match("^[ugoa]+$", cd_access):
            raise Fail("'cd_acess' value '%s' is not valid" % (cd_access))

        dir_path = path
        while dir_path != os.sep:
            if sudo.path_isdir(dir_path):
                sudo.chmod_extended(dir_path, cd_access + "+x")

            dir_path = os.path.split(dir_path)[0]
예제 #17
0
    def action_install(self):
        hSCM = safe_open_scmanager()

        self._fix_start_type()
        self._fix_user_name()

        try:
            hSvc = win32service.CreateService(
                hSCM,
                self.resource.service_name,
                self.resource.display_name,
                win32service.SERVICE_ALL_ACCESS,  # desired access
                win32service.SERVICE_WIN32_OWN_PROCESS,  # service type
                self.resource.start_type,
                win32service.SERVICE_ERROR_NORMAL,  # error control type
                self.resource.exe_path,
                None,
                0,
                None,
                self.resource.userName,
                self.resource.password)
            if self.resource.description:
                try:
                    win32service.ChangeServiceConfig2(
                        hSvc, win32service.SERVICE_CONFIG_DESCRIPTION,
                        self.description)
                except NotImplementedError:
                    pass  ## ChangeServiceConfig2 and description do not exist on NT

            win32service.CloseServiceHandle(hSvc)
        except win32api.error, details:
            raise Fail("Error creating service {0}: {1}".format(
                self.resource.service_name, details.winerror))
예제 #18
0
    def action_configure(self):
        hSCM = safe_open_scmanager()

        try:
            hSvc = safe_open_service(hSCM, self.resource.service_name)

            self._fix_start_type()

            try:
                win32service.ChangeServiceConfig(
                    hSvc, win32service.SERVICE_NO_CHANGE,
                    self.resource.start_type, win32service.SERVICE_NO_CHANGE,
                    None, None, 0, None, None, None,
                    self.resource.display_name)
                if self.resource.description:
                    try:
                        win32service.ChangeServiceConfig2(
                            hSvc, win32service.SERVICE_CONFIG_DESCRIPTION,
                            self.resource.description)
                    except NotImplementedError:
                        pass  ## ChangeServiceConfig2 and description do not exist on NT
            except win32api.error, details:
                raise Fail("Error configuring service {0}: {1}".format(
                    self.resource.service_name, details.winerror))
            finally:
                win32service.CloseServiceHandle(hSvc)
def perform_grafana_put_call(url, id, payload, server):
  response = None
  data = None
  userAndPass = b64encode('{0}:{1}'.format(server.user, server.password))
  headers = {"Content-Type": "application/json",
             'Authorization' : 'Basic %s' %  userAndPass }
  grafana_https_enabled = server.protocol.lower() == 'https'

  for i in xrange(0, GRAFANA_CONNECT_TRIES):
    try:
      conn = network.get_http_connection(server.host, int(server.port), grafana_https_enabled)
      conn.request("PUT", url + "/" + str(id), payload, headers)
      response = conn.getresponse()
      data = response.read()
      Logger.info("Http data: %s" % data)
      conn.close()
      break
    except (httplib.HTTPException, socket.error) as ex:
      if i < GRAFANA_CONNECT_TRIES - 1:
        time.sleep(GRAFANA_CONNECT_TIMEOUT)
        Logger.info("Connection to Grafana failed. Next retry in %s seconds."
                    % (GRAFANA_CONNECT_TIMEOUT))
        continue
      else:
        raise Fail("Ambari Metrics Grafana update failed due to: %s" % str(ex))
      pass

  return (response, data)
def perform_grafana_get_call(url, server):
  grafana_https_enabled = server.protocol.lower() == 'https'
  response = None

  for i in xrange(0, GRAFANA_CONNECT_TRIES):
    try:
      conn = network.get_http_connection(server.host,
                                         int(server.port),
                                         grafana_https_enabled)

      userAndPass = b64encode('{0}:{1}'.format(server.user, server.password))
      headers = { 'Authorization' : 'Basic %s' %  userAndPass }

      Logger.info("Connecting (GET) to %s:%s%s" % (server.host, server.port, url))

      conn.request("GET", url, headers = headers)
      response = conn.getresponse()
      Logger.info("Http response: %s %s" % (response.status, response.reason))
      break
    except (httplib.HTTPException, socket.error) as ex:
      if i < GRAFANA_CONNECT_TRIES - 1:
        time.sleep(GRAFANA_CONNECT_TIMEOUT)
        Logger.info("Connection to Grafana failed. Next retry in %s seconds."
                    % (GRAFANA_CONNECT_TIMEOUT))
        continue
      else:
        raise Fail("Ambari Metrics Grafana update failed due to: %s" % str(ex))
      pass

  return response
예제 #21
0
  def service_check(self, env):
    from resource_management.libraries.functions.windows_service_utils import check_windows_service_exists
    import params

    env.set_params(params)

    #Just check that the services were correctly installed
    #Check the monitor on all hosts
    Logger.info("Metrics Monitor service check was started.")
    if not check_windows_service_exists(params.ams_monitor_win_service_name):
      raise Fail("Metrics Monitor service was not properly installed. Check the logs and retry the installation.")
    #Check the collector only where installed
    if params.ams_collector_home_dir and os.path.isdir(params.ams_collector_home_dir):
      Logger.info("Metrics Collector service check was started.")
      if not check_windows_service_exists(params.ams_collector_win_service_name):
        raise Fail("Metrics Collector service was not properly installed. Check the logs and retry the installation.")
예제 #22
0
def get_mounted():
  """
  :return: Return a list of mount objects (dictionary type) that contain the device, mount point, and other options.
  """
  p = Popen("mount", stdout=PIPE, stderr=STDOUT, shell=True)
  out = p.communicate()[0]
  if p.wait() != 0:
    raise Fail("Getting list of mounts (calling mount) failed")

  mounts = [x.split(' ') for x in out.strip().split('\n')]

  results = []
  for m in mounts:
    # Example of m:
    # /dev/sda1 on / type ext4 (rw,barrier=0)
    # /dev/sdb on /grid/0 type ext4 (rw,discard)
    if len(m) >= 6 and m[1] == "on" and m[3] == "type":
      x = dict(
        device=m[0],
        mount_point=m[2],
        fstype=m[4],
        options=m[5][1:-1].split(',') if len(m[5]) >= 2 else []
      )
      results.append(x)

  return results
예제 #23
0
def assert_not_safemode_folder(path, safemode_folders):
    if os.path.abspath(path) in safemode_folders:
        raise Fail((
            "Not performing recursive operation ('recursive_ownership' or 'recursive_mode_flags') on folder '%s'"
            +
            " as this can damage the system. Please pass changed safemode_folders parameter to Directory resource if you really intend to do this."
        ) % (path))
예제 #24
0
  def _assert_valid(self):
    source = self.main_resource.resource.source
    type = self.main_resource.resource.type
    target = self.main_resource.resource.target

    if source:
      if not os.path.exists(source):
        raise Fail(format("Source {source} doesn't exist"))
      if type == "directory" and os.path.isfile(source):
        raise Fail(format("Source {source} is file but type is {type}"))
      elif type == "file" and os.path.isdir(source):
        raise Fail(format("Source {source} is directory but type is {type}"))

    self.target_status = self._get_file_status(target)

    if self.target_status and self.target_status['type'].lower() != type:
      raise Fail(format("Trying to create file/directory but directory/file exists in the DFS on {target}"))
예제 #25
0
def safe_open_scmanager():
    try:
        _schSCManager = win32service.OpenSCManager(
            None, None, win32service.SC_MANAGER_ALL_ACCESS)
    except win32api.error, details:
        raise Fail(
            "Error opening Service Control Manager on the local machine: {0}".
            format(details.winerror))
예제 #26
0
def create_grafana_admin_pwd():
    import params

    serverCall1 = Server(protocol=params.ams_grafana_protocol.strip(),
                         host=params.ams_grafana_host.strip(),
                         port=params.ams_grafana_port,
                         user=params.ams_grafana_admin_user,
                         password=params.ams_grafana_admin_pwd)

    response = perform_grafana_get_call(GRAFANA_USER_URL, serverCall1)
    if response and response.status != 200:

        serverCall2 = Server(protocol=params.ams_grafana_protocol.strip(),
                             host=params.ams_grafana_host.strip(),
                             port=params.ams_grafana_port,
                             user=params.ams_grafana_admin_user,
                             password='******')

        Logger.debug("Setting grafana admin password")
        pwd_data = {
            "oldPassword": "******",
            "newPassword": params.ams_grafana_admin_pwd,
            "confirmNew": params.ams_grafana_admin_pwd
        }
        password_json = json.dumps(pwd_data)

        (response, data) = perform_grafana_put_call(GRAFANA_USER_URL,
                                                    'password', password_json,
                                                    serverCall2)

        if response.status == 200:
            Logger.info("Ambari Metrics Grafana password updated.")

        elif response.status == 500:
            Logger.info(
                "Ambari Metrics Grafana password update failed. Not retrying.")
            raise Fail(
                "Ambari Metrics Grafana password update failed. PUT request status: %s %s \n%s"
                % (response.status, response.reason, data))
        else:
            raise Fail("Ambari Metrics Grafana password creation failed. "
                       "PUT request status: %s %s \n%s" %
                       (response.status, response.reason, data))
    else:
        Logger.info("Grafana password update not required.")
    pass
예제 #27
0
 def action_delete(self):
   path = self.resource.path
   if os.path.exists(path):
     if not os.path.isdir(path):
       raise Fail("Applying %s failed, %s is not a directory" % (self.resource, path))
     
     Logger.info("Removing directory %s and all its content" % self.resource)
     shutil.rmtree(path)
def perform_grafana_post_call(url, payload, server):
    import params

    response = None
    data = None
    userAndPass = b64encode('{0}:{1}'.format(server.user, server.password))
    Logger.debug('POST payload: %s' % payload)
    headers = {
        "Content-Type": "application/json",
        "Content-Length": len(payload),
        'Authorization': 'Basic %s' % userAndPass
    }
    grafana_https_enabled = server.protocol.lower() == 'https'

    ca_certs = None
    if grafana_https_enabled:
        ca_certs = params.ams_grafana_ca_cert

    for i in xrange(0, params.grafana_connect_attempts):
        try:
            Logger.info("Connecting (POST) to %s:%s%s" %
                        (server.host, server.port, url))
            conn = network.get_http_connection(
                server.host,
                int(server.port),
                grafana_https_enabled,
                ca_certs,
                ssl_version=Script.get_force_https_protocol_value())

            conn.request("POST", url, payload, headers)

            response = conn.getresponse()
            Logger.info("Http response: %s %s" %
                        (response.status, response.reason))
            if response.status == 401:  #Intermittent error thrown from Grafana
                if i < params.grafana_connect_attempts - 1:
                    Logger.info(
                        "Connection to Grafana failed. Next retry in %s seconds."
                        % (params.grafana_connect_retry_delay))
                    time.sleep(params.grafana_connect_retry_delay)
                    continue
            data = response.read()
            Logger.info("Http data: %s" % data)
            conn.close()
            break
        except (httplib.HTTPException, socket.error) as ex:
            if i < params.grafana_connect_attempts - 1:
                Logger.info(
                    "Connection to Grafana failed. Next retry in %s seconds." %
                    (params.grafana_connect_retry_delay))
                time.sleep(params.grafana_connect_retry_delay)
                continue
            else:
                raise Fail("Ambari Metrics Grafana update failed due to: %s" %
                           str(ex))
            pass

    return (response, data)
예제 #29
0
파일: system.py 프로젝트: mbigelow/ambari
 def _get_content(self):
     content = self.resource.content
     if content is None:
         return None
     elif isinstance(content, basestring):
         return content
     elif hasattr(content, "__call__"):
         return content()
     raise Fail("Unknown source type for %s: %r" % (self, content))
예제 #30
0
def _coerce_gid(group):
    try:
        gid = int(group)
    except ValueError:
        try:
            gid = grp.getgrnam(group).gr_gid
        except KeyError:
            raise Fail("Group %s doesn't exist." % group)
    return gid