Skip to content

Instantly share code, notes, and snippets.

@moreati
moreati / ansible_playbook_keywords_table.rst
Last active September 15, 2024 12:13
Table showing Ansible playbook keywords that can be used at play, role, block, or task level

Generated using development version of Ansible on 15 Sep 2024. Details may differ from released versions.

@moreati
moreati / issue905.ini
Created September 5, 2024 12:18
Reproducer for Mitogen issue 905
[issue905]
ssh-args ansible_ssh_args="-o PermitLocalCommand=yes -o LocalCommand='touch {{ ssh_args_canary_file }}'"
ssh-common-args ansible_ssh_common_args="-o PermitLocalCommand=yes -o LocalCommand='touch {{ ssh_args_canary_file }}'"
ssh-extra-args ansible_ssh_extra_args="-o PermitLocalCommand=yes -o LocalCommand='touch {{ ssh_args_canary_file }}'"
[issue905:vars]
ansible_host=u2204.mynet
ssh_args_canary_file=/tmp/ssh_args_{{ inventory_hostname }}
@moreati
moreati / popen_resourcewarning.py
Last active August 28, 2024 22:07
Demonstration of Python subprocess.Popen() ResourceWarning
import os
import subprocess
import sys
import warnings
# By default ResourceWarning output (and other) is hidden.
# Setting environment variable PYTHONWARNINGS=default will
# show them, similar to the below.
if not sys.warnoptions:
warnings.simplefilter('default')
@moreati
moreati / tree_layers.py
Created May 31, 2024 15:50
Calculate required layers of a tree for given number of leaf nodes
import math
def tree_layers_count(leaf_nodes_count: int, degree: int) -> int:
r"""
Return the number of layers required for a given number of leaf nodes,
if each node can have degree children & nodes are filled depth first.
E.g. to have 5 leaf nodes, a degree 4 tree requires 3 layers
*
_______________ _|_ _
@moreati
moreati / locals.yml
Created May 15, 2024 10:25
Different ways to execute Ansible tasks on the controller
- hosts: targets
gather_facts: false
vars:
ansible_python_interpreter: python3
tasks:
- command: echo hello
delegate_to: localhost
- command: echo hello
connection: local
@moreati
moreati / fromisoformat.md
Created April 8, 2024 15:51
Python 3.11 datetime.datetime.fromisoformat()

In Python 3.11+ datetime.datetime.fromisoformat() accepts any number of decimal places for the seconds component. If there are more than 6 then the resulting datetime object is truncated (not rounded) to microsecond precision.

Python 3.11.8 (main, Feb  6 2024, 21:21:21) [Clang 15.0.0 (clang-1500.1.0.2.5)] on darwin
>>> import datetime
>>> datetime.datetime.fromisoformat('2011-11-04T00:05:23.12345Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, 123450, tzinfo=datetime.timezone.utc)
>>> datetime.datetime.fromisoformat('2011-11-04T00:05:23.1234567Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, 123456, tzinfo=datetime.timezone.utc)
@moreati
moreati / macos.nix
Created March 3, 2024 21:24
My first baby steps with Nix on a macOS machine
# To apply changes run
# nix-env --install --remove-all --file ~/macos.nix
# nix-env -irf ~/macos.nix
#
# Notes
# - Binaries are made available in ~/.nix-profile/bin/
#
# TODO
# - Install ~/.nix-profile/bin/{python,python-config}{3.8,3.9,3.10,3.11,3.12},
# but *not* .../{python{,3}
@moreati
moreati / issue115911_mp.py
Last active February 29, 2024 13:54
importlib PathFinder monkeypatch for Python issue 115911 (getcwd() EACCESS)
# Monkeypatch that replaces the importlib PathFinder in sys.meta_path
# with one that handles EACCES returned by libc getcwd() on macOS.
# Workaround for https://github.com/python/cpython/issues/115911
import errno
import sys
try:
import _frozen_importlib_external
except ImportError:
pass
@moreati
moreati / importlib_importer_poc.py
Created January 31, 2024 22:34
Minimal example driving Python importlib machinery to import a runtime created module
#!/usr/bin/env python3
import importlib.machinery
import sys
import types
class Finder:
def find_spec(self, fullname, path, target=None):
if fullname != 'poc_module':
@moreati
moreati / ansible-playbook-paths-auditted
Last active July 27, 2023 15:22
ansible-playbook wrapped with audit hooks for file path operations
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import collections
import os
import re
import sys
EVENTS_OF_INTEREST = frozenset({
'glob.glob',
'open',