рдЕрднрд┐рд╡рд╛рджрди, рдХрдорд░реЗрдбрд╣рд░реВред рдореЗрд░реЛ рд▓рдбрд╛рдИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рд╕реБрдиреНрджрд░
рд╕рд╛рдереАрд╣рд░реВрд▓реЗ рдорд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд╛рд╕ рдлрд╛рд░реНрдо рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрдЧреНрд░рд╣ рдЧрд░реЗ, рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдореЗрд░реЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рддрд╛рдиреНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рд░реЛрдЪрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдореНрдЭреЗред
рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╕реНрд░реЛрддрд╣рд░реВрдорд╛ рдЦрдиреНрдиреЗ рдЕрдШрд┐, рдореИрд▓реЗ рдХреНрд░реЛрдорд▓реЗ рдХрдиреНрдлрд┐рдЧрд╣рд░реВрдХрд╛ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдЬрд┐рдк рд╕рдВрдЧреНрд░рд╣рд▓рд╛рдИ рдХрд╣рд╛рдБ рддрд╛рдиреНрджрдЫ, рд░ рддреНрдпрд╣рд╛рдБ "рдмреНрд▓рдм:" рдмрд╛рдЯ рд╕реБрд░реБ рд╣реБрдиреЗ рдареЗрдЧрд╛рдирд╛ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛ, рдЙрдлреНред рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реНрдкрд╖реНрдЯ рднрдПрдХреЛ рдЫ рдХрд┐ рд╕реЗрд╡рд╛рд▓реЗ рдмрд╛рдЯреЛрдорд╛ рдХреЗрд╣рд┐ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджреИрди, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпреЛ рд╕рдмреИ js рджреНрд╡рд╛рд░рд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рд╡рд╛рд╕реНрддрд╡рдорд╛, zip рдЕрднрд┐рд▓реЗрдЦ рдЧреНрд░рд╛рд╣рдХ, рдмреНрд░рд╛рдЙрдЬрд░, рд░ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдлреИрд▓реЗ рдЙрддреНрдкрдиреНрди рдЧрд░реЗрдХреЛ рдЫред рддреАред рд╕реБрдиреНрджрд░рддрд╛ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд░реНрдХ рдЧрд░реЗрдкрдЫрд┐, рдореИрд▓реЗ рдореЗрд░рд╛ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдХреЗ рд╣реБрдиреН рднрдиреЗрд░ рд╕реЛрдЪреНрди рдерд╛рд▓реЗрдВред рдХреБрдиреИ рдкрдирд┐ рдмреНрдпрд╛рдХ-рдПрдиреНрдб рдмрд┐рдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрджреНрдз рдлреНрд░рдиреНрдЯ-рдПрдиреНрдб рд░рд╣рдиреБрдкрд░реНрдЫ рднрдиреНрдиреЗ рд╢рд░реНрддрдмрд╛рдЯ рдо рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрди рдЪрд╛рд╣рдиреНрдирдБ рднрдиреНрдиреЗ рддрдереНрдпрд▓реЗ рдЧрд░реНрджрд╛ рдХрд╛рдо рдЬрдЯрд┐рд▓ рдерд┐рдпреЛред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рднрдиреЗрдХреЛ рдиреЛрдбрдЬрд╣рд░реВ рддрд╛рдиреНрдиреБ рд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рддреНрдпрдХреНрд╖ рд▓рд┐рдЩреНрдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВрд╕рдБрдЧ рд╕рдЩреНрдЧреНрд░рд╣ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдмрд╛рдзреНрдп рдкрд╛рд░реНрдиреБ рд╣реЛред
рд╡рд╛рд╕реНрддрд╡рдорд╛, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдерд┐рдПрдирдиреНред рдЕрдЭ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдХреЗрд╡рд▓ рдПрдХ рджрд┐рдорд╛рдЧрдорд╛ рдЖрдпреЛред рд╣рд╛рдореАрд▓реЗ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рд░ zip рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рд░реНрднрд░ рдХрдиреНрд╕реЛрд▓рдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рд╕рдХреНрдиреЗ рд▓рд┐рдЩреНрдХ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк zip рдЕрднрд┐рд▓реЗрдЦрдорд╛ рдзреЗрд░реИ рдкрд╛рда рдлрд╛рдЗрд▓рд╣рд░реВ рдПрдХрджрдо рдереЛрд░реИ, рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдкрдорд╛ рдХреЗрд╣реА рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рддреМрд▓рд┐рдПред рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ zip рд╕рдВрдЧреНрд░рд╣рдмрд╛рдЯ base64 рд╕реНрдЯреНрд░рд┐рдЩ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рдмрдлрд░рдорд╛ рдлреНрдпрд╛рдБрдХреНрдиреБ рдерд┐рдпреЛ, рд╕рд░реНрднрд░рдорд╛ рдХрдиреНрд╕реЛрд▓рдорд╛ рдЖрджреЗрд╢рдХреЛ рд╕рд╛рдердорд╛ред
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 рдЕрднрд┐рд▓реЗрдЦрдХреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмреНрд▓рдм рд╡рд╕реНрддреБ рд╣реЛред
рдареАрдХ рдЫ, рдореИрд▓реЗ рддреНрдпрд╕рдХреЛ рдЫреЗрдЙрдорд╛ рдЕрд░реНрдХреЛ рдмрдЯрди рдердкреНрдиреБ рдкрд░реНрдиреЗ рдерд┐рдпреЛ рд░ рдЬрдм рдореИрд▓реЗ рдпрд╕рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрдВ, рдореИрд▓реЗ рдирддрд┐рдЬрд╛рдХреЛ рдЬрд┐рдк рд╕рдВрдЧреНрд░рд╣ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреЗ рдЫреИрди, рддрд░ рдпрд╕рдмрд╛рдЯ рдмреЗрд╕64 рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдерд┐рдПрдБред рдЕрд▓рд┐рдХрддрд┐ рдлрд┐рд▓реНрдбрд┐рдЩ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдЬрд┐рдкрдХреЛ рд╕рдЯреНрдЯрд╛рдорд╛ реи рд╡рдЯрд╛ рд╡рд┐рдзрд┐ рдкрд╛рдПрдБ:
$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 рдЕрднрд┐рд▓реЗрдЦрдХреЛ рдкреБрд╕реНрддрд╛рд▓рд╛рдИ рдирд┐рдЬреА generateZip рд╡рд┐рдзрд┐рдорд╛ рд╕рд╛рд░рд┐рдпреЛ, рд░ рдпрд╕реНрддреИред рдпреЛ AngularJS рд╣реЛ, рд░ рд▓реЗрдЦрдХ рдЖрдлреИрдВ рдХрд▓рдмреНрдпрд╛рдХрд╣рд░реВрдорд╛ рдЯрд╛рдБрд╕рд┐рдиреНрдЫрдиреН рд░ рдпрд╕рд▓рд╛рдИ рд╡рд╛рдЪрд╛рд╣рд░реВ рдорд╛рд░реНрдлрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджреИрдирдиреНред downloadZip рд▓реЗ рдЕрдЭреИ рдкрдирд┐ рдЖрдЙрдЯрдкреБрдЯрдХреЛ рд░реВрдкрдорд╛ saveAs рдЧрд░реНрдпреЛ, рдЬрдмрдХрд┐ downloadBase64 рд▓реЗ рдХреЗрд╣рд┐ рдлрд░рдХ рдЧрд░реНрдпреЛред рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ FileReader рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ рдЬреБрди рд╣рд╛рдореАрд▓рд╛рдИ html5 рдорд╛ рдЖрдпреЛ рд░ рдкрд╣рд┐рд▓реЗ рдиреИ рдкрд░реНрдпрд╛рдкреНрдд рдЫ
position: absolute;
z-index: -1;
opacity: 0;
рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рджреГрд╢реНрдпрдмрд╛рдЯ рддрддреНрд╡ рд▓реБрдХрд╛рдЙрди рд░ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреГрд╖реНрдардорд╛ рдЫреЛрдбреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдпреЛред рднреЛрдЗрд▓рд╛, рдХрд╛рд░реНрдп рдкреВрд░рд╛ рднрдпреЛ, рдЬрдм рдореИрд▓реЗ рдореЗрд░реЛ рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрдВ, рдпрд╕реНрддреЛ рд▓рд╛рдЗрди рдмрдлрд░рдорд╛ рд░рд╛рдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ:
echo 'base64string' | base64 --decode > config.zip
рдЬреБрди рдореИрд▓реЗ рдХреЗрд╡рд▓ рд╕рд░реНрднрд░рдорд╛ рдХрдиреНрд╕реЛрд▓рдорд╛ рдЯрд╛рдБрд╕реЗрдВ рд░ рддреБрд░реБрдиреНрддреИ рд╕рдмреИ рдХрдиреНрдлрд┐рдЧрд╣рд░реВрдХрд╛ рд╕рд╛рде рдЬрд┐рдк рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдВред
рд░, рдЕрд╡рд╢реНрдп рдкрдирд┐, рдореИрд▓реЗ рд▓реЗрдЦрдХрд▓рд╛рдИ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрдард╛рдПрдБ, рдХрд┐рдирдХрд┐ ... рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдХреНрд░рд┐рдп рд░ рдЬреАрд╡рдиреНрдд рдЫ, рдо рд▓реЗрдЦрдХрдмрд╛рдЯ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрд╣рд░реВ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ рд░ рдореЗрд░реЛ рдЖрдлреНрдиреИ рдмрдЯрди рдЫ) рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рдпреЛ рдпрд╣рд╛рдБ рдЫ
рд╕рдмреИрдХреЛ рдмрд┐рдХрд╛рд╕рдХреЛ рд╢реБрднрдХрд╛рдордирд╛)
рд╕реНрд░реЛрдд: www.habr.com