C# Отображение суррогатной пары (символа с кодом >FFFF)

Известно, что внутренний формат строк в .NET — UTF16, что значит, что символы из основной многоязыковой плоскости (BMP) Unicode, т.е. с кодом меньше FFFF кодируются одним машинным словом, а остальные символы — двумя, одно из которых т.н. суррогат.

Так вот, как оказалось, с отображением суррогатных пар может возникнуть проблема. Контролы Windows Forms могут воспринимать символ с кодом >FFFF не как один символ, как должно быть, а как два. Для примера пробуем отобразить анатолийский иероглиф

с кодом 0x14476

Как видно, TextBox и Label воспринимают символ, как два символа, и, соответственно, его не отображают, а RichTextBox видит, что это один символ, но не отображает его, даже при правильно заданном шрифте.
MessageBox также отображает символ не как один, а как два:

Устранение проблемы с RichTextBox

Для устранения проблемы с RichTextBox достаточно задать нужный шрифт перед тем, как присвоить свойству Text нужные символы.

         int Code = 0x14476; //анатолийский иероглиф        
        Font AnFont = new Font("Anatolian", 24, FontStyle.Regular,
 GraphicsUnit.Pixel, 1);
        private void Form1_Load(object sender, EventArgs e)
        {
            string strSP = char.ConvertFromUtf32(Code);
            
            lblTest.Font = AnFont;
            txtTest.Font = AnFont;                        
            lblFont.Text = AnFont.FontFamily.Name;
            rtbTest.Font = AnFont;

            lblTest.Text = strSP;
            txtTest.Text = strSP;
            rtbTest.Text = strSP;
        }

PictureBox также отрисовывает нужный символ без проблем:

Корень проблемы

А корень проблемы кроется не в C#, .NET и компонентах Windows Forms, а в самой Windows. Пакет обновления SP1 для Windows 7 решает проблему полностью.

Наиболее универсальное решение

Наиболее универсальным решением является использование RichTextBox для работы с такими символами, во всяком случае, это работает даже для Windows XP, для которой ждать патчей, понятное дело, не приходится.
Главное, не забывать про то, что шрифт надо задавать до вставки/присвоения символа.

Обсуждение на Киберфоруме Копия

Пример
Пример на GitHub

Шрифты поддерживающие весь Unicode-диапазон

Или, во всяком случае, большинство символов.

TWBh: шрифт, поддерживающий большинство символов Unicode
Дополнительно:
Композитный шрифт для BabelMap (TWBhBabelCompositeFont.xml)
Композитный шрифт для WPF (TWBh.CompositeFont)
Композитный шрифт для примера простой Charmap для Unicode и однобайтных кодировок (babel.cf)

Universalia самый распространенный максимально поддерживающий Unicode набор шрифтов Ссылка Magnet

Набор шрифтов с почти полной поддержкой Unicode, собранный неизвестным пользователем интернета Что и как поддердживает каждый файл шрифта, есть описание в тектовом файле. Плюс есть композитный шрифт для тестовой программы.

Программа BabelMap Копия
Самый совершенный Charmap для Unicode, поддерживает композитные шрифты и все диапазоны Unicode

C# Перевод чисел между системами счисления стандартной функцией класса Convert

Да, совсем забыл выложить исходник, спасибо, что напомнили.
Перевести число в/из десятичной в 2, 8, и 16-ричную систему можно с помощью стандартной функции класса Convert
Convert.ToInt64(s, From)
s — строка, содержащая число.
From — основание системы счисления.

Обратное преобразование:
Convert.ToString(n, To)
n — число
To — основание системы счисления.
На выходе будет строка

В примере еще показал, как ограничить ввод в текстовое поле, чтоб можно было вводить только определенные символы, и добавил отображение символа по его коду (в однобайтной кодировке, для Unicode будет погода на Марсе). Числа можно вводить через пробел.

Скачать исходник
Этот и другие примеры на Github

Иконка для своего приложения Windows. Стандартные размеры иконок

И как сделать ICO файл с несколькими изображениями
Спрашивали, как надо правильно делать иконку для своего Windows-приложения.

В первую очередь нужно ее нарисовать, либо найти изображение. Чем больше, тем лучше, поскольку для хорошей иконки потребуется несколько файлов разного размера.

