monitor.coffee 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. el = (id) -> document.getElementById(id)
  2. set = (id, value) -> el(id).innerHTML = value
  3. values = (e for e in el('content').getElementsByTagName('span')) \
  4. .concat(el('osname'))
  5. connect = ->
  6. val.innerHTML = 'Connecting...' for val in values
  7. ws = new WebSocket 'ws://kompiler.org:8100'
  8. ws.onopen = ->
  9. console.log 'open'
  10. el('status').className = 'right online'
  11. set('status', '<i class="icon-off"></i>Online')
  12. ws.onclose = ->
  13. console.log 'close'
  14. val.innerHTML = '-' for val in values
  15. el('status').className = 'right offline'
  16. set('status', '<i class="icon-off"></i>Offline')
  17. setTimeout connect, 5000
  18. ws.onerror = (e) ->
  19. console.log 'error', e
  20. ws.onmessage = (msg) ->
  21. console.log 'msg', msg.data
  22. data = JSON.parse(msg.data)
  23. set('osname', data.osname) if data.osname
  24. set('uptime', fmt_time(data.uptime)) if data.uptime
  25. set('cpu-usage', "#{data.cpu_usage}%")
  26. set('memory', fmt_kbytes_usage(data.memory))
  27. set('disk', fmt_kbytes_usage(data.disk))
  28. if data.temps
  29. el('temp').innerHTML = ("#{deg}&#8451;" for deg in data.temps) \
  30. .join('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')
  31. else
  32. set('temp', '-')
  33. fmt_time = (total) ->
  34. total = Math.round total
  35. s = (n) -> if n == 1 then '' else 's'
  36. secs = total % 60
  37. str = "#{secs} second" + s(secs)
  38. if total >= 60
  39. mins = parseInt total % (60 * 60) / 60
  40. str = "#{mins} minute#{s(mins)}, #{str}"
  41. if total >= 60 * 60
  42. hours = parseInt total % (60 * 60 * 24) / (60 * 60)
  43. str = "#{hours} hour#{s(hours)}, #{str}"
  44. str
  45. fmt_kbytes_usage = ([used, total]) ->
  46. used = Math.round used / 1e6
  47. total = Math.round total / 1e6
  48. perc = Math.round used / total * 100
  49. return "#{used}MB / #{total}MB (#{perc}%)"
  50. connect()