Tere, sĂ”brad. Minu vĂ”itlussĂŒsteemides on suurepĂ€rane toimib alates 2006. aastast ja aastate jooksul olen kogunud palju seadistusi ja malle. Olen palju kiitnud nginxit ja kuidagi nii juhtus, et isegi nginx hubis harb'is asutasin ma, uhked m/
SĂ”brad palusid mul luua neile arendaja farm ja selle asemel, et tuua neile oma spetsiifilised mallid, meenutasin ma huvitavat projekti , mis jagab seadeid riiulitele ja valmistab kĂ”ik ette lets encrypt'i jaoks jne. Ja mĂ”tlesin, miks mitte? Kuid mind hĂ€iris see, et nginxconfig pakub mulle zip-aruande alla laadimist brauseris, lubamata seda otse serverisse laadida wgeti/fetchi/curliga. Mis see jumal kĂŒll on, miks see mulle brauseris, kui ma tahan seda serverisse konsoolist? Ăkskord vihastasin ja lĂ€ksin githubi, et uurida projekti sisemust, mis viis selle forkimiseks ja jĂ€rgnevaks pull request'iks. Millest ma ei oleks kirjutanud, kui see ei oleks huvitav đ
Loomulikult vaatasin enne allika muutma asumist, kust chrome tĂ”mbab genereeritud zip-aruande seadistused, ja seal ootas mind aadress, mis algas âblob:â, oho. Juba sai selgeks, et teenus ei genereeri midagi, tegelikult teeb seda kogu asja js. TĂ”epoolest, zip-aruande genereerib klient ise, brauser, javascript. St. asi on selles, et projekt saab lihtsalt salvestada html-lehekĂŒljena, ĂŒles laadida mingile ja see töötab ) See on vĂ€ga naljakas ja huvitav lahendus, kuid see on kohutavalt ebamugav serverite seadistamiseks, just selle jaoks, milleks see projekt loodi. Genereeritud aruande allalaadimine brauseriga ja seejĂ€rel selle edastamine serverisse nc abil⊠2019. aastal? Seadsin endale eesmĂ€rgi leida viis, kuidas saada saadud seadistus otse serverisse.
Projekti forkimisega alustasin ma mĂ”tlema, millised on minu vĂ”imalused. Ălesanne muutus keeruliseks, kuna ma ei tahtnud devij minna, et projekt peab jÀÀma puhtaks front-end'iks, ilma igasuguse back-end'ita. Loomulikult oleks kĂ”ige lihtsam lahendus nodejs sisse tĂ”mmata ja sundida seda genereerima seadistuste arhiveeritud andmed otse linkidele.
VĂ”imalusi ei olnud tegelikult palju. TĂ€psemalt tuli pĂ€he vaid ĂŒks. Peame seadistama seadistused ja saama lingi, mille saame kopeerida serveri konsooli, et saada zip-aruande.
MĂ”ned tekstifailid saadud zip-arhivis olid ĂŒsna vĂ€ikesed, vaid mĂ”ned kilobait. Ilmselge lahendus oli genereeritud zip-arhivist saada base64 string ja see panna lĂ”ikelauale, samal ajal kui serveris konsoolis kĂ€suga.
echo 'base64string' | base64 --decode > config.zipme oleksime saanud selle zip-faili luua.
oli kirjutatud AngularJS-i peale, ma ei kujuta ette, kui palju koodi oleks olnud vajalik, kui autor ei oleks valinud reaktiivset js raamistikku. Samas kujutan hÀsti ette, kui palju lihtsam ja ilusam oleks seda kÔik ellu viia VueJS-i abil, kuigi see on juba hoopis teine teema.
Projektis nÀeme zip-arhivi genereerimise meetodit:
$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',
});
};
kÔik on piisavalt lihtne, kasutades raamatukogu luuakse zip, kuhu pannakse konfiguratsioonifailid. PÀrast zip-arhivi loomist annab js selle brauserile raamatukogu :
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
kus content on saadud blob objekt zip-arhivist.
Okei, kĂ”ik, mida ma pidin tegema, oli lisada veel ĂŒks nupp kĂ”rval ja selle vajutamisel mitte salvestada saadud zip-arhivi brauserisse, vaid saada sellest base64 kood. Natuke katsetades sain 2 meetodit, mitte ĂŒht downloadZip:
$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,/, '');
// muutuja base64 sisaldab vajalikku zip-arhivi base64 stringina
}
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_base64',
});
};
Nagu olete juba mÀrganud, on zip-arhiivi genereerimine viidud eraviisilisse meetodisse generateZip. Kuna see on AngularJS ja autor kaldub kasutama tagasisidet, ei rakendanud ma seda lubaduste kaudu. downloadZip jÀtkab saveAs kasutamist, samas kui downloadBase64 töötab pisut teisiti. Loome FileReader objekti, mis tuli meile html5 kaudu ja on tÀiesti kasutamiseks. See suudab blobist genereerida base64 stringi, tÀpsemalt loob see DataURL stringi, kuid see ei ole meile nii oluline, kuna DataURL sisaldab tÀpselt seda, mida me vajame. Bingole, vÀike pÔngus ootas mind, kui proovisin seda kÔike lÔikelauale panna. Autor kasutas projektis teeki , mis vÔimaldab töötada lÔikelauaga ilma Flash objektideta, pÔhinedes valitud tekstile. Alguses otsustasin panna oma base64 elemendi sisse, mille display on:none;, kuid sel juhul ei suutnud ma seda lÔikepaberisse panna, kuna valikut ei toimunud. SeetÔttu, display:none; asemel tegin ma
position: absolute;
z-index: -1;
opacity: 0;
mis vĂ”imaldas mul elemendi silmade eest varjata ja tegelikult jĂ€tta see lehele. VoilĂ , ĂŒlesanne on tĂ€idetud, kui vajutasin oma nuppu, pandi lĂ”ikelauale string kujul:
echo 'base64string' | base64 --decode > config.zipmille lihtsalt kleepisin serveri konsooli ja sain kohe zip-arhiivi kÔigi seadistustega.
Ja muidugi tegin ma autorile pull requesti, kuna projekt on aktiivne ja elav, soovin nÀha ka autori uuendusi ja omada oma nuppu. Kui kedagi huvitab, siis siin on projektist ja ise , kus saab vaadata, mida ma parandas / tÀiendas.
Igal juhul head arendamist )
Allikas: habr.com
