dig/nslookup команды (работа с dns)

nslookup redhat.com
nslookup -query=mx redhat.com
nslookup -type=ns redhat.com
nslookup -type=soa redhat.com
nslookup -type=any google.com
nslookup 209.132.183.181
nslookup redhat.com ns1.redhat.com
nslookup -port 56 redhat.com
nslookup -timeout=10 redhat.com
nslookup -debug redhat.com

------------------------------
The dig command output has the following sections:
  • Header: This displays the dig command version number, the global options used by the dig command, and few additional header information.
  • QUESTION SECTION: This displays the question it asked the DNS. i.e This is your input. Since we said ‘dig redhat.com’, and the default type dig command uses is A record, it indicates in this section that we asked for the A record of the redhat.com website
  • ANSWER SECTION: This displays the answer it receives from the DNS. i.e This is your output. This displays the A record of redhat.com
  • AUTHORITY SECTION: This displays the DNS name server that has the authority to respond to this query. Basically this displays available name servers of redhat.com
  • ADDITIONAL SECTION: This displays the ip address of the name servers listed in the AUTHORITY SECTION.
  • Stats section at the bottom displays few dig command statistics including how much time it took to execute this query

  • +nocomments – Turn off the comment lines
  • +noauthority – Turn off the authority section
  • +noadditional – Turn off the additional section
  • +nostats – Turn off the stats section
  • +noanswer – Turn off the answer section (Of course, you wouldn’t want to turn off the answer section)

dig redhat.com
dig redhat.com +nocomments +noquestion +noauthority +noadditional +nostats
dig redhat.com +noall +answer
dig redhat.com  MX +noall +answer
dig -t MX redhat.com +noall +answer
dig redhat.com NS +noall +answer
dig -t NS redhat.com +noall +answer
dig redhat.com ANY +noall +answer
dig -t ANY redhat.com  +noall +answer
dig redhat.com +short
dig redhat.com ns +short
dig -x 209.132.183.81 +short
dig -x 209.132.183.81
dig @ns1.redhat.com redhat.com

vi names.txt
dig -f names.txt +noall +answer
dig -f names.txt MX +noall +answer
dig redhat.com mx +noall +answer centos.org ns +noall +answer

--------------

freebsd 10 по умолчанию не имеет nslookup, dig. искать в
/usr/ports/dns/bind-tools

Скрипт на питоне для мониторинга трафика на шлюзе и отдельном хосте

0. Возможности скрипта
— мониторинг трафика по подсети, списку ip адресов, отдельному ip
— отображение суммарной нагрузки на канал. Общая и раздельная по каждому ip
— суммарный объем трафика за все время измерений. Общий и раздельный по каждому ip
— сортировка вывода по нагрузке и объему трафика
— переключение между входящим и исходящим трафиком
— веселые, белые полоски, для удобочитаемости

1. Системные требования
— установленный в системе интерпретатор языка питон. Данный скрипт написан под версию 2.7
— для нормального функционирования должны быть установлены следующие библиотеки для питона:
     — pcap
     — curses
     — dpkt

2. Настройки скрипта
Настройки скрипта осуществляются путем изменения переменных в тексте самого скрипта.

chanel_width — ширина канала. Необходимо для правильного отображения нагрузки.
Считается по следующей формуле (ширина канала в mbits)*1024*1024/50
chanel_width = 209715
ip_adress — здесь указывается подсеть, список ip адресов, разделенных запятой или одиночный ip.
ip_adress = '192.168.1.'
iface_name — название сетевого интерфейса, на котором осуществляется мониторинг.
iface_name='xl0'
net_type — тип мониторинга. net — мониторинг подсети, list — список ip, host — одиночный хост, не являющийся шлюзом.
net_type = 'net'

3.Управление
Управление осуществляется через функциональные клавиши и они таковы:
    -[d] переключение между входящим и исходящим трафиком
    -[s] включить/выключить веселые полоски
    -[m] сортировать по загруженности канала
    -[t] сортировать по суммарному объему трафика
    -[u] отключить сортировку
    -[q] выход
 
