Ƙirƙirar saiti don nginx, tarihin buƙatun ja ɗaya

Gaisuwa, yan uwa. Kyawawan kan sabobin fama na nginx yana gudana tun 2006 kuma a cikin shekarun mulkinta na tara abubuwan daidaitawa da samfuri da yawa. Na yaba da nginx da yawa kuma ko ta yaya ya zama cewa har ma na fara tashar nginx akan hub, kuma, nuna m/
Abokai sun nemi in kafa musu gonakin ci gaba, kuma maimakon in jawo su takamaiman samfura na, sai na tuna wani aiki mai ban sha'awa. nginxconfig.io, wanda ya watsar da saiti a kan ɗakunan ajiya kuma yana shirya komai don bari encrypt, da dai sauransu. Na yi tunani, me ya sa? Koyaya, na fusata da gaskiyar cewa nginxconfig yana ba ni don saukar da tarihin zip a cikin mai binciken, ba tare da ba ni damar loda shi kai tsaye zuwa uwar garken ta amfani da wget/fetch/curl ba. Wane irin banza ne, me yasa nake buƙatar shi a cikin mai bincike, Ina buƙatar shi akan uwar garken daga na'ura mai kwakwalwa. A fusace, na tafi github don ganin guts na aikin, wanda ya kai ga cokali mai yatsa kuma, sakamakon haka, buƙatar ja. Wanda ba zan rubuta game da shi ba idan ba mai ban sha'awa ba 😉

Ƙirƙirar saiti don nginx, tarihin buƙatun ja ɗaya

Tabbas, kafin in shiga cikin maɓuɓɓugar, na kalli inda Chrome ke jan ajiyar zip ɗin da aka samar tare da saiti, kuma akwai adireshin da ya fara da "blob:" yana jirana, oops. Ya riga ya bayyana cewa sabis ɗin ba ya haifar da komai a hanya, a zahiri, duk abin da aka yi ta js ne. Lallai, rumbun adana bayanan zip ɗin abokin ciniki ne, mai bincike, da javascript ɗin kansa ne suka samar da shi. Wadancan. kyawun shine aikin nginxconfig.io ana iya ajiyewa kawai azaman shafin html, an loda zuwa wasu narod.ru kuma zai yi aiki) Wannan bayani ne mai ban dariya da ban sha'awa, duk da haka, yana da matukar damuwa don kafa sabobin, a gaskiya, daidai ga abin da aka halicci wannan aikin. Zazzage kayan tarihin da aka samar tare da mai bincike, sannan canza shi zuwa uwar garken ta amfani da nc... a cikin 2019? Na kafa kaina aikin nemo hanyar da za a sauke abin da ya haifar kai tsaye zuwa uwar garken.
Bayan na gama aikin, sai na fara tunanin menene zaɓina. Aikin ya kasance mai rikitarwa saboda gaskiyar cewa ba na so in rabu da yanayin cewa aikin ya kasance mai tsabta na gaba-gaba, ba tare da wani ƙarshen baya ba. Tabbas, mafita mafi sauƙi shine cire nodejs da tilasta shi don samar da tarihin tare da saiti ta amfani da hanyoyin haɗin kai tsaye.
A gaskiya, babu zaɓuɓɓuka da yawa. Fiye da gaske, daya ne kawai ya zo a zuciya. Muna buƙatar saita saiti kuma mu sami hanyar haɗin da za mu iya kwafi zuwa na'ura mai ba da hanya tsakanin hanyoyin sadarwa don samun zip archive.
Fayilolin rubutu da yawa a cikin rumbun adana bayanan zip ɗin sun yi nauyi kaɗan, a zahiri ƴan kilobytes. Mahimmin bayani shine samun kirtani na base64 daga rumbun ajiyar zip ɗin da aka samar kuma jefa shi cikin buffer, yayin da ke kan sabar tare da umarni a cikin na'ura wasan bidiyo.

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

za mu iya ƙirƙirar wannan fayil ɗin zip iri ɗaya.

nginxconfig.io An rubuta shi a cikin AngularJS, Ba zan iya tunanin ko wane kilomita na lambar da za a buƙaci ba idan marubucin bai zaɓi tsarin js mai amsawa ba. Amma zan iya kwatanta yadda mafi sauƙi kuma mafi kyawun duk waɗannan za a iya aiwatar da su a cikin VueJS, kodayake wannan batu ne mabanbanta.
A cikin albarkatun aikin muna ganin hanya don ƙirƙirar tarihin 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',
	});
};

komai abu ne mai sauqi qwarai, ta amfani da ɗakin karatu jszip Ana ƙirƙiri zip inda aka sanya fayilolin sanyi. Bayan ƙirƙirar zip archive, js yana ciyar da shi zuwa mai bincike ta amfani da ɗakin karatu FileSaver.js:

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

inda abun ciki shine sakamakon abin tonon sililin na zip archive.

Ok, duk abin da zan yi shi ne ƙara wani maɓalli kusa da shi kuma lokacin da na danna shi, ba zan adana sakamakon zip archive zuwa mai binciken ba, amma in sami lambar base64 daga gare ta. Bayan na ɗan ɗanɗana kaɗan, na sami hanyoyi guda biyu, maimakon saukar daZip ɗaya kawai:

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

Kamar yadda ƙila kun lura, na matsar da tsarar tarihin zip ɗin kanta zuwa hanyar ƙirƙirarZip masu zaman kansu, da sauransu. Wannan AngularJS ne, kuma marubucin da kansa ya tsaya tsayin daka ga sake kira kuma bai aiwatar da shi ta hanyar alkawuran ba. downloadZip har yanzu yana ajiyeAs azaman fitarwa, yayin da downloadBase64 yayi wani abu daban. Mun ƙirƙiri wani abu na FileReader wanda ya zo mana a cikin html5 kuma ya riga ya kasance m don amfani. Wanne, a lokaci guda, zai iya yin kirtani mai tushe64 daga ƙulli, ko kuma, yana yin kirtani na DataURL, amma wannan ba shi da mahimmanci a gare mu, saboda DataURL ya ƙunshi ainihin abin da muke buƙata. Bingo, ɗan kamanni yana jirana lokacin da na yi ƙoƙarin sanya duk wannan a cikin ma'ajin. Marubucin ya yi amfani da ɗakin karatu a cikin aikin clipboardjs, wanda ke ba ka damar yin aiki tare da allon allo ba tare da walƙiya ba, dangane da rubutun da aka zaɓa. Da farko, na yanke shawarar sanya tushe64 a cikin wani abu mai nuni: babu;, amma a wannan yanayin ba zan iya sanya shi a kan allo ba saboda babu rabuwa da ke faruwa. Saboda haka, maimakon nuni: babu; na yi

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

wanda ya ba ni damar ɓoye abubuwan daga gani kuma a zahiri bar shi a shafin. Voila, an gama aikin, lokacin da na danna maɓalli na, an sanya layi kamar wannan a cikin buffer:

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

wanda kawai na liƙa a cikin na'ura mai kwakwalwa akan uwar garken kuma nan da nan na karɓi zip archive tare da duk saitunan.
Kuma, ba shakka, na aika buƙatun jan hankali ga marubucin, saboda ... aikin yana aiki kuma mai raye-raye, Ina so in ga sabuntawa daga marubucin kuma in sami maɓallin kaina) Ga masu sha'awar, anan shine cokali mai yatsa na aikin da kaina cire takaddama, inda za ku ga abin da na gyara / kara.
Ci gaba mai dadi kowa)

Ƙirƙirar saiti don nginx, tarihin buƙatun ja ɗaya

source: www.habr.com

Add a comment