/[smeserver]/cdrom.image/sme9/updates/storage/dasd.py
ViewVC logotype

Annotation of /cdrom.image/sme9/updates/storage/dasd.py

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (hide annotations) (download) (as text)
Sun Dec 22 04:27:50 2013 UTC (10 years, 7 months ago) by wellsi
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-python
FILE REMOVED
anaconda updates now handled via patches

1 charliebrady 1.1 #
2     # dasd.py - DASD class
3     #
4     # Copyright (C) 2009, 2010 Red Hat, Inc. All rights reserved.
5     #
6     # This program is free software; you can redistribute it and/or modify
7     # it under the terms of the GNU General Public License as published by
8     # the Free Software Foundation; either version 2 of the License, or
9     # (at your option) any later version.
10     #
11     # This program is distributed in the hope that it will be useful,
12     # but WITHOUT ANY WARRANTY; without even the implied warranty of
13     # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     # GNU General Public License for more details.
15     #
16     # You should have received a copy of the GNU General Public License
17     # along with this program. If not, see <http://www.gnu.org/licenses/>.
18     #
19     # Red Hat Author(s): David Cantrell <dcantrell@redhat.com>
20     #
21    
22     import iutil
23     import sys
24     import os
25     from storage.errors import DasdFormatError
26     from storage.devices import deviceNameToDiskByPath
27     from constants import *
28     from flags import flags
29     from baseudev import udev_trigger
30    
31     import logging
32     log = logging.getLogger("anaconda")
33    
34     import gettext
35     _ = lambda x: gettext.ldgettext("anaconda", x)
36     P_ = lambda x, y, z: gettext.ldngettext("anaconda", x, y, z)
37    
38     class DASD:
39     """ Controlling class for DASD interaction before the storage code in
40     anaconda has initialized.
41    
42     The DASD class can determine if any DASD devices on the system are
43     unformatted and can perform a dasdfmt on them.
44     """
45    
46     def __init__(self):
47     self._dasdlist = []
48     self._devices = [] # list of DASDDevice objects
49     self.totalCylinders = 0
50     self._completedCylinders = 0.0
51     self._maxFormatJobs = 0
52     self.dasdfmt = "/sbin/dasdfmt"
53     self.commonArgv = ["-y", "-d", "cdl", "-b", "4096"]
54     self.started = False
55    
56     def __call__(self):
57     return self
58    
59     def startup(self, intf, exclusiveDisks, zeroMbr):
60     """ Look for any unformatted DASDs in the system and offer the user
61     the option for format them with dasdfmt or exit the installer.
62     """
63     if self.started:
64     return
65    
66     self.started = True
67     out = "/dev/tty5"
68     err = "/dev/tty5"
69    
70     if not iutil.isS390():
71     return
72    
73     # Trigger udev data about the dasd devices on the system
74     udev_trigger(action="change", name="dasd*")
75    
76     log.info("Checking for unformatted DASD devices:")
77    
78     for device in os.listdir("/sys/block"):
79     if not device.startswith("dasd"):
80     continue
81    
82     statusfile = "/sys/block/%s/device/status" % (device,)
83     if not os.path.isfile(statusfile):
84     continue
85    
86     f = open(statusfile, "r")
87     status = f.read().strip()
88     f.close()
89    
90     if status in ["unformatted"] and device not in exclusiveDisks:
91     bypath = deviceNameToDiskByPath(device)
92     if not bypath:
93     bypath = "/dev/" + device
94    
95     log.info(" %s (%s) status is %s, needs dasdfmt" % (device,
96     bypath,
97     status,))
98     self._dasdlist.append((device, bypath))
99    
100     if not len(self._dasdlist):
101     log.info(" no unformatted DASD devices found")
102     return
103    
104     askUser = True
105    
106     if zeroMbr:
107     askUser = False
108     elif not intf and not zeroMbr:
109     log.info(" non-interactive kickstart install without zerombr "
110     "command, unable to run dasdfmt, exiting installer")
111     sys.exit(0)
112    
113     c = len(self._dasdlist)
114    
115     if intf and askUser:
116     devs = ''
117     for dasd, bypath in self._dasdlist:
118     devs += "%s\n" % (bypath,)
119    
120     rc = intf.questionInitializeDASD(c, devs)
121     if rc == 1:
122     log.info(" not running dasdfmt, continuing installation")
123     return
124    
125     # gather total cylinder count
126     argv = ["-t", "-v"] + self.commonArgv
127     for dasd, bypath in self._dasdlist:
128     buf = iutil.execWithCapture(self.dasdfmt, argv + ["/dev/" + dasd],
129     stderr=err)
130     for line in buf.splitlines():
131     if line.startswith("Drive Geometry: "):
132     # line will look like this:
133     # Drive Geometry: 3339 Cylinders * 15 Heads = 50085 Tracks
134     cyls = long(filter(lambda s: s, line.split(' '))[2])
135     self.totalCylinders += cyls
136     break
137    
138     # format DASDs
139     argv = ["-P"] + self.commonArgv
140     update = self._updateProgressWindow
141    
142     title = P_("Formatting DASD Device", "Formatting DASD Devices", c)
143     msg = P_("Preparing %d DASD device for use with Linux..." % c,
144     "Preparing %d DASD devices for use with Linux..." % c, c)
145    
146     if intf:
147     if self.totalCylinders:
148     pw = intf.progressWindow(title, msg, 1.0)
149     else:
150     pw = intf.progressWindow(title, msg, 100, pulse=True)
151    
152     for dasd, bypath in self._dasdlist:
153     log.info("Running dasdfmt on %s" % (bypath,))
154     arglist = argv + ["/dev/" + dasd]
155    
156     try:
157     if intf and self.totalCylinders:
158     rc = iutil.execWithCallback(self.dasdfmt, arglist,
159     stdout=out, stderr=err,
160     callback=update,
161     callback_data=pw,
162     echo=False)
163     elif intf:
164     rc = iutil.execWithPulseProgress(self.dasdfmt, arglist,
165     stdout=out, stderr=err,
166     progress=pw)
167     else:
168     rc = iutil.execWithRedirect(self.dasdfmt, arglist,
169     stdout=out, stderr=err)
170     except Exception as e:
171     raise DasdFormatError(e, bypath)
172    
173     if rc:
174     raise DasdFormatError("dasdfmt failed: %s" % rc, bypath)
175    
176     if intf:
177     pw.pop()
178    
179     def addDASD(self, dasd):
180     """ Adds a DASDDevice to the internal list of DASDs. """
181     if dasd:
182     self._devices.append(dasd)
183    
184     def clear_device_list(self):
185     """ Clear the device list to force re-populate on next access. """
186     self._devices = []
187    
188     def write(self, instPath):
189     """ Write /etc/dasd.conf to target system for all DASD devices
190     configured during installation.
191     """
192     if self._devices == []:
193     return
194    
195     f = open(os.path.realpath(instPath + "/etc/dasd.conf"), "w")
196     for dasd in self._devices:
197     fields = [dasd.busid] + dasd.getOpts()
198     f.write("%s\n" % (" ".join(fields),))
199     f.close()
200    
201     def _updateProgressWindow(self, data, callback_data=None):
202     """ Reads progress output from dasdfmt and collects the number of
203     cylinders completed so the progress window can update.
204     """
205     if not callback_data:
206     return
207    
208     if data == '\n':
209     # each newline we see in this output means one more cylinder done
210     self._completedCylinders += 1.0
211     callback_data.set(self._completedCylinders / self.totalCylinders)
212    
213     # Create DASD singleton
214     DASD = DASD()
215    
216     # vim:tw=78:ts=4:et:sw=4

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed