From 1d94bef08279b1788db5bf142c26047139896673 Mon Sep 17 00:00:00 2001 From: Knut Anderssen Date: Wed, 9 Aug 2023 23:36:55 +0100 Subject: [PATCH] Added proxy setup service --- service/agama.gemspec | 2 +- service/bin/agama-proxy-setup | 111 ++++++++++++++++++ service/package/gem2rpm.yml | 4 +- service/share/agama-proxy-setup.service | 12 ++ .../share/{systemd.service => agama.service} | 0 5 files changed, 127 insertions(+), 2 deletions(-) create mode 100755 service/bin/agama-proxy-setup create mode 100644 service/share/agama-proxy-setup.service rename service/share/{systemd.service => agama.service} (100%) diff --git a/service/agama.gemspec b/service/agama.gemspec index 805729197b..bb2b561d4a 100644 --- a/service/agama.gemspec +++ b/service/agama.gemspec @@ -40,7 +40,7 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/openSUSE/agama" spec.license = "GPL-2.0-only" spec.files = Dir["lib/**/*.rb", "bin/*", "share/*", "etc/*"] - spec.executables = ["agamactl"] + spec.executables = ["agamactl", "agama-proxy-setup"] spec.metadata = { "rubygems_mfa_required" => "true" } spec.required_ruby_version = ">= 2.5.0" diff --git a/service/bin/agama-proxy-setup b/service/bin/agama-proxy-setup new file mode 100755 index 0000000000..ea99ebcdcf --- /dev/null +++ b/service/bin/agama-proxy-setup @@ -0,0 +1,111 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# Copyright (c) [2023] SUSE LLC +# +# All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of version 2 of the GNU General Public License as published +# by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, contact SUSE LLC. +# +# To contact SUSE LLC about this file by physical or electronic mail, you may +# find current contact information at www.suse.com. + +# Helper script to create a configuration file for a selected list of products. + +require "yast" +require "uri" + +# This class is responsible of parsing the proxy url from the kernel cmdline or configured +# during the boot proccess of the system +class SetupProxy + include Singleton + include Yast + include Logger + + CMDLINE_PATH = "/etc/cmdline" + CMDLINE_MENU_CONF = "/etc/cmdline-menu.conf" + + attr_accessor :proxy + + # Constructor + def initialize + Yast.import "Proxy" + end + + def run + read + write + end + +private + + def read + self.proxy = proxy_from_cmdline || proxy_from_dracut + end + + # TODO + def proxy_from_dracut + return unless File.exist?(CMDLINE_MENU_CONF) + + options = File.read(CMDLINE_MENU_CONF) + proxy_url_from(options) + end + + def proxy_url_from(options) + proxy_url = options.split.find { |o| o.start_with?(/proxy/i) } + return unless proxy_url + + URI(proxy_url.downcase.gsub("proxy=", "")) + end + + def proxy_from_cmdline + return unless File.exist?(CMDLINE_PATH) + + options = File.read(CMDLINE_PATH) + proxy_url_from(options) + end + + def proxy_import_settings + ex = Proxy.Export + proto = proxy.scheme + + # save user name and password separately + ex["proxy_user"] = proxy.user + proxy.user = nil + ex["proxy_password"] = proxy.password + proxy.password = nil + ex["#{proto}_proxy"] = proxy.to_s + # Use the proxy also for https and ftp + if proto == "http" + ex["https_proxy"] = proxy.to_s + ex["ftp_proxy"] = proxy.to_s + end + ex["enabled"] = true + ex + end + + def write + return unless proxy + + Proxy.Read + ex = proxy_import_settings + + log.info "Writing proxy settings: #{proxy.scheme}_proxy = '#{proxy}'" + log.debug "Writing proxy settings: #{ex}" + + Proxy.Import(ex) + Proxy.Write + end +end + +SetupProxy.instance.run diff --git a/service/package/gem2rpm.yml b/service/package/gem2rpm.yml index 945bc01132..cc70ad5bc8 100644 --- a/service/package/gem2rpm.yml +++ b/service/package/gem2rpm.yml @@ -8,7 +8,8 @@ install -D -m 0644 %{buildroot}%{gem_base}/gems/%{mod_full_name}/share/dbus.conf %{buildroot}%{_datadir}/dbus-1/agama.conf install --directory %{buildroot}%{_datadir}/dbus-1/agama-services install -m 0644 --target-directory=%{buildroot}%{_datadir}/dbus-1/agama-services %{buildroot}%{gem_base}/gems/%{mod_full_name}/share/org.opensuse.Agama*.service - install -D -m 0644 %{buildroot}%{gem_base}/gems/%{mod_full_name}/share/systemd.service %{buildroot}%{_unitdir}/agama.service + install -D -m 0644 %{buildroot}%{gem_base}/gems/%{mod_full_name}/share/agama.service %{buildroot}%{_unitdir}/agama.service + install -D -m 0644 %{buildroot}%{gem_base}/gems/%{mod_full_name}/share/agama-proxy-setup.service %{buildroot}%{_unitdir}/agama-proxy-setup.service install -D -m 0644 %{buildroot}%{gem_base}/gems/%{mod_full_name}/etc/agama.yaml %{buildroot}%{_sysconfdir}/agama.yaml :main: :preamble: |- @@ -36,4 +37,5 @@ %dir %{_datadir}/dbus-1/agama-services\n %{_datadir}/dbus-1/agama-services/org.opensuse.Agama*.service\n %{_unitdir}/agama.service\n + %{_unitdir}/agama-proxy-setup.service\n %config %{_sysconfdir}/agama.yaml\n" diff --git a/service/share/agama-proxy-setup.service b/service/share/agama-proxy-setup.service new file mode 100644 index 0000000000..3a46bbc232 --- /dev/null +++ b/service/share/agama-proxy-setup.service @@ -0,0 +1,12 @@ +[Unit] +Description=Configure wide proxy setup for agama and systemd services +Before=agama.service +Wants=local-fs.target + +[Service] +Type=oneshot +ExecStart=/usr/bin/agama-proxy-setup + +[Install] +WantedBy=default.target + diff --git a/service/share/systemd.service b/service/share/agama.service similarity index 100% rename from service/share/systemd.service rename to service/share/agama.service