Initial Dever 0.0.1

This commit is contained in:
Codex committed 2026-11-03 03:32:07 +00:00
commit 81233d098c
1479 files changed
+163782

No files matched your search

+110
View File
@@ -0,0 +1,110 @@
//! 只在开发 Pod 执行:读取已安装工具,组装临时签名输入;不安装或激活软件。
use super::{
Fixture,
fixture::{archive, hash, signed},
};
use serde_json::json;
use std::{collections::BTreeMap, fs, path::Path, process::Command};
pub(super) fn prepare(fixture: &mut Fixture) {
let target = fixture.target.name();
let mut assets = BTreeMap::new();
let mut dependencies = BTreeMap::new();
let node = Path::new("/usr/local/bin/node");
let python = Path::new("/usr/bin/python3");
let node_bytes = fs::read(node).expect("Node must already exist in the development Pod");
let python_bytes = fs::read(python).expect("Python must already exist in the development Pod");
libraries(node, &mut dependencies);
libraries(python, &mut dependencies);
let markers = json!({"implementation_name":"cpython","implementation_version":"3.13.0","os_name":"posix","platform_machine":"x86_64","platform_python_implementation":"CPython","platform_release":"","platform_system":"Linux","platform_version":"","python_full_version":"3.13.0","python_version":"3.13","sys_platform":"linux"});
let node_pack=archive(&BTreeMap::from([
("bin/node".into(),node_bytes),
("shared.txt".into(),b"shared runtime fixture".to_vec()),
("dever-runtime.json".into(),serde_json::to_vec(&json!({"format":"dever-worker-runtime-v1","ecosystem":"npm","target":target,"executable":"bin/node","arguments":[],"build":null,"python_wheel_tags":[],"python_extension_suffixes":[],"python_markers":null})).unwrap()),
]));
let python_pack=archive(&BTreeMap::from([
("bin/python3".into(),python_bytes),
("shared.txt".into(),b"shared runtime fixture".to_vec()),
("dever-runtime.json".into(),serde_json::to_vec(&json!({"format":"dever-worker-runtime-v1","ecosystem":"pip","target":target,"executable":"bin/python3","arguments":["-I","-S","-B"],"build":null,"python_wheel_tags":["py3-none-any"],"python_extension_suffixes":[".cpython-313-x86_64-linux-gnu.so"],"python_markers":markers})).unwrap()),
]));
fixture.metadata.pack.sha256 = hash(&node_pack);
fixture.metadata.pack.version = "24.21.0".into();
let python_identity = json!({"name":"python","version":"3.13.0","sha256":hash(&python_pack)});
let mut tools = BTreeMap::new();
let mut executables = Vec::new();
for (name, path) in [
("sh", "/bin/sh"),
("cc", "/usr/bin/cc"),
("c++", "/usr/bin/c++"),
("as", "/usr/bin/as"),
("ld", "/usr/bin/ld"),
("ar", "/usr/bin/ar"),
("ranlib", "/usr/bin/ranlib"),
("make", "/usr/bin/make"),
("cc1", "/usr/libexec/gcc/x86_64-linux-gnu/14/cc1"),
("collect2", "/usr/libexec/gcc/x86_64-linux-gnu/14/collect2"),
] {
let path = Path::new(path);
libraries(path, &mut dependencies);
let destination = format!("rootfs/usr/bin/{name}");
tools.insert(destination.clone(), fs::read(path).unwrap());
executables.push(destination);
}
files(
Path::new("/usr/local/lib/node_modules/npm"),
"npm/frontend/node_modules/npm/",
&mut tools,
);
tools.insert(
"rootfs/usr/bin/fixture-node".into(),
b"#!/usr/bin/env node\nprocess.stdout.write('signed script');\n".to_vec(),
);
executables.push("rootfs/usr/bin/fixture-node".into());
tools.insert("dever-build.json".into(),serde_json::to_vec(&json!({"format":"dever-lib-build-v1","ecosystem":"npm","target":target,"runtime_sha256":fixture.metadata.pack.sha256,"python_runtime_sha256":python_identity["sha256"],"executables":executables})).unwrap());
let tools_pack = archive(&tools);
assets.insert(format!("build/npm/{target}/manifest.json"),serde_json::to_vec(&json!({"format":"dever-registry-build-v1","ecosystem":"npm","target":target,"runtime_sha256":fixture.metadata.pack.sha256,"python_runtime_sha256":python_identity["sha256"],"sha256":hash(&tools_pack)})).unwrap());
assets.insert(format!("build/npm/{target}/build.pack"), tools_pack);
assets.insert(format!("runtime/npm/{target}/runtime.pack"), node_pack);
assets.insert(format!("runtime/pip/{target}/runtime.pack"), python_pack);
assets.insert(format!("runtime/npm/{target}/manifest.json"),serde_json::to_vec(&json!({"format":"dever-registry-runtime-v1","runtime":{"pack":fixture.metadata.pack,"target":target,"python_markers":null,"python_wheel_tags":[],"npm_libc":"glibc"}})).unwrap());
assets.insert(format!("runtime/pip/{target}/manifest.json"),serde_json::to_vec(&json!({"format":"dever-registry-runtime-v1","runtime":{"pack":python_identity,"target":target,"python_markers":markers,"python_wheel_tags":["py3-none-any"]}})).unwrap());
for (name, bytes) in dependencies {
assets.insert(format!("process-runtime/{target}/lib/{name}"), bytes);
}
fixture.signed = signed(&fixture.directory, &assets);
}
fn files(root: &Path, prefix: &str, output: &mut BTreeMap<String, Vec<u8>>) {
for entry in fs::read_dir(root).unwrap() {
let entry = entry.unwrap();
let name = entry.file_name().into_string().unwrap();
let kind = entry.file_type().unwrap();
if kind.is_dir() {
files(&entry.path(), &format!("{prefix}{name}/"), output);
} else if kind.is_file() {
output.insert(format!("{prefix}{name}"), fs::read(entry.path()).unwrap());
}
}
}
fn libraries(program: &Path, files: &mut BTreeMap<String, Vec<u8>>) {
let output = Command::new("/usr/bin/ldd").arg(program).output().unwrap();
assert!(
output.status.success(),
"ldd fixture input {}",
program.display()
);
for path in String::from_utf8(output.stdout)
.unwrap()
.split_whitespace()
.filter(|value| value.starts_with('/'))
{
let path = Path::new(path);
let name = path.file_name().unwrap().to_str().unwrap().to_owned();
let bytes = fs::read(path).unwrap();
if let Some(previous) = files.insert(name, bytes.clone()) {
assert_eq!(previous, bytes);
}
}
}