catch errors when unmounting
[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                 ret = ""
29
30                 if self.index & 2:
31                         ret = "External (CF) - "
32                 else:
33                         ret = "Internal - "
34                 
35                 if self.index & 1:
36                         return ret + "Slave"
37                 else:
38                         return ret + "Master"
39
40         def capacity(self):
41                 procfile = tryOpen(self.prochdx + "capacity")
42                 
43                 if procfile == "":
44                         return ""
45
46                 line = procfile.readline()
47                 procfile.close()
48                 
49                 try:
50                         cap = int(line)
51                 except:
52                         return ""
53                 
54                 cap = cap / 1000 * 512 / 1000
55                 
56                 return "%d.%03d GB" % (cap/1024, cap%1024)
57                                                                 
58         def model(self):
59                 procfile = tryOpen(self.prochdx + "model")
60                 
61                 if procfile == "":
62                         return ""
63
64                 line = procfile.readline()
65                 procfile.close()
66
67                 return line.strip()
68
69         def free(self):
70                 procfile = tryOpen("/proc/mounts")
71                 
72                 if procfile == "":
73                         return -1
74
75                 free = -1
76                 while 1:
77                         line = procfile.readline()
78                         if line == "":
79                                 break
80                         if line.startswith(self.devidex):
81                                 parts = line.strip().split(" ")
82                                 try:
83                                         stat = os.statvfs(parts[1])
84                                 except OSError:
85                                         continue
86                                 free = stat.f_bfree/1000 * stat.f_bsize/1000
87                                 break
88                 procfile.close()
89                 return free             
90
91         def numPartitions(self):
92                 try:
93                         idedir = os.listdir(self.devidex)
94                 except OSError:
95                         return -1
96                 numPart = -1
97                 for filename in idedir:
98                         if filename.startswith("disc"):
99                                 numPart += 1
100                         if filename.startswith("part"):
101                                 numPart += 1
102                 return numPart
103
104         def unmount(self):
105                 cmd = "/bin/umount " + self.devidex + "part*"
106                 res = os.system(cmd)
107                 return (res >> 8)
108
109         def createPartition(self):
110                 cmd = "/sbin/sfdisk -f " + self.devidex + "disc"
111                 sfdisk = os.popen(cmd, "w")
112                 sfdisk.write("0,\n;\n;\n;\ny\n")
113                 sfdisk.close()
114                 return 0
115
116         def mkfs(self):
117                 cmd = "/sbin/mkfs.ext3 -T largefile -m0 " + self.devidex + "part1"
118                 res = os.system(cmd)
119                 return (res >> 8)
120
121         def mount(self):
122                 cmd = "/bin/mount -t ext3 " + self.devidex + "part1 /hdd"
123                 res = os.system(cmd)
124                 return (res >> 8)
125
126         def createMovieFolder(self):
127                 res = os.system("mkdir /hdd/movies")
128                 return (res >> 8)
129                 
130         def initialize(self):
131                 if self.unmount() != 0:
132                         return -5
133
134                 if self.createPartition() != 0:
135                         return -1
136
137                 if self.mkfs() != 0:
138                         return -2
139
140                 if self.mount() != 0:
141                         return -3
142
143                 if self.createMovieFolder() != 0:
144                         return -4
145                 
146                 return 0
147                 
148 def existHDD(num):
149         mediafile = tryOpen(num2prochdx(num) + "media")
150
151         if mediafile == "":
152                 return -1
153
154         line = mediafile.readline()
155         mediafile.close()
156         
157         if line.startswith("disk"):
158                 return 1
159         
160         return -1
161
162 class HarddiskManager:
163         def __init__(self):
164                 hddNum = 0
165                 self.hdd = [ ]
166                 while 1:
167                         if existHDD(hddNum) == 1:
168                                 self.hdd.append(Harddisk(hddNum))
169                         hddNum += 1
170                         
171                         if hddNum > 8:
172                                 break
173
174         def HDDCount(self):
175                 cnt = 0
176                 for hd in self.hdd:
177                         cnt = cnt + 1
178                 return cnt      
179
180         def HDDList(self):
181                 list = [ ]
182                 for hd in self.hdd:
183                         hdd = hd.model() + " (" 
184                         hdd += hd.bus()
185                         cap = hd.capacity()     
186                         if cap != "":
187                                 hdd += ", " + cap
188                         hdd += ")"
189                         list.append((hdd, hd))
190
191                 return list
192
193 harddiskmanager = HarddiskManager()
194
195