4.Внешний вид
Без веселых полосок

 
С веселыми полосками

 
5. Код скрипта

Читать дальше →

Обновление временной зоны в OpenBSD. Добавляем RTZ 2

1. Проверяем файл с описанием зоны на предмет наличия указаний по коррекции времени.

root:~->zdump -v /etc/localtime
...
/etc/localtime  Sat Mar 27 22:59:59 2010 UTC = Sun Mar 28 01:59:59 2010 MSK isdst=0
/etc/localtime  Sat Mar 27 23:00:00 2010 UTC = Sun Mar 28 03:00:00 2010 MSD isdst=1
/etc/localtime  Sat Oct 30 22:59:59 2010 UTC = Sun Oct 31 02:59:59 2010 MSD isdst=1
/etc/localtime  Sat Oct 30 23:00:00 2010 UTC = Sun Oct 31 02:00:00 2010 MSK isdst=0
/etc/localtime  Sat Mar 26 22:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 MSK isdst=0
/etc/localtime  Sat Mar 26 23:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 MSK isdst=0
/etc/localtime  Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 07:14:07 2038 MSK isdst=0
/etc/localtime  Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 07:14:07 2038 MSK isdst=0

Указаний по коррекции времени в 2014 году в текущем файле зоны нет, посему переходим ко второму пункту.

Если мы наблюдаем в выводе zdump'a нижеследующее — ничего делать не надо, все и так в порядке.

/etc/localtime  Sat Oct 25 21:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 MSK isdst=0
/etc/localtime  Sat Oct 25 22:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 MSK isdst=0


Читать дальше →

Удаление плагина консоли администрирования Kaspersky KSC

Для управления ПО от Каспеского при помощи KSC требуется установить актуальный плагин администрирования для этого ПО. Обычно он устанавливается вместе с пакетом, стоит себе и каши не просит, но, если выходит новая версия этого ПО, с новым плагином, то новый плагин не может быть установлен, пока не будет удален старый. Удалить плагин можно так, как описано в соответствующей статье базы знаний.

В общем, я решил немного автоматизировать этот процесс, чтоб в реестре не ковыряться, и сварганил такой скриптик:
$PlugNameMask="*Антивирус Касперского 8.0 для Windows Servers Enterprise*"
$Cred=Get-Credential dom\useradmin
if ((gwmi win32_processor).AddressWidth — 32) {
$RegPath=«HKLM:\SOFTWARE\Wow6432Node\KasperskyLab\Components\28\Plugins»
}
else {
$RegPath=«HKLM:\SOFTWARE\KasperskyLab\Components\28\Plugins»
}
dir HKLM:\SOFTWARE\Wow6432Node\KasperskyLab\Components\28\Plugins| Get-ItemProperty| select DisplayName, UninstallString|? {$_.DisplayName -like $PlugNameMask} |
%{
$UnInstStrgs = "$($_.UninstallString)" -split " ",2
$Cmd=$UnInstStrgs[0]
$Args=$UnInstStrgs[1]
Start-Process "$Cmd" -ArgumentList $Args -Credential $Cred
}

пустячок, а приятно ;)

Скрипт на питоне для архивирования данных. С конфигом и ведением логов.

0. Возможности скрипта.
— архивация выбранных каталогов
— дамп выбранных баз mysql
— локальное копирование архивов
— копирование архивов через sftp на удаленную машину
— логирование операций

1. Системные требования.
— Установленный в системе интерпретатор языка питон. Данный скрипт написан под версию 2.7
— Библиотека paramiko, необходимая питону для работы с sftp.
Взять ее можно здесь www.paramiko.org


Читать дальше →

Отсутствует доступ к общей папке при обращении к ней по пути DFS

