1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
|
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>RemoteIPRoute — pyroute2 0.5.14 documentation</title>
<link rel="stylesheet" href="_static/classic.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="NDB module" href="ndb.html" />
<link rel="prev" title="IPRoute module" href="iproute.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="ndb.html" title="NDB module"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="iproute.html" title="IPRoute module"
accesskey="P">previous</a> |</li>
<li class="nav-item"><a href="http://pyroute2.org">Project home</a> »</li>
<li class="nav-item nav-item-0"><a href="index.html">pyroute2 0.5.14 documentation</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="remoteiproute">
<span id="remote"></span><h1>RemoteIPRoute<a class="headerlink" href="#remoteiproute" title="Permalink to this headline">¶</a></h1>
<div class="section" id="caveats">
<h2>Caveats<a class="headerlink" href="#caveats" title="Permalink to this headline">¶</a></h2>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>The class implies a serious performance penalty. Please consider
other options if you expect high loads of the netlink traffic.</p>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>The class requires the mitogen library that should be installed
separately: <a class="reference external" href="https://mitogen.readthedocs.io/en/latest/">https://mitogen.readthedocs.io/en/latest/</a></p>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>The object of this class implicitly spawn child processes. Beware.</p>
</div>
<p>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:</p>
<ul class="simple">
<li><p>The performance of the Python parser for the binary netlink protocol
is not so good, but using such proxies makes it even worse.</p></li>
<li><p>Local IPRoute and NetNS access is the core functionality and must
work with no additional libraries installed.</p></li>
</ul>
</div>
<div class="section" id="introduction">
<h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
<p>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.</p>
<p>The simplest case, run IPRoute on a remote Linux host via ssh
(assume the keys are deployed):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">pyroute2</span> <span class="k">import</span> <span class="n">RemoteIPRoute</span>
<span class="n">rip</span> <span class="o">=</span> <span class="n">RemoteIPRoute</span><span class="p">(</span><span class="n">protocol</span><span class="o">=</span><span class="s1">'ssh'</span><span class="p">,</span>
<span class="n">hostname</span><span class="o">=</span><span class="s1">'test01'</span><span class="p">,</span>
<span class="n">username</span><span class="o">=</span><span class="s1">'ci'</span><span class="p">)</span>
<span class="n">rip</span><span class="o">.</span><span class="n">get_links</span><span class="p">()</span>
<span class="c1"># ...</span>
</pre></div>
</div>
</div>
<div class="section" id="indirect-access">
<h2>Indirect access<a class="headerlink" href="#indirect-access" title="Permalink to this headline">¶</a></h2>
<p>Building mitogen proxy chains you can access nodes indirectly:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">mitogen.master</span>
<span class="kn">from</span> <span class="nn">pyroute2</span> <span class="k">import</span> <span class="n">RemoteIPRoute</span>
<span class="n">broker</span> <span class="o">=</span> <span class="n">mitogen</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">Broker</span><span class="p">()</span>
<span class="n">router</span> <span class="o">=</span> <span class="n">mitogen</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">Router</span><span class="p">(</span><span class="n">broker</span><span class="p">)</span>
<span class="c1"># login to the gateway</span>
<span class="n">gw</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">ssh</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="s1">'test-gateway'</span><span class="p">,</span>
<span class="n">username</span><span class="o">=</span><span class="s1">'ci'</span><span class="p">)</span>
<span class="c1"># login from the gateway to the target node</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">ssh</span><span class="p">(</span><span class="n">via</span><span class="o">=</span><span class="n">gw</span><span class="p">,</span>
<span class="n">hostname</span><span class="o">=</span><span class="s1">'test01'</span><span class="p">,</span>
<span class="n">username</span><span class="o">=</span><span class="s1">'ci'</span><span class="p">)</span>
<span class="n">rip</span> <span class="o">=</span> <span class="n">RemoteIPRoute</span><span class="p">(</span><span class="n">router</span><span class="o">=</span><span class="n">router</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">host</span><span class="p">)</span>
<span class="n">rip</span><span class="o">.</span><span class="n">get_links</span><span class="p">()</span>
<span class="c1"># ...</span>
</pre></div>
</div>
</div>
<div class="section" id="run-with-privileges">
<h2>Run with privileges<a class="headerlink" href="#run-with-privileges" title="Permalink to this headline">¶</a></h2>
<p>It requires the mitogen sudo proxy to run IPRoute with root permissions:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">mitogen.master</span>
<span class="kn">from</span> <span class="nn">pyroute2</span> <span class="k">import</span> <span class="n">RemoteIPRoute</span>
<span class="n">broker</span> <span class="o">=</span> <span class="n">mitogen</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">Broker</span><span class="p">()</span>
<span class="n">router</span> <span class="o">=</span> <span class="n">mitogen</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">Router</span><span class="p">(</span><span class="n">broker</span><span class="p">)</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">ssh</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="s1">'test01'</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="s1">'ci'</span><span class="p">)</span>
<span class="n">sudo</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">sudo</span><span class="p">(</span><span class="n">via</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="s1">'root'</span><span class="p">)</span>
<span class="n">rip</span> <span class="o">=</span> <span class="n">RemoteIPRoute</span><span class="p">(</span><span class="n">router</span><span class="o">=</span><span class="n">router</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">sudo</span><span class="p">)</span>
<span class="n">rip</span><span class="o">.</span><span class="n">link</span><span class="p">(</span><span class="s1">'add'</span><span class="p">,</span> <span class="n">ifname</span><span class="o">=</span><span class="s1">'br0'</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s1">'bridge'</span><span class="p">)</span>
<span class="c1"># ...</span>
</pre></div>
</div>
</div>
<div class="section" id="remote-network-namespaces">
<h2>Remote network namespaces<a class="headerlink" href="#remote-network-namespaces" title="Permalink to this headline">¶</a></h2>
<p>You also can access remote network namespaces with the same RemoteIPRoute
object:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">mitogen.master</span>
<span class="kn">from</span> <span class="nn">pyroute2</span> <span class="k">import</span> <span class="n">RemoteIPRoute</span>
<span class="n">broker</span> <span class="o">=</span> <span class="n">mitogen</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">Broker</span><span class="p">()</span>
<span class="n">router</span> <span class="o">=</span> <span class="n">mitogen</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">Router</span><span class="p">(</span><span class="n">broker</span><span class="p">)</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">ssh</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="s1">'test01'</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="s1">'ci'</span><span class="p">)</span>
<span class="n">sudo</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">sudo</span><span class="p">(</span><span class="n">via</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="s1">'root'</span><span class="p">)</span>
<span class="n">rip</span> <span class="o">=</span> <span class="n">RemoteIPRoute</span><span class="p">(</span><span class="n">router</span><span class="o">=</span><span class="n">router</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">sudo</span><span class="p">,</span> <span class="n">netns</span><span class="o">=</span><span class="s1">'test-netns'</span><span class="p">)</span>
<span class="n">rip</span><span class="o">.</span><span class="n">link</span><span class="p">(</span><span class="s1">'add'</span><span class="p">,</span> <span class="n">ifname</span><span class="o">=</span><span class="s1">'br0'</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s1">'bridge'</span><span class="p">)</span>
<span class="c1"># ...</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">RemoteIPRoute</a><ul>
<li><a class="reference internal" href="#caveats">Caveats</a></li>
<li><a class="reference internal" href="#introduction">Introduction</a></li>
<li><a class="reference internal" href="#indirect-access">Indirect access</a></li>
<li><a class="reference internal" href="#run-with-privileges">Run with privileges</a></li>
<li><a class="reference internal" href="#remote-network-namespaces">Remote network namespaces</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="iproute.html"
title="previous chapter">IPRoute module</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="ndb.html"
title="next chapter">NDB module</a></p>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/remote.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="ndb.html" title="NDB module"
>next</a> |</li>
<li class="right" >
<a href="iproute.html" title="IPRoute module"
>previous</a> |</li>
<li class="nav-item"><a href="http://pyroute2.org">Project home</a> »</li>
<li class="nav-item nav-item-0"><a href="index.html">pyroute2 0.5.14 documentation</a> »</li>
</ul>
</div>
<div class="footer" role="contentinfo">
© Copyright 2013, Peter V. Saveliev.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.1.2.
</div>
</body>
</html>
|