د نګینکس لپاره د تشکیلاتو رامینځته کول ، د یو پل غوښتنې تاریخ

سلامونه ملګرو. زما په جنګي سرورونو کې ښکلی نګینکس د 2006 راهیسې روان دی او د دې ادارې په کلونو کې ما ډیری تشکیلات او ټیمپلیټونه راټول کړي دي. ما د نګینکس ډیره ستاینه وکړه او یو څه دا معلومه شوه چې ما حتی په مرکز کې د نګینکس هب هم پیل کړ، هم، ښکاره کړه m/
ملګرو له ما څخه وغوښتل چې د دوی لپاره یو پراختیایی فارم جوړ کړم، او د دې پرځای چې دوی خپل ځانګړي ټیمپلیټونه راوباسئ، ما یوه په زړه پورې پروژه یاد کړه. nginxconfig.io، کوم چې په الماریو کې تشکیلات توزیع کوي او د لیټ کوډ کولو لپاره هرڅه چمتو کوي ، او داسې نور. ما فکر وکړ، ولې نه؟ په هرصورت، زه د دې حقیقت څخه په غوسه شوی وم چې nginxconfig ما ته وړاندیز کوي چې په براوزر کې د زپ آرشیف ډاونلوډ کړم، پرته له دې چې ما ته اجازه راکړئ چې دا مستقیم سرور ته د wget/fetch/curl په کارولو سره اپلوډ کړم. څه بې معنی، ولې زه دا په براوزر کې اړتیا لرم، زه دا د کنسول څخه سرور ته اړتیا لرم. په غوسه ، زه ګیتوب ته لاړم ترڅو د پروژې زړورتیا وګورم ، کوم چې د هغې د فورک لامل شو او په پایله کې ، د پلې کولو غوښتنه. کوم چې زه به یې په اړه نه لیکم که دا په زړه پوري نه وي 😉

د نګینکس لپاره د تشکیلاتو رامینځته کول ، د یو پل غوښتنې تاریخ

البته ، مخکې له دې چې سرچینو ته کیندل ، ما ولیدل چیرې چې کروم د تشکیلاتو سره رامینځته شوی زپ آرشیف راوباسي ، او هلته د "بلاب:" سره پیل شوی پته زما په تمه و ، اوه. دا لا دمخه روښانه شوې چې خدمت په لاره کې هیڅ شی نه تولیدوي، په حقیقت کې، دا ټول د js لخوا ترسره شوي. په حقیقت کې، د زپ آرشیف پخپله د پیرودونکي، براوزر، او جاوا سکرپٹ لخوا تولید شوی. هغوی. ښکلا دا ده چې پروژه ده nginxconfig.io په ساده ډول د html پاڼې په توګه خوندي کیدی شي، ځینې ته پورته شوي narod.ru او دا به کار وکړي) دا خورا مسخره او په زړه پوري حل دی ، په هرصورت ، دا د سرورونو تنظیم کولو لپاره خورا ګران کار دی ، په حقیقت کې د هغه څه لپاره چې دا پروژه رامینځته شوې. تولید شوی آرشیف د براوزر سره ډاونلوډ کړئ، او بیا یې په 2019 کې د NC په کارولو سره سرور ته انتقال کړئ؟ ما خپل ځان ته د یوې لارې موندلو دنده وټاکه چې پایلې یې مستقیم سرور ته ډاونلوډ کړئ.
د پروژې د پیل کولو وروسته، ما د دې په اړه فکر پیل کړ چې زما اختیارونه څه وو. کار د دې حقیقت له امله پیچلی و چې ما نه غوښتل له دې شرط څخه انحراف وکړم چې پروژه باید یو خالص مخکی پاتې شي، پرته له کوم شاته پای. البته، ترټولو ساده حل به دا وي چې نوډز راوباسئ او دې ته مجبور کړئ چې د مستقیم لینکونو په کارولو سره د تشکیلاتو سره آرشیف رامینځته کړي.
په حقیقت کې، ډیری اختیارونه نه وو. ډیر دقیق، یوازې یو ذهن ته راغی. موږ اړتیا لرو چې تشکیلات تنظیم کړو او یو لینک ترلاسه کړو چې موږ کولی شو د سرور کنسول ته کاپي کړو ترڅو د زپ آرشیف ترلاسه کړو.
په پایله کې د زپ آرشیف کې ډیری متن فایلونه یو څه وزن لري، په لفظي توګه یو څو کیلوبایټ. ښکاره حل دا و چې د تولید شوي زپ آرشیف څخه د بیس 64 تار ترلاسه کړئ او بفر ته یې وغورځوئ، پداسې حال کې چې په سرور کې په کنسول کې د قوماندې سره

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

