Compare commits

2 Commits

Author SHA1 Message Date
868d131972 fix quota 2021-12-18 13:03:21 +01:00
81fc921e3f fix quota calc 2021-12-18 12:01:20 +01:00
3 changed files with 102 additions and 93 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.htaccess
.htpasswd
config.cfg
quota

View File

@@ -25,9 +25,17 @@ It's recommended to install UAAP automatically by using another script of mine,
### Manual method (not recommended, needs more work)
Download the git repository by using
`git clone http://src.mehl.mx/git/uberspace-setup.git`
Download the git repository by using
`git clone http://src.mehl.mx/git/uberspace-webadmin.git`
I assume it's best to place these files in a subdomain. I used `panel.example.com` for that.
Now open the files `config.cfg.sample`, `.htaccess.sample`, and `.htpasswd.sample` and change all necessary settings. Be sure to remove the `.sample` in the file names of these files afterwards.
### Other steps
On Uberspace 7, you'll need to create a cronjob to provide quota information because of SELinux limitations. To do so, edit your crontab with `crontab -e` and insert:
```
* * * * * quota -gsl > /var/www/virtual/MYUSERNAME/panel.example.com/quota
```

182
action.sh
View File

@@ -3,28 +3,28 @@
########################################################################
# Copyright (C) 2016 Max Mehl <mail [at] mehl [dot] mx>
########################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License along with this program. If not, see
#
# You should have received a copy of the GNU Affero General Public
# License along with this program. If not, see
# <http://www.gnu.org/licenses/>.
#
#
########################################################################
#
#
# This script handles calls from submit.php.
# It checks the validity of usernames, executes basic command
# When password entries are required, it starts the respective python
# scripts
#
#
########################################################################
# Test if config.cfg exists and set needed variables
@@ -40,8 +40,8 @@ PATH=$PATH:$HOME/bin
## FUNCTIONS
function checkaction {
REGEX="^adduser$|^changepw$|^listusers$|^userdetail$|^deluser$|^sizeall$|^sizeuser$|^viewdata$|^addalias$|^quota$|^installwp$|^uninstallwp$"
if [[ $1 =~ $REGEX ]]; then
echo "true"
if [[ $1 =~ $REGEX ]]; then
echo "true"
else
echo "false"
fi
@@ -49,8 +49,8 @@ function checkaction {
function checkuser {
REGEX="^[A-Za-z0-9._+-]+$" # Allowed symbols
if [[ $1 =~ $REGEX ]]; then
echo "true"
if [[ $1 =~ $REGEX ]]; then
echo "true"
else
echo "false"
fi
@@ -58,8 +58,8 @@ function checkuser {
function checkpass {
REGEX="[ '\\]" # Not allowed symbols
if [[ $(grep -E "$REGEX" $1 ; echo $?) == 1 ]]; then
echo "true"
if [[ $(grep -E "$REGEX" $1 ; echo $?) == 1 ]]; then
echo "true"
else
echo "false"
fi
@@ -74,7 +74,7 @@ function userexists {
fi
}
function mailsend {
function mailsend {
TOEMAIL="$TOEMAIL";
FREMAIL="$FREMAIL";
SUBJECT="[$DOMAIN] $1";
@@ -95,14 +95,14 @@ $MSGBODY2
}
function mailsendenc {
if [ ! -e $SSLKEY ]; then
#echo "Encryption key \"$SSLKEY\" is not available. Aborting."
#exit 1
openssl genrsa -out $SSLKEY 2048
fi
TOEMAIL="$TOEMAIL";
FREMAIL="$FREMAIL";
SUBJECT="[$DOMAIN] $1";
@@ -124,8 +124,8 @@ Content-Disposition: inline
$MSGBODY1
Upload the attached encrypted file to your Account Administration Panel
in order to see sensitive details. Please visit the section \"Decrypt
Upload the attached encrypted file to your Account Administration Panel
in order to see sensitive details. Please visit the section \"Decrypt
system email\" for more details.
--${BOUNDARY}
@@ -142,7 +142,7 @@ $ATTACHMENT
rm $MAILTMP;
}
function notesdelete {
function notesdelete {
USER="$1"
# Extract Mail part | exclude LEAD and TAIL | delete user
sed -n "/$LEAD/,/$TAIL/ p" $NOTES | grep -v "$LEAD\|$TAIL" | sed "/User:[ \t]*$USER$/,+2d" > $NOTESTMP
@@ -156,10 +156,10 @@ function notesinsert {
# Update datasheet (add new entry in Email section)
USER=$1
PASSFILE=$2
# Create temporary file from $PASSFILE
sed -E "s/(.*)/User: $USER\nPass: \1\n\n/" $PASSFILE > .$PASSFILE.tmp
# Insert this edited file into the datasheet
sed -i "/$TAIL/ {
h
@@ -184,34 +184,34 @@ fi
if [ "$ACTION" == "adduser" ]; then
echo "Adding new Email user..."
echo
if ! $(checkuser "$USER"); then
echo "Username \"$USER\" invalid"
exit 1
fi
if $(userexists "$USER"); then
echo "User \"$USER\" does already exist!"
exit 1
fi
if ! $(checkpass "$PASSFILE"); then
echo "Password \""$(cat $PASSFILE)"\" invalid"
exit 1
fi
python adduser.py "$USER" "$PASSFILE"
if [ $? == 0 ]; then
# Send infomail
$MAILTYPE "New Email account created" \
"A new Email account has been created." \
"User: $USER"
LEAD='## > EMAIL'
TAIL='## < EMAIL'
notesinsert "$USER" "$PASSFILE"
fi
fi # /adduser
@@ -221,26 +221,26 @@ fi # /adduser
if [ "$ACTION" == "addalias" ]; then
echo "Extracting details of Email account..."
echo
DEST=$PASS
if ! $(checkuser "$USER"); then
echo "Username \"$USER\" invalid"
exit 1
fi
if $(userexists "$USER"); then
echo "User \"$USER\" does already exist!"
exit 1
fi
if ! $(userexists "$DEST"); then
echo "Destination account \"$DEST\" does not exist!"
exit 1
fi
vaddalias $USER $DEST
fi # /addalias
# # # # #
@@ -249,19 +249,19 @@ fi # /addalias
if [ "$ACTION" == "changepw" ]; then
echo "Changing password of Email account..."
echo
if ! $(userexists "$USER"); then
echo "User \"$USER\" does not exist!"
exit 1
fi
if ! $(checkpass "$PASSFILE"); then
echo "Password \""$(cat $PASSFILE)"\" invalid"
exit 1
fi
python changepw.py "$USER" "$PASSFILE"
if [ $? == 0 ]; then
# Send infomail
$MAILTYPE "Email password changed" \
@@ -272,10 +272,10 @@ if [ "$ACTION" == "changepw" ]; then
# In fact a combination of deluser and adduser
LEAD='## > EMAIL'
TAIL='## < EMAIL'
notesdelete "$USER"
notesdelete "$USER"
notesinsert "$USER" "$PASSFILE"
fi
fi # /changepw
@@ -285,9 +285,9 @@ fi # /changepw
if [ "$ACTION" == "listusers" ]; then
echo "Listing all Email accounts..."
echo
listvdomain | column -s $' ' -t
fi # /listusers
# # # # #
@@ -296,9 +296,9 @@ fi # /listusers
if [ "$ACTION" == "sizeall" ]; then
echo "Calculate total size of all Email accounts..."
echo
du -sBM ~/users/* | sed -e "s:/home/$SYSUSER/users/::g"
fi # /sizeall
# # # # #
@@ -307,9 +307,9 @@ fi # /sizeall
if [ "$ACTION" == "viewdata" ]; then
echo "Extracting data sheet..."
echo
cat $NOTES
fi # /viewdata
# # # # #
@@ -318,10 +318,10 @@ fi # /viewdata
if [ "$ACTION" == "sizeuser" ]; then
echo "Calculate size of all folders of an Email account..."
echo
# Show size in MB, strip long paths, strip tmp and new folders, rename .INBOX cur-folder
du -BM ~/users/"$USER" | sed -e "s:/home/$SYSUSER/users/$USER/::g" | grep -v "/cur$\|new$\|tmp$" | sed "s:cur$:.INBOX:" | grep -v "/home/$SYSUSER/users/$USER" | sort -nr
fi # /sizeuser
# # # # #
@@ -330,14 +330,14 @@ fi # /sizeuser
if [ "$ACTION" == "userdetail" ]; then
echo "Extracting details of Email account..."
echo
if ! $(userexists "$USER"); then
echo "User \"$USER\" does not exist!"
exit 1
fi
dumpvuser "$USER" | column -s $' ' -t
fi # /userdetail
# # # # #
@@ -346,26 +346,26 @@ fi # /userdetail
if [ "$ACTION" == "quota" ]; then
echo "Calculating account disk usage..."
echo
USAGE=$(quota -gsl | tail -n 1 | awk -F" " '{ print $2 }')
QUOTA=$(quota -gsl | tail -n 1 | awk -F" " '{ print $3 }' | sed 's/[A-Za-z]//g')
USAGE=$(cat quota | tail -n 1 | awk -F" " '{ print $2 }')
QUOTA=$(cat quota | tail -n 1 | awk -F" " '{ print $3 }' | sed 's/[A-Za-z]//g')
# If smaller than 1M, set usage to 1M to avoid miscalcuations
if [ $(echo $USAGE | grep -q "[A-Za-z]$" ; echo $?) != 0 ]; then
if ! echo $USAGE | grep -q "[A-Za-z]$"; then
USAGE="1"
else
USAGE=$(echo $USAGE | sed 's/[A-Za-z]//g')
fi
PERC=$(echo "scale=2; $USAGE/$QUOTA" | bc)
PERC=$(echo "scale=2; $PERC*100" | bc)
echo "$USAGE MB of $QUOTA MB are used ($PERC %)."
PERC=$(echo "scale=2; 100 - $PERC" | bc)
echo "You have "$[$QUOTA - $USAGE]" MB free ($PERC %)."
echo "You have "$(($QUOTA - $USAGE))" MB free ($PERC %)."
fi # /quota
# # # # #
@@ -374,26 +374,26 @@ fi # /quota
if [ "$ACTION" == "deluser" ]; then
echo "Extracting details of Email account..."
echo
if ! $(userexists "$USER"); then
echo "User \"$USER\" does not exist!"
exit 1
fi
vdeluser "$USER"
if [ $? == 0 ]; then
# Send infomail
$MAILTYPE "Email account deleted" \
"An Email account has been deleted." \
"User: $USER"
# Update datasheet (delete entry in Email section)
LEAD='## > EMAIL'
TAIL='## < EMAIL'
notesdelete "$USER"
notesdelete "$USER"
fi
fi # /deluser
@@ -403,15 +403,15 @@ fi # /deluser
if [ "$ACTION" == "installwp" ]; then
echo "Installing WordPress..."
echo
# $USER: Username for Wordpress
# $PASS: Email address for Wordpress user
if ! $(checkuser "$USER"); then
echo "Username \"$USER\" invalid"
exit 1
fi
WEBDIR=$HOME/html
WPUSER=$USER
WPPASS=$(apg -n 1 -M NCL -m 14)
@@ -434,7 +434,7 @@ if [ "$ACTION" == "installwp" ]; then
echo "The default database \"${USER}_wp\" already exists."
exit 1
fi
# Downloading wordpress
wget $WPDL
unzip $(basename $WPDL)
@@ -448,7 +448,7 @@ if [ "$ACTION" == "installwp" ]; then
# Create database
mysql -e "CREATE DATABASE $MYSQLDB;"
# Use wp-cli to create config.php and install WP
wp-cli core config --dbname=${MYSQLDB} --dbpass=${MYSQLPASS} --dbuser=${MYSQLUSER} --path=${WEBDIR}
wp-cli core install --url="$WPDOMAIN" --title="CHANGE THIS TITLE" --admin_user=${WPUSER} --admin_password=${WPPASS} --admin_email=${WPMAIL} --path=${WEBDIR}
@@ -456,12 +456,12 @@ if [ "$ACTION" == "installwp" ]; then
# Update datasheet
TAIL='## < WORDPRESS'
sed -i "/$TAIL/i User: $WPUSER\nPass: $WPPASS\n" $NOTES
echo
echo "Wordpress successfully installed to $WPDOMAIN"
echo "You can login on $WPDOMAIN/wp-login.php"
echo "Please take a look into your data sheet for the login data."
fi # /installwp
# # # # #
@@ -470,15 +470,15 @@ fi # /installwp
if [ "$ACTION" == "uninstallwp" ]; then
echo "Uninstalling WordPress..."
echo
# $USER: Username for Wordpress
# $PASS: Email address for Wordpress user
WEBDIR=$HOME/html
MYSQLUSER=$SYSUSER
MYSQLDB=${MYSQLUSER}_wp
# Delete database and content of ~/htmp
mysql -e "DROP DATABASE ${MYSQLDB};"
rm -rf $WEBDIR/*
@@ -487,10 +487,10 @@ if [ "$ACTION" == "uninstallwp" ]; then
# Update datasheet
LEAD='## > WORDPRESS'
TAIL='## < WORDPRESS'
notesdelete ".*"
echo
echo "Wordpress successfully uninstalled."
fi # /uninstallwp