add emk - everest build system
This commit is contained in:
parent
c3f4f3d81c
commit
27db74632d
5
src/emk/README
Normal file
5
src/emk/README
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
+---------------------------------------+
|
||||||
|
| emk - simple and concise build system |
|
||||||
|
+---------------------------------------+
|
||||||
|
|
||||||
|
|
55
src/emk/emk
Executable file
55
src/emk/emk
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# emk - simple and concise build system
|
||||||
|
# Copyright (C) 2022 Everest Linux Developers
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# 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 General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#. /etc/emk.conf
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
printf "emk - simple and concise build system\n"
|
||||||
|
printf "usage: emk [help] [-h/--help] [-v/--version]\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "emk {help} show available tasks from emkfile\n"
|
||||||
|
printf "emk {-h/--help} show this mesage and exit\n"
|
||||||
|
printf "emk {-v/--version} show the version and exit\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "This program is free software.\n"
|
||||||
|
printf "See the GNU GPL version 3 for details.\n"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-v|--version)
|
||||||
|
printf "${blue}emk v1.0.0${reset}\n"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
help)
|
||||||
|
./emkfile showhelp
|
||||||
|
if [ "$?" != "0" ]; then
|
||||||
|
printf "emk ${red}ERR${reset} | failed to get help from emkfile.\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Check for root
|
||||||
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
||||||
|
printf "emk ${yellow}WARN${reset} | not running emk as root\n"
|
||||||
|
printf "emk ${yellow}WARN${reset} | THIS MAY PRODUCE UNEXPECTED RESULTS\n"
|
||||||
|
printf "emk ${yellow}WARN${reset} | however, this is NOT an error\n"
|
||||||
|
printf "emk ${yellow}WARN${reset} | and should not be treated as such.\n"
|
||||||
|
else
|
||||||
|
printf "emk ${blue}INFO${reset} | running emk as root\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
./emkfile $2
|
111
src/emk/emkfile.template
Normal file
111
src/emk/emkfile.template
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# emk - everest make - clear and concise build system
|
||||||
|
# for Everest Linux - build script template
|
||||||
|
|
||||||
|
# Output should follow this general format:
|
||||||
|
# emk INFO | output here
|
||||||
|
# emk WARN | output here
|
||||||
|
# emk ERR | output here
|
||||||
|
|
||||||
|
# Colored output should be impletemted where possible.
|
||||||
|
# In /etc/emk.conf, colors are defined by variable, ex:
|
||||||
|
# ${red} for errors
|
||||||
|
# ${yellow} for warnings
|
||||||
|
# ${blue} for general info
|
||||||
|
# ${reset} for removing colors
|
||||||
|
|
||||||
|
# Define working directory and source directory
|
||||||
|
# WORKING_DIR should not be changed.
|
||||||
|
# SRC_DIR should be changed to a directory which contains all
|
||||||
|
# source files and subdirectories
|
||||||
|
WORKING_DIR=$(pwd)
|
||||||
|
SRC_DIR=$(pwd)/../src # from working dir, go back and go into src
|
||||||
|
|
||||||
|
# Parse a local file containing settings for the installation
|
||||||
|
printf "emk ${blue}INFO${reset} | parsing install.conf\n"
|
||||||
|
. ${WORKING_DIR}/install.conf
|
||||||
|
if [ "$?" != 0 ]; then
|
||||||
|
printf "emk ${red}ERR${reset} | install.conf not found\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define functions for different tasks
|
||||||
|
|
||||||
|
### NECESSARY FUNCTIONS ################################################################
|
||||||
|
|
||||||
|
### default function ###
|
||||||
|
# $ emk make
|
||||||
|
# If package needs to be compiled from source code,
|
||||||
|
# put needed commands here, else leave output as is
|
||||||
|
compile_pkg() {
|
||||||
|
printf "emk ${yellow}WARN${reset} | no jobs to be done for task ''\n"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
### install function ###
|
||||||
|
# $ emk install
|
||||||
|
# This should be used to install binaries just compiled by emk,
|
||||||
|
# or prebuilt binaries
|
||||||
|
install_pkg() {
|
||||||
|
printf "emk ${yellow}WARN${reset} | no jobs to be done for task 'install'\n"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
### OPTIONAL FUNCTIONS #################################################################
|
||||||
|
|
||||||
|
### clean function ###
|
||||||
|
# $ emk clean
|
||||||
|
# Clean all files generated by other commands
|
||||||
|
clean_pkg() {
|
||||||
|
printf "emk ${yellow}WARN${reset} | no jobs to be done for task 'clean'\n"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
### distclean function ###
|
||||||
|
# $ emk distclean
|
||||||
|
# Clean all files not included in the source
|
||||||
|
# There are multiple ways of doing this -- experiment
|
||||||
|
# and see which works the best for you
|
||||||
|
distclean_pkg() {
|
||||||
|
printf "emk ${yellow}WARN${reset} | no jobs to be done for task 'distclean'\n"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
### custom functions ###
|
||||||
|
# Add any desired custom functions
|
||||||
|
# customfunc_pkg() {}
|
||||||
|
|
||||||
|
########################################################################################
|
||||||
|
|
||||||
|
# Command line flags
|
||||||
|
# These should not be modified unless adding support for custom funtions
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
help) # Put a list of all available tasks here
|
||||||
|
#printf "make - compile program\n"
|
||||||
|
#printf "install - install program\n"
|
||||||
|
#printf "clean - clean all files generated by make\n"
|
||||||
|
#printf "distclean - clean all files not in the source tree\n"
|
||||||
|
#exit 0
|
||||||
|
;;
|
||||||
|
make)
|
||||||
|
compile_pkg "$@"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
install_pkg "$@"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
clean)
|
||||||
|
clean_pkg "$@"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
distclean)
|
||||||
|
distclean_pkg "$@"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "emk ${red}ERR${reset} | no such task exists\n"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
27
src/esv/esv
27
src/esv/esv
@ -34,13 +34,13 @@ startsv() {
|
|||||||
printf "${red}you must specify a service name${reset}\n"
|
printf "${red}you must specify a service name${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "${blue}starting service ${2}...${reset}\n"
|
printf "${blue}starting service $2...${reset}\n"
|
||||||
${SRV_DIR}/${2}/${RUN}
|
${SRV_DIR}/$2/${RUN}
|
||||||
if [ "$?" != "0" ]; then
|
if [ "$?" != "0" ]; then
|
||||||
printf "${red}service ${2} could not start${reset}\n"
|
printf "${red}service $2 could not start${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "${green}service ${2} started successfully${reset}\n"
|
printf "${green}service $2 started successfully${reset}\n"
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,13 +49,13 @@ stopsv() {
|
|||||||
printf "${red}you must specify a service name${reset}\n"
|
printf "${red}you must specify a service name${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "${blue}stopping service ${2}...${reset}\n"
|
printf "${blue}stopping service $2...${reset}\n"
|
||||||
${SRV_DIR}/${2}/${STOP}
|
${SRV_DIR}/$2/${STOP}
|
||||||
if [ "$?" != "0" ]; then
|
if [ "$?" != "0" ]; then
|
||||||
printf "${red}service ${2} could not stop${reset}\n"
|
printf "${red}service $2 could not stop${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "${green}service ${2} stopped successfully${reset}\n"
|
printf "${green}service $2 stopped successfully${reset}\n"
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,13 +64,13 @@ restartsv() {
|
|||||||
printf "${red}you must specify a service name${reset}\n"
|
printf "${red}you must specify a service name${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "${blue}restarting service ${2}...${reset}\n"
|
printf "${blue}restarting service $2...${reset}\n"
|
||||||
${SRV_DIR}/${2}/${STOP} && ${SRV_DIR}/${2}/${RUN}
|
${SRV_DIR}/$2/${STOP} && ${SRV_DIR}/$2/${RUN}
|
||||||
if [ "$?" != "0" ]; then
|
if [ "$?" != "0" ]; then
|
||||||
printf "${red}service ${2} could not restart${reset}\n"
|
printf "${red}service $2 could not restart${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "${green}service ${2} restarted successfully${reset}\n"
|
printf "${green}service $2 restarted successfully${reset}\n"
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,12 +87,15 @@ case $1 in
|
|||||||
printver "$@"
|
printver "$@"
|
||||||
;;
|
;;
|
||||||
start)
|
start)
|
||||||
|
preload
|
||||||
startsv "$@"
|
startsv "$@"
|
||||||
;;
|
;;
|
||||||
stop)
|
stop)
|
||||||
|
preload
|
||||||
stopsv "$@"
|
stopsv "$@"
|
||||||
;;
|
;;
|
||||||
restartsv)
|
restartsv)
|
||||||
|
preload
|
||||||
restartsv "$@"
|
restartsv "$@"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
||||||
printf "must be run as root\n"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
WORKING_DIR=$(pwd)
|
|
||||||
|
|
||||||
printf "parsing install.conf\n"
|
|
||||||
source $WORKING_DIR/install.conf
|
|
||||||
if [ "$?" != 0 ]; then
|
|
||||||
printf "install.conf not found\n"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
printf "installing executable\n"
|
|
||||||
mv $WORKING_DIR/gpc $PREFIX/bin
|
|
||||||
if [ "$?" != 0 ]; then
|
|
||||||
mv $WORKING_DIR/gpc $PREFIX
|
|
||||||
printf "directory $PREFIX/bin does not exist, moving to $PREFIX instead\n"
|
|
||||||
fi
|
|
||||||
printf "installing configuration files\n"
|
|
||||||
mv $WORKING_DIR/gpc.conf $CONFDIR
|
|
||||||
if [ "$?" != 0 ]; then
|
|
||||||
printf "$CONFDIR does not exist\n"
|
|
||||||
printf "this can be corrected by running:\n"
|
|
||||||
printf "# mkdir -pv $CONFDIR\n"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
printf "finished installation\n"
|
|
||||||
exit 0
|
|
6
src/gpc/build.sh
Normal file
6
src/gpc/build.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [[ $(/usr/bin/id -u) != "0" ]]; then
|
||||||
|
printf "build script must be run as root\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
89
src/gpc/gpc
89
src/gpc/gpc
@ -1,9 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Glacier package checker
|
# Glacier package checker
|
||||||
|
|
||||||
/etc/gpc.conf
|
|
||||||
source $(pwd)/gpc.conf #remove before release
|
|
||||||
|
|
||||||
INSCRIPT=INSTALL.sh
|
INSCRIPT=INSTALL.sh
|
||||||
UPSCRIPT=UPDATE.sh
|
UPSCRIPT=UPDATE.sh
|
||||||
RMSCRIPT=REMOVE.sh
|
RMSCRIPT=REMOVE.sh
|
||||||
@ -12,60 +9,90 @@ PKGINFO=*-pkginfo.json
|
|||||||
|
|
||||||
TIMESTAMP=*.ts.sh
|
TIMESTAMP=*.ts.sh
|
||||||
|
|
||||||
case $1 in
|
check_dir() {
|
||||||
check)
|
|
||||||
printf "Searching for package directory...\n"
|
printf "Searching for package directory...\n"
|
||||||
if [ -d "$2" ]; then
|
if [ -d "$2" ]; then
|
||||||
printf "$green $2 exists.$reset\n"
|
printf "${green}$2 exists.${reset}\n"
|
||||||
else
|
else
|
||||||
printf "$red $2 does not exist.$reset\n"
|
printf "${red}$2 does not exist.${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd $2
|
cd $2
|
||||||
printf " Searching for instruction scripts in package directory...\n"
|
printf "Searching for instruction scripts...\n"
|
||||||
if [ -f $INSCRIPT -a -f $UPSCRIPT -a -f $RMSCRIPT ]; then
|
if [ -f $INSCRIPT -a -f $UPSCRIPT -a -f $RMSCRIPT ]; then
|
||||||
printf "$green Instruction scripts exist.$reset\n"
|
printf "${green}Instruction scripts exist.${reset}\n"
|
||||||
else
|
else
|
||||||
printf "$red Instruction scripts do not exist.$reset\n"
|
printf "${red}Instruction scripts do not exist.${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "Searching for miscellaneous files...\n"
|
printf "Searching for miscellaneous files...\n"
|
||||||
if [ -f $PKGINFO -a -f $TIMESTAMP ]; then
|
if [ -f $PKGINFO -a -f $TIMESTAMP ]; then
|
||||||
printf "$green $2.pkginfo and $2.ts.sh exist.$reset\n"
|
printf "${green}$2-pkginfo.json and $2.ts.sh exist.${reset}\n"
|
||||||
else
|
else
|
||||||
printf "$red $2.pkginfo and $2.ts.sh do not exist.$reset\n"
|
printf "${red}$2-pkginfo.json and $2.ts.sh do not exist.${reset}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
}
|
||||||
mkpkg)
|
|
||||||
printf "$blue Making package...$reset\n"
|
mkpkg() {
|
||||||
|
printf "${blue} Making package...${reset}\n"
|
||||||
cd $2
|
cd $2
|
||||||
tar -czvf $2.tar.gz *
|
tar -czvf $2.tar.gz *
|
||||||
printf "$blue Creating timestamp...$reset\n"
|
printf "${blue}Generating package checksum...${reset}\n"
|
||||||
sha256sum $2.tar.gz >> $2.checksum
|
cd ..
|
||||||
if [ "$?" != "0" ]; then
|
sha256sum $2/$2.tar.gz >> $2.checksum
|
||||||
printf "$red Failed to make package.$reset\n"
|
printf "${green}Finished making package${reset}\n"
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
printf "$green Finished making package$reset\n"
|
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
}
|
||||||
-h|--help)
|
|
||||||
printf "gpc - test and create Glacier packages\n"
|
helpmsg() {
|
||||||
|
printf "gpc - test and create Glacier compatible packages\n"
|
||||||
|
printf "usage: gpc [check] [mkpkg] [-h/--help] [-v/--version] pkg-dir\n"
|
||||||
printf "\n"
|
printf "\n"
|
||||||
printf "gpc {-h|--help} show this message and exit\n"
|
printf "gpc {-h|--help} show this message and exit\n"
|
||||||
printf "gpc {-v|--version} show the version and exit\n"
|
printf "gpc {-v|--version} show the version and exit\n"
|
||||||
printf "gpc {check} check a package for errors\n"
|
printf "gpc {check} check a package directory for compliance\n"
|
||||||
printf "gpc {mkpkg} create a package from a directory\n"
|
printf "gpc {mkpkg} create a package from a directory\n"
|
||||||
printf "\n"
|
printf "\n"
|
||||||
printf "This program is licensed under the GNU GPL v3.0\n"
|
printf "This program is free software.\n"
|
||||||
printf "You should have recieved a copy along with this program.\n"
|
printf "See the GNU GPL version 3 for details.\n"
|
||||||
printf "If not, see <https://www.gnu.org/licenses/gpl-3.0.en.html>\n"
|
|
||||||
exit 0
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
helpmsg_small() {
|
||||||
|
printf "usage: gpc [check] [mkpkg] [-h/--help] [-v/--version] pkg-dir\n"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
printver() {
|
||||||
|
printf "gpc v2.0.0\n"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
preload() {
|
||||||
|
. /etc/gpc.conf
|
||||||
|
if [ "$?" != "0" ]; then
|
||||||
|
printf "error while parsing gpc config file\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
helpmsg "$@"
|
||||||
;;
|
;;
|
||||||
-v|--version)
|
-v|--version)
|
||||||
printf "gpc v1.0.0\n"
|
printver "$@"
|
||||||
exit 0
|
;;
|
||||||
|
check)
|
||||||
|
check_dir "$@"
|
||||||
|
;;
|
||||||
|
mkpkg)
|
||||||
|
mkpkg "$@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
helpmsg_small "$@"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
71
src/gpc/gpc.old
Executable file
71
src/gpc/gpc.old
Executable file
@ -0,0 +1,71 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Glacier package checker
|
||||||
|
|
||||||
|
/etc/gpc.conf
|
||||||
|
source $(pwd)/gpc.conf #remove before release
|
||||||
|
|
||||||
|
INSCRIPT=INSTALL.sh
|
||||||
|
UPSCRIPT=UPDATE.sh
|
||||||
|
RMSCRIPT=REMOVE.sh
|
||||||
|
|
||||||
|
PKGINFO=*-pkginfo.json
|
||||||
|
|
||||||
|
TIMESTAMP=*.ts.sh
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
check)
|
||||||
|
printf " Searching for package directory...\n"
|
||||||
|
if [ -d "$2" ]; then
|
||||||
|
printf "$green $2 exists.$reset\n"
|
||||||
|
else
|
||||||
|
printf "$red $2 does not exist.$reset\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $2
|
||||||
|
printf " Searching for instruction scripts in package directory...\n"
|
||||||
|
if [ -f $INSCRIPT -a -f $UPSCRIPT -a -f $RMSCRIPT ]; then
|
||||||
|
printf "$green Instruction scripts exist.$reset\n"
|
||||||
|
else
|
||||||
|
printf "$red Instruction scripts do not exist.$reset\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf " Searching for miscellaneous files...\n"
|
||||||
|
if [ -f $PKGINFO -a -f $TIMESTAMP ]; then
|
||||||
|
printf "$green $2.pkginfo and $2.ts.sh exist.$reset\n"
|
||||||
|
else
|
||||||
|
printf "$red $2.pkginfo and $2.ts.sh do not exist.$reset\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
mkpkg)
|
||||||
|
printf "$blue Making package...$reset\n"
|
||||||
|
cd $2
|
||||||
|
tar -czvf $2.tar.gz *
|
||||||
|
printf "$blue Creating timestamp...$reset\n"
|
||||||
|
sha256sum $2.tar.gz >> $2.checksum
|
||||||
|
if [ "$?" != "0" ]; then
|
||||||
|
printf "$red Failed to make package.$reset\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
printf "$green Finished making package$reset\n"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
printf "gpc - test and create Glacier packages\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "gpc {-h|--help} show this message and exit\n"
|
||||||
|
printf "gpc {-v|--version} show the version and exit\n"
|
||||||
|
printf "gpc {check} check a package for errors\n"
|
||||||
|
printf "gpc {mkpkg} create a package from a directory\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "This program is licensed under the GNU GPL v3.0\n"
|
||||||
|
printf "You should have recieved a copy along with this program.\n"
|
||||||
|
printf "If not, see <https://www.gnu.org/licenses/gpl-3.0.en.html>\n"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-v|--version)
|
||||||
|
printf "gpc v1.0.0\n"
|
||||||
|
exit 0
|
||||||
|
esac
|
Loading…
Reference in New Issue
Block a user