openSUSE Commits
Threads by month
- ----- 2024 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
July 2024
- 1 participants
- 268 discussions
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package qrtool for openSUSE:Factory checked in at 2024-07-04 16:26:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/qrtool (Old)
and /work/SRC/openSUSE:Factory/.qrtool.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qrtool"
Thu Jul 4 16:26:38 2024 rev:4 rq:1185240 version:0.11.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/qrtool/qrtool.changes 2024-06-29 15:17:32.680481399 +0200
+++ /work/SRC/openSUSE:Factory/.qrtool.new.2080/qrtool.changes 2024-07-04 16:27:41.233178900 +0200
@@ -1,0 +2,8 @@
+Wed Jul 3 20:46:09 UTC 2024 - Muhammad Akbar Yanuar Mantari <mantarimay(a)pm.me>
+
+- Update to version 0.11.0
+ * Change --zopfli to allow it to take a value. If the value is
+ not specified, it is assumed that 15 is specified. This is the
+ same as before the change
+
+-------------------------------------------------------------------
Old:
----
qrtool-0.10.13.tar.gz
New:
----
qrtool-0.11.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ qrtool.spec ++++++
--- /var/tmp/diff_new_pack.ncreUZ/_old 2024-07-04 16:27:42.941241253 +0200
+++ /var/tmp/diff_new_pack.ncreUZ/_new 2024-07-04 16:27:42.941241253 +0200
@@ -22,7 +22,7 @@
%bcond_without test
%endif
Name: qrtool
-Version: 0.10.13
+Version: 0.11.0
Release: 0
Summary: An utility for encoding or decoding QR code
License: MIT AND CC-BY-4.0 AND Apache-2.0
++++++ qrtool-0.10.13.tar.gz -> qrtool-0.11.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/CHANGELOG.adoc new/qrtool-0.11.0/CHANGELOG.adoc
--- old/qrtool-0.10.13/CHANGELOG.adoc 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/CHANGELOG.adoc 2024-07-03 18:27:00.000000000 +0200
@@ -14,6 +14,14 @@
The format is based on https://keepachangelog.com/[Keep a Changelog], and this
project adheres to https://semver.org/[Semantic Versioning].
+== {compare-url}/v0.10.13\...v0.11.0[0.11.0] - 2024-07-03
+
+=== Changed
+
+* Change `--zopfli` to allow it to take a value. If the value is not specified,
+ it is assumed that 15 is specified. This is the same as before the change
+ ({pull-request-url}/534[#534])
+
== {compare-url}/v0.10.12\...v0.10.13[0.10.13] - 2024-06-29
=== Fixed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/Cargo.lock new/qrtool-0.11.0/Cargo.lock
--- old/qrtool-0.10.13/Cargo.lock 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/Cargo.lock 2024-07-03 18:27:00.000000000 +0200
@@ -196,9 +196,9 @@
[[package]]
name = "cc"
-version = "1.0.101"
+version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d"
+checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490"
[[package]]
name = "cfg-if"
@@ -823,7 +823,7 @@
[[package]]
name = "qrtool"
-version = "0.10.13"
+version = "0.11.0"
dependencies = [
"anyhow",
"assert_cmd",
@@ -1116,9 +1116,9 @@
[[package]]
name = "sysexits"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaeada5433f30b34f25f70784cfc22b05d06a32eaa7e598b1433ecffb27e9499"
+checksum = "c4008983d29e823b1415f5f12732d5c9a44059795fb6218262cc0185668851e2"
[[package]]
name = "tap"
@@ -1410,18 +1410,18 @@
[[package]]
name = "zerocopy"
-version = "0.7.34"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.7.34"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/Cargo.toml new/qrtool-0.11.0/Cargo.toml
--- old/qrtool-0.10.13/Cargo.toml 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/Cargo.toml 2024-07-03 18:27:00.000000000 +0200
@@ -4,7 +4,7 @@
[package]
name = "qrtool"
-version = "0.10.13"
+version = "0.11.0"
authors = ["Shun Sakai <sorairolake(a)protonmail.ch>"]
edition = "2021"
rust-version = "1.74.0"
@@ -30,7 +30,7 @@
qrcode = "0.14.0"
resvg = { version = "0.42.0", default-features = false, optional = true }
rqrr = "0.7.1"
-sysexits = "0.8.0"
+sysexits = "0.8.1"
[dev-dependencies]
assert_cmd = "2.0.14"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/docs/man/man1/qrtool-encode.1.adoc new/qrtool-0.11.0/docs/man/man1/qrtool-encode.1.adoc
--- old/qrtool-0.10.13/docs/man/man1/qrtool-encode.1.adoc 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/docs/man/man1/qrtool-encode.1.adoc 2024-07-03 18:27:00.000000000 +0200
@@ -4,7 +4,7 @@
= qrtool-encode(1)
// Specify in UTC.
-:docdate: 2024-06-29
+:docdate: 2024-07-02
:doctype: manpage
ifdef::revnumber[:mansource: qrtool {revnumber}]
ifndef::revnumber[:mansource: qrtool]
@@ -116,8 +116,8 @@
*--optimize-png* [_LEVEL_]::
Set the optimization level for a PNG image. Lower levels are faster, higher
- levels provide better compression. If the value is not specified, it is
- assumed that the default level 2 is specified.
+ levels provide better compression. If _LEVEL_ is not specified, it is assumed
+ that the default level 2 is specified.
The possible values are:{blank}:::
@@ -155,9 +155,12 @@
endif::[]
ifdef::optimize-output-png,env-github,site-gen-antora[]
-*--zopfli*::
+*--zopfli* [_ITERATION_]::
- Use Zopfli to compress PNG image. This option requires *--optimize-png*.
+ Use Zopfli to compress PNG image. Perform compression for the number of
+ iterations specified by _ITERATION_. If _ITERATION_ is not specified, it is
+ assumed that 15 is specified as the number of iterations. This option
+ requires *--optimize-png*.
endif::[]
*--mode* _MODE_::
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/src/app.rs new/qrtool-0.11.0/src/app.rs
--- old/qrtool-0.10.13/src/app.rs 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/src/app.rs 2024-07-03 18:27:00.000000000 +0200
@@ -110,10 +110,7 @@
#[cfg(feature = "optimize-output-png")]
if let Some(level) = arg.optimize_png {
let mut optimize_opt = oxipng::Options::from_preset(level.into());
- if arg.zopfli {
- let iterations = std::num::NonZeroU8::new(15).expect(
- "the number of compression iterations should be non-zero",
- );
+ if let Some(iterations) = arg.zopfli {
optimize_opt.deflate = oxipng::Deflaters::Zopfli { iterations };
}
buf = oxipng::optimize_from_memory(&buf, &optimize_opt)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/src/cli.rs new/qrtool-0.11.0/src/cli.rs
--- old/qrtool-0.10.13/src/cli.rs 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/src/cli.rs 2024-07-03 18:27:00.000000000 +0200
@@ -42,8 +42,8 @@
"See `qrtool-decode(1)` for more details."
);
-#[allow(clippy::struct_excessive_bools)]
#[derive(Debug, Parser)]
+#[allow(clippy::struct_excessive_bools)]
#[command(
version,
long_version(LONG_VERSION),
@@ -155,7 +155,7 @@
/// Set the optimization level for a PNG image.
///
/// Lower levels are faster, higher levels provide better compression. If
- /// the value is not specified, it is assumed that the default level 2 is
+ /// <LEVEL> is not specified, it is assumed that the default level 2 is
/// specified.
#[cfg(feature = "optimize-output-png")]
#[arg(
@@ -169,9 +169,19 @@
pub optimize_png: Option<PngOptimizationLevel>,
/// Use Zopfli to compress PNG image.
+ ///
+ /// Perform compression for the number of iterations specified by
+ /// <ITERATION>. If <ITERATION> is not specified, it is assumed that 15 is
+ /// specified as the number of iterations.
#[cfg(feature = "optimize-output-png")]
- #[arg(long, requires("optimize_png"))]
- pub zopfli: bool,
+ #[arg(
+ long,
+ requires("optimize_png"),
+ num_args(0..=1),
+ value_name("ITERATION"),
+ default_missing_value("15")
+ )]
+ pub zopfli: Option<std::num::NonZeroU8>,
/// The mode of the output.
///
@@ -294,8 +304,8 @@
}
}
-#[allow(clippy::doc_markdown)]
#[derive(Clone, Debug, ValueEnum)]
+#[allow(clippy::doc_markdown)]
#[value(rename_all = "lower")]
pub enum Shell {
/// Bash.
@@ -460,8 +470,8 @@
Micro,
}
-#[allow(clippy::doc_markdown)]
#[derive(Clone, Debug, ValueEnum)]
+#[allow(clippy::doc_markdown)]
#[value(rename_all = "lower")]
pub enum InputFormat {
/// Windows Bitmap.
@@ -605,8 +615,8 @@
assert_eq!(OutputFormat::default(), OutputFormat::Png);
}
- #[test]
#[cfg(feature = "optimize-output-png")]
+ #[test]
fn from_png_optimization_level_to_u8() {
assert_eq!(u8::from(PngOptimizationLevel::Level0), 0);
assert_eq!(u8::from(PngOptimizationLevel::Level1), 1);
@@ -695,8 +705,8 @@
);
}
- #[test]
#[cfg(feature = "decode-from-svg")]
+ #[test]
fn try_from_input_format_to_image_format_when_svg() {
assert!(ImageFormat::try_from(InputFormat::Svg).is_err());
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/src/decode.rs new/qrtool-0.11.0/src/decode.rs
--- old/qrtool-0.10.13/src/decode.rs 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/src/decode.rs 2024-07-03 18:27:00.000000000 +0200
@@ -83,15 +83,15 @@
mod tests {
use super::*;
- #[test]
#[cfg(feature = "decode-from-svg")]
+ #[test]
fn valid_extension_as_svg() {
assert!(is_svg("image.svg"));
assert!(is_svg("image.svgz"));
}
- #[test]
#[cfg(feature = "decode-from-svg")]
+ #[test]
fn invalid_extension_as_svg() {
assert!(!is_svg("image.png"));
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/tests/decode.rs new/qrtool-0.11.0/tests/decode.rs
--- old/qrtool-0.10.13/tests/decode.rs 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/tests/decode.rs 2024-07-03 18:27:00.000000000 +0200
@@ -73,8 +73,8 @@
));
}
-#[test]
#[cfg(feature = "decode-from-bmp")]
+#[test]
fn decode_from_bmp() {
utils::command::command()
.arg("decode")
@@ -102,8 +102,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-dds")]
+#[test]
fn decode_from_dds() {
utils::command::command()
.arg("decode")
@@ -131,8 +131,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-ff")]
+#[test]
fn decode_from_farbfeld() {
utils::command::command()
.arg("decode")
@@ -160,8 +160,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-gif")]
+#[test]
fn decode_from_gif() {
utils::command::command()
.arg("decode")
@@ -189,8 +189,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-hdr")]
+#[test]
fn decode_from_hdr() {
utils::command::command()
.arg("decode")
@@ -218,8 +218,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-ico")]
+#[test]
fn decode_from_bmp_cur() {
utils::command::command()
.arg("decode")
@@ -240,8 +240,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-ico")]
+#[test]
fn decode_from_png_cur() {
utils::command::command()
.arg("decode")
@@ -262,8 +262,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-ico")]
+#[test]
fn decode_from_bmp_ico() {
utils::command::command()
.arg("decode")
@@ -281,8 +281,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-ico")]
+#[test]
fn decode_from_png_ico() {
utils::command::command()
.arg("decode")
@@ -300,8 +300,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-ico")]
+#[test]
fn decode_from_ico_with_wrong_format() {
utils::command::command()
.arg("decode")
@@ -314,8 +314,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-jpeg")]
+#[test]
fn decode_from_jpeg() {
utils::command::command()
.arg("decode")
@@ -343,8 +343,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-exr")]
+#[test]
fn decode_from_open_exr() {
utils::command::command()
.arg("decode")
@@ -394,8 +394,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_ascii_pbm() {
utils::command::command()
.arg("decode")
@@ -413,8 +413,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_ascii_pgm() {
utils::command::command()
.arg("decode")
@@ -432,8 +432,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_ascii_ppm() {
utils::command::command()
.arg("decode")
@@ -451,8 +451,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_binary_pbm() {
utils::command::command()
.arg("decode")
@@ -470,8 +470,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_binary_pgm() {
utils::command::command()
.arg("decode")
@@ -489,8 +489,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_binary_ppm() {
utils::command::command()
.arg("decode")
@@ -508,8 +508,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-pnm")]
+#[test]
fn decode_from_pnm_with_wrong_format() {
utils::command::command()
.arg("decode")
@@ -522,8 +522,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-qoi")]
+#[test]
fn decode_from_qoi() {
utils::command::command()
.arg("decode")
@@ -551,8 +551,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-svg")]
+#[test]
fn decode_from_svg() {
utils::command::command()
.arg("decode")
@@ -570,8 +570,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-svg")]
+#[test]
fn decode_from_svgz() {
utils::command::command()
.arg("decode")
@@ -589,8 +589,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-svg")]
+#[test]
fn decode_from_svg_with_wrong_format() {
utils::command::command()
.arg("decode")
@@ -603,8 +603,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-tga")]
+#[test]
fn decode_from_tga() {
utils::command::command()
.arg("decode")
@@ -632,8 +632,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-tiff")]
+#[test]
fn decode_from_tiff() {
utils::command::command()
.arg("decode")
@@ -661,8 +661,8 @@
.stderr(predicate::str::contains("could not read the image"));
}
-#[test]
#[cfg(feature = "decode-from-webp")]
+#[test]
fn decode_from_lossy_web_p() {
utils::command::command()
.arg("decode")
@@ -680,8 +680,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-webp")]
+#[test]
fn decode_from_lossless_web_p() {
utils::command::command()
.arg("decode")
@@ -699,8 +699,8 @@
.stdout(predicate::eq("QR code"));
}
-#[test]
#[cfg(feature = "decode-from-webp")]
+#[test]
fn decode_from_web_p_with_wrong_format() {
utils::command::command()
.arg("decode")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qrtool-0.10.13/tests/encode.rs new/qrtool-0.11.0/tests/encode.rs
--- old/qrtool-0.10.13/tests/encode.rs 2024-06-29 03:56:59.000000000 +0200
+++ new/qrtool-0.11.0/tests/encode.rs 2024-07-03 18:27:00.000000000 +0200
@@ -474,9 +474,9 @@
));
}
-#[allow(clippy::too_many_lines)]
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
+#[allow(clippy::too_many_lines)]
fn encode_to_optimized_png() {
let default_output = utils::command::command()
.arg("encode")
@@ -627,8 +627,8 @@
assert!(level6_output.status.success());
}
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
fn encode_to_maximum_optimized_png() {
let level6_output = utils::command::command()
.arg("encode")
@@ -661,8 +661,8 @@
assert!(max_output.status.success());
}
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
fn encode_to_optimized_png_without_value() {
let level2_output = utils::command::command()
.arg("encode")
@@ -697,8 +697,8 @@
assert!(without_value_output.status.success());
}
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
fn encode_to_optimized_png_with_invalid_level() {
utils::command::command()
.arg("encode")
@@ -715,8 +715,8 @@
));
}
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
fn encode_to_optimized_png_with_invalid_output_format() {
{
utils::command::command()
@@ -746,8 +746,8 @@
}
}
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
fn encode_to_optimized_png_using_zopfli() {
let without_value_output = utils::command::command()
.arg("encode")
@@ -758,35 +758,58 @@
.output()
.unwrap();
- let zopfli_output = utils::command::command()
+ let zopfli_5_iterations_output = utils::command::command()
.arg("encode")
.arg("-t")
.arg("png")
.arg("--optimize-png")
.arg("--zopfli")
+ .arg("5")
.arg("QR code")
.output()
.unwrap();
assert_eq!(
DynamicImage::ImageLuma8(
- image::load_from_memory(&zopfli_output.stdout)
+ image::load_from_memory(&zopfli_5_iterations_output.stdout)
.unwrap()
.to_luma8()
),
image::open("tests/data/encode/encode.png").unwrap()
);
- assert!(zopfli_output.stdout.len() < without_value_output.stdout.len());
- assert!(zopfli_output.status.success());
+ assert!(zopfli_5_iterations_output.stdout.len() < without_value_output.stdout.len());
+ assert!(zopfli_5_iterations_output.status.success());
+
+ let zopfli_default_iterations_output = utils::command::command()
+ .arg("encode")
+ .arg("--optimize-png")
+ .arg("--zopfli")
+ .arg("-t")
+ .arg("png")
+ .arg("QR code")
+ .output()
+ .unwrap();
+ assert_eq!(
+ DynamicImage::ImageLuma8(
+ image::load_from_memory(&zopfli_default_iterations_output.stdout)
+ .unwrap()
+ .to_luma8()
+ ),
+ image::open("tests/data/encode/encode.png").unwrap()
+ );
+ assert!(
+ zopfli_default_iterations_output.stdout.len() < zopfli_5_iterations_output.stdout.len()
+ );
+ assert!(zopfli_default_iterations_output.status.success());
}
-#[test]
#[cfg(feature = "optimize-output-png")]
+#[test]
fn encode_to_optimized_png_using_zopfli_without_level() {
utils::command::command()
.arg("encode")
+ .arg("--zopfli")
.arg("-t")
.arg("png")
- .arg("--zopfli")
.arg("QR code")
.assert()
.failure()
@@ -797,6 +820,49 @@
.stderr(predicate::str::contains("--optimize-png [<LEVEL>]"));
}
+#[cfg(feature = "optimize-output-png")]
+#[test]
+fn encode_to_optimized_png_using_zopfli_with_invalid_value() {
+ {
+ utils::command::command()
+ .arg("encode")
+ .arg("-t")
+ .arg("png")
+ .arg("--optimize-png")
+ .arg("--zopfli")
+ .arg("0")
+ .arg("QR code")
+ .assert()
+ .failure()
+ .code(2)
+ .stderr(predicate::str::contains(
+ "invalid value '0' for '--zopfli [<ITERATION>]'",
+ ))
+ .stderr(predicate::str::contains(
+ "number would be zero for non-zero type",
+ ));
+ }
+ {
+ utils::command::command()
+ .arg("encode")
+ .arg("-t")
+ .arg("png")
+ .arg("--optimize-png")
+ .arg("--zopfli")
+ .arg("256")
+ .arg("QR code")
+ .assert()
+ .failure()
+ .code(2)
+ .stderr(predicate::str::contains(
+ "invalid value '256' for '--zopfli [<ITERATION>]'",
+ ))
+ .stderr(predicate::str::contains(
+ "number too large to fit in target type",
+ ));
+ }
+}
+
#[test]
fn encode_in_numeric_mode() {
let output = utils::command::command()
++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/qrtool/vendor.tar.zst /work/SRC/openSUSE:Factory/.qrtool.new.2080/vendor.tar.zst differ: char 996609, line 4082
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-rarfile for openSUSE:Factory checked in at 2024-07-04 16:26:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-rarfile (Old)
and /work/SRC/openSUSE:Factory/.python-rarfile.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-rarfile"
Thu Jul 4 16:26:27 2024 rev:8 rq:1185230 version:4.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-rarfile/python-rarfile.changes 2022-05-04 15:11:33.112201629 +0200
+++ /work/SRC/openSUSE:Factory/.python-rarfile.new.2080/python-rarfile.changes 2024-07-04 16:27:26.068625320 +0200
@@ -1,0 +2,38 @@
+Sat Jun 29 17:30:32 UTC 2024 - Luigi Baldoni <aloisio(a)gmx.com>
+
+- Update to version 4.2
+ Features:
+ * Support unrar-free >= 0.2.0.
+ * Add RarFile.is_solid to check if archive uses solid compression.
+ Fixes:
+ * Support old multi-volume archives better where ENDARC does
+ not contain NEXTVOL.
+ version 4.1:
+ Features:
+ * Support 7zip/p7zip as decompression backend.
+ * RAR5: check password before trying to read file.
+ New APIs:
+ * Make get_rar_version a public function.
+ * New option: ``part_only`` for :class:`RarFile`,
+ to read only single file and allow it to be middle-part
+ of multi-volume archive.
+ * Add :meth:`RarFile.printdir`, use it in dumprar. Needed to
+ examine FILE_COPY or HARD_LINK entries that do not contain
+ data.
+ Fixes:
+ * Use OS separator to access filename.
+ * DirectReader: check seek position on each read.
+ Fixes read reading from multiple entries in parallel
+ on RarFile backed by file object.
+ * DirectReader: properly disable CRC check when seeking.
+ * Reset _hdrenc_main before processing a new volume.
+ Fixes CRC checks on multi-volume reads.
+ * Adapt to Python 3.10 argparse.
+ * SFX: Handle volume numbering special cases better.
+ * nsdatetime: support pypy internal use
+ * Throw error if backend does not support passwords.
+ Cleanups:
+ * Avoid isascii, not in 3.6
+- Drop help.patch (merged upstream)
+
+-------------------------------------------------------------------
Old:
----
help.patch
rarfile-4.0.tar.gz
New:
----
rarfile-4.2.tar.gz
BETA DEBUG BEGIN:
Old: * Avoid isascii, not in 3.6
- Drop help.patch (merged upstream)
BETA DEBUG END:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-rarfile.spec ++++++
--- /var/tmp/diff_new_pack.mypUn0/_old 2024-07-04 16:27:26.664647077 +0200
+++ /var/tmp/diff_new_pack.mypUn0/_new 2024-07-04 16:27:26.668647223 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-rarfile
#
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,16 +18,15 @@
%define skip_python2 1
Name: python-rarfile
-Version: 4.0
+Version: 4.2
Release: 0
Summary: RAR Archive Reader for Python
License: ISC
URL: https://rarfile.readthedocs.org/
Source0: https://files.pythonhosted.org/packages/source/r/rarfile/rarfile-%{version}…
-# https://github.com/markokr/rarfile/pull/85
-Patch0: help.patch
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module setuptools}
+BuildRequires: 7zip
BuildRequires: bsdtar
BuildRequires: fdupes
BuildRequires: python-rpm-macros
@@ -55,8 +54,7 @@
This package contains technical documentation.
%prep
-%setup -q -n rarfile-%{version}
-%autopatch -p1
+%autosetup -p1 -n rarfile-%{version}
%build
%python_build
@@ -68,7 +66,7 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-%pytest
+%pytest -k "not (test_unrar_tool or test_reading or test_rar3_header_encryption)"
%files %{python_files}
%license LICENSE
++++++ rarfile-4.0.tar.gz -> rarfile-4.2.tar.gz ++++++
++++ 2347 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package argocd-cli for openSUSE:Factory checked in at 2024-07-04 16:25:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/argocd-cli (Old)
and /work/SRC/openSUSE:Factory/.argocd-cli.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "argocd-cli"
Thu Jul 4 16:25:32 2024 rev:17 rq:1185227 version:2.11.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/argocd-cli/argocd-cli.changes 2024-06-09 20:24:12.546129808 +0200
+++ /work/SRC/openSUSE:Factory/.argocd-cli.new.2080/argocd-cli.changes 2024-07-04 16:27:03.463800133 +0200
@@ -1,0 +2,23 @@
+Wed Jul 03 19:09:39 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 2.11.4:
+ * remove unwanted updating of source-position in app set command
+ (#18887) (#18896)
+ * Bump version to 2.11.4 (#18894)
+ * fix: update static schemas (#18889)
+ * fix(controller): bad server-side diffs (#18213) (2.11) (#18868)
+ * docs: Fix .path to .path.segments go template (#18872) (#18874)
+ * fix(webhook): bitbucket and azure not triggering refresh
+ (#18289) (#18765) (#18819)
+ * fix(appset): revert "keep reconciling even when params error
+ occurred" (#17062) (#18781)
+ * fix: docs site version selector broken (#18378) (#18724)
+ * fix: Update braces package to 3.0.3 (#18459) (#18663)
+ * Revert "feat(server): log app Spec along with event (#16416)"
+ (#18458) (#18639)
+ * test: fix e2e tests after GHSA-3cqf-953p-h5cp (#18543) (#18641)
+ * chore(deps): upgrade redis to 7.2.15-alpine (cherry-pick
+ release-2.11) (#18640)
+ * chore: bump go version to 1.21.10 (#18540)
+
+-------------------------------------------------------------------
Old:
----
argo-cd-2.11.3.obscpio
New:
----
argo-cd-2.11.4.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ argocd-cli.spec ++++++
--- /var/tmp/diff_new_pack.csXhPT/_old 2024-07-04 16:27:04.883851972 +0200
+++ /var/tmp/diff_new_pack.csXhPT/_new 2024-07-04 16:27:04.887852118 +0200
@@ -21,7 +21,7 @@
%define executable_name argocd
Name: argocd-cli
-Version: 2.11.3
+Version: 2.11.4
Release: 0
Summary: CLI for the ArgoCD declarative continuous deployment tool
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.csXhPT/_old 2024-07-04 16:27:04.919853286 +0200
+++ /var/tmp/diff_new_pack.csXhPT/_new 2024-07-04 16:27:04.923853432 +0200
@@ -3,8 +3,8 @@
<param name="url">https://github.com/argoproj/argo-cd</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">v2.11.3</param>
- <param name="match-tag">v2.11.3</param>
+ <param name="revision">v2.11.4</param>
+ <param name="match-tag">v2.11.4</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
@@ -18,7 +18,7 @@
<param name="compression">gz</param>
</service>
<service name="go_modules" mode="manual">
- <param name="archive">argo-cd-2.11.3.obscpio</param>
+ <param name="archive">argo-cd-2.11.4.obscpio</param>
</service>
</services>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.csXhPT/_old 2024-07-04 16:27:04.939854016 +0200
+++ /var/tmp/diff_new_pack.csXhPT/_new 2024-07-04 16:27:04.943854163 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/argoproj/argo-cd</param>
- <param name="changesrevision">3f344d54a4e0bbbb4313e1c19cfe1e544b162598</param></service></servicedata>
+ <param name="changesrevision">e1284e19e03c9abab2ea55314b14b1e0381c4045</param></service></servicedata>
(No newline at EOF)
++++++ argo-cd-2.11.3.obscpio -> argo-cd-2.11.4.obscpio ++++++
/work/SRC/openSUSE:Factory/argocd-cli/argo-cd-2.11.3.obscpio /work/SRC/openSUSE:Factory/.argocd-cli.new.2080/argo-cd-2.11.4.obscpio differ: char 49, line 1
++++++ argo-cd.obsinfo ++++++
--- /var/tmp/diff_new_pack.csXhPT/_old 2024-07-04 16:27:04.983855623 +0200
+++ /var/tmp/diff_new_pack.csXhPT/_new 2024-07-04 16:27:04.987855769 +0200
@@ -1,5 +1,5 @@
name: argo-cd
-version: 2.11.3
-mtime: 1717662985
-commit: 3f344d54a4e0bbbb4313e1c19cfe1e544b162598
+version: 2.11.4
+mtime: 1719940451
+commit: e1284e19e03c9abab2ea55314b14b1e0381c4045
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/argocd-cli/vendor.tar.gz /work/SRC/openSUSE:Factory/.argocd-cli.new.2080/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package istioctl for openSUSE:Factory checked in at 2024-07-04 16:25:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/istioctl (Old)
and /work/SRC/openSUSE:Factory/.istioctl.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "istioctl"
Thu Jul 4 16:25:28 2024 rev:21 rq:1185225 version:1.22.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/istioctl/istioctl.changes 2024-06-06 12:32:34.720386835 +0200
+++ /work/SRC/openSUSE:Factory/.istioctl.new.2080/istioctl.changes 2024-07-04 16:26:58.231609133 +0200
@@ -1,0 +2,45 @@
+Wed Jul 3 19:03:11 UTC 2024 - Johannes Kastl <opensuse_buildservice(a)ojkastl.de>
+
+- update to 1.22.2:
+ https://istio.io/latest/news/releases/1.22.x/announcing-1.22.2/
+ This release implements the security updates described in our
+ 27th of June post, ISTIO-SECURITY-2024-005 along with bug fixes
+ to improve robustness.
+ https://istio.io/latest/news/security/istio-security-2024-005/
+ * Improved waypoint proxies to no longer run as root.
+ * Added gateways.securityContext to manifests to provide an
+ option to customize the gateway securityContext. (Issue #49549)
+ * Added a new option in ztunnel to completely disable IPv6, to
+ enable running on kernels with IPv6 disabled.
+ * Fixed an issue where istioctl analyze returned IST0162 false
+ positives. (Issue #51257)
+ * Fixed ENABLE_ENHANCED_RESOURCE_SCOPING not being part of helm
+ compatibility profiles for Istio 1.20/1.21. (Issue #51399)
+ * Fixed Kubernetes job pod IPs may not be fully unenrolled from
+ ambient despite being in a terminated state.
+ * Fixed false positives in IST0128 and IST0129 when
+ credentialName and workloadSelector were set. (Issue #51567)
+ * Fixed an issue where JWKS fetched from URIs were not updated
+ promptly when there are errors fetching other URIs. (Issue
+ #51636)
+ * Fixed an issue causing workloadSelector policies to apply to
+ the wrong namespace in ztunnel. (Issue #51556)
+ * Fixed a bug causing discoverySelectors to accidentally filter
+ out all GatewayClasses.
+ * Fixed certificate chains parsing avoid unnecessary parsing
+ errors by trimming unnecessary intermediate certificates.
+ * Fixed a bug in ambient mode causing requests at the start of a
+ Pod lifetime to be rejected with unknown source.
+ * Fixed an issue in ztunnel where some expected connection
+ terminations were reported as errors.
+ * Fixed an issue in ztunnel when connecting to a service with a
+ targetPort that exists only on a subset of pods.
+ * Fixed an issue when deleting a ServiceEntry when there are
+ duplicate hostnames across multiple ServiceEntries.
+ * Fixed an issue where ztunnel would send directly to pods when
+ connecting to a LoadBalancer IP, instead of going through the
+ LoadBalancer.
+ * Fixed an issue where ztunnel would send traffic to terminating
+ pods.
+
+-------------------------------------------------------------------
Old:
----
istio-1.22.1.obscpio
New:
----
istio-1.22.2.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ istioctl.spec ++++++
--- /var/tmp/diff_new_pack.x686Xu/_old 2024-07-04 16:27:01.059712373 +0200
+++ /var/tmp/diff_new_pack.x686Xu/_new 2024-07-04 16:27:01.059712373 +0200
@@ -19,7 +19,7 @@
%define __arch_install_post export NO_BRP_STRIP_DEBUG=true
Name: istioctl
-Version: 1.22.1
+Version: 1.22.2
Release: 0
Summary: CLI for the istio servic mesh in Kubernetes
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.x686Xu/_old 2024-07-04 16:27:01.091713541 +0200
+++ /var/tmp/diff_new_pack.x686Xu/_new 2024-07-04 16:27:01.095713687 +0200
@@ -3,7 +3,7 @@
<param name="url">https://github.com/istio/istio</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">1.22.1</param>
+ <param name="revision">1.22.2</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">disable</param>
</service>
@@ -16,7 +16,7 @@
<param name="compression">gz</param>
</service>
<service name="go_modules" mode="manual">
- <param name="archive">istio-1.22.1.obscpio</param>
+ <param name="archive">istio-1.22.2.obscpio</param>
</service>
</services>
++++++ istio-1.22.1.obscpio -> istio-1.22.2.obscpio ++++++
/work/SRC/openSUSE:Factory/istioctl/istio-1.22.1.obscpio /work/SRC/openSUSE:Factory/.istioctl.new.2080/istio-1.22.2.obscpio differ: char 49, line 1
++++++ istio.obsinfo ++++++
--- /var/tmp/diff_new_pack.x686Xu/_old 2024-07-04 16:27:01.139715293 +0200
+++ /var/tmp/diff_new_pack.x686Xu/_new 2024-07-04 16:27:01.143715439 +0200
@@ -1,5 +1,5 @@
name: istio
-version: 1.22.1
-mtime: 1717274947
-commit: a1a76b8e75f810eb6c808b04531343ae2c7b8082
+version: 1.22.2
+mtime: 1719426913
+commit: 204da5ba47f295a8dc56936333e692f6a8707649
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/istioctl/vendor.tar.gz /work/SRC/openSUSE:Factory/.istioctl.new.2080/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package lyx for openSUSE:Factory checked in at 2024-07-04 16:25:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/lyx (Old)
and /work/SRC/openSUSE:Factory/.lyx.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lyx"
Thu Jul 4 16:25:22 2024 rev:110 rq:1185215 version:2.4.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/lyx/lyx.changes 2024-06-03 17:41:01.617621654 +0200
+++ /work/SRC/openSUSE:Factory/.lyx.new.2080/lyx.changes 2024-07-04 16:26:47.379212968 +0200
@@ -1,0 +2,8 @@
+Wed Jul 3 17:41:35 UTC 2024 - Cor Blom <cornelis(a)solcon.nl>
+
+- Update to 2.4.1:
+ * First maintenance release with many fixes. For
+ details see included ANNOUNCE
+ or https://www.lyx.org/announce/2_4_1.txt
+
+-------------------------------------------------------------------
Old:
----
lyx-2.4.0.tar.xz
lyx-2.4.0.tar.xz.sig
New:
----
lyx-2.4.1.tar.xz
lyx-2.4.1.tar.xz.sig
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ lyx.spec ++++++
--- /var/tmp/diff_new_pack.d4p0MD/_old 2024-07-04 16:26:49.327284082 +0200
+++ /var/tmp/diff_new_pack.d4p0MD/_new 2024-07-04 16:26:49.355285104 +0200
@@ -21,7 +21,7 @@
%endif
Name: lyx
-Version: 2.4.0
+Version: 2.4.1
Release: 0
Summary: WYSIWYM (What You See Is What You Mean) document processor
License: GPL-2.0-or-later
++++++ lyx-2.4.0.tar.xz -> lyx-2.4.1.tar.xz ++++++
/work/SRC/openSUSE:Factory/lyx/lyx-2.4.0.tar.xz /work/SRC/openSUSE:Factory/.lyx.new.2080/lyx-2.4.1.tar.xz differ: char 27, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package matrix-synapse for openSUSE:Factory checked in at 2024-07-04 16:25:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/matrix-synapse (Old)
and /work/SRC/openSUSE:Factory/.matrix-synapse.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "matrix-synapse"
Thu Jul 4 16:25:14 2024 rev:103 rq:1185213 version:1.110.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/matrix-synapse/matrix-synapse.changes 2024-06-18 22:52:56.772781035 +0200
+++ /work/SRC/openSUSE:Factory/.matrix-synapse.new.2080/matrix-synapse.changes 2024-07-04 16:26:42.143021821 +0200
@@ -1,0 +2,101 @@
+Wed Jul 3 18:33:06 UTC 2024 - Marcus Rueckert <mrueckert(a)suse.de>
+
+- Update to 1.110.0
+ - Features
+ - Add initial implementation of an experimental MSC3575 Sliding
+ Sync /sync endpoint. (#17187)
+ - Add experimental support for MSC3823 - Account suspension.
+ (#17255)
+ - Improve ratelimiting in Synapse. (#17256)
+ - Add support for the unstable MSC4151 report room API.
+ (#17270, #17296)
+ - Filter for public and empty rooms added to Admin-API List
+ Room API. (#17276)
+ - Add is_dm filtering to experimental MSC3575 Sliding Sync
+ /sync endpoint. (#17277)
+ - Add is_encrypted filtering to experimental MSC3575 Sliding
+ Sync /sync endpoint. (#17281)
+ - Include user membership in events served to clients, per
+ MSC4115. (#17282)
+ - Do not require user-interactive authentication for uploading
+ cross-signing keys for the first time, per MSC3967. (#17284)
+ - Add stream_ordering sort to experimental MSC3575 Sliding Sync
+ /sync endpoint. (#17293)
+ - register_new_matrix_user now supports a --password-file flag,
+ which
+ - is useful for scripting. (#17294)
+ - register_new_matrix_user now supports a --exists-ok flag to
+ allow registration of users that already exist in the
+ database.
+ - This is useful for scripts that bootstrap user accounts with
+ initial passwords. (#17304)
+ - Add support for via query parameter from MSC4156. (#17322)
+ - Add is_invite filtering to experimental MSC3575 Sliding Sync
+ /sync endpoint. (#17335)
+ - Support MSC3916 by adding a federation /download endpoint.
+ (#17350)
+ - Bugfixes
+ - Fix bug where /sync requests could get blocked indefinitely
+ after an upgrade from Synapse versions before v1.109.0.
+ (#17386, [#17391](https://github.com/ /issues/17391))
+ - Fix searching for users with their exact localpart whose ID
+ includes a hyphen. (#17254)
+ - Fix wrong retention policy being used when filtering events.
+ (#17272)
+ - Fix bug where OTKs were not always included in /sync response
+ when using workers. (#17275)
+ - Fix a long-standing bug where an invalid 'from' parameter to
+ /notifications would result in an Internal Server Error.
+ (#17283)
+ - Fix edge case in /sync returning the wrong the state when
+ using sharded event persisters. (#17295)
+ - Add initial implementation of an experimental MSC3575 Sliding
+ Sync /sync endpoint. (#17301)
+ - Fix email notification subject when invited to a space.
+ (#17336)
+ - Improved Documentation
+ - Add missing quotes for example for exclude_rooms_from_sync.
+ (#17308)
+ - Update header in the README to visually fix the the
+ auto-generated table of contents. (#17329)
+ - Fix stale references to the Foundation's Security Disclosure
+ Policy. (#17341)
+ - Add default values for rc_invites.per_issuer to docs.
+ (#17347)
+ - Fix an error in the docs for search_all_users parameter under
+ user_directory. (#17348)
+ - Internal Changes
+ - Limit size of presence EDUs to 50 entries. (#17371)
+ - Fix building debian package for debian sid. (#17389)
+ - Fix uploading packages to PyPi. (#17363)
+ - Remove unused expire_access_token option in the Synapse
+ Docker config file. Contributed by @AaronDewes. (#17198)
+ - Use fully-qualified PersistedEventPosition when returning
+ RoomsForUser to facilitate proper comparisons and
+ RoomStreamToken generation. (#17265)
+ - Add debug logging for when room keys are uploaded, including
+ whether they are replacing other room keys. (#17266)
+ - Handle OTK uploads off master. (#17271)
+ - Don't try and resync devices for remote users whose servers
+ are marked as down. (#17273)
+ - Re-organize Pydantic models and types used in handlers.
+ (#17279)
+ - Expose the worker instance that persisted the event on
+ event.internal_metadata.instance_name. (#17300)
+ - Update the README with Element branding, improve headers and
+ fix the #synapse:matrix.org support room link rendering.
+ (#17324)
+ - Change path of the experimental MSC3575 Sliding Sync
+ implementation to /org.matrix.simplified_msc3575/sync since
+ our simplified API is slightly incompatible with what's in
+ the current MSC. (#17331)
+ - Handle device lists notifications for large accounts more
+ efficiently in worker mode. (#17333, #17358)
+ - Do not block event sending/receiving while calculating large
+ event auth chains. (#17338)
+ - Tidy up parse_integer docs and call sites to reflect the fact
+ that they require non-negative integers by default, and bring
+ parse_integer_from_args default in alignment. Contributed by
+ Denis Kasak (@dkasak). (#17339)
+
+-------------------------------------------------------------------
Old:
----
matrix-synapse-1.109.0.obscpio
New:
----
matrix-synapse-1.110.0.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ matrix-synapse-test.spec ++++++
--- /var/tmp/diff_new_pack.SiNcyI/_old 2024-07-04 16:26:44.407104472 +0200
+++ /var/tmp/diff_new_pack.SiNcyI/_new 2024-07-04 16:26:44.407104472 +0200
@@ -27,7 +27,7 @@
%define pkgname matrix-synapse
Name: %{pkgname}-test
-Version: 1.109.0
+Version: 1.110.0
Release: 0
Summary: Test package for %{pkgname}
License: AGPL-3.0-or-later
++++++ matrix-synapse.spec ++++++
--- /var/tmp/diff_new_pack.SiNcyI/_old 2024-07-04 16:26:44.435105493 +0200
+++ /var/tmp/diff_new_pack.SiNcyI/_new 2024-07-04 16:26:44.435105493 +0200
@@ -20,7 +20,7 @@
# NOTE: Keep this is in the same order as pyproject.toml.
%if %{with use_poetry_for_dependencies}
-%global Jinja2_version 3.1.2
+%global Jinja2_version 3.1.4
%global Pillow_version 10.2.0
%global PyYAML_version 6.0.1
%global attrs_version 23.2.0
@@ -34,9 +34,11 @@
%global jsonschema_version 4.20.0
%global matrix_common_version 1.3.0
%global matrix_common_max_version 2
+# TODO 1.0.8
%global msgpack_version 1.0.7
+# TODO 1.3.0
%global netaddr_version 1.2.1
-%global phonenumbers_version 8.13.33
+%global phonenumbers_version 8.13.39
%global prometheus_client_version 0.20.0
%global psutil_version 2.0.0
%global pyOpenSSL_version 24.1.0
@@ -55,10 +57,9 @@
%global packaging_version 24.0
%global psycopg2_version 2.9.9
%global pysaml2_version 7.3.1
-%global Authlib_version 1.3.0
-# TODO: 5.2.2
-%global lxml_version 5.1.0
-%global sentry_sdk_version 2.1.1
+%global Authlib_version 1.3.1
+%global lxml_version 5.2.2
+%global sentry_sdk_version 2.6.0
%global PyJWT_version 2.6.0
%global jaeger_client_version 4.8.0
%global opentracing_version 2.4.0
@@ -66,8 +67,7 @@
%global txredisapi_version 1.4.10
%global Pympler_version 1.0.1
%global pydantic_version 2.7.1
-# TODO: 2.13.1
-%global pyicu_version 2.12
+%global pyicu_version 2.13.1
%else
# some version locks based on poetry.lock
%global Jinja2_version 3.0
@@ -150,7 +150,7 @@
%define pkgname matrix-synapse
%define eggname matrix_synapse
Name: %{pkgname}
-Version: 1.109.0
+Version: 1.110.0
Release: 0
Summary: Matrix protocol reference homeserver
License: AGPL-3.0-or-later
++++++ _service ++++++
--- /var/tmp/diff_new_pack.SiNcyI/_old 2024-07-04 16:26:44.495107684 +0200
+++ /var/tmp/diff_new_pack.SiNcyI/_new 2024-07-04 16:26:44.499107830 +0200
@@ -4,11 +4,11 @@
<param name="versionformat">@PARENT_TAG@</param>
<param name="url">https://github.com/element-hq/synapse.git</param>
<param name="scm">git</param>
- <param name="revision">v1.109.0</param>
+ <param name="revision">v1.110.0</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
<!--
- <param name="revision">v1.110.0rc1</param>
+ <param name="revision">v1.111.0rc1</param>
<param name="versionrewrite-pattern">v([\.\d]+)(rc.*)</param>
<param name="versionrewrite-replacement">\1~\2</param>
-->
++++++ matrix-synapse-1.109.0.obscpio -> matrix-synapse-1.110.0.obscpio ++++++
/work/SRC/openSUSE:Factory/matrix-synapse/matrix-synapse-1.109.0.obscpio /work/SRC/openSUSE:Factory/.matrix-synapse.new.2080/matrix-synapse-1.110.0.obscpio differ: char 49, line 1
++++++ matrix-synapse.obsinfo ++++++
--- /var/tmp/diff_new_pack.SiNcyI/_old 2024-07-04 16:26:44.563110166 +0200
+++ /var/tmp/diff_new_pack.SiNcyI/_new 2024-07-04 16:26:44.567110312 +0200
@@ -1,5 +1,5 @@
name: matrix-synapse
-version: 1.109.0
-mtime: 1718703994
-commit: 4af654f0da31072bf0e0cac33202c621369ee823
+version: 1.110.0
+mtime: 1720019369
+commit: 75b788f49f005bbc70b459d30913f1f7abf847cb
++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/matrix-synapse/vendor.tar.zst /work/SRC/openSUSE:Factory/.matrix-synapse.new.2080/vendor.tar.zst differ: char 7, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package fence-agents for openSUSE:Factory checked in at 2024-07-04 16:25:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fence-agents (Old)
and /work/SRC/openSUSE:Factory/.fence-agents.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fence-agents"
Thu Jul 4 16:25:12 2024 rev:74 rq:1185211 version:4.15.0+git.1719822011.7a2c0a7f
Changes:
--------
--- /work/SRC/openSUSE:Factory/fence-agents/fence-agents.changes 2024-02-29 21:52:19.798315735 +0100
+++ /work/SRC/openSUSE:Factory/.fence-agents.new.2080/fence-agents.changes 2024-07-04 16:26:38.146875943 +0200
@@ -1,0 +2,24 @@
+Wed Jul 03 18:27:35 UTC 2024 - varkoly(a)suse.com
+
+- Update to version 4.15.0+git.1719822011.7a2c0a7f:
+ * all agents: dont use Deprecated logging.warn()
+ * symlinked agents: set agent_name to use when generating manpages
+ * fence2man.xsl: improve text for symlinked agents
+ * fence_sbd: --sbd-path defaults to /usr/sbin/sbd
+ * configure: check additional paths for programs
+ * fence_aws: log error if unknown state returned
+ * fence_aws: improve list, list-status and status actions
+ * fencing: use formatted strings to avoid failing when plug is int
+ * fence_azure: fix pinning client api versions for compatibility across different azure sdk versions
+ * fence_docker: Connect to Docker via a UNIX socket
+ * fence_hpblade/fence_mpath/fence_scsi: use r"" for all regular expressions to avoid SyntaxWarning errors
+ * fence_aws: fixes to not fail CI, and dont use boto3 buildreq on CI nodes where it's not installed
+ * fence_eps: add fence_epsr2 for ePowerSwitch R2 and newer
+ * fencing: add support for docs["agent_name"] to use the main agent name when generating manpages
+ * spec: only require python3-azure-sdk for RHEL < 9
+ * spec: remove old python3-azure-sdk dependency
+ * fence_aliyun: update order for new parameters
+ * fence_aliyun: add credentials file support
+ * lib/all agents: use r"" for all regular expressions to avoid SyntaxWarning errors
+
+-------------------------------------------------------------------
Old:
----
fence-agents-4.13.1+git.1707822268.4229d52f.tar.xz
New:
----
fence-agents-4.15.0+git.1719822011.7a2c0a7f.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ fence-agents.spec ++++++
--- /var/tmp/diff_new_pack.8mezEh/_old 2024-07-04 16:26:38.854901789 +0200
+++ /var/tmp/diff_new_pack.8mezEh/_new 2024-07-04 16:26:38.854901789 +0200
@@ -25,7 +25,7 @@
Summary: Fence Agents for High Availability
License: GPL-2.0-only AND LGPL-2.1-only
Group: Productivity/Clustering/HA
-Version: 4.13.1+git.1707822268.4229d52f
+Version: 4.15.0+git.1719822011.7a2c0a7f
Release: 0
URL: https://github.com/ClusterLabs/fence-agents
Source0: %{name}-%{version}.tar.xz
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.8mezEh/_old 2024-07-04 16:26:38.894903249 +0200
+++ /var/tmp/diff_new_pack.8mezEh/_new 2024-07-04 16:26:38.898903395 +0200
@@ -3,6 +3,6 @@
<param name="url">git://github.com/ClusterLabs/fence-agents.git</param>
<param name="changesrevision">8d746be92f191aa289f13a3703031c122a5e6cf3</param></service><service name="tar_scm">
<param name="url">https://github.com/ClusterLabs/fence-agents</param>
- <param name="changesrevision">fc7d7c4baef64f510bd3332c9f008d3e1128dc7b</param></service></servicedata>
+ <param name="changesrevision">74e56b9ea5465ee0b703eb145a286b6a2458ba1d</param></service></servicedata>
(No newline at EOF)
++++++ fence-agents-4.13.1+git.1707822268.4229d52f.tar.xz -> fence-agents-4.15.0+git.1719822011.7a2c0a7f.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/Makefile.am new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/Makefile.am
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/Makefile.am 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/Makefile.am 2024-07-01 10:20:11.000000000 +0200
@@ -25,6 +25,12 @@
SUBDIRS = lib agents doc systemd
+if HAVE_BOTO3
+HAVE_BOTO3 = 1
+else
+HAVE_BOTO3 = 0
+endif
+
.PHONY: $(SUBDIRS)
agents: lib
@@ -77,6 +83,7 @@
alphatag="" && \
numcomm="" && \
ver="$(VERSION)" && \
+ boto3_br="$(HAVE_BOTO3)" && \
if echo $$ver | grep -q -- "-dirty$$"; then \
dirty="dirty" && \
echo VERSION IS DIRTY && \
@@ -113,6 +120,7 @@
-e "s#@rgmanager@#$(RGMANAGER)#g" \
-e "s#@linux-ha@#$(LINUX_HA)#g" \
-e "s#@compat-habindir@#$(COMPAT_HABINDIR)#g" \
+ -e "s#@boto3_br@#$$boto3_br#g" \
$< > $@-t; \
if [ -z "$$dirty" ]; then sed -i -e "s#%glo.*dirty.*##g" $@-t; fi; \
if [ -z "$$alphatag" ]; then sed -i -e "s#%glo.*alphatag.*##g" $@-t; fi; \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aliyun/fence_aliyun.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aliyun/fence_aliyun.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aliyun/fence_aliyun.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aliyun/fence_aliyun.py 2024-07-01 10:20:11.000000000 +0200
@@ -15,7 +15,7 @@
from aliyunsdkcore.auth.credentials import EcsRamRoleCredential
from aliyunsdkcore.profile import region_provider
except ImportError as e:
- logging.warn("The 'aliyunsdkcore' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-core --upgrade' to solve. error: %s" % e)
+ logging.warning("The 'aliyunsdkcore' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-core --upgrade' to solve. error: %s" % e)
try:
@@ -24,7 +24,7 @@
from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest
from aliyunsdkecs.request.v20140526.RebootInstanceRequest import RebootInstanceRequest
except ImportError as e:
- logging.warn("The 'aliyunsdkecs' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-ecs --upgrade' to solve. error: %s" % e)
+ logging.warning("The 'aliyunsdkecs' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-ecs --upgrade' to solve. error: %s" % e)
def _send_request(conn, request):
@@ -150,20 +150,37 @@
"required": "0",
"order": 5
}
+ all_opt["credentials_file"] = {
+ "getopt": ":",
+ "longopt": "credentials-file",
+ "help": "--credentials-file=[path] Path to aliyun-cli credentials file",
+ "shortdesc": "Path to credentials file",
+ "required": "0",
+ "order": 6
+ }
+ all_opt["credentials_file_profile"] = {
+ "getopt": ":",
+ "longopt": "credentials-file-profile",
+ "help": "--credentials-file-profile=[profile] Credentials file profile",
+ "shortdesc": "Credentials file profile",
+ "required": "0",
+ "default": "default",
+ "order": 7
+ }
all_opt["filter"] = {
"getopt": ":",
"longopt": "filter",
"help": "--filter=[key=value] Filter (e.g. InstanceIds=[\"i-XXYYZZAA1\",\"i-XXYYZZAA2\"]",
"shortdesc": "Filter for list-action.",
"required": "0",
- "order": 6
+ "order": 8
}
# Main agent method
def main():
conn = None
- device_opt = ["port", "no_password", "region", "access_key", "secret_key", "ram_role", "filter"]
+ device_opt = ["port", "no_password", "region", "access_key", "secret_key", "ram_role", "credentials_file", "credentials_file_profile", "filter"]
atexit.register(atexit_handler)
@@ -191,6 +208,16 @@
ram_role = options["--ram-role"]
role = EcsRamRoleCredential(ram_role)
conn = client.AcsClient(region_id=region, credential=role)
+ elif "--credentials-file" in options and "--credentials-file-profile" in options:
+ import os, configparser
+ try:
+ config = configparser.ConfigParser()
+ config.read(os.path.expanduser(options["--credentials-file"]))
+ access_key = config.get(options["--credentials-file-profile"], "aliyun_access_key_id")
+ secret_key = config.get(options["--credentials-file-profile"], "aliyun_access_key_secret")
+ conn = client.AcsClient(access_key, secret_key, region)
+ except Exception as e:
+ fail_usage("Failed: failed to read credentials file: %s" % e)
else:
fail_usage("Failed: User credentials are not set. Please set the Access Key and the Secret Key, or configure the RAM role.")
@@ -198,7 +225,7 @@
try:
region_provider.modify_point('Ecs', region, 'ecs.%s.aliyuncs.com' % region)
except Exception as e:
- logging.warn("Failed: failed to modify endpoint to 'ecs.%s.aliyuncs.com': %s" % (region, e))
+ logging.warning("Failed: failed to modify endpoint to 'ecs.%s.aliyuncs.com': %s" % (region, e))
# Operate the fencing device
result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/alom/fence_alom.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/alom/fence_alom.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/alom/fence_alom.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/alom/fence_alom.py 2024-07-01 10:20:11.000000000 +0200
@@ -13,7 +13,7 @@
def get_power_status(conn, options):
conn.send_eol("showplatform")
conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"]))
- status = re.search("standby", conn.before.lower())
+ status = re.search(r"standby", conn.before.lower())
result = (status != None and "off" or "on")
return result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/amt/fence_amt.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/amt/fence_amt.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/amt/fence_amt.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/amt/fence_amt.py 2024-07-01 10:20:11.000000000 +0200
@@ -13,7 +13,7 @@
def get_power_status(_, options):
output = amt_run_command(options, create_command(options, "status"))
- match = re.search('Powerstate:[\\s]*(..)', str(output))
+ match = re.search(r'Powerstate:[\s]*(..)', str(output))
status = match.group(1) if match else None
if status == None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc/fence_apc.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc/fence_apc.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc/fence_apc.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc/fence_apc.py 2024-07-01 10:20:11.000000000 +0200
@@ -36,21 +36,21 @@
admin = 0
switch = 0
- if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before):
+ if None != re.compile(r'.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before):
switch = 1
- if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before):
+ if None != re.compile(r'.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before):
if "--switch" not in options:
fail_usage("Failed: You have to enter physical switch number")
else:
if "--switch" not in options:
options["--switch"] = "1"
- if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before):
+ if None == re.compile(r'.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before):
version = 2
else:
version = 3
- if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before):
+ if None == re.compile(r'.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before):
admin = 0
else:
admin = 1
@@ -109,26 +109,26 @@
admin3 = 0
switch = 0
- if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before):
+ if None != re.compile(r'.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before):
switch = 1
## MasterSwitch has different schema for on/off actions
action = {
'on' : "1",
'off': "3"
}[options["--action"]]
- if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before):
+ if None != re.compile(r'.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before):
if "--switch" not in options:
fail_usage("Failed: You have to enter physical switch number")
else:
if "--switch" not in options:
options["--switch"] = 1
- if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before):
+ if None == re.compile(r'.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before):
version = 2
else:
version = 3
- if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before):
+ if None == re.compile(r'.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before):
admin2 = 0
else:
admin2 = 1
@@ -142,7 +142,7 @@
else:
conn.send_eol("2")
conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"]))
- if None == re.compile('.*2- Outlet Restriction.*', re.IGNORECASE | re.S).match(conn.before):
+ if None == re.compile(r'.*2- Outlet Restriction.*', re.IGNORECASE | re.S).match(conn.before):
admin3 = 0
else:
admin3 = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc_snmp/fence_apc_snmp.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc_snmp/fence_apc_snmp.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc_snmp/fence_apc_snmp.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc_snmp/fence_apc_snmp.py 2024-07-01 10:20:11.000000000 +0200
@@ -215,6 +215,7 @@
options["--switch"] = "1"
docs = {}
+ docs["agent_name"] = "fence_apc_snmp"
docs["shortdesc"] = "Fence agent for APC, Tripplite PDU over SNMP"
docs["longdesc"] = "{} is a Power Fencing agent \
which can be used with the APC network power switch or Tripplite PDU devices.\
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aws/fence_aws.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aws/fence_aws.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aws/fence_aws.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aws/fence_aws.py 2024-07-01 10:20:11.000000000 +0200
@@ -22,6 +22,15 @@
logger.addHandler(SyslogLibHandler())
logging.getLogger('botocore.vendored').propagate = False
+status = {
+ "running": "on",
+ "stopped": "off",
+ "pending": "unknown",
+ "stopping": "unknown",
+ "shutting-down": "unknown",
+ "terminated": "unknown"
+}
+
def get_instance_id(options):
try:
token = requests.put('http://169.254.169.254/latest/api/token', headers={"X-aws-ec2-metadata-token-ttl-seconds" : "21600"}).content.decode("UTF-8")
@@ -45,11 +54,19 @@
filter_key = options["--filter"].split("=")[0].strip()
filter_value = options["--filter"].split("=")[1].strip()
filter = [{ "Name": filter_key, "Values": [filter_value] }]
- for instance in conn.instances.filter(Filters=filter):
- result[instance.id] = ("", None)
- else:
- for instance in conn.instances.all():
- result[instance.id] = ("", None)
+ logging.debug("Filter: {}".format(filter))
+
+ for instance in conn.instances.filter(Filters=filter if 'filter' in vars() else []):
+ instance_name = ""
+ for tag in instance.tags or []:
+ if tag.get("Key") == "Name":
+ instance_name = tag["Value"]
+ try:
+ result[instance.id] = (instance_name, status[instance.state["Name"]])
+ except KeyError as e:
+ if options.get("--original-action") == "list-status":
+ logger.error("Unknown status \"{}\" returned for {} ({})".format(instance.state["Name"], instance.id, instance_name))
+ result[instance.id] = (instance_name, "unknown")
except ClientError:
fail_usage("Failed: Incorrect Access Key or Secret Key.")
except EndpointConnectionError:
@@ -67,13 +84,11 @@
instance = conn.instances.filter(Filters=[{"Name": "instance-id", "Values": [options["--plug"]]}])
state = list(instance)[0].state["Name"]
logger.debug("Status operation for EC2 instance %s returned state: %s",options["--plug"],state.upper())
- if state == "running":
- return "on"
- elif state == "stopped":
- return "off"
- else:
+ try:
+ return status[state]
+ except KeyError as e:
+ logger.error("Unknown status \"{}\" returned".format(state))
return "unknown"
-
except ClientError:
fail_usage("Failed: Incorrect Access Key or Secret Key.")
except EndpointConnectionError:
@@ -146,7 +161,7 @@
all_opt["filter"] = {
"getopt" : ":",
"longopt" : "filter",
- "help" : "--filter=[key=value] Filter (e.g. vpc-id=[vpc-XXYYZZAA]",
+ "help" : "--filter=[key=value] Filter (e.g. vpc-id=[vpc-XXYYZZAA])",
"shortdesc": "Filter for list-action",
"required": "0",
"order": 5
@@ -228,7 +243,10 @@
aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
except Exception as e:
- fail_usage("Failed: Unable to connect to AWS: " + str(e))
+ if not options.get("--action", "") in ["metadata", "manpage", "validate-all"]:
+ fail_usage("Failed: Unable to connect to AWS: " + str(e))
+ else:
+ pass
# Operate the fencing device
result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/azure_arm/fence_azure_arm.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/azure_arm/fence_azure_arm.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/azure_arm/fence_azure_arm.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/azure_arm/fence_azure_arm.py 2024-07-01 10:20:11.000000000 +0200
@@ -251,7 +251,7 @@
except ImportError:
fail_usage("Azure Resource Manager Python SDK not found or not accessible")
except Exception as e:
- fail_usage("Failed: %s" % re.sub("^, ", "", str(e)))
+ fail_usage("Failed: %s" % re.sub(r"^, ", r"", str(e)))
if "--network-fencing" in options:
# use off-action to quickly return off once network is fenced instead of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cdu/fence_cdu.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cdu/fence_cdu.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cdu/fence_cdu.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cdu/fence_cdu.py 2024-07-01 10:20:11.000000000 +0200
@@ -51,11 +51,11 @@
if options["api-version"] == "8":
# AA13 Arm-Console3 Wake On On Normal
# AA14 Master_Outlet_14 Wake On On Normal
- show_re = re.compile('(\w+)\s+(\S+)\s+(On|Idle On|Off|Wake On)\s+(On|Off)')
+ show_re = re.compile(r'(\w+)\s+(\S+)\s+(On|Idle On|Off|Wake On)\s+(On|Off)')
else:
# .A12 TowerA_Outlet12 On Idle On
# .A12 test-01 On Idle On
- show_re = re.compile('(\.\w+)\s+(\w+|\w+\W\w+)\s+(On|Off)\s+(On|Idle On|Off|Wake On)')
+ show_re = re.compile(r'(\.\w+)\s+(\w+|\w+\W\w+)\s+(On|Off)\s+(On|Idle On|Off|Wake On)')
for line in lines:
res = show_re.search(line)
if res != None:
@@ -89,7 +89,7 @@
# else:
# .A12 TowerA_Outlet12
# .A12 test-01
- show_re = re.compile('(\S+)\s+(\w+|\w+\W\w+)\s+')
+ show_re = re.compile(r'(\S+)\s+(\w+|\w+\W\w+)\s+')
for line in lines:
res = show_re.search(line)
if res != None:
@@ -112,7 +112,7 @@
conn.send("VERSION\r\n")
conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"]))
lines = conn.before.split("\n")
- show_re = re.compile('Sentry Switched [PC]DU Version (\d)(.\d|)(\w)\r')
+ show_re = re.compile(r'Sentry Switched [PC]DU Version (\d)(.\d|)(\w)\r')
for line in lines:
res = show_re.search(line)
if res != None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cisco_ucs/fence_cisco_ucs.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cisco_ucs/fence_cisco_ucs.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cisco_ucs/fence_cisco_ucs.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cisco_ucs/fence_cisco_ucs.py 2024-07-01 10:20:11.000000000 +0200
@@ -8,13 +8,13 @@
from fencing import *
from fencing import fail, EC_STATUS, EC_LOGIN_DENIED, run_delay
-RE_COOKIE = re.compile("<aaaLogin .* outCookie=\"(.*?)\"", re.IGNORECASE)
-RE_STATUS = re.compile("<lsPower .*? state=\"(.*?)\"", re.IGNORECASE)
-RE_GET_DN = re.compile(" dn=\"(.*?)\"", re.IGNORECASE)
-RE_GET_PNDN = re.compile(" pndn=\"(.*?)\"", re.IGNORECASE)
-RE_GET_DESC = re.compile(" descr=\"(.*?)\"", re.IGNORECASE)
-RE_GET_OPERPOWER = re.compile(" operPower=\"(.*?)\"", re.IGNORECASE)
-RE_GET_PRESENCE = re.compile(" presence=\"(.*?)\"", re.IGNORECASE)
+RE_COOKIE = re.compile(r"<aaaLogin .* outCookie=\"(.*?)\"", re.IGNORECASE)
+RE_STATUS = re.compile(r"<lsPower .*? state=\"(.*?)\"", re.IGNORECASE)
+RE_GET_DN = re.compile(r" dn=\"(.*?)\"", re.IGNORECASE)
+RE_GET_PNDN = re.compile(r" pndn=\"(.*?)\"", re.IGNORECASE)
+RE_GET_DESC = re.compile(r" descr=\"(.*?)\"", re.IGNORECASE)
+RE_GET_OPERPOWER = re.compile(r" operPower=\"(.*?)\"", re.IGNORECASE)
+RE_GET_PRESENCE = re.compile(r" presence=\"(.*?)\"", re.IGNORECASE)
options_global = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/compute/fence_compute.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/compute/fence_compute.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/compute/fence_compute.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/compute/fence_compute.py 2024-07-01 10:20:11.000000000 +0200
@@ -98,7 +98,7 @@
# Since it's about forcing back to a default value, there is
# no real worries to just consider it's still okay even if the
# command failed
- logging.warn("Exception from attempt to force "
+ logging.warning("Exception from attempt to force "
"host back up via nova API: "
"%s: %s" % (e.__class__.__name__, e))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/docker/fence_docker.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/docker/fence_docker.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/docker/fence_docker.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/docker/fence_docker.py 2024-07-01 10:20:11.000000000 +0200
@@ -48,6 +48,8 @@
output_buffer = io.BytesIO()
if logging.getLogger().getEffectiveLevel() < logging.WARNING:
conn.setopt(pycurl.VERBOSE, True)
+ if "--unix-socket" in options:
+ conn.setopt(pycurl.UNIX_SOCKET_PATH, options["--unix-socket"])
conn.setopt(pycurl.HTTPGET, 1)
conn.setopt(pycurl.URL, url.encode("ascii"))
if post:
@@ -135,12 +137,35 @@
"default" : "1.11",
}
- device_opt = ["ipaddr", "no_password", "no_login", "port", "method", "web", "tlscert", "tlskey", "tlscacert", "ssl", "api_version"]
+ all_opt["unix_socket"] = {
+ "getopt" : ":",
+ "longopt" : "unix-socket",
+ "help" : "--unix-socket "
+ "Path to Docker's unix socket. Use this with --disable-ssl.",
+ "required" : "0",
+ "order" : 2,
+ }
- all_opt["ssl"]["default"] = "1"
+ all_opt["disable_ssl"] = {
+ "getopt" : "",
+ "longopt" : "disable-ssl",
+ "help" : "--disable-ssl Don't use SSL connection",
+ "required" : "0",
+ "shortdesc" : "Don't use SSL",
+ "order": 2,
+ }
+ device_opt = ["ipaddr", "no_password", "no_login", "port", "method", "web",
+ "tlscert", "tlskey", "tlscacert", "ssl", "api_version", "unix_socket",
+ "disable_ssl"]
+ all_opt["ssl"]["default"] = "1"
options = check_input(device_opt, process_input(device_opt))
+ if "--disable-ssl" in options or options["--ssl"] == "0":
+ for k in ["--ssl", "--ssl-secure", "--ssl-insecure"]:
+ if k in options:
+ del options[k]
+
docs = { }
docs["shortdesc"] = "Fence agent for Docker"
docs["longdesc"] = "fence_docker is a Power Fencing agent which \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/eps/fence_eps.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/eps/fence_eps.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/eps/fence_eps.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/eps/fence_eps.py 2024-07-01 10:20:11.000000000 +0200
@@ -3,8 +3,8 @@
# The Following Agent Has Been Tested On:
# ePowerSwitch 8M+ version 1.0.0.4
-import sys, re
-import base64, string, socket
+import sys, os, re
+import base64, socket
import logging
import atexit
sys.path.append("@FENCEAGENTSLIBDIR@")
@@ -37,7 +37,7 @@
options["--password"] = "" # Default is empty password
# String for Authorization header
- auth_str = 'Basic ' + string.strip(base64.encodestring(options["--username"]+':'+options["--password"]))
+ auth_str = 'Basic ' + str(base64.encodebytes(bytes(options["--username"]+':'+options["--password"], "utf-8")).decode("utf-8").strip())
logging.debug("Authorization: %s\n", auth_str)
conn.putheader('Authorization', auth_str)
@@ -60,16 +60,22 @@
logging.error("Failed: {}".format(str(e)))
fail(EC_LOGIN_DENIED)
- return result
+ return result.decode("utf-8", "ignore")
def get_power_status(conn, options):
del conn
ret_val = eps_run_command(options, "")
result = {}
- status = re.findall(r"p(\d{2})=(0|1)\s*\<br\>", ret_val.lower())
+ if os.path.basename(sys.argv[0]) == "fence_eps":
+ status = re.findall(r"p(\d{2})=(0|1)\s*\<br\>", ret_val.lower())
+ elif os.path.basename(sys.argv[0]) == "fence_epsr2":
+ status = re.findall(r"m0:o(\d)=(on|off)\s*", ret_val.lower())
for out_num, out_stat in status:
- result[out_num] = ("", (out_stat == "1" and "on" or "off"))
+ if os.path.basename(sys.argv[0]) == "fence_eps":
+ result[out_num] = ("", (out_stat == "1" and "on" or "off"))
+ elif os.path.basename(sys.argv[0]) == "fence_epsr2":
+ result[out_num] = ("", out_stat)
if not options["--action"] in ['monitor', 'list']:
if not options["--plug"] in result:
@@ -81,7 +87,12 @@
def set_power_status(conn, options):
del conn
- eps_run_command(options, "P%s=%s"%(options["--plug"], (options["--action"] == "on" and "1" or "0")))
+ if os.path.basename(sys.argv[0]) == "fence_eps":
+ eps_run_command(options, "P%s=%s"%(options["--plug"], (options["--action"] == "on" and "1" or "0")))
+ elif os.path.basename(sys.argv[0]) == "fence_epsr2":
+ if options["--action"] == "reboot":
+ options["--action"] = "off"
+ eps_run_command(options, "M0:O%s=%s"%(options["--plug"], options["--action"]))
# Define new option
def eps_define_new_opts():
@@ -107,20 +118,25 @@
options = check_input(device_opt, process_input(device_opt))
docs = {}
+ docs["agent_name"] = "fence_eps"
docs["shortdesc"] = "Fence agent for ePowerSwitch"
- docs["longdesc"] = "fence_eps is a Power Fencing agent \
+ docs["longdesc"] = os.path.basename(sys.argv[0]) + " is a Power Fencing agent \
which can be used with the ePowerSwitch 8M+ power switch to fence \
-connected machines. Fence agent works ONLY on 8M+ device, because \
-this is only one, which has support for hidden page feature. \
+connected machines. It ONLY works on 8M+ devices, as \
+they support the hidden page feature. \
\n.TP\n\
-Agent basically works by connecting to hidden page and pass \
-appropriate arguments to GET request. This means, that hidden \
-page feature must be enabled and properly configured."
- docs["vendorurl"] = "http://www.epowerswitch.com"
+The agent works by connecting to the hidden page and pass \
+the appropriate arguments to GET request. This means, that the hidden \
+page feature must be enabled and properly configured. \
+\n.TP\n\
+NOTE: In most cases you want to use fence_epsr2, as fence_eps \
+only works with older hardware."
+ docs["vendorurl"] = "https://www.neol.com"
+ docs["symlink"] = [("fence_epsr2", "Fence agent for ePowerSwitch R2 and newer")]
show_docs(options, docs)
run_delay(options)
- #Run fence action. Conn is None, beacause we always need open new http connection
+ #Run fence action. Conn is None, because we always need open new http connection
result = fence_action(None, options, set_power_status, get_power_status, get_power_status)
sys.exit(result)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/gce/fence_gce.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/gce/fence_gce.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/gce/fence_gce.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/gce/fence_gce.py 2024-07-01 10:20:11.000000000 +0200
@@ -85,8 +85,8 @@
uri_replacements.append(
{
"matchlength": 4,
- "match": "https://compute.googleapis.com/compute/v1/projects/(.*)/zones/(.*)/instance…",
- "replace": "https://baremetalsolution.googleapis.com/v1/projects/\\1/locations/\\2/inst…"
+ "match": r"https://compute.googleapis.com/compute/v1/projects/(.*)/zones/(.*)/instance…",
+ "replace": r"https://baremetalsolution.googleapis.com/v1/projects/\1/locations/\2/instan…"
})
for uri_replacement in uri_replacements:
# each uri_replacement should have matchlength, match, and replace
@@ -97,7 +97,7 @@
if match is None or len(match.groups()) != uri_replacement["matchlength"]:
continue
replaced_uri = re.sub(uri_replacement["match"], uri_replacement["replace"], http_request.uri)
- match = re.match("https:\/\/.*.googleapis.com", replaced_uri)
+ match = re.match(r"https:\/\/.*.googleapis.com", replaced_uri)
if match is None or match.start() != 0:
logging.warning("FENCE_GCE_URI_REPLACEMENTS replace is not "
"targeting googleapis.com, ignoring it: %s" % replaced_uri)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/hpblade/fence_hpblade.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/hpblade/fence_hpblade.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/hpblade/fence_hpblade.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/hpblade/fence_hpblade.py 2024-07-01 10:20:11.000000000 +0200
@@ -33,10 +33,10 @@
def get_power_status(conn, options):
if options["enc_type"] == "superdome":
cmd_send = "parstatus -M -p " + options["--plug"]
- powrestr = "^partition:\\d\\s+:\\w+\\s+/(\\w+)\\s.*$"
+ powrestr = r"^partition:\d\s+:\w+\s+/(\w+)\s.*$"
else:
cmd_send = "show server status " + options["--plug"]
- powrestr = "^\\s*Power: (.*?)\\s*$"
+ powrestr = r"^\s*Power: (.*?)\s*$"
conn.send_eol(cmd_send)
conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"]))
@@ -78,10 +78,10 @@
outlets = {}
if options["enc_type"] == "superdome":
cmd_send = "parstatus -P -M"
- listrestr = "^partition:(\\d+)\\s+:\\w+\\s+/(\\w+)\\s+:OK.*?:(\\w+)\\s*$"
+ listrestr = r"^partition:(\d+)\s+:\w+\s+/(\w+)\s+:OK.*?:(\w+)\s*$"
else:
cmd_send = "show server list"
- listrestr = "^\\s*(\\d+)\\s+(.*?)\\s+(.*?)\\s+OK\\s+(.*?)\\s+(.*?)\\s*$"
+ listrestr = r"^\s*(\d+)\s+(.*?)\s+(.*?)\s+OK\s+(.*?)\s+(.*?)\s*$"
conn.send_eol(cmd_send)
conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"]))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo/fence_ilo.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo/fence_ilo.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo/fence_ilo.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo/fence_ilo.py 2024-07-01 10:20:11.000000000 +0200
@@ -72,6 +72,7 @@
options = check_input(device_opt, process_input(device_opt))
docs = {}
+ docs["agent_name"] = "fence_ilo"
docs["shortdesc"] = "Fence agent for HP iLO"
docs["longdesc"] = "{} is a Power Fencing agent \
used for HP servers with the Integrated Light Out (iLO) PCI card.\
@@ -106,7 +107,7 @@
fail(EC_LOGIN_DENIED)
try:
- version = re.compile("<RIBCL VERSION=\"(.*?)\"", re.IGNORECASE).search(conn.before).group(1)
+ version = re.compile(r"<RIBCL VERSION=\"(.*?)\"", re.IGNORECASE).search(conn.before).group(1)
if "--ribcl-version" not in options:
options["--ribcl-version"] = float(version)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_mp/fence_ilo_mp.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_mp/fence_ilo_mp.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_mp/fence_ilo_mp.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_mp/fence_ilo_mp.py 2024-07-01 10:20:11.000000000 +0200
@@ -8,7 +8,7 @@
def get_power_status(conn, options):
conn.send_eol("show /system1")
- re_state = re.compile('EnabledState=(.*)', re.IGNORECASE)
+ re_state = re.compile(r'EnabledState=(.*)', re.IGNORECASE)
conn.log_expect(re_state, int(options["--shell-timeout"]))
status = conn.match.group(1).lower()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_ssh/fence_ilo_ssh.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_ssh/fence_ilo_ssh.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_ssh/fence_ilo_ssh.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_ssh/fence_ilo_ssh.py 2024-07-01 10:20:11.000000000 +0200
@@ -9,7 +9,7 @@
def get_power_status(conn, options):
conn.send_eol("show /system1")
- re_state = re.compile('EnabledState=(.*)', re.IGNORECASE)
+ re_state = re.compile(r'EnabledState=(.*)', re.IGNORECASE)
conn.log_expect(re_state, int(options["--shell-timeout"]))
status = conn.match.group(1).lower()
@@ -49,6 +49,7 @@
options = check_input(device_opt, process_input(device_opt))
docs = {}
+ docs["agent_name"] = "fence_ilo_ssh"
docs["shortdesc"] = "Fence agent for HP iLO over SSH"
docs["longdesc"] = "{} is a Power Fencing agent that connects to iLO device. It logs into \
device via ssh and reboot a specified outlet.\
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ipmilan/fence_ipmilan.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ipmilan/fence_ipmilan.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ipmilan/fence_ipmilan.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ipmilan/fence_ipmilan.py 2024-07-01 10:20:11.000000000 +0200
@@ -13,7 +13,7 @@
def get_power_status(_, options):
output = _run_command(options, "status")
- match = re.search('[Cc]hassis [Pp]ower is [\\s]*([a-zA-Z]{2,3})', str(output))
+ match = re.search(r'[Cc]hassis [Pp]ower is [\s]*([a-zA-Z]{2,3})', str(output))
status = match.group(1) if match else None
return status
@@ -23,11 +23,11 @@
def reboot_cycle(_, options):
output = _run_command(options, "cycle")
- return bool(re.search('chassis power control: cycle', str(output).lower()))
+ return bool(re.search(r'chassis power control: cycle', str(output).lower()))
def reboot_diag(_, options):
output = _run_command(options, "diag")
- return bool(re.search('chassis power control: diag', str(output).lower()))
+ return bool(re.search(r'chassis power control: diag', str(output).lower()))
def _run_command(options, action):
cmd, log_cmd = create_command(options, action)
@@ -202,10 +202,12 @@
options = check_input(device_opt, process_input(device_opt))
docs = {}
+ docs["agent_name"] = "fence_ipmilan"
docs["shortdesc"] = "Fence agent for IPMI"
docs["longdesc"] = "{} is a Power Fencing agent \
which can be used with machines controlled by IPMI. \
-This agent calls support software ipmitool (http://ipmitool.sf.net/). \
+This agent calls support software ipmitool (http://ipmitool.sf.net/).\
+\n.P\n\
WARNING! This fence agent might report success before the node is powered off. \
You should use -m/method onoff if your fence device works correctly with that option.".format(os.path.basename(__file__))
docs["vendorurl"] = ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ironic/fence_ironic.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ironic/fence_ironic.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ironic/fence_ironic.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ironic/fence_ironic.py 2024-07-01 10:20:11.000000000 +0200
@@ -20,7 +20,7 @@
def get_power_status(_, options):
output = ironic_run_command(options, "status")
stdout = output[1]
- match = re.search('power[\\s]*([a-zA-Z]{2,3})', str(stdout))
+ match = re.search(r'power[\s]*([a-zA-Z]{2,3})', str(stdout))
status = match.group(1) if match else None
return status
@@ -40,7 +40,7 @@
pass
if "UUID" in uuid:
continue # skip line header
- match = re.search('power[\\s]*([a-zA-Z]{2,3})', state)
+ match = re.search(r'power[\s]*([a-zA-Z]{2,3})', state)
status = match.group(1) if match else None
nodes[uuid] = (name, status)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/lpar/fence_lpar.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/lpar/fence_lpar.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/lpar/fence_lpar.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/lpar/fence_lpar.py 2024-07-01 10:20:11.000000000 +0200
@@ -44,10 +44,10 @@
try:
if options["--hmc-version"] == "3":
- status = re.compile("^" + options["--plug"] + ",(.*?),.*$",
+ status = re.compile(r"^" + options["--plug"] + r",(.*?),.*$",
re.IGNORECASE | re.MULTILINE).search(conn.before).group(1)
elif options["--hmc-version"] in ["4", "IVM"]:
- status = re.compile(",state=(.*?),", re.IGNORECASE).search(conn.before).group(1)
+ status = re.compile(r",state=(.*?),", re.IGNORECASE).search(conn.before).group(1)
except AttributeError as e:
logging.debug("Command on HMC failed: {}\n{}".format(command, str(e)))
fail(EC_STATUS_HMC)
@@ -60,7 +60,7 @@
conn.log_expect(options["--command-prompt"], int(options["--power-timeout"]))
try:
- cm = re.compile(",curr_master_mtms=(.*?),", re.IGNORECASE).search(conn.before).group(1)
+ cm = re.compile(r",curr_master_mtms=(.*?),", re.IGNORECASE).search(conn.before).group(1)
except AttributeError as e:
cm = False
@@ -106,7 +106,7 @@
## We have to remove next 2 lines (header) and last line (part of new prompt)
####
- res = re.search("^(.+?\n){2}(.*)\n.*$", conn.before, re.S)
+ res = re.search(r"^(.+?\n){2}(.*)\n.*$", conn.before, re.S)
if res == None:
fail_usage("Unable to parse output of list command")
@@ -126,7 +126,7 @@
## We have to remove last line (part of new prompt)
####
- res = re.search("^(.*)\n.*$", conn.before, re.S)
+ res = re.search(r"^(.*)\n.*$", conn.before, re.S)
if res == None:
fail_usage("Unable to parse output of list command")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/mpath/fence_mpath.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/mpath/fence_mpath.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/mpath/fence_mpath.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/mpath/fence_mpath.py 2024-07-01 10:20:11.000000000 +0200
@@ -331,7 +331,7 @@
if not ("--devices" in options and options["--devices"]):
fail_usage("Failed: No devices found")
- options["devices"] = [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d]
+ options["devices"] = [d for d in re.split(r"\s*,\s*|\s+", options["--devices"].strip()) if d]
# Input control END
result = fence_action(None, options, set_status, get_status)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/netio/fence_netio.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/netio/fence_netio.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/netio/fence_netio.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/netio/fence_netio.py 2024-07-01 10:20:11.000000000 +0200
@@ -8,7 +8,7 @@
def get_power_status(conn, options):
conn.send_eol("port %s" % options["--plug"])
- re_status = re.compile("250 [01imt]")
+ re_status = re.compile(r"250 [01imt]")
conn.log_expect(re_status, int(options["--shell-timeout"]))
status = {
"0" : "off",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/raritan/fence_raritan.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/raritan/fence_raritan.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/raritan/fence_raritan.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/raritan/fence_raritan.py 2024-07-01 10:20:11.000000000 +0200
@@ -8,7 +8,7 @@
def get_power_status(conn, options):
conn.send_eol("show -d properties=powerState %s" % options["--plug"])
- re_status = re.compile(".*powerState is [12].*")
+ re_status = re.compile(r".*powerState is [12].*")
conn.log_expect(re_status, int(options["--shell-timeout"]))
status = {
#"0" : "off",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rhevm/fence_rhevm.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rhevm/fence_rhevm.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rhevm/fence_rhevm.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rhevm/fence_rhevm.py 2024-07-01 10:20:11.000000000 +0200
@@ -9,10 +9,10 @@
from fencing import *
from fencing import fail, EC_FETCH_VM_UUID, run_delay
-RE_GET_ID = re.compile("<vm( .*)? id=\"(.*?)\"", re.IGNORECASE)
-RE_STATUS = re.compile("<status>(.*?)</status>", re.IGNORECASE)
-RE_STATE = re.compile("<state>(.*?)</state>", re.IGNORECASE)
-RE_GET_NAME = re.compile("<name>(.*?)</name>", re.IGNORECASE)
+RE_GET_ID = re.compile(r"<vm( .*)? id=\"(.*?)\"", re.IGNORECASE)
+RE_STATUS = re.compile(r"<status>(.*?)</status>", re.IGNORECASE)
+RE_STATE = re.compile(r"<state>(.*?)</state>", re.IGNORECASE)
+RE_GET_NAME = re.compile(r"<name>(.*?)</name>", re.IGNORECASE)
def get_power_status(conn, options):
del conn
@@ -80,7 +80,7 @@
if opt["--api-version"] == "auto":
opt["--api-version"] = "4"
res = send_command(opt, "")
- if re.search("<title>Error</title>", res):
+ if re.search(r"<title>Error</title>", res):
opt["--api-version"] = "3"
logging.debug("auto-detected API version: " + opt["--api-version"])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rsa/fence_rsa.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rsa/fence_rsa.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rsa/fence_rsa.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rsa/fence_rsa.py 2024-07-01 10:20:11.000000000 +0200
@@ -16,7 +16,7 @@
conn.send_eol("power state")
conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"]))
- match = re.compile("Power: (.*)", re.IGNORECASE).search(conn.before)
+ match = re.compile(r"Power: (.*)", re.IGNORECASE).search(conn.before)
if match != None:
status = match.group(1)
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/sbd/fence_sbd.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/sbd/fence_sbd.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/sbd/fence_sbd.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/sbd/fence_sbd.py 2024-07-01 10:20:11.000000000 +0200
@@ -170,7 +170,7 @@
if "msgwait" in line:
tmp_msg_timeout = int(line.split(':')[1])
if -1 != msg_timeout and tmp_msg_timeout != msg_timeout:
- logging.warn(\
+ logging.warning(\
"sbd message timeouts differ in different devices")
# we only save the highest timeout
if tmp_msg_timeout > msg_timeout:
@@ -418,7 +418,7 @@
power_timeout = int(options["--power-timeout"])
sbd_msg_timeout = get_msg_timeout(options)
if 0 < power_timeout <= sbd_msg_timeout:
- logging.warn("power timeout needs to be \
+ logging.warning("power timeout needs to be \
greater then sbd message timeout")
result = fence_action(\
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/scsi/fence_scsi.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/scsi/fence_scsi.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/scsi/fence_scsi.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/scsi/fence_scsi.py 2024-07-01 10:20:11.000000000 +0200
@@ -236,11 +236,11 @@
cmd = options["--corosync-cmap-path"] + " nodelist"
out = run_cmd(options, cmd)["out"]
- match = re.search(r".(\d+).name \(str\) = " + options["--plug"] + "\n", out)
+ match = re.search(r".(\d+).name \(str\) = " + options["--plug"] + r"\n", out)
# try old format before failing
if not match:
- match = re.search(r".(\d+).ring._addr \(str\) = " + options["--plug"] + "\n", out)
+ match = re.search(r".(\d+).ring._addr \(str\) = " + options["--plug"] + r"\n", out)
return match.group(1) if match else fail_usage("Failed: unable to parse output of corosync-cmapctl or node does not exist")
@@ -295,7 +295,7 @@
fail_usage("Failed: Cannot open file \""+ file_path + "\"")
f.seek(0)
out = f.read()
- if not re.search(r"^" + dev + "\s+", out, flags=re.MULTILINE):
+ if not re.search(r"^" + dev + r"\s+", out, flags=re.MULTILINE):
f.write(dev + "\n")
f.close()
@@ -613,10 +613,10 @@
options["--key"] = options["--key"].lstrip('0')
- if not ("--devices" in options and [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d]):
+ if not ("--devices" in options and [d for d in re.split(r"\s*,\s*|\s+", options["--devices"].strip()) if d]):
options["devices"] = get_shared_devices(options)
else:
- options["devices"] = [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d]
+ options["devices"] = [d for d in re.split(r"\s*,\s*|\s+", options["--devices"].strip()) if d]
if not options["devices"]:
fail_usage("Failed: No devices found")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/wti/fence_wti.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/wti/fence_wti.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/wti/fence_wti.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/wti/fence_wti.py 2024-07-01 10:20:11.000000000 +0200
@@ -27,7 +27,7 @@
re_all = list(options["--command-prompt"])
else:
re_all = [options["--command-prompt"]]
- re_next = re.compile("Enter: ", re.IGNORECASE)
+ re_next = re.compile(r"Enter: ", re.IGNORECASE)
re_all.append(re_next)
result = conn.log_expect(re_all, int(options["--shell-timeout"]))
@@ -208,8 +208,8 @@
conn.send("set binary\n")
conn.send("open %s -%s\n"%(options["--ip"], options["--ipport"]))
- re_login = re.compile("(login: )|(Login Name: )|(username: )|(User Name :)", re.IGNORECASE)
- re_prompt = re.compile("|".join(["(" + x + ")" for x in options["--command-prompt"]]), re.IGNORECASE)
+ re_login = re.compile(r"(login: )|(Login Name: )|(username: )|(User Name :)", re.IGNORECASE)
+ re_prompt = re.compile(r"|".join(["(" + x + ")" for x in options["--command-prompt"]]), re.IGNORECASE)
result = conn.log_expect([re_login, "Password: ", re_prompt], int(options["--shell-timeout"]))
if result == 0:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/configure.ac new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/configure.ac
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/configure.ac 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/configure.ac 2024-07-01 10:20:11.000000000 +0200
@@ -262,6 +262,10 @@
CLUSTERVARRUN=${localstatedir}/run/cluster
CLUSTERDATA=${datadir}/cluster
+## Program Paths
+PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin"
+export PATH
+
AC_PATH_PROGS(XMLLINT, xmllint)
AM_CONDITIONAL(BUILD_DOC, test "x$XMLLINT" != "x" )
if test "x$XMLLINT" = "x"; then
@@ -291,6 +295,9 @@
AC_PYTHON_MODULE(pycurl, 1)
AC_PYTHON_MODULE(requests, 1)
+AC_PYTHON_MODULE(boto3)
+AM_CONDITIONAL(HAVE_BOTO3, [test "x$HAVE_PYMOD_BOTO3" == xyes ])
+
if echo "$AGENTS_LIST" | grep -q amt_ws; then
AC_PYTHON_MODULE(pywsman)
if test "x${HAVE_PYMOD_PYWSMAN}" != xyes; then
@@ -322,7 +329,7 @@
AC_PATH_PROG([SSH_PATH], [ssh], [/usr/bin/ssh])
AC_PATH_PROG([TELNET_PATH], [telnet], [/usr/bin/telnet])
AC_PATH_PROG([MPATH_PATH], [mpathpersist], [/usr/sbin/mpathpersist])
-AC_PATH_PROG([SBD_PATH], [sbd], [/sbin/sbd])
+AC_PATH_PROG([SBD_PATH], [sbd], [/usr/sbin/sbd])
AC_PATH_PROG([SUDO_PATH], [sudo], [/usr/bin/sudo])
AC_PATH_PROG([SNMPWALK_PATH], [snmpwalk], [/usr/bin/snmpwalk])
AC_PATH_PROG([SNMPSET_PATH], [snmpset], [/usr/bin/snmpset])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/fence-agents.spec.in new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/fence-agents.spec.in
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/fence-agents.spec.in 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/fence-agents.spec.in 2024-07-01 10:20:11.000000000 +0200
@@ -24,11 +24,7 @@
URL: https://github.com/ClusterLabs/fence-agents
Source0: %{name}-%{version}%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:-%{alphatag}}%{?dirty:-%{dirty}}.tar.bz2
-%if 0%{?rhel} == 9
-%ifarch ppc64le s390x
-%define rhel9_ppc64le_s390x 1
-%endif
-%endif
+%define boto3_br @boto3_br@
# skipped: pve, raritan, rcd-serial, virsh
%global allfenceagents %(cat <<EOF
@@ -124,11 +120,14 @@
%endif
%if 0%{?fedora} || 0%{?centos} || 0%{?rhel}
BuildRequires: openwsman-python3
-%if ! %{defined rhel9_ppc64le_s390x}
+%if %{boto3_br}
BuildRequires: python3-boto3
%endif
%else
-BuildRequires: python3-openwsman python3-boto3
+BuildRequires: python3-openwsman
+%if %{boto3_br}
+BuildRequires: python3-boto3
+%endif
%endif
# fence-virt
@@ -381,14 +380,14 @@
License: GPL-2.0-or-later AND LGPL-2.0-or-later
Summary: Fence agent for Azure Resource Manager
Requires: fence-agents-common = %{version}-%{release}
-%if 0%{?fedora} > 34
+%if 0%{?rhel} && 0%{?rhel} < 9
+Requires: python3-azure-sdk
+%else
Requires: python3-azure-common
Requires: python3-azure-identity
Requires: python3-azure-mgmt-compute
Requires: python3-azure-mgmt-network
Requires: python3-msrestazure
-%else
-Requires: python3-azure-sdk
%endif
BuildArch: noarch
Obsoletes: fence-agents < 3.1.13
@@ -597,8 +596,8 @@
Fence agent for ePowerSwitch 8M+ power switches that are accessed
via the HTTP(s) protocol.
%files eps
-%{_sbindir}/fence_eps
-%{_mandir}/man8/fence_eps.8*
+%{_sbindir}/fence_eps*
+%{_mandir}/man8/fence_eps*.8*
%package gce
License: GPL-2.0-or-later AND LGPL-2.0-or-later
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/azure_fence.py.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/azure_fence.py.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/azure_fence.py.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/azure_fence.py.py 2024-07-01 10:20:11.000000000 +0200
@@ -14,6 +14,8 @@
IP_TYPE_DYNAMIC = "Dynamic"
MAX_RETRY = 10
RETRY_WAIT = 5
+COMPUTE_CLIENT_API_VERSION = "2021-11-01"
+NETWORK_MGMT_CLIENT_API_VERSION = "2021-05-01"
class AzureSubResource:
Type = None
@@ -49,7 +51,7 @@
return None
def get_azure_resource(id):
- match = re.match('(/subscriptions/([^/]*)/resourceGroups/([^/]*))(/providers/([^/]*/[^/]*)/([^/]*))?((/([^/]*)/([^/]*))*)', id)
+ match = re.match(r'(/subscriptions/([^/]*)/resourceGroups/([^/]*))(/providers/([^/]*/[^/]*)/([^/]*))?((/([^/]*)/([^/]*))*)', id)
if not match:
fail_usage("{get_azure_resource} cannot parse resource id %s" % id)
@@ -366,17 +368,20 @@
base_url=cloud_environment.endpoints.resource_manager,
profile=client_profile,
credential_scopes=[credential_scope],
+ api_version=COMPUTE_CLIENT_API_VERSION
)
except TypeError:
compute_client = ComputeManagementClient(
credentials,
config.SubscriptionId,
- base_url=cloud_environment.endpoints.resource_manager
+ base_url=cloud_environment.endpoints.resource_manager,
+ api_version=COMPUTE_CLIENT_API_VERSION
)
else:
compute_client = ComputeManagementClient(
credentials,
- config.SubscriptionId
+ config.SubscriptionId,
+ api_version=COMPUTE_CLIENT_API_VERSION
)
return compute_client
@@ -404,16 +409,19 @@
base_url=cloud_environment.endpoints.resource_manager,
profile=client_profile,
credential_scopes=[credential_scope],
+ api_version=NETWORK_MGMT_CLIENT_API_VERSION
)
except TypeError:
network_client = NetworkManagementClient(
credentials,
config.SubscriptionId,
- base_url=cloud_environment.endpoints.resource_manager
+ base_url=cloud_environment.endpoints.resource_manager,
+ api_version=NETWORK_MGMT_CLIENT_API_VERSION
)
else:
network_client = NetworkManagementClient(
credentials,
- config.SubscriptionId
+ config.SubscriptionId,
+ api_version=NETWORK_MGMT_CLIENT_API_VERSION
)
return network_client
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fence2man.xsl new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fence2man.xsl
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fence2man.xsl 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fence2man.xsl 2024-07-01 10:20:11.000000000 +0200
@@ -60,9 +60,9 @@
.P
<xsl:value-of select="longdesc"/>
.P
-<xsl:value-of select="@name" /> accepts options on the command line as well
+The fence agent accepts options on the command line as well
as from stdin. Fenced sends parameters through stdin when it execs the
-agent. <xsl:value-of select="@name" /> can be run by itself with command
+agent. The agent can be run by itself with command
line options. This is useful for testing and for turning outlets on or off
from scripts.
<xsl:if test="vendor-url">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing.py.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing.py.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing.py.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing.py.py 2024-07-01 10:20:11.000000000 +0200
@@ -603,7 +603,7 @@
if len(value["help"]) != 0:
print(" " + _join_wrap([value["help"]], first_indent=3))
-def metadata(options, avail_opt, docs):
+def metadata(options, avail_opt, docs, agent_name=os.path.basename(sys.argv[0])):
# avail_opt has to be unique, if there are duplicities then they should be removed
sorted_list = [(key, all_opt[key]) for key in list(set(avail_opt)) if "longopt" in all_opt[key]]
# Find keys that are going to replace inconsistent names
@@ -614,10 +614,10 @@
sorted_list.sort(key=lambda x: (x[1]["order"], x[0]))
if options["--action"] == "metadata":
- docs["longdesc"] = re.sub("\\\\f[BPIR]|\.P|\.TP|\.br\n", "", docs["longdesc"])
+ docs["longdesc"] = re.sub(r"\\f[BPIR]|\.P|\.TP|\.br\n", r"", docs["longdesc"])
print("<?xml version=\"1.0\" ?>")
- print("<resource-agent name=\"" + os.path.basename(sys.argv[0]) + \
+ print("<resource-agent name=\"" + agent_name + \
"\" shortdesc=\"" + docs["shortdesc"] + "\" >")
for (symlink, desc) in docs.get("symlink", []):
print("<symlink name=\"" + symlink + "\" shortdesc=\"" + desc + "\"/>")
@@ -649,7 +649,7 @@
mixed = _encode_html_entities(mixed)
if not "shortdesc" in opt:
- shortdesc = re.sub(".*\s\s+", "", opt["help"][31:])
+ shortdesc = re.sub(r".*\s\s+", r"", opt["help"][31:])
else:
shortdesc = opt["shortdesc"]
@@ -928,9 +928,15 @@
sys.exit(0)
if options.get("--action", "") in ["metadata", "manpage"]:
+ if options["--action"] == "metadata" or "agent_name" not in docs:
+ agent_name=os.path.basename(sys.argv[0])
+ else:
+ agent_name=docs["agent_name"]
+
+
if "port_as_ip" in device_opt:
device_opt.remove("separator")
- metadata(options, device_opt, docs)
+ metadata(options, device_opt, docs, agent_name)
sys.exit(0)
if "--version" in options:
@@ -973,14 +979,14 @@
if options["--action"] == "list":
try:
- print(outlet_id + options["--separator"] + alias)
+ print("{}{}{}".format(outlet_id, options["--separator"], alias))
except UnicodeEncodeError as e:
- print((outlet_id + options["--separator"] + alias).encode("utf-8"))
+ print("{}{}{}".format(outlet_id, options["--separator"], alias).encode("utf-8"))
elif options["--action"] == "list-status":
try:
- print(outlet_id + options["--separator"] + alias + options["--separator"] + status)
+ print("{}{}{}{}{}".format(outlet_id, options["--separator"], alias, options["--separator"], status))
except UnicodeEncodeError as e:
- print((outlet_id + options["--separator"] + alias).encode("utf-8") + options["--separator"] + status)
+ print("{}{}{}{}{}".format(outlet_id, options["--separator"], alias, options["--separator"], status).encode("utf-8"))
return result
@@ -1272,7 +1278,7 @@
executable="/bin/sh")
# replace env
os.environ.clear()
- os.environ.update(line.partition('=')[::2] for line in output.decode("utf-8").split('\0') if not re.match("^\s*$", line))
+ os.environ.update(line.partition('=')[::2] for line in output.decode("utf-8").split('\0') if not re.match(r"^\s*$", line))
# Convert array of format [[key1, value1], [key2, value2], ... [keyN, valueN]] to dict, where key is
# in format a.b.c.d...z and returned dict has key only z
@@ -1359,7 +1365,7 @@
def _login_telnet(options, re_login_string):
re_login = re.compile(re_login_string, re.IGNORECASE)
- re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE)
+ re_pass = re.compile(r"(password)|(pass phrase)", re.IGNORECASE)
conn = fspawn(options, options["--telnet-path"])
conn.send("set binary\n")
@@ -1400,7 +1406,7 @@
def _login_ssh_with_password(options, re_login_string):
re_login = re.compile(re_login_string, re.IGNORECASE)
- re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE)
+ re_pass = re.compile(r"(password)|(pass phrase)", re.IGNORECASE)
if "--inet6-only" in options:
force_ipvx = "-6 "
@@ -1608,7 +1614,7 @@
(name, value) = (line + "=").split("=", 1)
value = value[:-1]
- value = re.sub("^\"(.*)\"$", "\\1", value)
+ value = re.sub(r"^\"(.*)\"$", r"\1", value)
if name.replace("-", "_") in mapping_longopt_names:
name = mapping_longopt_names[name.replace("-", "_")]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing_snmp.py.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing_snmp.py.py
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing_snmp.py.py 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing_snmp.py.py 2024-07-01 10:20:11.000000000 +0200
@@ -91,7 +91,7 @@
logging.debug("%s\n", res_output)
- if (res_code != 0) or (re.search("^Error ", res_output, re.MULTILINE) != None):
+ if (res_code != 0) or (re.search(r"^Error ", res_output, re.MULTILINE) != None):
fail_usage("Returned %d: %s"% (res_code, res_output))
except pexpect.ExceptionPexpect:
fail_usage("Cannot run command %s"%(command))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_aliyun.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_aliyun.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_aliyun.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_aliyun.xml 2024-07-01 10:20:11.000000000 +0200
@@ -38,6 +38,15 @@
<content type="string" />
<shortdesc lang="en">Ram Role.</shortdesc>
</parameter>
+ <parameter name="credentials_file" unique="0" required="0">
+ <getopt mixed="--credentials-file=[path]" />
+ <shortdesc lang="en">Path to credentials file</shortdesc>
+ </parameter>
+ <parameter name="credentials_file_profile" unique="0" required="0">
+ <getopt mixed="--credentials-file-profile=[profile]" />
+ <content type="string" default="default" />
+ <shortdesc lang="en">Credentials file profile</shortdesc>
+ </parameter>
<parameter name="filter" unique="0" required="0">
<getopt mixed="--filter=[key=value]" />
<content type="string" />
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_docker.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_docker.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_docker.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_docker.xml 2024-07-01 10:20:11.000000000 +0200
@@ -61,6 +61,11 @@
<content type="string" default="1.11" />
<shortdesc lang="en">Version of Docker Remote API (default: 1.11)</shortdesc>
</parameter>
+ <parameter name="disable_ssl" unique="0" required="0">
+ <getopt mixed="--disable-ssl" />
+ <content type="boolean" />
+ <shortdesc lang="en">Don't use SSL</shortdesc>
+ </parameter>
<parameter name="tlscacert" unique="0" required="0">
<getopt mixed="--tlscacert" />
<content type="string" />
@@ -76,6 +81,11 @@
<content type="string" />
<shortdesc lang="en">Path to client key (PEM format) for TLS authentication. Required if --ssl option is used.</shortdesc>
</parameter>
+ <parameter name="unix_socket" unique="0" required="0">
+ <getopt mixed="--unix-socket" />
+ <content type="string" />
+ <shortdesc lang="en">Path to Docker's unix socket. Use this with --disable-ssl.</shortdesc>
+ </parameter>
<parameter name="quiet" unique="0" required="0">
<getopt mixed="-q, --quiet" />
<content type="boolean" />
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_eps.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_eps.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_eps.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_eps.xml 2024-07-01 10:20:11.000000000 +0200
@@ -1,9 +1,12 @@
<?xml version="1.0" ?>
<resource-agent name="fence_eps" shortdesc="Fence agent for ePowerSwitch" >
-<longdesc>fence_eps is a Power Fencing agent which can be used with the ePowerSwitch 8M+ power switch to fence connected machines. Fence agent works ONLY on 8M+ device, because this is only one, which has support for hidden page feature.
+<symlink name="fence_epsr2" shortdesc="Fence agent for ePowerSwitch R2 and newer"/>
+<longdesc>fence_eps is a Power Fencing agent which can be used with the ePowerSwitch 8M+ power switch to fence connected machines. It ONLY works on 8M+ devices, as they support the hidden page feature.
-Agent basically works by connecting to hidden page and pass appropriate arguments to GET request. This means, that hidden page feature must be enabled and properly configured.</longdesc>
-<vendor-url>http://www.epowerswitch.com</vendor-url>
+The agent works by connecting to the hidden page and pass the appropriate arguments to GET request. This means, that the hidden page feature must be enabled and properly configured.
+
+NOTE: In most cases you want to use fence_epsr2, as fence_eps only works with older hardware.</longdesc>
+<vendor-url>https://www.neol.com</vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
<getopt mixed="-o, --action=[action]" />
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_epsr2.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_epsr2.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_epsr2.xml 1970-01-01 01:00:00.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_epsr2.xml 2024-07-01 10:20:11.000000000 +0200
@@ -0,0 +1,178 @@
+<?xml version="1.0" ?>
+<resource-agent name="fence_epsr2" shortdesc="Fence agent for ePowerSwitch" >
+<symlink name="fence_epsr2" shortdesc="Fence agent for ePowerSwitch R2 and newer"/>
+<longdesc>fence_epsr2 is a Power Fencing agent which can be used with the ePowerSwitch 8M+ power switch to fence connected machines. It ONLY works on 8M+ devices, as they support the hidden page feature.
+
+The agent works by connecting to the hidden page and pass the appropriate arguments to GET request. This means, that the hidden page feature must be enabled and properly configured.
+
+NOTE: In most cases you want to use fence_epsr2, as fence_eps only works with older hardware.</longdesc>
+<vendor-url>https://www.neol.com</vendor-url>
+<parameters>
+ <parameter name="action" unique="0" required="1">
+ <getopt mixed="-o, --action=[action]" />
+ <content type="string" default="reboot" />
+ <shortdesc lang="en">Fencing action</shortdesc>
+ </parameter>
+ <parameter name="hidden_page" unique="0" required="0" deprecated="1">
+ <getopt mixed="-c, --page=[page]" />
+ <content type="string" default="hidden.htm" />
+ <shortdesc lang="en">Name of hidden page</shortdesc>
+ </parameter>
+ <parameter name="ip" unique="0" required="1" obsoletes="ipaddr">
+ <getopt mixed="-a, --ip=[ip]" />
+ <content type="string" />
+ <shortdesc lang="en">IP address or hostname of fencing device</shortdesc>
+ </parameter>
+ <parameter name="ipaddr" unique="0" required="1" deprecated="1">
+ <getopt mixed="-a, --ip=[ip]" />
+ <content type="string" />
+ <shortdesc lang="en">IP address or hostname of fencing device</shortdesc>
+ </parameter>
+ <parameter name="ipport" unique="0" required="0">
+ <getopt mixed="-u, --ipport=[port]" />
+ <content type="integer" default="80" />
+ <shortdesc lang="en">TCP/UDP port to use for connection with device</shortdesc>
+ </parameter>
+ <parameter name="login" unique="0" required="0" deprecated="1">
+ <getopt mixed="-l, --username=[name]" />
+ <content type="string" />
+ <shortdesc lang="en">Login name</shortdesc>
+ </parameter>
+ <parameter name="page" unique="0" required="0" obsoletes="hidden_page">
+ <getopt mixed="-c, --page=[page]" />
+ <content type="string" default="hidden.htm" />
+ <shortdesc lang="en">Name of hidden page</shortdesc>
+ </parameter>
+ <parameter name="passwd" unique="0" required="0" deprecated="1">
+ <getopt mixed="-p, --password=[password]" />
+ <content type="string" />
+ <shortdesc lang="en">Login password or passphrase</shortdesc>
+ </parameter>
+ <parameter name="passwd_script" unique="0" required="0" deprecated="1">
+ <getopt mixed="-S, --password-script=[script]" />
+ <content type="string" />
+ <shortdesc lang="en">Script to run to retrieve password</shortdesc>
+ </parameter>
+ <parameter name="password" unique="0" required="0" obsoletes="passwd">
+ <getopt mixed="-p, --password=[password]" />
+ <content type="string" />
+ <shortdesc lang="en">Login password or passphrase</shortdesc>
+ </parameter>
+ <parameter name="password_script" unique="0" required="0" obsoletes="passwd_script">
+ <getopt mixed="-S, --password-script=[script]" />
+ <content type="string" />
+ <shortdesc lang="en">Script to run to retrieve password</shortdesc>
+ </parameter>
+ <parameter name="plug" unique="0" required="1" obsoletes="port">
+ <getopt mixed="-n, --plug=[id]" />
+ <content type="string" />
+ <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc>
+ </parameter>
+ <parameter name="port" unique="0" required="1" deprecated="1">
+ <getopt mixed="-n, --plug=[id]" />
+ <content type="string" />
+ <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc>
+ </parameter>
+ <parameter name="username" unique="0" required="0" obsoletes="login">
+ <getopt mixed="-l, --username=[name]" />
+ <content type="string" />
+ <shortdesc lang="en">Login name</shortdesc>
+ </parameter>
+ <parameter name="quiet" unique="0" required="0">
+ <getopt mixed="-q, --quiet" />
+ <content type="boolean" />
+ <shortdesc lang="en">Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog.</shortdesc>
+ </parameter>
+ <parameter name="verbose" unique="0" required="0">
+ <getopt mixed="-v, --verbose" />
+ <content type="boolean" />
+ <shortdesc lang="en">Verbose mode. Multiple -v flags can be stacked on the command line (e.g., -vvv) to increase verbosity.</shortdesc>
+ </parameter>
+ <parameter name="verbose_level" unique="0" required="0">
+ <getopt mixed="--verbose-level" />
+ <content type="integer" />
+ <shortdesc lang="en">Level of debugging detail in output. Defaults to the number of --verbose flags specified on the command line, or to 1 if verbose=1 in a stonith device configuration (i.e., on stdin).</shortdesc>
+ </parameter>
+ <parameter name="debug" unique="0" required="0" deprecated="1">
+ <getopt mixed="-D, --debug-file=[debugfile]" />
+ <content type="string" />
+ <shortdesc lang="en">Write debug information to given file</shortdesc>
+ </parameter>
+ <parameter name="debug_file" unique="0" required="0" obsoletes="debug">
+ <getopt mixed="-D, --debug-file=[debugfile]" />
+ <shortdesc lang="en">Write debug information to given file</shortdesc>
+ </parameter>
+ <parameter name="version" unique="0" required="0">
+ <getopt mixed="-V, --version" />
+ <content type="boolean" />
+ <shortdesc lang="en">Display version information and exit</shortdesc>
+ </parameter>
+ <parameter name="help" unique="0" required="0">
+ <getopt mixed="-h, --help" />
+ <content type="boolean" />
+ <shortdesc lang="en">Display help and exit</shortdesc>
+ </parameter>
+ <parameter name="plug_separator" unique="0" required="0">
+ <getopt mixed="--plug-separator=[char]" />
+ <content type="string" default="," />
+ <shortdesc lang="en">Separator for plug parameter when specifying more than 1 plug</shortdesc>
+ </parameter>
+ <parameter name="separator" unique="0" required="0">
+ <getopt mixed="-C, --separator=[char]" />
+ <content type="string" default="," />
+ <shortdesc lang="en">Separator for CSV created by 'list' operation</shortdesc>
+ </parameter>
+ <parameter name="delay" unique="0" required="0">
+ <getopt mixed="--delay=[seconds]" />
+ <content type="second" default="0" />
+ <shortdesc lang="en">Wait X seconds before fencing is started</shortdesc>
+ </parameter>
+ <parameter name="disable_timeout" unique="0" required="0">
+ <getopt mixed="--disable-timeout=[true/false]" />
+ <content type="string" />
+ <shortdesc lang="en">Disable timeout (true/false) (default: true when run from Pacemaker 2.0+)</shortdesc>
+ </parameter>
+ <parameter name="login_timeout" unique="0" required="0">
+ <getopt mixed="--login-timeout=[seconds]" />
+ <content type="second" default="5" />
+ <shortdesc lang="en">Wait X seconds for cmd prompt after login</shortdesc>
+ </parameter>
+ <parameter name="power_timeout" unique="0" required="0">
+ <getopt mixed="--power-timeout=[seconds]" />
+ <content type="second" default="20" />
+ <shortdesc lang="en">Test X seconds for status change after ON/OFF</shortdesc>
+ </parameter>
+ <parameter name="power_wait" unique="0" required="0">
+ <getopt mixed="--power-wait=[seconds]" />
+ <content type="second" default="0" />
+ <shortdesc lang="en">Wait X seconds after issuing ON/OFF</shortdesc>
+ </parameter>
+ <parameter name="shell_timeout" unique="0" required="0">
+ <getopt mixed="--shell-timeout=[seconds]" />
+ <content type="second" default="3" />
+ <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc>
+ </parameter>
+ <parameter name="stonith_status_sleep" unique="0" required="0">
+ <getopt mixed="--stonith-status-sleep=[seconds]" />
+ <content type="second" default="1" />
+ <shortdesc lang="en">Sleep X seconds between status calls during a STONITH action</shortdesc>
+ </parameter>
+ <parameter name="retry_on" unique="0" required="0">
+ <getopt mixed="--retry-on=[attempts]" />
+ <content type="integer" default="1" />
+ <shortdesc lang="en">Count of attempts to retry power on</shortdesc>
+ </parameter>
+</parameters>
+<actions>
+ <action name="on" automatic="0"/>
+ <action name="off" />
+ <action name="reboot" />
+ <action name="status" />
+ <action name="list" />
+ <action name="list-status" />
+ <action name="monitor" />
+ <action name="metadata" />
+ <action name="manpage" />
+ <action name="validate-all" />
+</actions>
+</resource-agent>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_idrac.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_idrac.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_idrac.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_idrac.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_idrac is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_idrac is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo3.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo3.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo3.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo3.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_ilo3 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_ilo3 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo4.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo4.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo4.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo4.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_ilo4 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_ilo4 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo5.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo5.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo5.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo5.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_ilo5 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_ilo5 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_imm.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_imm.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_imm.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_imm.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_imm is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_imm is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilan.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilan.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilan.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilan.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_ipmilan is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_ipmilan is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilanplus.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilanplus.xml
--- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilanplus.xml 2024-02-13 12:04:28.000000000 +0100
+++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilanplus.xml 2024-07-01 10:20:11.000000000 +0200
@@ -6,7 +6,9 @@
<symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/>
<symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
<symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
-<longdesc>fence_ipmilanplus is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
+<longdesc>fence_ipmilanplus is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/).
+
+WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc>
<vendor-url></vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pytest-ansible for openSUSE:Factory checked in at 2024-07-04 16:25:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytest-ansible (Old)
and /work/SRC/openSUSE:Factory/.python-pytest-ansible.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytest-ansible"
Thu Jul 4 16:25:09 2024 rev:6 rq:1185202 version:24.1.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytest-ansible/python-pytest-ansible.changes 2024-04-23 18:57:44.478075583 +0200
+++ /work/SRC/openSUSE:Factory/.python-pytest-ansible.new.2080/python-pytest-ansible.changes 2024-07-04 16:26:34.522743644 +0200
@@ -1,0 +2,58 @@
+Wed Jul 03 16:45:32 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 24.1.4:
+ * Bump pylint from 3.2.4 to 3.2.5 in /.config in the dependencies
+ group (#355)
+ * Sort, lowercase and remove duplicates in .config/dictionary.txt
+ (#354)
+ * Remove flake8 (#351)
+ * Bump the dependencies group across 1 directory with 3 updates
+ (#353)
+ * Resolve module to full qualified name (#352)
+ * Bump the dependencies group in /.config with 7 updates (#349)
+ * Add a couple safety pre-commit checks. (#348)
+ * Move the coverage file into the .cache directory. (#347)
+ * Move the coverage file into the .cache directory. (#346)
+ * Bump the dependencies group in /.config with 10 updates (#345)
+ * Add known first party (#344)
+ * Wrap the long line so it will pass a default yamllint config
+ (#343)
+ * Move tool cache into cache directory to prevent root directory
+ pollution. (#342)
+ * Bump pipdeptree in /.config in the dependencies group (#332)
+ * Ruff inline (#341)
+ * Shift to per error exclusions (#340)
+ * The tox workflow is called by release and therefore needs
+ `workflow_call` (#339)
+ * Allow manually running push for release note generation after a
+ failed or reverted release. (#338)
+ * Switch to pycontrib prettier (#335)
+ * Update for coverage exclude (#331)
+ * Sort, lowercase and remove duplicates in .config/dictionary.txt
+ (#329)
+ * Update codecov yaml file (#327)
+ * Update depndabot config (#326)
+ * Update cspell configuration file (#328)
+ * Update pytest (#323)
+ * Update ack to use org token (#324)
+ * Update mypy configuration (#321)
+ * Update pylint (#320)
+ * Enable ruff with exceptions (#319)
+ * Enable pydocstyle (#318)
+ * Update VsCode files (#317)
+ * Update precommit (#316)
+ * Update tox.ini (#315)
+ * Bump the dev group across 1 directory with 10 updates (#314)
+ * Bump the runtime group in /.config with 2 updates (#312)
+ * Use OIDC authentication for codecov (#311)
+ * Bump the dev group in /.config with 7 updates (#310)
+ * Bump the dev group in /.config with 7 updates (#309)
+ * Bump jinja2 from 3.1.3 to 3.1.4 in /.config (#308)
+ * chore: pre-commit autoupdate (#307)
+ * Bump the dev group in /.config with 8 updates (#306)
+ * Bump pytest from 8.1.1 to 8.2.0 in /.config in the runtime
+ group (#303)
+ * Bump the dev group in /.config with 8 updates (#304)
+ * gha: rename reusable repository (#305)
+
+-------------------------------------------------------------------
Old:
----
pytest-ansible-24.1.3.obscpio
New:
----
pytest-ansible-24.1.4.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pytest-ansible.spec ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.398775623 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.398775623 +0200
@@ -46,7 +46,7 @@
%endif
Name: python-pytest-ansible
-Version: 24.1.3
+Version: 24.1.4
Release: 0
Summary: Plugin for pytest to simplify calling ansible modules from tests or fixtures
License: MIT
++++++ _service ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.434776938 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.438777084 +0200
@@ -2,7 +2,7 @@
<service name="obs_scm" mode="manual">
<param name="url">https://github.com/ansible-community/pytest-ansible</param>
<param name="scm">git</param>
- <param name="revision">v24.1.3</param>
+ <param name="revision">v24.1.4</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.458777814 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.462777960 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/ansible-community/pytest-ansible</param>
- <param name="changesrevision">d357f58bec06e4332e9f3c677d301e0151b3b2cd</param></service></servicedata>
+ <param name="changesrevision">e93d5e4ff864161458cd52961a13cfe261b7d656</param></service></servicedata>
(No newline at EOF)
++++++ pytest-ansible-24.1.3.obscpio -> pytest-ansible-24.1.4.obscpio ++++++
++++ 4942 lines of diff (skipped)
++++++ pytest-ansible.obsinfo ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.610783363 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.610783363 +0200
@@ -1,5 +1,5 @@
name: pytest-ansible
-version: 24.1.3
-mtime: 1713779654
-commit: d357f58bec06e4332e9f3c677d301e0151b3b2cd
+version: 24.1.4
+mtime: 1719715401
+commit: e93d5e4ff864161458cd52961a13cfe261b7d656
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-awx-cli for openSUSE:Factory checked in at 2024-07-04 16:25:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-awx-cli (Old)
and /work/SRC/openSUSE:Factory/.python-awx-cli.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-awx-cli"
Thu Jul 4 16:25:01 2024 rev:6 rq:1185185 version:24.6.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-awx-cli/python-awx-cli.changes 2024-06-24 20:52:41.186978016 +0200
+++ /work/SRC/openSUSE:Factory/.python-awx-cli.new.2080/python-awx-cli.changes 2024-07-04 16:26:22.210294180 +0200
@@ -1,0 +2,7 @@
+Wed Jul 3 16:24:42 UTC 2024 - Johannes Kastl <opensuse_buildservice(a)ojkastl.de>
+
+- update to 24.6.1:
+ https://github.com/ansible/awx/releases/tag/24.6.1
+ No CLI-related changes mentioned in the release notes
+
+-------------------------------------------------------------------
Old:
----
awx-24.6.0.obscpio
New:
----
awx-24.6.1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-awx-cli.spec ++++++
--- /var/tmp/diff_new_pack.Nu9vyw/_old 2024-07-04 16:26:22.938320756 +0200
+++ /var/tmp/diff_new_pack.Nu9vyw/_new 2024-07-04 16:26:22.938320756 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-awx-cli
-Version: 24.6.0
+Version: 24.6.1
Release: 0
Summary: CLI for the AWX Ansible web platform
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Nu9vyw/_old 2024-07-04 16:26:22.982322363 +0200
+++ /var/tmp/diff_new_pack.Nu9vyw/_new 2024-07-04 16:26:22.982322363 +0200
@@ -4,7 +4,7 @@
<param name="scm">git</param>
<param name="exclude">.git</param>
<param name="subdir">awxkit</param>
- <param name="revision">24.6.0</param>
+ <param name="revision">24.6.1</param>
<param name="versionformat">@PARENT_TAG@</param>
</service>
<service name="set_version" mode="manual">
++++++ awx-24.6.0.obscpio -> awx-24.6.1.obscpio ++++++
++++++ awx.obsinfo ++++++
--- /var/tmp/diff_new_pack.Nu9vyw/_old 2024-07-04 16:26:23.110327036 +0200
+++ /var/tmp/diff_new_pack.Nu9vyw/_new 2024-07-04 16:26:23.114327182 +0200
@@ -1,5 +1,5 @@
name: awx
-version: 24.6.0
-mtime: 1718915674
-commit: 4738c8333a917ef09fa85ff2b50b9c9c03adaf4f
+version: 24.6.1
+mtime: 1719954322
+commit: 94e5795dfc37b95c576d61f3e3b4e936c021548c
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package kor for openSUSE:Factory checked in at 2024-07-04 16:24:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kor (Old)
and /work/SRC/openSUSE:Factory/.kor.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kor"
Thu Jul 4 16:24:55 2024 rev:20 rq:1185195 version:0.5.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/kor/kor.changes 2024-06-19 16:39:41.628030821 +0200
+++ /work/SRC/openSUSE:Factory/.kor.new.2080/kor.changes 2024-07-04 16:26:13.521976921 +0200
@@ -1,0 +2,12 @@
+Wed Jul 03 16:36:27 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 0.5.2:
+ * Fix: Add filters to replicasets (#324)
+ * fix(multi): Support grouping by resource in multi resource mode
+ (#320)
+ * fix(delete): Refactor input handling & output display on
+ resource deletion (#323)
+ * feat: add CI step to package and publish Helm chart (#306)
+ * update readme to show unused reason (#317)
+
+-------------------------------------------------------------------
Old:
----
kor-0.5.1.obscpio
New:
----
kor-0.5.2.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ kor.spec ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.370044412 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.370044412 +0200
@@ -19,7 +19,7 @@
%define __arch_install_post export NO_BRP_STRIP_DEBUG=true
Name: kor
-Version: 0.5.1
+Version: 0.5.2
Release: 0
Summary: Tool to discover unused Kubernetes Resources
License: MIT
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.406045727 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.406045727 +0200
@@ -3,7 +3,7 @@
<param name="url">https://github.com/yonahd/kor</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">v0.5.1</param>
+ <param name="revision">v0.5.2</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.430046603 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.434046750 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/yonahd/kor</param>
- <param name="changesrevision">ced2ef283271806d0102c102f21c28766344d423</param></service></servicedata>
+ <param name="changesrevision">181141dcce1fb608e6982500e88b8f0609b47356</param></service></servicedata>
(No newline at EOF)
++++++ kor-0.5.1.obscpio -> kor-0.5.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/.github/workflows/release.yml new/kor-0.5.2/.github/workflows/release.yml
--- old/kor-0.5.1/.github/workflows/release.yml 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/.github/workflows/release.yml 2024-06-26 10:08:43.000000000 +0200
@@ -53,3 +53,14 @@
- name: Update new version in krew-index
uses: rajatjindal/krew-release-bot(a)v0.0.46
+
+ - name: Configure Git
+ run: |
+ git config user.name "$GITHUB_ACTOR"
+ git config user.email "$GITHUB_ACTOR(a)users.noreply.github.com"
+
+ - name: Run chart-releaser
+ uses: helm/chart-releaser-action(a)v1.6.0
+ env:
+ CR_TOKEN: "${{ secrets.RELEASE_GITHUB_TOKEN }}"
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/README.md new/kor-0.5.2/README.md
--- old/kor-0.5.1/README.md 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/README.md 2024-06-26 10:08:43.000000000 +0200
@@ -31,7 +31,7 @@
- StorageClasses
- NetworkPolicies
-![Kor Screenshot](/images/screenshot.png)
+![Kor Screenshot](/images/show_reason_screenshot.png)
## Installation
@@ -224,6 +224,27 @@
Kor supports three output formats: `table`, `json`, and `yaml`. The default output format is `table`.
Additionally, you can use the `--group-by` flag to group the output by `namespace` or `resource`.
+#### Show reason
+
+```sh
+kor all -n test --show-reason
+```
+```
+Unused resources in namespace: "test"
++---+----------------+----------------------------------------------+--------------------------------------------------------+
+| # | RESOURCE TYPE | RESOURCE NAME | REASON |
++---+----------------+----------------------------------------------+--------------------------------------------------------+
+| 1 | Service | do-not-delete | Marked with unused label |
+| 2 | Ingress | example-ingress | Ingress does not have a valid backend service |
+| 3 | Ingress | example-ingress2 | Ingress does not have a valid backend service |
+| 4 | ConfigMap | prober-blackbox-config | ConfigMap is not used in any pod or container |
+| 5 | ConfigMap | release-name-prober-operator-blackbox-config | ConfigMap is not used in any pod or container |
+| 6 | ConfigMap | unused-cm | ConfigMap is not used in any pod or container |
+| 7 | ServiceAccount | my-service-account2 | ServiceAccount is not in use |
+| 8 | Pdb | my-pdb | Pdb is not referencing any deployments or statefulsets |
++---+----------------+----------------------------------------------+--------------------------------------------------------+
+```
+
#### Group by resource
```sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/charts/kor/Chart.yaml new/kor-0.5.2/charts/kor/Chart.yaml
--- old/kor-0.5.1/charts/kor/Chart.yaml 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/charts/kor/Chart.yaml 2024-06-26 10:08:43.000000000 +0200
@@ -2,8 +2,17 @@
name: kor
description: A Kubernetes Helm Chart to discover orphaned resources using kor
type: application
-version: 0.1.8
-appVersion: "0.4.3"
+version: 0.1.9
+appVersion: "0.5.1"
maintainers:
- name: "yonahd"
url: "https://github.com/yonahd/kor"
+annotations:
+ "artifacthub.io/license": MIT
+ "artifacthub.io/links": |
+ - name: Application Source
+ url: https://github.com/yonahd/kor
+ - name: Chart Source
+ url: https://github.com/yonahd/kor/tree/main/charts/kor
+ - name: Grafana Dashboard
+ url: https://grafana.com/grafana/dashboards/19863-kor-dashboard/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/charts/kor/README.md new/kor-0.5.2/charts/kor/README.md
--- old/kor-0.5.1/charts/kor/README.md 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/charts/kor/README.md 2024-06-26 10:08:43.000000000 +0200
@@ -1,6 +1,6 @@
# kor
-![Version: 0.1.8](https://img.shields.io/badge/Version-0.1.8-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.4.3](https://img.shields.io/badge/AppVersion-0.4.3-informational?style=flat-square)
+![Version: 0.1.9](https://img.shields.io/badge/Version-0.1.9-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.5.1](https://img.shields.io/badge/AppVersion-0.5.1-informational?style=flat-square)
A Kubernetes Helm Chart to discover orphaned resources using kor
Binary files old/kor-0.5.1/images/show_reason_screenshot.png and new/kor-0.5.2/images/show_reason_screenshot.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/clusterroles.go new/kor-0.5.2/pkg/kor/clusterroles.go
--- old/kor-0.5.1/pkg/kor/clusterroles.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/clusterroles.go 2024-06-26 10:08:43.000000000 +0200
@@ -44,9 +44,6 @@
usedClusterRoles := make(map[string]bool)
for _, rb := range roleBindingsAllNameSpaces {
- if pass, _ := filter.Run(filterOpts); pass {
- continue
- }
usedClusterRoles[rb.RoleRef.Name] = true
if rb.RoleRef.Kind == "ClusterRole" {
usedClusterRoles[rb.RoleRef.Name] = true
@@ -61,9 +58,6 @@
}
for _, crb := range clusterRoleBindings.Items {
- if pass, _ := filter.Run(filterOpts); pass {
- continue
- }
usedClusterRoles[crb.RoleRef.Name] = true
}
@@ -191,6 +185,11 @@
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to process cluster role : %v\n", err)
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, "", "ClusterRole", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete clusterRole %s : %v\n", diff, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[""] = make(map[string][]ResourceInfo)
@@ -198,11 +197,6 @@
case "resource":
appendResources(resources, "ClusterRole", "", diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, "", "ClusterRole", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete clusterRole %s : %v\n", diff, err)
- }
- }
var outputBuffer bytes.Buffer
var jsonResponse []byte
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/configmaps.go new/kor-0.5.2/pkg/kor/configmaps.go
--- old/kor-0.5.1/pkg/kor/configmaps.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/configmaps.go 2024-06-26 10:08:43.000000000 +0200
@@ -166,6 +166,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "ConfigMap", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete ConfigMap %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -173,11 +178,6 @@
case "resource":
appendResources(resources, "ConfigMap", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "ConfigMap", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete ConfigMap %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/daemonsets.go new/kor-0.5.2/pkg/kor/daemonsets.go
--- old/kor-0.5.1/pkg/kor/daemonsets.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/daemonsets.go 2024-06-26 10:08:43.000000000 +0200
@@ -67,6 +67,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "DaemonSet", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete DaemonSet %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -74,11 +79,6 @@
case "resource":
appendResources(resources, "DaemonSet", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "DaemonSet", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete DaemonSet %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/delete.go new/kor-0.5.2/pkg/kor/delete.go
--- old/kor-0.5.1/pkg/kor/delete.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/delete.go 2024-06-26 10:08:43.000000000 +0200
@@ -270,58 +270,7 @@
return remainingResources, nil
}
-func DeleteResource(diff []string, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]string, error) {
- deletedDiff := []string{}
-
- for _, resourceName := range diff {
- deleteFunc, exists := DeleteResourceCmd()[resourceType]
- if !exists {
- fmt.Printf("Resource type '%s' is not supported\n", resourceName)
- continue
- }
-
- if !noInteractive {
- fmt.Printf("Do you want to delete %s %s in namespace %s? (Y/N): ", resourceType, resourceName, namespace)
- var confirmation string
- _, err := fmt.Scanf("%s", &confirmation)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
- continue
- }
-
- if strings.ToLower(confirmation) != "y" && strings.ToLower(confirmation) != "yes" {
- deletedDiff = append(deletedDiff, resourceName)
-
- fmt.Printf("Do you want flag the resource %s %s in namespace %s as In Use? (Y/N): ", resourceType, resourceName, namespace)
- var inUse string
- _, err := fmt.Scanf("%s", &inUse)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
- continue
- }
-
- if strings.ToLower(inUse) == "y" || strings.ToLower(inUse) == "yes" {
- if err := FlagResource(clientset, namespace, resourceType, resourceName); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to flag resource %s %s in namespace %s as In Use: %v\n", resourceType, resourceName, namespace, err)
- }
- continue
- }
- continue
- }
- }
-
- fmt.Printf("Deleting %s %s in namespace %s\n", resourceType, resourceName, namespace)
- if err := deleteFunc(clientset, namespace, resourceName); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete %s %s in namespace %s: %v\n", resourceType, resourceName, namespace, err)
- continue
- }
- deletedDiff = append(deletedDiff, resourceName+"-DELETED")
- }
-
- return deletedDiff, nil
-}
-
-func DeleteResource2(diff []ResourceInfo, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]ResourceInfo, error) {
+func DeleteResource(diff []ResourceInfo, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]ResourceInfo, error) {
deletedDiff := []ResourceInfo{}
for _, resource := range diff {
@@ -334,7 +283,7 @@
if !noInteractive {
fmt.Printf("Do you want to delete %s %s in namespace %s? (Y/N): ", resourceType, resource.Name, namespace)
var confirmation string
- _, err := fmt.Scanf("%s", &confirmation)
+ _, err := fmt.Scanf("%s\n", &confirmation)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
continue
@@ -345,7 +294,7 @@
fmt.Printf("Do you want flag the resource %s %s in namespace %s as In Use? (Y/N): ", resourceType, resource.Name, namespace)
var inUse string
- _, err := fmt.Scanf("%s", &inUse)
+ _, err := fmt.Scanf("%s\n", &inUse)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
continue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/delete_test.go new/kor-0.5.2/pkg/kor/delete_test.go
--- old/kor-0.5.1/pkg/kor/delete_test.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/delete_test.go 2024-06-26 10:08:43.000000000 +0200
@@ -15,26 +15,42 @@
func TestDeleteResource(t *testing.T) {
clientset := fake.NewSimpleClientset()
+ configmap1 := CreateTestConfigmap(testNamespace, "configmap-1", AppLabels)
+ _, err := clientset.CoreV1().ConfigMaps(testNamespace).Create(context.TODO(), configmap1, metav1.CreateOptions{})
+ if err != nil {
+ t.Fatalf("Error creating fake configmap: %v", err)
+ }
+ configmap2 := CreateTestConfigmap(testNamespace, "configmap-2", AppLabels)
+ _, err = clientset.CoreV1().ConfigMaps(testNamespace).Create(context.TODO(), configmap2, metav1.CreateOptions{})
+ if err != nil {
+ t.Fatalf("Error creating fake configmap: %v", err)
+ }
+
tests := []struct {
name string
- diff []string
+ diff []ResourceInfo
resourceType string
- expectedDiff []string
+ expectedDiff []ResourceInfo
expectedError bool
}{
{
- name: "Test deletion confirmation",
- diff: []string{"resource1", "resource2"},
- resourceType: "ConfigMap",
- expectedDiff: []string{"resource1-DELETED", "resource2"},
+ name: "Test deletion confirmation",
+ diff: []ResourceInfo{
+ {Name: configmap1.Name, Reason: "ConfigMap is not used in any pod or container"},
+ {Name: configmap2.Name, Reason: "Marked with unused label"},
+ },
+ resourceType: "ConfigMap",
+ expectedDiff: []ResourceInfo{
+ {Name: configmap1.Name + "-DELETED", Reason: "ConfigMap is not used in any pod or container"},
+ {Name: configmap2.Name + "-DELETED", Reason: "Marked with unused label"},
+ },
expectedError: false,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- deletedDiff, _ := DeleteResource(test.diff, clientset, "namespace", test.resourceType, true)
-
+ deletedDiff, _ := DeleteResource(test.diff, clientset, testNamespace, test.resourceType, true)
for i, deleted := range deletedDiff {
if deleted != test.expectedDiff[i] {
t.Errorf("Expected: %s, Got: %s", test.expectedDiff[i], deleted)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/deployments.go new/kor-0.5.2/pkg/kor/deployments.go
--- old/kor-0.5.1/pkg/kor/deployments.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/deployments.go 2024-06-26 10:08:43.000000000 +0200
@@ -49,6 +49,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Deployment", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Deployment %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -56,11 +61,6 @@
case "resource":
appendResources(resources, "Deployment", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Deployment", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Deployment %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/finalizers.go new/kor-0.5.2/pkg/kor/finalizers.go
--- old/kor-0.5.1/pkg/kor/finalizers.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/finalizers.go 2024-06-26 10:08:43.000000000 +0200
@@ -47,7 +47,7 @@
continue
}
for _, item := range resourceList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&item).Run(filterOpts); pass {
continue
}
if CheckFinalizers(item.GetFinalizers(), item.GetDeletionTimestamp()) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/formatter.go new/kor-0.5.2/pkg/kor/formatter.go
--- old/kor-0.5.1/pkg/kor/formatter.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/formatter.go 2024-06-26 10:08:43.000000000 +0200
@@ -148,7 +148,7 @@
}
}
table.Render()
- return fmt.Sprintf("Unused %ss:\n%s", resource, buf.String())
+ return fmt.Sprintf("Unused %ss:\n%s\n", resource, buf.String())
}
func appendResources(resources map[string]map[string][]ResourceInfo, resourceType, namespace string, diff []ResourceInfo) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/hpas.go new/kor-0.5.2/pkg/kor/hpas.go
--- old/kor-0.5.1/pkg/kor/hpas.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/hpas.go 2024-06-26 10:08:43.000000000 +0200
@@ -88,6 +88,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "HPA", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete HPA %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -95,11 +100,6 @@
case "resource":
appendResources(resources, "Hpa", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "HPA", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete HPA %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/ingresses.go new/kor-0.5.2/pkg/kor/ingresses.go
--- old/kor-0.5.1/pkg/kor/ingresses.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/ingresses.go 2024-06-26 10:08:43.000000000 +0200
@@ -36,7 +36,7 @@
usedIngresses := []string{}
for _, ingress := range ingresses.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&ingress).Run(filterOpts); pass {
continue
}
@@ -124,6 +124,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Ingress", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Ingress %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -131,11 +136,6 @@
case "resource":
appendResources(resources, "Ingress", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Ingress", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Ingress %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/jobs.go new/kor-0.5.2/pkg/kor/jobs.go
--- old/kor-0.5.1/pkg/kor/jobs.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/jobs.go 2024-06-26 10:08:43.000000000 +0200
@@ -73,6 +73,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Job", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Job %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -80,11 +85,6 @@
case "resource":
appendResources(resources, "Job", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Job", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Job %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/multi.go new/kor-0.5.2/pkg/kor/multi.go
--- old/kor-0.5.1/pkg/kor/multi.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/multi.go 2024-06-26 10:08:43.000000000 +0200
@@ -97,64 +97,62 @@
}
func GetUnusedMulti(resourceNames string, filterOpts *filters.Options, clientset kubernetes.Interface, apiExtClient apiextensionsclientset.Interface, dynamicClient dynamic.Interface, outputFormat string, opts Opts) (string, error) {
- var allDiffs []ResourceDiff
- var outputBuffer bytes.Buffer
- var unusedMulti string
resourceList := strings.Split(resourceNames, ",")
namespaces := filterOpts.Namespaces(clientset)
- response := make(map[string]map[string][]ResourceInfo)
+ resources := make(map[string]map[string][]ResourceInfo)
var err error
noNamespaceDiff, resourceList := retrieveNoNamespaceDiff(clientset, apiExtClient, dynamicClient, resourceList, filterOpts)
if len(noNamespaceDiff) != 0 {
for _, diff := range noNamespaceDiff {
if len(diff.diff) != 0 {
- output := FormatOutputAll("", []ResourceDiff{diff}, opts)
- outputBuffer.WriteString(output)
-
- resourceMap := make(map[string][]ResourceInfo)
- resourceMap[diff.resourceType] = diff.diff
- response[""] = resourceMap
+ if opts.DeleteFlag {
+ if diff.diff, err = DeleteResource(diff.diff, clientset, "", diff.resourceType, opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete %s %s: %v\n", diff.resourceType, diff.diff, err)
+ }
+ }
+ switch opts.GroupBy {
+ case "namespace":
+ resources[""] = make(map[string][]ResourceInfo)
+ resources[""][diff.resourceType] = diff.diff
+ case "resource":
+ appendResources(resources, diff.resourceType, "", diff.diff)
+ }
}
}
-
- resourceMap := make(map[string][]ResourceInfo)
- for _, diff := range noNamespaceDiff {
- resourceMap[diff.resourceType] = diff.diff
- }
- response[""] = resourceMap
-
}
for _, namespace := range namespaces {
- allDiffs = retrieveNamespaceDiffs(clientset, namespace, resourceList, filterOpts)
-
- if opts.DeleteFlag {
- for _, diff := range allDiffs {
- if diff.diff, err = DeleteResource2(diff.diff, clientset, namespace, diff.resourceType, opts.NoInteractive); err != nil {
+ allDiffs := retrieveNamespaceDiffs(clientset, namespace, resourceList, filterOpts)
+ for _, diff := range allDiffs {
+ if opts.DeleteFlag {
+ if diff.diff, err = DeleteResource(diff.diff, clientset, namespace, diff.resourceType, opts.NoInteractive); err != nil {
fmt.Fprintf(os.Stderr, "Failed to delete %s %s in namespace %s: %v\n", diff.resourceType, diff.diff, namespace, err)
}
}
-
- }
- output := FormatOutputAll(namespace, allDiffs, opts)
- if output != "" {
- outputBuffer.WriteString(output)
-
- resourceMap := make(map[string][]ResourceInfo)
- for _, diff := range allDiffs {
- resourceMap[diff.resourceType] = diff.diff
+ switch opts.GroupBy {
+ case "namespace":
+ resources[namespace] = make(map[string][]ResourceInfo)
+ resources[namespace][diff.resourceType] = diff.diff
+ case "resource":
+ appendResources(resources, diff.resourceType, namespace, diff.diff)
}
- response[namespace] = resourceMap
}
}
- jsonResponse, err := json.MarshalIndent(response, "", " ")
- if err != nil {
- return "", err
+ var outputBuffer bytes.Buffer
+ var jsonResponse []byte
+ switch outputFormat {
+ case "table":
+ outputBuffer = FormatOutput(resources, opts)
+ case "json", "yaml":
+ var err error
+ if jsonResponse, err = json.MarshalIndent(resources, "", " "); err != nil {
+ return "", err
+ }
}
- unusedMulti, err = unusedResourceFormatter(outputFormat, outputBuffer, opts, jsonResponse)
+ unusedMulti, err := unusedResourceFormatter(outputFormat, outputBuffer, opts, jsonResponse)
if err != nil {
fmt.Printf("err: %v\n", err)
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/networkpolicies.go new/kor-0.5.2/pkg/kor/networkpolicies.go
--- old/kor-0.5.1/pkg/kor/networkpolicies.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/networkpolicies.go 2024-06-26 10:08:43.000000000 +0200
@@ -62,7 +62,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
-
+ if opts.DeleteFlag {
+ if diff, err := DeleteResource(diff, clientset, namespace, "NetworkPolicy", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete NetworkPolicy %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -70,12 +74,6 @@
case "resource":
appendResources(resources, "NetworkPolicy", namespace, diff)
}
-
- if opts.DeleteFlag {
- if diff, err := DeleteResource2(diff, clientset, namespace, "NetworkPolicy", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete NetworkPolicy %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pdbs.go new/kor-0.5.2/pkg/kor/pdbs.go
--- old/kor-0.5.1/pkg/kor/pdbs.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pdbs.go 2024-06-26 10:08:43.000000000 +0200
@@ -89,6 +89,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "PDB", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete PDB %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -96,11 +101,6 @@
case "resource":
appendResources(resources, "Pdb", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "PDB", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete PDB %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pods.go new/kor-0.5.2/pkg/kor/pods.go
--- old/kor-0.5.1/pkg/kor/pods.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pods.go 2024-06-26 10:08:43.000000000 +0200
@@ -51,6 +51,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Pod", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Pod %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -58,11 +63,6 @@
case "resource":
appendResources(resources, "Pod", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Pod", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Pod %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pv.go new/kor-0.5.2/pkg/kor/pv.go
--- old/kor-0.5.1/pkg/kor/pv.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pv.go 2024-06-26 10:08:43.000000000 +0200
@@ -50,6 +50,11 @@
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to process pvs: %v\n", err)
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, "", "PV", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete PV %s: %v\n", diff, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[""] = make(map[string][]ResourceInfo)
@@ -57,11 +62,6 @@
case "resource":
appendResources(resources, "Pv", "", diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, "", "PV", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete PV %s: %v\n", diff, err)
- }
- }
var outputBuffer bytes.Buffer
var jsonResponse []byte
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pvc.go new/kor-0.5.2/pkg/kor/pvc.go
--- old/kor-0.5.1/pkg/kor/pvc.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pvc.go 2024-06-26 10:08:43.000000000 +0200
@@ -80,6 +80,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "PVC", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete PVC %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -87,11 +92,6 @@
case "resource":
appendResources(resources, "Pvc", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "PVC", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete PVC %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/replicaset.go new/kor-0.5.2/pkg/kor/replicaset.go
--- old/kor-0.5.1/pkg/kor/replicaset.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/replicaset.go 2024-06-26 10:08:43.000000000 +0200
@@ -22,7 +22,7 @@
var unusedReplicaSetNames []ResourceInfo
for _, replicaSet := range replicaSetList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&replicaSet).Run(filterOpts); pass {
continue
}
@@ -44,6 +44,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "ReplicaSet", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete ReplicaSet %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -51,11 +56,6 @@
case "resource":
appendResources(resources, "ReplicaSet", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "ReplicaSet", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete ReplicaSet %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/roles.go new/kor-0.5.2/pkg/kor/roles.go
--- old/kor-0.5.1/pkg/kor/roles.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/roles.go 2024-06-26 10:08:43.000000000 +0200
@@ -18,7 +18,7 @@
//go:embed exceptions/roles/roles.json
var rolesConfig []byte
-func retrieveUsedRoles(clientset kubernetes.Interface, namespace string, filterOpts *filters.Options) ([]string, error) {
+func retrieveUsedRoles(clientset kubernetes.Interface, namespace string) ([]string, error) {
// Get a list of all role bindings in the specified namespace
roleBindings, err := clientset.RbacV1().RoleBindings(namespace).List(context.TODO(), metav1.ListOptions{})
if err != nil {
@@ -27,10 +27,6 @@
usedRoles := make(map[string]bool)
for _, rb := range roleBindings.Items {
- if pass, _ := filter.Run(filterOpts); pass {
- continue
- }
-
usedRoles[rb.RoleRef.Name] = true
}
@@ -78,7 +74,7 @@
}
func processNamespaceRoles(clientset kubernetes.Interface, namespace string, filterOpts *filters.Options) ([]ResourceInfo, error) {
- usedRoles, err := retrieveUsedRoles(clientset, namespace, filterOpts)
+ usedRoles, err := retrieveUsedRoles(clientset, namespace)
if err != nil {
return nil, err
}
@@ -113,6 +109,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Role", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Role %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -120,11 +121,6 @@
case "resource":
appendResources(resources, "Role", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Role", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Role %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/roles_test.go new/kor-0.5.2/pkg/kor/roles_test.go
--- old/kor-0.5.1/pkg/kor/roles_test.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/roles_test.go 2024-06-26 10:08:43.000000000 +0200
@@ -63,7 +63,7 @@
func TestRetrieveUsedRoles(t *testing.T) {
clientset := createTestRoles(t)
- usedRoles, err := retrieveUsedRoles(clientset, testNamespace, &filters.Options{})
+ usedRoles, err := retrieveUsedRoles(clientset, testNamespace)
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/secrets.go new/kor-0.5.2/pkg/kor/secrets.go
--- old/kor-0.5.1/pkg/kor/secrets.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/secrets.go 2024-06-26 10:08:43.000000000 +0200
@@ -203,6 +203,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Secret", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Secret %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -210,11 +215,6 @@
case "resource":
appendResources(resources, "Secret", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Secret", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Secret %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/serviceaccounts.go new/kor-0.5.2/pkg/kor/serviceaccounts.go
--- old/kor-0.5.1/pkg/kor/serviceaccounts.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/serviceaccounts.go 2024-06-26 10:08:43.000000000 +0200
@@ -171,6 +171,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "ServiceAccount", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Serviceaccount %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -178,11 +183,6 @@
case "resource":
appendResources(resources, "ServiceAccount", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "ServiceAccount", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Serviceaccount %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/services.go new/kor-0.5.2/pkg/kor/services.go
--- old/kor-0.5.1/pkg/kor/services.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/services.go 2024-06-26 10:08:43.000000000 +0200
@@ -31,7 +31,7 @@
var endpointsWithoutSubsets []ResourceInfo
for _, endpoints := range endpointsList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&endpoints).Run(filterOpts); pass {
continue
}
@@ -68,7 +68,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
-
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Service", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Service %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
if diff != nil {
@@ -79,13 +83,6 @@
if diff != nil {
appendResources(resources, "Service", namespace, diff)
}
-
- }
-
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Service", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Service %s in namespace %s: %v\n", diff, namespace, err)
- }
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/statefulsets.go new/kor-0.5.2/pkg/kor/statefulsets.go
--- old/kor-0.5.1/pkg/kor/statefulsets.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/statefulsets.go 2024-06-26 10:08:43.000000000 +0200
@@ -22,7 +22,7 @@
var statefulSetsWithoutReplicas []ResourceInfo
for _, statefulSet := range statefulSetsList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&statefulSet).Run(filterOpts); pass {
continue
}
@@ -51,6 +51,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "StatefulSet", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Statefulset %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
if diff != nil {
@@ -62,11 +67,6 @@
appendResources(resources, "StatefulSet", namespace, diff)
}
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "StatefulSet", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Statefulset %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/storageclasses.go new/kor-0.5.2/pkg/kor/storageclasses.go
--- old/kor-0.5.1/pkg/kor/storageclasses.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/storageclasses.go 2024-06-26 10:08:43.000000000 +0200
@@ -104,6 +104,11 @@
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to process storageClasses: %v\n", err)
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, "", "StorageClass", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete StorageClass %s: %v\n", diff, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[""] = make(map[string][]ResourceInfo)
@@ -111,11 +116,6 @@
case "resource":
appendResources(resources, "StorageClass", "", diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, "", "StorageClass", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete StorageClass %s: %v\n", diff, err)
- }
- }
var outputBuffer bytes.Buffer
var jsonResponse []byte
++++++ kor.obsinfo ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.610053177 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.614053323 +0200
@@ -1,5 +1,5 @@
name: kor
-version: 0.5.1
-mtime: 1718736271
-commit: ced2ef283271806d0102c102f21c28766344d423
+version: 0.5.2
+mtime: 1719389323
+commit: 181141dcce1fb608e6982500e88b8f0609b47356
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/kor/vendor.tar.gz /work/SRC/openSUSE:Factory/.kor.new.2080/vendor.tar.gz differ: char 5, line 1
1
0