commit 5fcdb763a59968a543e57eeda9a27d9a6bf09e62 Author: Thomas Legay Date: Sat Feb 20 22:15:06 2021 +0100 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d83f46a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +alldebfiles +repository diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/make b/make new file mode 100755 index 0000000..8739032 --- /dev/null +++ b/make @@ -0,0 +1,19 @@ +#!/bin/bash +PROJECT=$1 +if [ -d src/$PROJECT ] && [ "$1" != "" ] +then + echo Projet $PROJECT +else + ls src/ + read -p"list " PROJECT +fi + +VERSION=$(cat src/$PROJECT/DEBIAN/control | grep -i "version:" | cut -d " " -f 2) +NEW_VERSION=$(echo $VERSION | awk 'BEGIN { FS="." } { $2++; if ($2 > 99) { $2=0; $1++ } } { printf "%d.%02d\n", $1, $2 }') + +sed -i -e "s/$(echo $VERSION)/$(echo $NEW_VERSION)/" src/$PROJECT/DEBIAN/control + +fakeroot dpkg-deb -Z gzip --build src/$PROJECT alldebfiles/$PROJECT.deb +reprepro --ask-passphrase -Vb repository/ remove tools ${PROJECT%.*} +reprepro --ask-passphrase -Vb repository/ includedeb tools alldebfiles/$PROJECT.deb +rsync --delete -av -e "ssh -A -J lgy.fr " repository/* deb.net.lgy.fr:/var/www/html/ diff --git a/src/2sman-client/DEBIAN/changelog b/src/2sman-client/DEBIAN/changelog new file mode 100644 index 0000000..e9e6569 --- /dev/null +++ b/src/2sman-client/DEBIAN/changelog @@ -0,0 +1,5 @@ +2sman-client (1.0) stable; urgency=low + + * Create + + -- Legay Thomas mar. 28 avril 2020 10:55 diff --git a/src/2sman-client/DEBIAN/control b/src/2sman-client/DEBIAN/control new file mode 100644 index 0000000..4982b3a --- /dev/null +++ b/src/2sman-client/DEBIAN/control @@ -0,0 +1,7 @@ +Package: 2sman-client +Version: 1.04 +Section: base +Priority: optional +Architecture: all +Maintainer: Thomas Legay +Description: Package 2smanclient diff --git a/src/2sman-client/etc/2sman/client/README b/src/2sman-client/etc/2sman/client/README new file mode 100644 index 0000000..07a1fde --- /dev/null +++ b/src/2sman-client/etc/2sman/client/README @@ -0,0 +1 @@ +cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 255 | head -n 1 > /etc/2sman/client/key diff --git a/src/2sman-client/etc/2sman/client/devices/device.conf.exemple b/src/2sman-client/etc/2sman/client/devices/device.conf.exemple new file mode 100644 index 0000000..702fe47 --- /dev/null +++ b/src/2sman-client/etc/2sman/client/devices/device.conf.exemple @@ -0,0 +1,5 @@ +#Change default server +#SERVER=http://192.168.24.191:8080 +everytime system.mountpoint.freespace +everytime system.uptime +everytime system.temp diff --git a/src/2sman-client/etc/2sman/client/key b/src/2sman-client/etc/2sman/client/key new file mode 100644 index 0000000..9f1c22c --- /dev/null +++ b/src/2sman-client/etc/2sman/client/key @@ -0,0 +1 @@ +i6ugWyYjhTIhYRa3SgFmXUIoAGQD1UXCemgk95xx9F1OeWdCP79zAefQgNTOkRkmEX8vjBDJGi450p6sHwPEBLCBmjUJZ5aNdWYRoUTZgK0celPDqKVOjTZTw916KZ4xQVYmihJXi5LmrZd68ae51KN05hOpBGiPafyIXYD75MwZyN1tW1PIa4mj3ryoKB1wVnVK270VCZgOPnTELSgBMgNEZ0jDIwdpIe3nuvynpOhiS5ZmiFfEi7hkKzNCQHf diff --git a/src/2sman-client/etc/2sman/client/server b/src/2sman-client/etc/2sman/client/server new file mode 100644 index 0000000..541871e --- /dev/null +++ b/src/2sman-client/etc/2sman/client/server @@ -0,0 +1 @@ +https://2sman.lgy.fr/ diff --git a/src/2sman-client/etc/systemd/system/2sman-client.service b/src/2sman-client/etc/systemd/system/2sman-client.service new file mode 100644 index 0000000..8898aa5 --- /dev/null +++ b/src/2sman-client/etc/systemd/system/2sman-client.service @@ -0,0 +1,10 @@ +[Unit] +Description=2sman-client + +[Service] +ExecStart=/usr/bin/2sman-client +Restart=on-failure +RestartSec=5s + +[Install] +WantedBy=multi-user.target diff --git a/src/2sman-client/usr/bin/2sman-client b/src/2sman-client/usr/bin/2sman-client new file mode 100755 index 0000000..b7be189 --- /dev/null +++ b/src/2sman-client/usr/bin/2sman-client @@ -0,0 +1,49 @@ +#!/bin/bash +CONFIG_PATH=/etc/2sman/client +KEY_FILE=$CONFIG_PATH/key +SERVER_FILE=$CONFIG_PATH/server +SCRIPT_PATH=/usr/share/2sman-client +DEVICES_PATH=$CONFIG_PATH/devices +DAILY_FILE=/var/run/2sman-client-daily +HOURLY_FILE=/var/run/2sman-client-hourly +LASTRUN_FILE=/var/run/2sman-client-lastrun + +[ -f $KEY_FILE ] && DEFAULT_KEY=$(cat $KEY_FILE) +[ ! "$KEY" = "" ] && echo ERROR : Key file is empty $KEY_FILE && exit 1 +[ -f $SERVER_FILE ] && DEFAULT_SERVER=$(cat $SERVER_FILE) +[ ! "$SERVER" = "" ] && echo ERROR : Server file is empty $KEY_FILE && exit 1 + +function everytime { + if [ -f $SCRIPT_PATH/$1 ] + then bash $SCRIPT_PATH/$* & + else echo WARNING : script $1 not exist 1>&2 + fi +} + +function hourly { + elapsedSeconds=$([ -f $HOURLY_FILE ] && echo $(( $(date +%s) - $(date +%s -r $HOURLY_FILE) )) || echo 3601) + if [ $elapsedSeconds -gt 3600 ] ; then + touch $DAILY_FILE + everytime $* + fi +} + +function daily { + elapsedSeconds=$([ -f $DAILY_FILE ] && echo $(( $(date +%s) - $(date +%s -r $DAILY_FILE) )) || echo 86401) + if [ $elapsedSeconds -gt 86400 ]; then + touch $DAILY_FILE + everytime $* + fi +} + +while true +do + for device_conf in $(find $DEVICES_PATH/ -name *.conf) + do + KEY=$DEFAULT_KEY + SERVER=$DEFAULT_SERVER + devicename=$(basename $device_conf .conf) + . $device_conf | tee $LASTRUN_FILE | curl -s $SERVER/$KEY/$devicename --data-binary @- > /dev/null + done + sleep 300 +done diff --git a/src/2sman-client/usr/share/2sman-client/system.mountpoint.freespace b/src/2sman-client/usr/share/2sman-client/system.mountpoint.freespace new file mode 100755 index 0000000..1e95db7 --- /dev/null +++ b/src/2sman-client/usr/share/2sman-client/system.mountpoint.freespace @@ -0,0 +1,7 @@ +#!/bin/bash +df -HP | grep -E '^/dev/|rootfs|^//' | awk '{ print $5 " " $1 }' | while read output; +do + usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) + partition=$(echo $output | awk '{ print $2 }' ) + echo system\|mountpoint\|freespace\|$partition $usep +done diff --git a/src/2sman-client/usr/share/2sman-client/system.temp b/src/2sman-client/usr/share/2sman-client/system.temp new file mode 100755 index 0000000..1352951 --- /dev/null +++ b/src/2sman-client/usr/share/2sman-client/system.temp @@ -0,0 +1,11 @@ +#!/bin/bash + +if [ "$(systemd-detect-virt)" == "none" ] +then + sensors -u | while read ligne + do + echo $ligne | grep '^[A-Z].*' > /dev/null && main=$(echo $ligne | tr '\ ' '-' | tr -d ":") + echo $ligne | grep "_input" > /dev/null && echo system\|temp\|$main\|$( echo $ligne | tr -d ":") + done +fi + diff --git a/src/2sman-client/usr/share/2sman-client/system.uptime b/src/2sman-client/usr/share/2sman-client/system.uptime new file mode 100755 index 0000000..1838d86 --- /dev/null +++ b/src/2sman-client/usr/share/2sman-client/system.uptime @@ -0,0 +1,2 @@ +#!/bin/bash +echo system\|uptime $( cat /proc/uptime | cut -d " " -f 1) diff --git a/src/amp-base/DEBIAN/changelog b/src/amp-base/DEBIAN/changelog new file mode 100644 index 0000000..e69de29 diff --git a/src/amp-base/DEBIAN/control b/src/amp-base/DEBIAN/control new file mode 100644 index 0000000..79004b5 --- /dev/null +++ b/src/amp-base/DEBIAN/control @@ -0,0 +1,7 @@ +Package: amp-base +Version: 1.15 +Section: base +Priority: optional +Architecture: all +Maintainer: Thomas Legay +Description: base file for all other package diff --git a/src/amp-base/usr/bin/amp-full-upgrade b/src/amp-base/usr/bin/amp-full-upgrade new file mode 100755 index 0000000..b66aaf4 --- /dev/null +++ b/src/amp-base/usr/bin/amp-full-upgrade @@ -0,0 +1,5 @@ +#!/bin/bash + +[ -e /etc/apt/sources.list.d/pve-enterprise.list ] && rm /etc/apt/sources.list.d/pve-enterprise.list + +apt update && apt upgrade -y && apt dist-upgrade -y && apt-get clean diff --git a/src/amp-base/usr/bin/amp-show-debian-package-lxc b/src/amp-base/usr/bin/amp-show-debian-package-lxc new file mode 100755 index 0000000..2f7d1c0 --- /dev/null +++ b/src/amp-base/usr/bin/amp-show-debian-package-lxc @@ -0,0 +1,5 @@ +#!/bin/bash +TMP=$(mktemp) +apt-mark showmanual > $TMP +diff $TMP /var/lib/amp/lxc-debian-10/apt-mark-manual | grep -e "<" -e ">" +rm $TMP diff --git a/src/amp-base/usr/bin/speedtest-cli b/src/amp-base/usr/bin/speedtest-cli new file mode 100755 index 0000000..8b8526a --- /dev/null +++ b/src/amp-base/usr/bin/speedtest-cli @@ -0,0 +1,1504 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2012-2016 Matt Martz +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os +import re +import csv +import sys +import math +import errno +import signal +import socket +import timeit +import datetime +import platform +import threading +import xml.parsers.expat + +try: + import gzip + GZIP_BASE = gzip.GzipFile +except ImportError: + gzip = None + GZIP_BASE = object + +__version__ = '1.0.6' + + +class FakeShutdownEvent(object): + """Class to fake a threading.Event.isSet so that users of this module + are not required to register their own threading.Event() + """ + + @staticmethod + def isSet(): + "Dummy method to always return false""" + return False + + +# Some global variables we use +USER_AGENT = None +SOURCE = None +SHUTDOWN_EVENT = FakeShutdownEvent() +SCHEME = 'http' +DEBUG = False + +# Used for bound_interface +SOCKET_SOCKET = socket.socket + +# Begin import game to handle Python 2 and Python 3 +try: + import json +except ImportError: + try: + import simplejson as json + except ImportError: + json = None + +try: + import xml.etree.cElementTree as ET +except ImportError: + try: + import xml.etree.ElementTree as ET + except ImportError: + from xml.dom import minidom as DOM + ET = None + +try: + from urllib2 import urlopen, Request, HTTPError, URLError +except ImportError: + from urllib.request import urlopen, Request, HTTPError, URLError + +try: + from httplib import HTTPConnection +except ImportError: + from http.client import HTTPConnection + +try: + from httplib import HTTPSConnection +except ImportError: + try: + from http.client import HTTPSConnection + except ImportError: + HTTPSConnection = None + +try: + from Queue import Queue +except ImportError: + from queue import Queue + +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + +try: + from urlparse import parse_qs +except ImportError: + try: + from urllib.parse import parse_qs + except ImportError: + from cgi import parse_qs + +try: + from hashlib import md5 +except ImportError: + from md5 import md5 + +try: + from argparse import ArgumentParser as ArgParser + from argparse import SUPPRESS as ARG_SUPPRESS + PARSER_TYPE_INT = int + PARSER_TYPE_STR = str +except ImportError: + from optparse import OptionParser as ArgParser + from optparse import SUPPRESS_HELP as ARG_SUPPRESS + PARSER_TYPE_INT = 'int' + PARSER_TYPE_STR = 'string' + +try: + from cStringIO import StringIO + BytesIO = None +except ImportError: + try: + from StringIO import StringIO + BytesIO = None + except ImportError: + from io import StringIO, BytesIO + +try: + import __builtin__ +except ImportError: + import builtins + from io import TextIOWrapper, FileIO + + class _Py3Utf8Stdout(TextIOWrapper): + """UTF-8 encoded wrapper around stdout for py3, to override + ASCII stdout + """ + def __init__(self, **kwargs): + buf = FileIO(sys.stdout.fileno(), 'w') + super(_Py3Utf8Stdout, self).__init__( + buf, + encoding='utf8', + errors='strict' + ) + + def write(self, s): + super(_Py3Utf8Stdout, self).write(s) + self.flush() + + _py3_print = getattr(builtins, 'print') + _py3_utf8_stdout = _Py3Utf8Stdout() + + def to_utf8(v): + """No-op encode to utf-8 for py3""" + return v + + def print_(*args, **kwargs): + """Wrapper function for py3 to print, with a utf-8 encoded stdout""" + kwargs['file'] = _py3_utf8_stdout + _py3_print(*args, **kwargs) +else: + del __builtin__ + + def to_utf8(v): + """Encode value to utf-8 if possible for py2""" + try: + return v.encode('utf8', 'strict') + except AttributeError: + return v + + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5. + + Taken from https://pypi.python.org/pypi/six/ + + Modified to set encoding to UTF-8 always + """ + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + encoding = 'utf8' # Always trust UTF-8 for output + if (isinstance(fp, file) and + isinstance(data, unicode) and + encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + + +# Exception "constants" to support Python 2 through Python 3 +try: + import ssl + try: + CERT_ERROR = (ssl.CertificateError,) + except AttributeError: + CERT_ERROR = tuple() + + HTTP_ERRORS = ((HTTPError, URLError, socket.error, ssl.SSLError) + + CERT_ERROR) +except ImportError: + HTTP_ERRORS = (HTTPError, URLError, socket.error) + + +class SpeedtestException(Exception): + """Base exception for this module""" + + +class SpeedtestCLIError(SpeedtestException): + """Generic exception for raising errors during CLI operation""" + + +class SpeedtestHTTPError(SpeedtestException): + """Base HTTP exception for this module""" + + +class SpeedtestConfigError(SpeedtestException): + """Configuration provided is invalid""" + + +class ConfigRetrievalError(SpeedtestHTTPError): + """Could not retrieve config.php""" + + +class ServersRetrievalError(SpeedtestHTTPError): + """Could not retrieve speedtest-servers.php""" + + +class InvalidServerIDType(SpeedtestException): + """Server ID used for filtering was not an integer""" + + +class NoMatchedServers(SpeedtestException): + """No servers matched when filtering""" + + +class SpeedtestMiniConnectFailure(SpeedtestException): + """Could not connect to the provided speedtest mini server""" + + +class InvalidSpeedtestMiniServer(SpeedtestException): + """Server provided as a speedtest mini server does not actually appear + to be a speedtest mini server + """ + + +class ShareResultsConnectFailure(SpeedtestException): + """Could not connect to speedtest.net API to POST results""" + + +class ShareResultsSubmitFailure(SpeedtestException): + """Unable to successfully POST results to speedtest.net API after + connection + """ + + +class SpeedtestUploadTimeout(SpeedtestException): + """testlength configuration reached during upload + Used to ensure the upload halts when no additional data should be sent + """ + + +class SpeedtestBestServerFailure(SpeedtestException): + """Unable to determine best server""" + + +class GzipDecodedResponse(GZIP_BASE): + """A file-like object to decode a response encoded with the gzip + method, as described in RFC 1952. + + Largely copied from ``xmlrpclib``/``xmlrpc.client`` and modified + to work for py2.4-py3 + """ + def __init__(self, response): + # response doesn't support tell() and read(), required by + # GzipFile + if not gzip: + raise SpeedtestHTTPError('HTTP response body is gzip encoded, ' + 'but gzip support is not available') + IO = BytesIO or StringIO + self.io = IO() + while 1: + chunk = response.read(1024) + if len(chunk) == 0: + break + self.io.write(chunk) + self.io.seek(0) + gzip.GzipFile.__init__(self, mode='rb', fileobj=self.io) + + def close(self): + try: + gzip.GzipFile.close(self) + finally: + self.io.close() + + +def get_exception(): + """Helper function to work with py2.4-py3 for getting the current + exception in a try/except block + """ + return sys.exc_info()[1] + + +def bound_socket(*args, **kwargs): + """Bind socket to a specified source IP address""" + + sock = SOCKET_SOCKET(*args, **kwargs) + sock.bind((SOURCE, 0)) + return sock + + +def distance(origin, destination): + """Determine distance between 2 sets of [lat,lon] in km""" + + lat1, lon1 = origin + lat2, lon2 = destination + radius = 6371 # km + + dlat = math.radians(lat2 - lat1) + dlon = math.radians(lon2 - lon1) + a = (math.sin(dlat / 2) * math.sin(dlat / 2) + + math.cos(math.radians(lat1)) * + math.cos(math.radians(lat2)) * math.sin(dlon / 2) * + math.sin(dlon / 2)) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + d = radius * c + + return d + + +def build_user_agent(): + """Build a Mozilla/5.0 compatible User-Agent string""" + + global USER_AGENT + if USER_AGENT: + return USER_AGENT + + ua_tuple = ( + 'Mozilla/5.0', + '(%s; U; %s; en-us)' % (platform.system(), platform.architecture()[0]), + 'Python/%s' % platform.python_version(), + '(KHTML, like Gecko)', + 'speedtest-cli/%s' % __version__ + ) + USER_AGENT = ' '.join(ua_tuple) + printer(USER_AGENT, debug=True) + return USER_AGENT + + +def build_request(url, data=None, headers=None, bump=''): + """Build a urllib2 request object + + This function automatically adds a User-Agent header to all requests + + """ + + if not USER_AGENT: + build_user_agent() + + if not headers: + headers = {} + + if url[0] == ':': + schemed_url = '%s%s' % (SCHEME, url) + else: + schemed_url = url + + if '?' in url: + delim = '&' + else: + delim = '?' + + # WHO YOU GONNA CALL? CACHE BUSTERS! + final_url = '%s%sx=%s.%s' % (schemed_url, delim, + int(timeit.time.time() * 1000), + bump) + + headers.update({ + 'User-Agent': USER_AGENT, + 'Cache-Control': 'no-cache', + }) + + printer('%s %s' % (('GET', 'POST')[bool(data)], final_url), + debug=True) + + return Request(final_url, data=data, headers=headers) + + +def catch_request(request): + """Helper function to catch common exceptions encountered when + establishing a connection with a HTTP/HTTPS request + + """ + + try: + uh = urlopen(request) + return uh, False + except HTTP_ERRORS: + e = get_exception() + return None, e + + +def get_response_stream(response): + """Helper function to return either a Gzip reader if + ``Content-Encoding`` is ``gzip`` otherwise the response itself + + """ + + try: + getheader = response.headers.getheader + except AttributeError: + getheader = response.getheader + + if getheader('content-encoding') == 'gzip': + return GzipDecodedResponse(response) + + return response + + +def get_attributes_by_tag_name(dom, tag_name): + """Retrieve an attribute from an XML document and return it in a + consistent format + + Only used with xml.dom.minidom, which is likely only to be used + with python versions older than 2.5 + """ + elem = dom.getElementsByTagName(tag_name)[0] + return dict(list(elem.attributes.items())) + + +def print_dots(current, total, start=False, end=False): + """Built in callback function used by Thread classes for printing + status + """ + + if SHUTDOWN_EVENT.isSet(): + return + + sys.stdout.write('.') + if current + 1 == total and end is True: + sys.stdout.write('\n') + sys.stdout.flush() + + +def do_nothing(*args, **kwargs): + pass + + +class HTTPDownloader(threading.Thread): + """Thread class for retrieving a URL""" + + def __init__(self, i, request, start, timeout): + threading.Thread.__init__(self) + self.request = request + self.result = [0] + self.starttime = start + self.timeout = timeout + self.i = i + + def run(self): + try: + if (timeit.default_timer() - self.starttime) <= self.timeout: + f = urlopen(self.request) + while (not SHUTDOWN_EVENT.isSet() and + (timeit.default_timer() - self.starttime) <= + self.timeout): + self.result.append(len(f.read(10240))) + if self.result[-1] == 0: + break + f.close() + except IOError: + pass + + +class HTTPUploaderData(object): + """File like object to improve cutting off the upload once the timeout + has been reached + """ + + def __init__(self, length, start, timeout): + self.length = length + self.start = start + self.timeout = timeout + + self._data = None + + self.total = [0] + + def pre_allocate(self): + chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + multiplier = int(round(int(self.length) / 36.0)) + IO = BytesIO or StringIO + self._data = IO( + ('content1=%s' % + (chars * multiplier)[0:int(self.length) - 9] + ).encode() + ) + + @property + def data(self): + if not self._data: + self.pre_allocate() + return self._data + + def read(self, n=10240): + if ((timeit.default_timer() - self.start) <= self.timeout and + not SHUTDOWN_EVENT.isSet()): + chunk = self.data.read(n) + self.total.append(len(chunk)) + return chunk + else: + raise SpeedtestUploadTimeout() + + def __len__(self): + return self.length + + +class HTTPUploader(threading.Thread): + """Thread class for putting a URL""" + + def __init__(self, i, request, start, size, timeout): + threading.Thread.__init__(self) + self.request = request + self.request.data.start = self.starttime = start + self.size = size + self.result = None + self.timeout = timeout + self.i = i + + def run(self): + request = self.request + try: + if ((timeit.default_timer() - self.starttime) <= self.timeout and + not SHUTDOWN_EVENT.isSet()): + try: + f = urlopen(request) + except TypeError: + # PY24 expects a string or buffer + # This also causes issues with Ctrl-C, but we will concede + # for the moment that Ctrl-C on PY24 isn't immediate + request = build_request(self.request.get_full_url(), + data=request.data.read(self.size)) + f = urlopen(request) + f.read(11) + f.close() + self.result = sum(self.request.data.total) + else: + self.result = 0 + except (IOError, SpeedtestUploadTimeout): + self.result = sum(self.request.data.total) + + +class SpeedtestResults(object): + """Class for holding the results of a speedtest, including: + + Download speed + Upload speed + Ping/Latency to test server + Data about server that the test was run against + + Additionally this class can return a result data as a dictionary or CSV, + as well as submit a POST of the result data to the speedtest.net API + to get a share results image link. + """ + + def __init__(self, download=0, upload=0, ping=0, server=None): + self.download = download + self.upload = upload + self.ping = ping + if server is None: + self.server = {} + else: + self.server = server + self._share = None + self.timestamp = '%sZ' % datetime.datetime.utcnow().isoformat() + self.bytes_received = 0 + self.bytes_sent = 0 + + def __repr__(self): + return repr(self.dict()) + + def share(self): + """POST data to the speedtest.net API to obtain a share results + link + """ + + if self._share: + return self._share + + download = int(round(self.download / 1000.0, 0)) + ping = int(round(self.ping, 0)) + upload = int(round(self.upload / 1000.0, 0)) + + # Build the request to send results back to speedtest.net + # We use a list instead of a dict because the API expects parameters + # in a certain order + api_data = [ + 'recommendedserverid=%s' % self.server['id'], + 'ping=%s' % ping, + 'screenresolution=', + 'promo=', + 'download=%s' % download, + 'screendpi=', + 'upload=%s' % upload, + 'testmethod=http', + 'hash=%s' % md5(('%s-%s-%s-%s' % + (ping, upload, download, '297aae72')) + .encode()).hexdigest(), + 'touchscreen=none', + 'startmode=pingselect', + 'accuracy=1', + 'bytesreceived=%s' % self.bytes_received, + 'bytessent=%s' % self.bytes_sent, + 'serverid=%s' % self.server['id'], + ] + + headers = {'Referer': 'http://c.speedtest.net/flash/speedtest.swf'} + request = build_request('://www.speedtest.net/api/api.php', + data='&'.join(api_data).encode(), + headers=headers) + f, e = catch_request(request) + if e: + raise ShareResultsConnectFailure(e) + + response = f.read() + code = f.code + f.close() + + if int(code) != 200: + raise ShareResultsSubmitFailure('Could not submit results to ' + 'speedtest.net') + + qsargs = parse_qs(response.decode()) + resultid = qsargs.get('resultid') + if not resultid or len(resultid) != 1: + raise ShareResultsSubmitFailure('Could not submit results to ' + 'speedtest.net') + + self._share = 'http://www.speedtest.net/result/%s.png' % resultid[0] + + return self._share + + def dict(self): + """Return dictionary of result data""" + + return { + 'download': self.download, + 'upload': self.upload, + 'ping': self.ping, + 'server': self.server, + 'timestamp': self.timestamp, + 'bytes_sent': self.bytes_sent, + 'bytes_received': self.bytes_received, + 'share': self._share, + } + + def csv(self, delimiter=','): + """Return data in CSV format""" + + data = self.dict() + out = StringIO() + writer = csv.writer(out, delimiter=delimiter, lineterminator='') + row = [data['server']['id'], data['server']['sponsor'], + data['server']['name'], data['timestamp'], + data['server']['d'], data['ping'], data['download'], + data['upload']] + writer.writerow([to_utf8(v) for v in row]) + return out.getvalue() + + def json(self, pretty=False): + """Return data in JSON format""" + + kwargs = {} + if pretty: + kwargs.update({ + 'indent': 4, + 'sort_keys': True + }) + return json.dumps(self.dict(), **kwargs) + + +class Speedtest(object): + """Class for performing standard speedtest.net testing operations""" + + def __init__(self, config=None): + self.config = {} + self.get_config() + if config is not None: + self.config.update(config) + + self.servers = {} + self.closest = [] + self.best = {} + + self.results = SpeedtestResults() + + def get_config(self): + """Download the speedtest.net configuration and return only the data + we are interested in + """ + + headers = {} + if gzip: + headers['Accept-Encoding'] = 'gzip' + request = build_request('://www.speedtest.net/speedtest-config.php', + headers=headers) + uh, e = catch_request(request) + if e: + raise ConfigRetrievalError(e) + configxml = [] + + stream = get_response_stream(uh) + + while 1: + configxml.append(stream.read(1024)) + if len(configxml[-1]) == 0: + break + stream.close() + uh.close() + + if int(uh.code) != 200: + return None + + printer(''.encode().join(configxml), debug=True) + + try: + root = ET.fromstring(''.encode().join(configxml)) + server_config = root.find('server-config').attrib + download = root.find('download').attrib + upload = root.find('upload').attrib + # times = root.find('times').attrib + client = root.find('client').attrib + + except AttributeError: + root = DOM.parseString(''.join(configxml)) + server_config = get_attributes_by_tag_name(root, 'server-config') + download = get_attributes_by_tag_name(root, 'download') + upload = get_attributes_by_tag_name(root, 'upload') + # times = get_attributes_by_tag_name(root, 'times') + client = get_attributes_by_tag_name(root, 'client') + + ignore_servers = list( + map(int, server_config['ignoreids'].split(',')) + ) + + ratio = int(upload['ratio']) + upload_max = int(upload['maxchunkcount']) + up_sizes = [32768, 65536, 131072, 262144, 524288, 1048576, 7340032] + sizes = { + 'upload': up_sizes[ratio - 1:], + 'download': [350, 500, 750, 1000, 1500, 2000, 2500, + 3000, 3500, 4000] + } + + size_count = len(sizes['upload']) + + upload_count = int(math.ceil(upload_max / size_count)) + + counts = { + 'upload': upload_count, + 'download': int(download['threadsperurl']) + } + + threads = { + 'upload': int(upload['threads']), + 'download': int(server_config['threadcount']) * 2 + } + + length = { + 'upload': int(upload['testlength']), + 'download': int(download['testlength']) + } + + self.config.update({ + 'client': client, + 'ignore_servers': ignore_servers, + 'sizes': sizes, + 'counts': counts, + 'threads': threads, + 'length': length, + 'upload_max': upload_count * size_count + }) + + self.lat_lon = (float(client['lat']), float(client['lon'])) + + printer(self.config, debug=True) + + return self.config + + def get_servers(self, servers=None): + """Retrieve a the list of speedtest.net servers, optionally filtered + to servers matching those specified in the ``servers`` argument + """ + if servers is None: + servers = [] + + self.servers.clear() + + for i, s in enumerate(servers): + try: + servers[i] = int(s) + except ValueError: + raise InvalidServerIDType('%s is an invalid server type, must ' + 'be int' % s) + + urls = [ + '://www.speedtest.net/speedtest-servers-static.php', + 'http://c.speedtest.net/speedtest-servers-static.php', + '://www.speedtest.net/speedtest-servers.php', + 'http://c.speedtest.net/speedtest-servers.php', + ] + + headers = {} + if gzip: + headers['Accept-Encoding'] = 'gzip' + + errors = [] + for url in urls: + try: + request = build_request('%s?threads=%s' % + (url, + self.config['threads']['download']), + headers=headers) + uh, e = catch_request(request) + if e: + errors.append('%s' % e) + raise ServersRetrievalError() + + stream = get_response_stream(uh) + + serversxml = [] + while 1: + serversxml.append(stream.read(1024)) + if len(serversxml[-1]) == 0: + break + + stream.close() + uh.close() + + if int(uh.code) != 200: + raise ServersRetrievalError() + + printer(''.encode().join(serversxml), debug=True) + + try: + try: + root = ET.fromstring(''.encode().join(serversxml)) + elements = root.getiterator('server') + except AttributeError: + root = DOM.parseString(''.join(serversxml)) + elements = root.getElementsByTagName('server') + except (SyntaxError, xml.parsers.expat.ExpatError): + raise ServersRetrievalError() + + for server in elements: + try: + attrib = server.attrib + except AttributeError: + attrib = dict(list(server.attributes.items())) + + if servers and int(attrib.get('id')) not in servers: + continue + + if int(attrib.get('id')) in self.config['ignore_servers']: + continue + + try: + d = distance(self.lat_lon, + (float(attrib.get('lat')), + float(attrib.get('lon')))) + except: + continue + + attrib['d'] = d + + try: + self.servers[d].append(attrib) + except KeyError: + self.servers[d] = [attrib] + + printer(''.encode().join(serversxml), debug=True) + + break + + except ServersRetrievalError: + continue + + if servers and not self.servers: + raise NoMatchedServers() + + return self.servers + + def set_mini_server(self, server): + """Instead of querying for a list of servers, set a link to a + speedtest mini server + """ + + urlparts = urlparse(server) + + name, ext = os.path.splitext(urlparts[2]) + if ext: + url = os.path.dirname(server) + else: + url = server + + request = build_request(url) + uh, e = catch_request(request) + if e: + raise SpeedtestMiniConnectFailure('Failed to connect to %s' % + server) + else: + text = uh.read() + uh.close() + + extension = re.findall('upload_?[Ee]xtension: "([^"]+)"', + text.decode()) + if not extension: + for ext in ['php', 'asp', 'aspx', 'jsp']: + try: + f = urlopen('%s/speedtest/upload.%s' % (url, ext)) + except: + pass + else: + data = f.read().strip().decode() + if (f.code == 200 and + len(data.splitlines()) == 1 and + re.match('size=[0-9]', data)): + extension = [ext] + break + if not urlparts or not extension: + raise InvalidSpeedtestMiniServer('Invalid Speedtest Mini Server: ' + '%s' % server) + + self.servers = [{ + 'sponsor': 'Speedtest Mini', + 'name': urlparts[1], + 'd': 0, + 'url': '%s/speedtest/upload.%s' % (url.rstrip('/'), extension[0]), + 'latency': 0, + 'id': 0 + }] + + return self.servers + + def get_closest_servers(self, limit=5): + """Limit servers to the closest speedtest.net servers based on + geographic distance + """ + + if not self.servers: + self.get_servers() + + for d in sorted(self.servers.keys()): + for s in self.servers[d]: + self.closest.append(s) + if len(self.closest) == limit: + break + else: + continue + break + + printer(self.closest, debug=True) + return self.closest + + def get_best_server(self, servers=None): + """Perform a speedtest.net "ping" to determine which speedtest.net + server has the lowest latency + """ + + if not servers: + if not self.closest: + servers = self.get_closest_servers() + servers = self.closest + + results = {} + for server in servers: + cum = [] + url = os.path.dirname(server['url']) + urlparts = urlparse('%s/latency.txt' % url) + printer('%s %s/latency.txt' % ('GET', url), debug=True) + for _ in range(0, 3): + try: + if urlparts[0] == 'https': + h = HTTPSConnection(urlparts[1]) + else: + h = HTTPConnection(urlparts[1]) + headers = {'User-Agent': USER_AGENT} + start = timeit.default_timer() + h.request("GET", urlparts[2], headers=headers) + r = h.getresponse() + total = (timeit.default_timer() - start) + except HTTP_ERRORS: + e = get_exception() + printer('%r' % e, debug=True) + cum.append(3600) + continue + + text = r.read(9) + if int(r.status) == 200 and text == 'test=test'.encode(): + cum.append(total) + else: + cum.append(3600) + h.close() + + avg = round((sum(cum) / 6) * 1000.0, 3) + results[avg] = server + + try: + fastest = sorted(results.keys())[0] + except IndexError: + raise SpeedtestBestServerFailure('Unable to connect to servers to ' + 'test latency.') + best = results[fastest] + best['latency'] = fastest + + self.results.ping = fastest + self.results.server = best + + self.best.update(best) + printer(best, debug=True) + return best + + def download(self, callback=do_nothing): + """Test download speed against speedtest.net""" + + urls = [] + for size in self.config['sizes']['download']: + for _ in range(0, self.config['counts']['download']): + urls.append('%s/random%sx%s.jpg' % + (os.path.dirname(self.best['url']), size, size)) + + request_count = len(urls) + requests = [] + for i, url in enumerate(urls): + requests.append(build_request(url, bump=i)) + + def producer(q, requests, request_count): + for i, request in enumerate(requests): + thread = HTTPDownloader(i, request, start, + self.config['length']['download']) + thread.start() + q.put(thread, True) + callback(i, request_count, start=True) + + finished = [] + + def consumer(q, request_count): + while len(finished) < request_count: + thread = q.get(True) + while thread.isAlive(): + thread.join(timeout=0.1) + finished.append(sum(thread.result)) + callback(thread.i, request_count, end=True) + + q = Queue(self.config['threads']['download']) + prod_thread = threading.Thread(target=producer, + args=(q, requests, request_count)) + cons_thread = threading.Thread(target=consumer, + args=(q, request_count)) + start = timeit.default_timer() + prod_thread.start() + cons_thread.start() + while prod_thread.isAlive(): + prod_thread.join(timeout=0.1) + while cons_thread.isAlive(): + cons_thread.join(timeout=0.1) + + stop = timeit.default_timer() + self.results.bytes_received = sum(finished) + self.results.download = ( + (self.results.bytes_received / (stop - start)) * 8.0 + ) + if self.results.download > 100000: + self.config['threads']['upload'] = 8 + return self.results.download + + def upload(self, callback=do_nothing, pre_allocate=True): + """Test upload speed against speedtest.net""" + + sizes = [] + + for size in self.config['sizes']['upload']: + for _ in range(0, self.config['counts']['upload']): + sizes.append(size) + + # request_count = len(sizes) + request_count = self.config['upload_max'] + + requests = [] + for i, size in enumerate(sizes): + # We set ``0`` for ``start`` and handle setting the actual + # ``start`` in ``HTTPUploader`` to get better measurements + data = HTTPUploaderData(size, 0, self.config['length']['upload']) + if pre_allocate: + data.pre_allocate() + requests.append( + ( + build_request(self.best['url'], data), + size + ) + ) + + def producer(q, requests, request_count): + for i, request in enumerate(requests[:request_count]): + thread = HTTPUploader(i, request[0], start, request[1], + self.config['length']['upload']) + thread.start() + q.put(thread, True) + callback(i, request_count, start=True) + + finished = [] + + def consumer(q, request_count): + while len(finished) < request_count: + thread = q.get(True) + while thread.isAlive(): + thread.join(timeout=0.1) + finished.append(thread.result) + callback(thread.i, request_count, end=True) + + q = Queue(self.config['threads']['upload']) + prod_thread = threading.Thread(target=producer, + args=(q, requests, request_count)) + cons_thread = threading.Thread(target=consumer, + args=(q, request_count)) + start = timeit.default_timer() + prod_thread.start() + cons_thread.start() + while prod_thread.isAlive(): + prod_thread.join(timeout=0.1) + while cons_thread.isAlive(): + cons_thread.join(timeout=0.1) + + stop = timeit.default_timer() + self.results.bytes_sent = sum(finished) + self.results.upload = ( + (self.results.bytes_sent / (stop - start)) * 8.0 + ) + return self.results.upload + + +def ctrl_c(signum, frame): + """Catch Ctrl-C key sequence and set a SHUTDOWN_EVENT for our threaded + operations + """ + + SHUTDOWN_EVENT.set() + print_('\nCancelling...') + sys.exit(0) + + +def version(): + """Print the version""" + + print_(__version__) + sys.exit(0) + + +def csv_header(): + """Print the CSV Headers""" + + print_('Server ID,Sponsor,Server Name,Timestamp,Distance,Ping,Download,' + 'Upload') + sys.exit(0) + + +def parse_args(): + """Function to handle building and parsing of command line arguments""" + description = ( + 'Command line interface for testing internet bandwidth using ' + 'speedtest.net.\n' + '------------------------------------------------------------' + '--------------\n' + 'https://github.com/sivel/speedtest-cli') + + parser = ArgParser(description=description) + # Give optparse.OptionParser an `add_argument` method for + # compatibility with argparse.ArgumentParser + try: + parser.add_argument = parser.add_option + except AttributeError: + pass + parser.add_argument('--no-download', dest='download', default=True, + action='store_const', const=False, + help='Do not perform download test') + parser.add_argument('--no-upload', dest='upload', default=True, + action='store_const', const=False, + help='Do not perform upload test') + parser.add_argument('--bytes', dest='units', action='store_const', + const=('byte', 8), default=('bit', 1), + help='Display values in bytes instead of bits. Does ' + 'not affect the image generated by --share, nor ' + 'output from --json or --csv') + parser.add_argument('--share', action='store_true', + help='Generate and provide a URL to the speedtest.net ' + 'share results image, not displayed with --csv') + parser.add_argument('--simple', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information') + parser.add_argument('--csv', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information in CSV format. Speeds listed in ' + 'bit/s and not affected by --bytes') + parser.add_argument('--csv-delimiter', default=',', type=PARSER_TYPE_STR, + help='Single character delimiter to use in CSV ' + 'output. Default ","') + parser.add_argument('--csv-header', action='store_true', default=False, + help='Print CSV headers') + parser.add_argument('--json', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information in JSON format. Speeds listed in ' + 'bit/s and not affected by --bytes') + parser.add_argument('--list', action='store_true', + help='Display a list of speedtest.net servers ' + 'sorted by distance') + parser.add_argument('--server', help='Specify a server ID to test against', + type=PARSER_TYPE_INT) + parser.add_argument('--mini', help='URL of the Speedtest Mini server') + parser.add_argument('--source', help='Source IP address to bind to') + parser.add_argument('--timeout', default=10, type=PARSER_TYPE_INT, + help='HTTP timeout in seconds. Default 10') + parser.add_argument('--secure', action='store_true', + help='Use HTTPS instead of HTTP when communicating ' + 'with speedtest.net operated servers') + parser.add_argument('--no-pre-allocate', dest='pre_allocate', + action='store_const', default=True, const=False, + help='Do not pre allocate upload data. Pre allocation ' + 'is enabled by default to improve upload ' + 'performance. To support systems with ' + 'insufficient memory, use this option to avoid a ' + 'MemoryError') + parser.add_argument('--version', action='store_true', + help='Show the version number and exit') + parser.add_argument('--debug', action='store_true', + help=ARG_SUPPRESS, default=ARG_SUPPRESS) + + options = parser.parse_args() + if isinstance(options, tuple): + args = options[0] + else: + args = options + return args + + +def validate_optional_args(args): + """Check if an argument was provided that depends on a module that may + not be part of the Python standard library. + + If such an argument is supplied, and the module does not exist, exit + with an error stating which module is missing. + """ + optional_args = { + 'json': ('json/simplejson python module', json), + 'secure': ('SSL support', HTTPSConnection), + } + + for arg, info in optional_args.items(): + if getattr(args, arg, False) and info[1] is None: + raise SystemExit('%s is not installed. --%s is ' + 'unavailable' % (info[0], arg)) + + +def printer(string, quiet=False, debug=False, **kwargs): + """Helper function to print a string only when not quiet""" + + if debug and not DEBUG: + return + + if debug: + out = '\033[1;30mDEBUG: %s\033[0m' % string + else: + out = string + + if not quiet: + print_(out, **kwargs) + + +def shell(): + """Run the full speedtest.net test""" + + global SHUTDOWN_EVENT, SOURCE, SCHEME, DEBUG + SHUTDOWN_EVENT = threading.Event() + + signal.signal(signal.SIGINT, ctrl_c) + + args = parse_args() + + # Print the version and exit + if args.version: + version() + + if not args.download and not args.upload: + raise SpeedtestCLIError('Cannot supply both --no-download and ' + '--no-upload') + + if args.csv_header: + csv_header() + + if len(args.csv_delimiter) != 1: + raise SpeedtestCLIError('--csv-delimiter must be a single character') + + validate_optional_args(args) + + socket.setdefaulttimeout(args.timeout) + + # If specified bind to a specific IP address + if args.source: + SOURCE = args.source + socket.socket = bound_socket + + if args.secure: + SCHEME = 'https' + + debug = getattr(args, 'debug', False) + if debug == 'SUPPRESSHELP': + debug = False + if debug: + DEBUG = True + + # Pre-cache the user agent string + build_user_agent() + + if args.simple or args.csv or args.json: + quiet = True + else: + quiet = False + + if args.csv or args.json: + machine_format = True + else: + machine_format = False + + # Don't set a callback if we are running quietly + if quiet or debug: + callback = do_nothing + else: + callback = print_dots + + printer('Retrieving speedtest.net configuration...', quiet) + try: + speedtest = Speedtest() + except (ConfigRetrievalError, HTTP_ERRORS): + printer('Cannot retrieve speedtest configuration') + raise SpeedtestCLIError(get_exception()) + + if args.list: + try: + speedtest.get_servers() + except (ServersRetrievalError, HTTP_ERRORS): + print_('Cannot retrieve speedtest server list') + raise SpeedtestCLIError(get_exception()) + + for _, servers in sorted(speedtest.servers.items()): + for server in servers: + line = ('%(id)5s) %(sponsor)s (%(name)s, %(country)s) ' + '[%(d)0.2f km]' % server) + try: + print_(line) + except IOError: + e = get_exception() + if e.errno != errno.EPIPE: + raise + sys.exit(0) + + # Set a filter of servers to retrieve + servers = [] + if args.server: + servers.append(args.server) + + printer('Testing from %(isp)s (%(ip)s)...' % speedtest.config['client'], + quiet) + + if not args.mini: + printer('Retrieving speedtest.net server list...', quiet) + try: + speedtest.get_servers(servers) + except NoMatchedServers: + raise SpeedtestCLIError('No matched servers: %s' % args.server) + except (ServersRetrievalError, HTTP_ERRORS): + print_('Cannot retrieve speedtest server list') + raise SpeedtestCLIError(get_exception()) + except InvalidServerIDType: + raise SpeedtestCLIError('%s is an invalid server type, must ' + 'be an int' % args.server) + + printer('Selecting best server based on ping...', quiet) + speedtest.get_best_server() + elif args.mini: + speedtest.get_best_server(speedtest.set_mini_server(args.mini)) + + results = speedtest.results + + printer('Hosted by %(sponsor)s (%(name)s) [%(d)0.2f km]: ' + '%(latency)s ms' % results.server, quiet) + + if args.download: + printer('Testing download speed', quiet, + end=('', '\n')[bool(debug)]) + speedtest.download(callback=callback) + printer('Download: %0.2f M%s/s' % + ((results.download / 1000.0 / 1000.0) / args.units[1], + args.units[0]), + quiet) + else: + printer('Skipping download test') + + if args.upload: + printer('Testing upload speed', quiet, + end=('', '\n')[bool(debug)]) + speedtest.upload(callback=callback, pre_allocate=args.pre_allocate) + printer('Upload: %0.2f M%s/s' % + ((results.upload / 1000.0 / 1000.0) / args.units[1], + args.units[0]), + quiet) + else: + printer('Skipping upload test') + + if args.simple: + print_('Ping: %s ms\nDownload: %0.2f M%s/s\nUpload: %0.2f M%s/s' % + (results.ping, + (results.download / 1000.0 / 1000.0) / args.units[1], + args.units[0], + (results.upload / 1000.0 / 1000.0) / args.units[1], + args.units[0])) + elif args.csv: + print_(results.csv(delimiter=args.csv_delimiter)) + elif args.json: + if args.share: + results.share() + print_(results.json()) + + if args.share and not machine_format: + printer('Share results: %s' % results.share()) + + +def main(): + try: + shell() + except KeyboardInterrupt: + print_('\nCancelling...') + except (SpeedtestException, SystemExit): + e = get_exception() + if getattr(e, 'code', 1) != 0: + raise SystemExit('ERROR: %s' % e) + + +if __name__ == '__main__': + main() diff --git a/src/amp-base/usr/bin/swapAnalyse b/src/amp-base/usr/bin/swapAnalyse new file mode 100755 index 0000000..cce16b1 --- /dev/null +++ b/src/amp-base/usr/bin/swapAnalyse @@ -0,0 +1,2 @@ +#!/bin/bash +for proc in /proc/[0-9]*; do awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }' diff --git a/src/amp-base/var/lib/amp/lxc-debian-10/apt-mark-manual b/src/amp-base/var/lib/amp/lxc-debian-10/apt-mark-manual new file mode 100644 index 0000000..55eeb3a --- /dev/null +++ b/src/amp-base/var/lib/amp/lxc-debian-10/apt-mark-manual @@ -0,0 +1,337 @@ +adduser +apt +apt-listchanges +apt-utils +base-files +base-passwd +bash +bash-completion +bind9-host +bsdmainutils +bsdutils +bzip2 +ca-certificates +coreutils +cpio +cpp +cpp-8 +cron +dash +dbus +debconf +debconf-i18n +debian-archive-keyring +debian-faq +debianutils +diffutils +dmidecode +dmsetup +doc-debian +dpkg +e2fsprogs +fdisk +file +findutils +fontconfig-config +fonts-dejavu-core +gcc-8-base +gdbm-l10n +gettext-base +gpgv +grep +groff-base +gzip +hostname +ifupdown +init +init-system-helpers +iproute2 +iptables +iputils-ping +isc-dhcp-client +isc-dhcp-common +kmod +krb5-locales +less +libacl1 +libapparmor1 +libapt-inst2.0 +libapt-pkg5.0 +libargon2-1 +libattr1 +libaudit-common +libaudit1 +libbind9-161 +libblkid1 +libbsd0 +libbz2-1.0 +libc-bin +libc-l10n +libc6 +libcap-ng0 +libcap2 +libcap2-bin +libcom-err2 +libcryptsetup12 +libcurl3-gnutls +libdb5.3 +libdbus-1-3 +libdebconfclient0 +libdevmapper1.02.1 +libdns-export1104 +libdns1104 +libdrm-amdgpu1 +libdrm-common +libdrm-intel1 +libdrm-nouveau2 +libdrm-radeon1 +libdrm2 +libedit2 +libelf1 +libestr0 +libexpat1 +libext2fs2 +libfastjson4 +libfdisk1 +libffi6 +libfontconfig1 +libfontenc1 +libfreetype6 +libfstrm0 +libgcc1 +libgcrypt20 +libgdbm-compat4 +libgdbm6 +libgeoip1 +libgl1 +libgl1-mesa-dri +libglapi-mesa +libglvnd0 +libglx-mesa0 +libglx0 +libgmp10 +libgnutls30 +libgpg-error0 +libgssapi-krb5-2 +libhogweed4 +libice6 +libicu63 +libidn11 +libidn2-0 +libip4tc0 +libip6tc0 +libiptc0 +libisc-export1100 +libisc1100 +libisccc161 +libisccfg163 +libisl19 +libjson-c3 +libk5crypto3 +libkeyutils1 +libkmod2 +libkrb5-3 +libkrb5support0 +libldap-2.4-2 +libldap-common +libllvm7 +liblmdb0 +liblocale-gettext-perl +liblockfile-bin +liblognorm5 +liblwres161 +liblz4-1 +liblzma5 +libmagic-mgc +libmagic1 +libmnl0 +libmount1 +libmpc3 +libmpdec2 +libmpfr6 +libncurses6 +libncursesw6 +libnetfilter-conntrack3 +libnettle6 +libnewt0.52 +libnfnetlink0 +libnftnl11 +libnghttp2-14 +libnss-systemd +libp11-kit0 +libpam-modules +libpam-modules-bin +libpam-runtime +libpam-systemd +libpam0g +libpciaccess0 +libpcre2-8-0 +libpcre3 +libperl5.28 +libpipeline1 +libpng16-16 +libpopt0 +libprocps7 +libprotobuf-c1 +libpsl5 +libpython-stdlib +libpython2-stdlib +libpython2.7-minimal +libpython2.7-stdlib +libpython3-stdlib +libpython3.7-minimal +libpython3.7-stdlib +libreadline7 +librtmp1 +libsasl2-2 +libsasl2-modules-db +libseccomp2 +libselinux1 +libsemanage-common +libsemanage1 +libsensors-config +libsensors5 +libsepol1 +libslang2 +libsm6 +libsmartcols1 +libsqlite3-0 +libss2 +libssh2-1 +libssl1.1 +libstdc++6 +libsystemd0 +libtasn1-6 +libtext-charwidth-perl +libtext-iconv-perl +libtext-wrapi18n-perl +libtinfo6 +libuchardet0 +libudev1 +libunistring2 +libuuid1 +libwrap0 +libx11-6 +libx11-data +libx11-xcb1 +libxau6 +libxaw7 +libxcb-dri2-0 +libxcb-dri3-0 +libxcb-glx0 +libxcb-present0 +libxcb-shape0 +libxcb-sync1 +libxcb1 +libxcomposite1 +libxcursor1 +libxdamage1 +libxdmcp6 +libxext6 +libxfixes3 +libxft2 +libxi6 +libxinerama1 +libxkbfile1 +libxml2 +libxmu6 +libxmuu1 +libxpm4 +libxrandr2 +libxrender1 +libxshmfence1 +libxt6 +libxtables12 +libxtst6 +libxv1 +libxxf86dga1 +libxxf86vm1 +libzstd1 +locales +login +logrotate +lsb-base +lsof +man-db +manpages +mawk +mime-support +mount +nano +ncurses-base +ncurses-bin +ncurses-term +netbase +netcat-traditional +openssh-client +openssh-server +openssh-sftp-server +openssl +passwd +perl +perl-base +perl-modules-5.28 +postfix +procps +python +python-apt-common +python-minimal +python2 +python2-minimal +python2.7 +python2.7-minimal +python3 +python3-apt +python3-certifi +python3-chardet +python3-debconf +python3-debian +python3-debianbts +python3-httplib2 +python3-idna +python3-minimal +python3-pkg-resources +python3-pycurl +python3-pysimplesoap +python3-reportbug +python3-requests +python3-six +python3-urllib3 +python3.7 +python3.7-minimal +readline-common +reportbug +rsyslog +sed +sensible-utils +ssh +ssl-cert +systemd +systemd-sysv +sysvinit-utils +tar +tasksel +tasksel-data +telnet +traceroute +tzdata +ucf +udev +util-linux +vim-common +vim-tiny +wamerican +wget +whiptail +x11-apps +x11-common +x11-session-utils +x11-utils +x11-xkb-utils +x11-xserver-utils +xauth +xbase-clients +xinit +xxd +xz-utils +zlib1g diff --git a/src/amp-prefered-config/DEBIAN/changelog b/src/amp-prefered-config/DEBIAN/changelog new file mode 100644 index 0000000..e69de29 diff --git a/src/amp-prefered-config/DEBIAN/control b/src/amp-prefered-config/DEBIAN/control new file mode 100644 index 0000000..ce53bed --- /dev/null +++ b/src/amp-prefered-config/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-prefered-config +Version: 1.03 +Section: base +Priority: optional +Architecture: all +Depends: amp-base +Maintainer: Thomas Legay +Description: change debian default configuration diff --git a/src/amp-prefered-config/DEBIAN/postinst b/src/amp-prefered-config/DEBIAN/postinst new file mode 100755 index 0000000..0b5b0aa --- /dev/null +++ b/src/amp-prefered-config/DEBIAN/postinst @@ -0,0 +1,15 @@ +#!/bin/bash + +grep '$include /usr/lib/amp-prefered-config/inputrc' /etc/inputrc > /dev/null || echo '$include /usr/lib/amp-prefered-config/inputrc' >> /etc/inputrc + +#sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config + +ln -fs /usr/share/zoneinfo/Europe/Paris /etc/localtime +dpkg-reconfigure -f noninteractive tzdata + + +sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen +echo "LANG=fr_FR.UTF-8" > /etc/default/locale +/usr/sbin/locale-gen + +[ "$(systemd-detect-virt )" == "lxc" ] && grep '^MaxRetentionSec=' /etc/systemd/journald.conf || echo 'MaxRetentionSec=2week' >> /etc/systemd/journald.conf diff --git a/src/amp-prefered-config/usr/lib/amp-prefered-config/inputrc b/src/amp-prefered-config/usr/lib/amp-prefered-config/inputrc new file mode 100644 index 0000000..53de1a1 --- /dev/null +++ b/src/amp-prefered-config/usr/lib/amp-prefered-config/inputrc @@ -0,0 +1,2 @@ +"\e[5~": history-search-backward +"\e[6~": history-search-forward diff --git a/src/amp-proxmox-utils/DEBIAN/changelog b/src/amp-proxmox-utils/DEBIAN/changelog new file mode 100644 index 0000000..e69de29 diff --git a/src/amp-proxmox-utils/DEBIAN/control b/src/amp-proxmox-utils/DEBIAN/control new file mode 100644 index 0000000..719a823 --- /dev/null +++ b/src/amp-proxmox-utils/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-proxmox-utils +Version: 1.07 +Section: base +Priority: optional +Architecture: all +Depends: debootstrap +Maintainer: Thomas Legay +Description: Proxmox scripts diff --git a/src/amp-proxmox-utils/etc/amp-proxmox-utils/vzdump.hook.conf b/src/amp-proxmox-utils/etc/amp-proxmox-utils/vzdump.hook.conf new file mode 100644 index 0000000..7c9915d --- /dev/null +++ b/src/amp-proxmox-utils/etc/amp-proxmox-utils/vzdump.hook.conf @@ -0,0 +1,2 @@ +MAX_ARCHIVE=5 +MAX_LOG_DAYS=14 diff --git a/src/amp-proxmox-utils/etc/amp-proxmox-utils/vzdump.hook.d/backup.conf.sample b/src/amp-proxmox-utils/etc/amp-proxmox-utils/vzdump.hook.d/backup.conf.sample new file mode 100644 index 0000000..3191686 --- /dev/null +++ b/src/amp-proxmox-utils/etc/amp-proxmox-utils/vzdump.hook.d/backup.conf.sample @@ -0,0 +1,5 @@ +BACKUP_DEST_IP=10.237.66.10 +BACKUP_DEST_PATH=/pool/netbackup/dump +NB_ARCHIVE=3 +BACKUP_DEST_USER=root +BACKUP_PORT=22 diff --git a/src/amp-proxmox-utils/usr/bin/amp-proxmox-lxc-full-upgrade.sh b/src/amp-proxmox-utils/usr/bin/amp-proxmox-lxc-full-upgrade.sh new file mode 100755 index 0000000..12336d9 --- /dev/null +++ b/src/amp-proxmox-utils/usr/bin/amp-proxmox-lxc-full-upgrade.sh @@ -0,0 +1,5 @@ +#!/bin/bash +for tmp in $(pct list | grep running | cut -c 1-3) +do + lxc-attach $tmp "[ -e /usr/bin/amp-full-upgrade ] && amp-full-upgrade " +done diff --git a/src/amp-proxmox-utils/usr/bin/lxc-debootstrap-image-create b/src/amp-proxmox-utils/usr/bin/lxc-debootstrap-image-create new file mode 100644 index 0000000..00ffa4a --- /dev/null +++ b/src/amp-proxmox-utils/usr/bin/lxc-debootstrap-image-create @@ -0,0 +1,21 @@ +set -e +SRC_DEBOOTSTRAP=/usr/share/debootstrap/scripts +IMAGE=$1 +TARBALL=$1-$(date +%Y%m%d).tar.gz +if [ -f $SRC_DEBOOTSTRAP/$IMAGE ] ; +then + TARGET=$(tempfile) + rm $TARGET + mkdir $TARGET + echo create rootfs in temporary folder $TARGET + debootstrap $IMAGE $TARGET > /dev/null + echo create archive $TARBALL + tar -C $TARGET -zcvf $TARBALL . + echo Remove temporary folder + rm -fr $TARGET + chmod ugo+r $TARBALL + echo lxc image available in $TARBALL +else + echo $(basename $0) \ + ls $SRC_DEBOOTSTRAP +fi diff --git a/src/amp-proxmox-utils/usr/bin/vzdump.hook.sh b/src/amp-proxmox-utils/usr/bin/vzdump.hook.sh new file mode 100755 index 0000000..780bf25 --- /dev/null +++ b/src/amp-proxmox-utils/usr/bin/vzdump.hook.sh @@ -0,0 +1,62 @@ +#!/bin/bash +RETOUR=0 +if [ "$1" = "backup-end" ] +then + + . /etc/amp-proxmox-utils/vzdump.hook.conf + + echo "vzdump hook backup-end (by thomas Legay)" + VM_ID=$3 + + #Rename archive name with vm hostname + VM_HOSTNAME=$(pct config $VM_ID | grep hostname | cut -d " " -f 2) + ARCHIVE_DIR=$(dirname $TARFILE) + ARCHIVE_NAME=$(basename $TARFILE) + NEW_ARCHIVE_NAME=$(echo $ARCHIVE_NAME | awk -v VM_HOSTNAME="$VM_HOSTNAME" -F '[-]+' '{print $1"-"$2"-"$3"-"VM_HOSTNAME"-"$4"-"$5'}) + ARCHIVE_PREFIX=$(echo $ARCHIVE_NAME | awk -F '[-]+' '{print $1"-"$2"-"$3"-"}') + echo "Rename $ARCHIVE_NAME to $NEW_ARCHIVE_NAME" + mv $TARFILE $ARCHIVE_DIR/$NEW_ARCHIVE_NAME + TMP=$? + [ $TMP -ne 0 ] && RETOUR=$TMP + + #Remove old archive + nb=$(find $ARCHIVE_DIR -regex ".*/vzdump-lxc-$VM_ID-.*\(.tgz\|.tar.gz\|.tar\|.tar.zst\|.tar.lzo\)" | wc -l) + nb_delete=$(($nb - $MAX_ARCHIVE )) + echo "$nb archives ( $nb_delete to delete)" + if [ $nb_delete -gt 0 ] + then + count=0 + for archive in $(find $ARCHIVE_DIR -regex ".*/vzdump-lxc-$VM_ID-.*\(.tgz\|.tar.gz\|.tar\|.tar.zst\|.tar.lzo\)" -printf "%T@ %p\n" | sort -n | cut -d " " -f 2) + do + count=$(( $count + 1 )) + delete_prefix=$(echo $archive | sed 's/\(.tgz\|.tar.gz\|.tar\|.tar.zst\|.tar.lzo\)//') + if [ $count -le $nb_delete ] + then + for file in $(ls $delete_prefix*) + do + echo "Remove $file" + rm "$file" + done + fi + done + fi + + #remove old log + find $ARCHIVE_DIR -type f -mtime +$MAX_LOG_DAYS -name "*.log" -delete + + #export archive + for tmp in $(find /etc/amp-proxmox-utils/vzdump.hook.d/ -name '*.conf') + do + . $tmp + echo "copie de l'archive pour $*" + scp -P $BACKUP_PORT $ARCHIVE_DIR/$NEW_ARCHIVE_NAME $BACKUP_DEST_USER@$BACKUP_DEST_IP:$BACKUP_DEST_PATH + TMP=$? + [ $TMP -ne 0 ] && RETOUR=$TMP + for tmp in $( ssh -p $BACKUP_PORT $BACKUP_DEST_USER@$BACKUP_DEST_IP "ls -rt $BACKUP_DEST_PATH/*$3*" | grep -v -e .log | head -n -$NB_ARCHIVE); + do + echo "suppression distante de $tmp" + ssh -p $BACKUP_PORT -l $BACKUP_DEST_USER $BACKUP_DEST_IP rm $tmp + done + done +fi +exit $RETOUR diff --git a/src/amp-tools-unifi/DEBIAN/changelog b/src/amp-tools-unifi/DEBIAN/changelog new file mode 100644 index 0000000..e2fe7f6 --- /dev/null +++ b/src/amp-tools-unifi/DEBIAN/changelog @@ -0,0 +1,11 @@ +amp-tools-unifi (1.0) stable; urgency=low + + * Create + + -- Legay Thomas mar. 28 avril 2020 10:55 + +amp-tools-unifi (1.1) stable; urgency=low + + * first issue :-p + + -- Legay Thomas mar. 28 avril 2020 10:55 diff --git a/src/amp-tools-unifi/DEBIAN/control b/src/amp-tools-unifi/DEBIAN/control new file mode 100644 index 0000000..46364f0 --- /dev/null +++ b/src/amp-tools-unifi/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-tools-unifi +Version: 1.03 +Section: base +Priority: optional +Architecture: all +Depends: jq, gnupg +Maintainer: Thomas Legay +Description: amp-tools-unifi diff --git a/src/amp-tools-unifi/usr/local/bin/amp-unifi-install-last b/src/amp-tools-unifi/usr/local/bin/amp-unifi-install-last new file mode 100755 index 0000000..8c078a7 --- /dev/null +++ b/src/amp-tools-unifi/usr/local/bin/amp-unifi-install-last @@ -0,0 +1,8 @@ +#!/bin/bash +VERSION=$(wget --header='X-Requested-With: XMLHttpRequest' 'https://www.ui.com/download/?platform=unifi' -O - | jq '.downloads | .[] | select(.filename=="unifi_sysvinit_all.deb") | .version' | sed 's/"//g' | sort -V | tail -n 1) + +wget https://dl.ui.com/unifi/$VERSION/unifi_sysvinit_all.deb -O - > /tmp/unifi_sysvinit_all.deb + +dpkg -i /tmp/unifi_sysvinit_all.deb +apt install -f +rm /tmp/unifi_sysvinit_all.deb diff --git a/src/amp-upgrade-airsonic/DEBIAN/changelog b/src/amp-upgrade-airsonic/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-airsonic/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-airsonic/DEBIAN/control b/src/amp-upgrade-airsonic/DEBIAN/control new file mode 100644 index 0000000..f9e69fa --- /dev/null +++ b/src/amp-upgrade-airsonic/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-airsonic +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: wget +Maintainer: Thomas Legay +Description: airsonic upgrade script diff --git a/src/amp-upgrade-airsonic/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple b/src/amp-upgrade-airsonic/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple new file mode 100644 index 0000000..13aa1ef --- /dev/null +++ b/src/amp-upgrade-airsonic/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple @@ -0,0 +1 @@ +AIRSONIC_ROOT=/var/www/html/ diff --git a/src/amp-upgrade-airsonic/usr/bin/amp-upgrade-airsonic b/src/amp-upgrade-airsonic/usr/bin/amp-upgrade-airsonic new file mode 100755 index 0000000..5ca8698 --- /dev/null +++ b/src/amp-upgrade-airsonic/usr/bin/amp-upgrade-airsonic @@ -0,0 +1,7 @@ +#!/bin/bash +PROJECT_URL=https://github.com/airsonic/airsonic/ +VERSION=$(wget -qO - $PROJECT_URL/releases.atom | grep "releases/tag" | head -n 1 | grep -o -P "/tag/[^\"]*" | cut -c 6-) +FILE=airsonic.war + +wget -q $PROJECT_URL/releases/download/$VERSION/$FILE -O $AIRSONIC_ROOT/airsonic.war +systemctl restart airsonic.service diff --git a/src/amp-upgrade-baikal/DEBIAN/changelog b/src/amp-upgrade-baikal/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-baikal/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-baikal/DEBIAN/control b/src/amp-upgrade-baikal/DEBIAN/control new file mode 100644 index 0000000..f6f0f06 --- /dev/null +++ b/src/amp-upgrade-baikal/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-baikal +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: wget +Maintainer: Thomas Legay +Description: baikal upgrade script diff --git a/src/amp-upgrade-baikal/etc/amp-upgrade-script/baikal.d/baika.conf.exemple b/src/amp-upgrade-baikal/etc/amp-upgrade-script/baikal.d/baika.conf.exemple new file mode 100644 index 0000000..b6ddd7b --- /dev/null +++ b/src/amp-upgrade-baikal/etc/amp-upgrade-script/baikal.d/baika.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/html/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-baikal/usr/bin/amp-upgrade-baikal b/src/amp-upgrade-baikal/usr/bin/amp-upgrade-baikal new file mode 100755 index 0000000..467145e --- /dev/null +++ b/src/amp-upgrade-baikal/usr/bin/amp-upgrade-baikal @@ -0,0 +1,28 @@ +#!/bin/bash +set -e + +PROJECT_URL=https://github.com/sabre-io/Baikal/ +VERSION=$(wget -qO - $PROJECT_URL/releases.atom | grep "releases/tag" | head -n 1 | grep -o -P "/tag/[^\"]*" | cut -c 6-) +FILE=baikal-$VERSION.zip + +TMP_PATH=$(mktemp -d) + +wget -q $PROJECT_URL/releases/download/$VERSION/$FILE -O $TMP_PATH/$FILE + +for tmp in $(find /etc/amp-upgrade-script/baikal.d/ -name '*.conf') +do + source $tmp + mkdir -p $TMP_PATH/baikal + + if [ -e $WEBROOT ] + then + cp -fr $WEBROOT/Specific $TMP_PATH/baikal/Specific + cp -fr $WEBROOT/config $TMP_PATH/baikal/config + fi + unzip -u $TMP_PATH/$FILE -d $TMP_PATH + rm -fr $WEBROOT + cp -fr $TMP_PATH/baikal/ $WEBROOT + chown $USER:$GROUP $WEBROOT -R + rm -fr $TMP_PATH/baikal +done +rm -fr $TMP_PATH diff --git a/src/amp-upgrade-bitwardenrs/DEBIAN/changelog b/src/amp-upgrade-bitwardenrs/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-bitwardenrs/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-bitwardenrs/DEBIAN/control b/src/amp-upgrade-bitwardenrs/DEBIAN/control new file mode 100644 index 0000000..e35ee6c --- /dev/null +++ b/src/amp-upgrade-bitwardenrs/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-bitwardenrs +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: rsync, wget, git +Maintainer: Thomas Legay +Description: bitwardenrs upgrade script diff --git a/src/amp-upgrade-bitwardenrs/etc/amp-upgrade-script/bitwarden_rs.d/bitwarden_rs.conf.exemple b/src/amp-upgrade-bitwardenrs/etc/amp-upgrade-script/bitwarden_rs.d/bitwarden_rs.conf.exemple new file mode 100644 index 0000000..e69de29 diff --git a/src/amp-upgrade-bitwardenrs/usr/bin/amp-upgrade-bitwardenrs b/src/amp-upgrade-bitwardenrs/usr/bin/amp-upgrade-bitwardenrs new file mode 100755 index 0000000..4fa1305 --- /dev/null +++ b/src/amp-upgrade-bitwardenrs/usr/bin/amp-upgrade-bitwardenrs @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +cd ~ +find bitwarden_rs/target/* -maxdepth 0 -mtime +30 -exec rm -fr {} \; + +#Backend +source ~/.cargo/env + +cd ~/bitwarden_rs +git checkout master +git pull +git checkout $(git tag | sort -V | tail -n 1) +cargo build --release --features postgresql + +#Frontend +cd ~ +PROJECT_URL=https://github.com/dani-garcia/bw_web_builds +VERSION=$(wget -qO - $PROJECT_URL/releases.atom | grep "releases/tag" | head -n 1 | grep -o -P "/tag/[^\"]*" | cut -c 6-) +FILE=bw_web_$VERSION.tar.gz + +RELEASE_TARGET=~/bitwarden_rs/target/release/ +rm -fr $RELEASE_TARGET/web-vault/ +wget -q $PROJECT_URL/releases/download/$VERSION/$FILE -O - | tar -zx -C $RELEASE_TARGET + +#Deploy +rsync -a --info=progress2 bitwarden_rs/target/release/ /opt/bitwarden/ +chown -R www-data: /opt/bitwarden + +systemctl restart bitwarden + + + + diff --git a/src/amp-upgrade-element-web/DEBIAN/changelog b/src/amp-upgrade-element-web/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-element-web/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-element-web/DEBIAN/control b/src/amp-upgrade-element-web/DEBIAN/control new file mode 100644 index 0000000..3cf2fc2 --- /dev/null +++ b/src/amp-upgrade-element-web/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-element-web +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: wget +Maintainer: Thomas Legay +Description: element web upgrade script diff --git a/src/amp-upgrade-element-web/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple b/src/amp-upgrade-element-web/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple new file mode 100644 index 0000000..13aa1ef --- /dev/null +++ b/src/amp-upgrade-element-web/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple @@ -0,0 +1 @@ +AIRSONIC_ROOT=/var/www/html/ diff --git a/src/amp-upgrade-element-web/etc/amp-upgrade-script/element-web.d/riot-web.conf.exemple b/src/amp-upgrade-element-web/etc/amp-upgrade-script/element-web.d/riot-web.conf.exemple new file mode 100644 index 0000000..b6ddd7b --- /dev/null +++ b/src/amp-upgrade-element-web/etc/amp-upgrade-script/element-web.d/riot-web.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/html/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-element-web/usr/bin/amp-upgrade-element-web b/src/amp-upgrade-element-web/usr/bin/amp-upgrade-element-web new file mode 100755 index 0000000..1a60b7e --- /dev/null +++ b/src/amp-upgrade-element-web/usr/bin/amp-upgrade-element-web @@ -0,0 +1,28 @@ +#!/bin/bash +set -e + +PROJECT_URL=https://github.com/vector-im/element-web +VERSION=$(wget -qO - $PROJECT_URL/releases.atom | grep "releases/tag" | head -n 1 | grep -o -P "/tag/[^\"]*" | cut -c 6-) +FILE=element-$VERSION.tar.gz + +TMP_PATH=$(mktemp -d) + +wget https://github.com/vector-im/element-web/releases/download/$VERSION/$FILE -O - | tar -zx -C $TMP_PATH + +for tmp in $(find /etc/amp-upgrade-script/element-web.d/ -name '*.conf') +do + source $tmp + TMP_CONFIG=$(mktemp -d) + + if [ -e $WEBROOT ] + then + [ $(find $WEBROOT/ -name '*.json' | wc -l) -ne 0 ] && mv $WEBROOT/config*.json $TMP_CONFIG + rm -fr $WEBROOT + fi + mv $TMP_PATH/element-$VERSION $WEBROOT + [ $(find $TMP_CONFIG/ -name '*.json' | wc -l) -ne 0 ] && mv $TMP_CONFIG/*.json $WEBROOT/ + chown $USER:$GROUP $WEBROOT -R + rm -fr $TMP_CONFIG +done + +rm -fr $TMP_PATH diff --git a/src/amp-upgrade-golang/DEBIAN/changelog b/src/amp-upgrade-golang/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-golang/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-golang/DEBIAN/control b/src/amp-upgrade-golang/DEBIAN/control new file mode 100644 index 0000000..1d67d2b --- /dev/null +++ b/src/amp-upgrade-golang/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-golang +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: wget +Maintainer: Thomas Legay +Description: golang upgrade script diff --git a/src/amp-upgrade-golang/usr/bin/amp-upgrade-golang b/src/amp-upgrade-golang/usr/bin/amp-upgrade-golang new file mode 100755 index 0000000..de96793 --- /dev/null +++ b/src/amp-upgrade-golang/usr/bin/amp-upgrade-golang @@ -0,0 +1,9 @@ +#!/bin/bash +URL=https://golang.org/$(wget -qO - https://golang.org/dl/ | grep downloadBox | grep linux-amd64 | cut -d "\"" -f 4) +wget -qO - $URL | tar -zx -C /opt/ +for tmp in $(find /opt/go/bin -type f); +do + DST=/usr/bin/$(basename $tmp) + [ -e $DST ] && rm -fr $DST + ln -s $tmp $DST +done diff --git a/src/amp-upgrade-phpmyadmin/DEBIAN/changelog b/src/amp-upgrade-phpmyadmin/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-phpmyadmin/DEBIAN/control b/src/amp-upgrade-phpmyadmin/DEBIAN/control new file mode 100644 index 0000000..a2366d5 --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-phpmyadmin +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: unzip, wget +Maintainer: Thomas Legay +Description: phpmyadmin update script diff --git a/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple new file mode 100644 index 0000000..13aa1ef --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/airsonic.d/airsonic.conf.exemple @@ -0,0 +1 @@ +AIRSONIC_ROOT=/var/www/html/ diff --git a/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/baikal.d/baika.conf.exemple b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/baikal.d/baika.conf.exemple new file mode 100644 index 0000000..b6ddd7b --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/baikal.d/baika.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/html/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/bitwarden_rs.d/bitwarden_rs.conf.exemple b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/bitwarden_rs.d/bitwarden_rs.conf.exemple new file mode 100644 index 0000000..e69de29 diff --git a/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/phpmyadmin.d/phpmyadmin.conf.exemple b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/phpmyadmin.d/phpmyadmin.conf.exemple new file mode 100644 index 0000000..b6ddd7b --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/phpmyadmin.d/phpmyadmin.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/html/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/riot-web.d/riot-web.conf.exemple b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/riot-web.d/riot-web.conf.exemple new file mode 100644 index 0000000..b6ddd7b --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/riot-web.d/riot-web.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/html/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/roundcube.d/roundcube.conf.exemple b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/roundcube.d/roundcube.conf.exemple new file mode 100644 index 0000000..d6b5a27 --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/etc/amp-upgrade-script/roundcube.d/roundcube.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/roundcube/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-phpmyadmin/usr/bin/amp-upgrade-phpmyadmin b/src/amp-upgrade-phpmyadmin/usr/bin/amp-upgrade-phpmyadmin new file mode 100755 index 0000000..27be88b --- /dev/null +++ b/src/amp-upgrade-phpmyadmin/usr/bin/amp-upgrade-phpmyadmin @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +TMP_PATH=$(mktemp -d) +TMP_ZIP=$TMP_PATH/tmp.zip + +wget -q https://www.phpmyadmin.net/ -O - | grep '\-all-languages.zip' | sed -n "s/.*\(https:\S*all-languages.zip\).*/\1/p" -O $TMP_PATH/tmp.zip + +for tmp in $(find /etc/amp-upgrade-script/phpmysql.d/ -name '*.conf') +do + source $tmp + TMP_CONFIG=$(mktemp -d) + + [ -e $WEBROOT ] && rm -fr $WEBROOT + mkdir -p $WEBROOT + unzip TMP_ZIP -d $WEBROOT + +done + +rm -fr $TMP_PATH diff --git a/src/amp-upgrade-roundcube/DEBIAN/changelog b/src/amp-upgrade-roundcube/DEBIAN/changelog new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/amp-upgrade-roundcube/DEBIAN/changelog @@ -0,0 +1 @@ + diff --git a/src/amp-upgrade-roundcube/DEBIAN/control b/src/amp-upgrade-roundcube/DEBIAN/control new file mode 100644 index 0000000..ac1d5ef --- /dev/null +++ b/src/amp-upgrade-roundcube/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-upgrade-roundcube +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: wget +Maintainer: Thomas Legay +Description: roundcube update script diff --git a/src/amp-upgrade-roundcube/etc/amp-upgrade-script/roundcube.d/roundcube.conf.exemple b/src/amp-upgrade-roundcube/etc/amp-upgrade-script/roundcube.d/roundcube.conf.exemple new file mode 100644 index 0000000..d6b5a27 --- /dev/null +++ b/src/amp-upgrade-roundcube/etc/amp-upgrade-script/roundcube.d/roundcube.conf.exemple @@ -0,0 +1,3 @@ +WEBROOT=/var/www/roundcube/ +USER=www-data +GROUP=www-data diff --git a/src/amp-upgrade-roundcube/usr/bin/amp-upgrade-roundcube b/src/amp-upgrade-roundcube/usr/bin/amp-upgrade-roundcube new file mode 100755 index 0000000..42a662e --- /dev/null +++ b/src/amp-upgrade-roundcube/usr/bin/amp-upgrade-roundcube @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +PROJECT_URL=https://github.com/roundcube/roundcubemail/ +VERSION=$(wget -qO -$PROJECT_URL/releases.atom | grep "releases/tag" | grep -o -P "/tag/[^\"]*" | sort -rV | head -n 1 | cut -c 6-) +FILE=roundcubemail-$VERSION-complete.tar.gz + +TMP_PATH=$(mktemp -d) + +wget -q $PROJECT_URL/releases/download/$VERSION/$FILE -O - | tar -zx -C $TMP_PATH +cd $TMP_PATH/roundcubemail-$VERSION + +for tmp in $(find /etc/amp-upgrade-script/roundcube.d/ -name '*.conf') +do + source $tmp + bin/installto.sh $WEBROOT + chown $USER:$GROUP $WEBROOT -R + rm -fr $TMP_PATH +done + + + diff --git a/src/amp-webdav/DEBIAN/changelog b/src/amp-webdav/DEBIAN/changelog new file mode 100644 index 0000000..e69de29 diff --git a/src/amp-webdav/DEBIAN/control b/src/amp-webdav/DEBIAN/control new file mode 100644 index 0000000..ac2dea5 --- /dev/null +++ b/src/amp-webdav/DEBIAN/control @@ -0,0 +1,8 @@ +Package: amp-webdav +Version: 1.01 +Section: base +Priority: optional +Architecture: all +Depends: php-sabre-dav +Maintainer: Thomas Legay +Description: Package pour webdav diff --git a/src/amp-webdav/usr/lib/amp-webdav/dav.php b/src/amp-webdav/usr/lib/amp-webdav/dav.php new file mode 100644 index 0000000..b896eb7 --- /dev/null +++ b/src/amp-webdav/usr/lib/amp-webdav/dav.php @@ -0,0 +1,28 @@ +setBaseUri($baseUri); + +$lockBackend = new \Sabre\DAV\Locks\Backend\File('/locksdb'); +$lockPlugin = new \Sabre\DAV\Locks\Plugin($lockBackend); +$server->addPlugin($lockPlugin); + +$browser = new \Sabre\DAV\Browser\Plugin(); +$server->addPlugin($browser); + +// Automatically guess (some) contenttypes, based on extesion +$server->addPlugin(new \Sabre\DAV\Browser\GuessContentType()); + +// Temporary file filter +//$tempFF = new \Sabre\DAV\TemporaryFileFilterPlugin($tmpDir); +//$server->addPlugin($tempFF); + +$server->exec(); diff --git a/src/amp-webdav/usr/lib/amp-webdav/zdav.php b/src/amp-webdav/usr/lib/amp-webdav/zdav.php new file mode 100644 index 0000000..e3a96b6 --- /dev/null +++ b/src/amp-webdav/usr/lib/amp-webdav/zdav.php @@ -0,0 +1,28 @@ +setBaseUri($baseUri); + +$lockBackend = new \Sabre\DAV\Locks\Backend\File('/locksdb'); +$lockPlugin = new \Sabre\DAV\Locks\Plugin($lockBackend); +$server->addPlugin($lockPlugin); + +$browser = new \Sabre\DAV\Browser\Plugin(); +$server->addPlugin($browser); + +// Automatically guess (some) contenttypes, based on extesion +$server->addPlugin(new \Sabre\DAV\Browser\GuessContentType()); + +// Temporary file filter +//$tempFF = new \Sabre\DAV\TemporaryFileFilterPlugin($tmpDir); +//$server->addPlugin($tempFF); + +$server->exec(); diff --git a/src/amp-webdav/usr/share/doc/amp-webdav/README b/src/amp-webdav/usr/share/doc/amp-webdav/README new file mode 100644 index 0000000..ee16ef9 --- /dev/null +++ b/src/amp-webdav/usr/share/doc/amp-webdav/README @@ -0,0 +1,31 @@ +Sample to add in the apache host + +Case on the root directory + + php_flag output_buffering off + php_flag always_populate_raw_post_data off + php_flag magic_quotes_gpc off + php_flag mbstring.func_overload off + + AliasMatch .* /usr/lib/amp-webdav/dav.php + + AuthType basic + AuthName "Mon serveur" + AuthUserFile /opt/htpasswd + Require valid-user + + +case with fake root /zdav/ + + php_flag output_buffering off + php_flag always_populate_raw_post_data off + php_flag magic_quotes_gpc off + php_flag mbstring.func_overload off + + Alias /zdav /usr/lib/amp-webdav/zdav.php + + AuthType basic + AuthName "Mon serveur" + AuthUserFile /opt/htpasswd + Require valid-user + diff --git a/src/logveillance/DEBIAN/changelog b/src/logveillance/DEBIAN/changelog new file mode 100644 index 0000000..13419de --- /dev/null +++ b/src/logveillance/DEBIAN/changelog @@ -0,0 +1,5 @@ +logveillance (1.00) stable; urgency=low + + * Création + + -- Legay Thomas jeu. 07 mai 2020 00:10 diff --git a/src/logveillance/DEBIAN/control b/src/logveillance/DEBIAN/control new file mode 100644 index 0000000..90fcaee --- /dev/null +++ b/src/logveillance/DEBIAN/control @@ -0,0 +1,8 @@ +Package: logveillance +Version: 1.17 +Section: base +Priority: optional +Architecture: all +Maintainer: Thomas Legay +Depends: python3-requests +Description: paquet logveillance diff --git a/src/logveillance/DEBIAN/postinst b/src/logveillance/DEBIAN/postinst new file mode 100755 index 0000000..11a3347 --- /dev/null +++ b/src/logveillance/DEBIAN/postinst @@ -0,0 +1,3 @@ +#!/bin/bash +systemctl enable logveillance +systemctl restart logveillance diff --git a/src/logveillance/DEBIAN/prerm b/src/logveillance/DEBIAN/prerm new file mode 100755 index 0000000..837883e --- /dev/null +++ b/src/logveillance/DEBIAN/prerm @@ -0,0 +1,3 @@ +#!/bin/bash + +systemctl disable logveillance diff --git a/src/logveillance/etc/systemd/system/logveillance.service b/src/logveillance/etc/systemd/system/logveillance.service new file mode 100644 index 0000000..a13c65b --- /dev/null +++ b/src/logveillance/etc/systemd/system/logveillance.service @@ -0,0 +1,9 @@ +[Unit] +Description=logveillance + +[Service] +ExecStart=/usr/lib/logveillance/logveillance.py +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/src/logveillance/usr/lib/logveillance/logveillance.py b/src/logveillance/usr/lib/logveillance/logveillance.py new file mode 100755 index 0000000..8cd036a --- /dev/null +++ b/src/logveillance/usr/lib/logveillance/logveillance.py @@ -0,0 +1,112 @@ +#!/usr/bin/python3 +import time +import re +import requests +import json +import os + + +INTERVAL=10 +LOOP_CONTROL_EVERY=6 + +f = open("/etc/logveillance/token") +TOKEN = f.readline().splitlines()[0] +f.close() +f = open("/etc/logveillance/room") +ROOM = f.readline().splitlines()[0] +f.close() +f = open("/etc/logveillance/server") +SERVER = f.readline().splitlines()[0] +f.close() +f = open("/etc/logveillance/logfile") +filename = f.readline().splitlines()[0] +f.close() + +URL=SERVER + "/_matrix/client/r0/rooms/"+ROOM+"/send/m.room.message?access_token=" + TOKEN + +RULE = [ + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*DHCPACK\s*on \S* to \S*( \(\S*\))?( via \S*)?", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*DHCPOFFER on \S* to \S*( \(\S*\))?( via \S*)?", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*DHCPREQUEST for \S*( \(\S*\))? from \S*( \(\S*\))?( via \S*)?", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*DHCPRELEASE of \S*( \(\S*\))? from \S*( \(\S*\))?( via \S*)?", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*reuse_lease: lease age .*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*Wrote .*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*dhcpd\[\d*\]:\s*uid lease \S*( \(\S*\))? for client \S* is duplicate on \S*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*\S* Succeeded.", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Started\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Starting\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Reloaded\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Reloading\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Reached\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Listening\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Stopping\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Stopped\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Startup\s*finished\s*in\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Created\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Closed\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*systemd\[\d*\]:\s*Removed\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*ntpd\[\d*\]:\s*Listen\s*normally\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*ntpd\[\d*\]:\s*Listen\s*and\s*drop\s*on\s*.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*ntpd\[\d*\]:\s*Listening\s*on\s*routing\s*socket\s*on.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*CRON\[\d*\]:\s*\(\S*\)\s*CMD.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*in\.tftpd\[\d*\]:\s*RRQ\s*from\s*\S*\s*filename.*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*rsyslogd:\s*\[.*\] rsyslogd was HUPed", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*kernel:\s*\[.*\] EXT4-fs \(.*\): mounted filesystem without journal. Opts: .*", + "\w*\s*[0-9]{1,2}\s*\d*:\d*:\d*\s*\w*\s*EXT4-fs\s*\(\S*\): write access unavailable, skipping orphan cleanup" +] + +def matchrule(ligne,rulelist): + res = False + cpt = len(rulelist) + while cpt != 0 and not res: + cpt = cpt - 1 + objmatch = rulelist[cpt].fullmatch(ligne) + if objmatch != None: + res = True + return res + +relist = [] +for tmp in RULE: + relist.append(re.compile(tmp)) + +fd = open(filename) +firstline_control = fd.readline().splitlines()[0] +inode_control = os.stat(filename).st_ino +fd.seek(0,2) +loop_control = 0 +content = "" +while True: + loop_control = (loop_control + 1) % LOOP_CONTROL_EVERY + where = fd.tell() + ligne = fd.readline() + if ligne: + ligne = ligne.splitlines() + if ligne != []: + ligne = ligne[0] + if not matchrule(ligne,relist): + content = content + ligne + '\n' + else: + time.sleep(INTERVAL) + fd.seek(where) + if loop_control == 0: + where = fd.tell() + fd.seek(0,0) + firstline = fd.readline().splitlines()[0] + fd.seek(where) + inode = os.stat(filename).st_ino + if inode_control != inode: + inode_control = inode + fd.close() + fd = open(filename) + firstline_control = fd.readline().splitlines()[0] + fd.seek(0,0) + if firstline_control != firstline: + firstline_control = firstline + fd.seek(0,0) + if content != "": + try: + payload=json.dumps({"msgtype":"m.text","body":content}) + r = requests.post(URL, data=payload) + content = "" + except: + print("Unexpected error:", sys.exc_info()[0])