Compare commits
No commits in common. "master" and "ander/__rsync" have entirely different histories.
master
...
ander/__rs
79 changed files with 261 additions and 2102 deletions
6
Makefile
6
Makefile
|
@ -35,9 +35,9 @@ DOCS_SRC_DIR=./docs/src
|
||||||
SPEECHDIR=./docs/speeches
|
SPEECHDIR=./docs/speeches
|
||||||
TYPEDIR=./cdist/conf/type
|
TYPEDIR=./cdist/conf/type
|
||||||
|
|
||||||
SPHINXM=$(MAKE) -C $(DOCS_SRC_DIR) man
|
SPHINXM=make -C $(DOCS_SRC_DIR) man
|
||||||
SPHINXH=$(MAKE) -C $(DOCS_SRC_DIR) html
|
SPHINXH=make -C $(DOCS_SRC_DIR) html
|
||||||
SPHINXC=$(MAKE) -C $(DOCS_SRC_DIR) clean
|
SPHINXC=make -C $(DOCS_SRC_DIR) clean
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Manpages
|
# Manpages
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# 2011-2022 Nico Schottelius (nico-cdist at schottelius.org)
|
# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
# 2016-2019 Darko Poljak (darko.poljak at gmail.com)
|
# 2016-2019 Darko Poljak (darko.poljak at gmail.com)
|
||||||
#
|
#
|
||||||
# This file is part of cdist.
|
# This file is part of cdist.
|
||||||
|
@ -534,8 +534,7 @@ eof
|
||||||
;;
|
;;
|
||||||
|
|
||||||
version)
|
version)
|
||||||
target_version="$(git describe | sed 's/-/.dev/; s/-/+/g')"
|
printf "VERSION = \"%s\"\n" "$(git describe)" > cdist/version.py
|
||||||
printf "VERSION = \"%s\"\n" "${target_version}" > cdist/version.py
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
target-version)
|
target-version)
|
||||||
|
|
|
@ -472,6 +472,9 @@ def get_parsers():
|
||||||
parser['info'].set_defaults(func=cdist.info.Info.commandline)
|
parser['info'].set_defaults(func=cdist.info.Info.commandline)
|
||||||
|
|
||||||
# Scan = config + further
|
# Scan = config + further
|
||||||
|
parser['scan'] = parser['sub'].add_parser('scan', add_help=False,
|
||||||
|
parents=[parser['config']])
|
||||||
|
|
||||||
parser['scan'] = parser['sub'].add_parser(
|
parser['scan'] = parser['sub'].add_parser(
|
||||||
'scan', parents=[parser['loglevel'],
|
'scan', parents=[parser['loglevel'],
|
||||||
parser['beta'],
|
parser['beta'],
|
||||||
|
|
|
@ -21,9 +21,6 @@
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
case "$("$__explorer/os")" in
|
case "$("$__explorer/os")" in
|
||||||
checkpoint)
|
|
||||||
awk '{printf("%s\n", $(NF-1))}' /etc/cp-release
|
|
||||||
;;
|
|
||||||
openwrt)
|
openwrt)
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
(. /etc/openwrt_release && echo "$DISTRIB_CODENAME")
|
(. /etc/openwrt_release && echo "$DISTRIB_CODENAME")
|
||||||
|
|
|
@ -21,9 +21,6 @@
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
case "$("$__explorer/os")" in
|
case "$("$__explorer/os")" in
|
||||||
checkpoint)
|
|
||||||
cat /etc/cp-release
|
|
||||||
;;
|
|
||||||
openwrt)
|
openwrt)
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
(. /etc/openwrt_release && echo "$DISTRIB_DESCRIPTION")
|
(. /etc/openwrt_release && echo "$DISTRIB_DESCRIPTION")
|
||||||
|
|
|
@ -21,9 +21,6 @@
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
case "$("$__explorer/os")" in
|
case "$("$__explorer/os")" in
|
||||||
checkpoint)
|
|
||||||
echo "CheckPoint"
|
|
||||||
;;
|
|
||||||
openwrt)
|
openwrt)
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
(. /etc/openwrt_release && echo "$DISTRIB_ID")
|
(. /etc/openwrt_release && echo "$DISTRIB_ID")
|
||||||
|
|
|
@ -21,9 +21,6 @@
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
case "$("$__explorer/os")" in
|
case "$("$__explorer/os")" in
|
||||||
checkpoint)
|
|
||||||
sed /etc/cp-release -e 's/.* R\([1-9][0-9]*\)\.[0-9]*$/\1/'
|
|
||||||
;;
|
|
||||||
openwrt)
|
openwrt)
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
(. /etc/openwrt_release && echo "$DISTRIB_RELEASE")
|
(. /etc/openwrt_release && echo "$DISTRIB_RELEASE")
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -27,18 +27,19 @@
|
||||||
str2bytes() {
|
str2bytes() {
|
||||||
awk -F' ' '
|
awk -F' ' '
|
||||||
$2 == "B" || !$2 { print $1 }
|
$2 == "B" || !$2 { print $1 }
|
||||||
$2 == "kB" { printf "%.f\n", ($1 * 1000) }
|
$2 == "kB" { print $1 * 1000 }
|
||||||
$2 == "MB" { printf "%.f\n", ($1 * 1000 * 1000) }
|
$2 == "MB" { print $1 * 1000 * 1000 }
|
||||||
$2 == "GB" { printf "%.f\n", ($1 * 1000 * 1000 * 1000) }
|
$2 == "GB" { print $1 * 1000 * 1000 * 1000 }
|
||||||
$2 == "TB" { printf "%.f\n", ($1 * 1000 * 1000 * 1000 * 1000) }
|
$2 == "TB" { print $1 * 1000 * 1000 * 1000 * 1000 }
|
||||||
$2 == "kiB" { printf "%.f\n", ($1 * 1024) }
|
$2 == "kiB" { print $1 * 1024 }
|
||||||
$2 == "MiB" { printf "%.f\n", ($1 * 1024 * 1024) }
|
$2 == "MiB" { print $1 * 1024 * 1024 }
|
||||||
$2 == "GiB" { printf "%.f\n", ($1 * 1024 * 1024 * 1024) }
|
$2 == "GiB" { print $1 * 1024 * 1024 * 1024 }
|
||||||
$2 == "TiB" { printf "%.f\n", ($1 * 1024 * 1024 * 1024 * 1024) }'
|
$2 == "TiB" { print $1 * 1024 * 1024 * 1024 * 1024 }'
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes2kib() {
|
bytes2kib() {
|
||||||
awk '$0 > 0 { printf "%.f\n", ($0 / 1024) }'
|
set -- "$(cat)"
|
||||||
|
test "$1" -gt 0 && echo $(($1 / 1024))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -116,13 +116,6 @@ if [ -f /etc/slackware-version ]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Appliances
|
|
||||||
|
|
||||||
if grep -q '^Check Point Gaia' /etc/cp-release 2>/dev/null; then
|
|
||||||
echo checkpoint
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
uname_s="$(uname -s)"
|
uname_s="$(uname -s)"
|
||||||
|
|
||||||
# Assume there is no tr on the client -> do lower case ourselves
|
# Assume there is no tr on the client -> do lower case ourselves
|
||||||
|
|
|
@ -34,9 +34,5 @@ elif test -f /var/run/os-release
|
||||||
then
|
then
|
||||||
# FreeBSD (created by os-release service)
|
# FreeBSD (created by os-release service)
|
||||||
cat /var/run/os-release
|
cat /var/run/os-release
|
||||||
elif test -f /etc/cp-release
|
|
||||||
then
|
|
||||||
# Checkpoint firewall or management (actually linux based)
|
|
||||||
cat /etc/cp-release
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
|
# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
# 2020-2021 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
|
|
||||||
#
|
#
|
||||||
# This file is part of cdist.
|
# This file is part of cdist.
|
||||||
#
|
#
|
||||||
|
@ -18,22 +17,12 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
#
|
||||||
# All os variables are lower case
|
# All os variables are lower case
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
|
||||||
rc_getvar() {
|
case "$("$__explorer/os")" in
|
||||||
awk -F= -v varname="$2" '
|
|
||||||
function unquote(s) {
|
|
||||||
if (s ~ /^".*"$/ || s ~ /^'\''.*'\''$/)
|
|
||||||
return substr(s, 2, length(s) - 2)
|
|
||||||
else
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
$1 == varname { print unquote(substr($0, index($0, "=") + 1)) }' "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
case $("${__explorer:?}/os")
|
|
||||||
in
|
|
||||||
amazon)
|
amazon)
|
||||||
cat /etc/system-release
|
cat /etc/system-release
|
||||||
;;
|
;;
|
||||||
|
@ -41,9 +30,6 @@ in
|
||||||
# empty, but well...
|
# empty, but well...
|
||||||
cat /etc/arch-release
|
cat /etc/arch-release
|
||||||
;;
|
;;
|
||||||
checkpoint)
|
|
||||||
awk '{version=$NF; printf("%s\n", substr(version, 2))}' /etc/cp-release
|
|
||||||
;;
|
|
||||||
debian)
|
debian)
|
||||||
debian_version=$(cat /etc/debian_version)
|
debian_version=$(cat /etc/debian_version)
|
||||||
case $debian_version
|
case $debian_version
|
||||||
|
@ -57,8 +43,6 @@ in
|
||||||
# sid versions don't have a number, so we decode by codename:
|
# sid versions don't have a number, so we decode by codename:
|
||||||
case $(expr "$debian_version" : '\([a-z]\{1,\}\)/')
|
case $(expr "$debian_version" : '\([a-z]\{1,\}\)/')
|
||||||
in
|
in
|
||||||
trixie) echo 12.99 ;;
|
|
||||||
bookworm) echo 11.99 ;;
|
|
||||||
bullseye) echo 10.99 ;;
|
bullseye) echo 10.99 ;;
|
||||||
buster) echo 9.99 ;;
|
buster) echo 9.99 ;;
|
||||||
stretch) echo 8.99 ;;
|
stretch) echo 8.99 ;;
|
||||||
|
@ -66,7 +50,7 @@ in
|
||||||
wheezy) echo 6.99 ;;
|
wheezy) echo 6.99 ;;
|
||||||
squeeze) echo 5.99 ;;
|
squeeze) echo 5.99 ;;
|
||||||
lenny) echo 4.99 ;;
|
lenny) echo 4.99 ;;
|
||||||
*) echo 99.99 ;;
|
*) exit 1
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
@ -75,24 +59,7 @@ in
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
devuan)
|
devuan)
|
||||||
devuan_version=$(cat /etc/devuan_version)
|
cat /etc/devuan_version
|
||||||
case ${devuan_version}
|
|
||||||
in
|
|
||||||
(*/ceres)
|
|
||||||
# ceres versions don't have a number, so we decode by codename:
|
|
||||||
case ${devuan_version}
|
|
||||||
in
|
|
||||||
(daedalus/ceres) echo 4.99 ;;
|
|
||||||
(chimaera/ceres) echo 3.99 ;;
|
|
||||||
(beowulf/ceres) echo 2.99 ;;
|
|
||||||
(ascii/ceres) echo 1.99 ;;
|
|
||||||
(*) exit 1
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
(*)
|
|
||||||
echo "${devuan_version}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
;;
|
||||||
fedora)
|
fedora)
|
||||||
cat /etc/fedora-release
|
cat /etc/fedora-release
|
||||||
|
@ -101,20 +68,12 @@ in
|
||||||
cat /etc/gentoo-release
|
cat /etc/gentoo-release
|
||||||
;;
|
;;
|
||||||
macosx)
|
macosx)
|
||||||
# NOTE: Legacy versions (< 10.3) do not support options
|
sw_vers -productVersion
|
||||||
sw_vers | awk -F ':[ \t]+' '$1 == "ProductVersion" { print $2 }'
|
|
||||||
;;
|
;;
|
||||||
freebsd)
|
freebsd)
|
||||||
# Apparently uname -r is not a reliable way to get the patch level.
|
# Apparently uname -r is not a reliable way to get the patch level.
|
||||||
# See: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=251743
|
# See: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=251743
|
||||||
if command -v freebsd-version >/dev/null 2>&1
|
freebsd-version
|
||||||
then
|
|
||||||
# get userland version
|
|
||||||
freebsd-version -u
|
|
||||||
else
|
|
||||||
# fallback to kernel release for FreeBSD < 10.0
|
|
||||||
uname -r
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
*bsd|solaris)
|
*bsd|solaris)
|
||||||
uname -r
|
uname -r
|
||||||
|
@ -139,20 +98,7 @@ in
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
ubuntu)
|
ubuntu)
|
||||||
if command -v lsb_release >/dev/null 2>&1
|
lsb_release -sr
|
||||||
then
|
|
||||||
lsb_release -sr
|
|
||||||
elif test -r /usr/lib/os-release
|
|
||||||
then
|
|
||||||
# fallback to /usr/lib/os-release if lsb_release is not present (like
|
|
||||||
# on minimized Ubuntu installations)
|
|
||||||
rc_getvar /usr/lib/os-release VERSION_ID
|
|
||||||
elif test -r /etc/lsb-release
|
|
||||||
then
|
|
||||||
# extract DISTRIB_RELEASE= variable from /etc/lsb-release on old
|
|
||||||
# versions without /usr/lib/os-release.
|
|
||||||
rc_getvar /etc/lsb-release DISTRIB_RELEASE
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
alpine)
|
alpine)
|
||||||
cat /etc/alpine-release
|
cat /etc/alpine-release
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
# lsb_release may not be given in all installations
|
# lsb_release may not be given in all installations
|
||||||
codename_os_release() {
|
codename_os_release() {
|
||||||
# shellcheck disable=SC1090
|
# shellcheck disable=SC1090
|
||||||
# shellcheck disable=SC1091
|
|
||||||
. "$__global/explorer/os_release"
|
. "$__global/explorer/os_release"
|
||||||
printf "%s" "$VERSION_CODENAME"
|
printf "%s" "$VERSION_CODENAME"
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,4 +24,4 @@ else
|
||||||
name="$__object_id"
|
name="$__object_id"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
apt-mark showhold | grep -q "^${name}$" && echo hold || echo unhold
|
apt-mark showhold | grep -Fq "$name" && echo hold || echo unhold
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
cdist-type__apt_pin(7)
|
|
||||||
======================
|
|
||||||
|
|
||||||
NAME
|
|
||||||
----
|
|
||||||
cdist-type__apt_pin - Manage apt pinning rules
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
-----------
|
|
||||||
Adds/removes/edits rules to pin some packages to a specific distribution. Useful if using multiple debian repositories at the same time. (Useful, if one wants to use a few specific packages from backports or perhaps Debain testing... or even sid.)
|
|
||||||
|
|
||||||
|
|
||||||
REQUIRED PARAMETERS
|
|
||||||
-------------------
|
|
||||||
distribution
|
|
||||||
Specifies what distribution the package should be pinned to. Accepts both codenames (buster/bullseye/sid) and suite names (stable/testing/...).
|
|
||||||
|
|
||||||
|
|
||||||
OPTIONAL PARAMETERS
|
|
||||||
-------------------
|
|
||||||
package
|
|
||||||
Package name, glob or regular expression to match (multiple) packages. If not specified `__object_id` is used.
|
|
||||||
|
|
||||||
priority
|
|
||||||
The priority value to assign to matching packages. Defaults to 500. (To match the default target distro's priority)
|
|
||||||
|
|
||||||
state
|
|
||||||
Will be passed to underlying `__file` type; see there for valid values and defaults.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN PARAMETERS
|
|
||||||
------------------
|
|
||||||
None.
|
|
||||||
|
|
||||||
|
|
||||||
EXAMPLES
|
|
||||||
--------
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
# Add the bullseye repo to buster, but do not install any packages by default,
|
|
||||||
# only if explicitely asked for (-1 means "never" for apt)
|
|
||||||
__apt_pin bullseye-default \
|
|
||||||
--package "*" \
|
|
||||||
--distribution bullseye \
|
|
||||||
--priority -1
|
|
||||||
|
|
||||||
require="__apt_pin/bullseye-default" __apt_source bullseye \
|
|
||||||
--uri http://deb.debian.org/debian/ \
|
|
||||||
--distribution bullseye \
|
|
||||||
--component main
|
|
||||||
|
|
||||||
__apt_pin foo --package "foo foo-*" --distribution bullseye
|
|
||||||
|
|
||||||
__foo # Assuming, this installs the `foo` package internally
|
|
||||||
|
|
||||||
__package foo-plugin-extras # Assuming we also need some extra stuff
|
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
--------
|
|
||||||
:strong:`apt_preferences`\ (5)
|
|
||||||
:strong:`cdist-type__apt_source`\ (7)
|
|
||||||
:strong:`cdist-type__apt_backports`\ (7)
|
|
||||||
:strong:`cdist-type__file`\ (7)
|
|
||||||
|
|
||||||
AUTHORS
|
|
||||||
-------
|
|
||||||
Daniel Fancsali <fancsali@gmail.com>
|
|
||||||
|
|
||||||
|
|
||||||
COPYING
|
|
||||||
-------
|
|
||||||
Copyright \(C) 2021 Daniel Fancsali. 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.
|
|
|
@ -1,68 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
#
|
|
||||||
# 2021 Daniel Fancsali (fancsali@gmail.com)
|
|
||||||
#
|
|
||||||
# This file is part of cdist.
|
|
||||||
#
|
|
||||||
# cdist is free software: 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.
|
|
||||||
#
|
|
||||||
# cdist is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
name="$__object_id"
|
|
||||||
|
|
||||||
os=$(cat "$__global/explorer/os")
|
|
||||||
state="$(cat "$__object/parameter/state")"
|
|
||||||
|
|
||||||
if [ -f "$__object/parameter/package" ]; then
|
|
||||||
package="$(cat "$__object/parameter/package")"
|
|
||||||
else
|
|
||||||
package=$name
|
|
||||||
fi
|
|
||||||
|
|
||||||
distribution="$(cat "$__object/parameter/distribution")"
|
|
||||||
priority="$(cat "$__object/parameter/priority")"
|
|
||||||
|
|
||||||
|
|
||||||
case "$os" in
|
|
||||||
debian|ubuntu|devuan)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
printf "This type is specific to Debian and it's derivatives" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case $distribution in
|
|
||||||
stable|testing|unstable|experimental)
|
|
||||||
pin="release a=$distribution"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
pin="release n=$distribution"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
__file "/etc/apt/preferences.d/$name" \
|
|
||||||
--owner root --group root --mode 0644 \
|
|
||||||
--state "$state" \
|
|
||||||
--source - << EOF
|
|
||||||
# Created by cdist ${__type##*/}
|
|
||||||
# Do not change. Changes will be overwritten.
|
|
||||||
#
|
|
||||||
|
|
||||||
# $name
|
|
||||||
Package: $package
|
|
||||||
Pin: $pin
|
|
||||||
Pin-Priority: $priority
|
|
||||||
EOF
|
|
|
@ -1 +0,0 @@
|
||||||
500
|
|
|
@ -1 +0,0 @@
|
||||||
present
|
|
|
@ -1,3 +0,0 @@
|
||||||
state
|
|
||||||
package
|
|
||||||
priority
|
|
|
@ -1 +0,0 @@
|
||||||
distribution
|
|
55
cdist/conf/type/__apt_ppa/files/remove-apt-repository
Executable file
55
cdist/conf/type/__apt_ppa/files/remove-apt-repository
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/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)
|
|
@ -29,9 +29,9 @@ fi
|
||||||
|
|
||||||
case "$state_should" in
|
case "$state_should" in
|
||||||
present)
|
present)
|
||||||
echo "add-apt-repository -y '$name'"
|
echo "add-apt-repository '$name'"
|
||||||
;;
|
;;
|
||||||
absent)
|
absent)
|
||||||
echo "add-apt-repository -r -y '$name'"
|
echo "remove-apt-repository '$name'"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -20,4 +20,9 @@
|
||||||
|
|
||||||
__package software-properties-common
|
__package software-properties-common
|
||||||
|
|
||||||
|
require="__package/software-properties-common" \
|
||||||
|
__file /usr/local/bin/remove-apt-repository \
|
||||||
|
--source "$__type/files/remove-apt-repository" \
|
||||||
|
--mode 0755
|
||||||
|
|
||||||
require="$__object_name" __apt_update_index
|
require="$__object_name" __apt_update_index
|
||||||
|
|
|
@ -2,14 +2,13 @@
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
entry="$uri $distribution $component"
|
entry="$uri $distribution $component"
|
||||||
|
|
||||||
cat << DONE
|
cat << DONE
|
||||||
# Created by cdist ${__type##*/}
|
# Created by cdist ${__type##*/}
|
||||||
# Do not change. Changes will be overwritten.
|
# Do not change. Changes will be overwritten.
|
||||||
#
|
#
|
||||||
|
|
||||||
# $name
|
# $name
|
||||||
deb ${options} $entry
|
deb ${forcedarch} $entry
|
||||||
DONE
|
DONE
|
||||||
if [ -f "$__object/parameter/include-src" ]; then
|
if [ -f "$__object/parameter/include-src" ]; then
|
||||||
echo "deb-src $entry"
|
echo "deb-src $entry"
|
||||||
|
|
|
@ -22,21 +22,7 @@
|
||||||
name="$__object_id"
|
name="$__object_id"
|
||||||
destination="/etc/apt/sources.list.d/${name}.list"
|
destination="/etc/apt/sources.list.d/${name}.list"
|
||||||
|
|
||||||
# There are special arguments to apt(8) to prevent aborts if apt woudn't been
|
|
||||||
# updated after the 19th April 2021 till the bullseye release. The additional
|
|
||||||
# arguments acknoledge the happend suite change (the apt(8) update does the
|
|
||||||
# same by itself).
|
|
||||||
#
|
|
||||||
# Using '-o $config' instead of the --allow-releaseinfo-change-* parameter
|
|
||||||
# allows backward compatablility to pre-buster Debian versions.
|
|
||||||
#
|
|
||||||
# See more: ticket #861
|
|
||||||
# https://code.ungleich.ch/ungleich-public/cdist/-/issues/861
|
|
||||||
apt_opts="-o Acquire::AllowReleaseInfoChange::Suite=true -o Acquire::AllowReleaseInfoChange::Version=true"
|
|
||||||
|
|
||||||
# run 'apt-get update' only if something changed with our sources.list file
|
|
||||||
# it will be run a second time on error as a redundancy messure to success
|
|
||||||
if grep -q "^__file${destination}" "$__messages_in"; then
|
if grep -q "^__file${destination}" "$__messages_in"; then
|
||||||
printf 'apt-get %s update || apt-get %s update\n' "$apt_opts" "$apt_opts"
|
printf 'apt-get update || apt-get update\n'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,6 @@ OPTIONAL PARAMETERS
|
||||||
arch
|
arch
|
||||||
set this if you need to force and specific arch (ubuntu specific)
|
set this if you need to force and specific arch (ubuntu specific)
|
||||||
|
|
||||||
signed-by
|
|
||||||
provide a GPG key fingerprint or keyring path for signature checks
|
|
||||||
|
|
||||||
state
|
state
|
||||||
'present' or 'absent', defaults to 'present'
|
'present' or 'absent', defaults to 'present'
|
||||||
|
|
||||||
|
@ -59,11 +56,6 @@ EXAMPLES
|
||||||
--uri http://archive.canonical.com/ \
|
--uri http://archive.canonical.com/ \
|
||||||
--component partner --state present
|
--component partner --state present
|
||||||
|
|
||||||
__apt_source goaccess \
|
|
||||||
--uri http://deb.goaccess.io/ \
|
|
||||||
--component main \
|
|
||||||
--signed-by C03B48887D5E56B046715D3297BD1A0133449C3D
|
|
||||||
|
|
||||||
|
|
||||||
AUTHORS
|
AUTHORS
|
||||||
-------
|
-------
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
name="$__object_id"
|
name="$__object_id"
|
||||||
state="$(cat "$__object/parameter/state")"
|
state="$(cat "$__object/parameter/state")"
|
||||||
uri="$(cat "$__object/parameter/uri")"
|
uri="$(cat "$__object/parameter/uri")"
|
||||||
options=""
|
|
||||||
|
|
||||||
if [ -f "$__object/parameter/distribution" ]; then
|
if [ -f "$__object/parameter/distribution" ]; then
|
||||||
distribution="$(cat "$__object/parameter/distribution")"
|
distribution="$(cat "$__object/parameter/distribution")"
|
||||||
|
@ -32,15 +31,9 @@ fi
|
||||||
component="$(cat "$__object/parameter/component")"
|
component="$(cat "$__object/parameter/component")"
|
||||||
|
|
||||||
if [ -f "$__object/parameter/arch" ]; then
|
if [ -f "$__object/parameter/arch" ]; then
|
||||||
options="arch=$(cat "$__object/parameter/arch")"
|
forcedarch="[arch=$(cat "$__object/parameter/arch")]"
|
||||||
fi
|
else
|
||||||
|
forcedarch=""
|
||||||
if [ -f "$__object/parameter/signed-by" ]; then
|
|
||||||
options="$options signed-by=$(cat "$__object/parameter/signed-by")"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$options" ]; then
|
|
||||||
options="[$options]"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# export variables for use in template
|
# export variables for use in template
|
||||||
|
@ -48,7 +41,7 @@ export name
|
||||||
export uri
|
export uri
|
||||||
export distribution
|
export distribution
|
||||||
export component
|
export component
|
||||||
export options
|
export forcedarch
|
||||||
|
|
||||||
# generate file from template
|
# generate file from template
|
||||||
mkdir "$__object/files"
|
mkdir "$__object/files"
|
||||||
|
|
|
@ -2,4 +2,3 @@ state
|
||||||
distribution
|
distribution
|
||||||
component
|
component
|
||||||
arch
|
arch
|
||||||
signed-by
|
|
||||||
|
|
|
@ -18,23 +18,9 @@
|
||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
# There are special arguments to apt(8) to prevent aborts if apt woudn't been
|
|
||||||
# updated after the 19th April 2021 till the bullseye release. The additional
|
|
||||||
# arguments acknoledge the happend suite change (the apt(8) update does the
|
|
||||||
# same by itself).
|
|
||||||
#
|
|
||||||
# Using '-o $config' instead of the --allow-releaseinfo-change-* parameter
|
|
||||||
# allows backward compatablility to pre-buster Debian versions.
|
|
||||||
#
|
|
||||||
# See more: ticket #861
|
|
||||||
# https://code.ungleich.ch/ungleich-public/cdist/-/issues/861
|
|
||||||
apt_opts="-o Acquire::AllowReleaseInfoChange::Suite=true -o Acquire::AllowReleaseInfoChange::Version=true"
|
|
||||||
|
|
||||||
# run 'apt-get update' if anything in /etc/apt is newer then /var/lib/apt/lists
|
# run 'apt-get update' if anything in /etc/apt is newer then /var/lib/apt/lists
|
||||||
# it will be run a second time on error as a redundancy messure to success
|
|
||||||
cat << DONE
|
cat << DONE
|
||||||
if find /etc/apt -mindepth 1 -cnewer /var/lib/apt/lists | grep . > /dev/null; then
|
if find /etc/apt -mindepth 1 -cnewer /var/lib/apt/lists | grep . > /dev/null; then
|
||||||
apt-get $apt_opts update || apt-get $apt_opts update
|
apt-get update || apt-get update
|
||||||
fi
|
fi
|
||||||
DONE
|
DONE
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
'file' has been deprecated in favour of 'line' in order to provide idempotency.
|
|
|
@ -37,12 +37,6 @@ state
|
||||||
source
|
source
|
||||||
forwarded to :strong:`__file` type
|
forwarded to :strong:`__file` type
|
||||||
|
|
||||||
file
|
|
||||||
forwarded to :strong:`__file` type
|
|
||||||
This can be used if multiple users need to have a dotfile updated,
|
|
||||||
which will result in duplicate object id errors. When using the
|
|
||||||
file parameter the object id can be some unique value.
|
|
||||||
|
|
||||||
MESSAGES
|
MESSAGES
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@ -67,15 +61,6 @@ EXAMPLES
|
||||||
# Install default xmonad config for user 'eve'. Parent directory is created automatically.
|
# Install default xmonad config for user 'eve'. Parent directory is created automatically.
|
||||||
__dot_file .xmonad/xmonad.hs --user eve --state exists --source "$__files/xmonad.hs"
|
__dot_file .xmonad/xmonad.hs --user eve --state exists --source "$__files/xmonad.hs"
|
||||||
|
|
||||||
# install .vimrc for root and some users
|
|
||||||
for user in root userx usery userz; do
|
|
||||||
__dot_file "${user}_dot_vimrc" \
|
|
||||||
--user $user \
|
|
||||||
--file .vimrc \
|
|
||||||
--state exists \
|
|
||||||
--source "$__files/$user/.vimrc"
|
|
||||||
done
|
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|
|
@ -20,19 +20,13 @@ user="$(cat "${__object}/parameter/user")"
|
||||||
home="$(cat "${__object}/explorer/home")"
|
home="$(cat "${__object}/explorer/home")"
|
||||||
primary_group="$(cat "${__object}/explorer/primary_group")"
|
primary_group="$(cat "${__object}/explorer/primary_group")"
|
||||||
dirmode="$(cat "${__object}/parameter/dirmode")"
|
dirmode="$(cat "${__object}/parameter/dirmode")"
|
||||||
if [ -f "${__object}/parameter/file" ]; then
|
|
||||||
file="$(cat "${__object}/parameter/file")"
|
|
||||||
else
|
|
||||||
file="${__object_id}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Create parent directory. Type __directory has flag 'parents', but it
|
# Create parent directory. Type __directory has flag 'parents', but it
|
||||||
# will leave us with root-owned directory in user home, which is not
|
# will leave us with root-owned directory in user home, which is not
|
||||||
# acceptable. So we create parent directories one-by-one. XXX: maybe
|
# acceptable. So we create parent directories one-by-one. XXX: maybe
|
||||||
# it should be fixed in '__directory'?
|
# it should be fixed in '__directory'?
|
||||||
set --
|
set --
|
||||||
subpath=${file}
|
subpath=${__object_id}
|
||||||
while subpath="$(dirname "${subpath}")" ; do
|
while subpath="$(dirname "${subpath}")" ; do
|
||||||
[ "${subpath}" = . ] && break
|
[ "${subpath}" = . ] && break
|
||||||
set -- "${subpath}" "$@"
|
set -- "${subpath}" "$@"
|
||||||
|
@ -70,4 +64,4 @@ if [ "${source}" = "-" ] ; then
|
||||||
fi
|
fi
|
||||||
unset source
|
unset source
|
||||||
|
|
||||||
__file "${home}/${file}" --owner "$user" --group "$primary_group" "$@"
|
__file "${home}/${__object_id}" --owner "$user" --group "$primary_group" "$@"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
#
|
#
|
||||||
# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
|
# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
# 2013-2022 Steven Armstrong (steven-cdist armstrong.cc)
|
# 2013 Steven Armstrong (steven-cdist armstrong.cc)
|
||||||
#
|
#
|
||||||
# This file is part of cdist.
|
# This file is part of cdist.
|
||||||
#
|
#
|
||||||
|
@ -72,7 +72,6 @@ if [ "$state_should" = "present" ] || [ "$state_should" = "exists" ]; then
|
||||||
if [ "$type" != "file" ]; then
|
if [ "$type" != "file" ]; then
|
||||||
# destination is not a regular file, upload source to replace it
|
# destination is not a regular file, upload source to replace it
|
||||||
upload_file=1
|
upload_file=1
|
||||||
echo upload >> "$__messages_out"
|
|
||||||
else
|
else
|
||||||
local_cksum="$(cksum < "$source")"
|
local_cksum="$(cksum < "$source")"
|
||||||
remote_cksum="$(cat "$__object/explorer/cksum")"
|
remote_cksum="$(cat "$__object/explorer/cksum")"
|
||||||
|
@ -89,39 +88,27 @@ if [ "$state_should" = "present" ] || [ "$state_should" = "exists" ]; then
|
||||||
mkdir "$__object/files"
|
mkdir "$__object/files"
|
||||||
touch "$__object/files/set-attributes"
|
touch "$__object/files/set-attributes"
|
||||||
|
|
||||||
if [ "$create_file" ]; then
|
|
||||||
# When creating an empty file we create it locally and then
|
|
||||||
# upload it so that permissions can be set before moving the file
|
|
||||||
# into place.
|
|
||||||
source="$__object/files/empty"
|
|
||||||
touch "$source"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# upload file to temp location
|
# upload file to temp location
|
||||||
upload_destination="${destination}.cdist.${__cdist_object_marker}.$$"
|
tempfile_template="${destination}.cdist.XXXXXXXXXX"
|
||||||
# Yes, we are aware that this is a race condition.
|
|
||||||
# However:
|
|
||||||
# a) cdist usually writes to directories that are not user writable
|
|
||||||
# (probably > 99.9%)
|
|
||||||
# b) if they are user owned, the user / attacker always wins
|
|
||||||
# (probably < 0.1%)
|
|
||||||
# c) the only case which we could improve are tmp directories and we
|
|
||||||
# don't think managing tmp directories with cdist is a typical case
|
|
||||||
# ("the rest %)"
|
|
||||||
|
|
||||||
# Tell gencode-remote to where we uploaded the file so it can move
|
|
||||||
# it to its final destination.
|
|
||||||
echo "$upload_destination" > "$__object/files/upload-destination"
|
|
||||||
|
|
||||||
# IPv6 fix
|
|
||||||
if echo "${__target_host}" | grep -q -E '^[0-9a-fA-F:]+$'
|
|
||||||
then
|
|
||||||
my_target_host="[${__target_host}]"
|
|
||||||
else
|
|
||||||
my_target_host="${__target_host}"
|
|
||||||
fi
|
|
||||||
cat << DONE
|
cat << DONE
|
||||||
$__remote_copy "$source" "${my_target_host}:${upload_destination}"
|
destination_upload="\$($__remote_exec $__target_host "mktemp $tempfile_template")"
|
||||||
|
DONE
|
||||||
|
if [ "$upload_file" ]; then
|
||||||
|
echo upload >> "$__messages_out"
|
||||||
|
# IPv6 fix
|
||||||
|
if echo "${__target_host}" | grep -q -E '^[0-9a-fA-F:]+$'
|
||||||
|
then
|
||||||
|
my_target_host="[${__target_host}]"
|
||||||
|
else
|
||||||
|
my_target_host="${__target_host}"
|
||||||
|
fi
|
||||||
|
cat << DONE
|
||||||
|
$__remote_copy "$source" "${my_target_host}:\$destination_upload"
|
||||||
|
DONE
|
||||||
|
fi
|
||||||
|
# move uploaded file into place
|
||||||
|
cat << DONE
|
||||||
|
$__remote_exec $__target_host "rm -rf \"$destination\"; mv \"\$destination_upload\" \"$destination\""
|
||||||
DONE
|
DONE
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
#
|
#
|
||||||
# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org)
|
# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
# 2013-2022 Steven Armstrong (steven-cdist armstrong.cc)
|
# 2013 Steven Armstrong (steven-cdist armstrong.cc)
|
||||||
#
|
#
|
||||||
# This file is part of cdist.
|
# This file is part of cdist.
|
||||||
#
|
#
|
||||||
|
@ -62,13 +62,6 @@ set_mode() {
|
||||||
|
|
||||||
case "$state_should" in
|
case "$state_should" in
|
||||||
present|exists)
|
present|exists)
|
||||||
if [ -f "$__object/files/upload-destination" ]; then
|
|
||||||
final_destination="$destination"
|
|
||||||
# We change the 'global' $destination variable here so we can
|
|
||||||
# change attributes of the new/uploaded file before moving it
|
|
||||||
# to it's final destination.
|
|
||||||
destination="$(cat "$__object/files/upload-destination")"
|
|
||||||
fi
|
|
||||||
# Note: Mode - needs to happen last as a chown/chgrp can alter mode by
|
# Note: Mode - needs to happen last as a chown/chgrp can alter mode by
|
||||||
# clearing S_ISUID and S_ISGID bits (see chown(2))
|
# clearing S_ISUID and S_ISGID bits (see chown(2))
|
||||||
for attribute in group owner mode; do
|
for attribute in group owner mode; do
|
||||||
|
@ -88,11 +81,6 @@ case "$state_should" in
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if [ -f "$__object/files/upload-destination" ]; then
|
|
||||||
# move uploaded file into place
|
|
||||||
printf 'rm -rf "%s"\n' "$final_destination"
|
|
||||||
printf 'mv "%s" "%s"\n' "$destination" "$final_destination"
|
|
||||||
fi
|
|
||||||
if [ -f "$__object/files/set-attributes" ]; then
|
if [ -f "$__object/files/set-attributes" ]; then
|
||||||
# set-attributes is created if file is created or uploaded in gencode-local
|
# set-attributes is created if file is created or uploaded in gencode-local
|
||||||
fire_onchange=1
|
fire_onchange=1
|
||||||
|
|
|
@ -27,7 +27,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$os" in
|
case "$os" in
|
||||||
alpine|centos|fedora|gentoo|redhat|suse|ubuntu)
|
alpine|centos|fedora|redhat|suse|gentoo)
|
||||||
if [ ! -x "$(command -v lsblk)" ]; then
|
if [ ! -x "$(command -v lsblk)" ]; then
|
||||||
echo "lsblk is required for __filesystem type" >&2
|
echo "lsblk is required for __filesystem type" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -15,7 +15,7 @@ case $os in
|
||||||
# Differntation not needed anymore
|
# Differntation not needed anymore
|
||||||
apt_source_distribution=stable
|
apt_source_distribution=stable
|
||||||
;;
|
;;
|
||||||
10*|11*)
|
10*)
|
||||||
# Differntation not needed anymore
|
# Differntation not needed anymore
|
||||||
apt_source_distribution=stable
|
apt_source_distribution=stable
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
frontend http
|
|
||||||
bind BIND@:80
|
|
||||||
mode http
|
|
||||||
option httplog
|
|
||||||
default_backend http
|
|
||||||
|
|
||||||
backend http
|
|
||||||
mode http
|
|
|
@ -1,10 +0,0 @@
|
||||||
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
|
|
|
@ -1,12 +0,0 @@
|
||||||
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
|
|
|
@ -1,12 +0,0 @@
|
||||||
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
|
|
|
@ -1,121 +0,0 @@
|
||||||
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.
|
|
|
@ -1,155 +0,0 @@
|
||||||
#!/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"
|
|
|
@ -1 +0,0 @@
|
||||||
http https imaps smtps
|
|
|
@ -1,3 +0,0 @@
|
||||||
protocol
|
|
||||||
v4proxy
|
|
||||||
v6proxy
|
|
|
@ -41,7 +41,7 @@ if [ -z "${certbot_fullpath}" ]; then
|
||||||
require="__apt_source/stretch-backports" __package_apt certbot \
|
require="__apt_source/stretch-backports" __package_apt certbot \
|
||||||
--target-release stretch-backports
|
--target-release stretch-backports
|
||||||
;;
|
;;
|
||||||
10*|11*)
|
10*)
|
||||||
__package_apt certbot
|
__package_apt certbot
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ if [ -z "${certbot_fullpath}" ]; then
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
freebsd)
|
freebsd)
|
||||||
__package py39-certbot
|
__package py37-certbot
|
||||||
certbot_fullpath="/usr/local/bin/certbot"
|
certbot_fullpath="/usr/local/bin/certbot"
|
||||||
;;
|
;;
|
||||||
ubuntu)
|
ubuntu)
|
||||||
|
|
|
@ -81,24 +81,12 @@ aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes -o Dpkg::Options::=
|
||||||
|
|
||||||
case "$state_should" in
|
case "$state_should" in
|
||||||
present)
|
present)
|
||||||
# There are special arguments to apt(8) to prevent aborts if apt woudn't been
|
|
||||||
# updated after the 19th April 2021 till the bullseye release. The additional
|
|
||||||
# arguments acknoledge the happend suite change (the apt(8) update does the
|
|
||||||
# same by itself).
|
|
||||||
#
|
|
||||||
# Using '-o $config' instead of the --allow-releaseinfo-change-* parameter
|
|
||||||
# allows backward compatablility to pre-buster Debian versions.
|
|
||||||
#
|
|
||||||
# See more: ticket #861
|
|
||||||
# https://code.ungleich.ch/ungleich-public/cdist/-/issues/861
|
|
||||||
apt_opts="-o Acquire::AllowReleaseInfoChange::Suite=true -o Acquire::AllowReleaseInfoChange::Version=true"
|
|
||||||
|
|
||||||
# following is bit ugly, but important hack.
|
# following is bit ugly, but important hack.
|
||||||
# due to how cdist config run works, there isn't
|
# due to how cdist config run works, there isn't
|
||||||
# currently better way to do it :(
|
# currently better way to do it :(
|
||||||
cat << EOF
|
cat << EOF
|
||||||
if [ ! -f /var/cache/apt/pkgcache.bin ] || [ "\$( stat --format %Y /var/cache/apt/pkgcache.bin )" -lt "\$( date +%s -d '-1 day' )" ]
|
if [ ! -f /var/cache/apt/pkgcache.bin ] || [ "\$( stat --format %Y /var/cache/apt/pkgcache.bin )" -lt "\$( date +%s -d '-1 day' )" ]
|
||||||
then echo apt-get $apt_opts update > /dev/null 2>&1 || true
|
then echo apt-get update > /dev/null 2>&1 || true
|
||||||
fi
|
fi
|
||||||
EOF
|
EOF
|
||||||
if [ -n "$version" ]; then
|
if [ -n "$version" ]; then
|
||||||
|
|
|
@ -19,5 +19,5 @@
|
||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
__package luarocks --state present
|
__package luarocks --state installed
|
||||||
__package make --state present
|
__package make --state installed
|
||||||
|
|
|
@ -37,7 +37,6 @@ assert () # If condition false,
|
||||||
then
|
then
|
||||||
echo "Assertion failed: \"$1\""
|
echo "Assertion failed: \"$1\""
|
||||||
# shellcheck disable=SC2039
|
# shellcheck disable=SC2039
|
||||||
# shellcheck disable=SC3044
|
|
||||||
echo "File \"$0\", line $lineno, called by $(caller 0)"
|
echo "File \"$0\", line $lineno, called by $(caller 0)"
|
||||||
exit $E_ASSERT_FAILED
|
exit $E_ASSERT_FAILED
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -41,19 +41,7 @@ fi
|
||||||
case "$type" in
|
case "$type" in
|
||||||
yum) ;;
|
yum) ;;
|
||||||
apt)
|
apt)
|
||||||
# There are special arguments to apt(8) to prevent aborts if apt woudn't been
|
echo "apt-get --quiet update"
|
||||||
# updated after the 19th April 2021 till the bullseye release. The additional
|
|
||||||
# arguments acknoledge the happend suite change (the apt(8) update does the
|
|
||||||
# same by itself).
|
|
||||||
#
|
|
||||||
# Using '-o $config' instead of the --allow-releaseinfo-change-* parameter
|
|
||||||
# allows backward compatablility to pre-buster Debian versions.
|
|
||||||
#
|
|
||||||
# See more: ticket #861
|
|
||||||
# https://code.ungleich.ch/ungleich-public/cdist/-/issues/861
|
|
||||||
apt_opts="-o Acquire::AllowReleaseInfoChange::Suite=true -o Acquire::AllowReleaseInfoChange::Version=true"
|
|
||||||
|
|
||||||
echo "apt-get --quiet $apt_opts update"
|
|
||||||
echo "apt-cache updated (age was: $currage)" >> "$__messages_out"
|
echo "apt-cache updated (age was: $currage)" >> "$__messages_out"
|
||||||
;;
|
;;
|
||||||
pacman)
|
pacman)
|
||||||
|
|
|
@ -28,10 +28,6 @@ apt_clean="$__object/parameter/apt-clean"
|
||||||
|
|
||||||
apt_dist_upgrade="$__object/parameter/apt-dist-upgrade"
|
apt_dist_upgrade="$__object/parameter/apt-dist-upgrade"
|
||||||
|
|
||||||
if [ -f "$__object/parameter/apt-with-new-pkgs" ]; then
|
|
||||||
apt_with_new_pkgs="--with-new-pkgs"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "$type" ]; then
|
if [ -f "$type" ]; then
|
||||||
type="$(cat "$type")"
|
type="$(cat "$type")"
|
||||||
else
|
else
|
||||||
|
@ -58,7 +54,7 @@ case "$type" in
|
||||||
apt)
|
apt)
|
||||||
if [ -f "$apt_dist_upgrade" ]
|
if [ -f "$apt_dist_upgrade" ]
|
||||||
then echo "$aptget dist-upgrade"
|
then echo "$aptget dist-upgrade"
|
||||||
else echo "$aptget $apt_with_new_pkgs upgrade"
|
else echo "$aptget upgrade"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "$apt_clean" ]
|
if [ -f "$apt_clean" ]
|
||||||
|
|
|
@ -33,14 +33,6 @@ BOOLEAN PARAMETERS
|
||||||
apt-dist-upgrade
|
apt-dist-upgrade
|
||||||
Do dist-upgrade instead of upgrade.
|
Do dist-upgrade instead of upgrade.
|
||||||
|
|
||||||
apt-with-new-pkg
|
|
||||||
Allow installing new packages when used in conjunction with
|
|
||||||
upgrade. This is useful if the update of an installed package
|
|
||||||
requires new dependencies to be installed. Instead of holding the
|
|
||||||
package back upgrade will upgrade the package and install the new
|
|
||||||
dependencies. Note that upgrade with this option will never remove
|
|
||||||
packages, only allow adding new ones.
|
|
||||||
|
|
||||||
apt-clean
|
apt-clean
|
||||||
Clean out the local repository of retrieved package files.
|
Clean out the local repository of retrieved package files.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
apt-clean
|
apt-clean
|
||||||
apt-dist-upgrade
|
apt-dist-upgrade
|
||||||
apt-with-new-pkgs
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
|
|
||||||
if [ -f "$__object/parameter/file" ]
|
|
||||||
then
|
|
||||||
file="$( cat "$__object/parameter/file" )"
|
|
||||||
else
|
|
||||||
file="/$__object_id"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -e "$file" ]
|
|
||||||
then
|
|
||||||
echo "$file does not exist" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat "$file"
|
|
|
@ -1,58 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
|
|
||||||
if [ -f "$__object/parameter/file" ]
|
|
||||||
then
|
|
||||||
file="$( cat "$__object/parameter/file" )"
|
|
||||||
else
|
|
||||||
file="/$__object_id"
|
|
||||||
fi
|
|
||||||
|
|
||||||
script="$( cat "$__object/parameter/script" )"
|
|
||||||
|
|
||||||
if [ "$script" = '-' ]
|
|
||||||
then
|
|
||||||
script="$( cat "$__object/stdin" )"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# since stdin is not available in explorer, we pull file from target with explorer
|
|
||||||
|
|
||||||
file_from_target="$__object/explorer/file"
|
|
||||||
|
|
||||||
sed_cmd='sed'
|
|
||||||
|
|
||||||
if [ -f "$__object/parameter/regexp-extended" ]
|
|
||||||
then
|
|
||||||
sed_cmd="$sed_cmd -E"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# do sed dry run, diff result and if no change, then there's nothing to do
|
|
||||||
# also redirect diff's output to stderr for debugging purposes
|
|
||||||
|
|
||||||
if echo "$script" | "$sed_cmd" -f - "$file_from_target" | diff -u "$file_from_target" - >&2
|
|
||||||
then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# we can't use -i, because it's not posix, so we fly with tempfile and cp
|
|
||||||
# and we use cp because we want to preserve destination file's attributes
|
|
||||||
|
|
||||||
# shellcheck disable=SC2016
|
|
||||||
echo 'tmp="$__object/tempfile"'
|
|
||||||
|
|
||||||
echo "$sed_cmd -f - '$file' > \"\$tmp\" << EOF"
|
|
||||||
|
|
||||||
echo "$script"
|
|
||||||
|
|
||||||
echo 'EOF'
|
|
||||||
|
|
||||||
echo "cp \"\$tmp\" '$file'"
|
|
||||||
|
|
||||||
# shellcheck disable=SC2016
|
|
||||||
echo 'rm -f "$tmp"'
|
|
||||||
|
|
||||||
echo 'change' >> "$__messages_out"
|
|
||||||
|
|
||||||
if [ -f "$__object/parameter/onchange" ]
|
|
||||||
then
|
|
||||||
cat "$__object/parameter/onchange"
|
|
||||||
fi
|
|
|
@ -1,57 +0,0 @@
|
||||||
cdist-type__sed(7)
|
|
||||||
==================
|
|
||||||
|
|
||||||
NAME
|
|
||||||
----
|
|
||||||
cdist-type__sed - Transform text files with ``sed``
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
-----------
|
|
||||||
Transform text files with ``sed``.
|
|
||||||
|
|
||||||
|
|
||||||
REQUIRED MULTIPLE PARAMETERS
|
|
||||||
----------------------------
|
|
||||||
script
|
|
||||||
``sed`` script.
|
|
||||||
If ``-`` then the script is read from ``stdin``.
|
|
||||||
|
|
||||||
|
|
||||||
OPTIONAL PARAMETERS
|
|
||||||
-------------------
|
|
||||||
file
|
|
||||||
Path to the file. Defaults to ``$__object_id``.
|
|
||||||
|
|
||||||
onchange
|
|
||||||
Execute this command if ``sed`` changes file.
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN PARAMETERS
|
|
||||||
------------------
|
|
||||||
regexp-extended
|
|
||||||
Use extended regular expressions in the script.
|
|
||||||
Might not be supported with every ``sed`` version.
|
|
||||||
|
|
||||||
|
|
||||||
EXAMPLES
|
|
||||||
--------
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
__sed /tmp/foobar --script 's/foo/bar/'
|
|
||||||
|
|
||||||
echo 's/foo/bar/' | __sed foobar --file /tmp/foobar --script -
|
|
||||||
|
|
||||||
|
|
||||||
AUTHORS
|
|
||||||
-------
|
|
||||||
Ander Punnar <ander-at-kvlt-dot-ee>
|
|
||||||
|
|
||||||
|
|
||||||
COPYING
|
|
||||||
-------
|
|
||||||
Copyright \(C) 2021 Ander Punnar. 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.
|
|
|
@ -1 +0,0 @@
|
||||||
regexp-extended
|
|
|
@ -1,2 +0,0 @@
|
||||||
file
|
|
||||||
onchange
|
|
|
@ -1 +0,0 @@
|
||||||
script
|
|
|
@ -40,7 +40,6 @@ if [ -f "$file" ]; then
|
||||||
grep -v -F -x '$line' '$file' >\$tmpfile
|
grep -v -F -x '$line' '$file' >\$tmpfile
|
||||||
fi
|
fi
|
||||||
cat "\$tmpfile" >"$file"
|
cat "\$tmpfile" >"$file"
|
||||||
rm -f "\$tmpfile"
|
|
||||||
DONE
|
DONE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
# shellcheck disable=SC1090
|
# shellcheck disable=SC1090
|
||||||
# shellcheck disable=SC1091
|
|
||||||
file="$( . "$__type_explorer/file" )"
|
file="$( . "$__type_explorer/file" )"
|
||||||
|
|
||||||
if [ -f "$file" ]
|
if [ -f "$file" ]
|
||||||
|
|
|
@ -34,12 +34,3 @@ case "$os" in
|
||||||
echo "echo \"$timezone_should\" > /etc/timezone"
|
echo "echo \"$timezone_should\" > /etc/timezone"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$os" in
|
|
||||||
openwrt)
|
|
||||||
cat <<EOF
|
|
||||||
uci set system.@system[0].timezone="$timezone_should"
|
|
||||||
uci commit
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
|
@ -53,10 +53,7 @@ case "$os" in
|
||||||
--file /etc/sysconfig/clock \
|
--file /etc/sysconfig/clock \
|
||||||
--delimiter '=' \
|
--delimiter '=' \
|
||||||
--value "\"$timezone\""
|
--value "\"$timezone\""
|
||||||
;;
|
;;
|
||||||
openwrt)
|
|
||||||
: # Uses gencode-remote
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2
|
echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2
|
||||||
echo "Please contribute an implementation for it if you can." >&2
|
echo "Please contribute an implementation for it if you can." >&2
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
LC_ALL=C update-alternatives --display "${__object_id:?}" 2>/dev/null \
|
update-alternatives --display "$__object_id" 2>/dev/null \
|
||||||
| awk -F ' - ' '/priority [0-9]+$/ { print $1 }'
|
| awk -F ' - ' '/priority [0-9]+$/ { print $1 }'
|
||||||
|
|
|
@ -18,12 +18,12 @@ for altdir in \
|
||||||
/var/lib/dpkg/alternatives \
|
/var/lib/dpkg/alternatives \
|
||||||
/var/lib/alternatives
|
/var/lib/alternatives
|
||||||
do
|
do
|
||||||
if [ ! -f "$altdir/${__object_id:?}" ]
|
if [ ! -f "$altdir/$__object_id" ]
|
||||||
then
|
then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
link="$( awk 'NR==2' "$altdir/${__object_id:?}" )"
|
link="$( awk 'NR==2' "$altdir/$__object_id" )"
|
||||||
|
|
||||||
if [ -n "$link" ]
|
if [ -n "$link" ]
|
||||||
then
|
then
|
||||||
|
@ -31,12 +31,9 @@ do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ -z "$link" ] && [ -z "${__cdist_dry_run+dry run}" ]
|
if [ -z "$link" ]
|
||||||
then
|
then
|
||||||
# NOTE: ignore error for dry-runs because a package providing the link
|
echo "unable to get link for $__object_id" >&2
|
||||||
# might be managed by another cdist object (which wasn't executed,
|
|
||||||
# because dry run…).
|
|
||||||
echo "unable to get link for ${__object_id:?}" >&2
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
path_is=$(
|
path_is="$( update-alternatives --display "$__object_id" 2>/dev/null \
|
||||||
LC_ALL=C update-alternatives --display "${__object_id?}" 2>/dev/null \
|
| awk '/link currently points to/ {print $5}' )"
|
||||||
| awk '/link currently points to/ { print $5 }')
|
|
||||||
|
|
||||||
if [ -z "$path_is" ] && [ -z "${__cdist_dry_run+dry run}" ]
|
if [ -z "$path_is" ]
|
||||||
then
|
then
|
||||||
# NOTE: ignore error for dry-runs because a package providing the
|
echo "unable to get current path for $__object_id" >&2
|
||||||
# alternative might be managed by another cdist object (which
|
|
||||||
# wasn't executed, because dry run…).
|
|
||||||
echo "unable to get current path for ${__object_id:?}" >&2
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
if [ -f "$( cat "${__object:?}/parameter/path" )" ]
|
if [ -f "$( cat "$__object/parameter/path" )" ]
|
||||||
then
|
then
|
||||||
echo 'present'
|
echo 'present'
|
||||||
else
|
else
|
||||||
|
|
|
@ -18,39 +18,37 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
path_is="$( cat "${__object:?}/explorer/path_is" )"
|
path_is="$( cat "$__object/explorer/path_is" )"
|
||||||
|
|
||||||
path_should="$( cat "${__object:?}/parameter/path" )"
|
path_should="$( cat "$__object/parameter/path" )"
|
||||||
|
|
||||||
if [ "$path_is" = "$path_should" ]
|
if [ "$path_is" = "$path_should" ]
|
||||||
then
|
then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$( cat "${__object:?}/explorer/path_should_state" )" = 'absent' ] \
|
if [ "$( cat "$__object/explorer/path_should_state" )" = 'absent' ] && [ -z "$__cdist_dry_run" ]
|
||||||
&& [ -z "${__cdist_dry_run+dry run}" ]
|
|
||||||
then
|
then
|
||||||
echo "$path_should does not exist in target" >&2
|
echo "$path_should does not exist in target" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
name=${__object_id:?}
|
name="$__object_id"
|
||||||
|
|
||||||
if ! grep -Fxq "$path_should" "${__object:?}/explorer/alternatives"
|
alternatives="$( cat "$__object/explorer/alternatives" )"
|
||||||
|
|
||||||
|
if ! echo "$alternatives" | grep -Fxq "$path_should"
|
||||||
then
|
then
|
||||||
if [ -f "${__object:?}/parameter/install" ]
|
if [ ! -f "$__object/parameter/install" ]
|
||||||
then
|
then
|
||||||
link="$( cat "${__object:?}/explorer/link" )"
|
|
||||||
echo "update-alternatives --install '$link' '$name' '$path_should' 1000"
|
|
||||||
elif [ -z "${__cdist_dry_run+dry run}" ]
|
|
||||||
then
|
|
||||||
# NOTE: ignore error for dry-runs because a package providing the link
|
|
||||||
# to be installed might be managed by another cdist object (which
|
|
||||||
# wasn't executed, because dry run…).
|
|
||||||
echo "$path_should is not in $name alternatives." >&2
|
echo "$path_should is not in $name alternatives." >&2
|
||||||
echo 'Please install missing packages or use --install to add path to alternatives.' >&2
|
echo 'Please install missing packages or use --install to add path to alternatives.' >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
link="$( cat "$__object/explorer/link" )"
|
||||||
|
|
||||||
|
echo "update-alternatives --install '$link' '$name' '$path_should' 1000"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "update-alternatives --set '$name' '$path_should'"
|
echo "update-alternatives --set '$name' '$path_should'"
|
||||||
|
|
|
@ -20,4 +20,4 @@
|
||||||
|
|
||||||
user="$(cat "$__object/parameter/user" 2>/dev/null || echo "$__object_id")"
|
user="$(cat "$__object/parameter/user" 2>/dev/null || echo "$__object_id")"
|
||||||
|
|
||||||
(id -G -n "$user" | tr ' ' '\n') 2>/dev/null || true
|
(id -G -n "$user" | tr ' ' '\n' | sort) 2>/dev/null || true
|
||||||
|
|
|
@ -26,15 +26,13 @@ os=$(cat "$__global/explorer/os")
|
||||||
mkdir "$__object/files"
|
mkdir "$__object/files"
|
||||||
# file has to be sorted for comparison with `comm`
|
# file has to be sorted for comparison with `comm`
|
||||||
sort "$__object/parameter/group" > "$__object/files/group.sorted"
|
sort "$__object/parameter/group" > "$__object/files/group.sorted"
|
||||||
# Use local sort for remote groups
|
|
||||||
sort "$__object/explorer/group" > "$__object/files/group-remote.sorted"
|
|
||||||
|
|
||||||
case "$state_should" in
|
case "$state_should" in
|
||||||
present)
|
present)
|
||||||
changed_groups="$(comm -13 "$__object/files/group-remote.sorted" "$__object/files/group.sorted")"
|
changed_groups="$(comm -13 "$__object/explorer/group" "$__object/files/group.sorted")"
|
||||||
;;
|
;;
|
||||||
absent)
|
absent)
|
||||||
changed_groups="$(comm -12 "$__object/files/group-remote.sorted" "$__object/files/group.sorted")"
|
changed_groups="$(comm -12 "$__object/explorer/group" "$__object/files/group.sorted")"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ def _process_hosts_simple(action, host, manifest, verbose,
|
||||||
"""
|
"""
|
||||||
if isinstance(host, str):
|
if isinstance(host, str):
|
||||||
hosts = [host, ]
|
hosts = [host, ]
|
||||||
elif isinstance(host, collections.abc.Iterable):
|
elif isinstance(host, collections.Iterable):
|
||||||
hosts = host
|
hosts = host
|
||||||
else:
|
else:
|
||||||
raise cdist.Error('Invalid host argument: {}'.format(host))
|
raise cdist.Error('Invalid host argument: {}'.format(host))
|
||||||
|
|
14
cdist/log.py
14
cdist/log.py
|
@ -36,27 +36,25 @@ import threading
|
||||||
logging.OFF = logging.CRITICAL + 10 # disable logging
|
logging.OFF = logging.CRITICAL + 10 # disable logging
|
||||||
logging.addLevelName(logging.OFF, 'OFF')
|
logging.addLevelName(logging.OFF, 'OFF')
|
||||||
|
|
||||||
|
|
||||||
logging.VERBOSE = logging.INFO - 5
|
logging.VERBOSE = logging.INFO - 5
|
||||||
logging.addLevelName(logging.VERBOSE, 'VERBOSE')
|
logging.addLevelName(logging.VERBOSE, 'VERBOSE')
|
||||||
|
|
||||||
|
|
||||||
def _verbose(self, msg, *args, **kwargs):
|
def _verbose(msg, *args, **kwargs):
|
||||||
self.log(logging.VERBOSE, msg, args, **kwargs)
|
logging.log(logging.VERBOSE, msg, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
logging.Logger.verbose = _verbose
|
logging.verbose = _verbose
|
||||||
|
|
||||||
|
|
||||||
logging.TRACE = logging.DEBUG - 5
|
logging.TRACE = logging.DEBUG - 5
|
||||||
logging.addLevelName(logging.TRACE, 'TRACE')
|
logging.addLevelName(logging.TRACE, 'TRACE')
|
||||||
|
|
||||||
|
|
||||||
def _trace(self, msg, *args, **kwargs):
|
def _trace(msg, *args, **kwargs):
|
||||||
self.log(logging.TRACE, msg, *args, **kwargs)
|
logging.log(logging.TRACE, msg, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
logging.Logger.trace = _trace
|
logging.trace = _trace
|
||||||
|
|
||||||
|
|
||||||
class CdistFormatter(logging.Formatter):
|
class CdistFormatter(logging.Formatter):
|
||||||
|
|
|
@ -33,7 +33,7 @@ class AbsolutePathRequiredError(cdist.Error):
|
||||||
return 'Absolute path required, got: {}'.format(self.path)
|
return 'Absolute path required, got: {}'.format(self.path)
|
||||||
|
|
||||||
|
|
||||||
class FileList(collections.abc.MutableSequence):
|
class FileList(collections.MutableSequence):
|
||||||
"""A list that stores it's state in a file.
|
"""A list that stores it's state in a file.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -102,7 +102,7 @@ class FileList(collections.abc.MutableSequence):
|
||||||
self.__write(lines)
|
self.__write(lines)
|
||||||
|
|
||||||
|
|
||||||
class DirectoryDict(collections.abc.MutableMapping):
|
class DirectoryDict(collections.MutableMapping):
|
||||||
"""A dict that stores it's items as files in a directory.
|
"""A dict that stores it's items as files in a directory.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,49 +1,6 @@
|
||||||
Changelog
|
Changelog
|
||||||
---------
|
---------
|
||||||
|
|
||||||
next:
|
|
||||||
* Type __timezone: Add support for OpenWRT (Nico Schottelius)
|
|
||||||
|
|
||||||
7.0.1:
|
|
||||||
* Core: Remove double definition of scan parser (Nico Schottelius)
|
|
||||||
* Type __apt_mark: Narrow down grep for hold packages (marcoduif)
|
|
||||||
* Type __apt_source: Set required options variable (Mark Verboom)
|
|
||||||
* Type __letsencrypt_cert: Update python version (Michelle)
|
|
||||||
* Explorer os_version: Add support for Daedalus (Michelle)
|
|
||||||
* Explorer machine_type: Correct incorrect VMM matching (Mark Verboom)
|
|
||||||
|
|
||||||
7.0.0: 2022-07-31
|
|
||||||
* Explorer machine_type: Rewrite (Dennis Camera)
|
|
||||||
* New type: __sed (Ander Punnar)
|
|
||||||
* New type: __haproxy_dualstack (Evilham and ungleich)
|
|
||||||
* Type __apt_update_index: Fix complaint about suite change (Matthias Stecher)
|
|
||||||
* Type __package_update_index: Fix complaint about suite change (Matthias Stecher)
|
|
||||||
* Type __package_upgrade_all: Add new --apt-with-new-pkgs argument (Evilham)
|
|
||||||
* Type __apt_source: Fix complaint about suite change (Matthias Stecher)
|
|
||||||
* Type __package_apt: Fix complaint about suite change (Matthias Stecher)
|
|
||||||
* Type __debconf_set_selections: Fix bug where --file was unsupported (Evilham)
|
|
||||||
* Types __letsencrypt_cert, __grafana_dashboard: Improve bullseye support (Evilham)
|
|
||||||
* Type __ssh_authorized_key: Also remove tmpfile if removing line (Mark Verboom)
|
|
||||||
* Type __apt_pin: Add default priority, add comment in generated files (Daniel Fancsali)
|
|
||||||
* Type __file: make file uploading and attribute changes more atomic (Steven Armstrong)
|
|
||||||
* Type __dot_file: Add support for using --file parameter (Stephan Leemburg)
|
|
||||||
* Type __apt_ppa: Replace custom "remove-apt-repository" with add-apt-repository -r (Romain Dartigues)
|
|
||||||
* Type __apt_source: Add signed-by parameter (Daniel Fancsali)
|
|
||||||
* Explorer: add support for checkpoint (Stephan Leemburg)
|
|
||||||
|
|
||||||
6.9.8: 2021-08-24
|
|
||||||
* Type __rsync: Rewrite (Ander Punnar)
|
|
||||||
* New type: __apt_pin (Daniel Fancsali)
|
|
||||||
* Explorer os_version: Convert Devuan ceres to version number (Dennis Camera)
|
|
||||||
* Core: Fix logging bug (Dennis Camera)
|
|
||||||
* Build: Improve Makefile compatibility (Evilham)
|
|
||||||
* Type __filesystem: Support ubuntu (Joachim Desroches)
|
|
||||||
* Explorer os_version: Fall back to os-release/lsb-release file on Ubuntu (Dennis Camera)
|
|
||||||
* Explorer memory: Fix conversion of large numbers (>= 2GiB) (Dennis Camera)
|
|
||||||
* Type __update_alternatives: Fix dry run and non-English systems (Dennis Camera)
|
|
||||||
* Explorer os_version: Fix for FreeBSD < 10.0 and for legacy Mac OS X versions (Dennis Camera)
|
|
||||||
* Explorer os_version: Add bookworm and trixie debian code names, fallback to 99.99 for unknown code name in sid (Ander Punnar)
|
|
||||||
|
|
||||||
6.9.7: 2021-07-10
|
6.9.7: 2021-07-10
|
||||||
* New type: __postgres_conf (Beni Ruef, Dennis Camera)
|
* New type: __postgres_conf (Beni Ruef, Dennis Camera)
|
||||||
* Types __postgres_*: Improve OS support and do some cleanup (Dennis Camera)
|
* Types __postgres_*: Improve OS support and do some cleanup (Dennis Camera)
|
||||||
|
@ -185,7 +142,7 @@ next:
|
||||||
* Type __pf_ruleset: Refactor (Kamila Součková, Evil Ham)
|
* Type __pf_ruleset: Refactor (Kamila Součková, Evil Ham)
|
||||||
* Type __pf_apply: Deprecate type (Kamila Součková, Evil Ham)
|
* Type __pf_apply: Deprecate type (Kamila Součková, Evil Ham)
|
||||||
* Configuration: Add notes to cdist.cfg.skeleton (Evil Ham)
|
* Configuration: Add notes to cdist.cfg.skeleton (Evil Ham)
|
||||||
* Explorers cpu_cores, memory: Improve BSD support (Evil Ham)
|
* Explorers cpu_cores, memory: Improve *BSD support (Evil Ham)
|
||||||
* Core: Remove debug logging noise (Evil Ham)
|
* Core: Remove debug logging noise (Evil Ham)
|
||||||
|
|
||||||
6.5.4: 2020-04-11
|
6.5.4: 2020-04-11
|
||||||
|
@ -250,7 +207,7 @@ next:
|
||||||
* Documentation: PreOS english nitpicking (Evil Ham)
|
* Documentation: PreOS english nitpicking (Evil Ham)
|
||||||
* Documentation: Add installing from source with signature verification (Darko Poljak)
|
* Documentation: Add installing from source with signature verification (Darko Poljak)
|
||||||
* Core: preos: Support top command logging options, custom conf-dir option and CDIST_PATH env var (Darko Poljak)
|
* Core: preos: Support top command logging options, custom conf-dir option and CDIST_PATH env var (Darko Poljak)
|
||||||
* Type __start_on_boot: Docs: remove unsupported BSD claim (Evil Ham)
|
* Type __start_on_boot: Docs: remove unsupported *BSD claim (Evil Ham)
|
||||||
* New type: __openldap_server (Evil Ham)
|
* New type: __openldap_server (Evil Ham)
|
||||||
|
|
||||||
6.2.0: 2019-11-30
|
6.2.0: 2019-11-30
|
||||||
|
@ -1109,9 +1066,9 @@ next:
|
||||||
* Removed type __removeline (replaced by __line) (Nico Schottelius)
|
* Removed type __removeline (replaced by __line) (Nico Schottelius)
|
||||||
* Type __directory: Parameter --parents and --recursive are now boolean (Nico Schottelius)
|
* Type __directory: Parameter --parents and --recursive are now boolean (Nico Schottelius)
|
||||||
* Type __package_apt, __package_luarocks, __package_opkg,
|
* Type __package_apt, __package_luarocks, __package_opkg,
|
||||||
__package_pacman, __package_pkg_freebsd, __package_pkg_openbsd,
|
__package_pacman, __package_pkg_freebsd, __package_pkg_openbsd,
|
||||||
__package_rubygem, __package_yum, __process:
|
__package_rubygem, __package_yum, __process:
|
||||||
Parameter state accepts only "present" and "absent" (Nico Schottelius)
|
Parameter state accepts only "present" and "absent" (Nico Schottelius)
|
||||||
* Dist: Initial support for pypi packaging (Nico Schottelius)
|
* Dist: Initial support for pypi packaging (Nico Schottelius)
|
||||||
|
|
||||||
2.0.15: 2012-11-02
|
2.0.15: 2012-11-02
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
* 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"
|
|
|
@ -12,7 +12,7 @@ This is the machine from which you will configure target hosts.
|
||||||
* /bin/sh: A POSIX like shell (for instance bash, dash, zsh)
|
* /bin/sh: A POSIX like shell (for instance bash, dash, zsh)
|
||||||
* Python >= 3.5
|
* Python >= 3.5
|
||||||
* SSH client
|
* SSH client
|
||||||
* sphinx with the rtd theme (for building html docs and/or the man pages)
|
* sphinx (for building html docs and/or the man pages)
|
||||||
|
|
||||||
Target Hosts
|
Target Hosts
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
|
@ -56,7 +56,7 @@ master_doc = 'index'
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = 'cdist'
|
project = 'cdist'
|
||||||
copyright = 'ungleich GmbH 2021'
|
copyright = 'ungleich GmbH 2020'
|
||||||
# author = 'Darko Poljak'
|
# author = 'Darko Poljak'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
|
Loading…
Reference in a new issue