diff --git a/.idea/jsonSchemas.xml b/.idea/jsonSchemas.xml new file mode 100644 index 0000000..f5ad76c --- /dev/null +++ b/.idea/jsonSchemas.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build b/build index 2f69899..c245f7a 100755 --- a/build +++ b/build @@ -3,7 +3,7 @@ build_pkgr() { cd pkgr mkdir -p dist/root/{usr/bin,etc/pkgr} - echo -e "You can't use pkgr to update pkgr because the file will be in use while updating.\nuse bootpkg" > dist/root/etc/pkgr/YOU-CAN-NOT-USE-PKGR-TO-UPDATE-PKGR.txt + echo -e "You can't use pkgr to update pkgr because the file will be in use while updating.\nuse bootpkg" > dist/root/etc/pkgr.d/YOU-CAN-NOT-USE-PKGR-TO-UPDATE-PKGR.txt # for bin cargo build -r diff --git a/pkgr/Cargo.toml b/pkgr/Cargo.toml index cb52813..e43b436 100644 --- a/pkgr/Cargo.toml +++ b/pkgr/Cargo.toml @@ -25,4 +25,5 @@ reqwest = { version = "0.11.18", features = ["blocking"] } tar = "0.4.39" humantime = "2.1.0" expanduser = "1.2.2" -url = { version = "2.4.0", features = ["serde"] } \ No newline at end of file +url = { version = "2.4.0", features = ["serde"] } +dns-lookup = "2.0.3" diff --git a/pkgr/skel/etc/pkgr.d/repos.toml b/pkgr/skel/etc/pkgr.d/repos.toml index cf1316a..2723e7b 100644 --- a/pkgr/skel/etc/pkgr.d/repos.toml +++ b/pkgr/skel/etc/pkgr.d/repos.toml @@ -1,3 +1,4 @@ [repo.main] name = "Main" -url = "tcp://pkgs.ixvd.net:1050" \ No newline at end of file +url = "tcp://pkgs.ixvd.net:1050" + diff --git a/pkgr/skel/etc/pkgr.toml b/pkgr/skel/etc/pkgr.toml index 41f8e2c..2ee5004 100644 --- a/pkgr/skel/etc/pkgr.toml +++ b/pkgr/skel/etc/pkgr.toml @@ -3,4 +3,5 @@ tmp_dir = "/tmp/pkgr" [storage] repo_file = "/etc/pkgr.d/repos.toml" -data_dir = "/var/lib/pkgr/packages" \ No newline at end of file +data_dir = "/var/lib/pkgr/packages" +index_dir = "/var/lib/pkgr/indexes" \ No newline at end of file diff --git a/pkgr/skel/var/lib/pkgr/indexes/repo.toml b/pkgr/skel/var/lib/pkgr/indexes/repo.toml new file mode 100644 index 0000000..47fa234 --- /dev/null +++ b/pkgr/skel/var/lib/pkgr/indexes/repo.toml @@ -0,0 +1,20 @@ +[index.main] +last_update = "1610219288" +[index.main.packager] +versions = [1, 2, 3] +tags = ["tag"] + +## rust +# IndexedPackage +# - name -> packager +# - origin_repo -> main +# - versions -> [1,2,3] +# - tags -> ["tag"] +# - get_package() -> Package + +## rust +# Repo +# - name -> main +# - last_update -> 1610219288 +# - update_repo() -> io::Result<()> +# - searchIndex(p: PackageIdentifier) -> IndexedPackage \ No newline at end of file diff --git a/pkgr/src/api/client.rs b/pkgr/src/api/client.rs new file mode 100644 index 0000000..e69de29 diff --git a/pkgr/src/api/mod.rs b/pkgr/src/api/mod.rs index a46a4d0..1ed3d70 100644 --- a/pkgr/src/api/mod.rs +++ b/pkgr/src/api/mod.rs @@ -1,42 +1,60 @@ use std::collections::HashMap; +use serde; +use serde::{Deserialize, Serialize}; -enum Query { +pub mod client; + +#[derive(Serialize, Deserialize)] +pub enum Query { + #[serde(rename = "pull")] Pull { name: String, version: Option, tags: Vec }, + #[serde(rename = "push")] Push { + // todo: review me pls _data: Vec + }, + #[serde(rename = "index")] + Index { + request_update: bool, + fetch: bool } } -struct Request { +#[derive(Serialize, Deserialize)] +pub struct Request { version: u32, id: String, token: Option, query: HashMap } -struct DataErrorDetails { +#[derive(Serialize, Deserialize)] +pub struct DataErrorDetails { actor: String, detailed_cause: String, recovery_options: Vec, } -struct DataError { +#[derive(Serialize, Deserialize)] +pub struct DataError { name: String, cause: Option, details: Option } -enum Data { +#[derive(Serialize, Deserialize)] +pub enum Data { Pull { _data: Option>, } } -struct Response { +#[derive(Serialize, Deserialize)] +pub struct Response { version: u32, id: String, reply_to: String, diff --git a/pkgr/src/config/repos.rs b/pkgr/src/config/repos.rs index d689a92..8594a25 100644 --- a/pkgr/src/config/repos.rs +++ b/pkgr/src/config/repos.rs @@ -22,4 +22,16 @@ impl Default for Repo { #[derive(Clone, Serialize, Deserialize)] pub struct RepoFile { pub repos: HashMap +} + +impl RepoFile { + pub fn from_path(path: &str) -> Result { + match std::fs::read_to_string(path) { + Ok(s) => match toml::from_str(&s) { + Ok(c) => Ok(c), + Err(e) => Err(format!("failed to parse config: {}", e)), + }, + Err(e) => Err(format!("failed to read config: {}", e)), + } + } } \ No newline at end of file diff --git a/pkgr/src/config/storage.rs b/pkgr/src/config/storage.rs index ba18e5f..5fa8fa1 100644 --- a/pkgr/src/config/storage.rs +++ b/pkgr/src/config/storage.rs @@ -7,7 +7,10 @@ pub struct Storage { pub repo_file: String, /// Where to store pkgs data #[serde(default)] - pub data_dir: String + pub data_dir: String, + /// Where to store repo indexes + #[serde(default)] + pub index_dir: String, } impl Default for Storage { @@ -15,6 +18,7 @@ impl Default for Storage { Storage { repo_file: String::from("/etc/pkgr.d/repos.toml"), data_dir: String::from("/var/lib/pkgr/packages"), + index_dir: String::from("/var/lib/pkgr/indexes"), } } } diff --git a/pkgr/src/main.rs b/pkgr/src/main.rs index 798eb1d..3aff896 100644 --- a/pkgr/src/main.rs +++ b/pkgr/src/main.rs @@ -9,6 +9,8 @@ mod commands; mod logging; /// Package and helpers. mod package; +/// Repo and helpers +mod repo; /// Process wrapper with logging wrapper. mod process; /// tmpfs wrapper. diff --git a/pkgr/src/repo/index/index_package.rs b/pkgr/src/repo/index/index_package.rs new file mode 100644 index 0000000..ca60160 --- /dev/null +++ b/pkgr/src/repo/index/index_package.rs @@ -0,0 +1,18 @@ +use std::io; +use std::path::Path; +use serde::{Deserialize, Serialize}; +use url::Url; +use pkgfile::PKGFile; +use crate::api::Query; +use crate::CONFIG; +use crate::package::Package; +use crate::repo::index::RepoIndex; + +/// This struct solely exists for indexing and has no real functionality. +#[derive(Serialize, Deserialize)] +pub struct IndexPackage { + name: String, + versions: Vec, + tags: Vec, + uri: Url +} \ No newline at end of file diff --git a/pkgr/src/repo/index/mod.rs b/pkgr/src/repo/index/mod.rs new file mode 100644 index 0000000..fc516b6 --- /dev/null +++ b/pkgr/src/repo/index/mod.rs @@ -0,0 +1,58 @@ +use std::collections::HashMap; +use std::io; +use std::path::Path; +use serde::{Deserialize, Serialize}; +use crate::api::Request; +use crate::CONFIG; +use crate::repo::index::index_package::IndexPackage; +use crate::repo::Repo; +use crate::types::fetch::{Fetch, TryFetch}; +use crate::util::create_uuid; + +pub mod index_package; + +#[derive(Serialize, Deserialize)] +pub struct RepoIndex { + origin_repo: String, + packages: HashMap +} + +impl RepoIndex { + // /// Fetch existing index or create a new one. + // pub fn from_repo(repo: Repo) -> Self { + // + // } + // + // /// Create new index. + // pub fn create_with_repo(repo: Repo) -> Self { + // } + + /// Get repo + pub fn get_repo(&self) -> io::Result { + Ok(Repo::from_name(&self.origin_repo)?) + } + + pub fn from_path(path: &str) -> Result { + match std::fs::read_to_string(path) { + Ok(s) => match toml::from_str(&s) { + Ok(c) => Ok(c), + Err(e) => Err(format!("failed to parse config: {}", e)), + }, + Err(e) => Err(format!("failed to read config: {}", e)), + } + } +} + +impl TryFetch for RepoIndex { + type Error = (); + /// Fetch + fn try_fetch(query: Repo) -> Result { + let path = CONFIG.with(|c| c.storage.index_dir.clone()) + query.uri.as_str() + ".toml"; + if Path::new(path.as_str()).exists() { + RepoIndex::from_path(path.as_str()) + .map_err(|_| ()) + } else { + Err(()) + } + } +} \ No newline at end of file diff --git a/pkgr/src/repo/mod.rs b/pkgr/src/repo/mod.rs new file mode 100644 index 0000000..d0c3e88 --- /dev/null +++ b/pkgr/src/repo/mod.rs @@ -0,0 +1,42 @@ +use std::io; +use std::io::{Error, ErrorKind}; +use std::path::Path; +use url::Url; +use crate::CONFIG; +use crate::config::repos::RepoFile; + +/// Indexed repos +pub mod index; + +pub struct Repo { + name: String, + uri: Url, +} + +impl Repo { + pub fn from_name(name: &String) -> io::Result { + let r = RepoFile::from_path(CONFIG.with(|c| c.storage.repo_file.clone()).as_str()) + .map_err(|e| Error::new(ErrorKind::Other, e))?; + let r = r + .repos + .get(name) + .ok_or(Error::new(ErrorKind::InvalidData, "Could not get repo"))?; + Ok(Repo { + name: r.name.clone(), + uri: r.uri.clone() + }) + } + + pub fn get_name(&self) -> String { + self.name.clone() + } + + pub fn get_uri(&self) -> Url { + self.uri.clone() + } + + /// Fetch indexed repo + pub fn get_index(&self) { + + } +} \ No newline at end of file diff --git a/pkgr/src/util/mod.rs b/pkgr/src/util/mod.rs index c239775..25c313c 100644 --- a/pkgr/src/util/mod.rs +++ b/pkgr/src/util/mod.rs @@ -1,2 +1,9 @@ pub mod prompts; -pub mod fs; \ No newline at end of file +/// Helpers for fs +pub mod fs; + +/// Create a UUID +pub fn create_uuid() -> String { + // TODO + String::from("rand") +} \ No newline at end of file