Если изображение будет одно и маленькое, то иконка будет выглядеть некрасиво, пойдет квадратными пикселями.

То же самое касается и иконки для формы приложения, хотя на самой форме корректно будет отображаться и маленькая иконка 16×16 пикселей, при переключении по Alt+Tab уже будет заметно и некрасиво.


Рисовать, то лучше в каком-нибудь векторном редакторе, чтоб было потом проще создать несколько растровых изображений разных размеров. Мы, например, пользуемся Inkscape, он простой, бесплатный и для простых изображений вполне подойдет.

Еще момент — изображение должно, очевидно, быть квадратным.

Стандартные размеры иконок приложения

Нарисовали, теперь нужно получить несколько изображений стандартных размеров:

— 16×16
— 32×32
— 48×48
— 256×256

Где-то читал рекомендацию, что нужен значок еще 128×128, но на практике пока не заметил, чтобы его наличие было критично.
Для Windows 7 и выше обязательно нужен значок 48×48
Обратите внимание, что размер значка рабочего стола по умолчанию в XP был 32×32, а в Windows 7 — 48×48

В значки для формы, а не для иконки экзешника, лучше не включать значок 256×256 в том случае, если приложение должно работать на XP.
В остальных случаях XP игнорирует значок 256×256, но ничего плохого при этом не происходит, а вот если такой значок используется для формы, то приложение может упасть.

Сборка нескольких изображений в одну иконку

Известно, что в одном файле ICO могут храниться несколько изображений разных размеров. Для сборки есть много приложений и онлайн-сервисов, но мы пользуемся простой бесплатной программкой icon sushi Копия

Пользоваться очень просто.
1. Открываем все нужные изображения
2. Выделяем их в окне программы:

3. Сохраняем иконку (File — Save as Multiple Icon)

ЗЫ. Чтоб два раза не вставать.
Кто-то просил картинки-кнопочки от XuliOrganizzer’а
Так Леша выложил картинки на Github

Текстовый редактор FOTON для DOS

Охрененная софтина была для 1989 года.
Макросы, возможность компиляции программ, не выходя из бассейна из редактора и множество передовых фишек для того времени.

А самое главное, в нем есть одна штука, которой до сей поры нет ни в одном более современном текстовом редакторе. Выделение прямоугольных блоков текста! Которые можно переносить, вставлять и т.д. Вот нет такого больше нигде и все, а надо иногда. Причем настолько надо, что периодически пользуюсь сим олдовым произведением программерского искусства. Хоть сам бери и пиши редактор с подобной функцией, блин.
UPD.
Есть, оказывается. Не знаю насчет vim и emacs, правда, но Notepad++ делает как надо. И Far (по Аlt+стрелки). А вот Студия делает, но не совсем так.


Его собственная внутренняя демка:

https://youtu.be/vc5ONlBnPrg
Скачать

Colors. Утилита для подбора цвета фона и текста в Windows Forms

Опять студенты приходили, на этот раз с мелким заданием, перечислить все названия цветов в Windows Forms. Заодно уж сделал из этого задания утилитку, чтобы подбирать цвет символов на фоне в Windows Forms. Довел задание, так сказать, до логического конца. В общем, кто не успел сегодня на скайп-чатик, где я всякие мелочи объяснял и делал, ходите на Гитхаб, скачивайте там. Только не забудьте хоть что-нибудь переделать, а то преподы будут ругаться.

Принцип очень простой. Все названия цветов есть в перечислении KnownColor, а в классе Enum есть метод GetNames, который позволяет получить строковый массив с именами элементов перечисления.

string[] ColorNames = Enum.GetNames(typeof(KnownColor));

Вытащить конкретное значение элемента перечисления по его имени (если оно в виде строки) можно с помощью Enum.Parse

KnownColor knownColor =
                    (KnownColor)Enum.Parse(typeof(KnownColor), n);


n — строковая переменная с именем.

Все остальное стандартно, заполняем в цикле GridView и красим ячейки.

Ну и в довесок в программе есть пример использования ColorDialog и получение информации о выбранном в диалоге цвете.

И элемента управления TrackBar для выбора цвета и фона по RGB.

Пользуйтесь на здоровье.

