Compare commits
53 Commits
560374a686
...
7dd2d1025a
Author | SHA1 | Date |
---|---|---|
|
7dd2d1025a | 4 months ago |
|
513a8ae177 | 4 months ago |
|
2a2f91959e | 4 months ago |
|
fcf76cdb2c | 4 months ago |
|
1450861e26 | 4 months ago |
|
08a6b467fa | 4 months ago |
|
ed3da3c829 | 5 months ago |
|
b974969f28 | 5 months ago |
|
bdfd92dc37 | 6 months ago |
|
5c85b04309 | 6 months ago |
|
f36069754c | 6 months ago |
|
d4dfe95a97 | 6 months ago |
|
ffeaafe9b6 | 8 months ago |
|
62db96bb37 | 8 months ago |
|
c85184dcb4 | 9 months ago |
|
90488d2e9e | 10 months ago |
|
be6e7fcc08 | 10 months ago |
|
d4bf41ce3b | 10 months ago |
|
7de931829a | 10 months ago |
|
17466452f0 | 10 months ago |
|
7d8fc8a5c3 | 10 months ago |
|
6243165645 | 10 months ago |
|
483f0c1614 | 11 months ago |
|
ff6b2d0abf | 11 months ago |
|
339ca9347b | 11 months ago |
|
5a7542db75 | 11 months ago |
|
0ae37b3445 | 11 months ago |
|
5e6cde1398 | 1 year ago |
|
77d9a757ec | 1 year ago |
|
e5adcf451b | 1 year ago |
|
9839c2d8ec | 1 year ago |
|
1edc4d0a60 | 1 year ago |
|
3d58c9b24f | 1 year ago |
|
6c8c692a22 | 1 year ago |
|
abbc7dfc37 | 1 year ago |
|
8b915b15b5 | 1 year ago |
|
2df2578e36 | 1 year ago |
|
6f8c774cb0 | 1 year ago |
|
54a5cb17b7 | 1 year ago |
|
cb0fa0f2e4 | 1 year ago |
|
af54fe6feb | 1 year ago |
|
22039284f5 | 1 year ago |
|
bd44c023d3 | 1 year ago |
|
e0150e7796 | 1 year ago |
|
15e1ce6450 | 1 year ago |
|
08ff41efde | 1 year ago |
|
c2c5668b70 | 1 year ago |
|
6e3ad11ea0 | 1 year ago |
|
fc6ddac718 | 1 year ago |
|
3a321469a8 | 2 years ago |
|
e2500248f2 | 2 years ago |
|
0b710c6173 | 2 years ago |
|
c33d99ee12 | 2 years ago |
@ -0,0 +1 @@
|
||||
500
|
@ -1,2 +1,3 @@
|
||||
state
|
||||
package
|
||||
priority
|
||||
|
@ -1,55 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Remove the given apt repository.
|
||||
#
|
||||
# Exit with:
|
||||
# 0: if it worked
|
||||
# 1: if not
|
||||
# 2: on other error
|
||||
|
||||
import os
|
||||
import sys
|
||||
from aptsources import distro, sourceslist
|
||||
from softwareproperties import ppa
|
||||
from softwareproperties.SoftwareProperties import SoftwareProperties
|
||||
|
||||
|
||||
def remove_if_empty(file_name):
|
||||
with open(file_name, 'r') as f:
|
||||
if f.read().strip():
|
||||
return
|
||||
os.unlink(file_name)
|
||||
|
||||
def remove_repository(repository):
|
||||
#print 'repository:', repository
|
||||
codename = distro.get_distro().codename
|
||||
#print 'codename:', codename
|
||||
(line, file) = ppa.expand_ppa_line(repository.strip(), codename)
|
||||
#print 'line:', line
|
||||
#print 'file:', file
|
||||
deb_source_entry = sourceslist.SourceEntry(line, file)
|
||||
src_source_entry = sourceslist.SourceEntry('deb-src{}'.format(line[3:]), file)
|
||||
|
||||
try:
|
||||
sp = SoftwareProperties()
|
||||
sp.remove_source(deb_source_entry)
|
||||
try:
|
||||
# If there's a deb-src entry, remove that too
|
||||
sp.remove_source(src_source_entry)
|
||||
except:
|
||||
pass
|
||||
remove_if_empty(file)
|
||||
return True
|
||||
except ValueError:
|
||||
print >> sys.stderr, "Error: '%s' doesn't exists in a sourcelist file" % line
|
||||
return False
|
||||
|
||||
if __name__ == '__main__':
|
||||
if (len(sys.argv) != 2):
|
||||
print >> sys.stderr, 'Error: need a repository as argument'
|
||||
sys.exit(2)
|
||||
repository = sys.argv[1]
|
||||
if remove_repository(repository):
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
@ -1,4 +1,5 @@
|
||||
state
|
||||
distribution
|
||||
component
|
||||
arch
|
||||
arch
|
||||
signed-by
|
||||
|
@ -0,0 +1,8 @@
|
||||
frontend http
|
||||
bind BIND@:80
|
||||
mode http
|
||||
option httplog
|
||||
default_backend http
|
||||
|
||||
backend http
|
||||
mode http
|
@ -0,0 +1,10 @@
|
||||
frontend https
|
||||
bind BIND@:443
|
||||
mode tcp
|
||||
option tcplog
|
||||
tcp-request inspect-delay 5s
|
||||
tcp-request content accept if { req_ssl_hello_type 1 }
|
||||
default_backend https
|
||||
|
||||
backend https
|
||||
mode tcp
|
@ -0,0 +1,12 @@
|
||||
frontend imaps
|
||||
bind BIND@:143
|
||||
bind BIND@:993
|
||||
|
||||
mode tcp
|
||||
option tcplog
|
||||
tcp-request inspect-delay 5s
|
||||
tcp-request content accept if { req_ssl_hello_type 1 }
|
||||
default_backend imaps
|
||||
|
||||
backend imaps
|
||||
mode tcp
|
@ -0,0 +1,12 @@
|
||||
frontend smtps
|
||||
bind BIND@:25
|
||||
bind BIND@:465
|
||||
|
||||
mode tcp
|
||||
option tcplog
|
||||
tcp-request inspect-delay 5s
|
||||
tcp-request content accept if { req_ssl_hello_type 1 }
|
||||
default_backend smtps
|
||||
|
||||
backend smtps
|
||||
mode tcp
|
@ -0,0 +1,121 @@
|
||||
cdist-type__haproxy_dualstack(7)
|
||||
================================
|
||||
|
||||
|
||||
NAME
|
||||
----
|
||||
cdist-type__haproxy_dualstack - Proxy services from a dual-stack server
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
This (singleton) type installs and configures haproxy to act as a dual-stack
|
||||
proxy for single-stack services.
|
||||
|
||||
This can be useful to add IPv4 support to IPv6-only services while only using
|
||||
one IPv4 for many such services.
|
||||
|
||||
By default this type uses the plain TCP proxy mode, which means that there is no
|
||||
need for TLS termination on this host when SNI is supported.
|
||||
This also means that proxied services will not receive the client's IP address,
|
||||
but will see the proxy's IP address instead (that of `$__target_host`).
|
||||
|
||||
This can be solved by using the PROXY protocol, but do take into account that,
|
||||
e.g. nginx cannot serve both regular HTTP(S) and PROXY protocols on the same
|
||||
port, so you will need to use other ports for that.
|
||||
|
||||
As a recommendation in this type: use TCP ports 8080 and 591 respectively to
|
||||
serve HTTP and HTTPS using the PROXY protocol.
|
||||
|
||||
See the EXAMPLES for more details.
|
||||
|
||||
|
||||
OPTIONAL PARAMETERS
|
||||
-------------------
|
||||
v4proxy
|
||||
Proxy incoming IPv4 connections to the equivalent IPv6 endpoint.
|
||||
In its simplest use, it must be a NAME with an `AAAA` DNS entry, which is
|
||||
the IP address actually providing the proxied services.
|
||||
The full format of this argument is:
|
||||
`[proxy:]NAME[[:PROTOCOL_1=PORT_1]...[:PROTOCOL_N=PORT_N]]`
|
||||
Where starting with `proxy:` determines that the PROXY protocol must be
|
||||
used and each `:PROTOCOL=PORT` (e.g. `:http=8080` or `:https=591`) is a PORT
|
||||
override for the given PROTOCOL (see `--protocol`), if not present the
|
||||
PROTOCOL's default port will be used.
|
||||
|
||||
|
||||
v6proxy
|
||||
Proxy incoming IPv6 connections to the equivalent IPv4 endpoint.
|
||||
In its simplest use, it must be a NAME with an `A` DNS entry, which is
|
||||
the IP address actually providing the proxied services.
|
||||
See `--v4proxy` for more options and details.
|
||||
|
||||
protocol
|
||||
Can be passed multiple times or as a space-separated list of protocols.
|
||||
Currently supported protocols are: `http`, `https`, `imaps`, `smtps`.
|
||||
This defaults to: `http https imaps smtps`.
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
# Proxy the IPv6-only services so IPv4-only clients can access them
|
||||
# This uses HAProxy's TCP mode for http, https, imaps and smtps
|
||||
__haproxy_dualstack \
|
||||
--v4proxy ipv6.chat \
|
||||
--v4proxy matrix.ungleich.ch
|
||||
|
||||
# Proxy the IPv6-only HTTP(S) services so IPv4-only clients can access them
|
||||
# Note this means that the backend IPv6-only server will only see
|
||||
# the IPv6 address of the haproxy host managed by cdist, which can be
|
||||
# troublesome if this information is relevant for analytics/security/...
|
||||
# See the PROXY example below
|
||||
__haproxy_dualstack \
|
||||
--protocol http --protocol https \
|
||||
--v4proxy ipv6.chat \
|
||||
--v4proxy matrix.ungleich.ch
|
||||
|
||||
# Use the PROXY protocol to proxy the IPv6-only HTTP(S) services enabling
|
||||
# IPv4-only clients to access them while maintaining the client's IP address
|
||||
__haproxy_dualstack \
|
||||
--protocol http --protocol https \
|
||||
--v4proxy proxy:ipv6.chat:http=8080:https=591 \
|
||||
--v4proxy proxy:matrix.ungleich.ch:http=8080:https=591
|
||||
# Note however that the PROXY protocol is not compatible with regular
|
||||
# HTTP(S) protocols, so your nginx will have to listen on different ports
|
||||
# with the PROXY settings.
|
||||
# Note that you will need to restrict access to the 8080 port to prevent
|
||||
# Client IP spoofing.
|
||||
# This can be something like:
|
||||
# server {
|
||||
# # listen for regular HTTP connections
|
||||
# listen [::]:80 default_server;
|
||||
# listen 80 default_server;
|
||||
# # listen for PROXY HTTP connections
|
||||
# listen [::]:8080 proxy_protocol;
|
||||
# # Accept the Client's IP from the PROXY protocol
|
||||
# real_ip_header proxy_protocol;
|
||||
# }
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
- https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/
|
||||
- https://www.haproxy.com/blog/haproxy/proxy-protocol/
|
||||
- https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/
|
||||
|
||||
|
||||
AUTHORS
|
||||
-------
|
||||
ungleich <foss--@--ungleich.ch>
|
||||
Evilham <cvs--@--evilham.com>
|
||||
|
||||
|
||||
COPYING
|
||||
-------
|
||||
Copyright \(C) 2021 ungleich glarus ag. You can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
@ -0,0 +1,155 @@
|
||||
#!/bin/sh -eu
|
||||
|
||||
__package haproxy
|
||||
require="__package/haproxy" __start_on_boot haproxy
|
||||
|
||||
tmpdir="$__object/files"
|
||||
mkdir "$tmpdir"
|
||||
configtmp="$__object/files/haproxy.cfg"
|
||||
|
||||
os=$(cat "$__global/explorer/os")
|
||||
case $os in
|
||||
freebsd)
|
||||
CONFIG_FILE="/usr/local/etc/haproxy.conf"
|
||||
cat <<EOF > "$configtmp"
|
||||
global
|
||||
maxconn 4000
|
||||
user nobody
|
||||
group nogroup
|
||||
daemon
|
||||
|
||||
EOF
|
||||
|
||||
;;
|
||||
*)
|
||||
CONFIG_FILE="/etc/haproxy/haproxy.cfg"
|
||||
cat <<EOF > "$configtmp"
|
||||
global
|
||||
log [::1] local2
|
||||
chroot /var/lib/haproxy
|
||||
pidfile /var/run/haproxy.pid
|
||||
maxconn 4000
|
||||
user haproxy
|
||||
group haproxy
|
||||
daemon
|
||||
|
||||
# turn on stats unix socket
|
||||
stats socket /var/lib/haproxy/stats
|
||||
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
|
||||
cat <<EOF >> "$configtmp"
|
||||
defaults
|
||||
retries 3
|
||||
log global
|
||||
timeout http-request 10s
|
||||
timeout queue 1m
|
||||
timeout connect 10s
|
||||
timeout client 1m
|
||||
timeout server 1m
|
||||
timeout http-keep-alive 10s
|
||||
timeout check 10s
|
||||
EOF
|
||||
|
||||
dig_cmd="$(command -v dig || true)"
|
||||
get_ip() {
|
||||
# Usage: get_ip (ipv4|ipv6) NAME
|
||||
# uses "dig" if available, else fallback to "host"
|
||||
case $1 in
|
||||
ipv4)
|
||||
if [ -n "${dig_cmd}" ]; then
|
||||
${dig_cmd} +short A "$2"
|
||||
else
|
||||
host -t A "$2" | cut -d ' ' -f 4 | grep -v 'found:'
|
||||
fi
|
||||
;;
|
||||
ipv6)
|
||||
if [ -n "${dig_cmd}" ]; then
|
||||
${dig_cmd} +short AAAA "$2"
|
||||
else
|
||||
host -t AAAA "$2" | cut -d ' ' -f 5 | grep -v 'NXDOMAIN'
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
PROTOCOLS="$(cat "$__object/parameter/protocol")"
|
||||
|
||||
for proxy in v4proxy v6proxy; do
|
||||
param=$__object/parameter/$proxy
|
||||
# no backend? skip generating code
|
||||
if [ ! -f "$param" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# turn backend name into bind parameter: v4backend -> ipv4@
|
||||
bind=$(echo $proxy | sed -e 's/^/ip/' -e 's/proxy//')
|
||||
|
||||
case $bind in
|
||||
ipv4)
|
||||
backendproto=ipv6
|
||||
;;
|
||||
ipv6)
|
||||
backendproto=ipv4
|
||||
;;
|
||||
esac
|
||||
|
||||
for proto in ${PROTOCOLS}; do
|
||||
# Add protocol "header"
|
||||
printf "\n# %s %s \n" "${bind}" "${proto}" >> "$configtmp"
|
||||
|
||||
sed -e "s/BIND/$bind/" \
|
||||
-e "s/\(frontend[[:space:]].*\)/\1$bind/" \
|
||||
-e "s/\(backend[[:space:]].*\)/\\1$bind/" \
|
||||
"$__type/files/$proto" >> "$configtmp"
|
||||
|
||||
while read -r hostdefinition; do
|
||||
if echo "$hostdefinition" | grep -qE '^proxy:'; then
|
||||
# Proxy protocol was requested
|
||||
host="$(echo "$hostdefinition" | sed -E 's/^proxy:([^:]+).*$/\1/')"
|
||||
send_proxy=" send-proxy"
|
||||
else
|
||||
# Just use tcp proxy mode
|
||||
host="$hostdefinition"
|
||||
send_proxy=""
|
||||
fi
|
||||
if echo "$hostdefinition" | grep -qE ":${proto}="; then
|
||||
# Use custom port definition if requested
|
||||
port="$(echo "$hostdefinition" | sed -E "s/^(.*:)?${proto}=([0-9]+).*$/:\2/")"
|
||||
else
|
||||
# Else use the default
|
||||
port=""
|
||||
fi
|
||||
servername=$host
|
||||
|
||||
res=$(get_ip "$bind" "$servername")
|
||||
|
||||
if [ -z "$res" ]; then
|
||||
echo "$servername does not resolve - aborting config" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Treat protocols without TLS+SNI specially
|
||||
if [ "$proto" = http ]; then
|
||||
echo " use-server $servername if { hdr(host) -i $host }" >> "$configtmp"
|
||||
else
|
||||
echo " use-server $servername if { req_ssl_sni -i $host }" >> "$configtmp"
|
||||
fi
|
||||
|
||||
# Create the "server" itself.
|
||||
# Note that port and send_proxy will be empty unless
|
||||
# they were requested by the type user
|
||||
echo " server $servername ${backendproto}@${host}${port}${send_proxy}" >> "$configtmp"
|
||||
|
||||
done < "$param"
|
||||
done
|
||||
done
|
||||
|
||||
# Create config file
|
||||
require="__package/haproxy" __file ${CONFIG_FILE} --source "$configtmp" --mode 0644
|
||||
|
||||
require="__file${CONFIG_FILE}" __check_messages "haproxy_reload" \
|
||||
--pattern "^__file${CONFIG_FILE}" \
|
||||
--execute "service haproxy reload || service haproxy restart"
|
@ -0,0 +1 @@
|
||||
http https imaps smtps
|
@ -0,0 +1,3 @@
|
||||
protocol
|
||||
v4proxy
|
||||
v6proxy
|
@ -1,2 +1,3 @@
|
||||
apt-clean
|
||||
apt-dist-upgrade
|
||||
apt-with-new-pkgs
|
||||
|
@ -0,0 +1,90 @@
|
||||
* Install requirements (Alpine)
|
||||
- apk add py3-pycodestyle shellcheck py3-sphinx py3-sphinx_rtd_theme \
|
||||
py3-build twine
|
||||
* Ensure your gpg setup works with the email used in the git commit!
|
||||
- For me this is nico@nico-notebook.schottelius.org
|
||||
- Signature / id is on nb2
|
||||
* Create ~/.pypirc
|
||||
[distutils]
|
||||
index-servers =
|
||||
pypi
|
||||
cdist
|
||||
|
||||
[pypi]
|
||||
username = __token__
|
||||
password = ...
|
||||
|
||||
[cdist]
|
||||
repository = https://upload.pypi.org/legacy/
|
||||
username = __token__
|
||||
password = ...
|
||||
|
||||
* Add date in docs/changelog
|
||||
* Run ./bin/cdist-build-helper
|
||||
* TODO Move to "build"
|
||||
- python3 -m build
|
||||
* DONE git tag: when?
|
||||
CLOSED: [2022-07-31 Sun 23:58]
|
||||
** Asked during release process: ok
|
||||
* DONE Pypi error with distutils: do not use distutils anymore
|
||||
CLOSED: [2022-07-31 Sun 23:58]
|
||||
python3 setup.py sdist upload
|
||||
...
|
||||
Creating tar archive
|
||||
removing 'cdist-7.0.0' (and everything under it)
|
||||
running upload
|
||||
Submitting dist/cdist-7.0.0.tar.gz to https://upload.pypi.org/legacy/
|
||||
Upload failed (400): Invalid value for blake2_256_digest. Error: Use a valid, hex-encoded, BLAKE2 message digest.
|
||||
error: Upload failed (400): Invalid value for blake2_256_digest. Error: Use a valid, hex-encoded, BLAKE2 message digest.
|
||||
(venv2) [22:50] nb2:cdist%
|
||||
|
||||
* DONE Pypi error with twine: fixed in twine 4.0.1
|
||||
CLOSED: [2022-07-31 Sun 23:58]
|
||||
|
||||
Seeing:
|
||||
|
||||
(venv2) [22:47] nb2:cdist% twine upload dist/cdist-7.0.0*
|
||||
Uploading distributions to https://upload.pypi.org/legacy/
|
||||
Traceback (most recent call last):
|
||||
File "/usr/bin/twine", line 8, in <module>
|
||||
sys.exit(main())
|
||||
File "/usr/lib/python3.10/site-packages/twine/__main__.py", line 28, in main
|
||||
result = cli.dispatch(sys.argv[1:])
|
||||
File "/usr/lib/python3.10/site-packages/twine/cli.py", line 68, in dispatch
|
||||
return main(args.args)
|
||||
File "/usr/lib/python3.10/site-packages/twine/commands/upload.py", line 197, in main
|
||||
return upload(upload_settings, parsed_args.dists)
|
||||
File "/usr/lib/python3.10/site-packages/twine/commands/upload.py", line 141, in upload
|
||||
resp = repository.upload(package)
|
||||
File "/usr/lib/python3.10/site-packages/twine/repository.py", line 189, in upload
|
||||
resp = self._upload(package)
|
||||
File "/usr/lib/python3.10/site-packages/twine/repository.py", line 144, in _upload
|
||||
data = package.metadata_dictionary()
|
||||
File "/usr/lib/python3.10/site-packages/twine/package.py", line 181, in metadata_dictionary
|
||||
"dynamic": meta.dynamic,
|
||||
AttributeError: 'Wheel' object has no attribute 'dynamic'
|
||||
|
||||
|
||||
Fix:
|
||||
|
||||
|
||||
(venv2) [23:43] nb2:cdist% pipx run twine upload dist/*
|
||||
⚠️ twine is already on your PATH and installed at /home/nico/venv2/bin/twine. Downloading and running anyway.
|
||||
Uploading distributions to https://upload.pypi.org/legacy/
|
||||
Uploading cdist-7.0.0-py3-none-any.whl
|
||||
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 868.6/868.6 kB • 00:04 • 221.3 kB/s
|
||||
Uploading cdist-7.0.0.tar.gz
|
||||
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB • 00:08 • 169.3 kB/s
|
||||
|
||||
View at:
|
||||
https://pypi.org/project/cdist/7.0.0/
|
||||
* TODO cdist web
|
||||
- on staticweb-2022
|
||||
- Should be moved to sftp/k8s
|
||||
|
||||
|
||||
Manual steps:
|
||||
|
||||
~/bin/permissions.public html/
|
||||
rsync -a html/ staticweb.ungleich.ch:/home/services/www/nico/www.cdi.st/www/manual/7.0.0/
|
||||
ssh staticweb.ungleich.ch "cd /home/services/www/nico/www.cdi.st/www/manual; ln -sf 7.0.0 latest"
|
Loading…
Reference in New Issue