Перейти к содержимому
  • 0
kaka888

Как запросить часть файла через component.internet.request()

Вопрос

Здравствуйте! Написал на сервере прогу в OpenOS для вывода на экран логов сервера, на котором играю. Их по ссылке может открыть любой человек в браузере, а когда логи уже открыты нужно перезагрузить страницу браузера, чтобы подгрузились последние логи. Логи сервера разделены на части по суткам. Крч я не понимаю как сделать нормальную подгрузку новых логов через internet.request(). Пока я смог сделать только так: заново вызвать internet.request() и прочитать веб-страницу, выводя заново каждую строку логов (а их там овер много, так что вывод на экран полного дня логов занимает 1-3 минуты). Может быть можно как-то с конца прочитать страницу??? Как ускорить этот процесс обновления логов на опенкомпе?

Ссылка на логи.

Изменено пользователем kaka888

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

1 час назад, kaka888 сказал:

....

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поправьте меня, если я ошибаюсь, но, насколько я помню, компонент интернет-платы не позволяет провернуть операцию, аналогичную seek - поэтому приходится загружать контент целиком, "скипая" содержимое до интересующего места. А логи в примерах довольно жирные для опенкомпов, файлы > 500 кб всегда грузятся ощутимо долго.

 

Если есть доступ к директории сервака, то можно накатать простенький php-скрипт, выдающий содержимое файла с конца:

https://stackoverflow.com/questions/2961618/how-to-read-only-5-last-line-of-the-text-file-in-php

 

Или же при наличии сокет-сервера пушить в него каждую отправляемую в лог строку, а затем читать на опенкомпах через internet.connect. Если же доступа к хосту нет, но есть собственная VPS'ка - можно накатать аналогичный скрипт с небольшими модификациями для файлов по удалёнке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, эту задачу надо решать со стороны сервера.

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

И отдавать контент файла начиная с указанного места.

 

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

 

Третий способ - норкоманский.

Делаешь несколько OC компов, которые с интервалом в, скажем, 20 секунд начинают выкачивать лог, каждый со своей интернет карты. И далее по очереди отдают свежий лог на центральный комп.

Этакий мультитрединг.

"Лаг" в 1-3 минуты останется, но частота обновления контента повысится. =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не-е, нельзя быть таким пессимистичным. Всё можно, и вопрос решается очень легко. В HTTP/1.1 есть хедер Range, который позволяет скачивать файлы кусками. Кроме того, OC умеет посылать и получать хедеры.

local socket = component.internet.request("https://logs.s7.mcskill.ru/Hitechcraft_Public_Logs/public_logs/Hitechcraft_Public_Logs/14-02-2020.txt", nil, {
  Range = ("bytes=%d-"):format(start)
})

local data = ""

while true do
  local chunk = socket.read()
  
  if not chunk then
    break
  end
  
  data = data .. chunk
end

local _, _, headers = socket.response()

print("Got: " .. #data)
print("Content-Length: " .. headers["Content-Length"][1])
print("Content-Range: " .. headers["Content-Range"][1])

Вместо start подставить количество байт, уже прочитанных. Там указывается начало диапазона номером байта (начиная с 0), от которого нужно выдать ответ. См. доки.

 

Поэтому тактика такая:

  1. Посылаем запрос с методом HEAD (4 параметр к component.internet.request), чтобы получить только хедеры.
  2. Читаем в хедерах значение Content-Length.
  3. Начинаем запрашивать куски файла с конца, пока не наберём нужно кол-во строк.
  4. После получения начальных строк запомним позицию последнего байта и дальше запрашиваем инфу после него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@kaka888 у тебя там уязвимость: команда /m тоже логгируется и лс видно всем

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, hohserg сказал:

@kaka888 у тебя там уязвимость: команда /m тоже логгируется и лс видно всем

1. Это не уязвимость, это ЛОГИ.

2. Это не мой сервер, я просто там играю.

Изменено пользователем kaka888

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так в результате этих логов любой юзер может смотреть лс любого игрока. Если ты считаешь, что искать по файлам переписки отдельных игроков сложно, то это ни разу не так, ибо можно автоматизировать. Например, при помощи конвейерных стандартных команд unix

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, hohserg сказал:

Так в результате этих логов любой юзер может смотреть лс любого игрока. Если ты считаешь, что искать по файлам переписки отдельных игроков сложно, то это ни разу не так, ибо можно автоматизировать. Например, при помощи конвейерных стандартных команд unix

ничего я не считаю и я сам знаю как это автоматизировать. Но при чём тут это сейчас? На моём проекте так было всегда и всех всё устраивает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Я бы не стал играть на таком проекте, где каждый желающий может чекать мои лс

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Скрытый текст

local component = require('component')
local data = 0
while true do
    local socket = component.internet.request("https://logs.s7.mcskill.ru/Hitechcraft_Public_Logs/public_logs/Hitechcraft_Public_Logs/20-02-2020.txt", nil, {
        Range = ("bytes=%d-"):format(data)
    })

    while true do
        local chunk = socket.read()

        if not chunk then
            break
        end
        if (#chunk > 0) then
            data = data + #chunk
            io.write(chunk)
        end
    end
end

 

Изменено пользователем whiskas

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
25 минут назад, hohserg сказал:

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

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

Я бы не стал играть на таком проекте, где каждый желающий может чекать мои лс

Там можно общаться через голосовой чат и через чат на Lua.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, kaka888 сказал:

Там можно общаться через голосовой чат

Это болььь. Иза этого чата я стал играть без звука в майнкрафте. Какието школьники с писклявым голосом бросаются на тебя с словами "я твою мамку." или "Го пвп трус, сыкло го пвп". Или же некоторые индивидиумы бегающие з музыкой. Или же пукающие рыгающие крычащие в микровон уроды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, whiskas сказал:

Это болььь. Иза этого чата я стал играть без звука в майнкрафте. Какието школьники с писклявым голосом бросаются на тебя с словами "я твою мамку." или "Го пвп трус, сыкло го пвп". Или же некоторые индивидиумы бегающие з музыкой. Или же пукающие рыгающие крычащие в микровон уроды.

Вообще-то таких индивидов можно отдельно замутить в настройках голос. чата)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
14 минуты назад, whiskas сказал:

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

Отлично, осталось дописать фильтрацию лс и можно троллить игроков на сервере :giggle:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, kaka888 сказал:

Вообще-то таких индивидов можно отдельно замутить в настройках голос. чата)

1) Голосовой чат как я помню не мутился.

2) А отдельных индивидиумов можна замутить уже после того как они тебе психику сломают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, hohserg сказал:

Отлично, осталось дописать фильтрацию лс и можно троллить игроков на сервере :giggle:

Игроков уже давно троллят ЛСами

Изменено пользователем kaka888

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, whiskas сказал:

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

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

[...]

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

  1. Нет смысла качать мегабайт логов, которые всё равно не влезут в консоль. Нужно вытащить последние строки, например алгоритмом, который я описал в прошлом посте.
  2. Не нужно досить сервер запросами. Добавить хотя бы os.sleep(5).
  3. Проверять, изменились ли логи, можно через ETag. Его сервер тоже посылает.
  4. Проверять, что #chunk > 0, смысла не имеет. Там есть 3 случая: nil, когда оборвано соединение, "", если просто пока нет ответа, или же строка с данными.
  5. Прога такая работать будет не более суток. Затем она перестанет обновляться. Думаю, ясно почему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Скрытый текст

UxhYSLdXJk.png

https://raw.githubusercontent.com/BrightYC/Other/master/log-print.lua

Изменено пользователем BrightYC

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...