pyinfra 0.11.dev3__py3-none-any.whl → 3.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. pyinfra/__init__.py +9 -12
  2. pyinfra/__main__.py +4 -0
  3. pyinfra/api/__init__.py +18 -3
  4. pyinfra/api/arguments.py +406 -0
  5. pyinfra/api/arguments_typed.py +79 -0
  6. pyinfra/api/command.py +274 -0
  7. pyinfra/api/config.py +222 -28
  8. pyinfra/api/connect.py +33 -13
  9. pyinfra/api/connectors.py +27 -0
  10. pyinfra/api/deploy.py +65 -66
  11. pyinfra/api/exceptions.py +67 -18
  12. pyinfra/api/facts.py +253 -202
  13. pyinfra/api/host.py +413 -50
  14. pyinfra/api/inventory.py +121 -160
  15. pyinfra/api/operation.py +432 -262
  16. pyinfra/api/operations.py +273 -260
  17. pyinfra/api/state.py +302 -248
  18. pyinfra/api/util.py +291 -368
  19. pyinfra/connectors/base.py +173 -0
  20. pyinfra/connectors/chroot.py +212 -0
  21. pyinfra/connectors/docker.py +381 -0
  22. pyinfra/connectors/dockerssh.py +297 -0
  23. pyinfra/connectors/local.py +238 -0
  24. pyinfra/connectors/scp/__init__.py +1 -0
  25. pyinfra/connectors/scp/client.py +204 -0
  26. pyinfra/connectors/ssh.py +670 -0
  27. pyinfra/connectors/ssh_util.py +114 -0
  28. pyinfra/connectors/sshuserclient/client.py +309 -0
  29. pyinfra/connectors/sshuserclient/config.py +102 -0
  30. pyinfra/connectors/terraform.py +135 -0
  31. pyinfra/connectors/util.py +410 -0
  32. pyinfra/connectors/vagrant.py +183 -0
  33. pyinfra/context.py +145 -0
  34. pyinfra/facts/__init__.py +7 -6
  35. pyinfra/facts/apk.py +22 -7
  36. pyinfra/facts/apt.py +117 -60
  37. pyinfra/facts/brew.py +100 -15
  38. pyinfra/facts/bsdinit.py +23 -0
  39. pyinfra/facts/cargo.py +37 -0
  40. pyinfra/facts/choco.py +47 -0
  41. pyinfra/facts/crontab.py +195 -0
  42. pyinfra/facts/deb.py +94 -0
  43. pyinfra/facts/dnf.py +48 -0
  44. pyinfra/facts/docker.py +96 -23
  45. pyinfra/facts/efibootmgr.py +113 -0
  46. pyinfra/facts/files.py +630 -58
  47. pyinfra/facts/flatpak.py +77 -0
  48. pyinfra/facts/freebsd.py +70 -0
  49. pyinfra/facts/gem.py +19 -6
  50. pyinfra/facts/git.py +59 -14
  51. pyinfra/facts/gpg.py +150 -0
  52. pyinfra/facts/hardware.py +313 -167
  53. pyinfra/facts/iptables.py +72 -62
  54. pyinfra/facts/launchd.py +44 -0
  55. pyinfra/facts/lxd.py +17 -4
  56. pyinfra/facts/mysql.py +122 -86
  57. pyinfra/facts/npm.py +17 -9
  58. pyinfra/facts/openrc.py +71 -0
  59. pyinfra/facts/opkg.py +246 -0
  60. pyinfra/facts/pacman.py +50 -7
  61. pyinfra/facts/pip.py +24 -7
  62. pyinfra/facts/pipx.py +82 -0
  63. pyinfra/facts/pkg.py +15 -6
  64. pyinfra/facts/pkgin.py +35 -0
  65. pyinfra/facts/podman.py +54 -0
  66. pyinfra/facts/postgres.py +178 -0
  67. pyinfra/facts/postgresql.py +6 -147
  68. pyinfra/facts/rpm.py +105 -0
  69. pyinfra/facts/runit.py +77 -0
  70. pyinfra/facts/selinux.py +161 -0
  71. pyinfra/facts/server.py +746 -285
  72. pyinfra/facts/snap.py +88 -0
  73. pyinfra/facts/systemd.py +139 -0
  74. pyinfra/facts/sysvinit.py +59 -0
  75. pyinfra/facts/upstart.py +35 -0
  76. pyinfra/facts/util/__init__.py +17 -0
  77. pyinfra/facts/util/databases.py +4 -6
  78. pyinfra/facts/util/packaging.py +37 -6
  79. pyinfra/facts/util/units.py +30 -0
  80. pyinfra/facts/util/win_files.py +99 -0
  81. pyinfra/facts/vzctl.py +20 -13
  82. pyinfra/facts/xbps.py +35 -0
  83. pyinfra/facts/yum.py +34 -40
  84. pyinfra/facts/zfs.py +77 -0
  85. pyinfra/facts/zypper.py +42 -0
  86. pyinfra/local.py +45 -83
  87. pyinfra/operations/__init__.py +12 -0
  88. pyinfra/operations/apk.py +98 -0
  89. pyinfra/operations/apt.py +488 -0
  90. pyinfra/operations/brew.py +231 -0
  91. pyinfra/operations/bsdinit.py +59 -0
  92. pyinfra/operations/cargo.py +45 -0
  93. pyinfra/operations/choco.py +61 -0
  94. pyinfra/operations/crontab.py +191 -0
  95. pyinfra/operations/dnf.py +210 -0
  96. pyinfra/operations/docker.py +446 -0
  97. pyinfra/operations/files.py +1939 -0
  98. pyinfra/operations/flatpak.py +94 -0
  99. pyinfra/operations/freebsd/__init__.py +12 -0
  100. pyinfra/operations/freebsd/freebsd_update.py +70 -0
  101. pyinfra/operations/freebsd/pkg.py +219 -0
  102. pyinfra/operations/freebsd/service.py +116 -0
  103. pyinfra/operations/freebsd/sysrc.py +92 -0
  104. pyinfra/operations/gem.py +47 -0
  105. pyinfra/operations/git.py +419 -0
  106. pyinfra/operations/iptables.py +311 -0
  107. pyinfra/operations/launchd.py +45 -0
  108. pyinfra/operations/lxd.py +68 -0
  109. pyinfra/operations/mysql.py +609 -0
  110. pyinfra/operations/npm.py +57 -0
  111. pyinfra/operations/openrc.py +63 -0
  112. pyinfra/operations/opkg.py +88 -0
  113. pyinfra/operations/pacman.py +81 -0
  114. pyinfra/operations/pip.py +205 -0
  115. pyinfra/operations/pipx.py +102 -0
  116. pyinfra/operations/pkg.py +70 -0
  117. pyinfra/operations/pkgin.py +91 -0
  118. pyinfra/operations/postgres.py +436 -0
  119. pyinfra/operations/postgresql.py +30 -0
  120. pyinfra/operations/puppet.py +40 -0
  121. pyinfra/operations/python.py +72 -0
  122. pyinfra/operations/runit.py +184 -0
  123. pyinfra/operations/selinux.py +189 -0
  124. pyinfra/operations/server.py +1099 -0
  125. pyinfra/operations/snap.py +117 -0
  126. pyinfra/operations/ssh.py +216 -0
  127. pyinfra/operations/systemd.py +149 -0
  128. pyinfra/operations/sysvinit.py +141 -0
  129. pyinfra/operations/upstart.py +68 -0
  130. pyinfra/operations/util/__init__.py +12 -0
  131. pyinfra/operations/util/docker.py +251 -0
  132. pyinfra/operations/util/files.py +247 -0
  133. pyinfra/operations/util/packaging.py +336 -0
  134. pyinfra/operations/util/service.py +46 -0
  135. pyinfra/operations/vzctl.py +137 -0
  136. pyinfra/operations/xbps.py +77 -0
  137. pyinfra/operations/yum.py +210 -0
  138. pyinfra/operations/zfs.py +175 -0
  139. pyinfra/operations/zypper.py +192 -0
  140. pyinfra/progress.py +44 -32
  141. pyinfra/py.typed +0 -0
  142. pyinfra/version.py +9 -1
  143. pyinfra-3.5.1.dist-info/METADATA +141 -0
  144. pyinfra-3.5.1.dist-info/RECORD +159 -0
  145. {pyinfra-0.11.dev3.dist-info → pyinfra-3.5.1.dist-info}/WHEEL +1 -2
  146. pyinfra-3.5.1.dist-info/entry_points.txt +12 -0
  147. {pyinfra-0.11.dev3.dist-info → pyinfra-3.5.1.dist-info/licenses}/LICENSE.md +1 -1
  148. pyinfra_cli/__init__.py +1 -0
  149. pyinfra_cli/cli.py +780 -0
  150. pyinfra_cli/commands.py +66 -0
  151. pyinfra_cli/exceptions.py +155 -65
  152. pyinfra_cli/inventory.py +233 -89
  153. pyinfra_cli/log.py +39 -43
  154. pyinfra_cli/main.py +26 -495
  155. pyinfra_cli/prints.py +215 -156
  156. pyinfra_cli/util.py +172 -105
  157. pyinfra_cli/virtualenv.py +25 -20
  158. pyinfra/api/connectors/__init__.py +0 -21
  159. pyinfra/api/connectors/ansible.py +0 -99
  160. pyinfra/api/connectors/docker.py +0 -178
  161. pyinfra/api/connectors/local.py +0 -169
  162. pyinfra/api/connectors/ssh.py +0 -402
  163. pyinfra/api/connectors/sshuserclient/client.py +0 -105
  164. pyinfra/api/connectors/sshuserclient/config.py +0 -90
  165. pyinfra/api/connectors/util.py +0 -63
  166. pyinfra/api/connectors/vagrant.py +0 -155
  167. pyinfra/facts/init.py +0 -176
  168. pyinfra/facts/util/files.py +0 -102
  169. pyinfra/hook.py +0 -41
  170. pyinfra/modules/__init__.py +0 -11
  171. pyinfra/modules/apk.py +0 -64
  172. pyinfra/modules/apt.py +0 -272
  173. pyinfra/modules/brew.py +0 -122
  174. pyinfra/modules/files.py +0 -711
  175. pyinfra/modules/gem.py +0 -30
  176. pyinfra/modules/git.py +0 -115
  177. pyinfra/modules/init.py +0 -344
  178. pyinfra/modules/iptables.py +0 -271
  179. pyinfra/modules/lxd.py +0 -45
  180. pyinfra/modules/mysql.py +0 -347
  181. pyinfra/modules/npm.py +0 -47
  182. pyinfra/modules/pacman.py +0 -60
  183. pyinfra/modules/pip.py +0 -99
  184. pyinfra/modules/pkg.py +0 -43
  185. pyinfra/modules/postgresql.py +0 -245
  186. pyinfra/modules/puppet.py +0 -20
  187. pyinfra/modules/python.py +0 -37
  188. pyinfra/modules/server.py +0 -524
  189. pyinfra/modules/ssh.py +0 -150
  190. pyinfra/modules/util/files.py +0 -52
  191. pyinfra/modules/util/packaging.py +0 -118
  192. pyinfra/modules/vzctl.py +0 -133
  193. pyinfra/modules/yum.py +0 -171
  194. pyinfra/pseudo_modules.py +0 -64
  195. pyinfra-0.11.dev3.dist-info/.DS_Store +0 -0
  196. pyinfra-0.11.dev3.dist-info/METADATA +0 -135
  197. pyinfra-0.11.dev3.dist-info/RECORD +0 -95
  198. pyinfra-0.11.dev3.dist-info/entry_points.txt +0 -3
  199. pyinfra-0.11.dev3.dist-info/top_level.txt +0 -2
  200. pyinfra_cli/__main__.py +0 -40
  201. pyinfra_cli/config.py +0 -92
  202. /pyinfra/{modules/util → connectors}/__init__.py +0 -0
  203. /pyinfra/{api/connectors → connectors}/sshuserclient/__init__.py +0 -0
