Keďže bol záujem publikujem program na použitie. Je napísaní pre Omniu ale prerobiť ho môžete ako chcete. Predpokladám znalosť spúšťania servisov a znalosť OS Linux.
Úvod.
Radič mSATA je umiestnený v niektorom PCI slote. Má piny pre led aktivitu diskov. Ale to je treba ťahať ledku z vnútra von, hoci omnia ma lediek dosť aj ta pre mSATA radič je nepoužitá!
Preto som sa rozhodol použiť ledku prináležiacu pozícii mSATA radiču.
Ako naprogramovať aktivitu diskov na ledke? Keďže mám dva disky v RAID1 (s btrfs) a jeden backup disk na USB porte budem ich aktivitu rozlišovať farbou R G a B. Aktivitu diskov získavam zo súboru /proc/diskstats.
Pre správnu činnosť programu je potrebne nastaviť aktivitu led PCI1 nasledovne:
/etc/config/system
config led
option sysfs 'omnia-led:pci1'
option name 'uSata PCI1'
option trigger 'none'
option default '1'
Súbor v /etc/init.d/omnia-disksled-color vyzerá nasledovne:
#!/bin/sh /etc/rc.common
START=100
USE_PROCD=1
NAME=omnia-disksled-color.lua
PROG=/root/tools/omnia-disksled-color/omnia-disksled-color.lua
start_service() {
procd_open_instance
procd_set_param command "$PROG"
procd_close_instance
}
stop() {
service_stop "$PROG"
}
reload() {
service_reload "$PROG"
}
A nakoniec vlastný súbor je umiestnený v
/root/tools/omnia-disksled-color/omnia-disksled-color.lua
#!/usr/bin/lua
local io = require "io"
local socket = require("socket")
local wait = 0.75 --> cakanie medzi testami (zatazuje CPU)
-- posledne hodnoty rozdielu sum
local last0 = 0
local last1 = 0
local last2 = 0
-- posledny zapis barvy
local lastR = 0
local lastG = 0
local lastB = 0
function debug_print(s)
-- uncomment this to print debug messages
--print(s)
end
function sleep(sec)
socket.sleep(sec)
end
function write_led(ledname, r, g, b)
local fd = io.open("/sys/class/leds/omnia-led:"..ledname.."/color", "w") --> mena vsetkych led (mena su ine ako v rainbow)
fd:write(r .. " " .. g .. " " .. b)
fd:close()
end
function gather_disks_status()
local red = 0
local green = 0
local blue = 0
local devfd = io.open("/proc/diskstats", "r")
for line in devfd:lines() do
local read_sectors, write_sectors, sum
-- print(line)
-- -2 -1 0 1 2 3 4 5 6 7 8 9 10 11
local pat = "%s+%d+%s+%d+%s+(%S+)%s+%d+%s+%d+%s+(%d+)%s+%d+%s+(%d+)%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+"
_, _, hdd, read_sectors, write_sectors = string.find(line, pat)
if hdd == "sda" then
sum = read_sectors + write_sectors
if ( sum - last0 ) == 0 then
red = 0
else
red = 255
end
last0 = sum
-- print(hdd, read_sectors, write_sectors)
-- print("+ if sda")
elseif hdd == "sdb" then
sum = read_sectors + write_sectors
if ( sum - last1 ) == 0 then
green = 0
else
green = 255
end
last1 = sum
-- print(hdd, read_sectors, write_sectors)
-- print("+ if sdb")
elseif hdd == "sdc" then
sum = read_sectors + write_sectors
if ( sum - last2 ) == 0 then
blue = 0
else
blue = 255
end
last2 = sum
-- print(hdd, read_sectors, write_sectors)
-- print("+ if sdc")
end
end
-- uzavreme otvoreny file
devfd:close()
-- boli zmeny last a actual colors
if ( (red ~= lastR) or (green ~= lastG) or (blue ~= lastB) ) then
write_led("pci1", red, green, blue) --> tu zmente pre svoju led
-- print(red, lastR, green, lastG, blue, lastB )
lastR = red
lastG = green
lastB = blue
end
end
io.popen("rainbow pci1 enable") --> tiez zmenit pre svoju led
while true do
gather_disks_status()
sleep(wait)
end
mSATA radič v mojom prípade je najvzdialenejšom slote od CPU a ma ledku PCI1.
Samozrejme že sa dá program stále vylepšovať! Použitím napríklad luajit by mal byť program rýchlejší. Aktuálna verzia luajit je nepoužiteľná. Štruktúrovanie programu nebolo zachované! Škoda …
Pre @RomanHK otázka. Prosím ťa, co nechodí na Omnii s OpenWRT s 16.06.02? Ak budeš mať čas prosím napíš.
Edit1: použite [code] [/code ] pre lepšiu citatelnost. Samozrejme bez medzier vo vnútri hranatých zátvoriek.