This file is indexed.

/usr/share/doc/python-netaddr-docs/api/_modules/netaddr/ip/glob.html is in python-netaddr-docs 0.7.18-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>netaddr.ip.glob &#8212; netaddr 0.7.18 documentation</title>
    
    <link rel="stylesheet" href="../../../_static/classic.css" type="text/css" />
    <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../../../',
        VERSION:     '0.7.18',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </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>
    <link rel="copyright" title="Copyright" href="../../../copyright.html" />
    <link rel="top" title="netaddr 0.7.18 documentation" href="../../../index.html" />
    <link rel="up" title="netaddr.ip" href="../ip.html" /> 
  </head>
  <body role="document">
    <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"
             accesskey="I">index</a></li>
        <li class="nav-item nav-item-0"><a href="../../../index.html">netaddr 0.7.18 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
          <li class="nav-item nav-item-2"><a href="../ip.html" accesskey="U">netaddr.ip</a> &#187;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <h1>Source code for netaddr.ip.glob</h1><div class="highlight"><pre>
<span></span><span class="c1">#-----------------------------------------------------------------------------</span>
<span class="c1">#   Copyright (c) 2008-2015, David P. D. Moss. All rights reserved.</span>
<span class="c1">#</span>
<span class="c1">#   Released under the BSD license. See the LICENSE file for details.</span>
<span class="c1">#-----------------------------------------------------------------------------</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Routines and classes for supporting and expressing IP address ranges using a</span>
<span class="sd">glob style syntax.</span>

<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">netaddr.core</span> <span class="k">import</span> <span class="n">AddrFormatError</span><span class="p">,</span> <span class="n">AddrConversionError</span>
<span class="kn">from</span> <span class="nn">netaddr.ip</span> <span class="k">import</span> <span class="n">IPRange</span><span class="p">,</span> <span class="n">IPAddress</span><span class="p">,</span> <span class="n">IPNetwork</span><span class="p">,</span> <span class="n">iprange_to_cidrs</span>
<span class="kn">from</span> <span class="nn">netaddr.compat</span> <span class="k">import</span> <span class="n">_is_str</span>


<div class="viewcode-block" id="valid_glob"><a class="viewcode-back" href="../../../api.html#netaddr.valid_glob">[docs]</a><span class="k">def</span> <span class="nf">valid_glob</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    :param ipglob: An IP address range in a glob-style format.</span>

<span class="sd">    :return: ``True`` if IP range glob is valid, ``False`` otherwise.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="c1">#TODO: Add support for abbreviated ipglobs.</span>
    <span class="c1">#TODO: e.g. 192.0.*.* == 192.0.*</span>
    <span class="c1">#TODO:      *.*.*.*     == *</span>
    <span class="c1">#TODO: Add strict flag to enable verbose ipglob checking.</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">_is_str</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
        <span class="k">return</span> <span class="kc">False</span>

    <span class="n">seen_hyphen</span> <span class="o">=</span> <span class="kc">False</span>
    <span class="n">seen_asterisk</span> <span class="o">=</span> <span class="kc">False</span>

    <span class="n">octets</span> <span class="o">=</span> <span class="n">ipglob</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span>

    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">octets</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span>
        <span class="k">return</span> <span class="kc">False</span>

    <span class="k">for</span> <span class="n">octet</span> <span class="ow">in</span> <span class="n">octets</span><span class="p">:</span>
        <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">in</span> <span class="n">octet</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">seen_hyphen</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="n">seen_hyphen</span> <span class="o">=</span> <span class="kc">True</span>
            <span class="k">if</span> <span class="n">seen_asterisk</span><span class="p">:</span>
                <span class="c1">#   Asterisks cannot precede hyphenated octets.</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="p">(</span><span class="n">octet1</span><span class="p">,</span> <span class="n">octet2</span><span class="p">)</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">octet</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)]</span>
            <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="k">if</span> <span class="n">octet1</span> <span class="o">&gt;=</span> <span class="n">octet2</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">octet1</span> <span class="o">&lt;=</span> <span class="mi">254</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">octet2</span> <span class="o">&lt;=</span> <span class="mi">255</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
        <span class="k">elif</span> <span class="n">octet</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
            <span class="n">seen_asterisk</span> <span class="o">=</span> <span class="kc">True</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">seen_hyphen</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="k">if</span> <span class="n">seen_asterisk</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="nb">int</span><span class="p">(</span><span class="n">octet</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">255</span><span class="p">:</span>
                    <span class="k">return</span> <span class="kc">False</span>
            <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
                <span class="k">return</span> <span class="kc">False</span>
    <span class="k">return</span> <span class="kc">True</span></div>


