OS detection
============

.. module:: rospkg.os_detect
    :synopsis: OS detection for ROS tools.

OS detection is a critical capability of many ROS tools in the ROS
build toolchain.  The :mod:`rospkg.os_detect` module provides and
extendable library for detecting various operating systems.  It is
focused on detecting operating systems used with ROS.

You can test this library on your platform from the command line::

    $ python -m rospkg.os_detect
    OS Name:     ubuntu
    OS Version:	 10.04
    OS Codename: lucid

Currently supported OSes:

- Arch Linux
- Cygwin
- Debian
- Fedora
- FreeBSD
- Gentoo
- Mint
- OS X
- Pop! OS
- Red Hat Linux
- Slackware 
- Ubuntu


.. autoclass:: OsNotDetected

.. class:: OsDetect(os_list)

   Detects the current operating system.  This class will iterate
   over registered classes to lookup the active OS and version.  The
   list of detectors can be overridden in the constructor; otherwise
   it will default to :class:`OsDetector` classes provided by this
   library.


    .. attribute:: default_os_list

        List of currently registered detectors.  Must not be modified directly.
    
    .. staticmethod:: register_default(os_name, os_detector)

        Register detector to be used with all future instances of
        :class:`OsDetect`.  The new detector will have precedence over
        any previously registered detectors associated with *os_name*.
        
    .. method:: detect_os() -> tuple

        :returns: (os_name, os_version, os_codename), ``(str, str, str)``
        :raises: :exc:`OsNotDetected` if OS could not be detected

    .. method:: get_detector([name]) -> OsDetector

        Get detector used for specified OS name, or the detector for this OS if name is ``None``.

        :raises: :exc:`KeyError`
        
    .. method:: add_detector(name, detector)

        Add detector to list of detectors used by this instance.
        *detector* will override any previous detectors associated
        with *name*.

        :param name: OS name that detector matches
        :param detector: :class:`OsDetector` instance

    .. method:: get_os() -> OsDetector

        Get :class:`OsDetector` for this operating system.
        
        :raises: :exc:`OsNotDetected` if OS could not be detected

    .. method:: get_name() -> str

        :returns: Name of current operating system.  See ``OS_*``
          definitions in this module for possible values.
        :raises: :exc:`OsNotDetected` if OS could not be detected

    .. method:: get_version() -> str

        :returns: Version of current operating system
        :raises: :exc:`OsNotDetected` if OS could not be detected

    .. method:: get_codename() -> str

        :returns: Codename of current operating system if available,
          or empty string if OS does not provide codename.
        :raises: :exc:`OsNotDetected` if OS could not be detected



.. autoclass:: OsDetector
   :members:



OS name definitions
-------------------

.. data:: OS_ARCH

   Name used for Arch Linux OS.

.. data:: OS_CYGWIN

   Name used for Cygwin OS.

.. data:: OS_DEBIAN

   Name used for Debian OS.

.. data:: OS_FREEBSD

   Name used for FreeBSD OS.

.. data:: OS_GENTOO

   Name used for Gentoo.

.. data:: OS_MINT

   Name used for Mint OS.

.. data:: OS_OPENSUSE

   Name used for OpenSUSE OS.

.. data:: OS_OSX

   Name used for OS X.

.. data:: OS_POP

   Name used for Pop! OS.

.. data:: OS_RHEL

   Name used for Red Hat Enterprise Linux.

.. data:: OS_SLACKWARE

   Name used for Slackware.

.. data:: OS_UBUNTU

   Name used for Ubuntu OS.


Linux helper methods
--------------------

.. method:: lsb_get_os() -> str

    Linux: wrapper around lsb_release to get the current OS
    
.. method:: lsb_get_codename() -> str

    Linux: wrapper around lsb_release to get the current OS codename
    
.. method:: lsb_get_version() -> str

    Linux: wrapper around lsb_release to get the current OS version

.. method:: uname_get_machine() -> str

    Linux: wrapper around uname to determine if OS is 64-bit


