julianxhokaxhiu/lineage-ota

LineageOS OTA 更新系统应用的一个简单OTA REST服务器

资助包维护!
julianxhokaxhiu

安装次数: 1,367

依赖项: 0

建议者: 0

安全性: 0

星标: 221

关注者: 24

分支: 132

开放性问题: 1

类型:项目

2.9.0 2020-07-20 09:01 UTC

This package is auto-updated.

Last update: 2024-09-28 17:07:17 UTC


README

LineageOS OTA 更新系统应用的一个简单OTA REST服务器

支持

有问题?不确定在哪里创建?请参阅贡献指南.

内容

要求

  • Apache mod_rewrite 启用
  • PHP >= 8.2
  • PHP ZIP 扩展
  • Composer(如果通过CLI安装)

如何使用

Composer

$ cd /var/www/html # Default Apache WWW directory, feel free to choose your own
$ composer create-project julianxhokaxhiu/lineage-ota LineageOTA

然后最终访问https:///LineageOTA以查看正在运行的REST服务器。请注意,这只是为了快速测试,当您计划将此类设置用于生产(您的用户)时,请确保还提供HTTPS支持。

如果您得到的内容不仅仅是位于“builds”目录中的文件列表,这意味着您的环境中存在问题。在创建问题报告之前,请务必检查它。

Docker

$ docker run \
    --restart=always \
    -d \
    -p 80:80 \
    -v "/home/user/builds:/var/www/html/builds/full" \
    julianxhokaxhiu/lineageota

然后最终访问https:///以查看正在运行的REST服务器。

根URL(用于在“/api”端点生成ROM URL)可以使用“LINEAGEOTA_BASE_PATH”变量设置。

本地托管

  • 完整构建应上传到“builds/full”目录。
  • Delta构建应上传到“builds/delta”目录。

仅适用于LineageOS 15.x及更高版本

如果您愿意在LineageOS 15.x(或更高版本)ROM构建上使用此项目,您可能已经注意到,名为“build.prop”的文件已从ZIP文件中删除,并已集成到您的“system.new.dat”文件中,这是一个基本上的ext4镜像(您可以在此处了解更多信息)。

为了从现在开始使用此服务器,您可以从构建目录(您的ROM正在构建的位置)中的ZIP文件中复制“build.prop”文件,并将其放在与ZIP文件相同的目录中,并命名为ZIP文件名+“.prop”扩展名。

例如,您可以自由检查此结构

$ cd builds/full
$ tree
.
├── lineage-15.0-20171030-NIGHTLY-gts210vewifi.zip # the full ROM zip file
└── lineage-15.0-20171030-NIGHTLY-gts210vewifi.zip.prop # the ROM build.prop file

如果没有找到build.prop文件会发生什么

服务器能够通过API提供ZIP文件,即使在没有提供“build.prop”文件的情况下,也可以通过从其他地方获取这些缺失的信息(始终与该ZIP文件相关)。尽管如此,作为一种试验方法,它可能是不正确的,因此不要过度依赖它。

我不确定这能帮多大忙,但必须将其用作极端回退场景,在这种情况下,您无法提供任何原因的“build.prop”。相反,请始终考虑找到一种方法来获取prop文件,以便提供正确的API响应。

GitHub 托管

如果您想在Github上托管您的rom,您可以将您的仓库名称放入github.json文件中,如下面的示例所示。

[
  {
    "name": "ADeadTrousers/android_device_Unihertz_Atom_XL_EEA",
    "name": "ADeadTrousers/android_device_Unihertz_Atom_XL_TEE"
  }
]

每一行应指向单个设备的仓库,并具有附带文件的Github发行版。每个发行版至少应包含以下文件:

  • build.prop
  • OTA发行版zip文件
  • md5sum列表

md5sum文件包含OTA zip的哈希值以及您在发行版中包含的任何其他需要这些文件的文件。md5sum的每一行应具有以下格式:

HASHVALUE	FILENAME

文件名不应包含任何目录信息。

您还可以包含一个HTML格式的变更日志文件。注意,任何包含在发行版文件列表中的HTML文件都将作为变更日志包含在内。

禁用本地/GitHub 托管

