Compare commits

...

53 Commits

Author SHA1 Message Date
Ilia Ross
a67e327627 Fix to dynamically list auth plugins in MySQL/MariaDB 2025-03-29 16:25:42 +02:00
Ilia Ross
99889c1f30 Fix to use prepared statement instead when getting account lock status 2025-03-29 16:00:30 +02:00
Ilia Ross
42b8f2c25c Add support for account locking in MariaDB 2025-03-29 15:53:37 +02:00
Ilia Ross
6905548fa4 Fix to correctly set the password with auth plugin
https://forum.virtualmin.com/t/maria-db-failed-to-save-user/132794/4
2025-03-29 15:19:34 +02:00
Jamie Cameron
4ae5ec1694 Fix links to edit pages with non-original zone types
https://github.com/webmin/webmin/issues/2443
2025-03-27 07:22:54 -07:00
Jamie Cameron
f3a841d2b9 Merge branch 'master' of github.com:webmin/webmin 2025-03-23 10:42:53 -07:00
Jamie Cameron
2aee714a81 Handle case where two interfaces are modified
https://github.com/webmin/webmin/issues/1546
2025-03-23 10:42:45 -07:00
Ilia Ross
16fec003dc Fix to use shell command with direct file writing for EOL data file 2025-03-23 15:44:36 +02:00
Ilia Ross
fdbf960a2c Fix to use dmesg -T for Linux systems #2442 2025-03-23 03:07:50 +02:00
Ilia Ross
e8b2b21bce Fix to stop rebuilding on release edit
[no-build]
2025-03-22 18:56:44 +02:00
Ilia Ross
1f07fdb274 Fix to prefer JSON::XS over JSON::PP if available for better performance 2025-03-21 16:55:32 +02:00
Ilia Ross
7b85a75a2b Fix not to add ? unless there is a query
[no-build]
2025-03-21 12:54:08 +02:00
Ilia Ross
2185f2068d Update pod
[no-build]
2025-03-21 12:53:05 +02:00
Jamie Cameron
e60be7133b Add support for template variables to help pages 2025-03-20 20:02:47 -07:00
Jamie Cameron
4021b6d8bb Merge branch 'master' of github.com:webmin/webmin 2025-03-20 15:08:23 -07:00
Jamie Cameron
5a777e9395 Dynamic updates may also be enabled globally
https://forum.virtualmin.com/t/virtualmin-dns-fails-to-detect-rndc-freeze-is-needed/132653
2025-03-20 14:55:54 -07:00
Ilia Ross
51e2ebec70 Merge pull request #2441 from MacSteini/master
Update de
2025-03-20 14:12:43 +02:00
MacSteini
afe100d9f0 Update de 2025-03-20 11:26:56 +00:00
Jamie Cameron
eca9472980 Merge pull request #2437 from webmin/dev/fix-dovecot-listen
Add support to configure listen for any type of address
2025-03-19 18:53:53 -07:00
Ilia Ross
62c02d1273 Add TOML as editable by default #2438 2025-03-20 03:23:33 +02:00
Ilia Ross
d74e7e66c5 Fix to simplify regex check 2025-03-19 13:31:37 +02:00
Jamie Cameron
7250c44648 We can use the -cgi binary as a fallback 2025-03-18 21:58:22 -07:00
Jamie Cameron
31c7e63407 Show the PHP binary and version 2025-03-18 21:56:30 -07:00
Ilia Ross
264ecae147 Fix regex to match more accurately 2025-03-19 02:15:55 +02:00
Ilia Ross
6dd8915808 Fix to simplify check 2025-03-19 02:13:25 +02:00
Ilia Ross
48602503cd Add support to configure listen for any type of address
https://github.com/webmin/webmin/issues/2436
2025-03-18 14:04:38 +02:00
Jamie Cameron
13acaeece7 Stop creating a changelog that is no longer used 2025-03-17 15:49:07 -07:00
Jamie Cameron
bb787e4e1c Merge branch 'master' of github.com:webmin/webmin 2025-03-17 15:15:41 -07:00
Jamie Cameron
d4fab15024 No need to switch users if we already switched 2025-03-17 15:15:36 -07:00
Joe Cooper
1cb53ff00a Merge pull request #2435 from swelljoe/fix-makemoduledeb
We don't have to build debs on Debian
2025-03-16 18:43:50 -05:00
Joe Cooper
8043aabf18 We don't have to build debs on Debian 2025-03-16 18:43:04 -05:00
Ilia Ross
3a94ea3788 Update translations 2025-03-15 21:52:41 +02:00
Jamie Cameron
2183088706 Merge branch 'master' of github.com:webmin/webmin 2025-03-15 09:59:08 -07:00
Jamie Cameron
3736f26a84 Handle case where --to-destination is followed by a bare IPv6 address
https://github.com/webmin/webmin/issues/2434
2025-03-15 09:58:46 -07:00
Ilia Ross
f2307ae1fa Fix to stop using MD5 module that was deprecated 2025-03-14 14:42:49 +02:00
Jamie Cameron
45ef8d11c1 Merge branch 'master' of github.com:webmin/webmin 2025-03-13 17:13:44 -07:00
Jamie Cameron
b17df99700 Check the UID that is used for file operations 2025-03-13 17:13:37 -07:00
Ilia Ross
a3f2e64315 Update date 2025-03-14 00:29:51 +02:00
Ilia Ross
853bde5e1a Update CHANGELOG.md 2025-03-14 00:24:23 +02:00
Ilia Ross
083f9b09a2 Ensure li tags are always closed 2025-03-14 00:10:12 +02:00
Jamie Cameron
81e8fc6c37 Merge branch 'master' of github.com:webmin/webmin 2025-03-12 21:39:35 -07:00
Jamie Cameron
b9d2910d60 Run the man command as nobody, to prevent misuse of the section param 2025-03-12 21:38:04 -07:00
Ilia Ross
574f66c251 Merge pull request #2433 from MacSteini/master
Update de
2025-03-12 18:24:45 +02:00
MacSteini
56a231e78d Update de 2025-03-12 11:44:43 +00:00
Ilia Ross
85e7f6c292 Fix to filter out scope identifier
* We could support it but it would be much more work
2025-03-10 13:32:39 +02:00
Ilia Ross
9fa35cc2c9 Fix to save IPv6 nameservers 2025-03-10 13:31:32 +02:00
Jamie Cameron
23cb74fa35 Add function to show warnings in records 2025-03-09 16:34:14 -07:00
Jamie Cameron
e1d87fac1c Some sendmail hash files end with .cdb
https://forum.virtualmin.com/t/issues-editing-sendmail-8-18-1-on-webmin-2-302/132460/7
2025-03-07 17:21:25 -08:00
Jamie Cameron
9ba9bfd524 Merge branch 'master' of github.com:webmin/webmin 2025-03-06 19:03:47 -08:00
Jamie Cameron
6c5c5fa225 No need for modprobe since IPv6 is always in the kernel these days
https://github.com/webmin/webmin/issues/2432
2025-03-06 18:51:14 -08:00
Ilia Ross
495a196b2f Fix type when adding addr 2025-03-06 14:22:49 +02:00
Jamie Cameron
50eb61b89e Use the ip command instead of ifconfig 2025-03-05 20:56:42 -08:00
Jamie Cameron
3cb358fe9e Preserve ordering in module.info files 2025-03-05 11:23:09 -08:00
67 changed files with 563 additions and 322 deletions

View File

@@ -7,7 +7,6 @@ on:
release:
types:
- published
- edited
jobs:
build:

View File

@@ -1,5 +1,13 @@
## Changelog
#### 2.303 (March 14, 2025)
* Fix permissions error when attempting to open a temp file for writing
* Fix Network Configuration module to use `ip` command instead of `ifconfig` on Debian systems
* Fix to correctly save IPv6 nameservers in Network Configuration module
* Fix to run `man` as `nobody` to prevent section param misuse in System Documentation module
* Add support for Sendmail hash files ending with `.cdb`
* Update German translations
#### 2.302 (March 3, 2025)
* Add ability to preserve allow/deny IPs in Webmin Configuration module #2427
* Add enhancements to module config saving to ensure reliability under all conditions

View File

