From 892d42f4d8403e365d20267612a786b1bcda636b Mon Sep 17 00:00:00 2001 From: JohnTheCoolingFan Date: Wed, 18 Dec 2024 11:53:29 +0300 Subject: [PATCH 1/4] Add support for detection of Armbian as Ubuntu flavor Ubuntu can be used to build Armbian, it is one of the official bases for Armbian. This allows the detection of Armbian in case it is based on Ubuntu. --- src/detection/os/os_linux.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index d4ec8b0be6..f94992fe38 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -52,7 +52,29 @@ FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) if(!ffStrSet(xdgConfigDirs)) return; - if(ffStrbufStartsWithS(&result->prettyName, "Linux Lite ")) + if (ffStrbufStartsWithS(&result->prettyName, "Armbian ")) // Armbian 24.11 noble + { + ffStrbufSetS(&result->name, "Armbian"); + ffStrbufSetS(&result->id, "armbian"); + ffStrbufSetS(&result->idLike, "ubuntu"); + ffStrbufClear(&result->versionID); + uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; + uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); + ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); + return; + } + else if (ffStrbufStartsWithS(&result->prettyName, "Armbian-unofficial ")) // Unofficial Armbian image built from source + { + ffStrbufSetS(&result->name, "Armbian (custom build)"); + ffStrbufSetS(&result->id, "armbian"); + ffStrbufSetS(&result->idLike, "ubuntu"); + ffStrbufClear(&result->versionID); + uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; + uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); + ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); + return; + } + else if(ffStrbufStartsWithS(&result->prettyName, "Linux Lite ")) { ffStrbufSetS(&result->name, "Linux Lite"); ffStrbufSetS(&result->id, "linuxlite"); From 9130da6746c9a0542fcd84657e5869d0e9867a1c Mon Sep 17 00:00:00 2001 From: JohnTheCoolingFan Date: Wed, 18 Dec 2024 20:53:45 +0300 Subject: [PATCH 2/4] Refactor Armbian detection --- src/detection/os/os_linux.c | 72 +++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index f94992fe38..4c53914fd2 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -46,34 +46,46 @@ static bool parseOsRelease(const char* fileName, FFOSResult* result) }); } -FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) +// Get Armbian version properties and set idLike based on the Armbian image basis +FF_MAYBE_UNUSED static void getArmbianVersion(FFOSResult* result) { - const char* xdgConfigDirs = getenv("XDG_CONFIG_DIRS"); - if(!ffStrSet(xdgConfigDirs)) - return; + if(ffStrbufIgnCaseEqualS(&result->id, "ubuntu")) + ffStrbufSetS(&result->idLike, "ubuntu"); + else if(ffStrbufIgnCaseEqualS(&result->id, "debian")) + ffStrbufSetS(&result->idLike, "debian"); + ffStrbufSetS(&result->id, "armbian"); + ffStrbufClear(&result->versionID); + uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; + uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); + ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); +} - if (ffStrbufStartsWithS(&result->prettyName, "Armbian ")) // Armbian 24.11 noble +// Common logic for detecting Armbian image version +FF_MAYBE_UNUSED static bool detectArmbianVersion(FFOSResult* result) +{ + if (ffStrbufStartsWithS(&result->prettyName, "Armbian ")) // Official Armbian release images { ffStrbufSetS(&result->name, "Armbian"); - ffStrbufSetS(&result->id, "armbian"); - ffStrbufSetS(&result->idLike, "ubuntu"); - ffStrbufClear(&result->versionID); - uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; - uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); - ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); - return; + getArmbianVersion(result); + return true; } else if (ffStrbufStartsWithS(&result->prettyName, "Armbian-unofficial ")) // Unofficial Armbian image built from source { ffStrbufSetS(&result->name, "Armbian (custom build)"); - ffStrbufSetS(&result->id, "armbian"); - ffStrbufSetS(&result->idLike, "ubuntu"); - ffStrbufClear(&result->versionID); - uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; - uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); - ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); - return; + getArmbianVersion(result); + return true; } + return false; +} + +FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) +{ + const char* xdgConfigDirs = getenv("XDG_CONFIG_DIRS"); + if(!ffStrSet(xdgConfigDirs)) + return; + + if (detectArmbianVersion(result)) + return; else if(ffStrbufStartsWithS(&result->prettyName, "Linux Lite ")) { ffStrbufSetS(&result->name, "Linux Lite"); @@ -186,28 +198,8 @@ FF_MAYBE_UNUSED static void getDebianVersion(FFOSResult* result) FF_MAYBE_UNUSED static bool detectDebianDerived(FFOSResult* result) { - if (ffStrbufStartsWithS(&result->prettyName, "Armbian ")) // Armbian 24.2.1 bookworm - { - ffStrbufSetS(&result->name, "Armbian"); - ffStrbufSetS(&result->id, "armbian"); - ffStrbufSetS(&result->idLike, "debian"); - ffStrbufClear(&result->versionID); - uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; - uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); - ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); + if (detectArmbianVersion(result)) return true; - } - else if (ffStrbufStartsWithS(&result->prettyName, "Armbian-unofficial ")) // Unofficial Armbian image built from source - { - ffStrbufSetS(&result->name, "Armbian (custom build)"); - ffStrbufSetS(&result->id, "armbian"); - ffStrbufSetS(&result->idLike, "debian"); - ffStrbufClear(&result->versionID); - uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; - uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); - ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); - return true; - } else if (ffStrbufStartsWithS(&result->name, "Loc-OS")) { ffStrbufSetS(&result->id, "locos"); From a623b59edf24046654920bb20df68dc02c4740bd Mon Sep 17 00:00:00 2001 From: JohnTheCoolingFan Date: Thu, 19 Dec 2024 11:01:15 +0300 Subject: [PATCH 3/4] Armbian: set idLike to id before setting id to "armbian" --- src/detection/os/os_linux.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index 4c53914fd2..6b4034a8bc 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -49,10 +49,7 @@ static bool parseOsRelease(const char* fileName, FFOSResult* result) // Get Armbian version properties and set idLike based on the Armbian image basis FF_MAYBE_UNUSED static void getArmbianVersion(FFOSResult* result) { - if(ffStrbufIgnCaseEqualS(&result->id, "ubuntu")) - ffStrbufSetS(&result->idLike, "ubuntu"); - else if(ffStrbufIgnCaseEqualS(&result->id, "debian")) - ffStrbufSetS(&result->idLike, "debian"); + ffStrbufSet(&result->idLike, &result->id); ffStrbufSetS(&result->id, "armbian"); ffStrbufClear(&result->versionID); uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; From fc1af76f8b991b2a83e92969de0ba3110ce899a8 Mon Sep 17 00:00:00 2001 From: JohnTheCoolingFan Date: Thu, 19 Dec 2024 11:03:08 +0300 Subject: [PATCH 4/4] Tidy up detectArmbianVersion --- src/detection/os/os_linux.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index 6b4034a8bc..f293d5f0ef 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -46,33 +46,22 @@ static bool parseOsRelease(const char* fileName, FFOSResult* result) }); } -// Get Armbian version properties and set idLike based on the Armbian image basis -FF_MAYBE_UNUSED static void getArmbianVersion(FFOSResult* result) -{ - ffStrbufSet(&result->idLike, &result->id); - ffStrbufSetS(&result->id, "armbian"); - ffStrbufClear(&result->versionID); - uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; - uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); - ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); -} - // Common logic for detecting Armbian image version FF_MAYBE_UNUSED static bool detectArmbianVersion(FFOSResult* result) { if (ffStrbufStartsWithS(&result->prettyName, "Armbian ")) // Official Armbian release images - { ffStrbufSetS(&result->name, "Armbian"); - getArmbianVersion(result); - return true; - } else if (ffStrbufStartsWithS(&result->prettyName, "Armbian-unofficial ")) // Unofficial Armbian image built from source - { ffStrbufSetS(&result->name, "Armbian (custom build)"); - getArmbianVersion(result); - return true; - } - return false; + else + return false; + ffStrbufSet(&result->idLike, &result->id); + ffStrbufSetS(&result->id, "armbian"); + ffStrbufClear(&result->versionID); + uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1; + uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' '); + ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart); + return true; } FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result)