如果未使用,则可以通过配置文件禁用本地和Github托管功能,配置文件位于根目录中,称为lineageota.json。

[
        {
                "DisableLocalBuilds": false,
                "DisableGithubBuilds": false,
        }
]

将其中任何一个设置为true将禁用相关的托管选项。

限制 GitHub 发布

使用Github,您可能会拥有比更新器实际需要的更多的发行版,因此配置文件中有两个选项可让您控制返回的发行版数量。

[
    {
        "MaxGithubReleasesPerRepo": 0,
        "OldestGithubRelease": "",
    }
]

MaxGithubReleaesPerRepo将限制每个仓库使用的发行版数量。将此设置为0或在配置文件中省略它将使用每个仓库中所有可用的发行版。

OldestGithubRelease将排除任何早于指定日期发布的发行版,使其在更新器中不可用。此字符串值可以是空白的(对于所有发行版),或任何strtotime()兼容的字符串,例如"2021-01-01"或"60 days ago"。

缓存

本地构建和基于Github的构建都可以缓存以减少磁盘和网络流量。默认情况下,本地缓存已禁用,Github缓存已启用。

默认缓存超时设置为一天(86400秒)。

您可以通过配置文件更改此设置,配置文件位于根目录中,称为lineageota.json。

[
        {
                "EnableLocalCache": false,
                "EnableGithubCache": true,
                "LocalCacheTimeout": 86400,
                "GithubCacheTimeout": 86400
        }
]

这需要Web服务器对根目录有写入权限。如果您想强制刷新发行版,只需删除相应的cache.json文件即可。

Web 根模板

在2.9版本之前,如果用户访问OTA服务器的Web根目录,他们将被重定向到构建文件夹。随着Github托管的引入,这不再是特别有用的目的地,因为他们可能看不到本地托管的构建,或者在本地托管已禁用且本地构建文件夹尚未清理的情况下,看到错误的构建。

2.9版本之后的发行版现在使用一个简单的模板系统来展示构建列表。

默认包含四个模板(ota-list-simple、ota-list-tables、ota-list-columns、ota-list-javascript),但您可以在"views"文件夹中创建自己的模板以匹配您的品牌。

以下是对模板的配置设置:

        "OTAListTemplate": "ota-list-tables",
        "BrandName": "",
        "LocalHomeURL": "",
        "GithubHomeURL": "",
        "DeviceNames": {
            "kebab": "8T",
            "lemonade": "9"
        },
        "DeviceVendors": {
            "kebab": "Oneplus",
            "lemonade": "Oneplus"
        }
  • OTAListTemplate:要使用的模板名称,不要包含文件扩展名。
  • BrandName:您的ROM的名称,如果为空,则使用OTA文件名中的品牌名称。
  • LocalHomeURL:本地构建的首页URL,用于模板文件。如果为空,则使用https://otaserver/builds URL。
  • GithubHomeURL:Github构建的首页URL,用于模板文件。如果为空,则使用任何定义的Github仓库的组织URL。
  • DeviceNames:设备代码名称与其正确名称之间的映射数组。值:array( codename => title, ... )
  • DeviceVendors:设备代码名称与其供应商名称之间的映射数组。值:array( codename => vendor, ... )

包含的模板

  • ota-list-simple:简单的标题和文件名列表,不提供额外细节或链接。
  • ota-list-table:包含一系列表格的页面,每个设备一个表格,按日期顺序列出该设备的所有构建。包括跳转列表以查找设备、本地/github页面链接、日期、版本、md5sum等。

使用Twig作为模板语言,更多详情请参阅其文档

