summaryrefslogtreecommitdiffstats
path: root/installmethod.py
blob: e8155e6b99c9d023260d44768ac81bf32d65283f (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#
# installmethod.py - Base class for install methods
#
# Copyright 1999-2007 Red Hat, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# library public license.
#
# You should have received a copy of the GNU Library Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

import os
import string
from constants import *

import logging
log = logging.getLogger("anaconda")

## Raised by subclasses of InstallMethod when an error occurs copying a file.
class FileCopyException(Exception):
    ## The constructor.
    # @param s An optional message to be added to the exception.
    def __init__(self, s = ""):
        self.args = s

## The base installation method class.
# This is an abstract class that defines the methods that make up an
# installation method.  This class should not be used except as the superclass
# for a specific method.  Most methods in this class should be redefined by
# subclasses, though things like mountCD, unmountCD, ejectCD, and the cleanup
# methods may not need to be redefined.  By default, most methods pass.
class InstallMethod:
    ## Return the list of protected partitions.
    # Protected partitions are the installation source for the hard drive
    # installation method.  Partitions on this list may be mounted, but may
    # not be formatted.
    #
    # @return The list of protected partitions, or an empty list otherwise.
    def protectedPartitions(self):
        return []

    ## Return a directory that can be used for writing temporary data to.
    # @returns A valid temporary directory, or /tmp by default.
    def getTempPath(self):
	root = self.rootPath
	pathlist = [ "/var/tmp", "/tmp", "/." ]
        tmppath = None
	for p in pathlist:
	    if (os.access(root + p, os.X_OK)):
		tmppath = root + p + "/"
		break

        if tmppath is None:
            log.warning("Unable to find temp path, going to use ramfs path")
            return "/tmp/"

        return tmppath

    ## Fetch a file from the installation source.
    # @param filename The filename to fetch.
    # @param callback A function to be called when the file is fetched.  This
    #                 function expects a message and size as parameters.
    # @param destdir The directory where the fetched file should be put.
    # @param retry How many times to attempt fetching the file.
    # @return The complete path to the fetched file on the local system.
    def getFilename(self, filename, callback=None, destdir=None, retry=1):
	pass

    ## Perform method-specific actions to unmount any installation media.
    def systemUnmounted(self):
	pass

    ## Perform method-specific actions to mount any installation media.
    # @param fsset An instance of FileSystemSet.
    # @param mntPoint The root of the filesystem to mount the media onto.
    def systemMounted(self, fsset, mntPoint):
	pass

    ## Method-specific cleanup function to be called at the end of installation.
    # @see doMethodComplete
    # @see postAction
    def filesDone(self):
	pass

    ## The constructor.
    # @param method The --method= parameter passed to anaconda from loader.
    # @param rootpath The --rootpath= parameter passed to anaconda from loader.
    # @param intf An instance of the InstallInterface class.
    def __init__(self, method, rootpath, intf):
        self.rootPath = rootpath
        self.intf = intf
        self.tree = None
        self.splitmethod = False

    ## Get the base URI for the method.
    # @return The base URI for this installation method.
    def getMethodUri(self):
        pass

    ## Unmount any CD media.
    def unmountCD(self):
        pass

    ## Eject any CD media from the drive.
    def ejectCD(self):
        pass

    ## Switch CDs.
    # @param mediano The CD media number to switch to.
    # @param filename The file to be read that requires switching media.
    def switchMedia(self, mediano, filename=""):
	pass

    ## Method to be run at the very end of installation.
    #
    # This method is run very late.  It's the last step to be run before
    # showing the completion screen.  Only use this if you really know what
    # you're doing.
    # @param anaconda An instance of the Anaconda class.
    # @see filesDone
    # @see doMethodComplete
    def postAction(self, anaconda):
        pass

## Do method-specific cleanups.
#
# This occurs very late and is mainly used for unmounting media and ejecting
# the CD.  If we're on a kickstart install, don't eject the CD since there's
# a kickstart command to do that.
# @param anaconda An instance of the Anaconda class.
# @see InstallMethod::postAction
# @see InstallMethod::filesDone
def doMethodComplete(anaconda):
    anaconda.method.filesDone()

    if not anaconda.isKickstart:
        anaconda.method.ejectCD()

    mtab = "/dev/root / ext3 ro 0 0\n"
    for ent in anaconda.id.fsset.entries:
        if ent.mountpoint == "/":
            mtab = "/dev/root / %s ro 0 0\n" %(ent.fsystem.name,)

    f = open(anaconda.rootPath + "/etc/mtab", "w+")
    f.write(mtab)
    f.close()