make some stuff even simpler
[enigma2.git] / lib / python / Components / Harddisk.py
1 import os
2
3 def tryOpen(filename):
4         try:
5                 procFile = open(filename)
6         except IOError:
7                 return ""
8         return procFile
9
10 def num2prochdx(num):
11         return "/proc/ide/hd" + ("a","b","c","d","e","f","g","h","i")[num] + "/"
12
13 class Harddisk:
14         def __init__(self, index):
15                 self.index = index
16
17                 host = self.index / 4
18                 bus = (self.index & 2)
19                 target = (self.index & 1)
20
21                 self.prochdx = num2prochdx(index)
22                 self.devidex = "/dev/ide/host%d/bus%d/target%d/lun0/" % (host, bus, target)
23
24         def getIndex(self):
25                 return self.index
26
27         def bus(self):
28                 #TODO: add the host
29                 if self.index & 1:
30                         return "Slave"
31                 else:
32                         return "Master"
33
34         def capacity(self):
35                 procfile = tryOpen(self.prochdx + "capacity")
36                 
37                 if procfile == "":
38                         return ""
39
40                 line = procfile.readline()
41                 procfile.close()
42                 
43                 try:
44                         cap = int(line)
45                 except:
46                         return ""
47                 
48                 cap = cap / 1000 * 512 / 1000
49                 
50                 return "%d.%03d GB" % (cap/1024, cap%1024)
51                                                                 
52         def model(self):
53                 procfile = tryOpen(self.prochdx + "model")
54                 
55                 if procfile == "":
56                         return ""
57
58                 line = procfile.readline()
59                 procfile.close()
60
61                 return line.strip()
62
63         def free(self):
64                 procfile = tryOpen("/proc/mounts")
65                 
66                 if procfile == "":
67                         return -1
68
69                 free = -1
70                 while 1:
71                         line = procfile.readline()
72                         if line == "":
73                                 break
74                         if line.startswith(self.devidex):
75                                 parts = line.strip().split(" ")
76                                 try:
77                                         stat = os.statvfs(parts[1])
78                                 except OSError:
79                                         continue
80                                 free = stat.f_bfree/1000 * stat.f_bsize/1000
81                                 break
82                 procfile.close()
83                 return free             
84
85         def numPartitions(self):
86                 try:
87                         idedir = os.listdir(self.devidex)
88                 except OSError:
89                         return -1
90                 numPart = -1
91                 for filename in idedir:
92                         if filename.startswith("disc"):
93                                 numPart += 1
94                         if filename.startswith("part"):
95                                 numPart += 1
96                 return numPart
97
98         def unmount(self):
99                 cmd = "/bin/umount " + self.devidex + "part*"
100                 os.system(cmd)
101
102         def createPartition(self):
103                 cmd = "/sbin/sfdisk -f " + self.devidex + "disc"
104                 sfdisk = os.popen(cmd, "w")
105                 sfdisk.write("0,\n;\n;\n;\ny\n")
106                 sfdisk.close()
107                 return 0
108
109         def mkfs(self):
110                 cmd = "/sbin/mkfs.ext3 -T largefile -m0 " + self.devidex + "part1"
111                 res = os.system(cmd)
112                 return (res >> 8)
113
114         def mount(self):
115                 cmd = "/bin/mount -t ext3 " + self.devidex + "part1 /hdd"
116                 res = os.system(cmd)
117                 return (res >> 8)
118
119         def createMovieFolder(self):
120                 res = os.system("mkdir /hdd/movie")
121                 return (res >> 8)
122                 
123         def initialize(self):
124                 self.unmount()
125
126                 if self.createPartition() != 0:
127                         return -1
128
129                 if self.mkfs() != 0:
130                         return -2
131
132                 if self.mount() != 0:
133                         return -3
134
135                 if self.createMovieFolder() != 0:
136                         return -4
137                 
138                 return 0
139                 
140 def existHDD(num):
141         mediafile = tryOpen(num2prochdx(num) + "media")
142
143         if mediafile == "":
144                 return -1
145
146         line = mediafile.readline()
147         mediafile.close()
148         
149         if line.startswith("disk"):
150                 return 1
151         
152         return -1
153
154 class HarddiskManager:
155         def __init__(self):
156                 hddNum = 0
157                 self.hdd = [ ]
158                 while 1:
159                         if existHDD(hddNum) == 1:
160                                 self.hdd.append(Harddisk(hddNum))
161                         hddNum += 1
162                         
163                         if hddNum > 8:
164                                 break
165
166         def HDDList(self):
167                 list = [ ]
168                 for hd in self.hdd:
169                         hdd = hd.model() + " (" 
170                         hdd += hd.bus()
171                         cap = hd.capacity()     
172                         if cap != "":
173                                 hdd += ", " + cap
174                         hdd += ")"
175                         list.append((hdd, hd))
176
177                 return list
178
179 harddiskmanager = HarddiskManager()
180
181