__init__.py revision 290
290N/A#!/usr/bin/python
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
383N/A# This module exports the following methods
383N/A
383N/A# Platform Methods
290N/A# ----------------
290N/A# get_isainfo() - Return the information for the OS's supported ISAs.
290N/A# This can be a list or a single string.
383N/A#
383N/A# get_release() - Return the information for the OS's release version. This
383N/A# must be a dot-separated set of integers (i.e. no alphabetic
383N/A# or punctuation).
383N/A#
383N/A# get_platform() - Return a string representing the current hardware model
383N/A# information, e.g. "i86pc".
383N/A#
383N/A# Account access
383N/A# --------------
383N/A# get_group_by_name(name, dirpath, use_file) - Return the group ID for a group name.
383N/A# If use_file is true, an OS-specific file from within the file tree
383N/A# rooted by dirpath will be consulted, if it exists. Otherwise, the
383N/A# group ID is retrieved from the operating system.
383N/A# Exceptions:
383N/A# KeyError if the specified group does not exist
290N/A#
290N/A# get_user_by_name(name, dirpath, use_file) - Return the user ID for a user name.
383N/A# If use_file is true, an OS-specific file from within the file tree
383N/A# rooted by dirpath will be consulted, if it exists. Otherwise, the
383N/A# user ID is retrieved from the operating system.
383N/A# Exceptions:
383N/A# KeyError if the specified group does not exist
383N/A#
383N/A# get_name_by_gid(gid, dirpath, use_file) - Return the group name for a group ID.
383N/A# If use_file is true, an OS-specific file from within the file tree
383N/A# rooted by dirpath will be consulted, if it exists. Otherwise, the
383N/A# group name is retrieved from the operating system.
383N/A# Exceptions:
383N/A# KeyError if the specified group does not exist
383N/A#
383N/A# get_name_by_uid(uid, dirpath, use_file) - Return the user name for a user ID.
383N/A# If use_file is true, an OS-specific file from within the file tree
383N/A# rooted by dirpath will be consulted, if it exists. Otherwise, the
383N/A# user name is retrieved from the operating system.
383N/A# Exceptions:
383N/A# KeyError if the specified group does not exist
383N/A#
383N/A# is_admin() - Return true if the invoking user has administrative
383N/A# privileges on the current runtime OS (e.g. are they the
383N/A# root user?).
383N/A#
383N/A# get_username() - Return a string representing the invoking user's username.
383N/A#
383N/A# Miscellaneous filesystem operations
383N/A# -----------------------------------
383N/A# chown(path, owner, group) - Change ownership of a file in an OS-specific way.
383N/A# The owner and group ownership information should be applied to
383N/A# the given file, if applicable on the current runtime OS.
383N/A# Exceptions:
383N/A# EnvironmentError (or subclass) if the path does not exist
383N/A# or ownership cannot be changed
383N/A#
383N/A# rename(src, dst) - Change the name of the given file, using the most
383N/A# appropriate method for the OS.
383N/A# Exceptions:
383N/A# OSError (or subclass) if the source path does not exist
383N/A# EnvironmentError if the rename fails.
383N/A#
383N/A# link(src, dst) - Link the src to the dst if supported, otherwise copy
383N/A# Exceptions:
383N/A# OSError (or subclass) if the source path does not exist or the link
383N/A# or copy files
383N/A#
383N/A# copyfile(src, dst) - 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.
383N/A# This is similar to python's shutil.copyfile() except that
383N/A# the intention is to deal with platform specifics, such as
383N/A# copying metadata associated with the file (e.g. Resource
383N/A# forks on Mac OS X).
383N/A# Exceptions: IOError if the destination location is not writable
383N/A#
383N/A# split_path(path) - Splits a path and gives back the components of the path.
383N/A# This is intended to hide platform-specific details about splitting
383N/A# a path into its components. This interface is similar to
383N/A# os.path.split() except that the entire path is split, not just
383N/A# the head/tail.
383N/A#
383N/A# For platforms where there are additional components (like
383N/A# a windows drive letter), these should be discarded before
383N/A# performing the split.
383N/A#
383N/A# get_root(path) - Returns the 'root' of the given path.
383N/A# This should include any and all components of a path up to the first
383N/A# non-platform-specific component. For example, on Windows,
383N/A# it should include the drive letter prefix.
383N/A#
383N/A# This is intended to be used when constructing or deconstructing
383N/A# paths, where the root of the filesystem is significant (and
383N/A# often leads to ambiguity in cross-platform code).
383N/A
383N/Aimport platform
383N/Aimport util as os_util
383N/A
383N/Aosname = os_util.get_canonical_os_name()
383N/Aostype = os_util.get_canonical_os_type()
383N/Adistro = platform.dist()[0].lower()
383N/A
383N/Afragments = [distro, osname, ostype]
383N/Afor fragment in fragments:
383N/A modname = 'os_' + fragment
383N/A
383N/A # try the most-specific module name first (e.g. os_suse),
383N/A # then try the more generic OS Name module (e.g. os_linux),
383N/A # then the OS type module (e.g. os_unix)
383N/A try:
383N/A exec('from %s import *' % modname)
383N/A break
383N/A except ImportError:
383N/A pass
383N/Aelse:
383N/A raise ImportError(
383N/A "cannot find portable implementation class for os " + str(fragments))
383N/A