Исходник:
На Гитхабе
На Mega.NZ
Cкомпилированная программка

ЗЫ. Спасибо, Леха, огромное за наводку на GitEve, и удобно, можно всё мышей тыкать, не набивать километры команд в консоли, и идет на всех ОС. Все-таки с этим вашим гитом через консоль несколько неудобно работать, или я пока еще не привык.

Игра «Жизнь» на Turbo Pascal for DOS

От ведь блин, нашел лохматого возраста исходник игры «Жизнь». Писалось с другом на Turbo Pascal для DOS в лохматых годах, когда еще в школе учился.

Написано, конечно, криво, косо, неоптимизированно и все это жутко тормозит, особенно «редактирование» картинки. Но все равно круто, аж детство вспомнилось, когда не пил, не курил, мониторы были зеленее, компьютеры медленнее, Ельцин президент, а я хотел вступить в КПРФ.


https://youtu.be/W7VRyfoaOkg
Еще видео

Думал даже переписать сие произведение, Free Pascal вроде умеет в графику. Может и займусь, или найду еще более крутой исходник шизово-психоделических трехмерных графиков и сделаю из него заставку на Юнити, все равно давно хотел попробовать что-нибудь написать, чтоб с триде, да в голову ничего не приходило.
А гадский Ютуб почему-то пакостит в видео, во всяком случае, в эти. На локальной машине все четко видно, а публикуешь, как-то лажовенько выглядит, ерунда какая-то непонятная с ютубом.

Исходник
Скачать

Патчи от WannaCry, NotPetya и скрытых майнеров для Windows XP

Пришлось столкнуться, слава Ктулху не с самими вирями и майнерами, но с незаделанными дырками. Есть два пути обновить пожилую ОС, протестировать на наличие уязвимости Eternal Blue и заткнуть только ее, или сделать кумулятивное обновление.

Тестирование

Протестировать наличие дыры можно с помощью программы Eternal Blues. Пользоваться очень просто, вводим диапазон IP в локальной сети и жмем кнопку SCAN. Где в графе Vulnerable? указано YES, там дырка не заделана.

Заделываем

Качаем официальные патчи от MS

KB4012583
KB4012598

Устанавливаем, перезагружаемся, и проверяем результат программой Eternal Blues

Кумулятивное обновление

Вот тут в прямом смысле слава Украине, а точнее конкретному украинцу под именем Simplix, который заботливо собрал все обновления со времен выхода SP3 в одну кучу, протестировал и выложил в одном пакете.

Скачать можно с его сайта simplix

Я поставил сразу тестовое обновление, но вы можете скачать то, которое уже полностью протестировано, хотя и тестовое вполне себе зашло. 5 машин и неделя времени, полет нормальный.

Установка детально описана на его же форуме.

Большой плюс для виндопользователей пиратской винды, если таковые найдутся :), после обновлений активация не слетает.

Копии на всякий случай

Eternal Blues
KB4012583 и KB4012598
UpdatePackLive-19.11.15 (если запускает пакет обновления с ключом /ie8, обновится IE до версии 8)

Подводный камень при чтении файла с помощью File.ReadAllText

Иногда проще прочитать файл, как текстовый в однобайтовой кодировке, чтобы что-нибудь там поделать с помощью стандартных string.Replace/string.Remove и т.д., иногда даже если файл не совсем текстовый, потому что таких же удобных функций для работы с массивом байт нет (или я не нашел).
Это, наверняка, адский быдлокод, но все-таки вполне альтернатива изобретению совсем уж дикого велосипеда.

А у меня речь шла о текстовых файлах, правда, неизвестно в какой кодировке, и символах, которые нужно искать/менять. Символы от кодировки не зависели, посему любой файл можно было рассматривать, как текстовый, в любой однобайтовой кодировке. Главное, в какой кодировке открыл, в той же потом и сохранить.
Так вот File.ReadAllText пытается автоматически определить кодировку файла на основе наличия меток порядка следования байтов и принудительная установка кодировки не помогает. Если в файле встретился зловредный BOM, то ReadAllText наплюет на твои указания кодировки с высокой колокольни и откроет в той, на которую ему BOM указывает, а при сохранении, соответственно, будет глюк и текст превратится в тыкву.

