disks werden besser eingelesen

This commit is contained in:
Daniel 2019-03-12 17:22:25 +01:00
parent 3b47e039c9
commit b98fac2891
3 changed files with 53 additions and 79 deletions

View file

@ -6,54 +6,58 @@ from sqlalchemy.sql.expression import exists
def getAllDrives(): def getAllDrives():
#vorbereitung
#
#sudo hwinfo --short --block IST SUPER GEIL
#
drives = [] drives = []
driveDict = [] # ist eine Liste, enthält für jede HDD ein dict driveDict = []
keys = ['device', 'name', 'smart', 'size', 'serial'] keys = ['device', 'name', 'smart', 'size', 'serial']
keys = [
'name', 'model', 'serial', 'size', 'rota', 'rm', 'hotplug', 'state',
'smart'
]
blkid = subprocess.Popen(["hwinfo --disk --short"], lsblk = subprocess.Popen(
stdout=subprocess.PIPE, ["lsblk -I 8 -d -b -o NAME,MODEL,SERIAL,SIZE,ROTA,RM,HOTPLUG,STATE"],
shell=True, stdout=subprocess.PIPE,
universal_newlines=True) shell=True,
grepedDrives = subprocess.Popen(["grep", "/dev/sd"], universal_newlines=True)
stdin=blkid.stdout,
stdout=subprocess.PIPE,
universal_newlines=True)
while True: while True:
line = grepedDrives.stdout.readline() line = lsblk.stdout.readline()
if line != '': if line != '':
drives.append(line.rstrip()) drives.append(line.rstrip())
else: else:
break break
blkid.stdout.close() lsblk.stdout.close()
del drives[0]
for line in drives: for line in drives:
# newLine = ' '.join(line.split())
# Effizienter machen mit newLine = ' '.join(line.split()) newLine = newLine.split(" ")
# while len(newLine) > 8:
newLine[1] = newLine[1] + " " + newLine[2]
del newLine[2]
values = [] values = []
line = line.replace(" ", "", 15) for i in range(len(keys) - 1):
values.append(line[:8]) if newLine[i] == "0":
values.append(line[8:]) values.append(False)
values.append(smartPassed(values[0])) elif newLine[i] == "1":
values.append(getTotalSize(values[0])) values.append(True)
values.append(getSerial(values[0])) else:
values.append(newLine[i])
values.append(smartPassed("/dev/" + values[0]))
driveDict.append(dict(zip(keys, values))) driveDict.append(dict(zip(keys, values)))
sortedDriveDict = sorted(driveDict, key=lambda drive: drive['device']) sortedDriveDict = sorted(driveDict, key=lambda drive: drive['name'])
#add to db #add to db
for drive in sortedDriveDict: for drive in sortedDriveDict:
driveObj = Drive( driveObj = Drive(
drive.get("device"), drive.get("name"), drive.get("smart"), drive.get("name"), drive.get("model"), drive.get("serial"),
drive.get("size"), drive.get("serial")) drive.get("size"), drive.get("rota"), drive.get("rm"),
drive.get("hotplug"), drive.get("state"), drive.get("smart"))
ret = db.session.query( ret = db.session.query(
exists().where(Drive.serial == driveObj.serial)).scalar() exists().where(Drive.serial == driveObj.serial)).scalar()
if ret: if ret:
print(drive.get("device") + " in db") print(drive.get("name") + " in db")
print("Mache nichts...")
else: else:
print(drive.get("device") + " NICHT in db") print(drive.get("name") + " NICHT in db")
db.session.add(driveObj) db.session.add(driveObj)
db.session.commit() db.session.commit()
@ -78,46 +82,6 @@ def smartPassed(device):
return passed return passed
def getTotalSize(device):
drives = []
fdisk = subprocess.Popen(["fdisk -l"],
stdout=subprocess.PIPE,
shell=True,
universal_newlines=True)
grepedDrives = subprocess.Popen(["grep", device],
stdin=fdisk.stdout,
stdout=subprocess.PIPE,
universal_newlines=True)
while True:
line = grepedDrives.stdout.readline()
if line != '':
drives.append(line.rstrip())
else:
break
fdisk.stdout.close()
firstLine = drives[0].split(" ")
size = firstLine[2] + " " + firstLine[3][:-1]
return size
def getSerial(device):
# hier auch size abfragen
blkid = subprocess.Popen(["hwinfo --disk --only " + device],
stdout=subprocess.PIPE,
shell=True,
universal_newlines=True)
grepedDrives = subprocess.Popen(["grep", "Serial"],
stdin=blkid.stdout,
stdout=subprocess.PIPE,
universal_newlines=True)
line = grepedDrives.stdout.readline().strip()
blkid.stdout.close()
line = line.split(" ")
serial = line[2][1:-1]
return serial
def getPartitions(device): def getPartitions(device):
partDict = [] # ist eine Liste, enthält für jede part ein dict partDict = [] # ist eine Liste, enthält für jede part ein dict
drives = [] drives = []
@ -161,6 +125,8 @@ def getPartitions(device):
def partDetails(part): def partDetails(part):
# sudo lsblk -fs /dev/sda2 bessa
# sudo lsblk -o NAME,FSTYPE,UUID,RM,SIZE,STATE,TYPE,MOUNTPOINT,LABEL,MODEL,ROTA auch gut
values = [] values = []
blkid = subprocess.Popen(["blkid"], blkid = subprocess.Popen(["blkid"],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,

View file

@ -7,19 +7,27 @@ from sqlalchemy.ext.declarative import declarative_base
class Drive(db.Model): class Drive(db.Model):
__tablename__ = 'drives' __tablename__ = 'drives'
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
device = db.Column(db.String)
name = db.Column(db.String) name = db.Column(db.String)
size = db.Column(db.String) model = db.Column(db.String)
smart = db.Column(db.Boolean)
serial = db.Column(db.String) serial = db.Column(db.String)
size = db.Column(db.Integer)
rota = db.Column(db.Boolean)
rm = db.Column(db.Boolean)
hotplug = db.Column(db.Boolean)
state = db.Column(db.String)
smart = db.Column(db.Boolean)
partitions = db.relationship("Partitions") partitions = db.relationship("Partitions")
def __init__(self, device, name, smart, size, serial): def __init__(self, name, model, serial, size, rota, rm, hotplug, state, smart):
self.device = device
self.name = name self.name = name
self.smart = smart self.model = model
self.size = size
self.serial = serial self.serial = serial
self.size = size
self.rota = rota
self.rm = rm
self.hotplug = hotplug
self.state = state
self.smart = smart
class Partitions(db.Model): class Partitions(db.Model):

View file

@ -22,12 +22,12 @@
<tbody> <tbody>
{% for drive in drives %} {% for drive in drives %}
<tr> <tr>
<td>{{drive.device}}</td>
<td>{{drive.name}}</td> <td>{{drive.name}}</td>
<td>{{drive.size}}</td> <td>{{drive.model}}</td>
<td>{{drive.size|filesizeformat}}</td>
<td>{{drive.smart}}</td> <td>{{drive.smart}}</td>
<td> <td>
<a href="{{ url_for('partitions', part=(drive.device | replace("/", "_"))) }}" class="waves-effect waves-light btn"> <a href="{{ url_for('partitions', part=(drive.name | replace("/", "_"))) }}" class="waves-effect waves-light btn">
<i class="material-icons left">list</i> <i class="material-icons left">list</i>
Partitionen Partitionen
</a> </a>