Обратил внимание на то, что у новых пользователей, которые начинают работать за старыми компьютерами (теми, на которых ранее работали другие пользователи) с Windows 7, происходит отказ в доступе к некоторым сетевым папкам, при обращении к ним через DFS. Т.е. при обращении к папке по пути \\server1\share1 доступ есть, а при обращении к той же папке через \\Domain\DFSRoot\DFSLink1 получаем отказ в доступе. При этом доступ к другим сетевым папкам, расположенным на том же сервере при обращении к ним через DFS есть (например, никаких проблем нет при доступе к \\server1\share2 через \\Domain\DFSRoot\DFSLink2). Оказалось, что причиной такого странного поведения является кэш автономных файлов на стороне клиента. Доступ появляется, если на стороне клиента выключить кэширование автономных файлов, и пропадает снова после его включения. Т.е. что-то «засахарилось» в кэше автономных файлов, что не дает обратиться к сетевой папке по DFS-пути. Посему
1)чистим кэш автономных файлов и перезагружаем клиента (http://support.microsoft.com/kb/942974)
2)профит

Как сохранять видео с Youtube, Vimeo, Facebook и прочих видеохостингов.

Во всех современных версиях браузера Internet Explorer есть замечательный инструмент «Средства разработчика», который вызывается по кнопке F12.
Этот инструмент позволяет делать огромное количество интересных вещей. Например, сохранять потоковое видео с видеохостингов Youtube, Vimeo, Facebook и прочих.

Перед сохранением рекомендую закрыть все остальные вкладки браузера, что бы лишние сайты не мешали анализу.
Вызываем окно средств разработчика, переходим в закладку «Сеть» и в зависимости от версии браузера нажимаем «начать сбор» или на кнопку в виде зеленого треугольника.
Заходим на нужную страницу видеохостинга и начинаем просмотр. Обычно даже нет необходимости дожидаться конца загрузки видео.
Останавливаем сбор траффика в средствах разработчика, и выбираем большой по размеру объект в несколько килобайт или мегабайт. Нажимаем на нём правой кнопкой и выбираем «скопировать URL-адрес».
Для Vimeo у меня получился вот такой адрес — http://pdl.vimeocdn.com/46595/158/20435435353473.mp4?token2=49773535445523434467843&aksessionid=e99af67537925, это адрес видео.
C Youtube немного сложнее. Плеер скачивает по кускам видео и звук отдельно, но это не проблема.
В логах будет несколько объектов размером по полтора мегабайта и около 200 кмлобайт. Первое — видео, второое — аудио.
Берем любой адрес видео, копируем в блокнот и ищем в середине хитрый параметр
...&mt=1404904408&mv=m&mws=yes&range=6266880-8355839&ratebypass=yes&signature=4432BD630E39…
Это временной интервал, меняем его на «range=0-999999999999» и получаем адрес видео.
С аудио тоже самое. С помощью VLC можно просмотреть видео с аудиодорожкой.

Если просто ввести адрес в строке браузера, он его может не сохранить, а начать проигрывать. Поэтому я применяю для сохранения следующий трюк — открываю MS Word, копирую в пустой документ этот адрес, нажимаю после ссылки пробел или ентер, что бы это превратилось в ссылку и сохраняю полученный документ как веб-страницу. Открыв полученную страницу в браузере теперь можно будет нажать на ссылке правой кнопкой и сохранить объект. При необходимости переименуйте файл, установив расширение mp4 или иное расширение видео-файлов.

Парсинг письма в OutLook

Простенький пример макроса в Outlook, который демонстрирует работу с регулярными выражениями, парсинг тела письма и взаимодействие с Excel.
У меня этот макрос используется для личного учёта заявок на определённые работы. Макрос работает на выделенное письмо (не открытое).
Очень важное замечание — данные вставляются в активную книгу Excel. Так что если открыто несколько книг, то могут быть косяки=) Если Excel не запущен, то откроется целевой файл.
Тело письма выглядит так:

Данные, которые нужны для учёта — дата, время начала, время окончания и адрес сервера

