aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Components/Harddisk.py
blob: 0009a6b81102b02992fb0c3dbe087cd9d75ebea0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import os

def tryOpen(filename):
	try:
		procFile = open(filename)
	except IOError:
		return ""
	return procFile

def num2prochdx(num):
	return "/proc/ide/hd" + ("a","b","c","d","e","f","g","h","i")[num] + "/"

class Harddisk:
	def __init__(self, index):
		self.index = index

		host = self.index / 4
		bus = (self.index & 2)
		target = (self.index & 1)

		self.prochdx = num2prochdx(index)
		self.devidex = "/dev/ide/host%d/bus%d/target%d/lun0/" % (host, bus, target)

	def hdindex(self):
		return self.index
	def capacity(self):
		procfile = tryOpen(self.prochdx + "capacity")
		
		if procfile == "":
			return -1

		line = procfile.readline()
		procfile.close()
		
		try:
			cap = int(line)
		except:
			return -1
		
		return cap	
						
	def model(self):
		procfile = tryOpen(self.prochdx + "model")
		
		if procfile == "":
			return ""

		line = procfile.readline()
		procfile.close()

		return line.strip()

	def free(self):
		procfile = tryOpen("/proc/mounts")
		
		if procfile == "":
			return -1

		free = -1
		while 1:
			line = procfile.readline()
			if line == "":
				break
			if line.startswith(self.devidex):
				parts = line.strip().split(" ")
				try:
					stat = os.statvfs(parts[1])
				except OSError:
					continue
				free = stat.f_bfree/1000 * stat.f_bsize/1000
				break
		procfile.close()
		return free		

	def numPartitions(self):
		try:
			idedir = os.listdir(self.devidex)
		except OSError:
			return -1
		numPart = -1
		for filename in idedir:
			if filename.startswith("disc"):
				numPart += 1
			if filename.startswith("part"):
				numPart += 1
		return numPart


def existHDD(num):
	mediafile = tryOpen(num2prochdx(num) + "media")

	if mediafile == "":
		return -1

	line = mediafile.readline()
	mediafile.close()
	
	if line.startswith("disk"):
		return 1
	
	return -1

class HarddiskManager:
	def __init__(self):
		hddNum = 0
		self.hdd = [ ]
		while 1:
			if existHDD(hddNum) == 1:
				self.hdd.append(Harddisk(hddNum))
			hddNum += 1
			
			if hddNum > 8:
				break
		
	def HDDList(self):
		list = [ ]
		for hd in self.hdd:
			cap = hd.capacity() / 1000 * 512 / 1000
			hdd = hd.model() + " (" 
			if hd.index & 1:
				hdd += "slave"
			else:	
				hdd += "master"
			if cap > 0:
				hdd += ", %d,%d GB" % (cap/1024, cap%1024)
			hdd += ")"

			list.append((hdd, hd))
		return list