Init
This commit is contained in:
parent
61fac74d50
commit
cd02c525e5
5 changed files with 425 additions and 0 deletions
5
.config.example
Normal file
5
.config.example
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
SSH_ADDR=example.com
|
||||||
|
SSH_USER=zpkg
|
||||||
|
HTTP_ADDR=example.com
|
||||||
|
HTTP_PATH=zpkg
|
||||||
|
PKG_PATH='$HOME/pkg'
|
||||||
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
.config
|
||||||
|
pkg
|
||||||
|
Zmakefile
|
||||||
|
autodeploy.sh
|
||||||
|
.deploytime
|
||||||
28
server_deploy.sh
Executable file
28
server_deploy.sh
Executable file
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. "$(pwd)/.config"
|
||||||
|
|
||||||
|
ssh="$SSH_USER@$SSH_ADDR"
|
||||||
|
|
||||||
|
# add sources to server
|
||||||
|
ssh "$ssh" mkdir -p "$PKG_PATH" || exit $?
|
||||||
|
scp .config scripts/* "$ssh":~/ || exit $?
|
||||||
|
|
||||||
|
# make zpkg package
|
||||||
|
DIR=tmp
|
||||||
|
PKG=zpkg
|
||||||
|
DEST=/usr/local/bin
|
||||||
|
BASHDEST=/etc/bash_completion.d
|
||||||
|
mkdir -p "$DIR/$PKG$DEST" || exit $?
|
||||||
|
mkdir -p "$DIR/$PKG$BASHDEST" || exit $?
|
||||||
|
cp src/zpkg.bash "$ZPKG_PKG_PATH/$PKG$BASHDEST" || exit $?
|
||||||
|
cp src/zpkg "$ZPKG_PKG_PATH/$PKG$DEST" || exit $?
|
||||||
|
cd pkg/zpkg || exit $?
|
||||||
|
tar -cvJf zpkg.tar.xz * || exit $?
|
||||||
|
# send package
|
||||||
|
scp zpkg.tar.xz "$ssh":~/"$PKG_PATH" || exit $?
|
||||||
|
rm -rd "$DIR"
|
||||||
|
# update database
|
||||||
|
ssh "$ssh" sh database_update.sh || exit $?
|
||||||
|
# generate install script
|
||||||
|
ssh "$ssh" sh gen_install.sh || exit $?
|
||||||
371
src/zpkg
Executable file
371
src/zpkg
Executable file
|
|
@ -0,0 +1,371 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
config_path=/etc/zpkg
|
||||||
|
|
||||||
|
getname ()
|
||||||
|
{
|
||||||
|
readlink -f "$1" | rev | cut -d'/' -f1 | rev
|
||||||
|
}
|
||||||
|
|
||||||
|
usage ()
|
||||||
|
{
|
||||||
|
echo "zpkg [options] <operation>"
|
||||||
|
echo ""
|
||||||
|
echo "Operations:"
|
||||||
|
echo " update Update packages"
|
||||||
|
echo " update-database Update only database"
|
||||||
|
echo " install <packages> Install packages"
|
||||||
|
echo " remove <packages> Remove packages"
|
||||||
|
echo " fetch <packages> Fetch packages into current directory"
|
||||||
|
echo " show <packages> Show package files"
|
||||||
|
echo " list List currently installed packages"
|
||||||
|
echo " list-all List all packages in repository"
|
||||||
|
echo " list-outdated List outdated packages"
|
||||||
|
echo " list-removed List outdated packages"
|
||||||
|
echo "Admin operations:"
|
||||||
|
echo " deploy <path> Deploy target to package server"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -h Display this help"
|
||||||
|
echo " -c <path> Custom config path"
|
||||||
|
}
|
||||||
|
|
||||||
|
error () {
|
||||||
|
printf "\033[1;31m%s\033[0m\n" "$1" >&2
|
||||||
|
}
|
||||||
|
root_check () {
|
||||||
|
if [ "$(id | cut -d'=' -f2 | cut -d'(' -f1)" -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "Root privileges required" > /dev/stderr
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
package ()
|
||||||
|
{
|
||||||
|
echo "Packaging $(getname "$1"): $(du -sh "$1" | awk '{print $1}')iB"
|
||||||
|
(
|
||||||
|
cd "$1"
|
||||||
|
if [ -n "$(command -v pv)" ]
|
||||||
|
then
|
||||||
|
tar cf - * -P | pv -s "$(du -sb . | awk '{print $1}')" | xz > "$2"
|
||||||
|
else
|
||||||
|
tar -cvJf "$2" *
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
mv "$1/$2" ./
|
||||||
|
}
|
||||||
|
|
||||||
|
update_remote_database ()
|
||||||
|
{
|
||||||
|
ssh $SSH_ADDRESS "~/database_update.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_folder ()
|
||||||
|
{
|
||||||
|
archive="$(getname "$1").tar.xz"
|
||||||
|
if [ -n "$(echo "$1" | grep '\.tar\.xz$' )" ]
|
||||||
|
then
|
||||||
|
deploy_package "$1" || return 1
|
||||||
|
else
|
||||||
|
package "$1" "$archive" || return 1
|
||||||
|
deploy_package "$archive" || return 1
|
||||||
|
rm "$archive" 2> /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_package ()
|
||||||
|
{
|
||||||
|
echo "Deploying $1: $(du -sh "$1" | awk '{print $1}')iB"
|
||||||
|
scp "$1" $SSH_ADDRESS:~/"$(grep 'PKG_PATH=' .config | cut -d'=' -f2-)"
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch_package ()
|
||||||
|
{
|
||||||
|
if ! wget "$HTTP_ADDRESS/zpkg/$1.tar.xz" -q --show-progress -O "$1.tar.xz" 2>&1
|
||||||
|
then
|
||||||
|
echo "Package '$1' not found" > /dev/stderr
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
add_package_entry ()
|
||||||
|
{
|
||||||
|
cd "$config_path"
|
||||||
|
if grep -q -w "$1" installed 2>/dev/null
|
||||||
|
then
|
||||||
|
sed "s|$1 .*|$1 $(date +%s)|g" -i installed
|
||||||
|
else
|
||||||
|
echo "$1 $(date +%s)" >> installed
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch_pkglist ()
|
||||||
|
{
|
||||||
|
cd "$config_path"
|
||||||
|
mv pkglist pkglist_bak 2>/dev/null
|
||||||
|
if ! wget "$HTTP_ADDRESS/zpkg/pkglist" -q --show-progress -O pkglist 2>&1
|
||||||
|
then
|
||||||
|
echo "Couldn't fetch server data" > /dev/stderr
|
||||||
|
mv pkglist_bak pkglist 2>/dev/null
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
rm pkglist_bak 2>/dev/null
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
view_package ()
|
||||||
|
{
|
||||||
|
cd "$PKG_PATH"
|
||||||
|
tar tf "$1.tar.xz"
|
||||||
|
}
|
||||||
|
|
||||||
|
unpack ()
|
||||||
|
{
|
||||||
|
echo "Unpacking $1"
|
||||||
|
tar xf "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_package ()
|
||||||
|
{
|
||||||
|
cd /
|
||||||
|
if fetch_package "$1"
|
||||||
|
then
|
||||||
|
unpack "$1.tar.xz"
|
||||||
|
mv "$1.tar.xz" "$PKG_PATH"
|
||||||
|
add_package_entry "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
removed_packages ()
|
||||||
|
{
|
||||||
|
cd "$config_path"
|
||||||
|
cat installed | while read -r in
|
||||||
|
do
|
||||||
|
name=$(echo "$in" | awk '{print $1}')
|
||||||
|
rem=$(grep -w "$name" pkglist | awk '{print $2}')
|
||||||
|
if [ -z "$rem" ] ; then
|
||||||
|
echo $name
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
outdated_packages ()
|
||||||
|
{
|
||||||
|
cd "$config_path"
|
||||||
|
cat installed | while read -r in
|
||||||
|
do
|
||||||
|
name=$(echo "$in" | awk '{print $1}')
|
||||||
|
loc=$(echo "$in" | awk '{print $2}')
|
||||||
|
rem=$(grep -w "$name" pkglist | awk '{print $2}')
|
||||||
|
if [ -n "$rem" ] && [ "$loc" -lt "$rem" ]
|
||||||
|
then
|
||||||
|
echo $name
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_package ()
|
||||||
|
{
|
||||||
|
cd "$PKG_PATH"
|
||||||
|
if [ ! -f "$1.tar.xz" ] || ! grep -q -w "$1" "$config_path/installed"
|
||||||
|
then
|
||||||
|
echo "Package '$1' not installed" > /dev/stderr
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "Removing $1"
|
||||||
|
tar tf "$1.tar.xz" | tac | while read -r in
|
||||||
|
do
|
||||||
|
rm -d "/$in" 2>/dev/null
|
||||||
|
done
|
||||||
|
rm "$1.tar.xz" 2>/dev/null
|
||||||
|
sed -i "/$1 /d" "$config_path/installed"
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts ":hc:" opt;
|
||||||
|
do
|
||||||
|
case $opt in
|
||||||
|
h)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
config_path="$OPTARG"
|
||||||
|
;;
|
||||||
|
\?)
|
||||||
|
echo "Uknown option: $OPTARG"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
config_file="$config_path/zpkg.conf"
|
||||||
|
|
||||||
|
if [ ! -d "$config_path" ]
|
||||||
|
then
|
||||||
|
mkdir -p "$config_path" 2>/dev/null
|
||||||
|
fi
|
||||||
|
if [ ! -f "$config_file" ]
|
||||||
|
then
|
||||||
|
echo "Error: no config file '$config_file'" > /dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
. "$config_file"
|
||||||
|
|
||||||
|
#ssh_address=$(grep "SSH_ADDRESS=" "$config_file" | cut -d '=' -f2-)
|
||||||
|
#http_address=$(grep "HTTP_ADDRESS=" "$config_file" | cut -d '=' -f2-)
|
||||||
|
#pkg_path=$(grep "PKG_PATH=" "$config_file" | cut -d '=' -f2-)
|
||||||
|
if [ "$(echo $PKG_PATH | cut -c1)" != "/" ]
|
||||||
|
then
|
||||||
|
PKG_PATH="$config_path/$PKG_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$PKG_PATH" ]
|
||||||
|
then
|
||||||
|
mkdir -p "$PKG_PATH" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$1" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
if [ "$1" = "list" ]
|
||||||
|
then
|
||||||
|
awk '{print $1}' "$config_path/installed" 2>/dev/null
|
||||||
|
|
||||||
|
elif [ "$1" = "list-all" ]
|
||||||
|
then
|
||||||
|
awk '{print $1}' "$config_path/pkglist" 2>/dev/null
|
||||||
|
|
||||||
|
|
||||||
|
elif [ "$1" = "fetch" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
shift $((OPTIND))
|
||||||
|
if [ -z "$2" ]
|
||||||
|
then
|
||||||
|
echo "No package specified" > /dev/stderr
|
||||||
|
else
|
||||||
|
for I in $*
|
||||||
|
do
|
||||||
|
fetch_package "$I"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
elif [ "$1" = "show" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
if [ -z "$2" ]
|
||||||
|
then
|
||||||
|
echo "No package specified" > /dev/stderr
|
||||||
|
else
|
||||||
|
shift $((OPTIND))
|
||||||
|
for I in $*
|
||||||
|
do
|
||||||
|
view_package "$I"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$1" = "install" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
if [ -z "$2" ]
|
||||||
|
then
|
||||||
|
echo "No package specified" > /dev/stderr
|
||||||
|
else
|
||||||
|
root_check
|
||||||
|
shift $((OPTIND))
|
||||||
|
for I in $*
|
||||||
|
do
|
||||||
|
install_package "$I"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$1" = "remove" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
if [ -z "$2" ]
|
||||||
|
then
|
||||||
|
echo "No package specified" > /dev/stderr
|
||||||
|
else
|
||||||
|
root_check
|
||||||
|
shift $((OPTIND))
|
||||||
|
for I in $*
|
||||||
|
do
|
||||||
|
remove_package "$I"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$1" = "update-database" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
root_check
|
||||||
|
fetch_pkglist
|
||||||
|
|
||||||
|
elif [ "$1" = "update" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
root_check
|
||||||
|
fetch_pkglist || exit 1
|
||||||
|
r_pkg=$(removed_packages)
|
||||||
|
o_pkg=$(outdated_packages)
|
||||||
|
if [ -n "$r_pkg" ]
|
||||||
|
then
|
||||||
|
echo "Removing packages: "$r_pkg
|
||||||
|
for I in $r_pkg
|
||||||
|
do
|
||||||
|
remove_package $I
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ -n "$o_pkg" ]
|
||||||
|
then
|
||||||
|
echo "Updating packages: "$o_pkg
|
||||||
|
for I in $o_pkg
|
||||||
|
do
|
||||||
|
remove_package $I
|
||||||
|
install_package $I
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$1" = "list-outdated" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
old_cfg_path=$config_path
|
||||||
|
config_path=/tmp/zpkg
|
||||||
|
mkdir -p $config_path
|
||||||
|
ln -sf $old_cfg_path/installed $config_path/installed
|
||||||
|
fetch_pkglist > /dev/null || exit 1
|
||||||
|
outdated_packages
|
||||||
|
|
||||||
|
elif [ "$1" = "list-removed" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
old_cfg_path=$config_path
|
||||||
|
config_path=/tmp/zpkg
|
||||||
|
mkdir -p $config_path
|
||||||
|
ln -sf $old_cfg_path/installed $config_path/installed
|
||||||
|
fetch_pkglist > /dev/null || exit 1
|
||||||
|
removed_packages
|
||||||
|
|
||||||
|
|
||||||
|
elif [ "$1" = "deploy" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
shift $((OPTIND))
|
||||||
|
for I in $*
|
||||||
|
do
|
||||||
|
deploy_folder "$I" || exit 1
|
||||||
|
done
|
||||||
|
update_remote_database
|
||||||
|
|
||||||
|
else
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
usage
|
||||||
|
fi
|
||||||
16
src/zpkg.bash
Normal file
16
src/zpkg.bash
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#/usr/bin/env bash
|
||||||
|
|
||||||
|
_zpkg_completion()
|
||||||
|
{
|
||||||
|
_cw1="deploy update update-database install remove fetch show list list-all list-outdated list-removed"
|
||||||
|
_cw1_pkgw="install remove fetch show"
|
||||||
|
_cw1_file="deploy"
|
||||||
|
if [ "$COMP_CWORD" = "1" ] ; then
|
||||||
|
_compwords=$_cw1
|
||||||
|
elif [ "$COMP_CWORD" -gt "1" ] && [ -n "$(echo "$_cw1_pkgw" | grep -w "${COMP_WORDS[1]}")" ] ; then
|
||||||
|
_compwords=$(zpkg list-all)
|
||||||
|
fi
|
||||||
|
COMPREPLY=($(compgen -W "$_compwords" "${COMP_WORDS[$COMP_CWORD]}"))
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _zpkg_completion -o dirnames zpkg
|
||||||
Loading…
Reference in a new issue