#
# isys.py - installer utility functions and glue for C module
#
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Author(s): Matt Wilson
# Erik Troan
# Jeremy Katz
#
try:
from pyanaconda import _isys
except ImportError:
# We're running in some sort of testing mode, in which case we can fix
# up PYTHONPATH and just do this basic import.
import _isys
import string
import os
import os.path
import socket
import stat
import posix
import sys
from pyanaconda import iutil
import blivet.arch
import re
import struct
import dbus
import logging
log = logging.getLogger("anaconda")
NM_SERVICE = "org.freedesktop.NetworkManager"
NM_MANAGER_PATH = "/org/freedesktop/NetworkManager"
NM_SETTINGS_PATH = "/org/freedesktop/NetworkManager/Settings"
NM_MANAGER_IFACE = "org.freedesktop.NetworkManager"
NM_ACTIVE_CONNECTION_IFACE = "org.freedesktop.NetworkManager.Connection.Active"
NM_CONNECTION_IFACE = "org.freedesktop.NetworkManager.Settings.Connection"
NM_DEVICE_IFACE = "org.freedesktop.NetworkManager.Device"
NM_DEVICE_WIRED_IFACE = "org.freedesktop.NetworkManager.Device.Wired"
NM_IP4CONFIG_IFACE = "org.freedesktop.NetworkManager.IP4Config"
NM_IP6CONFIG_IFACE = "org.freedesktop.NetworkManager.IP6Config"
NM_ACCESS_POINT_IFACE = "org.freedesktop.NetworkManager.AccessPoint"
NM_STATE_UNKNOWN = 0
NM_STATE_ASLEEP = 10
NM_STATE_DISCONNECTED = 20
NM_STATE_DISCONNECTING = 30
NM_STATE_CONNECTING = 40
NM_STATE_CONNECTED_LOCAL = 50
NM_STATE_CONNECTED_SITE = 60
NM_STATE_CONNECTED_GLOBAL = 70
NM_DEVICE_STATE_ACTIVATED = 100
NM_DEVICE_TYPE_WIFI = 2
NM_DEVICE_TYPE_ETHERNET = 1
DBUS_PROPS_IFACE = "org.freedesktop.DBus.Properties"
if blivet.arch.getArch() in ("sparc", "ppc64"):
MIN_RAM = 768 * 1024
GUI_INSTALL_EXTRA_RAM = 512 * 1024
else:
MIN_RAM = 512 * 1024
GUI_INSTALL_EXTRA_RAM = 0
MIN_GUI_RAM = MIN_RAM + GUI_INSTALL_EXTRA_RAM
EARLY_SWAP_RAM = 896 * 1024
## Get the amount of free space available under a directory path.
# @param path The directory path to check.
# @return The amount of free space available, in
def pathSpaceAvailable(path):
return _isys.devSpaceFree(path)
def resetResolv():
return _isys.resetresolv()
def modulesWithPaths():
mods = []
for modline in open("/proc/modules", "r"):
modName = modline.split(" ", 1)[0]
modInfo = iutil.execWithCapture("modinfo",
["-F", "filename", modName]).splitlines()
modPaths = [ line.strip() for line in modInfo if line!="" ]
mods.extend(modPaths)
return mods
def isPseudoTTY (fd):
return _isys.isPseudoTTY (fd)
## Flush filesystem buffers.
def sync ():
return _isys.sync ()
## Determine if a file is an ISO image or not.
# @param file The full path to a file to check.
# @return True if ISO image, False otherwise.
def isIsoImage(file):
return _isys.isisoimage(file)
# Return number of network devices
def getNetworkDeviceCount():
bus = dbus.SystemBus()
nm = bus.get_object(NM_SERVICE, NM_MANAGER_PATH)
devlist = nm.get_dbus_method("GetDevices")()
return len(devlist)
# Get a D-Bus interface for the specified device's (e.g., eth0) properties.
# If dev=None, return a hash of the form 'hash[dev] = props_iface' that
# contains all device properties for all interfaces that NetworkManager knows
# about.
def getDeviceProperties(dev=None):
bus = dbus.SystemBus()
nm = bus.get_object(NM_SERVICE, NM_MANAGER_PATH)
devlist = nm.get_dbus_method("GetDevices")()
all = {}
for path in devlist:
device = bus.get_object(NM_SERVICE, path)
device_props_iface = dbus.Interface(device, DBUS_PROPS_IFACE)
device_interface = str(device_props_iface.Get(NM_DEVICE_IFACE, "Interface"))
if dev is None:
all[device_interface] = device_props_iface
elif device_interface == dev:
return device_props_iface
if dev is None:
return all
else:
return None
def getMacAddress(dev):
"""Return MAC address of device. "" if not found"""
if dev == '' or dev is None:
return ""
device_props_iface = getDeviceProperties(dev=dev)
if device_props_iface is None:
return ""
device_macaddr = ""
try:
device_macaddr = device_props_iface.Get(NM_DEVICE_WIRED_IFACE, "HwAddress").upper()
except dbus.exceptions.DBusException as e:
log.debug("getMacAddress %s: %s" % (dev, e))
return device_macaddr
# Determine if a network device is a wireless device.
def isWirelessDevice(dev_name):
bus = dbus.SystemBus()
nm = bus.get_object(NM_SERVICE, NM_MANAGER_PATH)
devlist = nm.get_dbus_method("GetDevices")()
for path in devlist:
device = bus.get_object(NM_SERVICE, path)
device_props_iface = dbus.Interface(device, DBUS_PROPS_IFACE)
iface = device_props_iface.Get(NM_DEVICE_IFACE, "Interface")
if iface == dev_name:
device_type = device_props_iface.Get(NM_DEVICE_IFACE, "DeviceType")
return device_type == NM_DEVICE_TYPE_WIFI
return False
# Get IP addresses for a network device.
# Returns list of ipv4 or ipv6 addresses, depending
# on version parameter. ipv4 is default.
def getIPAddresses(dev, version=4):
if dev == '' or dev is None:
return None
device_props_iface = getDeviceProperties(dev=dev)
if device_props_iface is None:
return None
bus = dbus.SystemBus()
addresses = []
if version == 4:
ip4_config_path = device_props_iface.Get(NM_DEVICE_IFACE, 'Ip4Config')
if ip4_config_path != '/':
ip4_config_obj = bus.get_object(NM_SERVICE, ip4_config_path)
ip4_config_props = dbus.Interface(ip4_config_obj, DBUS_PROPS_IFACE)
# addresses (3-element list: ipaddr, netmask, gateway)
addrs = ip4_config_props.Get(NM_IP4CONFIG_IFACE, "Addresses")
for addr in addrs:
try:
tmp = struct.pack('I', addr[0])
ipaddr = socket.inet_ntop(socket.AF_INET, tmp)
addresses.append(ipaddr)
except ValueError as e:
log.debug("Exception caught trying to convert IP address %s: %s" %
(addr, e))
elif version == 6:
ip6_config_path = device_props_iface.Get(NM_DEVICE_IFACE, 'Ip6Config')
if ip6_config_path != '/':
ip6_config_obj = bus.get_object(NM_SERVICE, ip6_config_path)
ip6_config_props = dbus.Interface(ip6_config_obj, DBUS_PROPS_IFACE)
addrs = ip6_config_props.Get(NM_IP6CONFIG_IFACE, "Addresses")
for addr in addrs:
try:
addrstr = "".join(str(byte) for byte in addr[0])
ipaddr = socket.inet_ntop(socket.AF_INET6, addrstr)
# XXX - should we prefer Global or Site-Local types?
# does NM prefer them?
addresses.append(ipaddr)
except ValueError as e:
log.debug("Exception caught trying to convert IP address %s: %s" %
(addr, e))
else:
raise ValueError, "invalid IP version %d" % version
return addresses
def prefix2netmask(prefix):
return _isys.prefix2netmask(prefix)
def netmask2prefix (netmask):
prefix = 0
while prefix < 33:
if (prefix2netmask(prefix) == netmask):
return prefix
prefix += 1
return prefix
isPAE = None
def isPaeAvailable():
global isPAE
if isPAE is not None:
return isPAE
isPAE = False
if not blivet.arch.isX86():
return isPAE
f = open("/proc/cpuinfo", "r")
lines = f.readlines()
f.close()
for line in lines:
if line.startswith("flags") and line.find("pae") != -1:
isPAE = True
break
return isPAE
def getLinkStatus(dev):
return _isys.getLinkStatus(dev)
def getAnacondaVersion():
return _isys.getAnacondaVersion()
auditDaemon = _isys.auditdaemon
handleSegv = _isys.handleSegv
printObject = _isys.printObject
bind_textdomain_codeset = _isys.bind_textdomain_codeset
isVioConsole = _isys.isVioConsole
initLog = _isys.initLog
total_memory = _isys.total_memory