From d11e0c71eb78d15d29d0afaede7108d854f47a43 Mon Sep 17 00:00:00 2001 From: ge Date: Tue, 25 Apr 2023 22:19:13 +0300 Subject: [PATCH] init --- README.md | 66 ++++++++++++++++++++++++++++ UNLICENSE | 24 +++++++++++ pmgr | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ pmgr.1 | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 337 insertions(+) create mode 100644 README.md create mode 100644 UNLICENSE create mode 100755 pmgr create mode 100644 pmgr.1 diff --git a/README.md b/README.md new file mode 100644 index 0000000..86dbba5 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# PMGR + +pmgr is wrapper utility for systemd to manage user services for prox‐ +ies. See example for SSH SOCKS-proxy below. + +# Installation + +Just place pmgr into your PATH. + +``` +install -m755 pmgr ~/.local/bin/pmgr +``` + +# Usage example + +For SSH SOCKS-proxy create template user unit ~/.config/sys‐ +temd/user/ssh-proxy@.service with contents: + +```ini +[Unit] +Description=SSH tunnel to %I +After=network.target + +[Service] +Environment="LOCAL_ADDR=localhost" +EnvironmentFile=%h/.config/proxy-manager/ssh-proxy@%i +ExecStart=/usr/bin/ssh -NT \ + -o ServerAliveInterval=60 \ + -o ExitOnForwardFailure=yes \ + -D ${LOCAL_ADDR}:${LOCAL_PORT} ${TARGET} +RestartSec=5 +Restart=always + +[Install] +WantedBy=default.target +``` + +Create environment file ~/.config/pmgr/environment/ssh-proxy@myserver +with contents: + +``` +TARGET=user@myserver +LOCAL_ADDR=127.0.0.1 +LOCAL_PORT=1080 +``` + +In there 'mysserver' may be a domain name, SSH Hostname (set in +~/.ssh/config) or IP address of remote server. + +Now you can enable your proxy with systemctl: + +``` +systemctl --user start ssh-proxy@myserver +``` + +With pmgr: + +``` +pmgr -e ssh-proxy@myserver +``` + +Proxy usage: + +``` +curl --proxy socks5h://localhost:1080 eth0.me +``` diff --git a/UNLICENSE b/UNLICENSE new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/pmgr b/pmgr new file mode 100755 index 0000000..eaf5df0 --- /dev/null +++ b/pmgr @@ -0,0 +1,121 @@ +#!/bin/sh + +# pmgr -- proxy manager + +PMGR_VERSION=0.0.1 +PMGR_WORKDIR="${PMGR_WORKDIR:-"$HOME"/.config/pmgr}" +PMGR_ENV_DIR="${PMGR_ENV_DIR:-"$PMGR_WORKDIR"/environment}" + +mkdir -p "$PMGR_WORKDIR" +mkdir -p "$PMGR_ENV_DIR" + +usage() +{ + printf \ + 'pmgr -- proxy manager based on systemd user units. See pmgr(1) + + Usage: pmgr [options] [] + + Options: + -l list proxies + -e enable (start) proxy + -d disable (stop) proxy + -r restart proxy + -s show proxy status + -j view proxy logs + -o print PMGR_ENV_DIR + -R run systemctl --user daemon-reload + -a add to autostart + -A remove from autostart + -h print this help message and exit + -v print version and exit + + Environment: + PMGR_WORKDIR [default: ~/.config/pmgr] + PMGR_ENV_DIR [default: $PMGR_WORKDIR/environment] + ' | sed 's/^ //g' +} + +list_proxies() +{ + + { + printf '\e[1mHOST PROTO FILE STATUS AUTOSTART\033[0m\n' + for file in $(find "$PMGR_ENV_DIR" -type f); do + unit="${file##*/}" + if systemctl --user is-active "$unit" >/dev/null 2>&1; then + active='\033[32mactive\033[0m' + else + active=inactive + fi + printf '%s %s %s %b %s\n' \ + "${unit#*@}" \ + "${unit%@*}" \ + "$(echo "$file" | sed "s%$HOME%~%")" \ + "$active" \ + "$(systemctl --user is-enabled "$unit")" + done + } | column -t +} + +[ $# -eq 0 ] && { usage; exit 0; } + +while getopts le:d:r:s:j:oRa:A:hv opt; do + case "$opt" in + l) + list_proxies + exit "$?" + ;; + e) + for unit in $(find "$PMGR_ENV_DIR" -type f -printf '%f\n'); do + if systemctl --user is-active "$unit" >/dev/null 2>&1; then + systemctl --user stop "$unit" + fi + done + systemctl --user start "$OPTARG" + exit "$?" + ;; + d) + systemctl --user stop "$OPTARG" + exit "$?" + ;; + r) + systemctl --user restart "$OPTARG" + exit "$?" + ;; + s) + systemctl --user status "$OPTARG" + exit "$?" + ;; + j) + journalctl --user --unit "$OPTARG" + exit "$?" + ;; + o) + echo "$PMGR_ENV_DIR" + exit 0 + ;; + R) + systemctl --user daemon-reload + exit "$?" + ;; + a) + systemctl --user enable "$OPTARG" + exit "$?" + ;; + A) + systemctl --user disable "$OPTARG" + exit "$?" + ;; + h) + usage + exit 0 + ;; + v) + printf 'v%s\n' "$PMGR_VERSION" + exit 0 + ;; + *) + : + esac +done diff --git a/pmgr.1 b/pmgr.1 new file mode 100644 index 0000000..35f8b40 --- /dev/null +++ b/pmgr.1 @@ -0,0 +1,126 @@ +.\" vim: set filetype=groff: +.TH PMGR 1 "2023-04-25" "pmgr 0.0.1" +.SH NAME +pmgr - proxy manager based on systemd user units. + +.SH SYNOPSYS +.SY pmrg +.OP \-ledrsjoRaAhv +[\fIservice\fR] +.YS + +.SH DESCRIPTION +.PP +pmgr is wrapper utility for systemd to manage user services for proxies. +See example for SSH SOCKS-proxy in EXAMPLES section below. + +.SH OPTIONS +.TP +.B \-l +list proxies +.TP +.B \-e \fIservice\fR +enable (start) proxy +.TP +.B \-d \fIservice\fR +disable (stop) proxy +.TP +.B \-r \fIservice\fR +restart proxy +.TP +.B \-s \fIservice\fR +show proxy status +.TP +.B \-j \fIservice\fR +view proxy logs +.TP +.B \-o +print PMGR_ENV_DIR +.TP +.B \-R +run systemctl --user daemon-reload +.TP +.B \-a \fIservice\fR +add to autostart +.TP +.B \-A \fIservice\fR +remove from autostart +.TP +.B \-h +print this help message and exit +.TP +.B \-v +print version and exit + +.SH ENVIRONMENT +.TP +.B PMGR_WORKDIR +Working directory. Deafult is ~/.config/pmgr +.TP +.B PMGR_ENV_DIR +Directory for systemd environment files, depends on PMGR_WORKDIR by default. +Default is $PMGR_WORKDIR/environment + +.SH EXAMPLES +.PP +For SSH SOCKS-proxy create template user unit +~/.config/systemd/user/ssh-proxy@.service with contents: +.PP +.in +4n +.EX +[Unit] +Description=SSH tunnel to %I +After=network.target + +[Service] +Environment="LOCAL_ADDR=localhost" +EnvironmentFile=%h/.config/proxy-manager/ssh-proxy@%i +ExecStart=/usr/bin/ssh -NT \\ + -o ServerAliveInterval=60 \\ + -o ExitOnForwardFailure=yes \\ + -D ${LOCAL_ADDR}:${LOCAL_PORT} ${TARGET} +RestartSec=5 +Restart=always + +[Install] +WantedBy=default.target +.EE +.in +.PP +Create environment file +~/.config/pmgr/environment/ssh-proxy@myserver with contents: +.PP +.in +4n +.EX +TARGET=user@myserver +LOCAL_ADDR=127.0.0.1 +LOCAL_PORT=1080 +.EE +.in +.PP +In there 'mysserver' may be a domain name, SSH Hostname (set in ~/.ssh/config) +or IP address of remote server. + +Now you can enable your proxy with systemctl: +.PP +.in +4n +.EX +systemctl --user start ssh-proxy@myserver +.EE +.in +.PP +With pmgr: +.PP +.in +4n +.EX +pmgr -e ssh-proxy@myserver +.EE +.in + +.SH SEE ALSO +.PP +.BR systemctl (1), +.BR journalctl (1), +.BR systemd.special (7), +.PP +https://wiki.archlinux.org/title/systemd/User