# RemoteIPRoute

## Caveats

Warning

The class implies a serious performance penalty. Please consider other options if you expect high loads of the netlink traffic.

Warning

The class requires the mitogen library that should be installed separately: https://mitogen.readthedocs.io/en/latest/

Warning

The object of this class implicitly spawn child processes. Beware.

Here are some reasons why this class is not used as a general class instead of specific IPRoute for local RTNL, and NetNS for local netns management:

- The performance of the Python parser for the binary netlink protocol is not so good, but using such proxies makes it even worse.

- Local IPRoute and NetNS access is the core functionality and must work with no additional libraries installed.

## Introduction

It is possible to run IPRoute instances remotely using the mitogen library. The remote node must have same python version installed, but no additional libraries are required there: all the code will be imported from the host where you start your script.

The simplest case, run IPRoute on a remote Linux host via ssh (assume the keys are deployed):

    from pyroute2 import RemoteIPRoute

    rip = RemoteIPRoute(protocol='ssh',
                        hostname='test01',
                        username='ci')
    rip.get_links()

    # ...

## Indirect access

Building mitogen proxy chains you can access nodes indirectly:

    import mitogen.master
    from pyroute2 import RemoteIPRoute

    broker = mitogen.master.Broker()
    router = mitogen.master.Router(broker)
    # login to the gateway
    gw = router.ssh(hostname='test-gateway',
                    username='ci')
    # login from the gateway to the target node
    host = router.ssh(via=gw,
                      hostname='test01',
                      username='ci')

    rip = RemoteIPRoute(router=router, context=host)

    rip.get_links()

    # ...

## Run with privileges

It requires the mitogen sudo proxy to run IPRoute with root permissions:

    import mitogen.master
    from pyroute2 import RemoteIPRoute

    broker = mitogen.master.Broker()
    router = mitogen.master.Router(broker)
    host = router.ssh(hostname='test01', username='ci')
    sudo = router.sudo(via=host, username='root')

    rip = RemoteIPRoute(router=router, context=sudo)

    rip.link('add', ifname='br0', kind='bridge')

    # ...

## Remote network namespaces

You also can access remote network namespaces with the same RemoteIPRoute object:

    import mitogen.master
    from pyroute2 import RemoteIPRoute

    broker = mitogen.master.Broker()
    router = mitogen.master.Router(broker)
    host = router.ssh(hostname='test01', username='ci')
    sudo = router.sudo(via=host, username='root')

    rip = RemoteIPRoute(router=router, context=sudo, netns='test-netns')

    rip.link('add', ifname='br0', kind='bridge')

    # ...