Sub ServerNameSelect()
    Dim DoW As String 'Дата начала работ
    Dim lastrow As Long 'переменная поиска последней строки в Excel
    
    Dim olItem As Outlook.MailItem 'переменная, определяющая письмо
    Dim sText As String 'массив данных для поиска соответствий регекспов
    
    Dim Excel As Object
    Dim ExcelBook As Object
    
    Set olItem = ActiveExplorer.Selection.Item(1)
    sText = olItem.Body
    On Error Resume Next
    DoW = CStr(Year(Now))
    Set Excel = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then
        Set Excel = CreateObject("Excel.Application")
        Excel.Visible = True
        Set ExcelBook = Excel.Workbooks.Open("C:\test\works.xlsm")
        Set worksheet = Excel.Application.ActiveSheet
        lastrow = worksheet.Cells(worksheet.Rows.Count, 1).End(xlUp).Row + 1
        worksheet.Cells(lastrow, 4).Value = SN(sText)
        worksheet.Cells(lastrow, 1).Value = CDate(WT(sText) & " " & DoW)
        worksheet.Cells(lastrow, 2).Value = TB(sText)
        worksheet.Cells(lastrow, 3).Value = TE(sText)
    Else
        Set worksheet = Excel.Application.ActiveSheet
        lastrow = worksheet.Cells(worksheet.Rows.Count, 1).End(xlUp).Row + 1
        worksheet.Cells(lastrow, 4).Value = SN(sText)
        worksheet.Cells(lastrow, 1).Value = CDate(WT(sText) & " " & DoW)
        worksheet.Cells(lastrow, 2).Value = TB(sText)
        worksheet.Cells(lastrow, 3).Value = TE(sText)
    End If
    On Error GoTo 0
    
    
    'MsgBox (SN(sText) & vbCr & WT(sText) & vbCr & TB(sText) & vbCr & TE(sText))
End Sub
 'Адрес инстанса
Function SN(strData As String) As String
    Dim RE As Object, REMatches As Object
     
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\w{2}\-\w{3}\-\w\d+\\\w+)"
    End With
     
    Set REMatches = RE.Execute(strData)
    SN = REMatches(0)
     Exit Function
     
End Function
'Дата работ
Function WT(strData As String) As String
    Dim RE As Object, REMatches As Object
     
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d{1,2}\s[\wа-яА-ЯёЁ]{3,10})"
    End With
     
    Set REMatches = RE.Execute(strData)
    WT = REMatches(0)
    Exit Function
     
End Function
'Время начала
Function TB(strData As String) As String
    Dim RE As Object, REMatches As Object
     
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d{2}\:\d{2})"
    End With
     
    Set REMatches = RE.Execute(strData)
    TB = REMatches(0)
     Exit Function
     
End Function
'Время окончания
Function TE(strData As String) As String
    Dim RE As Object, REMatches As Object
     
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d{2}\:\d{2})"
    End With
     
    Set REMatches = RE.Execute(strData)
    TE = REMatches(1)
     Exit Function
     
End Function


Макрос не лишён недостатков, но общие принципы должны быть понятны=)

ЗЫ: макросом пользуюсь уже месяцев 7.
для работы необходимо подключить следующие библиотеки

NopCommerce: Подстановка города.

В недавнем посте я приводил пример импорта областей России в CMS NopCommerce.
Так же, как и в Википедии, у меня в списке областей присутствуют города Москва, Санкт-Петербург и Севастополь.
Это выглядит логичным, но порождает небольшую проблему интерфейса: при выборе города Москва поле «город» остается пустым и требуется доввести туда город.
Исправить эту мелкую ошибку достаточно просто небольшим дописыванием на JavaScript. В файлы _CreateOrUpdateAddress.cshtml и _CreateOrUpdateAddress.Mobile.cshtml надо внести следующее изменение:

