fix(scan): yum ps warning for Red Hat family (#1174)
* fix(yumps): no debug message for known patterns * refactor(scan): yum-ps * refacotr(scan): pkgPs
This commit is contained in:
@@ -251,15 +251,13 @@ func (o *debian) preCure() error {
|
||||
|
||||
func (o *debian) postScan() error {
|
||||
if o.getServerInfo().Mode.IsDeep() || o.getServerInfo().Mode.IsFastRoot() {
|
||||
if err := o.dpkgPs(); err != nil {
|
||||
if err := o.pkgPs(o.getOwnerPkgs); err != nil {
|
||||
err = xerrors.Errorf("Failed to dpkg-ps: %w", err)
|
||||
o.log.Warnf("err: %+v", err)
|
||||
o.warns = append(o.warns, err)
|
||||
// Only warning this error
|
||||
}
|
||||
}
|
||||
|
||||
if o.getServerInfo().Mode.IsDeep() || o.getServerInfo().Mode.IsFastRoot() {
|
||||
if err := o.checkrestart(); err != nil {
|
||||
err = xerrors.Errorf("Failed to scan need-restarting processes: %w", err)
|
||||
o.log.Warnf("err: %+v", err)
|
||||
@@ -1263,87 +1261,7 @@ func (o *debian) parseCheckRestart(stdout string) (models.Packages, []string) {
|
||||
return packs, unknownServices
|
||||
}
|
||||
|
||||
func (o *debian) dpkgPs() error {
|
||||
stdout, err := o.ps()
|
||||
if err != nil {
|
||||
return xerrors.Errorf("Failed to ps: %w", err)
|
||||
}
|
||||
pidNames := o.parsePs(stdout)
|
||||
pidLoadedFiles := map[string][]string{}
|
||||
// for pid, name := range pidNames {
|
||||
for pid := range pidNames {
|
||||
stdout := ""
|
||||
stdout, err = o.lsProcExe(pid)
|
||||
if err != nil {
|
||||
o.log.Debugf("Failed to exec /proc/%s/exe err: %s", pid, err)
|
||||
continue
|
||||
}
|
||||
s, err := o.parseLsProcExe(stdout)
|
||||
if err != nil {
|
||||
o.log.Debugf("Failed to parse /proc/%s/exe: %s", pid, err)
|
||||
continue
|
||||
}
|
||||
pidLoadedFiles[pid] = append(pidLoadedFiles[pid], s)
|
||||
|
||||
stdout, err = o.grepProcMap(pid)
|
||||
if err != nil {
|
||||
o.log.Debugf("Failed to exec /proc/%s/maps: %s", pid, err)
|
||||
continue
|
||||
}
|
||||
ss := o.parseGrepProcMap(stdout)
|
||||
pidLoadedFiles[pid] = append(pidLoadedFiles[pid], ss...)
|
||||
}
|
||||
|
||||
pidListenPorts := map[string][]models.PortStat{}
|
||||
stdout, err = o.lsOfListen()
|
||||
if err != nil {
|
||||
// warning only, continue scanning
|
||||
o.log.Warnf("Failed to lsof: %+v", err)
|
||||
}
|
||||
portPids := o.parseLsOf(stdout)
|
||||
for ipPort, pids := range portPids {
|
||||
for _, pid := range pids {
|
||||
portStat, err := models.NewPortStat(ipPort)
|
||||
if err != nil {
|
||||
o.log.Warnf("Failed to parse ip:port: %s, err: %+v", ipPort, err)
|
||||
continue
|
||||
}
|
||||
pidListenPorts[pid] = append(pidListenPorts[pid], *portStat)
|
||||
}
|
||||
}
|
||||
|
||||
for pid, loadedFiles := range pidLoadedFiles {
|
||||
o.log.Debugf("dpkg -S %#v", loadedFiles)
|
||||
pkgNames, err := o.getPkgName(loadedFiles)
|
||||
if err != nil {
|
||||
o.log.Debugf("Failed to get package name by file path: %s, err: %s", pkgNames, err)
|
||||
continue
|
||||
}
|
||||
|
||||
procName := ""
|
||||
if _, ok := pidNames[pid]; ok {
|
||||
procName = pidNames[pid]
|
||||
}
|
||||
proc := models.AffectedProcess{
|
||||
PID: pid,
|
||||
Name: procName,
|
||||
ListenPortStats: pidListenPorts[pid],
|
||||
}
|
||||
|
||||
for _, n := range pkgNames {
|
||||
p, ok := o.Packages[n]
|
||||
if !ok {
|
||||
o.log.Warnf("Failed to FindByFQPN: %+v", err)
|
||||
continue
|
||||
}
|
||||
p.AffectedProcs = append(p.AffectedProcs, proc)
|
||||
o.Packages[p.Name] = p
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *debian) getPkgName(paths []string) (pkgNames []string, err error) {
|
||||
func (o *debian) getOwnerPkgs(paths []string) (pkgNames []string, err error) {
|
||||
cmd := "dpkg -S " + strings.Join(paths, " ")
|
||||
r := o.exec(util.PrependProxyEnv(cmd), noSudo)
|
||||
if !r.isSuccess(0, 1) {
|
||||
|
||||
Reference in New Issue
Block a user