pyinfra/progress.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import math
2
2
  import os
3
+ import platform
3
4
  import sys
4
-
5
5
  from collections import deque
6
6
  from contextlib import contextmanager
7
7
  from threading import Event, Thread
@@ -9,25 +9,32 @@ from time import sleep
9
9
 
10
10
  import pyinfra
11
11
 
12
- WAIT_TIME = 1 / 20
13
- WAIT_CHARS = deque(('-', '/', '|', '\\'))
12
+ IS_WINDOWS = platform.system() == "Windows"
13
+
14
+ WAIT_TIME = 1 / 5
15
+ WAIT_CHARS = deque(("-", "/", "|", "\\"))
14
16
 
15
17
  # Hacky way of getting terminal size (so can clear lines)
16
18
  # Source: http://stackoverflow.com/questions/566746
17
- TERMINAL_SIZE = os.popen('stty size', 'r').read().split()
18
- IS_TTY = bool(TERMINAL_SIZE)
19
- TERMINAL_WIDTH = (
20
- int(TERMINAL_SIZE[1])
21
- if IS_TTY else 0
22
- )
19
+ IS_TTY = sys.stdout.isatty() and sys.stderr.isatty()
20
+ TERMINAL_WIDTH = 0
21
+
22
+ if IS_TTY:
23
+ try:
24
+ TERMINAL_WIDTH = os.get_terminal_size().columns
25
+ except AttributeError:
26
+ if not IS_WINDOWS:
27
+ terminal_size = os.popen("stty size", "r").read().split()
28
+ if len(terminal_size) == 2:
29
+ TERMINAL_WIDTH = int(terminal_size[1])
23
30
 