<script type="text/javascript">
$(function () {

	$("#@Html.FieldIdFor(model => model.CountryId)").change(function () {
		var selectedItem = $(this).val();
		var ddlStates = $("#@Html.FieldIdFor(model => model.StateProvinceId)");
		var statesProgress = $("#states-loading-progress");
		statesProgress.show();
		$.ajax({
			cache: false,
			type: "GET",
			url: "@(Url.RouteUrl("GetStatesByCountryId"))",
			data: { "countryId": selectedItem, "addEmptyStateIfRequired": "true" },
			success: function (data) {
				ddlStates.html('');
				$.each(data, function (id, option) {
					ddlStates.append($('<option></option>').val(option.id).html(option.name));
				});
				statesProgress.hide();
			},
			error: function (xhr, ajaxOptions, thrownError) {
				alert('Failed to retrieve states.');
				statesProgress.hide();
			}
		});
// Начало добавления
		
		var StateProvinceText = $("#Address_CountryId option:selected").text();
		if(!StateProvinceText)  {
			var StateProvinceText = $("#NewAddress_CountryId option:selected").text();
		}
		
		if (StateProvinceText == 'Россия' ) {
			$('#Address_City').attr('value', 'Москва');
			$('#NewAddress_City').attr('value', 'Москва');
		}
		if (StateProvinceText == 'Russia' ) {
			$('#Address_City').attr('value', 'Moscow');
			$('#NewAddress_City').attr('value', 'Moscow');
		}
	});

	$("#@Html.FieldIdFor(model => model.StateProvinceId)").change(function () {
		var StateProvinceText = $("#Address_StateProvinceId option:selected").text().replace("г. ", "");
		if(!StateProvinceText)  {
			var StateProvinceText = $("#NewAddress_StateProvinceId option:selected").text().replace("г. ", "");
		}

		if (StateProvinceText == 'Москва' || 
			StateProvinceText == 'Санкт-Петербург' ||
			StateProvinceText == 'Севастополь' || 
			StateProvinceText == 'Moscow' || 
			StateProvinceText == 'Saint Petersburg' || 
			StateProvinceText == 'Sevastopol') {
				$('#Address_City').attr('value', StateProvinceText);
				$('#NewAddress_City').attr('value', StateProvinceText);
		}
// Конец добавления 
	});
});
</script>

В первой половине добавленного кода производится установка города по умолчанию (Москва)

NopCommerce и почта России. Часть 2. Прописываем тарифы.

Часть 2. Прописываем тарифы.
Это — вторая часть серии постов, посвященная настройке CMS на основе NopCommerce для работы с почтой России.

Что бы внести тарифы на доставку с помощью Почты России, достаточно воспользоваться стандартным модулем расчета «Shipping by weight» и небольшим SQL скриптом.

Тарифы Почты России
Само описание тарифов можно посмотреть на сайте Почты России по адресу www.russianpost.ru/rp/servise/ru/home/postuslug/bookpostandparcel/local
Для Москвы тарифы следующие: Россия раздяется на 5 магистральных поясов и доставка до каждого пояса стоит фиксированную сумму за посылку весом до 500 гр. За каждые следующие 500 гр взимается фиксированная доплата.

Стоимости доставки по 1-му магистральному поясу: 149.9 руб + 13.4 за каждые 500 грамм
По 2-му магистральному поясу: 152 руб + 15.6 за каждые 500 грамм
По 3-му магистральному поясу: 158.1 руб + 15.6 за каждые 500 грамм
По 4-му магистральному поясу: 192.6 руб + 22.3 за каждые 500 грамм
По 5-му магистральному поясу: 215 руб + 36.4 за каждые 500 грамм
Эти правила действуют для посылок до 10 кг.

Страховка — 4% от объявленной стоимости посылки.

Использование скрипта

Вначале надо получить нужные коды типа доставки, которые прописаны в Вашей CMS.
Код типа доставки можно посмотреть в таблице [ShippingMethod]. У меня код доставки почтой России — 4, код доставки почтой России со страховкой — 5.

Поэтому для первого запуска скрипта я ставлю @shipping_code = 4, @insurance_percent = 0.
Вторым — @shipping_code = 5, @insurance_percent = 4

Есть три варианта запуска скрипта

Первоначальная настройка с областями из моего списка
Первоначально надо внести список областей, как указано по ссылке на мой предыдущий пост этой серии не модифицируя список оттуда.
После этого можно просто запустить скрипт и получить желаемый результат.

