Repository index service
简介
Repository Index Service (RIS) 是一种用于软件包仓库管理的客户端-服务器协议。基于客户端通过 URI 提供的信息,服务器响应一个 XML 仓库索引。然后,客户端使用此信息来管理系统上的仓库服务。
Repository Index Service 是 Novell Update Service 的扩展,用于 SUSE Linux Enterprise 的更新管理。与 NU 服务相比,RIS 不需要身份验证。仓库索引可以基于 URI 中包含的任何信息生成,例如 URI 参数、路径以及用户凭据。另一个扩展允许在索引中使用整个 URI,而 NU 服务仅允许相对于服务 URI 的路径。
规范
服务器
服务器的主要任务是提供repoindex.xml该文件预计位于<RIS-URI>/repo/repoindex.xml其中RIS-URI是服务的基本 URI(需要注意的是,基本 URI 已经可以包含非空路径)。
RNC schema 的 repoindex.xml 文件在 libzypp 的 中维护。URI 的<repo>标签应指向常见的软件仓库(如 rpmmd、yast 或其他);它们不应指向其他服务。
repoindex.xml 可以是静态的,也可以是根据各种 URI 组件数据(如用户凭据、参数或路径)动态生成的。提供服务的站点管理员发布客户端用于访问服务的 URI。
客户端
客户端负责管理系统上定义的服务,管理属于服务的仓库集合,以及最重要的是,从指定的 URI 检索仓库索引并根据它更新系统上的仓库定义。以下子部分更详细地描述了客户端的职责。
添加服务
客户端应根据用户提供的数据创建并保存一个 .service 文件,至少包含所需的属性。完成后,该服务必须被客户端所知。客户端可以(但不要求)自动刷新该服务。
移除服务
移除服务意味着从系统中移除其所有仓库。客户端不需要读取仓库索引来完成此任务。
刷新服务
对于系统上启用的每个服务,客户端的任务是读取服务 URI 指向的仓库索引,并根据它更新系统仓库。
- 对于目标系统相关的(匹配目标发行版)且未在其上找到的仓库必须添加。为了防止仓库别名冲突,客户端应采用某种区分方法,例如将系统上的仓库别名前缀加上服务别名,或类似方法。索引中找到的所有仓库属性都应填充到新添加的仓库中。
- 在系统中找到但不在索引中的仓库必须移除。
- 索引和系统仓库使用仓库别名和目标发行版相互关联。
- 现有系统仓库的启用状态不应被更改。应将启用或禁用所需仓库的责任留给用户。例外情况是,如果仓库别名列在repostoenable或repostodisable属性的.service文件中,在这种情况下,客户端应启用/禁用相应的仓库。新添加的仓库应作为禁用的状态添加。
- 匹配的现有系统仓库的URI 必须根据索引进行更新。
- 其他属性也可以选择性地更新,但如果客户端选择这样做,它应警告用户,服务仓库的任何更改将在下次刷新时丢失。
必须忽略禁用的服务。
禁用服务
禁用服务意味着在系统上禁用其所有仓库并禁用该服务本身。禁用的服务仍然被客户端所知,但在刷新服务时必须被忽略。
客户端不需要读取仓库索引来完成此任务。
启用服务
启用服务意味着启用该服务本身(从而使其在刷新时不会被忽略)。除非客户端实施某种存储仓库启用状态的机制,并在禁用服务时存储该状态并在重新启用服务时恢复该状态,否则不应启用该服务的仓库。
身份验证
如果 URI 需要身份验证,客户端必须要求用户提供凭据或检索先前保存的凭据。这些凭据然后应用于服务的任何需要身份验证的仓库。
.service 文件
用于存储系统上有关服务的信息。该文件采用 INI 格式,其中一个部分以服务的别名作为其名称,并具有以下属性
| 名称 | description | 值 | 必需 | default |
| 名称 | 服务的描述性名称。 | 字符串 | no | <空> |
| url | 服务的 URL | URL | yes | <N/A> |
| 类型 | 服务类型 | ris(用于 Repository Index Service)或 NONE | 否(应检测) | NONE |
| 已启用 | 启用状态 | 1 或 0 | no | 0 |
| 自动刷新 | 是否应在使用时自动刷新服务。 | 1 或 0 | no | 0 |
| repostoenable | 在服务刷新期间应启用的仓库列表。客户端应在刷新后从 .service 文件中删除此属性。 | 逗号分隔的仓库别名列表 | no | <空> |
| repostodisable | 在服务刷新期间应禁用的仓库列表。客户端应在刷新后从 .service 文件中删除此属性。 | 逗号分隔的仓库别名列表 | no | <空> |
如果属性不存在于 .service 文件中,应使用列出的默认值。如果类型不存在或为 NONE,则应在需要时检测它并最终保存回 .service 文件。一旦类型存在且已知,客户端应在访问服务 URL 时检测到其他类型的服务时发出错误消息。
示例
repoindex.xml
让我们有一个服务,为当前的 openSUSE 发行版提供主仓库,网址为 http://somesoftwaresite.org/current/opensuse。repoindex.xml 文件可能如下所示
<?xml version="1.0"?>
<repoindex>
<repo alias="os11-main" name="openSUSE 11.0 Main" description="Main openSUSE 11.0 i386 repository"
url="http://download.opensuse.org/distribution/11.0/repo/oss/" distro_target="opensuse-11-i386" priority="50"/>
<repo alias="os11-main" name="openSUSE 11.0 Main" description="Main openSUSE 11.0 x86_64 repository"
url="http://download.opensuse.org/distribution/11.0/repo/oss/" distro_target="opensuse-11-x86_64" priority="50"/>
<repo alias="os11-main" name="openSUSE 11.0 Main" description="Main openSUSE 11.0 ppc repository"
url="http://download.opensuse.org/distribution/11.0/repo/oss/" distro_target="opensuse-11-ppc" priority="50"/>
<repo alias="os11-nos" name="openSUSE 11.0 Non-OSS" description="Non Open Source Software for openSUSE 11.0 i386"
url="http://download.opensuse.org/distribution/11.0/repo/non-oss/" distro_target="opensuse-11-i386" priority="70"/>
<repo alias="os11-nos" name="openSUSE 11.0 Non-OSS" description="Non Open Source Software for openSUSE 11.0 x86_64"
url="http://download.opensuse.org/distribution/11.0/repo/non-oss/" distro_target="opensuse-11-x86_64" priority="70"/>
<repo alias="os11-nos" name="openSUSE 11.0 Non-OSS" description="Non Open Source Software for openSUSE 11.0 ppc"
url="http://download.opensuse.org/distribution/11.0/repo/non-oss/" distro_target="opensuse-11-ppc" priority="70"/>
<repo alias="os11-upd" name="openSUSE 11.0 Updates" description="Official update repository for openSUSE 11.0 i386"
url="http://download.opensuse.org/update/11.0/" distro_target="opensuse-11-i386" priority="20"/>
<repo alias="os11-upd" name="openSUSE 11.0 Updates" description="Official update repository for openSUSE 11.0 x86_64"
url="http://download.opensuse.org/update/11.0/" distro_target="opensuse-11-x86_64" priority="20"/>
<repo alias="os11-upd" name="openSUSE 11.0 Updates" description="Official update repository for openSUSE 11.0 ppc"
url="http://download.opensuse.org/update/11.0/" distro_target="opensuse-11-ppc" priority="20"/>
</repoindex>
客户端将获取服务 URI,获取索引并将 os11-main、os11-nos 和 os11-upd 仓库添加到系统,使其准备好进行安装。在发布 11.1 后,服务管理员将使用当前的仓库更新索引。客户端将在刷新时删除旧仓库并添加新仓库。
另一个示例可能是专有软件供应商的受限访问服务。repoindex.xml 可以根据身份验证和购买的产品数据库动态生成。在这种情况下,仓库本身应需要身份验证。
<repoindex>
<repo alias="company-foo" name="Company's Foo"
path="products/foo" distro_target="sle-11-i386" priority="20"/>
<repo alias="company-bar" name="Company's Bar"
path="products/bar" distro_target="sle-11-i386" priority="20"/>
<repo alias="company-foo-upd" name="Company's Foo Updates"
path="products/foo/updates" distro_target="sle-11-i386" priority="1"/>
</repoindex>
客户端将获取服务 URI,进行身份验证,获取索引并将仓库添加到系统。供应商将根据客户的购买情况更新索引。客户端将在刷新时与索引同步。
.service
[best] name=The Best Opensource Software enabled=1 autorefresh=0 url=http://somesite.org/repos/ type=ris