mirror of
https://github.com/webmin/webmin.git
synced 2026-02-05 23:22:15 +00:00
Compare commits
234 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d4468e907 | ||
|
|
fc5a638e24 | ||
|
|
cf6a14b7a6 | ||
|
|
6ddde41728 | ||
|
|
5114308d0d | ||
|
|
2c325b1ee4 | ||
|
|
e087bb718c | ||
|
|
51bdd0d07e | ||
|
|
74fec8b171 | ||
|
|
9d360f1c24 | ||
|
|
148743894f | ||
|
|
6b935f980c | ||
|
|
e751836684 | ||
|
|
b9449c213b | ||
|
|
a3c9770d4f | ||
|
|
3c971dacc1 | ||
|
|
ac1a73c154 | ||
|
|
3a099fabec | ||
|
|
9a1e869a82 | ||
|
|
5c54c614e3 | ||
|
|
cbdc843500 | ||
|
|
82fbca20e4 | ||
|
|
ef7dbb1f77 | ||
|
|
4f15106fa9 | ||
|
|
96bfc34247 | ||
|
|
0289ceed5b | ||
|
|
4e54ce3f85 | ||
|
|
73b2322597 | ||
|
|
05c7b6c3a3 | ||
|
|
1bb70effea | ||
|
|
590c27d202 | ||
|
|
846dff2636 | ||
|
|
b339c76fc7 | ||
|
|
fbabecbe9e | ||
|
|
7706c0795e | ||
|
|
4be368c523 | ||
|
|
b268c1bb66 | ||
|
|
b2f18fb784 | ||
|
|
34e3b4c027 | ||
|
|
3c5edcf184 | ||
|
|
33f4d7a008 | ||
|
|
2d182a2eea | ||
|
|
7f06ccaf53 | ||
|
|
d8fa7f26af | ||
|
|
aa6edf6c55 | ||
|
|
4333435739 | ||
|
|
f01197df71 | ||
|
|
cb41eff450 | ||
|
|
352326f574 | ||
|
|
410fd07287 | ||
|
|
faededeb77 | ||
|
|
f0f8dc2850 | ||
|
|
184e8d627d | ||
|
|
fd2b7c1fc7 | ||
|
|
98192ca099 | ||
|
|
05a93a5e3d | ||
|
|
50a2820a97 | ||
|
|
87f2640ee3 | ||
|
|
4180e3d3ee | ||
|
|
b7d7ea5d8d | ||
|
|
4e09cf0b55 | ||
|
|
3f0ab3fb92 | ||
|
|
836647525a | ||
|
|
8b68eac561 | ||
|
|
0503299773 | ||
|
|
2e8000d191 | ||
|
|
65ffcea0db | ||
|
|
45845b8ca6 | ||
|
|
fead9b108d | ||
|
|
db1c9679ba | ||
|
|
d753fa7a8d | ||
|
|
f6d7e05b14 | ||
|
|
a9288423cc | ||
|
|
ac9e54afba | ||
|
|
f7cf6419d2 | ||
|
|
a9097cbb42 | ||
|
|
6f84ca1c9d | ||
|
|
dff70c3349 | ||
|
|
fe8f3f8494 | ||
|
|
f5f3510a59 | ||
|
|
1e375b4740 | ||
|
|
c573496914 | ||
|
|
73e731722d | ||
|
|
6186376b6b | ||
|
|
31e0151804 | ||
|
|
872ca66b07 | ||
|
|
088aba8cec | ||
|
|
99b8959559 | ||
|
|
94f23e63e7 | ||
|
|
7c449cf4a3 | ||
|
|
2db507e5e8 | ||
|
|
bdeb908df0 | ||
|
|
a133cdfdef | ||
|
|
fe2656acd8 | ||
|
|
64a44a667e | ||
|
|
59cef9a04f | ||
|
|
af629fe3cd | ||
|
|
80368e2a04 | ||
|
|
5237ae8ea2 | ||
|
|
54ad4f7f74 | ||
|
|
0dd94f5957 | ||
|
|
5b2b3f0790 | ||
|
|
ac05a0c43a | ||
|
|
18f3e1273f | ||
|
|
710829c16a | ||
|
|
8ced23d027 | ||
|
|
d834bb6da0 | ||
|
|
cc560b00e5 | ||
|
|
3e4668715a | ||
|
|
053e8dcf22 | ||
|
|
2d7e57c7e1 | ||
|
|
30e6360fa2 | ||
|
|
dda9290ff5 | ||
|
|
15a00d8119 | ||
|
|
9289083171 | ||
|
|
3d482d2bf5 | ||
|
|
318150e6b0 | ||
|
|
8939b060b4 | ||
|
|
4709ff6adf | ||
|
|
31af9f996c | ||
|
|
c716443737 | ||
|
|
fd06605f51 | ||
|
|
c8f6b05987 | ||
|
|
a90dbc5f33 | ||
|
|
7fc16f8948 | ||
|
|
a2f1f24a95 | ||
|
|
825b928168 | ||
|
|
de648c24bd | ||
|
|
907818d2a4 | ||
|
|
60a79e67d4 | ||
|
|
04a3b8b5e6 | ||
|
|
dd1b4bc77b | ||
|
|
5156a472be | ||
|
|
185e7db58d | ||
|
|
f8ec917bc5 | ||
|
|
1016ec5f1d | ||
|
|
8a6d4cfefd | ||
|
|
7cbbdc898a | ||
|
|
8db4074d4d | ||
|
|
f6c48e7a11 | ||
|
|
9ae54e61bd | ||
|
|
e917f33e09 | ||
|
|
38aa06b8c6 | ||
|
|
57e710e8a6 | ||
|
|
0d9d978f72 | ||
|
|
196b886ddb | ||
|
|
4197e61772 | ||
|
|
6dc87705d9 | ||
|
|
4b59570a82 | ||
|
|
33927e07ae | ||
|
|
65444b8865 | ||
|
|
5357b084af | ||
|
|
862bbc36df | ||
|
|
e6105bb757 | ||
|
|
864e0c4918 | ||
|
|
115c5763a3 | ||
|
|
d6e307d59a | ||
|
|
9dc21ace2d | ||
|
|
c500759d83 | ||
|
|
736d30ef76 | ||
|
|
a27095f40f | ||
|
|
60a3b3b4a9 | ||
|
|
f932925b29 | ||
|
|
21e8940860 | ||
|
|
944794aeac | ||
|
|
00bd6cf27f | ||
|
|
1fb3bfa6ef | ||
|
|
da14ecbe46 | ||
|
|
1c48f3761e | ||
|
|
246b0018eb | ||
|
|
2e97b09d10 | ||
|
|
f3cc268f0c | ||
|
|
8c3973c68f | ||
|
|
33b591dfac | ||
|
|
ec0ab05782 | ||
|
|
4b03b80912 | ||
|
|
d312c3e318 | ||
|
|
9439ba0450 | ||
|
|
bea827c0b7 | ||
|
|
b1ee7cbf53 | ||
|
|
f56807c023 | ||
|
|
7b34282488 | ||
|
|
31b48f8dd6 | ||
|
|
8c1a74d245 | ||
|
|
6ae1061900 | ||
|
|
7de3647f0d | ||
|
|
76389ea06c | ||
|
|
8ae4364ee1 | ||
|
|
054f0a254e | ||
|
|
02a5982ff9 | ||
|
|
a835742293 | ||
|
|
2d7f299419 | ||
|
|
3bd37be97b | ||
|
|
62e1b4c785 | ||
|
|
3671a76333 | ||
|
|
f3652c7a87 | ||
|
|
980c4c834c | ||
|
|
df438c59ed | ||
|
|
932f2464bc | ||
|
|
d9ea914889 | ||
|
|
1730540764 | ||
|
|
9454cb4a2b | ||
|
|
355d7b5404 | ||
|
|
9f93c29c5f | ||
|
|
43e671497a | ||
|
|
b14c1c07dc | ||
|
|
f4ad3293bf | ||
|
|
e809329ca0 | ||
|
|
3cc16bb120 | ||
|
|
1eb43eafd2 | ||
|
|
f652def98d | ||
|
|
392fb41a24 | ||
|
|
c14b100845 | ||
|
|
b3b5fff0dc | ||
|
|
ef0a48d83a | ||
|
|
58a15dafc7 | ||
|
|
79f78d5e28 | ||
|
|
51e1c7bef3 | ||
|
|
5b5af3eb20 | ||
|
|
2e93819c1b | ||
|
|
d3a10de65d | ||
|
|
8ef754b477 | ||
|
|
4cbda407f9 | ||
|
|
71cce5c580 | ||
|
|
360c27add5 | ||
|
|
753290b95a | ||
|
|
ae579a2047 | ||
|
|
9746f7ea9e | ||
|
|
e599e0206a | ||
|
|
f37dbd4c3d | ||
|
|
ff42c66129 | ||
|
|
d384e696f7 | ||
|
|
3b36dfa8ad | ||
|
|
fad1201240 |
221
.github/build/deb.sh
vendored
Executable file
221
.github/build/deb.sh
vendored
Executable file
@@ -0,0 +1,221 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright @iliajie <ilia@webmin.dev>
|
||||
#
|
||||
# Automatically builds and updates a repo metadata.
|
||||
# Pulls latest changes from GitHub, detects release
|
||||
# version based on what's available in the repo
|
||||
#
|
||||
# (Debian)
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# # Pull and build production versions
|
||||
# # of both Webmin and Usermin
|
||||
# ./deb.sh
|
||||
#
|
||||
# # Pull and build devel versions
|
||||
# # of both Webmin and Usermin
|
||||
# ./deb.sh --devel
|
||||
#
|
||||
# # Pull and build production Webmin version 2.101, forcing
|
||||
# # release version 3, displaying detailed output
|
||||
# ./deb.sh webmin 2.101 3 --debug
|
||||
#
|
||||
# # Pull and build production Usermin version 2.000,
|
||||
# # automatically setting release version to minimal
|
||||
# ./deb.sh usermin 2.000
|
||||
#
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
# Source build variables
|
||||
source ./vars.sh || exit 1
|
||||
|
||||
# Source build init
|
||||
source ./init.sh || exit 1
|
||||
|
||||
# Source general build functions
|
||||
source ./funcs.sh || exit 1
|
||||
|
||||
# Build product func
|
||||
build_prod() {
|
||||
|
||||
# Pack with English only in devel builds
|
||||
local english_only=0
|
||||
if [[ "'$*'" == *"--devel"* ]]; then
|
||||
english_only=1
|
||||
fi
|
||||
|
||||
# Always return back to root directory
|
||||
cd "$root" || exit 1
|
||||
|
||||
# Define root
|
||||
local ver=""
|
||||
local prod=$1
|
||||
root_prod="$root/$prod"
|
||||
root_apt="$root_prod/deb"
|
||||
|
||||
# Print build actual date
|
||||
date=$(get_current_date)
|
||||
|
||||
# Print opening header
|
||||
echo "************************************************************************"
|
||||
echo " build start date: $date "
|
||||
echo " package format: DEB "
|
||||
echo " product: $prod "
|
||||
(make_prod_repos "$root_prod") &
|
||||
spinner " package output version:"
|
||||
|
||||
# Pull main project first to get the latest tag
|
||||
cd "$root_prod" || exit 1
|
||||
cmd="git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs1=$?
|
||||
# Clean and try again
|
||||
if [ "$rs1" != "0" ]; then
|
||||
cmd="git checkout \"*\" $verbosity_level && git clean -f -d $verbosity_level && git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs1=$?
|
||||
fi
|
||||
|
||||
# Descend to theme dir
|
||||
cd "authentic-theme" || exit 1
|
||||
cmd="git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs2=$?
|
||||
# Clean and try again
|
||||
if [ "$rs2" != "0" ]; then
|
||||
cmd="git checkout \"*\" $verbosity_level && git clean -f -d $verbosity_level && git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs2=$?
|
||||
fi
|
||||
if [ "$rs1" != "0" ] || [ "$rs2" != "0" ]; then
|
||||
rs=1
|
||||
else
|
||||
rs=0
|
||||
fi
|
||||
|
||||
# Build number
|
||||
date_version=$(get_latest_commit_date_version)
|
||||
|
||||
# Handle other params
|
||||
cd "$root_prod" || exit 1
|
||||
if [[ "'$2'" != *"--"* ]]; then
|
||||
ver=$2
|
||||
fi
|
||||
if [[ "'$3'" != *"--"* ]] && [[ -n "$3" ]]; then
|
||||
rel=$3
|
||||
relval="-$3"
|
||||
else
|
||||
rel=1
|
||||
relval=""
|
||||
fi
|
||||
if [ -z "$ver" ]; then
|
||||
ver=$(get_current_repo_tag)
|
||||
fi
|
||||
if [[ "'$*'" == *"--devel"* ]]; then
|
||||
ver="$ver.$date_version"
|
||||
# Set actual product version
|
||||
echo "${ver}" >"version"
|
||||
fi
|
||||
printf "$ver-$rel\n"
|
||||
echo "************************************************************************"
|
||||
|
||||
echo "Pulling latest changes.."
|
||||
# We need to pull first to get the latest tag,
|
||||
# so here we only report an error if any
|
||||
postcmd $rs
|
||||
echo
|
||||
|
||||
echo "Pre-clean up .."
|
||||
# Make sure directories exist
|
||||
make_dir "$root_repos/"
|
||||
make_dir "$root_apt/"
|
||||
make_dir "$root_prod/newkey/deb/"
|
||||
make_dir "$root_prod/umodules/"
|
||||
make_dir "$root_prod/minimal/"
|
||||
make_dir "$root_prod/tarballs/"
|
||||
|
||||
# Re-create legacy link
|
||||
rm -rf "$root/webadmin"
|
||||
ln -s "$root/webmin" "$root/webadmin"
|
||||
|
||||
# Purge old files
|
||||
purge_dir "$root_prod/newkey/deb"
|
||||
purge_dir "$root_prod/umodules"
|
||||
purge_dir "$root_prod/minimal"
|
||||
purge_dir "$root_prod/tarballs"
|
||||
if [ "$prod" != "" ]; then
|
||||
# XXXX Need to check for
|
||||
# product name exactly
|
||||
rm -f "$root_repos/$prod-latest"*
|
||||
fi
|
||||
postcmd $?
|
||||
echo
|
||||
|
||||
# Descend to project dir
|
||||
cd "$root_prod" || exit 1
|
||||
|
||||
if [ "$english_only" = "1" ]; then
|
||||
echo "Cleaning languages .."
|
||||
cmd="./bin/language-manager --mode=clean --yes $verbosity_level_with_input"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
else
|
||||
# Force restore build directory
|
||||
if [ ! -f "lang/ja" ]; then
|
||||
echo "Restoring languages .."
|
||||
cmd="git checkout \"*\" $verbosity_level && git clean -f -d $verbosity_level && git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Pre-building package .."
|
||||
eval "$cmd"
|
||||
cmd="./makedist.pl \"${ver}${relval}\" $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
|
||||
echo "Building package .."
|
||||
if [ "$relval" == "" ]; then
|
||||
cmd="./makedebian.pl \"$ver\" $verbosity_level"
|
||||
else
|
||||
cmd="./makedebian.pl \"$ver\" \"$rel\" $verbosity_level"
|
||||
fi
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
|
||||
cd "$root" || exit 1
|
||||
echo "Preparing built files for upload .."
|
||||
cmd="cp -f $root_prod/tarballs/${prod}-${ver}*\.tar.gz $root_repos/${prod}-latest.tar.gz $verbosity_level"
|
||||
eval "$cmd"
|
||||
cmd="echo $ver-$rel \($date\) > $root_repos/${prod}-latest.version $verbosity_level_to_file"
|
||||
eval "$cmd"
|
||||
cmd="find $root_apt -name ${prod}_${ver}${relval}*\.deb -exec mv '{}' $root_repos \; $verbosity_level"
|
||||
eval "$cmd"
|
||||
cmd="mv -f $root_repos/${prod}_${ver}${relval}*\.deb $root_repos/${prod}-latest.deb $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
}
|
||||
|
||||
if [ -n "$1" ] && [[ "'$1'" != *"--"* ]]; then
|
||||
build_prod $@
|
||||
|
||||
cloud_upload_list_upload=("$root_repos/$1*")
|
||||
cloud_upload cloud_upload_list_upload
|
||||
|
||||
cloud_repo_sign_and_update
|
||||
else
|
||||
build_prod webmin $@
|
||||
build_prod usermin $@
|
||||
|
||||
cloud_upload_list_upload=("$root_repos/*")
|
||||
cloud_upload cloud_upload_list_upload
|
||||
|
||||
cloud_repo_sign_and_update
|
||||
fi
|
||||
163
.github/build/funcs.sh
vendored
Executable file
163
.github/build/funcs.sh
vendored
Executable file
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright @iliajie <ilia@webmin.dev>
|
||||
#
|
||||
# General build functions
|
||||
#
|
||||
#
|
||||
|
||||
# Upload to cloud
|
||||
# Usage:
|
||||
# cloud_upload_list_delete=("$cloud_upload_ssh_dir/repodata")
|
||||
# cloud_upload_list_upload=("$root_repos/*" "$root_repos/repodata")
|
||||
# cloud_upload cloud_upload_list_upload cloud_upload_list_delete
|
||||
cloud_upload() {
|
||||
# Print new block only if definded
|
||||
local ssh_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
||||
if [ -n "$1" ]; then
|
||||
echo
|
||||
fi
|
||||
# Delete files on remote if needed
|
||||
if [ -n "$2" ]; then
|
||||
echo "Deleting given files in $cloud_upload_ssh_host .."
|
||||
local -n arr_del=$2
|
||||
local err=0
|
||||
for d in "${arr_del[@]}"; do
|
||||
if [ -n "$d" ]; then
|
||||
local cmd1="ssh $ssh_args $cloud_upload_ssh_user@$cloud_upload_ssh_host \"rm -rf $d\" $verbosity_level"
|
||||
eval "$cmd1"
|
||||
if [ "$?" != "0" ]; then
|
||||
err=1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
postcmd $err
|
||||
echo
|
||||
fi
|
||||
|
||||
# Upload files to remote
|
||||
if [ -n "$1" ]; then
|
||||
echo "Uploading built files to $cloud_upload_ssh_host .."
|
||||
local -n arr_upl=$1
|
||||
local err=0
|
||||
for u in "${arr_upl[@]}"; do
|
||||
if [ -n "$u" ]; then
|
||||
local cmd2="scp $ssh_args -r $u $cloud_upload_ssh_user@$cloud_upload_ssh_host:$cloud_upload_ssh_dir/ $verbosity_level"
|
||||
eval "$cmd2"
|
||||
if [ "$?" != "0" ]; then
|
||||
err=1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
postcmd $err
|
||||
echo
|
||||
fi
|
||||
}
|
||||
|
||||
# Sign and update repos metadata in remote
|
||||
cloud_repo_sign_and_update() {
|
||||
echo "Signing and updating repos metadata in $cloud_upload_ssh_host .."
|
||||
local ssh_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
||||
local remote_cmd="cd ~/.scripts && ./update-repo-packages-signature.bash $cloud_upload_gpg_passphrase"
|
||||
local cmd1="ssh $ssh_args $cloud_upload_ssh_user@$cloud_upload_ssh_host \"$remote_cmd\" $verbosity_level"
|
||||
eval "$cmd1"
|
||||
postcmd $?
|
||||
echo
|
||||
}
|
||||
|
||||
# Post command func
|
||||
postcmd() {
|
||||
if [ "$1" != "0" ]; then
|
||||
echo ".. failed"
|
||||
exit 1
|
||||
else
|
||||
echo ".. done"
|
||||
fi
|
||||
}
|
||||
|
||||
# Get max number from array
|
||||
max() {
|
||||
local -n arr_nums=$1
|
||||
IFS=$'\n'
|
||||
echo "${arr_nums[*]}" | sort -nr | head -n1
|
||||
}
|
||||
|
||||
# Mkdir and children dirs
|
||||
make_dir() {
|
||||
if [ ! -d "$1" ]; then
|
||||
mkdir -p "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
# Remove all content in dir
|
||||
purge_dir() {
|
||||
for file in "$1"/*; do
|
||||
rm -rf "$file"
|
||||
done
|
||||
}
|
||||
|
||||
# Get latest tag version
|
||||
get_current_repo_tag() {
|
||||
cd "$root_prod" || exit 1
|
||||
tg=$(git rev-list --tags --max-count=1)
|
||||
ds=$(git describe --tags "$tg")
|
||||
echo "$ds" | sed 's/v//'
|
||||
}
|
||||
|
||||
# Get latest commit date
|
||||
get_current_date() {
|
||||
echo $(date +'%Y-%m-%d %H:%M:%S %z')
|
||||
}
|
||||
|
||||
# Get latest commit date version
|
||||
get_latest_commit_date_version() {
|
||||
local theme_version
|
||||
local prod_version
|
||||
local max_prod
|
||||
local highest_version
|
||||
|
||||
theme_version=$(git log -n1 --pretty='format:%cd' --date=format:'%Y%m%d%H%M')
|
||||
cd "$root_prod" || exit 1
|
||||
prod_version=$(git log -n1 --pretty='format:%cd' --date=format:'%Y%m%d%H%M')
|
||||
max_prod=("$theme_version" "$prod_version")
|
||||
highest_version=$(max max_prod)
|
||||
echo "$highest_version"
|
||||
}
|
||||
|
||||
# Pull project repo and theme
|
||||
make_prod_repos() {
|
||||
# Webmin or Usermin
|
||||
if [ ! -d "$1" ]; then
|
||||
local repo="webmin/$prod.git"
|
||||
cmd="git clone https://github.com/$repo $verbosity_level"
|
||||
eval "$cmd"
|
||||
if [ ! -d "webmin" ]; then
|
||||
cmd="git clone --depth 1 https://github.com/webmin/webmin $verbosity_level"
|
||||
eval "$cmd"
|
||||
fi
|
||||
fi
|
||||
# Theme
|
||||
theme="authentic-theme"
|
||||
if [ ! -d "$1/$theme" ]; then
|
||||
cd "$1" || exit 1
|
||||
local repo="webmin/$theme.git"
|
||||
cmd="git clone --depth 1 https://github.com/$repo $verbosity_level"
|
||||
eval "$cmd"
|
||||
fi
|
||||
}
|
||||
|
||||
spinner() {
|
||||
local msg=$1
|
||||
local pid=$!
|
||||
local spin='-\|/'
|
||||
local i=0
|
||||
printf "$msg "
|
||||
while kill -0 $pid 2>/dev/null; do
|
||||
(( i = (i + 1) % 4 ))
|
||||
# No spinner if not an interactive shell
|
||||
if [ -n "$PS1" ]; then
|
||||
printf '%c\b' "${spin:i:1}"
|
||||
fi
|
||||
sleep .1
|
||||
done
|
||||
}
|
||||
29
.github/build/init.sh
vendored
Normal file
29
.github/build/init.sh
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright @iliajie <ilia@webmin.dev>
|
||||
#
|
||||
# Build init
|
||||
#
|
||||
#
|
||||
|
||||
# Set up SSH dev keys
|
||||
if [ -n "$WEBMIN_DEV__SSH_PRV_KEY" ] && [ -n "$WEBMIN_DEV__SSH_PUB_KEY" ]; then
|
||||
# Generate new pair with right permissions
|
||||
cmd="ssh-keygen -t rsa -q -f \"$HOME/.ssh/id_rsa\" -N \"\"$verbosity_level"
|
||||
eval "$cmd"
|
||||
# Import SSH keys from secrets to be able to connect to the remote host
|
||||
echo "$WEBMIN_DEV__SSH_PRV_KEY" > "$HOME/.ssh/id_rsa"
|
||||
echo "$WEBMIN_DEV__SSH_PUB_KEY" > "$HOME/.ssh/id_rsa.pub"
|
||||
|
||||
# Set up SSH production keys
|
||||
elif [ -n "$WEBMIN_PROD__SSH_PRV_KEY" ] && [ -n "$WEBMIN_PROD__SSH_PUB_KEY" ]; then
|
||||
# Generate new pair with right permissions
|
||||
cmd="ssh-keygen -t rsa -q -f \"$HOME/.ssh/id_rsa\" -N \"\"$verbosity_level"
|
||||
eval "$cmd"
|
||||
# Import SSH keys from secrets to be able to connect to the remote host
|
||||
echo "$WEBMIN_PROD__SSH_PRV_KEY" > "$HOME/.ssh/id_rsa"
|
||||
echo "$WEBMIN_PROD__SSH_PUB_KEY" > "$HOME/.ssh/id_rsa.pub"
|
||||
fi
|
||||
|
||||
# Create symlink to Perl
|
||||
ln -fs /usr/bin/perl /usr/local/bin/perl
|
||||
243
.github/build/rpm.sh
vendored
Executable file
243
.github/build/rpm.sh
vendored
Executable file
@@ -0,0 +1,243 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright @iliajie <ilia@webmin.dev>
|
||||
#
|
||||
# Automatically builds and updates a repo metadata.
|
||||
# Pulls latest changes from GitHub, detects release
|
||||
# version based on what's available in the repo
|
||||
#
|
||||
# (RHEL)
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# # Pull and build production versions
|
||||
# # of both Webmin and Usermin
|
||||
# ./rpm.sh
|
||||
#
|
||||
# # Pull and build devel versions
|
||||
# # of both Webmin and Usermin
|
||||
# ./rpm.sh --devel
|
||||
#
|
||||
# # Pull and build production Webmin version 2.101, forcing
|
||||
# # release version 3, displaying detailed output
|
||||
# ./rpm.sh webmin 2.101 3 --debug
|
||||
#
|
||||
# # Pull and build production Usermin version 2.000,
|
||||
# # automatically setting release version to minimal
|
||||
# ./rpm.sh usermin 2.000
|
||||
#
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
# Source build variables
|
||||
source ./vars.sh || exit 1
|
||||
|
||||
# Source build init
|
||||
source ./init.sh || exit 1
|
||||
|
||||
# Source general build functions
|
||||
source ./funcs.sh || exit 1
|
||||
|
||||
# Build product func
|
||||
build_prod() {
|
||||
|
||||
# Pack with English only in devel builds
|
||||
local english_only=0
|
||||
if [[ "'$*'" == *"--devel"* ]]; then
|
||||
english_only=1
|
||||
fi
|
||||
|
||||
# Always return back to root directory
|
||||
cd "$root" || exit 1
|
||||
|
||||
# Define root
|
||||
local ver=""
|
||||
local prod=$1
|
||||
root_prod="$root/$prod"
|
||||
|
||||
# Print build actual date
|
||||
date=$(get_current_date)
|
||||
|
||||
# Print opening header
|
||||
echo "************************************************************************"
|
||||
echo " build start date: $date "
|
||||
echo " package format: RPM "
|
||||
echo " product: $prod "
|
||||
(make_prod_repos "$root_prod") &
|
||||
spinner " package output version:"
|
||||
|
||||
# Pull main project first to get the latest tag
|
||||
cd "$root_prod" || exit 1
|
||||
cmd="git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs1=$?
|
||||
# Clean and try again
|
||||
if [ "$rs1" != "0" ]; then
|
||||
cmd="git checkout \"*\" $verbosity_level && git clean -f -d $verbosity_level && git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs1=$?
|
||||
fi
|
||||
|
||||
# Pull theme to theme dir
|
||||
cd "authentic-theme" || exit 1
|
||||
cmd="git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs2=$?
|
||||
# Clean and try again
|
||||
if [ "$rs2" != "0" ]; then
|
||||
cmd="git checkout \"*\" $verbosity_level && git clean -f -d $verbosity_level && git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
rs2=$?
|
||||
fi
|
||||
if [ "$rs1" != "0" ] || [ "$rs2" != "0" ]; then
|
||||
rs=1
|
||||
else
|
||||
rs=0
|
||||
fi
|
||||
|
||||
# Build number
|
||||
date_version=$(get_latest_commit_date_version)
|
||||
|
||||
# Handle other params
|
||||
cd "$root_prod" || exit 1
|
||||
if [[ "'$2'" != *"--"* ]]; then
|
||||
ver=$2
|
||||
fi
|
||||
if [[ "'$3'" != *"--"* ]] && [[ -n "$3" ]]; then
|
||||
rel=$3
|
||||
else
|
||||
rel=1
|
||||
fi
|
||||
if [ -z "$ver" ]; then
|
||||
ver=$(get_current_repo_tag)
|
||||
fi
|
||||
if [[ "'$*'" == *"--devel"* ]]; then
|
||||
ver="$ver.$date_version"
|
||||
# Set actual product version
|
||||
echo "${ver}" >"version"
|
||||
fi
|
||||
|
||||
printf "$ver-$rel\n"
|
||||
echo "************************************************************************"
|
||||
|
||||
echo "Pulling latest changes.."
|
||||
# We need to pull first to get the latest tag,
|
||||
# so here we only report an error if any
|
||||
postcmd $rs
|
||||
echo
|
||||
|
||||
echo "Pre-clean up .."
|
||||
# Make sure directories exist
|
||||
make_dir "$root_prod/newkey/rpm/"
|
||||
make_dir "$root_prod/umodules/"
|
||||
make_dir "$root_prod/minimal/"
|
||||
make_dir "$root_prod/tarballs/"
|
||||
make_dir "$root_build/BUILD/"
|
||||
make_dir "$root_build/BUILDROOT/"
|
||||
make_dir "$root_build/RPMS/"
|
||||
make_dir "$root_build/SOURCES/"
|
||||
make_dir "$root_build/SPECS/"
|
||||
make_dir "$root_build/SRPMS/"
|
||||
make_dir "$root_repos/"
|
||||
|
||||
# Re-create legacy link
|
||||
rm -rf "$root/webadmin"
|
||||
ln -s "$root/webmin" "$root/webadmin"
|
||||
|
||||
# Purge old files
|
||||
purge_dir "$root_prod/newkey/rpm"
|
||||
purge_dir "$root_prod/umodules"
|
||||
purge_dir "$root_prod/minimal"
|
||||
purge_dir "$root_prod/tarballs"
|
||||
purge_dir "$root_build/BUILD"
|
||||
purge_dir "$root_build/BUILDROOT"
|
||||
purge_dir "$root_build/RPMS"
|
||||
purge_dir "$root_build/SOURCES"
|
||||
purge_dir "$root_build/SPECS"
|
||||
purge_dir "$root_build/SRPMS"
|
||||
rm -rf "$root_repos/repodata"
|
||||
if [ "$prod" != "" ]; then
|
||||
# XXXX Need to check for
|
||||
# product name exactly
|
||||
rm -f "$root_repos/$prod-latest"*
|
||||
fi
|
||||
postcmd $?
|
||||
make_dir "$root_build/RPMS/noarch"
|
||||
echo
|
||||
|
||||
# Descend to project dir
|
||||
cd "$root_prod" || exit 1
|
||||
|
||||
if [ "$english_only" = "1" ]; then
|
||||
echo "Cleaning languages .."
|
||||
cmd="./bin/language-manager --mode=clean --yes $verbosity_level_with_input"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
else
|
||||
# Force restore build directory
|
||||
if [ ! -f "lang/ja" ]; then
|
||||
echo "Restoring languages .."
|
||||
cmd="git checkout \"*\" $verbosity_level && git clean -f -d $verbosity_level && git pull $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
echo "Pre-building package .."
|
||||
eval "$cmd"
|
||||
if [ "$rel" = "1" ]; then
|
||||
args="$ver"
|
||||
else
|
||||
args="$ver-$rel"
|
||||
fi
|
||||
|
||||
cmd="./makedist.pl \"$args\" $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
|
||||
echo "Building package .."
|
||||
cmd="./makerpm.pl \"$ver\" \"$rel\" $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
|
||||
cd "$root" || exit 1
|
||||
echo "Preparing built files for upload .."
|
||||
cmd="cp -f $root_prod/tarballs/$prod-$ver*\.tar.gz $root_repos/${prod}-latest.tar.gz $verbosity_level"
|
||||
eval "$cmd"
|
||||
cmd="echo $ver-$rel \($date\) > $root_repos/$prod-latest.version"
|
||||
eval "$cmd"
|
||||
cmd="find $root_rpms -name $prod-$ver-$rel*\.rpm -exec mv '{}' $root_repos \; $verbosity_level"
|
||||
eval "$cmd"
|
||||
cmd="mv -f $root_repos/$prod-$ver-$rel*\.rpm $root_repos/${prod}-latest.rpm $verbosity_level"
|
||||
eval "$cmd"
|
||||
postcmd $?
|
||||
echo
|
||||
|
||||
echo "Post-clean up .."
|
||||
cd "$root_build" || exit 1
|
||||
for dir in *; do
|
||||
cmd="rm -rf \"$dir/*\" $verbosity_level"
|
||||
eval "$cmd"
|
||||
done
|
||||
postcmd $?
|
||||
}
|
||||
|
||||
if [ -n "$1" ] && [[ "'$1'" != *"--"* ]]; then
|
||||
build_prod $@
|
||||
|
||||
cloud_upload_list_upload=("$root_repos/$1*")
|
||||
cloud_upload cloud_upload_list_upload
|
||||
|
||||
cloud_repo_sign_and_update
|
||||
|
||||
else
|
||||
build_prod webmin $@
|
||||
build_prod usermin $@
|
||||
|
||||
cloud_upload_list_upload=("$root_repos/*")
|
||||
cloud_upload cloud_upload_list_upload
|
||||
|
||||
cloud_repo_sign_and_update
|
||||
fi
|
||||
27
.github/build/vars.sh
vendored
Executable file
27
.github/build/vars.sh
vendored
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright @iliajie <ilia@webmin.dev>
|
||||
#
|
||||
# Build variables
|
||||
#
|
||||
#
|
||||
|
||||
# Set defaults
|
||||
root="${ENV_BUILD__ROOT:-$HOME}"
|
||||
root_repos="${ENV_BUILD__ROOT_REPOS:-$root/repo}"
|
||||
root_build="${ENV_BUILD__ROOT_BUILD:-$root/rpmbuild}"
|
||||
root_rpms="${ENV_BUILD__ROOT_RPMS:-$root_build/RPMS/noarch}"
|
||||
|
||||
# Cloud upload config
|
||||
cloud_upload_ssh_user="${ENV_BUILD__CLOUD_UPLOAD_SSH_USER:-webmin.dev}"
|
||||
cloud_upload_ssh_host="${ENV_BUILD__CLOUD_UPLOAD_SSH_HOST:-webmin.dev}"
|
||||
cloud_upload_ssh_dir="${ENV_BUILD__CLOUD_UPLOAD_SSH_DIR:-~/domains/builds.webmin.dev/public_html}"
|
||||
cloud_upload_gpg_passphrase="${WEBMIN_DEV__GPG_PH}"
|
||||
|
||||
# Define verbosity level
|
||||
verbosity_level=' >/dev/null 2>&1 </dev/null'
|
||||
verbosity_level_to_file='2> /dev/null'
|
||||
verbosity_level_with_input=' >/dev/null 2>&1'
|
||||
if [[ "'$*'" == *"--debug"* ]]; then
|
||||
unset verbosity_level verbosity_level_to_file verbosity_level_with_input
|
||||
fi
|
||||
30
.github/workflows/webmin.dev-deploy-webmin-package.yml
vendored
Normal file
30
.github/workflows/webmin.dev-deploy-webmin-package.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
name: "webmin.dev: Deploy Webmin package"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
if: contains(github.event.head_commit.message, '[build]')
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: git tar gzip openssl curl openssh-client rpm perl libdigest-sha-perl liblist-moreutils-perl libencode-detect-perl
|
||||
version: 1.0
|
||||
- uses: szenius/set-timezone@v1.2
|
||||
with:
|
||||
timezoneLinux: "Europe/Nicosia"
|
||||
- name: Build and upload packages
|
||||
env:
|
||||
WEBMIN_DEV__SSH_PRV_KEY: ${{ secrets.WEBMIN_DEV__SSH_PRV_KEY }}
|
||||
WEBMIN_DEV__SSH_PUB_KEY: ${{ secrets.WEBMIN_DEV__SSH_PUB_KEY }}
|
||||
WEBMIN_DEV__GPG_PH: ${{ secrets.WEBMIN_DEV__GPG_PH }}
|
||||
ENV_BUILD__CLOUD_UPLOAD_SSH_HOST: ${{ secrets.WEBMIN_DEV__IP_ADDR }}
|
||||
working-directory: ./.github/build
|
||||
run: |-
|
||||
./deb.sh webmin --devel
|
||||
./rpm.sh webmin --devel
|
||||
31
CHANGELOG.md
31
CHANGELOG.md
@@ -1,6 +1,35 @@
|
||||
## Changelog
|
||||
|
||||
#### 2.100 (July, 2023)
|
||||
#### 2.103 (September 30, 2023)
|
||||
* Add support for hostname detection using `hostnamectl` command
|
||||
* Add support for other ACME services
|
||||
* Add ability to hide dotfiles in File Manager [#1578](https://github.com/webmin/authentic-theme/issues/1578)
|
||||
* Add `xz`, `zstd` and plain `tar` support when creating archives in File Manager [#2009](https://github.com/webmin/webmin/issues/2009)
|
||||
* Add support for English (United States) (military time) locale
|
||||
* Fix to correctly switch key hash type with ACME services
|
||||
* Fix bug when `backend` wasn't saved correctly in Fail2Ban module [#1992](https://github.com/webmin/webmin/issues/1992)
|
||||
* Fix large files download in Upload and Download module
|
||||
* Fix Google Authentication on RHEL systems derivatives
|
||||
* Update the Authentic theme to the latest version with various fixes and improvements
|
||||
|
||||
#### 2.102 (August 23, 2023)
|
||||
* Add support for Amazon Linux 2023
|
||||
* Fix a bug in Network Configuration module when parsing network size [sourceforge.net/discussion#55377]( https://sourceforge.net/p/webadmin/discussion/55377/thread/78e5aa05f3)
|
||||
* Fix Netplan related bugs in Network Configuration module
|
||||
* Fix Terminal focus bug
|
||||
* Fix to correctly compare Webmin semantic versions
|
||||
* Fix to suppress output from `monitor.pl` command [#1984](https://github.com/webmin/webmin/issues/1984)
|
||||
|
||||
#### 2.101 (August 5, 2023)
|
||||
* Add support for reading gzipped email messages
|
||||
* Add `error_stderr` API
|
||||
* Fix to show correct locale for sudo-capable users [webmin/authentic-theme#1663](https://github.com/webmin/authentic-theme/issues/1663)
|
||||
* Fix new signing key import on Debian and derivatives
|
||||
* Fix to check if password hash format is valid for `yescrypt` and `SHA512`
|
||||
* Fix various XSS related issues
|
||||
* Fix updating Webmin from repository if a package is available
|
||||
|
||||
#### 2.100 (July 22, 2023)
|
||||
* Add support for showing defaults for options in PHP Configuration module
|
||||
* Add significant improvements to email display, reply and compose
|
||||
* Add support for WebGL in the Terminal module
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ mime_types=/etc/apache2/mime.types
|
||||
httpd_path=/usr/sbin/httpd
|
||||
start_cmd=systemctl start apache2
|
||||
stop_cmd=systemctl stop apache2
|
||||
apply_cmd=systemctl restart apache2
|
||||
apply_cmd=systemctl reload apache2
|
||||
show_order=0
|
||||
max_servers=100
|
||||
test_config=1
|
||||
|
||||
@@ -779,11 +779,23 @@ local(@po, $po, @rv);
|
||||
if ($in{'Options_def'}) { return ( [ ] ); }
|
||||
@po = ("ExecCGI", "FollowSymLinks", "Includes", "IncludesNOEXEC",
|
||||
"Indexes", "MultiViews", "SymLinksIfOwnerMatch");
|
||||
my $abscount = 0;
|
||||
my $pluscount = 0;
|
||||
foreach $po (@po) {
|
||||
if ($in{$po} == 1) { push(@rv, $po); }
|
||||
elsif ($in{$po} == 2) { push(@rv, "+$po"); }
|
||||
elsif ($in{$po} == 3) { push(@rv, "-$po"); }
|
||||
if ($in{$po} == 1) {
|
||||
push(@rv, $po);
|
||||
$abscount++;
|
||||
}
|
||||
elsif ($in{$po} == 2) {
|
||||
push(@rv, "+$po");
|
||||
$pluscount++;
|
||||
}
|
||||
elsif ($in{$po} == 3) {
|
||||
push(@rv, "-$po");
|
||||
$pluscount++;
|
||||
}
|
||||
}
|
||||
$abscount && $pluscount && &error($text{'core_eoptionsboth'});
|
||||
return @rv ? ( [ join(' ', @rv) ] ) : ( [ "None" ] );
|
||||
}
|
||||
|
||||
|
||||
@@ -501,6 +501,7 @@ core_actmod=Active modules
|
||||
core_option=Option
|
||||
core_setdir=Set for directory
|
||||
core_merge=Merge with parent
|
||||
core_eoptionsboth=Directory options : Active options must be all either Set For Directory or Merged With Parent, but not both
|
||||
core_users=Only these users
|
||||
core_groups=Only these groups
|
||||
core_allusers=All valid users
|
||||
@@ -637,7 +638,6 @@ mod_proxy_preserve=Preserve original Host: header
|
||||
mod_proxy_timeout=Proxy request timeout in seconds
|
||||
mod_proxy_etimeout=Proxy request timeout must be a number of seconds
|
||||
mod_proxy_via=Set Via: headers
|
||||
mod_proxy_preserve=Preserve original HTTP host
|
||||
mod_proxy_not=None
|
||||
|
||||
mod_log_agent_default=Default
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Returns a list of files and directories under some directory
|
||||
|
||||
$trust_unknown_referers = 1;
|
||||
BEGIN { require './bacula-backup-lib.pl'; }
|
||||
require './bacula-backup-lib.pl';
|
||||
&ReadParse();
|
||||
|
||||
# Input sanitization
|
||||
|
||||
@@ -1976,22 +1976,32 @@ if (!$file) {
|
||||
push(@{$dir->{'members'}}, { 'name' => 'file',
|
||||
'values' => [ $file ] } );
|
||||
|
||||
# Add slave IPs
|
||||
if (@$slaves) {
|
||||
# Allow transfer from slave IPs
|
||||
my (@notify, @transfer);
|
||||
foreach my $s (@$slaves) {
|
||||
push(@notify, { 'name' => $s });
|
||||
push(@transfer, { 'name' => $s });
|
||||
}
|
||||
if (@transfer) {
|
||||
my $gat = &find("allow-transfer", $opts->{'members'});
|
||||
if ($gat) {
|
||||
push(@transfer, @{$gat->{'members'}});
|
||||
}
|
||||
}
|
||||
if (@notify) {
|
||||
my $also = { 'name' => 'also-notify',
|
||||
'type' => 1,
|
||||
'members' => [ ] };
|
||||
my $allow = { 'name' => 'allow-transfer',
|
||||
'type' => 1,
|
||||
'members' => [ ] };
|
||||
foreach my $s (@$slaves) {
|
||||
push(@{$also->{'members'}}, { 'name' => $s });
|
||||
push(@{$allow->{'members'}}, { 'name' => $s });
|
||||
}
|
||||
push(@{$dir->{'members'}}, $also, $allow);
|
||||
'members' => \@notify};
|
||||
push(@{$dir->{'members'}}, $also);
|
||||
push(@{$dir->{'members'}}, { 'name' => 'notify',
|
||||
'values' => [ 'yes' ] });
|
||||
}
|
||||
if (@transfer) {
|
||||
my $allow = { 'name' => 'allow-transfer',
|
||||
'type' => 1,
|
||||
'members' => \@transfer };
|
||||
push(@{$dir->{'members'}}, $allow);
|
||||
}
|
||||
|
||||
# Create the zone file, with records
|
||||
my $ZONE;
|
||||
@@ -3591,7 +3601,7 @@ for(my $i=$#recs; $i>=0; $i--) {
|
||||
if ($recs[$i]->{'type'} eq 'NSEC' ||
|
||||
$recs[$i]->{'type'} eq 'NSEC3' ||
|
||||
$recs[$i]->{'type'} eq 'RRSIG' ||
|
||||
$recs[$i]->{'type'} eq 'NSEC3PARAM' && $tools ||
|
||||
$recs[$i]->{'type'} eq 'NSEC3PARAM' ||
|
||||
$recs[$i]->{'type'} eq 'DNSKEY') {
|
||||
&delete_record($fn, $recs[$i]);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ use warnings;
|
||||
no warnings 'redefine';
|
||||
no warnings 'uninitialized';
|
||||
# Globals
|
||||
our (%access, %text);
|
||||
our (%access, %text, $bind_version);
|
||||
our $dnssec_dlv_zone;
|
||||
|
||||
require './bind8-lib.pl';
|
||||
@@ -24,10 +24,12 @@ $tkeys ||= { 'members' => [ ] };
|
||||
print &ui_form_start("save_trusted.cgi", "post");
|
||||
print &ui_table_start($text{'trusted_header'}, undef, 2);
|
||||
|
||||
# DNSSEC enabled?
|
||||
print &choice_input($text{'trusted_dnssec'}, 'dnssec-enable', $mems,
|
||||
$text{'yes'}, 'yes', $text{'no'}, 'no',
|
||||
$text{'default'}, undef);
|
||||
if (&compare_version_numbers($bind_version, '<', '9.16.0')) {
|
||||
# DNSSEC enabled?
|
||||
print &choice_input($text{'trusted_dnssec'}, 'dnssec-enable', $mems,
|
||||
$text{'yes'}, 'yes', $text{'no'}, 'no',
|
||||
$text{'default'}, undef);
|
||||
}
|
||||
if (&supports_dnssec_client() == 2) {
|
||||
print &choice_input($text{'trusted_validation'},
|
||||
'dnssec-validation', $mems,
|
||||
|
||||
@@ -4,7 +4,7 @@ use strict;
|
||||
use warnings;
|
||||
no warnings 'redefine';
|
||||
no warnings 'uninitialized';
|
||||
our (%access, %text, %in, %config);
|
||||
our (%access, %text, %in, %config, $bind_version);
|
||||
|
||||
require './bind8-lib.pl';
|
||||
$access{'defaults'} || &error($text{'trusted_ecannot'});
|
||||
@@ -17,7 +17,9 @@ my $conf = $parent->{'members'};
|
||||
my $options = &find("options", $conf);
|
||||
|
||||
# DNSSEC enabled
|
||||
&save_choice("dnssec-enable", $options, 1);
|
||||
if (&compare_version_numbers($bind_version, '<', '9.16.0')) {
|
||||
&save_choice("dnssec-enable", $options, 1);
|
||||
}
|
||||
if (&supports_dnssec_client() == 2) {
|
||||
&save_choice("dnssec-validation", $options, 1);
|
||||
}
|
||||
|
||||
@@ -233,25 +233,32 @@ print "<p><b>$text{'do_done'}</b><p>\n";
|
||||
# Show details of installed packages, where we have them
|
||||
for($i=0; $i<@names; $i++) {
|
||||
next if (!$pinfo[$i]);
|
||||
print "<table border width=100%>\n";
|
||||
print "<tr $tb> <td><b>$text{'do_details'}</b></td> </tr>\n";
|
||||
print "<tr $cb> <td><table width=100%>\n";
|
||||
print &ui_table_start($text{'do_details'}, "width=100%", 4);
|
||||
|
||||
if ($pinfo[$i]->[2]) {
|
||||
print "<tr> <td valign=top width=20%><b>$text{'do_desc'}</b></td>\n";
|
||||
print "<td colspan=3><pre>$pinfo[$i]->[2]</pre></td> </tr>\n";
|
||||
print &ui_table_row($text{'do_desc'},
|
||||
"<pre>".&html_escape($pinfo[$i]->[2])."</pre>", 3);
|
||||
}
|
||||
|
||||
print "<tr> <td width=20%><b>$text{'do_pack'}</b></td> <td>$pinfo[$i]->[0]</td>\n";
|
||||
print "<td width=20%><b>$text{'do_class'}</b></td> <td>",
|
||||
$pinfo[$i]->[1] ? $pinfo[$i]->[1] : $text{'do_none'},"</td> </tr>\n";
|
||||
print &ui_table_row($text{'do_pack'},
|
||||
$pinfo[$i]->[0]);
|
||||
|
||||
print "<tr> <td width=20%><b>$text{'do_ver'}</b></td> <td>$pinfo[$i]->[4]</td>\n";
|
||||
print "<td width=20%><b>$text{'do_vend'}</b></td> <td>$pinfo[$i]->[5]</td> </tr>\n";
|
||||
print &ui_table_row($text{'do_class'},
|
||||
$pinfo[$i]->[1] || $text{'do_none'});
|
||||
|
||||
print "<tr> <td width=20%><b>$text{'do_arch'}</b></td> <td>$pinfo[$i]->[3]</td>\n";
|
||||
print "<td width=20%><b>$text{'do_inst'}</b></td> <td>$pinfo[$i]->[6]</td> </tr>\n";
|
||||
print "</table></td></tr></table><p>\n";
|
||||
print &ui_table_row($text{'do_ver'},
|
||||
$pinfo[$i]->[4]);
|
||||
|
||||
print &ui_table_row($text{'do_vend'},
|
||||
$pinfo[$i]->[5]);
|
||||
|
||||
print &ui_table_row($text{'do_arch'},
|
||||
$pinfo[$i]->[3]);
|
||||
|
||||
print &ui_table_row($text{'do_inst'},
|
||||
$pinfo[$i]->[6]);
|
||||
|
||||
print &ui_table_end();
|
||||
}
|
||||
|
||||
&remote_finished();
|
||||
|
||||
@@ -22,10 +22,12 @@ else {
|
||||
|
||||
if ($in{source} == 0) {
|
||||
# installing from local file (or maybe directory)
|
||||
if (!$in{'local'})
|
||||
{ &install_error($text{'install_elocal'}); }
|
||||
if (!-r $in{'local'})
|
||||
{ &install_error(&text('install_elocal2', $in{'local'})); }
|
||||
if (!$in{'local'}) {
|
||||
&install_error($text{'install_elocal'});
|
||||
}
|
||||
if (!-r $in{'local'}) {
|
||||
&install_error(&text('install_elocal2', &html_escape($in{'local'})));
|
||||
}
|
||||
$source = $in{'local'};
|
||||
$pfile = $in{'local'};
|
||||
$filename = $in{'local'};
|
||||
@@ -177,7 +179,7 @@ print &ui_form_end([ [ undef, $text{'install_ok'} ] ]);
|
||||
|
||||
sub install_error
|
||||
{
|
||||
print "<b>$main::whatfailed : $_[0]</b> <p>\n";
|
||||
print "<b>$main::whatfailed : @{[&html_escape($_[0])]}</b> <p>\n";
|
||||
&ui_print_footer("", $text{'index_return'});
|
||||
exit;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ if (@match == 1) {
|
||||
&ui_print_header(undef, $text{'search_title'}, "", "search");
|
||||
if (@match) {
|
||||
@match = sort { lc($a->{'name'}) cmp lc($b->{'name'}) } @match;
|
||||
print "<b>",&text('search_match', "<tt>$s</tt>"),"</b><br>\n";
|
||||
print "<b>",&text('search_match', "<tt>".&html_escape($s)."</tt>"),"</b><br>\n";
|
||||
|
||||
print &ui_form_start("delete_packs.cgi", "post");
|
||||
print &ui_hidden("search", $in{'search'}),"\n";
|
||||
@@ -43,8 +43,8 @@ if (@match) {
|
||||
$text{'search_desc'} ], 100, 0, \@tds);
|
||||
foreach $i (@match) {
|
||||
local @cols;
|
||||
push(@cols, "<a href=\"edit_pack.cgi?search=$s&package=".
|
||||
&urlize($i->{'name'})."\">$i->{'name'}</a>");
|
||||
push(@cols, "<a href=\"edit_pack.cgi?search=".&urlize($s).
|
||||
"&package=".&urlize($i->{'name'})."\">$i->{'name'}</a>");
|
||||
$c = $i->{'class'};
|
||||
push(@cols, $i->{'class'} || $text{'search_none'});
|
||||
push(@cols, $i->{'desc'});
|
||||
@@ -62,7 +62,7 @@ if (@match) {
|
||||
print &ui_form_end();
|
||||
}
|
||||
else {
|
||||
print "<b>",&text('search_nomatch', "<tt>$s</tt>"),"</b>\n";
|
||||
print "<b>",&text('search_nomatch', "<tt>".&html_escape($s)."</tt>"),"</b>\n";
|
||||
}
|
||||
|
||||
&ui_print_footer("", $text{'index_return'});
|
||||
|
||||
@@ -16,10 +16,12 @@ else {
|
||||
|
||||
if ($in{source} == 0) {
|
||||
# installing from local file (or maybe directory)
|
||||
if (!$in{'local'})
|
||||
{ &download_error($text{'install_elocal'}); }
|
||||
if (!-r $in{'local'})
|
||||
{ &download_error(&text('install_elocal2', $in{'local'})); }
|
||||
if (!$in{'local'}) {
|
||||
&download_error($text{'install_elocal'});
|
||||
}
|
||||
if (!-r $in{'local'}) {
|
||||
&download_error(&text('install_elocal2', &html_escape($in{'local'})));
|
||||
}
|
||||
$source = $in{'local'};
|
||||
$pfile = $in{'local'};
|
||||
$need_unlink = 0;
|
||||
@@ -55,7 +57,9 @@ elsif ($in{source} == 2) {
|
||||
&ftp_download($host, $file, $pfile, \$error,
|
||||
\&progress_callback);
|
||||
}
|
||||
else { &download_error(&text('install_eurl', $in{'url'})); }
|
||||
else {
|
||||
&download_error(&text('install_eurl', &html_escape($in{'url'})));
|
||||
}
|
||||
&download_error($error) if ($error);
|
||||
$source = $in{'url'};
|
||||
$need_unlink = 1;
|
||||
|
||||
@@ -16,10 +16,12 @@ else {
|
||||
|
||||
if ($in{source} == 0) {
|
||||
# installing from local file (or maybe directory)
|
||||
if (!$in{'local'})
|
||||
{ &download_error($text{'install_elocal'}); }
|
||||
if (!-r $in{'local'})
|
||||
{ &download_error(&text('install_elocal2', $in{'local'})); }
|
||||
if (!$in{'local'}) {
|
||||
&download_error($text{'install_elocal'});
|
||||
}
|
||||
if (!-r $in{'local'}) {
|
||||
&download_error(&text('install_elocal2', &html_escape($in{'local'})));
|
||||
}
|
||||
$source = $in{'local'};
|
||||
$pfile = $in{'local'};
|
||||
$need_unlink = 0;
|
||||
@@ -55,7 +57,9 @@ elsif ($in{source} == 2) {
|
||||
&ftp_download($host, $file, $pfile, \$error,
|
||||
\&progress_callback);
|
||||
}
|
||||
else { &download_error(&text('install_eurl', $in{'url'})); }
|
||||
else {
|
||||
&download_error(&text('install_eurl', &html_escape($in{'url'})));
|
||||
}
|
||||
&download_error($error) if ($error);
|
||||
$source = $in{'url'};
|
||||
$need_unlink = 1;
|
||||
|
||||
@@ -389,7 +389,7 @@ print &ui_form_end([ [ undef, $text{'download_cont'} ],
|
||||
|
||||
sub install_error
|
||||
{
|
||||
print "<br><b>$main::whatfailed : $_[0]</b> <p>\n";
|
||||
print "<br><b>$main::whatfailed : @{[&html_escape($_[0])]}</b> <p>\n";
|
||||
&ui_print_footer($in{'return'},
|
||||
$in{'returndesc'} || $text{'index_return'});
|
||||
exit;
|
||||
|
||||
@@ -19,6 +19,10 @@ while(@ARGV) {
|
||||
shift(@ARGV);
|
||||
$createsig = 1;
|
||||
}
|
||||
elsif ($ARGV[0] eq "--key") {
|
||||
shift(@ARGV);
|
||||
$keyname = shift(@ARGV);
|
||||
}
|
||||
elsif ($ARGV[0] eq "--exclude") {
|
||||
shift(@ARGV);
|
||||
push(@exclude, shift(@ARGV));
|
||||
@@ -98,7 +102,8 @@ if ($file =~ /^(.*)\.gz$/i) {
|
||||
}
|
||||
if ($createsig) {
|
||||
system("rm -f $file-sig.asc");
|
||||
system("gpg --armor --output $file-sig.asc --detach-sig $file");
|
||||
system("gpg ".($keyname ? " --default-key $keyname" : "").
|
||||
" --armor --output $file-sig.asc --detach-sig $file");
|
||||
}
|
||||
|
||||
# read_file(file, &assoc, [&order], [lowercase])
|
||||
|
||||
@@ -1603,6 +1603,7 @@ if ($config{'system_crontab'}) {
|
||||
}
|
||||
if ($config{'cronfiles_dir'}) {
|
||||
push(@files, glob(&translate_filename($config{'cronfiles_dir'})."/*"));
|
||||
@files = grep { -f $_ } @files;
|
||||
}
|
||||
return &unique(@files);
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ foreach $u (@ulist) {
|
||||
$cmdidx = scalar(@cols);
|
||||
push(@cols, &ui_link("edit_env.cgi?idx=".$idx,
|
||||
"<i>$text{'index_env'}</i> ".
|
||||
"<tt>$job->{'name'} = $job->{'value'}</tt>") );
|
||||
"<tt>@{[&html_escape($job->{'name'})]} = @{[&html_escape($job->{'value'})]}</tt>") );
|
||||
$donelink = 1;
|
||||
}
|
||||
elsif (@exp && $access{'command'}) {
|
||||
@@ -156,7 +156,7 @@ foreach $u (@ulist) {
|
||||
|
||||
# Show comment
|
||||
if ($config{'show_comment'} || $userconfig{'show_comment'}) {
|
||||
push(@cols, $job->{'comment'});
|
||||
push(@cols, &html_escape($job->{'comment'}));
|
||||
}
|
||||
|
||||
# Show next run time
|
||||
|
||||
@@ -216,6 +216,11 @@ return wantarray ? @rv : $rv[0];
|
||||
sub save_directive
|
||||
{
|
||||
local ($conf, $name, $value, $sname, $svalue) = @_;
|
||||
$newconf = [ grep { $_->{'file'} !~ /^\/usr\/share\/dovecot/ &&
|
||||
$_->{'file'} !~ /^\/opt/ } @$conf ];
|
||||
if (@$newconf) {
|
||||
$conf = $newconf;
|
||||
}
|
||||
local $dir;
|
||||
if (ref($name)) {
|
||||
# Old directive given
|
||||
@@ -577,5 +582,4 @@ else {
|
||||
}
|
||||
|
||||
1;
|
||||
r
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
line2=System configuration,11
|
||||
exports_file=Exported filesystems file,0
|
||||
apply_cmd=Command to apply configuration,3,None
|
||||
restart_command=Command to restart export server,0
|
||||
|
||||
@@ -51,9 +51,11 @@ print &ui_table_row($text{'jail_ignoreip'},
|
||||
my $backend = &find_value("backend", $jail);
|
||||
print &ui_table_row($text{'jail_backend'},
|
||||
&ui_select("backend", $backend || "auto",
|
||||
[ [ "auto", $text{'jail_auto'} ],
|
||||
[ "gamin", $text{'jail_gamin'} ],
|
||||
[ "polling", $text{'jail_polling'} ] ]));
|
||||
[ [ "auto", $text{'jail_auto'} ],
|
||||
[ "systemd", $text{'jail_systemd'} ],
|
||||
[ "polling", $text{'jail_polling'} ],
|
||||
[ "gamin", $text{'jail_gamin'} ],
|
||||
[ "pyinotify", $text{'jail_pyinotify'} ] ]));
|
||||
|
||||
# Email destination
|
||||
my $destemail = &find_value("destemail", $jail);
|
||||
|
||||
0
fail2ban/jail_blocks.cgi
Normal file → Executable file
0
fail2ban/jail_blocks.cgi
Normal file → Executable file
@@ -114,8 +114,10 @@ jail_efindtime=Delay between matches must be a number greater than zero
|
||||
jail_ebantime=Time to ban an IP must be a number greater than zero
|
||||
jail_backend=Check for log file updates using
|
||||
jail_auto=Decide automatically
|
||||
jail_gamin=Gamin file alteration monitor
|
||||
jail_polling=Background polling
|
||||
jail_systemd=systemd
|
||||
jail_polling=polling
|
||||
jail_gamin=gamin
|
||||
jail_pyinotify=pyinotify
|
||||
jail_destemail=Default notification email
|
||||
jail_none=None set
|
||||
jail_banaction=Default action to apply
|
||||
|
||||
0
fail2ban/unblock_jailed_ip.cgi
Normal file → Executable file
0
fail2ban/unblock_jailed_ip.cgi
Normal file → Executable file
@@ -11,7 +11,19 @@ if(!$in{'arch'}) {
|
||||
|
||||
my $command;
|
||||
|
||||
if ($in{'method'} eq 'tar') {
|
||||
if ($in{'method'} eq 'plain-tar') {
|
||||
$full = "$cwd/$in{'arch'}.tar";
|
||||
$command = "tar cf ".quotemeta($full)." -C ".quotemeta($cwd);
|
||||
}
|
||||
elsif ($in{'method'} eq 'xz-tar') {
|
||||
$full = "$cwd/$in{'arch'}.tar.xz";
|
||||
$command = "tar cJf ".quotemeta($full)." -C ".quotemeta($cwd);
|
||||
}
|
||||
elsif ($in{'method'} eq 'zstd-tar') {
|
||||
$full = "$cwd/$in{'arch'}.zst";
|
||||
$command = "ZSTD_CLEVEL=19 tar --zstd -cf ".quotemeta($full)." -C ".quotemeta($cwd);
|
||||
}
|
||||
elsif ($in{'method'} eq 'tar') {
|
||||
$full = "$cwd/$in{'arch'}.tar.gz";
|
||||
$command = "tar czf ".quotemeta($full)." -C ".quotemeta($cwd);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,8 @@ print &ui_table_row($text{'config_columns_to_display'},
|
||||
&ui_checkbox('columns', 'last_mod_time', $text{'last_mod_time'}, $config{'columns'} =~ /last_mod_time/)
|
||||
);
|
||||
print &ui_table_row($text{'config_per_page'}, ui_textbox("per_page", $config{'per_page'}, 80));
|
||||
print &ui_table_row($text{'file_detect_encoding'}, &ui_yesno_radio('config_portable_module_filemanager_editor_detect_encoding', $config{'config_portable_module_filemanager_editor_detect_encoding'}, 'true', 'false'));
|
||||
print &ui_table_row($text{'file_detect_encoding'}, &ui_yesno_radio('config_portable_module_filemanager_editor_detect_encoding', $config{'config_portable_module_filemanager_editor_detect_encoding'} ne 'false' ? 'true' : 'false', 'true', 'false'));
|
||||
print &ui_table_row($text{'file_showhiddenfiles'}, &ui_yesno_radio('config_portable_module_filemanager_show_dot_files', $config{'config_portable_module_filemanager_show_dot_files'} ne 'false' ? 'true' : 'false', 'true', 'false'));
|
||||
print &ui_table_row($text{'config_bookmarks'}, &ui_textarea("bookmarks", $bookmarks, 5, 40));
|
||||
|
||||
print &ui_table_end();
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
max=Maximum size for uploaded files,3,Unlimited
|
||||
config_portable_module_filemanager_editor_detect_encoding=Fix to prevent encoding detection if forbidden,1,true-Yes,false-No
|
||||
config_portable_module_filemanager_editor_detect_encoding=Fix to prevent encoding detection if forbidden,1,true-Yes,false-No
|
||||
config_portable_module_filemanager_show_dot_files=Show hidden files,1,true-Yes,false-No
|
||||
@@ -1,3 +1,4 @@
|
||||
columns=size,owner_user,permissions,last_mod_time
|
||||
per_page=50
|
||||
config_portable_module_filemanager_editor_detect_encoding=true
|
||||
config_portable_module_filemanager_editor_detect_encoding=true
|
||||
config_portable_module_filemanager_show_dot_files=true
|
||||
|
||||
@@ -12,7 +12,7 @@ if ($archive_type =~ /x-bzip/) {
|
||||
$cmd = "tar xvjfp ".quotemeta("$cwd/$in{'file'}").
|
||||
" -C ".quotemeta($cwd);
|
||||
}
|
||||
elsif ($archive_type =~ /x-tar|\/gzip|x-xz|x-compressed-tar/) {
|
||||
elsif ($archive_type =~ /x-tar|\/gzip|x-xz|zstd|x-compressed-tar/) {
|
||||
$cmd = "tar xfp ".quotemeta("$cwd/$in{'file'}").
|
||||
" -C ".quotemeta($cwd);
|
||||
}
|
||||
|
||||
@@ -397,6 +397,7 @@ sub print_interface {
|
||||
index($type, "-x-tar") != -1 ||
|
||||
(index($type, "-x-bzip") != -1 && has_command('bzip2')) ||
|
||||
(index($type, "-gzip") != -1 && has_command('gzip')) ||
|
||||
(index($type, "zstd") != -1 && has_command('zstd')) ||
|
||||
(index($type, "-x-xz") != -1 && has_command('xz'))
|
||||
) &&
|
||||
has_command('tar')))
|
||||
|
||||
BIN
filemin/images/icons/mime/application-x-xz-compressed-tar.png
Normal file
BIN
filemin/images/icons/mime/application-x-xz-compressed-tar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 764 B |
BIN
filemin/images/icons/mime/application-zstd.png
Normal file
BIN
filemin/images/icons/mime/application-zstd.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 764 B |
@@ -18,7 +18,8 @@ unless (opendir ( DIR, $cwd )) {
|
||||
my %secontext;
|
||||
|
||||
# Push file names with full paths to array, filtering out "." and ".."
|
||||
@list = map { &simplify_path("$cwd/$_") } grep { $_ ne '.' && $_ ne '..' } readdir(DIR);
|
||||
my $show_dot_files = $userconfig{'config_portable_module_filemanager_show_dot_files'} ne 'false';
|
||||
@list = map { &simplify_path("$cwd/$_") } grep { $_ ne '.' && $_ ne '..' && ($show_dot_files || ($_ !~ /^\./ && $_ !~ /\/\./)) } readdir(DIR);
|
||||
closedir(DIR);
|
||||
|
||||
# Filter out not allowed paths
|
||||
|
||||
@@ -173,6 +173,7 @@ acls_action=Action
|
||||
acls_manual=Manual params
|
||||
acls_error=<tt>setfacl</tt> command is not found on your system
|
||||
file_detect_encoding=Automatically detect file encoding
|
||||
file_showhiddenfiles=Show hidden files
|
||||
index_return=file listing
|
||||
upload_dirs=Directory Upload
|
||||
extract_uploaded=Extract Compressed
|
||||
|
||||
@@ -13,6 +13,7 @@ $columns =~ s/\0/,/g;
|
||||
'columns' => $columns,
|
||||
'per_page' => $in{'per_page'},
|
||||
'config_portable_module_filemanager_editor_detect_encoding' => $in{'config_portable_module_filemanager_editor_detect_encoding'},
|
||||
'config_portable_module_filemanager_show_dot_files' => $in{'config_portable_module_filemanager_show_dot_files'},
|
||||
);
|
||||
my $max_allowed = $in{'max_allowed'};
|
||||
if($max_allowed) {
|
||||
|
||||
@@ -102,7 +102,10 @@
|
||||
<input name="filename" type="text" class="form-control" data-placement="right" data-content="$text{'provide_file_name'}" data-trigger="manual">
|
||||
</div>
|
||||
<select name="method">
|
||||
<option value="tar">.tar.gz</option>
|
||||
<option value="plain-tar">.tar</option>
|
||||
<option value="xz-tar">.tar.xz</option>
|
||||
<option selected value="tar">.tar.gz</option>
|
||||
<option value="zstd-tar">.zstd</option>
|
||||
<option value="zip">.zip</option>
|
||||
</select>
|
||||
</form>
|
||||
|
||||
@@ -39,7 +39,10 @@
|
||||
<label>$text{'archive_name'}</label>
|
||||
<input name="filename" type="text">
|
||||
<select name="method">
|
||||
<option value="tar">.tar.gz</option>
|
||||
<option value="plain-tar">.tar</option>
|
||||
<option value="xz-tar">.tar.xz</option>
|
||||
<option selected value="tar">.tar.gz</option>
|
||||
<option value="zstd-tar">.zstd</option>
|
||||
<option value="zip">.zip</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -180,7 +180,8 @@ else {
|
||||
print &ui_table_row(
|
||||
&ui_oneradio("amode", 0, $text{'edit_amode0'}, $amode == 0),
|
||||
&ui_select("folder", $folder ? &mailbox::folder_name($folder) : "",
|
||||
[ (map { [ &mailbox::folder_name($_), $_->{'name'} ] }
|
||||
[ (map { [ &mailbox::folder_name($_),
|
||||
&html_escape($_->{'name'}) ] }
|
||||
@folders),
|
||||
[ "", $text{'edit_file'} ] ],
|
||||
1, 0, 0, 0,
|
||||
@@ -276,7 +277,8 @@ else {
|
||||
&ui_select("applyfrom",
|
||||
$inbox ? &mailbox::folder_name($inbox) : "",
|
||||
[ map { [ &mailbox::folder_name($_),
|
||||
$_->{'name'} ] } @folders ]) ]);
|
||||
&html_escape($_->{'name'}) ] }
|
||||
@folders ]) ]);
|
||||
}
|
||||
if (($cmode == 4 || $cmode == 5 || $cmode == 6) && $amode == 0) {
|
||||
# Add button to apply the action to matching emails
|
||||
@@ -285,7 +287,8 @@ else {
|
||||
&ui_select("movefrom",
|
||||
$inbox ? &mailbox::folder_name($inbox) : "",
|
||||
[ map { [ &mailbox::folder_name($_),
|
||||
$_->{'name'} ] } @folders ]) ]);
|
||||
&html_escape($_->{'name'}) ] }
|
||||
@folders ]) ]);
|
||||
}
|
||||
}
|
||||
print &ui_form_end(\@buts);
|
||||
|
||||
@@ -49,6 +49,10 @@ if (&no_user_procmailrc()) {
|
||||
}
|
||||
|
||||
@filters = &list_filters();
|
||||
foreach my $filter (@filters) {
|
||||
$filter->{'action'} = &html_escape($filter->{'action'})
|
||||
if ($filter->{'action'});
|
||||
}
|
||||
@links = ( );
|
||||
if (@filters) {
|
||||
push(@links, &select_all_link("d"), &select_invert_link("d"));
|
||||
@@ -96,12 +100,12 @@ if (@filters || &get_global_spamassassin()) {
|
||||
$folder = &file_to_folder($spamfile, \@folders, 0, 1);
|
||||
$id = &mailbox::folder_name($folder);
|
||||
if ($folder->{'fake'}) {
|
||||
$sflink = "<u>$folder->{'name'}</u>";
|
||||
$sflink = "<u>".&html_escape($folder->{'name'})."</u>";
|
||||
}
|
||||
else {
|
||||
$sflink =
|
||||
"<a href='../mailbox/index.cgi?id=$id'>".
|
||||
"$folder->{'name'}</a>";
|
||||
&ui_link("../mailbox/index.cgi?id=$id",
|
||||
&html_escape($folder->{'name'}));
|
||||
}
|
||||
print &ui_columns_row(
|
||||
[ "", $text{'index_cspam'},
|
||||
@@ -116,7 +120,7 @@ if (@filters || &get_global_spamassassin()) {
|
||||
# Work out nice condition and action descriptions
|
||||
local $cond;
|
||||
($cond, $lastalways) = &describe_condition($f);
|
||||
$cond = &ui_link("edit.cgi?idx=$f->{'index'}",$cond);
|
||||
$cond = &ui_link("edit.cgi?idx=$f->{'index'}", $cond);
|
||||
local $action = &describe_action($f, \@folders);
|
||||
|
||||
# Create mover links
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
line0=Configurable global options,11
|
||||
perpage=Number of rules to display per page,3,50
|
||||
perpage=Number of rules to display per page,3,Default (50)
|
||||
view_condition=Display condition in rules list?,1,1-Yes,0-No
|
||||
view_comment=Display comment in rules list?,1,1-Yes,0-No
|
||||
comment_mod=Store comments as,1,0-# comments in save file,1---comment option
|
||||
|
||||
@@ -225,25 +225,17 @@ else {
|
||||
print &ui_hidden("table", $in{'table'});
|
||||
print &ui_hidden("chain", $c);
|
||||
|
||||
if (@rules > $config{'perpage'}) {
|
||||
my $pp = $config{'perpage'};
|
||||
if (@rules > $pp) {
|
||||
# Need to show arrows
|
||||
print "<center>\n";
|
||||
$s = int($in{'start'});
|
||||
$e = $in{'start'} + $config{'perpage'} - 1;
|
||||
$e = $in{'start'} + $pp - 1;
|
||||
$e = @rules-1 if ($e >= @rules);
|
||||
if ($s) {
|
||||
print &ui_link("?start=".
|
||||
($s - $config{'perpage'}),
|
||||
"<img src=/images/left.gif border=0 align=middle>");
|
||||
}
|
||||
print "<font size=+1>",&text('index_position', $s+1, $e+1,
|
||||
scalar(@rules)),"</font>\n";
|
||||
if ($e < @rules-1) {
|
||||
print &ui_link("?start=".
|
||||
($s + $config{'perpage'}),
|
||||
"<img src=/images/right.gif border=0 align=middle>");
|
||||
}
|
||||
print "</center>\n";
|
||||
print &ui_page_flipper(
|
||||
&text('index_position', $s+1, $e+1, scalar(@rules)),
|
||||
undef, undef,
|
||||
$s ? "?start=".($s - $pp) : "",
|
||||
$e < @rules-1 ? "?start=".($s + $pp) : "");
|
||||
}
|
||||
else {
|
||||
# Can show them all
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
index_title=Linux IPTables Firewall
|
||||
index_title_v=IPv4 Firewall
|
||||
index_title_v6=IPv6 Firewall
|
||||
index_position=Showing rules $1 to $2 of $3
|
||||
index_editing=rules file $1
|
||||
index_ecommand=The command $1 was not found on your system. Webmin needs this command to configure IPtables.
|
||||
index_ekernel=An error occured when checking your current IPtables configuration : $1 This may indicate that your kernel does not support IPtables.
|
||||
|
||||
0
firewalld/edit_manual.cgi
Normal file → Executable file
0
firewalld/edit_manual.cgi
Normal file → Executable file
@@ -501,18 +501,7 @@ return $? ? $out : undef;
|
||||
sub get_config_files
|
||||
{
|
||||
my $conf_dir = $config{'config_dir'} || '/etc/firewalld';
|
||||
my @conf_files;
|
||||
my @dirpath = ($conf_dir);
|
||||
eval "use File::Find;";
|
||||
if (!$@) {
|
||||
find(sub {
|
||||
my $file = $File::Find::name;
|
||||
push(@conf_files, $file)
|
||||
if (-f $file && $file =~ /\.(conf|xml)$/);
|
||||
}, @dirpath);
|
||||
}
|
||||
push(@conf_files, "$conf_dir/direct.xml");
|
||||
return @conf_files;
|
||||
return (glob("$conf_dir/*.xml"), glob("$conf_dir/*/*.xml"));
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
0
firewalld/save_manual.cgi
Normal file → Executable file
0
firewalld/save_manual.cgi
Normal file → Executable file
@@ -96,6 +96,7 @@ if ($current_lang_info->{'rtl'} || $current_lang eq "ar") {
|
||||
# Page header
|
||||
print "<html>\n";
|
||||
print "<head>\n";
|
||||
print &ui_switch_theme_javascript();
|
||||
print "<title>$title</title>\n";
|
||||
my $imgdir = "@{[&get_webprefix()]}/images";
|
||||
my $prod = 'webmin';
|
||||
|
||||
@@ -84,7 +84,7 @@ if (@has > 1) {
|
||||
}
|
||||
print "</div>";
|
||||
}
|
||||
|
||||
print &ui_switch_theme_javascript();
|
||||
print "<div class='wrapper leftmenu'>\n";
|
||||
print "<table id='main' width='100%'><tbody><tr><td>\n";
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -22,6 +22,23 @@ our $ui_formcount;
|
||||
$main::WRAPPER_OPEN = 0;
|
||||
$main::COLUMNS_WRAPPER_OPEN = 0;
|
||||
|
||||
sub theme_ui_print_header
|
||||
{
|
||||
my ($text, @args) = @_;
|
||||
&header(@args);
|
||||
print <<EOL;
|
||||
<script>
|
||||
(function () {
|
||||
const body = document.querySelector('body');
|
||||
try {
|
||||
body && body.classList.add('$module_name');
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
EOL
|
||||
print &ui_post_header($text);
|
||||
}
|
||||
|
||||
# theme_ui_post_header([subtext])
|
||||
# Returns HTML to appear directly after a standard header() call
|
||||
sub theme_ui_post_header
|
||||
|
||||
@@ -697,4 +697,16 @@ body > .mode > b[data-mode="server-manager"] > a > .ff-cloudmin {
|
||||
}
|
||||
.ql-compose-container .ql-snow .ql-tooltip {
|
||||
z-index: 99;
|
||||
}
|
||||
}
|
||||
|
||||
/* Shell module tweaks */
|
||||
.shell pre {
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
.shell input[name="cmd"] {
|
||||
max-width: 64.5vw;
|
||||
}
|
||||
.shell select[name="pcmd"] {
|
||||
max-width: 65vw;
|
||||
}
|
||||
|
||||
@@ -277,24 +277,51 @@ my $html_editor_init_script =
|
||||
theme: 'snow'
|
||||
});
|
||||
|
||||
// Google Mail editor like keybind for quoting
|
||||
// Google Mail like key bind for creating numbered list (Ctrl+Shift+7)
|
||||
editor.keyboard.addBinding({
|
||||
key: '9',
|
||||
shiftKey: true,
|
||||
ctrlKey: !isMac,
|
||||
metaKey: isMac,
|
||||
format: ['blockquote'],
|
||||
key: '7',
|
||||
shiftKey: true,
|
||||
ctrlKey: !isMac,
|
||||
metaKey: isMac,
|
||||
}, function(range, context) {
|
||||
this.quill.format('blockquote', false);
|
||||
const currentFormat = this.quill.getFormat(range.index);
|
||||
if (currentFormat.list === 'ordered') {
|
||||
this.quill.format('list', false);
|
||||
} else {
|
||||
this.quill.format('list', 'ordered');
|
||||
}
|
||||
});
|
||||
|
||||
// Google Mail like key bind for creating bullet list (Ctrl+Shift+8)
|
||||
editor.keyboard.addBinding({
|
||||
key: '9',
|
||||
shiftKey: true,
|
||||
ctrlKey: !isMac,
|
||||
metaKey: isMac,
|
||||
key: '8',
|
||||
shiftKey: true,
|
||||
ctrlKey: !isMac,
|
||||
metaKey: isMac,
|
||||
}, function(range, context) {
|
||||
this.quill.format('blockquote', true);
|
||||
const currentFormat = this.quill.getFormat(range.index);
|
||||
if (currentFormat.list === 'bullet') {
|
||||
this.quill.format('list', false);
|
||||
} else {
|
||||
this.quill.format('list', 'bullet');
|
||||
}
|
||||
});
|
||||
|
||||
// Google Mail like key bind for creating blockquote (Ctrl+Shift+9)
|
||||
editor.keyboard.addBinding({
|
||||
key: '9',
|
||||
shiftKey: true,
|
||||
ctrlKey: !isMac,
|
||||
metaKey: isMac,
|
||||
}, function(range, context) {
|
||||
const currentFormat = this.quill.getFormat(range.index);
|
||||
if (currentFormat.blockquote) {
|
||||
this.quill.format('blockquote', false);
|
||||
} else {
|
||||
this.quill.format('blockquote', true);
|
||||
}
|
||||
});
|
||||
|
||||
editor.on('text-change', function() {
|
||||
// This should most probably go to onSubmit event
|
||||
targ.value = editor.root.innerHTML + "<br>";
|
||||
|
||||
@@ -2459,10 +2459,8 @@ my $systemd_local_conf = "/etc/systemd/system";
|
||||
my $systemd_unit_dir1 = "/usr/lib/systemd/system";
|
||||
my $systemd_unit_dir2 = "/lib/systemd/system";
|
||||
if ($name) {
|
||||
foreach my $p (
|
||||
$systemd_local_conf,
|
||||
$systemd_unit_dir1,
|
||||
$systemd_unit_dir2) {
|
||||
foreach my $p ($systemd_local_conf, $systemd_unit_dir1,
|
||||
$systemd_unit_dir2) {
|
||||
if (-r "$p/$name.service" ||
|
||||
-r "$p/$name" ||
|
||||
-r "$p/$name.target" ||
|
||||
|
||||
@@ -983,7 +983,7 @@ elsif ($mode == 3) {
|
||||
{ 'headers' => [ [ 'Content-type', 'application/zip' ],
|
||||
[ 'Content-Transfer-Encoding', 'base64' ] ],
|
||||
'data' => $data } ] };
|
||||
$main::errors_must_die = 1;
|
||||
$main::error_must_die = 1;
|
||||
if (&foreign_check("mailboxes")) {
|
||||
&foreign_require("mailboxes", "mailboxes-lib.pl");
|
||||
eval { &mailboxes::send_mail($mail); };
|
||||
|
||||
@@ -111,7 +111,7 @@ elsif ($mode == 3) {
|
||||
'data' => $body },
|
||||
{ 'headers' => [ [ 'Content-type', 'text/plain' ] ],
|
||||
'data' => $data } ] };
|
||||
$main::errors_must_die = 1;
|
||||
$main::error_must_die = 1;
|
||||
if (&foreign_check("mailboxes")) {
|
||||
&foreign_require("mailboxes", "mailboxes-lib.pl");
|
||||
eval { &mailboxes::send_mail($mail); };
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
line2=System configuration,11
|
||||
krb5_conf=Path to kerberos5 configuration file,0
|
||||
|
||||
2
lang/en
2
lang/en
@@ -392,4 +392,6 @@ file_truncated_message_tail=fetched ending $1 of data, truncated $2 out of $3
|
||||
|
||||
defcert_error=Default $1 bundled SSL certificate is being used. It is highly advised to update default <tt>$2</tt> certificate before proceeding with login.
|
||||
|
||||
main_error_details=Error details
|
||||
|
||||
__norefs=1
|
||||
|
||||
@@ -2987,6 +2987,17 @@ if ($file =~ s/^(<|>>|>|\|)//) {
|
||||
$mode = $1;
|
||||
}
|
||||
my $rv = open($fh, $mode, $file);
|
||||
if ((!$mode || $mode eq "<") && $rv) {
|
||||
# Is it compressed? If so, switch to reading via gzip
|
||||
my $two;
|
||||
read($fh, $two, 2);
|
||||
seek($fh, 0, 0);
|
||||
if ($two eq "\037\213") {
|
||||
# Gzipped .. need to read-open
|
||||
close($fh);
|
||||
open($fh, "gunzip -c ".quotemeta($file)." |");
|
||||
}
|
||||
}
|
||||
if ($switched) {
|
||||
# Now that it is open, switch back to root
|
||||
$) = 0;
|
||||
@@ -2995,6 +3006,44 @@ if ($switched) {
|
||||
return $rv;
|
||||
}
|
||||
|
||||
# is_gzipped_file(file)
|
||||
# Returns 1 if a file is gzip compressed
|
||||
sub is_gzipped_file
|
||||
{
|
||||
my ($file) = @_;
|
||||
my $fh;
|
||||
my $rv = open($fh, "<", $file);
|
||||
return 0 if (!$rv);
|
||||
my $two;
|
||||
read($fh, $two, 2);
|
||||
close($fh);
|
||||
return $two eq "\037\213" ? 1 : 0;
|
||||
}
|
||||
|
||||
# gunzip_mail_file(file)
|
||||
# Uncompress a mail file in place
|
||||
sub gunzip_mail_file
|
||||
{
|
||||
my ($file) = @_;
|
||||
my $switched = &switch_to_mail_user();
|
||||
my $outfile = $file.".$$.uncompressed";
|
||||
my @st = stat($file);
|
||||
my $ex = system("gunzip -c ".quotemeta($file)."> ".quotemeta($outfile)." 2>/dev/null");
|
||||
if ($ex) {
|
||||
unlink($outfile);
|
||||
}
|
||||
else {
|
||||
rename($outfile, $file);
|
||||
&set_ownership_permissions($st[4], $st[5], $st[2], $file);
|
||||
utime($st[8], $st[9], $file);
|
||||
}
|
||||
if ($switched) {
|
||||
$) = 0;
|
||||
$> = 0;
|
||||
}
|
||||
return !$ex;
|
||||
}
|
||||
|
||||
# create_as_mail_user(fh, file)
|
||||
# Creates a new file, but ensures that it does not yet exist first, and then
|
||||
# sets the ownership to the mail user
|
||||
|
||||
@@ -944,7 +944,7 @@ local ($fields, $andmode, $folder, $limit, $headersonly) = @_;
|
||||
# an index, build a sort index and use that for
|
||||
# the search, if it is simple enough (Subject, From and To only)
|
||||
local @idxfields = grep { $_->[0] eq 'from' || $_->[0] eq 'to' ||
|
||||
$_->[0] eq 'subject' } @{$_[0]};
|
||||
$_->[0] eq 'subject' } @$fields;
|
||||
if ($folder->{'type'} != 4 &&
|
||||
$folder->{'type'} != 5 &&
|
||||
$folder->{'type'} != 6 &&
|
||||
@@ -1048,6 +1048,11 @@ elsif ($folder->{'type'} == 4) {
|
||||
$f->[0] eq "all" ? "body" : $f->[0];
|
||||
local $neg = ($field =~ s/^\!//);
|
||||
local $what = $f->[1];
|
||||
if ($f->[2]) {
|
||||
$what =~ s/^\^//;
|
||||
$what =~ s/\$$//;
|
||||
$what =~ s/\.\*//g;
|
||||
}
|
||||
if ($field ne "size") {
|
||||
$what = "\"".$what."\""
|
||||
}
|
||||
@@ -1538,6 +1543,33 @@ if ($src->{'sortable'}) {
|
||||
}
|
||||
}
|
||||
|
||||
# mailbox_uncompress_folder(&folder)
|
||||
# If a folder or it's files are gzipped, uncompress them in place
|
||||
sub mailbox_uncompress_folder
|
||||
{
|
||||
my ($folder) = @_;
|
||||
if ($folder->{'type'} == 1 || $folder->{'type'} == 3) {
|
||||
my @files = $folder->{'type'} == 1 ?
|
||||
&get_maildir_files($folder->{'file'}) :
|
||||
&get_mhdir_files($folder->{'file'});
|
||||
if ($folder->{'type'} == 1) {
|
||||
foreach my $sf (glob("$folder->{'file'}/.??*")) {
|
||||
push(@files, &get_maildir_files($sf));
|
||||
}
|
||||
}
|
||||
foreach my $f (@files) {
|
||||
if (&is_gzipped_file($f)) {
|
||||
&gunzip_mail_file($f);
|
||||
}
|
||||
}
|
||||
}
|
||||
elsif ($folder->{'type'} == 0) {
|
||||
if (&is_gzipped_file($folder->{'file'})) {
|
||||
&gunzip_mail_file($folder->{'file'});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# mailbox_copy_mail(&source, &dest, mail, ...)
|
||||
# Copy mail from one folder to another
|
||||
sub mailbox_copy_mail
|
||||
@@ -3361,7 +3393,10 @@ local $dmail = {
|
||||
[ 'Content-Transfer-Encoding' => '7bit' ] ],
|
||||
'data' => $dsn }
|
||||
] };
|
||||
eval { local $main::errors_must_die = 1; &send_mail($dmail); };
|
||||
eval {
|
||||
local $main::error_must_die = 1;
|
||||
&send_mail($dmail);
|
||||
};
|
||||
return $to;
|
||||
}
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Ontbrekende of ongeldige aantal boodskappe om te soek
|
||||
search_withstatus=, met status $1
|
||||
|
||||
folder_inbox=posbus
|
||||
folder_sent=Gestuurde pos
|
||||
folder_sent=Gestuur
|
||||
folder_drafts=Drafts
|
||||
folder_trash=asblik
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=عدد الرسائل المفقودة أو غير الصحيحة
|
||||
search_withstatus=, with status $1
|
||||
|
||||
folder_inbox=صندوق الوارد
|
||||
folder_sent=البريد المرسل
|
||||
folder_sent=مرسل
|
||||
folder_drafts=المسودات
|
||||
folder_trash=قمامة، يدمر، يهدم
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Адсутнічае альбо недапушчальная ко
|
||||
search_withstatus=, са статусам $1
|
||||
|
||||
folder_inbox=Уваходныя
|
||||
folder_sent=Даслана пошта
|
||||
folder_sent=Адпраўлена
|
||||
folder_drafts=Чарнавікі
|
||||
folder_trash=Хлам
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Липсващ или невалиден брой съобщен
|
||||
search_withstatus=, със статус $1
|
||||
|
||||
folder_inbox=Входящи
|
||||
folder_sent=Изпратена поща
|
||||
folder_sent=Изпратено
|
||||
folder_drafts=дама
|
||||
folder_trash=боклук
|
||||
|
||||
|
||||
@@ -319,7 +319,6 @@ search_elatest=Hi falta el nombre de missatges a buscar o bé és invàlid
|
||||
search_withstatus=, amb estat $1
|
||||
|
||||
folder_inbox=Entrada
|
||||
folder_sent=Enviat
|
||||
folder_drafts=Drafts
|
||||
folder_trash=Trash
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
index_return=llista d'usuaris
|
||||
|
||||
folder_sent=Enviat
|
||||
|
||||
editor_heading=Encapçalament
|
||||
editor_paragraph=Paràgraf
|
||||
editor_fontfamily_default=Per defecte
|
||||
|
||||
@@ -295,7 +295,6 @@ search_elatest=Chybějící nebo nevhodný počet zpráv k prohledání
|
||||
search_withstatus=, se stavem $1
|
||||
|
||||
folder_inbox=Doručená pošta
|
||||
folder_sent=Odesláné pošta
|
||||
folder_drafts=Koncepty
|
||||
folder_trash=Koš
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@ reply_html1=Vytvořte HTML
|
||||
search_msg6=Výsledky hledání $1 v poli $2
|
||||
search_attach=Musí mít přílohy?
|
||||
|
||||
folder_sent=Odesláno
|
||||
|
||||
left_mail=Pošta
|
||||
left_search=Vyhledávání:
|
||||
left_folders=Správa složek
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Manglende eller ugyldigt antal meddelelser til søgning
|
||||
search_withstatus=, med status $1
|
||||
|
||||
folder_inbox=Indbakke
|
||||
folder_sent=Sendt post
|
||||
folder_sent=Sendt
|
||||
folder_drafts=Kladder
|
||||
folder_trash=Affald
|
||||
|
||||
|
||||
@@ -319,7 +319,6 @@ search_elatest=Fehlende oder ungültige Anzahl an Mails für die Suche
|
||||
search_withstatus=, mit Status $1
|
||||
|
||||
folder_inbox=Posteingang
|
||||
folder_sent=Versendete Mail
|
||||
folder_drafts=Entwürfe
|
||||
folder_trash=Papierkorb
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
index_return=Benutzerliste
|
||||
|
||||
folder_sent=Gesendet
|
||||
|
||||
editor_heading=Überschrift
|
||||
editor_paragraph=Absatz
|
||||
editor_fontfamily_default=Standard
|
||||
|
||||
@@ -268,7 +268,6 @@ search_elatest=Λείπει ή είναι άκυρος ο αριθμός των
|
||||
search_withstatus=, με κατάσταση $1
|
||||
|
||||
folder_inbox=Εισερχόμενα
|
||||
folder_sent=Απεσταλμένα
|
||||
folder_drafts=Πρόχειρα
|
||||
folder_trash=Απορρίματα
|
||||
|
||||
|
||||
@@ -60,6 +60,8 @@ confirm_warnallf=Είστε βέβαιοι ότι θέλετε να διαγρά
|
||||
search_msg6=Αποτελέσματα αναζήτησης για $1 στο πεδίο $2
|
||||
search_attach=Πρέπει να έχετε συνημμένα;
|
||||
|
||||
folder_sent=Απεσταλμένα
|
||||
|
||||
sform_header=Προηγμένες επιλογές αναζήτησης ηλεκτρονικού ταχυδρομείου
|
||||
sform_andmode=Λειτουργία κριτηρίων
|
||||
sform_folder2=Αναζήτηση σε φάκελο (-ες)
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Missing or invalid number of messages to search
|
||||
search_withstatus=, with status $1
|
||||
|
||||
folder_inbox=Inbox
|
||||
folder_sent=Sent mail
|
||||
folder_sent=Sent
|
||||
folder_drafts=Drafts
|
||||
folder_trash=Trash
|
||||
|
||||
|
||||
@@ -238,7 +238,7 @@ search_elatest=Número de mensajes faltantes o no válidos para buscar
|
||||
search_withstatus=, con estado $1
|
||||
|
||||
folder_inbox=Bandeja de entrada
|
||||
folder_sent=Correo enviado
|
||||
folder_sent=Enviado
|
||||
folder_drafts=Borradores
|
||||
folder_trash=Basura
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Bilatu beharreko mezu kopuru falta edo baliogabea
|
||||
search_withstatus=, egoera $1 egoerarekin
|
||||
|
||||
folder_inbox=Sarrerako ontzia
|
||||
folder_sent=Bidalitako mezuak
|
||||
folder_sent=Bidali
|
||||
folder_drafts=Turkiarrak
|
||||
folder_trash=Trash
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=تعداد پیام های نامعتبر یا نامعتبر ا
|
||||
search_withstatus=, with status $1
|
||||
|
||||
folder_inbox=صندوق ورودی
|
||||
folder_sent=نامه ارسال شده
|
||||
folder_sent=ارسال شد
|
||||
folder_drafts=پیش نویس
|
||||
folder_trash=زباله ها
|
||||
|
||||
|
||||
@@ -205,7 +205,6 @@ search_nolatest=Kaikki kansiossa
|
||||
search_latestnum=Vain viimeisimmät
|
||||
search_elatest=Puuttuva tai virheellinen määrä etsittäviä viestejä
|
||||
|
||||
folder_sent=Lähetetyt
|
||||
folder_drafts=Luonnokset
|
||||
folder_trash=Roskakori
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ search_onestatus=Vain tila
|
||||
search_withstatus=, tila $1
|
||||
|
||||
folder_inbox=Saapuneet
|
||||
folder_sent=Lähetetty
|
||||
|
||||
detach_err=Tiedoston irrottaminen epäonnistui
|
||||
detach_edir=Ei tiedostoa tai hakemistoa tallennettavaksi syötettyyn
|
||||
|
||||
@@ -320,7 +320,6 @@ search_elatest=nombre de messages à rechercher manquant ou invalide
|
||||
search_withstatus=, avec statut $1
|
||||
|
||||
folder_inbox=Boite de Réception
|
||||
folder_sent=Courriers Envoyés
|
||||
folder_drafts=Brouillons
|
||||
folder_trash=Corbeille
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
folder_sent=Envoyé
|
||||
|
||||
editor_heading=Titre
|
||||
editor_paragraph=Paragraphe
|
||||
editor_fontfamily_default=Défaut
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=מספר הודעות חסר או לא חוקי לחיפוש
|
||||
search_withstatus=, with status $1
|
||||
|
||||
folder_inbox=תיבת הדואר הנכנס
|
||||
folder_sent=שלח מייל
|
||||
folder_sent=נשלח
|
||||
folder_drafts=טיוטות
|
||||
folder_trash=זבל
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Nedostaje ili nevažeći broj poruka za pretraživanje
|
||||
search_withstatus=, sa statusom $1
|
||||
|
||||
folder_inbox=Ulazni spremnik
|
||||
folder_sent=Poslana pošta
|
||||
folder_sent=Poslano
|
||||
folder_drafts=nacrti
|
||||
folder_trash=Otpad
|
||||
|
||||
|
||||
@@ -147,7 +147,6 @@ search_attach=Szeretne csatolmányokat?
|
||||
search_allstatus=Minden
|
||||
|
||||
folder_inbox=Bejövő levelek
|
||||
folder_sent=Elküldött levelek
|
||||
folder_drafts=Piszkozatok
|
||||
folder_trash=Kuka
|
||||
|
||||
|
||||
@@ -181,6 +181,8 @@ search_latestnum=Csak a legújabb
|
||||
search_elatest=Hiányzik vagy érvénytelen a keresett üzenetek száma
|
||||
search_withstatus=, állapotával $1
|
||||
|
||||
folder_sent=Küldött
|
||||
|
||||
detach_err=A fájl leválasztása nem sikerült
|
||||
detach_edir=Nincs fájl vagy könyvtár, amelyet menteni kellene a megadott fájlba
|
||||
detach_eopen=A $1 megnyitása nem sikerült : $2
|
||||
|
||||
@@ -316,7 +316,6 @@ search_elatest=Numero di messaggi da cercare mancante o non valido
|
||||
search_withstatus=, con stato $1
|
||||
|
||||
folder_inbox=Posta in arrivo
|
||||
folder_sent=Posta inviata
|
||||
folder_drafts=Bozze
|
||||
folder_trash=Cestino
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ view_nobody=Questo messaggio non ha contenuti del corpo.
|
||||
|
||||
search_msg6=Risultati della ricerca per $1 nel campo $2
|
||||
|
||||
folder_sent=Inviato
|
||||
|
||||
left_mail=posta
|
||||
left_search=Ricerca:
|
||||
left_folders=Gestisci cartelle
|
||||
|
||||
@@ -295,7 +295,6 @@ search_elatest=Missing or invalid number of messages to search
|
||||
search_withstatus=, with status $1
|
||||
|
||||
folder_inbox=Inbox
|
||||
folder_sent=Sent mail
|
||||
folder_drafts=Drafts
|
||||
folder_trash=Trash
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@ reply_html1=HTMLを作成
|
||||
search_msg6=$2フィールドの$1の検索結果
|
||||
search_attach=添付ファイルが必要ですか?
|
||||
|
||||
folder_sent=送信済み
|
||||
|
||||
left_mail=郵便物
|
||||
left_search=探す:
|
||||
left_folders=フォルダーを管理する
|
||||
|
||||
@@ -285,7 +285,6 @@ search_elatest=검색 메시지수가 지정되지 않았거나 유효하지 않
|
||||
search_withstatus=, 상태 $1로
|
||||
|
||||
folder_inbox=인박스
|
||||
folder_sent=메일 보내기
|
||||
folder_drafts=초안
|
||||
folder_trash=휴지통
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@ search_ewhat=입력 된 행과 일치하는 텍스트가 없습니다 $1
|
||||
search_msg6=$2 필드에서 $1에 대한 검색 결과
|
||||
search_attach=첨부 파일이 있어야합니까?
|
||||
|
||||
folder_sent=전송된
|
||||
|
||||
sform_andmode=기준 모드
|
||||
|
||||
left_mail=우편
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Trūksta arba netinkamas ieškomų pranešimų skaičius
|
||||
search_withstatus=, su būsena $1
|
||||
|
||||
folder_inbox=Pašto dėžutę
|
||||
folder_sent=Išsiųsti laiškai
|
||||
folder_sent=Išsiųsta
|
||||
folder_drafts=Juodraščiai
|
||||
folder_trash=Šiukšlių dėžė
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Trūkst vai nav derīgs meklējamo ziņojumu skaits
|
||||
search_withstatus=, ar statusu $1
|
||||
|
||||
folder_inbox=Iesūtne
|
||||
folder_sent=Nosūtītais pasts
|
||||
folder_sent=Nosūtīts
|
||||
folder_drafts=Melnraksti
|
||||
folder_trash=Atkritumi
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Bilangan mesej yang hilang atau tidak sah untuk dicari
|
||||
search_withstatus=, dengan status $1
|
||||
|
||||
folder_inbox=Peti masuk
|
||||
folder_sent=Menghantar surat
|
||||
folder_sent=Dihantar
|
||||
folder_drafts=Draf
|
||||
folder_trash=Sampah
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ search_elatest=Numru ta 'messaġġi nieqsa jew invalidi biex tfittex
|
||||
search_withstatus=, bi status $1
|
||||
|
||||
folder_inbox=Inbox
|
||||
folder_sent=Intbagħat il-posta
|
||||
folder_sent=Mibgħuta
|
||||
folder_drafts=Abbozzi
|
||||
folder_trash=Trash
|
||||
|
||||
|
||||
@@ -317,7 +317,6 @@ search_elatest=Ontbrekende of ongeldige aantal berichten om te zoeken
|
||||
search_withstatus=, met status $1
|
||||
|
||||
folder_inbox=Inbox
|
||||
folder_sent=Verstuur email
|
||||
folder_drafts=Ontwerpen
|
||||
folder_trash=Vuilnis
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user