Беда, конечно, решается стандартно, чтением файла с помощью StreamReader и записью с помощью StreamWriter, которые себе такой самодеятельности не позволяют, но «осадочек остался».

Пример
Скачать

XuliOrganizzer. Простенький самописный органайзер на C#

Нет, оно не читается, как хули, органайзер. Но, может быть, что и подразумевается. 🙂
Это маленькая программа-органайзер для XP, 7, 8 и Vista. На 10 никто из нас ее запускать не пробовал, из за отсутствия таковой.

Что умеет:
— Собственно, напоминания по расписанию о событиях. Ну там кота покормить, или не забыть выключить самогонный аппарат, или продать славянский шкаф.

Возможны напоминания как в виде всплывающих подсказок в трее, так и в отдельном окне, повтор напоминаний через заданное время, звуковое оповещение.
Имеется возможность активировать/деактивировать задание-напоминание, есть контроль просроченных заданий и возможность немедленного выполнения таковых при старте программы.

— Запуск программ по расписанию, как с уведомлением, так и без.

— Симпатичный таймер обратного отсчета

— Текстовые заметки

Для заметок есть «корзина», т.е. случайно удаленную заметку можно восстановить.

Все данные хранятся в XML, в настройках можно посмотреть путь к файлу.

Писал в основном Леша, изредка виртуально пиная всех вокруг, и в основном для меня, потому что я давно хотел удовлетворяющий меня органайзер с напоминаниями, а в сети не было такого, который бы меня устраивал.

Распространяется свободно, как обычно, по лицензии Хекса.

Еще скриншоты

Скачать
Зеркало

Исходники:

Скачать
На Github

C#. Windows Forms. Режим замены текста по нажатию клавиши Insert в TextBox.

То есть, задача сделать, чтоб было как в нормальном текстовом редакторе, нажимаем Ins, и символы перед курсором заменяются на введенные с клавиатуры. Нажимаем еще раз и символы вставляются как обычно.
Элемент управления TextBox почему-то из коробки это не поддерживает, поддерживает MaskedTextBox, но и стандартный TextBox вполне можно допилить. Не знаю, почему на первых строках в поисковике какой-то ужас со StringBuilder‘ами и чуть ли не вызовом WINAPI, хотя все гораздо проще.

Заводим в форме логическую переменную, которая будет отвечать за то, какой режим ввода сейчас true — замена, false — обычная вставка.

bool InsertMode = false;

В обработчик события KeyUp помещаем код, который будет менять флаг, если был нажата клавиша Insert:

private void txtTest_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Insert)
            {
                InsertMode = !InsertMode;
            }

        }

В обработчике KeyPress код следующий

private void txtTest_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Вытаскиваю объект, который вызвал событие, 
            //чтоб можно было подключить несколько TextBox'ов
            TextBox tb = (TextBox)sender;
            
            //если включен соотв. режим, курсор не в конце текста
            //и не нажата какая-либо управляющая клавиша
            //заменим символ перед курсором
            if (InsertMode && tb.SelectionStart < tb.TextLength 
                && !Char.IsControl(e.KeyChar))
            {                                
                //выделяем 1 символ перед курсором
                //область выделения автоматически заменится 
                //символом, введенным  с клавиатуры
                tb.SelectionLength  = 1;

                //если выделен символ перевода строки, значит это конец строки 
                //в multiline TextBox,  
                if (tb.SelectedText == "\r" || tb.SelectedText == "\n")
                    tb.SelectionLength = 0; //не надо ничего
                                           //заменять, убираем выделение
            }
        }

Вот. Комментарев больше кода 🙂

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

Надо всего лишь модифицировать первое условие, чтоб исключить проверку на длину строки и добавить проверку на TextBox.MaxLength

if (InsertMode && !Char.IsControl(e.KeyChar))
{
	//замена по кругу
            if (tb.SelectionStart == tb.MaxLength) tb.SelectionStart = 0;
            //   [...]
}

Достигли последнего возможного символа, перескочили в начало текстового поля.

Пример 1 Пример 2
Скачать проекты

C# Windows Forms. Изменение размеров формы без заголовка

