julianxhokaxhiu / lineage-ota
LineageOS OTA 更新系统应用的一个简单OTA REST服务器
Requires
- ext-zip: *
- julianxhokaxhiu/dotnotation: dev-master
- mikecao/flight: 1.*
Suggests
- ext-zip: This extension is usually enabled, if not make sure it is. LineageOTA requires it to run.
Replaces
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
属性(对于CyanogenMod或Lineage)。请参阅此示例
# ... 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
为了将此集成到您的基于CyanogenMod或LineageOS的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
- 在build.prop中添加对新Lineage命名空间的支持(见 https://review.lineageos.org/#/c/191274/ )
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
- 移除XDelta3逻辑以创建Delta(有关正确过程的描述,请见 https://forum.xda-developers.com/showthread.php?p=69760632#post69760632 )
- 如果文件正在上传的同时被访问,防止OTA系统崩溃
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
- 排除隐藏文件和由操作系统自动生成的文件(例如
.something
或Thumbs.db
)。
v2.0
- 重构整个代码。
- 现在一切都是PSR4兼容的。
- 引入composer.json以简化项目的安装。
许可
见 LICENSE。
祝您玩得开心 :)