__init__.py revision 481
290N/A#!/usr/bin/python2.4
290N/A#
290N/A# CDDL HEADER START
290N/A#
290N/A# The contents of this file are subject to the terms of the
290N/A# Common Development and Distribution License (the "License").
290N/A# You may not use this file except in compliance with the License.
290N/A#
290N/A# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
290N/A# or http://www.opensolaris.org/os/licensing.
290N/A# See the License for the specific language governing permissions
290N/A# and limitations under the License.
290N/A#
290N/A# When distributing Covered Code, include this CDDL HEADER in each
290N/A# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
290N/A# If applicable, add the following below this CDDL HEADER, with the
290N/A# fields enclosed by brackets "[]" replaced with your own identifying
290N/A# information: Portions Copyright [yyyy] [name of copyright owner]
290N/A#
290N/A# CDDL HEADER END
290N/A#
290N/A# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
290N/A# Use is subject to license terms.
290N/A#
290N/A
290N/A# The portable module provide access to methods that require operating system-
290N/A# specific implementations. The module initialization logic selects the right
290N/A# implementation the module is loaded. The module methods then
290N/A# delegate to the implementation class object.
290N/A#
290N/A# The documentation for the methods is provided in this module. To support
290N/A# another operating system, each of these methods must be implemented by the
290N/A# class for that operating system even if it is effectively a no-op.
290N/A#
290N/A# The module and class must be named using os_[impl], where
290N/A# [impl] corresponds to the OS distro, name, or type of OS
290N/A# the class implements. For example, to add specific support
290N/A# for mandrake linux (above and beyond existing support for
290N/A# generic unix), one would create os_mandrake.py.
290N/A#
290N/A# The following high-level groups of methods are defined in this module:
290N/A#
290N/A# - Platform Attribute Methods: These methods give access to
290N/A# attributes of the underlying platform not available through
290N/A# existing python libraries. For example, the list of implemented
290N/A# ISAs of a given platform.
290N/A#
290N/A# - Account access: Retrieval of account information (users and
290N/A# groups), in some cases for dormant, relocated OS images.
290N/A#
290N/A# - Miscellaneous filesystem operations: common operations that
290N/A# differ in implementation or are only available on a subset
290N/A# of OS or filesystem implementations, such as chown() or rename().
290N/A
290N/A# This module exports the methods defined below. They are defined here as
290N/A# not implemented to avoid pylint errors. The included OS-specific module
290N/A# redefines the methods with an OS-specific implementation.
290N/A
290N/A# Platform Methods
290N/A# ----------------
290N/Adef get_isainfo():
290N/A """ Return the information for the OS's supported ISAs.
290N/A This can be a list or a single string."""
290N/A raise NotImplementedError
290N/A
290N/Adef get_release():
290N/A """ Return the information for the OS's release version. This
290N/A must be a dot-separated set of integers (i.e. no alphabetic
290N/A or punctuation)."""
290N/A raise NotImplementedError
290N/A
290N/Adef get_platform():
290N/A """ Return a string representing the current hardware model
290N/A information, e.g. "i86pc"."""
290N/A raise NotImplementedError
290N/A
290N/A# Account access
290N/A# --------------
290N/Adef get_group_by_name(name, dirpath, use_file):
290N/A """ Return the group ID for a group name.
290N/A If use_file is true, an OS-specific file from within the file tree
290N/A rooted by dirpath will be consulted, if it exists. Otherwise, the
290N/A group ID is retrieved from the operating system.
290N/A Exceptions:
290N/A KeyError if the specified group does not exist"""
290N/A raise NotImplementedError
290N/A
290N/Adef get_user_by_name(name, dirpath, use_file):
290N/A """ Return the user ID for a user name.
290N/A If use_file is true, an OS-specific file from within the file tree
290N/A rooted by dirpath will be consulted, if it exists. Otherwise, the
290N/A user ID is retrieved from the operating system.
290N/A Exceptions:
290N/A KeyError if the specified group does not exist"""
290N/A raise NotImplementedError
290N/A
290N/Adef get_name_by_gid(gid, dirpath, use_file):
290N/A """ Return the group name for a group ID.
290N/A If use_file is true, an OS-specific file from within the file tree
290N/A rooted by dirpath will be consulted, if it exists. Otherwise, the
290N/A group name is retrieved from the operating system.
290N/A Exceptions:
290N/A KeyError if the specified group does not exist"""
290N/A raise NotImplementedError
290N/A
290N/Adef get_name_by_uid(uid, dirpath, use_file):
290N/A """ Return the user name for a user ID.
290N/A If use_file is true, an OS-specific file from within the file tree
290N/A rooted by dirpath will be consulted, if it exists. Otherwise, the
290N/A user name is retrieved from the operating system.
290N/A Exceptions:
290N/A KeyError if the specified group does not exist"""
290N/A raise NotImplementedError
290N/A
290N/Adef is_admin():
290N/A """ Return true if the invoking user has administrative
290N/A privileges on the current runtime OS (e.g. are they the
290N/A root user?)."""
290N/A raise NotImplementedError
290N/A
290N/Adef get_username():
290N/A """ Return a string representing the invoking user's username."""
290N/A raise NotImplementedError
290N/A
290N/A
290N/A# Miscellaneous filesystem operations
290N/A# -----------------------------------
290N/Adef chown(path, owner, group):
290N/A """ Change ownership of a file in an OS-specific way.
290N/A The owner and group ownership information should be applied to
290N/A the given file, if applicable on the current runtime OS.
290N/A Exceptions:
290N/A EnvironmentError (or subclass) if the path does not exist
290N/A or ownership cannot be changed"""
290N/A raise NotImplementedError
290N/A
290N/Adef rename(src, dst):
290N/A """ Change the name of the given file, using the most
290N/A appropriate method for the OS.
290N/A Exceptions:
290N/A OSError (or subclass) if the source path does not exist
290N/A EnvironmentError if the rename fails."""
290N/A raise NotImplementedError
290N/A
290N/Adef link(src, dst):
290N/A """ Link the src to the dst if supported, otherwise copy
290N/A Exceptions:
290N/A OSError (or subclass) if the source path does not exist or the link
290N/A or copy files"""
290N/A raise NotImplementedError
290N/A
290N/Adef remove(path):
290N/A """ Remove the given file in an OS-specific way
290N/A Exceptions:
290N/A OSError (or subclass) if the source path does not exist or
290N/A the file cannot be removed"""
290N/A raise NotImplementedError
290N/A
290N/Adef copyfile(src, dst):
290N/A """ Copy the contents of the file named src to a file named dst.
290N/A If dst already exists, it will be replaced. src and dst are
290N/A path names given as strings.
290N/A This is similar to python's shutil.copyfile() except that
290N/A the intention is to deal with platform specifics, such as
290N/A copying metadata associated with the file (e.g. Resource
290N/A forks on Mac OS X).
290N/A Exceptions: IOError if the destination location is not writable"""
290N/A raise NotImplementedError
290N/A
290N/Adef split_path(path):
290N/A """ Splits a path and gives back the components of the path.
290N/A This is intended to hide platform-specific details about splitting
290N/A a path into its components. This interface is similar to
290N/A os.path.split() except that the entire path is split, not just
the head/tail.
For platforms where there are additional components (like
a windows drive letter), these should be discarded before
performing the split."""
raise NotImplementedError
def get_root(path):
""" Returns the 'root' of the given path.
This should include any and all components of a path up to the first
non-platform-specific component. For example, on Windows,
it should include the drive letter prefix.
This is intended to be used when constructing or deconstructing
paths, where the root of the filesystem is significant (and
often leads to ambiguity in cross-platform code)."""
raise NotImplementedError
import platform
import util as os_util
osname = os_util.get_canonical_os_name()
ostype = os_util.get_canonical_os_type()
distro = platform.dist()[0].lower()
fragments = [distro, osname, ostype]
for fragment in fragments:
modname = 'os_' + fragment
# try the most-specific module name first (e.g. os_suse),
# then try the more generic OS Name module (e.g. os_linux),
# then the OS type module (e.g. os_unix)
try:
exec('from %s import *' % modname)
break
except ImportError:
pass
else:
raise ImportError(
"cannot find portable implementation class for os " + str(fragments))