Форму с FormBorderStyle None можно сделать такую, чтобы пользователь мог менять и ее размеры мышью, как у обычной формы:
Код под катом
Получаются такие вот симпатичные формочки:


Код на PasteBin
Проект

C# Windows Forms. Перетаскивание формы без границ. Перетаскивание формы не за заголовок.

Т.е. такой формы, у которой FormBorderStyle установлен в None

Вариант 1, это прописать в обработчике MouseDown вот такой код:

base.Capture = false;
Message m = Message.Create(base.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);
this.WndProc(ref m);

Вариант простой, форма будет перетаскиваться, как обычная форма, только за любую ее точку, а не за заголовок.

Вариант №2 вот такой:
Код под катом

Форма также перетаскивается за любую точку формы, но, нужно несколько обработчиков событий, при перетаскивании форма будет перерисовываться вся, а не как обычно, когда появляется только рамка перетаскивания, и к тому же форма чуть-чуть дернется в начале перетаскивания, после нажатия левой кнопки мыши. Но если надо, чтоб во время перетаскивания она вся перерисовывалась, то вариант использовать второй способ.

Код раз Проект раз
Код два Проект два
Источник Копия

Понабежало студентов

Со своими заданиями на C#, заочники, ко всему прочему. И хрен бы с ним с уровнем знаний, кто-то умеет форму нарисовать сам, уже хорошо, кто-то знает, что такое форма (хотя бы для выпечки пирожных), кто-то умеет водить большой железный корабль и стрелять из… ну чем там корабЕль стреляет. У кого-то своя фирма по вебдезигну и наружной рекламе (такие обычно не приходят, им есть, кому на работе делать, или они сами умеют).

Страшнее студентов-заочников могут быть только преподаватели, которые им попадаются, и по закону подлости, самому, э-э-э… отстающему студенту, вот-вот, водителю корабЕля, достался самый въедливый препод. «Мало того, что говорящий, но и совсем непьющий препод, хрен знает с какой планеты», у которого ко всему прочему требование, чтоб все комментарии были на английском. Русофобия! Ну вот куда товарищ полковник… Правильно, товарищ полковник ему в прошлом году сам сдавал.

Первое задание было ничего, написать кодер/декодер из BASE64 и обратно. Ну вот как-то так

А второе, написать «менеджер паролей» с базой в XML, умеющий импортировать пароли и заметки к ним из произвольных текстовых файлов типа:

Иван Иванов
ivanov@example.org
13/01/1979
vatnik1931

Марья Иванова
ivanova@example.org
31/02/1989
vatnica1945

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

Кораблеводитель потерял исходники. Вот пусть они теперь тебе тут лежат на видном месте, чтоб по ночам не звонил.

Другие не вздумайте этим изделием пользоваться в целях всамделишного хранения настоящих паролей.

А вискарь, кстати, приехал поездом в косту из гламурманска, Леха его забрал и привез, но я пока не пробовал, меня покрысла грыза уличная и доктор пока запретил алкашку, как несовместимую с антибиотиками.

Перекодировщик в/из BASE64
Исходники типа «менеджера паролей»

PC-speaker в Linux, или как сделать beep из консоли встроенным динамиком ПК

Еще со времен DOS можно было свистеть, гудеть и пикать встроенным динамиком компьютера, и даже симфонии играть. Сейчас это особо не нужно, ибо везде звуковые карты, динамики и прочая мультимедия. Но иногда PC-speaker нужная и полезная вещь, способная сигнализировать о чем либо, например, о разрыве соединения с Интернетом на домашнем сервере, к которому не подключен монитор, или о том, что торрент докачался. Да и вообще, способов, как можно применить спикер — множество. Даже симфонии можно играть.

Включение динамика

Зачастую, PC-speaker в линуксе отключен, точнее, не загружен модуль ядра, который им управляет. Обычно это модуль pcspkr, хотя, в некоторых источниках написано, что может быть и другой модуль snd-pcsp. У меня оказался первый.
Проверить, загружен ли соответствующий модуль ядра можно командами
lsmod |grep pcspkr и lsmod |grep snd-pcsp соответственно.
Если команда ничего не выдала, то модуль не загружен.
Если выдала что-то похожее, значит, модуль загружен:

>lsmod |grep pcspkr
pcspkr                  1448  0

