Isizukulwana soqwalaselo lwe nginx, imbali yesicelo sokutsalwa esinye

Molweni, bakwethu. Intle kwiiseva zam zokulwa nginx ibisebenza ukusukela ngo-2006 kwaye kule minyaka yolawulo lwayo ndiqokelele uninzi lwezicwangciso kunye neetemplates. Ndiye ndancoma kakhulu ndinx nyhan kuvele kwacaca ukuba ndade ndaqala ihub kwi hub, nam ndabonisa m/
Abahlobo bandicele ukuba ndibamisele ifama yophuhliso, kwaye endaweni yokubarhuqa iitemplates zam ezithile, ndakhumbula iprojekthi enomdla. nginxconfig.io, esasaza uqwalaselo kwiishelufa kwaye ilungiselela yonke into ukuze i-lets encrypt, njl. Ndacinga, kutheni kungenjalo? Nangona kunjalo, ndandicatshukiswa kukuba i-nginxconfig indinika ukukhuphela indawo yokugcina ye-zip kwisikhangeli, ngaphandle kokundivumela ukuba ndiyilayishe ngokuthe ngqo kumncedisi usebenzisa i-wget/fetch/curl. Yintoni engenangqondo, kutheni ndiyidinga kwi-browser, ndiyidinga kwi-server esuka kwi-console. Ngomsindo, ndaya kwi-github ukuze ndibone i-guts yeprojekthi, eyakhokelela kwifoloko yayo kwaye, ngenxa yoko, isicelo sokutsala. Nto leyo bendingayi kubhala ngayo ukuba ibinganiki mdla πŸ˜‰

Isizukulwana soqwalaselo lwe nginx, imbali yesicelo sokutsalwa esinye

Ewe, ngaphambi kokumba kwimithombo, ndajonga apho i-Chrome itsalela khona indawo yokugcina ye-zip eyenziweyo kunye ne-configs, kwaye kukho idilesi eqala ngo "blob:" yayindilindile, oops. Sele kucacile ukuba inkonzo ayivezi nantoni na endleleni, enyanisweni, yonke into yenziwa ngu-js. Ewe, indawo yokugcina ye-zip yenziwe ngumxhasi, isikhangeli, kunye ne-javascript ngokwayo. Ezo. ubuhle kukuba iprojekthi nginxconfig.io ingagcinwa ngokulula njengephepha le html, elayishwe kwezinye narod.ru kwaye iya kusebenza) Esi sisisombululo esihlekisayo kwaye sinomdla, nangona kunjalo, akulula kakhulu ukuseta iiseva, enyanisweni, kanye ukuba le projekthi yenziwa ntoni. Khuphela i-archive eyenziwe ngesikhangeli, kwaye emva koko uyidlulisele kumncedisi usebenzisa i-nc... ngo-2019? Ndizibekele umsebenzi wokufumana indlela yokukhuphela isiphumo soqwalaselo ngqo kumncedisi.
Emva kokuyishiya iprojekthi, ndaqala ukucinga malunga nokuba zeziphi iinketho zam. Lo msebenzi wawuntsonkothekile kukuba ndandingafuni ukutenxa kumqathango wokuba iprojekthi le ifanele ihlale ingumphambili ococekileyo, ngaphandle kwesiphelo esingasemva. Ewe kunjalo, esona sisombululo silula iyakuba kukutsala ii-nodejs kwaye uyinyanzele ukuba ivelise indawo yokugcina izinto ekugcinwa kuyo izinto kusetyenziswa unxibelelwano oluthe ngqo.
Ngokwenyani, bekungekho zininzi iindlela zokukhetha. Ngokuchanekileyo, inye kuphela eyathi qatha engqondweni. Sidinga ukuseta uqwalaselo kwaye sifumane ikhonkco esinokulikhuphela kwikhonsoli yeseva ukuze sifumane i-zip yokugcina.
Iifayile zokubhaliweyo ezininzi kwindawo yokugcina ye-zip enesiphumo inobunzima obuncinci, ngokwenyani iikhilobhayithi ezimbalwa. Isisombululo esicacileyo yayikukufumana umtya we-base64 ovela kwindawo yokugcina ye-zip kwaye uyiphose kwi-buffer, ngelixa kumncedisi ngomyalelo kwi-console.

