This repository was moved to proxmox-perl-rs

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2021-11-09 15:23:56 +01:00
parent e048d7f02d
commit 6c166649e5
15 changed files with 1 additions and 448 deletions

View File

@ -1,25 +0,0 @@
[package]
name = "pve-rs"
version = "0.2.3"
authors = ["Proxmox Support Team <support@proxmox.com>"]
edition = "2018"
license = "AGPL-3"
description = "PVE parts which have been ported to Rust"
homepage = "https://www.proxmox.com"
exclude = [
"build",
"debian",
"PVE",
]
[lib]
crate-type = [ "cdylib" ]
[dependencies]
anyhow = "1.0"
hex = "0.4"
serde = "1.0"
perlmod = { version = "0.5.2", features = [ "exporter" ] }
proxmox-apt = "0.8"
proxmox-openid = "0.8"

View File

@ -1,74 +0,0 @@
include /usr/share/dpkg/default.mk
PACKAGE=libpve-rs-perl
ARCH:=$(shell dpkg-architecture -qDEB_BUILD_ARCH)
export GITVERSION:=$(shell git rev-parse HEAD)
PERL_INSTALLVENDORARCH != perl -MConfig -e 'print $$Config{installvendorarch};'
PERL_INSTALLVENDORLIB != perl -MConfig -e 'print $$Config{installvendorlib};'
MAIN_DEB=${PACKAGE}_${DEB_VERSION}_${ARCH}.deb
DBGSYM_DEB=${PACKAGE}-dbgsym_${DEB_VERSION}_${ARCH}.deb
DEBS=$(MAIN_DEB) $(DBGSYM_DEB)
DESTDIR=
PM_DIRS := \
PVE/RS/APT
PM_FILES := \
PVE/RS/OpenId.pm \
PVE/RS/APT/Repositories.pm
ifeq ($(BUILD_MODE), release)
CARGO_BUILD_ARGS += --release
endif
all:
ifneq ($(BUILD_MODE), skip)
cargo build $(CARGO_BUILD_ARGS)
endif
# always re-create this dir
# but also copy the local target/ and PVE/ dirs as a build-cache
.PHONY: build
build:
rm -rf build
cargo build --release
rsync -a debian Makefile Cargo.toml Cargo.lock src target PVE build/
.PHONY: install
install: target/release/libpve_rs.so
install -d -m755 $(DESTDIR)$(PERL_INSTALLVENDORARCH)/auto
install -m644 target/release/libpve_rs.so $(DESTDIR)$(PERL_INSTALLVENDORARCH)/auto/libpve_rs.so
install -d -m755 $(DESTDIR)$(PERL_INSTALLVENDORLIB)/PVE/RS
for i in $(PM_DIRS); do \
install -d -m755 $(DESTDIR)$(PERL_INSTALLVENDORLIB)/$$i; \
done
for i in $(PM_FILES); do \
install -m644 $$i $(DESTDIR)$(PERL_INSTALLVENDORLIB)/$$i; \
done
.PHONY: deb
deb: $(MAIN_DEB)
$(MAIN_DEB): build
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean
lintian $(DEBS)
distclean: clean
clean:
cargo clean
rm -rf *.deb *.dsc *.tar.gz *.buildinfo *.changes Cargo.lock build
find . -name '*~' -exec rm {} ';'
.PHONY: dinstall
dinstall: ${DEBS}
dpkg -i ${DEBS}
.PHONY: upload
upload: ${DEBS}
# check if working directory is clean
git diff --exit-code --stat && git diff --exit-code --stat --staged
tar cf - ${DEBS} | ssh -X repoman@repo.proxmox.com upload --product pve --dist bullseye

1
README Normal file
View File

@ -0,0 +1 @@
This repository was moved to `proxmox-perl-rs`.

49
debian/changelog vendored
View File