موږ کولی شو ورته zip فایل جوړ کړو.

nginxconfig.io په AngularJS کې لیکل شوی و، زه حتی تصور هم نشم کولی چې کوم کیلومتره کوډ ته اړتیا وه که لیکوال د عکس العمل js چوکاټ غوره کړی نه وي. مګر زه په بشپړ ډول تصور کولی شم چې دا ټول په VueJS کې څومره ساده او ډیر ښکلي پلي کیدی شي ، که څه هم دا یو بشپړ مختلف موضوع ده.
د پروژې سرچینو کې موږ د زپ آرشیف رامینځته کولو لپاره میتود ګورو:

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

هرڅه خورا ساده دي، د کتابتون په کارولو سره jszip یو زپ رامینځته کیږي چیرې چې د تنظیم کولو فایلونه ځای په ځای شوي. د زپ آرشیف رامینځته کولو وروسته ، js د کتابتون په کارولو سره براوزر ته فیډ کوي FileSaver.js:

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

چیرې چې مینځپانګه د زپ آرشیف پایله لرونکی بلاب څیز دی.

سمه ده، ټول هغه څه چې ما باید ترسره کول د هغې تر څنګ بله تڼۍ اضافه کړه او کله چې ما په هغې کلیک وکړ، زه به د پایلې زپ آرشیف براوزر ته خوندي نه کړم، مګر د بیس 64 کوډ ترلاسه کړم. د یو څه شاوخوا تیرولو وروسته ، ما د یو ډاونلوډ زپ پرځای ، 2 میتودونه ترلاسه کړل:

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

لکه څنګه چې تاسو شاید لیدلي وي، ما د زپ آرشیف نسل پخپله د شخصي generateZip میتود ته لیږدول، او داسې نور. دا AngularJS دی، او لیکوال پخپله د کال بیکونو سره تړلی دی او د ژمنو له لارې یې نه دی پلي کړی. ډاونلوډ زپ لاهم د محصول په توګه خوندي کړی ، پداسې حال کې چې ډاونلوډ بیس 64 یو څه توپیر درلود. موږ د فایل ریډر څیز رامینځته کوو چې موږ ته په html5 کې راغلی او لا دمخه کافي دی د لاسرسي وړ د استعمال لپاره. کوم چې په یو وخت کې کولی شي د بلاب څخه بیس 64 تار جوړ کړي، یا بلکه، دا د ډیټا یو آر ایل تار جوړوي، مګر دا زموږ لپاره دومره مهم ندي، ځکه چې DataURL هغه څه لري چې موږ ورته اړتیا لرو. بنګو، یو کوچنی خنډ زما په تمه و کله چې ما هڅه وکړه چې دا ټول په بفر کې واچوم. لیکوال په پروژه کې کتابتون کارولی clipboardjs، کوم چې تاسو ته اجازه درکوي د ټاکل شوي متن پراساس د فلش شیانو پرته د کلپ بورډ سره کار وکړئ. په پیل کې ، ما پریکړه وکړه چې خپل بیس 64 په یو عنصر کې د ښودنې سره وساتم: هیڅ نه؛ مګر پدې حالت کې زه نشم کولی دا په کلپ بورډ کې واچوم ځکه چې هیڅ جلاوالی نه پیښیږي. نو، د ښودلو پر ځای: none; زه

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

کوم چې ما ته اجازه راکړه چې عنصر له لید څخه پټ کړم او په حقیقت کې یې په پاڼه کې پریږدم. Voila، دنده بشپړه شوه، کله چې ما په خپل تڼۍ کلیک وکړ، د دې په څیر یوه کرښه په بفر کې کیښودل شوه:

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

کوم چې ما په ساده ډول په سرور کې کنسول کې پیسټ کړ او سمدلاسه یې د ټولو تشکیلاتو سره د زپ آرشیف ترلاسه کړ.
او البته، ما لیکوال ته د پلټ غوښتنه لیږلې، ځکه چې ... پروژه فعاله او ژوندۍ ده، زه غواړم د لیکوال څخه تازه معلومات وګورم او زما خپل تڼۍ ولرم) د لیوالتیا لپاره، دلته دی زما فورک پروژه او پخپله غوښتنه وغواړئ، چیرې چې تاسو لیدلی شئ هغه څه چې ما سم کړي / اضافه کړي.
ټولو ته دې پرمختګ مبارک وي)

د نګینکس لپاره د تشکیلاتو رامینځته کول ، د یو پل غوښتنې تاریخ

سرچینه: www.habr.com

Add a comment