echo 'base64string' | base64 --decode > config.zip

singenza le zip ifayile efanayo.

nginxconfig.io yabhalwa nge-AngularJS, andikwazi nokucinga ukuba zeziphi iikhilomitha zekhowudi eziya kufuneka ukuba umbhali akazange akhethe isakhelo esisebenzayo se-js. Kodwa ndiyakwazi ukucinga ngokugqibeleleyo ukuba kulula kangakanani kwaye kuhle ngakumbi konke oku kunokuphunyezwa kwi-VueJS, nangona esi sisihloko esahluke ngokupheleleyo.
Kwimithombo yeprojekthi sibona indlela yokwenza indawo yokugcina ye-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',
	});
};

yonke into ilula kakhulu, usebenzisa ithala leencwadi jszip I-zip yenziwe apho iifayile zoqwalaselo zibekwe khona. Emva kokudala i-zip archive, i-js iyondla kwisikhangeli usebenzisa ithala leencwadi FileSaver.js:

saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');

apho isiqulatho sisiphumo seblob sento yogcino lwezip.

Kulungile, ekuphela kwento ebekufuneka ndiyenze kukongeza elinye iqhosha ecaleni kwayo kwaye xa ndicofa kuyo, andizukuyigcina i-zip egciniweyo kwisikhangeli, kodwa ndifumane ikhowudi ye-base64 kuyo. Emva kokujikeleza kancinci, ndifumene iindlela ezi-2, endaweni yokukhuphela iZip enye:

$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',
	});
};

Njengoko usenokuba uqaphele, ndisuse isizukulwana se-zip yogcino ngokwalo kwindlela yabucala yeZip, njalo njalo. Le yi-AngularJS, kwaye umbhali ngokwakhe unamathela kwii-callbacks kwaye akazange ayiphumeze ngezithembiso. downloadZip isagcinile njengemveliso, ngelixa downloadBase64 yenze into eyahlukileyo kancinci. Senza into yeFayileReader eze kuthi kwi-html5 kwaye sele ilungile ifikeleleka ukusetyenziswa. Yiyiphi, ngexesha elinye, inokwenza i-base64 intambo kwi-blob, okanye kunoko, yenza i-DataURL yomtya, kodwa oku akubalulekanga kangako kuthi, kuba IdathaURL iqulethe kanye into esiyidingayo. Ibhingo, i-snag encinci yayindilindile xa ndizama ukubeka yonke le nto kwi-buffer. Umbhali usebenzise ithala leencwadi kwiprojekthi iibhodi eqhotyoshwayo, ekuvumela ukuba usebenze ngebhodi eqhotyoshwayo ngaphandle kwezinto ezidanyazayo, ngokusekelwe kokubhaliweyo okukhethiweyo. Ekuqaleni, ndaye ndagqiba ekubeni ndibeke i-base64 yam kwinto enomboniso: akukho nanye;, kodwa kule meko andikwazanga ukuyibeka kwibhodi eqhotyoshwayo kuba. akukho ukwahlukana kwenzeka. Ke ngoko, endaweni yokubonisa:akukho nanye; Nda

position: absolute;
z-index: -1;
opacity: 0;

endivumele ukuba ndifihle zombini into ekubonweni kwaye ndiyishiye kwiphepha. Voila, umsebenzi ugqityiwe, xa ndicofa iqhosha lam, umgca onje wabekwa kwi-buffer:

echo 'base64string' | base64 --decode > config.zip

endiyincamathisele kwiconsole kumncedisi kwaye kwangoko ndafumana indawo yokugcina ye-zip nayo yonke imimiselo.
Kwaye, ngokuqinisekileyo, ndathumela isicelo sokutsalwa kumbhali, kuba... iprojekthi iyasebenza kwaye idlamkile, ndingathanda ukubona uhlaziyo oluvela kumbhali kwaye ndineqhosha lam) Kwabo banomdla, nantsi ifolokhwe yam iprojekthi kunye naye tsala isicelo, apho unokubona khona into endiyilungisileyo/ndiyongezile.
Uphuhliso oluhle nonke)

Isizukulwana soqwalaselo lwe nginx, imbali yesicelo sokutsalwa esinye

umthombo: www.habr.com

Yongeza izimvo