.\" Man page generated from reStructuredText .\" by the Docutils 0.22.3 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "NETADDR" "1" "Dec 14, 2025" "1.3.0" "netaddr" .SH "نام (NAME)" netaddr \- مستندات کتابخانه و ابزار مدیریت آدرس‌های شبکه netaddr .sp یک کتابخانه Python و یک ابزار CLI \%<> برای نمایش و دستکاری آدرس‌های شبکه در لایه ۳ (IP) و لایه ۲ (MAC). .sp ابزار netaddr از موارد زیر پشتیبانی می‌کند: .sp آدرس‌های لایه ۳ .INDENT 0.0 .IP \(bu 2 آدرس‌ها، زیرشبکه‌ها، ماسک‌ها و پیشوندهای IPv4 و IPv6 .IP \(bu 2 پیمایش، برش (slicing)، مرتب‌سازی، خلاصه‌سازی و دسته‌بندی شبکه‌های IP .IP \(bu 2 پشتیبانی از قالب‌های مختلف بازه (CIDR، بازه‌ها و الگوهای دلخواه، nmap) .IP \(bu 2 عملیات بر پایه مجموعه‌ها (اجتماع، اشتراک و غیره) روی آدرس‌های IP و زیرشبکه‌ها .IP \(bu 2 تجزیه طیف گسترده‌ای از قالب‌ها و نمادگذاری‌های مختلف .IP \(bu 2 جستجوی اطلاعات بلوک‌های IP در IANA .IP \(bu 2 تولید جستجوهای معکوس DNS .IP \(bu 2 ابرشبکه‌سازی (supernetting) و زیرشبکه‌سازی (subnetting) .UNINDENT .sp آدرس‌های لایه ۲ .INDENT 0.0 .IP \(bu 2 نمایش و دستکاری آدرس‌های MAC و شناسه‌های EUI\-64 .IP \(bu 2 جستجوی اطلاعات سازمانی IEEE (شامل OUI و IAB) .IP \(bu 2 تولید آدرس‌های IPv6 مشتق‌شده .UNINDENT .sp مستندات netaddr از رویکرد Diátaxis برای نگارش مستندات فنی \% بهره می‌برد و به این صورت سازمان‌دهی شده است: .INDENT 0.0 .IP \(bu 2 آموزش‌ها (Tutorials) \%<> شما را در مسیری گام‌به‌گام با برخی از قابلیت‌های netaddr آشنا می‌کنند. اگر به‌تازگی کار با netaddr را شروع کرده‌اید، از اینجا آغاز کنید. .IP \(bu 2 راهنماهای کاربردی (How\-to guides) \%<> دستورالعمل‌هایی گام‌به‌گام برای حل مسائل و سناریوهای رایج هستند. .IP \(bu 2 مرجع (Reference) \%<> حاوی توضیحات فنی بخش‌های گوناگون سازوکار netaddr است (شامل مرجع API \%<>). .UNINDENT.SH "آموزش‌ها (TUTORIALS)" .sp صفحات این بخش شما را به صورت گام‌به‌گام با برخی از قابلیت‌های netaddr آشنا می‌کنند. .sp اگر در استفاده از netaddr تازه‌کار هستید، از اینجا شروع کنید. .SS "آموزش ۱: آدرس‌های IP، زیرشبکه‌ها و محدوده‌ها (Tutorial 1: IP Addresses, Subnets and Ranges)" .sp پیش از هر چیز باید کلاس‌ها و توابع گوناگون netaddr را به فضای‌نام (namespace) خود وارد کنید. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این کار را تنها برای اهداف این آموزش انجام دهید. در کدهای خودتان، برای جلوگیری از تداخل نام‌ها (name clashes)، باید کلاس‌ها، توابع و مقادیر ثابتی را که وارد (import) می‌کنید به صورت صریح مشخص نمایید. .UNINDENT .UNINDENT .sp .EX >>> from netaddr import * .EE .sp ما همچنین ماژول کتابخانه استاندارد \fIpprint\fP را برای کمک به قالب‌بندی خروجی وارد می‌کنیم. .sp .EX >>> import pprint .EE .SS "عملیات پایه (Basic operations)" .sp شیء \fIIPAddress\fP زیر یک آدرس IP منفرد را نمایش می‌دهد. .sp .EX >>> ip = IPAddress(\(aq192.0.2.1\(aq) >>> ip.version 4 .EE .sp فراخوانی \fIrepr()\fP یک عبارت پایتون بازمی‌گرداند که در صورت اجرا در مفسر پایتون، می‌تواند برای بازسازی وضعیت شیء آدرس IP مشابه از ابتدا مورد استفاده قرار گیرد. .sp .EX >>> repr(ip) \(dqIPAddress(\(aq192.0.2.1\(aq)\(dq >>> ip IPAddress(\(aq192.0.2.1\(aq) .EE .sp دسترسی به شیء IP در بافت رشته‌ای (string context)، مقدار آن را به صورت رشته برمی‌گرداند. .sp .EX >>> str(ip) \(aq192.0.2.1\(aq >>> \(aq%s\(aq % ip \(aq192.0.2.1\(aq >>> ip.format() # only really useful for IPv6 addresses. \(aq192.0.2.1\(aq .EE .SS "نمایش عددی (Numerical representation)" .sp شما می‌توانید یک آدرس IP را در قالب‌های گوناگون دیگری مشاهده کنید. .sp .EX >>> int(ip) == 3221225985 True >>> hex(ip) \(aq0xc0000201\(aq >>> ip.bin \(aq0b11000000000000000000001000000001\(aq >>> ip.bits() \(aq11000000.00000000.00000010.00000001\(aq >>> ip.words == (192, 0, 2, 1) True .EE .SS "نمایش شبکه‌ها و زیرشبکه‌ها (Representing networks and subnets)" .sp اشیای \fIIPNetwork\fP برای نمایش زیرشبکه‌ها، شبکه‌ها یا VLANهایی به کار می‌روند که پیشوندهای CIDR و netmaskها را می‌پذیرند. .sp .EX >>> ip = IPNetwork(\(aq192.0.2.1\(aq) >>> ip.ip IPAddress(\(aq192.0.2.1\(aq) >>> ip.network, ip.broadcast (IPAddress(\(aq192.0.2.1\(aq), None) >>> ip.netmask, ip.hostmask (IPAddress(\(aq255.255.255.255\(aq), IPAddress(\(aq0.0.0.0\(aq)) >>> ip.size 1 .EE .sp در این حالت، آدرس شبکه و برودکست (broadcast) یکسان هستند، مشابه با یک مسیر میزبان (host route). .sp .EX >>> ip = IPNetwork(\(aq192.0.2.0/24\(aq) >>> ip.ip IPAddress(\(aq192.0.2.0\(aq) >>> ip.network, ip.broadcast (IPAddress(\(aq192.0.2.0\(aq), IPAddress(\(aq192.0.2.255\(aq)) >>> ip.netmask, ip.hostmask (IPAddress(\(aq255.255.255.0\(aq), IPAddress(\(aq0.0.0.255\(aq)) >>> ip.size 256 .EE .sp و در نهایت، این شیء IPNetwork نمایانگر یک آدرس IP است که متعلق به یک زیرشبکه IP مشخص است. .sp .EX >>> ip = IPNetwork(\(aq192.0.3.112/22\(aq) >>> ip.ip IPAddress(\(aq192.0.3.112\(aq) >>> ip.network, ip.broadcast (IPAddress(\(aq192.0.0.0\(aq), IPAddress(\(aq192.0.3.255\(aq)) >>> ip.netmask, ip.hostmask (IPAddress(\(aq255.255.252.0\(aq), IPAddress(\(aq0.0.3.255\(aq)) >>> ip.size 1024 .EE .sp از نظر درونی، هر شیء IPNetwork تنها ۳ مقدار را ذخیره می‌کند: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 مقدار آدرس IP به صورت یک عدد صحیح بدون علامت (unsigned integer) .IP \(bu 2 یک ارجاع به ماژول پروتکل IP برای نسخه IP نمایش‌داده‌شده .IP \(bu 2 بیت‌ماسکِ (bitmask) پیشوند CIDR .UNINDENT .UNINDENT .UNINDENT .sp سایر مقادیر در هنگام دسترسی به صورت درجا (on\-the\-fly) محاسبه می‌شوند. .sp تنظیم مقدار آدرس IP و پیشوند CIDR پس از نمونه‌سازی (instantiation) شیء امکان‌پذیر است. .sp .EX >>> ip = IPNetwork(\(aq0.0.0.0/0\(aq) >>> ip IPNetwork(\(aq0.0.0.0/0\(aq) >>> ip.value = 3221225985 >>> ip IPNetwork(\(aq192.0.2.1/0\(aq) >>> ip.prefixlen 0 >>> ip.prefixlen = 23 >>> ip IPNetwork(\(aq192.0.2.1/23\(aq) .EE .sp طول پیشوند (prefix length) را می‌توان با تعیین یک subnet mask نیز تغییر داد: .sp .EX >>> ip = IPNetwork(\(aq192.168.1.0/24\(aq) >>> ip.netmask = \(aq255.255.0.0\(aq >>> ip IPNetwork(\(aq192.168.1.0/16\(aq) >>> ip = IPNetwork(\(aqfe80::dead:beef/64\(aq) >>> ip.netmask = \(aqffff:ffff::\(aq >>> ip IPNetwork(\(aqfe80::dead:beef/32\(aq) .EE .sp همچنین ویژگی‌ای (property) وجود دارد که به شما امکان دسترسی به آدرس CIDR \fIواقعی\fP را می‌دهد که تمامی بیت‌های میزبان (host bits) را بر اساس پیشوند زیرشبکه CIDR از آدرس شبکه حذف می‌کند. .sp .EX >>> ip = IPNetwork(\(aq192.0.2.1/23\(aq) >>> ip.cidr IPNetwork(\(aq192.0.2.0/23\(aq) .EE .sp این ویژگی برای تعیین دقیق و صحیح برخی پیکربندی‌های شبکه بسیار کاربردی است. .sp اگر می‌خواهید به اطلاعات مربوط به تک‌تک آدرس‌های IP تشکیل‌دهنده زیرشبکه دسترسی داشته باشید، این امر از طریق فراخوانی‌های مستقیم متدهای فرعی در هر شیء \fIIPAddress\fP امکان‌پذیر است. .sp برای مثال، اگر می‌خواهید نمایش ارقام دودویی (باینری) هر آدرس را مشاهده کنید، می‌توانید به صورت زیر عمل نمایید. .sp .EX >>> ip.ip.bits() \(aq11000000.00000000.00000010.00000001\(aq >>> ip.network.bits() \(aq11000000.00000000.00000010.00000000\(aq >>> ip.netmask.bits() \(aq11111111.11111111.11111110.00000000\(aq >>> ip.broadcast.bits() \(aq11000000.00000000.00000011.11111111\(aq .EE.SS "پشتیبانی از IPv6" .sp پشتیبانی کامل از IPv6 ارائه شده است. بیایید چند مثال را بررسی کنیم: .sp .EX >>> ip = IPAddress(0, 6) >>> ip IPAddress(\(aq::\(aq) >>> ip = IPNetwork(\(aqfe80::dead:beef/64\(aq) >>> str(ip), ip.prefixlen, ip.version (\(aqfe80::dead:beef/64\(aq, 64, 6) >>> int(ip.ip) == 338288524927261089654018896845083623151 True >>> hex(ip.ip) \(aq0xfe8000000000000000000000deadbeef\(aq .EE .sp خروجی به سبک بیتی برای چنین اعداد طویلی به اندازهٔ هگزادسیمال خوش‌خوان نیست، اما این اثبات کارکرد آن است! .sp .EX >>> ip.ip.bits() \(aq1111111010000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:1101111010101101:1011111011101111\(aq .EE .sp در اینجا برخی از جزئیات شبکه‌ای برای یک زیرشبکهٔ IPv6 آورده شده است. .sp .EX >>> ip.network, ip.broadcast, ip.netmask, ip.hostmask (IPAddress(\(aqfe80::\(aq), IPAddress(\(aqfe80::ffff:ffff:ffff:ffff\(aq), IPAddress(\(aqffff:ffff:ffff:ffff::\(aq), IPAddress(\(aq::ffff:ffff:ffff:ffff\(aq)) .EE .SS "سازگاری متقابل میان IPv4 و IPv6" .sp با گسترش روزافزون IPv6، به احتمال زیاد مایل خواهید بود که بتوانید میان نشانی‌های IPv4 و IPv6 به‌صورت یکپارچه تعامل برقرار کنید. .sp در اینجا چند متد آورده شده است که به دستیابی به این هدف کمک می‌کنند. .SS "تبدیل IPv4 به IPv6" .sp .EX >>> IPAddress(\(aq192.0.2.15\(aq).ipv4() IPAddress(\(aq192.0.2.15\(aq) >>> ip = IPAddress(\(aq192.0.2.15\(aq).ipv6() >>> ip IPAddress(\(aq::ffff:192.0.2.15\(aq) >>> ip.is_ipv4_mapped() True >>> ip.is_ipv4_compat() False .EE .sp .EX >>> IPAddress(\(aq192.0.2.15\(aq).ipv6(ipv4_compatible=True) IPAddress(\(aq::192.0.2.15\(aq) >>> IPAddress(\(aq192.0.2.15\(aq).ipv6(ipv4_compatible=True).is_ipv4_compat() True >>> IPAddress(\(aq192.0.2.15\(aq).ipv6(True) IPAddress(\(aq::192.0.2.15\(aq) >>> ip = IPNetwork(\(aq192.0.2.1/23\(aq) >>> ip.ipv4() IPNetwork(\(aq192.0.2.1/23\(aq) >>> ip.ipv6() IPNetwork(\(aq::ffff:192.0.2.1/119\(aq) >>> ip.ipv6(ipv4_compatible=True) IPNetwork(\(aq::192.0.2.1/119\(aq) .EE .SS "تبدیل IPv6 به IPv4" .sp .EX >>> IPNetwork(\(aq::ffff:192.0.2.1/119\(aq).ipv6() IPNetwork(\(aq::ffff:192.0.2.1/119\(aq) >>> IPNetwork(\(aq::ffff:192.0.2.1/119\(aq).ipv6(ipv4_compatible=True) IPNetwork(\(aq::192.0.2.1/119\(aq) >>> IPNetwork(\(aq::ffff:192.0.2.1/119\(aq).ipv4() IPNetwork(\(aq192.0.2.1/23\(aq) >>> IPNetwork(\(aq::192.0.2.1/119\(aq).ipv4() IPNetwork(\(aq192.0.2.1/23\(aq) .EE .sp توجه داشته باشید که شیء IP به‌طور پیش‌فرض نشانی‌های IPv4 از نوع \(dqنگاشت‌شده\(dq (mapped) را بر نشانی‌های \(dqسازگار\(dq (compatible) ترجیح داده و بازمی‌گرداند. این انتخاب هدفمند بوده است چرا که قالب دوم منسوخ شده است (برای جزئیات به RFC 4291 مراجعه کنید). .SS "عملیات‌های فهرست" .sp اگر با یک شیء \fIIPNetwork\fP به‌گونه‌ای رفتار کنید که گویی یک شیء فهرست استاندارد Python است، به شما امکان دسترسی به فهرستی از اشیاء نشانی IP مجزا را می‌دهد. این امر البته صوری است و آن‌ها تا زمانی که به آن‌ها دسترسی پیدا نکنید ایجاد نمی‌شوند. .sp .EX >>> ip = IPNetwork(\(aq192.0.2.16/29\(aq) .EE .sp دسترسی به یک شیء IP با استفاده از بافت \fIlist()\fP، مولد پیش‌فرض را فرامی‌خواند که فهرستی از تمام اشیاء IP در محدودهٔ مشخص‌شده توسط زیرشبکهٔ شیء IP را بازمی‌گرداند. .sp .EX >>> ip_list = list(ip) >>> len(ip_list) 8 >>> ip_list [IPAddress(\(aq192.0.2.16\(aq), IPAddress(\(aq192.0.2.17\(aq), ..., IPAddress(\(aq192.0.2.22\(aq), IPAddress(\(aq192.0.2.23\(aq)] .EE .sp طول آن فهرست ۸ نشانی IP مجزا است. .sp .EX >>> len(ip) 8 .EE.SS اندیس‌گذاری (Indexing) .sp می‌توانید از دسترسی استاندارد بر پایه اندیس برای نشانی‌های IP در زیرشبکه استفاده کنید. .sp .EX >>> ip[0] IPAddress(\(aq192.0.2.16\(aq) >>> ip[1] IPAddress(\(aq192.0.2.17\(aq) >>> ip[\-1] IPAddress(\(aq192.0.2.23\(aq) .EE .SS برش‌زدن (Slicing) .sp همچنین می‌توانید از برش‌های فهرست روی نشانی‌های IP در زیرشبکه استفاده کنید. .sp .EX >>> ip[0:4] .EE .sp برش یک تابع مولد (generator function) است. این کار برای صرفه‌جویی در زمان و منابع سیستم انجام شده است، زیرا برخی برش‌ها برای زیرشبکه‌های خاص ممکن است بسیار بزرگ شوند! .sp نحوه دسترسی به تمام عناصر موجود در یک برش به این صورت است: .sp .EX >>> list(ip[0:4]) [IPAddress(\(aq192.0.2.16\(aq), IPAddress(\(aq192.0.2.17\(aq), IPAddress(\(aq192.0.2.18\(aq), IPAddress(\(aq192.0.2.19\(aq)] .EE .sp برش‌زدن گسترده (Extended slicing) نیز پشتیبانی می‌شود. .sp .EX >>> list(ip[0::2]) [IPAddress(\(aq192.0.2.16\(aq), IPAddress(\(aq192.0.2.18\(aq), IPAddress(\(aq192.0.2.20\(aq), IPAddress(\(aq192.0.2.22\(aq)] .EE .sp معکوس‌سازی فهرست. .sp .EX >>> list(ip[\-1::\-1]) [IPAddress(\(aq192.0.2.23\(aq), IPAddress(\(aq192.0.2.22\(aq), ..., IPAddress(\(aq192.0.2.17\(aq), IPAddress(\(aq192.0.2.16\(aq)] .EE .sp استفاده از مولدها تضمین می‌کند که کار با زیرشبکه‌های بزرگ IP بهینه و کارآمد است. .sp .EX >>> for ip in IPNetwork(\(aq192.0.2.0/23\(aq): \&... print(\(aq%s\(aq % ip) \&... 192.0.2.0 192.0.2.1 192.0.2.2 192.0.2.3 \&... 192.0.3.252 192.0.3.253 192.0.3.254 192.0.3.255 .EE .sp در شبکه‌های IPv4 معمولاً فقط نشانی‌های بین نشانی شبکه و نشانی پخش همگانی (broadcast) را به رابط‌های میزبان واقعی روی سیستم‌ها اختصاص می‌دهید. .sp تکرارکننده (iterator) ارائه‌شده برای دسترسی به این نشانی‌های IP به شرح زیر است: .sp .EX >>> for ip in IPNetwork(\(aq192.0.2.0/23\(aq).iter_hosts(): \&... print(\(aq%s\(aq % ip) \&... 192.0.2.1 192.0.2.2 192.0.2.3 192.0.2.4 \&... 192.0.3.251 192.0.3.252 192.0.3.253 192.0.3.254 .EE .SS مرتب‌سازی نشانی‌ها و شبکه‌های IP (Sorting IP addresses and networks) .sp مرتب‌سازی استاندارد و متعارف نشانی‌ها و شبکه‌های IP امری نسبتاً رایج و مفید است. .sp نحوه کارکرد مرتب‌سازی روی نشانی‌های مجزا بدین صورت است: .sp .EX >>> import random >>> ip_list = list(IPNetwork(\(aq192.0.2.128/28\(aq)) >>> random.shuffle(ip_list) >>> sorted(ip_list) [IPAddress(\(aq192.0.2.128\(aq), IPAddress(\(aq192.0.2.129\(aq), ..., IPAddress(\(aq192.0.2.142\(aq), IPAddress(\(aq192.0.2.143\(aq)] .EE .sp جهت سهولت کار، می‌توانید زیرشبکه‌های IP را هم‌زمان با نشانی‌ها مرتب کنید و آن‌ها می‌توانند به‌طور هم‌زمان ترکیبی از نشانی‌های IPv4 و IPv6 باشند (نشانی‌ها و شبکه‌های IPv4 پیش از موارد IPv6 قرار می‌گیرند). .sp .EX >>> ip_list = [ \&... IPAddress(\(aq192.0.2.130\(aq), \&... IPAddress(\(aq10.0.0.1\(aq), \&... IPNetwork(\(aq192.0.2.128/28\(aq), \&... IPNetwork(\(aq192.0.3.0/24\(aq), \&... IPNetwork(\(aq192.0.2.0/24\(aq), \&... IPNetwork(\(aqfe80::/64\(aq), \&... IPAddress(\(aq::\(aq)] >>> random.shuffle(ip_list) >>> ip_list.sort() >>> pprint.pprint(ip_list) [IPAddress(\(aq10.0.0.1\(aq), IPNetwork(\(aq192.0.2.0/24\(aq), IPNetwork(\(aq192.0.2.128/28\(aq), IPAddress(\(aq192.0.2.130\(aq), IPNetwork(\(aq192.0.3.0/24\(aq), IPAddress(\(aq::\(aq), IPNetwork(\(aqfe80::/64\(aq)] .EE .sp توجه داشته باشید که چگونه زیرشبکه‌های هم‌پوشان نیز به ترتیب از بزرگ‌ترین به کوچک‌ترین مرتب می‌شوند..SS "خلاصه‌سازی فهرستی از نشانی‌ها و زیرشبکه‌ها (Summarizing list of addresses and subnets)" .sp یک عملیات مفید دیگر، قابلیت خلاصه‌سازی گروه‌هایی از زیرشبکه‌ها و نشانی‌های IP و ادغام آن‌ها با یکدیگر در صورت امکان، به منظور ایجاد کوچک‌ترین فهرست ممکن از زیرشبکه‌های CIDR است. .sp شما این کار را در netaddr با استفاده از تابع \fIcidr_merge()\fP انجام می‌دهید. .sp ابتدا فهرستی از اشیاء IP ایجاد می‌کنیم که شامل ترکیبی مناسب از نشانی‌ها و زیرشبکه‌های جداگانه، به همراه چند مقدار متنی نشانی IP برای اطمینان بیشتر است. برای جالب‌تر شدن ماجرا، چند نشانی IPv6 نیز اضافه شده است. .sp .EX >>> ip_list = [ip for ip in IPNetwork(\(aqfe80::/120\(aq)] >>> ip_list.append(IPNetwork(\(aq192.0.2.0/24\(aq)) >>> ip_list.extend([str(ip) for ip in IPNetwork(\(aq192.0.3.0/24\(aq)]) >>> ip_list.append(IPNetwork(\(aq192.0.4.0/25\(aq)) >>> ip_list.append(IPNetwork(\(aq192.0.4.128/25\(aq)) >>> len(ip_list) 515 >>> cidr_merge(ip_list) [IPNetwork(\(aq192.0.2.0/23\(aq), IPNetwork(\(aq192.0.4.0/24\(aq), IPNetwork(\(aqfe80::/120\(aq)] .EE .sp مفید است، این‌طور نیست؟ .SS "ابَرشبکه‌ها و زیرشبکه‌ها (Supernets and subnets)" .sp بسیار معمول است که یک زیرشبکهٔ بزرگ CIDR داشته باشید و بخواهید آن را به چندین بلوک مؤلفهٔ کوچک‌تر تقسیم کنید تا تخصیص‌های شبکه، قوانین دیوار آتش (firewall) و غیره را بهتر مدیریت کنید؛ netaddr ابزارهای لازم برای این کار را در اختیارتان می‌گذارد. .sp در اینجا یک بلوک شبکهٔ بزرگ کلاس B خصوصی /16 را در نظر می‌گیریم و آن را به مجموعه‌ای از بلوک‌های کوچک‌تر با اندازهٔ ۵۱۲ تقسیم می‌کنیم. .sp .EX >>> ip = IPNetwork(\(aq172.24.0.0/16\(aq) >>> ip.subnet(23) .EE .sp بار دیگر، این متد به دلیل احتمال وجود تعداد زیادی مقدار بازگشتی بسته به اندازهٔ زیرشبکهٔ مشخص‌شده، یک تکرارکننده (iterator) تولید می‌کند. .sp .EX >>> subnets = list(ip.subnet(23)) >>> len(subnets) 128 >>> subnets [IPNetwork(\(aq172.24.0.0/23\(aq), IPNetwork(\(aq172.24.2.0/23\(aq), IPNetwork(\(aq172.24.4.0/23\(aq), ..., IPNetwork(\(aq172.24.250.0/23\(aq), IPNetwork(\(aq172.24.252.0/23\(aq), IPNetwork(\(aq172.24.254.0/23\(aq)] .EE .sp همچنین می‌توان فهرست ابرشبکه‌هایی (supernets) را که یک نشانی IP یا زیرشبکهٔ مشخص به آن‌ها تعلق دارد دریافت کرد. شما همچنین می‌توانید یک حد اختیاری تعیین کنید. .sp .EX >>> ip = IPNetwork(\(aq192.0.2.114\(aq) >>> supernets = ip.supernet(22) >>> pprint.pprint(supernets) [IPNetwork(\(aq192.0.0.0/22\(aq), IPNetwork(\(aq192.0.2.0/23\(aq), IPNetwork(\(aq192.0.2.0/24\(aq), IPNetwork(\(aq192.0.2.0/25\(aq), IPNetwork(\(aq192.0.2.64/26\(aq), IPNetwork(\(aq192.0.2.96/27\(aq), IPNetwork(\(aq192.0.2.112/28\(aq), IPNetwork(\(aq192.0.2.112/29\(aq), IPNetwork(\(aq192.0.2.112/30\(aq), IPNetwork(\(aq192.0.2.114/31\(aq)] .EE .sp در اینجا، به جای یک تولیدکننده (generator)، یک فهرست بازگردانده می‌شود؛ زیرا فهرست مقادیر بالقوه اندازه‌ای قابل‌پیش‌بینی دارد (حداکثر ۳۱ زیرشبکه برای یک نشانی IPv4 و ۱۲۷ برای IPv6). .SS "پشتیبانی از محدوده‌های نشانی غیراستاندارد (Support for non\-standard address ranges)" .sp اگرچه CIDR روشی سودمند برای توصیف موجز شبکه‌ها است، اما غالباً (به‌ویژه در IPv4 که پیش از مشخصات CIDR معرفی شده بود) ضروری است که بتوان فهرستی از نشانی‌های IP با نشانی شروع و پایان دلخواه تولید کرد که دقیقاً منطبق بر مرزهای ماسک بیتی نیستند. .sp تابع \fIiter_iprange()\fP دقیقاً امکان انجام این کار را به شما می‌دهد. .sp .EX >>> ip_list = list(iter_iprange(\(aq192.0.2.1\(aq, \(aq192.0.2.14\(aq)) >>> len(ip_list) 14 >>> ip_list [IPAddress(\(aq192.0.2.1\(aq), IPAddress(\(aq192.0.2.2\(aq), ..., IPAddress(\(aq192.0.2.13\(aq), IPAddress(\(aq192.0.2.14\(aq)] .EE .sp همچنین دانستن اینکه فهرست واقعی زیرشبکه‌های CIDR که این محدودهٔ غیرهم‌تراز نشانی‌ها را به‌درستی پوشش می‌دهند چیست، بسیار سودمند است. .sp در اینجا \fIcidr_merge()\fP بار دیگر به کمک می‌آید. .sp .EX >>> cidr_merge(ip_list) [IPNetwork(\(aq192.0.2.1/32\(aq), IPNetwork(\(aq192.0.2.2/31\(aq), IPNetwork(\(aq192.0.2.4/30\(aq), IPNetwork(\(aq192.0.2.8/30\(aq), IPNetwork(\(aq192.0.2.12/31\(aq), IPNetwork(\(aq192.0.2.14/32\(aq)] .EE.SS کار با مشخصات قدیمی‌تر شبکه IP .sp تا پیش از پیدایش مشخصهٔ CIDR، مرسوم بود که netmask یک نشانی IPv4 بر اساس نخستین octet آن و با استفاده از مجموعه‌ای از قوانین کلاس‌بندی‌شده (classful، که نخستین‌بار در RFC 791 تعریف شدند) استنتاج شود. .sp شما غالباً با ارجاعاتی به آن‌ها در RFCهای مختلف روبه‌رو می‌شوید و کتابخانه‌های نرم‌افزاری متعددی نیز به‌خوبی از آن‌ها پشتیبانی می‌کنند. برای حفظ جامعیت، به‌جای کنار گذاشتن این مجموعه قوانین مهم (اما اکنون تا حدی تاریخی)، از آن‌ها از طریق تابعی با نام رمزگونهٔ \fIcidr_abbrev_to_verbose()\fP پشتیبانی می‌شود. .sp در اینجا مثالی از این قوانین برای کل فضای نشانی IPv4 آورده شده است. .sp .EX >>> cidrs = [cidr_abbrev_to_verbose(octet) for octet in range(0, 256)] >>> pprint.pprint(cidrs) [\(aq0.0.0.0/8\(aq, \&... \(aq127.0.0.0/8\(aq, \(aq128.0.0.0/16\(aq, \&... \(aq191.0.0.0/16\(aq, \(aq192.0.0.0/24\(aq, \&... \(aq223.0.0.0/24\(aq, \(aq224.0.0.0/4\(aq, \&... \(aq239.0.0.0/4\(aq, \(aq240.0.0.0/32\(aq, \&... \(aq255.0.0.0/32\(aq] >>> len(cidrs) 256 .EE .SS دسته‌بندی نشانی‌های IP .sp نشانی‌های IP به چندین دسته تقسیم می‌شوند که همهٔ آن‌ها برای تخصیص به‌عنوان نشانی‌های میزبان (host) مناسب نیستند. .SS تک‌پخشی (Unicast) .sp .EX >>> IPAddress(\(aq192.0.2.1\(aq).is_unicast() True >>> IPAddress(\(aqfe80::1\(aq).is_unicast() True .EE .SS چندپخشی (Multicast) .sp برای شناسایی گروه‌های چندپخشی استفاده می‌شود (برای اطلاعات بیشتر به RFC 2365 و 3171 مراجعه کنید). .sp .EX >>> IPAddress(\(aq239.192.0.1\(aq).is_multicast() True >>> IPAddress(\(aqff00::1\(aq).is_multicast() True .EE .SS رزروشده (Reserved) .sp نشانی‌های موجود در محدوده‌های رزروشده برای استفادهٔ عمومی در دسترس نیستند. .sp .EX >>> IPAddress(\(aq253.0.0.1\(aq).is_reserved() True .EE .SS ماسک‌های شبکه (Netmasks) .sp یک بیت‌ماسک که برای تقسیم یک نشانی IP به نشانی شبکه و نشانی میزبان به‌کار می‌رود. .sp .EX >>> IPAddress(\(aq255.255.254.0\(aq).is_netmask() True .EE .SS ماسک‌های میزبان (Hostmasks) .sp مشابه با netmask است، با این تفاوت که تمام بیت‌های آن معکوس شده‌اند. .sp .EX >>> IPAddress(\(aq0.0.1.255\(aq).is_hostmask() True .EE .SS لوپ‌بک (Loopback) .sp این نشانی‌ها به‌صورت داخلی درون پشتهٔ شبکهٔ IP استفاده می‌شوند و بسته‌های ارسال‌شده به این نشانی‌ها از طریق یک اتصال شبکه فیزیکی توزیع نمی‌شوند. .sp .EX >>> IPAddress(\(aq127.0.0.1\(aq).is_loopback() True >>> IPAddress(\(aq::1\(aq).is_loopback() True .EE.SS مقایسه نشانی‌های IP .sp اشیاء \fIIPAddress\fP می‌توانند با یکدیگر مقایسه شوند. از آنجا که یک شیء \fIIPAddress\fP می‌تواند هم بیانگر یک نشانی IP تکی و هم یک شبکه ضمنی باشد، بهتر است برای جلوگیری از نتایج نامتعارف، پیش از مقایسه اطمینان حاصل کنید که هر دو طرف مقایسه در شرایط یکسانی قرار دارند. .sp در اینجا چند نمونه از مقایسه‌های نشانی‌های IP تکی برای شروع آورده شده است. .sp .EX >>> IPAddress(\(aq192.0.2.1\(aq) == IPAddress(\(aq192.0.2.1\(aq) True >>> IPAddress(\(aq192.0.2.1\(aq) < IPAddress(\(aq192.0.2.2\(aq) True >>> IPAddress(\(aq192.0.2.2\(aq) > IPAddress(\(aq192.0.2.1\(aq) True >>> IPAddress(\(aq192.0.2.1\(aq) != IPAddress(\(aq192.0.2.1\(aq) False >>> IPAddress(\(aq192.0.2.1\(aq) >= IPAddress(\(aq192.0.2.1\(aq) True >>> IPAddress(\(aq192.0.2.2\(aq) >= IPAddress(\(aq192.0.2.1\(aq) True >>> IPAddress(\(aq192.0.2.1\(aq) <= IPAddress(\(aq192.0.2.1\(aq) True >>> IPAddress(\(aq192.0.2.1\(aq) <= IPAddress(\(aq192.0.2.2\(aq) True .EE .sp حال بیایید موردی کمی جالب‌تر را بررسی کنیم. .sp .EX >>> IPNetwork(\(aq192.0.2.0/24\(aq) == IPNetwork(\(aq192.0.2.112/24\(aq) True .EE .sp همممم... کمی عجیب به نظر می‌رسد، این‌طور نیست؟ دلیلش این است که به صورت پیش‌فرض، اشیاء IP زیرشبکه‌های خود (یا مرزهای کران پایین و بالا) را با یکدیگر مقایسه می‌کنند نه مقادیر تک‌تک نشانی‌های IP را. .sp راه‌حل این وضعیت بسیار ساده است. با دانستن این رفتار پیش‌فرض، تنها کافی است با استفاده از ویژگی‌های مستقیم، صریحاً مشخص کنید که می‌خواهید دقیقاً کدام بخش از هر شیء IP مقایسه شود. .sp .EX >>> IPNetwork(\(aq192.0.2.0/24\(aq).ip == IPNetwork(\(aq192.0.2.112/24\(aq).ip False >>> IPNetwork(\(aq192.0.2.0/24\(aq).ip < IPNetwork(\(aq192.0.2.112/24\(aq).ip True .EE .sp حالا شد! در صورت تمایل می‌توانید برای مقایسه شبکه‌ها نیز به همین شیوه صریح عمل کنید (اگرچه الزاماً ضروری نیست). .sp .EX >>> IPNetwork(\(aq192.0.2.0/24\(aq).cidr == IPNetwork(\(aq192.0.2.112/24\(aq).cidr True .EE .sp با داشتن این اطلاعات، در ادامه چند نمونه از مقایسه‌های شبکه آورده شده است. .sp .EX >>> IPNetwork(\(aq192.0.2.0/24\(aq) == IPNetwork(\(aq192.0.3.0/24\(aq) False >>> IPNetwork(\(aq192.0.2.0/24\(aq) < IPNetwork(\(aq192.0.3.0/24\(aq) True .EE .sp این موضوع ناگزیر پرسش‌هایی را در مورد مقایسه اشیاء IPAddress (اسکالر) و اشیاء IPNetwork (برداری) با یکدیگر به وجود می‌آورد (یا دست‌کم باید بیاورد). .sp در اینجا نحوه برخورد netaddr با این وضعیت نشان داده شده است. .sp .EX >>> IPAddress(\(aq192.0.2.0\(aq) == IPNetwork(\(aq192.0.2.0/32\(aq) False >>> IPAddress(\(aq192.0.2.0\(aq) != IPNetwork(\(aq192.0.2.0/32\(aq) True .EE .sp یک شبکه یا زیرشبکه IP با یک نشانی IP تکی متفاوت است و بنابراین نمی‌توانند (به‌طور مستقیم) مقایسه شوند. .sp اگر می‌خواهید آن‌ها را با موفقیت مقایسه کنید، باید به طور صریح مشخص کنید که کدام جنبه از شبکه IP را می‌خواهید با نشانی IP مورد نظر مطابقت دهید. .sp چنانچه یک /32 باشد، می‌توانید مانند زیر از اندیس اولین یا آخرین نشانی استفاده کنید: .sp .EX >>> IPAddress(\(aq192.0.2.0\(aq) == IPNetwork(\(aq192.0.2.0/32\(aq)[0] True >>> IPAddress(\(aq192.0.2.0\(aq) == IPNetwork(\(aq192.0.2.0/32\(aq)[\-1] True >>> IPAddress(\(aq192.0.2.0\(aq) != IPNetwork(\(aq192.0.2.0/32\(aq)[0] False .EE .sp همچنین اگر قصد مقایسه نشانی پایه را دارید، می‌توانید از آن استفاده کنید: .sp .EX >>> IPAddress(\(aq192.0.2.0\(aq) == IPNetwork(\(aq192.0.2.0/32\(aq).ip True >>> IPAddress(\(aq192.0.2.0\(aq) != IPNetwork(\(aq192.0.2.0/32\(aq).ip False .EE .sp گرچه ممکن است این رویکرد در ابتدا کمی بیهوده به نظر برسد، اما netaddr تلاش می‌کند تا ضمن مجزا نگه‌داشتن نشانی‌های IP و شبکه‌ها از یکدیگر، تعامل‌پذیری معقولی را نیز میان آن‌ها فراهم سازد..SS پشتیبانی از DNS .sp ایجاد جستجوهای معکوس IP برای DNS یک وظیفه مدیریتی متداول است. این کار به ویژه برای نشانی‌های IPv6 بسیار دشوار و زمان‌بر است. .sp در اینجا نحوه انجام این کار با استفاده از متد \fIreverse_dns()\fP در شیء IPAddress آورده شده است. .sp .EX >>> IPAddress(\(aq172.24.0.13\(aq).reverse_dns \(aq13.0.24.172.in\-addr.arpa.\(aq >>> IPAddress(\(aqfe80::feeb:daed\(aq).reverse_dns \(aqd.e.a.d.b.e.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa.\(aq .EE .sp توجه داشته باشید که از \fBip6.int\fP استفاده نمی‌شود چرا که این دامنه منسوخ شده است (برای جزئیات RFC 3152 را ببینید). .SS محدوده‌های آدرس غیراستاندارد .sp با توجه به پیشینه طولانی نسخه ۴ پروتکل IP، روش CIDR پدیده‌ای نسبتاً جدید به شمار می‌رود؛ از این رو بسیار محتمل است با سیستم‌ها و مستنداتی برخورد کنید که به محدوده‌های نشانی IP در قالب‌هایی غیر از CIDR ارجاع می‌دهند. تبدیل این نوع محدوده‌های دلخواه به CIDR و برعکس، کار چندان خوشایندی نیست. خوشبختانه netaddr تلاش می‌کند با دو کلاس اختصاصی، این کار را برای شما آسان سازد. .SS محدوده‌های دلخواه آدرس IP .sp شما می‌توانید یک محدوده دلخواه نشانی IP را با استفاده از نشانی‌های کران پایین و بالا در قالب یک شیء IPRange نمایش دهید. .sp .EX >>> r1 = IPRange(\(aq192.0.2.1\(aq, \(aq192.0.2.15\(aq) >>> r1 IPRange(\(aq192.0.2.1\(aq, \(aq192.0.2.15\(aq) .EE .sp شما می‌توانید درست مانند یک شیء IPNetwork، روی این محدوده‌ها پیمایش کرده و آن‌ها را اندیس‌گذاری کنید. .sp نکته مهم این است که می‌توانید آن را به معادل CIDR آن نیز تبدیل کنید. .sp .EX >>> r1.cidrs() [IPNetwork(\(aq192.0.2.1/32\(aq), IPNetwork(\(aq192.0.2.2/31\(aq), IPNetwork(\(aq192.0.2.4/30\(aq), IPNetwork(\(aq192.0.2.8/29\(aq)] .EE .sp در ادامه نحوه مقایسه IPRange و IPNetwork منفرد نشان داده شده است. .sp .EX >>> IPRange(\(aq192.0.2.0\(aq, \(aq192.0.2.255\(aq) != IPNetwork(\(aq192.0.2.0/24\(aq) False >>> IPRange(\(aq192.0.2.0\(aq, \(aq192.0.2.255\(aq) == IPNetwork(\(aq192.0.2.0/24\(aq) True .EE .sp ممکن است بخواهید یک محدوده IP را در برابر فهرستی از اشیاء IPAddress و IPNetwork مقایسه کنید. .sp .EX >>> r1 = IPRange(\(aq192.0.2.1\(aq, \(aq192.0.2.15\(aq) >>> addrs = list(r1) >>> addrs [IPAddress(\(aq192.0.2.1\(aq), IPAddress(\(aq192.0.2.2\(aq), IPAddress(\(aq192.0.2.3\(aq), IPAddress(\(aq192.0.2.4\(aq), IPAddress(\(aq192.0.2.5\(aq), IPAddress(\(aq192.0.2.6\(aq), IPAddress(\(aq192.0.2.7\(aq), IPAddress(\(aq192.0.2.8\(aq), IPAddress(\(aq192.0.2.9\(aq), IPAddress(\(aq192.0.2.10\(aq), IPAddress(\(aq192.0.2.11\(aq), IPAddress(\(aq192.0.2.12\(aq), IPAddress(\(aq192.0.2.13\(aq), IPAddress(\(aq192.0.2.14\(aq), IPAddress(\(aq192.0.2.15\(aq)] >>> r1 == addrs False .EE .sp اوه! دقیقاً آن چیزی نشد که دنبالش بودیم یا انتظار داشتیم. .sp راهکار انجام این کار این است که هر دو طرف عملیات مقایسه را به یک نوع و قالب یکسان تبدیل کنیم. .sp .EX >>> list(r1) == addrs True .EE .sp حالا شد، این همان چیزی است که می‌خواستیم. .sp همین موضوع برای اشیاء IPNetwork نیز صدق می‌کند. .sp .EX >>> subnets = r1.cidrs() >>> subnets [IPNetwork(\(aq192.0.2.1/32\(aq), IPNetwork(\(aq192.0.2.2/31\(aq), IPNetwork(\(aq192.0.2.4/30\(aq), IPNetwork(\(aq192.0.2.8/29\(aq)] >>> r1 == subnets False >>> r1.cidrs() == subnets True .EE .sp روش بالا زمانی پاسخ می‌دهد که فهرست مقایسه‌شده شامل یکی از این نوع‌ها باشد، اما اگر فهرستی ترکیبی از \fIIPAddress\fP، \fIIPNetwork\fP و نشانی‌های متنی داشته باشید چه؟ .sp اکنون زمان عملیات‌های کمی قدرتمندتر فرا رسیده است. بیایید از یک کلاس جدید برای کار با گروه‌های نشانی‌های IP و زیرشبکه‌ها استفاده کنیم: کلاس IPSet. .sp .EX >>> ips = [IPAddress(\(aq192.0.2.1\(aq), \(aq192.0.2.2/31\(aq, IPNetwork(\(aq192.0.2.4/31\(aq), IPAddress(\(aq192.0.2.6\(aq), IPAddress(\(aq192.0.2.7\(aq), \(aq192.0.2.8\(aq, \(aq192.0.2.9\(aq, IPAddress(\(aq192.0.2.10\(aq), IPAddress(\(aq192.0.2.11\(aq), IPNetwork(\(aq192.0.2.12/30\(aq)] >>> s1 = IPSet(r1.cidrs()) >>> s2 = IPSet(ips) >>> s2 IPSet([\(aq192.0.2.1/32\(aq, \(aq192.0.2.2/31\(aq, \(aq192.0.2.4/30\(aq, \(aq192.0.2.8/29\(aq]) >>> s1 == s2 True .EE .sp بیایید یکی از عناصر را از یکی از اشیاء IPSet حذف کنیم و ببینیم چه رخ می‌دهد. .sp .EX >>> s2.pop() IPNetwork(\(aq...\(aq) >>> s1 == s2 False .EE .sp شاید این یک مثال ساختگی به نظر برسد، اما برخی از قابلیت‌های ارائه شده را به نمایش می‌گذارد. .sp برای جزئیات بیشتر در مورد این کلاس، آموزش IPSet یعنی Tutorial 3: Working with IP sets \%<> را ببینید..SS محدوده‌های سراسری IP (IP Glob ranges) .sp بسته netaddr همچنین از یک شیوهٔ کاربرپسند برای مشخص کردن محدوده‌های آدرس IP با استفاده از ساختار دستوری سبک «glob» پشتیبانی می‌کند. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 در حال حاضر تنها الگوهای glob برای IPv4 پشتیبانی می‌شوند. .UNINDENT .UNINDENT .sp .EX >>> IPGlob(\(aq192.0.2.*\(aq) == IPNetwork(\(aq192.0.2.0/24\(aq) True .EE .sp .EX >>> IPGlob(\(aq192.0.2.*\(aq) != IPNetwork(\(aq192.0.2.0/24\(aq) False .EE .sp از آنجا که \fIIPGlob\fP یک زیرکلاس از \fIIPRange\fP است، تمام همان عملیات روی آن نیز اعمال‌پذیر هستند. .SS آموزش ۲: آدرس‌های MAC (MAC addresses) .sp پیش از هر چیز لازم است کلاس‌ها و توابع مختلف مرتبط با MAC را به فضای‌نام (namespace) خود وارد کنید. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این کار را صرفاً برای اهداف این بخش آموزشی انجام دهید. در کدهای خود، باید کلاس‌ها، توابع و ثابت‌هایی را که وارد می‌کنید به صورت صریح مشخص نمایید تا از تداخل نام‌ها (name clashes) جلوگیری شود. .UNINDENT .UNINDENT .sp .EX >>> from netaddr import * .EE .sp می‌توانید با اطمینان نسبتاً بالایی همه چیز را از فضای‌نام netaddr وارد کنید، چرا که دقت کافی به عمل آمده تا تنها کلاس‌ها، توابع و ثابت‌های ضروری صادر شوند. .sp در صورتی که در مورد تداخل‌های نام احتمالی نامطمئن هستید، همیشه وارد کردن موارد مورد نیاز را به‌صورت دستی و انتخابی انجام دهید. .SS عملیات پایه (Basic operations) .sp نمونه‌های کلاس EUI برای نمایش آدرس‌های MAC استفاده می‌شوند. .sp .EX >>> mac = EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp دسترسی استاندارد از طریق repr() یک عبارت پایتون برمی‌گرداند که در صورت اجرا در مفسر پایتون، می‌تواند شیء آدرس MAC را از نو بازسازی کند. .sp .EX >>> mac EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp دسترسی به شیء EUI در بستر متنی (رشته‌ای). .sp .EX >>> str(mac) \(aq00\-1B\-77\-49\-54\-FD\(aq >>> \(aq%s\(aq % mac \(aq00\-1B\-77\-49\-54\-FD\(aq .EE .sp در اینجا چند ویژگی متداول دیگر آورده شده است. .sp .EX >>> str(mac), str(mac.oui), mac.ei, mac.version (\(aq00\-1B\-77\-49\-54\-FD\(aq, \(aq00\-1B\-77\(aq, \(aq49\-54\-FD\(aq, 48) .EE .SS نمایش‌های عددی (Numerical representations) .sp می‌توانید یک آدرس MAC تکی را در قالب‌های عددی مختلف دیگری مشاهده کنید. .sp .EX >>> int(mac) == 117965411581 True >>> hex(mac) \(aq0x1b774954fd\(aq >>> oct(mac) \(aq0o1556722252375\(aq >>> mac.bits() \(aq00000000\-00011011\-01110111\-01001001\-01010100\-11111101\(aq >>> mac.bin \(aq0b1101101110111010010010101010011111101\(aq .EE.SS "قالب‌بندی (Formatting)" .sp بسیار رایج است که آدرس MAC در قالب‌های متعددی به‌جز استاندارد معمول IEEE EUI\-48 مشاهده شود. .sp سازنده کلاس EUI از تمامی این قالب‌های رایج پشتیبانی می‌کند. .sp .EX >>> EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp قالب با حروف کوچک IEEE EUI\-48 .sp .EX >>> EUI(\(aq00\-1b\-77\-49\-54\-fd\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp قالب رایج UNIX .sp .EX >>> EUI(\(aq0:1b:77:49:54:fd\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp قالب سه‌تایی هگزت (triple hextet) سیسکو (Cisco) .sp .EX >>> EUI(\(aq001b:7749:54fd\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) >>> EUI(\(aq1b:7749:54fd\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) >>> EUI(\(aq1B:7749:54FD\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp آدرس‌های MAC خام (بدون جداکننده) .sp .EX >>> EUI(\(aq001b774954fd\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) >>> EUI(\(aq01B774954FD\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp قالب PostgreSQL (یافت‌شده در مستندات) .sp .EX >>> EUI(\(aq001B77:4954FD\(aq) EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) .EE .sp همچنین می‌توان قالبی انتخابی را برای خروجی رشته‌ای MAC در قالب یک کلاس \(aqdialect\(aq تعیین کرد. کاربرد آن مشابه کلاس dialect مورد استفاده در ماژول csv کتابخانه استاندارد Python است. .sp .EX >>> mac = EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) >>> mac EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) >>> mac.dialect = mac_unix >>> mac EUI(\(aq0:1b:77:49:54:fd\(aq) >>> mac.dialect = mac_unix_expanded >>> mac EUI(\(aq00:1b:77:49:54:fd\(aq) >>> mac.dialect = mac_cisco >>> mac EUI(\(aq001b.7749.54fd\(aq) >>> mac.dialect = mac_bare >>> mac EUI(\(aq001B774954FD\(aq) >>> mac.dialect = mac_pgsql >>> mac EUI(\(aq001b77:4954fd\(aq) .EE .sp البته در صورتی که گزینه‌های استاندارد پاسخگوی نیازهای شما نباشند، می‌توانید کلاس‌های dialect سفارشی خود را برای تنظیم قالب‌بندی MAC بسازید. .sp در ادامه نمونه‌ای از یک dialect دست‌کاری‌شده UNIX برای MAC آمده است که اکتت‌ها (octets) را با حروف بزرگ و صفرهای پیشین تولید می‌کند. .sp .EX >>> class mac_custom(mac_unix): pass >>> mac_custom.word_fmt = \(aq%.2X\(aq >>> mac = EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq, dialect=mac_custom) >>> mac EUI(\(aq00:1B:77:49:54:FD\(aq) .EE.SS پرس‌وجوی اطلاعات سازمانی .sp شیءهای EUI رابطی به پایگاه‌های دادهٔ ثبت OUI (شناسهٔ منحصربه‌فرد سازمانی یا Organisationally Unique Identifier) و IAB (بلاک آدرس فردی یا Individual Address Block) که توسط IEEE ارائه می‌شوند فراهم می‌کنند. .sp نحوهٔ پرس‌وجوی یک OUI با استفاده از رابط EUI در اینجا آمده است: .sp .EX >>> mac = EUI(\(aq00\-1B\-77\-49\-54\-FD\(aq) >>> oui = mac.oui >>> oui OUI(\(aq00\-1B\-77\(aq) >>> oui.registration().address [\(aqLot 8, Jalan Hi\-Tech 2/3\(aq, \(aqKulim Kedah 09000\(aq, \(aqMY\(aq] >>> oui.registration().org \(aqIntel Corporate\(aq .EE .sp همچنین می‌توانید بدون استفاده از رابط EUI، مستقیماً از شیءهای OUI بهره ببرید. .sp تعداد اندکی از رکوردهای OUI دارای چند مورد ثبت در برابر خود هستند. مشخص نیست که آیا این موضوع برای ثبت اطلاعات تاریخی است یا صرفاً رفتاری غریب در فرایند ثبت IEEE. .sp این مثال نشان می‌دهد که چگونه می‌توانید با مشخص کردن شمارهٔ اندیس، به‌صورت جداگانه به آن‌ها دسترسی پیدا کنید: .sp .EX >>> oui = OUI(524336) # OUI constructor accepts integer values, too. >>> oui OUI(\(aq08\-00\-30\(aq) >>> oui.registration(0).address [\(aq2380 N. ROSE AVENUE\(aq, \(aqOXNARD CA 93010\(aq, \(aqUS\(aq] >>> oui.registration(0).org \(aqNETWORK RESEARCH CORPORATION\(aq >>> oui.registration(0).oui \(aq08\-00\-30\(aq >>> oui.registration(1).address [\(aqGPO BOX 2476V\(aq, \(aqMELBOURNE VIC 3001\(aq, \(aqAU\(aq] >>> oui.registration(1).org \(aqROYAL MELBOURNE INST OF TECH\(aq >>> oui.registration(1).oui \(aq08\-00\-30\(aq >>> oui.registration(2).address [\(aqCH\-1211\(aq, \(aqGENEVE SUISSE/SWITZ 023\(aq, \(aqCH\(aq] >>> oui.registration(2).org \(aqCERN\(aq >>> oui.registration(2).oui \(aq08\-00\-30\(aq >>> for i in range(oui.reg_count): \&... str(oui), oui.registration(i).org \&... (\(aq08\-00\-30\(aq, \(aqNETWORK RESEARCH CORPORATION\(aq) (\(aq08\-00\-30\(aq, \(aqROYAL MELBOURNE INST OF TECH\(aq) (\(aq08\-00\-30\(aq, \(aqCERN\(aq) .EE .sp نحوهٔ پرس‌وجوی یک IAB با استفاده از رابط EUI در اینجا آمده است: .sp .EX >>> mac = EUI(\(aq00\-50\-C2\-00\-0F\-01\(aq) >>> mac.is_iab() True >>> iab = mac.iab >>> iab IAB(\(aq00\-50\-C2\-00\-00\-00\(aq) >>> iab.registration() {\(aqaddress\(aq: [\(aq1241 Superieor Ave E\(aq, \(aqCleveland OH 44114\(aq, \(aqUS\(aq], \(aqiab\(aq: \(aq00\-50\-C2\-00\-00\-00\(aq, \(aqidx\(aq: 84680704, ... \(aqorg\(aq: \(aqT.L.S. Corp.\(aq, \(aqsize\(aq: 537} .EE .SS آموزش ۳: کار با مجموعه‌های IP .sp پیش از هر چیز باید کلاس‌ها و توابع مختلف netaddr را به فضای نام (namespace) خود وارد کنید. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این کار را تنها برای مقاصد این آموزش انجام دهید. در کدهای خود، باید کلاس‌ها، توابع و ثابت‌های وارداتی را به صراحت مشخص کنید تا از تداخل نام‌ها جلوگیری شود. .UNINDENT .UNINDENT .sp .EX >>> from netaddr import * .EE.SS "ایجاد مجموعه‌های IP" .sp در اینجا نحوهٔ ایجاد مجموعه‌های IP آورده شده است. .sp یک مجموعهٔ خالی. .sp .EX >>> IPSet() IPSet([]) >>> IPSet([]) IPSet([]) >>> len(IPSet([])) 0 .EE .sp می‌توانید نشانی‌های IP و شبکه‌ها را به‌صورت رشته مشخص کنید. همچنین می‌توانید از اشیاء IPAddress، IPNetwork، IPRange یا سایر اشیاء IPSet استفاده کنید. .sp .EX >>> IPSet([\(aq192.0.2.0\(aq]) IPSet([\(aq192.0.2.0/32\(aq]) >>> IPSet([IPAddress(\(aq192.0.2.0\(aq)]) IPSet([\(aq192.0.2.0/32\(aq]) >>> IPSet([IPNetwork(\(aq192.0.2.0\(aq)]) IPSet([\(aq192.0.2.0/32\(aq]) >>> IPSet(IPNetwork(\(aq1234::/32\(aq)) IPSet([\(aq1234::/32\(aq]) >>> IPSet([IPNetwork(\(aq192.0.2.0/24\(aq)]) IPSet([\(aq192.0.2.0/24\(aq]) >>> IPSet(IPSet([\(aq192.0.2.0/32\(aq])) IPSet([\(aq192.0.2.0/32\(aq]) >>> IPSet(IPRange(\(dq10.0.0.0\(dq, \(dq10.0.1.31\(dq)) IPSet([\(aq10.0.0.0/24\(aq, \(aq10.0.1.0/27\(aq]) >>> IPSet(IPRange(\(aq0.0.0.0\(aq, \(aq255.255.255.255\(aq)) IPSet([\(aq0.0.0.0/0\(aq]) .EE .sp می‌توانید روی تمامی نشانی‌های IP که عضو مجموعهٔ IP هستند پیمایش کنید. .sp .EX >>> for ip in IPSet([\(aq192.0.2.0/28\(aq, \(aq::ffff:192.0.2.0/124\(aq]): \&... print(ip) 192.0.2.0 192.0.2.1 192.0.2.2 192.0.2.3 192.0.2.4 192.0.2.5 192.0.2.6 192.0.2.7 192.0.2.8 192.0.2.9 192.0.2.10 192.0.2.11 192.0.2.12 192.0.2.13 192.0.2.14 192.0.2.15 ::ffff:192.0.2.0 ::ffff:192.0.2.1 ::ffff:192.0.2.2 ::ffff:192.0.2.3 ::ffff:192.0.2.4 ::ffff:192.0.2.5 ::ffff:192.0.2.6 ::ffff:192.0.2.7 ::ffff:192.0.2.8 ::ffff:192.0.2.9 ::ffff:192.0.2.10 ::ffff:192.0.2.11 ::ffff:192.0.2.12 ::ffff:192.0.2.13 ::ffff:192.0.2.14 ::ffff:192.0.2.15 .EE .SS "افزودن و حذف عناصر مجموعه" .sp .EX >>> s1 = IPSet() >>> s1.add(\(aq192.0.2.0\(aq) >>> s1 IPSet([\(aq192.0.2.0/32\(aq]) >>> s1.remove(\(aq192.0.2.0\(aq) >>> s1 IPSet([]) >>> s1.add(IPRange(\(dq10.0.0.0\(dq, \(dq10.0.0.255\(dq)) >>> s1 IPSet([\(aq10.0.0.0/24\(aq]) >>> s1.remove(IPRange(\(dq10.0.0.128\(dq, \(dq10.10.10.10\(dq)) >>> s1 IPSet([\(aq10.0.0.0/25\(aq]) .EE.SS عضویت در مجموعه (Set membership) .sp در اینجا یک بازه ساده و دلخواه از آدرس‌های IP آورده شده است. .sp .EX >>> iprange = IPRange(\(aq192.0.1.255\(aq, \(aq192.0.2.16\(aq) .EE .sp می‌توانیم شبکه‌های CIDR موجود در این بازه تعریف‌شده را مشاهده کنیم. .sp .EX >>> iprange.cidrs() [IPNetwork(\(aq192.0.1.255/32\(aq), IPNetwork(\(aq192.0.2.0/28\(aq), IPNetwork(\(aq192.0.2.16/32\(aq)] .EE .sp در اینجا یک مجموعه IP آورده شده است. .sp .EX >>> ipset = IPSet([\(aq192.0.2.0/28\(aq]) .EE .sp اکنون بیایید روی آدرس‌های IP موجود در این بازه دلخواه پیمایش کنیم و بررسی کنیم که آیا درون مجموعه IP یافت می‌شوند یا خیر. .sp .EX >>> for ip in iprange: \&... print(ip, ip in ipset) 192.0.1.255 False 192.0.2.0 True 192.0.2.1 True 192.0.2.2 True 192.0.2.3 True 192.0.2.4 True 192.0.2.5 True 192.0.2.6 True 192.0.2.7 True 192.0.2.8 True 192.0.2.9 True 192.0.2.10 True 192.0.2.11 True 192.0.2.12 True 192.0.2.13 True 192.0.2.14 True 192.0.2.15 True 192.0.2.16 False .EE .sp مجموعه‌های IPSet خاص‌تر .sp .EX >>> bigone = IPSet([\(aq0.0.0.0/0\(aq]) >>> IPAddress(\(dq10.0.0.1\(dq) in bigone True >>> IPAddress(\(dq0.0.0.0\(dq) in bigone True >>> IPAddress(\(dq255.255.255.0\(dq) in bigone True >>> IPNetwork(\(dq10.0.0.0/24\(dq) in bigone True >>> IPAddress(\(dq::1\(dq) in bigone False .EE .sp .EX >>> smallone = IPSet([\(dq10.0.0.42/32\(dq]) >>> IPAddress(\(dq10.0.0.42\(dq) in smallone True >>> IPAddress(\(dq10.0.0.41\(dq) in smallone False >>> IPAddress(\(dq10.0.0.43\(dq) in smallone False >>> IPNetwork(\(dq10.0.0.42/32\(dq) in smallone True >>> IPNetwork(\(dq10.0.0.42/31\(dq) in smallone False .EE .SS اجتماع، اشتراک و تفاضل‌ها (Unions, intersections and differences) .sp در اینجا چند مثال از عملیات اجتماع انجام‌شده بر روی اشیاء \fIIPSet\fP آورده شده است. .sp .EX >>> IPSet([\(aq192.0.2.0\(aq]) IPSet([\(aq192.0.2.0/32\(aq]) .EE .sp .EX >>> IPSet([\(aq192.0.2.0\(aq]) | IPSet([\(aq192.0.2.1\(aq]) IPSet([\(aq192.0.2.0/31\(aq]) .EE .sp .EX >>> IPSet([\(aq192.0.2.0\(aq]) | IPSet([\(aq192.0.2.1\(aq]) | IPSet([\(aq192.0.2.3\(aq]) IPSet([\(aq192.0.2.0/31\(aq, \(aq192.0.2.3/32\(aq]) .EE .sp .EX >>> IPSet([\(aq192.0.2.0\(aq]) | IPSet([\(aq192.0.2.1\(aq]) | IPSet([\(aq192.0.2.3/30\(aq]) IPSet([\(aq192.0.2.0/30\(aq]) .EE .sp .EX >>> IPSet([\(aq192.0.2.0\(aq]) | IPSet([\(aq192.0.2.1\(aq]) | IPSet([\(aq192.0.2.3/31\(aq]) IPSet([\(aq192.0.2.0/30\(aq]) .EE .sp .EX >>> IPSet([\(aq192.0.2.0/24\(aq]) | IPSet([\(aq192.0.3.0/24\(aq]) | IPSet([\(aq192.0.4.0/24\(aq]) IPSet([\(aq192.0.2.0/23\(aq, \(aq192.0.4.0/24\(aq]) .EE .sp در اینجا مثالی از به کارگیری هم‌زمان عملیات‌های اجتماع، اشتراک و تفاضل متقارن آورده شده است. .sp .EX >>> adj_cidrs = list(IPNetwork(\(aq192.0.2.0/24\(aq).subnet(28)) >>> even_cidrs = adj_cidrs[::2] >>> evens = IPSet(even_cidrs) >>> evens IPSet([\(aq192.0.2.0/28\(aq, \(aq192.0.2.32/28\(aq, \(aq192.0.2.64/28\(aq, \(aq192.0.2.96/28\(aq, \(aq192.0.2.128/28\(aq, \(aq192.0.2.160/28\(aq, \(aq192.0.2.192/28\(aq, \(aq192.0.2.224/28\(aq]) >>> IPSet([\(aq192.0.2.0/24\(aq]) & evens IPSet([\(aq192.0.2.0/28\(aq, \(aq192.0.2.32/28\(aq, \(aq192.0.2.64/28\(aq, \(aq192.0.2.96/28\(aq, \(aq192.0.2.128/28\(aq, \(aq192.0.2.160/28\(aq, \(aq192.0.2.192/28\(aq, \(aq192.0.2.224/28\(aq]) >>> odds = IPSet([\(aq192.0.2.0/24\(aq]) ^ evens >>> odds IPSet([\(aq192.0.2.16/28\(aq, \(aq192.0.2.48/28\(aq, \(aq192.0.2.80/28\(aq, \(aq192.0.2.112/28\(aq, \(aq192.0.2.144/28\(aq, \(aq192.0.2.176/28\(aq, \(aq192.0.2.208/28\(aq, \(aq192.0.2.240/28\(aq]) >>> evens | odds IPSet([\(aq192.0.2.0/24\(aq]) >>> evens & odds IPSet([]) >>> evens ^ odds IPSet([\(aq192.0.2.0/24\(aq]) .EE.SS "ابرمجموعه‌ها و زیرمجموعه‌ها (Supersets and subsets)" .sp مجموعه‌های IP این امکان را فراهم می‌کنند که بررسی کنید آیا گروهی از بازه‌های آدرس در مجموعه گروه دیگری از بازه‌های آدرس جای می‌گیرند یا خیر. .sp .EX >>> s1 = IPSet([\(aq192.0.2.0/24\(aq, \(aq192.0.4.0/24\(aq]) >>> s2 = IPSet([\(aq192.0.2.0\(aq, \(aq192.0.4.0\(aq]) >>> s1 IPSet([\(aq192.0.2.0/24\(aq, \(aq192.0.4.0/24\(aq]) >>> s2 IPSet([\(aq192.0.2.0/32\(aq, \(aq192.0.4.0/32\(aq]) >>> s1.issuperset(s2) True >>> s2.issubset(s1) True >>> s2.issuperset(s1) False >>> s1.issubset(s2) False .EE .sp در اینجا مثال کامل‌تری با استفاده از بازه‌های مختلف و شناخته‌شده آدرس IPv4 آورده شده است. .sp .EX >>> ipv4_addr_space = IPSet([\(aq0.0.0.0/0\(aq]) >>> private = IPSet([\(aq10.0.0.0/8\(aq, \(aq172.16.0.0/12\(aq, \(aq192.0.2.0/24\(aq, \(aq192.168.0.0/16\(aq, \(aq239.192.0.0/14\(aq]) >>> reserved = IPSet([\(aq225.0.0.0/8\(aq, \(aq226.0.0.0/7\(aq, \(aq228.0.0.0/6\(aq, \(aq234.0.0.0/7\(aq, \(aq236.0.0.0/7\(aq, \(aq238.0.0.0/8\(aq, \(aq240.0.0.0/4\(aq]) >>> unavailable = reserved | private >>> available = ipv4_addr_space ^ unavailable .EE .sp بیایید ببینیم چه چیزی به دست آورده‌ایم: .sp .EX >>> for cidr in available.iter_cidrs(): \&... print(cidr, cidr[0], cidr[\-1]) 0.0.0.0/5 0.0.0.0 7.255.255.255 8.0.0.0/7 8.0.0.0 9.255.255.255 11.0.0.0/8 11.0.0.0 11.255.255.255 12.0.0.0/6 12.0.0.0 15.255.255.255 16.0.0.0/4 16.0.0.0 31.255.255.255 32.0.0.0/3 32.0.0.0 63.255.255.255 64.0.0.0/2 64.0.0.0 127.255.255.255 128.0.0.0/3 128.0.0.0 159.255.255.255 160.0.0.0/5 160.0.0.0 167.255.255.255 168.0.0.0/6 168.0.0.0 171.255.255.255 172.0.0.0/12 172.0.0.0 172.15.255.255 172.32.0.0/11 172.32.0.0 172.63.255.255 172.64.0.0/10 172.64.0.0 172.127.255.255 172.128.0.0/9 172.128.0.0 172.255.255.255 173.0.0.0/8 173.0.0.0 173.255.255.255 174.0.0.0/7 174.0.0.0 175.255.255.255 176.0.0.0/4 176.0.0.0 191.255.255.255 192.0.0.0/23 192.0.0.0 192.0.1.255 192.0.3.0/24 192.0.3.0 192.0.3.255 192.0.4.0/22 192.0.4.0 192.0.7.255 192.0.8.0/21 192.0.8.0 192.0.15.255 192.0.16.0/20 192.0.16.0 192.0.31.255 192.0.32.0/19 192.0.32.0 192.0.63.255 192.0.64.0/18 192.0.64.0 192.0.127.255 192.0.128.0/17 192.0.128.0 192.0.255.255 192.1.0.0/16 192.1.0.0 192.1.255.255 192.2.0.0/15 192.2.0.0 192.3.255.255 192.4.0.0/14 192.4.0.0 192.7.255.255 192.8.0.0/13 192.8.0.0 192.15.255.255 192.16.0.0/12 192.16.0.0 192.31.255.255 192.32.0.0/11 192.32.0.0 192.63.255.255 192.64.0.0/10 192.64.0.0 192.127.255.255 192.128.0.0/11 192.128.0.0 192.159.255.255 192.160.0.0/13 192.160.0.0 192.167.255.255 192.169.0.0/16 192.169.0.0 192.169.255.255 192.170.0.0/15 192.170.0.0 192.171.255.255 192.172.0.0/14 192.172.0.0 192.175.255.255 192.176.0.0/12 192.176.0.0 192.191.255.255 192.192.0.0/10 192.192.0.0 192.255.255.255 193.0.0.0/8 193.0.0.0 193.255.255.255 194.0.0.0/7 194.0.0.0 195.255.255.255 196.0.0.0/6 196.0.0.0 199.255.255.255 200.0.0.0/5 200.0.0.0 207.255.255.255 208.0.0.0/4 208.0.0.0 223.255.255.255 224.0.0.0/8 224.0.0.0 224.255.255.255 232.0.0.0/7 232.0.0.0 233.255.255.255 239.0.0.0/9 239.0.0.0 239.127.255.255 239.128.0.0/10 239.128.0.0 239.191.255.255 239.196.0.0/14 239.196.0.0 239.199.255.255 239.200.0.0/13 239.200.0.0 239.207.255.255 239.208.0.0/12 239.208.0.0 239.223.255.255 239.224.0.0/11 239.224.0.0 239.255.255.255 .EE .sp .EX >>> ipv4_addr_space ^ available IPSet([\(aq10.0.0.0/8\(aq, \(aq172.16.0.0/12\(aq, \(aq192.0.2.0/24\(aq, \(aq192.168.0.0/16\(aq, \(aq225.0.0.0/8\(aq, \(aq226.0.0.0/7\(aq, \(aq228.0.0.0/6\(aq, \(aq234.0.0.0/7\(aq, \(aq236.0.0.0/7\(aq, \(aq238.0.0.0/8\(aq, \(aq239.192.0.0/14\(aq, \(aq240.0.0.0/4\(aq]) .EE.SS پشتیبانی ترکیبی از IPv4 و IPv6 .sp در راستای رویکرد عمل‌گرایانه netaddr، شما می‌توانید به دلخواه IPv4 و IPv6 را در یک ساختار داده یکسان ترکیب کنید. .sp .EX >>> s1 = IPSet([\(aq192.0.2.0\(aq, \(aq::ffff:192.0.2.0\(aq, \(aq192.0.2.2\(aq, \(aq::ffff:192.0.2.2\(aq]) >>> s2 = IPSet([\(aq192.0.2.2\(aq, \(aq::ffff:192.0.2.2\(aq, \(aq192.0.2.4\(aq, \(aq::ffff:192.0.2.4\(aq]) .EE .sp .EX >>> s1 IPSet([\(aq192.0.2.0/32\(aq, \(aq192.0.2.2/32\(aq, \(aq::ffff:192.0.2.0/128\(aq, \(aq::ffff:192.0.2.2/128\(aq]) >>> s2 IPSet([\(aq192.0.2.2/32\(aq, \(aq192.0.2.4/32\(aq, \(aq::ffff:192.0.2.2/128\(aq, \(aq::ffff:192.0.2.4/128\(aq]) .EE .SS اجتماع مجموعه‌های IPv4 و IPv6 .sp .EX >>> s1 | s2 IPSet([\(aq192.0.2.0/32\(aq, \(aq192.0.2.2/32\(aq, \(aq192.0.2.4/32\(aq, \(aq::ffff:192.0.2.0/128\(aq, \(aq::ffff:192.0.2.2/128\(aq, \(aq::ffff:192.0.2.4/128\(aq]) >>> s2 | s1 IPSet([\(aq192.0.2.0/32\(aq, \(aq192.0.2.2/32\(aq, \(aq192.0.2.4/32\(aq, \(aq::ffff:192.0.2.0/128\(aq, \(aq::ffff:192.0.2.2/128\(aq, \(aq::ffff:192.0.2.4/128\(aq]) .EE .SS اشتراک مجموعه .sp .EX >>> s1 & s2 IPSet([\(aq192.0.2.2/32\(aq, \(aq::ffff:192.0.2.2/128\(aq]) .EE .SS تفاضل مجموعه .sp .EX >>> s1 \- s2 IPSet([\(aq192.0.2.0/32\(aq, \(aq::ffff:192.0.2.0/128\(aq]) >>> s2 \- s1 IPSet([\(aq192.0.2.4/32\(aq, \(aq::ffff:192.0.2.4/128\(aq]) .EE .SS تفاضل متقارن مجموعه .sp .EX >>> s1 ^ s2 IPSet([\(aq192.0.2.0/32\(aq, \(aq192.0.2.4/32\(aq, \(aq::ffff:192.0.2.0/128\(aq, \(aq::ffff:192.0.2.4/128\(aq]) .EE .SS مجموعه‌های IP مجزا .sp .EX >>> s1 = IPSet([\(aq192.0.2.0\(aq, \(aq192.0.2.1\(aq, \(aq192.0.2.2\(aq]) >>> s2 = IPSet([\(aq192.0.2.2\(aq, \(aq192.0.2.3\(aq, \(aq192.0.2.4\(aq]) >>> s1 & s2 IPSet([\(aq192.0.2.2/32\(aq]) >>> s1.isdisjoint(s2) False >>> s1 = IPSet([\(aq192.0.2.0\(aq, \(aq192.0.2.1\(aq]) >>> s2 = IPSet([\(aq192.0.2.3\(aq, \(aq192.0.2.4\(aq]) >>> s1 & s2 IPSet([]) >>> s1.isdisjoint(s2) True .EE .SS به‌روزرسانی یک مجموعه IP .sp همانند یک مجموعه معمولی در Python، می‌توانید یک مجموعه IP را نیز با محتویات مجموعه‌ای دیگر به‌روزرسانی کنید. .sp .EX >>> s1 = IPSet([\(aq192.0.2.0/25\(aq]) >>> s1 IPSet([\(aq192.0.2.0/25\(aq]) >>> s2 = IPSet([\(aq192.0.2.128/25\(aq]) >>> s2 IPSet([\(aq192.0.2.128/25\(aq]) >>> s1.update(s2) >>> s1 IPSet([\(aq192.0.2.0/24\(aq]) >>> s1.update([\(aq192.0.0.0/24\(aq, \(aq192.0.1.0/24\(aq, \(aq192.0.3.0/24\(aq]) >>> s1 IPSet([\(aq192.0.0.0/22\(aq]) .EE .sp .EX >>> s2 = IPSet([\(aq10.0.0.0/16\(aq]) >>> s2.update(IPRange(\(aq10.1.0.0\(aq, \(aq10.1.255.255\(aq)) >>> s2 IPSet([\(aq10.0.0.0/15\(aq]) .EE .sp .EX >>> s2.clear() >>> s2 IPSet([]) .EE.SS حذف عناصر از یک IP set .sp حذف یک آدرس IP از یک IPSet، زیرشبکه‌های CIDR درون آن را به بخش‌های تشکیل‌دهنده‌شان تقسیم می‌کند. .sp در اینجا مجموعه‌ای ایجاد می‌کنیم که کل فضای آدرس IPv4 را نشان می‌دهد. .sp .EX >>> s1 = IPSet([\(aq0.0.0.0/0\(aq]) >>> s1 IPSet([\(aq0.0.0.0/0\(aq]) .EE .sp سپس آخرین آدرس را حذف می‌کنیم. .sp .EX >>> s1.remove(\(aq255.255.255.255\(aq) .EE .sp که نتیجه به این صورت خواهد بود: .sp .EX >>> s1 IPSet([\(aq0.0.0.0/1\(aq, \(aq128.0.0.0/2\(aq, ..., \(aq255.255.255.252/31\(aq, \(aq255.255.255.254/32\(aq]) >>> list(s1.iter_cidrs()) [IPNetwork(\(aq0.0.0.0/1\(aq), IPNetwork(\(aq128.0.0.0/2\(aq), ..., IPNetwork(\(aq255.255.255.252/31\(aq), IPNetwork(\(aq255.255.255.254/32\(aq)] >>> len(list(s1.iter_cidrs())) 32 .EE .sp بیایید نتیجه را با استفاده از تابع \fIcidr_exclude\fP بررسی کنیم. .sp .EX >>> list(s1.iter_cidrs()) == cidr_exclude(\(aq0.0.0.0/0\(aq, \(aq255.255.255.255\(aq) True .EE .sp سپس، نخستین آدرس را از بازه اصلی حذف می‌کنیم. .sp .EX >>> s1.remove(\(aq0.0.0.0\(aq) .EE .sp این کار زیرشبکه‌های CIDR را بیش از پیش خرد می‌کند. .sp .EX >>> s1 IPSet([\(aq0.0.0.1/32\(aq, \(aq0.0.0.2/31\(aq, ..., \(aq255.255.255.252/31\(aq, \(aq255.255.255.254/32\(aq]) >>> len(list(s1.iter_cidrs())) 62 .EE .sp می‌توانید به این کار ادامه دهید، اما آگاه باشید که مجموعه‌های IP بزرگ در صورتی که شامل چندین هزار مدخل باشند، ممکن است حافظه زیادی را مصرف کنند. .SS افزودن عناصر به یک IP set .sp بیایید مجموعه IP خردشده در بخش قبلی را با افزودن مجدد آدرس‌های IP حذف‌شده، ترمیم کنیم. .sp .EX >>> s1.add(\(aq255.255.255.255\(aq) >>> s1 IPSet([\(aq0.0.0.1/32\(aq, \(aq0.0.0.2/31\(aq, ..., \(aq64.0.0.0/2\(aq, \(aq128.0.0.0/1\(aq]) .EE .sp بهتر شد. .sp .EX >>> list(s1.iter_cidrs()) [IPNetwork(\(aq0.0.0.1/32\(aq), IPNetwork(\(aq0.0.0.2/31\(aq), ..., IPNetwork(\(aq64.0.0.0/2\(aq), IPNetwork(\(aq128.0.0.0/1\(aq)] .EE .sp .EX >>> len(list(s1.iter_cidrs())) 32 .EE .sp آدرس IP دیگر را مجدداً اضافه می‌کنیم. .sp .EX >>> s1.add(\(aq0.0.0.0\(aq) .EE .sp و به آدرس اصلی خود بازمی‌گردیم. .sp .EX >>> s1 IPSet([\(aq0.0.0.0/0\(aq]) .EE.SS تبدیل یک IP set به یک IP Range .sp گاهی اوقات ممکن است بخواهید یک IPSet را مجدداً به یک IPRange تبدیل کنید. .sp .EX >>> s1 = IPSet([\(aq10.0.0.0/25\(aq, \(aq10.0.0.128/25\(aq]) >>> s1.iprange() IPRange(\(aq10.0.0.0\(aq, \(aq10.0.0.255\(aq) .EE .sp این کار تنها در صورتی امکان‌پذیر است که IPSet پیوسته باشد .sp .EX >>> s1.iscontiguous() True >>> s1.remove(\(aq10.0.0.16\(aq) >>> s1 IPSet([\(aq10.0.0.0/28\(aq, \(aq10.0.0.17/32\(aq, \(aq10.0.0.18/31\(aq, \(aq10.0.0.20/30\(aq, \(aq10.0.0.24/29\(aq, \(aq10.0.0.32/27\(aq, \(aq10.0.0.64/26\(aq, \(aq10.0.0.128/25\(aq]) >>> s1.iscontiguous() False >>> s1.iprange() Traceback (most recent call last): File \(dq\(dq, line 1, in ValueError: IPSet is not contiguous .EE .sp اگر پیوسته نباشد، همچنان می‌توانید IPSet را تبدیل کنید، اما چندین IPRange دریافت خواهید کرد. >>> list(s1.iter_ipranges()) [IPRange(\(aq10.0.0.0\(aq, \(aq10.0.0.15\(aq), IPRange(\(aq10.0.0.17\(aq, \(aq10.0.0.255\(aq)] .sp .EX >>> s2 = IPSet([\(aq0.0.0.0/0\(aq]) >>> s2.iscontiguous() True >>> s2.iprange() IPRange(\(aq0.0.0.0\(aq, \(aq255.255.255.255\(aq) .EE .sp .EX >>> s3 = IPSet() >>> s3.iscontiguous() True >>> s3.iprange() .EE .sp .EX >>> s4 = IPSet(IPRange(\(aq10.0.0.0\(aq, \(aq10.0.0.8\(aq)) >>> s4.iscontiguous() True .EE .SS ترتیبی‌سازی (Pickling) اشیاء IPSet .sp مشابه تمام کلاس‌های دیگر netaddr، می‌توانید از \fBpickle\fP برای ماندگارسازی IP setها جهت استفاده‌های بعدی استفاده کنید. .sp .EX >>> import pickle >>> ip_data = IPSet([\(aq10.0.0.0/16\(aq, \(aqfe80::/64\(aq]) >>> buf = pickle.dumps(ip_data) >>> ip_data_unpickled = pickle.loads(buf) >>> ip_data == ip_data_unpickled True .EE .SS مقایسه اشیاء IPSet .sp .EX >>> x = IPSet([\(aqfc00::/2\(aq]) >>> y = IPSet([\(aqfc00::/3\(aq]) .EE .sp .EX >>> x > y True .EE .sp .EX >>> x < y False .EE .sp .EX >>> x != y True .EE.SH "راهنماهای کاربردی (HOW-TO GUIDES)" .sp صفحات این بخش به صورت دستورالعمل بوده و مراحلی را برای حل مشکلات و موارد استفاده رایج ارائه می‌دهند. .SS نحوه نصب netaddr .sp توزیع‌های مختلف لینوکس آن را از طریق مدیرهای بسته خود در دسترس قرار می‌دهند. .SS نصب از مخزن بسته‌های پایتون (PyPI) .sp ساده‌ترین راه برای نصب netaddr استفاده از pip است. .sp آخرین نسخه را از PyPI دریافت و نصب کنید \- \% و دستور زیر را اجرا نمایید: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install netaddr .EE .UNINDENT .UNINDENT .sp اگر تجربه بهتری در پوسته تعاملی \%<#\:interactive-shell> می‌خواهید، می‌توانید وابستگی اضافی IPython را بدین صورت نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install \(aqnetaddr[nicer\-shell]\(aq .EE .UNINDENT .UNINDENT .sp یا مستقیماً IPython را نصب نمایید: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install ipython .EE .UNINDENT .UNINDENT .SS نصب با استفاده از مدیر بسته توزیع لینوکس شما .sp توزیع‌های مختلف لینوکس netaddr را از طریق مدیرهای بسته خود ارائه می‌دهند. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 نسخه‌های netaddr ارائه‌شده توسط توزیع‌های لینوکس ممکن است قدیمی باشند. .UNINDENT .UNINDENT .sp برای دستورالعمل‌های نصب به مستندات توزیع خود مراجعه کنید. .sp دستورهای نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX # Debian, Ubuntu sudo apt install python3\-netaddr # Fedora # Base installation sudo dnf install python3\-netaddr # The CLI tool sudo dnf install python3\-netaddr\-shell .EE .UNINDENT .UNINDENT .SS نصب از یک بسته منبع .sp آخرین فایل tarball/zip منتشرشده را دریافت کرده و آن را در یک دایرکتوری موقت استخراج کنید یا مخزن را در یک دایرکتوری کاری محلی کلون نمایید. .sp بسته محلی را نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install . .EE .UNINDENT .UNINDENT .sp این کار فایل‌های مورد نیاز را به‌طور خودکار در دایرکتوری \fBlib/site\-packages\fP از نسخه پایتونی که برای اجرای اسکریپت نصب استفاده کرده‌اید قرار می‌دهد؛ همچنین ممکن است بخشی از یک virtualenv یا مدیر محیط مشابه باشد..SH "مرجع (REFERENCE)" .sp صفحات این بخش شامل توصیف فنی بخش‌های گوناگون سازوکار netaddr است. .SS سازگاری .SS نسخه‌های پشتیبانی‌شدهٔ Python .sp netaddr از نسخه‌های پایتون زیر (CPython و PyPy) پشتیبانی می‌کند: .INDENT 0.0 .IP \(bu 2 3.7 .IP \(bu 2 3.8 .IP \(bu 2 3.9 .IP \(bu 2 3.10 .IP \(bu 2 3.11 .IP \(bu 2 3.12 .UNINDENT .sp پشتیبانی از نسخه‌های زیر در 1.0.0 حذف شده است: .INDENT 0.0 .IP \(bu 2 2.7 .IP \(bu 2 3.5 .IP \(bu 2 3.6 .UNINDENT .sp پشتیبانی \fBمنسوخ شده و برای حذف برنامه‌ریزی شده است\fP در netaddr 2: .INDENT 0.0 .IP \(bu 2 3.7 .UNINDENT .SS سیستم‌عامل‌های پشتیبانی‌شده .sp این کتابخانه مستقل از سیستم‌عامل است. .SS معماری‌های سخت‌افزاری پشتیبانی‌شده .sp این کتابخانه مستقل از معماری سخت‌افزار است. .SS مرجع API .sp این صفحه API عمومی netaddr را مستند می‌کند. تنها مواردی که صراحتاً در این مستندات ذکر شده‌اند پشتیبانی می‌شوند و بخشی از API عمومی به شمار می‌روند. .sp هر یک از موارد زیر خصوصی و پشتیبانی‌نشده در نظر گرفته می‌شوند: .INDENT 0.0 .IP \(bu 2 هر چیزی درون هر یک از زیرماژول‌های \fBnetaddr\fP (\fBfrom netaddr.X import Y\fP) .IP \(bu 2 هر چیزی با نامی که با یک زیرخط آغاز شود (\fB_X\fP) .IP \(bu 2 هر چیزی که صراحتاً به‌عنوان بخشی از API عمومی مستند نشده باشد .UNINDENT .SS سلسله‌مراتب کلاس‌های IP .sp در اینجا سلسله‌مراتب کلاس‌ها برای کلاس‌های مرتبط با IP آمده است: .INDENT 0.0 .INDENT 3.5 .sp .EX +\-\-\-\-\-\-\-\-\-+ +\-\-\-\-\-\-\-\-\-+ | ipv4(M) | | ipv6(M) | +\-\-\-\-\-\-\-\-\-+ +\-\-\-\-\-\-\-\-\-+ | | (HAS A) (HAS A) | | +\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | | +\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-+ | | | | | | | | | | | | v v v v | | +\-\-\-\-\-\-\-\-\-\-\-+ +\-\-\-\-\-\-\-\-\-\-\-+ | | | IPAddress | | IPNetwork | | | +\-\-\-\-\-\-\-\-\-\-\-+ +\-\-\-\-\-\-\-\-\-\-\-+ | | | | | | (HAS A) (HAS A) | | | | v v +\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-+ +\-\-\-\-\-\-\-\-\-\-\-\-+ | | IPRange | | +\-\-\-\-\-\-\-\-\-\-\-+ v | +\-\-\-\-\-\-\-+ | | IPSet | v +\-\-\-\-\-\-\-+ +\-\-\-\-\-\-\-\-+ | IPGlob | +\-\-\-\-\-\-\-\-+ .EE .UNINDENT .UNINDENT.SS ثابت‌ها .sp ثابت‌های زیر توسط آرگومان‌های گوناگون \fIflags\fP در سازنده‌های کلاس netaddr به کار می‌روند. .INDENT 0.0 .TP .B netaddr.INET_PTON استفاده از معناشناسی inet_pton() به جای inet_aton() هنگام تجزیهٔ IPv4. .sp برای جزئیات بیشتر به مستندات \fBIPAddress.__init__()\fP مراجعه کنید. .sp در نسخهٔ 1.0.0 تغییر کرد: رد کردن صفرهای ابتدایی صرف‌نظر از پلتفرم آغاز شد (قبلاً در برخی پلتفرم‌ها مجاز بود). .UNINDENT .INDENT 0.0 .TP .B netaddr.INET_ATON استفاده از معناشناسی \fBinet_aton()\fP هنگام تجزیهٔ IPv4. .sp برای جزئیات بیشتر به مستندات \fBIPAddress.__init__()\fP مراجعه کنید. .sp در نسخهٔ 0.10.0 اضافه شد. .UNINDENT .INDENT 0.0 .TP .B netaddr.ZEROFILL حذف هرگونه صفر ابتدایی از اوکتت‌های نشانی IPv4 پیش از تجزیه. .sp برای جزئیات بیشتر به مستندات \fBIPAddress.__init__()\fP مراجعه کنید. .UNINDENT .INDENT 0.0 .TP .B netaddr.NOHOST حذف هرگونه بیت‌های میزبان یافت‌شده در سمت راست پیشوند اعمال‌شدهٔ CIDR. .sp برای جزئیات بیشتر به مستندات \fBIPNetwork.__init__()\fP مراجعه کنید. .UNINDENT .SS استثناهای سفارشی .SS نشانی‌های IP .sp نشانی IP یک نشانی مجازی است که برای شناسایی مبدأ و مقصد بسته‌های (لایهٔ ۳) منتقل‌شده میان میزبان‌ها در یک شبکهٔ سوئیچ‌شده استفاده می‌شود. این کتابخانه به‌طور کامل از هر دو استاندارد IPv4 و استاندارد جدیدتر IPv6 پشتیبانی می‌کند. .sp کلاس \fIIPAddress\fP برای شناسایی نشانی‌های IP منفرد به کار می‌رود. .SS گویش‌های قالب‌بندی IPv6 .sp کلاس‌های گویش زیر می‌توانند با متد IPAddress.format استفاده شوند. .SS شبکه‌ها و زیرشبکه‌های IP .sp کلاس \fIIPNetwork\fP برای نمایش گروهی از نشانی‌های IP استفاده می‌شود که یک شبکه/زیرشبکه/VLAN شامل میزبان‌ها را تشکیل می‌دهند. .sp امروزه، شبکه‌های IP معمولاً با استفاده از قالب CIDR به همراه یک پیشوند مشخص‌کنندهٔ اندازهٔ netmask تعیین می‌شوند. در دنیای واقعی، روش‌های متعددی برای بیان یک \(dqشبکه\(dq وجود دارد و انعطاف‌پذیری سازندهٔ کلاس \fIIPNetwork\fP بازتاب‌دهندهٔ این موضوع است. .SS محدوده‌های دلخواه نشانی IP .sp کتابخانهٔ netaddr طوری طراحی شده است تا روش‌های گوناگونی را که در آن‌ها گروه‌هایی از نشانی‌های IP و شبکه‌های IP مشخص می‌شوند پوشش دهد؛ نه تنها در پیکربندی‌های مسیریاب، بلکه در شکل‌های کمتر استاندارد اما خواناتر برای انسان که برای نمونه در فایل‌های پیکربندی یافت می‌شوند. .sp گزینه‌هایی که در حال حاضر در دسترس هستند در ادامه آمده‌اند. .SS محدوده‌های کران‌دار .sp یک محدودهٔ کران‌دار، گروهی از نشانی‌های IP است که با استفاده از یک نشانی آغازین و یک نشانی پایانی مشخص شده و یک بلوک پیوسته را تشکیل می‌دهند. هیچ مرز بیتی مفروض نیست، اما نشانی پایانی باید از نظر عددی بزرگ‌تر یا مساوی نشانی آغازین باشد. .SS محدوده‌های IP glob .sp روشی بسیار کاربردی برای نمایش شبکهٔ IP در فایل‌های پیکربندی و در خط فرمان برای کسانی که با CIDR آشنایی ندارند. .sp کلاس \fIIPGlob\fP برای نمایش تک‌تک محدوده‌های glob به کار می‌رود. .SS توابع globbing .sp توانایی تبدیل بین محدوده‌های glob و محدوده‌های CIDR و IP نیز بسیار کاربردی است. تابع زیر این تبدیل‌های گوناگون را امکان‌پذیر می‌سازد. .SS محدوده‌های \fBnmap\fP .sp ابزار \fBnmap\fP یک ابزار شناخته‌شدهٔ امنیت شبکه است. این ابزار روش انعطاف‌پذیر ویژه‌ای برای تعیین گروه‌بندی‌های نشانی IP دارد. .sp توابعی ارائه شده‌اند که امکان اعتبارسنجی و شمارش نشانی‌های IP مشخص‌شده در این قالب را فراهم می‌کنند. .SS مجموعه‌های IP .sp هنگام کار با تعداد زیادی از نشانی‌ها و محدوده‌های IP، اغلب دستکاری آن‌ها به عنوان مجموعه مفید است تا بتوانید اشتراک، اجتماع و تفاضل میان گروه‌های گوناگون آن‌ها را محاسبه کنید. .sp کلاس \fIIPSet\fP مشخصاً برای همین هدف ساخته شده است. .SS توابع و مولدهای IP .sp موارد زیر مجموعه‌ای از توابع کمکی کاربردی مرتبط با قالب‌های گوناگون پشتیبانی‌شده در این کتابخانه هستند..SS آدرس‌های MAC و استاندارد IEEE EUI .sp یک آدرس MAC، یک آدرس سخت‌افزاری 48\-بیتی مرتبط با یک رابط فیزیکی مشخص در یک میزبان شبکه‌ای است. آن‌ها در تمامی دستگاه‌های شبکه‌ای یافت می‌شوند و برای شناسایی فریم‌ها (در لایه ۲) در پشته شبکه به کار می‌روند. .sp از کلاس \fIEUI\fP برای نمایش آدرس‌های MAC (و همچنین نمونه‌های بزرگ‌تر و کمتر رایج 64\-بیتی آن‌ها) استفاده می‌شود. .SS گویش‌های قالب‌بندی MAC .sp از گویش‌های زیر برای مشخص کردن قالب‌بندی آدرس‌های MAC استفاده می‌شود. .SS توابع اعتبارسنجی .SS کمی سرگرمی .sp چه کسی گفته شبکه همیشه باید خشک و جدی باشد؟ همیشه خوب است که فضا را تلطیف کنیم و کمی سرگرمی داشته باشیم. .sp بیایید واقع‌بین باشیم؛ هیچ کتابخانه شبکهٔ درست‌وحسابی بدون پشتیبانی از RFC 1924 \- \% کامل نخواهد بود \fB:\-)\fP .SS ابزار خط فرمان (CLI) .sp بسته netaddr شامل یک برنامه خط فرمانی \fBnetaddr\fP است. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این ابزار برای استفاده کاربران انسانی در نظر گرفته شده است. رابط کاربری آن را نباید پایدار فرض کرد. هنگام استفاده از آن در هرگونه بستر برنامه‌نویسی (بخوانید: اسکریپت‌نویسی) احتیاط کنید. .sp اگر به یک رابط پایدار نیاز دارید از API برنامه‌نویسی \%<>\& استفاده کنید. .UNINDENT .UNINDENT .sp برای مشاهده نحوه استفاده: .INDENT 0.0 .INDENT 3.5 .sp .EX % netaddr \-\-help __ __ __ ____ ___ / /_____ _____/ /___/ /____ / __ \e/ _ \e/ __/ __ \(ga/ __ / __ / ___/ / / / / __/ /_/ /_/ / /_/ / /_/ / / /_/ /_/\e___/\e__/\e__,_/\e__,_/\e__,_/_/ usage: netaddr [\-h] The netaddr CLI tool options: \-h, \-\-help show this help message and exit Share and enjoy! .EE .UNINDENT .UNINDENT .SS پوسته تعاملی .sp فراخوانی \fBnetaddr\fP بدون هیچ آرگومانی یک پوسته تعاملی را اجرا می‌کند. .sp این پوسته در صورت در دسترس بودن از IPython \% و در غیر این صورت از REPL توکار Python استفاده می‌کند. REPL مربوط به IPython قابلیت‌های بیشتری دارد و در مجموع تجربه کاربری بهتری ارائه می‌دهد. .sp این پوسته تمام بخش‌های API مربوط به netaddr \%<> را از پیش وارد می‌کند (pre\-imported) تا بتوانید بلافاصله و با کمترین زحمت با آن کار کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX % netaddr __ __ __ ____ ___ / /_____ _____/ /___/ /____ / __ \e/ _ \e/ __/ __ \(ga/ __ / __ / ___/ / / / / __/ /_/ /_/ / /_/ / /_/ / / /_/ /_/\e___/\e__/\e__,_/\e__,_/\e__,_/_/ netaddr shell 1.0.0 \- an interactive shell for the netaddr library In [1]: \(aq10.0.0.2\(aq in IPNetwork(\(aq10.0.0.0/24\(aq) Out[1]: True In [2]: .EE .UNINDENT .UNINDENT .sp تغییریافته در نسخه 1.2.0: وابستگی به IPython اختیاری شد..SS اطلاعات شبکه .sp برای نمایش اطلاعات یک شبکه IP، دستور \fBnetaddr info \fP را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX % netaddr info 192.2.2.27/24 __ __ __ ____ ___ / /_____ _____/ /___/ /____ / __ \e/ _ \e/ __/ __ \(ga/ __ / __ / ___/ / / / / __/ /_/ /_/ / /_/ / /_/ / / /_/ /_/\e___/\e__/\e__,_/\e__,_/\e__,_/_/ IP network information CIDR 192.2.2.0/24 Network IP 192.2.2.0 Network IP (binary) 11000000.00000010.00000010.00000000 Network IP (decimal) 3221357056 Network IP (hex) 0xc0020200 Subnet mask 255.255.255.0 Subnet mask (binary) 11111111.11111111.11111111.00000000 Broadcast IP 192.2.2.255 Range 192.2.2.0\-192.2.2.255 Total addresses 256 Usable range 192.2.2.1\-192.2.2.254 Usable addresses 254 .EE .UNINDENT .UNINDENT .SS استانداردها و مراجع .sp مراجع زیر برای کتابخانه netaddr کاربرد دارند. .SS RFCها .sp RFCهای زیر راهنمای مجموعه ویژگی‌ها و قابلیت‌های netaddr بوده‌اند. .SS IPv4 .INDENT 0.0 .TP .B RFC 791 \- Internet Protocol .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 1918 \- Address Allocation for Private Internets .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3330 \- Special\-Use IPv4 Addresses .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3927 \- Dynamic Configuration of IPv4 Link\-Local Addresses .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .UNINDENT .SS چندپخشی (IPv4) .INDENT 0.0 .TP .B RFC 2365 \- Administratively Scoped IP Multicast .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3171 \- IANA IPv4 Multicast Guidelines .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3927 \- Dynamic Configuration of IPv4 Link\-Local Addresses .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .UNINDENT.SS IPv6 .INDENT 0.0 .TP .B RFC 3330 \- نشانی‌های IPv4 با کاربرد ویژه .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 4291 \- معماری نشانی‌دهی IPv6 .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3306 \- چندپخشی IPv6 بر پایه پیشوند Unicast .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3956 \- نشانی RP در نشانی چندپخشی IPv6 .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 3879 \- منسوخ‌سازی نشانی‌های محلی سایت (Site Local) .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 4193 \- نشانی‌های Unicast محلی یکتای IPv6 .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 4941 \- افزونه‌های حریم خصوصی برای نشانی‌های بدون حالت .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 1924 \- نمایشی فشرده از نشانی‌های IPv6 .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .UNINDENT .SS مسیریابی بین‌دامنه‌ای بدون رده (CIDR) .INDENT 0.0 .TP .B RFC 1338 \- سوپرنتینگ (Supernetting): یک راهبرد تخصیص و تجمیع نشانی .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B RFC 4632 \- مسیریابی بین‌دامنه‌ای بدون رده (CIDR): طرح تخصیص و تجمیع نشانی اینترنت .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .UNINDENT .SS منابع داده .sp داده‌های برگرفته از منابع زیر از طریق API بسته netaddr ارائه می‌شوند. .SS مرجع واگذاری اعداد اینترنتی (IANA) .INDENT 0.0 .TP .B فهرست پروتکل‌های IANA .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B فضای نشانی IPv4 .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B فضای نشانی IPv6 .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B ثبت‌های چندپخشی (Multicast) .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .UNINDENT.SS مؤسسه مهندسان برق و الکترونیک (IEEE) .INDENT 0.0 .TP .B ثبت سازمان‌های IEEE (IEEE Organisation Registry) .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B ثبت‌های OUI (شناسه منحصربه‌فرد سازمانی) .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .TP .B ثبت‌های IAB (بلوک آدرس انفرادی) .INDENT 7.0 .IP \(bu 2 \% .UNINDENT .UNINDENT .SH "راهنماهای کاربردی (HOW-TO GUIDES)" .SS نحوه انتشار netaddr .sp در اینجا نحوه انتشار نسخه جدیدی از \fInetaddr\fP آورده شده است\&. .INDENT 0.0 .IP \(bu 2 مطمئن شوید که وابستگی‌های لازم را نصب کرده‌اید: .INDENT 2.0 .INDENT 3.5 .sp .EX pip install \-\-upgrade wheel twine .EE .UNINDENT .UNINDENT .IP \(bu 2 آخرین مجموعه تغییرات را برای شاخه \fBmaster\fP دریافت کنید (pull)\&. .sp فرض بر این است که ساخت شاخه \fBmaster\fP سبز (موفق) است و همه‌چیز به درستی کار می‌کند (یک فرایند CI فعال وجود دارد)\&. .IP \(bu 2 بالاترین بخش فایل \fBCHANGELOG.rst\fP را با جزئیات تمام تغییرات مهم از زمان آخرین انتشار که هنوز در آنجا نیستند، به‌روزرسانی کنید\&. .sp تاریخ انتشار را روی روز جاری تنظیم کنید\&. .IP \(bu 2 مشخص کنید که شماره نسخه جدید چه باید باشد (بسته به تغییراتی که در این انتشار موجود خواهد بود): .INDENT 2.0 .IP \(bu 2 رفع اشکالات – افزایش نسخه وصله (patch version bump) .IP \(bu 2 قابلیت‌های جدید – افزایش نسخه فرعی (minor version bump) .IP \(bu 2 تغییرات اساسی یا ناسازگار – افزایش نسخه اصلی (major version bump) .UNINDENT .IP \(bu 2 شماره‌های نسخه را در سراسر کد منبع به‌روزرسانی کنید. این شامل تغییر شماره نسخه فعلی در موارد زیر می‌شود: .INDENT 2.0 .IP \(bu 2 \fBnetaddr/__init__.py\fP .IP \(bu 2 \fBdocs/source/conf.py\fP .UNINDENT .sp و جایگزین کردن تمام نمونه‌های \fBNEXT_NETADDR_VERSION\fP با نسخه جدید (البته به جز مواردی مانند این فایل)\&. .IP \(bu 2 تمام تغییرات را کامیت (commit) کنید\&. .IP \(bu 2 بسته را بسازید و منتشر کنید: .INDENT 2.0 .INDENT 3.5 .sp .EX make build\-and\-publish .EE .UNINDENT .UNINDENT .IP \(bu 2 انتشار را تگ (tag) بزنید و آن را با مخزن راه دور همگام‌سازی کنید: .INDENT 2.0 .INDENT 3.5 .sp .EX git tag \-a x.y.z \-m \(aqRelease version x.y.z\(aq make push_tags .EE .UNINDENT .UNINDENT .IP \(bu 2 یک GitHub Release بر اساس تگی که به‌تازگی push کرده‌اید در \% ایجاد کنید\&. .sp محتویات جدید \fBCHANGELOG.rst\fP را در آنجا قرار دهید و پیوند \(dqFull changelog\(dq را در انتها اضافه کنید (از انتشار قبلی کپی کرده و تطبیق دهید)\&. .UNINDENT.SH "تغییرات (CHANGELOG)" .SS NEXT_NETADDR_VERSION .sp تاریخ: هنوز منتشر نشده است .SS انتشار: 1.3.0 .sp تاریخ: 2024\-05\-28 .sp افزوده‌شده: .INDENT 0.0 .IP \(bu 2 افزودن بسط نشانی جزئی در \fBIPNetwork\fP از طریق سوئیچ \fBexpand_partial\fP؛ این قابلیت امکان انتخاب اختیاری رفتار پیش از نسخهٔ 1.1.0 را فراهم می‌کند .UNINDENT .sp برطرف‌شده: .INDENT 0.0 .IP \(bu 2 رفع مشکل اجرای مجموعه آزمون‌ها روی سیستم‌های musl .IP \(bu 2 اصلاح تجزیهٔ IPv6 در \fBIPAddress\fP هنگام فعال بودن \fBZEROFILL\fP \%<#\:netaddr\:.ZEROFILL> .IP \(bu 2 اصلاح مدیریت پرچم \fBNOHOST\fP \%<#\:netaddr\:.NOHOST> در سازندهٔ کپی \fBIPNetwork\fP .UNINDENT .SS انتشار: 1.2.1 .sp تاریخ: 2024\-02\-17 .sp برطرف‌شده: .INDENT 0.0 .IP \(bu 2 اصلاح بارگذاری اشتباه نسخهٔ 1.2.0 در PyPI – اکنون پس‌گرفته (yanked) شده است. بدون هیچ تغییری در بسته. .UNINDENT .SS انتشار: 1.2.0 .sp تاریخ: 2024\-02\-17 .sp افزوده‌شده: .INDENT 0.0 .IP \(bu 2 افزودن زیرفرمان ابزار CLI برای نمایش اطلاعات شبکه \%<#\:cli-network-info>\&. .UNINDENT .sp تغییریافته: .INDENT 0.0 .IP \(bu 2 پشتیبانی از اجرای شل تعاملی \%<#\:interactive-shell> بدون نیاز به نصب IPython. .UNINDENT .sp برطرف‌شده: .INDENT 0.0 .IP \(bu 2 ایجاد صریح خطای \fBTypeError\fP در صورت ارسال مقداری غیررشته‌ای به \fBvalid_ipv4()\fP یا \fBvalid_ipv6()\fP\&. .UNINDENT .SS انتشار: 1.1.0 .sp تاریخ: 2024\-02\-15 .sp افزوده‌شده: .INDENT 0.0 .IP \(bu 2 افزودن نسخهٔ مورد نیاز Python به فراداده‌های بسته (GH #365 \%). .IP \(bu 2 افزودن \fBexpand_partial_ipv4_address()\fP به API عمومی. .UNINDENT .sp برطرف‌شده: .INDENT 0.0 .IP \(bu 2 اصلاح نتایج منفی کاذب در \fBIPNetwork(...) in IPRange(...)\fP (GH #157 \%). .IP \(bu 2 اصلاح چند حالت حدی در برش‌زدن \fBIPNetwork\fP (GH #214 \%). .IP \(bu 2 اصلاح پشتیبانی از نشانی‌های جزئی IP که تصادفاً در نسخهٔ 1.0.0 در \fBIPNetwork\fP باقی مانده بود. .sp هنگام حذف سوئیچ \fBimplicit_prefix\fP، این نکته نادیده مانده بود که مقداری بسط نشانی جزئی IPv4 به صورت بدون شرط اعمال می‌شد. .sp اگر به رفتار پیشین نیاز دارید از \fBexpand_partial_ipv4_address()\fP استفاده کنید\&. .sp موضوع مرتبط در GH: #110 \%\&. .IP \(bu 2 اصلاح دسته‌بند نادرست مجوز در فراداده‌های بسته. .UNINDENT.SS انتشار: 1.0.0 .sp تاریخ: 2024\-02\-10 .sp حذف‌شده: .INDENT 0.0 .IP \(bu 2 قطع پشتیبانی از نگارش‌های Python پایین‌تر از 3.7. .IP \(bu 2 حذف نام‌های کوتاه پرچم‌ها: \fBN\fP، \fBP\fP و \fBZ\fP\&. به‌جای آن‌ها از \fBNOHOST\fP \%<#\:netaddr\:.NOHOST>، \fBINET_PTON\fP \%<#\:netaddr\:.INET_PTON> و \fBZEROFILL\fP \%<#\:netaddr\:.ZEROFILL> استفاده کنید. .IP \(bu 2 حذف پشتیبانی از قالب مختصر CIDR در \fBIPNetwork\fP (\fBimplicit_prefix=True\fP)، در صورت نیاز به این رفتار از \fBcidr_abbrev_to_verbose()\fP استفاده کنید. .IP \(bu 2 حذف متد \fBIPAddress.is_private\fP. .sp جایگزین‌های دقیق‌تری برای زیرمجموعه‌ای از نشانی‌ها که پیش‌تر توسط \fBis_private\fP پردازش می‌شدند وجود دارد: .INDENT 2.0 .IP \(bu 2 \fBIPAddress.is_link_local()\fP .IP \(bu 2 \fBIPAddress.is_ipv4_private_use()\fP .IP \(bu 2 \fBIPAddress.is_ipv6_unique_local()\fP .IP \(bu 2 \fBIPAddress.is_global()\fP .UNINDENT .sp بلوک‌های نشانی زیر که قبلاً توسط \fBis_private\fP پردازش می‌شدند فاقد متدهای کمکی اختصاصی هستند و باید آن‌ها را به صورت دستی مدیریت کنید یا درخواست افزودن متد بدهید: .INDENT 2.0 .IP \(bu 2 \fB100.64.0.0/10\fP – فضای نشانی اشتراکی (Shared Address Space) .IP \(bu 2 \fB192.0.0.0/24\fP – تخصیص‌های پروتکل IETF (دقت کنید – استثنائاتی در آن وجود دارد) .IP \(bu 2 \fB198.18.0.0/15\fP – محک‌زنی (Benchmarking) .IP \(bu 2 \fB239.0.0.0\fP\-\fB239.255.255.255\fP –\ \fB240.0.0.0/4\fP رزرو شده است، \fB239.0.0.0/8\fP – نامشخص .UNINDENT .UNINDENT .sp تغییریافته: .INDENT 0.0 .IP \(bu 2 توقف پذیرش صفرهای ابتدایی هنگام تجزیه نشانی‌های IPv4 در حالت \fBINET_PTON\fP \%<#\:netaddr\:.INET_PTON> (این ویژگی در برخی پلتفرم‌ها مجاز بود). .sp اگر نیاز به مجاز دانستن و نادیده گرفتن صفرهای ابتدایی دارید از پرچم \fBZEROFILL\fP \%<#\:netaddr\:.ZEROFILL> استفاده کنید. .sp این تغییر بر تبدیل‌های ضمنی از \fBstr\fP در تمامی زمینه‌های مرتبط اثر خواهد گذاشت. اگر نیاز به کنترل حالت تجزیه IPv4 دارید، اشیاء \fBIPAddress\fP را به صورت صریح بسازید. .IP \(bu 2 توقف تجزیه مسامحه‌آمیز (مانند \fBinet_aton()\fP) نشانی‌های IPv4 به‌طور پیش‌فرض. .sp حالت \fBINET_PTON\fP \%<#\:netaddr\:.INET_PTON> حالت پیش‌فرض است. .sp اگر نیاز به رفتار مسامحه‌آمیز و تجزیه با استفاده از معناشناسی \fBinet_aton()\fP دارید، از پرچم \fBINET_ATON\fP \%<#\:netaddr\:.INET_ATON> استفاده کنید. .sp این تغییر بر تبدیل‌های ضمنی از \fBstr\fP در تمامی زمینه‌های مرتبط اثر خواهد گذاشت. اگر نیاز به کنترل حالت تجزیه IPv4 دارید، اشیاء \fBIPAddress\fP را به صورت صریح بسازید. .IP \(bu 2 اعمال دو تغییر فوق روی \fBvalid_ipv4()\fP نیز. .IP \(bu 2 به‌روزرسانی پایگاه‌داده‌های نشانی به نگارش‌های 2024\-02\-10. .UNINDENT .sp رفع‌شده: .INDENT 0.0 .IP \(bu 2 بازگرداندن \fBFalse\fP به‌جای ایجاد خطای \fBAddrFormatError\fP هنگام ارسال یک رشته خالی به \fBvalid_ipv4()\fP یا \fBvalid_ipv6()\fP\&. .IP \(bu 2 رفع مشکل مدیریت \fBdialect\fP ارائه‌شده به \fBEUI\fP هنگام ساخت رونوشت (copy\-construction). .UNINDENT .SS انتشار: 0.10.1 .sp تاریخ: 2024\-01\-02 .sp رفع‌شده: .INDENT 0.0 .IP \(bu 2 حذف برخی هشدارها .UNINDENT .sp منسوخ‌شده: .INDENT 0.0 .IP \(bu 2 منسوخ شدن نام‌های کوتاه پرچم‌ها: \fBN\fP، \fBP\fP و \fBZ\fP\&. به‌جای آن‌ها از \fBNOHOST\fP \%<#\:netaddr\:.NOHOST>، \fBINET_PTON\fP \%<#\:netaddr\:.INET_PTON> و \fBZEROFILL\fP \%<#\:netaddr\:.ZEROFILL> استفاده کنید. .IP \(bu 2 منسوخ شدن وارد کردن اشیاء از زیربسته‌های \fBnetaddr\fP. تنها وارد کردن موارد از فضای نام سطح‌بالای \fBnetaddr\fP پشتیبانی می‌شود و سایر موارد خصوصی در نظر گرفته می‌شوند. .sp این موضوع از قبل نیز برقرار بوده است، اما نیاز به یادآوری داشت. .IP \(bu 2 منسوخ شدن تجزیه مسامحه‌آمیز پیش‌فرض IPv4 در \fBvalid_ipv4()\fP\&. معناشناسی \fBinet_pton()\fP (که در آن صفرهای ابتدایی همواره غیرمجاز هستند) پیش‌فرض خواهد شد. در صورت نیاز به رفتار قدیمی، از پرچم‌های \fBINET_ATON\fP \%<#\:netaddr\:.INET_ATON> و/یا \fBZEROFILL\fP \%<#\:netaddr\:.ZEROFILL> استفاده کنید. .UNINDENT.SS "انتشار: 0.10.0 (Release: 0.10.0)" .sp تاریخ: 2023\-12\-31 .sp افزوده‌شده: .INDENT 0.0 .IP \(bu 2 افزودن پرچم \fBINET_ATON\fP \%<#\:netaddr\:.INET_ATON> جهت درخواست صریح معناشناسی تجزیهٔ IPv4 به سبک \fBinet_aton()\fP از \fBIPAddress\fP\&. .IP \(bu 2 افزودن متد کمکی \fBIPAddress.is_ipv4_private_use()\fP\&. .IP \(bu 2 افزودن متد کمکی \fBIPAddress.is_global()\fP جهت امکان تشخیص اینکه آیا یک نشانی در سطح سراسری در دسترس در نظر گرفته می‌شود یا خیر. .IP \(bu 2 افزودن متد کمکی \fBIPAddress.is_ipv6_unique_local()\fP\&. .UNINDENT .sp برطرف‌شده: .INDENT 0.0 .IP \(bu 2 بهبود سازگاری با Python 3.13، با تشکر از John Eckersberg. .UNINDENT .sp منسوخ‌شده: .INDENT 0.0 .IP \(bu 2 منسوخ شدن پشتیبانی از Python 3.7. .IP \(bu 2 منسوخ شدن پشتیبانی از قالب CIDR کوتاه‌شده در \fBIPNetwork\fP (\fBimplicit_prefix=True\fP). .IP \(bu 2 منسوخ شدن پذیرش صفرهای پیشتاز هنگام تجزیهٔ نشانی‌های IPv4 در حالت \fBINET_PTON\fP \%<#\:netaddr\:.INET_PTON> (این مورد در برخی پلتفرم‌ها مجاز بود). .sp اگر نیاز به مجاز دانستن و نادیده گرفتن صفرهای پیشتاز دارید، از پرچم \fBZEROFILL\fP \%<#\:netaddr\:.ZEROFILL> استفاده کنید. .sp این تغییر بر تبدیل‌های ضمنی از \fBstr\fP در تمام زمینه‌های مرتبط تأثیر خواهد گذاشت. اگر نیاز دارید حالت تجزیهٔ IPv4 را کنترل کنید، اشیاء \fBIPAddress\fP را به‌طور صریح ایجاد نمایید. .IP \(bu 2 منسوخ شدن تجزیهٔ آسان‌گیرانهٔ پیش‌فرض نشانی‌های IPv4 (مشابه \fBinet_aton()\fP). .sp حالت \fBINET_PTON\fP \%<#\:netaddr\:.INET_PTON> به حالت پیش‌فرض تبدیل خواهد شد. .sp اگر نیاز به رفتار آسان‌گیر و تجزیه با استفاده از معناشناسی \fBinet_aton()\fP دارید، از پرچم \fBINET_ATON\fP \%<#\:netaddr\:.INET_ATON> استفاده کنید. .sp این تغییر بر تبدیل‌های ضمنی از \fBstr\fP در تمام زمینه‌های مرتبط تأثیر خواهد گذاشت. اگر نیاز دارید حالت تجزیهٔ IPv4 را کنترل کنید، اشیاء \fBIPAddress\fP را به‌طور صریح ایجاد نمایید. .IP \(bu 2 منسوخ شدن متد \fBIPAddress.is_private\fP\&. دستورالعمل‌های مهاجرت در مستندات آورده شده است. .UNINDENT .sp سایر: .INDENT 0.0 .IP \(bu 2 ایجاد استثنا در صورت ارسال پرچم‌های نامعتبر به \fBIPAddress\fP، \fBIPNetwork\fP یا \fBIPRange\fP\&. .IP \(bu 2 بهبود اساسی و قابل توجه مستندات. .IP \(bu 2 به‌روزرسانی فایل‌های DB به جدیدترین نسخه‌ها (2023\-12\-23). .UNINDENT .SS "انتشار: 0.9.0 (Release: 0.9.0)" .sp تاریخ: 2023\-09\-18 .sp افزوده‌شده: .INDENT 0.0 .IP \(bu 2 افزودن قابلیت‌های درهم‌سازی (hash) به OUI (#225, amitmi704) .UNINDENT .sp برطرف‌شده: .INDENT 0.0 .IP \(bu 2 \fBناسازگار با نسخه‌های پیشین:\fP پشتیبانی از نشانی‌های IPv6 در RFC 6164 (عدم رزرو اولین نشانی IP در زیرشبکه‌های نقطه\-به\-نقطه) ($267, Damien Claisse) .IP \(bu 2 \fBاز نظر فنی ناسازگار با نسخه‌های پیشین:\fP اصلاح رفتار is_loopback – در نظر گرفتن \fBIPNetwork(\(aq::1/128\(aq)\fP به عنوان لوپ‌بک (#222, #223, niels) .IP \(bu 2 گنجاندن آموزش‌ها در توزیع‌های کد منبع (#215, Louis Sautier) .IP \(bu 2 اصلاح یک غلط املایی در مستندات (#242, Wouter) .IP \(bu 2 اصلاح نحو دستور print در مستندات جهت سازگاری با Python 3 (#221, François Magimel) .IP \(bu 2 اصلاح نحو Sphinx در مستندات (#220, François Magimel) .UNINDENT .sp سایر: .INDENT 0.0 .IP \(bu 2 به‌روزرسانی پایگاه‌های داده (#266, Jakub Stasiak) .IP \(bu 2 منسوخ شدن Python 3.6 (#263, Jakub Stasiak) .IP \(bu 2 حذف فراخوانی‌های غیرضروری eval (#228, KOLANICH) .UNINDENT.SS انتشار: 0.8.0 .sp تاریخ: 3 ژوئیه 2020 .SS تغییرات از 0.7.20 .INDENT 0.0 .IP \(bu 2 رفع مشکل پشتیبانی از ارجاع ضعیف (weak reference) در کلاس‌های دارای \fB__slots__\fP .IP \(bu 2 افزودن متد \fB__bytes__\fP به \fBIPAddress\fP برای استفاده شهودی، با تشکر از Michael Belousov. .IP \(bu 2 افزودن تابع \fBformat()\fP به EUI، با تشکر از Omer Anson. .IP \(bu 2 افزودن تنظیم‌کننده ویژگی (property setter) برای \fBIPNetwork.netmask\fP، با تشکر از Naveen Nathan. .IP \(bu 2 افزودن پشتیبانی از IABها در OUI با شناسه \fB40:D8:55\fP، با تشکر از Brian Maissy. .IP \(bu 2 بهینه‌سازی چشمگیر تابع \fBspanning_cidr()\fP، با تشکر از Brian Maissy. .IP \(bu 2 اصلاح آزمون‌های \fB\(dqx.x.x.x/x\(dq in IPNetwork\fP، با تشکر از xpac1985. .IP \(bu 2 افزودن پشتیبانی از ارسال تکرارپذیرهای \fBIPRange\fP به \fBIPSet\fP و \fBcidr_merge()\fP، بر اساس وصله‌ای از Henry Stern. .UNINDENT .SS اشکالات مشخص برطرف‌شده در این انتشار .INDENT 0.0 .TP .B FIXED Issue 205: \% .INDENT 7.0 .IP \(bu 2 پیچیدگی N log N به‌جای خطی .UNINDENT .TP .B FIXED Issue 171: \% .INDENT 7.0 .IP \(bu 2 ایجاد کارآمد یک IPSet بزرگ از فهرستی از IPRangeها؟ .UNINDENT .TP .B FIXED Issue 161: \% .INDENT 7.0 .IP \(bu 2 پشتیبانی از ارجاع ضعیف .UNINDENT .UNINDENT .SS متفرقه (Miscellanea) .INDENT 0.0 .IP \(bu 2 انتشار بعدی (0.9.0) شامل یک تغییر ناسازگار با گذشته در رفتار IPNetwork خواهد بود. این مورد مربوط به مدیریت نشانی‌های IPv6 در RFC 6164 (پیشوندهای /127 و /128) است: IPNetwork.broadcast برای آن‌ها مقدار None بازخواهد گرداند و نشانی‌های نخست در شبکه‌ها دیگر هنگام پیمایش IPNetwork و IPNetwork.iter_hosts() نادیده گرفته نمی‌شوند. برای دیدن وصله واقعی، به \% (یا کامیت 2984c0a40a70 که موقتاً در این مخزن بازگردانده شده است) مراجعه کنید. .UNINDENT .SS انتشار: 0.7.20 .sp تاریخ: 19 ژوئن 2020 .SS تغییرات از 0.7.19 .INDENT 0.0 .IP \(bu 2 اصلاح بازگشت از تکرارکننده در Python 3.7+، توسط Sergey Kozlov. .IP \(bu 2 رفع هشدار نحوی (SyntaxWarning) در Python 3.8 هنگام استفاده از \fIis not\fP با رشته‌های لیترال، توسط Stefan Nordhausen. .IP \(bu 2 رفع DeprecationWarnings با استفاده از رشته‌های خام (raw strings) برای نویسه‌های گریز در عبارت‌های باقاعده (regex)، توسط Sean McGinnis. .IP \(bu 2 بهبود مستندات IPGlob، توسط obkmeta. .IP \(bu 2 اصلاح ایجاد استثنا در حالت‌های خاص با ارسال صریح پارامترهای پیام خطا به‌صورت تاپل (tuple)، توسط Matthias Urlichs. .IP \(bu 2 توقف جایگزینی دستی shebang در اسکریپت ضمیمه‌شده. .IP \(bu 2 توقف استفاده از __file__ در تمامی کدهایی که انتظار می‌رود در محیط‌های فاقد پشتیبانی از آن اجرا شوند (مانند باینری‌های تولیدشده با PyOxidizer). .IP \(bu 2 به‌روزرسانی تمامی پایگاه‌های داده موجود در بسته. .UNINDENT .SS اشکالات مشخص برطرف‌شده در این انتشار .INDENT 0.0 .TP .B FIXED Issue 182: \% .INDENT 7.0 .IP \(bu 2 شکست آزمون test_ip_splitter_remove_prefix_larger_than_input_range در python 3.7 .UNINDENT .TP .B FIXED Issue 206: \% .INDENT 7.0 .IP \(bu 2 هشدار نحو \(dq\(dqis not\(dq with a literal.\(dq SyntaxWarning .UNINDENT .TP .B FIXED Issue 198: \% .INDENT 7.0 .IP \(bu 2 پایگاه‌های داده oui قدیمی هستند .UNINDENT .TP .B FIXED Issue 188: \% .INDENT 7.0 .IP \(bu 2 اجتناب از استفاده از __file__ .UNINDENT .UNINDENT.SS متفرقه (Miscellanea) .INDENT 0.0 .IP \(bu 2 نسخه‌های Python 2 قدیمی‌تر از 2.7 و نسخه‌های Python 3 قدیمی‌تر از 3.5 باید پشتیبانی‌نشده در نظر گرفته شوند. تا جایی که می‌دانیم هیچ کد ناسازگاری اضافه نشده است، اما هیچ زیرساخت CI برای تأیید این موضوع وجود ندارد و در صورت بروز هرگونه مشکل در این نسخه‌ها، برطرف نخواهند شد. .IP \(bu 2 در نتیجه، پشتیبانی از Python 2.7 و 3.5 باید منسوخ‌شده در نظر گرفته شود؛ چرا که دورهٔ عمر (end\-of\-life) نسخهٔ 2.7 پیش‌تر به پایان رسیده است و 3.5 نیز به‌زودی به آن خواهد رسید. .IP \(bu 2 یک پیکربندی CI اضافه شده است که به ما امکان می‌دهد آزمایش‌ها را روی نسخه‌های گوناگون Python در تمامی سیستم‌عامل‌های Mac، Linux و Windows اجرا کنیم. .UNINDENT .SS انتشار: 0.7.19 (Release: 0.7.19) .sp تاریخ: ۱۱ ژانویه ۲۰۱۷ (11 Jan 2017) .SS تغییرات از نسخهٔ 0.7.18 (Changes since 0.7.18) .INDENT 0.0 .IP \(bu 2 افزودن کلاس جدید SubnetSplitter برای کاربرانی که قصد تقسیم زیرشبکه‌ها را دارند. با تشکر از alanwill و RyPeck و مشارکت‌کنندگان در (Stack Overflow discussion). .IP \(bu 2 حذف کد وابستگی گنجانده‌شدهٔ pytest برای \(dqpython setup.py test\(dq. .IP \(bu 2 اسکریپت setup.py اکنون فقط از setuptools استفاده می‌کند (پایان استفاده از distutils) و setup_egg.py حذف شد. .IP \(bu 2 پاک‌سازی و به‌روزرسانی مستندات INSTALL تا بسته‌بندی فعلی Python را به‌درستی منعکس کنند. .IP \(bu 2 رفع اشکال تجزیه، تولید و خواندن فایل‌های شاخص IEEE هنگام جابه‌جایی میان Python 2.x و 3.x. .UNINDENT .SS باگ‌های خاص رفع‌شده در این انتشار (Specific bug fixes addressed in this release) .INDENT 0.0 .TP .B FIXED Issue 133: \% .INDENT 7.0 .IP \(bu 2 تقسیم یک شبکهٔ واحد به چندین شبکه با پیشوند (prefix) .UNINDENT .TP .B FIXED Issue 129: \% .INDENT 7.0 .IP \(bu 2 اصلاح IPAddress().netmask_bits جهت بازگرداندن مقدار 0 برای آدرس‌های 0.0.0.0 و [::] .UNINDENT .TP .B FIXED Issue 117: \% .INDENT 7.0 .IP \(bu 2 شکست در اجرای (python setup.py test) با python3 >= 3.5 .UNINDENT .TP .B FIXED Issue 137: \% .INDENT 7.0 .IP \(bu 2 خرابی ارجاع API در ReadTheDocs .UNINDENT .TP .B FIXED Issue 143: \% .INDENT 7.0 .IP \(bu 2 تازه‌سازی پایگاه‌های دادهٔ همراهِ IANA و IEEE .UNINDENT .UNINDENT .SS متفرقه (Miscellanea) .INDENT 0.0 .IP \(bu 2 خداحافظی با NYSE Euronext (دوران خوش)، سلام به Intercontinental Exchange ... .UNINDENT .SS انتشار: 0.7.18 (Release: 0.7.18) .sp تاریخ: ۴ سپتامبر ۲۰۱۵ (4 Sep 2015) .SS تغییرات از نسخهٔ 0.7.17 (Changes since 0.7.17) .INDENT 0.0 .IP \(bu 2 الگوریتم cidr_merge() اکنون از مرتبهٔ O(n) بوده و بسیار سریع‌تر شده است. با تشکر از Anand Buddhdev (aabdnn) و Stefan Nordhausen (snordhausen). .IP \(bu 2 پشتیبانی کامل از مشخصات هدف nmap شامل پیشوندهای CIDR در IPv4 و آدرس‌های IPv6. .UNINDENT.SS باگ‌های خاص رفع‌شده در این انتشار .INDENT 0.0 .TP .B FIXED Issue 100: \% .INDENT 7.0 .IP \(bu 2 nmap.py \- اهداف CIDR .UNINDENT .TP .B FIXED Issue 112: \% .INDENT 7.0 .IP \(bu 2 مشاهده: netaddr تحت pypy کندتر است .UNINDENT .UNINDENT .SS انتشار: 0.7.17 .sp تاریخ: ۳۱ اوت ۲۰۱۵ .SS تغییرات از زمان 0.7.16 .INDENT 0.0 .IP \(bu 2 رفع یک پس‌رفت در valid_mac به دلیل shadow import در ماژول netaddr. .UNINDENT .SS باگ‌های خاص رفع‌شده در این انتشار .INDENT 0.0 .TP .B FIXED Issue 114: \% .INDENT 7.0 .IP \(bu 2 netaddr.valid_mac(\(aq00\-B0\-D0\-86\-BB\-F7\(aq)==False برای 0.7.16 اما True برای 0.7.15 .UNINDENT .UNINDENT .SS انتشار: 0.7.16 .sp تاریخ: ۳۰ اوت ۲۰۱۵ .SS تغییرات از زمان 0.7.15 .INDENT 0.0 .IP \(bu 2 .INDENT 2.0 .TP .B شبکه‌های IPv4 با netmaskهای /31 و /32 اکنون مطابق با RFC 3021 مدیریت می‌شوند. با تشکر از kalombos و braaen. .UNINDENT .UNINDENT .SS باگ‌های خاص رفع‌شده در این انتشار .INDENT 0.0 .TP .B FIXED Issue 109: \% .INDENT 7.0 .IP \(bu 2 شناسایی رجیستری تخصیص‌های unicast سراسری IPv6 .UNINDENT .TP .B FIXED Issue 108: \% .INDENT 7.0 .IP \(bu 2 بخشی از مستندات نامشخص است؟ .UNINDENT .TP .B FIXED Issue 106: \% .INDENT 7.0 .IP \(bu 2 به‌روزرسانی Eui64 (درخواست ادغام برای Issue 105) .UNINDENT .TP .B FIXED Issue 105: \% .INDENT 7.0 .IP \(bu 2 پشتیبانی از dialectها برای آدرس‌های EUI\-64 .UNINDENT .TP .B FIXED Issue 102: \% .INDENT 7.0 .IP \(bu 2 بسته tarball نسخه 0.7.15 فاقد آزمون‌ها است. .UNINDENT .TP .B FIXED Issue 96: \% .INDENT 7.0 .IP \(bu 2 میزبان‌ها و برودکست‌های نادرست برای شبکه‌های /31 و /32. .UNINDENT .UNINDENT.SS انتشار: 0.7.15 .sp تاریخ: ۲۹ ژوئن ۲۰۱۵ .SS تغییرات از 0.7.14 .INDENT 0.0 .IP \(bu 2 رفع کندی در IPSet.__contains__. با تشکر از novas0x2a برای گزارش آن. .IP \(bu 2 نرمال‌سازی IPNetworkها هنگام افزوده شدن به یک IPSet .IP \(bu 2 تبدیل مجموعه آزمون به py.test .UNINDENT .SS اشکالات خاص برطرف‌شده در این انتشار .INDENT 0.0 .TP .B رفع اشکال ۹۸: \% .INDENT 7.0 .IP \(bu 2 تبدیل مجموعه آزمون به py.test .UNINDENT .TP .B رفع اشکال ۹۴: \% .INDENT 7.0 .IP \(bu 2 متد IPSet.__contains__ حدود ۴۰ برابر کندتر از IPRange معادل است .UNINDENT .TP .B رفع اشکال ۹۵: \% .INDENT 7.0 .IP \(bu 2 مدیریت ناسازگار آدرس‌ها در IPSet .UNINDENT .UNINDENT .SS انتشار: 0.7.14 .sp تاریخ: ۳۱ مارس ۲۰۱۵ .SS تغییرات از 0.7.13 .INDENT 0.0 .IP \(bu 2 رفع شکست عجیب فرآیند ساخت در 0.7.13 (مسیر نادرست Python، پایگاه دادهٔ OUI نادرست). .IP \(bu 2 .INDENT 2.0 .TP .B اشیاء EUI، OUI و IAB اکنون با رشته‌ها قابل مقایسه‌اند. می‌توانید دستورهای زیر را اجرا کنید: my_mac = EUI(\(dq11:22:33:44:55:66\(dq) my_mac == \(dq11:22:33:44:55:66\(dq و Python روی عملگر \(dq==\(dq مقدار True را بازمی‌گرداند. .UNINDENT .IP \(bu 2 .INDENT 2.0 .TP .B پیاده‌سازی عملگر \(dq!=\(dq برای OUI و IAB در Python2. این عملگر از قبل در Python3 کار می‌کرد. .UNINDENT .IP \(bu 2 .INDENT 2.0 .TP .B شناسه‌های EUI ۶۴ بیتی قبلاً فقط از رشته‌هایی با جداکنندهٔ \(dq\-\(dq ایجاد می‌شدند. اکنون، \(dq:\(dq و بدون جداکننده نیز پشتیبانی می‌شوند، قابلیتی که پیش‌تر برای EUIهای ۴۸ بیتی فعال بود. .UNINDENT .UNINDENT .SS اشکالات خاص برطرف‌شده در این انتشار .INDENT 0.0 .TP .B رفع اشکال ۸۰: \% .INDENT 7.0 .IP \(bu 2 مقایسهٔ آدرس‌های L2 با نمایش آن‌ها .UNINDENT .TP .B رفع اشکال ۸۱: \% .INDENT 7.0 .IP \(bu 2 شکست آزمون‌های پایگاه دادهٔ OUI در 0.7.13 .UNINDENT .TP .B رفع اشکال ۸۴: \% .INDENT 7.0 .IP \(bu 2 مسیر نادرست فایل اجرایی python در netaddr\-0.7.13\-py2.py3\-none\-any.whl .UNINDENT .TP .B رفع اشکال ۸۷: \% .INDENT 7.0 .IP \(bu 2 پشتیبانی از آدرس‌های eui64 با دونقطه (:) به عنوان جداکننده و بدون جداکننده. .UNINDENT .UNINDENT.SS انتشار: 0.7.13 .sp تاریخ: 31 دسامبر 2014 .SS تغییرات نسبت به 0.7.12 .INDENT 0.0 .IP \(bu 2 اشیای IPAddress اکنون می‌توانند با یکدیگر جمع یا از یکدیگر تفریق شوند .UNINDENT .SS رفع باگ‌های خاص انجام‌شده در این انتشار .INDENT 0.0 .TP .B رفع Issue 73: \% .INDENT 7.0 .IP \(bu 2 جمع کردن نشانی‌های IP .UNINDENT .TP .B رفع Issue 74: \% .INDENT 7.0 .IP \(bu 2 محاسبه نشانی استاتیک گلوبال IPv6 از روی پیشوند شبکه و نشانی MAC .UNINDENT .TP .B رفع Issue 75: \% .INDENT 7.0 .IP \(bu 2 افزودن دسته‌بندی‌ها (classifiers) برای پشتیبانی از python 3.3 و 3.4 .UNINDENT .UNINDENT .SS انتشار: 0.7.12 .sp تاریخ: 6 ژوئیه 2014 .SS تغییرات نسبت به 0.7.11 .INDENT 0.0 .IP \(bu 2 متد IPSet.iter_ipranges() افزوده شد. .IP \(bu 2 دستور bool(IPSet()) اکنون برای IPSetهای بزرگ کار می‌کند، مانند IPSet([\(aq2405:8100::/32\(aq]). .IP \(bu 2 متد IPNetwork.iter_hosts اکنون از نشانی anycast مربوط به subnet\-router برای IPv6 صرف‌نظر می‌کند. .IP \(bu 2 تابع fbsocket.inet_aton حذف شد زیرا بی‌استفاده و غیرضروری است .UNINDENT .SS رفع باگ‌های خاص انجام‌شده در این انتشار .INDENT 0.0 .TP .B رفع Issue 69: \% .INDENT 7.0 .IP \(bu 2 افزودن متد __nonzero__ به IPSet .UNINDENT .TP .B رفع Pull Request 68: \% .INDENT 7.0 .IP \(bu 2 رفع باگ مربوط به مجاز دانستن ::0 در حین iter_hosts برای v6 .UNINDENT .TP .B رفع Issue 67: \% .INDENT 7.0 .IP \(bu 2 حذف تابع fbsocket.inet_aton .UNINDENT .TP .B رفع Pull Request 66: \% .INDENT 7.0 .IP \(bu 2 افزودن تابع جهت ایجاد فهرستی از IPRange برای IPSetهای غیرپیوسته .UNINDENT .UNINDENT .SS انتشار: 0.7.11 .sp تاریخ: 19 مارس 2014 .SS تغییرات نسبت به 0.7.10 .INDENT 0.0 .IP \(bu 2 .INDENT 2.0 .TP .B کارایی IPSet به طور چشمگیری افزایش یافت، پیاده‌سازی شده توسط Stefan Nordhausen و Martijn van Oosterhout. به عنوان یک اثر جانبی، IPSet(IPNetwork(\(dq10.0.0.0/8\(dq)) اکنون به همان سرعتی است که انتظار دارید. .UNINDENT .IP \(bu 2 بهبودهای مختلف در کارایی در بخش‌های گوناگون. .IP \(bu 2 بسته netaddr اکنون در PyPI میزبانی می‌شود و از طریق pip قابل نصب است. .IP \(bu 2 عملیات \(dq10.0.0.42\(dq in IPNetwork(\(dq10.0.0.0/24\(dq) اکنون کار می‌کند. .IP \(bu 2 کلاس IPSet دارای دو متد جدید شده است: iscontiguous() و iprange()، با تشکر از Louis des Landes. .IP \(bu 2 افزودن مجدد متد IPAddress.netmask_bits() که تصادفاً حذف شده بود. .IP \(bu 2 .INDENT 2.0 .TP .B شبکه‌های 128.0.0.0/16، 191.255.0.0/16 و 223.255.255.0/24 دیگر به عنوان نشانی‌های رزروشده IPv4 علامت‌گذاری نمی‌شوند. با تشکر از marnickv برای اشاره به این موضوع. .UNINDENT .IP \(bu 2 رفع باگ‌های مختلف با مشارکت Wilfred Hughes، 2*yo و Adam Goodman. .UNINDENT.SS رفع باگ‌های خاص انجام‌شده در این نسخه .sp رفع مشکل 58: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 foo.bar استثنای AddrFormatError را پرتاب نمی‌کند .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 57: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 بسته‌های netaddr در PyPI میزبانی نشده‌اند .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 56: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اصلاح مقایسه با IPSet() بزرگ .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 55: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اصلاح smallest_matching_cidr و all_matching_cidrs .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 53: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 مستثنی کردن 128.0.0.0/16 و احتمالاً موارد دیگر از مجموعه محدوده‌های رزروشده؟ .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 51: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 خطاهای کدگذاری در netaddr/eui/oui.txt .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 46: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 شکست len(IPSet()) در python3 .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 43: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 متدی برای بررسی پیوسته بودن IPSet .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 38: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 عدم وجود netmask_bits در IPAddress .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 37: \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 شکست آزمون‌ها با Python 3.3 .UNINDENT .UNINDENT .UNINDENT.SS انتشار: 0.7.10 .sp تاریخ: ۶ سپتامبر ۲۰۱۲ .SS تغییرات از نسخهٔ 0.7.9 .INDENT 0.0 .IP \(bu 2 مجموعه‌ای از رفع اشکالات در Python 3.x. با تشکر از Arfrever. .IP \(bu 2 گسترش پشتیبانی از nmap برای پوشش کامل مشخصات هدف. .UNINDENT .SS باگ‌های خاص رفع‌شده در این انتشار .sp رفع Issue 36 \- \% .INDENT 0.0 .IP \(bu 2 هشدارهای ResourceWarnings در Python >=3.2 .UNINDENT .sp رفع Issue 35 \- \% .INDENT 0.0 .IP \(bu 2 netaddr\-0.7.9: شکست در آزمون‌ها با Python 3 .UNINDENT .sp رفع Issue 34 \- \% .INDENT 0.0 .IP \(bu 2 عدم سازگاری netaddr.ip.iana.SaxRecordParser.endElement() با Python 3.1 .UNINDENT .sp رفع Issue 33 \- \% .INDENT 0.0 .IP \(bu 2 اسکریپت netaddr با Python 3 نصب نمی‌شود .UNINDENT .sp رفع Issue 23 \- \% .INDENT 0.0 .IP \(bu 2 تابع valid_nmap_range() حالت‌های قالب nmap را اعتبارسنجی نمی‌کند. .UNINDENT .sp رفع Issue 22 \- \% .INDENT 0.0 .IP \(bu 2 all_matching_cidrs: نادرست بودن مستندات .UNINDENT .SS انتشار: 0.7.9 .sp تاریخ: ۲۸ اوت ۲۰۱۲ .SS تغییرات از نسخهٔ 0.7.8 .INDENT 0.0 .IP \(bu 2 انتشار مجدد برای اصلاح ساخت با حذف وابستگی به Sphinx. .UNINDENT .SS انتشار: 0.7.8 .sp تاریخ: ۲۸ اوت ۲۰۱۲ .SS تغییرات از نسخهٔ 0.7.7 .INDENT 0.0 .IP \(bu 2 تجزیه‌کنندهٔ جدید SAX برای فایل‌های منبع دادهٔ IANA (مشارکت از سوی Andrew Stromnov) .IP \(bu 2 رفع خطاهای مربوط به pickling در کلاس‌های EUI، OUI و IAB. .UNINDENT .SS باگ‌های خاص رفع‌شده در این انتشار .sp رفع Issue 31 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 مستثنی کردن شبکهٔ \(aq39.0.0.0/8\(aq از مجموعهٔ رزرو شده. با تشکر از Andrew Stromnov .UNINDENT .UNINDENT .UNINDENT .sp رفع Issue 28 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اصلاح الگوریتم در ipv6_link_local برای انطباق کامل با rfc4291. با تشکر از Philipp Wollermann .UNINDENT .UNINDENT .UNINDENT .sp رفع Issue 25 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 آیا install_requires بیش از حد سخت‌گیرانه است؟ با تشکر از Adam Lindsay و سایر نظردهندگان. .UNINDENT .UNINDENT .UNINDENT .sp رفع Issue 21 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 شکست deepcopy برای EUI. با تشکر از Ryan Nowakowski. .UNINDENT .UNINDENT .UNINDENT.SS انتشار: 0.7.7 .sp تاریخ: ۳۰ مه ۲۰۱۲ .SS تغییرات نسبت به 0.7.6 .INDENT 0.0 .IP \(bu 2 به‌روزرسانی جامع مستندات! تنها ۴ سال طول کشید تا بالاخره از Sphinx استفاده شود و می‌توانم تأیید کنم که \fBکاملاً فوق‌العاده است!\fP .IP \(bu 2 رفع باگ‌های گوناگون .IP \(bu 2 تازه‌سازی داده‌های IEEE OUI و IAB .UNINDENT .SS اشکالات مشخص رفع‌شده در این انتشار .sp رفع مشکل 24 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 رفع TypeError هنگام مقایسه نمونه BaseIP با اشیاء غیر BaseIP. با تشکر از pvaret .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 17 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 متد .subnet() برای شبکه‌های بزرگ ipv6 با شکست مواجه می‌شد. با تشکر از daveyss .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 20 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 شکست آزمون در Python 3. با تشکر از Arfrever .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.7.6 .sp تاریخ: ۱۳ سپتامبر ۲۰۱۱ .SS تغییرات نسبت به 0.7.5 .INDENT 0.0 .IP \(bu 2 یک انتشار نقطه‌ای برای رفع اشکال .IP \(bu 2 تازه‌سازی کش‌های داده‌های شخص ثالث (3rd party) .IP \(bu 2 آزمایش‌شده در برابر Python 3.2.x و PyPy 1.6.x .IP \(bu 2 رفع آزمون‌های واحد تحت Mac OSX .UNINDENT .SS اشکالات مشخص رفع‌شده در این انتشار .sp رفع مشکل 15 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 تولید glob نادرست و نامعتبر هنگامی که اکتت آخر * نباشد .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 13 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از تغییرات API در IPython 0.11. با تشکر از juliantaylor .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 11 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 فراخوانی valid_glob روی cidr موجب بروز خطای ValueError می‌شد. با تشکر از radicand .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 7 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اشکال Unpickling در IPSet. با تشکر از LuizOz و labeneator .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل 2 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 بروز خطای UnboundLocalError در سازنده IPNetwork. با تشکر از keesbos .UNINDENT .UNINDENT .UNINDENT.SS موارد گوناگون (Miscellanea) .INDENT 0.0 .IP \(bu 2 آیا یک شرکت معروف نوشیدنی، ساخت NICهای اختصاصی خود را آغاز کرده است؟ .UNINDENT .SS انتشار: 0.7.5 (Release: 0.7.5) .sp تاریخ: ۵ اکتبر ۲۰۱۰ .SS تغییرات نسبت به 0.7.4 (Changes since 0.7.4) .INDENT 0.0 .IP \(bu 2 اکنون Python 3.x به‌طور کامل پشتیبانی می‌شود. رنگ این تغییرات هنوز خشک نشده است (بسیار تازه است)، بنابراین لطفاً در آزمودن آن کمک کنید و هنگام برخورد با هرگونه مشکل تیکت باگ ثبت نمایید! سامانهٔ جدید پیگیری مشکلات \- \% .IP \(bu 2 میزبانی کد به github منتقل شد. تاریخچه به لطف svn2git منتقل گردید. \- (\%) .IP \(bu 2 اکنون تمام اشیای netaddr به دلیل استفاده از __slots__ در کلاس‌های سراسر پایه‌کد، تقریباً ۶۵٪ حافظهٔ کمتری مصرف می‌کنند. با تشکر از Stefan Nordhausen و مرشد پایتون او بابت این پیشنهاد! .IP \(bu 2 بهینه‌سازی‌ها و افزایش سرعت‌های بسیاری در سراسر پایه‌کد اعمال شد. .IP \(bu 2 رفتار سازندهٔ IPNetwork اصلاح شد، به طوری که اکنون به شیوه‌ای بسیار معقول‌تر و مطابق انتظار رفتار می‌کند (یعنی دیگر از معناشناسی inet_aton که برای آدرس‌های شبکه کاملاً نامأنوس بود، استفاده نمی‌کند). .IP \(bu 2 یک تغییر رفتاری جزئی در این نسخه این است که ویژگی .value در اشیای IPAddress و IPNetwork دیگر از انتساب مقدار با استفاده از یک آدرس IP رشته‌ای پشتیبانی نمی‌کند. اکنون تنها انتساب مقادیر عدد صحیح معتبر است. تأثیر این تغییر برای اکثریت کاربران باید در کمترین حد ممکن باشد. .UNINDENT .SS اشکالات خاص برطرف‌شده در این انتشار (Specific bug fixes addressed in this release) .sp رفع مشکل ۴۹ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 تشخیص نادرست محدودهٔ IP در آدرس‌های IP دارای صفر پیشرو .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۰ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 تجزیهٔ بلوک CIDR .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۲ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 تطابق‌های ipv6 cidr به‌طور نادرست با ipv4 مطابقت داده می‌شوند [sic] .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۳ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 خطا در مستندات برخط .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۴ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 شکست در شناسایی IP .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۵ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.x .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۶ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 بررسی IPAddress در IPNetwork .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۷ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اشیای netaddr قابلیت سریال‌سازی با pickle را ندارند .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۸ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 عملیات‌های IPSet باید همان آرگومان‌های IPAddress را بپذیرند .UNINDENT .UNINDENT .UNINDENT .sp رفع مشکل ۵۹ \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 شکست در بارگذاری netaddr هنگام درون‌ریزی توسط یک هم‌روند (coprocess) در PowerDNS .UNINDENT .UNINDENT .UNINDENT.SS متفرقه .INDENT 0.0 .IP \(bu 2 خوش‌آمدگویی مجدد به standards.ieee.org که به نظر می‌رسید برای هفته‌ها از دسترس خارج شده بود! .IP \(bu 2 خداحافظ Sun Microsystems و Merrill Lynch، سلام Oracle و Bank of America ... .UNINDENT .SS انتشار: 0.7.4 .sp تاریخ: ۲ دسامبر ۲۰۰۹ .SS تغییرات نسبت به 0.7.3 .INDENT 0.0 .IP \(bu 2 اعمال وصله‌های بهبود سرعت توسط S. Nordhausen .IP \(bu 2 رفع ناهماهنگی میان رابط‌های EUI و IPAddress. تبدیل EUI.packed و EUI.bin به ویژگی (پیش‌تر متد بودند) و افزودن یک ویژگی words(). .UNINDENT .SS انتشار: 0.7.3 .sp تاریخ: ۱۴ سپتامبر ۲۰۰۹ .SS تغییرات نسبت به 0.7.2 .INDENT 0.0 .IP \(bu 2 افزودن عملگرهای __add__، __radd__، __sub__ و __rsub__ به کلاس IPAddress. .IP \(bu 2 افزودن پشتیبانی از اعتبارسنجی و پیمایش محدوده‌های سادهٔ IPv4 به سبک nmap (مطرح‌شده در Issue 46). .IP \(bu 2 حذف برخی از ثابت‌های بلااستفاده از ماژول fallback socket. .UNINDENT .SS رفع باگ‌های خاص پرداخته‌شده در این انتشار .sp رفع Issue 44 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 خطای نوع int/long .UNINDENT .UNINDENT .UNINDENT .sp رفع Issue 46 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 پرسش در مورد محدوده‌های IPv4 .UNINDENT .UNINDENT .UNINDENT .sp رفع Issue 47 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 عدم امکان ارزیابی IPNetwork به عنوان مقدار بولی (boolean) هنگامی که اندازه بزرگی دارد .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.7.2 .sp تاریخ: ۲۰ اوت ۲۰۰۹ .SS تغییرات نسبت به 0.7.1 .INDENT 0.0 .TP .B رفع مشکل مرزی در تابع مولد iter_iprange() و تمامی فراخوانی‌های مرتبط با آن در سراسر پایه‌کد، از جمله پوشش آزمون واحد و اصلاحات مربوطه. .UNINDENT .INDENT 0.0 .IP \(bu 2 جایگزینی عبارت‌های باقاعده در cidr_merge() با معادل‌های pre\-compiled برای افزایش اندک سرعت. .IP \(bu 2 اصلاحات در README مطرح‌شده توسط John Eckersberg. .UNINDENT.SS رفع باگ‌های خاص انجام‌شده در این انتشار .sp رفع شد: Issue 43 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 عدم امکان استفاده از IPNetwork(\(aq0.0.0.0/0\(aq) در حلقه for .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.7.1 .sp تاریخ: ۱۴ اوت ۲۰۰۹ .SS تغییرات نسبت به 0.7 .INDENT 0.0 .IP \(bu 2 تغییر نام اسکریپت شل netaddr از \(aqnash\(aq به \(aqnetaddr\(aq ساده. این کار برای جلوگیری از تداخل نام بالقوه ناخوشایند با یک ابزار مهم لینوکس با همین نام انجام شد. .sp با تشکر از John Eckersberg برای تشخیص زودهنگام این مورد! .IP \(bu 2 به‌روزرسانی فایل‌های داده‌های IANA و IEEE با آخرین نسخه‌ها. .UNINDENT .SS رفع باگ‌های خاص انجام‌شده در این انتشار .sp رفع شد: Issue 42 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 باگ در تابع cidr_merge() هنگام ارسال CIDRهای 0.0.0.0/0 و/یا ::/0 .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.7 .sp تاریخ: ۱۱ اوت ۲۰۰۹ .SS تغییرات نسبت به 0.6.x .sp لطفاً توجه داشته باشید \- این انتشار یک بازنگری اساسی در netaddr است. این تغییرات سازگاری عقبرو با نسخه‌های پیشین را می‌شکند. برای جزئیات کامل امکانات در دسترس، به مستندات API مراجعه کنید. .sp برخی از نکات برجسته تغییرات:\- .INDENT 0.0 .IP \(bu 2 ساختار سلسله‌مراتبی داخلی ماژول‌ها به‌طور کامل بازنگری و بازطراحی شده است. این امر بسیاری از ناسازگاری‌ها و مشکلات مربوط به واردسازی‌های وابسته به یکدیگر را برطرف می‌کند. تمام کلاس‌ها، اشیاء، توابع و ثابت‌های عمومی همچنان مانند نسخه‌های قبلی از طریق فضای نام اصلی ماژول netaddr در دسترس هستند. .IP \(bu 2 حذف «ثابت‌های» AT_* و ST_*. .IP \(bu 2 کلاس پایه Addr حذف شد. این امر پیوند بین قابلیت‌های EUI و IP را از بین می‌برد، بنابراین کتابخانه اکنون می‌تواند به سادگی به واحدهای متمایزی بدون وابستگی‌های متقابل زیاد میان عملکردهای لایه ۲ و لایه ۳ تقسیم شود. .IP \(bu 2 استفاده از کلاس‌های توصیف‌گر سفارشی کاملاً متوقف شده است. .IP \(bu 2 کلاس‌های استراتژی و اشیاء سینگلتون با گروهی از ماژول‌های استراتژی در فضای نام اختصاصی خود یعنی netaddr.strategy جایگزین شده‌اند. اکنون هر شیء آدرس IP یا EUI به جای یک شیء سینگلتون، ارجاعی به یک ماژول را نگهداری می‌کند. .IP \(bu 2 بسیاری از عملیاتی که پیش‌تر متدهای ایستای کلاس بودند، اکنون به صورت توابع در ماژول‌های مربوطه ارائه می‌شوند. برای جزئیات به مستندات API مراجعه کنید. .IP \(bu 2 کلاس‌های IP و CIDR به ترتیب با دو کلاس جدید به نام‌های IPAddress و IPNetwork جایگزین شده‌اند. این تغییر نام مهم است زیرا بخش IP در netaddr به‌طور کامل بازطراحی شده است. مفهوم یک آدرس IP تکی و یک شبکه یا زیرشبکه IP بسیار واضح‌تر شده است. اشیاء IPAddress اکنون مقادیر اسکالر واقعی هستند و در بستر لیست یا تاپل ارزیابی نمی‌شوند. آن‌ها همچنین از مفهوم netmask یا پیشوند CIDR پشتیبانی نمی‌کنند؛ این وظیفه اصلی شیء IPNetwork است. .IP \(bu 2 محدوده‌های دلخواه IP همچنان پشتیبانی می‌شوند، اما بسیاری از عملکردهای آن‌ها از طریق توابع کاربردی نیز ارائه شده است. .IP \(bu 2 روال‌های انطباق الگوی IP (که قبلاً با نام Wildcards شناخته می‌شدند) به زیرماژول اختصاصی خود منتقل شده‌اند. .IP \(bu 2 کلاس جدید IPSet اضافه شده که به‌طور کامل مجموعه‌های تغییرپذیر پایتون را شبیه‌سازی می‌کند. این کلاس جایگزین بسیاری از کلاس‌های آزمایشی و ناقص در نسخه‌های 0.5.x و 0.6.x مانند IPRangeSet و CIDRGroup شده است. برای جزئیات به مستندات مراجعه کنید. .IP \(bu 2 تمام متدها و ویژگی‌هایی که قبلاً از مشخصه قالب‌بندی \(aqfmt\(aq استفاده می‌کردند یا از آن پشتیبانی می‌کردند، دیگر این کار را انجام نمی‌دهند. در تمام موارد، اشیاء اکنون به گونه‌ای بازگردانده می‌شوند که از فراخوانی‌های عبوری بدون عوارض جانبی پشتیبانی کنند. بر عهده کاربر است که در صورت نیاز، داده‌ها را با فرمت مناسب از اشیاء IPAddress بازگردانده‌شده استخراج کند. .IP \(bu 2 آزمون‌های واحد برای پشتیبانی از آزمون‌های مبتنی بر docstring که در مجموعه‌های آزمون بسته‌بندی شده‌اند، کاملاً بازنویسی شده‌اند. این آزمون‌ها بسیار کاربردی هستند زیرا در ترکیب با نحو ویکی نقش مستندات را نیز ایفا می‌کنند. بررسی پوشش کد نیز با استفاده از coverage 3.x پیاده‌سازی شده است. .IP \(bu 2 ابزار nash \- یک ابزار شل نوپا برای کتابخانه netaddr (نیازمند IPython). .IP \(bu 2 پشتیبانی از RFC 1924 اضافه شد ;\-) .UNINDENT.SS اشکالات خاص برطرف‌شده در این انتشار .sp رفع مسئله 13 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 جستجو برای تطابق در فهرستی از اشیاء CIDR .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 26 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 بازطراحی و حذف استفاده از isinstance() .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 28 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از عملیات بلوک شبکه .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 34 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اشکال در عملیات جمع؟ .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.6.4 .sp تاریخ: 11 اوت 2009 .SS اشکالات خاص برطرف‌شده در این انتشار .sp رفع مسئله 40 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 ساخت RPM با \(dqpython setup.py bdist_rpm\(dq با خطاهای متعددی شکست می‌خورد .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.6.3 .sp تاریخ: 23 ژوئن 2009 .SS تغییرات نسبت به 0.6.2 .INDENT 0.0 .IP \(bu 2 اصلاح پایان خطوط (line endings) در تعدادی از فایل‌های جدید ایجادشده تحت Windows. .IP \(bu 2 تنظیم ترتیب مقادیر در چندتایی (tuple) ارسال‌شده به تابع hash() در متد __hash__ کلاس‌های IP و IPRange، جهت یکسان‌سازی آن با مقادیر مورد استفاده در مقایسه‌های متد __eq__ (روش بهینه در Python). .IP \(bu 2 افزودن تعدادی آزمون واحد (unit test) برای بهبود پوشش کد (code coverage). .UNINDENT .SS اشکالات خاص برطرف‌شده در این انتشار .sp رفع مسئله 33 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 تفریق CIDR برای اشیاء CIDR خارج از محدوده با خطا مواجه می‌شود .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 35 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 خطای نصب (در مفسرهای Python که در آن‌ها socket.has_ipv6 مقدار False دارد) .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 36 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 عدم موفقیت netaddr.CIDR در تجزیه CIDR مسیر پیش‌فرض (default route) .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 37 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اشکال در عملگر بیتی AND برای نشانی‌های IP .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 38 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 درخواست ویژگی: Addr.__nonzero__ .UNINDENT .UNINDENT .UNINDENT .sp رفع مسئله 39 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 تابع CIDR.abbrev_to_verbose() قواعد ماسک شبکه کلاس‌بندی‌شده (classful netmask) ضمنی را به‌صورت یکپارچه اعمال نمی‌کند .UNINDENT .UNINDENT .UNINDENT.SS انتشار: 0.6.2 .sp تاریخ: ۱۳ آوریل ۲۰۰۹ .SS تغییرات از نسخه 0.6.1 .INDENT 0.0 .IP \(bu 2 تازه‌سازی فایل‌های داده‌ی IEEE و IANA با آخرین بازبینی‌ها از نشانی‌های اینترنتی مربوطه. .INDENT 2.0 .IP \(bu 2 ثبت فضای آدرس IPv4 در IANA (آخرین به‌روزرسانی 2009\-03\-11) .IP \(bu 2 آدرس‌های چندپخشی اینترنت (Internet Multicast Addresses) (آخرین به‌روزرسانی 2009\-03\-17) .IP \(bu 2 فایل‌های OUI و IAB مربوط به IEEE (آخرین به‌روزرسانی 2009\-04\-13) .UNINDENT .IP \(bu 2 افزودن توابع get_latest_files() به هر دو ماژول netaddr.eui و netaddr.ip جهت کمک به خودکارسازی ساخت انتشارها. .UNINDENT .SS رفع باگ‌های خاص انجام‌شده در این انتشار .sp رفع مشکل Issue 32 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 متد Addr.__ne__ پاسخ نادرست برمی‌گرداند .UNINDENT .UNINDENT .UNINDENT .SS انتشار: 0.6.1 .sp تاریخ: ۶ آوریل ۲۰۰۹ .SS تغییرات از نسخه 0.6 .INDENT 0.0 .IP \(bu 2 افزودن فایل COPYRIGHT به همراه جزئیات و انتساب مالکیت برای تمام فایل‌های شخص ثالث همراه با netaddr. .IP \(bu 2 حداقل نسخه مورد نیاز Python اکنون از 2.3.x به 2.4.x تغییر یافته است. .INDENT 2.0 .IP \(bu 2 کدهای سازگاری با Python 2.3 در بسیاری از بخش‌های کد حذف شده‌اند. .IP \(bu 2 دکوراتورهای @property و @staticmethod اکنون در سرتاسر کد به همراه تکرارکننده‌های داخلی reversed() و sorted() استفاده می‌شوند. .IP \(bu 2 بررسی مشخصی برای نسخه افزوده شده است که در صورت اجرای netaddr روی مفسر Python با نسخه < 2.4.x استثنای RuntimeError ایجاد می‌کند. .UNINDENT .IP \(bu 2 آدرس‌های عدد صحیح فرستاده‌شده به سازنده‌های IP() و EUI() در بیشتر موارد دیگر نیازی به آرگومان اجباری نوع دوم آدرس (AT_*) ندارند. این مورد اکنون تنها برای ابهام‌زدایی میان آدرس‌های IPv4/IPv6 با مقدار عددی یکسان ضروری است. همین رفتار برای شناسه‌های EUI\-48/EUI\-64 نیز صدق می‌کند. در صورت ارائه صریح آرگومان نوع دوم آدرس، بهبود اندکی در سرعت حاصل می‌شود. .IP \(bu 2 آدرس‌های IPv6 بازگردانده‌شده توسط EUI.ipv6_link_local() اکنون همیشه دارای پیشوند زیرشبکه /64 هستند. .IP \(bu 2 ترتیب مرتب‌سازی پیش‌فرض کلاس‌های تجمیعی (IPRange، CIDR و Wildcard) (مجدداً) تغییر کرد. آن‌ها اکنون ابتدا بر اساس اولین آدرس و سپس بر اساس اندازه بلوک شبکه از بزرگ‌ترین به کوچک‌ترین مرتب می‌شوند که طبیعی‌تر به نظر می‌رسد. .IP \(bu 2 رفع یک باگ در متد ایستان CIDR.abbrev_to_verbose() که در آن به آدرس‌های IPv4 با ۴ بایت (یعنی آدرس‌های غیرجزئی) با استفاده از قوانین مختصر، پیشوند زیرشبکه اختصاص داده می‌شد. همه آدرس‌های کامل IPv4 در صورت عدم ارائه صریح، باید همواره پیشوند /32 دریافت کنند. .IP \(bu 2 گسترش آدرس‌های مختصر در سازنده CIDR اکنون اختیاری است و می‌تواند توسط آرگومان بولی جدید \(aqexpand_abbrev\(aq کنترل شود. .IP \(bu 2 افزودن متد ایستان جدید CIDR.summarize() که فهرست‌هایی از آدرس‌های IP و CIDRها را به فشرده‌ترین شکل ممکن تبدیل می‌کند. برای کوچک‌سازی فهرست‌های بزرگ و موردی آدرس‌ها عالی است! .IP \(bu 2 افزودن متدهای previous() و next() به کلاس‌های CIDR که زیرشبکه‌های CIDR هم‌اندازه را در هر دو طرف یک CIDR مشخص بازمی‌گردانند. برای CIDR با مقدار 192.0.2.0/24، متد previous مقدار 192.0.1.0/24 و متد next مقدار 192.0.3.0/24 را بازمی‌گرداند. همچنین یک اندازه گام اختیاری را می‌پذیرد (پیش‌فرض 1 است). .IP \(bu 2 افزودن متد supernet() به کلاس CIDR که مولدی از تمام زیرشبکه‌های دربرگیرنده CIDR فعلی را برمی‌گرداند که با کاهش مقدار prefixlen در هر مرحله تا رسیدن به صفر به دست می‌آیند. .IP \(bu 2 تغییر نحوه عملکرد کد جایگزین (fallback) هنگامی که ماژول socket فاقد توابع و ثابت‌های مهم است. .IP \(bu 2 حذف گزینه‌های حروف بزرگ (uppercase) از سازنده‌ها و بخش‌های درونی Strategy، زیرا این رفتار به‌راحتی با استفاده از گزینه word_fmt قابل بازتولید است و به کد کمتری نیاز دارد (word_fmt=\(aq%X\(aq). .UNINDENT.SS "رفع باگ‌های خاص انجام‌شده در این انتشار" .sp FIXED Issue 23 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 بهبود قالب‌بندی نشانی‌های IPv6 نگاشت‌شده/سازگار با IPv4 .UNINDENT .UNINDENT .UNINDENT .sp FIXED Issue 24 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 باگ در CIDR.subnet() هنگام استفاده از آرگومان fmt .UNINDENT .UNINDENT .UNINDENT .sp FIXED Issue 29 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 آرگومان count متد CIDR.subnet طبق مستندات کار نمی‌کند .UNINDENT .UNINDENT .UNINDENT .sp FIXED Issue 30 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 عدم سازگاری با Python 2.3 .UNINDENT .UNINDENT .UNINDENT .sp FIXED Issue 31 \- \% .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 ترتیب بایت‌ها در مستندات گیج‌کننده یا نادرست بود .UNINDENT .UNINDENT .UNINDENT .SS "انتشار: 0.6" .sp تاریخ: ۲۰ ژانویه ۲۰۰۹ .SS "تغییرات نسبت به 0.5.x" .INDENT 0.0 .IP \(bu 2 تغییرات فضای نام (Namespace) .sp ۳ زیرفضای نام جدید اضافه شده است:\- .INDENT 2.0 .IP \(bu 2 netaddr.eui .UNINDENT .sp در حال حاضر شامل کلاس‌های IEEE OUI و IAB و کدهای جستجو (lookup) است. .INDENT 2.0 .IP \(bu 2 netaddr.ip .UNINDENT .sp در حال حاضر شامل کدهای جستجوی IPv4، IPv6 و چندپخشی (multicast) IPv4 متعلق به IANA است. .INDENT 2.0 .IP \(bu 2 netaddr.core .UNINDENT .sp در حال حاضر تنها شامل چند کلاس است که بین کدهای netaddr.eui و netaddr.ip به اشتراک گذاشته شده‌اند. .sp لطفاً توجه داشته باشید: این تغییر بخشی از یک بازسازی درونی دومرحله‌ای در netaddr است. در انتشار‌های آینده، قابلیت‌های لایه ۲ MAC/EUI از قابلیت‌های لایه ۳ IP، CIDR و Wildcard تفکیک خواهند شد. تمام کدهای مشترک به netaddr.core منتقل خواهند شد. پس از تکمیل این مهاجرت (که انتظار می‌رود در نسخه 0.7 انجام شود)، فضاهای نام netaddr.address و netaddr.strategy حذف خواهند شد. لطفاً تلاش کنید از این انتشار به بعد به تمام موارد مورد نیاز خود از طریق فضای نام سطح بالای netaddr دسترسی پیدا کنید. برای اطلاع از جزئیات مربوط به ثابت‌ها، اشیاء، کلاس‌ها و توابع در نظر گرفته‌شده برای رابط عمومی، netaddr.__all__ را بررسی کنید. .IP \(bu 2 افزودن جستجوهای اطلاعاتی IEEE و IANA .INDENT 2.0 .IP \(bu 2 کلاس‌های IP() و EUI() اکنون دارای یک متد info() اضافی هستند که از طریق آن می‌توان به اطلاعات زمینه‌ای درباره نشانی‌های خود دسترسی پیدا کرد. این داده‌ها به ترتیب توسط IANA و IEEE منتشر شده و مستقیماً از فایل‌های متنی گنجانده‌شده در netaddr (که به‌صورت عمومی برای دانلود آنلاین موجودند) خوانده می‌شوند. جزئیات بیشتر در docstring کلاس‌های تجزیه‌کننده مربوطه موجود است. در انتشار‌های بعدی netaddr تلاش خواهد شد تا همگام با هرگونه به‌روزرسانی در این فایل‌ها پیش برود. .IP \(bu 2 کلاس EUI() با افزودن کلاس‌های OUI() و IAB() به‌روزرسانی شده است. آن‌ها دسترسی مبتنی بر شیء به داده‌های بازگردانده‌شده از طریق متد EUI.info() را فراهم می‌کنند. لطفاً برای جزئیات به مستندات API موجود در netaddr مراجعه کنید. .IP \(bu 2 افزودن استثنای جدید NotRegisteredError که در صورت عدم تطابق یک EUI با هر یک از ورودی‌های ثبتی فعلی در فایل‌های رجیستری IEEE برانگیخته می‌شود. .UNINDENT .IP \(bu 2 حذف کلاس Addr() از رابط عمومی .INDENT 2.0 .IP \(bu 2 این کلاس تنها برای استفاده داخلی در نظر گرفته شده بود و ممکن است استفاده از آن در آینده به نفع تبدیل شدن به یک کلاس پایه انتزاعی در انتشار‌های بعدی منسوخ شود. .UNINDENT .IP \(bu 2 حذف کلاس AddrRange() .INDENT 2.0 .IP \(bu 2 با کلاس اختصاصی‌تر IPRange() جایگزین شد. AddrRange() در عمل چندان کاربردی نبود و زمان زیادی صرف توضیح مزایای نظری آن در برابر کارایی واقعی‌اش در استفاده‌های روزمره می‌شد. .UNINDENT .IP \(bu 2 افزودن کلاس جدید IPRange() .INDENT 2.0 .IP \(bu 2 کلاس پایه جدید برای CIDR() و Wildcard(). .IP \(bu 2 یک «قابلیت فوق‌العاده» در این کلاس جدید، متدهای جدید iprange()، cidrs() و wildcard() هستند که امکان جابه‌جایی و استفاده آسان میان هر ۳ قالب را فراهم می‌کنند. IPRange(\(aqx\(aq, \(aqy\(aq).cidrs() به‌ویژه برای بازگرداندن تمامی CIDRهای میانی بین ۲ نشانی IP دلخواه بسیار سودمند است. .IP \(bu 2 کلاس IPRange() بستر مناسبی برای ارائه چند متد جدید در دسترسِ زیرکلاس‌ها است؛ شامل متدهای issupernet()، issubnet()، adjacent() و overlaps(). .IP \(bu 2 متد قبلی با نام data_flavour() (مجدداً) به نام مناسب‌تر format() تغییر نام یافته است. .UNINDENT .IP \(bu 2 به‌روزرسانی‌های کلاس IP() .INDENT 2.0 .IP \(bu 2 متدهای is_netmask() و is_hostmask() بهینه‌سازی شده‌اند و اکنون هر دو حدود ۴ برابر سریع‌تر از قبل عمل می‌کنند! .IP \(bu 2 افزودن متدهای wildcard() و iprange() که اشیاء از پیش مقداردهی‌شده از آن کلاس‌ها را بر پایه netmask / پیشوند زیرشبکه فعلی بازمی‌گردانند. .IP \(bu 2 متدهای کپی سازنده (copy constructor) شامل ipv4() و ipv6() اکنون مقدار ویژگی prefixlen را حفظ می‌کنند و همچنین از گزینه‌های IPv6 برای بازگرداندن نشانی‌های IPv6 نگاشت‌شده به IPv4 یا سازگار با IPv4 پشتیبانی می‌کنند. .IP \(bu 2 افزودن متدهای جدید is_loopback()، is_private()، is_link_local()، is_ipv4_mapped() و is_ipv4_compat() که همگی عملکردی واضح و مشخص دارند. .IP \(bu 2 افزودن یک متد bin() که یک نشانی IP را در همان قالب نوع توکار bin() در استاندارد پایتون (\(aq0bxxx\(aq) ارائه می‌دهد که اکنون در Python 2.6.x و بالاتر در دسترس است. .IP \(bu 2 افزودن یک متد packed() که یک نشانی IP را در قالب رشته باینری بسته‌بندی‌شده، مناسب برای ارسال مستقیم به فراخوانی‌های سوکت پایتون، فراهم می‌کند. .UNINDENT .IP \(bu 2 به‌روزرسانی‌های تابع مولد nrange() .INDENT 2.0 .IP \(bu 2 این تابع اکنون به‌طور پیش‌فرض به جای اشیاء Addr()، اشیاء IP() را بازمی‌گرداند. .UNINDENT .IP \(bu 2 به‌روزرسانی‌های کلاس CIDR() .INDENT 2.0 .IP \(bu 2 گزینه \(aqstrict_bitmask\(aq در سازنده کلاس CIDR تغییر نام داده و اکنون تنها \(aqstrict\(aq است (نیاز کمتر به تایپ). .IP \(bu 2 پشتیبانی از پیشوندهای سبک Cisco ACL (ماسک میزبان یا hostmask). این قابلیت برای کلاس IP() نیز فراهم شده است. آن‌ها پیش از اعمال روی نشانی پایه، به معادل‌های netmask خود تبدیل می‌شوند. .UNINDENT .UNINDENT.IP \(bu 2 یک متد مولد (generator) جدید subnet() اضافه شد که تکرارکننده‌هایی به CIDRهای زیرشبکه موجود در مرزهای شیء CIDR فعلی بازمی‌گرداند؛ برای نمونه یک CIDR با /24 می‌تواند نشانی‌هایی با پیشوندهای زیرشبکه بین /25 و /32 ارائه دهد. .IP \(bu 2 یک متد جدید span() اضافه شد که فهرستی از IP، IPRange، CIDR و/یا Wildcardها را دریافت کرده و یک CIDR واحد بازمی‌گرداند که کمترین و بیشترین نشانی‌های مرزی را پوشش می‌دهد (\(aqspans\(aq). ویژگی مهم این کلاس آن است که تنها یک CIDR واحد بازگردانده می‌شود و این‌که (احتمالاً) با نشانی‌های آغاز و پایان هم‌پوشانی دارد. مهم‌ترین جنبه‌ی این متد آن است که چپ‌ترین مجموعه‌ی بیت‌های مشترک در میان تمام نشانی‌های ارائه‌شده را شناسایی می‌کند. این همان ساختار زیربنایی است که باعث کارکرد درست بسیاری از قابلیت‌های دیگر می‌شود. .IP \(bu 2 اگرچه IPv6 از مفهوم نشانی پخش همگانی (broadcast address) پشتیبانی نمی‌کند، پس از کمی تأمل تصمیم گرفتم متدهای network() و broadcast() را به کلاس CIDR اضافه کنم. این یک رفتار خاص در رابط است که کاربران انتظار آن را دارند، بنابراین جهت سهولت در استفاده افزوده شده است. .IP \(bu 2 متدهای network()، broadcast()، hostmask() و netmask() در فراخوانی‌های توکار property() کپسوله‌سازی شده‌اند تا به صورت ویژگی‌های فقط‌خواندنی (read\-only) نمایش داده شوند. .UNINDENT .IP \(bu 2 اکنون نمایش‌های رشته‌ای بسیار بیشتری از نشانی‌های MAC و IPv4 پشتیبانی می‌شوند .INDENT 2.0 .IP \(bu 2 بهبودهایی در هر دو کلاس EUI و IP ایجاد شده است. آن‌ها اکنون قالب‌های نشانی معتبر بسیار بیشتری را نسبت به گذشته می‌پذیرند. با تشکر از تمامی گزارش‌های باگ ارسال‌شده. .UNINDENT .IP \(bu 2 تغییر رفتار متد \fB__repr__()\fP .INDENT 2.0 .IP \(bu 2 در استفاده از \fBrepr()\fP اکنون فرض می‌شود که پیش از اجرای آن‌ها، دستور \fBfrom netaddr import *\fP را اجرا کرده‌اید. آن‌ها دیگر فضای نام مبدأ اشیاء را مشخص نمی‌کنند، چرا که تا حدی غیرضروری بود و به خواندن متن زیادی روی صفحه می‌انجامید. به هر حال، آن‌ها به‌زودی درون فضای نام جابه‌جا خواهند شد، بنابراین بهتر است فرض نشود که در جایی غیر از زیرمجموعهٔ مستقیم خود netaddr قرار دارند. .UNINDENT .IP \(bu 2 تغییر نام ویژگی \(aqklass\(aq به \(aqfmt\(aq (format) .INDENT 2.0 .IP \(bu 2 اکنون به عنوان ویژگی \(aqformat callable\(aq شناخته می‌شود؛ تغییری ناخوشایند اما ضروری. \(aqklass\(aq در ابتدا انتخاب نام نامناسبی بود، زیرا اغلب حتی به یک شیء کلاس اشاره نمی‌کرد و در عین حال از ارجاع به انواع Python، توابع توکار و موارد فراخوانی‌شدنی (callables) تعریف‌شده توسط کاربر نیز پشتیبانی می‌کرد. .UNINDENT .IP \(bu 2 بازنویسی کامل و یکپارچه‌سازی آزمون‌های واحد (unit tests). .INDENT 2.0 .IP \(bu 2 اکنون بیش از ۱۰۰ آزمون، تمام جنبه‌های عملکردی API و کتابخانه را پوشش می‌دهند. .IP \(bu 2 انتقال تمام آزمون‌ها به یک فایل واحد. آزمون‌های اضافی متعددی به همراه بررسی‌های رابط افزوده شده‌اند تا اطمینان حاصل شود که netaddr در تمامی انتشارها همواره مجموعه‌ای قابل پیش‌بینی از ویژگی‌ها و متدها را ارائه می‌دهد. .UNINDENT .IP \(bu 2 پشتیبانی نوپا از eggهای Python و setuptools. .INDENT 2.0 .IP \(bu 2 برای آزمایش این مورد به کمک نیاز است، زیرا شخصاً از آن استفاده نمی‌کنم. .UNINDENT .UNINDENT .SS "رفع باگ‌های خاص انجام‌شده در این انتشار (Specific bug fixes addressed in this release)" .INDENT 0.0 .IP \(bu 2 سرانجام الگوریتم فشرده‌سازی نشانی رشته‌ای IPv6 اصلاح شد تا اکنون با فراخوانی‌های inet_ntop() و inet_pton() ماژول socket سازگار باشد (روی تمام پلتفرم‌ها در دسترس نیست). .UNINDENT .SS "قابلیت‌های آزمایشی (Experimental Features)" .INDENT 0.0 .IP \(bu 2 افزودن عملگرهای بیتی (bitwise) به کلاس IP .INDENT 2.0 .IP \(bu 2 دقیقاً همان کاری را می‌کند که از نامش برمی‌آید. تأثیری بر مقدار خود شیء IP نمی‌گذارد، بلکه پس از اعمال عملیات، یک IP جدید را بازمی‌گرداند. .UNINDENT .IP \(bu 2 کلاس IPRangeSet() اضافه شد (آزمایشی). .INDENT 2.0 .IP \(bu 2 هدف از این کلاس این است که به شما امکان دهد مجموعه‌هایی از اشیاء منحصربه‌فرد IP()، IPRange()، CIDR() و Wildcard() ایجاد کنید. این کلاس امکان پیمایش روی IPهای درون مجموعه و همچنین چندین عملیات مبتنی بر عضویت نظیر any_match()، all_matches()، min_match() و max_match() را فراهم می‌آورد. .IP \(bu 2 کارهای بسیار بیشتری در اینجا برای انجام باقی مانده است. لطفاً در صورت مشاهده، باگ‌ها و درخواست‌های قابلیت‌های جدید را برای آن گزارش کنید. بهبودهایی برای این بخش در نسخه 0.7 ارائه خواهد شد. .UNINDENT .UNINDENT.SS انتشار: 0.5.2 .sp تاریخ: ۲۹ سپتامبر ۲۰۰۸ .SS باگ‌های خاص رفع‌شده در این انتشار .INDENT 0.0 .IP \(bu 2 رفع مسئلهٔ شماره ۱۵ در سامانهٔ رهگیری باگ. اعتبارسنجی و تبدیل نادرست مقادیر آدرس‌های IPv6 نگاشت‌شده به IPv4 در کلاس IPv6Strategy. با آزمون‌های واحد (unit test) پوشش داده شد. .IP \(bu 2 کلاس PrefixLenDescriptor() به‌روزرسانی شد تا تغییرات مشخصهٔ CIDR.prefixlen، مقادیر CIDR.first و CIDR.last را نیز به‌روزرسانی کرده و آن‌ها را همگام نگه دارد. با آزمون‌های واحد پوشش داده شد. .IP \(bu 2 متد IP.hostname() هنگام شکست در جستجوی DNS مقدار None را بازمی‌گرداند. .UNINDENT .SS انتشار: 0.5.1 .sp تاریخ: ۲۳ سپتامبر ۲۰۰۸ .SS باگ‌های خاص رفع‌شده در این انتشار .INDENT 0.0 .IP \(bu 2 سازندهٔ کلاس CIDR برای آدرس‌های معتبر رشته‌ای یونیکد که در نسخه‌های قبلی کار می‌کردند، خطای TypeError برمی‌انگیخت. رفع شد و با یک آزمون واحد پوشش داده شد. .IP \(bu 2 متدهای CIDR.netmask() و CIDR.hostmask() حاوی خطاهای کدی بودند که باعث شکست آن‌ها می‌شد. مشکل برطرف و با آزمون واحد پوشش داده شد. .UNINDENT .SS انتشار: 0.5 .sp تاریخ: ۱۹ سپتامبر ۲۰۰۸ .SS تغییرات نسبت به 0.4.x .sp \fBعمومی\fP .INDENT 0.0 .IP \(bu 2 دسترسی به تمامی مشخصه‌های مهم اشیاء در تمامی کلاس‌های netaddr اکنون از طریق کلاس‌های سفارشی پروتکل توصیف‌گر (descriptor) پایتون صورت می‌گیرد. این امر منطق درونی کلاس را بسیار ساده کرده و تغییر مشخصه‌های بیرونی را بسیار ایمن‌تر و کم‌خطاتر ساخته است. همچنین کلاس‌های تجمیعی مانند CIDR و Wildcard را که تا پیش از این انتشار فقط‌خواندنی بودند، عملاً به خواندنی\-نوشتنی تبدیل کرده است. .IP \(bu 2 نحوهٔ محاسبهٔ ترتیب مرتب‌سازی برای نمونه‌های (زیر)کلاس Addr و AddrRange اصلاح شد تا علاوه بر مقدار عددی آدرس یا محدودهٔ آدرس، نوع آدرس نیز لحاظ شود. ترتیب مرتب‌سازی صعودی به صورت IPv4، IPv6، EUI\-48 و EUI\-64 است. اکنون توالی‌های نمونه‌های (زیر)کلاس AddrRange به درستی مرتب می‌شوند! .IP \(bu 2 مقایسهٔ میان نمونه‌های (زیر)کلاس‌های Addr و AddrRange اکنون به جای برانگیختن AttributeError، مقدار False را بازمی‌گرداند. .IP \(bu 2 بررسی‌ها و کدهای دورزدن مشکل (workaround) برای محیط‌های زمان اجرای پایتونی که از باگ بدنام inet_aton(\(aq255.255.255.255\(aq) در ماژول socket رنج می‌بردند اضافه شد. این مشکل اخیراً در Python 2.4.x روی معماری PowerPC در سیستم‌عامل MacOS X شناسایی شد. این راه‌حل در مواردی که ماژول socket در دسترس نیست (برای نمونه در Google App Engine) نیز اعمال می‌شود. .IP \(bu 2 تمام موارد برانگیختن عمومی Exception در ماژول strategy با استثناهای مشخص‌تر، عمدتاً ValueError جایگزین شد (این موارد ناخواسته از انتشار 0.4 جا مانده بودند). .IP \(bu 2 عملیات‌های __hash__() برای کلاس‌های Addr و AddrStrategy پیاده‌سازی شدند. این امکان را فراهم می‌کند تا از اشیاء IP، CIDR و Wildcard به عنوان کلید در دیکشنری‌ها و به عنوان عنصر در مجموعه‌ها (sets) استفاده کنید. لطفاً توجه داشته باشید \- این ویژگی در حال حاضر آزمایشی است و ممکن است در انتشار‌های بعدی تغییر کند. .IP \(bu 2 عملیات __ne__() به کلاس‌های Addr و AddrRange اضافه شد. .IP \(bu 2 با پیروی از «قانون دیمیتر» (\(aqLaw of Demeter\(aq)، به نوع آدرس نمونه‌های (زیر)کلاس Addr و AddrRange می‌توان مستقیماً با استفاده از مشخصه دسترسی داشت:\- .INDENT 2.0 .INDENT 3.5 obj.addr_type # 0.5 onwards .UNINDENT .UNINDENT .sp به جای اینکه نیاز باشد از طریق شیء strategy عمل کرد:\- .INDENT 2.0 .INDENT 3.5 obj.strategy.addr_type # 0.4 and earlier .UNINDENT .UNINDENT .IP \(bu 2 نام دیکشنری جستجوی AT_DESCR به AT_NAMES تغییر یافت. واردسازی‌های (imports) نامعتبر و تکراری از تمام ماژول‌ها حذف شدند. .UNINDENT .sp \fBتغییرات کلاس Addr\fP .INDENT 0.0 .IP \(bu 2 متد setvalue() از کلاس Addr حذف شد و تمام موارد استفاده از __setattr__() با توصیف‌گرهای سفارشی در سراسر کد جایگزین شد. .UNINDENT .sp \fBتغییرات کلاس IP\fP .INDENT 0.0 .IP \(bu 2 ابهام موجود در مشخصه‌های masklen و prefixlen در کلاس IP برطرف شد. اکنون prefixlen نشان‌دهندهٔ تعداد بیت‌هایی است که netmask را برای یک آدرس IP مشخص می‌کنند. متد جدید netmask_bits() در صورتی که متد is_netmask() مقدار True را بازگرداند، تعداد بیت‌های غیرصفر را در یک شیء IP برمی‌گرداند. مقدار prefixlen غیر از /32 برای آدرسی که is_netmask() برای آن مقدار True برمی‌گرداند نامعتبر است و استثنای ValueError برمی‌انگیزد. .IP \(bu 2 متد family() از کلاس IP حذف شد؛ زیرا اطلاعاتی را تکرار می‌کرد که اکنون توسط مشخصهٔ prefixlen ارائه می‌شود. .IP \(bu 2 کلاس IP دارای چندین متد جدید است. متدهای is_multicast() و is_unicast() به سرعت دستهٔ آدرس IP را مشخص می‌کنند و متدهای ipv4() و ipv6() بسته به زمینه، به عنوان تبدیل‌های IPv4 <\-> IPv6 یا سازنده‌های رونوشت (copy constructors) عمل می‌کنند. .IP \(bu 2 ورودی‌های جستجوی معکوس DNS اکنون یک نویسهٔ نقطه (.) پایانی در سطح بالا دارند که به آن‌ها افزوده شده است. .IP \(bu 2 متد hostname() به نمونه‌های IP اضافه شد که یک جستجوی معکوس DNS انجام می‌دهد. .IP \(bu 2 متد __str__() در کلاس IP اکنون پیشوند زیرشبکه را حذف می‌کند؛ این پیشوند برای آدرس‌های IPv4 با مقدار /32 و آدرس‌های IPv6 با مقدار /128 ضمنی است. پیشوند زیرشبکه در مقدار بازگشتی برای تمامی مقادیر دیگر حفظ می‌شود. .UNINDENT .sp \fBتغییرات کلاس AddrRange\fP .INDENT 0.0 .IP \(bu 2 کلاس AddrRange دیگر نمونه‌های (زیر)کلاس‌های Addr را برای آدرس‌های اول و آخر محدوده ذخیره نمی‌کند. متغیرهای نمونهٔ self.start_addr و self.stop_addr به self.first و self.last تغییر نام یافته و متدهای obj.first() و obj.last() حذف شده‌اند. .sp در عوض، self.first و self.last حاوی مقادیر عدد صحیح هستند و ارجاعی به یک شیء strategy ذخیره می‌شود. انجام این کار برای پیاده‌سازی منطق درونی بسیار کاربردی‌تر و تمیزتر است. .sp برای دریافت اشیاء (زیر)کلاس Addr (یا رشته‌ها، هگزادسیمال و غیره هنگام کار با مشخصهٔ klass)، از مقادیر اندیس obj[0] و obj[\-1] به ترتیب به عنوان جایگزینی برای obj.first() و obj.last() استفاده کنید. .IP \(bu 2 نمونه‌های (زیر)کلاس AddrRange اکنون عملگرهای افزایش، __iadd__()، و کاهش، __isub__()، را تعریف می‌کنند. این قابلیت به شما امکان می‌دهد CIDRها و Wildcardها را بر اساس اندازهٔ بلوک آن‌ها به بالا و پایین بلغزانید (\(aqslide\(aq). .IP \(bu 2 متد _retval() اکنون به data_flavour() تغییر نام یافته است \- بله، با املای بریتانیایی ;\-) لازم نیست خیلی نگران این موضوع باشید زیرا بیشتر برای استفادهٔ درونی است. نام مناسبی به آن دادم چرا که نیازی واقعی برای پنهان کردن این قابلیت، در صورتی که کاربران خواهان آن باشند، ندیدم. .UNINDENT .sp \fBتغییرات کلاس CIDR\fP .INDENT 0.0 .IP \(bu 2 سخت‌گیری سازندهٔ کلاس CIDR در رابطه با بیت‌های غیرصفر پس از اعمال ماسک بیتی پیشوند را می‌توان با استفاده از آرگومان اختیاری strict_bitmask=False غیرفعال کرد. این مقدار به صورت پیش‌فرض True (سخت‌گیری فعال) است. .IP \(bu 2 رفع یک باگ در تبدیل خلاصه‌شدهٔ CIDR. پیشوند زیرشبکه برای آدرس چندپخشی 224.0.0.0 اکنون به جای /8 برابر با /4 است. .IP \(bu 2 کلاس CIDR اکنون از تفریق میان دو شیء CIDR پشتیبانی می‌کند و فهرستی از باقی‌مانده را برمی‌گرداند. لطفاً توجه داشته باشید که شیء CIDR بزرگ‌تر باید در سمت چپ عبارت باشد، در غیر این صورت یک فهرست خالی بازگردانده می‌شود. متأسفیم، شما مجاز به ایجاد CIDRهای منفی نیستید ;\-) .IP \(bu 2 تابع abbrev_to_cidr() تغییر نام یافته و به متد ایستای CIDR.abbrev_to_verbose() تبدیل شده است. تغییر عمده‌ای در منطق آن ایجاد نشده است. .UNINDENT .sp \fBتغییرات کلاس Wildcard\fP .INDENT 0.0 .IP \(bu 2 کلاس Wildcard اکنون متد ایستای Wildcard.is_valid() را تعریف می‌کند که به شما امکان می‌دهد بدون نمونه‌سازی کامل یک شیء Wildcard، آزمون‌های اعتبارسنجی را روی رشته‌های wildcard انجام دهید. .UNINDENT.SS انتشار: 0.4 .sp تاریخ: ۷ اوت ۲۰۰۸ .SS تغییرات نسبت به 0.3.x .INDENT 0.0 .IP \(bu 2 تمام برانگیختن‌های عمومی Exception با استثناهای مشخص‌تر مانند TypeError و ValueError و با افزودن دو کلاس استثنای سفارشی، یعنی AddrFormatError و AddrConversionError جایگزین شده‌اند. .IP \(bu 2 کلاس IP اکنون پیشوند زیرشبکه (subnet prefix) را می‌پذیرد. برخلاف کلاس CIDR (پایین را ببینید)، این کلاس در مورد بیت‌های غیرصفر در سمت راست ماسک زیرشبکه ضمنی سخت‌گیر \fIنیست\fP. .IP \(bu 2 کلاس CIDR اکنون در مورد بیت‌های غیرصفر در سمت راست نت‌ماسک زیرشبکه ضمنی کاملاً سخت‌گیر است و در صورت وجود آن‌ها، با ارائه یک راهنمایی کاربردی درباره CIDR صحیحی که بر اساس پیشوند زیرشبکه ارائه‌شده باید استفاده شود، یک ValueError برمی‌انگیزد. .IP \(bu 2 کلاس CIDR اکنون از محدوده‌های اختصاری CIDR نیز پشتیبانی می‌کند و در صورتی که پیشوند زیرشبکه به‌صراحت مشخص نشده باشد، از قوانین قدیمی‌تر نشانی شبکه باکلاس (classful) برای تعیین آن استفاده می‌کند. شکل‌های پشتیبانی‌شده اکنون شامل 10، 10/8 و 192.168/16 هستند. در حال حاضر این گزینه‌ها فقط برای محدوده‌های نشانی CIDR در IPv4 پشتیبانی می‌شوند. .IP \(bu 2 متدهای __repr__() برای همه کلاس‌ها در ماژول netaddr تعریف شده‌اند که دستورهای پایتون قابل اجرایی تولید می‌کنند که می‌توان از آن‌ها برای بازسازی وضعیت هر شیء استفاده کرد. .IP \(bu 2 کلاس‌های CIDR و Wildcard اکنون دارای متدهایی هستند که از تبدیل بین این دو نوع تجمیعی پشتیبانی می‌کنند:\- .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 CIDR \-> Wildcard .IP \(bu 2 Wildcard \-> CIDR .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS تغییرات نگهداری و ساختاری .INDENT 0.0 .IP \(bu 2 بازبینی و مرتب‌سازی گسترده docstring با گنجاندن نحو اختصاصی epydoc برای بهبود مستندات خودکار تولیدشده API. .IP \(bu 2 بازبینی دقیق کد با استفاده از pylint. .IP \(bu 2 ماژول netaddr اکنون متغیر ویژه __version__ را تعریف کرده است که توسط setup.py نیز ارجاع داده می‌شود. .IP \(bu 2 برخی تغییرات جزئی در setup.py و MANIFEST.in. .IP \(bu 2 ثابت‌ها و کلاس‌های سفارشی Exception از strategy.py به __init__.py منتقل شدند. .IP \(bu 2 یک __all__ سازگار با * import برای فضای نام netaddr تعریف شده است که نیاز به کاوش بیش از حد در زیرماژول‌های address و strategy را برطرف می‌سازد. .IP \(bu 2 رفع چندین مشکل پایان خط (line\-ending) در چند فایل. .UNINDENT .SH "کپی‌رایت و تکثیر (COPYRIGHT)" .sp در اینجا اعلان‌های حق نشر قابل اعمال بر کتابخانه netaddr آورده شده است. .SS netaddr .sp حق نشر (c) 2008 David P. D. Moss بخش‌هایی حق نشر (c) 2020 مشارکت‌کنندگان netaddr .sp تحت مجوز BSD منتشر شده است. برای جزئیات به فایل LICENSE مراجعه کنید. .SS IANA (Internet Assigned Numbers Authority) .sp پروژه netaddr توسط IANA پشتیبانی مالی یا تأیید نشده است. .sp استفاده از داده‌های IANA (مرجع واگذاری اعداد اینترنتی) مشمول حق نشر بوده و با اجازه کتبی قبلی ارائه شده است. .sp فایل‌های داده IANA که همراه netaddr گنجانده شده‌اند، به هیچ وجه تغییر نیافته‌اند، بلکه تجزیه شده و از طریق یک API در دسترس کاربران نهایی قرار گرفته‌اند. .sp برای نشانی‌های اینترنتی مربوط به آخرین نسخه‌های فایل‌های مربوطه، فایل README و کد منبع را ببینید..SS "IEEE (مؤسسه مهندسان برق و الکترونیک)" .sp netaddr توسط IEEE حمایت مالی یا تأیید نشده است. .sp استفاده از داده‌های IEEE (مؤسسه مهندسان برق و الکترونیک) مشمول حق نشر (کپی‌رایت) است. برای جزئیات به نشانی اینترنتی زیر مراجعه کنید: .sp \% .sp فایل‌های دادهٔ IEEE گنجانده‌شده در netaddr به هیچ وجه دستکاری نشده‌اند، بلکه تجزیه شده و از طریق یک API در دسترس کاربران نهایی قرار گرفته‌اند. هیچ تضمینی وجود ندارد که فایل‌های ارجاع‌شده منسوخ نشده باشند. .sp برای نشانی‌های اینترنتی آخرین نسخه‌های فایل‌های مربوطه، فایل README و کد منبع را ببینید. .SH "مجوز (LICENSE)" .sp در اینجا مجوزهای مربوط به استفاده از کتابخانهٔ netaddr آورده شده است. .SS netaddr .sp حق نشر و مجوز (COPYRIGHT AND LICENSE) .sp Copyright (c) 2008 David P. D. Moss Portions Copyright (c) 2020 netaddr contributors .sp توزیع مجدد و استفاده در قالب‌های سورس و باینری، با یا بدون تغییر، مجاز است به شرطی که شرایط زیر برآورده شوند: .INDENT 0.0 .IP \(bu 2 توزیع‌های مجدد کد منبع باید اعلان حق نشر بالا، این فهرست شرایط و سلب مسئولیت زیر را در خود حفظ کنند. .IP \(bu 2 توزیع‌های مجدد در قالب باینری باید اعلان حق نشر بالا، این فهرست شرایط و سلب مسئولیت زیر را در مستندات و/یا سایر موارد ارائه‌شده همراه با توزیع بازتولید نمایند. .IP \(bu 2 نه نام David P. D. Moss و نه نام‌های مشارکت‌کنندگان نمی‌توانند برای تأیید یا تبلیغ محصولات مشتق‌شده از این نرم‌افزار بدون اجازهٔ کتبی و مشخص قبلی استفاده شوند. .UNINDENT .sp این نرم‌افزار توسط دارندگان حق نشر و مشارکت‌کنندگان به‌صورت «همان‌گونه که هست» (\(dqAS IS\(dq) ارائه می‌شود و هرگونه ضمانت صریح یا ضمنی، از جمله، اما نه محدود به، ضمانت‌های ضمنی قابلیت خرید و فروش و تناسب برای یک هدف خاص، سلب می‌شود. تحت هیچ شرایطی، دارندهٔ حق نشر یا مشارکت‌کنندگان در قبال هرگونه خسارت مستقیم، غیرمستقیم، اتفاقی، خاص، نمونه‌ای، یا تبعی (از جمله، اما نه محدود به، تهیهٔ کالاها یا خدمات جایگزین؛ از دست دادن استفاده، داده‌ها یا سود؛ یا وقفه در کسب‌وکار) به هر نحوی که ایجاد شده باشد و بر پایهٔ هر تئوری مسئولیت، خواه قراردادی، مسئولیت مطلق یا شبه‌جرم (از جمله سهل‌انگاری یا موارد دیگر) که به هر نحوی از استفاده از این نرم‌افزار ناشی شود، مسئولیتی نخواهند داشت، حتی در صورتی که احتمال وقوع چنین خسارتی تذکر داده شده باشد. .SH "نویسندگان (AUTHORS)" .INDENT 0.0 .IP \(bu 2 David P. D. Moss (نویسنده، نگه‌دارنده) \% .IP \(bu 2 Stefan Nordhausen (نگه‌دارنده) \% .IP \(bu 2 Jakub Stasiak (نگه‌دارنده) \% .UNINDENT .sp تحت مجوز BSD منتشر شده است (برای جزئیات به بخش مجوز \%<> مراجعه کنید). .SH "مشارکت‌کنندگان (CONTRIBUTORS)" .sp netaddr توسط David P. D. Moss نوشته شده و در حال حاضر توسط Jakub Stasiak نگه‌داری می‌شود. .sp این پروژه تحت مجوز BSD منتشر شده است. .sp افراد بسیاری با گزارش مشکلات، پیشنهاد بهبودهای گوناگون یا ارسال کدهای واقعی به netaddr کمک کرده‌اند. در اینجا فهرستی از این افراد (به ترتیب حروف الفبا) آورده شده است. به ما در کامل و بدون خطا نگه‌داشتن آن کمک کنید. .INDENT 0.0 .INDENT 3.5 Vincent Bernat .sp Sebastien Douche .sp John Eckersberg .sp Yi\-Jheng Lin .sp Clay McClure .sp Duncan McGreggor .sp Stefan Nordhausen .sp Brian F. Peters .sp James William Pye .sp Chaitan Rogers .sp Victor Stinner .sp Andrew Stromnov .UNINDENT .UNINDENT .sp با سپاس از همهٔ اعضای لیست پستی netaddr، کسانی که گزارش باگ ارسال کردند و همهٔ کسانی که به‌طور مستقیم و غیرمستقیم، توسعه و توزیع این کتابخانه را راهنمایی کرده و تحت تأثیر قرار دادند. .sp همچنین با تشکر به خاطر استفاده از مشارکت‌های کد زیر:\- .INDENT 0.0 .IP a. 3 دستور ۱۸.۱۱ از Python Cookbook با عنوان: \(dqFormatting Integers as Binary Strings\(dq .INDENT 3.0 .INDENT 3.5 Python Cookbook 2d ed. (O\(aqReilly Media 2005) ISBN 0596\-00797\-3 Alex Martelli, Anna Martelli Ravenscroft and David Ascher .UNINDENT .UNINDENT .IP b. 3 دستور ۴۶۶۲۸۶ در ASPN Cookbook با عنوان: \(dqInteger set type\(dq اثر Heiko Wundram .INDENT 3.0 .INDENT 3.5 \% .UNINDENT .UNINDENT .UNINDENT .sp و در پایان اما با همان اهمیت، تشکر از Guido van Rossum برای سخنان دلگرم‌کننده‌اش و برای هدیه دادن Python به همه ما..SH "نمایه‌ها و جدول‌ها (INDICES AND TABLES)" .INDENT 0.0 .IP \(bu 2 نمایه \%<> .IP \(bu 2 صفحهٔ جستجو \%<> .UNINDENT .SH "نویسنده (AUTHOR)" David P. D. Moss .SH "کپی‌رایت و تکثیر (COPYRIGHT)" 2008 David P. D. Moss، ۲۰۲۰ مشارکت‌کنندگان netaddr .\" End of generated man page.