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