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():
#vorbereitung
#
#sudo hwinfo --short --block IST SUPER GEIL
#
drives = []
driveDict = [] # ist eine Liste, enthält für jede HDD ein dict
driveDict = []
keys = ['device', 'name', 'smart', 'size', 'serial']
keys = [
'name', 'model', 'serial', 'size', 'rota', 'rm', 'hotplug', 'state',
'smart'
]
blkid = subprocess.Popen(["hwinfo --disk --short"],
stdout=subprocess.PIPE,
shell=True,
universal_newlines=True)
grepedDrives = subprocess.Popen(["grep", "/dev/sd"],
stdin=blkid.stdout,
stdout=subprocess.PIPE,
universal_newlines=True)
lsblk = subprocess.Popen(
["lsblk -I 8 -d -b -o NAME,MODEL,SERIAL,SIZE,ROTA,RM,HOTPLUG,STATE"],
stdout=subprocess.PIPE,
shell=True,
universal_newlines=True)
while True:
line = grepedDrives.stdout.readline()
line = lsblk.stdout.readline()
if line != '':
drives.append(line.rstrip())
else:
break
blkid.stdout.close()
lsblk.stdout.close()
del drives[0]
for line in drives:
#
# Effizienter machen mit newLine = ' '.join(line.split())
#
newLine = ' '.join(line.split())
newLine = newLine.split(" ")
while len(newLine) > 8:
newLine[1] = newLine[1] + " " + newLine[2]
del newLine[2]
values = []
line = line.replace(" ", "", 15)
values.append(line[:8])
values.append(line[8:])
values.append(smartPassed(values[0]))
values.append(getTotalSize(values[0]))
values.append(getSerial(values[0]))
for i in range(len(keys) - 1):
if newLine[i] == "0":
values.append(False)
elif newLine[i] == "1":
values.append(True)
else:
values.append(newLine[i])
values.append(smartPassed("/dev/" + values[0]))
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
for drive in sortedDriveDict:
driveObj = Drive(
drive.get("device"), drive.get("name"), drive.get("smart"),
drive.get("size"), drive.get("serial"))
drive.get("name"), drive.get("model"), 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(
exists().where(Drive.serial == driveObj.serial)).scalar()
if ret:
print(drive.get("device") + " in db")
print(drive.get("name") + " in db")
print("Mache nichts...")
else:
print(drive.get("device") + " NICHT in db")
print(drive.get("name") + " NICHT in db")
db.session.add(driveObj)
db.session.commit()
@ -78,46 +82,6 @@ def smartPassed(device):
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):
partDict = [] # ist eine Liste, enthält für jede part ein dict
drives = []
@ -161,6 +125,8 @@ def getPartitions(device):
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 = []
blkid = subprocess.Popen(["blkid"],
stdout=subprocess.PIPE,

View file

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

View file

@ -22,12 +22,12 @@
<tbody>
{% for drive in drives %}
<tr>
<td>{{drive.device}}</td>
<td>{{drive.name}}</td>
<td>{{drive.size}}</td>
<td>{{drive.model}}</td>
<td>{{drive.size|filesizeformat}}</td>
<td>{{drive.smart}}</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>
Partitionen
</a>