Как вы пишите скрипты большого объема?

Обсуждение оборудования и его настройки
Ответить
Frozer
Сообщения: 49
Зарегистрирован: 01 апр 2013, 13:35

Не впервые натыкаюсь на ограничение в текстовом объеме скриптов при импорте в Winbox (просто обрезается лишнее). В основном это решалось тщательной оптимизацией и сокращением имен переменных (до непонятных), удалением комментариев, но вот настал момент, когда сокращать уже некуда. Функционала, аналогичного функции include в PHP, у Router OS нет, так что на несколько файлов делить возможности нет (да и не хотелось бы)...

На сайте разработчика пишут, что ограничение Winbox можно обойти импортируя скрипт из файла. Это действительно так, ограничение уже в 50Кб и в общем-то этого было бы достаточно (правда не знаю, чего оно касается, объема файла или объема данных после парсинга).

Даже импортируя скрипт из файла есть неудобства: 1. Либо надо писать сразу скрипты в форме, подходящей для импорта (с символами переноса строки, причем в конце еще и добавлять слеш, а так же "эскейпить" все остальные спецсимволы), либо писать в редакторе, а потом конвертировать в формат удобный для импорта (причем конвертера я не нашел такого, попробовал написать его на ROS, но тут вообще на файлы более ~4Кб ругань)... 2. Стоить "отредактировать" скрипт в Winbox, он его тут же тут же порежет килобайт до 30... 3. Неудобно. Конвертер не нашел, написал сам на PHP, загружаю файл в обработчик, скачиваю сконвертированный для импорта в ROS, импортирую ROS - работает. Но это масса лишних телодвижений, дебаг отнимает много времени.

И вообще несколько раз обращался к разработчику что-бы повысили ограничение в ВинБокс - бесполезно, не понимаю в чем причина... Может в 7й версии получше станет...

Может есть какой-то более удобный способ?

Вот на всякий случай конвертер на PHP
 

Код: Выделить всё

<?
// папка на сервере относительно корня, куда ложить сконвертированные скрипты
$dst_folder = "/export/";
?>

<html>
 <head>
  <meta charset="utf-8">
  <title>Преобразование текста в скрипт Mikrotik.</title>
 </head>
 <body>

<form name="upload" enctype="multipart/form-data" method="post" action="./<?=basename(__FILE__)?>?filter">
<p><b>Имя файла для импорта скрипта (расширение .rsc будет создано автоматически):</b></br>
<input type="text" name="dst_file_rsc" size="40"<? if (isset($_REQUEST["dst_file_rsc"])) echo " value=\"" . htmlspecialchars($_REQUEST["dst_file_rsc"], ENT_QUOTES) . "\""; ?>></p>   
<p><b>Имя скрипта для импорта в ROS:</b></br>
<input type="text" name="script_name" size="40"<? if (isset($_REQUEST["script_name"])) echo " value=\"" . htmlspecialchars($_REQUEST["script_name"], ENT_QUOTES) . "\""; ?>></p> 
<input type="file" name="file1">
<input class="preview_btn" type="submit" value="Загрузить">
</form>

<?
	$errors = $ok_message = array();

	if (!empty($_REQUEST) && isset($_REQUEST["filter"])) {
		if (empty($_REQUEST["dst_file_rsc"]) || empty($_REQUEST["script_name"])) {
			$errors[] = "Отсуствуют обязательные параметры!";
			
		} else {
			if (!preg_match("/^[\w]+$/", $_REQUEST["dst_file_rsc"])) $errors[] = "Неверное имя для файла!";
			if (!preg_match("/^[\w]+$/", $_REQUEST["script_name"])) $errors[] = "Неверное имя для скрипта!";
			if (strlen($_REQUEST["dst_file_rsc"]) > 30) $errors[] = "Слишком длинное имя файла!";
			if (strlen($_REQUEST["script_name"]) > 30) $errors[] = "Слишком длинное имя скрипта!";
			if (empty($_FILES["file1"]["tmp_name"])) $errors[] = "Не прикреплен файл!";
		}
		
		if (empty($errors)) {
			$counter = 0;
			$handle = @fopen($_FILES["file1"]["tmp_name"], "r");
			if ($handle) {
				while (($buffer = fgets($handle, 4096)) !== false) {
					if ($counter != 0) $file_content .= $buffer;
					$counter++;
				}
				if (!feof($handle)) {
					$errors[] = "Ошибка: fgets() неожиданно потерпел неудачу";
				}
				fclose($handle);
			} else {
				$errors[] = "Ошибка открытия файла";
			}
			
			if (empty($errors) && $file_content != "") {
				$file_content = str_replace (
				array("\\","\"","\$","\?","\n","\r","\t","\a","\b","\f","\v"),
				array("\\\\","\\\"","\\\$","\\\?","\\n","\\r\\\r\n","\\t"),
				$file_content
				);
			$file_content = "/system script add dont-require-permissions=no name=MWAN owner=admin policy=\\\r\nftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\"\\\r\n" . $file_content . "\"";
			
			$file_path = $dst_folder . $_REQUEST["dst_file_rsc"] . ".rsc";
			$handle = @fopen($_SERVER["DOCUMENT_ROOT"] . $file_path, "w+");
				if ($handle) {
					if (fwrite($handle, $file_content) === FALSE) {
						$errors[] = "Не могу произвести запись в файл";
					}
					fclose($handle);
				} else {
					$errors[] = "Ошибка открытия файла для записи";
				}
			}
			
		}
		
		if (!empty($errors)) {
			echo "<p class=\"error\">" . implode("<br/>", $errors) . "</p>\r\n";
		} elseif (!empty($ok_message)) {
			echo "<p class=\"ok_message\">" . implode("<br/>", $ok_message) . "</p>\r\n"; 
		}
		
		if (empty($errors)) {
?>
<p>Ссылка на файл: <a href="<? echo $file_path; ?>"><b>Скачать</b></a></p>
<?
		}
	}
?>


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Да собственно, никак не обходим. Вон пользуемся короткими скриптами, функции пишет часть опытных юзеров (Sertik очень наловчился с этим управляться), глобальные переменные в помощь. Да, собственно, и нет сейчас необходимости в огромных скриптах. Что там описывать?


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить