2.0 refactoring:

    * Add type for most of functions
    * Remove old fio run code, move to RPC/pluggable
    * Remove most of sensors code, will move then to RPC
    * Other refactoring
diff --git a/wally/hw_info.py b/wally/hw_info.py
index 73226e3..214883d 100644
--- a/wally/hw_info.py
+++ b/wally/hw_info.py
@@ -1,15 +1,17 @@
 import re
+from typing import Dict, Any, Iterable
 import xml.etree.ElementTree as ET
 
-from wally import ssh_utils, utils
+from . import utils
+from .inode import INode
 
 
-def get_data(rr, data):
+def get_data(rr: str, data: str) -> str:
     match_res = re.search("(?ims)" + rr, data)
     return match_res.group(0)
 
 
-class HWInfo(object):
+class HWInfo:
     def __init__(self):
         self.hostname = None
         self.cores = []
@@ -30,11 +32,11 @@
 
         self.storage_controllers = []
 
-    def get_HDD_count(self):
+    def get_hdd_count(self) -> Iterable[int]:
         # SATA HDD COUNT, SAS 10k HDD COUNT, SAS SSD count, PCI-E SSD count
         return []
 
-    def get_summary(self):
+    def get_summary(self) -> Dict[str, Any]:
         cores = sum(count for _, count in self.cores)
         disks = sum(size for _, size in self.disks_info.values())
 
@@ -52,15 +54,15 @@
                                   ram=utils.b2ssize(summ['ram']),
                                   disk=utils.b2ssize(summ['storage'])))
         res.append(str(self.sys_name))
-        if self.mb is not None:
+        if self.mb:
             res.append("Motherboard: " + self.mb)
 
-        if self.ram_size == 0:
+        if not self.ram_size:
             res.append("RAM: Failed to get RAM size")
         else:
             res.append("RAM " + utils.b2ssize(self.ram_size) + "B")
 
-        if self.cores == []:
+        if not self.cores:
             res.append("CPU cores: Failed to get CPU info")
         else:
             res.append("CPU cores:")
@@ -70,12 +72,12 @@
                 else:
                     res.append("    " + name)
 
-        if self.storage_controllers != []:
+        if self.storage_controllers:
             res.append("Disk controllers:")
             for descr in self.storage_controllers:
                 res.append("    " + descr)
 
-        if self.disks_info != {}:
+        if self.disks_info:
             res.append("Storage devices:")
             for dev, (model, size) in sorted(self.disks_info.items()):
                 ssize = utils.b2ssize(size) + "B"
@@ -83,14 +85,14 @@
         else:
             res.append("Storage devices's: Failed to get info")
 
-        if self.disks_raw_info != {}:
+        if self.disks_raw_info:
             res.append("Disks devices:")
             for dev, descr in sorted(self.disks_raw_info.items()):
                 res.append("    {0} {1}".format(dev, descr))
         else:
             res.append("Disks devices's: Failed to get info")
 
-        if self.net_info != {}:
+        if self.net_info:
             res.append("Net adapters:")
             for name, (speed, dtype, _) in self.net_info.items():
                 res.append("    {0} {2} duplex={1}".format(name, dtype, speed))
@@ -100,7 +102,7 @@
         return str(self.hostname) + ":\n" + "\n".join("    " + i for i in res)
 
 
-class SWInfo(object):
+class SWInfo:
     def __init__(self):
         self.partitions = None
         self.kernel_version = None
@@ -112,48 +114,29 @@
         self.ceph_version = None
 
 
-def get_sw_info(conn):
+def get_sw_info(node: INode) -> SWInfo:
     res = SWInfo()
+
     res.OS_version = utils.get_os()
-
-    with conn.open_sftp() as sftp:
-        def get(fname):
-            try:
-                return ssh_utils.read_from_remote(sftp, fname)
-            except:
-                return None
-
-        res.kernel_version = get('/proc/version')
-        res.partitions = get('/etc/mtab')
-
-    def rr(cmd):
-        try:
-            return ssh_utils.run_over_ssh(conn, cmd, nolog=True)
-        except:
-            return None
-
-    res.libvirt_version = rr("virsh -v")
-    res.qemu_version = rr("qemu-system-x86_64 --version")
-    res.ceph_version = rr("ceph --version")
+    res.kernel_version = node.get_file_content('/proc/version')
+    res.partitions = node.get_file_content('/etc/mtab')
+    res.libvirt_version = node.run("virsh -v", nolog=True)
+    res.qemu_version = node.run("qemu-system-x86_64 --version", nolog=True)
+    res.ceph_version = node.run("ceph --version", nolog=True)
 
     return res
 
 
-def get_network_info():
-    pass
-
-
-def get_hw_info(conn):
+def get_hw_info(node: INode) -> HWInfo:
     res = HWInfo()
-    lshw_out = ssh_utils.run_over_ssh(conn, 'sudo lshw -xml 2>/dev/null',
-                                      nolog=True)
+    lshw_out = node.run('sudo lshw -xml 2>/dev/null', nolog=True)
 
     res.raw = lshw_out
     lshw_et = ET.fromstring(lshw_out)
 
     try:
         res.hostname = lshw_et.find("node").attrib['id']
-    except:
+    except Exception:
         pass
 
     try:
@@ -161,7 +144,7 @@
                         lshw_et.find("node/product").text)
         res.sys_name = res.sys_name.replace("(To be filled by O.E.M.)", "")
         res.sys_name = res.sys_name.replace("(To be Filled by O.E.M.)", "")
-    except:
+    except Exception:
         pass
 
     core = lshw_et.find("node/node[@id='core']")
@@ -171,7 +154,7 @@
     try:
         res.mb = " ".join(core.find(node).text
                           for node in ['vendor', 'product', 'version'])
-    except:
+    except Exception:
         pass
 
     for cpu in core.findall("node[@class='processor']"):
@@ -183,7 +166,7 @@
             else:
                 threads = int(threads_node.attrib['value'])
             res.cores.append((model, threads))
-        except:
+        except Exception:
             pass
 
     res.ram_size = 0
@@ -201,7 +184,7 @@
                 else:
                     assert mem_sz.attrib['units'] == 'bytes'
                     res.ram_size += int(mem_sz.text)
-        except:
+        except Exception:
             pass
 
     for net in core.findall(".//node[@class='network']"):
@@ -223,7 +206,7 @@
                     dup = dup_node.attrib['value']
 
                 res.net_info[name] = (speed, dup, [])
-        except:
+        except Exception:
             pass
 
     for controller in core.findall(".//node[@class='storage']"):
@@ -240,7 +223,7 @@
                 res.storage_controllers.append(
                     "{0} {1} {2}".format(description,
                                          vendor, product))
-        except:
+        except Exception:
             pass
 
     for disk in core.findall(".//node[@class='disk']"):
@@ -268,98 +251,7 @@
 
                 businfo = disk.find('businfo').text
                 res.disks_raw_info[businfo] = full_descr
-        except:
+        except Exception:
             pass
 
     return res
-
-# import traceback
-# print ET.tostring(disk)
-# traceback.print_exc()
-
-# print get_hw_info(None)
-
-# def get_hw_info(conn):
-#     res = HWInfo(None)
-#     remote_run = functools.partial(ssh_utils.run_over_ssh, conn, nolog=True)
-
-#     # some data
-#     with conn.open_sftp() as sftp:
-#         proc_data = ssh_utils.read_from_remote(sftp, '/proc/cpuinfo')
-#         mem_data = ssh_utils.read_from_remote(sftp, '/proc/meminfo')
-
-#     # cpu info
-#     curr_core = {}
-#     for line in proc_data.split("\n"):
-#         if line.strip() == "":
-#             if curr_core != {}:
-#                 res.cores.append(curr_core)
-#                 curr_core = {}
-#         else:
-#             param, val = line.split(":", 1)
-#             curr_core[param.strip()] = val.strip()
-
-#     if curr_core != {}:
-#         res.cores.append(curr_core)
-
-#     # RAM info
-#     for line in mem_data.split("\n"):
-#         if line.startswith("MemTotal"):
-#             res.ram_size = int(line.split(":", 1)[1].split()[0]) * 1024
-#             break
-
-#     # HDD info
-#     for dev in remote_run('ls /dev').split():
-#         if dev[-1].isdigit():
-#             continue
-
-#         if dev.startswith('sd') or dev.startswith('hd'):
-#             model = None
-#             size = None
-
-#             for line in remote_run('sudo hdparm -I /dev/' + dev).split("\n"):
-#                 if "Model Number:" in line:
-#                     model = line.split(':', 1)[1]
-#                 elif "device size with M = 1024*1024" in line:
-#                     size = int(line.split(':', 1)[1].split()[0])
-#                     size *= 1024 ** 2
-
-#             res.disks_info[dev] = (model, size)
-
-#     # Network info
-#     separator = '*-network'
-#     net_info = remote_run('sudo lshw -class network')
-#     for net_dev_info in net_info.split(separator):
-#         if net_dev_info.strip().startswith("DISABLED"):
-#             continue
-
-#         if ":" not in net_dev_info:
-#             continue
-
-#         dev_params = {}
-#         for line in net_dev_info.split("\n"):
-#             line = line.strip()
-#             if ':' in line:
-#                 key, data = line.split(":", 1)
-#                 dev_params[key.strip()] = data.strip()
-
-#         if 'configuration' not in dev_params:
-#             print "!!!!!", net_dev_info
-#             continue
-
-#         conf = dev_params['configuration']
-#         if 'link=yes' in conf:
-#             if 'speed=' in conf:
-#                 speed = conf.split('speed=', 1)[1]
-#                 speed = speed.strip().split()[0]
-#             else:
-#                 speed = None
-
-#             if "duplex=" in conf:
-#                 dtype = conf.split("duplex=", 1)[1]
-#                 dtype = dtype.strip().split()[0]
-#             else:
-#                 dtype = None
-
-#             res.net_info[dev_params['logical name']] = (speed, dtype)
-#     return res