@@ -2508,6 +2508,11 @@ if ($changed || !$znc{'version'} ||
# Yes .. need to rebuild
%znc = ( );
my $conf = &get_config();
my $gau;
my $opts = &find("options", $conf);
if ($opts && &find("update", $opts->{'members'})) {
$gau = 1;
}
my @views = &find("view", $conf);
my $n = 0;
foreach my $v (@views) {
@@ -2535,7 +2540,7 @@ if ($changed || !$znc{'version'} ||
$file ||= ""; # slaves and other types with no file
my $up = &find("update-policy", $z->{'members'});
my $au = &find("allow-update", $z->{'members'});
my $dynamic = $up || $au ? 1 : 0;
my $dynamic = $up || $au || $gau ? 1 : 0;
$znc{"zone_".($n++)} = join("\t", $z->{'value'},
$z->{'index'}, $type, "*", $dynamic, $file);
$files{$z->{'file'}}++;
@@ -3174,6 +3179,36 @@ my $out = &backquote_command(
return $? ? split(/\r?\n/, $out) : ( );
}
# check_zone_warnings(&zone-name|&zone)
# Returns a list of warnings from checking some zone file, if any
sub check_zone_warnings
{
my ($zone) = @_;
my ($zonename, $zonefile);
if ($zone->{'values'}) {
# Zone object
$zonename = $zone->{'values'}->[0];
my $f = &find("file", $zone->{'members'});
$zonefile = $f->{'values'}->[0];
}
else {
# Zone name object
$zonename = $zone->{'name'};
$zonefile = $zone->{'file'};
}
my $absfile = &make_chroot(&absolute_path($zonefile));
my $out = &backquote_command(
$config{'checkzone'}." ".quotemeta($zonename)." ".
quotemeta($absfile)." 2>&1 </dev/null");
my @rv;
foreach my $l (split(/\r?\n/, $out)) {
if ($l =~ /^\Q$absfile\E:\d+:\s*(.*)/) {
push(@rv, $1);
}
}
return @rv;
}
# supports_check_conf()
# Returns 1 if BIND configuration checking is supported, 0 if not
sub supports_check_conf

View File

@@ -20,12 +20,22 @@ my $desc = &ip6int_to_net(&arpa_to_ip($zone->{'name'}));
my $file = &make_chroot(&absolute_path($zone->{'file'}));
my @errs = &check_zone_records($zone);
my @warns = &check_zone_warnings($zone);
if (@errs) {
# Show list of errors
print "<b>",&text('check_errs', "<tt>$file</tt>"),"</b><p>\n";
print "<ul>\n";
foreach my $e (@errs) {
print "<li>".&html_escape($e)."\n";
print "<li>".&html_escape($e)."</li>\n";
}
print "</ul>\n";
}
elsif (@warns) {
# Just show warnings
print "<b>",&text('check_warns', "<tt>$file</tt>"),"</b><p>\n";
print "<ul>\n";
foreach my $e (@warns) {
print "<li>".&html_escape($e)."</li>\n";
}
print "</ul>\n";
}

View File

@@ -21,7 +21,7 @@ if (@errs) {
print "<b>",&text('ncheck_errs', "<tt>$file</tt>"),"</b><p>\n";
print "<ul>\n";
foreach my $e (@errs) {
print "<li>".&html_escape($e)."\n";
print "<li>".&html_escape($e)."</li>\n";
}
print "</ul>\n";
}

View File

@@ -26,6 +26,10 @@ foreach my $z (@zones) {
$v eq "." || !&can_edit_zone($z) ||
&arpa_to_ip($v) !~ /\Q$in{'search'}\E/i);
my $t = $z->{'type'};
next if (!$t);
$t = "delegation" if ($t eq "delegation-only");
$t = "master" if ($t eq "primary");
$t = "slave" if ($t eq "secondary");
if ($z->{'view'}) {
push(@zlinks, "edit_$t.cgi?zone=$z->{'name'}".
"&view=$z->{'viewindex'}");

View File

@@ -1173,6 +1173,7 @@ rmass_clash=إنشاء حتى لو كان السجل موجود بالفعل؟
check_title=تحقق السجلات
check_ecannot=غير مسموح لك بالتحقق من السجلات
check_errs=The following errors were found in the records file $1 ..
check_warns=تم العثور على التحذيرات التالية في ملف السجلات $1 ..
check_allok=No errors were found in the records file $1.
ncheck_title=تحقق BIND التكوين

View File

@@ -59,6 +59,8 @@ log_delete_recs2=Изтрити $1 записи в зона $2
massdelete_vwarn=Някои зони са свързани с домейна Virtualmin $1 и затова не трябва да се изтриват тук!
massdelete_vwarn2=Някои зони са свързани с домейна Virtualmin $1 и $2 други и затова не трябва да се изтриват тук!
check_warns=Следните предупреждения бяха намерени във файла със записи $1 ..
zonekey_algorithm=DNSSEC алгоритъм : $1
zonekey_ds_keytag=Ключов етикет
zonekey_ds_alg=Алгоритъм

View File

@@ -63,6 +63,8 @@ log_delete_recs2=S'han suprimit $1 registres a la zona $2
massdelete_vwarn=Algunes zones estan associades al domini Virtualmin $1, per tant, no hauríem de suprimir-les aquí.
massdelete_vwarn2=Algunes zones estan associades al domini Virtualmin $1 i $2, per tant, no hauríem de suprimir-les.
check_warns=S'han trobat els advertiments següents al fitxer de registres $1 ..
zonekey_algorithm=Algorisme DNSSEC : $1
zonekey_ds_keytag=Etiqueta clau
zonekey_ds_alg=Algorisme

View File

@@ -289,6 +289,7 @@ rmass_eclash2=.. záznam se stejným názvem a stejnou hodnotou $1 již existuje
check_title=Zkontrolujte záznamy
check_ecannot=Není dovoleno kontrolovat záznamy
check_errs=V souboru záznamů $1 byly nalezeny následující chyby.
check_warns=V souboru záznamů $1 byla nalezena následující varování ..
check_allok=V souboru záznamů $1 nebyly nalezeny žádné chyby.
ncheck_title=Zkontrolujte BIND Config

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Opret, selvom der allerede findes en post?
check_title=Tjek poster
check_ecannot=Du har ikke tilladelse til at kontrollere poster
check_errs=Følgende fejl blev fundet i posteringsfilen $1 ..
check_warns=Følgende advarsler blev fundet i postfilen $1 ..
check_allok=Der blev ikke fundet nogen fejl i postfilen $1.
ncheck_title=Kontroller BIND Config

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Erstellen, auch wenn Eintrag bereits existiert?
check_title=Einträge prüfen
check_ecannot=Sie sind nicht berechtigt, Einträge zu überprüfen.
check_errs=Die folgenden Fehler wurden in der Eintragsdatei $1 gefunden ..
check_warns=Die folgenden Warnungen wurden in der Eintragsdatei $1 gefunden ..
check_allok=Keine Fehler in der Eintragsdatei $1 gefunden.
ncheck_title=BIND-Konfiguration prüfen

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Δημιουργήστε ακόμα και αν υπάρχει ήδ
check_title=Ελέγξτε τις εγγραφές
check_ecannot=Δεν επιτρέπεται να ελέγχετε τα αρχεία
check_errs=Τα παρακάτω σφάλματα βρέθηκαν στο αρχείο εγγραφών $1 ..
check_warns=Οι ακόλουθες προειδοποιήσεις βρέθηκαν στο αρχείο εγγραφών $1 ..
check_allok=Δεν βρέθηκαν σφάλματα στο αρχείο εγγραφών $1.
ncheck_title=Ελέγξτε το BIND Config

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Create even if record already exists?
check_title=Check Records
check_ecannot=You are not allowed to check records
check_errs=The following errors were found in the records file $1 ..
check_warns=The following warnings were found in the records file $1 ..
check_allok=No errors were found in the records file $1.
ncheck_title=Check BIND Config

View File

@@ -489,6 +489,7 @@ rmass_clash=¿Crear incluso si el registro ya existe?
check_title=Verificar registros
check_ecannot=No tiene permiso para verificar registros
check_errs=Se encontraron los siguientes errores en el archivo de registros $1 ..
check_warns=Las siguientes advertencias se encontraron en el archivo de registros $1 ..
check_allok=No se encontraron errores en el archivo de registros $1.
ncheck_title=Verifique la configuración de BIND

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Sortu erregistroa dagoeneko badago?
check_title=Egiaztatu Erregistroak
check_ecannot=Ezin duzu erregistroak egiaztatu
check_errs=Ondorengo akatsak aurkitu dira $1 erregistroko fitxategian.
check_warns=Honako abisu hauek $1 erregistro fitxategian aurkitu dira ..
check_allok=Ez da akatsik aurkitu $1 erregistroko fitxategian.
ncheck_title=Begiratu BIND Config

View File

@@ -429,6 +429,7 @@ rmass_clash=حتی اگر سابقه قبلاً وجود داشته باشد ا
check_title=سوابق را بررسی کنید
check_ecannot=شما مجاز به بررسی سوابق نیستید
check_errs=The following errors were found in the records file $1 ..
check_warns=اخطارهای زیر در فایل سوابق $1 یافت شد ..
check_allok=No errors were found in the records file $1.
ncheck_title=پیکربندی BIND را بررسی کنید

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Luo vaikka tietue on jo olemassa?
check_title=Tarkista tietueet
check_ecannot=Et voi tarkistaa tietueita
check_errs=Seuraavat virheet löytyivät tietuetiedostosta $1 ..
check_warns=Tietuetiedostosta $1.. löytyi seuraavat varoitukset ..
check_allok=Tietuetiedostossa $1 ei löytynyt virheitä.
ncheck_title=Tarkista BIND-kokoonpano

View File

@@ -44,6 +44,8 @@ value_NAPTR3_P=Action spécifique au protocole
log_delete_recs2=$1 enregistrements supprimés dans la zone $2
check_warns=Les avertissements suivants ont été trouvés dans le fichier d'enregistrements $1 ..
zonekey_algorithm=Algorithme DNSSEC  : $1
zonekey_ds_keytag=Porte-clés
zonekey_ds_alg=Algorithme

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Kreirajte čak i ako zapis već postoji?
check_title=Provjerite zapise
check_ecannot=Nije vam dopušteno provjeravati zapise
check_errs=Sljedeće pogreške pronađene su u datoteci zapisa $1.
check_warns=Sljedeća upozorenja pronađena su u datoteci zapisa $1 ..
check_allok=U datoteci zapisa $1 nisu pronađene pogreške.
ncheck_title=Označite BIND Config

View File

@@ -167,6 +167,8 @@ massdelete_vwarn2=Egyes zónák a (z) $1 és a (z) $2 Virtualmin domainhez vanna
rmass_esign=.. kész, de az aláírás sikertelen : $1
check_warns=A következő figyelmeztetések találhatók a(z) $1.. rekordfájlban ..
dnssec_secs=másodperc
dnssectools_title=DNSSEC-Tools automatizálás

View File

@@ -562,6 +562,7 @@ rmass_clash=Crea anche se il record esiste già?
check_title=Controlla i record
check_ecannot=Non è consentito controllare i record
check_errs=I seguenti errori sono stati trovati nel file dei record $1 ..
check_warns=Sono stati trovati i seguenti avvisi nel file di record $1 ..
check_allok=Nessun errore trovato nel file dei record $1.
ncheck_title=Controlla la configurazione BIND

View File

@@ -221,6 +221,7 @@ rmass_name2=(ドメイン名に<tt>@</tt>を入力します)
rmass_esign=..完了しましたが、署名に失敗しました:$1
rmass_eclash2=..同じ名前と同じ値を持つレコード$1はすでに存在します。
check_warns=レコード ファイル $1 に次の警告が見つかりました。
ncheck_title=BIND Configを確認してください
ncheck_ecannot=BIND構成を確認することはできません
ncheck_errs=BIND構成ファイル$1または参照ゾーンファイルで次のエラーが見つかりました。

View File

@@ -747,6 +747,7 @@ rmass_clash=레코드가 이미 존재하더라도 작성 하시겠습니까?
check_title=기록 확인
check_ecannot=기록을 확인할 수 없습니다
check_errs=레코드 파일 $1에서 다음 오류가 발견되었습니다.
check_warns=다음 경고가 $1 레코드 파일에서 발견되었습니다 ..
check_allok=레코드 파일 $1에서 오류가 발견되지 않았습니다.
ncheck_title=BIND 구성 확인

View File

@@ -1171,6 +1171,7 @@ rmass_clash=Buat walaupun rekod sudah wujud?
check_title=Semak Rekod
check_ecannot=Anda tidak dibenarkan menyemak rekod
check_errs=Kesalahan berikut telah dijumpai dalam fail rekod $1 ..
check_warns=Amaran berikut ditemui dalam fail rekod $1 ..
check_allok=Tiada ralat ditemui dalam fail rekod $1.
ncheck_title=Semak BIND Config

View File

@@ -157,6 +157,8 @@ massdelete_vwarn2=Sommige zones zijn geassocieerd met het Virtualmin-domein $1 e
rmass_esign=.. klaar, maar ondertekenen mislukt : $1
check_warns=De volgende waarschuwingen zijn gevonden in het recordbestand $1 ..
dnssec_secs=seconden
zonekey_publicfile=Bestand met openbare sleutel : $1

View File

@@ -44,6 +44,8 @@ value_NAPTR3_P=Protokollspesifikk handling
log_delete_recs2=Slettet $1 poster i sone $2
check_warns=Følgende advarsler ble funnet i postfilen $1 ..
zonekey_algorithm=DNSSEC-algoritme : $1
zonekey_ds_keytag=Nøkkelbrikke
zonekey_ds_alg=Algoritme

View File

@@ -107,6 +107,8 @@ log_delete_recs2=Usunięto $1 rekordów w strefie $2
massdelete_vwarn=Niektóre strefy są powiązane z domeną Virtualmin $1, dlatego nie należy ich tutaj usuwać!
massdelete_vwarn2=Niektóre strefy są powiązane z domeną Virtualmin $1 i $2 innymi, dlatego nie należy ich tutaj usuwać!
check_warns=Znaleziono następujące ostrzeżenia w pliku rekordów $1 ..
dnssec_secs=sekundy
dt_zone_zskrolldesc=Wymuś najazd klucza podpisującego strefę

View File

@@ -839,6 +839,7 @@ rmass_clash=Criar mesmo se o registro já existir?
check_title=Verificar registros
check_ecannot=Você não tem permissão para verificar registros
check_errs=Os seguintes erros foram encontrados no arquivo de registros $1 ..
check_warns=Os seguintes avisos foram encontrados no arquivo de registros $1 ..
check_allok=Nenhum erro foi encontrado no arquivo de registros $1.
ncheck_title=Verifique a configuração do BIND

View File

@@ -197,6 +197,8 @@ rmass_name2=(Digite <tt>@</tt> para o nome do domínio)
rmass_esign=.. feito, mas a assinatura falhou : $1
rmass_eclash2=.. um registro com o mesmo nome e o mesmo valor $1 já existe.
check_warns=Os seguintes avisos foram encontrados no arquivo de registros $1 ..
dnssec_secs=segundos
dnssectools_title=Automação de Ferramentas DNSSEC

View File

@@ -589,6 +589,7 @@ rmass_clash=Создать, даже если запись уже существ
check_title=Проверьте записи
check_ecannot=Вам не разрешено проверять записи
check_errs=Следующие ошибки были обнаружены в файле записей $1 ..
check_warns=В файле записей $1 были обнаружены следующие предупреждения ..
check_allok=В файле записей $1 ошибок не обнаружено.
ncheck_title=Проверьте BIND Config

View File

@@ -1173,6 +1173,7 @@ rmass_clash=Vytvoriť, aj keď už záznam existuje?
check_title=Skontrolujte záznamy
check_ecannot=Nemáte oprávnenie kontrolovať záznamy
check_errs=V súbore záznamov $1 sa našli nasledujúce chyby.
check_warns=V súbore záznamov $1 sa našli nasledujúce upozornenia ..
check_allok=V súbore záznamov $1 sa nenašli žiadne chyby.
ncheck_title=Skontrolujte BIND Config

View File

@@ -314,6 +314,7 @@ rmass_clash=Skapa även om posten redan finns?
check_title=Kontrollera poster
check_ecannot=Du får inte kontrollera poster
check_errs=Följande fel hittades i registerfilen $1 ..
check_warns=Följande varningar hittades i postfilen $1 ..
check_allok=Inga fel hittades i registerfilen $1.
ncheck_title=Kontrollera BIND Config

View File

@@ -335,6 +335,7 @@ rmass_clash=Kayıt zaten mevcut olsa bile oluşturulsun mu?
check_title=Kayıtları Kontrol Et
check_ecannot=Kayıtları kontrol etme izniniz yok
check_errs=$1 kayıt dosyasında aşağıdaki hatalar bulundu.
check_warns=$1 kayıt dosyasında aşağıdaki uyarılar bulundu ..
check_allok=$1 kayıt dosyasında hata bulunamadı.
ncheck_title=BIND Config'i kontrol edin

View File

@@ -589,6 +589,7 @@ rmass_clash=Створити, навіть якщо запис уже існує
check_title=Перевірте записи
check_ecannot=Вам заборонено перевіряти записи
check_errs=У файлі записів $1 виявлено такі помилки.
check_warns=Наступні попередження знайдено у файлі записів $1 ..
check_allok=У файлі записів $1 не виявлено помилок.
ncheck_title=Перевірте налаштування BIND

View File

@@ -564,6 +564,7 @@ rmass_clash=即使记录已经存在也创建吗?
check_title=检查记录
check_ecannot=您无权检查记录
check_errs=在记录文件$1中发现以下错误。
check_warns=在记录文件 $1 中发现下列警告。
check_allok=在记录文件$1中未找到错误。
ncheck_title=检查BIND配置

View File

@@ -845,6 +845,7 @@ rmass_clash=即使記錄已經存在也創建嗎?
check_title=檢查記錄
check_ecannot=您無權檢查記錄
check_errs=在記錄文件$1中發現以下錯誤。
check_warns=在記錄文件 $1 中發現下列警告。
check_allok=在記錄文件$1中未找到錯誤。
ncheck_title=檢查BIND配置

View File

@@ -32,21 +32,27 @@ print &ui_table_row($text{'net_ssl_disable'},
[ @opts,
[ "", &getdef($sslopt, \@opts) ] ]));
@listens = &find("imap_listen", $conf, 2) ?
my @listens = &find("imap_listen", $conf, 2) ?
("imap_listen", "pop3_listen", "imaps_listen", "pop3s_listen") :
("listen", "ssl_listen");
("listen");
my $mode;
foreach $l (@listens) {
$listen = &find_value($l, $conf);
$mode = !$listen ? 0 :
$listen eq "[::]" ? 1 :
$listen eq "*" ? 2 : 3,
my $v = &find_value($l, $conf);
$mode = !$v ? 0 :
# All interfaces, put in any order, e.g. "[::], *" or "*, ::"
$v =~ /^\*,\s*(::|\[::\])$/ || $v =~ /^(::|\[::\]),\s*\*$/ ? 1 :
# IPv6 only, e.g. "[::]" or "::"
$v eq '::' || $v eq '[::]' ? 4 :
# IPv4 only, e.g. "*"
$v eq "*" ? 2 : 3,
print &ui_table_row($text{'net_'.$l},
&ui_radio($l."_mode", $mode,
[ [ 0, $text{'net_listen0'} ],
[ 1, $text{'net_listen1'} ],
[ 2, $text{'net_listen2'} ],
[ 4, $text{'net_listen4'} ],
[ 3, $text{'net_listen3'} ] ])."\n".
&ui_textbox($l, $mode == 3 ? $listen : "", 20), 3);
&ui_textbox($l, $mode == 3 ? $v : "", 40), 3);
}
print &ui_table_end();

View File

@@ -1,25 +1,25 @@
index_ecmd=Das Dovecot-Serverprogramm $1 wurde auf Ihrem System nicht gefunden. Möglicherweise ist es nicht installiert oder die <a href='$2'>Modulkonfiguration</a> ist falsch.
index_econf=Die Dovecot-Konfigurationsdatei $1 wurde auf Ihrem System nicht gefunden. Möglicherweise ist sie nicht installiert oder die <a href='$2'>Modulkonfiguration</a> ist falsch.
index_ecmd=Das Dovecot-Serverprogramm $1 wurde auf Ihrem System nicht gefunden. Möglicherweise ist es nicht installiert oder die <a href='$2'>Modulkonfiguration</a> ist fehlerhaft.
index_econf=Die Dovecot-Konfigurationsdatei $1 wurde auf Ihrem System nicht gefunden. Möglicherweise ist sie nicht installiert oder die <a href='$2'>Modulkonfiguration</a> ist fehlerhaft.
index_dovecot=Dovecot
index_stop=Dovecot-Server stoppen
index_stopdesc=Den laufenden Dovecot IMAP/POP3-Serverprozess herunterfahren. Dies verhindert, dass Benutzer ihre E-Mails herunterladen.
index_stopdesc=Beendet den laufenden Dovecot IMAP/POP3-Serverprozess. Dadurch wird verhindert, dass Benutzer:innen ihre E-Mails herunterladen können.
index_start=Dovecot-Server starten
index_startdesc=Den Dovecot IMAP/POP3-Serverprozess starten, damit Benutzer ihre E-Mails herunterladen können.
index_apply=Konfiguration anwenden
index_applydesc=Aktivieren Sie die aktuelle Dovecot-Konfiguration, indem Sie den Serverprozess stoppen und neu starten.
index_startdesc=Startet den Dovecot IMAP/POP3-Serverprozess, damit Benutzer:innen ihre E-Mails herunterladen können.
index_apply=Konfiguration übernehmen
index_applydesc=Aktiviert die aktuelle Dovecot-Konfiguration durch Stoppen und erneutes Starten des Serverprozesses.
index_boot=Beim Systemstart starten?
index_bootdesc=Ändern Sie diese Einstellung, um den Start des Dovecot-Servers beim Systemstart zu aktivieren oder zu deaktivieren.
index_return=Modulindex
index_version=Version $1
stop_err=Dovecot konnte nicht gestoppt werden
stop_erunning=Nicht mehr in Betrieb
stop_erunning=Nicht mehr aktiv
start_err=Dovecot konnte nicht gestartet werden
apply_err=Konfiguration konnte nicht angewendet werden
apply_err=Konfiguration konnte nicht übernommen werden
net_title=Netzwerk- und Protokolleinstellungen
net_header=Dovecot Netzwerk- und Mailprotokoll-Optionen
net_protocols=Zu bedienende Mail-Protokolle
net_title=Netzwerk und Protokolle
net_header=Netzwerk- und Mailprotokolloptionen für Dovecot
net_protocols=Bereitzustellende Mail-Protokolle
net_pop3=POP3
net_imap=IMAP
net_pop3s=POP3 (SSL)
@@ -29,136 +29,132 @@ net_ssl_disable=SSL-Verbindungen akzeptieren?
net_ssl_required=Nur SSL-Verbindungen akzeptieren
net_imap_listen=Schnittstellen für IMAP-Verbindungen
net_pop3_listen=Schnittstellen für POP3-Verbindungen
net_imaps_listen=Schnittstellen für IMAP SSL-Verbindungen
net_pop3s_listen=Schnittstellen für POP3 SSL-Verbindungen
net_listen=Schnittstellen für Nicht-SSL-Verbindungen
net_ssl_listen=Schnittstellen für SSL-Verbindungen
net_imaps_listen=Schnittstellen für IMAP-SSL-Verbindungen
net_pop3s_listen=Schnittstellen für POP3-SSL-Verbindungen
net_listen=Lauschen auf
net_listen0=Standard
net_listen1=Alle IPv4- und IPv6-Adressen
net_listen2=Alle IPv4-Adressen
net_listen4=Alle IPv6-Adressen
net_listen3=IP-Adresse
net_err=Netzwerkoptionen konnten nicht gespeichert werden
net_eimap_listen=Ungültige IP-Adresse für IMAP-Verbindungen
net_epop3_listen=Ungültige IP-Adresse für POP3-Verbindungen
net_eimaps_listen=Ungültige IP-Adresse für IMAP SSL-Verbindungen
net_epop3s_listen=Ungültige IP-Adresse für POP3 SSL-Verbindungen
net_elisten=Ungültige IP-Adresse für Nicht-SSL-Verbindungen
net_essl_listen=Ungültige IP-Adresse für SSL-Verbindungen
net_ealisten=Ungültige IP-Adresse für das Lauschen: <tt>$1</tt>
net_ealisten_invalid_mix=Eine einzelne IP-Adresse <tt>$1</tt> kann nicht zusammen mit dem Platzhalter <tt>$2</tt> verwendet werden. Geben Sie entweder einzelne IP-Adressen an oder verwenden Sie den Platzhalter, aber nicht beides.
imap_title=IMAP-Optionen
pop3_title=POP3-Optionen
ssl_title=SSL-Konfiguration
ssl_header=IMAP- und POP3-SSL-Modus-Optionen
ssl_key=SSL-Privatschlüsseldatei
ssl_cert=SSL-Zertifikatsdatei
ssl_ca=SSL-Client-CA-Zertifikatsdatei
ssl_header=SSL-Modus-Optionen für IMAP und POP3
ssl_key=Datei mit dem privaten SSL-Schlüssel
ssl_cert=SSL-Zertifikatdatei
ssl_ca=Zertifikatsdatei der SSL-Client-CA
ssl_pass=Passwort für Schlüsseldatei
ssl_prompt=Kein Passwort benötigt
ssl_regen=Intervall für SSL-Parameterregenerierung
ssl_prompt=Keines erforderlich
ssl_regen=Intervall für SSL-Parameterneuerstellung
ssl_hours=Stunden
ssl_none=Kein
ssl_plain=Nur Klartext-Authentifizierung im Nicht-SSL-Modus ablehnen?
ssl_plain=Klartextauthentifizierung im Nicht-SSL-Modus verbieten?
ssl_err=SSL-Konfiguration konnte nicht gespeichert werden
ssl_ekey=Fehlende oder nicht vorhandene Privatschlüsseldatei
ssl_ecert=Fehlende oder nicht vorhandene Zertifikatsdatei
ssl_eca=Fehlende oder nicht vorhandene Client-CA-Zertifikatsdatei
ssl_eregen=Fehlendes oder nicht-numerisches Parameter-Regenerierungsintervall
ssl_ekey=Fehlende oder nicht vorhandene Datei mit privatem Schlüssel
ssl_ecert=Fehlende oder nicht vorhandene Zertifikatdatei
ssl_eca=Fehlende oder nicht vorhandene Zertifikatsdatei der Client-CA
ssl_eregen=Fehlendes oder nicht-numerisches Intervall für Parameterneuerstellung
ssl_epass=Kein Passwort für die SSL-Schlüsseldatei eingegeben
misc_title=Sonstige Optionen
misc_title=Weitere Optionen
login_title=Benutzer- und Login-Optionen
login_header=Optionen für Benutzer-Authentifizierung und Login
login_fuid=Minimal gültige UID
login_luid=Maximal gültige UID
login_fgid=Minimal gültige Gruppen-ID
login_lgid=Maximal gültige Gruppen-ID
login_extra=Zusätzlich gewährte Sekundärgruppen
login_header=Benutzerauthentifizierung und Login-Einstellungen
login_fuid=Minimal zulässige UID
login_luid=Maximal zulässige UID
login_fgid=Minimal zulässige Gruppen-ID
login_lgid=Maximal zulässige Gruppen-ID
login_extra=Zusätzliche gewährte sekundäre Gruppen
login_none=Keine
login_chroot=Chroot-Verzeichnis für den Mail-Prozess
login_chroot=Chroot-Verzeichnis für Mail-Prozess
login_err=Benutzer- und Login-Optionen konnten nicht gespeichert werden
login_efuid=Fehlende oder ungültige numerische minimale UID
login_eluid=Fehlende oder ungültige numerische maximale UID
login_efgid=Fehlende oder ungültige numerische minimale Gruppen-ID
login_elgid=Fehlende oder ungültige numerische maximale Gruppen-ID
login_echroot=Fehlendes oder ungültiges Chroot-Verzeichnis
login_realms=SASL-Authentifizierungsdomänen
login_realm=Standard-Authentifizierungsdomäne
login_realms=SASL-Authentifizierungsbereiche
login_realm=Standard-Authentifizierungsbereich
login_mechs=Authentifizierungsmethoden
login_anonymous=Anonym
login_plain=Klartext
login_digest-md5=Digest-MD5
login_cram-md5=Cram-MD5
login_apop=APOP
login_otp=Einmaliges Passwort
login_otp=Einmalpasswort
login_skey=Sicherheitsschlüssel
login_oauthbearer=OAuth2-Token-Authentifizierung
login_xoauth2=Google OAuth2-Token-Authentifizierung
login_oauthbearer=OAuth2 Bearer-Authentifizierung
login_xoauth2=Google OAuth2 Bearer-Authentifizierung
login_external=Externe SASL-Authentifizierung
login_userdb=Datenquelle für Benutzer, Home-Verzeichnisse und IDs
login_userdb=Datenquelle für Benutzer:innen, Home-Verzeichnisse und IDs
login_passwd=Standard Unix-Benutzerdatenbank
login_passwdfile=Benutzerdefinierte Passwortdatei $1
login_static=Immer UID $1, GID $2 und Home-Verzeichnis $3 verwenden
login_vpopmail=VPOPMail-Bibliothek
login_ldap=LDAP, Konfigurationsdatei $1 verwenden
login_pgsql=PostgreSQL, Konfigurationsdatei $1 verwenden
login_sql=SQL-Datenbank, Konfigurationsdatei $1 verwenden
login_ldap=LDAP, Konfigurationsdatei $1
login_pgsql=PostgreSQL, Konfigurationsdatei $1
login_sql=SQL-Datenbank, Konfigurationsdatei $1
login_passdb=Passwort-Authentifizierungsquelle
login_passwd2=Unix <tt>passwd</tt>-Datei
login_shadow=Unix <tt>shadow</tt>-Datei
login_dpam=Standard PAM-Dienst (<tt>dovecot</tt>)
login_dpam=Standard-PAM-Dienst (<tt>dovecot</tt>)
login_pam=PAM-Dienst $1
login_session=PAM-Sitzungen öffnen und schließen
login_pam2=PAM-Dienst $1<br>&nbsp;&nbsp;$2<br>&nbsp;&nbsp;Verwenden Sie den Cache-Schlüssel $3
login_other=Andere Dovecot-Einstellung $1
login_pam2=PAM-Dienst $1<br>&nbsp;&nbsp;$2<br>&nbsp;&nbsp;Cache-Schlüssel $3 verwenden
login_other=Weitere Dovecot-Einstellung $1
login_epasswdfile=Fehlende oder nicht vorhandene benutzerdefinierte Passwortdatei
login_euid=Fehlende oder nicht numerische UID
login_egid=Fehlende oder nicht numerische GID
login_euid=Fehlende oder nicht-numerische UID
login_egid=Fehlende oder nicht-numerische GID
login_ehome=Fehlendes Home-Verzeichnis
login_eldap=Fehlende oder nicht vorhandene LDAP-Konfigurationsdatei
login_epgsql=Fehlende oder nicht vorhandene PostgreSQL-Konfigurationsdatei
login_esql=Fehlende oder nicht vorhandene SQL-Konfigurationsdatei
login_eppam=Fehlender oder ungültiger PAM-Dienst
login_bsdauth=BSD-Authentifizierung<br>&nbsp;&nbsp;Verwenden Sie den Cache-Schlüssel $1
login_bsdauth=BSD-Authentifizierung<br>&nbsp;&nbsp;Cache-Schlüssel $1 verwenden
login_checkpassword=Externes Programm $1
login_eckey=Fehlender oder ungültiger Cache-Schlüssel
login_echeckpassword=Fehlendes oder ungültiges externes Passwortprüfungsprogramm
login_procs=Maximale Login-Prozesse
login_count=Anfängliche Login-Prozesse
login_procs=Maximale Anzahl von Login-Prozessen
login_count=Initiale Login-Prozesse
login_eprocs=Fehlende oder ungültige maximale Anzahl von Login-Prozessen
login_ecount=Fehlende oder ungültige anfängliche Anzahl von Login-Prozessen
login_ecount=Fehlende oder ungültige initiale Anzahl von Login-Prozessen
mail_title=Mail-Dateien
mail_header=Mail-Speicherort und Leseoptionen
mail_env=Mail-Dateispeicherort
mail_header=Speicherort und Leseoptionen für E-Mails
mail_env=Speicherort der Mail-Dateien
mail_env0=Automatisch erkennen
mail_env1=Posteingang und Ordner in <tt>~/Maildir</tt>
mail_env2=Posteingang unter <tt>/var/mail</tt>, Ordner in <tt>~/mail</tt>
mail_env3=Posteingang in <tt>~/Maildir</tt>, Ordner in <tt>~/mail</tt>
mail_env4=Andere Dovecot-Position $1
mail_env4=Anderer Dovecot-Speicherort $1
mail_index=Speicherort der Index-Dateien
mail_index0=Standard (im Maildir-Verzeichnis)
mail_index1=Nur im Speicher
mail_index1=Nur im Arbeitsspeicher
mail_index2=Anderes Verzeichnis $1
mail_control=Speicherort der Steuerdateien
mail_check=Intervall zwischen Mail-Überprüfungen
mail_never=Niemals überprüfen
mail_check=Intervall für Mail-Prüfung
mail_never=Nie prüfen
mail_secs=Sekunden
mail_idle=Intervall zwischen Überprüfungen, wenn inaktiv
mail_idle=Intervall für Mail-Prüfung im Leerlauf
mail_full=Zugriff auf das gesamte Dateisystem erlauben?
mail_crlf=E-Mails mit CRLF-Zeilenenden speichern?
mail_change=Änderungen durch andere Programme verarbeiten?
mail_umask=Umask für neue Dateien
mail_err=Mail-Datei-Optionen konnten nicht gespeichert werden
mail_eenv=Fehlender oder ungültiger Mail-Speicherort
mail_echeck=Fehlende oder nicht-numerische Anzahl von Sekunden zwischen Überprüfungen
mail_eidle=Fehlende oder nicht-numerische Anzahl von Sekunden zwischen Überprüfungen im Leerlauf
mail_crlf=E-Mails mit CRLF-Zeilenumbrüchen speichern?
mail_change=Mail-Änderungen durch andere Programme berücksichtigen?
mail_umask=Umask-Berechtigungen für neue Dateien
mail_err=Mail-Dateioptionen konnten nicht gespeichert werden
mail_eenv=Fehlender oder ungültiger Speicherort für Mail-Dateien
mail_echeck=Fehlende oder nicht-numerische Anzahl von Sekunden zwischen Prüfungen
mail_eidle=Fehlende oder nicht-numerische Anzahl von Sekunden zwischen Prüfungen im Leerlauf
mail_eumask=Fehlende oder ungültige vierstellige oktale Umask
mail_uidl=UIDL-Format
mail_uidl_other=Andere..
mail_uidl_none=Nicht gesetzt (WARNUNG - Dovecot könnte nicht starten)
mail_uidl_other=Anderes..
mail_uidl_none=Nicht gesetzt (WARNUNG Dovecot startet eventuell nicht)
mail_uidl_dovecot=Altes Dovecot, neues Cyrus
mail_uidl_uw=UW ipop3d
mail_uidl_courier0=Courier Version 0
@@ -166,37 +162,37 @@ mail_uidl_courier1=Courier Version 1, altes Cyrus
mail_uidl_courier2=Courier Version 2
mail_uidl_tpop3d=tpop3d
mail_euidl=Fehlendes oder ungültiges UIDL-Format
mail_last=Verwendung des POP3 LAST-Befehls zulassen?
mail_lock=Methode zur Sperrung von Index-Dateien
mail_last=Verwendung des POP3-Befehls LAST erlauben?
mail_lock=Sperrmethode für Index-Dateien
mail_fcntl=fcntl-Funktion
mail_flock=flock-Funktion
mail_dotlock=.lock-Dateien
mail_lockf=lockf-Funktion
mail_mbox_read_locks=Sperrmethode für das Lesen von Mailboxen
mail_mbox_write_locks=Sperrmethode für das Schreiben von Mailboxen
mail_mbox_read_locks=Lesesperrmethode für Mailboxen
mail_mbox_write_locks=Schreibsperrmethode für Mailboxen
mail_none=Keine
mail_sel=Unten ausgewählt, in der Reihenfolge ..
mail_embox_read_locks=Keine Sperrmethode für das Lesen ausgewählt
mail_embox_write_locks=Keine Sperrmethode für das Schreiben ausgewählt
mail_eindexmode=Der Speicherort der Indexdateien kann nicht festgelegt werden, wenn der Mail-Speicherort automatisch erkannt wird
mail_econtrolmode=Der Speicherort der Steuerdateien kann nicht festgelegt werden, wenn der Mail-Speicherort automatisch erkannt wird
mail_sel=Unten ausgewählt, in Reihenfolge ..
mail_embox_read_locks=Keine Lesesperrmethode ausgewählt
mail_embox_write_locks=Keine Schreibsperrmethode ausgewählt
mail_eindexmode=Der Speicherort der Index-Dateien kann nicht gesetzt werden, wenn der Speicherort der Mail-Dateien automatisch erkannt wird
mail_econtrolmode=Der Speicherort der Steuerdateien kann nicht gesetzt werden, wenn der Speicherort der Mail-Dateien automatisch erkannt wird
mail_eindex=Fehlender oder ungültiger absoluter Pfad für Index-Dateien
mail_econtrol=Fehlender oder ungültiger absoluter Pfad für Steuerdateien
log_net=Netzwerk- und Protokolleinstellungen geändert
log_net=Netzwerk und Protokolle geändert
log_login=Benutzer- und Login-Optionen geändert
log_mail=Mail-Dateien geändert
log_ssl=SSL-Konfiguration geändert
log_apply=Konfiguration angewendet
log_apply=Konfiguration übernommen
log_start=Dovecot-Server gestartet
log_stop=Dovecot-Server gestoppt
log_bootup=Dovecot beim Systemstart aktiviert
log_bootdown=Dovecot beim Systemstart deaktiviert
log_manual=Konfigurationsdatei $1 manuell bearbeitet
log_manual=Konfigurationsdatei manuell bearbeitet: $1
manual_title=Konfigurationsdateien bearbeiten
manual_editsel=Dovecot-Konfigurationsdatei bearbeiten
manual_err=Konfigurationsdatei konnte nicht gespeichert werden
manual_edata=Nichts eingegeben!
manual_efile=Ausgewählte Konfigurationsdatei ist nicht gültig
manual_edata=Keine Eingabe erfolgt!
manual_efile=Ausgewählte Konfigurationsdatei ist ungültig
manual_ok=Bearbeiten

View File

@@ -31,19 +31,15 @@ net_imap_listen=Interfaces for IMAP connections
net_pop3_listen=Interfaces for POP3 connections
net_imaps_listen=Interfaces for IMAP SSL connections
net_pop3s_listen=Interfaces for POP3 SSL connections
net_listen=Interfaces for non-SSL connections
net_ssl_listen=Interfaces for SSL connections
net_listen=Listen on
net_listen0=Default
net_listen1=All IPv4 and IPv6
net_listen2=All IPv4
net_listen4=All IPv6
net_listen3=IP address
net_err=Failed to save networking options
net_eimap_listen=Invalid IP address for IMAP connections
net_epop3_listen=Invalid IP address for POP3 connections
net_eimaps_listen=Invalid IP address for IMAP SSL connections
net_epop3s_listen=Invalid IP address for POP3 SSL connections
net_elisten=Invalid IP address for non-SSL connections
net_essl_listen=Invalid IP address for SSL connections
net_ealisten=Invalid IP address to listen on : <tt>$1</tt>
net_ealisten_invalid_mix=Cannot use an individual IP address <tt>$1</tt> together with the <tt>$2</tt> wildcard. Specify either specific IP addresses or use the wildcard, not both
imap_title=IMAP Options

View File

@@ -12,20 +12,50 @@ $sslopt = &find("ssl_disable", $conf, 2) ? "ssl_disable" : "ssl";
&save_directive($conf, $sslopt, $in{$sslopt} eq '' ? undef : $in{$sslopt});
@listens = &find("imap_listen", $conf, 2) ?
("imap_listen", "pop3_listen", "imaps_listen", "pop3s_listen") :
("listen", "ssl_listen");
("listen");
foreach $l (@listens) {
if ($in{$l."_mode"} == 0) {
$listen = undef;
}
elsif ($in{$l."_mode"} == 1) {
$listen = "[::]";
$listen = "*, ::";
}
elsif ($in{$l."_mode"} == 2) {
$listen = "*";
}
elsif ($in{$l."_mode"} == 4) {
$listen = "::";
}
elsif ($in{$l."_mode"} == 3) {
&check_ipaddress($in{$l}) || &error($text{'net_e'.$l});
$listen = $in{$l};
# Check each IP address
my @ips_list = split(/[\s,]+/, $in{$l});
my @ips_valid;
my $has_ip4_wildcard = grep { $_ eq "*" } @ips_list;
my $has_ip6_wildcard = grep { /^(\[::\]|::)$/ } @ips_list;
foreach my $ip (@ips_list) {
# Check for wildcards
if ($ip =~ /^(\*|::|\[::\])$/) {
push(@ips_valid, $ip);
next;
}
# Validate IP address
my $is_ipv4 = &check_ipaddress($ip);
my $is_ipv6 = &check_ip6address($ip);
if (!$is_ipv4 && !$is_ipv6) {
&error(&text("net_ealisten", $ip));
}
# Add IP address to list
push(@ips_valid, $ip);
# Validate against wildcards
&error(&text("net_ealisten_invalid_mix", $ip, "*"))
if ($has_ip4_wildcard && &check_ipaddress($ip));
&error(&text("net_ealisten_invalid_mix", $ip, "::"))
if ($has_ip6_wildcard && &check_ip6address($ip));
}
$listen = join(", ", @ips_valid) if (@ips_valid);
}
&save_directive($conf, $l, $listen);
}

View File

@@ -1,3 +1,3 @@
allowed_paths=$HOME
work_as_root=1
allowed_for_edit=application-x-php application-x-ruby application-xml application-xslt+xml application-javascript application-x-shellscript application-x-perl application-x-yaml application-json application-x-x509-ca-cert application-pkix-cert application-x-sql application-x-asp application-x-aspx application-xhtml+xml
allowed_for_edit=application-x-php application-x-ruby application-xml application-xslt+xml application-javascript application-x-shellscript application-x-perl application-x-yaml application-x-toml application-json application-x-x509-ca-cert application-pkix-cert application-x-sql application-x-asp application-x-aspx application-xhtml+xml

View File

@@ -141,6 +141,12 @@ if (($table->{'name'} eq 'nat' && $rule->{'chain'} ne 'POSTROUTING') &&
$dpfrom = $2;
$dpto = $4;
}
elsif (&check_ipvx_ipaddress($rule->{'to-destination'}->[1])) {
$dipfrom = $rule->{'to-destination'}->[1];
$dipto = "";
$dpfrom = "";
$dpto = "";
}
}
print &ui_table_row($text{'edit_dnat'},
&ui_radio("dnatdef", $dipfrom eq "" ? 1 : 0,

View File

@@ -39,7 +39,7 @@ else {
"icmp6-addr-unreachable", "icmp6-port-unreachable",
"echo-reply", "tcp-reset" );
$ipvx_todestpattern='^\[([0-9A-Fa-f:]+)](\-([0-9A-Fa-f:]+))?(:(\d+)(\-(\d+))?)?$';
$ipvx_todestpattern='^\[([0-9A-Fa-f:]+)\](\-([0-9A-Fa-f:]+))?(:(\d+)(\-(\d+))?)?$';
# set IP Version
&set_ipvx_version('ipv6');

View File

@@ -10,24 +10,41 @@ use WebminCore;
$ENV{'PATH_INFO'} !~ /[\\\&\;\`\'\"\|\*\?\~\<\>\^\(\)\[\]\{\}\$\n\r]/ ||
&error($text{'help_epath'});
$ENV{'PATH_INFO'} =~ /^\/(\S+)\/(\S+)$/ || &error($text{'help_epath'});
$module = $1; $file = $2;
my $module = $1;
my $file = $2;
&ReadParse();
# if it ends with .gif assume it is a direct URL
if ($file =~ /\.(gif|jpg|jpeg|png)$/i) {
&redirect("$module/$file");
exit;
}
return;
}
# read the help file
$help = &read_help_file($module, $file);
my $help = &read_help_file($module, $file);
$help || &helperror(&text('help_efile3',
&html_escape($file), &html_escape($module)));
my %hash;
# Modify help file based on module
if (&foreign_exists($module) &&
&foreign_require($module) &&
&foreign_defined($module, 'help_pre_load')) {
$help = &foreign_call($module, "help_pre_load", $help);
&foreign_require($module)) {
if (&foreign_defined($module, 'help_pre_load')) {
$help = &foreign_call($module, "help_pre_load", $help);
}
if (&foreign_defined($module, 'help_template')) {
%hash = &foreign_call($module, "help_template");
}
}
# if any template variables were given as URL params, substitute them into the file
foreach my $k (keys %in) {
if ($k =~ /^tmpl_(\S+)$/i) {
$hash{$1} = $in{$k};
}
}
if (%hash) {
$help = &substitute_template($help, \%hash);
}
# find and replace the <header> section

View File

@@ -247,7 +247,6 @@ if (-d "/home/jcameron/webmin.com" && (!$release || $release == 1)) {
# this is a new full version, so round down to the previous full version
$lastvers = sprintf("%.2f0", $vers-0.006);
}
system("./showchangelog.pl --html $lastvers >/home/jcameron/webmin.com/changes-$vers.html");
}
if ($min && !$release) {
@@ -259,12 +258,13 @@ if ($min && !$release) {
# Fill an associative array with name=value pairs from a file
sub read_file
{
open(ARFILE, $_[0]) || return 0;
my ($file, $data_hash, $order) = @_;
open(ARFILE, $file) || return 0;
while(<ARFILE>) {
chop;
if (!/^#/ && /^([^=]+)=(.*)$/) {
$_[1]->{$1} = $2;
push(@{$_[2]}, $1);
$data_hash->{$1} = $2;
push(@$order, $1) if ($order);
}
}
close(ARFILE);
@@ -275,11 +275,20 @@ return 1;
# Write out the contents of an associative array as name=value lines
sub write_file
{
local($arr);
$arr = $_[1];
open(ARFILE, "> $_[0]");
foreach $k (keys %$arr) {
print ARFILE "$k=$$arr{$k}\n";
my ($file, $data_hash) = @_;
my (%old, @order);
&read_file($file, \%old, \@order);
open(ARFILE, ">$file");
my %done;
foreach my $k (@order) {
if (exists($data_hash->{$k}) && !$done{$k}++) {
print ARFILE $k,"=",$data_hash->{$k},"\n";
}
}
foreach $k (keys %$data_hash) {
if (!exists($old{$k}) && !$done{$k}++) {
print ARFILE $k,"=",$data_hash->{$k},"\n";
}
}
close(ARFILE);
}

View File

@@ -24,9 +24,6 @@ my $copyright_file = "$debian_dir/copyright";
my $changelog_file = "$debian_dir/changelog";
my $files_file = "$debian_dir/files";
-r "/etc/debian_version" ||
die RED, "makemoduledeb.pl must be run on Debian", RESET;
# Parse command-line args
my ($force_theme, $url, $upstream, $provides, $debdepends, $debrecommends,
$no_prefix, $force_usermin, $release, $allow_overwrite, $final_mod,

View File

@@ -33,7 +33,10 @@ SECT: foreach $sec (@sects) {
$cmd = $ocmd;
$cmd =~ s/PAGE/$qpage/;
$cmd =~ s/SECTION/$qsec/;
$out = &backquote_command("$cmd 2>&1", 1);
if ($< == 0) {
$cmd = &command_as_user("nobody", 0, $cmd);
}
$out = &backquote_command($cmd." 2>&1", 1);
if ($out !~ /^.*no manual entry/i && $out !~ /^.*no entry/i &&
$out !~ /^.*nothing appropriate/i) {
# Found it

View File

@@ -64,9 +64,14 @@ my $unixsocket = $plugin && $u->[$plugin] eq 'unix_socket';
my $nopass = ((!defined($epassfield1) || !$u->[$epassfield1]) &&
(!defined($epassfield2) || !$u->[$epassfield2]));
my $hashpass = $u->[$epassfield1] || $u->[$epassfield2];
my $lock_supported = exists($fieldmap{'account_locked'}) &&
defined($u->[$fieldmap{'account_locked'}]);
my $lock_supported = &get_account_lock_support();
# Old way for checking account locking
my $locked = $u->[$fieldmap{'account_locked'}] eq 'Y';
# New account locking check
if (!exists($fieldmap{'account_locked'}) ||
!defined($u->[$fieldmap{'account_locked'}])) {
$locked = &get_account_lock_status($u->[1], $u->[0]);
}
print &ui_table_row($text{'user_pass'},
&ui_radio("mysqlpass_mode", $in{'new'} ? 0 :
$lock_supported && $locked ? 4 :
@@ -84,12 +89,12 @@ if (!$in{'new'} && $hashpass) {
}
# Plugin for setting password
my @plugins = &list_authentication_plugins();
if (@plugins) {
my $plugins = &list_authentication_plugins();
if ($plugins) {
print &ui_table_row($text{'user_plugin'},
&ui_select("plugin", $plugin && $u->[$plugin],
[ [ '', $text{'default'} ],
@plugins ]));
@{$plugins} ]));
}
# Allowed host / network

View File

@@ -1730,23 +1730,72 @@ my $conf = &get_mysql_config();
return &unique(map { $_->{'file'} } @$conf);
}
# get_change_pass_sql(unescaped_plaintext_password, user, host)
# get_account_lock_status(user, host)
# Returns the account lock status of a user
sub get_account_lock_status
{
my ($user, $host) = @_;
my $rv = &execute_sql_safe($master_db, 'show create user ?@?', $user, $host);
return undef if (!ref($rv) || !@{$rv->{'data'}});
return $rv->{'data'}->[0][0] =~ /account\s+lock/i ? 1 : 0;
}
# get_account_lock_support()
# Returns 1 if the MySQL/MariaDB server supports account locking
sub get_account_lock_support
{
my ($ver, $variant) = &get_remote_mysql_variant();
return
$variant eq "mariadb" && &compare_version_numbers($ver, "10.4.2") >= 0 ||
$variant eq "mysql" && &compare_version_numbers($ver, "8.0") >= 0;
}
# get_plugin_sql(version, variant, plainpass, plugin)
# Get the right query for setting user password with plugin
sub get_plugin_sql
{
my ($ver, $variant, $plainpass, $plugin) = @_;
my $pass = &escapestr($plainpass);
# Has account locking support?
my $suplock = &get_account_lock_support();
my $lockcurr;
if ($suplock) {
$lockcurr = !defined($plainpass);
if ($lockcurr) {
$pass = sprintf("%x", rand 16) for 1..30;
}
}
my $is_plugin_socket = $plugin eq "unix_socket";
my $by = "";
$by = " by '$pass'" if (!$is_plugin_socket);
my $sp = "identified with $plugin$by";
if ($variant eq "mariadb") {
$by = " using $password_func('$pass')" if (!$is_plugin_socket);
$sp = "identified via $plugin$by";
}
if ($suplock) {
$sp = $lockcurr ? "account lock" : "$sp account unlock";
}
return $sp;
}
# get_change_pass_sql(unescaped_plaintext_password, user, host, plugin)
# Get the right query for changing user password
sub get_change_pass_sql
{
my ($unescaped_plainpass, $user, $host) = @_;
my $plugin = &get_mysql_plugin();
$plugin = $plugin ? "with $plugin" : "";
my $escaped_pass = &escapestr($unescaped_plainpass);
my ($unescaped_plainpass, $user, $host, $plugin) = @_;
$plugin ||= &get_mysql_plugin();
my $sql;
my ($ver, $variant) = &get_remote_mysql_variant();
my $mysql_mariadb_with_auth_string =
my $supauth =
$variant eq "mariadb" && &compare_version_numbers($ver, "10.2") >= 0 ||
$variant eq "mysql" && &compare_version_numbers($ver, "5.7.6") >= 0;
if ($mysql_mariadb_with_auth_string && $unescaped_plainpass) {
$sql = "alter user '$user'\@'$host' identified $plugin by '$escaped_pass'";
if ($plugin && $supauth) {
my $sp = &get_plugin_sql($ver, $variant, $unescaped_plainpass, $plugin);
$sql = "alter user '$user'\@'$host' $sp";
}
else {
my $escaped_pass = &escapestr($unescaped_plainpass);
$sql = "set password for '".$user."'\@'".$host."' = ".
"$password_func('$escaped_pass')";
}
@@ -1937,34 +1986,12 @@ else {
sub change_user_password
{
my ($plainpass, $user, $host, $plugin) = @_;
my ($ver, $variant) = &get_remote_mysql_variant();
$plugin ||= &get_mysql_plugin();
$plugin = $plugin ? "with $plugin" : "";
my $lock_supported = $variant eq "mysql" && &compare_version_numbers($ver, "8.0.19");
my $mysql_mariadb_with_auth_string =
$variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0 ||
$variant eq "mysql" && &compare_version_numbers($ver, "5.7.6") >= 0;
$plugin ||= "";
my $sql;
my $pass = &escapestr($plainpass);
$host ||= '%';
my $lock = !defined($plainpass);
if ($lock) {
$pass = sprintf("%x", rand 16) for 1..30;
}
if ($mysql_mariadb_with_auth_string) {
my $sp = "identified $plugin by '".$pass."'";
if ($lock_supported) {
$sp = $lock ? "account lock" : "$sp account unlock";
}
$sql = "alter user '$user'\@'$host' $sp";
&execute_sql_logged($master_db, $sql);
}
else {
$sql = &get_change_pass_sql($plainpass, $user, $host);
&execute_sql_logged($master_db, $sql);
}
$sql = &get_change_pass_sql($plainpass, $user, $host, $plugin);
&execute_sql_logged($master_db, $sql);
# Update module password when needed
&update_config_credentials({
@@ -2058,7 +2085,7 @@ if (!$pid || !kill(0, $pid)) {
}
# Update password by running command directly
my $cmd = $config{'mysql'} || 'mysql';
$cmd = $config{'mysql'} || 'mysql';
my $sql = &get_change_pass_sql($pass, $user, 'localhost');
my $out = &backquote_command("$cmd -D $master_db -e ".
quotemeta("flush privileges; $sql")." 2>&1 </dev/null");
@@ -2154,13 +2181,16 @@ return $rv->{'data'}->[0]->[0] =~ /unix_socket/i ? 'socket' : 'password';
}
# list_authentication_plugins()
# Returns a list of supported authentication plugins for setting passwords
# Returns a list ref of supported authentication plugins for setting passwords
sub list_authentication_plugins
{
my ($ver, $variant) = &get_remote_mysql_variant();
if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0 ||
$variant eq "mysql" && &compare_version_numbers($ver, "5.7.6") >= 0) {
return ('mysql_native_password', 'caching_sha2_password', 'unix_socket');
my $rv = &execute_sql($master_db, "show plugins");
my @plugins = map { $_->[0] } grep { $_->[1] eq 'ACTIVE' &&
$_->[2] eq 'AUTHENTICATION' } @{ $rv->{data} };
return @plugins ? \@plugins : ['mysql_native_password'];
}
return ();
}

View File

@@ -254,7 +254,12 @@ if(($cfg->{'vlan'} == 1) && ($gconfig{'os_version'} < 5)) {
}
}
if(($cfg->{'vlan'} == 1) && ($cfg->{'mtu'})) {
push(@options, ['pre-up', '/sbin/ifconfig '.$cfg->{'physical'}.' mtu '.$cfg->{'mtu'}]);
if (&has_command("ip")) {
push(@options, ['pre-up', 'ip link set mtu '.$cfg->{'mtu'}.' dev '.$cfg->{'physical'}]);
}
else {
push(@options, ['pre-up', '/sbin/ifconfig '.$cfg->{'physical'}.' mtu '.$cfg->{'mtu'}]);
}
}
# Find the existing interface section
@@ -328,9 +333,6 @@ else {
my @options6;
my @address6 = @{$cfg->{'address6'}};
my @netmask6 = @{$cfg->{'netmask6'}};
if (@address6 || $cfg->{'auto6'}) {
push(@options6, ['pre-up', '/sbin/modprobe -q ipv6 ; /bin/true']);
}
if (@address6) {
push(@options6, [ "address", shift(@address6) ]);
push(@options6, [ "netmask", shift(@netmask6) ]);
@@ -338,7 +340,12 @@ if (@address6) {
while(@address6) {
my $a = shift(@address6);
my $n = shift(@netmask6);
push(@options6, [ "up","ifconfig $cfg->{'fullname'} inet6 add $a/$n" ]);
if (&has_command("ip")) {
push(@options6, [ "up", "ip addr add $a/$n dev $cfg->{'fullname'}" ]);
}
else {
push(@options6, [ "up", "ifconfig $cfg->{'fullname'} inet6 add $a/$n" ]);
}
}
if ($cfg->{'gateway6'}) {
push(@options6, [ "gateway", $cfg->{'gateway6'} ]);

View File

@@ -271,8 +271,18 @@ else {
my $lref = &read_file_lines($old->{'file'});
splice(@$lref, $old->{'line'},
$old->{'eline'} - $old->{'line'} + 1, @lines);
my $diff = scalar(@lines) - ($old->{'eline'} - $old->{'line'} + 1);
$iface->{'line'} = $old->{'line'};
$iface->{'eline'} = $iface->{'line'} + scalar(@lines) - 1;
&flush_file_lines($old->{'file'});
&unlock_file($old->{'file'});
if ($diff) {
# May need to renumber other interface lines
foreach my $b (@$boot) {
$b->{'line'} += $diff if ($b->{'line'} > $iface->{'eline'});
$b->{'eline'} += $diff if ($b->{'eline'} > $iface->{'eline'});
}
}
}
else {
# Adding a new one (possibly to it's own file)
@@ -295,6 +305,8 @@ else {
splice(@$lref, $nline+1, 0, " ".$sect.":");
}
splice(@$lref, $eline+1, 0, @lines);
$iface->{'line'} = $eline + 1;
$iface->{'eline'} = $iface->{'line'} + scalar(@lines) - 1;
&flush_file_lines($iface->{'file'});
&unlock_file($iface->{'file'});
}
@@ -558,7 +570,7 @@ $sysctl{'net.ipv4.ip_forward'} = $in{'forward'};
&unlock_file($sysctl_config);
# Save static routes
my @boot = &boot_interfaces();
my @boot = &boot_interfaces();
foreach my $b (grep { $_->{'virtual'} eq '' } @boot) {
my @r;
if ($b->{'routes'}) {
@@ -627,7 +639,8 @@ return ( );
sub set_default_gateway
{
my ($gw, $dev) = @_;
foreach my $iface (&boot_interfaces()) {
my @boot = &boot_interfaces();
foreach my $iface (@boot) {
# What is this interface's current default and how is it set?
my $oldgw = $iface->{'gateway'};
my $oldr;
@@ -670,7 +683,7 @@ foreach my $iface (&boot_interfaces()) {
}
if ($save) {
&save_interface($iface);
&save_interface($iface, \@boot);
}
}
}
@@ -694,16 +707,17 @@ return ( );
sub set_default_ipv6_gateway
{
my ($gw, $dev) = @_;
foreach my $iface (&boot_interfaces()) {
my @boot = &boot_interfaces();
foreach my $iface (@boot) {
if ($iface->{'fullname'} eq $dev && $iface->{'gateway6'} ne $gw) {
# Need to add to this interface
$iface->{'gateway6'} = $gw;
&save_interface($iface);
&save_interface($iface, \@boot);
}
elsif ($iface->{'fullname'} ne $dev && $iface->{'gateway6'}) {
# Need to remove from this interface
delete($iface->{'gateway6'});
&save_interface($iface);
&save_interface($iface, \@boot);
}
}
}

View File

@@ -230,8 +230,10 @@ my $method6 = $iface->{'auto6'} ? "auto" :
# Update nameservers
my @ns = $iface->{'nameserver'} ? @{$iface->{'nameserver'}} : ();
&save_nm_config($cfg, "ipv4", "dns",
@ns ? join(" ", @ns) : undef);
my @ns4 = grep { &check_ipaddress($_) } @ns;
my @ns6 = grep { &check_ip6address($ns6) } @ns;
&save_nm_config($cfg, "ipv4", "dns", @ns4 ? join(" ", @ns4) : undef) if (@ns4);
&save_nm_config($cfg, "ipv6", "dns", @ns6 ? join(" ", @ns6) : undef) if (@ns6);
my @sr = $iface->{'search'} ? @{$iface->{'search'}} : ();
&save_nm_config($cfg, "ipv4", "dns-search",
@sr ? join(" ", @sr) : undef);

View File

@@ -21,9 +21,12 @@ for($i=0; defined($ns = $in{"nameserver_$i"}); $i++) {
$ns = $in{"nameserver_$i"};
$ns =~ s/^\s+//; $ns =~ s/\s+$//;
if ($ns) {
&check_ipaddress_any($ns) ||
my $nns = $ns;
# Just remove scope identifier (%interface) for simplicity
$nns =~ s/\%.*$//;
&check_ipaddress_any($nns) ||
&error(&text('dns_ens', &html_escape($ns)));
push(@{$dns->{'nameserver'}}, $ns);
push(@{$dns->{'nameserver'}}, $nns);
}
}
if ($in{'name0'}) {

View File

@@ -3,7 +3,7 @@ index_eaccess=Sie haben keinen Zugriff auf PHP-Konfigurationsdateien.
index_efiles=Keine der PHP-Konfigurationsdateien, auf die Sie Zugriff haben, existiert.
index_efiles2=Es wurden keine PHP-Konfigurationsdateien gefunden. Passen Sie die <a href='$1'>Modulkonfiguration</a> an, um den korrekten Pfad zur globalen PHP-Konfigurationsdatei festzulegen.
index_file=Konfigurationsdatei
index_desc=Zweck
index_desc=Verwendungszweck
index_actions=Aktionen
index_edit=Verwalten
index_manual=Manuell bearbeiten
@@ -11,143 +11,144 @@ index_anyfile=Andere PHP-Konfigurationsdatei bearbeiten
index_return=Konfigurationsdateien
file_global=Globale PHP-Konfiguration
file_eread=Fehler beim Lesen von $1: $2
file_eread=Lesen von $1 fehlgeschlagen: $2
manual_title=Konfiguration manuell bearbeiten
manual_desc=Diese Seite kann verwendet werden, um eine PHP-Konfigurationsdatei manuell zu bearbeiten. Dies sollte mit Vorsicht erfolgen, da keine Syntax- oder Gültigkeitsprüfung für Ihre Änderungen durchgeführt wird.
manual_err=Fehler beim Bearbeiten der Konfigurationsdatei
manual_edata=Kein neuer Inhalt eingegeben
manual_desc=Auf dieser Seite kann eine PHP-Konfigurationsdatei manuell bearbeitet werden. Dies sollte mit Vorsicht erfolgen, da keine Syntax- oder Gültigkeitsprüfung der Änderungen durchgeführt wird.
manual_err=Konfigurationsdatei konnte nicht bearbeitet werden
manual_edata=Keine neuen Inhalte eingegeben
list_title=PHP-Konfiguration verwalten
list_ecannot=Sie sind nicht berechtigt, diese PHP-Konfigurationsdatei zu verwalten.
list_efile=Die zu bearbeitende Datei muss ein absoluter Pfad sein.
list_ecannot=Sie dürfen diese PHP-Konfigurationsdatei nicht verwalten
list_efile=Pfad zur zu bearbeitenden Datei muss absolut sein
list_return=PHP-Konfiguration
list_format_ini=INI-Format
list_format_fpm=FPM-Format
list_bin=PHP-Version $2 unter $1
vars_title=PHP-Variablen
vars_header=Erstellung und Zitierung von PHP-Variablen
vars_magic=Alle Eingabevariablen zitieren?
vars_runtime=Daten zur Laufzeit zitieren?
vars_header=Erstellung und Maskierung von PHP-Variablen
vars_magic=Alle Eingabevariablen maskieren?
vars_runtime=Daten zur Laufzeit maskieren?
vars_register=Alle Eingaben in globale Variablen umwandeln?
vars_args=Kommandozeilenparameter in globale Variablen umwandeln?
vars_long=Alte Array-Formate wie <tt>HTTP_GET_VARS</tt> erstellen?
vars_err=Fehler beim Speichern der PHP-Variableneinstellungen
vars_long=Veraltete Array-Formate wie <tt>HTTP_GET_VARS</tt> erstellen?
vars_err=PHP-Variableinstellungen konnten nicht gespeichert werden
dirs_title=Verzeichniseinstellungen
dirs_header=Verzeichnis- und Erweiterungseinstellungen für PHP-Skripte
dirs_header=Verzeichnisoptionen für PHP-Skripte und -Erweiterungen
dirs_include=Suchverzeichnisse für Includes
dirs_below=Unten aufgeführt..
dirs_upload=Datei-Uploads zulassen?
dirs_below=Unten aufgelistet..
dirs_upload=Datei-Uploads erlauben?
dirs_utmp=Temporäres Verzeichnis für hochgeladene Dateien
dirs_err=Fehler beim Speichern der Verzeichniseinstellungen
dirs_err=Verzeichniseinstellungen konnten nicht gespeichert werden
dirs_eincs=Keine Include-Suchverzeichnisse eingegeben
dirs_eutmp=Fehlendes oder ungültiges temporäres Verzeichnis für Dateien
db_title=Datenbankeinstellungen
db_header1=MySQL-Datenbankverbindungs-Einstellungen
db_persist=Persistente Datenbankverbindungen zulassen?
db_maxpersist=Maximale Anzahl persistenter Verbindungen?
db_maxlinks=Maximale Anzahl gesamter Verbindungen?
db_timeout=Timeout für MySQL-Verbindungen?
db_host=Standard-Host des MySQL-Servers
db_port=Standard-Port des MySQL-Servers
db_header1=MySQL-Datenbankverbindungseinstellungen
db_persist=Persistente Datenbankverbindungen erlauben?
db_maxpersist=Maximale persistente Verbindungen?
db_maxlinks=Maximale Gesamtverbindungen?
db_timeout=MySQL-Verbindungs-Timeout?
db_host=Standard-MySQL-Serverhost
db_port=Standard-MySQL-Serverport
db_unlimited=Unbegrenzt
db_s=Sekunden
db_header2=PostgreSQL-Datenbankverbindungs-Einstellungen
db_header2=PostgreSQL-Datenbankverbindungseinstellungen
db_reset=Persistente Verbindungen automatisch wiederherstellen?
db_err=Fehler beim Speichern der Datenbankeinstellungen
db_err=Datenbankeinstellungen konnten nicht gespeichert werden
db_emaxpersist=Fehlende oder ungültige maximale Anzahl persistenter Verbindungen
db_emaxlinks=Fehlende oder ungültige maximale Anzahl gesamter Verbindungen
db_etimeout=Fehlendes oder ungültiges Verbindungstimeout
db_ehost=Fehlender oder ungültiger Standard-Host des MySQL-Servers
db_eport=Fehlender oder ungültiger Standard-Port des MySQL-Servers
db_emaxlinks=Fehlende oder ungültige maximale Gesamtverbindungen
db_etimeout=Fehlendes oder ungültiges Verbindungs-Timeout
db_ehost=Fehlender oder ungültiger Standard-MySQL-Serverhost
db_eport=Fehlender oder ungültiger Standard-MySQL-Serverport
session_title=Session-Optionen
session_header=Optionen für PHP-Sitzungsverfolgung
session_handler=Mechanismus zur Speicherung von Sitzungen
session_handler=Mechanismus zur Sitzungsspeicherung
session_files=Dateien
session_mm=Im Speicher
session_users=Benutzerdefiniert
session_redis=Redis
session_memcache=MemcacheD
session_path=Verzeichnis für Sitzungsdateien
session_cookies=Verwendung von Cookies zur Sitzungsverfolgung zulassen?
session_only_cookies=Immer Cookies zur Sitzungsverfolgung verwenden?
session_cookies=Verwendung von Cookies zur Sitzungserkennung erlauben?
session_only_cookies=Immer Cookies zur Sitzungserkennung verwenden?
session_life=Cookie-Lebensdauer
session_forever=Unbegrenzt
session_maxlife=Maximale Sitzungslebensdauer
session_maxlife=Maximale Sitzungsdauer
session_epath=Fehlendes oder ungültiges Verzeichnis für Sitzungsdateien
session_elife=Fehlende oder ungültige Cookie-Lebensdauer
session_emaxlife=Fehlende oder ungültige maximale Sitzungslebensdauer
session_emaxlife=Fehlende oder ungültige maximale Sitzungsdauer
limits_title=Ressourcenlimits
limits_title=Ressourcenbeschränkungen
limits_header=Optionen für Speicher- und Übertragungsgrenzen
limits_mem=Maximale Speicherzuweisung
limits_mem=Maximaler Speicherverbrauch
limits_post=Maximale HTTP-POST-Größe
limits_upload=Maximale Datei-Upload-Größe
limits_upload=Maximale Dateiupload-Größe
limits_exec=Maximale Ausführungszeit
limits_input=Maximale Eingabeparsing-Zeit
limits_vars=Maximale Anzahl an Eingabevariablen
limits_err=Fehler beim Speichern der Ressourcenlimits
limits_emem=Fehlende oder ungültige maximale Speicherzuweisung
limits_input=Maximale Zeit für Eingabeverarbeitung
limits_vars=Maximale Anzahl von Eingabevariablen
limits_err=Ressourcengrenzen konnten nicht gespeichert werden
limits_emem=Fehlender oder ungültiger maximaler Speicherverbrauch
limits_epost=Fehlende oder ungültige maximale HTTP-POST-Größe
limits_eupload=Fehlende oder ungültige maximale Datei-Upload-Größe
limits_eupload=Fehlende oder ungültige maximale Upload-Größe
limits_eexec=Fehlende oder ungültige maximale Ausführungszeit
limits_einput=Fehlende oder ungültige maximale Eingabeparsing-Zeit
limits_evars=Fehlende oder ungültige maximale Anzahl an Eingabevariablen
limits_einput=Fehlende oder ungültige maximale Zeit für Eingabeverarbeitung
limits_evars=Fehlende oder ungültige maximale Anzahl von Eingabevariablen
errors_title=Fehlerprotokollierung
errors_header=Anzeige- und Protokollierungsoptionen für Fehlermeldungen
errors_display=Fehlermeldungen anzeigen?
errors_log=Fehlermeldungen in das Protokoll schreiben?
errors_log=Fehlermeldungen protokollieren?
errors_bits=Anzuzeigende Fehlertypen
errors_reporting=Ausdruck für Fehlertypen
errors_E_ALL=Alle Fehler und Warnungen
errors_E_ERROR=Schwerwiegende Laufzeitfehler
errors_E_WARNING=Laufzeitwarnungen
errors_E_PARSE=Syntaxfehler zur Kompilierzeit
errors_E_NOTICE=Hinweise zur Laufzeit
errors_E_CORE_ERROR=Schwerwiegende Fehler während des Startvorgangs
errors_E_CORE_WARNING=Warnungen während des Startvorgangs
errors_E_COMPILE_ERROR=Schwerwiegende Fehler zur Kompilierzeit
errors_E_COMPILE_WARNING=Warnungen zur Kompilierzeit
errors_E_USER_ERROR=Vom Benutzer generierte Fehlermeldung
errors_E_USER_WARNING=Vom Benutzer generierte Warnmeldung
errors_E_USER_NOTICE=Vom Benutzer generierte Hinweisnachricht
errors_E_PARSE=Fehler beim Parsen zur Kompilierzeit
errors_E_NOTICE=Laufzeit-Hinweise
errors_E_CORE_ERROR=Schwerwiegende Fehler beim Start
errors_E_CORE_WARNING=Warnungen beim Start
errors_E_COMPILE_ERROR=Schwerwiegende Kompilierfehler
errors_E_COMPILE_WARNING=Kompilierzeit-Warnungen
errors_E_USER_ERROR=Benutzerdefinierte Fehlermeldung
errors_E_USER_WARNING=Benutzerdefinierte Warnung
errors_E_USER_NOTICE=Benutzerdefinierter Hinweis
errors_ignore=Wiederholte Fehler ignorieren?
errors_source=Quelle beim Prüfen auf Wiederholungen ignorieren?
errors_maxlen=Maximale Größe protokollierter Fehler
errors_file=Protokolldatei für Fehler
errors_source=Quelltext bei Wiederholung ignorieren?
errors_maxlen=Maximale Größe für protokollierte Fehler
errors_file=Fehlerprotokolldatei
errors_none=Keine
errors_syslog=Syslog
errors_other=Andere Datei $1
errors_unlimited=Unbegrenzt
errors_err=Fehler beim Speichern der Fehlerprotokollierung
errors_err=Fehlerprotokollierung konnte nicht gespeichert werden
errors_ereporting=Kein Ausdruck für Fehlertypen eingegeben
errors_emaxlen=Fehlende oder ungültige maximale Größe protokollierter Fehler
errors_efile=Fehlende Protokolldatei für Fehler
errors_emaxlen=Fehlende oder ungültige maximale Protokollgröße
errors_efile=Fehlende Fehlerprotokolldatei
misc_title=Weitere Einstellungen
misc_header=Verschiedene zusätzliche PHP-Einstellungen
misc_short=PHP-Skripte mit &lt;? zulassen?
misc_asp=Tags &lt;% %&gt; zulassen?
misc_header=Sonstige PHP-Einstellungen
misc_short=PHP-Skripte mit &lt;? erlauben?
misc_asp=&lt;% %&gt;-Tags erlauben?
misc_zlib=Ausgabe mit zlib komprimieren?
misc_flush=Ausgabe nach jedem Schreibvorgang leeren?
misc_fopen=Öffnen von URLs als Dateien zulassen?
misc_smtp=SMTP-Server für den E-Mail-Versand
misc_port=SMTP-Port auf dem Server
misc_fopen=Öffnen von URLs als Dateien erlauben?
misc_smtp=SMTP-Server zum Versenden von E-Mails
misc_port=SMTP-Port des Servers
misc_none=Keine
misc_sendmail=Pfad zum Befehl für den E-Mail-Versand
misc_err=Fehler beim Speichern weiterer Einstellungen
misc_sendmail=Pfad zum Befehl zum Versenden von E-Mails
misc_err=Weitere Einstellungen konnten nicht gespeichert werden
misc_esmtp=Fehlender oder nicht auflösbarer SMTP-Server
misc_esmtp_port=Fehlender oder nicht-numerischer SMTP-Port
misc_esendmail=Ungültiger Befehl für den E-Mail-Versand
misc_esendmail2=Fehlender Befehl für den E-Mail-Versand
misc_include=Öffnen von Remote-Includes zulassen?
misc_esendmail=Ungültiger Befehl zum Versenden von E-Mails
misc_esendmail2=Fehlender Befehl zum Versenden von E-Mails
misc_include=Öffnen von entfernten Includes erlauben?
misc_path=CGI Fix Path Info?
misc_timezone=PHP-Zeitzone
misc_charset=Standard-Zeichensatz
misc_charset=Standardzeichensatz
disable_title=Deaktivierte Funktionen
disable_header=Deaktivierte PHP-Funktionen und -Features
@@ -160,36 +161,36 @@ disable_proc_open=proc_open (Befehl ausführen und Ein-/Ausgabe erfassen)
disable_popen=popen (Pipe zu ausgeführtem Befehl öffnen)
disable_curl_exec=curl_exec (URL-Download-Sitzung ausführen)
disable_curl_multi_exec=curl_multi_exec (Mehrere URL-Download-Sitzungen ausführen)
disable_parse_ini_file=parse_ini_file (PHP-INI-Datei einlesen)
disable_show_source=show_source (Datei mit PHP-Syntaxhervorhebung ausgeben)
disable_parse_ini_file=parse_ini_file (PHP-INI-Datei lesen)
disable_show_source=show_source (Datei mit PHP-Syntaxhervorhebung anzeigen)
disable_mail=mail (E-Mail senden)
disable_leftover=Weitere Funktionen:
disable_err=Fehler beim Speichern deaktivierter Funktionen
disable_err=Deaktivierte Funktionen konnten nicht gespeichert werden
disable_classes=Deaktivierte integrierte Klassen
mods_title=PHP-Erweiterungen
mods_edir=PHP-Erweiterungsverzeichnis konnte nicht gefunden werden!
mods_ecannot=Sie sind nicht berechtigt, aktivierte PHP-Erweiterungen zu bearbeiten.
mods_desc=Auf dieser Seite können PHP-Version-$1-Erweiterungen systemweit für alle Benutzer:innen aktiviert oder deaktiviert werden.
mods_edir=Verzeichnis für PHP-Erweiterungen konnte nicht gefunden werden!
mods_ecannot=Sie dürfen aktivierte PHP-Erweiterungen nicht bearbeiten
mods_desc=Auf dieser Seite können global PHP-Erweiterungen für Version $1 für alle Benutzer:innen auf diesem System aktiviert oder deaktiviert werden.
mods_enabled=Aktiviert?
mods_name=Erweiterungsname
mods_file=Konfigurationsdatei
mods_pkg=Paket
mods_idesc=PHP-Erweiterungen, die auf diesem System noch nicht installiert sind, können aus den konfigurierten Softwarepaket-Repositories installiert werden.
mods_idesc=PHP-Erweiterungen, die auf diesem System noch nicht installiert sind, können aus den konfigurierten Software-Repositories installiert werden.
mods_newpkg=PHP-Erweiterung hinzufügen
mods_install=Jetzt installieren
mods_err=Fehler beim Speichern der PHP-Erweiterungen
mods_egetver=PHP-Version für Konfigurationsdatei $1 konnte nicht ermittelt werden.
mods_egetbin=PHP-Binärdatei für Konfigurationsdatei $1 konnte nicht ermittelt werden.
mods_err=PHP-Erweiterungen konnten nicht gespeichert werden
mods_egetver=PHP-Version für Konfigurationsdatei $1 konnte nicht ermittelt werden
mods_egetbin=PHP-Binary für Konfigurationsdatei $1 konnte nicht ermittelt werden
mods_return=PHP-Erweiterungen
imod_title=PHP-Modul installieren
imod_err=Fehler bei der Installation des PHP-Moduls
imod_emod=Kein PHP-Modul angegeben
imod_err=PHP-Modul konnte nicht installiert werden
imod_emod=Kein PHP-Modul eingegeben
imod_alldoing=PHP-Modul $1 für PHP-Version $2 wird installiert ..
imod_alreadygot=PHP-Modul $1 ist bereits installiert.
imod_alldone=.. das PHP-Modul wurde erfolgreich aus Paket $1 installiert und steht nun zur Nutzung bereit.
imod_allfailed=.. es konnten keine Softwarepakete für das angegebene PHP-Modul installiert werden, trotz $1 Versuchen.
imod_alreadygot=PHP-Modul $1 ist bereits installiert
imod_alldone=.. das PHP-Modul wurde erfolgreich aus Paket $1 installiert und steht nun zur Verfügung.
imod_allfailed=.. kein Softwarepaket für das angegebene PHP-Modul konnte installiert werden, trotz Versuch über $1
imod_missing=.. Installation abgeschlossen, aber das PHP-Modul wurde nicht erkannt.
log_manual=Datei $1 manuell bearbeitet
@@ -198,17 +199,17 @@ log_dirs=Verzeichniseinstellungen in $1 geändert
log_db=Datenbankeinstellungen in $1 geändert
log_session=Session-Optionen in $1 geändert
log_safe=Safe-Mode-Optionen in $1 geändert
log_limits=Ressourcenlimits in $1 geändert
log_limits=Ressourcengrenzen in $1 geändert
log_errors=Fehlerprotokollierung in $1 geändert
log_misc=Weitere Einstellungen in $1 geändert
log_mods=Aktivierte Module in $1 aktualisiert
log_imod=PHP-Modul $2 in $1 installiert
acl_global=Darf globale PHP-Konfiguration bearbeiten?
acl_anyfile=Darf beliebige Dateien als PHP-Konfiguration bearbeiten?
acl_manual=Darf Konfigurationsdateien manuell bearbeiten?
acl_inis=Zusätzliche Konfigurationsdateien<br>(Im Format <i>Dateiname</i>=<i>Beschreibung</i>)
acl_user=Darf Dateien als Benutzer:in lesen und schreiben
acl_global=Globale PHP-Konfiguration bearbeiten dürfen?
acl_anyfile=Beliebige Datei als PHP-Konfiguration bearbeiten dürfen?
acl_manual=Konfigurationsdateien manuell bearbeiten dürfen?
acl_inis=Zusätzliche Konfigurationsdateien<br>(im Format <i>Dateiname</i>=<i>Beschreibung</i>)
acl_user=Dateien im Kontext von Benutzer:innen lesen und schreiben
opt_default=Standardwert: <tt>$1</tt>
opt_default_unknown=Unbekannt

View File

@@ -24,6 +24,7 @@ list_efile=File to edit must be an absolute path
list_return=PHP configuration
list_format_ini=INI format
list_format_fpm=FPM format
list_bin=PHP version $2 at $1
vars_title=PHP Variables
vars_header=PHP variable creation and quoting options

View File

@@ -13,7 +13,13 @@ if (@files == 1 && !$access{'anyfile'} && $access{'noconfig'}) {
}
$inidir = &get_php_ini_dir($in{'file'});
&ui_print_header("<tt>".&html_escape($in{'file'})."</tt>",
my $bin = &get_php_ini_binary($in{'file'});
my $ver = &get_php_binary_version($in{'file'});
my $vmsg = "";
if ($bin && $ver) {
$vmsg = "<br>".&text('list_bin', "<tt>$bin</tt>", $ver);
}
&ui_print_header("<tt>".&html_escape($in{'file'})."</tt>".$vmsg,
$text{'list_title'}, "", undef, 0, $onefile);
@pages = ( "vars", "dirs", "db", "session", "limits",

View File

@@ -342,7 +342,8 @@ if (&foreign_check("virtual-server")) {
# RHEL and derivatives Debian/Ubuntu
if ($file =~ /php(\d+)/ || $file =~ /php\/([\d\.]+)/) {
$ver = $1;
my $binary = &has_command("php$ver");
my $binary = &has_command("php$ver") ||
&has_command("php$ver-cgi");
return $binary if ($binary);
}
@@ -352,7 +353,9 @@ if ($file =~ /^php.*?([\d\.]+)$/) {
my $nodot = $ver;
$nodot =~ s/\.//g;
my $binary = &has_command("php$ver") ||
&has_command("php$nodot");
&has_command("php$nodot") ||
&has_command("php$ver-cgi") ||
&has_command("php$nodot-cgi");
return $binary if ($binary);
}

View File

@@ -7,7 +7,7 @@ require 'proc-lib.pl';
sub syslog_getlogs
{
if ($gconfig{'os_type'} =~ /-linux$/) {
return ( { 'cmd' => "dmesg",
return ( { 'cmd' => "dmesg -T",
'desc' => $text{'syslog_dmesg'},
'active' => 1, } );
}

View File

@@ -226,11 +226,11 @@ sub find_textfile
local($conf, $dbm) = @_;
if ($conf) { return $conf; }
elsif (!$dbm) { return undef; }
elsif ($dbm =~ /^(.*)\.(db|dbm|pag|dir|hash)$/i && -r $1) {
elsif ($dbm =~ /^(.*)\.(db|dbm|pag|dir|hash|cdb)$/i && -r $1) {
# Database is like /etc/virtusertable.db, text is /etc/virtusertable
return $1;
}
elsif ($dbm =~ /^(.*)\.(db|dbm|pag|dir|hash)$/i && -r "$1.txt") {
elsif ($dbm =~ /^(.*)\.(db|dbm|pag|dir|hash|cdb)$/i && -r "$1.txt") {
# Database is like /etc/virtusertable.db, text is /etc/virtusertable.txt
return "$1.txt";
}
@@ -238,7 +238,7 @@ elsif (-r "$dbm.txt") {
# Database is like /etc/virtusertable, text is /etc/virtusertable.txt
return "$dbm.txt";
}
elsif ($dbm =~ /^(.*)\.(db|dbm|pag|dir|hash)$/i) {
elsif ($dbm =~ /^(.*)\.(db|dbm|pag|dir|hash|cdb)$/i) {
# Database is like /etc/virtusertable.db, text is /etc/virtusertable,
# but doesn't exist yet.
return $1;

View File

@@ -10,7 +10,7 @@ our (%text, %in, %access, $squid_version, %config, $module_name);
require './squid-lib.pl';
if ($config{'crypt_conf'} == 1) {
eval "use MD5";
eval "use Digest::MD5";
if ($@) {
&error(&text('eauth_nomd5', $module_name));
}

View File

@@ -9,7 +9,7 @@ no warnings 'uninitialized';
our (%text, %in, %access, $squid_version, %config, $module_name);
require './squid-lib.pl';
if ($config{'crypt_conf'} == 1) {
eval "use MD5";
eval "use Digest::MD5";
if ($@) {
&error(&text('eauth_nomd5', $module_name));
}

View File

@@ -13,7 +13,7 @@ sub useradmin_create_user
my ($uinfo) = @_;
return if (!$config{'sync_create'});
if ($config{'crypt_conf'} == 1) {
eval "use MD5";
eval "use Digest::MD5";
return if ($@);
}
return if ($uinfo->{'passmode'} != 3);
@@ -78,7 +78,7 @@ sub useradmin_modify_user
my ($uinfo) = @_;
return if (!$config{'sync_modify'});
if ($config{'crypt_conf'} == 1) {
eval "use MD5";
eval "use Digest::MD5";
return if ($@);
}
my $conf = &get_config();

View File

@@ -1721,8 +1721,6 @@ of the subtext parameter :
=item below - HTML to be displayed below the title. Typically this is used for application or server version information.
=cut
sub ui_print_header
{

View File

@@ -1 +1 @@
2.302
2.303

View File

@@ -4058,7 +4058,7 @@ return "<input name='$_[0]' size=13 value=\"$_[1]\"> ".
&group_chooser_button($_[0], 0, $_[2] || 0)."\n";
}
=head2 hlink(text, page, [module], [width], [height])
=head2 hlink(text, page, [module], [width], [height], [tmpl])
Returns HTML for a link that when clicked on pops up a window for a Webmin
help page. The parameters are :
@@ -4073,19 +4073,23 @@ help page. The parameters are :
=item height - Height of the help popup window. Defaults to 400 pixels.
=item tmpl - Hash ref of template variables to substitute in the help page.
The actual help pages are in each module's help sub-directory, in files with
.html extensions.
=cut
sub hlink
{
my ($txt, $page, $mod, $width, $height, $tmpl) = @_;
$mod ||= &get_module_name();
if (defined(&theme_hlink)) {
return &theme_hlink(@_);
}
my $mod = $_[2] ? $_[2] : &get_module_name();
my $width = $_[3] || $tconfig{'help_width'} || $gconfig{'help_width'} || 600;
my $height = $_[4] || $tconfig{'help_height'} || $gconfig{'help_height'} || 400;
return "<a onClick='window.open(\"@{[&get_webprefix()]}/help.cgi/$mod/$_[1]\", \"help\", \"toolbar=no,menubar=no,scrollbars=yes,width=$width,height=$height,resizable=yes\"); return false' href=\"@{[&get_webprefix()]}/help.cgi/$mod/$_[1]\">$_[0]</a>";
$width ||= $tconfig{'help_width'} || $gconfig{'help_width'} || 600;
$height ||= $tconfig{'help_height'} || $gconfig{'help_height'} || 400;
my $params = $tmpl ? "?".join("&", map { "tmpl_".&urlize($_)."=".&urlize($tmpl->{$_}) } keys %$tmpl) : "";
return "<a onClick='window.open(\"@{[&get_webprefix()]}/help.cgi/$mod/$page$params\", \"help\", \"toolbar=no,menubar=no,scrollbars=yes,width=$width,height=$height,resizable=yes\"); return false' href=\"@{[&get_webprefix()]}/help.cgi/$mod/$page$params\">$txt</a>";
}
=head2 user_chooser_button(field, multiple, [form])
@@ -10675,7 +10679,7 @@ else {
my $directopen = 0;
my $tmp = &open_tempfile($file);
my $ok = open($fh, ">$tmp");
if (!$ok && $! =~ /permission/i && $< != 0) {
if (!$ok && $! =~ /permission/i && $> != 0) {
# Could not open temp file .. try opening actual file
# instead directly
$ok = open($fh, ">$file");
@@ -12966,47 +12970,60 @@ for(my $i=0; $i<@sp1 || $i<@sp2; $i++) {
return 0;
}
=head2 convert_to_json(data, [pretty])
=head2 convert_to_json(data, [pretty], [raw-utf8])
Converts the given Perl data structure to encoded binary string
=item data parameter is a hash/array reference
=item if the output should be prettified
=item raw-utf8 parameter, if set to 1, encodes data using UTF-8
=cut
sub convert_to_json
{
eval "use JSON::PP";
if (!$@) {
my ($data, $pretty) = @_;
my $json = JSON::PP->new;
$pretty = 0 if (!$pretty);
$json = $json->pretty($pretty);
$data ||= {};
return $json->latin1->encode($data);
my ($data, $pretty, $raw_utf8) = @_;
my $json;
if (eval { require JSON::XS }) {
$json = JSON::XS->new;
}
elsif (eval { require JSON::PP }) {
$json = JSON::PP->new;
}
else {
error("The JSON::PP Perl module is not available on your system : $@");
error("Neither JSON::XS nor JSON::PP Perl module is available on your system");
}
$json->pretty(!!$pretty);
$data ||= {};
return $raw_utf8 ? $json->utf8->encode($data) : $json->latin1->encode($data);
}
=head2 convert_from_json(data)
=head2 convert_from_json(data, [raw-utf8])
Parses given JSON string
=item data parameter is encoded JSON string
=item raw-utf8 parameter, if set, treats the input as raw UTF-8
=cut
sub convert_from_json
{
eval "use JSON::PP";
if (!$@) {
my ($json_text) = @_;
return JSON::PP->new->utf8->decode($json_text);
my ($json_text, $raw_utf8) = @_;
my $json;
if (eval { require JSON::XS }) {
$json = JSON::XS->new;
}
elsif (eval { require JSON::PP }) {
$json = JSON::PP->new;
}
else {
error("The JSON::PP Perl module is not available on your system : $@");
error("Neither JSON::XS nor JSON::PP Perl module is available on your system");
}
$json = $json->utf8 if (!$raw_utf8);
return $json->decode($json_text);
}
=head2 print_json(data)

View File

@@ -64,10 +64,9 @@ foreach my $os (@eol_oses) {
push(@eol_oses_data, @$fdata_json);
}
my $eol_oses_data = &convert_to_json(\@eol_oses_data);
&backquote_command("echo -n '$eol_oses_data' > $eol_cache_file 2>&1 </dev/null");
if ($?) {
die("Could not write OS EOL data file : $?");
}
open(my $fh, '>', $eol_cache_file) or die("Could not open OS EOL data file for writing: $!");
print $fh $eol_oses_data;
close($fh) or die("Could not close OS EOL data file: $!");
}
# eol_get_os_data()