Кроме областей из моего списка есть иные области России
Можно внести список областей, из моего предыдущего поста этой серии и временно или постоянно оставить в работе другие области.
Тогда надо вручную посмотреть в таблице [StateProvince] первый ID области из того списка, раскомментировать строчку /* SET @start_id = ...*/ и внести этот номер.
После этого такой скрипт точно так же можно запустить.
Важно! Список должен быть точно тем же, что и у меня, иначе настройка магистральных поясов собьётся.

У вас уже есть свой список областей, который вы не хотите менять
Устанавливаем следующей командой @start_id в 0
SET @start_id = 0

Переписываем команду INSERT INTO #zones (zone_id, zone_num ) VALUES… под свой набор областей.
Для этого смотрим таблицу [StateProvince], получаем ID областей, распределяем их по магистральным поясам согласно нижеприведенному списку и формируем SQL команду в виде
INSERT INTO #zones (zone_id , zone_num )
     VALUES
	 (110, 1) , (111,1), (112,2) , ...


Здесь первое число — ID области из таблицы [StateProvince], а второе — номер магистрального пояса.
  • 1-й магистральный пояс
    Москва, Брянская обл., Владимирская обл., Вологодская обл., Воронежская обл., Ивановская обл., Калужская обл., Костромская обл., Курская обл., Липецкая обл., Московская обл., Нижегородская, Орловская обл., Рязанская обл., Смоленская обл., Тамбовская обл., Тверская обл., Тульская обл., Ярославская обл.
  • 2-й магистральный пояс
    Санкт-Петербург, Севастополь, Адыгея, Башкортостан, Ингушетия, Кабардино-Балкария, Калмыкия, Карачаево-Черкесия, Карелия, Коми, Крым, Марий Эл, Мордовия, Северная Осетия — Алания, Татарстан, Удмуртия, Чечня, Чувашия, Краснодарский край, Пермский край, Ставропольский край, Архангельская обл., Астраханская обл., Белгородская обл., Волгоградская обл., Калининградская обл., Кировская обл., Ленинградская область, Мурманская обл., Новгородская обл., Оренбургская обл., Пензенская обл., Псковская обл., Ростовская обл., Самарская обл., Саратовская обл., Свердловская обл., Ульяновская обл., Челябинская обл., Ненецкий АО
  • 3-й магистральный пояс
    Алтай, Дагестан, Тыва (Тува), Хакасия, Алтайский край, Красноярский край, Кемеровская обл., Курганская обл., Новосибирская обл., Омская обл., Томская обл., Тюменская обл., Ханты-Мансийский АО — Югра, Ямало-Ненецкий АО
  • 4-й магистральный пояс
    Бурятия, Саха (Якутия), Забайкальский край, Амурская обл., Иркутская обл.
  • 5-й магистральный пояс
    Камчатский край, Приморский край, Хабаровский край, Магаданская обл., Сахалинская обл., Еврейская АО, Чукотский АО

Внимание! Если какие-то изменения в SQL не отображаются на сайте, необходимо нажать «Перезагрузить приложение» в админке. И не забудьте сделать бекап базы данных!

Сам скрипт:
BEGIN TRY

/* Код доставки почтой России - 4. */
DECLARE @shipping_code INT = 4
/* Стоимость страховки */
DECLARE @insurance_percent FLOAT = 0

/* Код магазина. 0 - для всех магазинов */
DECLARE @store_code INT = 0


/* Прописываем тарифы для каждого магистрального пояса */
DECLARE @base_price1 FLOAT = 149.9
DECLARE @delta_price1 FLOAT = 13.4
DECLARE @base_price2 FLOAT = 152
DECLARE @delta_price2 FLOAT = 15.6
DECLARE @base_price3 FLOAT = 158.1
DECLARE @delta_price3 FLOAT = 22.3
DECLARE @base_price4 FLOAT = 192.6
DECLARE @delta_price4 FLOAT = 31.8
DECLARE @base_price5 FLOAT = 215
DECLARE @delta_price5 FLOAT = 36.4

DECLARE @base_price FLOAT
DECLARE @delta_price FLOAT
DECLARE @i INT
DECLARE @russia_code INT
DECLARE @start_id INT
DECLARE @zone_id INT
DECLARE @zone_num INT