<div class="viewcode-block" id="glob_to_iptuple"><a class="viewcode-back" href="../../../api.html#netaddr.glob_to_iptuple">[docs]</a><span class="k">def</span> <span class="nf">glob_to_iptuple</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    A function that accepts a glob-style IP range and returns the component</span>
<span class="sd">    lower and upper bound IP address.</span>

<span class="sd">    :param ipglob: an IP address range in a glob-style format.</span>

<span class="sd">    :return: a tuple contain lower and upper bound IP objects.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">valid_glob</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
        <span class="k">raise</span> <span class="n">AddrFormatError</span><span class="p">(</span><span class="s1">&#39;not a recognised IP glob range: </span><span class="si">%r</span><span class="s1">!&#39;</span> <span class="o">%</span> <span class="n">ipglob</span><span class="p">)</span>

    <span class="n">start_tokens</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">end_tokens</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">octet</span> <span class="ow">in</span> <span class="n">ipglob</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">):</span>
        <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">in</span> <span class="n">octet</span><span class="p">:</span>
            <span class="n">tokens</span> <span class="o">=</span> <span class="n">octet</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
            <span class="n">start_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
            <span class="n">end_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
        <span class="k">elif</span> <span class="n">octet</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
            <span class="n">start_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">)</span>
            <span class="n">end_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;255&#39;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">start_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">octet</span><span class="p">)</span>
            <span class="n">end_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">octet</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">IPAddress</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">start_tokens</span><span class="p">)),</span> <span class="n">IPAddress</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">end_tokens</span><span class="p">))</span></div>


<div class="viewcode-block" id="glob_to_iprange"><a class="viewcode-back" href="../../../api.html#netaddr.glob_to_iprange">[docs]</a><span class="k">def</span> <span class="nf">glob_to_iprange</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    A function that accepts a glob-style IP range and returns the equivalent</span>
<span class="sd">    IP range.</span>

<span class="sd">    :param ipglob: an IP address range in a glob-style format.</span>

<span class="sd">    :return: an IPRange object.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">valid_glob</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
        <span class="k">raise</span> <span class="n">AddrFormatError</span><span class="p">(</span><span class="s1">&#39;not a recognised IP glob range: </span><span class="si">%r</span><span class="s1">!&#39;</span> <span class="o">%</span> <span class="n">ipglob</span><span class="p">)</span>

    <span class="n">start_tokens</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">end_tokens</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">octet</span> <span class="ow">in</span> <span class="n">ipglob</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">):</span>
        <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">in</span> <span class="n">octet</span><span class="p">:</span>
            <span class="n">tokens</span> <span class="o">=</span> <span class="n">octet</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
            <span class="n">start_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
            <span class="n">end_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
        <span class="k">elif</span> <span class="n">octet</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
            <span class="n">start_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">)</span>
            <span class="n">end_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;255&#39;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">start_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">octet</span><span class="p">)</span>
            <span class="n">end_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">octet</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">IPRange</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">start_tokens</span><span class="p">),</span> <span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">end_tokens</span><span class="p">))</span></div>


<div class="viewcode-block" id="iprange_to_globs"><a class="viewcode-back" href="../../../api.html#netaddr.iprange_to_globs">[docs]</a><span class="k">def</span> <span class="nf">iprange_to_globs</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    A function that accepts an arbitrary start and end IP address or subnet</span>
<span class="sd">    and returns one or more glob-style IP ranges.</span>

