ea34890e74
This works by backup up all generated values upon extension installation and using them when updating extensions. This also means you won't get duplicate extension buttons in your extensions admin page. Expect a few more commits with bug fixes after this one, as I've got to test everything.
730 lines
30 KiB
Bash
730 lines
30 KiB
Bash
#!/bin/bash
|
|
|
|
# ptero.shop
|
|
# github.com/teamblueprint/main
|
|
# prpl.wtf
|
|
|
|
# This should allow Blueprint to run in docker. Please note that changing the $FOLDER variable after running
|
|
# the Blueprint installation script will not change anything in any files besides blueprint.sh.
|
|
FOLDER="pterodactyl"
|
|
|
|
# Check for panels that are using Docker.
|
|
if [[ -f ".dockerenv" ]]; then
|
|
DOCKER="y";
|
|
FOLDER="html"
|
|
else
|
|
DOCKER="n";
|
|
fi;
|
|
|
|
# If the fallback version below does not match your downloaded version, please let us know.
|
|
VER_FALLBACK="alpha-4TK";
|
|
|
|
# This will be automatically replaced by some marketplaces, if not, $VER_FALLBACK will be used as fallback.
|
|
PM_VERSION="([(pterodactylmarket_version)])";
|
|
|
|
if [[ -d "/var/www/$FOLDER/blueprint" ]]; then mv /var/www/$FOLDER/blueprint /var/www/$FOLDER/.blueprint; fi;
|
|
|
|
if [[ $PM_VERSION == "([(pterodactylmarket""_version)])" ]]; then
|
|
# This runs when the placeholder has not changed, indicating an issue with PterodactylMarket
|
|
# or Blueprint being installed from other sources.
|
|
if [[ ! -f "/var/www/$FOLDER/.blueprint/data/internal/db/version" ]]; then
|
|
sed -E -i "s*&bp.version&*$VER_FALLBACK*g" app/Services/Helpers/BlueprintPlaceholderService.php;
|
|
sed -E -i "s*@version*$VER_FALLBACK*g" public/extensions/blueprint/index.html;
|
|
touch /var/www/$FOLDER/.blueprint/data/internal/db/version;
|
|
fi;
|
|
|
|
VERSION=$VER_FALLBACK;
|
|
elif [[ $PM_VERSION != "([(pterodactylmarket""_version)])" ]]; then
|
|
# This runs in case it is possible to use the PterodactylMarket placeholder instead of the
|
|
# fallback version.
|
|
if [[ ! -f "/var/www/$FOLDER/.blueprint/data/internal/db/version" ]]; then
|
|
sed -E -i "s*&bp.version&*$PM_VERSION*g" app/Services/Helpers/BlueprintPlaceholderService.php;
|
|
sed -E -i "s*@version*$PM_VERSION*g" public/extensions/blueprint/index.html;
|
|
touch /var/www/$FOLDER/.blueprint/data/internal/db/version;
|
|
fi;
|
|
|
|
VERSION=$PM_VERSION;
|
|
fi;
|
|
|
|
# Fix for Blueprint's bash database to work with docker and custom folder installations.
|
|
sed -i "s!&bp.folder&!$FOLDER!g" /var/www/$FOLDER/.blueprint/lib/db.sh;
|
|
|
|
cd /var/www/$FOLDER; # Automatically navigate to the Pterodactyl directory when running the script.
|
|
# Import libraries.
|
|
source .blueprint/lib/bash_colors.sh;
|
|
source .blueprint/lib/parse_yaml.sh;
|
|
source .blueprint/lib/db.sh;
|
|
source .blueprint/lib/telemetry.sh;
|
|
|
|
# -config
|
|
# usage: "cITEM=VALUE bash blueprint.sh -config"
|
|
if [[ "$1" == "-config" ]]; then
|
|
|
|
# cTELEMETRY_ID
|
|
# Update the telemetry id.
|
|
if [[ $cTELEMETRY_ID != "" ]]; then
|
|
echo "$cTELEMETRY_ID" > .blueprint/data/internal/db/telemetry_id;
|
|
fi;
|
|
|
|
echo BP_100;
|
|
exit 1;
|
|
fi;
|
|
|
|
# Function that exits the script after logging a "red" message.
|
|
quit_red() {
|
|
log_red "$1";
|
|
exit 1;
|
|
};
|
|
|
|
# Adds the "blueprint" command to the /usr/local/bin directory and configures the correct permissions for it.
|
|
touch /usr/local/bin/blueprint > /dev/null;
|
|
echo -e "#!/bin/bash\nbash /var/www/$FOLDER/blueprint.sh -bash \$@;" > /usr/local/bin/blueprint;
|
|
chmod u+x /var/www/$FOLDER/blueprint.sh > /dev/null;
|
|
chmod u+x /usr/local/bin/blueprint > /dev/null;
|
|
|
|
if [[ $1 != "-bash" ]]; then
|
|
if dbValidate "blueprint.setupFinished"; then
|
|
log_yellow "[WARNING] This command only works if you have yet to install Blueprint. Run 'blueprint (cmd) [arg]' instead.";
|
|
exit 1;
|
|
else
|
|
# Only run if Blueprint is not in the process of upgrading.
|
|
if [[ $1 != "--post-upgrade" ]]; then
|
|
log " ██\n██ ██\n ████\n"; # Blueprint logo made out of unicode icons.
|
|
if [[ $DOCKER == "y" ]]; then
|
|
log_yellow "[WARNING] While running Blueprint with docker is supported, you may run into some issues. Report problems you find at ptero.shop/issue.";
|
|
fi;
|
|
fi;
|
|
|
|
# Update folder placeholder on PlaceholderService and admin layout.
|
|
log_bright "[INFO] /var/www/$FOLDER/app/Services/Helpers/BlueprintPlaceholderService.php";
|
|
sed -i "s!&bp.folder&!$FOLDER!g" /var/www/$FOLDER/app/Services/Helpers/BlueprintPlaceholderService.php;
|
|
log_bright "[INFO] /var/www/$FOLDER/app/Services/Helpers/BlueprintPlaceholderService.php";
|
|
sed -i "s!&bp.folder&!$FOLDER!g" /var/www/$FOLDER/resources/views/layouts/admin.blade.php;
|
|
|
|
# Copy "Blueprint" extension page logo from assets.
|
|
log_bright "[INFO] pulling blueprint logo from assets";
|
|
cp /var/www/$FOLDER/.blueprint/assets/logo.jpg /var/www/$FOLDER/public/assets/extensions/blueprint/logo.jpg;
|
|
|
|
# Put application into maintenance.
|
|
log_bright "[INFO] php artisan down";
|
|
php artisan down;
|
|
|
|
# Inject custom Blueprint css into Pterodactyl's admin panel.
|
|
log_bright "[INFO] updating admin css";
|
|
sed -i "s!@import url(/assets/extensions/blueprint/blueprint.style.css);!!g" /var/www/$FOLDER/public/themes/pterodactyl/css/pterodactyl.css;
|
|
sed -i "s!/\* admin.css \*/!!g" /var/www/$FOLDER/public/themes/pterodactyl/css/pterodactyl.css;
|
|
sed -i '1i@import url(/assets/extensions/blueprint/blueprint.style.css);\n/* admin.css */' /var/www/$FOLDER/public/themes/pterodactyl/css/pterodactyl.css;
|
|
|
|
# Clear view cache.
|
|
log_bright "[INFO] php artisan view:clear";
|
|
php artisan view:clear;
|
|
|
|
|
|
# Clear PHP config. Not sure what this does yet, but I know it fixes some strange problems.
|
|
log_bright "[INFO] php artisan config:clear";
|
|
php artisan config:clear;
|
|
|
|
|
|
# Run migrations if Blueprint is not upgrading.
|
|
if [[ $1 != "--post-upgrade" ]]; then
|
|
log_bright "[INFO] php artisan migrate";
|
|
log_yellow "[WARNING] Answering 'no' or 'n' to the following prompt may result into problems with Blueprint."
|
|
php artisan migrate;
|
|
fi;
|
|
|
|
|
|
# Make sure all files have correct permissions.
|
|
log_bright "[INFO] chown -R www-data:www-data /var/www/$FOLDER/*";
|
|
chown -R www-data:www-data /var/www/$FOLDER/*;
|
|
|
|
# Make sure all .files have the correct permissions as well.
|
|
log_bright "[INFO] chown -R www-data:www-data /var/www/$FOLDER/.*";
|
|
chown -R www-data:www-data /var/www/$FOLDER/.*;
|
|
|
|
# Remove placeholder README.md files.
|
|
log_bright "[INFO] rm -R /var/www/$FOLDER/.blueprint/dev/*";
|
|
rm -R /var/www/$FOLDER/.blueprint/dev/*;
|
|
log_bright "[INFO] rm -R /var/www/$FOLDER/.blueprint/data/extensions/*";
|
|
rm -R /var/www/$FOLDER/.blueprint/data/extensions/*;
|
|
log_bright "[INFO] rm /var/www/$FOLDER/tools/tmp/README.md";
|
|
rm /var/www/$FOLDER/tools/tmp/README.md > /dev/null;
|
|
|
|
# Put application into production.
|
|
log_bright "[INFO] php artisan up";
|
|
php artisan up;
|
|
|
|
# Only show donate + success message if Blueprint is not upgrading.
|
|
if [[ $1 != "--post-upgrade" ]]; then
|
|
log_bright "[INFO] Blueprint is completely open source and free. Please consider supporting us on \"ptero.shop/donate\".";
|
|
sleep 2;
|
|
log_green "\n\n[SUCCESS] Blueprint should now be installed. If something didn't work as expected, please let us know at ptero.shop/issue.";
|
|
fi;
|
|
|
|
dbAdd "blueprint.setupFinished";
|
|
# Let the panel know the user has finished installation.
|
|
sed -i "s!NOTINSTALLED!INSTALLED!g" /var/www/$FOLDER/app/Services/Helpers/BlueprintPlaceholderService.php;
|
|
exit 1;
|
|
fi;
|
|
fi;
|
|
|
|
# -i, -install
|
|
if [[ ( $2 == "-i" ) || ( $2 == "-install" ) ]]; then
|
|
if [[ $(expr $# - 2) != 1 ]]; then quit_red "[FATAL] Expected 1 argument but got $(expr $# - 2).";fi;
|
|
if [[ $3 == "test␀" ]]; then
|
|
dev=true;
|
|
n="dev";
|
|
mkdir .blueprint/tmp/dev;
|
|
cp -R .blueprint/dev/* .blueprint/tmp/dev/;
|
|
else
|
|
dev=false;
|
|
n=$3;
|
|
FILE=$n".blueprint";
|
|
if [[ ! -f "$FILE" ]]; then quit_red "[FATAL] $FILE could not be found.";fi;
|
|
|
|
ZIP=$n".zip";
|
|
cp $FILE .blueprint/tmp/$ZIP;
|
|
cd .blueprint/tmp;
|
|
unzip $ZIP;
|
|
rm $ZIP;
|
|
if [[ ! -f "$n/*" ]]; then
|
|
cd ..;
|
|
rm -R tmp;
|
|
mkdir tmp;
|
|
cd tmp;
|
|
|
|
mkdir ./$n;
|
|
cp ../../$FILE ./$n/$ZIP;
|
|
cd $n;
|
|
unzip $ZIP;
|
|
rm $ZIP;
|
|
cd ..;
|
|
fi;
|
|
fi;
|
|
|
|
# Return to the Pterodactyl installation folder.
|
|
cd /var/www/$FOLDER;
|
|
|
|
# Get all strings from the conf.yml file and make them accessible as variables.
|
|
eval $(parse_yaml .blueprint/tmp/$n/conf.yml conf_)
|
|
|
|
# Add aliases for config values to make working with them easier.
|
|
name=$conf_info_name;
|
|
identifier=$conf_info_identifier;
|
|
description=$conf_info_description;
|
|
flags=$conf_info_flags;
|
|
version=$conf_info_version;
|
|
target=$conf_info_target;
|
|
author=$conf_info_author;
|
|
icon=$conf_info_icon;
|
|
website=$conf_info_website; #(optional)
|
|
|
|
admin_view=$conf_admin_view;
|
|
admin_controller=$conf_admin_controller; #(optional)
|
|
admin_css=$conf_admin_css; #(optional)
|
|
admin_wrapper=$conf_admin_wrapper; #(optional)
|
|
|
|
dashboard_wrapper=$conf_dashboard_wrapper; #(optional)
|
|
|
|
data_directory=$conf_data_directory; #(optional)
|
|
data_public=$conf_data_public; #(optional)
|
|
|
|
database_migrations=$conf_database_migrations; #(optional)
|
|
|
|
if [[ ( $icon == "/"* ) || ( $icon == "."* ) || ( $icon == *"\n"* ) ]] ||
|
|
[[ ( $admin_view == "/"* ) || ( $admin_view == "."* ) || ( $admin_view == *"\n"* ) ]] ||
|
|
[[ ( $admin_controller == "/"* ) || ( $admin_controller == "."* ) || ( $admin_controller == *"\n"* ) ]] ||
|
|
[[ ( $admin_css == "/"* ) || ( $admin_css == "."* ) || ( $admin_css == *"\n"* ) ]] ||
|
|
[[ ( $data_directory == "/"* ) || ( $data_directory == "."* ) || ( $data_directory == *"\n"* ) ]] ||
|
|
[[ ( $data_public == "/"* ) || ( $data_public == "."* ) || ( $data_public == *"\n"* ) ]] ||
|
|
[[ ( $database_migrations == "/"* ) || ( $database_migrations == "."* ) || ( $database_migrations == *"\n"* ) ]]; then
|
|
rm -R .blueprint/tmp/$n;
|
|
quit_red "[FATAL] Extension has failed security checks, halting installation.";
|
|
fi;
|
|
|
|
if [[ $(cat .blueprint/data/internal/db/installed_extensions) == *"$identifier,"* ]]; then
|
|
log_bright "[INFO] Extension appears to be installed already, reading variables..";
|
|
eval $(parse_yaml .blueprint/data/extensions/$identifier/.store/conf.yml old_);
|
|
DUPLICATE="y";
|
|
|
|
if [[ ! -f ".blueprint/data/extensions/$identifier/.store/*" ]] ||
|
|
[[ ! -f ".blueprint/data/extensions/$identifier/.store/conf.yml" ]] ||
|
|
[[ ! -f ".blueprint/data/extensions/$identifier/.store/build/button.blade.php" ]] ||
|
|
[[ ! -f ".blueprint/data/extensions/$identifier/.store/build/controller.php" ]] ||
|
|
[[ ! -f ".blueprint/data/extensions/$identifier/.store/build/route.php" ]] ||
|
|
[[ ! -f ".blueprint/data/extensions/$identifier/.store/build/admin.blade.php" ]]; then
|
|
rm -R .blueprint/tmp/$n;
|
|
quit_red "[FATAL] Upgrading extension has failed due to missing .store files.";
|
|
fi;
|
|
fi;
|
|
|
|
if [[ $website != "" ]]; then
|
|
if [[ $website != "https://"* ]]; then
|
|
if [[ $website != "http://"* ]]; then
|
|
website="http://"$info_website;
|
|
fi;
|
|
fi;
|
|
fi;
|
|
|
|
if [[ $dev == true ]]; then
|
|
mv .blueprint/tmp/$n .blueprint/tmp/$identifier;
|
|
n=$identifier;
|
|
fi;
|
|
|
|
if [[ ( $flags != *"ignorePlaceholders,"* ) && ( $flags != *"ignorePlaceholders" ) ]]; then
|
|
DIR=.blueprint/tmp/$n/*;
|
|
|
|
if [[ ( $flags == *"ignoreAlphabetPlaceholders,"* ) || ( $flags == *"ignoreAlphabetPlaceholders" ) ]]; then
|
|
SKIPAZPLACEHOLDERS=true;
|
|
log_bright "[INFO] Alphabet placeholders will be skipped due to the 'ignoreAlphabetPlaceholders' flag.";
|
|
else
|
|
SKIPAZPLACEHOLDERS=false;
|
|
fi;
|
|
|
|
for f in $(find $DIR -type f -exec echo {} \;); do
|
|
sed -i "s~\^#version#\^~$version~g" $f;
|
|
sed -i "s~\^#author#\^~$author~g" $f;
|
|
sed -i "s~\^#name#\^~$name~g" $f;
|
|
sed -i "s~\^#identifier#\^~$identifier~g" $f;
|
|
sed -i "s~\^#path#\^~/var/www/$FOLDER~g" $f;
|
|
sed -i "s~\^#datapath#\^~/var/www/$FOLDER/.blueprint/data/extensions/$identifier~g" $f;
|
|
|
|
if [[ $SKIPAZPLACEHOLDERS != true ]]; then
|
|
sed -i "s~__version__~$version~g" $f;
|
|
sed -i "s~__author__~$author~g" $f;
|
|
sed -i "s~__identifier__~$identifier~g" $f;
|
|
sed -i "s~__name__~$name~g" $f;
|
|
sed -i "s~__path__~/var/www/$FOLDER~g" $f;
|
|
sed -i "s~__datapath__~/var/www/$FOLDER/.blueprint/data/extensions/$identifier~g" $f;
|
|
fi;
|
|
|
|
log_bright "[INFO] Done placeholders in '$f'.";
|
|
done;
|
|
|
|
else log_bright "[INFO] Placeholders will be skipped due to the 'ignorePlaceholders' flag."; fi;
|
|
|
|
if [[ $name == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'info_name' is a required configuration option.";fi;
|
|
if [[ $identifier == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'info_identifier' is a required configuration option.";fi;
|
|
if [[ $description == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'info_description' is a required configuration option.";fi;
|
|
if [[ $version == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'info_version' is a required configuration option.";fi;
|
|
if [[ $target == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'info_target' is a required configuration option.";fi;
|
|
if [[ $icon == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'info_icon' is a required configuration option.";fi;
|
|
|
|
if [[ $admin_controller == "" ]]; then log_bright "[INFO] Admin controller field left blank, using default controller instead..";
|
|
controller_type="default";else controller_type="custom";fi;
|
|
if [[ $admin_view == "" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] 'admin_view' is a required configuration option.";fi;
|
|
if [[ $target != $VERSION ]]; then log_yellow "[WARNING] This extension is built for version $target, but your version is $VERSION.";fi;
|
|
if [[ $identifier != $n ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] The extension file name must be the same as your identifier. (example: identifier.blueprint)";fi;
|
|
if [[ $identifier == "blueprint" ]]; then rm -R .blueprint/tmp/$n; quit_red "[FATAL] Extensions can not have the identifier 'blueprint'.";fi;
|
|
|
|
if [[ $identifier =~ [a-z] ]]; then log_bright "[INFO] Identifier a-z checks passed.";
|
|
else rm -R .blueprint/tmp/$n; quit_red "[FATAL] The extension identifier should be lowercase and only contain characters a-z.";fi;
|
|
if [[ ! -f ".blueprint/tmp/$n/$icon" ]]; then
|
|
rm -R .blueprint/tmp/$n; quit_red "[FATAL] The 'info_icon' path points to a file that does not exist.";fi;
|
|
|
|
if [[ $database_migrations != "" ]]; then
|
|
cp -R .blueprint/tmp/$n/$database_migrations/* database/migrations/ 2> /dev/null;
|
|
fi;
|
|
|
|
if [[ $admin_requests != "" ]]; then
|
|
log_yellow "[WARNING] Admin requests are deprecated. Use them in your controller instead.";
|
|
fi;
|
|
|
|
if [[ $data_public != "" ]]; then
|
|
mkdir public/extensions/$identifier;
|
|
cp -R .blueprint/tmp/$n/$data_public/* public/extensions/$identifier/ 2> /dev/null;
|
|
fi;
|
|
|
|
cp -R .blueprint/data/internal/build/extensions/admin.blade.php .blueprint/data/internal/build/extensions/admin.blade.php.bak 2> /dev/null;
|
|
if [[ $admin_controller == "" ]]; then # use default controller when admin_controller is left blank
|
|
cp -R .blueprint/data/internal/build/extensions/controller.php .blueprint/data/internal/build/extensions/controller.php.bak 2> /dev/null;
|
|
fi;
|
|
cp -R .blueprint/data/internal/build/extensions/route.php .blueprint/data/internal/build/extensions/route.php.bak 2> /dev/null;
|
|
cp -R .blueprint/data/internal/build/extensions/button.blade.php .blueprint/data/internal/build/extensions/button.blade.php.bak 2> /dev/null;
|
|
|
|
# Start creating data directory.
|
|
mkdir .blueprint/data/extensions/$identifier;
|
|
mkdir .blueprint/data/extensions/$identifier/.store;
|
|
|
|
cp .blueprint/tmp/$n/conf.yml .blueprint/data/extensions/$identifier/.store/conf.yml; #backup conf.yml
|
|
|
|
if [[ $data_directory != "" ]]; then
|
|
cp -R .blueprint/tmp/$n/$data_directory/* .blueprint/data/extensions/$identifier/;
|
|
fi;
|
|
# End creating data directory.
|
|
|
|
mkdir public/assets/extensions/$identifier;
|
|
cp .blueprint/tmp/$n/$icon public/assets/extensions/$identifier/icon.jpg;
|
|
ICON="/assets/extensions/$identifier/icon.jpg";
|
|
CONTENT=$(cat .blueprint/tmp/$n/$admin_view);
|
|
|
|
if [[ $admin_css != "" ]]; then
|
|
sed -i "s~@import url(/assets/extensions/$identifier/$identifier.style.css);~~g" public/themes/pterodactyl/css/pterodactyl.css;
|
|
sed -i "s~/\* admin.css \*/~/\* admin.css \*/\n@import url(/assets/extensions/$identifier/$identifier.style.css);~g" public/themes/pterodactyl/css/pterodactyl.css;
|
|
cp .blueprint/tmp/$n/$admin_css public/assets/extensions/$identifier/$identifier.style.css;
|
|
fi;
|
|
|
|
if [[ $name == *"~"* ]]; then log_yellow "[WARNING] 'name' contains '~' and may result in an error.";fi;
|
|
if [[ $description == *"~"* ]]; then log_yellow "[WARNING] 'description' contains '~' and may result in an error.";fi;
|
|
if [[ $version == *"~"* ]]; then log_yellow "[WARNING] 'version' contains '~' and may result in an error.";fi;
|
|
if [[ $CONTENT == *"~"* ]]; then log_yellow "[WARNING] 'CONTENT' contains '~' and may result in an error.";fi;
|
|
if [[ $ICON == *"~"* ]]; then log_yellow "[WARNING] 'ICON' contains '~' and may result in an error.";fi;
|
|
if [[ $identifier == *"~"* ]]; then log_yellow "[WARNING] 'identifier' contains '~' and may result in an error.";fi;
|
|
|
|
sed -i "s~␀title␀~$name~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
sed -i "s~␀name␀~$name~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
sed -i "s~␀name␀~$name~g" .blueprint/data/internal/build/extensions/button.blade.php.bak;
|
|
|
|
sed -i "s~␀description␀~$description~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
|
|
sed -i "s~␀version␀~$version~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
sed -i "s~␀version␀~$version~g" .blueprint/data/internal/build/extensions/button.blade.php.bak;
|
|
|
|
sed -i "s~␀icon␀~$ICON~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
|
|
if [[ $website != "" ]]; then
|
|
sed -i "s~␀website␀~$website~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
sed -i "s~<!--websitecomment␀ ~~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
sed -i "s~ ␀websitecomment-->~~g" .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
fi;
|
|
|
|
echo -e "$CONTENT\n@endsection" >> .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
|
|
|
|
if [[ $admin_controller == "" ]]; then
|
|
sed -i "s~␀id␀~$identifier~g" .blueprint/data/internal/build/extensions/controller.php.bak;
|
|
fi;
|
|
sed -i "s~␀id␀~$identifier~g" .blueprint/data/internal/build/extensions/route.php.bak;
|
|
sed -i "s~␀id␀~$identifier~g" .blueprint/data/internal/build/extensions/button.blade.php.bak;
|
|
|
|
ADMINVIEW_RESULT=$(cat .blueprint/data/internal/build/extensions/admin.blade.php.bak);
|
|
ADMINROUTE_RESULT=$(cat .blueprint/data/internal/build/extensions/route.php.bak);
|
|
ADMINBUTTON_RESULT=$(cat .blueprint/data/internal/build/extensions/button.blade.php.bak);
|
|
if [[ $admin_controller == "" ]]; then
|
|
ADMINCONTROLLER_RESULT=$(cat .blueprint/data/internal/build/extensions/controller.php.bak);
|
|
fi;
|
|
ADMINCONTROLLER_NAME=$identifier"ExtensionController.php";
|
|
|
|
mkdir resources/views/admin/extensions/$identifier;
|
|
touch resources/views/admin/extensions/$identifier/index.blade.php;
|
|
echo $ADMINVIEW_RESULT > resources/views/admin/extensions/$identifier/index.blade.php;
|
|
|
|
mkdir app/Http/Controllers/Admin/Extensions/$identifier;
|
|
touch app/Http/Controllers/Admin/Extensions/$identifier/$ADMINCONTROLLER_NAME;
|
|
|
|
if [[ $admin_controller == "" ]]; then
|
|
touch app/Http/Controllers/Admin/Extensions/$identifier/$ADMINCONTROLLER_NAME;
|
|
echo $ADMINCONTROLLER_RESULT > app/Http/Controllers/Admin/Extensions/$identifier/$ADMINCONTROLLER_NAME;
|
|
else
|
|
cp .blueprint/tmp/$n/$admin_controller app/Http/Controllers/Admin/Extensions/$identifier/$ADMINCONTROLLER_NAME;
|
|
fi;
|
|
|
|
if [[ $DUPLICATE != "y" ]]; then
|
|
echo $ADMINROUTE_RESULT >> routes/admin.php;
|
|
fi;
|
|
|
|
if [[ $DUPLICATE == "y" ]]; then
|
|
sed -E -i "s~$(cat .blueprint/data/extensions/$identifier/.store/build/button.blade.php)~~g" resources/views/admin/extensions.blade.php;
|
|
fi;
|
|
sed -i "s~<!--␀replace␀-->~$ADMINBUTTON_RESULT\n<!--␀replace␀-->~g" resources/views/admin/extensions.blade.php;
|
|
|
|
# insert "dashboard_wrapper" into wrapper.blade.php
|
|
if [[ $dashboard_wrapper != "" ]]; then
|
|
sed -i "/<\!-- wrapper:insert -->/r .blueprint/tmp/$n/$dashboard_wrapper" resources/views/templates/wrapper.blade.php;
|
|
fi;
|
|
|
|
# insert "admin_wrapper" into admin.blade.php
|
|
if [[ $admin_wrapper != "" ]]; then
|
|
sed -i "/<\!-- wrapper:insert -->/r .blueprint/tmp/$n/$admin_wrapper" resources/views/layouts/admin.blade.php;
|
|
fi;
|
|
|
|
# Create backup of generated values.
|
|
log_bright "[INFO] Backing up build files..";
|
|
mkdir .blueprint/data/extensions/$identifier/.store/build;
|
|
cp .blueprint/data/internal/build/extensions/admin.blade.php.bak .blueprint/data/extensions/$identifier/.store/build/admin.blade.php;
|
|
cp .blueprint/data/internal/build/extensions/controller.php.bak .blueprint/data/extensions/$identifier/.store/build/controller.php;
|
|
cp .blueprint/data/internal/build/extensions/route.php.bak .blueprint/data/extensions/$identifier/.store/build/route.php;
|
|
cp .blueprint/data/internal/build/extensions/button.blade.php.bak .blueprint/data/extensions/$identifier/.store/build/button.blade.php;
|
|
|
|
log_bright "[INFO] Cleaning up build files..";
|
|
rm .blueprint/data/internal/build/extensions/admin.blade.php.bak;
|
|
if [[ $admin_controller == "" ]]; then
|
|
rm .blueprint/data/internal/build/extensions/controller.php.bak;
|
|
fi;
|
|
rm .blueprint/data/internal/build/extensions/route.php.bak;
|
|
rm .blueprint/data/internal/build/extensions/button.blade.php.bak;
|
|
log_bright "[INFO] Cleaning up temp files..";
|
|
rm -R .blueprint/tmp/$n;
|
|
|
|
if [[ $database_migrations != "" ]]; then
|
|
log_bright "[INFO] This extension comes with migrations. If you get prompted, answer 'yes'.\n";
|
|
php artisan migrate;
|
|
fi;
|
|
|
|
chmod -R +x .blueprint/data/extensions/$identifier/*;
|
|
|
|
if [[ ( $flags == *"hasInstallScript,"* ) || ( $flags == *"hasInstallScript" ) ]]; then
|
|
log_yellow "[WARNING] This extension uses a custom installation script, proceed with caution.";
|
|
chmod +x .blueprint/data/extensions/$identifier/install.sh;
|
|
bash .blueprint/data/extensions/$identifier/install.sh;
|
|
fi;
|
|
|
|
if [[ $DUPLICATE != "y" ]]; then
|
|
echo $identifier"," >> .blueprint/data/internal/db/installed_extensions;
|
|
log_bright "[INFO] Added '$identifier' to the list of installed extensions.";
|
|
fi;
|
|
|
|
if [[ $DUPLICATE == "y" ]]; then
|
|
log_green "\n\n[SUCCESS] $identifier should now be updated. If something didn't work as expected, please let us know at ptero.shop/issue.";
|
|
else
|
|
log_green "\n\n[SUCCESS] $identifier should now be installed. If something didn't work as expected, please let us know at ptero.shop/issue.";
|
|
fi;
|
|
if [[ $dev == false ]]; then
|
|
sendTelemetry "FINISH_EXTENSION_INSTALLATION" > /dev/null;
|
|
fi;
|
|
fi;
|
|
|
|
# help, -help, --help
|
|
if [[ ( $2 == "help" ) || ( $2 == "-help" ) || ( $2 == "--help" ) ]]; then
|
|
echo -e " -install [name] install a blueprint extension""
|
|
" "-version get the current blueprint version""
|
|
" "-init initialize extension development files""
|
|
" "-build run an installation on your extension development files""
|
|
" "-export export your extension development files""
|
|
" "-runinstall rerun the blueprint installation script (advanced)""
|
|
" "-upgrade (dev) update/reset to a newer pre-release version (advanced)";
|
|
fi;
|
|
|
|
# -v, -version
|
|
if [[ ( $2 == "-v" ) || ( $2 == "-version" ) ]]; then
|
|
echo -e $VERSION;
|
|
fi;
|
|
|
|
# -init
|
|
if [[ $2 == "-init" ]]; then
|
|
|
|
ask_name() {
|
|
log_blue "[INPUT] Name (Generic Extension):";
|
|
read ASKNAME;
|
|
|
|
REDO_NAME=false;
|
|
|
|
# Name should not be empty
|
|
if [[ $ASKNAME == "" ]]; then
|
|
log_red "[FATAL] Name should not be empty.";
|
|
REDO_NAME=true;
|
|
fi;
|
|
|
|
if [[ $REDO_NAME == true ]]; then
|
|
ask_name;
|
|
fi;
|
|
};
|
|
|
|
ask_identifier() {
|
|
log_blue "[INPUT] Identifier (genericextension):";
|
|
read ASKIDENTIFIER;
|
|
|
|
REDO_IDENTIFIER=false;
|
|
|
|
# Identifier should not be empty
|
|
if [[ $ASKIDENTIFIER == "" ]]; then
|
|
log_red "[FATAL] Identifier should not be empty.";
|
|
REDO_IDENTIFIER=true;
|
|
fi;
|
|
|
|
# Identifier should be a-z.
|
|
if [[ $ASKIDENTIFIER =~ [a-z] ]]; then
|
|
echo ok > /dev/null;
|
|
else
|
|
log_red "[FATAL] Identifier should only contain a-z characters.";
|
|
REDO_IDENTIFIER=true;
|
|
fi;
|
|
|
|
if [[ $REDO_IDENTIFIER == true ]]; then
|
|
ask_identifier;
|
|
fi;
|
|
};
|
|
|
|
ask_description() {
|
|
log_blue "[INFO] Description (My awesome description):";
|
|
read ASKDESCRIPTION;
|
|
|
|
REDO_DESCRIPTION=false;
|
|
|
|
# Description should not be empty
|
|
if [[ $ASKDESCRIPTION == "" ]]; then
|
|
log_red "[FATAL] Description should not be empty.";
|
|
REDO_DESCRIPTION=true;
|
|
fi;
|
|
|
|
if [[ $REDO_DESCRIPTION == true ]]; then
|
|
ask_description;
|
|
fi;
|
|
};
|
|
|
|
ask_version() {
|
|
log_blue "[INPUT] Version (indev):";
|
|
read ASKVERSION;
|
|
|
|
REDO_VERSION=false;
|
|
|
|
# Version should not be empty
|
|
if [[ $ASKVERSION == "" ]]; then
|
|
log_red "[FATAL] Version should not be empty.";
|
|
REDO_VERSION=true;
|
|
fi;
|
|
|
|
if [[ $REDO_VERSION == true ]]; then
|
|
ask_version;
|
|
fi;
|
|
};
|
|
|
|
ask_author() {
|
|
log_blue "[INPUT] Author (prplwtf):";
|
|
read ASKAUTHOR;
|
|
|
|
REDO_AUTHOR=false;
|
|
|
|
# Author should not be empty
|
|
if [[ $ASKAUTHOR == "" ]]; then
|
|
log_red "[FATAL] Author should not be empty.";
|
|
REDO_AUTHOR=true;
|
|
fi;
|
|
|
|
if [[ $REDO_AUTHOR == true ]]; then
|
|
ask_author;
|
|
fi;
|
|
};
|
|
|
|
ask_name;
|
|
ask_identifier;
|
|
ask_description;
|
|
ask_version;
|
|
ask_author;
|
|
|
|
log_bright "[INFO] Copying init defaults to tmp directory..";
|
|
mkdir .blueprint/tmp/init;
|
|
cp -R .blueprint/data/internal/build/init/* .blueprint/tmp/init/;
|
|
|
|
log_bright "[INFO] Applying variables.."
|
|
sed -i "s~␀name␀~$ASKNAME~g" .blueprint/tmp/init/conf.yml; #NAME
|
|
sed -i "s~␀identifier␀~$ASKIDENTIFIER~g" .blueprint/tmp/init/conf.yml; #IDENTIFIER
|
|
sed -i "s~␀description␀~$ASKDESCRIPTION~g" .blueprint/tmp/init/conf.yml; #DESCRIPTION
|
|
sed -i "s~␀ver␀~$ASKVERSION~g" .blueprint/tmp/init/conf.yml; #VERSION
|
|
sed -i "s~␀author␀~$ASKAUTHOR~g" .blueprint/tmp/init/conf.yml; #AUTHOR
|
|
|
|
icnNUM=$(expr 1 + $RANDOM % 4);
|
|
sed -i "s~␀num␀~$icnNUM~g" .blueprint/tmp/init/conf.yml;
|
|
sed -i "s~␀version␀~$VERSION~g" .blueprint/tmp/init/conf.yml;
|
|
|
|
# Return files to folder.
|
|
log_bright "[INFO] Copying output to dev directory."
|
|
cp -R .blueprint/tmp/init/* .blueprint/dev/;
|
|
|
|
# Remove tmp files.
|
|
log_bright "[INFO] Purging tmp files."
|
|
rm -R .blueprint/tmp;
|
|
mkdir .blueprint/tmp;
|
|
|
|
log_green "[SUCCESS] Your extension files have been generated and exported to '.blueprint/dev'.";
|
|
fi;
|
|
|
|
# -build
|
|
if [[ $2 == "-build" ]]; then
|
|
log_bright "[INFO] Installing development extension files..";
|
|
blueprint -i test␀;
|
|
log_bright "[INFO] Extension installation ends here, if there are any errors during installation, fix them and try again.";
|
|
sendTelemetry "BUILD_DEVELOPMENT_EXTENSION" > /dev/null;
|
|
fi;
|
|
|
|
# -export
|
|
if [[ $2 == "-export" ]]; then
|
|
log_bright "[INFO] Exporting extension files located in '.blueprint/dev'.";
|
|
|
|
cd .blueprint
|
|
eval $(parse_yaml dev/conf.yml conf_); identifier=$conf_info_identifier;
|
|
cp -R dev/* tmp/;
|
|
cd tmp;
|
|
zip -r extension.zip *;
|
|
cd /var/www/$FOLDER;
|
|
cp .blueprint/tmp/extension.zip $identifier.blueprint;
|
|
rm -R .blueprint/tmp;
|
|
mkdir .blueprint/tmp;
|
|
|
|
# This will be replaced with a success/fail check in the future.
|
|
log_bright "[INFO] Export finished.";
|
|
fi;
|
|
|
|
# -runinstall
|
|
if [[ $2 == "-runinstall" ]]; then
|
|
log_yellow "[WARNING] This is an advanced feature, only proceed if you know what you are doing.\n"
|
|
dbRemove "blueprint.setupFinished";
|
|
cd /var/www/$FOLDER;
|
|
bash blueprint.sh;
|
|
fi;
|
|
|
|
# -upgrade
|
|
if [[ $2 == "-upgrade" ]]; then
|
|
log_yellow "[WARNING] This is an advanced feature, only proceed if you know what you are doing.\n";
|
|
|
|
if [[ -n $(find .blueprint/dev -maxdepth 1 -type f -not -name "README.md" -print -quit) ]]; then
|
|
quit_red "[FATAL] Your development directory contains files. To protect you against accidental data loss, you are unable to upgrade unless you clear your .blueprint/dev folder.";
|
|
fi;
|
|
|
|
if [[ $3 == "dev" ]]; then
|
|
log_blue "[INPUT] Upgrading to the latest dev build will update Blueprint to an unstable work-in-progress preview of the next version. Continue? (y/N)";
|
|
read YN1;
|
|
if [[ ( $YN1 != "y" ) && ( $YN1 != "Y" ) ]]; then log_bright "[INFO] Upgrade cancelled.";exit 1;fi;
|
|
fi;
|
|
log_blue "[INPUT] Upgrading will wipe your .blueprint folder and will overwrite your extensions. Continue? (y/N)";
|
|
read YN2;
|
|
if [[ ( $YN2 != "y" ) && ( $YN2 != "Y" ) ]]; then log_bright "[INFO] Upgrade cancelled.";exit 1;fi;
|
|
log_blue "[INPUT] This is the last warning before upgrading/wiping Blueprint. Type 'continue' to continue, all other input will be taken as 'no'.";
|
|
read YN3;
|
|
if [[ $YN3 != "continue" ]]; then log_bright "[INFO] Upgrade cancelled.";exit 1;fi;
|
|
|
|
log_bright "[INFO] Blueprint is upgrading.. Please do not turn off your machine.";
|
|
cp blueprint.sh .blueprint.sh.bak;
|
|
if [[ $3 == "dev" ]]; then
|
|
bash tools/update.sh /var/www/$FOLDER dev
|
|
else
|
|
bash tools/update.sh /var/www/$FOLDER
|
|
fi;
|
|
rm -R tools/tmp/*;
|
|
log_bright "[INFO] Files have been upgraded, running installation script..";
|
|
chmod +x blueprint.sh;
|
|
bash blueprint.sh --post-upgrade;
|
|
log_bright "[INFO] Bash might spit out some errors from here on out. EOF, command not found and syntax errors are expected behaviour.";
|
|
log_blue "[INPUT] Database migrations are skipped when upgrading, run them anyways? (Y/n)";
|
|
read YN4;
|
|
if [[ ( $YN4 == "y" ) || ( $YN4 == "Y" ) ]]; then
|
|
log_bright "[INFO] Running database migrations..";
|
|
php artisan migrate;
|
|
else
|
|
log_bright "[INFO] Database migrations have been skipped.";
|
|
fi;
|
|
|
|
log_bright "[INFO] Running post-upgrade checks..";
|
|
score=0;
|
|
|
|
if dbValidate "blueprint.setupFinished"; then
|
|
score=$((score+1));
|
|
else
|
|
log_yellow "[WARNING] 'blueprint.setupFinished' could not be found.";
|
|
fi;
|
|
|
|
if [[ $score == 1 ]]; then
|
|
log_green "[SUCCESS] Blueprint has upgraded successfully.";
|
|
rm .blueprint.sh.bak;
|
|
exit 1;
|
|
elif [[ $score == 0 ]]; then
|
|
log_red "[FATAL] All checks have failed.";
|
|
rm blueprint.sh;
|
|
mv .blueprint.sh.bak;
|
|
exit 1;
|
|
else
|
|
log_yellow "[WARNING] Some post-upgrade checks have failed.";
|
|
rm blueprint.sh;
|
|
mv .blueprint.sh.bak;
|
|
exit 1;
|
|
fi;
|
|
fi;
|