24
31
 
25
32
  def _print_spinner(stop_event, progress_queue):
26
- if not IS_TTY or os.environ.get('PYINFRA_PROGRESS') == 'off':
33
+ if not IS_TTY or os.environ.get("PYINFRA_PROGRESS") == "off":
27
34
  return
28
35
 
29
- progress = ''
30
- text = ''
36
+ progress = ""
37
+ text = ""
31
38
 
32
39
  while True:
33
40
  # Stop when asked too
@@ -41,26 +48,26 @@ def _print_spinner(stop_event, progress_queue):
41
48
  except IndexError:
42
49
  pass
43
50
 
44
- text = ' {0}'.format(
45
- ' '.join((WAIT_CHARS[0], progress)),
51
+ text = " {0}".format(
52
+ " ".join((WAIT_CHARS[0], progress)),
46
53
  )
47
- text = '{0}\r'.format(text)
54
+ text = "{0}\r".format(text)
48
55
 
49
- sys.stdout.write(text)
50
- sys.stdout.flush()
56
+ sys.stderr.write(text)
57
+ sys.stderr.flush()
51
58
 
52
59
  # In pyinfra_cli's __main__ we set stdout & stderr to be line buffered,
53
60
  # so write this escape code (clear line) into the buffer but don't flush,
54
61
  # such that any next print/log/etc clear the line first.
55
- sys.stdout.write('\033[K')
56
- sys.stderr.write('\033[K')
62
+ if not IS_WINDOWS:
63
+ sys.stderr.write("\033[K")
57
64
 
58
65
  sleep(WAIT_TIME)
59
66
 
60
67
 
61
68
  @contextmanager
62
69
  def progress_spinner(items, prefix_message=None):
63
- # If there's no pseudo state we're not in CLI mode, so just return a noop
70
+ # If there's no current state context we're not in CLI mode, so just return a noop
64
71
  # handler and exit.
65
72
  if not pyinfra.is_cli:
66
73
  yield lambda complete_item: None
@@ -80,11 +87,13 @@ def progress_spinner(items, prefix_message=None):
80
87
  percentage_complete = 0
81
88
  complete = total_items - len(items)
82
89
  percentage_complete = int(math.floor(complete / total_items * 100))
83
- message_bits.append('{0}% ({1}/{2})'.format(
84
- percentage_complete,
85
- complete,
86
- total_items,
87
- ))
90
+ message_bits.append(
91
+ "{0}% ({1}/{2})".format(
92
+ percentage_complete,
93
+ complete,
94
+ total_items,
95
+ ),
96
+ )
88
97
 
89
98
  if prefix_message:
90
99
  message_bits.append(prefix_message)
@@ -96,24 +105,27 @@ def progress_spinner(items, prefix_message=None):
96
105
  items_allowed_width = TERMINAL_WIDTH - 10 - message_length
97
106
 
98
107
  if items_allowed_width > 0:
99
- items_string = '{%s}' % (', '.join('{0}'.format(i) for i in items))
108
+ items_string = "{%s}" % (", ".join("{0}".format(i) for i in items))
100
109
  if len(items_string) >= items_allowed_width:
101
- items_string = '%s...}' % (
110
+ items_string = "%s...}" % (
102
111
  # -3 for the ...
103
- items_string[:items_allowed_width - 3],
112
+ items_string[: items_allowed_width - 3],
104
113
  )
105
114
 
106
115
  message_bits.append(items_string)
107
116
 
108
- return ' - '.join(message_bits)
117
+ return " - ".join(message_bits)
109
118
 
110
119
  progress_queue = deque((make_progress_message(),))
111
120
 
112
121
  def progress(complete_item):
113
122
  if complete_item not in items:
114
- raise ValueError('Invalid complete item: {0} not in {1}'.format(
115
- complete_item, items,
116
- ))
123
+ raise ValueError(
124
+ "Invalid complete item: {0} not in {1}".format(
125
+ complete_item,
126
+ items,
127
+ ),
128
+ )
117
129
 
118
130
  items.remove(complete_item)
119
131
  progress_queue.append(make_progress_message())
pyinfra/py.typed ADDED
File without changes
pyinfra/version.py CHANGED
@@ -1 +1,9 @@
1
- __version__ = '0.11.dev3'
1
+ try:
2
+ try:
3
+ from importlib_metadata import version
4
+ except ImportError:
5
+ from importlib.metadata import version
6
+
7
+ __version__ = version("pyinfra")
8
+ except Exception:
9
+ __version__ = "unknown"
@@ -0,0 +1,141 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyinfra
3
+ Version: 3.5.1
4
+ Summary: pyinfra automates/provisions/manages/deploys infrastructure.
5
+ Project-URL: homepage, https://pyinfra.com
6
+ Project-URL: documentation, https://docs.pyinfra.com
7
+ Project-URL: repository, https://github.com/pyinfra-dev/pyinfra
8
+ Author-email: Nick / Fizzadar <pointlessrambler@gmail.com>
9
+ License-Expression: MIT
10
+ License-File: LICENSE.md
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Information Technology
15
+ Classifier: Intended Audience :: System Administrators
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: System :: Installation/Setup
23
+ Classifier: Topic :: System :: Systems Administration
24
+ Classifier: Topic :: Utilities
25
+ Requires-Python: <4.0,>=3.10
26
+ Requires-Dist: click>2
27
+ Requires-Dist: distro<2,>=1.6
28
+ Requires-Dist: gevent>=1.5
29
+ Requires-Dist: jinja2<4,>3
30
+ Requires-Dist: packaging>=16.1
31
+ Requires-Dist: paramiko<4,>=2.7
32
+ Requires-Dist: python-dateutil<3,>2
33
+ Requires-Dist: typeguard<5,>=4
34
+ Requires-Dist: typing-extensions; python_version < '3.11'
35
+ Description-Content-Type: text/markdown
36
+
37
+ <p align="center">
38
+ <a href="https://pyinfra.com">
39
+ <img src="https://pyinfra.com/static/logo_readme.png" alt="pyinfra" />
40
+ </a>
41
+ </p>
42
+
43
+ <p>
44
+ pyinfra turns Python code into shell commands and runs them on your servers. Execute ad-hoc commands and write declarative operations. Target SSH servers, local machine and Docker containers. Fast and scales from one server to thousands. Think <code>ansible</code> but Python instead of YAML, and a lot faster.
45
+ </p>
46
+
47
+ ---
48
+
49
+ <h3>
50
+ <a href="https://docs.pyinfra.com/page/getting-started.html"><strong>Getting Started</strong></a> &bull;
51
+ <a href="https://github.com/pyinfra-dev/pyinfra-examples"><strong>Examples Repo</strong></a> &bull;
52
+ <a href="https://matrix.to/#/#pyinfra:matrix.org"><strong>Chat on Matrix</strong></a>
53
+ </h3>
54
+ <p>
55
+ <a href="https://docs.pyinfra.com"><strong>Documentation</strong></a> &bull;
56
+ <a href="https://docs.pyinfra.com/page/support.html"><strong>Help & Support</strong></a> &bull;
57
+ <a href="https://docs.pyinfra.com/page/contributing.html"><strong>Contributing</strong></a>
58
+ </p>
59
+
60
+ ---
61
+
62
+ Why pyinfra? Design features include:
63
+
64
+ + 🚀 **Super fast** execution over thousands of hosts with predictable performance.
65
+ + 🚨 **Instant debugging** with realtime stdin/stdout/stderr output (`-vvv`).
66
+ + 🔄 **Idempotent operations** that enable diffs and dry runs before making changes.
67
+ + 📦 **Extendable** with the entire Python package ecosystem.
68
+ + 💻 **Agentless execution** against anything with shell access.
69
+ + 🔌 **Integrated** with connectors for Docker, Terraform, Vagrant and more.
70
+
71
+ <img width="100%" src="https://pyinfra.com/static/example_deploy.gif" />
72
+
73
+ ## Quickstart
74
+
75
+ Install pyinfra with [`uv`](https://docs.astral.sh/uv/):
76
+
77
+ ```
78
+ uv tool install pyinfra
79
+ ```
80
+
81
+ Now you can execute commands on hosts via SSH:
82
+
83
+ ```sh
84
+ pyinfra my-server.net exec -- echo "hello world"
85
+ ```
86
+
87
+ Or target Docker containers, the local machine, and other [connectors](https://docs.pyinfra.com/page/connectors.html):
88
+
89
+ ```sh
90
+ pyinfra @docker/ubuntu exec -- echo "Hello world"
91
+ pyinfra @local exec -- echo "Hello world"
92
+ ```
93
+
94
+ As well as executing commands you can define state using [operations](https://docs.pyinfra.com/page/operations.html):
95
+
96
+ ```sh
97
+ # Install iftop apt package if not present
98
+ pyinfra @docker/ubuntu apt.packages iftop update=true _sudo=true
99
+ ```
100
+
101
+ Which can then be saved as a Python file like `deploy.py`:
102
+
103
+
104
+ ```py
105
+ from pyinfra.operations import apt
106
+
107
+ apt.packages(
108
+ name="Ensure iftop is installed",
109
+ packages=['iftop'],
110
+ update=True,
111
+ _sudo=True,
112
+ )
113
+ ```
114
+
115
+ The hosts can also be saved in a file, for example `inventory.py`:
116
+
117
+ ```py
118
+ targets = ["@docker/ubuntu", "my-test-server.net"]
119
+ ```
120
+
121
+
122
+ And executed together:
123
+
124
+ ```sh
125
+ pyinfra inventory.py deploy.py
126
+ ```
127
+
128
+ Now you know the building blocks of pyinfra! By combining inventory, operations and Python code you can deploy anything.
129
+
130
+ See the more detailed [getting started](https://docs.pyinfra.com/page/getting-started.html) or [using operations](https://docs.pyinfra.com/page/using-operations.html) guides. See how to use [inventory & data](https://docs.pyinfra.com/page/inventory-data.html), [global arguments](https://docs.pyinfra.com/page/arguments.html) and [the CLI](https://docs.pyinfra.com/page/cli.html) or check out the [documented examples](https://docs.pyinfra.com/page/examples.html).
131
+
132
+ ---
133
+
134
+ <p align="center">
135
+ <a href="https://pypi.python.org/pypi/pyinfra"><img alt="PyPI version" src="https://img.shields.io/pypi/v/pyinfra?color=blue"></a>
136
+ <a href="https://pepy.tech/project/pyinfra"><img alt="PyPi downloads" src="https://pepy.tech/badge/pyinfra"></a>
137
+ <a href="https://docs.pyinfra.com"><img alt="Docs status" src="https://img.shields.io/github/actions/workflow/status/Fizzadar/pyinfra/docs.yml?branch=2.x"></a>
138
+ <a href="https://github.com/Fizzadar/pyinfra/actions?query=workflow%3A%22Execute+tests%22"><img alt="Execute tests status" src="https://img.shields.io/github/actions/workflow/status/Fizzadar/pyinfra/test.yml?branch=2.x"></a>
139
+ <a href="https://codecov.io/github/Fizzadar/pyinfra"><img alt="Codecov Coverage" src="https://img.shields.io/codecov/c/gh/Fizzadar/pyinfra"></a>
140
+ <a href="https://github.com/Fizzadar/pyinfra/blob/2.x/LICENSE.md"><img alt="MIT Licensed" src="https://img.shields.io/pypi/l/pyinfra"></a>
141
+ </p>
@@ -0,0 +1,159 @@
1
+ pyinfra/__init__.py,sha256=7ZcKHGWk7_nYxsYrbFBB_vJr-J-Ddbc56ZS4sk5ArVw,535
2
+ pyinfra/__main__.py,sha256=oU4qYOZym9MdaoE83ER_0--L48FkMm6L7lM_pQVYbq4,73
3
+ pyinfra/context.py,sha256=HyJCarfQmbrdJ9Re_CNuzMwnfwINB3UFNz3chGatAdQ,3828
4
+ pyinfra/local.py,sha256=wT84xkJc9UBN5isvIVbNpm2fzZaadwE-dkbAwaFQdZk,2808
5
+ pyinfra/progress.py,sha256=X3hXZ4Flh_L9FE4ZEWxWoG0R4dA5UPd1FCO-Exd5Xtc,4193
6
+ pyinfra/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ pyinfra/version.py,sha256=LZf50PHDzEZv65w0G-iMICoQ9US0U5LWHAOEmNtkF3I,216
8
+ pyinfra/api/__init__.py,sha256=suGbKKM-qCduuXFYBEcyswlTqozewtYpdLRhK63PVn0,942
9
+ pyinfra/api/arguments.py,sha256=pxfizvECzEahbIyPfmVnk9FsQFnOnDIFPhBZvFLEhFg,12231
10
+ pyinfra/api/arguments_typed.py,sha256=IZuhpmDfW9CP6ASS5Ie-3Wcnxl6bDNR3egU4Mfhbsb4,2303
11
+ pyinfra/api/command.py,sha256=NwF2syxV3zxCbBdHzvJ6ve5G-xwdNTjPHFPwguKVcYs,7741
12
+ pyinfra/api/config.py,sha256=gVDV-aGh6LYOnHtBaivICrd3RBfjFRWy3-K9sG__eP8,9321
13
+ pyinfra/api/connect.py,sha256=jkx07iUL29u9pHHKH4WcNtvxwOA4DIbF7ixguFyuFjo,1984
14
+ pyinfra/api/connectors.py,sha256=nie7JuLxMSC6gqPjmjuCisQ11R-eAQDtMMWF6YbSQ48,659
15
+ pyinfra/api/deploy.py,sha256=Upd92oThQN0zhKbKW8vyPvBuoYiEGStuiEy7kNhZ00Y,3167
16
+ pyinfra/api/exceptions.py,sha256=cCbUp1qN1QO0d9aAvOAbRgYpLi0vUI5j7ZqSjcD1_P8,1861
17
+ pyinfra/api/facts.py,sha256=nybuKLncxHrJ7rHT2JH0Bg7YwHjQWb-fc8ABJ1J9Y4I,9278
18
+ pyinfra/api/host.py,sha256=4a1bFR8vX8mUuXRZttXlzp2_ARzrg-xsH7n8uOxaaqQ,14098
19
+ pyinfra/api/inventory.py,sha256=i_LBI-Gn5FF-9SVDBH6xefTtvFzjuz12QQiFPGK2TrQ,7864
20
+ pyinfra/api/operation.py,sha256=WtZyVwPoh9_AytqcCf_W6sMHhWEfSex9RE54aMBHU5M,17053
21
+ pyinfra/api/operations.py,sha256=MedR-5W4BF23p_FMI7o62K72pgE7G1z2scKeC-b3JF0,13677
22
+ pyinfra/api/state.py,sha256=cj-JvxOljeDshWvRpq8AMQxdGaUaht8KyuyR3mEsI-Y,12859
23
+ pyinfra/api/util.py,sha256=N13IPSConC5XhJCDtBB5s-PC39B-PPWaujrzY3Pm2a0,12837
24
+ pyinfra/connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ pyinfra/connectors/base.py,sha256=0-BKInwTpjbnTakJhMTn_8LUOl81vUmC-q-HzVrwhkw,4703
26
+ pyinfra/connectors/chroot.py,sha256=dBgruen5vS4j-OEFwF6ew-LPBR4kJEIQw_W5nXqlvVg,6064
27
+ pyinfra/connectors/docker.py,sha256=QweBHSE5pRP5UuRp97xIDwr_tduBf88JHpSmgwU5SpM,11930
28
+ pyinfra/connectors/dockerssh.py,sha256=NGG6hSZ3z66RRKt6T0hnG2jiXFLR4P5uudi1COcGnY0,9021
29
+ pyinfra/connectors/local.py,sha256=DJMmZiPgeYvZyW0ANvWjCxF3elmDlmolkY0ktTW3rcg,6990
30
+ pyinfra/connectors/ssh.py,sha256=qAr_4To6llbj_lW2uVztzNj_aSWP_i-2iAjNN70Wf2E,22572
31
+ pyinfra/connectors/ssh_util.py,sha256=CN_5AdTA3RpiWCnXTrRBjez1NsN59hITDzQmXIkZvoE,3683
32
+ pyinfra/connectors/terraform.py,sha256=j-a2yStBLdw1QLZRVnl_9TanDtdyujyCxBO2Oa00rPM,4289
33
+ pyinfra/connectors/util.py,sha256=-Ei6FMIzbVHD7G1R834Tg7RLoNzo-62wUYIkj043MRQ,11780
34
+ pyinfra/connectors/vagrant.py,sha256=0TT73ks64I4Yl-JSZjMBbpWA3VYBkqqLB-fUS8pS8GY,4813
35
+ pyinfra/connectors/scp/__init__.py,sha256=jnO-_8GfkKWhsFcDjAxjOkuUT2RbS22b8P_xPrX889U,44
36
+ pyinfra/connectors/scp/client.py,sha256=l_fPsbgz-7U6Y50ssuKKPFxD_cFoIPtaVXMCYDotbDI,6399
37
+ pyinfra/connectors/sshuserclient/__init__.py,sha256=Qc4RO2wknSWIiNTwOeQ0y2TeiuKHmyWDW2Dz4MOo9CE,44
38
+ pyinfra/connectors/sshuserclient/client.py,sha256=Ei2_mzCMNJopbpvpeLsdSiNb98rxEEy7uCOmpJbfd2o,10506
39
+ pyinfra/connectors/sshuserclient/config.py,sha256=FZkPrUYXkURZcFUHBGWw9lLC9uiH3DJ0rBYXJePchxw,2774
40
+ pyinfra/facts/__init__.py,sha256=myTXSOZmAqmU88Fyifn035h9Lr6Gj2mlka_jDcXyKGw,347
41
+ pyinfra/facts/apk.py,sha256=UEMHzhx2Wx3qq-OcjetWgE2iZ7_EjI-bszLxSN6PJa0,799
42
+ pyinfra/facts/apt.py,sha256=RYPqGgdH0QpDIoMNhBY9nKtMu-baQNX4DIYNrsllcLQ,4026
43
+ pyinfra/facts/brew.py,sha256=nE6YVc2S9zasyJPZmPR5FMeGKPViZYEcpnnBQlDf1EU,2792
44
+ pyinfra/facts/bsdinit.py,sha256=SVY4hagjyy1yz8FKWhIbX9fHm5AugvTFl4xQh2FFO74,631
45
+ pyinfra/facts/cargo.py,sha256=qgOClhwZm4COcncDzOZccCzs67nPBi_x6VGiF2UA0sA,687
46
+ pyinfra/facts/choco.py,sha256=mpLleSqNqiaGRgyrhgceno2iPB1_1yjn8UJ90pvOZCs,886
47
+ pyinfra/facts/crontab.py,sha256=yCpBzBqgXt2BjAGCIttuQ2xKKtuhzg0VQ9WCDV46eV8,5754
48
+ pyinfra/facts/deb.py,sha256=1dR1puwY5wyyhhYYwaEBLjKU9sIyaNBNBlamVZ2KQg0,2074
49
+ pyinfra/facts/dnf.py,sha256=wXatfZWVrrdLY7LM-vHKMg8Md1FiwkqHxmgRYbQqw90,1208
50
+ pyinfra/facts/docker.py,sha256=fqIqMR6HwSYpTUAjhCX8Hk57pcyL6ShIl98H32Ly6HM,3233
51
+ pyinfra/facts/efibootmgr.py,sha256=JPJSokE_RV9JstEPJRECnqSU-B0JCxmrocY8zBOva7M,3555
52
+ pyinfra/facts/files.py,sha256=rZi7e6E3oq5XBzkh375ztHya5fHusrTbU7B3rZDbHrQ,19501
53
+ pyinfra/facts/flatpak.py,sha256=ovi3duwTqqwvt5GoDRN7R-PpkvR6sQ1SmgEADcSnkUE,1646
54
+ pyinfra/facts/freebsd.py,sha256=za42Di2M2-hcSTPei1YE6BsJxqapm9jysshs9hKJZaY,2161
55
+ pyinfra/facts/gem.py,sha256=aX2-vcEqkxUIP0UJ_SVp9bf4B944oyDjsuujjs5q_9w,654
56
+ pyinfra/facts/git.py,sha256=Zfzpdccsz2InviirJO17EkEFTVNqYQclSlXJIRFkD_s,1699
57
+ pyinfra/facts/gpg.py,sha256=8fvC9AglzmO08SAT_Py6H6G0i73soO1D2cSCbw-O9JA,3923
58
+ pyinfra/facts/hardware.py,sha256=mta8hXPTlJ5j_5IdrXUfsDZAo4_89QjInuiT7DIxRYQ,12219
59
+ pyinfra/facts/iptables.py,sha256=ORRExNnPR5ysymDbkUjeQWt9mzjSI7su4uQfsu3FlJQ,3506
60
+ pyinfra/facts/launchd.py,sha256=Nl4EFbGwlXTj8GNWlS9UMZODHr63bve73xmMeqyf2gc,849
61
+ pyinfra/facts/lxd.py,sha256=A2LQN5armY_nI6gV-m1j4l2J2_mMZnvVa1X2RntDnDk,548
62
+ pyinfra/facts/mysql.py,sha256=ZVN6eN0Xetidvq_RAntSCzHgy4jmf8Enrm2mPXxO488,6247
63
+ pyinfra/facts/npm.py,sha256=WzZHCfgWwY9WsPPzL0njlazwiBHI0gpvyZV93Nfu428,838
64
+ pyinfra/facts/openrc.py,sha256=wB4fjzgWCgX6wexBm4jlWv4YH6b4z5_tAqQAO1qO9Kg,1614
65
+ pyinfra/facts/opkg.py,sha256=yTPuzoUyDDn-o7H97lPtyPe-FOkYg5zqkVmfKt9HwY4,7404
66
+ pyinfra/facts/pacman.py,sha256=SPI3jpzZbq_VnJ0z5q7A2Rw___EHVntOz6M19ErGpmQ,1324
67
+ pyinfra/facts/pip.py,sha256=MA2yed2_kVzLNjCulnCJEz4GeQ5dbGVtaAv4Bqm9fLw,820
68
+ pyinfra/facts/pipx.py,sha256=3-oP0yHWvi__RGRlgkQzRKQBMwZN3Ke9A-z8oYB5upM,1854
69
+ pyinfra/facts/pkg.py,sha256=4qcp0iO3TgWL9zvPCXcZDCRwrbWg65Wg8H0OvWqNqJk,588
70
+ pyinfra/facts/pkgin.py,sha256=ErtNMLn-Si6_nA69V1x_dZOX_Y_z5CkkevctXq0Nj-w,662
71
+ pyinfra/facts/podman.py,sha256=ONDyCaWe3k_BLO8ec0_KLHxrVgpUKLpKhuJ2bdrEuuo,1201
72
+ pyinfra/facts/postgres.py,sha256=TPcrYc9IhVFNW_rltc1oFUk4nfF0iWlS4gZMv0w7pXM,4499
73
+ pyinfra/facts/postgresql.py,sha256=4nusMVvGhtku86KX4O4vjSxh_MamxZy_kmTQvvy0GhE,223
74
+ pyinfra/facts/rpm.py,sha256=ikuKYiUmjgvPA84qfE-gbq4Iv4AB5cvor1uKU6uHbXQ,2391
75
+ pyinfra/facts/runit.py,sha256=qok1FTSshiNrN603vjYTKOeM-NIlxwLbwOp-vPbPySo,2131
76
+ pyinfra/facts/selinux.py,sha256=umVGK_6Iuj4Xbw5vhhbpxdUA4Mzg2Fhy7QmaNflNrp8,4650
77
+ pyinfra/facts/server.py,sha256=uafB7XYNT2eJB21XxNip_WrSyaRqe7uzFab5K4DCZqo,23446
78
+ pyinfra/facts/snap.py,sha256=2-c3z1qpOG7prmKJssLpOXmKo_wwdfROryro6gif2vo,2137
79
+ pyinfra/facts/systemd.py,sha256=meHXURtnoxeJbmPzWFTwvhjQBZ2NlQCY8Tj-oHTG_dI,4320
80
+ pyinfra/facts/sysvinit.py,sha256=q1OpHATFJxjLwatcnYRfpTR7_K2c29b4ppmZu-wgC-4,1589
81
+ pyinfra/facts/upstart.py,sha256=GcreN0mIM6_qRgqzFaA7PnX45RtbBpvVC00J6bKujyA,717
82
+ pyinfra/facts/vzctl.py,sha256=lUacmyakn2sJ2tD2FDAh1eeX3sxEVq7aRRwWM4QTguQ,760
83
+ pyinfra/facts/xbps.py,sha256=pNpgeITdHoJWhnJ_XFjySJ7H35d9h_v2F7GKqIrxgt0,663
84
+ pyinfra/facts/yum.py,sha256=KM0ogmT2JPPuSZKV7HaUFxIA1IXhcXRmykRk9wloKag,1169
85
+ pyinfra/facts/zfs.py,sha256=4cWfTu2_V3Rkku8LfWzwruP_Tu4gJV2ZOrtW3otbP2w,1805
86
+ pyinfra/facts/zypper.py,sha256=OQ8VXA-aRpsleiXVaRotjOewSOknux_VQ1Xv3qlfy7k,958
87
+ pyinfra/facts/util/__init__.py,sha256=FNqUZjHPzJplb6ctHdZCVvmxAeVDQfFYmghC6B5edWQ,573
88
+ pyinfra/facts/util/databases.py,sha256=EphGQApzRBXI2nG1FL9h8bozY-o4SgdQgpv9YcnCkxs,730
89
+ pyinfra/facts/util/packaging.py,sha256=Bo7QxYO0Eyj4_i8G27aOWUD_Rfw741RhkEBm3dF5OMI,1229
90
+ pyinfra/facts/util/units.py,sha256=SNHCisxGwZedCOqO9tfOWJpZ5Stc0Wcg9mZcXoKBY0A,714
91
+ pyinfra/facts/util/win_files.py,sha256=S_IQ5kJD6ZgkEcVHajgh7BIMolLV-1q1ghIcwAS-E1Q,2561
92
+ pyinfra/operations/__init__.py,sha256=SOcW337KXIzD_LH-iJJfq14BQcCs5JzwswJ0PIzDgF4,357
93
+ pyinfra/operations/apk.py,sha256=_0vOjbSiGx6EWv9rvTmQdGnRZQ_NA_Dyd3QW1cTzFgI,2111
94
+ pyinfra/operations/apt.py,sha256=w8rb8_yH4gKrdhDLKfWcziC5XQRXfhcGqNUwVcqrXpk,14352
95
+ pyinfra/operations/brew.py,sha256=aghLE4qyuhhRbt6fgSPV6_5fyWgTohA77Dc0gol19UU,5155
96
+ pyinfra/operations/bsdinit.py,sha256=okQUQDr2H8Z-cAdfdbPJiuGujsHLuV5gpuMZ1UlICEM,1648
97
+ pyinfra/operations/cargo.py,sha256=mXWd6pb0IR6kzJMmPHwXZN-VJ-B_y8AdOFlrRzDQOZI,1104
98
+ pyinfra/operations/choco.py,sha256=nIj4bWhChOd5DkybpbD-oupaoODgS7lYx6Vrou5ksuc,1547
99
+ pyinfra/operations/crontab.py,sha256=4jxNsgmJED7w9w2Rq6Irsa4wMXxH_yPDIjkFlcpXj7E,6552
100
+ pyinfra/operations/dnf.py,sha256=3154Rer6dejVB1AK-CqyJhpMVn_djaSDJrVMs62GNcE,5599
101
+ pyinfra/operations/docker.py,sha256=p8sG4BpcxSZwzKj4ystVgKmxmaF4GgDlnyJw1LeIsY4,12271
102
+ pyinfra/operations/files.py,sha256=E4SQTZZSIihXUWuzp7a3zBp_5gy_Agx9Ag45zrh6pgs,65686
103
+ pyinfra/operations/flatpak.py,sha256=QEJpzSXLyMQFk1XPAPHAfJVWcYWHnKA-tQr2hX6sB9o,2319
104
+ pyinfra/operations/gem.py,sha256=2C85sOwIRMHGvmPg4uAlUVf6MokhiA7LLPqzdJRHsBg,1132
105
+ pyinfra/operations/git.py,sha256=BqYQbG1VRw_XPtagbZHXitzss-U_LNGXRTwHE7L8P6M,13244
106
+ pyinfra/operations/iptables.py,sha256=EVav144bK25F5KQcSivBWqIdffdskTcMcUuWaSK1RRE,9338
107
+ pyinfra/operations/launchd.py,sha256=6HWvqoQ74idV_NStOEmFXwu0dmTv7YDvFtsK8An2Lu4,1177
108
+ pyinfra/operations/lxd.py,sha256=bKm9gsgZaruKYSL7OYFMiou-wGP4BzwIMWzjW4AZYrk,1742
109
+ pyinfra/operations/mysql.py,sha256=mmTb8es8OQ9FB7dHpeD1aB3Px9p9Fp3WQEwMkWZ0-R4,19851
110
+ pyinfra/operations/npm.py,sha256=bUmfQsClZ2YcHiihiC7k5widIXIi6lbfx_32iyaAKfo,1499
111
+ pyinfra/operations/openrc.py,sha256=AThQQO7u_pO0M-rQbxkX7EWDuR569smkoPVaQoRoFeE,1834
112
+ pyinfra/operations/opkg.py,sha256=xBdmU07MWr-YBKX0EV0GuVrwMy6MOOf7wzYvD42sF_I,2607
113
+ pyinfra/operations/pacman.py,sha256=QMjmsBiiw362nhZY0rEDVQL5A32MG3u7GcmX4q4PzfI,1702
114
+ pyinfra/operations/pip.py,sha256=Gh1vmrkCNktYXO8bh0IMEqjqhV07J8FYJcLHETZhjcQ,5995
115
+ pyinfra/operations/pipx.py,sha256=05AUm3nkkCfoxl0o4V5o9P_qb__0Yfv495dTBq7zkE4,2800
116
+ pyinfra/operations/pkg.py,sha256=rORQBbKeb-6gS0LYu0a0VdiWcDZoovcUONCaf6KMdeQ,2298
117
+ pyinfra/operations/pkgin.py,sha256=zhUyGzKjnUfGoyHbMoYMbeeMzcsiOUpBz1zIzppigJ0,1992
118
+ pyinfra/operations/postgres.py,sha256=hD65hRb8s3h6zlG-9WwT4JsNEXuxJUCY8ZRX61qlvlI,13367
119
+ pyinfra/operations/postgresql.py,sha256=agZjL2W4yxigk9ThIC0V_3wvmcWVdX308aJO24WkN6g,833
120
+ pyinfra/operations/puppet.py,sha256=eDe8D9jQbHYQ4_r4-dmEZfMASKQvj36BR8z_h8aDfw8,861
121
+ pyinfra/operations/python.py,sha256=u569cdPrPesrmzU09nwIPA3bk6TZ-Qv2QP0lJLcO_bw,2021
122
+ pyinfra/operations/runit.py,sha256=-K0GhORE56J4Gjh7PCriSx9zZI7XJV-cIb-LnnSuKdY,5162
123
+ pyinfra/operations/selinux.py,sha256=imZ4dbY4tl0GpBSkUgV983jbDDihWNs_OQkOBulT7FQ,5948
124
+ pyinfra/operations/server.py,sha256=HsnNBZtjXq_SPIDacs1owzXbODBZya1idk5Cpp-32kc,31245
125
+ pyinfra/operations/snap.py,sha256=a-QtNE4Dlsavqq425TUIwpEJu4oGw8UlLRkdTFyT1F8,3049
126
+ pyinfra/operations/ssh.py,sha256=wocoaYDlOhhItItAVQCEfnVowTtkg3AP0hQ3mnpUnl0,5634
127
+ pyinfra/operations/systemd.py,sha256=hPHTjASj6N_fRAzLr3DNHnxxIbiiTIIT9UStSxKDkTk,3984
128
+ pyinfra/operations/sysvinit.py,sha256=WzzthkmWL46MNNY6LsBZ90e37yPj0w2QyUtEAlGBwqY,4078
129
+ pyinfra/operations/upstart.py,sha256=pHb9RGnVhT14A_y6OezfOH-lmniKpiyJqpeoOJl0beE,1978
130
+ pyinfra/operations/vzctl.py,sha256=2u2CDkuDjzHBRQ54HfyfLpLrsbT8U7_05EEjbbhKUiU,3110
131
+ pyinfra/operations/xbps.py,sha256=ru3_srMBUyUXGzAsPo7WwoomfM0AeDglFv8CDqB33B0,1508
132
+ pyinfra/operations/yum.py,sha256=Ig7AzQy1C7I8XM37lWbw0nI5lzFGMoX30P8FV8-V5uA,5600
133
+ pyinfra/operations/zfs.py,sha256=FnhiXreqf5qJBusC31dwrQsEi0MvH4qxzjBayHKFcYY,5283
134
+ pyinfra/operations/zypper.py,sha256=z1CWv2uwWBlCLIhHna7U5DojVoKZYoUYpezJ_FM_xK8,5555
135
+ pyinfra/operations/freebsd/__init__.py,sha256=PXsCLQG29VhimYw4uwwB2FcDt6CrofOtD3LTHC-ik-8,362
136
+ pyinfra/operations/freebsd/freebsd_update.py,sha256=lH0wB_i6DkaXQnDPjsDq8ocO1hYHL0v_a1go4exYcR8,1864
137
+ pyinfra/operations/freebsd/pkg.py,sha256=3AyfI0-_9F4ho47KqZsOMQocwNtTF2q9g0i6TffJVak,4413
138
+ pyinfra/operations/freebsd/service.py,sha256=1f7nTHELnhs3HBSrMFsmopVgYFMIwB8Se88yneRQ8Rw,3198
139
+ pyinfra/operations/freebsd/sysrc.py,sha256=eg7u_JsCge_uKq3Ysc_mohUc6qgJrOZStp_B_l2Hav4,2330
140
+ pyinfra/operations/util/__init__.py,sha256=ZAHjeCXtLo0TIOSfZ9h0Sh5IXXRCspfHs3RR1l8tQCE,366
141
+ pyinfra/operations/util/docker.py,sha256=F7YmWIRSDyFaosf9q81nnwHhhIG7ktXOkM4VVOiUXTs,6931
142
+ pyinfra/operations/util/files.py,sha256=PFJDccNTwXK4tIoFB8ycRj7yD1x7LpSflBy7mPQtJCg,7148
143
+ pyinfra/operations/util/packaging.py,sha256=s5lP7lRORirQVDwGRARAatUZvz5lv_WpSSP-qq__2JQ,12034
144
+ pyinfra/operations/util/service.py,sha256=kJd1zj4-sAaGIp5Ts7yAJznogWaGr8oQTztwenLAr7Y,1309
145
+ pyinfra_cli/__init__.py,sha256=G0X7tNdqT45uWuK3aHIKxMdDeCgJ7zHo6vbxoG6zy_8,284
146
+ pyinfra_cli/cli.py,sha256=Bpt-mRNmvz0sNNhMAO5J3m0Kg-6M8tkJNMGY4C01ARc,20938
147
+ pyinfra_cli/commands.py,sha256=J-mCJYvDebJ8M7o3HreB2zToa871-xO6_KjVhPLeHho,1832
148
+ pyinfra_cli/exceptions.py,sha256=RRaOprL7SmVv--FLy4x7fxeTitx9wYI0Y3_h01LfhJA,4901
149
+ pyinfra_cli/inventory.py,sha256=JYSixJZKY8GNWlOxh-nGDsAknCdaAktlWAmdg13kvNk,11771
150
+ pyinfra_cli/log.py,sha256=mD96MH2owQQ5AsYRw7osCKENdp-E3Wum5IDr6qhSIa4,2268
151
+ pyinfra_cli/main.py,sha256=1CR3IS-O6BkAzkn7UW6pdKktTmN4Qnt0_jPdkhueRM8,936
152
+ pyinfra_cli/prints.py,sha256=1h6vgKVRKUxcGz_HdyEEDUvkp-lgiiVGwx3hc9rw24A,10434
153
+ pyinfra_cli/util.py,sha256=8KKW5LTHX4ebbwbHqMvLqwjZ11mOHI-xIYn-cZCWltg,6722
154
+ pyinfra_cli/virtualenv.py,sha256=wRNxOPcUkbD_Pzuj-Lnrz1KxGmsLlb2ObmCTFrdD-S8,2474
155
+ pyinfra-3.5.1.dist-info/METADATA,sha256=vlQV0UOJp4UabXoiD6rlQU6HV1oJ76tj3jklwU3cBPk,5740
156
+ pyinfra-3.5.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
157
+ pyinfra-3.5.1.dist-info/entry_points.txt,sha256=b1nLI6oVRvkeQDS00xcYGdGl4XVR_3tMbKs6T58-NW4,507
158
+ pyinfra-3.5.1.dist-info/licenses/LICENSE.md,sha256=BzCnRYLJv0yb-FJuEd_XOrrQSOEQKzIVo0yHT8taNnM,1076
159
+ pyinfra-3.5.1.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.33.6)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -0,0 +1,12 @@
1
+ [console_scripts]
2
+ pyinfra = pyinfra_cli.main:main
3
+
4
+ [pyinfra.connectors]
5
+ chroot = pyinfra.connectors.chroot:ChrootConnector
6
+ docker = pyinfra.connectors.docker:DockerConnector
7
+ dockerssh = pyinfra.connectors.dockerssh:DockerSSHConnector
8
+ local = pyinfra.connectors.local:LocalConnector
9
+ podman = pyinfra.connectors.docker:PodmanConnector
10
+ ssh = pyinfra.connectors.ssh:SSHConnector
11
+ terraform = pyinfra.connectors.terraform:TerraformInventoryConnector
12
+ vagrant = pyinfra.connectors.vagrant:VagrantInventoryConnector
@@ -1,4 +1,4 @@
1
- Copyright (C) 2016 Nick Barrett <pointlessrambler@gmail.com>
1
+ Copyright (C) 2025 Nick Barrett <nick@fizzadar.com>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
4
 
pyinfra_cli/__init__.py CHANGED
@@ -2,4 +2,5 @@
2
2
  # possible, to avoid problems with the stdlib usage elsewhere in pyinfra. API
3
3
  # scripts should also patch gevent at the start of their execution.
4
4
  from gevent import monkey # noqa
5
+
5
6
  monkey.patch_all() # noqa