<span class="sd">    :param start: the start IP address or subnet.</span>

<span class="sd">    :param end: the end IP address or subnet.</span>

<span class="sd">    :return: a list containing one or more IP globs.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">start</span> <span class="o">=</span> <span class="n">IPAddress</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
    <span class="n">end</span> <span class="o">=</span> <span class="n">IPAddress</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">start</span><span class="o">.</span><span class="n">version</span> <span class="o">!=</span> <span class="mi">4</span> <span class="ow">and</span> <span class="n">end</span><span class="o">.</span><span class="n">version</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span>
        <span class="k">raise</span> <span class="n">AddrConversionError</span><span class="p">(</span><span class="s1">&#39;IP glob ranges only support IPv4!&#39;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_iprange_to_glob</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">):</span>
        <span class="c1">#   Internal function to process individual IP globs.</span>
        <span class="n">t1</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)]</span>
        <span class="n">t2</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">ub</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)]</span>

        <span class="n">tokens</span> <span class="o">=</span> <span class="p">[]</span>

        <span class="n">seen_hyphen</span> <span class="o">=</span> <span class="kc">False</span>
        <span class="n">seen_asterisk</span> <span class="o">=</span> <span class="kc">False</span>

        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">t1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">t2</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span>
                <span class="c1">#   A normal octet.</span>
                <span class="n">tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">t1</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
            <span class="k">elif</span> <span class="p">(</span><span class="n">t1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">t2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">255</span><span class="p">):</span>
                <span class="c1">#   An asterisk octet.</span>
                <span class="n">tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">)</span>
                <span class="n">seen_asterisk</span> <span class="o">=</span> <span class="kc">True</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="c1">#   Create a hyphenated octet - only one allowed per IP glob.</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="n">seen_asterisk</span><span class="p">:</span>
                    <span class="k">if</span> <span class="ow">not</span> <span class="n">seen_hyphen</span><span class="p">:</span>
                        <span class="n">tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">-</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">t1</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">t2</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
                        <span class="n">seen_hyphen</span> <span class="o">=</span> <span class="kc">True</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="k">raise</span> <span class="n">AddrConversionError</span><span class="p">(</span>
                            <span class="s1">&#39;only 1 hyphenated octet per IP glob allowed!&#39;</span><span class="p">)</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="k">raise</span> <span class="n">AddrConversionError</span><span class="p">(</span>
                        <span class="s2">&quot;asterisks are not allowed before hyphenated octets!&quot;</span><span class="p">)</span>

        <span class="k">return</span> <span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">tokens</span><span class="p">)</span>

    <span class="n">globs</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="c1">#   IP range can be represented by a single glob.</span>
        <span class="n">ipglob</span> <span class="o">=</span> <span class="n">_iprange_to_glob</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">valid_glob</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
            <span class="c1">#TODO: this is a workaround, it is produces non-optimal but valid</span>
            <span class="c1">#TODO: glob conversions. Fix inner function so that is always</span>
            <span class="c1">#TODO: produces a valid glob.</span>
            <span class="k">raise</span> <span class="n">AddrConversionError</span><span class="p">(</span><span class="s1">&#39;invalid ip glob created&#39;</span><span class="p">)</span>
        <span class="n">globs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ipglob</span><span class="p">)</span>
    <span class="k">except</span> <span class="n">AddrConversionError</span><span class="p">:</span>
        <span class="c1">#   Break IP range up into CIDRs before conversion to globs.</span>
        <span class="c1">#</span>
        <span class="c1">#TODO: this is still not completely optimised but is good enough</span>
        <span class="c1">#TODO: for the moment.</span>
        <span class="c1">#</span>
        <span class="k">for</span> <span class="n">cidr</span> <span class="ow">in</span> <span class="n">iprange_to_cidrs</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
            <span class="n">ipglob</span> <span class="o">=</span> <span class="n">_iprange_to_glob</span><span class="p">(</span><span class="n">cidr</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">cidr</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
            <span class="n">globs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ipglob</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">globs</span></div>


<div class="viewcode-block" id="glob_to_cidrs"><a class="viewcode-back" href="../../../api.html#netaddr.glob_to_cidrs">[docs]</a><span class="k">def</span> <span class="nf">glob_to_cidrs</span><span class="p">(</span><span class="n">ipglob</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    A function that accepts a glob-style IP range and returns a list of one</span>
<span class="sd">    or more IP CIDRs that exactly matches it.</span>

<span class="sd">    :param ipglob: an IP address range in a glob-style format.</span>

<span class="sd">    :return: a list of one or more IP objects.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">return</span> <span class="n">iprange_to_cidrs</span><span class="p">(</span><span class="o">*</span><span class="n">glob_to_iptuple</span><span class="p">(</span><span class="n">ipglob</span><span class="p">))</span></div>


<div class="viewcode-block" id="cidr_to_glob"><a class="viewcode-back" href="../../../api.html#netaddr.cidr_to_glob">[docs]</a><span class="k">def</span> <span class="nf">cidr_to_glob</span><span class="p">(</span><span class="n">cidr</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    A function that accepts an IP subnet in a glob-style format and returns</span>
<span class="sd">    a list of CIDR subnets that exactly matches the specified glob.</span>

<span class="sd">    :param cidr: an IP object CIDR subnet.</span>

<span class="sd">    :return: a list of one or more IP addresses and subnets.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">ip</span> <span class="o">=</span> <span class="n">IPNetwork</span><span class="p">(</span><span class="n">cidr</span><span class="p">)</span>
    <span class="n">globs</span> <span class="o">=</span> <span class="n">iprange_to_globs</span><span class="p">(</span><span class="n">ip</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ip</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">globs</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="c1">#   There should only ever be a one to one mapping between a CIDR and</span>
        <span class="c1">#   an IP glob range.</span>
        <span class="k">raise</span> <span class="n">AddrConversionError</span><span class="p">(</span><span class="s1">&#39;bad CIDR to IP glob conversion!&#39;</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">globs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>


<div class="viewcode-block" id="IPGlob"><a class="viewcode-back" href="../../../api.html#netaddr.IPGlob">[docs]</a><span class="k">class</span> <span class="nc">IPGlob</span><span class="p">(</span><span class="n">IPRange</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Represents an IP address range using a glob-style syntax ``x.x.x-y.*``</span>

<span class="sd">    Individual octets can be represented using the following shortcuts :</span>

<span class="sd">        1. ``*`` - the asterisk octet (represents values ``0`` through ``255``)</span>
<span class="sd">        2. ``x-y`` - the hyphenated octet (represents values ``x`` through ``y``)</span>

<span class="sd">    A few basic rules also apply :</span>

<span class="sd">        1. ``x`` must always be greater than ``y``, therefore :</span>

<span class="sd">        - ``x`` can only be ``0`` through ``254``</span>
<span class="sd">        - ``y`` can only be ``1`` through ``255``</span>

<span class="sd">        2. only one hyphenated octet per IP glob is allowed</span>
<span class="sd">        3. only asterisks are permitted after a hyphenated octet</span>

<span class="sd">    Examples:</span>

<span class="sd">    +------------------+------------------------------+</span>
<span class="sd">    | IP glob          | Description                  |</span>
<span class="sd">    +==================+==============================+</span>
<span class="sd">    | ``192.0.2.1``    | a single address             |</span>
<span class="sd">    +------------------+------------------------------+</span>
<span class="sd">    | ``192.0.2.0-31`` | 32 addresses                 |</span>
<span class="sd">    +------------------+------------------------------+</span>
<span class="sd">    | ``192.0.2.*``    | 256 addresses                |</span>
<span class="sd">    +------------------+------------------------------+</span>
<span class="sd">    | ``192.0.2-3.*``  | 512 addresses                |</span>
<span class="sd">    +------------------+------------------------------+</span>
<span class="sd">    | ``192.0-1.*.*``  | 131,072 addresses            |</span>
<span class="sd">    +------------------+------------------------------+</span>
<span class="sd">    | ``*.*.*.*``      | the whole IPv4 address space |</span>
<span class="sd">    +------------------+------------------------------+</span>

<span class="sd">    .. note :: \</span>
<span class="sd">    IP glob ranges are not directly equivalent to CIDR blocks. \</span>
<span class="sd">    They can represent address ranges that do not fall on strict bit mask \</span>
<span class="sd">    boundaries. They are suitable for use in configuration files, being \</span>
<span class="sd">    more obvious and readable than their CIDR counterparts, especially for \</span>
<span class="sd">    admins and end users with little or no networking knowledge or \</span>
<span class="sd">    experience. All CIDR addresses can always be represented as IP globs \</span>
<span class="sd">    but the reverse is not always true.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;_glob&#39;</span><span class="p">,)</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ipglob</span><span class="p">):</span>
        <span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span> <span class="o">=</span> <span class="n">glob_to_iptuple</span><span class="p">(</span><span class="n">ipglob</span><span class="p">)</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">IPGlob</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">glob</span> <span class="o">=</span> <span class="n">iprange_to_globs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_end</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>

<div class="viewcode-block" id="IPGlob.__getstate__"><a class="viewcode-back" href="../../../api.html#netaddr.IPGlob.__getstate__">[docs]</a>    <span class="k">def</span> <span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;:return: Pickled state of an `IPGlob` object.&quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">IPGlob</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__getstate__</span><span class="p">()</span></div>

<div class="viewcode-block" id="IPGlob.__setstate__"><a class="viewcode-back" href="../../../api.html#netaddr.IPGlob.__setstate__">[docs]</a>    <span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;:param state: data used to unpickle a pickled `IPGlob` object.&quot;&quot;&quot;</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">IPGlob</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__setstate__</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">glob</span> <span class="o">=</span> <span class="n">iprange_to_globs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_end</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span></div>

    <span class="k">def</span> <span class="nf">_get_glob</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_glob</span>

    <span class="k">def</span> <span class="nf">_set_glob</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ipglob</span><span class="p">):</span>
        <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_end</span><span class="p">)</span> <span class="o">=</span> <span class="n">glob_to_iptuple</span><span class="p">(</span><span class="n">ipglob</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_glob</span> <span class="o">=</span> <span class="n">iprange_to_globs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_end</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>

    <span class="n">glob</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_glob</span><span class="p">,</span> <span class="n">_set_glob</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
        <span class="s1">&#39;an arbitrary IP address range in glob format.&#39;</span><span class="p">)</span>

<div class="viewcode-block" id="IPGlob.__str__"><a class="viewcode-back" href="../../../api.html#netaddr.IPGlob.__str__">[docs]</a>    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;:return: IP glob in common representational format.&quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">glob</span></div>

<div class="viewcode-block" id="IPGlob.__repr__"><a class="viewcode-back" href="../../../api.html#netaddr.IPGlob.__repr__">[docs]</a>    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;:return: Python statement to create an equivalent object&quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">(&#39;</span><span class="si">%s</span><span class="s2">&#39;)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">glob</span><span class="p">)</span></div></div>
</pre></div>

          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none" role="search">
  <h3>Quick search</h3>
    <form class="search" action="../../../search.html" method="get">
      <div><input type="text" name="q" /></div>
      <div><input type="submit" value="Go" /></div>
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
</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="nav-item nav-item-0"><a href="../../../index.html">netaddr 0.7.18 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
          <li class="nav-item nav-item-2"><a href="../ip.html" >netaddr.ip</a> &#187;</li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; <a href="../../../copyright.html">Copyright</a> 2008-2016, David P. D. Moss. All rights reserved.
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.6.
    </div>
  </body>
</html>