

Its very nice and allows you to post on the original post, the cross posted post, and all other places. Its truely federated.


Its very nice and allows you to post on the original post, the cross posted post, and all other places. Its truely federated.


I’ve never heard the anthem! That’s crazy.


You should always ask for sources ;)
Those are all on top of my head. In my local area we have affordable housing money that is still making its way into the community and its helping out quite a bit. California does a TON for its people.
If you cant change your country for the better, try to change your state. If you cant change your state for the better, try to change your county/city. If you cant change your county/city for the better, try to change your local community/family group. And if you cant change any of the above, just try to take care of yourself. Sometimes thats all you can do.


Well California is just making their own equivalent of federal programs. So if you are on the west coast you are doing better than most.
Python would be appalled!


Its a window into the actual internals of the machine. I would say yes, its one of hte many ways linux sets itself way from Windows. And its VERY lightweight. Some linux distros dont need it, some do.
Heck even MacOS has a terminal app. Just because


In addition to what others say, you can also try WebToEpub (with a delay) for some comics. It works well with web comics.
freshrss is also great at ongoing series.


I just want you all to know you are awesome,. Thanks for doing what you do.


Thanks, its there now!
For me yunohost is the simplest.
from flask import Flask, request, abort
from datetime import datetime, timedelta
import sqlite3
import logging
import os
app = Flask(__name__)
DB_FILE = "honeypot.db"
#LOG_FILE = "/var/log/honeypot.log"
LOG_FILE = "honeypot.log"
TRAP_THRESHOLD = 3 # clicks before flagging
FLAG_DURATION_HOURS = 24 # how long the flag lasts
# --- Setup logging for Fail2Ban integration ---
#os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
logging.basicConfig(
filename=LOG_FILE,
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
)
# --- Database setup ---
def init_db():
with sqlite3.connect(DB_FILE) as conn:
c = conn.cursor()
c.execute("""
CREATE TABLE IF NOT EXISTS hits (
ip TEXT,
ts DATETIME
)
""")
c.execute("""
CREATE TABLE IF NOT EXISTS flagged (
ip TEXT PRIMARY KEY,
flagged_on DATETIME,
expires DATETIME
)
""")
conn.commit()
# --- Helper functions ---
def record_hit(ip):
now = datetime.utcnow()
with sqlite3.connect(DB_FILE) as conn:
c = conn.cursor()
c.execute("INSERT INTO hits (ip, ts) VALUES (?, ?)", (ip, now))
conn.commit()
def get_hit_count(ip):
with sqlite3.connect(DB_FILE) as conn:
c = conn.cursor()
c.execute("SELECT COUNT(*) FROM hits WHERE ip = ?", (ip,))
return c.fetchone()[0]
def flag_ip(ip):
now = datetime.utcnow()
expires = now + timedelta(hours=FLAG_DURATION_HOURS)
with sqlite3.connect(DB_FILE) as conn:
c = conn.cursor()
c.execute("REPLACE INTO flagged (ip, flagged_on, expires) VALUES (?, ?, ?)",
(ip, now, expires))
conn.commit()
logging.warning(f"HONEYPOT flagged {ip} for {FLAG_DURATION_HOURS}h") # Fail2Ban picks this up
def is_flagged(ip):
now = datetime.utcnow()
with sqlite3.connect(DB_FILE) as conn:
c = conn.cursor()
c.execute("SELECT expires FROM flagged WHERE ip = ?", (ip,))
row = c.fetchone()
if not row:
return False
expires = datetime.fromisoformat(row[0])
if now < expires:
return True
# Expired flag, remove it
c.execute("DELETE FROM flagged WHERE ip = ?", (ip,))
conn.commit()
return False
# --- Middleware ---
@app.before_request
def block_flagged():
ip = request.remote_addr
if is_flagged(ip):
abort(403, description="Access denied (you have been flagged).")
# --- Routes ---
@app.route('/')
def home():
return '''
<h1>Welcome</h1>
<p><a href="/do_not_click">Don’t click this unless you are a bot</a></p>
'''
@app.route('/robots.txt')
def robots_txt():
return "User-agent: *\nDisallow: /do_not_click\n", 200, {'Content-Type': 'text/plain'}
@app.route('/do_not_click')
def honeypot():
ip = request.remote_addr
if is_flagged(ip):
abort(403, description="Access denied (you’ve been flagged).")
record_hit(ip)
hit_count = get_hit_count(ip)
logging.info(f"HONEYPOT triggered by {ip} (count={hit_count})")
if hit_count >= TRAP_THRESHOLD:
flag_ip(ip)
return "You’ve been flagged for suspicious behavior.", 403
return f"Suspicious activity detected ({hit_count}/{TRAP_THRESHOLD})."
if __name__ == "__main__":
init_db()
app.run(debug=True)
Here I condensed this down to its parts. Hopefully this works well for you.
/etc/fail2ban/jail.d/honeypot.conf
[honeypot]
enabled = true
filter = honeypot
logpath = /var/log/honeypot.log
maxretry = 3
findtime = 86400 # Count hits within 24 hours
bantime = 86400 # Ban for 24 hours
backend = auto
action = iptables-multiport[name=honeypot, port="http,https"]
It works well with fail2ban + nginx just FYI. That and a small DB.
I fail to see how prediction engines can do anything different.
I created a honeypot that is only accessible if they click the “don’t click this unless you are a bot”. If they do after 3 times, poof the IP gets banned for a day. Its worked well.
Simple little flask app. Robots.text as well but only google seems to actually read that and respect it.
peertube.wtf pulls almost all known instances (or all the good ones at least).
You can always go over to !peertube@lemmy.world if you would like to watch videos but not necessarily get a peertube account. Or subscribe to peertube channels directly (works better on piefed than lemmy but both should theoretically work.
I don’t want it to be combined. Different communities have VERY different conversations on the same content.