10 changed files with 556 additions and 7 deletions
-
45actions.toml
-
65config_panel.toml
-
2manifest.json
-
64scripts/actions/create_database
-
74scripts/actions/public_private
-
50scripts/actions/remove_database
-
73scripts/actions/sftp
-
159scripts/config
-
2scripts/install
-
29scripts/upgrade
@ -0,0 +1,45 @@ |
|||||
|
[sftp] |
||||
|
name = "Enable or disable the sftp access" |
||||
|
command = "/bin/bash scripts/actions/sftp" |
||||
|
# user = "root" # optional |
||||
|
# cwd = "/" # optional |
||||
|
# accepted_return_codes = [0, 1, 2, 3] # optional |
||||
|
accepted_return_codes = [0] |
||||
|
|
||||
|
[sftp.arguments] |
||||
|
[sftp.arguments.with_sftp] |
||||
|
type = "boolean" |
||||
|
ask = "Do you need a SFTP access?" |
||||
|
default = true |
||||
|
|
||||
|
[public_private] |
||||
|
name = "Move to public or private" |
||||
|
command = "/bin/bash scripts/actions/public_private" |
||||
|
# user = "root" # optional |
||||
|
# cwd = "/" # optional |
||||
|
# accepted_return_codes = [0, 1, 2, 3] # optional |
||||
|
accepted_return_codes = [0] |
||||
|
description = "Change the public access of the app." |
||||
|
|
||||
|
[public_private.arguments] |
||||
|
[public_private.arguments.is_public] |
||||
|
type = "boolean" |
||||
|
ask = "Is it a public app ?" |
||||
|
default = true |
||||
|
|
||||
|
[create_database] |
||||
|
name = "Create a database" |
||||
|
command = "/bin/bash scripts/actions/create_database" |
||||
|
# user = "root" # optional |
||||
|
# cwd = "/" # optional |
||||
|
# accepted_return_codes = [0, 1, 2, 3] # optional |
||||
|
accepted_return_codes = [0] |
||||
|
description = "Create a database or replace a previous one." |
||||
|
|
||||
|
[remove_database] |
||||
|
name = "Remove a database" |
||||
|
command = "/bin/bash scripts/actions/remove_database" |
||||
|
# user = "root" # optional |
||||
|
# cwd = "/" # optional |
||||
|
# accepted_return_codes = [0, 1, 2, 3] # optional |
||||
|
accepted_return_codes = [0] |
||||
@ -0,0 +1,65 @@ |
|||||
|
version = "0.1" |
||||
|
name = "My webapp configuration panel" |
||||
|
|
||||
|
[main] |
||||
|
name = "My webapp configuration" |
||||
|
|
||||
|
[main.sftp] |
||||
|
name = "SFTP access" |
||||
|
|
||||
|
[main.sftp.sftp] |
||||
|
ask = "Do you need a SFTP access ?" |
||||
|
type = "boolean" |
||||
|
default = true |
||||
|
|
||||
|
[main.sftp.password] |
||||
|
ask = "Set a password for the SFTP access. ≥ 5 character" |
||||
|
type = "password" |
||||
|
optional = true |
||||
|
help = "If a password already exist, it will not be replaced." |
||||
|
|
||||
|
[main.is_public] |
||||
|
name = "Public access" |
||||
|
|
||||
|
[main.is_public.is_public] |
||||
|
ask = "Is it a public website ?" |
||||
|
type = "boolean" |
||||
|
default = true |
||||
|
|
||||
|
|
||||
|
[main.overwrite_files] |
||||
|
name = "Overwriting config files" |
||||
|
|
||||
|
[main.overwrite_files.overwrite_nginx] |
||||
|
ask = "Overwrite the nginx config file ?" |
||||
|
type = "boolean" |
||||
|
default = false |
||||
|
help = "If the file is overwritten, a backup will be created." |
||||
|
|
||||
|
[main.overwrite_files.overwrite_phpfpm] |
||||
|
ask = "Overwrite the php-fpm config file ?" |
||||
|
type = "boolean" |
||||
|
default = true |
||||
|
help = "If the file is overwritten, a backup will be created." |
||||
|
|
||||
|
|
||||
|
[main.php_fpm_config] |
||||
|
name = "PHP-FPM configuration" |
||||
|
|
||||
|
[main.php_fpm_config.footprint] |
||||
|
ask = "Memory footprint of the service ?" |
||||
|
choices = ["low", "medium", "high", "specific"] |
||||
|
default = "low" |
||||
|
help = "low <= 20Mb per pool. medium between 20Mb and 40Mb per pool. high > 40Mb per pool.<br>Use specific to set a value with the following option." |
||||
|
|
||||
|
[main.php_fpm_config.free_footprint] |
||||
|
ask = "Memory footprint of the service ?" |
||||
|
type = "number" |
||||
|
default = "0" |
||||
|
help = "Free field to specify exactly the footprint in Mb if you don't want to use one of the three previous values." |
||||
|
|
||||
|
[main.php_fpm_config.usage] |
||||
|
ask = "Expected usage of the service ?" |
||||
|
choices = ["low", "medium", "high"] |
||||
|
default = "low" |
||||
|
help = "low: Personal usage, behind the sso. No RAM footprint when not used, but the impact on the processor can be high if many users are using the service.<br>medium: Low usage, few people or/and publicly accessible. Low RAM footprint, medium processor footprint when used.<br>high: High usage, frequently visited website. High RAM footprint, but lower on processor usage and quickly responding." |
||||
@ -0,0 +1,64 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
#================================================= |
||||
|
# GENERIC STARTING |
||||
|
#================================================= |
||||
|
# IMPORT GENERIC HELPERS |
||||
|
#================================================= |
||||
|
|
||||
|
source scripts/_common.sh |
||||
|
source /usr/share/yunohost/helpers |
||||
|
|
||||
|
#================================================= |
||||
|
# RETRIEVE ARGUMENTS |
||||
|
#================================================= |
||||
|
|
||||
|
with_mysql=$(ynh_app_setting_get --app=$app --key=with_mysql) |
||||
|
final_path=$(ynh_app_setting_get --app=$app --key=final_path) |
||||
|
|
||||
|
app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF ARGUMENTS ARE CORRECT |
||||
|
#================================================= |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF AN ACTION HAS TO BE DONE |
||||
|
#================================================= |
||||
|
|
||||
|
#================================================= |
||||
|
# SPECIFIC ACTION |
||||
|
#================================================= |
||||
|
# REMOVE THE PREVIOUS DATABASE |
||||
|
#================================================= |
||||
|
ynh_script_progression --message="Removing the previous database..." --weight=6 |
||||
|
|
||||
|
if [ $with_mysql -eq 1 ] |
||||
|
then |
||||
|
yunohost app action run $app remove_database |
||||
|
fi |
||||
|
|
||||
|
#================================================= |
||||
|
# CREATE A NEW DATABASE |
||||
|
#================================================= |
||||
|
ynh_script_progression --message="Creating a new database..." --weight=4 |
||||
|
|
||||
|
db_name=$(ynh_sanitize_dbid --db_name=$app) |
||||
|
|
||||
|
# Reuse the previous password if existing |
||||
|
db_pwd=$(grep "pass:" "$final_path/db_access.txt" | cut -d' ' -f2 2> /dev/null) |
||||
|
|
||||
|
ynh_mysql_setup_db --db_user=$db_name --db_name=$db_name --db_pwd=$db_pwd |
||||
|
|
||||
|
echo -e "# MySQL Database |
||||
|
name: ${db_name}\nuser: ${db_name}\npass: ${db_pwd}" > "$final_path/db_access.txt" |
||||
|
|
||||
|
# Update the config of the app |
||||
|
ynh_app_setting_set --app=$app --key=with_mysql --value=1 |
||||
|
ynh_app_setting_set --app=$app --key=db_name --value=$db_name |
||||
|
|
||||
|
#================================================= |
||||
|
# END OF SCRIPT |
||||
|
#================================================= |
||||
|
|
||||
|
ynh_script_progression --message="Execution completed" --last |
||||
@ -0,0 +1,74 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
#================================================= |
||||
|
# GENERIC STARTING |
||||
|
#================================================= |
||||
|
# IMPORT GENERIC HELPERS |
||||
|
#================================================= |
||||
|
|
||||
|
source scripts/_common.sh |
||||
|
source /usr/share/yunohost/helpers |
||||
|
|
||||
|
#================================================= |
||||
|
# RETRIEVE ARGUMENTS |
||||
|
#================================================= |
||||
|
|
||||
|
# Get is_public |
||||
|
is_public=${YNH_ACTION_IS_PUBLIC} |
||||
|
|
||||
|
app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF ARGUMENTS ARE CORRECT |
||||
|
#================================================= |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF AN ACTION HAS TO BE DONE |
||||
|
#================================================= |
||||
|
|
||||
|
is_public_old=$(ynh_app_setting_get --app=$app --key=is_public) |
||||
|
|
||||
|
if [ $is_public -eq $is_public_old ] |
||||
|
then |
||||
|
ynh_die --message="is_public is already set as $is_public." --ret_code=0 |
||||
|
fi |
||||
|
|
||||
|
#================================================= |
||||
|
# SPECIFIC ACTION |
||||
|
#================================================= |
||||
|
# MOVE TO PUBLIC OR PRIVATE |
||||
|
#================================================= |
||||
|
|
||||
|
if [ $is_public -eq 0 ]; then |
||||
|
public_private="private" |
||||
|
else |
||||
|
public_private="public" |
||||
|
fi |
||||
|
ynh_script_progression --message="Moving the application to $public_private..." --weight=3 |
||||
|
|
||||
|
if [ $is_public -eq 0 ] |
||||
|
then |
||||
|
ynh_app_setting_delete --app=$app --key=skipped_uris |
||||
|
else |
||||
|
ynh_app_setting_set --app=$app --key=skipped_uris --value="/" |
||||
|
fi |
||||
|
|
||||
|
ynh_script_progression --message="Upgrading SSOwat configuration..." |
||||
|
# Regen ssowat configuration |
||||
|
yunohost app ssowatconf |
||||
|
|
||||
|
# Update the config of the app |
||||
|
ynh_app_setting_set --app=$app --key=is_public --value=$is_public |
||||
|
|
||||
|
#================================================= |
||||
|
# RELOAD NGINX |
||||
|
#================================================= |
||||
|
ynh_script_progression --message="Reloading nginx web server..." |
||||
|
|
||||
|
ynh_systemd_action --service_name=nginx --action=reload |
||||
|
|
||||
|
#================================================= |
||||
|
# END OF SCRIPT |
||||
|
#================================================= |
||||
|
|
||||
|
ynh_script_progression --message="Execution completed" --last |
||||
@ -0,0 +1,50 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
#================================================= |
||||
|
# GENERIC STARTING |
||||
|
#================================================= |
||||
|
# IMPORT GENERIC HELPERS |
||||
|
#================================================= |
||||
|
|
||||
|
source scripts/_common.sh |
||||
|
source /usr/share/yunohost/helpers |
||||
|
|
||||
|
#================================================= |
||||
|
# RETRIEVE ARGUMENTS |
||||
|
#================================================= |
||||
|
|
||||
|
with_mysql=$(ynh_app_setting_get --app=$app --key=with_mysql) |
||||
|
|
||||
|
app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF ARGUMENTS ARE CORRECT |
||||
|
#================================================= |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF AN ACTION HAS TO BE DONE |
||||
|
#================================================= |
||||
|
|
||||
|
if [ $with_mysql -eq 0 ] |
||||
|
then |
||||
|
ynh_die --message="There's no database to remove." --ret_code=0 |
||||
|
fi |
||||
|
|
||||
|
#================================================= |
||||
|
# SPECIFIC ACTION |
||||
|
#================================================= |
||||
|
# REMOVE THE DATABASE |
||||
|
#================================================= |
||||
|
ynh_script_progression --message="Removing the database..." --weight=9 |
||||
|
|
||||
|
db_name=$(ynh_app_setting_get --app=$app --key=db_name) |
||||
|
ynh_mysql_remove_db --db_user=$db_name --db_name=$db_name |
||||
|
|
||||
|
# Update the config of the app |
||||
|
ynh_app_setting_set --app=$app --key=with_mysql --value=0 |
||||
|
|
||||
|
#================================================= |
||||
|
# END OF SCRIPT |
||||
|
#================================================= |
||||
|
|
||||
|
ynh_script_progression --message="Execution completed" --last |
||||
@ -0,0 +1,73 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
#================================================= |
||||
|
# GENERIC STARTING |
||||
|
#================================================= |
||||
|
# IMPORT GENERIC HELPERS |
||||
|
#================================================= |
||||
|
|
||||
|
source scripts/_common.sh |
||||
|
source /usr/share/yunohost/helpers |
||||
|
|
||||
|
#================================================= |
||||
|
# RETRIEVE ARGUMENTS |
||||
|
#================================================= |
||||
|
|
||||
|
app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} |
||||
|
|
||||
|
with_sftp=${YNH_ACTION_WITH_SFTP} |
||||
|
user=$(ynh_app_setting_get --app=$app --key=user) |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF ARGUMENTS ARE CORRECT |
||||
|
#================================================= |
||||
|
|
||||
|
#================================================= |
||||
|
# CHECK IF AN ACTION HAS TO BE DONE |
||||
|
#================================================= |
||||
|
|
||||
|
with_sftp_old=$(ynh_app_setting_get --app=$app --key=with_sftp) |
||||
|
|
||||
|
if [ $with_sftp -eq $with_sftp_old ] |
||||
|
then |
||||
|
ynh_die --message="with_sftp is already set as $with_sftp." --ret_code=0 |
||||
|
fi |
||||
|
|
||||
|
#================================================= |
||||
|
# SPECIFIC ACTION |
||||
|
#================================================= |
||||
|
# MOVE TO PUBLIC OR PRIVATE |
||||
|
#================================================= |
||||
|
|
||||
|
if [ $with_sftp -eq 1 ] |
||||
|
then |
||||
|
ynh_script_progression --message="Configuring ssh to add a SFTP access..." --weight=3 |
||||
|
|
||||
|
cp -R conf/ssh_regenconf_hook /usr/share/yunohost/hooks/conf_regen/90-ssh_$app |
||||
|
|
||||
|
ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file=/usr/share/yunohost/hooks/conf_regen/90-ssh_$app |
||||
|
ynh_replace_string --match_string="__USER__" --replace_string="$user" --target_file=/usr/share/yunohost/hooks/conf_regen/90-ssh_$app |
||||
|
yunohost tools regen-conf ssh |
||||
|
else |
||||
|
ynh_script_progression --message="Removing the custom ssh config for the SFTP access..." --weight=3 |
||||
|
|
||||
|
sed -i "/##-> ${app}/,/##<- ${app}/d" /etc/ssh/sshd_config |
||||
|
# Remove regen-conf hook |
||||
|
ynh_secure_remove --file="/usr/share/yunohost/hooks/conf_regen/90-ssh_$app" |
||||
|
fi |
||||
|
|
||||
|
# Update the config of the app |
||||
|
ynh_app_setting_set --app=$app --key=with_sftp --value=$with_sftp |
||||
|
|
||||
|
#================================================= |
||||
|
# RELOAD SSH |
||||
|
#================================================= |
||||
|
ynh_script_progression --message="Reloading SSH..." |
||||
|
|
||||
|
ynh_systemd_action --service_name=ssh --action=reload |
||||
|
|
||||
|
#================================================= |
||||
|
# END OF SCRIPT |
||||
|
#================================================= |
||||
|
|
||||
|
ynh_script_progression --message="Execution completed" --last |
||||
@ -0,0 +1,159 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
#================================================= |
||||
|
# GENERIC STARTING |
||||
|
#================================================= |
||||
|
# IMPORT GENERIC HELPERS |
||||
|
#================================================= |
||||
|
|
||||
|
source _common.sh |
||||
|
source /usr/share/yunohost/helpers |
||||
|
|
||||
|
#================================================= |
||||
|
# RETRIEVE ARGUMENTS |
||||
|
#================================================= |
||||
|
|
||||
|
app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} |
||||
|
|
||||
|
#================================================= |
||||
|
# SPECIFIC CODE |
||||
|
#================================================= |
||||
|
# LOAD VALUES |
||||
|
#================================================= |
||||
|
|
||||
|
# Load the real value from the app config or elsewhere. |
||||
|
# Then get the value from the form. |
||||
|
# If the form has a value for a variable, take the value from the form, |
||||
|
# Otherwise, keep the value from the app config. |
||||
|
|
||||
|
# with_sftp |
||||
|
old_with_sftp="$(ynh_app_setting_get --app=$app --key=with_sftp)" |
||||
|
with_sftp="${YNH_CONFIG_MAIN_SFTP_SFTP:-$old_with_sftp}" |
||||
|
|
||||
|
# sftp password |
||||
|
is_password_exist=0 |
||||
|
ynh_print_OFF; password=$(ynh_app_setting_get --app=$app --key=password) |
||||
|
if [ -n "$password" ] |
||||
|
then |
||||
|
ynh_print_warn --memssage="A password already exist, it will not be replaced." |
||||
|
# If a password already exist, unset the variable password and to not change it. |
||||
|
unset password |
||||
|
is_password_exist=1 |
||||
|
else |
||||
|
# Otherwise, get the new password |
||||
|
password="$YNH_CONFIG_MAIN_SFTP_PASSWORD" |
||||
|
fi |
||||
|
ynh_print_ON |
||||
|
|
||||
|
|
||||
|
# is_public |
||||
|
old_is_public="$(ynh_app_setting_get --app=$app --key=is_public)" |
||||
|
is_public="${YNH_CONFIG_MAIN_IS_PUBLIC_IS_PUBLIC:-$old_is_public}" |
||||
|
|
||||
|
|
||||
|
# Overwrite nginx configuration |
||||
|
old_overwrite_nginx="$(ynh_app_setting_get --app=$app --key=overwrite_nginx)" |
||||
|
overwrite_nginx="${YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_NGINX:-$old_overwrite_nginx}" |
||||
|
|
||||
|
# Overwrite php-fpm configuration |
||||
|
old_overwrite_phpfpm="$(ynh_app_setting_get --app=$app --key=overwrite_phpfpm)" |
||||
|
overwrite_phpfpm="${YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_PHPFPM:-$old_overwrite_phpfpm}" |
||||
|
|
||||
|
|
||||
|
# Footprint for php-fpm |
||||
|
old_fpm_footprint="$(ynh_app_setting_get --app=$app --key=fpm_footprint)" |
||||
|
fpm_footprint="${YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FOOTPRINT:-$old_fpm_footprint}" |
||||
|
|
||||
|
# Free footprint value for php-fpm |
||||
|
# Check if fpm_footprint is an integer |
||||
|
if [ "$fpm_footprint" -eq "$fpm_footprint" ] 2> /dev/null |
||||
|
then |
||||
|
# If fpm_footprint is an integer, that's a numeric value for the footprint |
||||
|
old_free_footprint=$fpm_footprint |
||||
|
else |
||||
|
old_free_footprint=0 |
||||
|
fi |
||||
|
free_footprint="${YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FREE_FOOTPRINT:-$old_free_footprint}" |
||||
|
|
||||
|
# Usage for php-fpm |
||||
|
old_fpm_usage="$(ynh_app_setting_get --app=$app --key=fpm_usage)" |
||||
|
fpm_usage="${YNH_CONFIG_MAIN_PHP_FPM_CONFIG_USAGE:-$old_fpm_usage}" |
||||
|
|
||||
|
#================================================= |
||||
|
# SHOW_CONFIG FUNCTION FOR 'SHOW' COMMAND |
||||
|
#================================================= |
||||
|
|
||||
|
show_config() { |
||||
|
# here you are supposed to read some config file/database/other then print the values |
||||
|
# ynh_return "YNH_CONFIG_${PANEL_ID}_${SECTION_ID}_${OPTION_ID}=value" |
||||
|
ynh_return "YNH_CONFIG_MAIN_SFTP_SFTP=$with_sftp" |
||||
|
# ynh_print_OFF; ynh_return "YNH_CONFIG_MAIN_SFTP_PASSWORD=$password"; ynh_print_ON |
||||
|
|
||||
|
ynh_return "YNH_CONFIG_MAIN_IS_PUBLIC_IS_PUBLIC=$is_public" |
||||
|
|
||||
|
ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FOOTPRINT=$fpm_footprint" |
||||
|
ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FREE_FOOTPRINT=$free_footprint" |
||||
|
ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_USAGE=$fpm_usage" |
||||
|
} |
||||
|
|
||||
|
#================================================= |
||||
|
# MODIFY THE CONFIGURATION |
||||
|
#================================================= |
||||
|
|
||||
|
apply_config() { |
||||
|
# Change public accessibility |
||||
|
if [ "$is_public" = "1" ] |
||||
|
then |
||||
|
yunohost app action run $app public_private --args is_public=1 |
||||
|
else |
||||
|
yunohost app action run $app public_private --args is_public=0 |
||||
|
fi |
||||
|
|
||||
|
#================================================= |
||||
|
# REMOVE OR ADD SFTP ACCESS |
||||
|
#================================================= |
||||
|
|
||||
|
if [ "$with_sftp" != "$old_with_sftp" ] |
||||
|
then |
||||
|
yunohost app action run $app sftp --args with_sftp=$with_sftp |
||||
|
|
||||
|
# Change the password only if none was already set for the user |
||||
|
if [ $is_password_exist -eq 0 ] && [ $with_sftp -eq 1 ] |
||||
|
then |
||||
|
# Check password strength |
||||
|
if [ ${#password} -le 5 ] |
||||
|
then |
||||
|
ynh_print_err --message="The password is too weak, it must be longer than 5 characters." |
||||
|
# Disable the sftp access, as the password is incorrect |
||||
|
yunohost app action run $app sftp --args with_sftp=0 |
||||
|
else |
||||
|
user=$(ynh_app_setting_get --app=$app --key=user) |
||||
|
# Add the password to the user |
||||
|
ynh_print_OFF |
||||
|
chpasswd <<< "${user}:${password}" |
||||
|
ynh_app_setting_set --app=$app --key=password --value="$password" |
||||
|
ynh_print_ON |
||||
|
fi |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
#================================================= |
||||
|
# RECONFIGURE PHP-FPM |
||||
|
#================================================= |
||||
|
|
||||
|
if [ "$fpm_usage" != "$old_fpm_usage" ] || [ "$fpm_footprint" != "$old_fpm_footprint" ] |
||||
|
then |
||||
|
ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
#================================================= |
||||
|
# GENERIC FINALIZATION |
||||
|
#================================================= |
||||
|
# SELECT THE ACTION FOLLOWING THE GIVEN ARGUMENT |
||||
|
#================================================= |
||||
|
|
||||
|
case $1 in |
||||
|
show) show_config;; |
||||
|
apply) apply_config;; |
||||
|
esac |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue