Hlavní navigace

Conky a LUA - disky

8. 3. 2016 7:38 (aktualizováno) Vladislav Konopík

Modul pro Conky zobrazující lokální disky, připojené oddíly (lvm a crypt) – není nastaven na sledování raid polí.

Skript modulu stačí vložit na konec již uveřejněného základního nastavení LUA skriptu a do tabulky ‚modul‘ zadat název modulu. Název modulu naleznete za nápovědou v proměnné:

local name = "disky"

Skript modulu:

function modul_disky()
------------------------------------------------------------
--                       VLKODLAK
--                     2015 ver 0.2
------------------------------------------------------------
-- informace o připojených oddílech lokálních disků
--
--##########################################################
--
-- pro svou činnost potřebuje: funkce
--[[

kurzor()
pozadi(poz,vyska)
bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)

--]]
--
-- pro svou činnost potřebuje: globální tabulky (před hlavní funkcí - conky_main())
--[[

update = {
  ["disky"] = nil,
}

interval = {
  ["disky"] = 5,
}

klik_menu = {
  ["disky"] = 0,
}

--]]
--
-- pro svou činnost potřebuje: globální proměnné (před hlavní funkcí - conky_main())
--[[

pozadi_menu           --nastavuje pozadí pro menu
pozadi_panel          --nastavuje pozadí pro panel
pozadi_barva          --nastavuje barvu pozadí

rozmer_panelu_x       --rozměr panelu v pixelech, musí se shodovat s nastavením
                      --hodnoty 'minimum_size' v conky.rc

--]]
--
-- pro svou činnost potřebuje: nainstalované aplikace
--[[

lsblk                 --poskytuje informace o oddílech a vrstvách zařízení
udisk                 --poskytuje informace o zařízení

--]]