Если модуль не загружен, нужно попробовать его загрузить:

modprobe pcspkr
или
modprobe snd-pcsp

Если команда не выдала ошибки, модуль загружен. Можно проверить с помощью команды lsmod. Если случилась ошибка, то печально. Модуль, скорее всего, придется собирать. Ну, или не так печально, а даже наоборот — модуль встроен в ядро, и PC-speaker по умолчанию включен. Попробуйте простой beep.

Простой beep

Для простого beep достаточно отправить на консоль символ с кодом 007, ASCII-символ BEL

echo -ne '\007'

Способ может не сработать из SSH-терминала, либо из терминала X. Терминал SSH «булькнет» не на удаленном компьютере, а на локальном, а X-server может перенаправить beep на колонки, вместо PC-speaker’a

Утилита beep

Простые звуки и даже целые мелодии можно играть на спикере утилитой beep.
На рабочей машине она уже была в комплекте ОС, на Ubuntu ее можно установить командой apt-get install beep, а в Slackware она ставится через Sbopkg
Проект имеется на Github, можно собрать и из исходников

Примеры вызова:

beep

Без параметров издаст стандартный beep

beep -f 500 -l 1000

Выдаст звук частотой 500 Гц, продолжительностью 1 секунду (1000 миллисекунд)

Пример скрипта, играющего тему Die Gedanken Sind Frei из ролика в начале заметки.

Ссылки

Больше мелодий и ссылок на готовые скрипты Копия
How do I make my pc speaker beep. Еще больше про то, как можно пискнуть спикером.

Beep Music Demo или мелодии на PC-Speaker

С помощью утилиты beep под Linux


Прямая ссылка
Скачать скрипты


Прямая ссылка
Скачать скрипты


Прямая ссылка
Скачать скрипты


Прямая ссылка
Скачать скрипты

Скачать весь архив
Скрипты взяты отсюда

Макрос замены форматированного текста на HTML.