SELECT @russia_code = MIN (id) FROM [Country] WHERE [Name] = 'Russia'

/*  Очищаем старые данные  */
DELETE FROM [ShippingByWeight] WHERE [CountryId] = @russia_code and [ShippingMethodId] = @shipping_code

SELECT @start_id = MIN (id) FROM [StateProvince] WHERE [CountryId] = @russia_code
/* SET @start_id = ...*/

/* Создаем временную таблицу и заполняем кодами областей и соответствующими номерами магистральных поясов */
CREATE TABLE  #zones (zone_id INT, zone_num INT)

INSERT INTO #zones (zone_id , zone_num )
     VALUES
(0,1),(38,1),(39,1),(41,1),(42,1),(43,1),(46,1),(49,1),(51,1),(53,1),(55,1),(57,1),(62,1),(66,1),(71,1),(72,1),(73,1),(75,1),(79,1),
(1,2),(2,2),(3,2),(5,2),(8,2),(9,2),(10,2),(11,2),(12,2),(13,2),(14,2),(15,2),(16,2),(18,2),(19,2),(21,2),(23,2),(24,2),(28,2),(30,2),
(32,2),(35,2),(36,2),(37,2),(40,2),(45,2),(48,2),(52,2),(56,2),(58,2),(61,2),(63,2),(64,2),(65,2),(67,2),(68,2),(70,2),(77,2),(78,2),(81,2),
(4,3),(7,3),(20,3),(22,3),(25,3),(29,3),(47,3),(50,3),(59,3),(60,3),(74,3),(76,3),(82,3),(84,3),
(6,4),(17,4),(26,4),(34,4),(44,4),
(27,5),(31,5),(33,5),(54,5),(69,5),(80,5),(83,5)



/* Проходим по всей временной таблице */
DECLARE Zones_Cursor CURSOR FOR
SELECT zone_id, zone_num 
FROM #zones;
OPEN Zones_Cursor ;
FETCH NEXT FROM Zones_Cursor INTO @zone_id, @zone_num;
WHILE @@FETCH_STATUS = 0
   BEGIN
		BEGIN
			/* Определяем параметры тарифа для конкретной области */
			IF  @zone_num = 1  SET @base_price = @base_price1
			IF  @zone_num = 1  SET @delta_price = @delta_price1
			IF  @zone_num = 2  SET @base_price = @base_price2
			IF  @zone_num = 2  SET @delta_price = @delta_price2
			IF  @zone_num = 3  SET @base_price = @base_price3
			IF  @zone_num = 3  SET @delta_price = @delta_price3
			IF  @zone_num = 4  SET @base_price = @base_price4
			IF  @zone_num = 4  SET @delta_price = @delta_price4
			IF  @zone_num = 5  SET @base_price = @base_price5
			IF  @zone_num = 5  SET @delta_price = @delta_price5

			SET @i = 0
			/* Проходим по каждой половине килограмма до 10 кг */
			WHILE @i < 20
				BEGIN
					INSERT INTO [ShippingByWeight]
						([StoreId]
						,[CountryId]
						,[StateProvinceId]
						,[ShippingMethodId]
						,[From]
						,[To]
						,[AdditionalFixedCost]
						,[PercentageRateOfSubtotal]
						,[RatePerWeightUnit]
						,[LowerWeightLimit])
					VALUES (
						@store_code, 
						@russia_code, 
						@start_id + @zone_id , 
						@shipping_code, 
						@i * 500,
                                                (@i + 1) * 500 - 1,
						ROUND (@base_price + @i * @delta_price + 0.499, 0),
						@insurance_percent, 
						0, 
						0)

					SET @i = @i + 1
				END		
		END
		FETCH NEXT FROM Zones_Cursor into @zone_id, @zone_num;
	END;
CLOSE Zones_Cursor ;
DEALLOCATE Zones_Cursor ;

DROP TABLE #zones

END TRY
BEGIN CATCH 
	SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;