diff --git a/doc/json_schema.json b/doc/json_schema.json index c3e1d76bc9..56d5aeb688 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -442,7 +442,7 @@ "type": "string" }, "packagesFormat": { - "description": "Output format of the module `Packages`. See Wiki for formatting syntax\n 1. {all}: Number of all packages\n 2. {pacman}: Number of pacman packages\n 3. {pacman-branch}: Pacman branch on manjaro\n 4. {dpkg}: Number of dpkg packages\n 5. {rpm}: Number of rpm packages\n 6. {emerge}: Number of emerge packages\n 7. {eopkg}: Number of eopkg packages\n 8. {xbps}: Number of xbps packages\n 9. {nix-system}: Number of nix-system packages\n 10. {nix-user}: Number of nix-user packages\n 11. {nix-default}: Number of nix-default packages\n 12. {apk}: Number of apk packages\n 13. {pkg}: Number of pkg packages\n 14. {flatpak-system}: Number of flatpak-system app packages\n 15. {flatpak-user}: Number of flatpak-user app packages\n 16. {snap}: Number of snap packages\n 17. {brew}: Number of brew packages\n 18. {brew-cask}: Number of brew-cask packages\n 19. {macports}: Number of macports packages\n 20. {scoop-user}: Number of scoop-user packages\n 21. {scoop-global}: Number of scoop-global packages\n 22. {choco}: Number of choco packages\n 23. {pkgtool}: Number of pkgtool packages\n 24. {paludis}: Number of paludis packages\n 25. {winget}: Number of winget packages\n 26. {opkg}: Number of opkg packages\n 27. {am-system}: Number of am-system packages\n 28. {sorcery}: Number of sorcery packages\n 29. {lpkg}: Number of lpkg packages\n 30. {lpkgbuild}: Number of lpkgbuild packages\n 31. {guix-system}: Number of guix-system packages\n 32. {guix-user}: Number of guix-user packages\n 33. {guix-home}: Number of guix-home packages\n 34. {linglong}: Number of linglong packages\n 35. {pacstall}: Number of pacstall packages\n 36. {mport}: Number of mport packages\n 37. {am-user}: Number of am-user (aka appman) packages\n 38. {pkgsrc}: Number of pkgsrc packages\n 39. {hpkg-system}: Number of hpkg-system packages\n 40. {hpkg-user}: Number of hpkg-user packages\n 41. {pisi}: Number of pisi packages\n 42. {soar}: Number of soar packages\n 43. {kiss}: Number of kiss packages\n 44. {moss}: Number of moss packages\n 45. {nix-all}: Total number of all nix packages\n 46. {flatpak-all}: Total number of all flatpak app packages\n 47. {brew-all}: Total number of all brew packages\n 48. {guix-all}: Total number of all guix packages\n 49. {hpkg-all}: Total number of all hpkg packages", + "description": "Output format of the module `Packages`. See Wiki for formatting syntax\n 1. {all}: Number of all packages\n 2. {pacman}: Number of pacman packages\n 3. {pacman-branch}: Pacman branch on manjaro\n 4. {dpkg}: Number of dpkg packages\n 5. {rpm}: Number of rpm packages\n 6. {emerge-world}: Number of @world emerge packages\n 7. {emerge-system}: Number of non-world emerge set packages\n 8. {eopkg}: Number of eopkg packages\n 9. {xbps}: Number of xbps packages\n 10. {nix-system}: Number of nix-system packages\n 11. {nix-user}: Number of nix-user packages\n 12. {nix-default}: Number of nix-default packages\n 13. {apk}: Number of apk packages\n 14. {pkg}: Number of pkg packages\n 15. {flatpak-system}: Number of flatpak-system app packages\n 16. {flatpak-user}: Number of flatpak-user app packages\n 17. {snap}: Number of snap packages\n 18. {brew}: Number of brew packages\n 19. {brew-cask}: Number of brew-cask packages\n 20. {macports}: Number of macports packages\n 21. {scoop-user}: Number of scoop-user packages\n 22. {scoop-global}: Number of scoop-global packages\n 23. {choco}: Number of choco packages\n 24. {pkgtool}: Number of pkgtool packages\n 25. {paludis}: Number of paludis packages\n 26. {winget}: Number of winget packages\n 27. {opkg}: Number of opkg packages\n 28. {am-system}: Number of am-system packages\n 29. {sorcery}: Number of sorcery packages\n 30. {lpkg}: Number of lpkg packages\n 31. {lpkgbuild}: Number of lpkgbuild packages\n 32. {guix-system}: Number of guix-system packages\n 33. {guix-user}: Number of guix-user packages\n 34. {guix-home}: Number of guix-home packages\n 35. {linglong}: Number of linglong packages\n 36. {pacstall}: Number of pacstall packages\n 37. {mport}: Number of mport packages\n 38. {am-user}: Number of am-user (aka appman) packages\n 39. {pkgsrc}: Number of pkgsrc packages\n 40. {hpkg-system}: Number of hpkg-system packages\n 41. {hpkg-user}: Number of hpkg-user packages\n 42. {pisi}: Number of pisi packages\n 43. {soar}: Number of soar packages\n 44. {kiss}: Number of kiss packages\n 45. {moss}: Number of moss packages\n 46. {nix-all}: Total number of all nix packages\n 47. {flatpak-all}: Total number of all flatpak app packages\n 48. {brew-all}: Total number of all brew packages\n 49. {guix-all}: Total number of all guix packages\n 50. {hpkg-all}: Total number of all hpkg packages\n 51. {emerge-all}: Number of all combined emerge packages", "type": "string" }, "physicaldiskFormat": { diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index 8b8a435d95..1b31495de5 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -12,7 +12,8 @@ typedef struct FFPackagesResult uint32_t brewCask; uint32_t choco; uint32_t dpkg; - uint32_t emerge; + uint32_t emergeSystem; + uint32_t emergeWorld; uint32_t eopkg; uint32_t flatpakSystem; uint32_t flatpakUser; @@ -48,7 +49,7 @@ typedef struct FFPackagesResult uint32_t winget; uint32_t xbps; - uint32_t all; //Make sure this goes last + uint32_t all; // Make sure this goes last among package counter fields FFstrbuf pacmanBranch; } FFPackagesResult; diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 8d9c9b0beb..ce55b970f3 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -1,3 +1,5 @@ +#include +#include #include "packages.h" #include "common/io.h" #include "common/parsing.h" @@ -451,12 +453,39 @@ static uint32_t getPacmanPackages(FFstrbuf* baseDir) return getNumElements(baseDir, dbPath.chars, true); } +static void getPackageCountsEmerge(FFstrbuf* baseDir, FFPackagesResult* packageCounts) +{ + uint32_t total = countFilesRecursive(baseDir, "/var/db/pkg", "SIZE"); + if (total == 0) + return; + + uint32_t world = 0; + { + uint32_t baseDirLen = baseDir->length; + ffStrbufAppendS(baseDir, "/var/lib/portage/world"); + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); + if (ffReadFileBuffer(baseDir->chars, &content)) + { + world = ffStrbufCountC(&content, '\n'); + if (!ffStrbufEndsWithC(&content, '\n')) + ++world; + } + ffStrbufSubstrBefore(baseDir, baseDirLen); + } + + if (world > total) + world = total; + + packageCounts->emergeWorld += world; + packageCounts->emergeSystem += total - world; +} + static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options) { if (!(options->disabled & FF_PACKAGES_FLAG_APK_BIT)) packageCounts->apk += getNumStrings(baseDir, "/lib/apk/db/installed", "C:Q", "apk"); if (!(options->disabled & FF_PACKAGES_FLAG_DPKG_BIT)) packageCounts->dpkg += getNumStrings(baseDir, "/var/lib/dpkg/status", "Status: install ok installed", "dpkg"); if (!(options->disabled & FF_PACKAGES_FLAG_LPKG_BIT)) packageCounts->lpkg += getNumStrings(baseDir, "/opt/Loc-OS-LPKG/installed-lpkg/Listinstalled-lpkg.list", "\n", "lpkg"); - if (!(options->disabled & FF_PACKAGES_FLAG_EMERGE_BIT)) packageCounts->emerge += countFilesRecursive(baseDir, "/var/db/pkg", "SIZE"); + if (!(options->disabled & FF_PACKAGES_FLAG_EMERGE_BIT)) getPackageCountsEmerge(baseDir, packageCounts); if (!(options->disabled & FF_PACKAGES_FLAG_EOPKG_BIT)) packageCounts->eopkg += getNumElements(baseDir, "/var/lib/eopkg/package", true); if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) packageCounts->flatpakSystem += getFlatpakPackages(baseDir, "/var/lib"); if (!(options->disabled & FF_PACKAGES_FLAG_KISS_BIT)) packageCounts->kiss += getNumElements(baseDir, "/var/db/kiss/installed", true); diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 6552d53d07..d6391e90fe 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -17,6 +17,7 @@ bool ffPrintPackages(FFPackagesOptions* options) return false; } + uint32_t emergeAll = counts.emergeWorld + counts.emergeSystem; uint32_t nixAll = counts.nixDefault + counts.nixSystem + counts.nixUser; uint32_t flatpakAll = counts.flatpakSystem + counts.flatpakUser; uint32_t brewAll = counts.brew + counts.brewCask; @@ -60,7 +61,15 @@ bool ffPrintPackages(FFPackagesOptions* options) }; FF_PRINT_PACKAGE(dpkg) FF_PRINT_PACKAGE(rpm) - FF_PRINT_PACKAGE(emerge) + if (options->combined) + { + FF_PRINT_PACKAGE_ALL(emerge); + } + else + { + FF_PRINT_PACKAGE_NAME(emergeWorld, "emerge-world") + FF_PRINT_PACKAGE_NAME(emergeSystem, "emerge-system") + } FF_PRINT_PACKAGE(eopkg) FF_PRINT_PACKAGE(xbps) if (options->combined) @@ -159,7 +168,8 @@ bool ffPrintPackages(FFPackagesOptions* options) FF_ARG(counts.pacmanBranch, "pacman-branch"), FF_ARG(counts.dpkg, "dpkg"), FF_ARG(counts.rpm, "rpm"), - FF_ARG(counts.emerge, "emerge"), + FF_ARG(counts.emergeWorld, "emerge-world"), + FF_ARG(counts.emergeSystem, "emerge-system"), FF_ARG(counts.eopkg, "eopkg"), FF_ARG(counts.xbps, "xbps"), FF_ARG(counts.nixSystem, "nix-system"), @@ -203,6 +213,7 @@ bool ffPrintPackages(FFPackagesOptions* options) FF_ARG(brewAll, "brew-all"), FF_ARG(guixAll, "guix-all"), FF_ARG(hpkgAll, "hpkg-all"), + FF_ARG(emergeAll, "emerge-all"), })); } @@ -407,7 +418,8 @@ bool ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy FF_APPEND_PACKAGE_COUNT(brewCask) FF_APPEND_PACKAGE_COUNT(choco) FF_APPEND_PACKAGE_COUNT(dpkg) - FF_APPEND_PACKAGE_COUNT(emerge) + FF_APPEND_PACKAGE_COUNT(emergeSystem) + FF_APPEND_PACKAGE_COUNT(emergeWorld) FF_APPEND_PACKAGE_COUNT(eopkg) FF_APPEND_PACKAGE_COUNT(flatpakSystem) FF_APPEND_PACKAGE_COUNT(flatpakUser) @@ -473,7 +485,8 @@ FFModuleBaseInfo ffPackagesModuleInfo = { {"Pacman branch on manjaro", "pacman-branch"}, {"Number of dpkg packages", "dpkg"}, {"Number of rpm packages", "rpm"}, - {"Number of emerge packages", "emerge"}, + {"Number of @world emerge set packages", "emerge-world"}, + {"Number of non-world emerge set packages", "emerge-system"}, {"Number of eopkg packages", "eopkg"}, {"Number of xbps packages", "xbps"}, {"Number of nix-system packages", "nix-system"}, @@ -517,5 +530,6 @@ FFModuleBaseInfo ffPackagesModuleInfo = { {"Total number of all brew packages", "brew-all"}, {"Total number of all guix packages", "guix-all"}, {"Total number of all hpkg packages", "hpkg-all"}, + {"Total number of all emerge packages", "emerge-all"}, })) };