ΠΠΎΠ·Π΄ΡΠ°Π²ΠΈ, Π΄ΡΡΠ³Π°ΡΠΈ. ΠΡΠ°ΡΠΈΠ²ΠΎ Π½Π° ΠΌΠΎΠΈΡΠ΅ Π±ΠΎΠΉΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ
ΠΡΠΈΡΡΠ΅Π»ΠΈ ΠΌΠ΅ ΠΏΠΎΠΌΠΎΠ»ΠΈΡ
Π° Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΡΠ΅ΡΠΌΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π° ΡΡΡ
ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΈΠΌ Π²Π»Π°ΡΠ° ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ, ΡΠΈ ΡΠΏΠΎΠΌΠ½ΠΈΡ
ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠΎΠ²Ρ Π² ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈΡΠ΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ
ΠΊΡΠ΄Π΅ Chrome ΠΈΠ·ΡΠ΅Π³Π»Ρ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡ zip Π°ΡΡ
ΠΈΠ² Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈ ΡΠ°ΠΌ ΠΌΠ΅ ΡΠ°ΠΊΠ°ΡΠ΅ Π°Π΄ΡΠ΅Ρ, Π·Π°ΠΏΠΎΡΠ²Π°Ρ Ρ βblob:β, ΠΎΠΏΠ°. ΠΠ΅ΡΠ΅ ΡΡΠ°Π½Π° ΡΡΠ½ΠΎ, ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½ΠΈΡΠΎ ΠΏΠΎ ΠΏΡΡΡ, Π²ΡΡΡΠ½ΠΎΡΡ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΠΎΡ js. ΠΡΡΡΠ½ΠΎΡΡ zip Π°ΡΡ
ΠΈΠ²ΡΡ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΎΡ ΡΠ°ΠΌΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ, Π±ΡΠ°ΡΠ·ΡΡ ΠΈ javascript. Π’Π΅Π·ΠΈ. ΠΊΡΠ°ΡΠΎΡΠ°ΡΠ° Π΅, ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡΡ
Π‘Π»Π΅Π΄ ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π°ΠΏΠΎΡΠ½Π°Ρ
Π΄Π° ΠΌΠΈΡΠ»Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΠΌΠΈ. ΠΠ°Π΄Π°ΡΠ°ΡΠ° ΡΠ΅ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π°ΡΠ΅ ΠΎΡ ΡΠΎΠ²Π°, ΡΠ΅ Π½Π΅ ΠΈΡΠΊΠ°Ρ
Π΄Π° ΡΠ΅ ΠΎΡΠΊΠ»ΠΎΠ½ΡΠ²Π°ΠΌ ΠΎΡ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π΄Π° ΡΠΈ ΠΎΡΡΠ°Π½Π΅ ΡΠΈΡΡ front-end, Π±Π΅Π· back-end. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ nodejs ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° Π°ΡΡ
ΠΈΠ² Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ Π²ΡΡΠ·ΠΊΠΈ.
ΠΡΡΡΠ½ΠΎΡΡ Π½ΡΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΎ-ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎ ΠΌΠΈ Π΄ΠΎΠΉΠ΄Π΅ Π½Π°ΡΠΌ. Π’ΡΡΠ±Π²Π° Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π²ΡΡΠ·ΠΊΠ°, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ zip Π°ΡΡ
ΠΈΠ².
ΠΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ zip Π°ΡΡ
ΠΈΠ² ΡΠ΅ΠΆΠ°Ρ
Π° Π΄ΠΎΡΡΠ°, Π±ΡΠΊΠ²Π°Π»Π½ΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡΠ°. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅ΡΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ base64 Π½ΠΈΠ·Π° ΠΎΡ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡ zip Π°ΡΡ
ΠΈΠ² ΠΈ Π΄Π° Π³ΠΎ Ρ
Π²ΡΡΠ»ΠΈΡΠ΅ Π² Π±ΡΡΠ΅ΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ΅ Π½Π° ΡΡΡΠ²ΡΡΠ° Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°
echo 'base64string' | base64 --decode > config.zip
Π±ΠΈΡ ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΡΡΠΈΡ ΡΠΎΠ·ΠΈ zip ΡΠ°ΠΉΠ».
Π ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° zip Π°ΡΡ
ΠΈΠ²:
$scope.downloadZip = function() {
var zip = new JSZip();
var sourceCodes = $window.document.querySelectorAll('main .file .code.source');
for (var i = 0; i < sourceCodes.length; i++) {
var sourceCode = sourceCodes[i];
var name = sourceCode.dataset.filename;
var content = sourceCode.children[0].children[0].innerText;
if (!$scope.isSymlink() && name.match(/^sites-available//)) {
name = name.replace(/^sites-available//, 'sites-enabled/');
}
zip.file(name, content);
if (name.match(/^sites-available//)) {
zip.file(name.replace(/^sites-available//, 'sites-enabled/'), '../' + name, {
unixPermissions: parseInt('120755', 8),
});
}
}
zip.generateAsync({
type: 'blob',
platform: 'UNIX',
}).then(function(content) {
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_zip',
});
};
Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΠ²ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
ΠΊΡΠ΄Π΅ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΡ Π±Π»ΠΎΠ± ΠΎΠ±Π΅ΠΊΡ Π½Π° zip Π°ΡΡ ΠΈΠ²Π°.
ΠΠΎΠ±ΡΠ΅, Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ, Π±Π΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²Ρ Π΄ΡΡΠ³ Π±ΡΡΠΎΠ½ Π΄ΠΎ Π½Π΅Π³ΠΎ ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΠΊΠ½Π° Π²ΡΡΡ Ρ Π½Π΅Π³ΠΎ, Π½ΡΠΌΠ°ΡΠ΅ Π΄Π° Π·Π°ΠΏΠ°Π·Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ zip Π°ΡΡ ΠΈΠ² Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, Π½ΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠ° ΠΊΠΎΠ΄Π° base64 ΠΎΡ Π½Π΅Π³ΠΎ. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ°Π·ΡΠΎΠ²ΠΈΡ ΠΌΠ°Π»ΠΊΠΎ, ΠΏΠΎΠ»ΡΡΠΈΡ 2 ΠΌΠ΅ΡΠΎΠ΄Π°, Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅Zip:
$scope.downloadZip = function() {
generateZip(function (content) {
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_zip',
});
};
$scope.downloadBase64 = function() {
generateZip(function (content) {
var reader = new FileReader();
reader.readAsDataURL(content);
reader.onloadend = function() {
var base64 = reader.result.replace(/^data:.+;base64,/, '');
// Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ base64 ΠΊΠ°ΠΊ ΡΠ°Π· Π½ΡΠΆΠ½ΡΠΉ ΠΌΠ½Π΅ zip Π°ΡΡ
ΠΈΠ² Π² Π²ΠΈΠ΄Π΅ base64 ΡΡΡΠΎΠΊΠΈ
}
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_base64',
});
};
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΡΡΠ΅ Π·Π°Π±Π΅Π»ΡΠ·Π°Π»ΠΈ, ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΡ
Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΈΡ zip Π°ΡΡ
ΠΈΠ² ΠΊΡΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° private generateZip ΠΈ Ρ.Π½. Π’ΠΎΠ²Π° Π΅ AngularJS ΠΈ ΡΠ°ΠΌΠΈΡΡ Π°Π²ΡΠΎΡ ΡΠ΅ ΠΏΡΠΈΠ΄ΡΡΠΆΠ° ΠΊΡΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΈ Π½Π΅ Π³ΠΎ Π΅ Π²Π½Π΅Π΄ΡΠΈΠ» ΡΡΠ΅Π· ΠΎΠ±Π΅ΡΠ°Π½ΠΈΡ. downloadZip Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ saveAs ΠΊΠ°ΡΠΎ ΠΈΠ·Ρ
ΠΎΠ΄, Π΄ΠΎΠΊΠ°ΡΠΎ downloadBase64 Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π΅ΡΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ. Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ FileReader, ΠΊΠΎΠΉΡΠΎ Π΄ΠΎΠΉΠ΄Π΅ ΠΏΡΠΈ Π½Π°Ρ Π² html5 ΠΈ Π²Π΅ΡΠ΅ Π΅ Π΄ΠΎΡΡΠ°
position: absolute;
z-index: -1;
opacity: 0;
ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΡΠΊΡΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΎΡ ΠΈΠ·Π³Π»Π΅Π΄ ΠΈ Π²ΡΡΡΠ½ΠΎΡΡ Π΄Π° Π³ΠΎ ΠΎΡΡΠ°Π²Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°. ΠΠΎΠ°Π»Π°, Π·Π°Π΄Π°ΡΠ°ΡΠ° Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΠΊΠ½Π°Ρ Π²ΡΡΡ Ρ ΠΌΠΎΡ Π±ΡΡΠΎΠ½, Π² Π±ΡΡΠ΅ΡΠ° Π±Π΅ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ ΡΠ΅Π΄ ΠΊΠ°ΡΠΎ ΡΠΎΠ·ΠΈ:
echo 'base64string' | base64 --decode > config.zip
ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡ
Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΠΏΠΎΠ»ΡΡΠΈΡ
zip Π°ΡΡ
ΠΈΠ² Ρ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
Π, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠ·ΠΏΡΠ°ΡΠΈΡ
Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° Π°Π²ΡΠΎΡΠ°, Π·Π°ΡΠΎΡΠΎ... ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π΅ Π°ΠΊΡΠΈΠ²Π΅Π½ ΠΈ ΠΎΠΆΠΈΠ²Π΅Π½, Π±ΠΈΡ
ΠΈΡΠΊΠ°Π» Π΄Π° Π²ΠΈΠΆΠ΄Π°ΠΌ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ Π°Π²ΡΠΎΡΠ° ΠΈ Π΄Π° ΠΈΠΌΠ°ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½ Π±ΡΡΠΎΠ½) ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ, Π΅ΡΠΎ Π³ΠΎ
Π§Π΅ΡΡΠΈΡΠΎ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com