diff --git a/build/rpm/pcp.spec.in b/build/rpm/pcp.spec.in index 8a7aaa3..e28c3e0 100644 --- a/build/rpm/pcp.spec.in +++ b/build/rpm/pcp.spec.in @@ -30,6 +30,8 @@ Requires: initscripts Requires: pcp-libs = @package_version@ +Requires(pre): shadow-utils + %description Performance Co-Pilot (PCP) provides a framework and services to support system-level performance monitoring and performance management. @@ -173,6 +175,12 @@ Requires: pcp-libs >= @package_version@ perl-PCP-LogImport >= @package_version@ Performance Co-Pilot (PCP) front-end tools for importing MTRG data into standard PCP archive logs for replay with any PCP monitoring tool. +%pre +getent group pcp >/dev/null || groupadd -r pcp +getent passwd pcp >/dev/null || useradd -r -g pcp -s /sbin/nologin \ + -c "Performance Co-Pilot" -d @pcp_log_dir@ pcp +exit 0 + %prep %setup -q autoconf @@ -264,8 +272,19 @@ BEGIN { else if (import_sheet2pcp[$NF]) f="import_sheet2pcp_files.rpm"; else if (import_mrtg2pcp[$NF]) f="import_mrtg2pcp_files.rpm"; else f="base_files.rpm" + + if (index($NF, "'$PCP_LOG_DIR'") || + index($NF, "'$PCP_VAR_DIR'") || + index($NF, "'$PCP_RUN_DIR'")) { + user="pcp" + group="pcp" + } else { + user=$3 + group=$4 + } + } -$1 == "d" { printf ("%%%%dir %%%%attr(%s,root,root) %s\n", $2, $5) >> f } +$1 == "d" { printf ("%%%%dir %%%%attr(%s,%s,%s) %s\n", $2, user, group, $5) >> f } $1 == "f" && $6 ~ "etc/pcp.conf" { printf ("%%%%config ") >> f; } $1 == "f" { @@ -278,7 +297,7 @@ $1 == "f" { if (match ($6, "'$PCP_MAN_DIR'") || match ($6, "'$PCP_DOC_DIR'")) { printf ("%%%%doc ") >> f; } - printf ("%%%%attr(%s,root,root) %s\n", $2, $6) >> f } + printf ("%%%%attr(%s,%s,%s) %s\n", $2, user, group, $6) >> f } $1 == "l" { print "%attr(0777,root,root)", $3 >> f }' set -x diff --git a/src/pmcd/rc-proc.sh b/src/pmcd/rc-proc.sh index fdc24fc..e3993a6 100644 --- a/src/pmcd/rc-proc.sh +++ b/src/pmcd/rc-proc.sh @@ -377,3 +377,32 @@ else return 3 } fi + +run_as_pcp_user() +{ + case "$PCP_PLATFORM" + in + linux) # run as the pcp user + runuser -g pcp -s /bin/bash pcp -c "$*" + return $? + ;; + *) # anything else, just run it + $* + return $? + ;; + esac +} + +chown_pcp_user() +{ + case "$PCP_PLATFORM" + in + linux) + chown -Rf pcp:pcp $* + ;; + *) # ignore + ;; + esac + + return 0 +} diff --git a/src/pmcd/rc_pcp b/src/pmcd/rc_pcp index 4f60179..0345dff 100644 --- a/src/pmcd/rc_pcp +++ b/src/pmcd/rc_pcp @@ -122,6 +122,7 @@ _reboot_setup() then mkdir -p "$PCP_RUN_DIR" chmod 755 "$PCP_RUN_DIR" + chown_pcp_user "$PCP_RUN_DIR" fi # base directories and house-keeping for pmlogger instances @@ -153,6 +154,7 @@ _reboot_setup() mkdir -p "$PCP_TMP_DIR/mmv" chmod 1777 "$PCP_TMP_DIR/mmv" fi + chown_pcp_user "$PCP_TMP_DIR/pmlogger" # Rebuild PMNS? # @@ -174,7 +176,7 @@ _reboot_setup() $ECHO $PCP_ECHO_N "Performance Co-Pilot rebuilding PMNS ..." "$PCP_ECHO_C" here=`pwd` cd $PMNSDIR - ./Rebuild -du $REBUILDOPT + run_as_pcp_user ./Rebuild -du $REBUILDOPT $RC_STATUS -v # The 'root' file does not get updated when data did not change, # so we must touch it to update date. @@ -207,7 +209,7 @@ _pmda_setup() # rm -f .NeedInstall.sav mv .NeedInstall .NeedInstall.sav - if ./Install /dev/null + if run_as_pcp_user ./Install /dev/null then # success pmpost "PMDA setup: automated install: $pmda" @@ -236,7 +238,7 @@ _start_pmcheck() if pmcd_wait $wait_option then - pmlogger_check >$tmp.pmcheck 2>&1 + run_as_pcp_user pmlogger_check >$tmp.pmcheck 2>&1 if [ -s $tmp.pmcheck ] then pmpost "pmlogger_check failed in $pmprog, mailing output to root" @@ -531,7 +533,7 @@ Error: PMCD control file '"$PCP_PMCDCONF_PATH"' is missing, cannot start PMCD.' -e 's/ $//' \ | tr '\012' ' ' ` - $PMCD $OPTS + run_as_pcp_user $PMCD $OPTS $RC_STATUS -v pmpost "start pmcd from $pmprog" diff --git a/src/pmie/rc_pmie b/src/pmie/rc_pmie index 7622e1c..bfcc8e1 100644 --- a/src/pmie/rc_pmie +++ b/src/pmie/rc_pmie @@ -98,9 +98,10 @@ _reboot_setup() rm -f $tmp.ent $tmp.pid cd "$here" fi + chown_pcp_user $PCP_TMP_DIR/pmie chmod 1777 $PCP_TMP_DIR/pmie - [ ! -d $LOGDIR ] && mkdir -p $LOGDIR + [ ! -d $LOGDIR ] && mkdir -p $LOGDIR && chown_pcp_user $LOGDIR } _start_pmie() @@ -110,7 +111,7 @@ _start_pmie() if pmcd_wait $wait_option then - pmie_check >$tmp.pmie 2>&1 + run_as_pcp_user pmie_check >$tmp.pmie 2>&1 if [ -s $tmp.pmie ] then pmpost "pmie_check start failed in $prog, mailing output to root" @@ -147,7 +148,7 @@ _shutdown() $ECHO $PCP_ECHO_N "Waiting for PMIE process(es) to terminate ..." "$PCP_ECHO_C" - pmie_check -s >$tmp.pmie 2>&1 + run_as_pcp_user pmie_check -s >$tmp.pmie 2>&1 if [ -s $tmp.pmie ] then pmpost "pmie_check stop failed in $prog, mailing output to root"