@ -1,49 +0,0 @@
libpve-rs-perl (0.2.3) bullseye; urgency=medium
* use newer dependencies for apt to improve repo+suite handling
-- Proxmox Support Team <support@proxmox.com> Thu, 29 Jul 2021 18:13:07 +0200
libpve-rs-perl (0.2.2) bullseye; urgency=medium
* apt: avoid overwriting files that could not be parsed
* apt: check if repository is already configured before adding
-- Proxmox Support Team <support@proxmox.com> Fri, 02 Jul 2021 13:06:42 +0200
libpve-rs-perl (0.2.1) bullseye; urgency=medium
* depend on proxmox-apt 0.4.0
-- Proxmox Support Team <support@proxmox.com> Thu, 01 Jul 2021 18:37:20 +0200
libpve-rs-perl (0.2.0) bullseye; urgency=medium
* add bindings for proxmox-apt
* depend on proxmox-openid 0.6.0
* move to native version format
-- Proxmox Support Team <support@proxmox.com> Wed, 30 Jun 2021 20:56:19 +0200
libpve-rs-perl (0.1.2-1) unstable; urgency=medium
* depend on proxmox-openid 0.5.0
* set proxmox "default-features = false"
-- Proxmox Support Team <support@proxmox.com> Wed, 23 Jun 2021 11:34:34 +0200
libpve-rs-perl (0.1.1-1) unstable; urgency=medium
* depend on perlmod 0.5.1
-- Proxmox Support Team <support@proxmox.com> Wed, 23 Jun 2021 11:09:31 +0200
libpve-rs-perl (0.1.0-1) unstable; urgency=medium
* Initial release.
-- Proxmox Support Team <support@proxmox.com> Thu, 27 May 2021 10:41:30 +0200

1
debian/compat vendored
View File

@ -1 +0,0 @@
10

20
debian/control vendored
View File

@ -1,20 +0,0 @@
Source: libpve-rs-perl
Section: perl
Priority: optional
Maintainer: Proxmox Support Team <support@proxmox.com>
Build-Depends: debhelper (>= 10),
librust-perlmod-macro-dev,
librust-anyhow-dev,
librust-proxmox-openid-dev,
librust-perlmod-dev,
librust-serde-dev,
Standards-Version: 4.3.0
Homepage: https://www.proxmox.com
Package: libpve-rs-perl
Architecture: any
Depends: ${perl:Depends},
${shlibs:Depends},
Description: Components of Proxmox Virtual Environment which have been ported to Rust.
Contains parts of Proxmox Virtual Environment which have been ported to, or
newly implemented in the Rust programming language.

16
debian/copyright vendored
View File

@ -1,16 +0,0 @@
Copyright (C) 2021 Proxmox Server Solutions GmbH
This software is written by Proxmox Server Solutions GmbH <support@proxmox.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

7
debian/rules vendored
View File

@ -1,7 +0,0 @@
#!/usr/bin/make -f
#export DH_VERBOSE=1
export BUILD_MODE=skip
%:
dh $@

View File

@ -1 +0,0 @@
3.0 (native)

1
debian/triggers vendored
View File

@ -1 +0,0 @@
activate-noawait pve-api-updates

View File

@ -1 +0,0 @@
edition = "2018"

View File

@ -1 +0,0 @@
mod repositories;

View File

@ -1,162 +0,0 @@
#[perlmod::package(name = "PVE::RS::APT::Repositories", lib = "pve_rs")]
mod export {
use std::convert::TryInto;
use anyhow::{bail, Error};
use serde::{Deserialize, Serialize};
use proxmox_apt::repositories::{
APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo,
APTStandardRepository,
};
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
/// Result for the repositories() function
pub struct RepositoriesResult {
/// Successfully parsed files.
pub files: Vec<APTRepositoryFile>,
/// Errors for files that could not be parsed or read.
pub errors: Vec<APTRepositoryFileError>,
/// Common digest for successfully parsed files.
pub digest: String,
/// Additional information/warnings about repositories.
pub infos: Vec<APTRepositoryInfo>,
/// Standard repositories and their configuration status.
pub standard_repos: Vec<APTStandardRepository>,
}
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
/// For changing an existing repository.
pub struct ChangeProperties {
/// Whether the repository should be enabled or not.
pub enabled: Option<bool>,
}
/// Get information about configured and standard repositories.
#[export]
pub fn repositories() -> Result<RepositoriesResult, Error> {
let (files, errors, digest) = proxmox_apt::repositories::repositories()?;
let digest = hex::encode(&digest);
let suite = proxmox_apt::repositories::get_current_release_codename()?;
let infos = proxmox_apt::repositories::check_repositories(&files, suite);
let standard_repos = proxmox_apt::repositories::standard_repositories(&files, "pve", suite);
Ok(RepositoriesResult {
files,
errors,
digest,
infos,
standard_repos,
})
}
/// Add the repository identified by the `handle`.
/// If the repository is already configured, it will be set to enabled.
///
/// The `digest` parameter asserts that the configuration has not been modified.
#[export]
pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> {
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
let handle: APTRepositoryHandle = handle.try_into()?;
let suite = proxmox_apt::repositories::get_current_release_codename()?;
if let Some(digest) = digest {
let expected_digest = hex::decode(digest)?;
if expected_digest != current_digest {
bail!("detected modified configuration - file changed by other user? Try again.");
}
}
// check if it's already configured first
for file in files.iter_mut() {
for repo in file.repositories.iter_mut() {
if repo.is_referenced_repository(handle, "pve", &suite.to_string()) {
if repo.enabled {
return Ok(());
}
repo.set_enabled(true);
file.write()?;
return Ok(());
}
}
}
let (repo, path) = proxmox_apt::repositories::get_standard_repository(handle, "pve", suite);
if let Some(error) = errors.iter().find(|error| error.path == path) {
bail!(
"unable to parse existing file {} - {}",
error.path,
error.error,
);
}
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
file.repositories.push(repo);
file.write()?;
} else {
let mut file = match APTRepositoryFile::new(&path)? {
Some(file) => file,
None => bail!("invalid path - {}", path),
};
file.repositories.push(repo);
file.write()?;
}
Ok(())
}
/// Change the properties of the specified repository.
///
/// The `digest` parameter asserts that the configuration has not been modified.
#[export]
pub fn change_repository(
path: &str,
index: usize,
options: ChangeProperties,
digest: Option<&str>,
) -> Result<(), Error> {
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
if let Some(digest) = digest {
let expected_digest = hex::decode(digest)?;
if expected_digest != current_digest {
bail!("detected modified configuration - file changed by other user? Try again.");
}
}
if let Some(error) = errors.iter().find(|error| error.path == path) {
bail!("unable to parse file {} - {}", error.path, error.error);
}
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
if let Some(repo) = file.repositories.get_mut(index) {
if let Some(enabled) = options.enabled {
repo.set_enabled(enabled);
}
file.write()?;
} else {
bail!("invalid index - {}", index);
}
} else {
bail!("invalid path - {}", path);
}
Ok(())
}
}

