Add Siemens software catalog
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
# Store archives in Git LFS.
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.cab filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
||||
@@ -0,0 +1,2 @@
|
||||
node_modules/
|
||||
.pnpm-store/
|
||||
@@ -0,0 +1,138 @@
|
||||
# Правила ведения каталога
|
||||
|
||||
Эти правила действуют для всего репозитория. Перед изменением метаданных сверяйся
|
||||
с `schema/index.schema.json`. Не добавляй поля, которых нет в схеме.
|
||||
|
||||
## Структура
|
||||
|
||||
- Корень репозитория является корнем каталога; папку `catalog` создавать не
|
||||
нужно.
|
||||
- Каждая категория и каждая программа находятся в собственной папке и содержат
|
||||
ровно один файл `index.yaml`.
|
||||
- Вложенность категорий не ограничена. Дочерние категории и программы
|
||||
определяются по файловой структуре и не перечисляются в индексе категории.
|
||||
- Имя папки — стабильный идентификатор. Используй строчные латинские буквы,
|
||||
цифры, дефис и подчёркивание.
|
||||
- В папке программы все загружаемые файлы находятся в `files`, а скриншоты — в
|
||||
`img`.
|
||||
- Не создавай отдельные YAML-файлы или папки метаданных для версий. Все версии
|
||||
описываются в `versions` единственного `index.yaml` программы.
|
||||
- Папки без `index.yaml`, например `schema`, `files` и `img`, не являются
|
||||
категориями.
|
||||
|
||||
## YAML категории
|
||||
|
||||
Используй только следующие обязательные поля и сохраняй их порядок:
|
||||
|
||||
```yaml
|
||||
format: 1
|
||||
type: category
|
||||
name: Русское название категории
|
||||
description: Описание категории на русском языке.
|
||||
```
|
||||
|
||||
## YAML программы
|
||||
|
||||
Поля программы располагай в следующем порядке:
|
||||
|
||||
1. `format: 1` — обязательное поле.
|
||||
2. `type: program` — обязательное поле.
|
||||
3. `name` — обязательное официальное название программы.
|
||||
4. `description` — обязательное подробное описание на русском языке в формате
|
||||
Markdown.
|
||||
5. `homepage` — необязательный URL домашней страницы.
|
||||
6. `source` — необязательный URL исходного кода.
|
||||
7. `screenshots` — обязательный массив путей; используй `[]`, если изображений
|
||||
нет.
|
||||
8. `versions` — обязательный непустой массив версий.
|
||||
9. `additional_files` — необязательный массив файлов, не привязанных к версии.
|
||||
|
||||
Новые версии добавляй в начало `versions`, от новых к старым. Каждая версия
|
||||
имеет такой вид:
|
||||
|
||||
```yaml
|
||||
- version: "1.2.0"
|
||||
status: current
|
||||
released: "2007-08-14"
|
||||
files:
|
||||
- path: files/program-1.2.0.zip
|
||||
description: Назначение файла на русском языке
|
||||
platform: win32
|
||||
sha256: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
|
||||
```
|
||||
|
||||
Поля версии располагай в порядке `version`, `status`, `released`, `description`,
|
||||
`files`. Обязательны только `version` и непустой массив `files`. Необязательный
|
||||
`status` принимает `current` для актуальной версии и `archived` для устаревшей,
|
||||
сохранённой ради архива. Если статусы используются у программы, указывай их у
|
||||
всех её версий. Поле `released` добавляй только при наличии достоверной даты.
|
||||
Не переноси changelog в `description` версии и не добавляй это поле для полноты.
|
||||
Оно допустимо только в особом случае, когда нужно зафиксировать существенное
|
||||
ограничение, которое нельзя выразить номером версии или описанием конкретного
|
||||
файла.
|
||||
|
||||
Необязательное поле файла `platform` принимает одно из значений: `win32`,
|
||||
`win64`, `dos`, `java` или `j2me`. Для Windows разрядность входит в название
|
||||
платформы; отдельное поле `architecture` не используется.
|
||||
|
||||
Файлы, которые подходят ко всем версиям или существуют отдельно от релиза,
|
||||
помещай в `additional_files`, а не внутрь случайной версии:
|
||||
|
||||
```yaml
|
||||
additional_files:
|
||||
- path: files/manual.pdf
|
||||
description: Руководство пользователя
|
||||
```
|
||||
|
||||
## Текст и достоверность
|
||||
|
||||
- Названия категорий, описания программ, версий и файлов пиши на русском языке.
|
||||
Официальные названия продуктов и технологий не переводи.
|
||||
- Сохраняй полноту исходного описания. Не сокращай перечень возможностей до
|
||||
общего пересказа и не удаляй значимые технические подробности.
|
||||
- Содержимое каждого `description` интерпретируется как Markdown. Для длинного
|
||||
описания со списком используй литеральный блок `|-` и Markdown-списки; для
|
||||
обычного абзаца, перенесённого на несколько строк, используй `>-`. Не вставляй
|
||||
HTML-разметку.
|
||||
- Не выдумывай даты, ссылки, возможности или платформы. Неизвестное
|
||||
необязательное поле лучше не добавлять.
|
||||
- Сначала пытайся определить версию по странице, имени файла, README и
|
||||
метаданным бинарника. Если номер версии нигде не указан и достоверно получить
|
||||
его невозможно, используй каталоговое значение `version: "1.0"`. Не выводи
|
||||
номер версии из даты сборки.
|
||||
- Если источник содержит только текущую версию, добавляй только её. Не ищи
|
||||
более ранние архивы в Wayback Machine без отдельного указания пользователя.
|
||||
|
||||
## Пути и файлы
|
||||
|
||||
- Все пути относительны папке программы и используют `/`.
|
||||
- Путь загружаемого файла начинается с `files/`; путь скриншота — с `img/`.
|
||||
- Абсолютные пути, `..` и обратная косая черта запрещены.
|
||||
- Каждый путь из YAML должен указывать на существующий файл.
|
||||
- Один файл нельзя одновременно указывать в `versions` и `additional_files`.
|
||||
- Для каждого добавленного файла вычисляй и указывай SHA-256 в нижнем регистре.
|
||||
- Архивы должны проходить через Git LFS согласно `.gitattributes`. Остальные
|
||||
файлы хранятся в обычном Git.
|
||||
|
||||
## Стиль YAML
|
||||
|
||||
- Кодировка — UTF-8, окончания строк — LF, отступ — два пробела, табуляция
|
||||
запрещена.
|
||||
- Версии и даты всегда заключай в двойные кавычки.
|
||||
- Дата имеет формат `YYYY-MM-DD`, SHA-256 — ровно 64 шестнадцатеричных символа.
|
||||
- Не используй YAML-теги, anchors, aliases и merge keys.
|
||||
- Не допускай неизвестных полей и дубликатов в массивах.
|
||||
|
||||
## Проверка
|
||||
|
||||
Перед завершением изменения:
|
||||
|
||||
1. Проверь синтаксис всех затронутых `index.yaml` безопасным YAML-парсером.
|
||||
2. Проверь их по `schema/index.schema.json` валидатором JSON Schema Draft 2020-12,
|
||||
если он доступен.
|
||||
3. Убедись, что все пути существуют и их SHA-256 совпадает с метаданными.
|
||||
Для заполнения и обновления сумм используй `pnpm sha256 [путь]`, для проверки
|
||||
без изменения файлов — `pnpm sha256:check [путь]`.
|
||||
4. Для каждого нового архива выполни `git check-attr filter -- <путь>` и
|
||||
убедись, что значение равно `lfs`.
|
||||
5. Выполни `git diff --check`.
|
||||
@@ -0,0 +1,182 @@
|
||||
# Каталог программ
|
||||
|
||||
Репозиторий хранит дистрибутивы программ и их метаданные. Все пользовательские
|
||||
названия и описания пишутся на русском языке. Официальные названия программ,
|
||||
версии, имена платформ и другие технические значения переводить не нужно.
|
||||
|
||||
## Структура
|
||||
|
||||
Корень репозитория одновременно является корнем каталога программ. Вложенность
|
||||
категорий не ограничена. Имя папки служит стабильным машиночитаемым
|
||||
идентификатором: используйте строчные латинские буквы, цифры, дефис и
|
||||
подчёркивание.
|
||||
|
||||
```text
|
||||
./
|
||||
├── index.yaml
|
||||
├── schema/
|
||||
│ └── index.schema.json
|
||||
└── system/
|
||||
├── index.yaml
|
||||
└── file-managers/
|
||||
├── index.yaml
|
||||
└── example-program/
|
||||
├── index.yaml
|
||||
├── img/
|
||||
│ └── screenshot.png
|
||||
└── files/
|
||||
├── example-program-1.0.0.zip
|
||||
├── example-program-1.1.0.zip
|
||||
└── manual.pdf
|
||||
```
|
||||
|
||||
Каждая категория и каждая программа содержит ровно один `index.yaml`:
|
||||
|
||||
- `type: category` означает категорию; рядом могут находиться подкатегории и
|
||||
программы;
|
||||
- `type: program` означает программу; все её версии описываются в этом же
|
||||
файле;
|
||||
- `img` и `files` — зарезервированные папки внутри программы.
|
||||
|
||||
Папки без `index.yaml`, например корневая `schema`, не входят в дерево
|
||||
категорий.
|
||||
|
||||
Список дочерних элементов категории не дублируется в YAML: он определяется по
|
||||
вложенным папкам. Благодаря этому перемещение программы не требует правки
|
||||
родительских индексов.
|
||||
|
||||
## Категория
|
||||
|
||||
```yaml
|
||||
format: 1
|
||||
type: category
|
||||
name: Системные программы
|
||||
description: Утилиты для настройки и обслуживания устройства.
|
||||
```
|
||||
|
||||
## Программа
|
||||
|
||||
```yaml
|
||||
format: 1
|
||||
type: program
|
||||
name: Пример программы
|
||||
description: |-
|
||||
Краткое описание назначения и возможностей программы.
|
||||
|
||||
Возможности:
|
||||
- первая возможность;
|
||||
- вторая возможность.
|
||||
homepage: https://example.org/program
|
||||
source: https://github.com/example/program
|
||||
screenshots:
|
||||
- img/screenshot.png
|
||||
versions:
|
||||
- version: "1.1.0"
|
||||
status: current
|
||||
released: "2007-08-14"
|
||||
files:
|
||||
- path: files/example-program-1.1.0.zip
|
||||
description: Дистрибутив программы
|
||||
platform: win32
|
||||
sha256: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
|
||||
- version: "1.0.0"
|
||||
files:
|
||||
- path: files/example-program-1.0.0.zip
|
||||
additional_files:
|
||||
- path: files/manual.pdf
|
||||
description: Руководство пользователя
|
||||
```
|
||||
|
||||
Обязательные поля программы: `format`, `type`, `name`, `description`,
|
||||
`screenshots`, `versions`. Поля `homepage`, `source` и `additional_files`
|
||||
необязательны.
|
||||
|
||||
Поле `description` содержит Markdown. Для содержательного описания используйте
|
||||
абзацы и списки внутри литерального YAML-блока `|-`.
|
||||
|
||||
Все файлы программы хранятся в её папке `files`. Версионные файлы перечислены
|
||||
в `versions[].files`, а не зависящие от версии — в `additional_files`. Один и
|
||||
тот же файл не следует указывать в обоих местах. Новые версии добавляются в
|
||||
начало массива `versions`, от новых к старым.
|
||||
|
||||
Необязательное поле файла `platform` использует короткие машиночитаемые
|
||||
значения: `win32`, `win64`, `dos`, `java` или `j2me`. Отдельного поля
|
||||
архитектуры нет: разрядность Windows уже включена в `win32` или `win64`.
|
||||
|
||||
Необязательное поле `status` принимает значение `current` для актуальной версии
|
||||
или `archived` для версии, оставленной в каталоге как архивная. Если программа
|
||||
использует статусы, они указываются у всех её версий.
|
||||
|
||||
`description` версии используется только для существенных исключений, которые
|
||||
нельзя выразить номером версии или описанием файла. Обычный список изменений в
|
||||
индекс не переносится.
|
||||
|
||||
Скриншоты хранятся в `img`; пути всегда начинаются с `img/`. Если скриншотов
|
||||
нет, указывается пустой массив: `screenshots: []`.
|
||||
|
||||
## Правила формата
|
||||
|
||||
- Кодировка всех YAML-файлов — UTF-8, окончания строк — LF.
|
||||
- `format` — версия формата метаданных. Текущее значение: `1`.
|
||||
- Неизвестные поля запрещены: расширение формата требует изменения схемы.
|
||||
- Все пути задаются относительно папки программы. Абсолютные пути, `..` и
|
||||
обратная косая черта запрещены.
|
||||
- Даты записываются строкой `YYYY-MM-DD` и берутся в кавычки.
|
||||
- URL используют только `http` или `https`.
|
||||
- `sha256`, если указан, содержит 64 шестнадцатеричных символа в нижнем
|
||||
регистре.
|
||||
- Массивы не должны содержать дубликаты.
|
||||
- Описания программы, версии и файла пишутся на русском языке.
|
||||
|
||||
Архивы хранятся через Git LFS, остальные файлы — как обычные объекты Git.
|
||||
|
||||
## Заполнение SHA-256
|
||||
|
||||
Для установки зависимостей используется pnpm:
|
||||
|
||||
```shell
|
||||
pnpm install
|
||||
```
|
||||
|
||||
Команда вычисляет контрольные суммы всех файлов из `versions` и
|
||||
`additional_files`, после чего добавляет или обновляет поля `sha256`:
|
||||
|
||||
```shell
|
||||
pnpm sha256
|
||||
```
|
||||
|
||||
Можно ограничить обход одной программой, категорией или конкретным индексом:
|
||||
|
||||
```shell
|
||||
pnpm sha256 service/repair-tools/joker
|
||||
pnpm sha256 service/repair-tools/joker/index.yaml
|
||||
```
|
||||
|
||||
Для проверки без изменения YAML используется отдельная команда:
|
||||
|
||||
```shell
|
||||
pnpm sha256:check
|
||||
```
|
||||
|
||||
## Дерево каталога
|
||||
|
||||
Дерево категорий и программ строится по файловой структуре и названиям из
|
||||
`index.yaml`:
|
||||
|
||||
```shell
|
||||
pnpm tree
|
||||
```
|
||||
|
||||
Можно вывести только выбранную ветку, добавить пути каталогов или версии
|
||||
программ:
|
||||
|
||||
```shell
|
||||
pnpm tree service/repair-tools
|
||||
pnpm tree --paths
|
||||
pnpm tree --versions
|
||||
```
|
||||
|
||||
Формальная JSON Schema находится в
|
||||
[`schema/index.schema.json`](schema/index.schema.json). Она проверяет структуру
|
||||
и значения `index.yaml`; соответствие русского текста проверяется при ревью,
|
||||
поскольку название продукта может состоять из латинских символов.
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,29 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: ArmDebugger
|
||||
description: |-
|
||||
Отладчик для телефонов Siemens 65/70/75-й серии.
|
||||
|
||||
Возможности:
|
||||
- автоматическая генерация CGSN-патча по слитому фулфлешу;
|
||||
- просмотр содержимого памяти телефона в HEX-дампе;
|
||||
- ARM/Thumb-дизассемблер с inline-ассемблером;
|
||||
- пошаговая трассировка программы или процесса;
|
||||
- установка точек мониторинга на любой адрес флеш-памяти и на запись в
|
||||
диапазон RAM;
|
||||
- редактирование памяти, в том числе флеш-области, с использованием замещения
|
||||
flash-страниц;
|
||||
- поиск байтов, строк и ссылок в памяти;
|
||||
- интеграция с Keil ARM Tools;
|
||||
- дамп памяти в файл, вызов функций flash с параметрами и hex/bin/dec
|
||||
калькулятор.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "0.7.9"
|
||||
released: "2006-12-28"
|
||||
files:
|
||||
- path: files/ArmDebugger-079.rar
|
||||
description: Отладчик, краткое руководство и примеры для Keil ARM Tools
|
||||
platform: win32
|
||||
sha256: 94e089e35a4733c97890c34c14d065007332057f5b11693a7f94cca7245251ad
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Отладчики
|
||||
description: Программы для анализа памяти, машинного кода и выполнения программ.
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Средства разработки
|
||||
description: Инструменты для исследования и разработки программного обеспечения телефонов.
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Инструменты Java ME
|
||||
description: Программы для разработки, настройки и подготовки приложений Java ME.
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,30 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: MidletSigner
|
||||
description: |-
|
||||
Программа для самостоятельного создания сертификата и подписывания
|
||||
Java-мидлетов на телефонах Siemens 65-й и 75-й серий.
|
||||
|
||||
Подписанный мидлет может работать без постоянных запросов подтверждения при
|
||||
чтении и записи файлов, выходе в интернет, отправке SMS и MMS, доступе к
|
||||
COM-порту, Bluetooth, адресной книге, органайзеру и мультимедийным функциям.
|
||||
Подпись также позволяет автоматически запускать мидлет по времени или
|
||||
событию.
|
||||
|
||||
Программа работает из командной строки с JAD- и JAR-файлами. Для работы
|
||||
требуется JRE версии 1.3 или новее. Для телефонов 65-й серии нужен OpenDisc
|
||||
2.0, а для телефонов 75-й серии в телефон должен быть введён SKEY.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "5"
|
||||
files:
|
||||
- path: files/MidletSigner5.rar
|
||||
description: MidletSigner 5 с русским и английским руководствами
|
||||
platform: java
|
||||
sha256: ad81aebd58ddf45a57c42123d708214aa2cd1297cf1c871c95b8808f70939046
|
||||
additional_files:
|
||||
- path: files/JRE131L.rar
|
||||
description: Минимальный JRE 1.3.1 только для запуска MidletSigner
|
||||
platform: win32
|
||||
sha256: 0236f9e6fd71537d878792b7aa4cf6b20c2a729ae9672c81d6e69289f1afcf89
|
||||
Binary file not shown.
@@ -0,0 +1,23 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: FFPatch
|
||||
description: |-
|
||||
Программа для сравнения двух файлов fullflash, сохранения найденных отличий
|
||||
в виде патча VKP и поиска уже установленных патчей в образе flash-памяти.
|
||||
|
||||
Возможности:
|
||||
- сравнение оригинального и текущего fullflash;
|
||||
- формирование файла различий в формате VKP;
|
||||
- поиск одного или нескольких патчей VKP в fullflash;
|
||||
- добавление патчей отдельными файлами или целым каталогом;
|
||||
- исключение заданных диапазонов адресов из поиска и сравнения;
|
||||
- сохранение настроек фильтрации адресов.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "0.4.2"
|
||||
files:
|
||||
- path: files/ffpatch.rar
|
||||
description: Программа FFPatch и руководство пользователя
|
||||
platform: win32
|
||||
sha256: 6fef324ef0e22d97dc550e6bb20acd1a5edb4c6d773784f1edb2ad3ad854aac6
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: FilesComparer
|
||||
description: |-
|
||||
Программа для сравнения файлов и образов flash-памяти.
|
||||
|
||||
Возможности:
|
||||
- сравнение файлов одинакового и разного размера;
|
||||
- ограничение сравнения начальным и конечным адресами;
|
||||
- передача параметров через командную строку;
|
||||
- выравнивание результатов по байтам;
|
||||
- работа под DOS и Windows.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "1.2"
|
||||
files:
|
||||
- path: files/fc_v1.2.rar
|
||||
description: Программа FilesComparer 1.2
|
||||
platform: win32
|
||||
sha256: 1e2416941803cf80c9a56a859b0cc2e714388e5f907d89403c0d3f05c7520cc4
|
||||
Binary file not shown.
@@ -0,0 +1,20 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: Hex2VKP
|
||||
description: |-
|
||||
Консольный конвертер из формата Intel HEX в формат патчей VKP программы
|
||||
V_KLay.
|
||||
|
||||
Intel HEX применяется для загрузки данных в микроконтроллеры и может быть
|
||||
создан компиляторами для C166, включая Keil и Tasking C. Hex2VKP преобразует
|
||||
результат компиляции в патч VKP для последующей записи через V_KLay. Ключ
|
||||
`-F` создаёт секцию отмены патча `UNDO PATCH`.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "0.1a"
|
||||
files:
|
||||
- path: files/hex2vkp.zip
|
||||
description: Программа Hex2VKP, исходный код, настройки и руководство
|
||||
platform: win32
|
||||
sha256: 10149c6770337551f18f5ff948acf9e3fbd025fca3e97a1f0f1cab9702301786
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Средства создания патчей
|
||||
description: Программы для сравнения прошивок, поиска изменений и создания патчей VKP.
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,23 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: SLFC
|
||||
description: |-
|
||||
Консольная программа для сравнения двух файлов fullflash и создания патча в
|
||||
формате VKP.
|
||||
|
||||
Совпадающие байты можно учитывать по правилу: если их не больше трёх, они
|
||||
включаются в патч; более длинная совпадающая последовательность считается
|
||||
окончанием блока изменений.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "1.0"
|
||||
files:
|
||||
- path: files/slfc-chaos.exe
|
||||
description: Сборка SLFC со страницы автора Chaos
|
||||
platform: win32
|
||||
sha256: 6b77b967ab44dccb4d3038df9d95cebbcdf9f3162183990d9516c32cd2d450e6
|
||||
- path: files/slfc-vi-soft.exe
|
||||
description: Сборка SLFC со страницы vi-soft.com.ua
|
||||
platform: win32
|
||||
sha256: 3ec3143bc70f6ad7d0efaa41e0c666a9213c5e8c4163b11c05dfa999335600e4
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Каталог программ
|
||||
description: Программы и утилиты для мобильных устройств Siemens.
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Работа со звуком
|
||||
description: Инструменты для преобразования и обработки звуковых файлов телефонов.
|
||||
Binary file not shown.
@@ -0,0 +1,17 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: vmo2wav
|
||||
description: |-
|
||||
Консольный конвертер диктофонных записей Siemens SL45 из формата VMO в WAV.
|
||||
|
||||
По умолчанию программа нормализует уровень сигнала. Нормализацию можно
|
||||
отключить параметром `-n`.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "1.0"
|
||||
files:
|
||||
- path: files/vmo2wav.zip
|
||||
description: Конвертер vmo2wav и руководство пользователя
|
||||
platform: win32
|
||||
sha256: fb89b2df0dc483a7a418002aee7e3d070a7613c16142246f815d08e5b527dd6c
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Мультимедиа
|
||||
description: Программы для обработки звука, изображений и других мультимедийных данных.
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "siemens-software-catalog",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"packageManager": "pnpm@11.3.0",
|
||||
"scripts": {
|
||||
"sha256": "tsx scripts/fillSha256.ts",
|
||||
"sha256:check": "tsx scripts/fillSha256.ts --check",
|
||||
"tree": "tsx scripts/printTree.ts",
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^26.2.0",
|
||||
"tsx": "^4.23.12",
|
||||
"typescript": "^7.0.2",
|
||||
"yaml": "^2.9.0"
|
||||
}
|
||||
}
|
||||
Generated
+540
@@ -0,0 +1,540 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
devDependencies:
|
||||
'@types/node':
|
||||
specifier: ^26.2.0
|
||||
version: 26.2.0
|
||||
tsx:
|
||||
specifier: ^4.23.12
|
||||
version: 4.23.12
|
||||
typescript:
|
||||
specifier: ^7.0.2
|
||||
version: 7.0.2
|
||||
yaml:
|
||||
specifier: ^2.9.0
|
||||
version: 2.9.0
|
||||
|
||||
packages:
|
||||
|
||||
'@esbuild/aix-ppc64@0.28.2':
|
||||
resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [ppc64]
|
||||
os: [aix]
|
||||
|
||||
'@esbuild/android-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@esbuild/android-arm@0.28.2':
|
||||
resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm]
|
||||
os: [android]
|
||||
|
||||
'@esbuild/android-x64@0.28.2':
|
||||
resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [android]
|
||||
|
||||
'@esbuild/darwin-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@esbuild/darwin-x64@0.28.2':
|
||||
resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@esbuild/freebsd-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [freebsd]
|
||||
|
||||
'@esbuild/freebsd-x64@0.28.2':
|
||||
resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@esbuild/linux-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-arm@0.28.2':
|
||||
resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-ia32@0.28.2':
|
||||
resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [ia32]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-loong64@0.28.2':
|
||||
resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [loong64]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-mips64el@0.28.2':
|
||||
resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [mips64el]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-ppc64@0.28.2':
|
||||
resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [ppc64]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-riscv64@0.28.2':
|
||||
resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-s390x@0.28.2':
|
||||
resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [s390x]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/linux-x64@0.28.2':
|
||||
resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@esbuild/netbsd-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [netbsd]
|
||||
|
||||
'@esbuild/netbsd-x64@0.28.2':
|
||||
resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [netbsd]
|
||||
|
||||
'@esbuild/openbsd-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [openbsd]
|
||||
|
||||
'@esbuild/openbsd-x64@0.28.2':
|
||||
resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [openbsd]
|
||||
|
||||
'@esbuild/openharmony-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [openharmony]
|
||||
|
||||
'@esbuild/sunos-x64@0.28.2':
|
||||
resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [sunos]
|
||||
|
||||
'@esbuild/win32-arm64@0.28.2':
|
||||
resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@esbuild/win32-ia32@0.28.2':
|
||||
resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
|
||||
'@esbuild/win32-x64@0.28.2':
|
||||
resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
|
||||
engines: {node: '>=18'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@types/node@26.2.0':
|
||||
resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==}
|
||||
|
||||
'@typescript/typescript-aix-ppc64@7.0.2':
|
||||
resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [ppc64]
|
||||
os: [aix]
|
||||
|
||||
'@typescript/typescript-darwin-arm64@7.0.2':
|
||||
resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@typescript/typescript-darwin-x64@7.0.2':
|
||||
resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@typescript/typescript-freebsd-arm64@7.0.2':
|
||||
resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [freebsd]
|
||||
|
||||
'@typescript/typescript-freebsd-x64@7.0.2':
|
||||
resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@typescript/typescript-linux-arm64@7.0.2':
|
||||
resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-arm@7.0.2':
|
||||
resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-loong64@7.0.2':
|
||||
resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [loong64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-mips64el@7.0.2':
|
||||
resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [mips64el]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-ppc64@7.0.2':
|
||||
resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [ppc64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-riscv64@7.0.2':
|
||||
resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-s390x@7.0.2':
|
||||
resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [s390x]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-linux-x64@7.0.2':
|
||||
resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/typescript-netbsd-arm64@7.0.2':
|
||||
resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [netbsd]
|
||||
|
||||
'@typescript/typescript-netbsd-x64@7.0.2':
|
||||
resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [netbsd]
|
||||
|
||||
'@typescript/typescript-openbsd-arm64@7.0.2':
|
||||
resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [openbsd]
|
||||
|
||||
'@typescript/typescript-openbsd-x64@7.0.2':
|
||||
resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [openbsd]
|
||||
|
||||
'@typescript/typescript-sunos-x64@7.0.2':
|
||||
resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [sunos]
|
||||
|
||||
'@typescript/typescript-win32-arm64@7.0.2':
|
||||
resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@typescript/typescript-win32-x64@7.0.2':
|
||||
resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
esbuild@0.28.2:
|
||||
resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
fsevents@2.3.3:
|
||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
os: [darwin]
|
||||
|
||||
tsx@4.23.12:
|
||||
resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
hasBin: true
|
||||
|
||||
typescript@7.0.2:
|
||||
resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
hasBin: true
|
||||
|
||||
undici-types@8.3.0:
|
||||
resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==}
|
||||
|
||||
yaml@2.9.0:
|
||||
resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
|
||||
engines: {node: '>= 14.6'}
|
||||
hasBin: true
|
||||
|
||||
snapshots:
|
||||
|
||||
'@esbuild/aix-ppc64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/android-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/android-arm@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/android-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/darwin-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/darwin-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/freebsd-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/freebsd-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-arm@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-ia32@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-loong64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-mips64el@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-ppc64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-riscv64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-s390x@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/linux-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/netbsd-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/netbsd-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/openbsd-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/openbsd-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/openharmony-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/sunos-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/win32-arm64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/win32-ia32@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@esbuild/win32-x64@0.28.2':
|
||||
optional: true
|
||||
|
||||
'@types/node@26.2.0':
|
||||
dependencies:
|
||||
undici-types: 8.3.0
|
||||
|
||||
'@typescript/typescript-aix-ppc64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-darwin-arm64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-darwin-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-freebsd-arm64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-freebsd-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-arm64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-arm@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-loong64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-mips64el@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-ppc64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-riscv64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-s390x@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-linux-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-netbsd-arm64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-netbsd-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-openbsd-arm64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-openbsd-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-sunos-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-win32-arm64@7.0.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/typescript-win32-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
esbuild@0.28.2:
|
||||
optionalDependencies:
|
||||
'@esbuild/aix-ppc64': 0.28.2
|
||||
'@esbuild/android-arm': 0.28.2
|
||||
'@esbuild/android-arm64': 0.28.2
|
||||
'@esbuild/android-x64': 0.28.2
|
||||
'@esbuild/darwin-arm64': 0.28.2
|
||||
'@esbuild/darwin-x64': 0.28.2
|
||||
'@esbuild/freebsd-arm64': 0.28.2
|
||||
'@esbuild/freebsd-x64': 0.28.2
|
||||
'@esbuild/linux-arm': 0.28.2
|
||||
'@esbuild/linux-arm64': 0.28.2
|
||||
'@esbuild/linux-ia32': 0.28.2
|
||||
'@esbuild/linux-loong64': 0.28.2
|
||||
'@esbuild/linux-mips64el': 0.28.2
|
||||
'@esbuild/linux-ppc64': 0.28.2
|
||||
'@esbuild/linux-riscv64': 0.28.2
|
||||
'@esbuild/linux-s390x': 0.28.2
|
||||
'@esbuild/linux-x64': 0.28.2
|
||||
'@esbuild/netbsd-arm64': 0.28.2
|
||||
'@esbuild/netbsd-x64': 0.28.2
|
||||
'@esbuild/openbsd-arm64': 0.28.2
|
||||
'@esbuild/openbsd-x64': 0.28.2
|
||||
'@esbuild/openharmony-arm64': 0.28.2
|
||||
'@esbuild/sunos-x64': 0.28.2
|
||||
'@esbuild/win32-arm64': 0.28.2
|
||||
'@esbuild/win32-ia32': 0.28.2
|
||||
'@esbuild/win32-x64': 0.28.2
|
||||
|
||||
fsevents@2.3.3:
|
||||
optional: true
|
||||
|
||||
tsx@4.23.12:
|
||||
dependencies:
|
||||
esbuild: 0.28.2
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.3
|
||||
|
||||
typescript@7.0.2:
|
||||
optionalDependencies:
|
||||
'@typescript/typescript-aix-ppc64': 7.0.2
|
||||
'@typescript/typescript-darwin-arm64': 7.0.2
|
||||
'@typescript/typescript-darwin-x64': 7.0.2
|
||||
'@typescript/typescript-freebsd-arm64': 7.0.2
|
||||
'@typescript/typescript-freebsd-x64': 7.0.2
|
||||
'@typescript/typescript-linux-arm': 7.0.2
|
||||
'@typescript/typescript-linux-arm64': 7.0.2
|
||||
'@typescript/typescript-linux-loong64': 7.0.2
|
||||
'@typescript/typescript-linux-mips64el': 7.0.2
|
||||
'@typescript/typescript-linux-ppc64': 7.0.2
|
||||
'@typescript/typescript-linux-riscv64': 7.0.2
|
||||
'@typescript/typescript-linux-s390x': 7.0.2
|
||||
'@typescript/typescript-linux-x64': 7.0.2
|
||||
'@typescript/typescript-netbsd-arm64': 7.0.2
|
||||
'@typescript/typescript-netbsd-x64': 7.0.2
|
||||
'@typescript/typescript-openbsd-arm64': 7.0.2
|
||||
'@typescript/typescript-openbsd-x64': 7.0.2
|
||||
'@typescript/typescript-sunos-x64': 7.0.2
|
||||
'@typescript/typescript-win32-arm64': 7.0.2
|
||||
'@typescript/typescript-win32-x64': 7.0.2
|
||||
|
||||
undici-types@8.3.0: {}
|
||||
|
||||
yaml@2.9.0: {}
|
||||
@@ -0,0 +1,2 @@
|
||||
allowBuilds:
|
||||
esbuild: true
|
||||
@@ -0,0 +1,189 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "Индекс каталога программ",
|
||||
"description": "Схема index.yaml для категории или программы.",
|
||||
"oneOf": [
|
||||
{
|
||||
"$ref": "#/$defs/category"
|
||||
},
|
||||
{
|
||||
"$ref": "#/$defs/program"
|
||||
}
|
||||
],
|
||||
"$defs": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 120
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 4000,
|
||||
"contentMediaType": "text/markdown"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri",
|
||||
"pattern": "^https?://"
|
||||
},
|
||||
"filePath": {
|
||||
"type": "string",
|
||||
"pattern": "^(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)files/.+$"
|
||||
},
|
||||
"screenshotPath": {
|
||||
"type": "string",
|
||||
"pattern": "^(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)img/.+\\.(?:png|jpe?g|webp|gif)$"
|
||||
},
|
||||
"file": {
|
||||
"title": "Файл программы",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"path"
|
||||
],
|
||||
"properties": {
|
||||
"path": {
|
||||
"$ref": "#/$defs/filePath"
|
||||
},
|
||||
"description": {
|
||||
"$ref": "#/$defs/description"
|
||||
},
|
||||
"platform": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"win32",
|
||||
"win64",
|
||||
"dos",
|
||||
"java",
|
||||
"j2me"
|
||||
]
|
||||
},
|
||||
"sha256": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9a-f]{64}$"
|
||||
}
|
||||
}
|
||||
},
|
||||
"version": {
|
||||
"title": "Версия программы",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"version",
|
||||
"files"
|
||||
],
|
||||
"properties": {
|
||||
"version": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 80,
|
||||
"pattern": "^[^/\\\\]+$"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"current",
|
||||
"archived"
|
||||
]
|
||||
},
|
||||
"released": {
|
||||
"type": "string",
|
||||
"format": "date"
|
||||
},
|
||||
"description": {
|
||||
"$ref": "#/$defs/description"
|
||||
},
|
||||
"files": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"$ref": "#/$defs/file"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"category": {
|
||||
"title": "Категория",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"format",
|
||||
"type",
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"properties": {
|
||||
"format": {
|
||||
"const": 1
|
||||
},
|
||||
"type": {
|
||||
"const": "category"
|
||||
},
|
||||
"name": {
|
||||
"$ref": "#/$defs/name"
|
||||
},
|
||||
"description": {
|
||||
"$ref": "#/$defs/description"
|
||||
}
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"title": "Программа",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"format",
|
||||
"type",
|
||||
"name",
|
||||
"description",
|
||||
"screenshots",
|
||||
"versions"
|
||||
],
|
||||
"properties": {
|
||||
"format": {
|
||||
"const": 1
|
||||
},
|
||||
"type": {
|
||||
"const": "program"
|
||||
},
|
||||
"name": {
|
||||
"$ref": "#/$defs/name"
|
||||
},
|
||||
"description": {
|
||||
"$ref": "#/$defs/description"
|
||||
},
|
||||
"homepage": {
|
||||
"$ref": "#/$defs/url"
|
||||
},
|
||||
"source": {
|
||||
"$ref": "#/$defs/url"
|
||||
},
|
||||
"screenshots": {
|
||||
"type": "array",
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"$ref": "#/$defs/screenshotPath"
|
||||
}
|
||||
},
|
||||
"versions": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"$ref": "#/$defs/version"
|
||||
}
|
||||
},
|
||||
"additional_files": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"$ref": "#/$defs/file"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { createHash } from "node:crypto";
|
||||
import { createReadStream } from "node:fs";
|
||||
import {
|
||||
lstat,
|
||||
mkdir,
|
||||
readdir,
|
||||
readFile,
|
||||
realpath,
|
||||
rename,
|
||||
rm,
|
||||
stat,
|
||||
writeFile,
|
||||
} from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import process from "node:process";
|
||||
import { parseDocument } from "yaml";
|
||||
|
||||
type CatalogFile = {
|
||||
path?: unknown;
|
||||
sha256?: unknown;
|
||||
};
|
||||
|
||||
type ProgramIndex = {
|
||||
type?: unknown;
|
||||
versions?: Array<{ files?: CatalogFile[] }>;
|
||||
additional_files?: CatalogFile[];
|
||||
};
|
||||
|
||||
type Options = {
|
||||
check: boolean;
|
||||
targets: string[];
|
||||
};
|
||||
|
||||
type FileReference = {
|
||||
data: CatalogFile;
|
||||
yamlPath: Array<string | number>;
|
||||
};
|
||||
|
||||
const ignoredDirectories = new Set([".git", "node_modules", "files", "img"]);
|
||||
|
||||
function usage(): void {
|
||||
console.log(`Использование: pnpm sha256 [--check] [путь ...]
|
||||
|
||||
Без путей скрипт обходит текущий каталог. Путь может указывать на index.yaml
|
||||
или на папку, внутри которой нужно найти index.yaml.
|
||||
|
||||
--check только проверить суммы, не изменяя YAML
|
||||
--help показать эту справку`);
|
||||
}
|
||||
|
||||
function parseArguments(args: string[]): Options {
|
||||
const targets: string[] = [];
|
||||
let check = false;
|
||||
|
||||
for (const argument of args) {
|
||||
if (argument === "--check") {
|
||||
check = true;
|
||||
} else if (argument === "--help" || argument === "-h") {
|
||||
usage();
|
||||
process.exit(0);
|
||||
} else if (argument.startsWith("-")) {
|
||||
throw new Error(`Неизвестный параметр: ${argument}`);
|
||||
} else {
|
||||
targets.push(argument);
|
||||
}
|
||||
}
|
||||
|
||||
return { check, targets: targets.length > 0 ? targets : ["."] };
|
||||
}
|
||||
|
||||
async function findIndexes(target: string, result: Set<string>): Promise<void> {
|
||||
const absoluteTarget = path.resolve(target);
|
||||
const targetStat = await lstat(absoluteTarget);
|
||||
|
||||
if (targetStat.isFile()) {
|
||||
if (path.basename(absoluteTarget) !== "index.yaml") {
|
||||
throw new Error(`Ожидался index.yaml: ${target}`);
|
||||
}
|
||||
result.add(absoluteTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!targetStat.isDirectory()) {
|
||||
throw new Error(`Путь не является файлом или каталогом: ${target}`);
|
||||
}
|
||||
|
||||
const entries = await readdir(absoluteTarget, { withFileTypes: true });
|
||||
for (const entry of entries) {
|
||||
const entryPath = path.join(absoluteTarget, entry.name);
|
||||
if (entry.isFile() && entry.name === "index.yaml") {
|
||||
result.add(entryPath);
|
||||
} else if (entry.isDirectory() && !ignoredDirectories.has(entry.name)) {
|
||||
await findIndexes(entryPath, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function collectFileReferences(data: ProgramIndex): FileReference[] {
|
||||
const references: FileReference[] = [];
|
||||
|
||||
for (const [versionIndex, version] of (data.versions ?? []).entries()) {
|
||||
for (const [fileIndex, file] of (version.files ?? []).entries()) {
|
||||
references.push({
|
||||
data: file,
|
||||
yamlPath: ["versions", versionIndex, "files", fileIndex],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
for (const [fileIndex, file] of (data.additional_files ?? []).entries()) {
|
||||
references.push({
|
||||
data: file,
|
||||
yamlPath: ["additional_files", fileIndex],
|
||||
});
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
async function resolveCatalogFile(indexPath: string, value: unknown): Promise<string> {
|
||||
if (typeof value !== "string" || value.length === 0) {
|
||||
throw new Error("поле path отсутствует или не является строкой");
|
||||
}
|
||||
if (path.isAbsolute(value) || value.includes("\\")) {
|
||||
throw new Error(`недопустимый путь: ${value}`);
|
||||
}
|
||||
|
||||
const parts = value.split("/");
|
||||
if (parts[0] !== "files" || parts.some((part) => part === ".." || part === "")) {
|
||||
throw new Error(`путь должен находиться внутри files/: ${value}`);
|
||||
}
|
||||
|
||||
const programDirectory = path.dirname(indexPath);
|
||||
const filesDirectory = path.resolve(programDirectory, "files");
|
||||
const filePath = path.resolve(programDirectory, ...parts);
|
||||
const relativePath = path.relative(filesDirectory, filePath);
|
||||
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
||||
throw new Error(`путь выходит за пределы files/: ${value}`);
|
||||
}
|
||||
|
||||
const [realFilesDirectory, realFilePath] = await Promise.all([
|
||||
realpath(filesDirectory),
|
||||
realpath(filePath),
|
||||
]);
|
||||
const realRelativePath = path.relative(realFilesDirectory, realFilePath);
|
||||
if (realRelativePath.startsWith("..") || path.isAbsolute(realRelativePath)) {
|
||||
throw new Error(`символическая ссылка выходит за пределы files/: ${value}`);
|
||||
}
|
||||
if (!(await stat(realFilePath)).isFile()) {
|
||||
throw new Error(`путь не указывает на обычный файл: ${value}`);
|
||||
}
|
||||
|
||||
return realFilePath;
|
||||
}
|
||||
|
||||
async function calculateSha256(filePath: string): Promise<string> {
|
||||
const hash = createHash("sha256");
|
||||
for await (const chunk of createReadStream(filePath)) {
|
||||
hash.update(chunk);
|
||||
}
|
||||
return hash.digest("hex");
|
||||
}
|
||||
|
||||
async function writeAtomically(filePath: string, contents: string): Promise<void> {
|
||||
const directory = path.dirname(filePath);
|
||||
const temporaryPath = path.join(
|
||||
directory,
|
||||
`.${path.basename(filePath)}.${process.pid}.tmp`,
|
||||
);
|
||||
|
||||
await mkdir(directory, { recursive: true });
|
||||
try {
|
||||
await writeFile(temporaryPath, contents, "utf8");
|
||||
await rename(temporaryPath, filePath);
|
||||
} finally {
|
||||
await rm(temporaryPath, { force: true });
|
||||
}
|
||||
}
|
||||
|
||||
async function processIndex(indexPath: string, check: boolean): Promise<number> {
|
||||
const source = await readFile(indexPath, "utf8");
|
||||
const document = parseDocument(source, { prettyErrors: true });
|
||||
if (document.errors.length > 0) {
|
||||
throw new Error(document.errors.map((error) => error.message).join("; "));
|
||||
}
|
||||
|
||||
const data = document.toJS() as ProgramIndex;
|
||||
if (data.type !== "program") {
|
||||
return 0;
|
||||
}
|
||||
|
||||
let changed = 0;
|
||||
const errors: string[] = [];
|
||||
const references = collectFileReferences(data);
|
||||
|
||||
const results = await Promise.all(
|
||||
references.map(async (reference) => {
|
||||
try {
|
||||
const filePath = await resolveCatalogFile(indexPath, reference.data.path);
|
||||
return { reference, digest: await calculateSha256(filePath) };
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
errors.push(`${String(reference.data.path)}: ${message}`);
|
||||
return undefined;
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
if (errors.length > 0) {
|
||||
throw new Error(errors.join("; "));
|
||||
}
|
||||
|
||||
for (const result of results) {
|
||||
if (result === undefined || result.reference.data.sha256 === result.digest) {
|
||||
continue;
|
||||
}
|
||||
changed += 1;
|
||||
if (!check) {
|
||||
document.setIn([...result.reference.yamlPath, "sha256"], result.digest);
|
||||
}
|
||||
}
|
||||
|
||||
const displayPath = path.relative(process.cwd(), indexPath) || indexPath;
|
||||
if (changed > 0 && check) {
|
||||
console.error(`${displayPath}: требуется обновить SHA-256 (${changed})`);
|
||||
} else if (changed > 0) {
|
||||
await writeAtomically(indexPath, document.toString());
|
||||
console.log(`${displayPath}: обновлено SHA-256 (${changed})`);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
async function main(): Promise<void> {
|
||||
const options = parseArguments(process.argv.slice(2));
|
||||
const indexes = new Set<string>();
|
||||
|
||||
for (const target of options.targets) {
|
||||
await findIndexes(target, indexes);
|
||||
}
|
||||
|
||||
let changed = 0;
|
||||
let failed = 0;
|
||||
for (const indexPath of [...indexes].sort()) {
|
||||
try {
|
||||
changed += await processIndex(indexPath, options.check);
|
||||
} catch (error) {
|
||||
failed += 1;
|
||||
const displayPath = path.relative(process.cwd(), indexPath) || indexPath;
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
console.error(`${displayPath}: ${message}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (failed > 0) {
|
||||
console.error(`Ошибок: ${failed}`);
|
||||
process.exitCode = 1;
|
||||
} else if (options.check && changed > 0) {
|
||||
console.error(`Файлов с несовпадениями: ${changed}`);
|
||||
process.exitCode = 1;
|
||||
} else {
|
||||
console.log(
|
||||
changed > 0
|
||||
? `Готово, обновлено полей: ${changed}`
|
||||
: `Готово, все SHA-256 актуальны. Проверено index.yaml: ${indexes.size}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await main();
|
||||
@@ -0,0 +1,222 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { lstat, readdir, readFile } from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import process from "node:process";
|
||||
import { parseDocument } from "yaml";
|
||||
|
||||
type CatalogType = "category" | "program";
|
||||
|
||||
type CatalogIndex = {
|
||||
type?: unknown;
|
||||
name?: unknown;
|
||||
versions?: Array<{ version?: unknown; status?: unknown }>;
|
||||
};
|
||||
|
||||
type CatalogVersion = {
|
||||
version: string;
|
||||
status?: "current" | "archived";
|
||||
};
|
||||
|
||||
type CatalogNode = {
|
||||
type: CatalogType;
|
||||
name: string;
|
||||
directory: string;
|
||||
versions: CatalogVersion[];
|
||||
children: CatalogNode[];
|
||||
};
|
||||
|
||||
type Options = {
|
||||
showPaths: boolean;
|
||||
showVersions: boolean;
|
||||
target: string;
|
||||
};
|
||||
|
||||
const collator = new Intl.Collator("ru", {
|
||||
numeric: true,
|
||||
sensitivity: "base",
|
||||
});
|
||||
|
||||
function usage(): void {
|
||||
console.log(`Использование: pnpm tree [параметры] [путь]
|
||||
|
||||
Без пути выводится всё дерево каталога. Путь может указывать на папку категории,
|
||||
программы или на её index.yaml.
|
||||
|
||||
--versions вывести версии под каждой программой
|
||||
--paths вывести относительные пути каталогов
|
||||
--help показать эту справку`);
|
||||
}
|
||||
|
||||
function parseArguments(args: string[]): Options {
|
||||
const targets: string[] = [];
|
||||
let showPaths = false;
|
||||
let showVersions = false;
|
||||
|
||||
for (const argument of args) {
|
||||
if (argument === "--paths") {
|
||||
showPaths = true;
|
||||
} else if (argument === "--versions") {
|
||||
showVersions = true;
|
||||
} else if (argument === "--help" || argument === "-h") {
|
||||
usage();
|
||||
process.exit(0);
|
||||
} else if (argument.startsWith("-")) {
|
||||
throw new Error(`Неизвестный параметр: ${argument}`);
|
||||
} else {
|
||||
targets.push(argument);
|
||||
}
|
||||
}
|
||||
|
||||
if (targets.length > 1) {
|
||||
throw new Error("Можно указать только один путь");
|
||||
}
|
||||
|
||||
return {
|
||||
showPaths,
|
||||
showVersions,
|
||||
target: targets[0] ?? ".",
|
||||
};
|
||||
}
|
||||
|
||||
function compareNodes(left: CatalogNode, right: CatalogNode): number {
|
||||
if (left.type !== right.type) {
|
||||
return left.type === "category" ? -1 : 1;
|
||||
}
|
||||
return collator.compare(left.name, right.name);
|
||||
}
|
||||
|
||||
async function resolveDirectory(target: string): Promise<string> {
|
||||
const absoluteTarget = path.resolve(target);
|
||||
const targetStat = await lstat(absoluteTarget);
|
||||
|
||||
if (targetStat.isDirectory()) {
|
||||
return absoluteTarget;
|
||||
}
|
||||
if (targetStat.isFile() && path.basename(absoluteTarget) === "index.yaml") {
|
||||
return path.dirname(absoluteTarget);
|
||||
}
|
||||
throw new Error(`Ожидалась папка каталога или index.yaml: ${target}`);
|
||||
}
|
||||
|
||||
async function readCatalogNode(directory: string): Promise<CatalogNode> {
|
||||
const indexPath = path.join(directory, "index.yaml");
|
||||
let source: string;
|
||||
|
||||
try {
|
||||
source = await readFile(indexPath, "utf8");
|
||||
} catch (error) {
|
||||
const reason = error instanceof Error ? error.message : String(error);
|
||||
throw new Error(`${indexPath}: не удалось прочитать index.yaml: ${reason}`);
|
||||
}
|
||||
|
||||
const document = parseDocument(source, { prettyErrors: true });
|
||||
if (document.errors.length > 0) {
|
||||
const errors = document.errors.map((error) => error.message).join("; ");
|
||||
throw new Error(`${indexPath}: ${errors}`);
|
||||
}
|
||||
|
||||
const data = document.toJS() as CatalogIndex;
|
||||
if (data.type !== "category" && data.type !== "program") {
|
||||
throw new Error(`${indexPath}: неизвестный type`);
|
||||
}
|
||||
if (typeof data.name !== "string" || data.name.length === 0) {
|
||||
throw new Error(`${indexPath}: отсутствует название`);
|
||||
}
|
||||
|
||||
const versions =
|
||||
data.type === "program"
|
||||
? (data.versions ?? []).map((entry, index) => {
|
||||
if (typeof entry.version !== "string" || entry.version.length === 0) {
|
||||
throw new Error(`${indexPath}: некорректная версия с индексом ${index}`);
|
||||
}
|
||||
if (
|
||||
entry.status !== undefined &&
|
||||
entry.status !== "current" &&
|
||||
entry.status !== "archived"
|
||||
) {
|
||||
throw new Error(`${indexPath}: неизвестный статус версии ${entry.version}`);
|
||||
}
|
||||
return { version: entry.version, status: entry.status } as CatalogVersion;
|
||||
})
|
||||
: [];
|
||||
|
||||
const children: CatalogNode[] = [];
|
||||
if (data.type === "category") {
|
||||
const entries = await readdir(directory, { withFileTypes: true });
|
||||
for (const entry of entries) {
|
||||
if (!entry.isDirectory()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const childDirectory = path.join(directory, entry.name);
|
||||
try {
|
||||
const childIndexStat = await lstat(path.join(childDirectory, "index.yaml"));
|
||||
if (childIndexStat.isFile()) {
|
||||
children.push(await readCatalogNode(childDirectory));
|
||||
}
|
||||
} catch (error) {
|
||||
const code = (error as NodeJS.ErrnoException).code;
|
||||
if (code !== "ENOENT") {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
children.sort(compareNodes);
|
||||
return { type: data.type, name: data.name, directory, versions, children };
|
||||
}
|
||||
|
||||
function formatNode(node: CatalogNode, showPaths: boolean): string {
|
||||
const categorySuffix = node.type === "category" ? "/" : "";
|
||||
if (!showPaths) {
|
||||
return `${node.name}${categorySuffix}`;
|
||||
}
|
||||
|
||||
const relativePath = path.relative(process.cwd(), node.directory) || ".";
|
||||
return `${node.name}${categorySuffix} [${relativePath}]`;
|
||||
}
|
||||
|
||||
function printChildren(
|
||||
node: CatalogNode,
|
||||
prefix: string,
|
||||
options: Pick<Options, "showPaths" | "showVersions">,
|
||||
): void {
|
||||
const entries: Array<{ label: string; node?: CatalogNode }> = node.children.map(
|
||||
(child) => ({ label: formatNode(child, options.showPaths), node: child }),
|
||||
);
|
||||
|
||||
if (options.showVersions && node.type === "program") {
|
||||
entries.push(
|
||||
...node.versions.map(({ version, status }) => ({
|
||||
label: `версия ${version}${status === undefined ? "" : ` [${status}]`}`,
|
||||
})),
|
||||
);
|
||||
}
|
||||
|
||||
entries.forEach((entry, index) => {
|
||||
const last = index === entries.length - 1;
|
||||
console.log(`${prefix}${last ? "└── " : "├── "}${entry.label}`);
|
||||
if (entry.node !== undefined) {
|
||||
printChildren(entry.node, `${prefix}${last ? " " : "│ "}`, options);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function main(): Promise<void> {
|
||||
const options = parseArguments(process.argv.slice(2));
|
||||
const directory = await resolveDirectory(options.target);
|
||||
const root = await readCatalogNode(directory);
|
||||
|
||||
console.log(formatNode(root, options.showPaths));
|
||||
printChildren(root, "", options);
|
||||
}
|
||||
|
||||
try {
|
||||
await main();
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
console.error(`Ошибка: ${message}`);
|
||||
process.exitCode = 1;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Драйверы
|
||||
description: Драйверы устройств и кабелей для работы с мобильными телефонами.
|
||||
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: PL-2303 Driver
|
||||
description: >-
|
||||
Модифицированный Chaos драйвер для дата-кабелей на чипсете Prolific PL-2303.
|
||||
В отличие от штатного драйвера он позволяет флешерам обмениваться данными с
|
||||
телефоном на скорости до 1625000 бит/с.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "2.0.5.26"
|
||||
files:
|
||||
- path: files/PL-2303_patched.rar
|
||||
description: Драйвер PL-2303 с поддержкой скорости до 1625000 бит/с
|
||||
platform: win32
|
||||
sha256: ce4c19231e2e051a80267487c37062df0161569edc0f43013df7f6d1fa0565e6
|
||||
@@ -0,0 +1,6 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Инструменты прошивок
|
||||
description: >-
|
||||
Вспомогательные программы для анализа, распаковки и изменения файлов прошивок
|
||||
и сервисных обновлений.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,186 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: WinSwup
|
||||
description: |-
|
||||
Сервисная программа Siemens для обновления программного обеспечения
|
||||
телефонов. В каталоге представлены исполняемые комплекты и developer-пакеты
|
||||
с Update DLL, загрузчиками, библиотеками, заголовочными файлами, примерами и
|
||||
документацией.
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "4.20-pre1"
|
||||
status: current
|
||||
released: "2006-05-08"
|
||||
files:
|
||||
- path: files/winswup-4.20.7z
|
||||
description: Полный developer-пакет WinSwup 4.20 prerelease 1 с SDK,
|
||||
документацией и утилитами
|
||||
platform: win32
|
||||
sha256: d317695a4ab32856167370d3f7cd527bf09c9f34db13530e23de34700d6c3efe
|
||||
- version: "4.14p3"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-4.14p3.7z
|
||||
description: Developer-пакет WinSwup 4.14p3 для SL75 Escada
|
||||
platform: win32
|
||||
sha256: 99a33142bb9b008a051bd6fe3212ffa3ccd9e38be3472059d5125dcd9783c21e
|
||||
- version: "4.07"
|
||||
status: archived
|
||||
released: "2004-09-08"
|
||||
files:
|
||||
- path: files/winswup-4.07.7z
|
||||
description: Полный developer-пакет WinSwup 4.07 с SDK и документацией
|
||||
platform: win32
|
||||
sha256: e27536eb975c6127ca7d61ac39d9edceb142fb3e4eaf91348992ea214f30d8f5
|
||||
- version: "3.20"
|
||||
status: current
|
||||
files:
|
||||
- path: files/winswup-3.20.rar
|
||||
description: Прошивальщик для телефонов Siemens EGold и EGoldLite с
|
||||
поддержкой XBI, XBZ и XFS
|
||||
platform: win32
|
||||
sha256: d497519b7f6c4bd95aacd93828f12d977110da86f612d7f55c3bcc2dc40e3677
|
||||
- version: "3.19"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-3.19.7z
|
||||
description: Полный developer-пакет WinSwup 3.19 для AL21
|
||||
platform: win32
|
||||
sha256: a797f2097ae96c678cc987b08fafd0b11b0c929e550751f8190b793f564dbc55
|
||||
- version: "3.17"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-3.17.7z
|
||||
description: Полный developer-пакет WinSwup 3.17 с SDK и документацией
|
||||
platform: win32
|
||||
sha256: 4a1e770a3f0f8c77108f6841b7d1fc605c41052f21cd734c3d5684bbdbdd1877
|
||||
- version: "3.05"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-3.05.7z
|
||||
description: Полный предварительный пакет WinSwup 3.05 с SDK и документацией
|
||||
platform: win32
|
||||
sha256: 613b329574723539cc5ec38630977dc5ca0db14718330f4d1e09f73c8e8016e3
|
||||
- version: "3.002"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-3.002.7z
|
||||
description: Компактный исполняемый комплект WinSwup 3.002
|
||||
platform: win32
|
||||
sha256: 20dc66b4b95651633ed5a5ea9d55cda430bce7ed089ca4031626b60e86b88d41
|
||||
- version: "1.44"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.44.7z
|
||||
description: Полный developer-пакет WinSwup 1.44 с SDK
|
||||
platform: win32
|
||||
sha256: 810f8f7b24ea27bd2c7e6746ea13ff8be4b7117fec46989a07c522d9eb60ef21
|
||||
- version: "1.40"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.40.7z
|
||||
description: Полный developer-пакет WinSwup 1.40 с SDK и документацией
|
||||
platform: win32
|
||||
sha256: 19e6d4ff841c00445fc953268efbe98d69aba261f9204ee896917a4d28472a95
|
||||
- version: "1.35"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.35.7z
|
||||
description: Исполняемый комплект WinSwup 1.35 с загрузчиком SGOLD
|
||||
platform: win32
|
||||
sha256: 4a947c38253e40502cee5019f62a5e9868a1f8e3661105a8a3a753187b5f92cc
|
||||
- version: "1.34"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.34.7z
|
||||
description: Исполняемый комплект WinSwup 1.34
|
||||
platform: win32
|
||||
sha256: 15ee3c94cb31c01d877898456d8aceababd4e5f7cd1313b4adb9e1afed3d2af5
|
||||
- version: "1.30"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.30.7z
|
||||
description: Полный developer-пакет WinSwup 1.30 с SDK
|
||||
platform: win32
|
||||
sha256: c12b5563409d9ff356299b5f7277ebeaaefe564b1cb71a7856636daf0156f690
|
||||
- version: "1.28"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.28.7z
|
||||
description: Полный developer-пакет WinSwup 1.28 с SDK
|
||||
platform: win32
|
||||
sha256: 783d123f2ce62253dd3c697efc8a622d027dd34388db6165b6a682ecf44246d0
|
||||
- version: "1.27"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.27.7z
|
||||
description: Полный developer-пакет WinSwup 1.27 с SDK
|
||||
platform: win32
|
||||
sha256: 986eb13ce887f77ed5b15d29fd587edbdf4b6bc3f41a510ad540dc385ef9ee95
|
||||
- version: "1.23"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.23.7z
|
||||
description: Исполняемый комплект WinSwup 1.23
|
||||
platform: win32
|
||||
sha256: d2c65b13d9e88f0a7bcbfc44b25b9b1b2901c8c5186c617acbd849b6cab8f76c
|
||||
- version: "1.04"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-1.04.7z
|
||||
description: Комплект WinSwup 1.04 с пакетами WC3I 2001 и 2008
|
||||
platform: win32
|
||||
sha256: cea1c7c0b1db441a1d35e364716d71d64e30710b6165b980e7f883a2f7fb4343
|
||||
- version: "0.98"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.98.7z
|
||||
platform: win32
|
||||
sha256: 754d3e84d6653c1ef69713e7de3163dc87cc9bef0a5427fe5c792d51a3a3e263
|
||||
- version: "0.98-pre"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.98-pre.7z
|
||||
platform: win32
|
||||
sha256: cd0e8b50fa2fdb33208eb0b73d69b04a94fbb8bc102fb99548fae0e98e83075f
|
||||
- version: "0.97"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.97.7z
|
||||
description: Комплект WinSwup 0.97 «Alle Produkte» с исходным ZIP-пакетом
|
||||
platform: win32
|
||||
sha256: cace85ee4ef5085b645855c502f74f18b11d8301c135c0f34442fc27c4b149c3
|
||||
- version: "0.95"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.95.7z
|
||||
description: Обычная сборка WinSwup 0.95
|
||||
platform: win32
|
||||
sha256: a1792894d1a1efa7e95de3f747a86c1e5eefc00c8914a7e78859dabeac57c2a3
|
||||
- path: files/winswup-0.95-amd32.7z
|
||||
description: Сборка WinSwup 0.95 с комплектом DLL AMD32
|
||||
platform: win32
|
||||
sha256: 5df6de4c09f872f2175dd7fe26d456ce7cb1dba254bfe6e2b41bd47e6acc9482
|
||||
- version: "0.91"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.91.7z
|
||||
platform: win32
|
||||
sha256: 7ae4a7be7abc7f17fc6f0dd55d601da56226571aa8634dae38ba16f5f65b47ad
|
||||
- version: "0.91-pre2"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.91-pre2.7z
|
||||
platform: win32
|
||||
sha256: c0c19ca1f49ab76f2c544adf0291d82172f1024c44606a1443bb365c588eced1
|
||||
- version: "0.91-pre1"
|
||||
status: archived
|
||||
files:
|
||||
- path: files/winswup-0.91-pre1.7z
|
||||
platform: win32
|
||||
sha256: 9254f44bc15d6e1027d96112860eb2b392d83de20b15a680037534704e460a9e
|
||||
additional_files:
|
||||
- path: files/WSMPlus2.rar
|
||||
description: WinSwup Menu Plus 2 для включения дополнительных меню в сервисных SWUP
|
||||
platform: win32
|
||||
sha256: b1eb247567a4b5b66b8f796e6e3012481d819c825f400693fb26eae8b79f785f
|
||||
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: WSFF
|
||||
description: |-
|
||||
Утилита для анализа структуры и распаковки баз сервисных прошивок Siemens
|
||||
WinSwup.
|
||||
homepage: https://web.archive.org/web/20130825050857/http://papuas.allsiemens.com/
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "4"
|
||||
released: "2006-02-10"
|
||||
files:
|
||||
- path: files/WSFF4.rar
|
||||
description: Программа WSFF4
|
||||
platform: win32
|
||||
sha256: e63fe5b665dad8322dbfab081b7c41bc0e40520d922d9a7d8166c5b53fe1b2c1
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Флешеры
|
||||
description: Программы для чтения, записи и восстановления флеш-памяти телефонов.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,54 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: V_KLay
|
||||
description: |-
|
||||
Патчер, флешер и редактор раскладки клавиатуры для мобильных телефонов
|
||||
Siemens.
|
||||
|
||||
Возможности:
|
||||
- чтение и запись flash-памяти телефона;
|
||||
- установка и отмена патчей в формате VKP;
|
||||
- изменение раскладки клавиатуры;
|
||||
- подключение через Password Boot, Chaos BootPatch, Bootcore bug, Patched
|
||||
bootcore и Test point;
|
||||
- работа с телефоном без выключения в режиме online, если модель и прошивка
|
||||
поддерживают такой способ;
|
||||
- многоязычный интерфейс, включая русский и украинский языки.
|
||||
|
||||
Версия 3.3 поддерживает Siemens 1168, 2118, 2128, 3118, 3618, 6618, 6688,
|
||||
A35, A36, A40, A50, A52, A55, A60, A65, C30, C35, C45, C55, C60, C65,
|
||||
CF62, CX65, M35, M50, M55, M65, MC60, ME45, MT50, S35, S40, S45, S55,
|
||||
S65, SL42, SL45, SL55, SL65 и SX1.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "3.3"
|
||||
files:
|
||||
- path: files/v_klay_setup.zip
|
||||
description: Установочный пакет V_KLay 3.3
|
||||
platform: win32
|
||||
sha256: 9ef29148ea0a6f9c0ef2cb9a09da992bd1063920d891878709b066b22707b80f
|
||||
- version: "2.7.2"
|
||||
files:
|
||||
- path: files/v_klay_setup_v272.zip
|
||||
description: Установочный пакет V_KLay 2.7.2
|
||||
platform: win32
|
||||
sha256: f4e31a5fd9cdfb6b5f3b2612116ad0ca575d281dc5e4c0c4f85bba6226985cde
|
||||
- version: "2.5"
|
||||
files:
|
||||
- path: files/v_klay_setup_v25.zip
|
||||
description: Установочный пакет V_KLay 2.5
|
||||
platform: win32
|
||||
sha256: d78f69d0750a8e0d93349049d4dac3361202ad8fedb9f5479ca9f95505d250db
|
||||
- version: "2.1.12"
|
||||
files:
|
||||
- path: files/v_klay_update_v2112.rar
|
||||
description: Обновление до V_KLay 2.1.12
|
||||
platform: win32
|
||||
sha256: 5b6e4fe30ea81ef3a07892b297772aba811d04b15e2a93c482eb3da7d74e3b72
|
||||
- version: "2.1.5.2"
|
||||
files:
|
||||
- path: files/v_klay_setup_v2152.rar
|
||||
description: Англоязычный установочный пакет V_KLay 2.1.5.2
|
||||
platform: win32
|
||||
sha256: bc7c32ed37b9e75aa5316cef46661eb78240dd2911b89ba26ab30d88fff6d9a9
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: x65flasher
|
||||
description: |-
|
||||
Флешер для телефонов Siemens 65–75-й серии и мидлеты для поиска boot-ключей.
|
||||
|
||||
Возможности:
|
||||
- чтение и запись flash-памяти телефона;
|
||||
- резервное копирование и восстановление как всего fullflash, так и отдельных
|
||||
частей: файловой системы, прошивки и EEPROM;
|
||||
- просмотр карты flash-памяти;
|
||||
- работа на скорости от 57600 до 1600000 бит/с;
|
||||
- генерация загрузчиков для V_Klay.
|
||||
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "2.103"
|
||||
released: "2006-12-06"
|
||||
files:
|
||||
- path: files/x65flasher-2103.rar
|
||||
description: Флешер, документация и вспомогательные мидлеты
|
||||
platform: win32
|
||||
sha256: ad5ba3574b1f5a774948a8d62dc7fb51ef05b762d27e3000c0e5ba38360d4f41
|
||||
additional_files:
|
||||
- path: files/px75v1.rar
|
||||
description: Мидлет для получения HASH и ESN на младших моделях телефонов
|
||||
platform: j2me
|
||||
sha256: 64fd3cca1fcb253a43f1c2101256a0050731598c6c35a0805d6a874c5893ce5c
|
||||
- path: files/bsReader.zip
|
||||
description: Мидлет для получения HASH и ESN на S75, SL75 и BenQ-Siemens
|
||||
platform: j2me
|
||||
sha256: e7c38947a9e042b0a9107760d79b3f5f6daa95a71b33c26d219453c80d943f55
|
||||
@@ -0,0 +1,4 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Сервисные программы
|
||||
description: Программы для диагностики, обслуживания и восстановления телефонов.
|
||||
@@ -0,0 +1,6 @@
|
||||
format: 1
|
||||
type: category
|
||||
name: Ремонт и восстановление
|
||||
description: >-
|
||||
Сервисные программы для диагностики, восстановления и ремонта программной
|
||||
части телефонов.
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,38 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: Joker
|
||||
description: |-
|
||||
Сервисная программа для восстановления программных неисправностей телефонов
|
||||
Siemens на платформе EGOLD с помощью обычного кабеля с минимальными
|
||||
доработками. Поддерживаются A50–A75, AX72/AX75, C55/C56/C60, CF62/CF110,
|
||||
M55, MC60, S55/S56, SL55, SX1 и совместимые модели.
|
||||
|
||||
Возможности:
|
||||
- чтение информации о телефоне и работа в режимах BFB и Service mode;
|
||||
- чтение и запись FullFlash и отдельных flash-сегментов;
|
||||
- резервное копирование и восстановление EEPROM и секретных блоков;
|
||||
- вычисление и сохранение SKEY, BKEY, ESN, HASH и мастер-кодов;
|
||||
- пересчёт ключей после записи FullFlash от другого аппарата;
|
||||
- подготовка BCORE, устранение Freeze и дефрагментация EEPROM;
|
||||
- автоматическое определение flash-памяти и контроль CRC при операциях записи.
|
||||
|
||||
Перед записью автор рекомендует обязательно сохранить ESN, HASH и полный
|
||||
FullFlash рабочего телефона. Программа создавалась как экспериментальный
|
||||
ремонтный инструмент; часть операций требует TestPoint.
|
||||
homepage: https://web.archive.org/web/20130825050857/http://papuas.allsiemens.com/Joker.htm
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "0.3.4.1"
|
||||
released: "2006-01-25"
|
||||
files:
|
||||
- path: files/JokerSorceV0341.rar
|
||||
description: Исходный код Joker 0.3.4.1 для Borland Delphi
|
||||
platform: win32
|
||||
sha256: b6e539597dbe6d8af1e6a813a305ea30322e561ec5a9786aadba520d9c1963c5
|
||||
- version: "0.2.9.5"
|
||||
released: "2005-11-25"
|
||||
files:
|
||||
- path: files/JokerV0295.rar
|
||||
description: Исполняемая программа Joker 0.2.9.5
|
||||
platform: win32
|
||||
sha256: 37a8805c5731ce74aa99b11c5f90580bce39b96c95b36cbd8adb72008df25e30
|
||||
Binary file not shown.
@@ -0,0 +1,20 @@
|
||||
format: 1
|
||||
type: program
|
||||
name: Siemens EEPROM Tool
|
||||
description: |-
|
||||
Редактор файлов EEPROM телефонов Siemens. Используется совместно с
|
||||
x65PapuaUtils и Joker для восстановления программно неисправных аппаратов,
|
||||
работы с резервными копиями блоков EEPROM и исправления их содержимого.
|
||||
|
||||
Номер `3.01.0005` получен из ресурса версии исполняемого файла; имя исходного
|
||||
архива — `SiemensEEPROMtool315plus.rar`.
|
||||
homepage: https://web.archive.org/web/20130825050857/http://papuas.allsiemens.com/
|
||||
screenshots: []
|
||||
versions:
|
||||
- version: "3.01.0005"
|
||||
released: "2004-12-26"
|
||||
files:
|
||||
- path: files/SiemensEEPROMtool315plus.rar
|
||||
description: Программа Siemens EEPROM Tool
|
||||
platform: win32
|
||||
sha256: 75249994aceab0836cfe26820f110dcaf61f411986b7d600d51ca57496d83e16
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user