以下变量可用于模板

  • builds:可用的构建数组,每个条目是一个包含以下内容的数组;增量、api_level、url、时间戳、md5sum、更改、频道、文件名、rom类型、日期时间、版本、id、大小
  • sortedBuilds:按设备名称排序的构建数组(数组键是设备名称,每个值与构建数组中的值相同)
  • parsedFilenames:已解析到以下标记的文件名数组;类型、版本、日期、频道、代码、型号、签名
  • deviceNames:设备名称数组,每个键是代码名称,值是设备名称(例如 array( "kebab" => "8T")
  • vendorNames:设备名称数组,每个键是代码名称,值是厂商名称(例如 array( "kebab" => "Oneplus")
  • devicesByVendor:按厂商划分的二维设备数组(例如 array( "Oneplus" => array( "kebab", "lemonade"))
  • branding:包含更新品牌信息的数组,包含;名称、GithubURL、LocalURL
  • formatedFileSizes:每个发布文件的友好文件大小数组,以文件名(来自构建数组)作为键,值为字符串,如“1.1 GB”

REST 服务器单元测试

欢迎使用这个用NodeJS制作的简单脚本。包含说明。

ROM 集成

为了将此REST服务器集成到您的ROM中,您有两种可能性:您可以使用build.prop(强烈推荐),或者您可以直接修补android_packages_apps_CMUpdater包(不建议)。

在集成之前,请确保您的OTA服务器从公共URL响应。同时,请确保知道您的路径。

例如,如果您的URL是http://my.ota.uri/LineageOTA,那么您的API URL将是http://my.ota.uri/LineageOTA/api

build.prop

CyanogenMod / LineageOS ( <= 14.x )

为了将此集成到基于CyanogenMod的ROM中,您需要在您的build.prop文件中添加cm.updater.uri属性(对于CyanogenModLineage)。请参阅此示例

# ...
cm.updater.uri=http://my.ota.uri/api/v1/{device}/{type}/{incr}
# ...

截至e930cf7:在运行时替换可选占位符:{device} - 设备名称 {type} - 构建类型 {incr} - 增量版本

LineageOS ( >= 15.x)

为了将此集成到基于LineageOS的ROM中,您需要在您的build.prop文件中添加lineage.updater.uri属性。请参阅此示例

# ...
lineage.updater.uri=https://my.ota.uri/api/v1/{device}/{type}/{incr}
# ...

请始终确保提供基于HTTPS的uri,否则更新程序将拒绝连接到您的服务器!这是由于较新版本的Android(至少10+)包含的安全策略造成的,任何希望使用非安全连接的应用必须在编译时明确启用此功能。LineageOS更新程序不支持此功能。

自从https://review.lineageos.org/#/c/191274/被合并后,属性cm.updater.uri已被重命名为lineage.updater.uri。请确保更新您的条目。

5252d60为止:在运行时替换了可选的占位符:{device} - 设备名称 {type} - 构建类型 {incr} - 增量版本

android_packages_apps_CMUpdater

为了将此集成到您的基于CyanogenModLineageOS的ROM中,您可以在包内相应地修补这一行。

尽管这可行(并且位置可能会从版本到版本发生变化),但我个人不建议使用这种方法,因为这始终需要通过清单覆盖它,或者维护从官方仓库到您分叉的提交。

使用build.prop可以提供简单流畅的集成,这甚至可以用于完全利用官方仓库的本地构建,但只通过本地OTA REST服务器进行更新。例如,通过使用docker-lineage-cicd项目。

变更日志

v?.?.?

  • 为Web根目录添加了模板系统(感谢@toolstack)
  • 添加了配置选项以限制GitHub发布数量/年龄(感谢@toolstack)
  • 修复了GitHub只返回前100个发布版本的问题(感谢@toolstack)
  • 修复了包含多个zip文件的GitHub发布版本的处理(感谢@toolstack)
  • 添加了配置选项以禁用构建类型(感谢@toolstack)
  • 添加了缓存支持的配置文件(感谢@toolstack)
  • 添加了本地缓存支持(感谢@toolstack)
  • 修复了重复构建检索问题(感谢@toolstack)
  • 添加了GitHub缓存支持(感谢@toolstack)
  • 将GitHub作为源代码库包含在内(感谢@ADeadTrousers)
  • 接受环境变量LINEAGEOTA_BASE_PATH以设置根URL(感谢@CyberShadow)
  • 从build.prop ro.lineage.releasetype读取频道(感谢@tduboys)
  • 修复从备用位置加载prop文件的问题(感谢@bananer)
  • 支持在名称提取中带有下划线的设备名称(感谢@bylaws)
  • 修复在rom名称中查找数字的问题(感谢@erfanoabdi)
  • 修复加载prop文件问题

v2.9.0

  • 添加PHP 7.4兼容性:在isValid()上防止空数组访问(感谢@McNutnut)
  • 更新正则表达式模式以匹配更多CM/LineageOS以外的rom(感谢@toolstack)
  • 使用Forwarded HTTP扩展来确定协议和主机(感谢@TpmKranz)
  • 添加检测HTTP_X_FORWARDED_*头(感谢@ionphractal)

v2.8.0

  • 如果可用,使用md5sum文件(感谢@jplitza)
  • 如果shell_exec被禁用,则提前终止commandExists(感谢@timschumi)
  • 更新文档以匹配新的uri格式(感谢@twouters)
  • 向JSON添加大小字段(感谢@syphyr)

v2.7.0

  • 添加对LineageOS 15.x构建中缺少的build.prop文件的支持(见#36)
  • 如果缺少build.prop,则提供适当的回退值,使JSON响应类似于它存在的情况(感谢@julianxhokaxhiu)

v2.6.0

  • 添加了对LineageOS非官方构建可能获得的新的文件名的支持(例如lineage-14.1-20171024_123000-nightly-hammerhead-signed.zip)(感谢@brianjmurrell)

v2.5.0

v2.4.0

  • 为LineageOS添加对新 id 字段的支持(见 #32 )
  • 在README中提及需要PHP ZIP扩展才能正确运行此软件(见 #27 )

v2.3.1

  • 修复“修复时间戳值。现在它继承自ROM”的问题。读取此值的顺序是在OTA服务器意识到build.prop的内容之前。(感谢 @syphyr )

v2.3.0

  • 为使用版本字段的最新LineageOS ROM添加支持(见 #29 )
  • 修复时间戳值的修复。现在它继承自ROM(见 #30 )

v2.2.0

  • 如果存在,则尊重ro.build.ota.url(感谢 @ontherunvaro )
  • 为全构建添加对递归子目录的支持(感谢 @corna )
  • 修复更改日志URL生成(感谢 @corna )
  • 支持HTTPS OTA URL(感谢 @corna )
  • 修复README.md中的教程URL(感谢 @visi0nary )

v2.1.1

  • 将旧版更新器频道支持扩展到任何Lineage ROM < 14.1

v2.1.0

  • 在API请求中添加对LineageOS非官方关键字的 support
  • 放弃memcached以支持APCu。无需配置,只需正常工作即可 :)

v2.0.9

v2.0.8

  • 添加对LineageOS CMUpdater的支持(这不应该破坏当前CM ROMs的支持,如果这样做,请创建一个问题!)

v2.0.7

  • 将整个项目从CyanogenMod重命名为LineageOS
  • 添加对LineageOS的支持(并保留对当前CyanogenMod ROMs的支持,直到它们过渡到LineageOS)

v2.0.6

  • 仅在.ZIP文件之间循环!在此之前,即使是.TXT文件也被“解析”,这浪费了一些内存。避免这种情况,并使REST服务器更加节省内存 :)
  • HTML更改日志!如果您现在将带有HTML扩展名的更改日志文件(例如 lineage-14.0-20161230-NIGHTLY-hammerhead.html )放在ZIP文件旁边,则将首选它而不是.TXT文件!否则,回退到经典的TXT扩展名(例如 lineage-14.0-20161230-NIGHTLY-hammerhead.txt

v2.0.5

  • 修复SNAPSHOT构建的解析

v2.0.4

  • 最终修复同一目录中的TXT和ZIP文件
  • 自动检测basePath的URL(实际上没有再次触及它的需要)
  • 现在正确返回Delta构建数组

v2.0.3

  • 支持Memcached
  • 支持非官方构建(它们将被设置为channel = NIGHTLY)
  • 修复Delta构建路径
  • 修复当*.txt文件存在于/builds/完整路径下时的内部崩溃

v2.0.2

  • 修复一些破坏性更改,这将无法使REST服务器正常工作。

v2.0.1

  • 排除隐藏文件和由操作系统自动生成的文件(例如 .somethingThumbs.db)。

v2.0

  • 重构整个代码。
  • 现在一切都是PSR4兼容的。
  • 引入composer.json以简化项目的安装。

许可

LICENSE

祝您玩得开心 :)