LINUX.ORG.RU
ФорумAdmin

Нужен демон для подсчёта хэша файла по запросу из сети

 , ,


0

2

Приветствую.
Нужен демон (управляемый фоновый процесс), который будет получать по сети over ssh (ssh отпадает)/http(s)/etc путь к файлу (локальный для хоста, речь про локальные файлы) и отвечать хешем файла. Как вариант, будет уметь работать с директориями.

Есть готовое работающее?

ЗЫ. Кто там хотел идею для проекта? Вот тебе идея.
ЗЗЫ. Зачем это нужно. Допустим, у тебя есть несколько машин, на которые ты распространяешь файл. Есть первоисточник файла. И вот тебе захотелось проверить файл на соответствие. Как будешь решать эту задачу?
ЗЗЗЫ. Как вариант, давать демону путь к файлу и значение хеша. Каким-нибудь json. В ответ получать true/false.

★★★★★

Последнее исправление: targitaj (всего исправлений: 6)

который будет получать по сети … путь к файлу

путь этот локальный для хоста, на котором запущен демон или любой произвольный? если произвольный, то вообще какой толк от выкачивания файла ради подсчета хэшей?!

Кто там хотел идею для проекта? Вот тебе идея.

постановка задачи - моё увожение. сусанин тихо завидует, заблудившись в своем лесу.

aol ★★★★★
()

И вот тебе захотелось проверить файл на соответствие. Как будешь решать эту задачу?

Например запустить md5sum? Отправить запрос демону тащемто сложнее, чем подсчитать хеш файла)

goingUp ★★★★★
()

Зачем это нужно. Допустим, у тебя есть несколько машин, на которые ты распространяешь файл.

условный ansible? (хоть я его ни разу и не использовал)

aol ★★★★★
()
Ответ на: комментарий от targitaj

Ну в оригинальном посте было ssh… Ну раз ssh не устраивает — обернуть это дело в простейший CGI и отдавать по http(s) результат на get-запросы (или post, если очень хочется). Ну или любой другой протокол, который устраивает.

Ну или как вариант, если не хочется заводить nginx/apache, bottle.py (со встроенным питоньим http-сервером) + hashlib из батареек.

CrX ★★★★★
()

гм. какое однозначное и точно сформулированное ТЗ

А кому он он будет отвечать? И что он должен отвечать?

задачка на проверку соответствие файла - это более точно сформулированное задание.

Один из вариантов: скрипт на 5 строк + xinetd. Или тебе через http(s) нужен интерфейс?

vel ★★★★★
()
Ответ на: комментарий от vel

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

targitaj ★★★★★
() автор топика

Блин. Совсем обленились. Однострочник на баше реквестируешь ты.

Максимум, если не хочешь ssh, то можно однострочникина баше прикрутить к консольному вебсокет серверу

pihter ★★★★★
()

Я сначала подумал, что это тред в Job, но потом перепроверил и оказалось, что нет. ТЗ вроде норм в текущей версии, я бы сделал за 1 человекодень.

KivApple ★★★★★
()

Так. Допустим, на этапе формирования директории проекта, я буду прогонять хэш всех файлов и положу в корень проекта файл с хэшами. Таким образом, мне останется только вызвать локально на каждой машине запуск утилиты и скормить ей этот файл. В принципе, я могу туда сразу и готовый sh файл с этим скриптом класть.

urxvt CrX подскажите про CGI. Я понятия не имею как это может выглядеть.

targitaj ★★★★★
() автор топика
Ответ на: комментарий от urxvt

Файлы сами по себе не меняются. Это результат сборки, который распространяется по целевым местам.

Просто покажи мне пример этого CGI. Я совсем не в теме. Посмотрю пример и сделаю под себя.

targitaj ★★★★★
() автор топика
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от targitaj

Файлы сами по себе не меняются. Это результат сборки, который распространяется по целевым местам.

Понял. Тогда да, можно его генерить при сборке и класть в дистрибутив.

Смотри, а как тебе тогда следующая идея? Ты просто рядом с каждым файлом кладешь файл с суффиксом .sig с хешом внутри. Дальше ты имея имя файла на руках всегда можешь скачать его хеш, просто прибавив суффикс.

$ ls -1
file1.txt
file1.txt.sig
file2.png
file2.png.sig
...

Просто покажи мне пример этого CGI. Я совсем не в теме. Посмотрю пример и сделаю под себя.