View File

@ -1,2 +0,0 @@
pub mod apt;
pub mod openid;

View File

@ -1,88 +0,0 @@
#[perlmod::package(name = "PVE::RS::OpenId", lib = "pve_rs")]
mod export {
use std::sync::Mutex;
use std::convert::TryFrom;
use anyhow::Error;
use perlmod::{to_value, Value};
use proxmox_openid::{OpenIdConfig, OpenIdAuthenticator, PrivateAuthState};
const CLASSNAME: &str = "PVE::RS::OpenId";
/// An OpenIdAuthenticator client instance.
pub struct OpenId {
inner: Mutex<OpenIdAuthenticator>,
}
impl<'a> TryFrom<&'a Value> for &'a OpenId {
type Error = Error;
fn try_from(value: &'a Value) -> Result<&'a OpenId, Error> {
Ok(unsafe { value.from_blessed_box(CLASSNAME)? })
}
}
fn bless(class: Value, mut ptr: Box<OpenId>) -> Result<Value, Error> {
let value = Value::new_pointer::<OpenId>(&mut *ptr);
let value = Value::new_ref(&value);
let this = value.bless_sv(&class)?;
let _perl = Box::leak(ptr);
Ok(this)
}
#[export(name = "DESTROY")]
fn destroy(#[raw] this: Value) {
perlmod::destructor!(this, OpenId: CLASSNAME);
}
/// Create a new OpenId client instance
#[export(raw_return)]
pub fn discover(
#[raw] class: Value,
config: OpenIdConfig,
redirect_url: &str,
) -> Result<Value, Error> {
let open_id = OpenIdAuthenticator::discover(&config, redirect_url)?;
bless(
class,
Box::new(OpenId {
inner: Mutex::new(open_id),
}),
)
}
#[export]
pub fn authorize_url(
#[try_from_ref] this: &OpenId,
state_dir: &str,
realm: &str,
) -> Result<String, Error> {
let open_id = this.inner.lock().unwrap();
open_id.authorize_url(state_dir, realm)
}
#[export]
pub fn verify_public_auth_state(
state_dir: &str,
state: &str,
) -> Result<(String, PrivateAuthState), Error> {
OpenIdAuthenticator::verify_public_auth_state(state_dir, state)
}
#[export(raw_return)]
pub fn verify_authorization_code(
#[try_from_ref] this: &OpenId,
code: &str,
private_auth_state: PrivateAuthState,
) -> Result<Value, Error> {
let open_id = this.inner.lock().unwrap();
let claims = open_id.verify_authorization_code(code, &private_auth_state)?;
Ok(to_value(&claims)?)
}
}