示例#1
0
int		main(int ac, char **av, char **env)
{
  t_all		all;
  char          *str;
  char		**mav;
  int		check;
  int		l;

  all.hist = NULL;
  check = (init_main(ac, av, &all.lenv, &str));
  all.cd.previous = NULL;
  environ_copy(&all.lenv, env);
  init_caps(&all.caps, env);
  while (check != -1)
    {
      manwhile(&str, &l, &all.lenv, &check);
      str = (char *)get_commandline(&all.caps, l, end_hist(all.hist));
      my_history(&all.hist, str);
      write(1, "\n", 1);
      if (str[my_strlen(str)] == '\0')
	if (before_manif(&str, &mav) != 0)
	  if (mav[0])
	    check = big_manif(mav, &all.path, &all.lenv, &all.cd);
    }
  finish_main(&all.lenv);
  free_list_history(all.hist);
  return (1);
}
示例#2
0
int     PROC_MEM(AGENT_REQUEST *request, AGENT_RESULT *result)
{
#define ZBX_SIZE	1
#define ZBX_RSS		2
#define ZBX_VSIZE	3
#define ZBX_PMEM	4
#define ZBX_TSIZE	5
#define ZBX_DSIZE	6
#define ZBX_SSIZE	7

    char		*procname, *proccomm, *param, *args, *mem_type = NULL;
    int		do_task, pagesize, count, i, proccount = 0, invalid_user = 0, mem_type_code, mib[4];
    unsigned int	mibs;
    zbx_uint64_t	mem_size = 0, byte_value = 0;
    double		pct_size = 0.0, pct_value = 0.0;
#if (__FreeBSD_version) < 500000
    int		mem_pages;
#else
    unsigned long 	mem_pages;
#endif
    size_t	sz;

    struct kinfo_proc	*proc = NULL;
    struct passwd		*usrinfo;

    if (5 < request->nparam)
    {
        SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters."));
        return SYSINFO_RET_FAIL;
    }

    procname = get_rparam(request, 0);
    param = get_rparam(request, 1);

    if (NULL != param && '\0' != *param)
    {
        errno = 0;

        if (NULL == (usrinfo = getpwnam(param)))
        {
            if (0 != errno)
            {
                SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain user information: %s",
                                                    zbx_strerror(errno)));
                return SYSINFO_RET_FAIL;
            }

            invalid_user = 1;
        }
    }
    else
        usrinfo = NULL;

    param = get_rparam(request, 2);

    if (NULL == param || '\0' == *param || 0 == strcmp(param, "sum"))
        do_task = ZBX_DO_SUM;
    else if (0 == strcmp(param, "avg"))
        do_task = ZBX_DO_AVG;
    else if (0 == strcmp(param, "max"))
        do_task = ZBX_DO_MAX;
    else if (0 == strcmp(param, "min"))
        do_task = ZBX_DO_MIN;
    else
    {
        SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter."));
        return SYSINFO_RET_FAIL;
    }

    proccomm = get_rparam(request, 3);
    mem_type = get_rparam(request, 4);

    if (NULL == mem_type || '\0' == *mem_type || 0 == strcmp(mem_type, "size"))
    {
        mem_type_code = ZBX_SIZE;		/* size of process (code + data + stack) */
    }
    else if (0 == strcmp(mem_type, "rss"))
    {
        mem_type_code = ZBX_RSS;		/* resident set size */
    }
    else if (0 == strcmp(mem_type, "vsize"))
    {
        mem_type_code = ZBX_VSIZE;		/* virtual size */
    }
    else if (0 == strcmp(mem_type, "pmem"))
    {
        mem_type_code = ZBX_PMEM;		/* percentage of real memory used by process */
    }
    else if (0 == strcmp(mem_type, "tsize"))
    {
        mem_type_code = ZBX_TSIZE;		/* text size */
    }
    else if (0 == strcmp(mem_type, "dsize"))
    {
        mem_type_code = ZBX_DSIZE;		/* data size */
    }
    else if (0 == strcmp(mem_type, "ssize"))
    {
        mem_type_code = ZBX_SSIZE;		/* stack size */
    }
    else
    {
        SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid fifth parameter."));
        return SYSINFO_RET_FAIL;
    }

    if (1 == invalid_user)	/* handle 0 for non-existent user after all parameters have been parsed and validated */
        goto out;

    pagesize = getpagesize();

    mib[0] = CTL_KERN;
    mib[1] = KERN_PROC;
    if (NULL != usrinfo)
    {
        mib[2] = KERN_PROC_UID;
        mib[3] = usrinfo->pw_uid;
        mibs = 4;
    }
    else
    {
#if (__FreeBSD_version) < 500000
        mib[2] = KERN_PROC_ALL;
#else
        mib[2] = KERN_PROC_PROC;
#endif
        mib[3] = 0;
        mibs = 3;
    }

    if (ZBX_PMEM == mem_type_code)
    {
        sz = sizeof(mem_pages);

        if (0 != sysctlbyname("hw.availpages", &mem_pages, &sz, NULL, (size_t)0))
        {
            SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain number of physical pages: %s",
                                                zbx_strerror(errno)));
            return SYSINFO_RET_FAIL;
        }
    }

    sz = 0;
    if (0 != sysctl(mib, mibs, NULL, &sz, NULL, (size_t)0))
    {
        SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain necessary buffer size from system: %s",
                                            zbx_strerror(errno)));
        return SYSINFO_RET_FAIL;
    }

    proc = (struct kinfo_proc *)zbx_malloc(proc, sz);
    if (0 != sysctl(mib, mibs, proc, &sz, NULL, (size_t)0))
    {
        zbx_free(proc);
        SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain process information: %s",
                                            zbx_strerror(errno)));
        return SYSINFO_RET_FAIL;
    }

    count = sz / sizeof(struct kinfo_proc);

    for (i = 0; i < count; i++)
    {
        if (NULL != procname && '\0' != *procname && 0 != strcmp(procname, proc[i].ZBX_PROC_COMM))
            continue;

        if (NULL != proccomm && '\0' != *proccomm)
        {
            if (NULL == (args = get_commandline(&proc[i])))
                continue;

            if (NULL == zbx_regexp_match(args, proccomm, NULL))
                continue;
        }

        switch (mem_type_code)
        {
        case ZBX_SIZE:
            byte_value = (proc[i].ZBX_PROC_TSIZE + proc[i].ZBX_PROC_DSIZE + proc[i].ZBX_PROC_SSIZE)
                         * pagesize;
            break;
        case ZBX_RSS:
            byte_value = proc[i].ZBX_PROC_RSSIZE * pagesize;
            break;
        case ZBX_VSIZE:
            byte_value = proc[i].ZBX_PROC_VSIZE;
            break;
        case ZBX_PMEM:
            if (0 != (proc[i].ZBX_PROC_FLAG & ZBX_PROC_MASK))
#if (__FreeBSD_version) < 500000
                pct_value = ((float)(proc[i].ZBX_PROC_RSSIZE + UPAGES) / mem_pages) * 100.0;
#else
                pct_value = ((float)proc[i].ZBX_PROC_RSSIZE / mem_pages) * 100.0;
#endif
            else
                pct_value = 0.0;
            break;
        case ZBX_TSIZE:
            byte_value = proc[i].ZBX_PROC_TSIZE * pagesize;
            break;
        case ZBX_DSIZE:
            byte_value = proc[i].ZBX_PROC_DSIZE * pagesize;
            break;
        case ZBX_SSIZE:
            byte_value = proc[i].ZBX_PROC_SSIZE * pagesize;
            break;
        }

        if (ZBX_PMEM != mem_type_code)
        {
            if (0 != proccount++)
            {
                if (ZBX_DO_MAX == do_task)
                    mem_size = MAX(mem_size, byte_value);
                else if (ZBX_DO_MIN == do_task)
                    mem_size = MIN(mem_size, byte_value);
                else
                    mem_size += byte_value;
            }
            else
                mem_size = byte_value;
        }
        else
        {
            if (0 != proccount++)
            {
                if (ZBX_DO_MAX == do_task)
                    pct_size = MAX(pct_size, pct_value);
                else if (ZBX_DO_MIN == do_task)
                    pct_size = MIN(pct_size, pct_value);
                else
                    pct_size += pct_value;
            }
            else
                pct_size = pct_value;
        }
    }
