{ "info": { "author": "Lucas Estienne, Daniel Innes", "author_email": "lucas@estienne.sh, daniel.w.innes@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# muddy\n\n[![PyPI version](https://badge.fury.io/py/muddy.svg)](https://badge.fury.io/py/muddy)\n\n**muddy** is a python package and CLI tool for generating MUD files ([RFC8520](https://tools.ietf.org/html/rfc8520)).\n\n## Usage\n\nThere are multiple ways to generate MUD objects, depending on the level of abstraction:\n\n```python\nfrom muddy.maker import make_mud\nfrom muddy.models import Direction, IPVersion, Protocol, MatchType\n\nmud = make_mud(1,'https://lighting.example.com/lightbulb2000', 48, True, 'The BMS Example Light Bulb', \n'https://lighting.example.com/lightbulb2000/documentation', [Direction.TO_DEVICE,Direction.FROM_DEVICE],\n IPVersion.IPV4, 'test.example.com', Protocol.ANY, MatchType.IS_MYMFG, [88,443], [88,443])\n```\n\nor\n\n```python\nfrom muddy.maker import make_mud, make_support_info\nfrom muddy.models import Direction, IPVersion, Protocol, MatchType\n\nsupport_info = make_support_info(1,'https://lighting.example.com/lightbulb2000', 48, True,\n 'The BMS Example Light Bulb', 'https://lighting.example.com/lightbulb2000/documentation')\n\nmud = make_mud(support_info , [Direction.TO_DEVICE,Direction.FROM_DEVICE],\n IPVersion.IPV4, 'test.example.com', Protocol.ANY, [88,443], [88,443], MatchType.IS_MYMFG)\n```\n\nor\n\n```python\nfrom muddy.maker import make_mud, make_acl_names, make_policy, make_acls\nfrom muddy.models import Direction, IPVersion, Protocol, MatchType\nimport random\n\nmud_name = f'mud-{random.randint(10000, 99999)}'\nacl = []\npolicies = {}\nfor direction_initiated in [Direction.TO_DEVICE,Direction.FROM_DEVICE]:\n acl_names = make_acl_names(mud_name, IPVersion.IPV4, direction_initiated)\n policies.update(make_policy(direction_initiated, acl_names))\n acl.append(make_acls([IPVersion.IPV4], 'test.example.com', Protocol.ANY, [88,443], [88,443], MatchType.IS_MYMFG,\n direction_initiated, acl_names))\n\nmud = make_mud(policies, acl, 1,'https://lighting.example.com/lightbulb2000', 48, True, 'The BMS Example Light Bulb', \n'https://lighting.example.com/lightbulb2000/documentation')\n```\n\nor\n\n```python\nfrom muddy.maker import make_mud, make_acl_names, make_policy, make_acls, make_support_info\nfrom muddy.models import Direction, IPVersion, Protocol, MatchType\nimport random\n\nsupport_info = make_support_info(1,'https://lighting.example.com/lightbulb2000', 48, True,\n 'The BMS Example Light Bulb', 'https://lighting.example.com/lightbulb2000/documentation')\n\n\nmud_name = f'mud-{random.randint(10000, 99999)}'\nacl = []\npolicies = {}\nfor direction_initiated in [Direction.TO_DEVICE,Direction.FROM_DEVICE]:\n acl_names = make_acl_names(mud_name, IPVersion.IPV4, direction_initiated)\n policies.update(make_policy(direction_initiated, acl_names))\n acl.append(make_acls([IPVersion.IPV4], 'test.example.com', Protocol.ANY, [88,443], [88,443], MatchType.IS_MYMFG,\n direction_initiated,acl_names))\n\nmud = make_mud(support_info, policies, acl)\n```\n\nTo obtain JSON for a MUD object, you may just `json.dumps(mud)`.\n\n## Example output\n\n```json\n{\n \"ietf-mud:mud\": {\n \"mud-version\": 1,\n \"mud-url\": \"https://lighting.example.com/lightbulb2000\",\n \"last-update\": \"2019-07-23T19:54:24\",\n \"cache-validity\": 48,\n \"is-supported\": true,\n \"systeminfo\": \"The BMS Example Light Bulb\",\n \"documentation\": \"https://lighting.example.com/lightbulb2000/documentation\",\n \"to-device-policy\": {\n \"access-lists\": {\n \"access-list\": [\n {\n \"name\": \"mud-52892-v4to\"\n }\n ]\n }\n },\n \"from-device-policy\": {\n \"access-lists\": {\n \"access-list\": [\n {\n \"name\": \"mud-52892-v4fr\"\n }\n ]\n }\n }\n },\n \"ietf-access-control-list:acls\": {\n \"acl\": [\n {\n \"name\": \"mud-52892-v4to\",\n \"type\": \"ipv4\",\n \"aces\": {\n \"ace\": [\n {\n \"name\": \"myman0-todev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n },\n {\n \"name\": \"myman1-todev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n },\n {\n \"name\": \"myman1-todev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n },\n {\n \"name\": \"myman2-todev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"mud-52892-v4fr\",\n \"type\": \"ipv4\",\n \"aces\": {\n \"ace\": [\n {\n \"name\": \"myman0-frdev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n },\n {\n \"name\": \"myman1-frdev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n },\n {\n \"name\": \"myman1-frdev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n },\n {\n \"name\": \"myman2-frdev\",\n \"matches\": {\n \"ietf-mud:mud\": {\n \"same-manufacturer\": []\n }\n },\n \"actions\": {\n \"forwarding\": \"accept\"\n }\n }\n ]\n }\n }\n ]\n }\n}\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/lstn/muddy", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "muddy", "package_url": "https://pypi.org/project/muddy/", "platform": "", "project_url": "https://pypi.org/project/muddy/", "project_urls": { "Homepage": "https://github.com/lstn/muddy" }, "release_url": "https://pypi.org/project/muddy/2019.7.25.post2/", "requires_dist": [ "Click (<8,>=7)", "overload (>=1.1)" ], "requires_python": "", "summary": "", "version": "2019.7.25.post2" }, "last_serial": 5586414, "releases": { "2019.7.21.post0": [ { "comment_text": "", "digests": { "md5": "f71d207e9299ef7dcecc5b724081b699", "sha256": "c1751b71e195b386bb415262cf581a67c5cb067074de3d778f48c4ba8541d4e7" }, "downloads": -1, "filename": "muddy-2019.7.21.post0-py3-none-any.whl", "has_sig": false, "md5_digest": "f71d207e9299ef7dcecc5b724081b699", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8349, "upload_time": "2019-07-21T14:30:58", "url": "https://files.pythonhosted.org/packages/3c/b1/fb5a6d15fd217a038920c5f6de3a4cb27b1047979275c693668de2ce54cc/muddy-2019.7.21.post0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "624aa933f26a211a7f1e5938000817e0", "sha256": "527042b010ab62d94ed06b96d932abe49590bcfd1a49e08ad51ec3f1845e13bd" }, "downloads": -1, "filename": "muddy-2019.7.21.post0.tar.gz", "has_sig": false, "md5_digest": "624aa933f26a211a7f1e5938000817e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5498, "upload_time": "2019-07-21T14:30:59", "url": "https://files.pythonhosted.org/packages/f5/54/0a6e37757ba2e3784661977866a245a88b844f9e36086f2a40d549ea58d3/muddy-2019.7.21.post0.tar.gz" } ], "2019.7.21.post1": [ { "comment_text": "", "digests": { "md5": "462e61fe56f90dce2f63c0e590e23da3", "sha256": "992eb3eccb9b8e0f04386c0a3c859866d25c9b00de464c1e779b435877c4664b" }, "downloads": -1, "filename": "muddy-2019.7.21.post1-py3-none-any.whl", "has_sig": false, "md5_digest": "462e61fe56f90dce2f63c0e590e23da3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8849, "upload_time": "2019-07-21T15:57:43", "url": "https://files.pythonhosted.org/packages/c3/c1/871d8ebbf90c9a959e1ab6806b5f6204c1319acba3deea06a6e7b2225748/muddy-2019.7.21.post1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8374d9189f81176214f90183015bef1a", "sha256": "f192436116f03fc70d662259c1493d752325fa8c5f115d15bde664424d3704e8" }, "downloads": -1, "filename": "muddy-2019.7.21.post1.tar.gz", "has_sig": false, "md5_digest": "8374d9189f81176214f90183015bef1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6050, "upload_time": "2019-07-21T15:57:44", "url": "https://files.pythonhosted.org/packages/fe/e5/270b0b9a9c99911b35c851b8d75fb5e2b7362a762406a6f2bfd72d04afd3/muddy-2019.7.21.post1.tar.gz" } ], "2019.7.21.post2": [ { "comment_text": "", "digests": { "md5": "20b8bb6e52cc579be3e306061f556b9d", "sha256": "eb45f4227657a8c8cadfec93a8b106f10a1d0070e3407a3cbdef7c5e663eec84" }, "downloads": -1, "filename": "muddy-2019.7.21.post2-py3-none-any.whl", "has_sig": false, "md5_digest": "20b8bb6e52cc579be3e306061f556b9d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9987, "upload_time": "2019-07-21T18:53:23", "url": "https://files.pythonhosted.org/packages/56/80/ebac9abc48c2549ea0de4149d6233c92138124605c57c3b0f44e2dfaa5a9/muddy-2019.7.21.post2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1cf419d5b04e757b9df55af8d5c59ee8", "sha256": "0ea3f4be7e14d31763dd5cd8576c281ddef5ba5c4306ac3e5b5db9e0d9460cf7" }, "downloads": -1, "filename": "muddy-2019.7.21.post2.tar.gz", "has_sig": false, "md5_digest": "1cf419d5b04e757b9df55af8d5c59ee8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7161, "upload_time": "2019-07-21T18:53:24", "url": "https://files.pythonhosted.org/packages/06/5e/c6d532bfff8cf16700af3eb132a0ff8367481dfb0c419ff1b38a478a611d/muddy-2019.7.21.post2.tar.gz" } ], "2019.7.25.post1": [ { "comment_text": "", "digests": { "md5": "ec9120d53aab005026570d2487fd47ec", "sha256": "5bcacb66992a43fdc60bb8e4df8cafca24633178cd0e265514ea9b153edddfbe" }, "downloads": -1, "filename": "muddy-2019.7.25.post1-py3-none-any.whl", "has_sig": false, "md5_digest": "ec9120d53aab005026570d2487fd47ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10649, "upload_time": "2019-07-26T00:35:53", "url": "https://files.pythonhosted.org/packages/63/e8/8c2200e1a305b8386a704bb06064fd7f386eb1a936350b70acaac761f31c/muddy-2019.7.25.post1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "61e604caef9c014a13cf8244f85fe9aa", "sha256": "18d98e558d3fdf7ff005aa596ad00e442a3f46ef03bf06b0870128582558cafa" }, "downloads": -1, "filename": "muddy-2019.7.25.post1.tar.gz", "has_sig": false, "md5_digest": "61e604caef9c014a13cf8244f85fe9aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8901, "upload_time": "2019-07-26T00:35:54", "url": "https://files.pythonhosted.org/packages/cd/d2/106cf0a807fea337f91bb3ff74602a8b3740dd6c354e308ef95150b2dc0f/muddy-2019.7.25.post1.tar.gz" } ], "2019.7.25.post2": [ { "comment_text": "", "digests": { "md5": "ac194c487fc6da41ad2070e73d0ae9d2", "sha256": "f360e1914ad97576c065eea9faed1a4911cf45b5d07278b7ea949cfbb5c6ce36" }, "downloads": -1, "filename": "muddy-2019.7.25.post2-py3-none-any.whl", "has_sig": false, "md5_digest": "ac194c487fc6da41ad2070e73d0ae9d2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10640, "upload_time": "2019-07-26T01:37:05", "url": "https://files.pythonhosted.org/packages/62/f5/9859acbe4405b8263903c20d04e0834df6f1923606b22260a4c1eaf5ab8f/muddy-2019.7.25.post2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e18719222712e6661de0180657ac0c36", "sha256": "6ea391e24469b5d820c0750e50c2a4efd4b572cf3106fb0285faf7b7cb9f83d0" }, "downloads": -1, "filename": "muddy-2019.7.25.post2.tar.gz", "has_sig": false, "md5_digest": "e18719222712e6661de0180657ac0c36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8890, "upload_time": "2019-07-26T01:37:08", "url": "https://files.pythonhosted.org/packages/dc/e8/ab14f192c4780240531b2999ca0231c54be2c1fe85122c6801ca2dd69c98/muddy-2019.7.25.post2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ac194c487fc6da41ad2070e73d0ae9d2", "sha256": "f360e1914ad97576c065eea9faed1a4911cf45b5d07278b7ea949cfbb5c6ce36" }, "downloads": -1, "filename": "muddy-2019.7.25.post2-py3-none-any.whl", "has_sig": false, "md5_digest": "ac194c487fc6da41ad2070e73d0ae9d2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10640, "upload_time": "2019-07-26T01:37:05", "url": "https://files.pythonhosted.org/packages/62/f5/9859acbe4405b8263903c20d04e0834df6f1923606b22260a4c1eaf5ab8f/muddy-2019.7.25.post2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e18719222712e6661de0180657ac0c36", "sha256": "6ea391e24469b5d820c0750e50c2a4efd4b572cf3106fb0285faf7b7cb9f83d0" }, "downloads": -1, "filename": "muddy-2019.7.25.post2.tar.gz", "has_sig": false, "md5_digest": "e18719222712e6661de0180657ac0c36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8890, "upload_time": "2019-07-26T01:37:08", "url": "https://files.pythonhosted.org/packages/dc/e8/ab14f192c4780240531b2999ca0231c54be2c1fe85122c6801ca2dd69c98/muddy-2019.7.25.post2.tar.gz" } ] }