Доделал макрос редактору для Word. Теперь умеет по Alt+I заменять выделенный текст типа [http://example.com/image.jpg] на тег IMG, по Alt+L выделенный текст с URL-адресом в [] на тег A HREF.
Адрез из скобок будет в HREF а текст между тегами сслыки. Типа как выше.

Код макроса:

Вставить IMG
Вставить A HREF
Весь макрос
Готовый файл Word

L.S.

Бесплатный VPN от riseup.net. Часть 3.

Настройка на другом компьютере с Linux

Как следует из ранее изложенного, ничего сверхъестественного не обнаружилось, и для того, чтобы воспользоваться этим VPN, требовательный к железу Debian 9 x64 не нужен совершенно. Bitmask тоже не нужен. Проблемы могут возникнуть разве что с виндой, а вот с линуксов вполне можно раздавать VPN-интернет на другие устройства в локальной сети, в т.ч. и на виндовые компьютеры. Без bitmask это даже лучше получается, поскольку он пакостит в iptables. Пакостит, правда, для «более лучшей» защиты пользователя. Но в данном случае получается, как у Черномырдина — хотели как лучше, получилось как всегда.

Конфигурация Openvpn

Первым делом надо составить конфиг для Openvpn. Не буду каждый параметр пояснять, а ссылка на сами конфиги есть в конце заметки. Вроде составил правильно, по ранее извлеченным параметрам Openvpn. Единственное что добавил от себя, это запуск пользовательских скриптов — параметры script-security 2, разрешающий оный запуск, и параметры up '/путь/к/скрипту up' и down '/путь/к/скрипту down', указывающие Openvpn, какой скрипт надо запускать при, соответственно, установке и разрыве соединения.

Про подобные скрипты я совсем недавно упоминал.

Сертификаты

Получены в прошлой части.

Пользовательский скрипт настройки соединения.

Переделывался из ранее приведенного примера с небольшими изменениями:

#!/bin/bash

#заводим человеческие переменные

MAIN_STAT=$1 #up/down
DEV_NAME=$2
TUN_MTU=$3
LINK_MTU=$4
LOCAL_IP=$5
REMOTE_IP=$6
ADD_STAT=$7 #init/restart

#путь к ip и iptables
ACPATH="/usr/sbin/"

# [...]

#соединение поднялось
if [ "$MAIN_STAT" = "up" ]; then
	#установка маршрута по умолчанию
    "$ACPATH"ip route del default #удаление старого
	#установка нового
	#именно так, локальный ip и удаленный - один и тот же
	#особенность провайдера Oo
    "$ACPATH"ip route add default via $LOCAL_IP dev $DEV_NAME src $LOCAL_IP
    
     #разрешение транзитного трафика
	"$ACPATH"iptables -P FORWARD ACCEPT
    
    #установка адреса DNS-сервера
    echo "nameserver 10.42.0.1">/etc/resolv.conf
    exit
fi

#соединение разорвано
if [ "$MAIN_STAT" = "down" ]; then
    #запрет транзитного трафика
    "$ACPATH"iptables -P FORWARD DROP 
    #установка маршрута по умолчанию без VPN
	"$ACPATH"ip route del default
    "$ACPATH"ip route add default via 10.10.1.1 dev eth1 src 10.10.20.55
    
    #восстанавление адресов DNS по умолчанию
    echo "nameserver 8.8.8.8">/etc/resolv.conf
    echo "nameserver 8.8.4.4">>/etc/resolv.conf
fi

Основная особенность в том, что сервер, вместо REMOTE_IP, передает маску подсети, а чтобы маршрутизация осуществлялась правильно, вместо удаленного IP надо прописать выданный сервером локальный.

Долго с этим разбирался, т.к. поначалу был глюк — транзитный трафик проходил, а вот локальный нет. Помог выхлоп ifconfig:

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.42.0.2 netmask 255.255.248.0 destination 10.42.0.2
inet6 2001:db8:123::1000 prefixlen 64 scopeid 0x0
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 982346 bytes 1307345786 (1.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 541554 bytes 27027659 (25.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Вторая важная особенность — надо прописать правильный DNS.
И не забыть передать его клиентам, если компьютер используется в качестве PPTP- или другого VPN-сервера.

ЗЫ. Если будете пользоваться сервисом riseup.net, по возможности донатьте, хорошее дело ребята делают. Фиг где в мире встретишь таких альтруистов.

Ссылки

Предыдущие части заметки

Часть 1. копия
Часть 2. копия
Скачать все в PDF

Конфиги

На моем сайте копия

На PasteBin:
Голландия
Канада
США

Скачать с Mega.nz

Скрипт настройки сети

На PasteBin
Скачать с Mega.nz

Riseup

http://riseup.net
Регистрация Riseup Black
О Riseup
Донат

Bitmask

http://bitmask.net
http://leap.se

Загрузка Puppy Slacko по сети

Puppy по сети грузится, но с некоторыми проблемами. А именно, для полноценной загрузки ОС требуется файл puppy_slacko_X.X.sfs, содержащий основные файлы ОС.
Этот файл сам по себе по сети не подгружается. Можно, конечно, подшаманить в initrd и сделать так, чтоб файл подтягивался по tftp или с расшаренной папки, но это довольно нетривиально.
Есть другой способ — записать в initrd главный sfs. Правда, initrd раздуется от этого (аж до 150 Мб с гаком) и на совсем слабых машинах Slacko не загрузится. Но 512 Мб оперативки вполне хватает. Тестировано на селероне 1.7 с 512 Мб ОП.

Мы нашли на murga-linux скрипт, который автоматизирует данный процесс. Ссылки на оригинал не будет, т.к. никто уже не помнит, где качали. 🙂

Скрипт на PasteBin
Скачать с Mega.nz

Отключение режима обслуживания в WordPress.

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

Чтобы отключить режим обслуживания, надо зайти по FTP на сервер и удалить из корневого каталога сайта (обычно public_html) и удалить файл .maintenance

Если FTP-плагин FAR не видит скрытых файлов (начинающихся с точки)

Надо отредактировать запись об FTP-соединении (по F4), активировать пункт Расширенный режим и проверить, чтобы в поле ниже было написано LIST -la

Способы для некоторых других FTP-клиентов:

Total Commander:
1. net — ftp show hidden files
2. в файле wcx_ftp.ini в разделе [General]
вписать FtpShowHidden=1 и перезагрузить Total Commander.

Far Navigator:
Custom List command
LIST -la

Скачать пост в PDF