Dv4rune

Haixin Pang 二月 27, 2025 更新: 四月 02, 2025 #PRO

介绍

这个工具主要功能是用来方便的执行一系列操作,如:自动化任务、文件拷贝、应用管理、执行命令等。 由于自定义执行逻辑以配置文件的形式呈现过于复杂,本工具选择与Rune结合,以Module形式嵌入,可以在Rune代码中直接调用dv-api的功能。

API

外部类型

typedescription
Config用户配置
Os操作系统
Packages
DvAPI

Config

成员函数

sigdescription
fn cur() -> Config创建当前用户的Config,默认设置HIDlocalMOUNT~/.local/share/dvOSlinux
fn ssh(host: &str) -> Config创建ssh用户的Config,默认设置HOSThost参数,MOUNT~/.local/share/dvOSlinux
fn index_set(&mut self, key: &str, value: &str)设置Config的成员变量

成员变量

nametypedescription
is_systemOption<bool>设置用户是否为系统用户,如果不设置则当前用户自行探测,ssh目前为为TODO状态

Example:

let cur = Config::cur();// 创建当前用户的配置
cur["HID"] = "local_machine";// 修改当前用户的`HID`为`local_machine`
let ssh = Config::ssh("host");// 创建ssh用户的配置
ssh.is_system = Some(true);// 设置`ssh`用户为`root`用户

Os

成员函数

sigdescription
fn compat(&self, oth: &str) -> bool判断Os是否兼容于oth,如linux兼容于unix
fn as_str(&self) -> StringOs转换为字符串

Example:

let os = dv.os("this")?;// 获取`this`用户的`Os`
os.compat("linux"); // 判断`os`是否兼容于`linux`
dbg!(os.as_str()); // 打印`os`的字符串表示

Packages

成员函数

sigdescription
fn new() -> Packages创建一个新的Packages
fn add_assign(&mut self, pkg: &Packages)合并另一个Packages
fn index_set(&mut self, key: &str, value: &str)设置包管理器对应的包

Example:

let pkg = Packages::new();// 创建一个新的`Packages`
pkg["apt"] = "zellij";// 设置`apt`包管理器对应的包为`zellij`
pkg["pacman"] = "zellij";// 设置`pacman`包管理器对应的包为`zellij`
let pkg2 = Packages::new();// 创建另一个新的`Packages`
pkg2["apt"] = "alacritty";// 设置`apt`包管理器对应的包为`alacritty`
pkg += pkg2;// 合并两个`Packages`

Dv

成员函数

sigdescriptionlink
async fn add_user(id: &str, user: Config) -> Result<(), Error>添加用户link
async fn auto(id: &str, service: &str, action: &str, args: Option<&str>) -> Result<bool, Error>自动化任务link
async fn copy(id: &str, src:(&str, &str), dst:(&str, &str), confirm: Option<&str>) -> Result<bool, Error>拷贝文件link
async fn exec(id: &str, shell: Option<&str>, cmd: &str) -> Result<bool, Error>执行命令link
load_src(id: &str, path: &str) -> Result<Vec, Error>加载源文件link
async fn once(id: &str, tid: &str, f: fn() -> Future<Result<(),Error>>) -> Result<bool, Error>执行一次link
fn os(id: &str) -> Result<Os, Error>获取用户的操作系统link
async fn pm(id: &str, pkg: Package) -> Result<bool, Error>包安装器link
async fn refresh(id: &str, key: &str) -> Result<(), Error>刷新某些内置的机制link
add_user

添加一个用户,用户的配置可以是当前用户或ssh用户。

Example:

dv.add_user("this", Config::cur()).await?;
dv.add_user("system", Config::ssh("system")).await?;
auto

对指定的服务执行指定的动作,动作可以是setupreloaddestroy

平台支持:

Example:

dv.auto("this", "sshd", "reload", None).await?;
copy

copy文件到指定的用户,confirm参数可以是yun,分别表示覆盖,更新,不变。如果不指定confirm参数,则运行时会询问用户。

路径规则

srcdstactiondescription
a/b/a/* -> b/*拷贝目录下所有文件到目标目录
a/ba/* -> b/*拷贝目录下所有文件到目标目录
ab/a -> b/a拷贝目录/文件到目标目录
aba -> b拷贝目录(文件)到目标路径

注意:实际上是通过两个文件的mtime来判断文件是否需要更新

exec

执行命令或脚本,shell参数可以是Noneshell的路径,如果shellNone,则直接执行命令,如果shell不为None,则将命令作为脚本传入shell执行。

Example:

dv.exec("this", None, "echo hello").await?;
dv.exec("this", Some("bash"), "if test -f ~/.bashrc; then echo 'exist'; else echo 'not exist'; fi").await?;
load_src

加载源文件,返回一个Vec,每个元素为一个String,表示源文件的内容。

once

确保某个函数只执行一次,tid参数为任务的idf参数为函数指针,函数指针的返回值为Future<Result<(),Error>>类型。

Example:

let pkg = Packages::new();// 创建一个新的`Packages`
pkg["apt"] = "zellij";// 设置`apt`包管理器对应的包为`zellij`
dv.once("app_install", ||dv.pm("this", pkg)).await?;// 这里会执行一次`pm`函数
os

获得用户的操作系统,返回一个Os类型的对象,包含了操作系统的名称。

Example:

let os = dv.os("this")?;// 获取`this`用户的`Os`
pm

安装某个包,pkg参数为一个Packages类型的对象,表示要安装的包。

Example:

let pkg = Packages::new();// 创建一个新的`Packages`
pkg["apt"] = "zellij";// 设置`apt`包管理器对应的包为`zellij`
pkg["pacman"] = "zellij";// 设置`pacman`包管理器对应的包为`zellij`
dv.pm("this", pkg).await?;// 安装`zellij`
refresh

刷新某些内置的机制,key参数为要刷新的键值。如果key为空,则会刷新所有的键值。

keydescription
path则会删除对应的pathmtime记录
once_id则会删除对应的once_id的记录

使用

cli命令行工具的使用方法如下:

Simple CLI to use dv-api with rune

Usage: dv4rune [OPTIONS] [ENTRY] [RARGS]...

Arguments:
  [ENTRY]     The entry point of the script [default: main]
  [RARGS]...  Arguments to pass to the entry point

Options:
  -d, --directory <DIRECTORY>  [default: /home/km/.config/dv/]
  -c, --config <CONFIG>        The config file to use
  -b, --dbpath <DBPATH>        Default is $directory/.cache
  -n, --dry-run                Do not actually modify anything
      --direct-run             Run the script directly without running the __build.rn script
  -h, --help                   Print help
  -V, --version                Print version

相关文件

filedescription
.cache缓存文件,默认路径为$directory/.cache,可通过-b指定
config.rn配置文件,默认路径为$directory/config.rn,可通过-c指定
__build.rn单独运行的rune文件,路径为$directory/__build.rn

Example:

// __build.rn
// 这是一个简单的示例
// 加载配置文件
pub async fn main(dv) {
    dv.add_user("r", Config::ssh("r")).await?;
    dv.load_src("r", "rune/lib.rn").await
}
// r:~/.local/share/dv/rune/lib.rn
pub async fn setup_a(dv) {
  // 配置`a`应用
}
pub async fn setup_b(dv) {
  // 配置`b`应用
}
// config.rn
pub fn main(dv) {
  setup_a(dv).await?;
  setup_b(dv).await?;
}

路线图

执行脚本

文件操作

服务管理

应用(包)管理

platform支持:

基础操作