Ну готового примера у меня нет. Могу сделать.

urxvt ★★★★★
()
Последнее исправление: urxvt (всего исправлений: 1)
Ответ на: комментарий от urxvt

Ты просто рядом с каждым файлом кладешь файл с суффиксом .sig с хешом внутри.

Смотри https://releases.ubuntu.com/22.04/SHA256SUMS В одном файле все хэши и проверяется весь проект одним вызовом.

targitaj ★★★★★
() автор топика
Ответ на: комментарий от targitaj

Погоди, я запутался. Теперь ты говоришь одним вызовом.

Тебе нужно HTTP API по типу такого? Это должно крутится в Nginx или на Python http.server?

>> GET /some-api-path/ubuntu-22.04.2-desktop-amd64.iso
<< b98dac940a82b110e6265ca78d1320f1f7103861e922aa1a54e4202686e9bbd3

urxvt ★★★★★
()
Последнее исправление: urxvt (всего исправлений: 1)
Ответ на: комментарий от urxvt

Прямо сейчас мне, в принципе, надо получить OK на запрос «а соответствует вот эта копия проекта эталону». Один из вариантов решения - это универсальный демон и сравнивать файлы поштучно, в порядке обращения к ним. С другой стороны, я могу периодически проверять весь проект. У меня нет конечного видения. Пока только варианты, которые я не знаю как реализовать.

targitaj ★★★★★
() автор топика
Последнее исправление: targitaj (всего исправлений: 2)

Если я правильно тебя понял, то ставь нжиникс, ставь туда луу и делай что-то типа

 
location /my-ssh-endpoint {
  content_by_lua_block {
    os.execute("/bin/sha... ")
  } 
}

ya-betmen ★★★★★
()
Ответ на: комментарий от targitaj

А если просто слать на порт путь текстом и в ответ получать хеш без всякого шифрования - этого будет недостаточно?

Leupold_cat ★★★★★
()
Последнее исправление: Leupold_cat (всего исправлений: 1)
Ответ на: комментарий от Leupold_cat

Да, вот про что-такое и думал. В идеале, собственный демон, который можно поставить на nginx, например. Опять же, можно огородить его файрволлом. То есть, речь именно про сетевой демон с единственной задачей - выдавать хеши файла по полученному им пути. Ну или говорить ОК в случае получения пути + хеш.

targitaj ★★★★★
() автор топика
import os
import hashlib
import socketserver
import http.server


ROOT='/home/user'


def checksum(path):
    chs = []
    for w in os.walk(path):
        dir = w[0]
        for f in w[2]:
            with open(os.path.join(dir, f), 'rb') as p:
                chs.append(hashlib.file_digest(p, 'sha256').hexdigest())

    d = hashlib.sha256()
    d.update(str(sorted(chs)).encode())

    return d.hexdigest()


class ChecksumRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            dir = ROOT
        else:
            dir = os.path.join(ROOT, self.path.lstrip('/'))
        chs = checksum(dir)

        self.send_response(200)
        self.end_headers()
        self.wfile.write(chs.encode())
        self.wfile.flush()


class ChecksumServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
    pass


s = ChecksumServer(('', 8888), ChecksumRequestHandler)
s.serve_forever()



Вот тебе шаблон для старта. Пользоваться так:

curl http://localhost:8888             # hash ROOT recursively
curl http://localhost:8888/foo         # hash ROOT/foo recursively
curl http://localhost:8888/foo/bar.txt # hash ROOT/foo/bar.txt

urxvt ★★★★★
()

А в чем проблема включить ETag’и на веб-сервере, раздающем файлы? Тогда запросить хэш можно будет без скачивания файла, обычным HEAD-запросом. Ну или использовать условные запросы вроде If-None-Match

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)

Над попробовать. Ничего не обещаю. Ток меня lua покусала на lua-sec. Хотя в попу ностальжи кольнуло, может Сишечка на KORE.io нинаю пока, может к тому моменту как раздуплюсь вже ничего не надо будет…

Сертификаты для подключения я так понял должны быть самоподписаны.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Пишешь на flask/sinatra/php/что_нравится выдёргивание параметров из урла, как на древних сайтах, в параметрах путь и хэш, запускается sha1sum, обратно отдаётся true-false - всё. Жсон добавит только пару строк.

yu-boot ★★★★★
()