трудовые будни

Позднее Ctrl + ↑

поднимаем свой сервер traccar и настраиваем GPS трекер для работы с ним

Был куплен у китайцев такой трекер:

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

Сразу оговорюсь, содержать свой сервер для одного устройства получится дороже (в моем случае $5 и безграничное количество устройств), чем платить за чужой (от 80 руб. за устройство).

Поискав готовые решения, я наткнулся на проект https://www.traccar.org, проект открытый, есть исходники на github https://github.com/traccar/traccar

для начала я проверил работоспособность прибора, для этого написал короткий скрипт на php, по сути, это сокет сервер, который слушает порт 999 и выводит в консоль всю информацию, которая приходит

<?php
set_time_limit (0);
$address = '127.0.0.1';
$port = 999;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, 0, $port) or die('Could not bind to address');
socket_listen($sock);
while (true) {
    $client =  socket_accept($sock);
    $input =  socket_read($client, 1024000);
    echo "$input\n";
    socket_close($client);
}
socket_close($sock);
?>

через NAT на роутере открыл порт наружу

дальше приступаем к настройкам трекера (брал с этого сайта http://miradmin.ru/gps-tracker-sinotrack-st-901/), далее транслирую то что использовал сам (команды отправляются смс сообщениями)

  1. Регистрируем номер телефона, с которого будем управлять устройством
    899977777770000 1
    89997777777 — номер телефона
    0000 — пароль (по умолчанию четыре ноля)
    1 — номер ячейки (можно зарегистрировать до 3 телефонов)
  2. Меняем пароль, конечно же
    77712340000
    777 — команда
    1234 — новый пароль
    0000 — старый пароль
  3. Меняем часовой пояс
    8960000E03
    896 — команда
    0000  — пароль
    E03 — часовой пояс Москвы
  4. Выбираем режим передачи данных (SMS или GPRS)
    7100000
    710 — команда для GPRS
    0000  — пароль
  5. Настройка точки доступа для GPRS
    Мегафон: 8030000 internet gdata gdata
    МТС: 8030000 internet.mts.ru mts mts
    Билайн: 8030000 internet.beeline.ru beeline beeline
    ТЕЛЕ2: 8030000 internet.tele2.ru
    0000  — пароль
  6. Задаем интервалы отправки сообщений на сервер при включенном зажигании и в режиме оффлайн
    800000 5
    каждые пять секунд при включенном зажигании
    8090000 300
    каждые пять минут при выключенном
    0000  — пароль
  7. Настройка спящего режима
    SLEEP0000 5
    после выключения зажигания через пять минут устройство «заснет», перестанет присылать сообщения на сервер, но будет реагировать на смс и звонки
    0000  — пароль
  8. Настройка сервера данных
    8040000 123.123.123.123 999
    123.123.123.123 — ip адрес сервера
    999 — порт сервера
    0000  — пароль

после указанных настроек я стал получать сообщения с трекера:

*HQ,9170631826,V1,105509,A,5576.7575,N,03761.0545,E,000.13,000,210919,FBFF9FFF,250,99,27914,55187#
*HQ,9170631826,V1,105509,A,5576.7578,N,03761.0548,E,000.13,000,210919,FBFF9FFF,250,99,27914,55187#
*HQ,9170631826,V1,105554,A,5576.7577,N,03761.0548,E,000.23,000,210919,FBFFBBFF,250,99,27914,55187#
*HQ,9170631826,V1,105624,A,5576.7575,N,03761.0549,E,001.05,000,210919,FBF7BBFF,250,99,27914,31740#

отлично! осталось создать сервер и транслировать данные туда

для начала я выбрал площадку для размещения виртуального сервера, делал на DigitalOcean
если хотите помочь нам и получить $25 на счет, воспользуйтесь реферальной ссылкой https://m.do.co/c/74f25c68fa79

используйте самый дешевый Droplet за $5 в месяц с ubuntu на борту

дальше в сжатой форме будут только команды для установки недостающих компонент и настройки конфигураций

$ apt-get update
$ apt-get upgrade
$ apt-get install mc

ставим java

$ apt-get install default-jdk

ставим mysql

$ apt-get install mysql-server mysql-client

далее запускаем mysql, настраиваем пароль пользователя root и создаем базу с пользователем для работы traccar

не забудьте указать свои
root_password — пароль root
user_password — пароль пользователя traccar_user

$ mysql -u root -p

USE mysql;
UPDATE USER SET authentication_string=PASSWORD(«root_password») WHERE USER=’root’;
FLUSH PRIVILEGES;

CREATE DATABASE traccar DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER ’traccar_user’@’localhost’ IDENTIFIED BY ’user_password’;
GRANT ALL ON traccar.* TO ’traccar_user’@’localhost’;
FLUSH PRIVILEGES;
EXIT;

качаем и устанавливаем сервер

$ cd /tmp

на момент написания статьи была актуальная версия 4.6, посмотреть версию можно тут https://github.com/traccar/traccar/releases/

$ wget https://github.com/traccar/traccar/releases/download/v4.6/traccar-linux-64-4.6.zip
$ unzip traccar-linux-64-4.6.zip

$ ./traccar.run
$ cd /opt/traccar/conf

настраиваем конфиг, приводим к виду ниже, не забудьте заменить user_password на тот, который указывали выше

$ mcedit traccar.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>
<properties>
    <entry key='config.default'>./conf/default.xml</entry>
    <entry key='database.driver'>com.mysql.jdbc.Driver</entry>
    <entry key='database.url'>jdbc:mysql://localhost:3306/traccar?useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;sessionVariables=sql_mode=''</entry>
    <entry key='database.user'>traccar_user</entry>
    <entry key='database.password'>user_password</entry>
</properties>

запускаем службу

$ service traccar start

смотрим запустился ли сервис

$ service traccar status

если все хорошо, получаем следующий вывод

● traccar.service - traccar
   Loaded: loaded (/etc/systemd/system/traccar.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-09-24 07:44:48 UTC; 1 day 3h ago
 Main PID: 8519 (java)
    Tasks: 30 (limit: 1152)
   CGroup: /system.slice/traccar.service
           └─8519 /opt/traccar/jre/bin/java -jar tracker-server.jar conf/traccar.xml

теперь можно подключиться непосредственно к web интерфейсу
http://ip_адрес_droplet:8082

по-умолчанию вводим:
Email: admin
Пароль: admin

не забудьте настроить наше устройство для передачи данных на сервер, для этого отправьте СМС
8040000 123.123.123.123 5013
123.123.123.123 — ip адрес нашего Droplet
5013 — порт сервера
0000  — пароль трекера

Важно! Трекер Sinotrack ST-901 использует протокол H02? соответственно указываем порт 5013!!!

В web интерфейсе добавляем устройство (левый верхний угол)

Имя: имя нашей машинки
Идентификатор: номер трекера (ID под штрих кодом)

через некоторое время машина появится на карте

Все! Для работы этого более чем достаточно!

Дальше пойдет дополнительная информация (необязательные опции)

  1. Для начала создал нового пользователя, чтобы не подключаться все время как admin
  2. Изменил единицы измерения скорости (в узлах скорость не очень)
    зашел Аккаунт — Атрибуты — добавить
  • Имя: Единица скорости
  • Значение: км/ч
  1. Сервер — Слой карты указал «Яндекс Карты», работают быстрее и стабильнее

Важная для меня опция — это ssl подключение к web интерфейсу, не хочется чтобы мой трафик мог видеть или менять оператор связи. Для этого вам понадобится доменное имя, и доступ к настройкам DNS, подтверждённый ssl сертификат не получится выпустить на ip адрес.

Для начала, создаем в DNS запись A, где для нашего домена (например, car.domain.ru) ассоциируем ip адрес нашего Droplet.

настраиваем nginx в режиме reverse proxy и подключаем Let’s Encrypt

$ apt-get install nginx
$ cd /etc/nginx
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

приводим конфиг к следующему виду, не забудьте заменить в четырех местах car.domain.ru на ваш домен

$ mcedit /etc/nginx/sites-enabled/default

server {
    listen 80;
    server_name car.domain.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    server_name car.domain.ru;
    ssl_certificate           /etc/nginx/cert.crt;
    ssl_certificate_key       /etc/nginx/cert.key;
    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    access_log            /var/log/nginx/car.domain.ru.access.log;
    client_max_body_size 10M;
    client_body_buffer_size 128k;

    location / {
      proxy_set_header        Host $host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_pass          http://localhost:8082;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8082 https://car.domain.ru;
      proxy_redirect ws://localhost:8082/api/socket /api/socket;
      proxy_send_timeout 86400s;
    }
}

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

$ service nginx restart

Теперь вы можете открывать в браузере вашу карту по имени https://car.domain.ru и весь трафик к серверу и обратно будет шифроваться.

И самая малость, сделаем красиво, добавим подтвержденный сертификат. Нам поможет certbot (https://certbot.eff.org).

$ apt-get install software-properties-common
$ add-apt-repository universe
$ add-apt-repository ppa:certbot/certbot
$ apt-get update

$ apt-get install certbot python-certbot-nginx
$ certbot —nginx

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

проверим автоматический выпуск сертификата:

$ certbot renew —dry-run

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

$ crontab -e

Например, каждого первого числа месяца, в 3 часа 12 минут будет попытка перевыпустить сертификат.
Добавьте строчку в конце (не забудьте, что в crontab нужно оставлять последнюю пустую строку).

12 3 1 * * /usr/bin/certbot renew

проверяем запущена ли служба в windows и если надо — запускаем

Ну, что же... бывают случаи, когда какая нибудь важная служба (сервис, service) тормознула, с разработчиком связи нет, а сам продукт является «черным ящиком». На выручку нам приходит очередной «костыльный» метод. Задача: в кроне шедулере сделать проверку, жива ли служба и если померла — стартануть.

в примере имя службы передадим параметром, в батничке накидаем двухстрочный скрипт, сначала проверим запущена ли служба и если нет — запустим.

Но, учтите, писать надо именно display name (выводимое имя).

net start | find /i %1 
if errorlevel==1 net start %1

удаляем дубликаты с помощью fdupes

Накопилось за несколько лет море фотографий, и столкнулся я с тем, что некоторые фотографии продублированы. Думал, телефон несколько раз выгрузил их на сервер, но оказалось их немало, да в разных папках и это неприятный факт, т. к. руками перелопатить миллионы фотографий — нереально... а сравнивать по содержимому процесс очень ресурсоемкий. Порывшись на просторах, нашел интересную утилитку fdupes, написал ее Андриан Лопес (Adrian Lopez), за что ему огромное спасибо. Программа сравнивает размер файла и MD5 хэш, и после сравнения начинает сверку по-байтно.

fdupes /home/user/photos

ищет дубликаты в указанном каталоге

-r — рекурсивный поиск

fdupes -r /home/user/photos > duplicate_list.txt

сохранит в файле список дубликатов

а, дальше с помощью awk отфильтруем дублирующиеся файлы для дальнейшего удаления

awk 'BEGIN{d=0} NF==0{d=0} NF>0{if(d)print;d=1}' duplicate_list.txt > delete_list.txt

а затем удаляем по списку

rm `cat delete_list.txt`

или так

xargs rm < delete_list.txt

find и суммарный объем данных

объем этих файлов, как это сделать?
Задача нетривиальная, нашлось два решения (их может быть и больше)

первое, используем du:

find параметры_поиска -exec du -b {} + | awk ’{sum = sum+$1 }; END { print sum }’

пример:

find /volume1/photo/ -maxdepth 1 -type f -exec du -b {} + | awk ’{sum = sum+$1 }; END { print sum }’

второе, используем ls:

find параметры_поиска -ls | awk ’{sum = sum+$7 }; END { print sum }’

пример:

find /volume1/photo/ -maxdepth 1 -type f -ls | awk ’{sum = sum+$7 }; END { print sum }’

поиск пользователей с заданным паролем в домене

Представьте ситуацию: новые пользователи заводятся в домен автоматически с заранее известным паролем, например password. Т. е. политика сложности пароля позволяет использовать простые пароли, хоть 111111. Смена пароля лежит на совести пользователя, а значит — не меняется. С помощью данного vbs-скрипта можно проверить какие пользователи используют словарные пароли

Dim adoCommand, adoConnection, strBase, strFilter, strAttributes 
Dim objRootDSE, strDNSDomain, strQuery, adoRecordset 
Dim strUser, strPassword, objDomain, objNS 
Dim iplus, iall 
Dim fso, f1 
Dim WshShell, Path 

Const ADS_SECURE_AUTHENTICATION = &H1 
Const ADS_USE_ENCRYPTION = &H2 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set f1 = fso.CreateTextFile("c:\testfile.txt", True) 
iplus = 1 
iall = 1 
Set objNS = GetObject("LDAP:") 
strPassword = InputBox("Введите пароль для проверки") 
Set adoCommand = CreateObject("ADODB.Command") 
Set adoConnection = CreateObject("ADODB.Connection") 
adoConnection.Provider = "ADsDSOObject" 
adoConnection.Open "Active Directory Provider" 
adoCommand.ActiveConnection = adoConnection 

Set objRootDSE = GetObject("LDAP://RootDSE") 
strDNSDomain = objRootDSE.Get("defaultNamingContext") 
strBase = "<LDAP://" & strDNSDomain & ">" 

strFilter = "(&(objectCategory=person)(objectClass=user))" 
strAttributes = "sAMAccountName" 
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" 
adoCommand.CommandText = strQuery 
adoCommand.Properties("Page Size") = 100 
adoCommand.Properties("Timeout") = 30 
adoCommand.Properties("Cache Results") = False 

Set adoRecordset = adoCommand.Execute 
Do Until adoRecordset.EOF 
    strUser = adoRecordset.Fields("sAMAccountName").Value 
    On Error Resume Next 
    Set objDomain = objNS.OpenDSObject("LDAP://" & strDNSDomain, _ 
        strUser, strPassword, ADS_SECURE_AUTHENTICATION) 
    If (Err.Number = 0) Then 
        On Error GoTo 0 
   f1.WriteLine(iplus & " User : " & strUser & vbTab & vbTab & " Пароль : '" & strPassword & "'") 
   iplus = iplus + 1 
    End If 
    On Error GoTo 0 
    adoRecordset.MoveNext 
   iall = iall + 1 
Loop 

f1.WriteLine("Всего проверено " & iall & " пользователей") 
f1.Close 
adoRecordset.Close 
adoConnection.Close 

Set WshShell = WScript.CreateObject("WScript.Shell") 
On Error Resume Next 
Path = "notepad c:\testfile.txt" 
WshShell.Run Path
Ранее Ctrl + ↓