------------------------------------------------------------

  --proměnná pro identifikaci modulu
  local name = "disky"

  ----------------------------------------
  --podmínky pro interval dat modulu
  ----------------------------------------

  if tonumber(update[tostring(name)]) == nil then--první průchod skriptem

    --nastavení intervalu
    update[tostring(name)] = updates + tonumber(interval[tostring(name)])

    ----------------------------------------
    --tabulka pro nastavení modulu
    disky_tab = {
      ["tl"] = {},--podtabulka pro tlačítka
      ["reload"] = 1,--stav načtení dat
      ["delka"] = 0,
      ["pozice_y"] = nil,--pozice 'y' pro modul
    }

    --smyčka pro nastavení pozice modulu
    for a = 1,#modul.name do
      local text = tostring(modul.name[a])
      if string.match(text, "(%S*)") == tostring(name) then
        disky_tab.pozice_y = a
        break
      end--if string.match(text, "(%S)") == tostring(name) then
    end--for a = 1,#modul.name do

  elseif tonumber(update[tostring(name)]) <= updates then
    --průchod skriptem pro kontrolu počtu zařízení

    --nastavení intervalu
    update[tostring(name)] = updates + tonumber(interval[tostring(name)])

    ----------------------------------------
    --počet existujících zařízení
    local data = io.popen("ls /sys/block | grep -c sd")
    local pocet_zarizeni = data:read("*l")
    data:close()

    ----------------------------------------
    --celkový počet oddílů a připojených oddílů v systému
    local pocet_oddil = 0
    local pocet_mount = 0

    local data = io.popen("lsblk -o KNAME,MOUNTPOINT")
    while true do
      local line = data:read("*l")
      if line == nil then break end
      z,k,vyber = string.find(line, "(%S*)")

      if vyber ~= nil and vyber ~= "KNAME" then

        if string.match(vyber,"(%S%S)") == "sd" and string.match(vyber,"%S+(%d+)") ~= nil then
          pocet_oddil = pocet_oddil + 1
          z,k,vyber = string.find(line, "%S+%s+([%S%s]*)")
          if vyber ~= "" then pocet_mount = pocet_mount + 1 end
        end

        if string.match(vyber,"(%S%S)") == "dm" then
          pocet_oddil = pocet_oddil + 1
          z,k,vyber = string.find(line, "%S+%s+([%S%s]*)")
          if vyber ~= "" then pocet_mount = pocet_mount + 1 end
        end

      end--if vyber ~= nil and vyber ~= "KNAME" then

    end--while true do
    data:close()

    ----------------------------------------
    --kontrola
    if tonumber(pocet_mount) ~= tonumber(oddil_info.m) then
      disky_tab.reload = 2
    end

    if tonumber(pocet_zarizeni) ~= #disk or tonumber(pocet_oddil) ~= tonumber(oddil_info.o) then
      disky_tab.reload = 1
    end

    ----------------------------------------
    --samostatný update informací o smart a teplotě
    for d = 1, #disk do
      if disk[tonumber(d)].smart ~= "not available" and disk[tonumber(d)].smart_upd <= updates then

        --nastaveni samostatneho update
        disk[tonumber(d)].smart_upd = updates + 300

        local data = io.popen("udisks --show-info /dev/"..disk[tonumber(d)].device)
        while true do
          local line = data:read("*l")
          if line == nil then break end
          --overall assessment: Good
          z,k,vyber = string.find(line,"overall%sassessment%p%s+([%S%s]*)")
          if vyber ~= nil then disk[tonumber(d)].smart_stav = vyber end
          --airflow-temperature-celsius
          z,k,vyber = string.find(line,"airflow[%S]*%s+%d+|%s?%d+|%s?%d+%s+%S+%s+(%d+)")
          if vyber ~= nil then disk[tonumber(d)].smart_teplota = vyber end
        end--while true do
        data:close()--uzavřeni souboru

      end--disk[tonumber(d)].smart ~= "not available" and disk[tonumber(d)].smart_upd <= updates
    end--for d = 1, #disk do

  end--if tonumber(update[tostring(name)]) == nil then

  ----------------------------------------
  --samostatná podmínka pro zařízení a oddíly
  ----------------------------------------

  if disky_tab.reload == 1 then--průchod skriptem jen při změně počtu zařízení

    --nastavení intervalu
    update[tostring(name)] = updates + tonumber(interval[tostring(name)])

    ----------------------------------------
    --definování tabulky pro data
    disk = {}  --hlavní tabulka o zařízení
    mount = {} --tabulka pro počet připojených oddílů na zařízení

    ----------------------------------------
    --seznam dostupného hardwaru začínajícího na 'sd'
    local hw = 1
    for line in io.lines("/proc/diskstats") do
      z,k,vyber = string.find(line,"(%w%w%w)")
      if vyber ~= nil and string.match(vyber,'sd.') ~= nil then

        --podtabulky pro každý disk
        disk[tonumber(hw)] = {}
        disk[tonumber(hw)].device = vyber
        mount[tonumber(hw)] = 0

        --konstrukce pro vynechání opakujících se názvů
        if tonumber(hw - 1) == 0 then
          hw = hw + 1
        else
          if tostring(vyber) == tostring(disk[tonumber(hw - 1)].device) then
            table.remove (disk, tonumber(hw))
            hw = hw
          else
            hw = hw + 1
          end--if tostring(vyber) == tostring(disk[tonumber(hw - 1)].device) then
        end--if tonumber(hw - 1) == 0 then

      end--if vyber ~= nil and string.match(vyber,'sd.') ~= nil then

    end--for line in io.lines("/proc/diskstats") do

    ----------------------------------------
    --smyčka pro uložení informací z aplikace 'udisk' a vytvoření
    --podtabulky pro tlačítka zařízení
    for d = 1,#disk do

      --základní info aplikací 'udisk'
      local dev = disk[tonumber(d)].device
      os.execute("udisks --show-info /dev/"..dev.." > /tmp/conky_"..dev.."")

      --podtabulka pro tlačítka
      disky_tab.tl[tonumber(d)] = 0

    end--for d = 1,#disk do

    ----------------------------------------
    --načtení uložených informací o hardwaru
    for d = 1,#disk do

      local dev = disk[tonumber(d)].device
      for line in io.lines("/tmp/conky_"..dev) do

        z,k,vyber = string.find(line,"removable%p%s*(%d)")--removable: 0
        if vyber ~= nil then disk[tonumber(d)].rm = vyber end
        z,k,vyber = string.find(line,"type%p%s*(%S*)")--type: udf
        if vyber ~= nil then disk[tonumber(d)].typ = vyber end
        z,k,vyber = string.find(line,"scheme%p%s+(%S*)")--scheme: gpt
        if vyber ~= nil then disk[tonumber(d)].scheme = vyber end
        z,k,vyber = string.find(line,"count%p%s+(%d+)")--count: 5
        if vyber ~= nil then disk[tonumber(d)].count = vyber end
        z,k,vyber = string.find(line,"vendor%p%s+(%S*)")--vendor: ATA
        if vyber ~= nil then disk[tonumber(d)].vendor = vyber end
        z,k,vyber = string.find(line,"model%p%s+([%S%s]*)")--model: ST500S142
        if vyber ~= nil then disk[tonumber(d)].model = vyber end
        z,k,vyber = string.find(line,"revision%p%s+(%S*)")--revision:
        if vyber ~= nil then disk[tonumber(d)].revision = vyber end
        z,k,vyber = string.find(line,"serial%p%s+(%S*)")--serial:
        if vyber ~= nil then disk[tonumber(d)].serial = vyber end
        z,k,vyber = string.find(line,"WWN%p%s+(%S*)")--WWN:
        if vyber ~= nil then disk[tonumber(d)].wwn = vyber end
        z,k,vyber = string.find(line,"interface%p%s+(%S*)")--interface: ata
        if vyber ~= nil then disk[tonumber(d)].interface = vyber end
        z,k,vyber = string.find(line,"if%sspeed%p%s+(%S*)")--if speed: (unknown)
        if vyber ~= nil then disk[tonumber(d)].speed = vyber end
        z,k,vyber = string.find(line,"ATA%sSMART%p%s+([%S%s]*)")--ATA SMART: Updated at
        if vyber ~= nil then disk[tonumber(d)].smart = vyber end

        --pokud jsou dostupné SMART informace
        if disk[tonumber(d)].smart ~= "not available" then
          --nastavení samostatného update (300 = 5 minut)
          disk[tonumber(d)].smart_upd = updates + 300
          z,k,vyber = string.find(line,"overall%sassessment%p%s+([%S%s]*)")
          if vyber ~= nil then disk[tonumber(d)].smart_stav = vyber end
          --airflow-temperature-celsius
          z,k,vyber = string.find(line,"airflow[%S]*%s+%d+|%s?%d+|%s?%d+%s+%S+%s+(%d+)")
          if vyber ~= nil then disk[tonumber(d)].smart_teplota = vyber end
        end--if disk[tonumber(d)].smart ~= "not available" then

      end--for line in io.lines("/tmp/conky_"..dev) do

    end--for d = 1,#disk do

    ----------------------------------------
    --tabulka pro celkový počet oddílů a připojených oddílů
    oddil_info = {["o"] = 0,["m"] = 0,}

    ----------------------------------------
    --načtení informací o oddílech
    for d = 1,#disk do

      --podtabulka pro jednotlivé oddíly
      disk[tonumber(d)].oddil = {}

      local dev = disk[tonumber(d)].device
      local o = 0 --fyzický oddíl
      disk[tonumber(d)].oddil_pocet = 0

      local data = io.popen("lsblk -o KNAME,RM,TYPE,SIZE,RO,MOUNTPOINT /dev/"..dev)
      while true do
        local line = data:read("*l")
        if line == nil then break end
        z,k,vyber = string.find(line, "(%S*)[%S%s]*")

        if vyber ~= nil and vyber ~= tostring(dev) and vyber ~= "KNAME" then

          --pro celkový počet oddílů - kontrola
          oddil_info.o = tonumber(oddil_info.o) + 1

          o = o + 1
          disk[tonumber(d)].oddil[tonumber(o)] = {}

          disk[tonumber(d)].oddil[tonumber(o)].name = vyber
          z,k,vyber = string.find(line, "%S+%s+(%d)")  -- 0
          disk[tonumber(d)].oddil[tonumber(o)].rm = vyber
          z,k,vyber = string.find(line, "%S+%s+%d%s(%S+)") -- crypt/lvm
          disk[tonumber(d)].oddil[tonumber(o)].typ = vyber
          z,k,vyber = string.find(line, "%S+%s+%d%s%S+%s+(%S+)") -- xxG
          disk[tonumber(d)].oddil[tonumber(o)].size = vyber
          z,k,vyber = string.find(line, "%S+%s+%d%s%S+%s+%S+%s+%d%s([%S%s]*)") -- adresář
          if vyber ~= "" then
            disk[tonumber(d)].oddil[tonumber(o)].mount = vyber
            mount[tonumber(d)] = tonumber(mount[tonumber(d)]) + 1
            --pro celkový počet připojených oddílů
            oddil_info.m = tonumber(oddil_info.m) + 1
          end
          disk[tonumber(d)].oddil_pocet = tonumber(disk[tonumber(d)].oddil_pocet) + 1

        end--if vyber ~= nil and vyber ~= tostring(dev) and vyber ~= "KNAME" then

      end--while true do
      data:close()

    end--for d = 1,#disk do

    disky_tab.reload = 0

  end--if disky_tab.reload == 1 then

  ----------------------------------------
  --samostatná podmínka pro oddíly
  ----------------------------------------

  if disky_tab.reload == 2 then--průchod při změně připojených oddílů

    --nastavení intervalu
    update[tostring(name)] = updates + tonumber(interval[tostring(name)])

    ----------------------------------------
    --tabulka pro celkový počet oddílů a připojených oddílů
    oddil_info = {["o"] = 0,["m"] = 0,}

    ----------------------------------------
    --načtení informací o oddílech
    for d = 1,#disk do

      --podtabulka pro jednotlivé oddíly
      disk[tonumber(d)].oddil = {}

      local dev = disk[tonumber(d)].device
      local o = 0 --fyzický oddíl
      disk[tonumber(d)].oddil_pocet = 0

      local data = io.popen("lsblk -o KNAME,RM,TYPE,SIZE,RO,MOUNTPOINT /dev/"..dev)
      while true do
        local line = data:read("*l")
        if line == nil then break end
        z,k,vyber = string.find(line, "(%S*)[%S%s]*")

        if vyber ~= nil and vyber ~= tostring(dev) and vyber ~= "KNAME" then

          --pro celkový počet oddílů - kontrola
          oddil_info.o = tonumber(oddil_info.o) + 1

          o = o + 1
          disk[tonumber(d)].oddil[tonumber(o)] = {}

          disk[tonumber(d)].oddil[tonumber(o)].name = vyber
          z,k,vyber = string.find(line, "%S+%s+(%d)")  -- 0
          disk[tonumber(d)].oddil[tonumber(o)].rm = vyber
          z,k,vyber = string.find(line, "%S+%s+%d%s(%S+)") -- crypt/lvm
          disk[tonumber(d)].oddil[tonumber(o)].typ = vyber
          z,k,vyber = string.find(line, "%S+%s+%d%s%S+%s+(%S+)") -- xxG
          disk[tonumber(d)].oddil[tonumber(o)].size = vyber
          z,k,vyber = string.find(line, "%S+%s+%d%s%S+%s+%S+%s+%d%s([%S%s]*)") -- adresář
          if vyber ~= "" then
            disk[tonumber(d)].oddil[tonumber(o)].mount = vyber
            mount[tonumber(d)] = tonumber(mount[tonumber(d)]) + 1
            --pro celkový počet připojených oddílů
            oddil_info.m = tonumber(oddil_info.m) + 1
          end
          disk[tonumber(d)].oddil_pocet = tonumber(disk[tonumber(d)].oddil_pocet) + 1

        end--if vyber ~= nil and vyber ~= tostring(dev) and vyber ~= "KNAME" then

      end--while true do
      data:close()

    end--for d = 1,#disk do

    disky_tab.reload = 0

  end--if disky_tab.reload == 2 then

  ----------------------------------------
  --vypis dat modulu
  ----------------------------------------

  local x = 0
  local y = modul.pozice[tonumber(disky_tab.pozice_y)]
  --nastavení fontu
  cairo_select_font_face (cr, "Mono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);

  ----------------------------------------
  --vykreslení pozadí pro menu
  if pozadi_menu == 1 then pozadi(y-12,15) end

  ----------------------------------------
  --konstrukce pro klikutí na menu
  local menu = "DISKY"
  local delka = tonumber(string.len(menu)*7)

  --linie - první část
  cairo_select_font_face (cr, "Mono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
  cairo_set_font_size (cr, 12.0);
  cairo_set_source_rgba (cr, 1,0.7,0,1);

  local linie1 = (rozmer_panelu_x - delka)/2 - 5
  cairo_rectangle (cr, x,y-5,linie1,1);cairo_fill (cr);

  --pozice kurzoru/kliknuti
  if mx>=x+linie1+5 and mx<=x+linie1+5+delka+3 and my<=y and my>=y-12 then
    cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
    if mx == kx and my == ky and klik_menu[tostring(name)] == 0 then
      klik_menu[tostring(name)] = 1
    elseif mx == kx and my == ky and klik_menu[tostring(name)] == 1 then
      klik_menu[tostring(name)] = 0
    end--kliknuti
  else
    cairo_set_source_rgba (cr, 1,0.7,0,1);
  end--pozice kurzoru

  cairo_move_to (cr, x+linie1+5, y);cairo_show_text (cr, menu);--text menu

  --linie - druha cast
  cairo_set_source_rgba (cr, 1,0.7,0,1);
  local linie2 = rozmer_panelu_x - (linie1+5+delka+7)
  cairo_rectangle (cr, x+linie1+5+delka+7,y-5,linie2,1);cairo_fill (cr);

  ----------------------------------------
  --otevřený panel
  y = y + 3

  if klik_menu[tostring(name)] == 1 then

    cairo_select_font_face (cr, "Mono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);

    for d = 1,#disk do

      if pozadi_panel == 1 then pozadi(y+2,15) end

      --sda/sdb atd.
      y = y + 15
      cairo_set_font_size (cr, 10.0);
      cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
      cairo_move_to (cr, x+5,y-1);cairo_show_text (cr, disk[tonumber(d)].device);

      --model zařízení - kliknutelný text
      local text = tostring(disk[tonumber(d)].vendor.." "..disk[tonumber(d)].model)
      local delka = tonumber(string.len(text)*6.75)
      cairo_set_font_size (cr, 11.0);
      cairo_set_source_rgba (cr, 1,0.7,0,1);

      --kurzor (změna barvy textu / kliknutí = informace)
      if mx>=x+30 and mx<=x+30+delka and my<=y and my>=y-10 then
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);

        if mx == kx and my == ky and disky_tab.tl[tonumber(d)] == 0 then
          disky_tab.tl[tonumber(d)] = 1
        elseif mx == kx and my == ky and disky_tab.tl[tonumber(d)] == 1 then
          disky_tab.tl[tonumber(d)] = 0
        end--kliknuti
      else
        cairo_set_source_rgba (cr, 1,0.7,0,1);
      end--pozice kurzoru
      cairo_move_to (cr, x+30,y-1);cairo_show_text (cr, text);

      --zápis / čtení / teplota
      cairo_set_font_size (cr, 9.0);

      cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
      cairo_move_to (cr, x+210,y-1);cairo_show_text (cr, "R: ");
      cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
      local text = conky_parse("${diskio_read /dev/"..disk[tonumber(d)].device.."}")
      cairo_show_text (cr, string.match(text,"([%d%p]*%w)"));

      cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
      cairo_move_to (cr, x+260,y-1);cairo_show_text (cr, "W: ");
      cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
      local text = conky_parse("${diskio_write /dev/"..disk[tonumber(d)].device.."}")
      cairo_show_text (cr, string.match(text,"([%d%p]*%w)"));

      if disk[tonumber(d)].smart ~= "not available" then
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        cairo_move_to (cr, x+320,y-1);
        cairo_show_text (cr, disk[tonumber(d)].smart_teplota);
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_show_text (cr,"°C");
      end--if disk[tonumber(d)].smart ~= "not available" then

      ----------------------------------------
      --ostatní informace o zařízení
      if disky_tab.tl[tonumber(d)] == 1 then

        --pozadí pro dodatečné informace
        if pozadi_panel == 1 then
          local poz = y + 2
          local vyska = 60 --základ pro 4 řádky informací
          local info = tonumber(disk[tonumber(d)].oddil_pocet)
          vyska = vyska + (tonumber(info) * 12) + 4 + 4
          pozadi(poz,vyska)--volání funkce pro vykreslení pozadí
        end--if pozadi_panel == 1 then

        cairo_set_font_size (cr, 10.0);

        --smart
        y = y + 15
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+30,y);cairo_show_text (cr, "SMART:");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        cairo_move_to (cr, x+70,y);
        if disk[tonumber(d)].smart ~= "not available" then
          cairo_show_text (cr, disk[tonumber(d)].smart_stav);
        else
          cairo_show_text (cr, "n/a");
        end--if disk[tonumber(d)].smart ~= "not available" then

        --informace o zařízení
        y = y + 15
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+30,y);cairo_show_text (cr, "SN: ");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        cairo_show_text (cr, disk[tonumber(d)].serial);

        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+180,y);cairo_show_text (cr, "REV: ");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        cairo_move_to (cr, x+220,y);cairo_show_text (cr, disk[tonumber(d)].revision);

        y = y + 15
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+30,y);cairo_show_text (cr, "Rozhraní: ");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        cairo_show_text (cr, disk[tonumber(d)].interface);
        if disk[tonumber(d)].interface == "usb" then
          if tonumber(string.match(disk[tonumber(d)].speed, "(%d%d)")) > 48 then
            cairo_show_text (cr, "3");
          else
            cairo_show_text (cr, "2");
          end--
        end--if disk[tonumber(d)].interface == "usb" then

        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+180,y);cairo_show_text (cr, "Výměnný: ");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        if tonumber(disk[tonumber(d)].rm) == 1 then
          cairo_show_text (cr, "ano");
        else
          cairo_show_text (cr, "ne");
        end--if tonumber(disk[tonumber(d)].rm) == 1 then

        y = y + 15
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+30,y);cairo_show_text (cr, "Tabulka oddílů: ");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        if disk[tonumber(d)].scheme == "" then
          cairo_show_text (cr, disk[tonumber(d)].typ);
        else
          cairo_show_text (cr, disk[tonumber(d)].scheme);
        end--if disk[tonumber(d)].scheme ~= nil then

        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_move_to (cr, x+180,y);cairo_show_text (cr, "Počet oddílů: ");
        cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
        cairo_show_text (cr, disk[tonumber(d)].count);

        --oddělující čára
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_rectangle (cr, x+30,y+4,rozmer_panelu_x-40,0.5);cairo_fill (cr);
        y = y + 4

        --všechny oddíly a vrstvy na disku
        if tonumber(disk[tonumber(d)].oddil_pocet) > 0 then
          for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do

            y = y + 12
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+30,y);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].name);
            cairo_move_to (cr, x+70,y);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].typ);
            cairo_move_to (cr, x+110,y);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].size);

            cairo_move_to (cr, x+150,y);
            local text = disk[tonumber(d)].oddil[tonumber(o)].mount
            if text ~= nil then
              local delka = string.len(text)
              if delka > 29 then
                text = string.match(text, "(%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S)")
                cairo_show_text (cr, text.."...");
              else
                cairo_show_text (cr, text);
              end
            end--if text ~= nil then

          end--for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do

        end--if disk[tonumber(d)].oddil_pocet ~= nil then

        --oddělující čára
        cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
        cairo_rectangle (cr, x+30,y+4,rozmer_panelu_x-40,0.5);cairo_fill (cr);
        y = y + 4

      end--if disky_tab.tl[tonumber(d)] == 1 then

      ----------------------------------------
      --pozadí pro bar a info o připojeném oddílu
      --pro '/' a '/home'
      if tonumber(mount[tonumber(d)]) > 0 then
        for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do

          local mnt = disk[tonumber(d)].oddil[tonumber(o)].mount

          if mnt == "/" or mnt == "/home" then

            --pozadí
            if pozadi_panel == 1 then pozadi(y+2,30) end

            --název oddílu
            cairo_set_font_size (cr, 9.0);
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+30,y+12);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].name);

            --zobrazení pokud se jedná o crypt/lvm vrstu
            local text = disk[tonumber(d)].oddil[tonumber(o)].name
            if string.match(text, "(%S%S)") == "dm" then
              cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
              cairo_move_to (cr, x+60,y+12);
              cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].typ);
            end--if string.match(text, "(%S%S)") == "dm" then

            --přípojný bod oddílu
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+90,y+12);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].mount);

            --nastavení baru
            y = y + 15
            conky_indikace = conky_parse("${fs_used_perc "..mnt.."}")
            odsazeni = 30 --odsazení baru od okraje oproti textu (0 = žádné odsazení)
            pbar = {0.5,0.4,0.3,0.8} --barva pozadí baru
            ibar = {0.6,0.1,0.1,0.5} --barva indikátoru v baru
            sbar = rozmer_panelu_x - odsazeni - 10
            vbar = 14 --výška baru
            --volání funkce pro vykresleni baru
            bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)

            --text v baru
            cairo_set_font_size (cr, 10.0);
            cairo_set_source_rgba (cr, 1,1,1,1);
            cairo_move_to (cr, x+35,y+11);
            local text = string.match(conky_parse("${fs_size "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, text);
            cairo_move_to (cr, x+90,y+11);
            cairo_show_text (cr, conky_parse("${fs_type "..mnt.."}"));
            cairo_move_to (cr, x+150,y+11);
            local text = string.match(conky_parse("${fs_used "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, "U: "..text);
            cairo_move_to (cr, x+235,y+11);
            local text = string.match(conky_parse("${fs_free "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, "F: "..text);
            cairo_move_to (cr, x+318,y+11);
            cairo_show_text (cr, conky_parse("${fs_free_perc "..mnt.."}").."%");

            --pozice pro další bar
            y = y + 15

          end--if mnt == "/" or mnt == "/home" then
        end--for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do
      end--if tonumber(mount[tonumber(d)]) > 0 then

      --pozadí pro bar a info o připojeném oddílu
      --pro další systémové oddíly
      if tonumber(mount[tonumber(d)]) > 0 then
        for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do

          local mnt = disk[tonumber(d)].oddil[tonumber(o)].mount

          if mnt == "/boot" or mnt == "/boot/efi" or mnt == "/var" or mnt == "/usr" then

            --pozadí
            if pozadi_panel == 1 then pozadi(y+2,30) end

            --název oddílu
            cairo_set_font_size (cr, 9.0);
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+30,y+12);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].name);

            --zobrazení pokud se jedná o crypt/lvm vrstu
            local text = disk[tonumber(d)].oddil[tonumber(o)].name
            if string.match(text, "(%S%S)") == "dm" then
              cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
              cairo_move_to (cr, x+60,y+12);
              cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].typ);
            end--if string.match(text, "(%S%S)") == "dm" then

            --přípojný bod oddílu
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+90,y+12);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].mount);

            --nastavení baru
            y = y + 15
            conky_indikace = conky_parse("${fs_used_perc "..mnt.."}")
            odsazeni = 30 --odsazení baru od okraje oproti textu (0 = žádné odsazení)
            pbar = {0.5,0.4,0.3,0.8} --barva pozadí baru
            ibar = {0.6,0.1,0.1,0.5} --barva indikátoru v baru
            sbar = rozmer_panelu_x - odsazeni - 10
            vbar = 14 --výška baru
            --volání funkce pro vykresleni baru
            bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)

            --text v baru
            cairo_set_font_size (cr, 10.0);
            cairo_set_source_rgba (cr, 1,1,1,1);
            cairo_move_to (cr, x+35,y+11);
            local text = string.match(conky_parse("${fs_size "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, text);
            cairo_move_to (cr, x+90,y+11);
            cairo_show_text (cr, conky_parse("${fs_type "..mnt.."}"));
            cairo_move_to (cr, x+150,y+11);
            local text = string.match(conky_parse("${fs_used "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, "U: "..text);
            cairo_move_to (cr, x+235,y+11);
            local text = string.match(conky_parse("${fs_free "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, "F: "..text);
            cairo_move_to (cr, x+318,y+11);
            cairo_show_text (cr, conky_parse("${fs_free_perc "..mnt.."}").."%");

            --pozice pro další bar
            y = y + 15

          end--if mnt == "/boot" or mnt == "/boot/efi" or mnt == "/var" or mnt == "/usr" then
        end--for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do
      end--if tonumber(mount[tonumber(d)]) > 0 then

      --pozadí pro bar a info o připojeném oddílu
      --pro ostatní oddíly
      if tonumber(mount[tonumber(d)]) > 0 then
        for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do

          local mnt = disk[tonumber(d)].oddil[tonumber(o)].mount

          if mnt ~= nil and string.match(mnt, "(%S%S%S%S%S%S%S)") == "/media/" then

            --pozadí
            if pozadi_panel == 1 then pozadi(y+2,30) end

            --název oddílu
            cairo_set_font_size (cr, 9.0);
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+30,y+12);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].name);

            --zobrazení pokud se jedná o crypt/lvm vrstu
            local text = disk[tonumber(d)].oddil[tonumber(o)].name
            if string.match(text, "(%S%S)") == "dm" then
              cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
              cairo_move_to (cr, x+60,y+12);
              cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].typ);
            end--if string.match(text, "(%S%S)") == "dm" then

            --přípojný bod oddílu
            cairo_set_source_rgba (cr, 0.7,0.7,0.7,1);
            cairo_move_to (cr, x+90,y+12);
            cairo_show_text (cr, disk[tonumber(d)].oddil[tonumber(o)].mount);

            --nastavení baru
            y = y + 15
            conky_indikace = conky_parse("${fs_used_perc "..mnt.."}")
            odsazeni = 30 --odsazení baru od okraje oproti textu (0 = žádné odsazení)
            pbar = {0.5,0.4,0.3,0.8} --barva pozadí baru
            ibar = {0.1,0.1,0.6,0.5} --barva indikátoru v baru
            sbar = rozmer_panelu_x - odsazeni - 10
            vbar = 14 --výška baru
            --volání funkce pro vykresleni baru
            bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)

            --text v baru
            cairo_set_font_size (cr, 10.0);
            cairo_set_source_rgba (cr, 1,1,1,1);
            cairo_move_to (cr, x+35,y+11);
            local text = string.match(conky_parse("${fs_size "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, text);
            cairo_move_to (cr, x+90,y+11);
            cairo_show_text (cr, conky_parse("${fs_type "..mnt.."}"));
            cairo_move_to (cr, x+150,y+11);
            local text = string.match(conky_parse("${fs_used "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, "U: "..text);
            cairo_move_to (cr, x+235,y+11);
            local text = string.match(conky_parse("${fs_free "..mnt.."}"),"([%d%p]*%w)")
            cairo_show_text (cr, "F: "..text);
            cairo_move_to (cr, x+318,y+11);
            cairo_show_text (cr, conky_parse("${fs_free_perc "..mnt.."}").."%");

            --pozice pro další bar
            y = y + 15

          end--if mnt ~= nil and string.match(mnt, "(%S%S%S%S%S%S%S)") == "/media/" then
        end--for o = 1,tonumber(disk[tonumber(d)].oddil_pocet) do
      end--if tonumber(mount[tonumber(d)]) > 0 then

    end--for d = 1,#disk do

    ----------------------------------------
    --úprava pozadí pod názvem zařízení (kosmetická úprava)
    if pozadi_panel == 1 then pozadi(y+2,1) end

  end--if klik_menu[tostring(name)] == 1 then

  ----------------------------------------
  --pozice pro další modul
  if klik_menu[tostring(name)] == 1 then
    next_y = y + 17
  else
    next_y = y + 14
  end--if klik_menu[tostring(name)] == 1 then

  modul.pozice[tonumber(disky_tab.pozice_y)+1] = next_y

  return modul

end--function modul_disky()
--############################################################