fix marking non playable services in channellist
[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         errorList = [ _("Everything is fine"), _("Creating partition failed"), _("Mkfs failed"), _("Mount failed"), _("Create movie folder failed"), _("Unmount failed")]
131
132         def initialize(self):
133                 self.unmount()
134
135                 if self.createPartition() != 0:
136                         return -1
137
138                 if self.mkfs() != 0:
139                         return -2
140
141                 if self.mount() != 0:
142                         return -3
143
144                 if self.createMovieFolder() != 0:
145                         return -4
146                 
147                 return 0
148                 
149 def existHDD(num):
150         mediafile = tryOpen(num2prochdx(num) + "media")
151
152         if mediafile == "":
153                 return -1
154
155         line = mediafile.readline()
156         mediafile.close()
157         
158         if line.startswith("disk"):
159                 return 1
160         
161         return -1
162
163 class HarddiskManager:
164         def __init__(self):
165                 hddNum = 0
166                 self.hdd = [ ]
167                 while 1:
168                         if existHDD(hddNum) == 1:
169                                 self.hdd.append(Harddisk(hddNum))
170                         hddNum += 1
171                         
172                         if hddNum > 8:
173                                 break
174
175         def HDDCount(self):
176                 cnt = 0
177                 for hd in self.hdd:
178                         cnt = cnt + 1
179                 return cnt      
180
181         def HDDList(self):
182                 list = [ ]
183                 for hd in self.hdd:
184                         hdd = hd.model() + " (" 
185                         hdd += hd.bus()
186                         cap = hd.capacity()     
187                         if cap != "":
188                                 hdd += ", " + cap
189                         hdd += ")"
190                         list.append((hdd, hd))
191
192                 return list
193
194 harddiskmanager = HarddiskManager()
195
196