28 Commits
Author SHA1 Message Date
bj 5a2ac0c3dc Attempt to fix broken PySocks Debian package dependency 2020-10-20 13:27:09 +02:00
bj 26d4444137 Revised README.md files to take Rudefox repo into account 2020-10-20 12:26:26 +02:00
bj 59ddc37cfd Incremented version number to 0.0.5 2020-10-20 12:25:35 +02:00
bj fe94fcc204 BUGFIX: onion urls were broken 2020-10-20 12:16:19 +02:00
bj a8b1029ad2 Can provision from the online Rudefox Debian repo 2020-10-20 10:49:38 +02:00
bj 32ee0ffe55 fixed up build-deb.sh 2020-10-20 10:25:31 +02:00
bj f31e9e62d7 fixed build by correcting typo in setup.cfg 2020-10-20 00:42:05 +02:00
bj 05c9ae8d6e Upgraded build system to setup.cfg 2020-10-20 00:27:38 +02:00
bj 64b9698010 Fixed PySocks (lack of) dependency and formatting 2020-10-20 00:20:33 +02:00
bj d9e68d50fe Upgraded setuptools version 2020-10-20 00:08:33 +02:00
bj 1c6da7a091 Added .gitignore for .idea 2020-10-20 00:08:17 +02:00
bj 609ccfbf27 Fixed bash script warnings 2020-10-20 00:07:57 +02:00
bj a78cddfdb1 Fixed broken comment 2020-10-20 00:07:36 +02:00
bj a38b6ee751 Fixed typo 2020-10-20 00:07:24 +02:00
bj f3677ad45e Incremented version to 0.0.4 2020-10-09 12:11:59 +02:00
bj ceb80569cb Debian dependency fixed (albeit in a hacky way for now...) Finally works through tor on RPi image 2020-10-09 11:59:31 +02:00
bj 72c6af328e Attempt 3 at solving dependency issue on pi 2020-10-09 01:42:36 +02:00
bj 54b1fe79a9 2nd attempt at fixing Debian packaging issue with paho-mqtt version for RPi 2020-10-09 01:16:14 +02:00
bj 19df7d2d35 Updated example Debian package 2020-10-09 00:17:54 +02:00
bj 1a4fceb89e Increment version to 0.0.3 2020-10-09 00:01:59 +02:00
bj fa3ad27146 BUGFIX: Require Python paho-mqtt package version >= 1.5.1 2020-10-09 00:01:38 +02:00
bj 21d8dbe1d1 Added updated example .deb package 2020-10-08 19:58:45 +02:00
bj 4a54459eab BUGFIX: Changelog changed to build package 2020-10-08 19:55:00 +02:00
bj 21665f976c Updated version to 0.0.2 2020-10-08 19:48:16 +02:00
bj a891f9bf51 Revomed redundant version number constant 2020-10-08 19:45:01 +02:00
bj fa24e56662 Deleted unnecessary file 2020-10-08 19:41:39 +02:00
bj c94962e2f1 Updated README.md 2020-10-08 15:25:08 +02:00
bj a9aca4da54 Moved build over to Python setuptools and Debian dh_python 2020-10-08 15:20:42 +02:00
42 changed files with 195 additions and 951 deletions
+2
View File
@@ -1,7 +1,9 @@
.vagrant .vagrant
build build
build_deb
venv venv
/dist/ /dist/
/*.egg-info /*.egg-info
*.pyc *.pyc
__pycache__ __pycache__
.idea
+16 -8
View File
@@ -13,7 +13,19 @@ A TORch solution consists of 3 processes:
* MQTT broker - Any MQTT broker, reachable via IPv4 or Tor, through TLS or insecure communications * MQTT broker - Any MQTT broker, reachable via IPv4 or Tor, through TLS or insecure communications
* `torch-subscriber` - Listens for and handles onion hostname publications * `torch-subscriber` - Listens for and handles onion hostname publications
## Build Debian Package ## Installation
### Install Package from Rudefox Debian Repo
1. Add the [Rudefox Repo](https://rudefox.io/repo/) as an `apt` source
2. Install the `torch-agent` package
```bash
sudo apt install torch-agent
```
### Build Debian Package from Source
If you don't already have a GPG key, generate one: If you don't already have a GPG key, generate one:
@@ -21,11 +33,11 @@ If you don't already have a GPG key, generate one:
gpg --full-generate-key gpg --full-generate-key
``` ```
Using the e-mail address you provided during GPG key generation, run `make-pkg.sh` to build a Debian package and install it Using the e-mail address you provided during GPG key generation, run `build-deb.sh` to build a Debian package and install it
```bash ```bash
./make-pkg.sh [email protected] ./build-deb.sh [email protected]
apt update && apt install build/torch-agent_0.0.1-1_all.deb apt update && apt install build/torch-agent_0.0.5-1_all.deb
``` ```
This will: This will:
@@ -45,7 +57,3 @@ The configuation directory can be specified by
A fully configured example can be found [here](example) A fully configured example can be found [here](example)
See the sample [`torch.conf`](torch.conf) file for additional configuration options and details See the sample [`torch.conf`](torch.conf) file for additional configuration options and details
## Roadmap
[ ] Utilize [dh_python3](https://www.debian.org/doc/manuals/debmake-doc/ch08.en.html#setup-py) in Debian package build
Executable
+34
View File
@@ -0,0 +1,34 @@
#!/bin/bash
if [[ -z "${DEB_EMAIL}" ]]; then
DEB_EMAIL="$1"
fi
if [[ -z "${DEB_EMAIL}" ]]; then
echo "E-mail address required for packaging signing with gpg key!"
echo "Usage: ./build-deb.sh EMAIL"
exit 1
fi
TORCH_VERSION=$(git describe --tags --abbrev=0)
PROJECT=torch-agent-$TORCH_VERSION
BUILD_DIR=dist
DEB_DIR=$BUILD_DIR/$PROJECT
rm -rf "${BUILD_DIR:?}"
mkdir -p "$DEB_DIR/src/etc/torch"
cp -r debian "$DEB_DIR/"
cp torch.conf "$DEB_DIR/src/etc/torch/"
pip3 install -r requirements.txt
python3 setup.py sdist
cd $BUILD_DIR || exit
tar -xzmf "$PROJECT.tar.gz"
cd "$PROJECT" || exit
export USER
USER=$(whoami)
dh_make --createorig -e "$DEB_EMAIL" -s -y
dpkg-buildpackage -k"$DEB_EMAIL"
-6
View File
@@ -1,6 +0,0 @@
torch-agent for Debian
---------------------
<possible notes regarding this package - if none, delete this file>
-- Benjamin Dweck <[email protected]> Tue, 06 Oct 2020 15:53:02 +0200
-10
View File
@@ -1,10 +0,0 @@
torch-agent for Debian
---------------------
<this file describes information about the source package, see Debian policy
manual section 4.14. You WILL either need to modify or delete this file>
-- Benjamin Dweck <[email protected]> Tue, 06 Oct 2020 15:53:02 +0200
+3 -3
View File
@@ -1,5 +1,5 @@
torch-agent (0.0.1-1) unstable; urgency=medium torch-agent (0.0.5-1) stable; urgency=medium
* Initial release * Update
-- Benjamin Dweck <[email protected]> Tue, 06 Oct 2020 15:53:02 +0200 -- Benjamin Dweck <[email protected]> Tue, 08 Oct 2020 19:46:22 +0200
+2
View File
@@ -0,0 +1,2 @@
11
+6 -4
View File
@@ -2,15 +2,17 @@ Source: torch-agent
Section: net Section: net
Priority: optional Priority: optional
Maintainer: Benjamin Dweck <[email protected]> Maintainer: Benjamin Dweck <[email protected]>
Build-Depends: debhelper-compat (= 12) Build-Depends: debhelper (>=11~), dh-python, python3-all
Standards-Version: 4.4.1 Standards-Version: 4.4.1
Homepage: https://rudefox.io Homepage: https://git.rudefox.io/bj/torch-agent
X-Python3-Version: >= 3.2
#Vcs-Browser: https://salsa.debian.org/debian/torch-agent #Vcs-Browser: https://salsa.debian.org/debian/torch-agent
#Vcs-Git: https://salsa.debian.org/debian/torch-agent.git Vcs-Git: https://git.rudefox.io/bj/torch-agent.git
Package: torch-agent Package: torch-agent
Architecture: all Architecture: all
Depends: ssh, tor, python3-pip, ${misc:Depends} Multi-Arch: foreign
Depends: ssh, tor, python3-pip, ${misc:Depends}, ${python3:Depends}
Description: TORch is a solution for creating an SSH-via-Tor Description: TORch is a solution for creating an SSH-via-Tor
backdoor on a remote device as a means of fallback remote backdoor on a remote device as a means of fallback remote
management and initial headless device configuration. management and initial headless device configuration.
+1 -1
View File
@@ -1,7 +1,7 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: torch-agent Upstream-Name: torch-agent
Upstream-Contact: [email protected] Upstream-Contact: [email protected]
Source: https://rudefox.io Source: https://git.rudefox.io/bj/torch-agent
Files: debian/* Files: debian/*
Copyright: 2020 Benjamin Dweck <[email protected]> Copyright: 2020 Benjamin Dweck <[email protected]>
-2
View File
@@ -1,2 +0,0 @@
torch-agent_0.0.1-1_all.deb net optional
torch-agent_0.0.1-1_amd64.buildinfo net optional
-56
View File
@@ -1,56 +0,0 @@
.\" Hey, EMACS: -*- nroff -*-
.\" (C) Copyright 2020 Benjamin Dweck <[email protected]>,
.\"
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH Torch-agent SECTION "October 6 2020"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
.\" .nh disable hyphenation
.\" .hy enable hyphenation
.\" .ad l left justify
.\" .ad b justify to both left and right margins
.\" .nf disable filling
.\" .fi enable filling
.\" .br insert line break
.\" .sp <n> insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.SH NAME
torch-agent \- program to do something
.SH SYNOPSIS
.B torch-agent
.RI [ options ] " files" ...
.br
.B bar
.RI [ options ] " files" ...
.SH DESCRIPTION
This manual page documents briefly the
.B torch-agent
and
.B bar
commands.
.PP
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
.\" respectively.
\fBtorch-agent\fP is a program that...
.SH OPTIONS
These programs follow the usual GNU command line syntax, with long
options starting with two dashes (`-').
A summary of options is included below.
For a complete description, see the Info files.
.TP
.B \-h, \-\-help
Show summary of options.
.TP
.B \-v, \-\-version
Show version of program.
.SH SEE ALSO
.BR bar (1),
.BR baz (1).
.br
The programs are documented fully by
.IR "The Rise and Fall of a Fooish Bar" ,
available via the Info system.
-154
View File
@@ -1,154 +0,0 @@
<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
<!-- Process this file with docbook-to-man to generate an nroff manual
page: `docbook-to-man manpage.sgml > manpage.1'. You may view
the manual page with: `docbook-to-man manpage.sgml | nroff -man |
less'. A typical entry in a Makefile or Makefile.am is:
manpage.1: manpage.sgml
docbook-to-man $< > $@
The docbook-to-man binary is found in the docbook-to-man package.
Please remember that if you create the nroff version in one of the
debian/rules file targets (such as build), you will need to include
docbook-to-man in your Build-Depends control field.
-->
<!-- Fill in your name for FIRSTNAME and SURNAME. -->
<!ENTITY dhfirstname "<firstname>FIRSTNAME</firstname>">
<!ENTITY dhsurname "<surname>SURNAME</surname>">
<!-- Please adjust the date whenever revising the manpage. -->
<!ENTITY dhdate "<date>October 6 2020</date>">
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are
allowed: see man(7), man(1). -->
<!ENTITY dhsection "<manvolnum>SECTION</manvolnum>">
<!ENTITY dhemail "<email>[email protected]</email>">
<!ENTITY dhusername "Benjamin Dweck">
<!ENTITY dhucpackage "<refentrytitle>Torch-agent</refentrytitle>">
<!ENTITY dhpackage "torch-agent">
<!ENTITY debian "<productname>Debian</productname>">
<!ENTITY gnu "<acronym>GNU</acronym>">
<!ENTITY gpl "&gnu; <acronym>GPL</acronym>">
]>
<refentry>
<refentryinfo>
<address>
&dhemail;
</address>
<author>
&dhfirstname;
&dhsurname;
</author>
<copyright>
<year>2003</year>
<holder>&dhusername;</holder>
</copyright>
&dhdate;
</refentryinfo>
<refmeta>
&dhucpackage;
&dhsection;
</refmeta>
<refnamediv>
<refname>&dhpackage;</refname>
<refpurpose>program to do something</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>&dhpackage;</command>
<arg><option>-e <replaceable>this</replaceable></option></arg>
<arg><option>--example <replaceable>that</replaceable></option></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
<title>DESCRIPTION</title>
<para>This manual page documents briefly the
<command>&dhpackage;</command> and <command>bar</command>
commands.</para>
<para>This manual page was written for the &debian; distribution
because the original program does not have a manual page.
Instead, it has documentation in the &gnu;
<application>Info</application> format; see below.</para>
<para><command>&dhpackage;</command> is a program that...</para>
</refsect1>
<refsect1>
<title>OPTIONS</title>
<para>These programs follow the usual &gnu; command line syntax,
with long options starting with two dashes (`-'). A summary of
options is included below. For a complete description, see the
<application>Info</application> files.</para>
<variablelist>
<varlistentry>
<term><option>-h</option>
<option>--help</option>
</term>
<listitem>
<para>Show summary of options.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-v</option>
<option>--version</option>
</term>
<listitem>
<para>Show version of program.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>SEE ALSO</title>
<para>bar (1), baz (1).</para>
<para>The programs are documented fully by <citetitle>The Rise and
Fall of a Fooish Bar</citetitle> available via the
<application>Info</application> system.</para>
</refsect1>
<refsect1>
<title>AUTHOR</title>
<para>This manual page was written by &dhusername; &dhemail; for
the &debian; system (and may be used by others). Permission is
granted to copy, distribute and/or modify this document under
the terms of the &gnu; General Public License, Version 2 any
later version published by the Free Software Foundation.
</para>
<para>
On Debian systems, the complete text of the GNU General Public
License can be found in /usr/share/common-licenses/GPL.
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:2
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:nil
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
-291
View File
@@ -1,291 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!--
`xsltproc -''-nonet \
-''-param man.charmap.use.subset "0" \
-''-param make.year.ranges "1" \
-''-param make.single.year.ranges "1" \
/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl \
manpage.xml'
A manual page <package>.<section> will be generated. You may view the
manual page with: nroff -man <package>.<section> | less'. A typical entry
in a Makefile or Makefile.am is:
DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl
XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
manpage.1: manpage.xml
$(XP) $(DB2MAN) $<
The xsltproc binary is found in the xsltproc package. The XSL files are in
docbook-xsl. A description of the parameters you can use can be found in the
docbook-xsl-doc-* packages. Please remember that if you create the nroff
version in one of the debian/rules file targets (such as build), you will need
to include xsltproc and docbook-xsl in your Build-Depends control field.
Alternatively use the xmlto command/package. That will also automatically
pull in xsltproc and docbook-xsl.
Notes for using docbook2x: docbook2x-man does not automatically create the
AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
<refsect1> ... </refsect1>.
To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
found in the docbook-xsl-doc-html package.
Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
General documentation about man-pages and man-page-formatting:
man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
-->
<!-- Fill in your name for FIRSTNAME and SURNAME. -->
<!ENTITY dhfirstname "FIRSTNAME">
<!ENTITY dhsurname "SURNAME">
<!-- dhusername could also be set to "&dhfirstname; &dhsurname;". -->
<!ENTITY dhusername "Benjamin Dweck">
<!ENTITY dhemail "[email protected]">
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are
allowed: see man(7), man(1) and
http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
<!ENTITY dhsection "SECTION">
<!-- TITLE should be something like "User commands" or similar (see
http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
<!ENTITY dhtitle "torch-agent User Manual">
<!ENTITY dhucpackage "Torch-agent">
<!ENTITY dhpackage "torch-agent">
]>
<refentry>
<refentryinfo>
<title>&dhtitle;</title>
<productname>&dhpackage;</productname>
<authorgroup>
<author>
<firstname>&dhfirstname;</firstname>
<surname>&dhsurname;</surname>
<contrib>Wrote this manpage for the Debian system.</contrib>
<address>
<email>&dhemail;</email>
</address>
</author>
</authorgroup>
<copyright>
<year>2007</year>
<holder>&dhusername;</holder>
</copyright>
<legalnotice>
<para>This manual page was written for the Debian system
(and may be used by others).</para>
<para>Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License,
Version 2 or (at your option) any later version published by
the Free Software Foundation.</para>
<para>On Debian systems, the complete text of the GNU General Public
License can be found in
<filename>/usr/share/common-licenses/GPL</filename>.</para>
</legalnotice>
</refentryinfo>
<refmeta>
<refentrytitle>&dhucpackage;</refentrytitle>
<manvolnum>&dhsection;</manvolnum>
</refmeta>
<refnamediv>
<refname>&dhpackage;</refname>
<refpurpose>program to do something</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>&dhpackage;</command>
<!-- These are several examples, how syntaxes could look -->
<arg choice="plain"><option>-e <replaceable>this</replaceable></option></arg>
<arg choice="opt"><option>--example=<parameter>that</parameter></option></arg>
<arg choice="opt">
<group choice="req">
<arg choice="plain"><option>-e</option></arg>
<arg choice="plain"><option>--example</option></arg>
</group>
<replaceable class="option">this</replaceable>
</arg>
<arg choice="opt">
<group choice="req">
<arg choice="plain"><option>-e</option></arg>
<arg choice="plain"><option>--example</option></arg>
</group>
<group choice="req">
<arg choice="plain"><replaceable>this</replaceable></arg>
<arg choice="plain"><replaceable>that</replaceable></arg>
</group>
</arg>
</cmdsynopsis>
<cmdsynopsis>
<command>&dhpackage;</command>
<!-- Normally the help and version options make the programs stop
right after outputting the requested information. -->
<group choice="opt">
<arg choice="plain">
<group choice="req">
<arg choice="plain"><option>-h</option></arg>
<arg choice="plain"><option>--help</option></arg>
</group>
</arg>
<arg choice="plain">
<group choice="req">
<arg choice="plain"><option>-v</option></arg>
<arg choice="plain"><option>--version</option></arg>
</group>
</arg>
</group>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1 id="description">
<title>DESCRIPTION</title>
<para>This manual page documents briefly the
<command>&dhpackage;</command> and <command>bar</command>
commands.</para>
<para>This manual page was written for the Debian distribution
because the original program does not have a manual page.
Instead, it has documentation in the GNU <citerefentry>
<refentrytitle>info</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry> format; see below.</para>
<para><command>&dhpackage;</command> is a program that...</para>
</refsect1>
<refsect1 id="options">
<title>OPTIONS</title>
<para>The program follows the usual GNU command line syntax,
with long options starting with two dashes (`-'). A summary of
options is included below. For a complete description, see the
<citerefentry>
<refentrytitle>info</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry> files.</para>
<variablelist>
<!-- Use the variablelist.term.separator and the
variablelist.term.break.after parameters to
control the term elements. -->
<varlistentry>
<term><option>-e <replaceable>this</replaceable></option></term>
<term><option>--example=<replaceable>that</replaceable></option></term>
<listitem>
<para>Does this and that.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-h</option></term>
<term><option>--help</option></term>
<listitem>
<para>Show summary of options.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-v</option></term>
<term><option>--version</option></term>
<listitem>
<para>Show version of program.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="files">
<title>FILES</title>
<variablelist>
<varlistentry>
<term><filename>/etc/foo.conf</filename></term>
<listitem>
<para>The system-wide configuration file to control the
behaviour of <application>&dhpackage;</application>. See
<citerefentry>
<refentrytitle>foo.conf</refentrytitle>
<manvolnum>5</manvolnum>
</citerefentry> for further details.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><filename>${HOME}/.foo.conf</filename></term>
<listitem>
<para>The per-user configuration file to control the
behaviour of <application>&dhpackage;</application>. See
<citerefentry>
<refentrytitle>foo.conf</refentrytitle>
<manvolnum>5</manvolnum>
</citerefentry> for further details.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="environment">
<title>ENVIRONMENT</title>
<variablelist>
<varlistentry>
<term><envar>FOO_CONF</envar></term>
<listitem>
<para>If used, the defined file is used as configuration
file (see also <xref linkend="files"/>).</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="diagnostics">
<title>DIAGNOSTICS</title>
<para>The following diagnostics may be issued
on <filename class="devicefile">stderr</filename>:</para>
<variablelist>
<varlistentry>
<term><errortext>Bad configuration file. Exiting.</errortext></term>
<listitem>
<para>The configuration file seems to contain a broken configuration
line. Use the <option>--verbose</option> option, to get more info.
</para>
</listitem>
</varlistentry>
</variablelist>
<para><command>&dhpackage;</command> provides some return codes, that can
be used in scripts:</para>
<segmentedlist>
<segtitle>Code</segtitle>
<segtitle>Diagnostic</segtitle>
<seglistitem>
<seg><errorcode>0</errorcode></seg>
<seg>Program exited successfully.</seg>
</seglistitem>
<seglistitem>
<seg><errorcode>1</errorcode></seg>
<seg>The configuration file seems to be broken.</seg>
</seglistitem>
</segmentedlist>
</refsect1>
<refsect1 id="bugs">
<!-- Or use this section to tell about upstream BTS. -->
<title>BUGS</title>
<para>The program is currently limited to only work
with the <package>foobar</package> library.</para>
<para>The upstreams <acronym>BTS</acronym> can be found
at <ulink url="http://bugzilla.foo.tld"/>.</para>
</refsect1>
<refsect1 id="see_also">
<title>SEE ALSO</title>
<!-- In alpabetical order. -->
<para><citerefentry>
<refentrytitle>bar</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry>, <citerefentry>
<refentrytitle>baz</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry>, <citerefentry>
<refentrytitle>foo.conf</refentrytitle>
<manvolnum>5</manvolnum>
</citerefentry></para>
<para>The programs are documented fully by <citetitle>The Rise and
Fall of a Fooish Bar</citetitle> available via the <citerefentry>
<refentrytitle>info</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry> system.</para>
</refsect1>
</refentry>
+2 -1
View File
@@ -53,9 +53,10 @@ case "$1" in
useradd -r -g $GROUP $USER useradd -r -g $GROUP $USER
fi fi
sudo -H pip3 install 'paho-mqtt>=1.5.1'
chown $USER /etc/torch chown $USER /etc/torch
chown $USER /etc/torch/torch.conf chown $USER /etc/torch/torch.conf
chown $USER /usr/share/torch-agent/torch-agent.py
configure_tor_controller configure_tor_controller
;; ;;
+1 -1
View File
@@ -23,7 +23,7 @@ USER="torch"
case "$1" in case "$1" in
purge|abort-install) purge|abort-install)
rm -rf /etc/torch rm -rf /etc/torch
rm -f /usr/share/torch-agent/torch-agent.py
if [ -x "$(command -v deluser)" ]; then if [ -x "$(command -v deluser)" ]; then
deluser --quiet --system $USER > /dev/null || true deluser --quiet --system $USER > /dev/null || true
else else
-3
View File
@@ -16,10 +16,7 @@ set -e
case "$1" in case "$1" in
install|upgrade) install|upgrade)
sudo -H pip3 install stem paho-mqtt PySocks
mkdir -p /etc/torch mkdir -p /etc/torch
mkdir -p /usr/share/torch-agent
;; ;;
abort-upgrade) abort-upgrade)
-38
View File
@@ -1,38 +0,0 @@
#!/bin/sh
# prerm script for torch-agent
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <prerm> `remove'
# * <old-prerm> `upgrade' <new-version>
# * <new-prerm> `failed-upgrade' <old-version>
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see https://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|upgrade|deconfigure)
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0
+1
View File
@@ -0,0 +1 @@
OthermoduleName python-othermodule; PEP386
+3 -1
View File
@@ -13,9 +13,11 @@
# package maintainers to append LDFLAGS # package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
export PYBUILD_NAME=torch-agent
export PYBUILD_SYSTEM=distutils
%: %:
dh $@ dh $@ --with python3 --buildsystem=pybuild
override_dh_installsystemd: override_dh_installsystemd:
dh_installsystemd --no-start --no-enable dh_installsystemd --no-start --no-enable
-11
View File
@@ -1,11 +0,0 @@
# For more information on what jobs are run see:
# https://salsa.debian.org/salsa-ci-team/pipeline
#
# To enable the jobs, go to your repository (at salsa.debian.org)
# and click over Settings > CI/CD > Expand (in General pipelines).
# In "Custom CI config path" write debian/salsa-ci.yml and click
# in "Save Changes". The CI tests will run after the next commit.
---
include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
-2
View File
@@ -1,2 +0,0 @@
src/usr/share/torch-agent/torch-agent.py
src/etc/torch/torch.conf
-19
View File
@@ -1,19 +0,0 @@
[tor]
ProxyPort = 9050
ControllerPort = 9051
[ssh]
Port = 22
[mqtt]
BrokerHost = mqtt.example.com # OR example1i3uyrbfoi3fi.onion
BrokerPort = 1883
ClientID = my-client
Topic = example/topic
### Options for Using TLS
#RequireCertificate = true
#CaFile = ca.crt
#CertFile = client.crt
#KeyFile = client.key
-98
View File
@@ -1,98 +0,0 @@
from stem.control import Controller
import stem.connection
import paho.mqtt.client as mqtt
import ssl
import socks
import socket
import json
import configparser
import argparse
from datetime import datetime
from os import environ
parser = argparse.ArgumentParser(description='Broadcast SSH hidden service hostname via MQTT')
parser.add_argument('--config-dir', nargs='?', dest='configPath', default='/etc/torch',
help='configuration directory (default: /etc/torch)')
args = parser.parse_args()
configPath = args.configPath
if "TORCH_CONFIG_DIR" in environ:
configPath = environ.get("TORCH_CONFIG_DIR")
if not configPath.endswith("/"):
configPath = configPath + "/"
print("Using torch configuration path: " + configPath)
config = configparser.ConfigParser()
config.read(configPath + "torch.conf")
torProxyPort = config['tor'].getint('ProxyPort', fallback = 9050)
torControllerPort = config['tor'].getint('ControllerPort', fallback = 9051)
sshPort = config['ssh'].getint('Port', fallback = 22)
mqttConfig = config['mqtt']
mqttBrokerHost = mqttConfig.get('BrokerHost', fallback = "localhost")
mqttBrokerPort = mqttConfig.getint('BrokerPort', fallback = 1883)
clientID = mqttConfig.get('ClientID', fallback = socket.gethostname())
mqttTopic = mqttConfig.get('Topic', fallback = "torch/%s/onion_url" % (clientID))
mqttRequireCertificate = mqttConfig.getboolean(
'RequireCertificate',
fallback = False)
mqttCaFile = configPath + mqttConfig.get('CaFile')
mqttCertFile = configPath + mqttConfig.get('CertFile')
mqttKeyFile = configPath + mqttConfig.get('KeyFile')
with Controller.from_port(port = torControllerPort) as controller:
protocolInfo = stem.connection.get_protocolinfo(controller)
stem.connection.authenticate_safecookie(
controller,
protocolInfo.cookie_path)
print("Connected to Tor on port %s" % (torControllerPort))
service = controller.create_ephemeral_hidden_service(
sshPort,
detached = True)
onionAddress = "%s.onion" % (service.service_id)
print("Created Tor Hidden Service for local port %s at %s" % (sshPort, onionAddress))
payload = {
'clientId': clientID,
'timestamp': datetime.now().strftime("%d-%b-%Y (%H:%M:%S.%f)"),
'onionAddress': onionAddress,
'sshPort': sshPort
}
client = mqtt.Client()
protocol = "mqtt"
if mqttRequireCertificate:
client.tls_set(
ca_certs = mqttCaFile,
certfile = mqttCertFile,
keyfile = mqttKeyFile,
cert_reqs=ssl.CERT_REQUIRED)
protocol = "mqtts"
if mqttBrokerHost.endswith(".onion"):
client.proxy_set(proxy_type=socks.SOCKS5, proxy_addr="localhost", proxy_port=torProxyPort)
client.tls_insecure_set(True)
client.connect(mqttBrokerHost, mqttBrokerPort, 60)
client.publish(mqttTopic, json.dumps(payload))
print("Connected to MQTT Broker at %s://%s:%s/%s" % (protocol, mqttBrokerHost, mqttBrokerPort, mqttTopic))
print("Published payload: " + json.dumps(payload))
client.disconnect()
print("Disconnected from MQTT Broker")
-2
View File
@@ -1,2 +0,0 @@
README.Debian
README.source
-4
View File
@@ -1,4 +0,0 @@
#
# Regular cron jobs for the torch-agent package
#
0 4 * * * root [ -x /usr/bin/torch-agent_maintenance ] && /usr/bin/torch-agent_maintenance
-1
View File
@@ -1 +0,0 @@
dh_installsystemd
-20
View File
@@ -1,20 +0,0 @@
Document: torch-agent
Title: Debian torch-agent Manual
Author: <insert document author here>
Abstract: This manual describes what torch-agent is
and how it can be used to
manage online manuals on Debian systems.
Section: unknown
Format: debiandoc-sgml
Files: /usr/share/doc/torch-agent/torch-agent.sgml.gz
Format: postscript
Files: /usr/share/doc/torch-agent/torch-agent.ps.gz
Format: text
Files: /usr/share/doc/torch-agent/torch-agent.text.gz
Format: HTML
Index: /usr/share/doc/torch-agent/html/index.html
Files: /usr/share/doc/torch-agent/html/*.html
-1
View File
@@ -1,2 +1 @@
src/usr/share/torch-agent /usr/share/
src/etc/torch /etc/ src/etc/torch /etc/
-19
View File
@@ -1,19 +0,0 @@
# Automatically added by dh_installsystemd/12.10ubuntu1
if [ -d /run/systemd/system ]; then
systemctl --system daemon-reload >/dev/null || true
fi
# End automatically added section
# Automatically added by dh_installsystemd/12.10ubuntu1
if [ "$1" = "remove" ]; then
if [ -x "/usr/bin/deb-systemd-helper" ]; then
deb-systemd-helper mask 'torch-agent.service' >/dev/null || true
fi
fi
if [ "$1" = "purge" ]; then
if [ -x "/usr/bin/deb-systemd-helper" ]; then
deb-systemd-helper purge 'torch-agent.service' >/dev/null || true
deb-systemd-helper unmask 'torch-agent.service' >/dev/null || true
fi
fi
# End automatically added section
+1 -1
View File
@@ -5,7 +5,7 @@ Requires=tor.service ssh.service
[Service] [Service]
Environment=PYTHONUNBUFFERED=1 Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /usr/share/torch-agent/torch-agent.py ExecStart=/usr/bin/torch-agent
User=torch User=torch
Group=debian-tor Group=debian-tor
-38
View File
@@ -1,38 +0,0 @@
# Example watch control file for uscan
# Rename this file to "watch" and then you can run the "uscan" command
# to check for upstream updates and more.
# See uscan(1) for format
# Compulsory line, this is a version 4 file
version=4
# PGP signature mangle, so foo.tar.gz has foo.tar.gz.sig
#opts="pgpsigurlmangle=s%$%.sig%"
# HTTP site (basic)
#http://example.com/downloads.html \
# files/torch-agent-([\d\.]+)\.tar\.gz debian uupdate
# Uncomment to examine an FTP server
#ftp://ftp.example.com/pub/torch-agent-(.*)\.tar\.gz debian uupdate
# SourceForge hosted projects
# http://sf.net/torch-agent/ torch-agent-(.*)\.tar\.gz debian uupdate
# GitHub hosted projects
#opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%<project>-$1.tar.gz%" \
# https://github.com/<user>/torch-agent/tags \
# (?:.*?/)?v?(\d[\d.]*)\.tar\.gz debian uupdate
# PyPI
# https://pypi.debian.net/torch-agent/torch-agent-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))
# Direct Git
# opts="mode=git" http://git.example.com/torch-agent.git \
# refs/tags/v([\d\.]+) debian uupdate
# Uncomment to find new files on GooglePages
# http://example.googlepages.com/foo.html torch-agent-(.*)\.tar\.gz
-9
View File
@@ -35,15 +35,6 @@ In a separate terminal window, run the subscriber:
#### Run TORch Agent in Vagrant #### Run TORch Agent in Vagrant
[Build](..) the latest source into a Debian package and copy it to `example/`
```bash
cd ..
./make-pkg.sh [email protected]
cp -f build/torch-agent_0.0.1-1_all.deb example/
cd example
```
Run the Vagrant box in a third terminal window: Run the Vagrant box in a third terminal window:
```bash ```bash
+4 -2
View File
@@ -64,7 +64,6 @@ Vagrant.configure("2") do |config|
# Ansible, Chef, Docker, Puppet and Salt are also available. Please see the # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
# documentation for more information about their specific syntax and use. # documentation for more information about their specific syntax and use.
config.vm.provision "file", source: "torch-agent_0.0.1-1_all.deb", destination: "~/"
config.vm.provision "file", source: "agent-config", destination: "~/torch-conf" config.vm.provision "file", source: "agent-config", destination: "~/torch-conf"
config.vm.provision "shell", inline: <<-SHELL config.vm.provision "shell", inline: <<-SHELL
@@ -72,7 +71,10 @@ Vagrant.configure("2") do |config|
sudo -- sh -c "echo '10.0.2.2 mqtt.example.com' >> /etc/hosts" sudo -- sh -c "echo '10.0.2.2 mqtt.example.com' >> /etc/hosts"
sudo apt update sudo apt update
sudo apt install -y ./torch-agent_0.0.1-1_all.deb wget -qO - https://rudefox.io/repo/gpg | sudo apt-key add
sudo add-apt-repository "deb https://repo.rudefox.io/repository/apt-release focal main"
sudo apt update
sudo apt install -y torch-agent
sudo cp -f torch-conf/* /etc/torch/ sudo cp -f torch-conf/* /etc/torch/
sudo chown -R torch /etc/torch sudo chown -R torch /etc/torch
Binary file not shown.
-34
View File
@@ -1,34 +0,0 @@
#!/bin/bash
if [[ -z "${DEBEMAIL}" ]]; then
DEBEMAIL="$1"
fi
if [[ -z "${DEBEMAIL}" ]]; then
echo "E-mail address required for packaging signing with gpg key!"
echo "Usage: ./make-pkg.sh EMAIL"
exit 1
fi
TORCH_VERSION=$(git describe --tags)
DEBIAN_PKG=torch-agent-$TORCH_VERSION
PKG_ROOT=build/$DEBIAN_PKG
rf -rf $PKG_ROOT
mkdir -p $PKG_ROOT
cp -r debian $PKG_ROOT
mkdir -p $PKG_ROOT/src/etc/torch
cp torch.conf $PKG_ROOT/src/etc/torch/
mkdir -p $PKG_ROOT/src/usr/share/torch-agent
cp torch-agent.py $PKG_ROOT/src/usr/share/torch-agent/
cp torch-agent.service $PKG_ROOT/debian/
cd $PKG_ROOT
export USER=`whoami`
dh_make --createorig -e $DEBEMAIL -s -y
dpkg-buildpackage -k$DEBEMAIL
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
+5 -4
View File
@@ -1,5 +1,6 @@
wheel>=0.35.1 pip~=20.2.4
setuptools>=44.0.0 setuptools~=50.3.2
stdeb3~=0.9.0.post2
paho-mqtt~=1.5.1
stem>=1.8.0 stem>=1.8.0
paho-mqtt>=1.5.1 PySocks
PySocks>=1.7.1
+25
View File
@@ -0,0 +1,25 @@
[metadata]
name = torch-agent
version = attr: torch_agent.__version__
author = Benjamin Dweck
author_email = [email protected]
description = TORch: Illuminate the Way to your Node
url = https://git.rudefox.io/bj/torch-agent
classifiers =
Programming Language :: Python :: 3
License :: OSI Approved :: MIT License
[options]
packages = find:
install_requires =
paho-mqtt~=1.5.1
setuptools~=50.3.1
pip~=20.2.3
stem
PySocks
[options.entry_points]
console_scripts = torch-agent=torch_agent.torch_agent:main
[options.packages.find]
exclude=test
+2 -28
View File
@@ -1,30 +1,4 @@
#!/usr/bin/env python3
import setuptools import setuptools
with open("README.md", "r") as fh: setuptools.setup()
long_description = fh.read()
setuptools.setup(
name="torch-agent",
version="0.0.1",
author="B.J. Dweck",
author_email="[email protected]",
description="TORch: Iluminate the Way to your Node",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://git.rudefox.io/bj/torch-agent",
packages=setuptools.find_packages(),
install_requires=[
'stem',
'paho-mqtt',
'PySocks',
],
entry_points = {
'console_scripts': ['torch-agent=torch_agent.torch_agent:main'],
},
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
],
python_requires='>=3.6',
)
+5 -1
View File
@@ -6,7 +6,10 @@ ControllerPort = 9051
Port = 22 Port = 22
[mqtt] [mqtt]
BrokerHost = mqtt.example.com # OR example1i3uyrbfoi3fi.onion
BrokerHost = mqtt.example.com
#BrokerHost = example1i3uyrbfoi3fi.onion
BrokerPort = 1883 BrokerPort = 1883
ClientID = my-client ClientID = my-client
Topic = example/topic Topic = example/topic
@@ -17,3 +20,4 @@ Topic = example/topic
#CaFile = ca.crt #CaFile = ca.crt
#CertFile = client.crt #CertFile = client.crt
#KeyFile = client.key #KeyFile = client.key
+1 -1
View File
@@ -1 +1 @@
__version__ = "0.0.1" __version__ = "0.0.5"
+40 -39
View File
@@ -1,8 +1,8 @@
from stem.control import Controller from stem.control import Controller
import stem.connection import stem.connection
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
import ssl
import socks import socks
import ssl
import socket import socket
import json import json
import configparser import configparser
@@ -10,6 +10,7 @@ import argparse
from datetime import datetime from datetime import datetime
from os import environ from os import environ
def main(): def main():
parser = argparse.ArgumentParser(description='Broadcast SSH hidden service hostname via MQTT') parser = argparse.ArgumentParser(description='Broadcast SSH hidden service hostname via MQTT')
@@ -18,79 +19,79 @@ def main():
args = parser.parse_args() args = parser.parse_args()
configPath = args.configPath config_path = args.configPath
if "TORCH_CONFIG_DIR" in environ: if "TORCH_CONFIG_DIR" in environ:
configPath = environ.get("TORCH_CONFIG_DIR") config_path = environ.get("TORCH_CONFIG_DIR")
if not configPath.endswith("/"): if not config_path.endswith("/"):
configPath = configPath + "/" config_path = config_path + "/"
print("Using torch configuration path: " + configPath) print("Using torch configuration path: " + config_path)
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read(configPath + "torch.conf") config.read(config_path + "torch.conf")
torProxyPort = config['tor'].getint('ProxyPort', fallback = 9050) tor_proxy_port = config['tor'].getint('ProxyPort', fallback=9050)
torControllerPort = config['tor'].getint('ControllerPort', fallback = 9051) tor_controller_port = config['tor'].getint('ControllerPort', fallback=9051)
sshPort = config['ssh'].getint('Port', fallback = 22) ssh_port = config['ssh'].getint('Port', fallback=22)
mqttConfig = config['mqtt'] mqtt_config = config['mqtt']
mqttBrokerHost = mqttConfig.get('BrokerHost', fallback = "localhost") mqtt_broker_host = mqtt_config.get('BrokerHost', fallback="localhost")
mqttBrokerPort = mqttConfig.getint('BrokerPort', fallback = 1883) mqtt_broker_port = mqtt_config.getint('BrokerPort', fallback=1883)
clientID = mqttConfig.get('ClientID', fallback = socket.gethostname()) client_id = mqtt_config.get('ClientID', fallback=socket.gethostname())
mqttTopic = mqttConfig.get('Topic', fallback = "torch/%s/onion_url" % (clientID)) mqtt_topic = mqtt_config.get('Topic', fallback="torch/%s/onion_url" % client_id)
mqttRequireCertificate = mqttConfig.getboolean( mqtt_require_certificate = mqtt_config.getboolean(
'RequireCertificate', 'RequireCertificate',
fallback = False) fallback=False)
mqttCaFile = configPath + mqttConfig.get('CaFile') mqtt_ca_file = config_path + mqtt_config.get('CaFile')
mqttCertFile = configPath + mqttConfig.get('CertFile') mqtt_cert_file = config_path + mqtt_config.get('CertFile')
mqttKeyFile = configPath + mqttConfig.get('KeyFile') mqtt_key_file = config_path + mqtt_config.get('KeyFile')
with Controller.from_port(port = torControllerPort) as controller: with Controller.from_port(port=tor_controller_port) as controller:
protocolInfo = stem.connection.get_protocolinfo(controller) protocol_info = stem.connection.get_protocolinfo(controller)
stem.connection.authenticate_safecookie( stem.connection.authenticate_safecookie(
controller, controller,
protocolInfo.cookie_path) protocol_info.cookie_path)
print("Connected to Tor on port %s" % (torControllerPort)) print("Connected to Tor on port %s" % tor_controller_port)
service = controller.create_ephemeral_hidden_service(sshPort, detached = True) service = controller.create_ephemeral_hidden_service(ssh_port, detached=True)
onionAddress = "%s.onion" % (service.service_id) onion_address = "%s.onion" % service.service_id
print("Created Tor Hidden Service for local port %s at %s" % (sshPort, onionAddress)) print("Created Tor Hidden Service for local port %s at %s" % (ssh_port, onion_address))
payload = { payload = {
'clientId': clientID, 'clientId': client_id,
'timestamp': datetime.now().strftime("%d-%b-%Y (%H:%M:%S.%f)"), 'timestamp': datetime.now().strftime("%d-%b-%Y (%H:%M:%S.%f)"),
'onionAddress': onionAddress, 'onionAddress': onion_address,
'sshPort': sshPort 'sshPort': ssh_port
} }
client = mqtt.Client() client = mqtt.Client()
protocol = "mqtt" protocol = "mqtt"
if mqttRequireCertificate: if mqtt_require_certificate:
client.tls_set( client.tls_set(
ca_certs = mqttCaFile, ca_certs=mqtt_ca_file,
certfile = mqttCertFile, certfile=mqtt_cert_file,
keyfile = mqttKeyFile, keyfile=mqtt_key_file,
cert_reqs=ssl.CERT_REQUIRED) cert_reqs=ssl.CERT_REQUIRED)
protocol = "mqtts" protocol = "mqtts"
if mqttBrokerHost.endswith(".onion"): if mqtt_broker_host.endswith(".onion"):
client.proxy_set(proxy_type=socks.SOCKS5, proxy_addr="localhost", proxy_port=torProxyPort) client.proxy_set(proxy_type=socks.SOCKS5, proxy_addr="localhost", proxy_port=tor_proxy_port)
client.tls_insecure_set(True) client.tls_insecure_set(True)
client.connect(mqttBrokerHost, mqttBrokerPort, 60) client.connect(mqtt_broker_host, mqtt_broker_port, 60)
client.publish(mqttTopic, json.dumps(payload)) client.publish(mqtt_topic, json.dumps(payload))
print("Connected to MQTT Broker at %s://%s:%s/%s" % (protocol, mqttBrokerHost, mqttBrokerPort, mqttTopic)) print("Connected to MQTT Broker at %s://%s:%s/%s" % (protocol, mqtt_broker_host, mqtt_broker_port, mqtt_topic))
print("Published payload: " + json.dumps(payload)) print("Published payload: " + json.dumps(payload))
client.disconnect() client.disconnect()