Eliminate all bc command dependencies - replace with awk for portability
PROBLEM:
- bc command not installed on all systems (requires bc package)
- 30 instances across toolkit causing potential failures
- bc is external dependency for floating-point arithmetic
SOLUTION:
- Replaced all bc usage with awk (universally available)
- Pattern: echo "X * Y" | bc → awk "BEGIN {printf \"%.2f\", X * Y}"
- Pattern: (( $(echo "X > Y" | bc -l) )) → awk comparison + bash test
FILES MODIFIED (8 files, 30 bc instances eliminated):
1. lib/threat-intelligence.sh (1 fix)
- Line 310: Load average to integer conversion
2. lib/reference-db.sh (2 fixes)
- Line 554: CPU load percentage calculation
- Line 570: TCP retransmission comparison
3. lib/php-analyzer.sh (5 fixes)
- Line 138: Script duration comparison
- Lines 391-395: OPcache hit rate + wasted memory + cached scripts
- Line 479: OPcache hit rate threshold
4. modules/performance/hardware-health-check.sh (1 fix)
- Line 264: CPU frequency conversion (KHz to GHz)
5. modules/performance/network-bandwidth-analyzer.sh (3 fixes)
- Line 168: Daily bandwidth threshold (50 GiB)
- Line 238: Bytes to MB conversion
- Lines 388-390: TCP retransmission percentage
6. modules/performance/php-optimizer.sh (2 fixes)
- Lines 457, 653: OPcache hit rate comparisons
7. modules/diagnostics/system-health-check.sh (10 fixes)
- Lines 345-350: Load per core + threshold calculations
- Lines 354-358: Load trend detection (3 comparisons)
- Lines 367-406: Load critical/warning/elevated checks
- Lines 828-829: TCP retransmission analysis
- Line 901: Clock offset detection
- Line 1692: Network stats TCP retrans percent
8. tools/toolkit-qa-check.sh (QA improvements)
- Added --exclude="toolkit-qa-check.sh" to prevent self-scanning
- Eliminates false positives from QA script itself
TECHNICAL DETAILS:
- All awk commands use BEGIN block for pure calculation
- printf formatting preserves decimal precision (%.2f, %.1f, %.0f)
- Error handling with 2>/dev/null || echo fallbacks
- Ternary operators for comparisons: (condition ? 1 : 0)
TESTING:
✓ QA scan shows 0 CRITICAL, 0 HIGH, 0 MEDIUM, 0 LOW issues
✓ All 30 bc instances eliminated
✓ No external dependencies beyond standard bash + awk
✓ Toolkit now portable to minimal Linux installations
IMPACT:
+ Eliminates bc package dependency
+ 100% portable (awk included in all Unix/Linux systems)
+ Same accuracy for floating-point calculations
+ Faster execution (awk is typically faster than bc)
+ Better error handling with fallback values
This commit is contained in:
+13
-6
@@ -135,7 +135,8 @@ analyze_slow_requests() {
|
||||
total_count=$((total_count + 1))
|
||||
|
||||
# Track slowest occurrence per script
|
||||
if [ -z "${slow_scripts[$script]}" ] || (( $(echo "${slow_scripts[$script]} < $duration" | bc -l) )); then
|
||||
local is_slower=$(awk "BEGIN {print (${slow_scripts[$script]:-0} < $duration ? 1 : 0)}" 2>/dev/null || echo 1)
|
||||
if [ -z "${slow_scripts[$script]}" ] || [ "$is_slower" -eq 1 ]; then
|
||||
slow_scripts[$script]="$duration"
|
||||
fi
|
||||
fi
|
||||
@@ -387,12 +388,15 @@ analyze_opcache_effectiveness() {
|
||||
|
||||
# Generate recommendation
|
||||
local recommendation=""
|
||||
local hit_rate_low=$(awk "BEGIN {print ($hit_rate < 90 ? 1 : 0)}" 2>/dev/null || echo 0)
|
||||
local wasted_high=$(awk "BEGIN {print ($wasted > 5 ? 1 : 0)}" 2>/dev/null || echo 0)
|
||||
local cached_high=$(awk "BEGIN {print ($cached_scripts > $max_cached * 0.8 ? 1 : 0)}" 2>/dev/null || echo 0)
|
||||
|
||||
if (( $(echo "$hit_rate < 90" | bc -l) )); then
|
||||
if [ "$hit_rate_low" -eq 1 ]; then
|
||||
recommendation="Hit rate below 90% - Increase opcache.memory_consumption"
|
||||
elif (( $(echo "$wasted > 5" | bc -l) )); then
|
||||
elif [ "$wasted_high" -eq 1 ]; then
|
||||
recommendation="High wasted memory (${wasted}MB) - Consider increasing opcache.max_accelerated_files"
|
||||
elif (( $(echo "$cached_scripts > $max_cached * 0.8" | bc -l) )); then
|
||||
elif [ "$cached_high" -eq 1 ]; then
|
||||
recommendation="Cached scripts at 80% capacity - Increase opcache.max_accelerated_files"
|
||||
else
|
||||
recommendation="OPcache performing optimally"
|
||||
@@ -476,8 +480,11 @@ detect_php_config_issues() {
|
||||
|
||||
if [ "$status" = "DISABLED" ]; then
|
||||
issues+="PERFORMANCE|HIGH|OPcache is disabled|Enable OPcache for 40-70% performance improvement"$'\n'
|
||||
elif (( $(echo "$hit_rate < 90" | bc -l) )); then
|
||||
issues+="PERFORMANCE|MEDIUM|OPcache hit rate is low (${hit_rate}%)|Increase opcache.memory_consumption"$'\n'
|
||||
else
|
||||
local hit_rate_low=$(awk "BEGIN {print ($hit_rate < 90 ? 1 : 0)}" 2>/dev/null || echo 0)
|
||||
if [ "$hit_rate_low" -eq 1 ]; then
|
||||
issues+="PERFORMANCE|MEDIUM|OPcache hit rate is low (${hit_rate}%)|Increase opcache.memory_consumption"$'\n'
|
||||
fi
|
||||
fi
|
||||
|
||||
# ISSUE 7: Check FPM pool configuration
|
||||
|
||||
+3
-2
@@ -551,7 +551,7 @@ db_is_system_under_load() {
|
||||
|
||||
# Consider system under load if CPU > 80% or memory > 90%
|
||||
if [ -n "$cpu_load" ] && [ -n "$cpu_cores" ]; then
|
||||
local load_percent=$(echo "scale=0; ($cpu_load / $cpu_cores) * 100" | bc 2>/dev/null || echo "0")
|
||||
local load_percent=$(awk "BEGIN {printf \"%.0f\", ($cpu_load / $cpu_cores) * 100}" 2>/dev/null || echo "0")
|
||||
if [ "$load_percent" -gt 80 ] || [ "${mem_percent:-0}" -gt 90 ]; then
|
||||
return 0 # True - system is under load
|
||||
fi
|
||||
@@ -567,7 +567,8 @@ db_has_network_issues() {
|
||||
|
||||
# Consider network problematic if retrans > 5% or errors > 100
|
||||
if [ -n "$tcp_retrans" ]; then
|
||||
if (( $(echo "$tcp_retrans > 5" | bc -l 2>/dev/null || echo 0) )) || \
|
||||
local retrans_high=$(awk "BEGIN {print ($tcp_retrans > 5 ? 1 : 0)}" 2>/dev/null || echo 0)
|
||||
if [ "$retrans_high" -eq 1 ] || \
|
||||
[ "${rx_errors:-0}" -gt 100 ] || [ "${tx_errors:-0}" -gt 100 ]; then
|
||||
return 0 # True - network has issues
|
||||
fi
|
||||
|
||||
@@ -307,7 +307,7 @@ is_server_stressed() {
|
||||
load1=$(echo "$load1" | awk '{print $1}')
|
||||
|
||||
# Convert to integer (multiply by 100 to handle decimals)
|
||||
local load_int=$(echo "$load1 * 100" | bc 2>/dev/null | cut -d. -f1)
|
||||
local load_int=$(awk "BEGIN {printf \"%.0f\", $load1 * 100}" 2>/dev/null)
|
||||
local threshold=$((cpu_count * 80)) # 80% of CPU count
|
||||
|
||||
if [ "$load_int" -gt "$threshold" ]; then
|
||||
|
||||
Reference in New Issue
Block a user