示例#3
0
文件: proc.c 项目: gheja/zabbix-ext
int     PROC_MEM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
	char	procname[MAX_STRING_LEN],
		buffer[MAX_STRING_LEN],
		proccomm[MAX_STRING_LEN], *args;
	int	do_task, pagesize, count, i,
		proc_ok, comm_ok,
		mib[4], mibs;

	double	value = 0.0,
		memsize = 0;
	int	proccount = 0;

	size_t	sz;

	struct kinfo_proc	*proc = NULL;
	struct passwd		*usrinfo;

	if (num_param(param) > 4)
		return SYSINFO_RET_FAIL;

	if (0 != get_param(param, 1, procname, sizeof(procname)))
		*procname = '\0';
	else if (strlen(procname) > ZBX_COMMLEN)
		procname[ZBX_COMMLEN] = '\0';

	if (0 != get_param(param, 2, buffer, sizeof(buffer)))
		*buffer = '\0';

	if (*buffer != '\0')
	{
		usrinfo = getpwnam(buffer);
		if (usrinfo == NULL)	/* incorrect user name */
			return SYSINFO_RET_FAIL;
	}
	else
		usrinfo = NULL;

	if (0 != get_param(param, 3, buffer, sizeof(buffer)))
		*buffer = '\0';

	if (*buffer != '\0')
	{
		if (0 == strcmp(buffer, "avg"))
			do_task = DO_AVG;
		else if (0 == strcmp(buffer, "max"))
			do_task = DO_MAX;
		else if (0 == strcmp(buffer, "min"))
			do_task = DO_MIN;
		else if (0 == strcmp(buffer, "sum"))
			do_task = DO_SUM;
		else
			return SYSINFO_RET_FAIL;
	}
	else
		do_task = DO_SUM;

	if (0 != get_param(param, 4, proccomm, sizeof(proccomm)))
		*proccomm = '\0';

	pagesize = getpagesize();

	mib[0] = CTL_KERN;
	mib[1] = KERN_PROC;
	if (NULL != usrinfo)
	{
		mib[2] = KERN_PROC_UID;
		mib[3] = usrinfo->pw_uid;
		mibs = 4;
	}
	else
	{
		mib[2] = KERN_PROC_ALL;
		mib[3] = 0;
		mibs = 3;
	}

	sz = 0;
	if (0 != sysctl(mib, mibs, NULL, &sz, NULL, 0))
		return SYSINFO_RET_FAIL;

	proc = (struct kinfo_proc *)zbx_malloc(proc, sz);
	if (0 != sysctl(mib, mibs, proc, &sz, NULL, 0))
	{
		zbx_free(proc);
		return SYSINFO_RET_FAIL;
	}

	count = sz / sizeof(struct kinfo_proc);

	for (i = 0; i < count; i++)
	{
#if(__FreeBSD_version > 500000)
		if (proc[i].ki_flag & P_KTHREAD)	/* skip a system thread */
			continue;
#endif

		proc_ok = 0;
		comm_ok = 0;
		if (*procname == '\0' || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM))
			proc_ok = 1;

		if (*proccomm != '\0')
		{
			if (NULL != (args = get_commandline(&proc[i])))
				if (zbx_regexp_match(args, proccomm, NULL) != NULL)
					comm_ok = 1;
		}
		else
			comm_ok = 1;

		if (proc_ok && comm_ok)
		{
			value = proc[i].ZBX_PROC_TSIZE + proc[i].ZBX_PROC_DSIZE + proc[i].ZBX_PROC_SSIZE;
			value *= pagesize;

			if (0 == proccount++)
				memsize = value;
			else
			{
				if (do_task == DO_MAX)
					memsize = MAX(memsize, value);
				else if (do_task == DO_MIN)
					memsize = MIN(memsize, value);
				else
					memsize += value;
			}
		}
	}
	zbx_free(proc);

	if (do_task == DO_AVG)
		SET_DBL_RESULT(result, proccount == 0 ? 0 : memsize/proccount);
	else
		SET_UI64_RESULT(result, memsize);

	return SYSINFO_RET_OK;
}
示例#4
0
文件: proc.c 项目: gheja/zabbix-ext
int	PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
	char	procname[MAX_STRING_LEN],
		buffer[MAX_STRING_LEN],
		proccomm[MAX_STRING_LEN], *args;
	int	zbx_proc_stat, count, i,
		proc_ok, stat_ok, comm_ok,
		mib[4], mibs;

	int	proccount = 0;

	size_t	sz;

	struct kinfo_proc	*proc = NULL;
	struct passwd		*usrinfo;

	if (num_param(param) > 4)
		return SYSINFO_RET_FAIL;

	if (0 != get_param(param, 1, procname, sizeof(procname)))
		*procname = '\0';
	else if (strlen(procname) > ZBX_COMMLEN)
		procname[ZBX_COMMLEN] = '\0';

	if (0 != get_param(param, 2, buffer, sizeof(buffer)))
		*buffer = '\0';

	if (*buffer != '\0')
	{
		usrinfo = getpwnam(buffer);
		if (usrinfo == NULL)	/* incorrect user name */
			return SYSINFO_RET_FAIL;
	}
	else
		usrinfo = NULL;

	if (0 != get_param(param, 3, buffer, sizeof(buffer)))
		*buffer = '\0';

	if (*buffer != '\0')
	{
		if (0 == strcmp(buffer, "run"))
			zbx_proc_stat = ZBX_PROC_STAT_RUN;
		else if (0 == strcmp(buffer, "sleep"))
			zbx_proc_stat = ZBX_PROC_STAT_SLEEP;
		else if (0 == strcmp(buffer, "zomb"))
			zbx_proc_stat = ZBX_PROC_STAT_ZOMB;
		else if (0 == strcmp(buffer, "all"))
			zbx_proc_stat = ZBX_PROC_STAT_ALL;
		else
			return SYSINFO_RET_FAIL;
	}
	else
		zbx_proc_stat = ZBX_PROC_STAT_ALL;

	if (0 != get_param(param, 4, proccomm, sizeof(proccomm)))
		*proccomm = '\0';

	mib[0] = CTL_KERN;
	mib[1] = KERN_PROC;
	if (NULL != usrinfo)
	{
		mib[2] = KERN_PROC_UID;
		mib[3] = usrinfo->pw_uid;
		mibs = 4;
	}
	else
	{
		mib[2] = KERN_PROC_ALL;
		mib[3] = 0;
		mibs = 3;
	}

	sz = 0;
	if (0 != sysctl(mib, mibs, NULL, &sz, NULL, 0))
		return SYSINFO_RET_FAIL;

	proc = (struct kinfo_proc *)zbx_malloc(proc, sz);
	if (0 != sysctl(mib, mibs, proc, &sz, NULL, 0))
	{
		zbx_free(proc);
		return SYSINFO_RET_FAIL;
	}

	count = sz / sizeof(struct kinfo_proc);

	for (i = 0; i < count; i++)
	{
#if(__FreeBSD_version > 500000)
		if (proc[i].ki_flag & P_KTHREAD)	/* skip a system thread */
			continue;
#endif

		proc_ok = 0;
		stat_ok = 0;
		comm_ok = 0;

		if (*procname == '\0' || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM))
			proc_ok = 1;

		if (zbx_proc_stat != ZBX_PROC_STAT_ALL)
		{
			switch (zbx_proc_stat) {
			case ZBX_PROC_STAT_RUN:
				if (proc[i].ZBX_PROC_STAT == SRUN)
					stat_ok = 1;
				break;
			case ZBX_PROC_STAT_SLEEP:
				if (proc[i].ZBX_PROC_STAT == SSLEEP)
					stat_ok = 1;
				break;
			case ZBX_PROC_STAT_ZOMB:
				if (proc[i].ZBX_PROC_STAT == SZOMB)
					stat_ok = 1;
				break;
			}
		}
		else
			stat_ok = 1;

		if (*proccomm != '\0')
		{
			if (NULL != (args = get_commandline(&proc[i])))
				if (zbx_regexp_match(args, proccomm, NULL) != NULL)
					comm_ok = 1;
		}
		else
			comm_ok = 1;

		if (proc_ok && stat_ok && comm_ok)
			proccount++;
	}
	zbx_free(proc);

	SET_UI64_RESULT(result, proccount);

	return SYSINFO_RET_OK;
}
示例#5
0
int     PROC_MEM(AGENT_REQUEST *request, AGENT_RESULT *result)
{
	char	*procname, *proccomm, *param, *args;
	int	do_task, pagesize, count, i,
		proc_ok, comm_ok,
		mib[4], mibs;

	double	value, memsize = 0;
	int	proccount = 0;

	size_t	sz;

	struct kinfo_proc	*proc = NULL;
	struct passwd		*usrinfo;

	if (4 < request->nparam)
		return SYSINFO_RET_FAIL;

	procname = get_rparam(request, 0);
	param = get_rparam(request, 1);

	if (NULL != param && '\0' != *param)
	{
		if (NULL == (usrinfo = getpwnam(param)))	/* incorrect user name */
			return SYSINFO_RET_FAIL;
	}
	else
		usrinfo = NULL;

	param = get_rparam(request, 2);

	if (NULL == param || '\0' == *param || 0 == strcmp(param, "sum"))
		do_task = DO_SUM;
	else if (0 == strcmp(param, "avg"))
		do_task = DO_AVG;
	else if (0 == strcmp(param, "max"))
		do_task = DO_MAX;
	else if (0 == strcmp(param, "min"))
		do_task = DO_MIN;
	else
		return SYSINFO_RET_FAIL;

	proccomm = get_rparam(request, 3);

	pagesize = getpagesize();

	mib[0] = CTL_KERN;
	mib[1] = KERN_PROC;
	if (NULL != usrinfo)
	{
		mib[2] = KERN_PROC_UID;
		mib[3] = usrinfo->pw_uid;
		mibs = 4;
	}
	else
	{
#if(__FreeBSD_version > 500000)
		mib[2] = KERN_PROC_PROC;
#else
		mib[2] = KERN_PROC_ALL;
#endif
		mib[3] = 0;
		mibs = 3;
	}

	sz = 0;
	if (0 != sysctl(mib, mibs, NULL, &sz, NULL, 0))
		return SYSINFO_RET_FAIL;

	proc = (struct kinfo_proc *)zbx_malloc(proc, sz);
	if (0 != sysctl(mib, mibs, proc, &sz, NULL, 0))
	{
		zbx_free(proc);
		return SYSINFO_RET_FAIL;
	}

	count = sz / sizeof(struct kinfo_proc);

	for (i = 0; i < count; i++)
	{
		proc_ok = 0;
		comm_ok = 0;
		if (NULL == procname || '\0' == *procname || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM))
			proc_ok = 1;

		if (NULL != proccomm && '\0' != *proccomm)
		{
			if (NULL != (args = get_commandline(&proc[i])))
				if (NULL != zbx_regexp_match(args, proccomm, NULL))
					comm_ok = 1;
		}
		else
			comm_ok = 1;

		if (proc_ok && comm_ok)
		{
			value = proc[i].ZBX_PROC_TSIZE + proc[i].ZBX_PROC_DSIZE + proc[i].ZBX_PROC_SSIZE;
			value *= pagesize;

			if (0 == proccount++)
				memsize = value;
			else
			{
				if (do_task == DO_MAX)
					memsize = MAX(memsize, value);
				else if (do_task == DO_MIN)
					memsize = MIN(memsize, value);
				else
					memsize += value;
			}
		}
	}
	zbx_free(proc);

	if (do_task == DO_AVG)
		SET_DBL_RESULT(result, proccount == 0 ? 0 : memsize/proccount);
	else
		SET_UI64_RESULT(result, memsize);

	return SYSINFO_RET_OK;
}
示例#6
0
int	PROC_NUM(AGENT_REQUEST *request, AGENT_RESULT *result)
{
	char	*procname, *proccomm, *param, *args;
	int	zbx_proc_stat, count, i,
		proc_ok, stat_ok, comm_ok,
		mib[4], mibs;

	int	proccount = 0;

	size_t	sz;

	struct kinfo_proc	*proc = NULL;
	struct passwd		*usrinfo;

	if (4 < request->nparam)
		return SYSINFO_RET_FAIL;

	procname = get_rparam(request, 0);
	param = get_rparam(request, 1);

	if (NULL != param && '\0' != *param)
	{
		if (NULL == (usrinfo = getpwnam(param)))	/* incorrect user name */
			return SYSINFO_RET_FAIL;
	}
	else
		usrinfo = NULL;

	param = get_rparam(request, 2);

	if (NULL == param || '\0' == *param || 0 == strcmp(param, "all"))
		zbx_proc_stat = ZBX_PROC_STAT_ALL;
	else if (0 == strcmp(param, "run"))
		zbx_proc_stat = ZBX_PROC_STAT_RUN;
	else if (0 == strcmp(param, "sleep"))
		zbx_proc_stat = ZBX_PROC_STAT_SLEEP;
	else if (0 == strcmp(param, "zomb"))
		zbx_proc_stat = ZBX_PROC_STAT_ZOMB;
	else
		return SYSINFO_RET_FAIL;

	proccomm = get_rparam(request, 3);

	mib[0] = CTL_KERN;
	mib[1] = KERN_PROC;
	if (NULL != usrinfo)
	{
		mib[2] = KERN_PROC_UID;
		mib[3] = usrinfo->pw_uid;
		mibs = 4;
	}
	else
	{
#if(__FreeBSD_version > 500000)
		mib[2] = KERN_PROC_PROC;
#else
		mib[2] = KERN_PROC_ALL;
#endif
		mib[3] = 0;
		mibs = 3;
	}

	sz = 0;
	if (0 != sysctl(mib, mibs, NULL, &sz, NULL, 0))
		return SYSINFO_RET_FAIL;

	proc = (struct kinfo_proc *)zbx_malloc(proc, sz);
	if (0 != sysctl(mib, mibs, proc, &sz, NULL, 0))
	{
		zbx_free(proc);
		return SYSINFO_RET_FAIL;
	}

	count = sz / sizeof(struct kinfo_proc);

	for (i = 0; i < count; i++)
	{
		proc_ok = 0;
		stat_ok = 0;
		comm_ok = 0;

		if (NULL == procname || '\0' == *procname || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM))
			proc_ok = 1;

		if (zbx_proc_stat != ZBX_PROC_STAT_ALL)
		{
			switch (zbx_proc_stat) {
			case ZBX_PROC_STAT_RUN:
				if (proc[i].ZBX_PROC_STAT == SRUN)
					stat_ok = 1;
				break;
			case ZBX_PROC_STAT_SLEEP:
				if (proc[i].ZBX_PROC_STAT == SSLEEP)
					stat_ok = 1;
				break;
			case ZBX_PROC_STAT_ZOMB:
				if (proc[i].ZBX_PROC_STAT == SZOMB)
					stat_ok = 1;
				break;
			}
		}
		else
			stat_ok = 1;

		if (NULL != proccomm && '\0' != *proccomm)
		{
			if (NULL != (args = get_commandline(&proc[i])))
				if (NULL != zbx_regexp_match(args, proccomm, NULL))
					comm_ok = 1;
		}
		else
			comm_ok = 1;

		if (proc_ok && stat_ok && comm_ok)
			proccount++;
	}
	zbx_free(proc);

	SET_UI64_RESULT(result, proccount);

	return SYSINFO_RET_OK;
}