Compare commits
No commits in common. "master" and "master" have entirely different histories.
859
.drone.yml
859
.drone.yml
|
@ -27,7 +27,80 @@ steps:
|
|||
from_secret: ssh_privkey
|
||||
|
||||
commands:
|
||||
- . .drone/github-mirror.sh
|
||||
- apk add --update --no-cache git openssh
|
||||
- mkdir -p ~/.ssh
|
||||
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
|
||||
- |
|
||||
cat <<EOF > ~/.ssh/id_rsa
|
||||
$SSH_PRIVKEY
|
||||
EOF
|
||||
- chmod 0600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
|
||||
- git config --global --add safe.directory $PWD
|
||||
- git remote add github git@github.com:/BlackLight/platypush.git
|
||||
- git pull --rebase github "$(git branch | head -1 | awk '{print $2}')" || echo "No such branch on Github"
|
||||
- git push --all -v github
|
||||
|
||||
###
|
||||
### Synchronize the `stable` branch to the new release
|
||||
###
|
||||
|
||||
- name: sync-stable-branch
|
||||
image: alpine
|
||||
environment:
|
||||
SSH_PUBKEY:
|
||||
from_secret: ssh_pubkey
|
||||
SSH_PRIVKEY:
|
||||
from_secret: ssh_privkey
|
||||
PGP_KEY:
|
||||
from_secret: pgp_key
|
||||
PGP_KEY_ID:
|
||||
from_secret: pgp_key_id
|
||||
|
||||
commands:
|
||||
- apk add --update --no-cache git bash gnupg openssh
|
||||
|
||||
# Backup the original git configuration before changing attributes
|
||||
- export GIT_CONF=$PWD/.git/config
|
||||
- export TMP_GIT_CONF=/tmp/git.config.orig
|
||||
- cp $GIT_CONF $TMP_GIT_CONF
|
||||
- git config --global --add safe.directory $PWD
|
||||
|
||||
# Install the SSH and PGP keys
|
||||
- mkdir -p ~/.ssh
|
||||
- |
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_KEY
|
||||
EOF
|
||||
|
||||
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
|
||||
- |
|
||||
cat <<EOF > ~/.ssh/id_rsa
|
||||
$SSH_PRIVKEY
|
||||
EOF
|
||||
- chmod 0600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
|
||||
|
||||
# Git configuration
|
||||
- git config user.name "Platypush CI/CD Automation"
|
||||
- git config user.email "admin@platypush.tech"
|
||||
- git config commit.gpgsign true
|
||||
- git config user.signingkey $PGP_KEY_ID
|
||||
- git remote rm origin
|
||||
- git remote add origin git@git.platypush.tech:platypush/platypush.git
|
||||
|
||||
# Merge and push to the `stable` branch
|
||||
- git checkout stable
|
||||
- git rebase master
|
||||
- git push -u origin stable
|
||||
- git checkout master
|
||||
|
||||
# Restore the original git configuration
|
||||
- mv $TMP_GIT_CONF $GIT_CONF
|
||||
|
||||
when:
|
||||
event:
|
||||
- tag
|
||||
|
||||
###
|
||||
### Rebuild the docs
|
||||
|
@ -40,12 +113,36 @@ steps:
|
|||
path: /docs
|
||||
|
||||
commands:
|
||||
- . .drone/rebuild-docs.sh
|
||||
- echo "Installing required build dependencies"
|
||||
- apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
|
||||
- pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
|
||||
- pip install . --break-system-packages
|
||||
- mkdir -p /docs/current
|
||||
- export APPDIR=$PWD
|
||||
- rm -rf "$APPDIR/docs/build"
|
||||
- echo "Building the updated documentation"
|
||||
- cd "$APPDIR/docs/source"
|
||||
- git clone 'https://git.platypush.tech/platypush/platypush.wiki.git' wiki
|
||||
- cd wiki
|
||||
- ln -s Home.md index.md
|
||||
- cd "$APPDIR/docs"
|
||||
- make html
|
||||
- rm -f config*.yaml
|
||||
- cd "$APPDIR"
|
||||
- echo "Copying the new documentation files to the target folder"
|
||||
- mv -v "$APPDIR/docs/build" /docs/new
|
||||
- cd /docs
|
||||
- mv current old
|
||||
- mv new current
|
||||
- rm -rf old
|
||||
|
||||
when:
|
||||
event:
|
||||
- tag
|
||||
|
||||
depends_on:
|
||||
- sync-stable-branch
|
||||
|
||||
###
|
||||
### Run the tests
|
||||
###
|
||||
|
@ -53,7 +150,10 @@ steps:
|
|||
- name: tests
|
||||
image: alpine
|
||||
commands:
|
||||
- . .drone/run-tests.sh
|
||||
- apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
|
||||
- pip install . --break-system-packages
|
||||
- pip install -r requirements-tests.txt --break-system-packages
|
||||
- pytest tests
|
||||
|
||||
###
|
||||
### Rebuild the UI files
|
||||
|
@ -82,7 +182,69 @@ steps:
|
|||
- tests
|
||||
|
||||
commands:
|
||||
- . .drone/build-ui.sh
|
||||
- export SKIPCI="$PWD/.skipci"
|
||||
- rm -rf "$SKIPCI"
|
||||
- apk add --update --no-cache git
|
||||
|
||||
# Backup the original git configuration before changing attributes
|
||||
- export GIT_CONF=$PWD/.git/config
|
||||
- export TMP_GIT_CONF=/tmp/git.config.orig
|
||||
- cp $GIT_CONF $TMP_GIT_CONF
|
||||
|
||||
- git config --global --add safe.directory $PWD
|
||||
- cd platypush/backend/http/webapp
|
||||
- |
|
||||
if [ $(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE . | wc -l) -eq 0 ]; then
|
||||
echo "No UI changes detected, skipping build"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- |
|
||||
if [ "$(git log --pretty=format:%s HEAD...HEAD~1 | head -1)" == "[Automatic] Updated UI files" ]; then
|
||||
echo "UI changes have already been committed, skipping build"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- rm -rf dist node_modules
|
||||
- npm install
|
||||
- npm run build
|
||||
- |
|
||||
if [ $(git status --porcelain dist | wc -l) -eq 0 ]; then
|
||||
echo "No build files have been changed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Create a .skipci file to mark the fact that the next steps should be skipped
|
||||
# (we're going to do another push anyway, so another pipeline will be triggered)
|
||||
- touch "$SKIPCI"
|
||||
|
||||
- apk add --update --no-cache bash gnupg openssh
|
||||
- mkdir -p ~/.ssh
|
||||
- |
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_KEY
|
||||
EOF
|
||||
|
||||
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
|
||||
- |
|
||||
cat <<EOF > ~/.ssh/id_rsa
|
||||
$SSH_PRIVKEY
|
||||
EOF
|
||||
- chmod 0600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
|
||||
|
||||
- git config user.name "Platypush CI/CD Automation"
|
||||
- git config user.email "admin@platypush.tech"
|
||||
- git config commit.gpgsign true
|
||||
- git config user.signingkey $PGP_KEY_ID
|
||||
- git add dist
|
||||
- git commit dist -S -m "[Automatic] Updated UI files" --no-verify
|
||||
- git remote rm origin
|
||||
- git remote add origin git@git.platypush.tech:platypush/platypush.git
|
||||
- git push -f origin master
|
||||
|
||||
# Restore the original git configuration
|
||||
- mv $TMP_GIT_CONF $GIT_CONF
|
||||
|
||||
###
|
||||
### Regenerate the components.json cache
|
||||
|
@ -111,7 +273,66 @@ steps:
|
|||
- build-ui
|
||||
|
||||
commands:
|
||||
- . .drone/update-components-cache.sh
|
||||
- export SKIPCI="$PWD/.skipci"
|
||||
- export CACHEFILE="$PWD/platypush/components.json.gz"
|
||||
- |
|
||||
[ -f "$SKIPCI" ] && exit 0
|
||||
|
||||
# Only regenerate the components cache if either the plugins, backends,
|
||||
# events or schemas folders have some changes (excluding the webapp files).
|
||||
- apk add --update --no-cache git
|
||||
- |
|
||||
if [ -z "$(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE -- platypush/backend platypush/plugins platypush/schemas platypush/message/event ':(exclude)platypush/backend/http/webapp')" ]; then
|
||||
echo 'No changes to the components file'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- echo 'Updating components cache'
|
||||
- apk add --update --no-cache bash gnupg openssh $(cat platypush/install/requirements/alpine.txt)
|
||||
- pip install . --break-system-packages
|
||||
- |
|
||||
python - <<EOF
|
||||
from platypush import get_plugin
|
||||
|
||||
get_plugin('inspect').refresh_cache(force=True)
|
||||
EOF
|
||||
|
||||
# Backup the original git configuration before changing attributes
|
||||
- export GIT_CONF=$PWD/.git/config
|
||||
- export TMP_GIT_CONF=/tmp/git.config.orig
|
||||
- cp $GIT_CONF $TMP_GIT_CONF
|
||||
- git config --global --add safe.directory $PWD
|
||||
|
||||
# Create a .skipci file to mark the fact that the next steps should be skipped
|
||||
# (we're going to do another push anyway, so another pipeline will be triggered)
|
||||
- touch "$SKIPCI"
|
||||
|
||||
- mkdir -p ~/.ssh
|
||||
- |
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_KEY
|
||||
EOF
|
||||
|
||||
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
|
||||
- |
|
||||
cat <<EOF > ~/.ssh/id_rsa
|
||||
$SSH_PRIVKEY
|
||||
EOF
|
||||
- chmod 0600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
|
||||
|
||||
- git config user.name "Platypush CI/CD Automation"
|
||||
- git config user.email "admin@platypush.tech"
|
||||
- git config commit.gpgsign true
|
||||
- git config user.signingkey $PGP_KEY_ID
|
||||
- git add "$CACHEFILE"
|
||||
- git commit "$CACHEFILE" -S -m "[Automatic] Updated components cache" --no-verify
|
||||
- git remote rm origin
|
||||
- git remote add origin git@git.platypush.tech:platypush/platypush.git
|
||||
- git push -f origin master
|
||||
|
||||
# Restore the original git configuration
|
||||
- mv $TMP_GIT_CONF $GIT_CONF
|
||||
|
||||
###
|
||||
### Update the Arch packages
|
||||
|
@ -136,7 +357,79 @@ steps:
|
|||
- update-components-cache
|
||||
|
||||
commands:
|
||||
- . .drone/update-arch-packages.sh
|
||||
- |
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
- echo "-- Installing dependencies"
|
||||
- apk add --update --no-cache curl git openssh pacman sudo
|
||||
|
||||
- echo "--- Parsing metadata"
|
||||
- git config --global --add safe.directory $PWD
|
||||
- git pull --rebase origin master --tags
|
||||
- export VERSION=$(python setup.py --version)
|
||||
- export HEAD=$(git log --pretty=format:%h HEAD...HEAD~1 | head -1)
|
||||
- export GIT_VERSION="$VERSION.r$(git log --pretty=oneline HEAD...v$VERSION | wc -l).g$${HEAD}"
|
||||
- export TAG_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
|
||||
|
||||
- echo "--- Preparing environment"
|
||||
- mkdir -p ~/.ssh
|
||||
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
|
||||
- |
|
||||
cat <<EOF > ~/.ssh/id_rsa
|
||||
$SSH_PRIVKEY
|
||||
EOF
|
||||
- chmod 0600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
|
||||
- ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null
|
||||
- adduser -u 1000 -D build
|
||||
- mkdir -p $WORKDIR
|
||||
|
||||
- echo "--- Updating Arch git version"
|
||||
- export PKGDIR=$WORKDIR/git
|
||||
- git clone ssh://aur@aur.archlinux.org/platypush-git.git $PKGDIR
|
||||
- git config --global --add safe.directory $PKGDIR
|
||||
- chown -R build $PKGDIR
|
||||
- cd $PKGDIR
|
||||
- |
|
||||
sed -i 'PKGBUILD' -r \
|
||||
-e "s/^pkgver=.*/pkgver=$GIT_VERSION/" \
|
||||
-e "s/^pkgrel=.*/pkgrel=1/" \
|
||||
- sudo -u build makepkg --printsrcinfo > .SRCINFO
|
||||
- export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
|
||||
- |
|
||||
if [ $FILES_CHANGED -gt 0 ]; then
|
||||
echo "--- Pushing git package version $GIT_VERSION"
|
||||
git commit -a -m '[Automatic] Package update'
|
||||
git push origin master
|
||||
fi
|
||||
|
||||
- echo "--- Updating Arch stable version"
|
||||
- export PKGDIR=$WORKDIR/stable
|
||||
- git clone ssh://aur@aur.archlinux.org/platypush.git $PKGDIR
|
||||
- git config --global --add safe.directory $PKGDIR
|
||||
- chown -R build $PKGDIR
|
||||
- cd $PKGDIR
|
||||
- export RELEASED_VERSION=$(grep -e '^pkgver=' PKGBUILD | sed -r -e 's/^pkgver=(.*)\s*/\1/')
|
||||
- |
|
||||
if [ "$RELEASED_VERSION" == "$VERSION" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- export TAG_CHECKSUM=$(curl --silent "$TAG_URL" | sha512sum | awk '{print $1}')
|
||||
- |
|
||||
sed -i 'PKGBUILD' -r \
|
||||
-e "s/^pkgver=.*/pkgver=$VERSION/" \
|
||||
-e "s/^pkgrel=.*/pkgrel=1/" \
|
||||
-e "s/^sha512sums=.*/sha512sums=('$TAG_CHECKSUM')/"
|
||||
|
||||
- sudo -u build makepkg --printsrcinfo > .SRCINFO
|
||||
- export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
|
||||
- |
|
||||
if [ $FILES_CHANGED -gt 0 ]; then
|
||||
echo "--- Pushing stable package version $VERSION"
|
||||
git commit -a -m '[Automatic] Package update'
|
||||
git push origin master
|
||||
fi
|
||||
|
||||
###
|
||||
### Update the Debian (stable) packages
|
||||
|
@ -164,7 +457,78 @@ steps:
|
|||
- update-components-cache
|
||||
|
||||
commands:
|
||||
- . .drone/update-deb-packages.sh
|
||||
- |
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
- echo "-- Installing dependencies"
|
||||
- apt update
|
||||
- apt install -y curl dpkg-dev gpg git python3 python3-pip
|
||||
|
||||
- echo "-- Copying source directory"
|
||||
- mkdir -p "$WORKDIR"
|
||||
- export SRCDIR="$WORKDIR/src"
|
||||
- cp -r "$PWD" "$SRCDIR"
|
||||
- cd "$SRCDIR"
|
||||
|
||||
- echo "--- Parsing metadata"
|
||||
- git config --global --add safe.directory "$PWD"
|
||||
- git pull --rebase origin master --tags
|
||||
- export VERSION=$(python3 setup.py --version)
|
||||
- export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
|
||||
- export GIT_BUILD_DIR="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all"
|
||||
- export GIT_DEB="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all.deb"
|
||||
- export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
|
||||
|
||||
- echo "--- Building git package"
|
||||
- pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
|
||||
- |
|
||||
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
|
||||
base="$(dirname "$dir")"
|
||||
mv "$dir" "$base/dist-packages"
|
||||
done
|
||||
|
||||
- mkdir -p "$GIT_BUILD_DIR/DEBIAN"
|
||||
- |
|
||||
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
|
||||
Package: $PKG_NAME
|
||||
Version: $GIT_VERSION
|
||||
Maintainer: Fabio Manganiello <fabio@platypush.tech>
|
||||
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
|
||||
Architecture: all
|
||||
Homepage: https://platypush.tech
|
||||
Description: Universal command executor and automation hub.
|
||||
EOF
|
||||
- mkdir -p "$POOL_PATH"
|
||||
- rm -f "$POOL_PATH/"*.deb
|
||||
- dpkg --build "$GIT_BUILD_DIR"
|
||||
|
||||
- echo "--- Copying $GIT_DEB to $POOL_PATH"
|
||||
- cp "$GIT_DEB" "$POOL_PATH"
|
||||
|
||||
# If main/all/Packages doesn't exist, then we should create the first main release
|
||||
- |
|
||||
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
|
||||
|
||||
- export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
|
||||
- |
|
||||
[ -z "$UPDATE_STABLE_PKG" ] &&
|
||||
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
|
||||
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
|
||||
|
||||
# If the published release version differs from the current one, then we should publish a new main release
|
||||
- |
|
||||
if [ -z "$UPDATE_STABLE_PKG" ]; then
|
||||
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
|
||||
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
|
||||
fi
|
||||
|
||||
# Proceed and update the main release if the version number has changed
|
||||
- |
|
||||
if [ -n "$UPDATE_STABLE_PKG" ]; then
|
||||
echo "--- Updating main package"
|
||||
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
|
||||
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-1_all.deb"
|
||||
fi
|
||||
|
||||
###
|
||||
### Update the Debian (oldstable) packages
|
||||
|
@ -192,35 +556,78 @@ steps:
|
|||
- update-components-cache
|
||||
|
||||
commands:
|
||||
- . .drone/update-deb-packages.sh
|
||||
- |
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
###
|
||||
### Update the Ubuntu (latest) packages
|
||||
###
|
||||
- echo "-- Copying source directory"
|
||||
- mkdir -p "$WORKDIR"
|
||||
- export SRCDIR="$WORKDIR/src"
|
||||
- cp -r "$PWD" "$SRCDIR"
|
||||
- cd "$SRCDIR"
|
||||
|
||||
- name: update-ubuntu-packages
|
||||
image: ubuntu:latest
|
||||
volumes:
|
||||
- name: repos
|
||||
path: /repos
|
||||
- echo "-- Installing dependencies"
|
||||
- apt update
|
||||
- apt install -y curl dpkg-dev gpg git python3 python3-pip
|
||||
|
||||
environment:
|
||||
DEB_VERSION: ubuntu
|
||||
WORKDIR: /tmp/workdir
|
||||
APT_ROOT: /repos/apt
|
||||
PKG_NAME: platypush
|
||||
- echo "--- Parsing metadata"
|
||||
- git config --global --add safe.directory "$PWD"
|
||||
- git pull --rebase origin master --tags
|
||||
- export VERSION=$(python3 setup.py --version)
|
||||
- export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
|
||||
- export GIT_BUILD_DIR="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all"
|
||||
- export GIT_DEB="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all.deb"
|
||||
- export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
|
||||
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
event:
|
||||
- push
|
||||
- echo "--- Building git package"
|
||||
- pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
|
||||
- |
|
||||
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
|
||||
base="$(dirname "$dir")"
|
||||
mv "$dir" "$base/dist-packages"
|
||||
done
|
||||
|
||||
depends_on:
|
||||
- update-components-cache
|
||||
- mkdir -p "$GIT_BUILD_DIR/DEBIAN"
|
||||
- |
|
||||
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
|
||||
Package: $PKG_NAME
|
||||
Version: $GIT_VERSION
|
||||
Maintainer: Fabio Manganiello <fabio@platypush.tech>
|
||||
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
|
||||
Architecture: all
|
||||
Homepage: https://platypush.tech
|
||||
Description: Universal command executor and automation hub.
|
||||
EOF
|
||||
- mkdir -p "$POOL_PATH"
|
||||
- rm -f "$POOL_PATH/"*.deb
|
||||
- dpkg --build "$GIT_BUILD_DIR"
|
||||
|
||||
commands:
|
||||
- . .drone/update-deb-packages.sh
|
||||
- echo "--- Copying $GIT_DEB to $POOL_PATH"
|
||||
- cp "$GIT_DEB" "$POOL_PATH"
|
||||
|
||||
# If main/all/Packages doesn't exist, then we should create the first main release
|
||||
- |
|
||||
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
|
||||
|
||||
- export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
|
||||
- |
|
||||
[ -z "$UPDATE_STABLE_PKG" ] &&
|
||||
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
|
||||
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
|
||||
|
||||
# If the published release version differs from the current one, then we should publish a new main release
|
||||
- |
|
||||
if [ -z "$UPDATE_STABLE_PKG" ]; then
|
||||
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
|
||||
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
|
||||
fi
|
||||
|
||||
# Proceed and update the main release if the version number has changed
|
||||
- |
|
||||
if [ -n "$UPDATE_STABLE_PKG" ]; then
|
||||
echo "--- Updating main package"
|
||||
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
|
||||
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-1_all.deb"
|
||||
fi
|
||||
|
||||
###
|
||||
### Updates the APT repository after new packages have been pushed
|
||||
|
@ -249,10 +656,185 @@ steps:
|
|||
depends_on:
|
||||
- update-debian-stable-packages
|
||||
- update-debian-oldstable-packages
|
||||
- update-ubuntu-packages
|
||||
|
||||
commands:
|
||||
- . .drone/update-apt-repo.sh
|
||||
- |
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
- echo "-- Installing dependencies"
|
||||
- apt update
|
||||
- apt install -y dpkg-dev gpg
|
||||
|
||||
- echo "-- Creating a new apt root folder"
|
||||
- export TMP_APT_ROOT="/tmp/apt"
|
||||
- cp -r "$APT_ROOT" "$TMP_APT_ROOT"
|
||||
|
||||
- echo "-- Cleaning up older apt releases"
|
||||
- |
|
||||
find "$TMP_APT_ROOT/pool" -mindepth 2 -maxdepth 2 -type d | while read reldir; do
|
||||
pkg_to_remove=$(( $(ls "$reldir"/*.deb | wc -l) - 1 ))
|
||||
[ $pkg_to_remove -le 0 ] && continue
|
||||
ls "$reldir"/*.deb | sort -V | head -n$pkg_to_remove | xargs rm -f
|
||||
done
|
||||
|
||||
- echo "-- Updating Packages files"
|
||||
- |
|
||||
echo "stable\noldstable" | while read distro; do
|
||||
echo "main\ndev" | while read branch; do
|
||||
branch_dir="$TMP_APT_ROOT/pool/$distro/$branch"
|
||||
echo "Checking pool folder: $branch_dir"
|
||||
[ -d "$branch_dir" ] || mkdir -p "$branch_dir"
|
||||
dist_dir="$TMP_APT_ROOT/dists/$distro/$branch/all"
|
||||
mkdir -p "$dist_dir"
|
||||
pkg_file="$dist_dir/Packages"
|
||||
dpkg-scanpackages --arch all "$branch_dir" > "$pkg_file"
|
||||
sed -i "$pkg_file" -re "s|^Filename: $TMP_APT_ROOT/|Filename: |"
|
||||
cat "$pkg_file" | gzip -9 > "$pkg_file.gz"
|
||||
echo "Generated Packages file: $pkg_file"
|
||||
cat "$pkg_file"
|
||||
done
|
||||
done
|
||||
|
||||
- echo "-- Updating Release files"
|
||||
- |
|
||||
add_hashes() {
|
||||
dist_dir=$1
|
||||
hash_cmd=$2
|
||||
hash_label=$3
|
||||
|
||||
echo "$hash_label:"
|
||||
find "$dist_dir" -name 'Packages*' | while read file; do
|
||||
basename="$(echo "$file" | sed -r -e "s|^$dist_dir/||")"
|
||||
hash="$($hash_cmd "$file" | cut -d" " -f1)"
|
||||
size="$(wc -c < $file)"
|
||||
echo " $hash $size $basename"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-i386/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-amd64/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armel/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armhf/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-arm64/|')"
|
||||
done
|
||||
}
|
||||
|
||||
echo "stable\noldstable" | while read distro; do
|
||||
dist_dir="$TMP_APT_ROOT/dists/$distro"
|
||||
components=$(find "$dist_dir" -name Packages | awk -F '/' '{print $(NF-2)}' | uniq | tr '\n' ' ')
|
||||
release_file="$dist_dir/Release"
|
||||
|
||||
cat <<EOF > "$release_file"
|
||||
Origin: Platypush repository
|
||||
Label: Platypush
|
||||
Suite: $distro
|
||||
Codename: $distro
|
||||
Architectures: i386 amd64 armel armhf arm64
|
||||
Components: $components
|
||||
Description: The official APT repository for Platypush
|
||||
Date: $(date -Ru)
|
||||
EOF
|
||||
|
||||
add_hashes "$dist_dir" "md5sum" "MD5Sum" >> "$release_file"
|
||||
add_hashes "$dist_dir" "sha1sum" "SHA1" >> "$release_file"
|
||||
add_hashes "$dist_dir" "sha256sum" "SHA256" >> "$release_file"
|
||||
done
|
||||
|
||||
- echo "-- Generating list files"
|
||||
- mkdir -p "$TMP_APT_ROOT/lists"
|
||||
- |
|
||||
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-stable-main.list"
|
||||
deb https://apt.platypush.tech/ stable main
|
||||
EOF
|
||||
|
||||
- |
|
||||
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-stable-dev.list"
|
||||
deb https://apt.platypush.tech/ stable dev
|
||||
EOF
|
||||
|
||||
- |
|
||||
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-oldstable-main.list"
|
||||
deb https://apt.platypush.tech/ oldstable main
|
||||
EOF
|
||||
|
||||
- |
|
||||
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-oldstable-dev.list"
|
||||
deb https://apt.platypush.tech/ oldstable dev
|
||||
EOF
|
||||
|
||||
- echo "-- Updating index file"
|
||||
- |
|
||||
cat <<EOF > "$TMP_APT_ROOT/index.txt"
|
||||
Welcome to the Platypush APT repository!
|
||||
|
||||
Project homepage: https://platypush.tech
|
||||
Source code: https://git.platypush.tech/platypush/platypush
|
||||
Documentation / API reference: https://docs.platypush.tech
|
||||
|
||||
You can use this APT repository to install Platypush on Debian, Ubuntu or any
|
||||
Debian-based distro.
|
||||
|
||||
Steps:
|
||||
|
||||
1. Add this repository's PGP key to your apt keyring
|
||||
====================================================
|
||||
|
||||
$ sudo wget -q -O \\\
|
||||
/etc/apt/trusted.gpg.d/platypush.asc \\\
|
||||
https://apt.platypush.tech/pubkey.txt
|
||||
|
||||
2. Add the repository to your sources
|
||||
=====================================
|
||||
|
||||
$ sudo wget -q -O \\\
|
||||
/etc/apt/sources.list.d/platypush.list \\\
|
||||
https://apt.platypush.tech/lists/platypush-<deb_version>-<branch>.list
|
||||
|
||||
Where:
|
||||
|
||||
- deb_version can be either *stable* (for the current Debian stable version) or
|
||||
*oldstable* (for the previous Debian stable version)
|
||||
- branch can be either *main* (for the latest releases) or *dev* (for a package
|
||||
that is always in sync with the git version)
|
||||
|
||||
For example, to install the latest stable tags on Debian stable:
|
||||
|
||||
$ sudo wget -q -O \\\
|
||||
/etc/apt/sources.list.d/platypush.list \\\
|
||||
https://apt.platypush.tech/lists/platypush-stable-main.list
|
||||
|
||||
3. Update your repos
|
||||
====================
|
||||
|
||||
$ sudo apt update
|
||||
|
||||
4. Install Platypush
|
||||
====================
|
||||
|
||||
$ sudo apt install platypush
|
||||
EOF
|
||||
|
||||
- echo "-- Importing and refreshing PGP key"
|
||||
- echo "$PGP_PUBKEY" > "$TMP_APT_ROOT/pubkey.txt"
|
||||
- export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
|
||||
- |
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_PRIVKEY
|
||||
EOF
|
||||
|
||||
- echo "-- Signing Release files"
|
||||
- |
|
||||
find "$TMP_APT_ROOT/dists" -type f -name Release | while read file; do
|
||||
dirname="$(dirname "$file")"
|
||||
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs > "$file.gpg"
|
||||
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs --clearsign > "$dirname/InRelease"
|
||||
done
|
||||
|
||||
- echo "-- Updating the apt repo root"
|
||||
- export OLD_APT_ROOT="$REPOS_ROOT/oldapt"
|
||||
- rm -rf "$OLD_APT_ROOT"
|
||||
- mv "$APT_ROOT" "$OLD_APT_ROOT"
|
||||
- mv "$TMP_APT_ROOT" "$APT_ROOT"
|
||||
|
||||
- chmod -R a+r "$APT_ROOT"
|
||||
- chmod a+x "$APT_ROOT"
|
||||
|
||||
###
|
||||
### Update the RPM (stable) packages
|
||||
|
@ -285,14 +867,219 @@ steps:
|
|||
- update-components-cache
|
||||
|
||||
commands:
|
||||
- . .drone/update-rpm-repo.sh
|
||||
- |
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
- echo "-- Installing dependencies"
|
||||
- yum install -y createrepo rpm-build rpm-sign gpg wget yum-utils git python python-pip
|
||||
|
||||
- echo "-- Copying source directory"
|
||||
- mkdir -p "$WORKDIR"
|
||||
- export SRCDIR="$WORKDIR/src"
|
||||
- cp -r "$PWD" "$SRCDIR"
|
||||
- cd "$SRCDIR"
|
||||
- mkdir -p "$RPM_ROOT"
|
||||
|
||||
- echo "--- Parsing metadata"
|
||||
- git config --global --add safe.directory $PWD
|
||||
- git pull --rebase origin master --tags
|
||||
- export VERSION=$(python3 setup.py --version)
|
||||
- export RELNUM="$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
|
||||
- export SPECFILE="$WORKDIR/$PKG_NAME.spec"
|
||||
- export BUILD_DIR="$WORKDIR/build"
|
||||
- export TMP_RPM_ROOT="$WORKDIR/repo"
|
||||
- export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/master.tar.gz"
|
||||
|
||||
- echo "--- Creating git package spec"
|
||||
- |
|
||||
cat <<EOF > $SPECFILE
|
||||
Summary: Universal command executor and automation hub.
|
||||
Name: $PKG_NAME-git
|
||||
Version: $VERSION
|
||||
Release: $RELNUM
|
||||
URL: https://platypush.tech
|
||||
Group: System
|
||||
License: MIT
|
||||
Packager: Fabio Manganiello <fabio@platypush.tech>
|
||||
Source: $SRC_URL
|
||||
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
|
||||
Conflicts: $PKG_NAME
|
||||
Prefix: %{_prefix}
|
||||
BuildRoot: %{_tmppath}/%{name}-root
|
||||
|
||||
%description
|
||||
Universal command executor and automation hub.
|
||||
|
||||
%install
|
||||
mkdir -p %{buildroot}/
|
||||
cp -r "$BUILD_DIR"/* %{buildroot}/
|
||||
|
||||
%clean
|
||||
|
||||
%files
|
||||
/usr/bin/*
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
|
||||
|
||||
%changelog
|
||||
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
|
||||
- [Automatic] Release $VERSION-$RELNUM
|
||||
EOF
|
||||
|
||||
- echo "--- Building git package"
|
||||
- mkdir -p "$BUILD_DIR"
|
||||
- pip install --prefix="$BUILD_DIR/usr" --no-cache --no-deps .
|
||||
- rpmbuild --target "noarch" -bb "$SPECFILE"
|
||||
|
||||
- echo "--- Copying the new RPM package"
|
||||
- mkdir -p "$TMP_RPM_ROOT"
|
||||
- cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-git-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
|
||||
|
||||
- echo "--- Checking the latest released stable version"
|
||||
- export LATEST_STABLE_PKG=$(ls -rt "$RPM_ROOT/$PKG_NAME"*.rpm 2>/dev/null | grep -v "$PKG_NAME-git" | tail -1)
|
||||
- |
|
||||
if [ -z "$LATEST_STABLE_PKG" ]; then
|
||||
# If not stable release is available, then create one
|
||||
export UPDATE_STABLE_PKG=1
|
||||
else
|
||||
# Otherwise, create a new release if the reported version on the repo is different
|
||||
# from the latest released version.
|
||||
export LATEST_STABLE_VERSION=$(basename $LATEST_STABLE_PKG | cut -d- -f 2)
|
||||
if [ "$VERSION" != "$LATEST_STABLE_VERSION" ]; then
|
||||
export UPDATE_STABLE_PKG=1
|
||||
else
|
||||
# If the version has remained the same, then simply copy the existing RPM to the
|
||||
# new repository directory.
|
||||
echo "Copying the existing release $LATEST_STABLE_VERSION to the new repository"
|
||||
cp "$LATEST_STABLE_PKG" "$TMP_RPM_ROOT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# If a new stable release is required, build another RPM
|
||||
- |
|
||||
if [ -n "$UPDATE_STABLE_PKG" ]; then
|
||||
export RELNUM=1
|
||||
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
|
||||
|
||||
cat <<EOF > $SPECFILE
|
||||
Summary: Universal command executor and automation hub.
|
||||
Name: $PKG_NAME
|
||||
Version: $VERSION
|
||||
Release: $RELNUM
|
||||
URL: https://platypush.tech
|
||||
Group: System
|
||||
License: MIT
|
||||
Packager: Fabio Manganiello <fabio@platypush.tech>
|
||||
Source: $SRC_URL
|
||||
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
|
||||
Conflicts: $PKG_NAME-git
|
||||
Prefix: %{_prefix}
|
||||
BuildRoot: %{_tmppath}/%{name}-root
|
||||
|
||||
%description
|
||||
Universal command executor and automation hub.
|
||||
|
||||
%install
|
||||
mkdir -p %{buildroot}/
|
||||
cp -r "$BUILD_DIR"/* %{buildroot}/
|
||||
|
||||
%clean
|
||||
|
||||
%files
|
||||
/usr/bin/*
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
|
||||
|
||||
%changelog
|
||||
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
|
||||
- [Automatic] Release $VERSION-$RELNUM
|
||||
EOF
|
||||
|
||||
echo "--- Building package for stable release $VERSION"
|
||||
rpmbuild --target "noarch" -bb "$SPECFILE"
|
||||
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
|
||||
fi
|
||||
|
||||
- echo "--- Importing the repository keys"
|
||||
- |
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_PRIVKEY
|
||||
EOF
|
||||
|
||||
- export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
|
||||
- |
|
||||
cat <<EOF > $HOME/.rpmmacros
|
||||
%signature gpg
|
||||
%_gpg_name $PGP_KEYID
|
||||
EOF
|
||||
|
||||
- echo "--- Signing the new RPM packages"
|
||||
- rpm --addsign "$TMP_RPM_ROOT"/*.rpm
|
||||
|
||||
- echo "--- Creating a new copy of the RPM repository"
|
||||
- createrepo "$TMP_RPM_ROOT"
|
||||
- gpg --detach-sign --armor "$TMP_RPM_ROOT/repodata/repomd.xml"
|
||||
|
||||
- |
|
||||
cat <<EOF > "$TMP_RPM_ROOT/platypush.repo"
|
||||
[platypush]
|
||||
name=Platypush repository
|
||||
baseurl=https://rpm.platypush.tech
|
||||
enabled=1
|
||||
type=rpm
|
||||
gpgcheck=1
|
||||
gpgkey=https://rpm.platypush.tech/pubkey.txt
|
||||
EOF
|
||||
|
||||
- |
|
||||
cat <<EOF > "$TMP_RPM_ROOT/index.txt"
|
||||
Welcome to the Platypush RPM repository!
|
||||
|
||||
Project homepage: https://platypush.tech
|
||||
Source code: https://git.platypush.tech/platypush/platypush
|
||||
Documentation / API reference: https://docs.platypush.tech
|
||||
|
||||
You can use this RPM repository to install Platypush on Fedora or other
|
||||
RPM-based distros - as long as they are compatible with the latest Fedora
|
||||
release.
|
||||
|
||||
Steps:
|
||||
|
||||
1. Add the repository to your sources
|
||||
=====================================
|
||||
|
||||
$ sudo yum config-manager --add-repo https://rpm.platypush.tech/platypush.repo
|
||||
|
||||
2. Install Platypush
|
||||
====================
|
||||
|
||||
$ sudo yum install platypush
|
||||
|
||||
Or, if you want to install a version always up-to-date with the git repo:
|
||||
|
||||
$ sudo yum install platypush-git
|
||||
EOF
|
||||
|
||||
- |
|
||||
cat <<EOF > "$TMP_RPM_ROOT/pubkey.txt"
|
||||
$PGP_PUBKEY
|
||||
EOF
|
||||
|
||||
- echo "--- Updating the repository"
|
||||
- export NEW_RPM_ROOT="$REPOS_ROOT/rpm_new"
|
||||
- export OLD_RPM_ROOT="$REPOS_ROOT/rpm_old"
|
||||
- cp -r "$TMP_RPM_ROOT" "$NEW_RPM_ROOT"
|
||||
- rm -rf "$TMP_RPM_ROOT"
|
||||
- mv "$RPM_ROOT" "$OLD_RPM_ROOT"
|
||||
- mv "$NEW_RPM_ROOT" "$RPM_ROOT"
|
||||
- rm -rf "$OLD_RPM_ROOT"
|
||||
|
||||
###
|
||||
### Updates the pip package upon new releases
|
||||
###
|
||||
|
||||
- name: update-pip-package
|
||||
image: alpine
|
||||
image: python:3.11-alpine
|
||||
environment:
|
||||
TWINE_USERNAME:
|
||||
from_secret: pypi_user
|
||||
|
@ -308,7 +1095,9 @@ steps:
|
|||
- docs
|
||||
|
||||
commands:
|
||||
- . .drone/update-pip-package.sh
|
||||
- apk add --update --no-cache py3-twine
|
||||
- python setup.py sdist bdist_wheel
|
||||
- twine upload dist/platypush-$(python setup.py --version).tar.gz
|
||||
|
||||
###
|
||||
### Checkpoint step that waits for all the package update
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
export SRCDIR="$PWD"
|
||||
export WEBAPP_DIR="$SRCDIR/platypush/backend/http/webapp"
|
||||
export SKIPCI="$PWD/.skipci"
|
||||
rm -rf "$SKIPCI"
|
||||
|
||||
. .drone/macros/configure-git.sh
|
||||
|
||||
cd "$WEBAPP_DIR"
|
||||
if [ $(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE . | wc -l) -eq 0 ]; then
|
||||
echo "No UI changes detected, skipping build"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
if [ "$(git log --pretty=format:%s HEAD...HEAD~1 | head -1)" == "[Automatic] Updated UI files" ]; then
|
||||
echo "UI changes have already been committed, skipping build"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
rm -rf dist node_modules
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
if [ $(git status --porcelain dist | wc -l) -eq 0 ]; then
|
||||
echo "No build files have been changed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Create a .skipci file to mark the fact that the next steps should be skipped
|
||||
# (we're going to do another push anyway, so another pipeline will be triggered)
|
||||
touch "$SKIPCI"
|
||||
cd "$SRCDIR"
|
||||
|
||||
. .drone/macros/configure-ssh.sh
|
||||
. .drone/macros/configure-gpg.sh
|
||||
|
||||
git add "${WEBAPP_DIR}/dist"
|
||||
git commit "${WEBAPP_DIR}/dist" -S -m "[Automatic] Updated UI files" --no-verify
|
||||
git remote rm origin
|
||||
git remote add origin git@git.platypush.tech:platypush/platypush.git
|
||||
git push -f origin master
|
||||
|
||||
# Restore the original git configuration
|
||||
mv "$TMP_GIT_CONF" "$GIT_CONF"
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
. .drone/macros/configure-git.sh
|
||||
. .drone/macros/configure-ssh.sh
|
||||
|
||||
ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
|
||||
|
||||
# Clone the repository
|
||||
git remote add github git@github.com:/BlackLight/platypush.git
|
||||
git pull --rebase github "$(git branch | head -1 | awk '{print $2}')" || echo "No such branch on Github"
|
||||
|
||||
# Push the changes to the GitHub mirror
|
||||
git push --all -v github
|
|
@ -1,29 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Install git
|
||||
if [ -z "$(which git)" ]; then
|
||||
if [ -n "$(which apt-get)" ]; then
|
||||
apt-get update
|
||||
apt-get install -y git
|
||||
elif [ -n "$(which apk)" ]; then
|
||||
apk add --update --no-cache git
|
||||
elif [ -n "$(which yum)" ]; then
|
||||
yum install -y git
|
||||
elif [ -n "$(which dnf)" ]; then
|
||||
dnf install -y git
|
||||
elif [ -n "$(which pacman)" ]; then
|
||||
pacman -Sy --noconfirm git
|
||||
else
|
||||
echo "Could not find a package manager to install git"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Backup the original git configuration before changing attributes
|
||||
export GIT_CONF="$PWD/.git/config"
|
||||
export TMP_GIT_CONF=/tmp/git.config.orig
|
||||
cp "$GIT_CONF" "$TMP_GIT_CONF"
|
||||
|
||||
git config --global --add safe.directory "$PWD"
|
||||
git config user.name "Platypush CI/CD Automation"
|
||||
git config user.email "admin@platypush.tech"
|
|
@ -1,30 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -z "$PGP_KEY" ] && echo "PGP_KEY is not set" && exit 1
|
||||
[ -z "$PGP_KEY_ID" ] && echo "PGP_KEY_ID is not set" && exit 1
|
||||
|
||||
# Install gpg
|
||||
if [ -z "$(which gpg)" ]; then
|
||||
if [ -n "$(which apt-get)" ]; then
|
||||
apt-get update
|
||||
apt-get install -y gnupg
|
||||
elif [ -n "$(which apk)" ]; then
|
||||
apk add --update --no-cache bash gnupg
|
||||
elif [ -n "$(which yum)" ]; then
|
||||
yum install -y gnupg
|
||||
elif [ -n "$(which dnf)" ]; then
|
||||
dnf install -y gnupg
|
||||
elif [ -n "$(which pacman)" ]; then
|
||||
pacman -Sy --noconfirm gnupg
|
||||
else
|
||||
echo "Could not find a package manager to install gnupg"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_KEY
|
||||
EOF
|
||||
|
||||
git config commit.gpgsign true
|
||||
git config user.signingkey "$PGP_KEY_ID"
|
|
@ -1,35 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -z "$SSH_PUBKEY" ] || [ -z "$SSH_PRIVKEY" ]; then
|
||||
echo "SSH_PUBKEY and SSH_PRIVKEY environment variables must be set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install ssh
|
||||
if [ -z "$(which ssh)" ]; then
|
||||
if [ -n "$(which apt-get)" ]; then
|
||||
apt-get update
|
||||
apt-get install -y openssh
|
||||
elif [ -n "$(which apk)" ]; then
|
||||
apk add --update --no-cache openssh
|
||||
elif [ -n "$(which yum)" ]; then
|
||||
yum install -y openssh
|
||||
elif [ -n "$(which dnf)" ]; then
|
||||
dnf install -y openssh
|
||||
elif [ -n "$(which pacman)" ]; then
|
||||
pacman -Sy --noconfirm openssh
|
||||
else
|
||||
echo "Could not find a package manager to install openssh"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
mkdir -p ~/.ssh
|
||||
echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
|
||||
|
||||
cat <<EOF > ~/.ssh/id_rsa
|
||||
$SSH_PRIVKEY
|
||||
EOF
|
||||
|
||||
chmod 0600 ~/.ssh/id_rsa
|
||||
ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
|
|
@ -1,27 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo "Installing required build dependencies"
|
||||
apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
|
||||
pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
|
||||
pip install . --break-system-packages
|
||||
mkdir -p /docs/current
|
||||
export APPDIR="$PWD"
|
||||
rm -rf "$APPDIR/docs/build"
|
||||
|
||||
echo "Building the updated documentation"
|
||||
cd "$APPDIR/docs/source"
|
||||
git clone 'https://git.platypush.tech/platypush/platypush.wiki.git' wiki
|
||||
|
||||
echo "Linking the wiki to the Sphinx index"
|
||||
cd wiki
|
||||
cd "$APPDIR/docs"
|
||||
make html
|
||||
rm -f config*.yaml
|
||||
cd "$APPDIR"
|
||||
|
||||
echo "Copying the new documentation files to the target folder"
|
||||
mv -v "$APPDIR/docs/build" /docs/new
|
||||
cd /docs
|
||||
mv current old
|
||||
mv new current
|
||||
rm -rf old
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
|
||||
pip install . --break-system-packages
|
||||
pip install -r requirements-tests.txt --break-system-packages
|
||||
pytest tests
|
|
@ -1,169 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
echo "-- Installing dependencies"
|
||||
apt update
|
||||
apt install -y dpkg-dev gpg
|
||||
|
||||
echo "-- Creating a new apt root folder"
|
||||
export TMP_APT_ROOT="/tmp/apt"
|
||||
cp -r "$APT_ROOT" "$TMP_APT_ROOT"
|
||||
|
||||
echo "-- Cleaning up older apt releases"
|
||||
|
||||
find "$TMP_APT_ROOT/pool" -mindepth 2 -maxdepth 2 -type d | while read reldir; do
|
||||
pkg_to_remove=$(( $(ls "$reldir"/*.deb | wc -l) - 1 ))
|
||||
[ $pkg_to_remove -le 0 ] && continue
|
||||
ls "$reldir"/*.deb | sort -V | head -n$pkg_to_remove | xargs rm -f
|
||||
done
|
||||
|
||||
echo "-- Updating Packages files"
|
||||
|
||||
echo "stable\noldstable\nubuntu" | while read distro; do
|
||||
echo "main\ndev" | while read branch; do
|
||||
branch_dir="$TMP_APT_ROOT/pool/$distro/$branch"
|
||||
echo "Checking pool folder: $branch_dir"
|
||||
[ -d "$branch_dir" ] || mkdir -p "$branch_dir"
|
||||
dist_dir="$TMP_APT_ROOT/dists/$distro/$branch/all"
|
||||
mkdir -p "$dist_dir"
|
||||
pkg_file="$dist_dir/Packages"
|
||||
dpkg-scanpackages --arch all "$branch_dir" > "$pkg_file"
|
||||
sed -i "$pkg_file" -re "s|^Filename: $TMP_APT_ROOT/|Filename: |"
|
||||
cat "$pkg_file" | gzip -9 > "$pkg_file.gz"
|
||||
echo "Generated Packages file: $pkg_file"
|
||||
cat "$pkg_file"
|
||||
done
|
||||
done
|
||||
|
||||
echo "-- Updating Release files"
|
||||
|
||||
add_hashes() {
|
||||
dist_dir=$1
|
||||
hash_cmd=$2
|
||||
hash_label=$3
|
||||
|
||||
echo "$hash_label:"
|
||||
find "$dist_dir" -name 'Packages*' | while read file; do
|
||||
basename="$(echo "$file" | sed -r -e "s|^$dist_dir/||")"
|
||||
hash="$($hash_cmd "$file" | cut -d" " -f1)"
|
||||
size="$(wc -c < $file)"
|
||||
echo " $hash $size $basename"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-i386/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-amd64/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armel/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armhf/|')"
|
||||
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-arm64/|')"
|
||||
done
|
||||
}
|
||||
|
||||
echo "stable\noldstable\nubuntu" | while read distro; do
|
||||
dist_dir="$TMP_APT_ROOT/dists/$distro"
|
||||
components=$(find "$dist_dir" -name Packages | awk -F '/' '{print $(NF-2)}' | uniq | tr '\n' ' ')
|
||||
release_file="$dist_dir/Release"
|
||||
|
||||
cat <<EOF > "$release_file"
|
||||
Origin: Platypush repository
|
||||
Label: Platypush
|
||||
Suite: $distro
|
||||
Codename: $distro
|
||||
Architectures: i386 amd64 armel armhf arm64
|
||||
Components: $components
|
||||
Description: The official APT repository for Platypush
|
||||
Date: $(date -Ru)
|
||||
EOF
|
||||
|
||||
add_hashes "$dist_dir" "md5sum" "MD5Sum" >> "$release_file"
|
||||
add_hashes "$dist_dir" "sha1sum" "SHA1" >> "$release_file"
|
||||
add_hashes "$dist_dir" "sha256sum" "SHA256" >> "$release_file"
|
||||
done
|
||||
|
||||
echo "-- Generating list files"
|
||||
mkdir -p "$TMP_APT_ROOT/lists"
|
||||
|
||||
for distro in stable oldstable ubuntu; do
|
||||
for branch in main dev; do
|
||||
echo "deb https://apt.platypush.tech/ $distro $branch" > "$TMP_APT_ROOT/lists/platypush-$distro-$branch.list"
|
||||
done
|
||||
done
|
||||
|
||||
echo "-- Updating index file"
|
||||
|
||||
cat <<EOF > "$TMP_APT_ROOT/index.txt"
|
||||
Welcome to the Platypush APT repository!
|
||||
|
||||
Project homepage: https://platypush.tech
|
||||
Source code: https://git.platypush.tech/platypush/platypush
|
||||
Documentation / API reference: https://docs.platypush.tech
|
||||
|
||||
You can use this APT repository to install Platypush on Debian, Ubuntu or any
|
||||
Debian-based distro.
|
||||
|
||||
Steps:
|
||||
|
||||
1. Add this repository's PGP key to your apt keyring
|
||||
====================================================
|
||||
|
||||
# wget -q -O \\\
|
||||
/etc/apt/trusted.gpg.d/platypush.asc \\\
|
||||
https://apt.platypush.tech/pubkey.txt
|
||||
|
||||
2. Add the repository to your sources
|
||||
=====================================
|
||||
|
||||
# wget -q -O \\\
|
||||
/etc/apt/sources.list.d/platypush.list \\\
|
||||
https://apt.platypush.tech/lists/platypush-<deb_version>-<branch>.list
|
||||
|
||||
Where:
|
||||
|
||||
- deb_version can be:
|
||||
- *stable* - current Debian stable version
|
||||
- *oldstable* - previous Debian stable version
|
||||
- *ubuntu* - latest Ubuntu version
|
||||
|
||||
- branch can be either:
|
||||
- *main* - latest stable release
|
||||
- *dev* a package always in sync with the git version
|
||||
|
||||
For example, to install the latest stable tags on Debian stable:
|
||||
|
||||
# wget -q -O \\\
|
||||
/etc/apt/sources.list.d/platypush.list \\\
|
||||
https://apt.platypush.tech/lists/platypush-stable-main.list
|
||||
|
||||
3. Update your repos
|
||||
====================
|
||||
|
||||
# apt update
|
||||
|
||||
4. Install Platypush
|
||||
====================
|
||||
|
||||
# apt install platypush
|
||||
EOF
|
||||
|
||||
echo "-- Importing and refreshing PGP key"
|
||||
echo "$PGP_PUBKEY" > "$TMP_APT_ROOT/pubkey.txt"
|
||||
export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
|
||||
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_PRIVKEY
|
||||
EOF
|
||||
|
||||
echo "-- Signing Release files"
|
||||
|
||||
find "$TMP_APT_ROOT/dists" -type f -name Release | while read file; do
|
||||
dirname="$(dirname "$file")"
|
||||
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs > "$file.gpg"
|
||||
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs --clearsign > "$dirname/InRelease"
|
||||
done
|
||||
|
||||
echo "-- Updating the apt repo root"
|
||||
export OLD_APT_ROOT="$REPOS_ROOT/oldapt"
|
||||
rm -rf "$OLD_APT_ROOT"
|
||||
mv "$APT_ROOT" "$OLD_APT_ROOT"
|
||||
mv "$TMP_APT_ROOT" "$APT_ROOT"
|
||||
|
||||
chmod -R a+r "$APT_ROOT"
|
||||
chmod a+x "$APT_ROOT"
|
|
@ -1,67 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
apk add --update --no-cache curl pacman sudo
|
||||
|
||||
. .drone/macros/configure-ssh.sh
|
||||
. .drone/macros/configure-git.sh
|
||||
|
||||
git pull --rebase origin master --tags
|
||||
|
||||
export VERSION=$(python setup.py --version)
|
||||
export HEAD=$(git log --pretty=format:%h HEAD...HEAD~1 | head -1)
|
||||
export GIT_VERSION="$VERSION.r$(git log --pretty=oneline HEAD...v$VERSION | wc -l).g${HEAD}"
|
||||
export TAG_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
|
||||
|
||||
ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null
|
||||
adduser -u 1000 -D build
|
||||
mkdir -p "$WORKDIR"
|
||||
|
||||
echo "--- Updating Arch git version"
|
||||
export PKGDIR=$WORKDIR/git
|
||||
git clone ssh://aur@aur.archlinux.org/platypush-git.git "$PKGDIR"
|
||||
git config --global --add safe.directory "$PKGDIR"
|
||||
chown -R build "$PKGDIR"
|
||||
cd "$PKGDIR"
|
||||
|
||||
sed -i 'PKGBUILD' -r \
|
||||
-e "s/^pkgver=.*/pkgver=$GIT_VERSION/" \
|
||||
-e "s/^pkgrel=.*/pkgrel=1/" \
|
||||
|
||||
sudo -u build makepkg --printsrcinfo > .SRCINFO
|
||||
export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
|
||||
|
||||
if [ $FILES_CHANGED -gt 0 ]; then
|
||||
echo "--- Pushing git package version $GIT_VERSION"
|
||||
git commit -a -m '[Automatic] Package update'
|
||||
git push origin master
|
||||
fi
|
||||
|
||||
echo "--- Updating Arch stable version"
|
||||
export PKGDIR="$WORKDIR/stable"
|
||||
git clone ssh://aur@aur.archlinux.org/platypush.git "$PKGDIR"
|
||||
git config --global --add safe.directory "$PKGDIR"
|
||||
chown -R build "$PKGDIR"
|
||||
cd "$PKGDIR"
|
||||
export RELEASED_VERSION=$(grep -e '^pkgver=' PKGBUILD | sed -r -e 's/^pkgver=(.*)\s*/\1/')
|
||||
|
||||
if [ "$RELEASED_VERSION" == "$VERSION" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
export TAG_CHECKSUM=$(curl --silent "$TAG_URL" | sha512sum | awk '{print $1}')
|
||||
|
||||
sed -i 'PKGBUILD' -r \
|
||||
-e "s/^pkgver=.*/pkgver=$VERSION/" \
|
||||
-e "s/^pkgrel=.*/pkgrel=1/" \
|
||||
-e "s/^sha512sums=.*/sha512sums=('$TAG_CHECKSUM')/"
|
||||
|
||||
sudo -u build makepkg --printsrcinfo > .SRCINFO
|
||||
export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
|
||||
|
||||
if [ $FILES_CHANGED -gt 0 ]; then
|
||||
echo "--- Pushing stable package version $VERSION"
|
||||
git commit -a -m '[Automatic] Package update'
|
||||
git push origin master
|
||||
fi
|
|
@ -1,46 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
export SKIPCI="$PWD/.skipci"
|
||||
export CACHEFILE="$PWD/platypush/components.json.gz"
|
||||
|
||||
[ -f "$SKIPCI" ] && exit 0
|
||||
|
||||
# Backup the original git configuration before changing attributes
|
||||
export GIT_CONF="$PWD/.git/config"
|
||||
export TMP_GIT_CONF="/tmp/git.config.orig"
|
||||
cp "$GIT_CONF" "$TMP_GIT_CONF"
|
||||
|
||||
. .drone/macros/configure-git.sh
|
||||
|
||||
# Only regenerate the components cache if either the plugins, backends,
|
||||
# events or schemas folders have some changes (excluding the webapp files).
|
||||
if [ -z "$(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE -- platypush/backend platypush/plugins platypush/schemas platypush/message/event ':(exclude)platypush/backend/http/webapp')" ]; then
|
||||
echo 'No changes to the components file'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
. .drone/macros/configure-ssh.sh
|
||||
. .drone/macros/configure-gpg.sh
|
||||
|
||||
echo 'Updating components cache'
|
||||
apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
|
||||
pip install . --break-system-packages
|
||||
|
||||
python - <<EOF
|
||||
from platypush import get_plugin
|
||||
|
||||
get_plugin('inspect').refresh_cache(force=True)
|
||||
EOF
|
||||
|
||||
# Create a .skipci file to mark the fact that the next steps should be skipped
|
||||
# (we're going to do another push anyway, so another pipeline will be triggered)
|
||||
touch "$SKIPCI"
|
||||
|
||||
git add "$CACHEFILE"
|
||||
git commit "$CACHEFILE" -S -m "[Automatic] Updated components cache" --no-verify
|
||||
git remote rm origin
|
||||
git remote add origin git@git.platypush.tech:platypush/platypush.git
|
||||
git push -f origin master
|
||||
|
||||
# Restore the original git configuration
|
||||
mv "$TMP_GIT_CONF" "$GIT_CONF"
|
|
@ -1,103 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
echo "-- Copying source directory"
|
||||
mkdir -p "$WORKDIR/src"
|
||||
export SRCDIR="$WORKDIR/src/$DEB_VERSION"
|
||||
cp -r "$PWD" "$SRCDIR"
|
||||
cd "$SRCDIR"
|
||||
|
||||
echo "-- Installing dependencies"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt update
|
||||
apt install -y curl dpkg-dev gpg git python3 python3-pip python3-setuptools
|
||||
|
||||
echo "--- Parsing metadata"
|
||||
git config --global --add safe.directory "$PWD"
|
||||
git pull --rebase origin master --tags
|
||||
export VERSION=$(python3 setup.py --version)
|
||||
export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
|
||||
export GIT_BUILD_DIR="$WORKDIR/${PKG_NAME}_${GIT_VERSION}_all"
|
||||
export GIT_DEB="$WORKDIR/${PKG_NAME}_${GIT_VERSION}_all.deb"
|
||||
export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
|
||||
|
||||
echo "--- Building git package"
|
||||
pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
|
||||
|
||||
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
|
||||
base="$(dirname "$dir")"
|
||||
mv "$dir" "$base/dist-packages"
|
||||
done
|
||||
|
||||
install -m755 -d "${GIT_BUILD_DIR}/usr/lib/systemd/system"
|
||||
install -m755 -d "${GIT_BUILD_DIR}/usr/lib/systemd/user"
|
||||
install -m750 -d "${GIT_BUILD_DIR}/var/lib/platypush"
|
||||
install -m750 -d "${GIT_BUILD_DIR}/etc/platypush/scripts"
|
||||
|
||||
install -m644 "${SRCDIR}/platypush/config/config.yaml" "${GIT_BUILD_DIR}/etc/platypush/config.yaml"
|
||||
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${GIT_BUILD_DIR}/usr/lib/systemd/user/platypush.service"
|
||||
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${GIT_BUILD_DIR}/usr/lib/systemd/system/platypush.service"
|
||||
sed -i "${GIT_BUILD_DIR}/usr/lib/systemd/system/platypush.service" -r \
|
||||
-e 's/^#\s*Requires=(.*)/Requires=\1/' \
|
||||
-e 's/^\[Service\]$/\[Service\]\
|
||||
User=platypush\
|
||||
Group=platypush\
|
||||
WorkingDirectory=\/var\/lib\/platypush\
|
||||
Environment="PLATYPUSH_CONFIG=\/etc\/platypush\/config.yaml"\
|
||||
Environment="PLATYPUSH_WORKDIR=\/var\/lib\/platypush"/'
|
||||
|
||||
mkdir -p "$GIT_BUILD_DIR/DEBIAN"
|
||||
|
||||
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
|
||||
Package: $PKG_NAME
|
||||
Version: $GIT_VERSION
|
||||
Maintainer: Fabio Manganiello <fabio@platypush.tech>
|
||||
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
|
||||
Architecture: all
|
||||
Homepage: https://platypush.tech
|
||||
Description: Universal command executor and automation hub.
|
||||
EOF
|
||||
|
||||
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/postinst" && chmod +x "$GIT_BUILD_DIR/DEBIAN/postinst"
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
if [ "\$1" = "configure" ]; then
|
||||
grep -e '^platypush:' /etc/passwd 2>/dev/null || useradd -U -r -s /bin/false -d /var/lib/platypush platypush
|
||||
mkdir -p /var/lib/platypush
|
||||
chown -R platypush:platypush /var/lib/platypush
|
||||
chown -R platypush:platypush /etc/platypush
|
||||
if which systemctl; then systemctl daemon-reload; fi
|
||||
fi
|
||||
EOF
|
||||
|
||||
mkdir -p "$POOL_PATH"
|
||||
rm -f "$POOL_PATH/"*.deb
|
||||
dpkg --build "$GIT_BUILD_DIR"
|
||||
|
||||
echo "--- Copying $GIT_DEB to $POOL_PATH"
|
||||
cp "$GIT_DEB" "$POOL_PATH"
|
||||
|
||||
# If main/all/Packages doesn't exist, then we should create the first main release
|
||||
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/${PKG_NAME}_${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
|
||||
|
||||
export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
|
||||
|
||||
[ -z "$UPDATE_STABLE_PKG" ] &&
|
||||
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
|
||||
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
|
||||
|
||||
# If the published release version differs from the current one, then we should publish a new main release
|
||||
if [ -z "$UPDATE_STABLE_PKG" ]; then
|
||||
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
|
||||
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
|
||||
fi
|
||||
|
||||
# Proceed and update the main release if the version number has changed
|
||||
if [ -n "$UPDATE_STABLE_PKG" ]; then
|
||||
echo "--- Updating main package"
|
||||
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
|
||||
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/${PKG_NAME}_${VERSION}-1_all.deb"
|
||||
fi
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
apk add --update --no-cache py3-twine py3-setuptools py3-wheel py3-pip
|
||||
python setup.py sdist bdist_wheel
|
||||
twine upload dist/platypush-$(python setup.py --version).tar.gz
|
|
@ -1,261 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -f .skipci ] && exit 0
|
||||
|
||||
echo "-- Installing dependencies"
|
||||
yum install -y \
|
||||
createrepo \
|
||||
git \
|
||||
gpg \
|
||||
python \
|
||||
python-pip \
|
||||
python-setuptools \
|
||||
rpm-build \
|
||||
rpm-sign \
|
||||
systemd-rpm-macros \
|
||||
wget \
|
||||
yum-utils \
|
||||
|
||||
echo "-- Copying source directory"
|
||||
mkdir -p "$WORKDIR"
|
||||
export SRCDIR="$WORKDIR/src"
|
||||
cp -r "$PWD" "$SRCDIR"
|
||||
cd "$SRCDIR"
|
||||
mkdir -p "$RPM_ROOT"
|
||||
|
||||
echo "--- Parsing metadata"
|
||||
git config --global --add safe.directory $PWD
|
||||
git pull --rebase origin master --tags
|
||||
export VERSION=$(python3 setup.py --version)
|
||||
export RELNUM="$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
|
||||
export SPECFILE="$WORKDIR/$PKG_NAME.spec"
|
||||
export BUILD_DIR="$WORKDIR/build"
|
||||
export TMP_RPM_ROOT="$WORKDIR/repo"
|
||||
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/master.tar.gz"
|
||||
|
||||
echo "--- Creating git package spec"
|
||||
|
||||
cat <<EOF > $SPECFILE
|
||||
Summary: Universal command executor and automation hub.
|
||||
Name: $PKG_NAME-git
|
||||
Version: $VERSION
|
||||
Release: $RELNUM
|
||||
URL: https://platypush.tech
|
||||
Group: System
|
||||
License: MIT
|
||||
Packager: Fabio Manganiello <fabio@platypush.tech>
|
||||
Source: $SRC_URL
|
||||
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
|
||||
Conflicts: $PKG_NAME
|
||||
Prefix: %{_prefix}
|
||||
BuildRoot: %{_tmppath}/%{name}-root
|
||||
BuildRequires: systemd-rpm-macros
|
||||
%{?sysusers_requires_compat}
|
||||
|
||||
%description
|
||||
Universal command executor and automation hub.
|
||||
|
||||
%install
|
||||
mkdir -p %{buildroot}/
|
||||
cp -r "$BUILD_DIR"/* %{buildroot}/
|
||||
install -p -Dm0644 "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf" %{buildroot}%{_sysusersdir}/platypush.conf
|
||||
|
||||
%pre
|
||||
%sysusers_create_compat "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
|
||||
|
||||
%clean
|
||||
|
||||
%files
|
||||
%defattr(750,platypush,platypush,750)
|
||||
%dir /etc/platypush
|
||||
/etc/platypush/*
|
||||
/usr/bin/*
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
|
||||
/usr/lib/systemd/system/*
|
||||
/usr/lib/systemd/user/*
|
||||
%defattr(750,platypush,platypush,750)
|
||||
%dir /var/lib/platypush
|
||||
%{_sysusersdir}/platypush.conf
|
||||
|
||||
%changelog
|
||||
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
|
||||
- [Automatic] Release $VERSION-$RELNUM
|
||||
EOF
|
||||
|
||||
echo "--- Building git package"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
|
||||
pip install --prefix="$BUILD_DIR/usr" --no-cache --no-deps .
|
||||
|
||||
install -m755 -d "${BUILD_DIR}/usr/lib/systemd/system"
|
||||
install -m755 -d "${BUILD_DIR}/usr/lib/systemd/user"
|
||||
install -m755 -d "${BUILD_DIR}/usr/lib/sysusers.d"
|
||||
install -m750 -d "${BUILD_DIR}/var/lib/platypush"
|
||||
install -m750 -d "${BUILD_DIR}/etc/platypush/scripts"
|
||||
|
||||
install -m644 "${SRCDIR}/platypush/config/config.yaml" "${BUILD_DIR}/etc/platypush/config.yaml"
|
||||
install -Dm644 "${SRCDIR}/platypush/config/systemd/platypush-sysusers.conf" "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
|
||||
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${BUILD_DIR}/usr/lib/systemd/user/platypush.service"
|
||||
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${BUILD_DIR}/usr/lib/systemd/system/platypush.service"
|
||||
sed -i "${BUILD_DIR}/usr/lib/systemd/system/platypush.service" -r \
|
||||
-e 's/^#\s*Requires=(.*)/Requires=\1/' \
|
||||
-e 's/^\[Service\]$/\[Service\]\
|
||||
User=platypush\
|
||||
Group=platypush\
|
||||
WorkingDirectory=\/var\/lib\/platypush\
|
||||
Environment="PLATYPUSH_CONFIG=\/etc\/platypush\/config.yaml"\
|
||||
Environment="PLATYPUSH_WORKDIR=\/var\/lib\/platypush"/'
|
||||
|
||||
rpmbuild --target "noarch" -bb "$SPECFILE"
|
||||
|
||||
echo "--- Copying the new RPM package"
|
||||
mkdir -p "$TMP_RPM_ROOT"
|
||||
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-git-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
|
||||
|
||||
echo "--- Checking the latest released stable version"
|
||||
export LATEST_STABLE_PKG=$(ls -rt "$RPM_ROOT/$PKG_NAME"*.rpm 2>/dev/null | grep -v "$PKG_NAME-git" | tail -1)
|
||||
|
||||
if [ -z "$LATEST_STABLE_PKG" ]; then
|
||||
# If not stable release is available, then create one
|
||||
export UPDATE_STABLE_PKG=1
|
||||
else
|
||||
# Otherwise, create a new release if the reported version on the repo is different
|
||||
# from the latest released version.
|
||||
export LATEST_STABLE_VERSION=$(basename $LATEST_STABLE_PKG | cut -d- -f 2)
|
||||
if [ "$VERSION" != "$LATEST_STABLE_VERSION" ]; then
|
||||
export UPDATE_STABLE_PKG=1
|
||||
else
|
||||
# If the version has remained the same, then simply copy the existing RPM to the
|
||||
# new repository directory.
|
||||
echo "Copying the existing release $LATEST_STABLE_VERSION to the new repository"
|
||||
cp "$LATEST_STABLE_PKG" "$TMP_RPM_ROOT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# If a new stable release is required, build another RPM
|
||||
if [ -n "$UPDATE_STABLE_PKG" ]; then
|
||||
export RELNUM=1
|
||||
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
|
||||
|
||||
cat <<EOF > $SPECFILE
|
||||
Summary: Universal command executor and automation hub.
|
||||
Name: $PKG_NAME
|
||||
Version: $VERSION
|
||||
Release: $RELNUM
|
||||
URL: https://platypush.tech
|
||||
Group: System
|
||||
License: MIT
|
||||
Packager: Fabio Manganiello <fabio@platypush.tech>
|
||||
Source: $SRC_URL
|
||||
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
|
||||
Conflicts: $PKG_NAME-git
|
||||
Prefix: %{_prefix}
|
||||
BuildRoot: %{_tmppath}/%{name}-root
|
||||
BuildRequires: systemd-rpm-macros
|
||||
%{?sysusers_requires_compat}
|
||||
|
||||
%description
|
||||
Universal command executor and automation hub.
|
||||
|
||||
%install
|
||||
mkdir -p %{buildroot}/
|
||||
cp -r "$BUILD_DIR"/* %{buildroot}/
|
||||
install -p -Dm0644 "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf" %{buildroot}%{_sysusersdir}/platypush.conf
|
||||
|
||||
%pre
|
||||
%sysusers_create_compat "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
|
||||
|
||||
%clean
|
||||
|
||||
%files
|
||||
%defattr(750,platypush,platypush,750)
|
||||
%dir /etc/platypush
|
||||
/etc/platypush/*
|
||||
/usr/bin/*
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
|
||||
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
|
||||
/usr/lib/systemd/system/*
|
||||
/usr/lib/systemd/user/*
|
||||
%defattr(750,platypush,platypush,750)
|
||||
%dir /var/lib/platypush
|
||||
%{_sysusersdir}/platypush.conf
|
||||
|
||||
%changelog
|
||||
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
|
||||
- [Automatic] Release $VERSION-$RELNUM
|
||||
EOF
|
||||
|
||||
echo "--- Building package for stable release $VERSION"
|
||||
rpmbuild --target "noarch" -bb "$SPECFILE"
|
||||
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
|
||||
fi
|
||||
|
||||
echo "--- Importing the repository keys"
|
||||
cat <<EOF | gpg --import --armor
|
||||
$PGP_PRIVKEY
|
||||
EOF
|
||||
|
||||
export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
|
||||
cat <<EOF > $HOME/.rpmmacros
|
||||
%signature gpg
|
||||
%_gpg_name $PGP_KEYID
|
||||
EOF
|
||||
|
||||
echo "--- Signing the new RPM packages"
|
||||
rpm --addsign "$TMP_RPM_ROOT"/*.rpm
|
||||
|
||||
echo "--- Creating a new copy of the RPM repository"
|
||||
createrepo "$TMP_RPM_ROOT"
|
||||
gpg --detach-sign --armor "$TMP_RPM_ROOT/repodata/repomd.xml"
|
||||
|
||||
cat <<EOF > "$TMP_RPM_ROOT/platypush.repo"
|
||||
[platypush]
|
||||
name=Platypush repository
|
||||
baseurl=https://rpm.platypush.tech
|
||||
enabled=1
|
||||
type=rpm
|
||||
gpgcheck=1
|
||||
gpgkey=https://rpm.platypush.tech/pubkey.txt
|
||||
EOF
|
||||
|
||||
cat <<EOF > "$TMP_RPM_ROOT/index.txt"
|
||||
Welcome to the Platypush RPM repository!
|
||||
|
||||
Project homepage: https://platypush.tech
|
||||
Source code: https://git.platypush.tech/platypush/platypush
|
||||
Documentation / API reference: https://docs.platypush.tech
|
||||
|
||||
You can use this RPM repository to install Platypush on Fedora or other
|
||||
RPM-based distros - as long as they are compatible with the latest Fedora
|
||||
release.
|
||||
|
||||
Steps:
|
||||
|
||||
1. Add the repository to your sources
|
||||
=====================================
|
||||
|
||||
# yum config-manager --add-repo https://rpm.platypush.tech/platypush.repo
|
||||
|
||||
2. Install Platypush
|
||||
====================
|
||||
|
||||
# yum install platypush
|
||||
|
||||
Or, if you want to install a version always up-to-date with the git repo:
|
||||
|
||||
# yum install platypush-git
|
||||
EOF
|
||||
|
||||
cat <<EOF > "$TMP_RPM_ROOT/pubkey.txt"
|
||||
$PGP_PUBKEY
|
||||
EOF
|
||||
|
||||
echo "--- Updating the repository"
|
||||
export NEW_RPM_ROOT="$REPOS_ROOT/rpm_new"
|
||||
export OLD_RPM_ROOT="$REPOS_ROOT/rpm_old"
|
||||
cp -r "$TMP_RPM_ROOT" "$NEW_RPM_ROOT"
|
||||
rm -rf "$TMP_RPM_ROOT"
|
||||
mv "$RPM_ROOT" "$OLD_RPM_ROOT"
|
||||
mv "$NEW_RPM_ROOT" "$RPM_ROOT"
|
||||
rm -rf "$OLD_RPM_ROOT"
|
22
.env.example
22
.env.example
|
@ -1,22 +0,0 @@
|
|||
# The device ID is the unique identifier for the device that runs Platypush.
|
||||
# You should make sure that it's unique at least within your local network,
|
||||
# as it is used to identify the device in the MQTT topics, on the HTTP API
|
||||
# and on the published ZeroConf services.
|
||||
PLATYPUSH_DEVICE_ID=platypush
|
||||
|
||||
# Use an external Redis server for the message queue. By default, the Platypush
|
||||
# container will run a Redis server on the same container. Also remove the
|
||||
# `--start-redis` option from the `docker run` command if you want to use an
|
||||
# external Redis server.
|
||||
# PLATYPUSH_REDIS_HOST=localhost
|
||||
# PLATYPUSH_REDIS_PORT=6379
|
||||
|
||||
# Custom location for the Platypush configuration file.
|
||||
# PLATYPUSH_CONFIG=/etc/platypush/config.yaml
|
||||
|
||||
# Custom location for the Platypush working directory.
|
||||
# PLATYPUSH_WORKDIR=/var/lib/platypush
|
||||
|
||||
# SQLAlchemy database URL. By default, the Platypush container will run on a
|
||||
# SQLite database installed under <WORKDIR>/main.db. If you want
|
||||
# PLATYPUSH_DB=sqlite:////var/lib/platypush/main.db
|
|
@ -28,4 +28,3 @@ Session.vim
|
|||
/docs/source/wiki
|
||||
/.skipci
|
||||
dump.rdb
|
||||
.env
|
||||
|
|
178
CHANGELOG.md
178
CHANGELOG.md
|
@ -1,180 +1,8 @@
|
|||
# Changelog
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
- [[#281](https://git.platypush.tech/platypush/platypush/issues/281)]
|
||||
replaced `warnings.warn` with `logging.warning`, as there is no easy and
|
||||
reliable way of routing `warnings.warn` to `logging`.
|
||||
|
||||
## [1.1.0] - 2024-06-06
|
||||
|
||||
- [[#405](https://git.platypush.tech/platypush/platypush/issues/405)] Fixed
|
||||
timezone/timestamp rendering issues for `calendar.ical` events.
|
||||
- [[#403]((https://git.platypush.tech/platypush/platypush/issues/403))]
|
||||
Included inherited actions in plugins docs.
|
||||
|
||||
## [1.0.7] - 2024-06-02
|
||||
|
||||
- [[#384]((https://git.platypush.tech/platypush/platypush/issues/384))] Added
|
||||
`assistant.openai` and `tts.openai` plugins.
|
||||
|
||||
## [1.0.6] - 2024-06-01
|
||||
|
||||
- 🐛 Bug fix on one of the entities modules that prevented the application from
|
||||
loading when `.` is part of `PYTHONPATH`.
|
||||
|
||||
## [1.0.5] - 2024-06-01
|
||||
|
||||
- A proper solution for the `utcnow()` issue.
|
||||
|
||||
It was a bit trickier than expected to solve, but now Platypush uses a
|
||||
`utcnow()` facade that always returns a UTC datetime in a timezone-aware
|
||||
representation.
|
||||
|
||||
The code should however also handle the case of timestamps stored on the db in
|
||||
the old format.
|
||||
|
||||
## [1.0.4] - 2024-05-31
|
||||
|
||||
- Fixed regression introduced by
|
||||
[c18768e61fef62924f4c1fac3089ecfb83666dab](https://git.platypush.tech/platypush/platypush/commit/c18768e61fef62924f4c1fac3089ecfb83666dab).
|
||||
Python seems to have introduced a breaking change from the version 3.12 -
|
||||
`datetime.utcnow()` is not deprecated, but `datetime.UTC`, the suggested
|
||||
alternative, isn't available on older versions of Python. Added a workaround
|
||||
that makes Platypush compatible with both the implementations.
|
||||
|
||||
## [1.0.3] - 2024-05-31
|
||||
|
||||
- [[#368](https://git.platypush.tech/platypush/platypush/issues/368)] Added
|
||||
Ubuntu packages.
|
||||
|
||||
- Fixed bug that didn't get hooks to match events imported through the new
|
||||
`platypush.events` symlinked module.
|
||||
|
||||
## [1.0.2] - 2024-05-26
|
||||
|
||||
- Fixed regression introduced by the support of custom names through the
|
||||
`@procedure` decorator.
|
||||
|
||||
## [1.0.0] - 2024-05-26
|
||||
|
||||
Many, many changes for the first major release of Platypush after so many
|
||||
years.
|
||||
|
||||
- [!3](https://git.platypush.tech/platypush/platypush/milestone/3) All
|
||||
backends, except for `http`, `nodered`, `redis` and `tcp`, are gone. Many
|
||||
were already deprecated a while ago, but the change now applies to all of
|
||||
them. Backends should only be components that actively listen for application
|
||||
messages to process, not generic daemon threads for integrations. This had
|
||||
been a source of confusion for a long time. Backends and plugins are now
|
||||
merged, meaning that you won't need to configure two different sections
|
||||
instead of one for many integrations (one for the stateless plugin, and one
|
||||
for the background state listener). Please check the
|
||||
[documentation](https://docs.platypush.tech) to verify the configuration
|
||||
changes required by your integrations. This has been a long process that has
|
||||
involved the rewrite of most of the integrations, and many bugs have been
|
||||
fixed.
|
||||
|
||||
- Improved Docker support - now with a default `docker-compose.yml`, multiple
|
||||
Dockerfiles for
|
||||
[Alpine](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/alpine.Dockerfile),
|
||||
[Debian](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/debian.Dockerfile),
|
||||
[Ubuntu](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/ubuntu.Dockerfile)
|
||||
and
|
||||
[Fedora](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/fedora.Dockerfile)
|
||||
base images. Many improvements on the `platydock` and `platyvenv` scripts
|
||||
too, with better automated installation processes for optional dependencies.
|
||||
|
||||
- Added [official
|
||||
packages](https://git.platypush.tech/platypush/platypush#system-package-manager-installation)
|
||||
for
|
||||
[Debian](https://git.platypush.tech/platypush/platypush#debian-ubuntu)
|
||||
and [Fedora](https://git.platypush.tech/platypush/platypush#fedora).
|
||||
|
||||
- Added `--device-id`, `--workdir`, `--logsdir`, `--cachedir`, `--main-db`,
|
||||
`--redis-host`, `--redis-port` and `--redis-queue` CLI arguments, along the
|
||||
`PLATYPUSH_DEVICE_ID`, `PLATYPUSH_WORKDIR`, `PLATYPUSH_LOGSDIR`,
|
||||
`PLATYPUSH_CACHEDIR`, `PLATYPUSH_DB`, `PLATYPUSH_REDIS_HOST`,
|
||||
`PLATYPUSH_REDIS_PORT` and `PLATYPUSH_REDIS_QUEUE` environment variables.
|
||||
|
||||
- Added an _Extensions_ panel to the UI to dynamically:
|
||||
- Install new dependencies directly from the Web view.
|
||||
- Explore the documentation as well as the supported actions and events for
|
||||
each plugin.
|
||||
- Get ready-to-paste configuration snippets/templates.
|
||||
|
||||
- New, completely rewritten [documentation](https://docs.platypush.tech), which
|
||||
now integrates the wiki, dynamically includes plugins configuration snippets
|
||||
and dependencies, and adds a global filter bar for the integrations.
|
||||
|
||||
- [[#394](https://git.platypush.tech/platypush/platypush/issues/394)] A more
|
||||
intuitive way of installing extra dependencies via `pip`. Instead of a static
|
||||
list that the user should check inside of `setup.py`, the syntax `pip install
|
||||
'platypush[plugin1,plugin2,...]'` is now supported.
|
||||
|
||||
- No more need to manually create `__init__.py` in each of the `scripts`
|
||||
folders that you want to use to store your custom scripts. Automatic
|
||||
discovery of scripts and creation of module files has been implemented. You
|
||||
can now just drop a `.py` script with your procedures, hooks or crons in the
|
||||
scripts folder and it should be picked up by the application.
|
||||
|
||||
- The _Execute_ Web panel now supports procedures too, as well as curl snippets.
|
||||
|
||||
- Removed all `Response` objects outside of the root type. They are now all
|
||||
replaced by Marshmallow schemas with the structure automatically generated in
|
||||
the documentation.
|
||||
|
||||
- [`alarm`] [[#340](https://git.platypush.tech/platypush/platypush/issues/340)]
|
||||
Rewritten integration. It now includes a powerful UI panel to set up alarms
|
||||
with custom procedures too.
|
||||
|
||||
- [`assistant.picovoice`]
|
||||
[[#304](https://git.platypush.tech/platypush/platypush/issues/304)] New
|
||||
all-in-one Picovoice integration that replaces the previous `stt.picovoice.*`
|
||||
integrations.
|
||||
|
||||
- [`youtube`]
|
||||
[[#337](https://git.platypush.tech/platypush/platypush/issues/337)] Full
|
||||
rewrite of the plugin. It now supports Piped instances instead of the
|
||||
official YouTube API. A new UI has also been designed to explore
|
||||
subscriptions, playlists and channels.
|
||||
|
||||
- [`weather.*`]
|
||||
[[#308](https://git.platypush.tech/platypush/platypush/issues/308)] Removed
|
||||
the `weather.darksky` integration (it's now owned by Apple and the API is
|
||||
basically dead) and enhanced the `weather.openweathermap` plugin instead.
|
||||
|
||||
- [`camera.pi*`] The old `camera.pi` integration based on the deprecated
|
||||
`picamera` module has been moved to `camera.pi.legacy`. `camera.pi` is now a
|
||||
new plugin which uses the new `picamera2` API (and it's so far only
|
||||
compatible with recent versions on the Raspberry Pi OS).
|
||||
|
||||
- Dynamically auto-generate plugins documentation in the UI from the RST
|
||||
docstrings.
|
||||
|
||||
- New design for the configuration panel.
|
||||
|
||||
- Better synchronization between processes on threads on application stop -
|
||||
greatly reduced the risk of hanging processes on shutdown.
|
||||
|
||||
- Migrated all CI/CD pipelines to [Drone
|
||||
CI](https://ci-cd.platypush.tech/platypush/platypush).
|
||||
|
||||
- Removed `google.fit` integration, as Google has deprecated the API.
|
||||
|
||||
- Removed `wiimote` integration: the `cwiid` library hasn't been updated in
|
||||
years, it doesn't even work well with Python 3, and I'm not in the mood of
|
||||
bringing it back from the dead.
|
||||
|
||||
- Removed `stt.deepspeech` integration. That project has been basically
|
||||
abandoned by Mozilla, the libraries are very buggy and I don't think it's
|
||||
going to see new developments any time soon.
|
||||
|
||||
- [[#297](https://git.platypush.tech/platypush/platypush/issues/297)] Removed
|
||||
`spotify` backend integration based on Librespot. The project has gone
|
||||
through a lot of changes, and I no longer have a Spotify premium account to
|
||||
work on a new implementation. Open to contributions if somebody still wants
|
||||
it.
|
||||
All notable changes to this project will be documented in this file.
|
||||
Given the high speed of development in the first phase, changes are being
|
||||
reported only starting from v0.20.2.
|
||||
|
||||
## [0.50.3] - 2023-07-22
|
||||
|
||||
|
|
|
@ -27,9 +27,13 @@ Guidelines:
|
|||
you are changing some of the core entities (e.g. requests, events, procedures, hooks, crons
|
||||
or the bus) then make sure to add tests and not to break the existing tests.
|
||||
|
||||
- If the feature requires an optional dependency then make sure to document it
|
||||
in the `manifest.json` - refer to the Wiki (how to write
|
||||
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
|
||||
and
|
||||
[backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
|
||||
for examples on how to write an extension manifest file.
|
||||
- If the feature requires an optional dependency then make sure to document it:
|
||||
|
||||
- In the class docstring (see other plugins and backends for examples).
|
||||
- In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
|
||||
an `extras_require` entry.
|
||||
- In the plugin/backend class pydoc string.
|
||||
- In the `manifest.yaml` - refer to the Wiki (how to write
|
||||
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
|
||||
and [backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
|
||||
for examples on how to write an extension manifest file.
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
platypush/install/docker/alpine.Dockerfile
|
|
@ -2,6 +2,5 @@ recursive-include platypush/backend/http/webapp/dist *
|
|||
recursive-include platypush/install *
|
||||
include platypush/plugins/http/webpage/mercury-parser.js
|
||||
include platypush/config/*.yaml
|
||||
include platypush/config/systemd/*
|
||||
global-include manifest.json
|
||||
global-include manifest.yaml
|
||||
global-include components.json.gz
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
services:
|
||||
platypush:
|
||||
restart: "always"
|
||||
command:
|
||||
- platypush
|
||||
# Comment --start-redis if you want to run an external Redis service
|
||||
# In such case you'll also have to ensure that the appropriate Redis
|
||||
# variables are set in the .env file, or the Redis configuration is
|
||||
# passed in the config.yaml, or use the --redis-host and --redis-port
|
||||
# command-line options
|
||||
- --start-redis
|
||||
|
||||
# Custom list of host devices that should be accessible to the container -
|
||||
# e.g. an Arduino, an ESP-compatible microcontroller, a joystick etc.
|
||||
# devices:
|
||||
# - /dev/ttyUSB0
|
||||
|
||||
# Uncomment if you need plugins that require access to low-level hardware
|
||||
# (e.g. Bluetooth BLE or GPIO/SPI/I2C) if access to individual devices is
|
||||
# not enough or isn't practical
|
||||
# privileged: true
|
||||
|
||||
build:
|
||||
context: .
|
||||
# Alpine base image
|
||||
dockerfile: ./platypush/install/docker/alpine.Dockerfile
|
||||
# Debian base image
|
||||
# dockerfile: ./platypush/install/docker/debian.Dockerfile
|
||||
# Ubuntu base image
|
||||
# dockerfile: ./platypush/install/docker/ubuntu.Dockerfile
|
||||
# Fedora base image
|
||||
# dockerfile: ./platypush/install/docker/fedora.Dockerfile
|
||||
|
||||
# Copy .env.example to .env and modify as needed
|
||||
# env_file:
|
||||
# - .env
|
||||
|
||||
ports:
|
||||
# Comment if you don't have the HTTP backend enable or you don't want to
|
||||
# expose it
|
||||
- "8008:8008"
|
||||
|
||||
volumes:
|
||||
- /path/to/your/config.yaml:/etc/platypush
|
||||
- /path/to/a/workdir:/var/lib/platypush
|
||||
# - /path/to/a/cachedir:/var/cache/platypush
|
|
@ -159,7 +159,7 @@ class IntegrationEnricher:
|
|||
base_path,
|
||||
*doc.split(os.sep)[:-1],
|
||||
*doc.split(os.sep)[-1].split('.'),
|
||||
'manifest.json',
|
||||
'manifest.yaml',
|
||||
)
|
||||
|
||||
if not os.path.isfile(manifest_file):
|
||||
|
|
|
@ -152,7 +152,7 @@ const generateComponentsGrid = () => {
|
|||
return
|
||||
}
|
||||
|
||||
if (window.location.pathname === '/' || window.location.pathname.endsWith('/index.html')) {
|
||||
if (window.location.pathname.endsWith('/index.html')) {
|
||||
if (tocWrappers.length < 2) {
|
||||
return
|
||||
}
|
||||
|
@ -188,62 +188,9 @@ const renderActionsList = () => {
|
|||
})
|
||||
}
|
||||
|
||||
const createFilterBar = () => {
|
||||
const input = document.createElement('input')
|
||||
const referenceSection = document.getElementById('reference')
|
||||
|
||||
input.type = 'text'
|
||||
input.placeholder = 'Filter'
|
||||
input.classList.add('filter-bar')
|
||||
input.addEventListener('input', (event) => {
|
||||
const filter = event.target.value.toLowerCase()
|
||||
referenceSection.querySelectorAll('ul.grid li').forEach((li) => {
|
||||
if (li.innerText.toLowerCase().includes(filter)) {
|
||||
li.style.display = 'flex'
|
||||
} else {
|
||||
li.style.display = 'none'
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
return input
|
||||
}
|
||||
|
||||
const addFilterBar = () => {
|
||||
const container = document.querySelector('.bd-main')
|
||||
if (!container)
|
||||
return
|
||||
|
||||
const referenceSection = document.getElementById('reference')
|
||||
if (!referenceSection)
|
||||
return
|
||||
|
||||
const header = referenceSection.querySelector('h2')
|
||||
if (!header)
|
||||
return
|
||||
|
||||
const origInnerHTML = header.innerHTML
|
||||
header.innerHTML = '<span class="header-content">' + origInnerHTML + '</span>'
|
||||
|
||||
const input = createFilterBar()
|
||||
header.appendChild(input)
|
||||
|
||||
const headerOffsetTop = header.offsetTop
|
||||
|
||||
// Apply the fixed class if the header is above the viewport
|
||||
document.addEventListener('scroll', () => {
|
||||
if (headerOffsetTop < window.scrollY) {
|
||||
header.classList.add('fixed')
|
||||
} else {
|
||||
header.classList.remove('fixed')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
generateComponentsGrid()
|
||||
convertDepsToTabs()
|
||||
addClipboardToCodeBlocks()
|
||||
renderActionsList()
|
||||
addFilterBar()
|
||||
})
|
||||
|
|
|
@ -29,18 +29,15 @@ a.grid-title {
|
|||
|
||||
ul.grid li {
|
||||
display: flex;
|
||||
background: linear-gradient(0deg, #fff, #f9f9f9);
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin: 0 10px 10px 0;
|
||||
padding: 20px;
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 15px;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
ul.grid img {
|
||||
width: 48px;
|
||||
width: 32px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
|
@ -55,20 +52,13 @@ ul.grid li code .pre {
|
|||
}
|
||||
|
||||
ul.grid li:hover {
|
||||
background: linear-gradient(0deg, #157765, #cbffd8) !important;
|
||||
background: linear-gradient(0deg, #e0ffe8, #e3ffff);
|
||||
}
|
||||
|
||||
ul.grid li a {
|
||||
width: 100%;
|
||||
width: calc(100% - 35px);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
ul.grid li:hover a,
|
||||
ul.grid li:hover a > code {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
ul.grid li a code {
|
||||
|
@ -138,51 +128,3 @@ ul.grid .icon {
|
|||
border-radius: 0 0 0.75em 0.75em;
|
||||
}
|
||||
|
||||
.bd-article-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.filter-bar {
|
||||
width: 100%;
|
||||
display: block;
|
||||
font-size: 0.6em;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 0.75em;
|
||||
margin: 0.5em 0;
|
||||
padding: 0.25em;
|
||||
}
|
||||
|
||||
#reference h2.fixed {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
background: white;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#reference h2.fixed .header-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
#reference h2.fixed {
|
||||
width: 100%;
|
||||
margin-left: -0.5em;
|
||||
padding: 0.5em 0.5em 0 0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 959px) {
|
||||
#reference h2.fixed {
|
||||
width: 100%;
|
||||
margin-left: -1em;
|
||||
padding: 0.5em 0.5em 0 0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 960px) {
|
||||
#reference h2.fixed {
|
||||
width: 75%;
|
||||
max-width: 800px;
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,9 @@ Backends
|
|||
:caption: Backends:
|
||||
|
||||
platypush/backend/http.rst
|
||||
platypush/backend/midi.rst
|
||||
platypush/backend/nodered.rst
|
||||
platypush/backend/redis.rst
|
||||
platypush/backend/stt.picovoice.hotword.rst
|
||||
platypush/backend/stt.picovoice.speech.rst
|
||||
platypush/backend/tcp.rst
|
||||
|
|
|
@ -21,7 +21,7 @@ sys.path.insert(0, os.path.abspath("./_ext"))
|
|||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = 'Platypush'
|
||||
copyright = '2017-2024, Fabio Manganiello'
|
||||
copyright = '2017-2023, Fabio Manganiello'
|
||||
author = 'Fabio Manganiello <fabio@manganiello.tech>'
|
||||
|
||||
# The short X.Y version
|
||||
|
@ -199,7 +199,6 @@ intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
|
|||
autodoc_default_options = {
|
||||
'members': True,
|
||||
'show-inheritance': True,
|
||||
'inherited-members': True,
|
||||
}
|
||||
|
||||
sys.path.insert(0, os.path.abspath('../..'))
|
||||
|
|
|
@ -24,6 +24,7 @@ Events
|
|||
platypush/events/geo.rst
|
||||
platypush/events/github.rst
|
||||
platypush/events/google.rst
|
||||
platypush/events/google.fit.rst
|
||||
platypush/events/google.pubsub.rst
|
||||
platypush/events/gotify.rst
|
||||
platypush/events/gpio.rst
|
||||
|
@ -73,6 +74,7 @@ Events
|
|||
platypush/events/web.rst
|
||||
platypush/events/web.widget.rst
|
||||
platypush/events/websocket.rst
|
||||
platypush/events/wiimote.rst
|
||||
platypush/events/xmpp.rst
|
||||
platypush/events/zeroborg.rst
|
||||
platypush/events/zeroconf.rst
|
||||
|
|
|
@ -24,8 +24,9 @@ Useful links
|
|||
============
|
||||
|
||||
* The `main page <https://platypush.tech>`_ of the project.
|
||||
* The `source code <https://git.platypush.tech/platypush/platypush>`_.
|
||||
* The `blog <https://blog.platypush.tech>`_.
|
||||
* The `Gitea page <https://git.platypush.tech/platypush/platypush>`_.
|
||||
* The `blog <https://blog.platypush.tech>`_, for articles showing how to use
|
||||
Platypush in real-world scenarios.
|
||||
|
||||
Wiki
|
||||
====
|
||||
|
@ -33,15 +34,11 @@ Wiki
|
|||
.. toctree::
|
||||
:maxdepth: 3
|
||||
|
||||
wiki/Home
|
||||
wiki/Quickstart
|
||||
wiki/index
|
||||
wiki/Installation
|
||||
wiki/Plugins-installation
|
||||
wiki/APIs
|
||||
wiki/Variables
|
||||
wiki/Entities
|
||||
wiki/Configuration
|
||||
wiki/A-full-configuration-example
|
||||
wiki/Installing-extensions
|
||||
wiki/A-configuration-example
|
||||
wiki/The-Web-interface
|
||||
|
||||
Reference
|
||||
|
@ -53,6 +50,7 @@ Reference
|
|||
backends
|
||||
plugins
|
||||
events
|
||||
responses
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
``midi``
|
||||
==========================
|
||||
|
||||
.. automodule:: platypush.backend.midi
|
||||
:members:
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
``stt.picovoice.hotword``
|
||||
===========================================
|
||||
|
||||
.. automodule:: platypush.backend.stt.picovoice.hotword
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``stt.picovoice.speech``
|
||||
==========================================
|
||||
|
||||
.. automodule:: platypush.backend.stt.picovoice.speech
|
||||
:members:
|
|
@ -0,0 +1,6 @@
|
|||
``google.fit``
|
||||
======================================
|
||||
|
||||
.. automodule:: platypush.message.event.google.fit
|
||||
:members:
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
``wiimote``
|
||||
===================================
|
||||
|
||||
.. automodule:: platypush.message.event.wiimote
|
||||
:members:
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
``assistant.openai``
|
||||
====================
|
||||
|
||||
.. automodule:: platypush.plugins.assistant.openai
|
||||
:members:
|
|
@ -1,5 +0,0 @@
|
|||
``assistant.picovoice``
|
||||
=======================
|
||||
|
||||
.. automodule:: platypush.plugins.assistant.picovoice
|
||||
:members:
|
|
@ -1,5 +0,0 @@
|
|||
``cups``
|
||||
========
|
||||
|
||||
.. automodule:: platypush.plugins.cups
|
||||
:members:
|
|
@ -0,0 +1,6 @@
|
|||
``google.fit``
|
||||
================================
|
||||
|
||||
.. automodule:: platypush.plugins.google.fit
|
||||
:members:
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
``openai``
|
||||
==========
|
||||
|
||||
.. automodule:: platypush.plugins.openai
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``printer.cups``
|
||||
==================================
|
||||
|
||||
.. automodule:: platypush.plugins.printer.cups
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``stt.picovoice.hotword``
|
||||
===========================================
|
||||
|
||||
.. automodule:: platypush.plugins.stt.picovoice.hotword
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``stt.picovoice.speech``
|
||||
==========================================
|
||||
|
||||
.. automodule:: platypush.plugins.stt.picovoice.speech
|
||||
:members:
|
|
@ -1,5 +0,0 @@
|
|||
``tts.openai``
|
||||
==============
|
||||
|
||||
.. automodule:: platypush.plugins.tts.openai
|
||||
:members:
|
|
@ -1,5 +0,0 @@
|
|||
``tts.picovoice``
|
||||
=================
|
||||
|
||||
.. automodule:: platypush.plugins.tts.picovoice
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``camera.android``
|
||||
=============================================
|
||||
|
||||
.. automodule:: platypush.message.response.camera.android
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``camera``
|
||||
=====================================
|
||||
|
||||
.. automodule:: platypush.message.response.camera
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``google.drive``
|
||||
===========================================
|
||||
|
||||
.. automodule:: platypush.message.response.google.drive
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``pihole``
|
||||
=====================================
|
||||
|
||||
.. automodule:: platypush.message.response.pihole
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``printer.cups``
|
||||
===========================================
|
||||
|
||||
.. automodule:: platypush.message.response.printer.cups
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``qrcode``
|
||||
=====================================
|
||||
|
||||
.. automodule:: platypush.message.response.qrcode
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``ssh``
|
||||
==================================
|
||||
|
||||
.. automodule:: platypush.message.response.ssh
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``stt``
|
||||
==================================
|
||||
|
||||
.. automodule:: platypush.message.response.stt
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``tensorflow``
|
||||
=========================================
|
||||
|
||||
.. automodule:: platypush.message.response.tensorflow
|
||||
:members:
|
|
@ -0,0 +1,5 @@
|
|||
``translate``
|
||||
========================================
|
||||
|
||||
.. automodule:: platypush.message.response.translate
|
||||
:members:
|
|
@ -11,8 +11,6 @@ Plugins
|
|||
platypush/plugins/application.rst
|
||||
platypush/plugins/arduino.rst
|
||||
platypush/plugins/assistant.google.rst
|
||||
platypush/plugins/assistant.openai.rst
|
||||
platypush/plugins/assistant.picovoice.rst
|
||||
platypush/plugins/autoremote.rst
|
||||
platypush/plugins/bluetooth.rst
|
||||
platypush/plugins/calendar.rst
|
||||
|
@ -27,7 +25,6 @@ Plugins
|
|||
platypush/plugins/clipboard.rst
|
||||
platypush/plugins/config.rst
|
||||
platypush/plugins/csv.rst
|
||||
platypush/plugins/cups.rst
|
||||
platypush/plugins/db.rst
|
||||
platypush/plugins/dbus.rst
|
||||
platypush/plugins/dropbox.rst
|
||||
|
@ -41,6 +38,7 @@ Plugins
|
|||
platypush/plugins/github.rst
|
||||
platypush/plugins/google.calendar.rst
|
||||
platypush/plugins/google.drive.rst
|
||||
platypush/plugins/google.fit.rst
|
||||
platypush/plugins/google.mail.rst
|
||||
platypush/plugins/google.maps.rst
|
||||
platypush/plugins/google.pubsub.rst
|
||||
|
@ -96,10 +94,10 @@ Plugins
|
|||
platypush/plugins/ngrok.rst
|
||||
platypush/plugins/nmap.rst
|
||||
platypush/plugins/ntfy.rst
|
||||
platypush/plugins/openai.rst
|
||||
platypush/plugins/otp.rst
|
||||
platypush/plugins/pihole.rst
|
||||
platypush/plugins/ping.rst
|
||||
platypush/plugins/printer.cups.rst
|
||||
platypush/plugins/pushbullet.rst
|
||||
platypush/plugins/pwm.pca9685.rst
|
||||
platypush/plugins/qrcode.rst
|
||||
|
@ -121,6 +119,8 @@ Plugins
|
|||
platypush/plugins/smartthings.rst
|
||||
platypush/plugins/sound.rst
|
||||
platypush/plugins/ssh.rst
|
||||
platypush/plugins/stt.picovoice.hotword.rst
|
||||
platypush/plugins/stt.picovoice.speech.rst
|
||||
platypush/plugins/sun.rst
|
||||
platypush/plugins/switch.tplink.rst
|
||||
platypush/plugins/switch.wemo.rst
|
||||
|
@ -135,8 +135,6 @@ Plugins
|
|||
platypush/plugins/tts.rst
|
||||
platypush/plugins/tts.google.rst
|
||||
platypush/plugins/tts.mimic3.rst
|
||||
platypush/plugins/tts.openai.rst
|
||||
platypush/plugins/tts.picovoice.rst
|
||||
platypush/plugins/tv.samsung.ws.rst
|
||||
platypush/plugins/twilio.rst
|
||||
platypush/plugins/udp.rst
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
Responses
|
||||
=========
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Responses:
|
||||
|
||||
platypush/responses/camera.rst
|
||||
platypush/responses/camera.android.rst
|
||||
platypush/responses/google.drive.rst
|
||||
platypush/responses/pihole.rst
|
||||
platypush/responses/printer.cups.rst
|
||||
platypush/responses/qrcode.rst
|
||||
platypush/responses/ssh.rst
|
||||
platypush/responses/stt.rst
|
||||
platypush/responses/tensorflow.rst
|
||||
platypush/responses/translate.rst
|
|
@ -1,16 +1,15 @@
|
|||
# A more versatile way to define event hooks than the YAML format of
|
||||
# `config.yaml` is through native Python scripts. You can define hooks as simple
|
||||
# Python functions that use the `platypush.event.hook.hook` decorator to specify
|
||||
# on which event type they should be called, and optionally on which event
|
||||
# attribute values.
|
||||
# A more versatile way to define event hooks than the YAML format of `config.yaml` is through native Python scripts.
|
||||
# You can define hooks as simple Python functions that use the `platypush.event.hook.hook` decorator to specify on
|
||||
# which event type they should be called, and optionally on which event attribute values.
|
||||
#
|
||||
# Event hooks should be stored in Python files under
|
||||
# `~/.config/platypush/scripts`. All the functions that use the @when decorator
|
||||
# will automatically be discovered and imported as event hooks into the platform
|
||||
# at runtime.
|
||||
# Event hooks should be stored in Python files under `~/.config/platypush/scripts`. All the functions that use the
|
||||
# @hook decorator will automatically be discovered and imported as event hooks into the platform at runtime.
|
||||
|
||||
# `run` is a utility function that runs a request by name (e.g. `light.hue.on`).
|
||||
from platypush import when, run
|
||||
from platypush.utils import run
|
||||
|
||||
# @hook decorator
|
||||
from platypush.event.hook import hook
|
||||
|
||||
# Event types that you want to react to
|
||||
from platypush.message.event.assistant import (
|
||||
|
@ -19,15 +18,13 @@ from platypush.message.event.assistant import (
|
|||
)
|
||||
|
||||
|
||||
@when(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
|
||||
def on_music_play_command(event, title=None, artist=None):
|
||||
@hook(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
|
||||
def on_music_play_command(event, title=None, artist=None, **context):
|
||||
"""
|
||||
This function will be executed when a SpeechRecognizedEvent with
|
||||
`phrase="play the music"` is triggered. `event` contains the event object
|
||||
and `context` any key-value info from the running context. Note that in this
|
||||
specific case we can leverage the token-extraction feature of
|
||||
SpeechRecognizedEvent through ${} that operates on regex-like principles to
|
||||
extract any text that matches the pattern into context variables.
|
||||
This function will be executed when a SpeechRecognizedEvent with `phrase="play the music"` is triggered.
|
||||
`event` contains the event object and `context` any key-value info from the running context.
|
||||
Note that in this specific case we can leverage the token-extraction feature of SpeechRecognizedEvent through
|
||||
${} that operates on regex-like principles to extract any text that matches the pattern into context variables.
|
||||
"""
|
||||
results = run(
|
||||
'music.mpd.search',
|
||||
|
@ -37,17 +34,16 @@ def on_music_play_command(event, title=None, artist=None):
|
|||
},
|
||||
)
|
||||
|
||||
if results and results[0]:
|
||||
if results:
|
||||
run('music.mpd.play', results[0]['file'])
|
||||
else:
|
||||
run('tts.say', "I can't find any music matching your query")
|
||||
|
||||
|
||||
@when(ConversationStartEvent)
|
||||
def on_conversation_start():
|
||||
@hook(ConversationStartEvent)
|
||||
def on_conversation_start(event, **context):
|
||||
"""
|
||||
A simple hook that gets invoked when a new conversation starts with a voice
|
||||
assistant and simply pauses the music to make sure that your speech is
|
||||
properly detected.
|
||||
A simple hook that gets invoked when a new conversation starts with a voice assistant and simply pauses the music
|
||||
to make sure that your speech is properly detected.
|
||||
"""
|
||||
run('music.mpd.pause_if_playing')
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
../../platypush/config/systemd/platypush.service
|
|
@ -0,0 +1,22 @@
|
|||
# platypush systemd service example.
|
||||
# Edit and copy this file to your systemd folder. It's usually
|
||||
# /usr/lib/systemd/user for global installation or
|
||||
# ~/.config/systemd/user for user installation. You can
|
||||
# then control and monitor the service through
|
||||
# systemd [--user] [start|stop|restart|status] platypush.service
|
||||
|
||||
[Unit]
|
||||
Description=Platypush daemon
|
||||
After=network.target redis.service
|
||||
|
||||
[Service]
|
||||
# platypush installation path
|
||||
ExecStart=/usr/bin/platypush
|
||||
Restart=always
|
||||
# How long should be waited before restarting the service
|
||||
# in case of failure.
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
|
|
@ -8,6 +8,7 @@ import pkgutil
|
|||
|
||||
from platypush.backend import Backend
|
||||
from platypush.message.event import Event
|
||||
from platypush.message.response import Response
|
||||
from platypush.plugins import Plugin
|
||||
from platypush.utils.manifest import Manifests
|
||||
from platypush.utils.mock import auto_mocks
|
||||
|
@ -25,6 +26,10 @@ def get_all_events():
|
|||
return _get_modules(Event)
|
||||
|
||||
|
||||
def get_all_responses():
|
||||
return _get_modules(Response)
|
||||
|
||||
|
||||
def _get_modules(base_type: type):
|
||||
ret = set()
|
||||
base_dir = os.path.dirname(inspect.getfile(base_type))
|
||||
|
@ -146,11 +151,20 @@ def generate_events_doc():
|
|||
)
|
||||
|
||||
|
||||
def generate_responses_doc():
|
||||
_generate_components_doc(
|
||||
index_name='responses',
|
||||
package_name='message.response',
|
||||
components=sorted(response for response in get_all_responses() if response),
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
with auto_mocks():
|
||||
generate_plugins_doc()
|
||||
generate_backends_doc()
|
||||
generate_events_doc()
|
||||
generate_responses_doc()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -5,42 +5,29 @@ Platypush
|
|||
.. license: MIT
|
||||
"""
|
||||
|
||||
from .app import Application, app
|
||||
from .app import Application
|
||||
from .config import Config
|
||||
from .context import Variable, get_backend, get_bus, get_plugin
|
||||
from .cron import cron
|
||||
from .event.hook import hook
|
||||
from .context import get_backend, get_bus, get_plugin
|
||||
from .message.event import Event
|
||||
from .message.request import Request
|
||||
from .message.response import Response
|
||||
from .procedure import procedure
|
||||
from .runner import main
|
||||
from .utils import run
|
||||
|
||||
# Alias for platypush.event.hook.hook,
|
||||
# see https://git.platypush.tech/platypush/platypush/issues/399
|
||||
when = hook
|
||||
|
||||
|
||||
__author__ = 'Fabio Manganiello <fabio@manganiello.tech>'
|
||||
__version__ = '1.1.0'
|
||||
__version__ = '0.50.3'
|
||||
__all__ = [
|
||||
'Application',
|
||||
'Variable',
|
||||
'Config',
|
||||
'Event',
|
||||
'Request',
|
||||
'Response',
|
||||
'app',
|
||||
'cron',
|
||||
'get_backend',
|
||||
'get_bus',
|
||||
'get_plugin',
|
||||
'hook',
|
||||
'main',
|
||||
'procedure',
|
||||
'run',
|
||||
'when',
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from ._app import Application, app, main
|
||||
from ._app import Application, main
|
||||
|
||||
|
||||
__all__ = ["Application", "app", "main"]
|
||||
__all__ = ["Application", "main"]
|
||||
|
|
|
@ -5,7 +5,6 @@ import os
|
|||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
from textwrap import dedent
|
||||
from typing import Optional, Sequence
|
||||
|
||||
from platypush.bus import Bus
|
||||
|
@ -421,21 +420,7 @@ class Application:
|
|||
if not self.no_capture_stderr:
|
||||
sys.stderr = Logger(log.warning)
|
||||
|
||||
log.info(
|
||||
dedent(
|
||||
r'''
|
||||
_____ _ _ _
|
||||
| __ \| | | | | |
|
||||
| |__) | | __ _| |_ _ _ _ __ _ _ ___| |__
|
||||
| ___/| |/ _` | __| | | | '_ \| | | / __| '_ \
|
||||
| | | | (_| | |_| |_| | |_) | |_| \__ \ | | |
|
||||
|_| |_|\__,_|\__|\__, | .__/ \__,_|___/_| |_|
|
||||
__/ | |
|
||||
|___/|_|
|
||||
'''
|
||||
)
|
||||
)
|
||||
log.info('---- Starting Platypush v.%s', __version__)
|
||||
log.info('---- Starting platypush v.%s', __version__)
|
||||
|
||||
# Start the local Redis service if required
|
||||
if self.start_redis:
|
||||
|
@ -479,15 +464,10 @@ class Application:
|
|||
self._run()
|
||||
|
||||
|
||||
app: Optional[Application] = None
|
||||
|
||||
|
||||
def main(*args: str):
|
||||
"""
|
||||
Application entry point.
|
||||
"""
|
||||
global app
|
||||
|
||||
app = Application.from_cmdline(args)
|
||||
|
||||
try:
|
||||
|
|
|
@ -402,13 +402,6 @@ class Backend(Thread, EventGenerator, ExtensionWithManifest):
|
|||
)
|
||||
return
|
||||
|
||||
if self.zeroconf:
|
||||
self.logger.info(
|
||||
'Zeroconf service already registered for %s, removing the previous instance',
|
||||
self.__class__.__name__,
|
||||
)
|
||||
self.unregister_service()
|
||||
|
||||
self.zeroconf = Zeroconf()
|
||||
srv_desc = {
|
||||
'name': 'Platypush',
|
||||
|
|
|
@ -153,13 +153,14 @@ class HttpBackend(Backend):
|
|||
|
||||
.. code-block:: python
|
||||
|
||||
from platypush import get_plugin, when
|
||||
from platypush.context import get_plugin
|
||||
from platypush.event.hook import hook
|
||||
from platypush.message.event.http.hook import WebhookEvent
|
||||
|
||||
hook_token = 'abcdefabcdef'
|
||||
|
||||
# Expose the hook under the /hook/lights_toggle endpoint
|
||||
@when(WebhookEvent, hook='lights_toggle')
|
||||
@hook(WebhookEvent, hook='lights_toggle')
|
||||
def lights_toggle(event, **context):
|
||||
# Do any checks on the request
|
||||
assert event.headers.get('X-Token') == hook_token, 'Unauthorized'
|
||||
|
|
|
@ -6,7 +6,6 @@ from flask import Blueprint, request, redirect, render_template, make_response
|
|||
from platypush.backend.http.app import template_folder
|
||||
from platypush.backend.http.utils import HttpUtils
|
||||
from platypush.user import UserManager
|
||||
from platypush.utils import utcnow
|
||||
|
||||
login = Blueprint('login', __name__, template_folder=template_folder)
|
||||
|
||||
|
@ -18,7 +17,7 @@ __routes__ = [
|
|||
|
||||
@login.route('/login', methods=['GET', 'POST'])
|
||||
def login():
|
||||
"""Login page"""
|
||||
""" Login page """
|
||||
user_manager = UserManager()
|
||||
session_token = request.cookies.get('session_token')
|
||||
|
||||
|
@ -38,11 +37,11 @@ def login():
|
|||
username = request.form.get('username')
|
||||
password = request.form.get('password')
|
||||
remember = request.form.get('remember')
|
||||
expires = utcnow() + datetime.timedelta(days=365) if remember else None
|
||||
expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) \
|
||||
if remember else None
|
||||
|
||||
session = user_manager.create_user_session(
|
||||
username=username, password=password, expires_at=expires
|
||||
)
|
||||
session = user_manager.create_user_session(username=username, password=password,
|
||||
expires_at=expires)
|
||||
|
||||
if session:
|
||||
redirect_target = redirect(redirect_page, 302) # lgtm [py/url-redirection]
|
||||
|
|
|
@ -6,7 +6,6 @@ from flask import Blueprint, request, redirect, render_template, make_response,
|
|||
from platypush.backend.http.app import template_folder
|
||||
from platypush.backend.http.utils import HttpUtils
|
||||
from platypush.user import UserManager
|
||||
from platypush.utils import utcnow
|
||||
|
||||
register = Blueprint('register', __name__, template_folder=template_folder)
|
||||
|
||||
|
@ -18,7 +17,7 @@ __routes__ = [
|
|||
|
||||
@register.route('/register', methods=['GET', 'POST'])
|
||||
def register():
|
||||
"""Registration page"""
|
||||
""" Registration page """
|
||||
user_manager = UserManager()
|
||||
redirect_page = request.args.get('redirect')
|
||||
if not redirect_page:
|
||||
|
@ -35,9 +34,7 @@ def register():
|
|||
return redirect(redirect_page, 302) # lgtm [py/url-redirection]
|
||||
|
||||
if user_manager.get_user_count() > 0:
|
||||
return redirect(
|
||||
'/login?redirect=' + redirect_page, 302
|
||||
) # lgtm [py/url-redirection]
|
||||
return redirect('/login?redirect=' + redirect_page, 302) # lgtm [py/url-redirection]
|
||||
|
||||
if request.form:
|
||||
username = request.form.get('username')
|
||||
|
@ -47,18 +44,12 @@ def register():
|
|||
|
||||
if password == confirm_password:
|
||||
user_manager.create_user(username=username, password=password)
|
||||
session = user_manager.create_user_session(
|
||||
username=username,
|
||||
password=password,
|
||||
expires_at=(
|
||||
utcnow() + datetime.timedelta(days=1) if not remember else None
|
||||
),
|
||||
)
|
||||
session = user_manager.create_user_session(username=username, password=password,
|
||||
expires_at=datetime.datetime.utcnow() + datetime.timedelta(days=1)
|
||||
if not remember else None)
|
||||
|
||||
if session:
|
||||
redirect_target = redirect(
|
||||
redirect_page, 302
|
||||
) # lgtm [py/url-redirection]
|
||||
redirect_target = redirect(redirect_page, 302) # lgtm [py/url-redirection]
|
||||
response = make_response(redirect_target)
|
||||
response.set_cookie('session_token', session.session_token)
|
||||
return response
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
"manifest": {
|
||||
"events": {},
|
||||
"install": {
|
||||
"pip": []
|
||||
},
|
||||
"package": "platypush.backend.http",
|
||||
"type": "backend"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
manifest:
|
||||
events: {}
|
||||
install:
|
||||
pip: []
|
||||
package: platypush.backend.http
|
||||
type: backend
|
|
@ -1 +1 @@
|
|||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/fonts/poppins.css"><title>platypush</title><script defer="defer" src="/static/js/chunk-vendors.c084e94c.js"></script><script defer="defer" src="/static/js/app.62f4493a.js"></script><link href="/static/css/chunk-vendors.a2412607.css" rel="stylesheet"><link href="/static/css/app.200dd9cf.css" rel="stylesheet"><link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#ffffff"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="Platypush"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#ffffff"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but platypush doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/fonts/poppins.css"><title>platypush</title><script defer="defer" src="/static/js/chunk-vendors.aeea9c55.js"></script><script defer="defer" src="/static/js/app.e71ae2ab.js"></script><link href="/static/css/chunk-vendors.a2412607.css" rel="stylesheet"><link href="/static/css/app.5b1362a4.css" rel="stylesheet"><link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#ffffff"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="Platypush"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#ffffff"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but platypush doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-brands-400.b6033b54.woff2
vendored
Normal file
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-brands-400.b6033b54.woff2
vendored
Normal file
Binary file not shown.
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-regular-400.3580b4a9.woff2
vendored
Normal file
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-regular-400.3580b4a9.woff2
vendored
Normal file
Binary file not shown.
Binary file not shown.
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-regular-400.67a0fb74.ttf
vendored
Normal file
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-regular-400.67a0fb74.ttf
vendored
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-solid-900.fd0b155c.woff2
vendored
Normal file
BIN
platypush/backend/http/webapp/dist/static/fonts/fa-solid-900.fd0b155c.woff2
vendored
Normal file
Binary file not shown.
|
@ -1,2 +1,2 @@
|
|||
"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[2140,4619],{4619:function(e,t,s){s.r(t),s.d(t,{default:function(){return w}});var o=s(6252),i=s(3577);const a={class:"date-time"},r=["textContent"],h=["textContent"];function n(e,t,s,n,m,u){return(0,o.wg)(),(0,o.iD)("div",a,[u._showDate?((0,o.wg)(),(0,o.iD)("div",{key:0,class:"date",textContent:(0,i.zw)(e.formatDate(e.now))},null,8,r)):(0,o.kq)("",!0),u._showTime?((0,o.wg)(),(0,o.iD)("div",{key:1,class:"time",textContent:(0,i.zw)(e.formatTime(e.now,u._showSeconds))},null,8,h)):(0,o.kq)("",!0)])}var m=s(8637),u={name:"DateTime",mixins:[m.Z],props:{showDate:{required:!1,default:!0},showTime:{required:!1,default:!0},showSeconds:{required:!1,default:!0}},computed:{_showTime(){return this.parseBoolean(this.showTime)},_showDate(){return this.parseBoolean(this.showDate)},_showSeconds(){return this.parseBoolean(this.showSeconds)}},data:function(){return{now:new Date}},methods:{refreshTime(){this.now=new Date}},mounted:function(){this.refreshTime(),setInterval(this.refreshTime,1e3)}},c=s(3744);const l=(0,c.Z)(u,[["render",n],["__scopeId","data-v-ca42eb9c"]]);var w=l},2140:function(e,t,s){s.r(t),s.d(t,{default:function(){return k}});var o=s(6252),i=s(3577);const a={class:"image-carousel"},r={ref:"background",class:"background"},h=["src"],n={key:1,class:"row info-container"},m={class:"col-6 weather-container"},u={key:0},c={class:"col-6 date-time-container"};function l(e,t,s,l,w,d){const g=(0,o.up)("Loading"),f=(0,o.up)("Weather"),p=(0,o.up)("DateTime");return(0,o.wg)(),(0,o.iD)("div",a,[w.images.length?(0,o.kq)("",!0):((0,o.wg)(),(0,o.j4)(g,{key:0})),(0,o._)("div",r,null,512),(0,o._)("img",{ref:"img",src:d.imgURL,alt:"Your carousel images",style:(0,i.j5)({display:w.images.length?"block":"none"})},null,12,h),d._showDate||d._showTime?((0,o.wg)(),(0,o.iD)("div",n,[(0,o._)("div",m,[d._showWeather?((0,o.wg)(),(0,o.j4)(f,{key:1,"show-icon":d._showWeatherIcon,"show-summary":d._showWeatherSummary,"show-temperature":d._showTemperature,"icon-color":s.weatherIconColor,"icon-size":s.weatherIconSize,animate:d._animateWeatherIcon},null,8,["show-icon","show-summary","show-temperature","icon-color","icon-size","animate"])):((0,o.wg)(),(0,o.iD)("span",u," "))]),(0,o._)("div",c,[d._showTime||d._showDate?((0,o.wg)(),(0,o.j4)(p,{key:0,"show-date":d._showDate,"show-time":d._showTime,"show-seconds":d._showSeconds},null,8,["show-date","show-time","show-seconds"])):(0,o.kq)("",!0)])])):(0,o.kq)("",!0)])}var w=s(8637),d=s(6791),g=s(4619),f=s(9211),p={name:"ImageCarousel",components:{Weather:f["default"],DateTime:g["default"],Loading:d.Z},mixins:[w.Z],props:{imgDir:{type:String,required:!0},refreshSeconds:{type:Number,default:15},showDate:{default:!1},showTime:{default:!1},showSeconds:{default:!1},showWeather:{default:!1},showTemperature:{default:!0},showWeatherIcon:{default:!0},showWeatherSummary:{default:!0},weatherIconColor:{type:String,default:"white"},weatherIconSize:{type:Number,default:70},animateWeatherIcon:{default:!0}},data(){return{images:[],currentImage:void 0,loading:!1}},computed:{imgURL(){let e=8008;return"backend.http"in this.$root.config&&"port"in this.$root.config["backend.http"]&&(e=this.$root.config["backend.http"].port),"//"+window.location.hostname+":"+e+this.currentImage},_showDate(){return this.parseBoolean(this.showDate)},_showTime(){return this.parseBoolean(this.showTime)},_showSeconds(){return this.parseBoolean(this.showSeconds)},_showTemperature(){return this.parseBoolean(this.showTemperature)},_showWeather(){return this.parseBoolean(this.showWeather)},_showWeatherIcon(){return this.parseBoolean(this.showWeatherIcon)},_showWeatherSummary(){return this.parseBoolean(this.showWeatherSummary)},_animateWeatherIcon(){return this.parseBoolean(this.animateWeatherIcon)}},methods:{async refresh(){if(!this.images.length){this.loading=!0;try{this.images=await this.request("utils.search_web_directory",{directory:this.imgDir,extensions:[".jpg",".jpeg",".png"]}),this.shuffleImages()}finally{this.loading=!1}}this.images.length&&(this.currentImage=this.images.pop())},onNewImage(){if(this.$refs.img&&(this.$refs.background.style["background-image"]="url("+this.imgURL+")",this.$refs.img.style.width="auto",this.$refs.img.width>this.$refs.img.height)){const e=this.$refs.img.width/this.$refs.img.height;e>=4/3&&e<=16/9?this.$refs.img.style.width="100%":e<=4/3&&(this.$refs.img.style.height="100%")}},shuffleImages(){for(let e=this.images.length-1;e>0;e--){let t=Math.floor(Math.random()*(e+1)),s=this.images[e];this.images[e]=this.images[t],this.images[t]=s}}},mounted(){this.$refs.img.addEventListener("load",this.onNewImage),this.$refs.img.addEventListener("error",this.refresh),this.refresh(),setInterval(this.refresh,Math.round(1e3*this.refreshSeconds))}},_=s(3744);const y=(0,_.Z)(p,[["render",l],["__scopeId","data-v-7b09a273"]]);var k=y}}]);
|
||||
//# sourceMappingURL=2140.10cab5fd.js.map
|
||||
"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[2140,4619],{4619:function(e,t,s){s.r(t),s.d(t,{default:function(){return w}});var o=s(6252),i=s(3577);const a={class:"date-time"},r=["textContent"],h=["textContent"];function n(e,t,s,n,m,u){return(0,o.wg)(),(0,o.iD)("div",a,[u._showDate?((0,o.wg)(),(0,o.iD)("div",{key:0,class:"date",textContent:(0,i.zw)(e.formatDate(e.now))},null,8,r)):(0,o.kq)("",!0),u._showTime?((0,o.wg)(),(0,o.iD)("div",{key:1,class:"time",textContent:(0,i.zw)(e.formatTime(e.now,u._showSeconds))},null,8,h)):(0,o.kq)("",!0)])}var m=s(8637),u={name:"DateTime",mixins:[m.Z],props:{showDate:{required:!1,default:!0},showTime:{required:!1,default:!0},showSeconds:{required:!1,default:!0}},computed:{_showTime(){return this.parseBoolean(this.showTime)},_showDate(){return this.parseBoolean(this.showDate)},_showSeconds(){return this.parseBoolean(this.showSeconds)}},data:function(){return{now:new Date}},methods:{refreshTime(){this.now=new Date}},mounted:function(){this.refreshTime(),setInterval(this.refreshTime,1e3)}},c=s(3744);const l=(0,c.Z)(u,[["render",n],["__scopeId","data-v-ca42eb9c"]]);var w=l},2140:function(e,t,s){s.r(t),s.d(t,{default:function(){return k}});var o=s(6252),i=s(3577);const a={class:"image-carousel"},r={ref:"background",class:"background"},h=["src"],n={key:1,class:"row info-container"},m={class:"col-6 weather-container"},u={key:0},c={class:"col-6 date-time-container"};function l(e,t,s,l,w,d){const g=(0,o.up)("Loading"),f=(0,o.up)("Weather"),p=(0,o.up)("DateTime");return(0,o.wg)(),(0,o.iD)("div",a,[w.images.length?(0,o.kq)("",!0):((0,o.wg)(),(0,o.j4)(g,{key:0})),(0,o._)("div",r,null,512),(0,o._)("img",{ref:"img",src:d.imgURL,alt:"Your carousel images",style:(0,i.j5)({display:w.images.length?"block":"none"})},null,12,h),d._showDate||d._showTime?((0,o.wg)(),(0,o.iD)("div",n,[(0,o._)("div",m,[d._showWeather?((0,o.wg)(),(0,o.j4)(f,{key:1,"show-icon":d._showWeatherIcon,"show-summary":d._showWeatherSummary,"show-temperature":d._showTemperature,"icon-color":s.weatherIconColor,"icon-size":s.weatherIconSize,animate:d._animateWeatherIcon},null,8,["show-icon","show-summary","show-temperature","icon-color","icon-size","animate"])):((0,o.wg)(),(0,o.iD)("span",u," "))]),(0,o._)("div",c,[d._showTime||d._showDate?((0,o.wg)(),(0,o.j4)(p,{key:0,"show-date":d._showDate,"show-time":d._showTime,"show-seconds":d._showSeconds},null,8,["show-date","show-time","show-seconds"])):(0,o.kq)("",!0)])])):(0,o.kq)("",!0)])}var w=s(8637),d=s(6791),g=s(4619),f=s(5193),p={name:"ImageCarousel",components:{Weather:f["default"],DateTime:g["default"],Loading:d.Z},mixins:[w.Z],props:{imgDir:{type:String,required:!0},refreshSeconds:{type:Number,default:15},showDate:{default:!1},showTime:{default:!1},showSeconds:{default:!1},showWeather:{default:!1},showTemperature:{default:!0},showWeatherIcon:{default:!0},showWeatherSummary:{default:!0},weatherIconColor:{type:String,default:"white"},weatherIconSize:{type:Number,default:70},animateWeatherIcon:{default:!0}},data(){return{images:[],currentImage:void 0,loading:!1}},computed:{imgURL(){let e=8008;return"backend.http"in this.$root.config&&"port"in this.$root.config["backend.http"]&&(e=this.$root.config["backend.http"].port),"//"+window.location.hostname+":"+e+this.currentImage},_showDate(){return this.parseBoolean(this.showDate)},_showTime(){return this.parseBoolean(this.showTime)},_showSeconds(){return this.parseBoolean(this.showSeconds)},_showTemperature(){return this.parseBoolean(this.showTemperature)},_showWeather(){return this.parseBoolean(this.showWeather)},_showWeatherIcon(){return this.parseBoolean(this.showWeatherIcon)},_showWeatherSummary(){return this.parseBoolean(this.showWeatherSummary)},_animateWeatherIcon(){return this.parseBoolean(this.animateWeatherIcon)}},methods:{async refresh(){if(!this.images.length){this.loading=!0;try{this.images=await this.request("utils.search_web_directory",{directory:this.imgDir,extensions:[".jpg",".jpeg",".png"]}),this.shuffleImages()}finally{this.loading=!1}}this.images.length&&(this.currentImage=this.images.pop())},onNewImage(){if(this.$refs.img&&(this.$refs.background.style["background-image"]="url("+this.imgURL+")",this.$refs.img.style.width="auto",this.$refs.img.width>this.$refs.img.height)){const e=this.$refs.img.width/this.$refs.img.height;e>=4/3&&e<=16/9?this.$refs.img.style.width="100%":e<=4/3&&(this.$refs.img.style.height="100%")}},shuffleImages(){for(let e=this.images.length-1;e>0;e--){let t=Math.floor(Math.random()*(e+1)),s=this.images[e];this.images[e]=this.images[t],this.images[t]=s}}},mounted(){this.$refs.img.addEventListener("load",this.onNewImage),this.$refs.img.addEventListener("error",this.refresh),this.refresh(),setInterval(this.refresh,Math.round(1e3*this.refreshSeconds))}},_=s(3744);const y=(0,_.Z)(p,[["render",l],["__scopeId","data-v-7b09a273"]]);var k=y}}]);
|
||||
//# sourceMappingURL=2140.1dc2f842.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,2 @@
|
|||
"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[667],{667:function(e,t,s){s.r(t),s.d(t,{default:function(){return y}});var r=s(6252),i=s(9963);const o={class:"entities-selectors-container"},n={key:0,class:"selector search-container col-11"},l={class:"selector actions-container col-1 pull-right"};function c(e,t,s,c,u,a){const p=(0,r.up)("DropdownItem"),h=(0,r.up)("Dropdown");return(0,r.wg)(),(0,r.iD)("div",o,[Object.keys(s.entityGroups.id||{}).length?((0,r.wg)(),(0,r.iD)("div",n,[(0,r.wy)((0,r._)("input",{ref:"search",type:"text",class:"search-bar",title:"Filter by name, plugin or ID",placeholder:"🔎","onUpdate:modelValue":t[0]||(t[0]=e=>u.searchTerm=e)},null,512),[[i.nr,u.searchTerm]])])):(0,r.kq)("",!0),(0,r._)("div",l,[(0,r.Wm)(h,{title:"Actions","icon-class":"fas fa-ellipsis"},{default:(0,r.w5)((()=>[(0,r.Wm)(p,{"icon-class":"fas fa-sync-alt",text:"Refresh",onClick:t[1]||(t[1]=t=>e.$emit("refresh"))}),(0,r.Wm)(p,{"icon-class":"fas fa-square-root-variable",text:"Set Variable",onClick:t[2]||(t[2]=t=>e.$emit("show-variable-modal"))}),(0,r.Wm)(h,{title:"Group by",text:"Group by","icon-class":"fas fa-object-ungroup",ref:"groupingSelector"},{default:(0,r.w5)((()=>[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(a.visibleGroupings,(e=>((0,r.wg)(),(0,r.j4)(p,{key:e,text:a.prettifyGroupingName(e),"item-class":{selected:s.value?.grouping===e},onClick:t=>a.onGroupingChanged(e)},null,8,["text","item-class","onClick"])))),128))])),_:1},512),(0,r.Wm)(h,{title:"Filter groups",text:"Filter groups","icon-class":{fas:!0,"fa-filter":!0,active:a.hasActiveFilter},ref:"groupSelector","keep-open-on-item-click":""},{default:(0,r.w5)((()=>[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(a.sortedGroups,(e=>((0,r.wg)(),(0,r.j4)(p,(0,r.dG)({key:e,text:e},a.iconForGroup(e),{"item-class":{selected:!!u.selectedGroups[e]},onClick:(0,i.iM)((t=>a.toggleGroup(e)),["stop"])}),null,16,["text","item-class","onClick"])))),128))])),_:1},8,["icon-class"])])),_:1})])])}var u=s(8637),a=s(2787),p=s(815),h=s(7369),d=s(1359),g=s(5250),f={name:"Selector",emits:["input","refresh","show-variable-modal"],mixins:[u.Z],components:{Dropdown:a.Z,DropdownItem:p.Z},props:{entityGroups:{type:Object,required:!0},value:{type:Object,required:!0}},data(){return{selectedGroups:{},searchTerm:""}},computed:{visibleGroupings(){return Object.keys(this.entityGroups).filter((e=>"id"!==e))},hasActiveFilter(){return Object.values(this.selectedGroups).filter((e=>!1===e)).length>0},sortedGroups(){return Object.keys(this.entityGroups[this.value?.grouping]||{}).sort()},typesMeta(){return h},isGroupFilterActive(){return Object.keys(this.selectedGroups).length!==this.sortedGroups.length},selectedEntities(){if(!this.searchTerm?.length)return this.entityGroups.id;const e=this.searchTerm.toLowerCase().trim();return Object.values(this.entityGroups.id).filter((t=>{if(!this.selectedGroups[t[this.value?.grouping]])return!1;if(!e?.length)return!0;for(const s of["id","external_id","name","plugin"]){if(!t[s])continue;const r=t[s].toString().toLowerCase();if(r.indexOf(e)>=0)return!0}return!1})).reduce(((e,t)=>(e[t.id]=t,e)),{})}},methods:{prettifyGroupingName(e){return e?(e=this.prettify(e),e.endsWith("y")&&(e=e.slice(0,e.length-1)+"ie"),e+="s",e):""},iconForGroup(e){if("plugin"===this.value.grouping&&d[e]){const t=d[e];return{"icon-class":t["class"]?.length||!t.imgUrl?.length?t["class"]:"fas fa-gears","icon-url":t.imgUrl}}return{}},sync(){const e={...this.value};e.searchTerm=this.searchTerm,e.selectedEntities=this.selectedEntities,e.selectedGroups=this.selectedGroups,this.$emit("input",e)},refreshGroupFilter(){this.selectedGroups=Object.keys(this.entityGroups[this.value?.grouping]||{}).reduce(((e,t)=>(e[t]=!0,e)),{}),this.sync()},toggleGroup(e){this.selectedGroups[e]=!this.selectedGroups[e],this.sync()},processEntityUpdate(e){const t=e[this.value?.grouping];t&&null==this.selectedGroups[t]&&(this.selectedGroups[t]=!0)},onGroupingChanged(e){if(!this.entityGroups[e]||e===this.value?.grouping)return!1;const t={...this.value};t.grouping=e,this.$emit("input",t)}},mounted(){this.refreshGroupFilter(),this.$watch((()=>this.value?.grouping),(()=>{this.refreshGroupFilter()})),this.$watch((()=>this.searchTerm),this.sync),g.$.onEntity(this.processEntityUpdate)}},m=s(3744);const G=(0,m.Z)(f,[["render",c],["__scopeId","data-v-334516c0"]]);var y=G}}]);
|
||||
//# sourceMappingURL=667.f23239a7.js.map
|
||||
//# sourceMappingURL=667.4d6799b5.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,2 +0,0 @@
|
|||
"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[7089],{5169:function(t,e,a){a.d(e,{Z:function(){return y}});var n=a(6252),l=a(9963);const i=t=>((0,n.dD)("data-v-a248454a"),t=t(),(0,n.Cn)(),t),s={class:"tts-container"},u={class:"field text-container"},r=["disabled"],d={class:"field lang-container"},c=["disabled"],o={class:"field buttons"},p=["disabled"],g=i((()=>(0,n._)("i",{class:"fa fa-volume-up"},null,-1))),v=[g];function f(t,e,a,i,g,f){return(0,n.wg)(),(0,n.iD)("div",s,[(0,n._)("form",{onSubmit:e[0]||(e[0]=(0,l.iM)(((...t)=>f.talk&&f.talk(...t)),["prevent"]))},[(0,n._)("div",u,[(0,n._)("label",null,[(0,n._)("input",{type:"text",name:"text",placeholder:"Text to say",disabled:g.talking},null,8,r)])]),(0,n._)("div",d,[(0,n._)("label",null,[(0,n._)("input",{type:"text",name:"language",placeholder:"Language code",disabled:g.talking},null,8,c)])]),(0,n._)("div",o,[(0,n._)("button",{type:"submit",disabled:g.talking},v,8,p)])],32)])}var m=a(8637),b={name:"Panel",mixins:[m.Z],props:{pluginName:{type:String,required:!0}},data(){return{talking:!1}},methods:{async talk(t){const e=[...t.target.querySelectorAll("input")].reduce(((t,e)=>(e.value.length&&(t[e.name]=e.value),t)),{});this.talking=!0;try{await this.request(`${this.pluginName}.say`,e)}finally{this.talking=!1}}}},h=a(3744);const k=(0,h.Z)(b,[["render",f],["__scopeId","data-v-a248454a"]]);var y=k},7089:function(t,e,a){a.r(e),a.d(e,{default:function(){return d}});var n=a(6252);function l(t,e,a,l,i,s){const u=(0,n.up)("Panel");return(0,n.wg)(),(0,n.j4)(u,{"plugin-name":"tts.picovoice"})}var i=a(5169),s={name:"Tts",components:{Panel:i.Z}},u=a(3744);const r=(0,u.Z)(s,[["render",l]]);var d=r}}]);
|
||||
//# sourceMappingURL=7089.f4d74b4a.js.map
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue