Gyroplast

  • 0 Posts
  • 15 Comments
Joined 6 months ago
cake
Cake day: June 22nd, 2024

help-circle

  • Yeah, that’s normal, intended, and does not prevent general lookups taking the global DNS first. Do you see an issue with this?

    I gave this setup a try real quick, to make sure I’m not overlooking something, with dnsmasq for testing on 127.0.0.1:9053:

    [gyroplast@e15g4 ~]$ dnsmasq --listen-address=127.0.0.1 --port=9053 --address=/testme.localnet/127.42.0.69 --no-daemon --no-hosts --no-poll --log-queries
    dnsmasq: started, version 2.90 cachesize 150
    dnsmasq: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
    dnsmasq: warning: no upstream servers configured
    dnsmasq: cleared cache
    

    When triggering a query on that test record, f. ex. with ping -c1 testme.localnet, you’ll see it’s directed to the dnsmasq instance and working as intended:

    dnsmasq: query[A] testme.localnet from 127.0.0.1
    dnsmasq: config testme.localnet is 127.42.0.69
    dnsmasq: query[AAAA] testme.localnet from 127.0.0.1
    dnsmasq: config error is REFUSED (EDE: not ready)
    dnsmasq: query[AAAA] testme.localnet from 127.0.0.1
    dnsmasq: config error is REFUSED (EDE: not ready)
    

    The DNS setup with systemd-resolved is pretty confusing, and outright contradicts many, MANY previously correct instructions of how to set your /etc/resolv.conf. I’m not surprised if it is giving you a headache right now, but all I can say is to diligently work through its configuration, and understand how systemd-resolved is supposed to work. From experience, make sure your tests are sound and representative, or you’ll continue looking for errors in your setup despite everything actually working just fine, maybe because you missed a reload or had a typo or misunderstanding in your wireshark filter.

    In the same vein, make sure your DNS listening on :9053 is really working as intended, otherwise you can bark up the wrong tree all day long. Debug logging is your friend, and more accessible and less error prone than tcpdump/wireshark.

    You’ll figure it out from here, I’m sure.


  • GyroplasttoArch Linux@lemmy.mlA custom port for DNS
    link
    fedilink
    English
    arrow-up
    2
    ·
    10 hours ago

    I ran the command with sudo and got the error.

    Yes, that’s why I said don’t do that. It’s a common, non-intuitive interaction with sudo and shell redirections. Don’t stress over it, I shouldn’t have done it all that fancy in the first place.

    Regarding your problem: Your setup is likely inconsistent now due to your experiments and previous setup attempts. HOLD THE REINSTALL, learn to fix it, it’s not that complex. First off: you’re not running in the recommended “stub mode” where /etc/resolv.conf is symlinked to /run/systemd/resolve/stub-resolv.conf, and where the configuration you did is actually actively used. Fix that first. Have some docs. This is my stub /etc/resolv.conf, for example, so you know what to look for, roughly:

    [root@e15g4 gyroplast]# cat /etc/resolv.conf 
    # This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
    # [...]
    nameserver 127.0.0.53
    options edns0 trust-ad
    search fritz.box
    

    Don’t create that file with these contents manually. Read the docs, follow the instructions, don’t ruin your day.

    Assert you have no lingering, conflicting setup in the /etc/systemd/resolved.conf main config. The default file is effectively empty / commented out, to allow for automatic system updates without conflicts. You could reinstall the package to get the original file back if you’re unsure.

    Make sure the systemd-resolved.service is enabled and started: systemctl enable --now systemd-resolved.service You might want to install systemd-resolvconf as well if you commit to a systemd-resolved setup, for maximum compatibility.

    Make use of resolvectl status to verify the status:

    Global
               Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
        resolv.conf mode: stub
      Current DNS Server: 127.0.0.1:9053
             DNS Servers: 127.0.0.1:9053
    Fallback DNS Servers: 1.1.1.1#cloudflare-dns.com 9.9.9.9#dns.quad9.net 8.8.8.8#dns.google
                          2606:4700:4700::1111#cloudflare-dns.com 2620:fe::9#dns.quad9.net 2001:4860:4860::8888#dns.google
    [...]
    

    If that’s still not what is expected, crank up debugging and check the logs of the service to see if for some reason your config file isn’t loaded due to a typo somewhere, or if it’s loaded, any other reason that may override your settings later. It’s practically guaranteed there’s an inconsistency left somewhere, and reading the debug log points you at the actual problem.

    It’s worth fixing this in that way. With stub mode, you gain a lot of flexibility in your setup, and it works well in tandem with NetworkManager, DHCP, VPNs, and libvirt/qemu networking. You have to make sure you’re not inadvertently setting up some broken “hybrid” of old-school /etc/resolv.conf manual config and systemd-resolved, this will drive you mad, and it’s a pain to diagnose. Read that wiki page, do not intermingle with crap you pick up on stackoverflow or AI bullshit, and you’ll end up with a DNS config that actually works like magic.


  • GyroplasttoArch Linux@lemmy.mlA custom port for DNS
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    12 hours ago

    Don’t slap a sudo in front where it doesn’t belong. Run this as root, or the shell redirection will fail. Or just create that file with these contents in any other way you like and feel comfortable with, it’s not a magic incantation you have to use verbatim, after all.


  • GyroplasttoArch Linux@lemmy.mlA custom port for DNS
    link
    fedilink
    English
    arrow-up
    3
    ·
    15 hours ago

    DNS is a resolved.conf only setting. systemd docs are comprehensive and help navigating what to put where, no need to throw shit at the wall and see what sticks. :)

    man resolved.conf:

    OPTIONS
           The following options are available in the [Resolve] section:
    
           DNS=
               A space-separated list of IPv4 and IPv6 addresses to use as system DNS servers. Each address can optionally
               take a port number separated with ":", a network interface name or index separated with "%", and a Server
               Name Indication (SNI) separated with "#". When IPv6 address is specified with a port number, then the
               address must be in the square brackets. That is, the acceptable full formats are
               "111.222.333.444:9953%ifname#example.com" for IPv4 and "[1111:2222::3333]:9953%ifname#example.com" for IPv6.
               DNS requests are sent to one of the listed DNS servers in parallel to suitable per-link DNS servers acquired
               from systemd-networkd.service(8) or set at runtime by external applications. For compatibility reasons, if
               this setting is not specified, the DNS servers listed in /etc/resolv.conf are used instead, if that file
               exists and any servers are configured in it. This setting defaults to the empty list.
    
               Added in version 213.
    

    TL;DR: Create a drop-in for resolved and put the DNS= line there, with colon separating the port. Reload the config of the service to activate.

    install -o0 -g0 -dm755 /etc/systemd/resolved.conf.d
    
    install -o0 -g0 -m644 <(cat <<EOF
    [Resolve]
    DNS=127.0.0.1:9053
    EOF
    ) /etc/systemd/resolved.conf.d/90-dns_port.conf
    
    cat /etc/systemd/resolved.conf.d/90-dns_port.conf 
    [Resolve]
    DNS=127.0.0.1:9053
    
    systemctl reload systemd-resolved
    

  • I’ve had so much trouble with tooling

    Obvious skill issue. /s

    I don’t feel like I can make any impact

    Assuming you don’t just want to vent, but maybe get some sort of unfounded and useless opinion from a total stranger to go along with your misery, let me oblige. I’ve never been a cog in a truly large company, but I’ve been rubbing shoulders with managers and C-level just barely enough to begin seeing “their side”, and consider it in my interaction with cOwOrkers and management to effectively act as a conduit or translation layer between camps. It’s a metagame you’ll have to want to play, but it can be rewarding to finnagle the systems of human psyche to have a positive impact, not only for yourself.

    From a manager’s perspective, everything has a cost. It’s called tech debt for a reason. As long as paying the interest on your tech debt outweighs the perceived cost of paying off the debt, you’re doing the right thing from a business perspective. In addition, be keenly aware of the fact that you personally will impossibly know the huge dark-company iceberg that is the existing tooling and its context. I guarantee you that there’s so much unknown to you, which makes the proposition “I would fix this in a few days, just let me!” seem rightfully preposterous, and thus actively dangerous, as you obviously don’t fathom the full complexity of the larger issue and would necessarily break things for others, despite your best intentions and competence.

    Yes, the tooling certainly is utter garbage, and they should never have locked themselves in such a horribly broken situation, but there they are, and you can’t just “fix this” without understanding the implications. Many devs, myself certainly included, easily fall into the trap of seeing an obvious and clear way of fixing everything™ in a matter of minutes, and realizing too late that “just one more patch” is an endless pursuit, all while breaking user-space for others on the way. It’s a meme old as dirt among hackers.

    Assume you don’t know all the details, and really nobody does anymore, and you’ll live a happier life if you leave this (business) decision of letting code rot to others. It’s their money they’re wasting.

    What you can do, however, is gold-wrapping the pile of shit you need to work with. Find creative ways to wrap byzantine processes into a bunch of scripts for yourself to automate and generalize your tasks specifically, and watch your productivity soar and your mental health rise, and offer that as a working band-aid to your peers and manager. That’s not only a better use of your time than seething over how shitty everything is, but also plays very well into a devops mindset and is actually kind of fun. It also comes across way better than being the “new guy who knows everything better, but actually hasn’t seen nothing, yet”, which leads to people not listening you in the first place. That vibe is an instant turn-off for any lead, and leads to shadow-banning you from interesting, fruitful conversations you seem to look for.

    Obviously I’m confabulating all of this, and this may very well not apply to you or your situation at all. This is just a behavioral pattern I’ve seen way too often, and it’s helpful to detect this in oneself to prevent unnecessary frustration all around.

    My plan

    is possibly your best option. Go ahead. You have no obligations or “loyalty” towards an uncaring entity holding you back.


  • Gyroplasttoich_iel@feddit.orgich2iel
    link
    fedilink
    arrow-up
    14
    ·
    edit-2
    1 month ago

    Sehr schön, viele gute Treffer, leider kein furry Drakepelziger Lindwurm als billigen Abklatsch, kein bait für die Arch, btw Truppe, und keine Arial/Comic Sans Paarung für die alten Herren. Solide 8/10, danke!



  • You can open up many avenues of feeding yourself “well enough” if you reconsider your definition of a meal, and consider actual cooking/food prep to be an option.

    Cheap and storage-friendly ingredients off the top of head are potatoes, rice, (dried) pasta, flour, cheese, eggs (no need for refrigeration, just don’t wash off the protective layer), onions, garlic, tofu, and many hardier vegetables like broccoli, cauliflower, tomatoes, zucchini, carrots, and up to a point even iceberg salad, cucumbers, mushrooms (keep dry and airy if fresh, they dry out), as well as various pickles as snacks, if you’re so inclined. With onions, potatoes, and eggs alone you can stuff your face for weeks without repeating a single dish. :)

    I keep (vegan) crème fraîche, soy/rice/almond/oat drinks, and “cooking cream” around for weeks unrefrigerated as great milk and cream substitutes, but the milk-based products have a solid shelf life as well as long as they’re unopened. This is perfectly viable for various creamy sauces or dips, and for cereals as a snack or breakfast option. With a nice oil or butter and a few seasonings you can whip up a surprising amount of simple meals, starting with classic pasta with a tomato sauce of your liking, to the typical trifecta of “carbs, meat, and veggies with optional sauce” that passes for an actual meal. You can easily build almost any kind of sauce you wish from stable ingredients to go with whatever, too.

    There’s a good bunch of great thai curry pastes around that go well with a handful of veggies and rice, and keep cooking effort to a minimum. If I’m particularly lazy, I boil a pot of potatoes and eat those straight with sour cream. Leftovers are due for the chippy treatment in a pan with onions and eggs, or just eaten cold as a snack with salt or leftover dip. Same goes for rice, the amount of stuff people throw atop their rice to chase it down is astonishing. Lao Gan Ma chili crisp is great, a straight sweet chili sauce works in a pinch, and if you’re into chinese cooking anyway, you can throw almost anything in a pan, fry it up, and toss it to your rice with a generic “brown sauce” deal.

    The biggest issue I see is fresh meat, though. That’s quickly a serious hazard when kept at room temp, so I’d suggest to try reducing your meat intake as long as you’re unable to store it properly, and otherwise cook the same day you buy. Truth be told, a lot of the vegan meat substitutes are surprisingly good by now, even though they’re highly processed garbage and pretty expensive for what they are, but they keep unrefrigerated much longer and safer than the real deal. Don’t expect a good steak, but anything “chicken” is nigh indistinguishable, IMHO.

    All the other things do keep “fresh enough” at least for a couple of days, but you’ll need to consider what you buy and when you are able to cook beforehand so things don’t spoil, especially if you cannot buy fresh groceries more often than weekly for any reason.

    TL;DR: For a generic meal, combine potatoes, rice, or pasta with a vegetable of your least distrust, optionally fresh meat if available, and a decent sauce. In a pinch, sauce + anything also works just fine, and sometimes even without sauce. Just don’t take pictures for Insta when horking down a bowl of pasta with ketchup, we’ve all been there.



  • Generally speaking, there is a race condition lurking where the OS may do whatever to your file you just checked, rendering the check strictly obsolete the moment you get the result. This isn’t typical, but possible, and a lovely old-school security vulnerability class. :)

    A more practical argument is that you’re going to handle any errors your open() may throw, anyway, and therefore it’s simply redundant to check for file existence explicitly beforehand.

    Under specific circumstances, you may want to do explicit, very specific tests for more detailed error reporting than “error opening file!”, for example “save file is corrupted” if it’s too short or zero-length, or “save file directory is gone. What the hell, dude? Recreating it, but stop fiddling with my files!”

    This is easy to overengineer. Best is to get into the very sensible habit of always checking for errors or exceptions returned by your calls, and this will become a non-issue.

    In this particular use-case of save file loading, you might implement displaying a listing of save files in a directory with opendir/readdir or FindFirstFile/FindNextFile and its ilk, to offer a list of files to load, which doubles as a crude existence test already. Many ways lead away from Rome. If you’re considering loading an autosave and offer a “Continue” button or something, a cheap existence test would work very well to decide if that button needs to be displayed in the first place, but doesn’t free you from handling any open() errors later. You could also open() and validate an autosave directly, and when/if the user decides to “Continue”, use the already reserved file descriptor and maybe even the preloaded save data to quickly jump into the game.

    If you want a simple answer: Do not introduce race conditions. Always acquire a lock for a shared resource before doing anything with it.


  • GyroplasttoMemes@lemmy.mlAn alternate timeline
    link
    fedilink
    arrow-up
    33
    arrow-down
    2
    ·
    5 months ago

    What kind of soulless psychopath leaves a window of this size unmaximized is the real question here. Also, a horizontal scrollbar in the main section, able to scroll maybe 8 pixels total to see some more of the glorious empty padding, could have been a nice touch as a consequence of the “unintended” window size.


  • I would not differentiate needlessly between the terms function and [“dunder”, “instance”, “module”, “class”] method, this isn’t practical at the current point in time, and arguably not pythonic. They are all callables and behave very similar for all practical purposes, all quacking like a duck.

    If you want to deep-dive into the intricacies, there’s technically a bunch of alternative “method types” with slightly differing calling and argument passing conventions. There are class methods, static methods, class properties, and module-scope functions off the top of my head, all very similar, but particularly suitable under specific circumstances.

    If I wanted a String utility class, for example, I could have that:

    class String:
      @staticmethod
      def len(string: str) -> int:
        if not isinstance(string, str):
          raise TypeError("Cannot determine length of non-string object")
        return len(string)
    
    s = "foobar"
    assert String.len(s) == 6
    

    In Python I generally find static methods hardly as relevant as in other languages, and tend to create utility modules instead, with plain functions and maybe dataclasses for complex arguments or return values, which can then be imported and called pretty much the same way as a static method, but without the extra organisational class layer. I’d argue that’s very much a matter of taste, and how much of a purebred OOP jockey you are, for better or worse.

    Class properties are cool, however, you might want to look into that. It’s getters/setters on crack, masquerading as their respective property, so that something like this “just works”:

    s = MyString("foobar")
    assert s.len == 6
    

  • Are there any other ways I would find the length? Or are methods and functions the only options?

    You could get creative and find several inferior, silly, and utterly insane ways of achieving the same result, for example by treating a string as an interable (read: “list” or “array”) of its constituent characters, and count the number of characters. This feels very “example (but not exemplary) code on the first pages of a crappy C++ textbook”, but hey, it’s a way:

    length = 0
    string = "foobar"
    for char in string:
      length = length + 1
    print(length)
    

    Mind you, this is not programming. This is toying around, and perfectly valid in that way, but no-one in a halfway sane state of mind would dare suggest doing it this way with Python if you actually care about the result. :)



  • What is the difference between these types of statements?

    Technically, len() is a Python built-in function, while "some string".len() would be an instance method of a string object, if such an instance method existed.

    How do I think about this to know which one I should expect to work?

    As a very general rule of thumb, I would recommend to keep the list of built-in functions close and memorize the “popular ones” over time. These are special. Anything else you encounter usually is an instance or class method, or a plain function without any object-oriented shenanigans, depending on how structured the code is you are looking at.

    Learn to navigate the Python reference docs. Use the search function liberally if you don’t come from a search engine result, anyway, or jump directly to the docs for the module you’re interested in to see what functionality it offers, and how to use it.

    Python is annoyingly flexible, and does not strictly enforce a single way to do anything, so learning what to expect always ends up as building an intuition, and actively looking up documentation for the modules, classes, or functions you intend to use until you have encountered enough (good) Python code to have reasonable expectations in the first place.

    TL;DR: grep the relevant module’s docs, or Python built-ins. It’s typically one or the other where you find detailed help.